#include "Structures.h"
#include "tokentable.h"
#pragma implementation

#define ALL_ARGS 666
const struct ttstruct tokentable[] = {
  {"",           0 , 0 , 0},
  {"=",          2 , 2 , 2},
  {"<",          2 , 2 , 2},
  {">",          2 , 2 , 2},
  {"%",          ALL_ARGS , 2 , ALL_ARGS},
  {"/",          ALL_ARGS , 2 , ALL_ARGS},
  {"-",          ALL_ARGS , 2 , ALL_ARGS},
  {"+",          ALL_ARGS , 2 , ALL_ARGS},
  {"*",          ALL_ARGS , 2 , ALL_ARGS},
  {"set",        0 , 2 , ALL_ARGS},
  {"not",        1 , 1 , 1},
  {"or",         1 , 1 , ALL_ARGS},   /** short-circuiting **/
  {"and",        1 , 1 , ALL_ARGS},   /** short-circuiting **/
  {"index",      2 , 2 , 2},
  {"range",      3 , 3 , 3},
  {"tonum",      1 , 1 , 1},
  {"toreal",     1 , 1 , 1},
  {"tostr",      1 , 1 , 1},
  {"toobj",      1 , 1 , 1},
  {"time",       0 , 0 , 0},
  {"random",     0 , 0 , 0},
  {"length",     1 , 1 , 1},
  {"insert",     3 , 3 , 3},
  {"crypt",      1 , 1 , 1},
  {"if",         1 , 2 , 3},
  {"dotimes",    0 , 2 , 2},
  {"foreach",    0 , 2 , 2},
  {"while",      1 , 2 , 2},
  {"pass",       ALL_ARGS , 0 , ALL_ARGS},
  {"pass-to",    ALL_ARGS , 1 , ALL_ARGS},
  {"sleep",      1 , 1 , 1},
  {"fork",       0 , 1 , ALL_ARGS},
  {"kill",       0 , 0 , 0},
  {"echo",       1 , 1 , 1},
  {"setparents", 2 , 2 , 2},      /** #0-only **/
  {"var",        0 , 2 , ALL_ARGS},
  {"rmvar",      1 , 1 , 1},
  {"addcmd",     2 , 2 , 2},
  {"rmcmd",      1 , 1 , 1},
  {"matchcmd",   1 , 1 , 1},
  {"call",       1 , 2 , ALL_ARGS},
  {"method",     0 , 0 , 0},      /** this will never be used **/
  {"commands",   0 , 0 , 0},
  {"vars",       0 , 0 , 0},
  {"clone",      0 , 0 , 0},
  {"disconnect", 0 , 0 , 0},
  {"reconnect",  2 , 2 , 2},      /** #0-only **/
  {"shutdown",   0 , 0 , 0},      /** #0-only **/ 
  {"return",     1 , 1 , 1},      /** returns from closest enclosing method **/
  {"begin",      ALL_ARGS , 1 , ALL_ARGS},
  {"raise",      ALL_ARGS , 1 , 2},
  {"tolist",     ALL_ARGS , 0 , ALL_ARGS},
  {"ignore",     1 , 2 , 2},
  {"compile",    1 , 1 , 1},
  {"search",     2 , 2 , 2},
  {"parents",    0 , 0 , 0},
  {"explode",    2 , 2 , 2},
  {"purge-cmds", 0 , 0 , 0},
  {"car",        ALL_ARGS, 1, 1},
  {"cdr",        ALL_ARGS, 1, 1},
  {"cons",       ALL_ARGS, 2, 2},
  {"tosym",      ALL_ARGS, 1, 1},
  {"after",      2 , 2 , 2},
  {"before",     2 , 2 , 2},
  {"quote",      0 , 1 , 1},
  {"eval",       1 , 1 , 2},
  {"typeof",     1 , 1 , 1},
  {"filetext",   1 , 1 , 1},
  {"run-script", ALL_ARGS , 1 , 2},
  {"class",      2 , 2 , 2},
  {"square-root",1 , 1 , 1},
  {"reg-split",  2 , 2 , 2},
  {"connect-out",2 , 2 , 2},
  {"handle",     3 , 3 , 3},
  {"semaphore",  0 , 2 , ALL_ARGS},
  {"address",    0 , 0 , 0},
  {">=",         2 , 2 , 2},
  {"<=",         2 , 2 , 2},
  {"format",     2 , 2 , 2},
  {"implode",    2 , 2 , 2},
  {"sets",       2 , 2 , ALL_ARGS},
  {"num2char",   1 , 1 , 1},
  {"char2num",   1 , 1 , 1},
  {"collect",    1 , 1 , 1},
  {"match-one",  2 , 2 , 2},
  {"log",        1 , 1 , 1}
};

char* type_strings[] = {
  "UNUSED",
  "STRING",
  "NUMBER",
  "OBJECT",
  "ERROR",
  "LIST",
  "REAL",
  "METHOD",
  "EXPRESSION",
  "SYMBOL",
  "RESERVED",
  "SUBRANGE",
  "USER-DEFINED"
};

StringValHash* init_token_table(void){
  int i;
  StringValHash* retval = new StringValHash;
  for (i=0 ; i < (sizeof(tokentable) / sizeof(tokentable[0])) ; i++)
    retval->add (new Value (i, RESERVED),
		 new String (tokentable[i].symbol));
  return retval;
}