scriptreader.cxx

changeset 36
a8838b5f1213
parent 35
3d3f6ed40171
child 38
e4bbd540663b
equal deleted inserted replaced
35:3d3f6ed40171 36:a8838b5f1213
57 OpenFile (path); 57 OpenFile (path);
58 commentmode = 0; 58 commentmode = 0;
59 } 59 }
60 60
61 ScriptReader::~ScriptReader () { 61 ScriptReader::~ScriptReader () {
62 FinalChecks (); 62 // If comment mode is 2 by the time the file ended, the
63 // comment was left unterminated. 1 is no problem, since
64 // it's terminated by newlines anyway.
65 if (commentmode == 2)
66 ParserError ("unterminated `/*`-style comment");
63 67
64 for (unsigned int u = 0; u < MAX_FILESTACK; u++) { 68 for (unsigned int u = 0; u < MAX_FILESTACK; u++) {
65 if (fp[u]) { 69 if (fp[u]) {
66 ParserWarning ("file idx %u remained open after parsing", u); 70 ParserWarning ("file idx %u remained open after parsing", u);
67 CloseFile (u); 71 CloseFile (u);
360 str num; 364 str num;
361 if (!fromthis) 365 if (!fromthis)
362 MustNext (); 366 MustNext ();
363 num += token; 367 num += token;
364 368
365 // Cater for a possible minus sign, since it 369 // The number can possibly start off with a minus sign, which
366 // breaks the token, read a new one with the number. 370 // also breaks the token. If we encounter it, read another token
371 // and merge it to this one.
367 if (!token.compare ("-")) { 372 if (!token.compare ("-")) {
368 MustNext (); 373 MustNext ();
369 num += token; 374 num += token;
370 } 375 }
371 376
377 // Result must be a number.
372 if (!num.isnumber()) 378 if (!num.isnumber())
373 ParserError ("expected a number, got `%s`", num.chars()); 379 ParserError ("expected a number, got `%s`", num.chars());
374 380
381 // Save the number into the token.
375 token = num; 382 token = num;
376 } 383 }
377 384
378 void ScriptReader::MustBool () { 385 void ScriptReader::MustBool () {
379 MustNext(); 386 MustNext();
395 case RETURNVAL_INT: MustNumber (); break; 402 case RETURNVAL_INT: MustNumber (); break;
396 case RETURNVAL_STRING: MustString (); break; 403 case RETURNVAL_STRING: MustString (); break;
397 case RETURNVAL_BOOLEAN: MustBool (); break; 404 case RETURNVAL_BOOLEAN: MustBool (); break;
398 } 405 }
399 } 406 }
400
401 // Checks to be performed at the end of file
402 void ScriptReader::FinalChecks () {
403 // If comment mode is 2 by the time the file ended, the
404 // comment was left unterminated. 1 is no problem, since
405 // it's terminated by newlines anyway.
406 if (commentmode == 2)
407 ParserError ("unterminated `/*`-style comment");
408 }

mercurial