#ifndef COMMANDS_H
#define COMMANDS_H 1
#pragma interface

#include "value.h"
#include <String.h>
#include <iostream.h>
#include <fstream.h>

/************************************************************************
************ CommandList:  a complex parse table ************************
************************************************************************/

extern class Value;

class CommandNode{
  friend class CommandList;
 public:
  CommandNode(Val_List* key, String* indata, CommandNode* nextnode = NULL);
  ~CommandNode();
 protected:
  Val_List* key_list;
  String* data;
  CommandNode* next;
};

class CommandList {
 public:
  CommandList();
  ~CommandList();
  String* add (Val_List* key, String* indata);
  int remove (String* pattern);
  void purge ();
  String* lookup (String* pattern);
  Val_List* lookup_all (String* pattern);
  Value* list_cmds();
  char* pack_cmds(char* buf);
  char* unpack (char* buf);
  void dump_to_stdout();
  friend Value* list_lookup (Val_List* parse_list, String* pattern,
			     String** error_string = NULL);
 protected:
  CommandNode* clist;
};

int is_command_constant(String*);
String* match_command_constant(String* key, String& pattern);
void initialize_command_constants();   // call this once at startup time.
Regex* get_command_constant(String* key);

void sub_special (String& instr);

/************************************************************************
************ StringReHash:  a String-->Regexp hash table  ***************
************************************************************************/

#define SSH_WIDTH 32 

class StringPtrList {
  friend class StringPtrHash;
 protected:
  String* key;
  void* data;
  StringPtrList* next;
 public:
  StringPtrList (String* inkey, void* indata, StringPtrList* next_node = NULL);
  ~StringPtrList ();
};

class StringPtrHash {
 protected:
  StringPtrList* slists[SSH_WIDTH];
 public:
  StringPtrHash();
  ~StringPtrHash();
  void add (String*, void*);
  void* lookup (String*);
};

class StringReHash : public StringPtrHash {
 public:
  void add (String*, Regex*);
  Regex* lookup (String*);
};

#endif  /* COMMANDS_H */