X-Git-Url: http://git.kpe.io/?p=ctsim.git;a=blobdiff_plain;f=include%2Fpol.h;h=e492e755659277c29e1802a65d3fec858b0bd049;hp=49a45c253f3dbd5ea43002aa6898bebc1e094ac3;hb=88fd1492afba7c103e2bedbaac0d69fb9bf3cf66;hpb=031437896d0dc6cac70c16e5604b10f5aa4d0767 diff --git a/include/pol.h b/include/pol.h index 49a45c2..e492e75 100644 --- a/include/pol.h +++ b/include/pol.h @@ -1,8 +1,13 @@ /***************************************************************************** +** Name: pol.h +** Purpose: Header file for Problem Oriented Language Class +** Programmer: Kevin Rosenberg +** Date Started: 1984 +** ** This is part of the CTSim program -** Copyright (C) 1983-2000 Kevin Rosenberg +** Copyright (c) 1983-2001 Kevin Rosenberg ** -** $Id: pol.h,v 1.4 2000/06/13 16:20:31 kevin Exp $ +** $Id$ ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License (version 2) as @@ -20,92 +25,195 @@ #ifndef __H_POL #define __H_POL -/* 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 */ +#include "hashtable.h" +#include + +class POL { + + public: + + // codes for pol_usefile + enum { + P_USE_STR = 1, // use string as input source + P_USE_FILE, // use file as input source + }; + + + POL(); + ~POL(); + + void init (); + void addSkipWord (const char* const w); + void addSkipChar (int c); + void addKeyword (const char* const str, int code); + bool readWord (const 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, const char *fn); + void closefile (); + int lookchar (); + int inchar (); + void ungetch (int c); + int get_inputline (FILE *fp); + void set_inputline (const char* const line); + + + enum { + MAXTOK = 200, // maximum length of a token + MAXLINE = 1024, // maximum line length + MAXIDENT = 20, + MAXSKIPWORD = 20, + MAXSKIPCHAR = 20, + MIN_INT = -2000000000, + MAX_INT = 2000000000, + }; + + // token types + enum { + TT_STRING = 1, // string token + TT_INT, // integer token + TT_REAL, // floating point token + TT_ALPHA, // alphabetic token + TT_ALPNUM, // alphanumeric token + TT_NUMALPHA, + TT_SPECLCHAR, + TT_EOF, // end of file reached + TT_ERROR, // error in token, caused by call to wrong type of token reader + TT_BLANK, // white space token. pol_tok() skips these + TT_USERTOK, // user defined token + }; + + +private: + + // codes for pol_int and pol_float + // if in reject catagory, get new number from terminal + enum { + P_FLTINT = 1, // get a real or integer number + P_BFLTINT, // get a real or integer number, clip against bounds + P_CBFLTINT, // get real or int, reject if outside bounds + P_FLT, // get a real number + P_BFLT, // get a real, clip against bounds + P_CBFLT, // get a floating, reject if outside bounds + P_INT, // get a integer number + P_BINT, // get a integer, clip against bounds + P_CBINT, // 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; -}; -typedef struct symlist SYMBOL; +// typedef std::map KeywordCodeList; + + struct token_st { + int ready; // TRUE if token is ready + // std::string tokstr; // token string + char tokstr[MAXTOK+1]; + int type; // type of token 'TT_' + int code; // holds code for user defined tokens + double fnum; // real value of token + int inum; // integer value of token + }; + typedef struct token_st TOKEN; + struct token_st token; // current token + + // Tables words stored with install() & found with lookup() + KeywordCodeHashTable skiptable; // words to ignore and skip + KeywordCodeHashTable cmdtable; // pol parameter commands + KeywordCodeHashTable usertable; // user defined symbols + + struct metachar { + char eoc; /* end of command character */ + char str; /* string delimiter */ + char com; /* comment character */ + char cmd; /* pol parameter command character */ + char prg; /* program load character */ + char con; /* continuation across newline character */ + char out; /* character that delimits output to terminal */ + char ter; /* character indicates insertion of input from terminal */ + char inb; /* input from graphics device */ + } meta; + + + char m_szSkipChars [MAXSKIPCHAR]; // characters to skip + bool m_bTrace; + bool m_bNewlineIsEOC; + + struct KeywordCodeList { + const char *keyword; + int code; + }; + + static const struct KeywordCodeList cmdlist[]; + static const unsigned int NUMCMD; + + // Internal codes for pol commands + enum { + PC_EOC = 1, + PC_STR, + PC_COM, + PC_CMD, + PC_PRG, + PC_CON, + PC_OUT, + PC_TER, + PC_INB, + PC_NL_EOC, + PC_NL_NEOC, + PC_TRON, + PC_TROFF, + PC_FILE, + PC_DUMP, + }; + + enum { + INPUT_STREAM = 1, + INPUT_FILE, + INPUT_STRING, + }; + + int m_iInputType; + std::istream* m_pInputStream; + FILE* m_pInputFile; + char* m_pszInputString; + + enum { + MAXFILE = 8, + }; + + int currentf; /* pointer to current fp */ + FILE *filep[MAXFILE]; /* == NULL for string input */ + char *fname[MAXFILE]; /* pointer to filename */ + + char inputline[MAXLINE]; /* current input line */ + int lineptr; /* current position in inputline */ + + std::stack m_stackPushBackInput; + + bool skipSingleToken (char term[]); + int tok (struct token_st *token); + void dumptok (struct token_st *token); + + + int getpol_tok (struct token_st *token); + int getcmd (); + int gettok (TOKEN *tok); + void getblank (char *s, int toksiz); + int getalpha (char *s, int toksiz); + void getquote (char *qs, int toksiz); + void getescape (char *s, int delim, int toksiz); + int getnumber (char str[], int strsize, double *fnum, int *inum); + void eatline (); + int type (int c); + int getch (FILE *fp); -struct token_st { - int ready; /* TRUE if token is ready */ - char tokstr[MAXTOK+1]; /* token string */ - int type; /* type of token 'TT_' */ - int code; /* holds code for user defined tokens */ - double fnum; /* real value of token */ - int inum; /* integer value of token */ }; -typedef struct token_st TOKEN; - -/* pol.c */ -void pol_init(void); -void pol_skpword(char *w); -void pol_skpchar(char *s); -int pol_install(char *str, int code); -int pol_word(char *search, int nlet); -int pol_usertok(char *str, int *code); -int pol_string(char *str); -int pol_integer(int *n, int typecode, int boundcode, int bb1, int bb2); -int pol_float(double *n, double typecode, double boundcode, double bb1, double bb2); -int pol_skip(void); -void pol_reader(void); -void gettext(char *str, int lim); -void pol_usefile(int source, char *fn); -void pol_closefile(void); -int pol_lookchar(void); -int pol_inchar(void); -void pol_ungetch(int c); -int get_inputline(FILE *fp); -void set_inputline(char *line); - #endif +