//eliza.hpp //chris busch (c) copyright 1995 all rights reserved #ifndef ELIZA_HPP #define ELIZA_HPP #include <string.h> #include "chatmain.hpp" #include "allkeys.hpp" #ifdef DMALLOC # include "dmalloc.h" #endif //if set eliza will use more of an exhaustive search to find a name. // if looking for 'Bobby Jo' this will look for 'Bobby Jo' then // Bobby and finally Jo. #define USE_EX_SEARCH class eliza { public: enum { maxdbases=100,maxnames=200,defaultdbase=0}; enum { repsize=150}; //reply size struct nametype { char* name; int dbase; char *set( char *n, int d ) { if( name != NULL ) free( name ); name = strdup(n); dbase = d; return name; } nametype() { name=NULL; dbase=0; } ~nametype() { if(name) { free(name); name = NULL; } } }; static char *trim( char str[] ); protected: int numdbases,numnames; allkeys thekeys[maxdbases]; nametype thenames[maxnames]; int doop(char op,int a,int b); int lowcase(char ch); int strpos(char *s,char *sub); int match(char s[],char m[],int& in,int&); bool addname(char*,int); //add one name and number bool addbunch(char*, int); //add more then one name to some number void sortnames(); int getname(char*); //only tries once to find a name int getanyname(char*); //more exhaustive search to find name public: void reducespaces(char *); void eliza::addrest(char* replied, char* talker, char* rep, char* target,char* rest); public: bool loaddata( char *, char recurflag = 0 ); char* processdbase(char* talker,char* message,char* target,int dbase); char* process(char* talker,char* message,char* target) { #ifdef USE_EX_SEARCH return processdbase(talker,message,target,getanyname(talker)); #else return processdbase(talker,message,target,getname(talker)); #endif } eliza() { numdbases = 0; numnames = 0; addname("default",0); } ~eliza(); }; #endif