+ \r
+private:\r
+ \r
+ // codes for pol_int and pol_float \r
+ // if in reject catagory, get new number from terminal \r
+ enum {\r
+ P_FLTINT = 1, // get a real or integer number \r
+ P_BFLTINT, // get a real or integer number, clip against bounds \r
+ P_CBFLTINT, // get real or int, reject if outside bounds \r
+ P_FLT, // get a real number \r
+ P_BFLT, // get a real, clip against bounds \r
+ P_CBFLT, // get a floating, reject if outside bounds \r
+ P_INT, // get a integer number \r
+ P_BINT, // get a integer, clip against bounds \r
+ P_CBINT, // get a integer, reject if outside bounds \r
+ };\r
+ \r
+#define LETTER 'a'\r
+#define DIGIT '0'\r
+ \r
+ \r
+// typedef std::map<std::string,int> KeywordCodeList;\r
+ \r
+ struct symlist {\r
+ char *name;\r
+ int code;\r
+ struct symlist *next;\r
+ };\r
+ typedef struct symlist SYMBOL;\r
+ \r
+ struct token_st {\r
+ int ready; // TRUE if token is ready \r
+ // std::string tokstr; // token string \r
+ char tokstr[MAXTOK+1];\r
+ int type; // type of token 'TT_' \r
+ int code; // holds code for user defined tokens \r
+ double fnum; // real value of token \r
+ int inum; // integer value of token \r
+ };\r
+ typedef struct token_st TOKEN;\r
+ \r
+ \r
+ struct token_st token; // current token \r
+ enum {\r
+ HASHSIZE = 100,\r
+ };\r
+ \r
+ // Tables words stored with install() & found with lookup() \r
+ SYMBOL *skiptable[HASHSIZE]; // words to ignore and skip \r
+ SYMBOL *cmdtable[HASHSIZE]; // pol parameter commands \r
+ SYMBOL *usertable[HASHSIZE]; // user defined symbols \r
+ \r
+ struct metachar {\r
+ char eoc; /* end of command character */\r
+ char str; /* string delimiter */\r
+ char com; /* comment character */\r
+ char cmd; /* pol parameter command character */\r
+ char prg; /* program load character */\r
+ char con; /* continuation across newline character */\r
+ char out; /* character that delimits output to terminal */\r
+ char ter; /* character indicates insertion of input from terminal */\r
+ char inb; /* input from graphics device */\r
+ } meta;\r
+ \r
+ \r
+ // current pol state \r
+ struct pol_st {\r
+ char skipchars[MAXSKIPCHAR]; // characters to skip \r
+ int nl_eoc; // TRUE if newline character ends a command \r
+ int trace; // TRUE if trace is on \r
+ };\r
+ \r
+ struct pol_st pol;\r
+ \r
+ struct KeywordCodeList {\r
+ char *keyword;\r
+ int code;\r
+ };\r
+ \r
+ static const struct KeywordCodeList cmdlist[];\r
+ static const int NUMCMD;\r
+ \r
+ // Internal codes for pol commands \r
+ enum {\r
+ PC_EOC = 1,\r
+ PC_STR,\r
+ PC_COM,\r
+ PC_CMD,\r
+ PC_PRG,\r
+ PC_CON, \r
+ PC_OUT,\r
+ PC_TER,\r
+ PC_INB, \r
+ PC_NL_EOC,\r
+ PC_NL_NEOC,\r
+ PC_TRON,\r
+ PC_TROFF,\r
+ PC_FILE,\r
+ PC_DUMP,\r
+ };\r
+ \r
+ enum {\r
+ MAXFILE = 8,\r
+ };\r
+ \r
+ int currentf; /* pointer to current fp */\r
+ FILE *filep[MAXFILE]; /* == NULL for string input */\r
+ char *fname[MAXFILE]; /* pointer to filename */\r
+ \r
+ char inputline[MAXLINE]; /* current input line */\r
+ int lineptr; /* current position in inputline */\r
+ \r
+ enum {\r
+ BUFSIZE = 100,\r
+ };\r
+ int bp; // pointer to next free position \r
+ int buf[BUFSIZE]; // pushed back input characters \r
+ \r
+ int skiptok(char term[]);\r
+ int tok(struct token_st *token);\r
+ void dumptok(struct token_st *token);\r
+ \r
+ \r
+ int getpol_tok(struct token_st *token);\r
+ int getcmd();\r
+ int gettok (TOKEN *tok);\r
+ void getblank(char *s, int toksiz);\r
+ int getalpha(char *s, int toksiz);\r
+ void getquote(char *qs, int toksiz);\r
+ void getescape(char *s, int delim, int toksiz);\r
+ int getnumber (char str[], int strsize, double *fnum, int *inum);\r
+ void eatline();\r
+ int type(int c);\r
+ void inittable(SYMBOL *table[]);\r
+ void freetable(SYMBOL *table[]);\r
+ int hash(char *s);\r
+ SYMBOL *lookup(SYMBOL *table[], char *s);\r
+ SYMBOL *install(SYMBOL *table[], char *s, int def);\r
+ int getch(FILE *fp);\r
+ \r