diff --git a/Utils/Scripter/codegen.cpp b/Utils/Scripter/codegen.cpp index ed7cf2956..d8fcc1631 100644 --- a/Utils/Scripter/codegen.cpp +++ b/Utils/Scripter/codegen.cpp @@ -50,6 +50,9 @@ static FILE *s_fhOutput=NULL; CTreeNode *s_baseTreeNode=NULL; +static mylexer s_lexer; +static myparser s_parser; + /*---------------------------------------------------------------------- @@ -61,20 +64,18 @@ CTreeNode *s_baseTreeNode=NULL; extern int parseFile(char *_filename,CTreeNode *_baseNode) { int ret; - mylexer lexer; - myparser parser; ret=YYEXIT_FAILURE; - if(parser.yycreate(&lexer)) + if(s_parser.yycreate(&s_lexer)) { - if(lexer.yycreate(&parser)) + if(s_lexer.yycreate(&s_parser)) { - if(lexer.openInputFile(_filename)) + if(s_lexer.openInputFile(_filename)) { - parser.setCurrentLexer(&lexer); - parser.setBaseNode(_baseNode); - ret=parser.yyparse(); - lexer.closeInputFile(); + s_parser.setCurrentLexer(&s_lexer); + s_parser.setBaseNode(_baseNode); + ret=s_parser.yyparse(); +// s_lexer.closeInputFile(); } } } diff --git a/Utils/Scripter/lexer.h b/Utils/Scripter/lexer.h index 4155ac0ca..18255df59 100644 --- a/Utils/Scripter/lexer.h +++ b/Utils/Scripter/lexer.h @@ -34,7 +34,7 @@ public: int yygetchar(); private: - FILE *m_fhInput; +// FILE *m_fhInput; int m_charCount; int m_lineCount; int m_currentCharOnLine; diff --git a/Utils/Scripter/lexer.l b/Utils/Scripter/lexer.l index 1c2e555f1..45656510a 100644 --- a/Utils/Scripter/lexer.l +++ b/Utils/Scripter/lexer.l @@ -39,7 +39,7 @@ Date: 07 December 2000 int yygetchar(); private: - FILE *m_fhInput; +// FILE *m_fhInput; int m_charCount; int m_lineCount; int m_currentCharOnLine; diff --git a/Utils/Scripter/main.cpp b/Utils/Scripter/main.cpp index af65c3160..026a25e50 100644 --- a/Utils/Scripter/main.cpp +++ b/Utils/Scripter/main.cpp @@ -19,6 +19,7 @@ #include "main.h" #include "lexer.h" #include "parser.h" +#include "pfile.h" #ifndef __CODEGEN_H__ #include "codegen.h" @@ -109,6 +110,7 @@ extern int main(int argc, char *argv[]) ---------------------------------------------------------------------- */ int mylexer::openInputFile(char *_filename) { + /* int ret=1; printf("Opening %s..\n",_filename); @@ -125,6 +127,9 @@ int mylexer::openInputFile(char *_filename) m_errorCount=0; } return ret; + */ + + return openPFile(_filename); } @@ -136,6 +141,7 @@ int mylexer::openInputFile(char *_filename) ---------------------------------------------------------------------- */ int mylexer::closeInputFile() { + /* printf("Processed %d char(s), %d line(s)\n",m_charCount,m_lineCount); if(m_errorCount) { @@ -143,6 +149,8 @@ int mylexer::closeInputFile() } fclose(m_fhInput); return 1; + */ + return closePFile(); } @@ -156,31 +164,46 @@ int mylexer::yygetchar() { char c; int ret; + FILE *fh; - if(fread(&c,sizeof(c),1,m_fhInput)==1) + + fh=getPFileFh(); + if(fh) { - m_charCount++; - m_currentCharOnLine++; - if(c=='\n') + if(fread(&c,sizeof(c),1,fh)==1) { - m_lineCount++; - m_currentCharOnLine=0; + m_charCount++; + m_currentCharOnLine++; + if(c=='\n') + { + m_lineCount++; + m_currentCharOnLine=0; + } + ret=c; + } + else + { + ret=-1; + if(ferror(fh)) + { + printf("FATAL: Read error!\n"); + } + else + { + closePFile(); + return yygetchar(); + } + } + + // Force compilation to stop after finding errors ( hmm.. ) + if(m_errorCount) + { + printf("Stopping compilation!\n"); + ret=-1; } - ret=c; } else { - if(ferror(m_fhInput)) - { - printf("FATAL: Read error!\n"); - } - ret=-1; - } - - // Force compilation to stop after finding errors ( hmm.. ) - if(m_errorCount) - { - printf("Stopping compilation!\n"); ret=-1; } diff --git a/Utils/Scripter/pfile.cpp b/Utils/Scripter/pfile.cpp index 4fabfdba6..5e40a5dcd 100644 --- a/Utils/Scripter/pfile.cpp +++ b/Utils/Scripter/pfile.cpp @@ -22,6 +22,10 @@ /* Std Lib ------- */ +#include +#include + + /* Data ---- */ @@ -33,6 +37,32 @@ Structure defintions -------------------- */ +class CPFile +{ +public: + CPFile(); + + int open(char *_filename); + int close(); + + FILE *getFh() {return m_fh;} + + static class CPFile *getCurrentFile() {return s_stack;} + + +private: + FILE *m_fh; + char *m_filename; + int m_charCount; + int m_lineCount; + int m_currentCharOnLine; + int m_errorCount; + + class CPFile *m_next; + static class CPFile *s_stack; +}; + + /*---------------------------------------------------------------------- Function Prototypes ------------------- */ @@ -41,12 +71,130 @@ Vars ---- */ +CPFile *CPFile::s_stack=NULL; + + /*---------------------------------------------------------------------- Function: Purpose: Params: Returns: ---------------------------------------------------------------------- */ +extern int openPFile(char *_filename) +{ + CPFile *pf; + pf=new CPFile; + return pf->open(_filename); +} + + +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +extern int closePFile() +{ + CPFile *pf; + int ret; + pf=CPFile::getCurrentFile(); + ret=pf->close(); + delete pf; + return ret; +} + + +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +extern FILE *getPFileFh() +{ + CPFile*pf; + + pf=CPFile::getCurrentFile(); + if(pf) + return pf->getFh(); + else + return NULL; +} + + + + + + +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +CPFile::CPFile() +{ + m_fh=NULL; + m_filename=NULL; + m_charCount=0; + m_lineCount=0; + m_currentCharOnLine=0; + m_errorCount=0; +} + + +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +int CPFile::open(char *_filename) +{ + int ret=1; + + printf("Opening %s..\n",_filename); + if((m_fh=fopen(_filename,"rt"))==NULL) + { + printf("FATAL: Couldn't open file for reading\n"); + ret=0; + } + else + { + m_filename=(char*)malloc(strlen(_filename)+1); + strcpy(m_filename,_filename); + m_next=s_stack; + s_stack=this; + } + return ret; +} + + +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +int CPFile::close() +{ + printf("Processed %d char(s), %d line(s) in file %s\n",m_charCount,m_lineCount,m_filename); + if(m_errorCount) + { + printf("Found %d error(s) :(\n",m_errorCount); + } + fclose(m_fh); + if(m_next) + { + s_stack=m_next; + } + else + { + s_stack=NULL; + } + return 1; +} /*=========================================================================== diff --git a/Utils/Scripter/pfile.h b/Utils/Scripter/pfile.h index 43469985e..3b8cfe9cc 100644 --- a/Utils/Scripter/pfile.h +++ b/Utils/Scripter/pfile.h @@ -21,6 +21,9 @@ /* Std Lib ------- */ +#include + + /*---------------------------------------------------------------------- Tyepdefs && Defines ------------------- */ @@ -37,6 +40,11 @@ Functions --------- */ +extern int openPFile(char *_filename); +extern int closePFile(); +extern FILE *getPFileFh(); + + /*---------------------------------------------------------------------- */ #endif /* __PFILE_H__ */ diff --git a/Utils/Scripter/prepro.cpp b/Utils/Scripter/prepro.cpp index ce6b10564..6a9948704 100644 --- a/Utils/Scripter/prepro.cpp +++ b/Utils/Scripter/prepro.cpp @@ -17,6 +17,7 @@ -------- */ #include "prepro.h" +#include "pfile.h" /* Std Lib @@ -139,9 +140,7 @@ static int ppf_include(char *_cmd) includeFile=strtok(_cmd,s_seps); includeFile=strtok(NULL,s_seps); -// printf("include: '%s'\n",includeFile); - - return 0; + return openPFile(includeFile)==1?0:1; } diff --git a/Utils/Scripter/scripter.dsp b/Utils/Scripter/scripter.dsp index 2593afe64..58e3a5e20 100644 --- a/Utils/Scripter/scripter.dsp +++ b/Utils/Scripter/scripter.dsp @@ -140,6 +140,14 @@ SOURCE=.\main.h # End Source File # Begin Source File +SOURCE=.\pfile.cpp +# End Source File +# Begin Source File + +SOURCE=.\pfile.h +# End Source File +# Begin Source File + SOURCE=.\prepro.cpp # End Source File # Begin Source File