5 void charParser::errMode (int mode
) {
9 charParser::charParser (
10 #ifndef FE_NO_FILESYSTEM
11 fileSystem
*fs
, const char *buffer
, bool stdio
, int size
13 const char *buffer
, int size
17 #ifndef FE_NO_FILESYSTEM
31 strncpy (mFileName
, buffer
, PARSER_MAXFNAME
);
35 mpBuffer
= mpScript
= (char*)buffer
;
37 mpEnd
= mpBuffer
+ size
;
42 charParser::~charParser ()
44 if (mbSTDIO
&& mpFileSTDIO
) {
48 #ifndef FE_NO_FILESYSTEM
49 else if (!mbSTDIO
&& mpFile
) {
56 int charParser::readNextChunk (void) {
60 mpFileSTDIO
= fopen (mFileName
, "rb");
62 sys_printf ("ERROR: failed to open file %s\n", mFileName
);
63 if (mErrMode
) error ();
64 return FILE_NOT_FOUND
;
66 fseek (mpFileSTDIO
, 0, SEEK_END
);
67 mFileLeft
= ftell (mpFileSTDIO
);
70 mpEnd
= mpBuffer
+ mBufferSize
;
74 #ifndef FE_NO_FILESYSTEM
75 mpFile
= mpFileSystem
->openFile (mFileName
);
77 sys_printf ("ERROR: failed to open file %s\n", mFileName
);
78 if (mErrMode
) error ();
79 return FILE_NOT_FOUND
;
81 mFileLeft
= mpFile
->getSize ();
83 mpEnd
= mpBuffer
+ mBufferSize
;
86 sys_printf ("ERROR: fe::filesystem is not available in this build\n");
87 if (mErrMode
) error ();
88 return FEATURE_NOT_INCLUDED
;
92 if (mpScript
!= mpBuffer
) {
95 int sz
= min (mFileLeft
, PARSER_BUFSIZE
);
97 if (fread (mpScript
, sz
, 1, mpFileSTDIO
) != 1) {
98 sys_printf ("ERROR: failed to read from file %s\n", mFileName
);
99 if (mErrMode
) error ();
104 if (mpFile
->read (mpScript
, sz
) != sz
) {
105 sys_printf ("ERROR: failed to read from file %s\n", mFileName
);
106 if (mErrMode
) error ();
110 mpEnd
= mpScript
+ sz
;
115 int charParser::checkEOF (void) {
116 if (mpScript
== mpEnd
) {
119 int res
= readNextChunk ();
124 if (mErrMode
) error ();
131 int charParser::getToken (void)
136 res
= readNextChunk ();
142 mbTokenReady
= false;
146 if (checkEOF ()) return END_OF_FILE
;
151 while (mpScript
< mpEnd
&& *mpScript
<= 32)
153 if (*mpScript
++ == '\n') {
156 if (checkEOF ()) return END_OF_FILE
;
160 if (*mpScript
== '#')
162 while (mpScript
< mpEnd
&& *mpScript
++ != '\n') {
163 if (checkEOF ()) return END_OF_FILE
;
173 if (*mpScript
== '"')
177 if (checkEOF ()) return END_OF_FILE
;
178 while (*mpScript
!= '"')
180 if (mpToken
- mToken
== PARSER_MAXTOKEN
)
183 sys_printf ("ERROR: token too large in file %s line %i, token: %s\n", mFileName
, mLine
, mToken
);
184 if (mErrMode
) exit(-1);
185 return TOKEN_TOO_LARGE
;
187 *mpToken
++ = *mpScript
++;
188 if (checkEOF ()) return END_OF_FILE
;
207 *mpToken
++ = *mpScript
++;
211 while (*mpScript
> 32
224 if (mpToken
- mToken
== PARSER_MAXTOKEN
)
227 sys_printf ("ERROR: token too large in file %s line %i\n", mFileName
, mLine
);
228 if (mErrMode
) exit(-1);
229 return TOKEN_TOO_LARGE
;
231 *mpToken
++ = *mpScript
++;
233 break; // reached EOF while reading token, this is not an error
240 void charParser::unGetToken ()
245 bool charParser::hasToken ()
260 if (oldLine
== mLine
)
266 int charParser::matchToken (const char *match
)
279 sys_printf ("WARNING: unmatched token %s (expected %s) in file %s line %d\n", mToken
, match
, mFileName
, mLine
);
280 if (mErrMode
) exit(-1);
281 return TOKEN_MISMATCH
;
289 void charParser::nextLine (void)
292 while (line
== mLine
)
297 void charParser::ignoreBlock (const cStr
&opentag
, const cStr
&closetag
)
303 if (!cmptoken (opentag
))
305 else if (!cmptoken (closetag
))
310 void charParser::getBlockContents (const cStr
&opentag
, const cStr
&closetag
, cStr
&block
)
319 if (!cmptoken (opentag
))
323 else if (!cmptoken (closetag
))
340 const char *charParser::token (void) const
345 bool charParser::cmptoken (const char *s
) const
347 return strcmp (s
, mToken
) ? true : false;
350 bool charParser::isEOL (void)
352 if (checkEOF ()) return true;
353 while (*mpScript
<= 32)
355 if (*mpScript
== '\n')
358 if (checkEOF ()) return true;
363 void charParser::unexpectedEof (void)
365 sys_printf ("ERROR: unexpected end of file %s, line %d\n", mFileName
, mLine
);
368 void charParser::generalSyntaxError (void)
370 sys_printf ("ERROR: syntax error in file %s, line %d\n", mFileName
, mLine
);
373 void charParser::error (void) {
374 sys_printf ("ERROR: error loading file %s at line %d\n", mFileName
, mLine
);