00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef _SCPARSER_H
00010 #define _SCPARSER_H
00011
00012 #include <stdio.h>
00013 #include <string.h>
00014
00015 enum {INT=10,LONG=20,
00016 DOUBLE=30,STRING=100};
00017 class SCParser
00018 {
00019 #define MAXTAG_BUF 10000
00020 #define MAXVAR 2000
00021 #define MAXNAMELENGTH 500
00022
00023
00024
00025
00026 #define protect(statement) do{statement}while(0)
00027 #define bindcommand_real(a,b,c) protect(if(strcmp(a,b)==0){c;return 0;})
00028 #define read_buffer(fmt,type) sscanf(buffer,fmt,\
00029 ((type *)(varptr[curn])+shift+offset))
00030 #define output_buffer(port,ref,type) port(varname[curn]<<" = "\
00031 <<ref((type *)varptr[curn]))
00032
00033
00034 #define bindcommand(a,b,c) bindcommand_real(a,b,c)
00035
00036 public:
00037 char buffer[MAXTAG_BUF], cchar;
00038 char varname[MAXVAR][MAXNAMELENGTH];
00039 int vartype[MAXVAR];
00040 void *varptr[MAXVAR];
00041 int varn,curn,shift;
00042 bool willabort;
00043 int ncpu, shmsize;
00044
00045 SCParser():cchar(-1),varn(0),willabort(false),ncpu(1),shmsize(0){};
00046 virtual ~SCParser(){};
00047 virtual int exec(char *name);
00048 void abortparser();
00049 virtual int assignvar(int offset=0);
00050 void dumpbuffer();
00051 bool bufferis(char *s);
00052 bool bufferbeginswith(char c);
00053 bool bufferendswith(char c);
00054 bool buffercontains(char c);
00055
00056 void bindvar(char *vn,void *p,int type);
00057 static FILE *getfilehandler(int argc, char *argv[]);
00058
00059 void init();
00060 int readnextstring(FILE *file);
00061 int identify(const char *name);
00062 int parse(FILE *file);
00063 int parse_buffer(FILE *file);
00064 };
00065
00066
00067 #endif // _SCPARSER_H
00068