//akey.cpp #include <stdlib.h> #include <stdio.h> #include <string.h> #include "akey.hpp" #ifdef DMALLOC # include "dmalloc.h" #endif 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) { if( logic != NULL ) free( logic ); return (logic = strdup(logicstr)) != NULL ; } int akey::addreply( int w, char *r ) { reply *t; #ifdef CHECKMEM static int called = 0; called++; #endif numreplys++; if((t = (reply *)realloc(replys, numreplys * sizeof(reply))) == NULL) { #ifdef CHECKMEM printf("realloc error in addreply in call %d\n",called); #endif return 0; } replys = t; totalwates += w; replys[numreplys-1].wate = w; if((replys[numreplys-1].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 return 1; } akey::~akey() { if (logic != NULL) free(logic); if( replys != NULL ) { for(int i = 0; i < numreplys; i++) free(replys[i].sent); free(replys); } }