//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