-
-/* codes for pol_usefile */
-
-#define P_USE_STR 1 /* use string as input source */
-#define P_USE_FILE 2 /* use file as input source */
-
-/* codes for pol_int and pol_float */
-/* if in reject catagory, get new number from terminal */
-
-#define P_FLTINT 1 /* get a real or integer number */
-#define P_BFLTINT 2 /* get a real or integer number, clip against bounds */
-#define P_CBFLTINT 3 /* get real or int, reject if outside bounds */
-
-#define P_FLT 4 /* get a real number */
-#define P_BFLT 5 /* get a real, clip against bounds */
-#define P_CBFLT 6 /* get a floating, reject if outside bounds */
-
-#define P_INT 7 /* get a integer number */
-#define P_BINT 8 /* get a integer, clip against bounds */
-#define P_CBINT 9 /* get a integer, reject if outside bounds */
-
-#define LETTER 'a'
-#define DIGIT '0'
-
-#define MAXTOK 200 /* maximum length of a token */
-#define MAXLINE 255
-#define MAXIDENT 20
-#define MAXSKIPWORD 20
-#define MAXSKIPCHAR 20
-
-#define MIN_INT -32768
-#define MAX_INT 32767
-
-/* token types */
-
-#define TT_STRING 1 /* string token */
-#define TT_INT 2 /* integer token */
-#define TT_REAL 3 /* floating point token */
-#define TT_ALPHA 4 /* alphabetic token */
-#define TT_ALPNUM 5 /* alphanumeric token */
-#define TT_NUMALPHA 6
-#define TT_SPECLCHAR 7
-
-#define TT_EOF 8 /* end of file reached */
-#define TT_ERROR 9 /* error in token, caused by call to wrong */
- /* type of token reader */
-#define TT_BLANK 10 /* white space token. pol_tok() skips these */
-#define TT_USERTOK 11 /* user defined token */
-
-struct symlist {
- char *name;
- int code;
- struct symlist *next;
+\r
+#include "hashtable.h"\r
+#include <stack>\r
+
+class POL {
+
+ public:
+
+ // codes for pol_usefile \r
+ enum {\r
+ P_USE_STR = 1, // use string as input source \r
+ P_USE_FILE, // use file as input source \r
+ };\r
+\r
+ \r
+ POL();
+ ~POL();
+
+ void init ();
+ void addSkipWord (const char const *w);
+ void addSkipChar (int c);
+ void addKeyword (const char* const str, int code);
+ bool readWord (char *search, int nlet);
+ bool readUserToken (char *str, int *code);
+ bool readString (char *str);
+ bool readInteger (int *n, int typecode, bool boundcode, int bb1, int bb2);
+ bool readFloat (double *n, double typecode, bool boundcode, double bb1, double bb2);
+ bool skipTokens ();
+ void reader ();
+ bool readText (char *str, int lim);
+ void usefile (int source, char *fn);
+ void closefile ();
+ int lookchar ();
+ int inchar ();
+ void ungetch (int c);
+ int get_inputline (FILE *fp);
+ void set_inputline (const char* const line);
+
+\r
+ enum {\r
+ MAXTOK = 200, // maximum length of a token \r
+ MAXLINE = 1024, // maximum line length\r
+ MAXIDENT = 20,\r
+ MAXSKIPWORD = 20,\r
+ MAXSKIPCHAR = 20,\r
+ MIN_INT = -2000000000,\r
+ MAX_INT = 2000000000,\r
+ };\r
+ \r
+ // token types \r
+ enum {\r
+ TT_STRING = 1, // string token \r
+ TT_INT, // integer token \r
+ TT_REAL, // floating point token \r
+ TT_ALPHA, // alphabetic token \r
+ TT_ALPNUM, // alphanumeric token \r
+ TT_NUMALPHA,\r
+ TT_SPECLCHAR,\r
+ TT_EOF, // end of file reached \r
+ TT_ERROR, // error in token, caused by call to wrong type of token reader \r
+ TT_BLANK, // white space token. pol_tok() skips these \r
+ TT_USERTOK, // user defined token \r
+ };\r
+\r
+ \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 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
+ struct token_st token; // current token \r
+ \r
+ // Tables words stored with install() & found with lookup() \r
+ KeywordCodeHashTable skiptable; // words to ignore and skip \r
+ KeywordCodeHashTable cmdtable; // pol parameter commands \r
+ KeywordCodeHashTable usertable; // 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
+ char m_szSkipChars [MAXSKIPCHAR]; // characters to skip\r
+ bool m_bTrace;\r
+ bool m_bNewlineIsEOC;\r
+ \r
+ struct KeywordCodeList {\r
+ char *keyword;\r
+ int code;\r
+ };\r
+ \r
+ static const struct KeywordCodeList cmdlist[];\r
+ static const unsigned 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
+ INPUT_STREAM = 1,\r
+ INPUT_FILE,\r
+ INPUT_STRING,\r
+ };\r
+\r
+ int m_iInputType;\r
+ std::istream* m_pInputStream;\r
+ FILE* m_pInputFile;\r
+ char* m_pszInputString;\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
+ std::stack<int> m_stackPushBackInput;\r
+\r
+ bool skipSingleToken (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
+ int getch (FILE *fp);\r
+ \r