/
/*
* CthulhuMud
*/

/*
* MUD Chat 
* Copyright (c)1996 by Chris Busch
*/


#define USE_EX_SEARCH	
#define UNIX


#ifdef UNIX
	void randomize();
	int random(int);
#endif


struct reply {
	int wate;
	char *sent;
};

class akey {
	protected:
		char *logic;
		int numreplys,totalwates;
		reply *replys;
	public:
		akey();
		int addlogic(char *);
		char *getlogic() {return logic;}
		int addreply(int,char *);
		reply& getreply(int num) {return replys[num];}
		char* getrndreply();
		~akey();
};

struct akeynode {
  akey key;
  akeynode *next;
};

class allkeys {
protected:
  akeynode *first,*current,*top;
  int numkeys;
public:
  enum {contnotset=-1};
  int contdbase; //signifies which datbase to use if this one fell thru
  allkeys() { current=first=top=NULL; numkeys=0; contdbase=contnotset;}
  akeynode* curr() {return current;}
  akeynode* addkey();
  akeynode* reset();
  akeynode* advance();
  ~allkeys();
};

//enum bool {false,true};
#define BOOL int

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) { name=strdup(n); dbase=d; return name; }
    nametype() { name=NULL; dbase=0; }
    ~nametype() { if(name) free(name); }
  };
  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); }

};