src/preprocessor.cxx

Fri, 10 Jan 2014 21:58:42 +0200

author
Teemu Piippo <crimsondusk64@gmail.com>
date
Fri, 10 Jan 2014 21:58:42 +0200
changeset 72
03e4d9db3fd9
parent 71
11f23fabf8a6
permissions
-rw-r--r--

- major refactoring begins

71
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1 #include <stdio.h>
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
2 #include <stdlib.h>
72
03e4d9db3fd9 - major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents: 71
diff changeset
3 #include "main.h"
71
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
4 #include "str.h"
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
5 #include "scriptreader.h"
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
6
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
7 /* Since the preprocessor is *called* from ReadChar and I don't want
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
8 * to worry about recursive preprocessing, the preprocessor uses its
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
9 * own bare-bones variant of the function for file reading.
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
10 */
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
11 char ScriptReader::PPReadChar () {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
12 char c;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
13 if (!fread (&c, sizeof (char), 1, fp[fc]))
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
14 return 0;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
15 curchar[fc]++;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
16 return c;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
17 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
18
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
19 void ScriptReader::PPMustChar (char c) {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
20 char d = PPReadChar ();
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
21 if (c != d)
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
22 ParserError ("expected `%c`, got `%d`", c, d);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
23 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
24
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
25 // ============================================================================
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
26 // Reads a word until whitespace
72
03e4d9db3fd9 - major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents: 71
diff changeset
27 string ScriptReader::PPReadWord (char &term) {
03e4d9db3fd9 - major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents: 71
diff changeset
28 string word;
71
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
29 while (1) {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
30 char c = PPReadChar();
72
03e4d9db3fd9 - major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents: 71
diff changeset
31 if (feof (fp[fc]) || (isspace (c) && word.len ())) {
71
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
32 term = c;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
33 break;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
34 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
35 word += c;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
36 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
37 return word;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
38 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
39
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
40 // ============================================================================
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
41 // Preprocess any directives found in the script file
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
42 void ScriptReader::PreprocessDirectives () {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
43 size_t spos = ftell (fp[fc]);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
44 if (!DoDirectivePreprocessing ())
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
45 fseek (fp[fc], spos, SEEK_SET);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
46 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
47
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
48 /* ============================================================================
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
49 * Returns true if the pre-processing was successful, false if not.
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
50 * If pre-processing was successful, the file pointer remains where
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
51 * it was, if not, it's pushed back to where it was before preprocessing
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
52 * took place and is parsed normally.
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
53 */
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
54 bool ScriptReader::DoDirectivePreprocessing () {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
55 char trash;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
56 // Directives start with a pound sign
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
57 if (PPReadChar() != '#')
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
58 return false;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
59
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
60 // Read characters until next whitespace to
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
61 // build the name of the directive
72
03e4d9db3fd9 - major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents: 71
diff changeset
62 string directive = PPReadWord (trash);
71
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
63
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
64 // Now check the directive name against known names
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
65 if (directive == "include") {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
66 // #include-directive
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
67 char terminator;
72
03e4d9db3fd9 - major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents: 71
diff changeset
68 string file = PPReadWord (terminator);
71
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
69
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
70 if (!file.len())
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
71 ParserError ("expected file name for #include, got nothing instead");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
72 OpenFile (file);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
73 return true;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
74 } else if (directive == "neurosphere") {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
75 // #neurosphere - activates neurosphere compatibility, aka stuff
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
76 // that is still WIP and what main zandronum does not yet support.
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
77 // Most end users should never need this.
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
78 g_Neurosphere = true;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
79 return true;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
80 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
81
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
82 ParserError ("unknown directive `#%s`!", directive.chars());
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
83 return false;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
84 }

mercurial