//akey.cpp #include <stdlib.h> #include <stdio.h> #include <string.h> #include "akey.hpp" char* akey::getrndreply() { char* defaultmsg="Mmm, sounds interesting..."; if(totalwates==0) return defaultmsg; int rndnum=random(totalwates),total=0; #ifdef DEBUG printf("grr: rndnum=%d totalwates=%d\n",rndnum,totalwates); #endif for(int i=0;i<numreplys;i++) { #ifdef DEBUG printf("i=%d total=%d wate=%d\n",i,total,replys[i].wate); #endif if( (total+=(replys[i].wate) ) > rndnum) { #ifdef DEBUG puts("grr f"); #endif #ifdef REDUCEWATES if(replys[i].wate>1) { totalwates--; replys[i].wate--; } #endif return replys[i].sent; } } #ifdef DEBUG puts("getrndreply should have found a string"); #endif return defaultmsg; } akey::akey() { logic=NULL; replys=NULL; numreplys=totalwates=0; #ifdef TEST //puts("constructor akey()"); #endif } int akey::addlogic(char *logicstr) { return (logic=strdup(logicstr))!=NULL; } int akey::addreply(int w,char *r) { #ifdef CHECKMEM static int called=0; called++; #endif if(replys==NULL) { //replys first time allocated if((replys=(reply*)malloc((numreplys+1)*sizeof(reply)))==NULL) { #ifdef CHECKMEM printf("realloc error in addreply in call %d\n",called); #endif return 0; } }else if((replys=(reply*)realloc(replys,(numreplys+1)*sizeof(reply)))==NULL) { #ifdef CHECKMEM printf("realloc error in addreply in call %d\n",called); #endif return 0; } totalwates+=w; replys[numreplys].wate=w; if((replys[numreplys].sent=strdup(r))==NULL) { #ifdef CHECKMEM puts("out of mem for strdup in addreply"); #endif return 0; } #ifdef DEBUG printf("reply added:%s",replys[numreplys].sent); #endif numreplys++; return 1; } akey::~akey() { if(logic!=NULL) free(logic); for(int i=0;i<(numreplys-1);i++) { // free(replys[numreplys].sent); free(replys[i].sent); } free(replys); };