Mon, 03 Mar 2014 17:02:38 +0200
- reserved 'constexpr' as a keyword because I know I will need it someday
88 | 1 | /* |
2 | Copyright 2012-2014 Santeri Piippo | |
3 | All rights reserved. | |
4 | ||
5 | Redistribution and use in source and binary forms, with or without | |
6 | modification, are permitted provided that the following conditions | |
7 | are met: | |
8 | ||
9 | 1. Redistributions of source code must retain the above copyright | |
10 | notice, this list of conditions and the following disclaimer. | |
11 | 2. Redistributions in binary form must reproduce the above copyright | |
12 | notice, this list of conditions and the following disclaimer in the | |
13 | documentation and/or other materials provided with the distribution. | |
14 | 3. The name of the author may not be used to endorse or promote products | |
15 | derived from this software without specific prior written permission. | |
16 | ||
17 | THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR | |
18 | IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |
19 | OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. | |
20 | IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | |
21 | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | |
22 | NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | |
23 | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | |
24 | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
25 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | |
26 | THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
27 | */ | |
28 | ||
29 | #include "Main.h" | |
30 | #include "Events.h" | |
31 | #include "Commands.h" | |
32 | #include "StringTable.h" | |
33 | #include "DataBuffer.h" | |
34 | #include "Parser.h" | |
35 | #include "Lexer.h" | |
36 | #include "GitInformation.h" | |
37 | ||
38 | int main (int argc, char** argv) | |
39 | { | |
40 | try | |
41 | { | |
42 | // Intepret command-line parameters: | |
43 | // -l: list commands | |
44 | // I guess there should be a better way to do this. | |
45 | if (argc == 2 && String (argv[1]) == "-l") | |
46 | { | |
115
9be16e1c1e44
- reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents:
113
diff
changeset
|
47 | print ("Begin list of commands:\n"); |
9be16e1c1e44
- reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents:
113
diff
changeset
|
48 | print ("------------------------------------------------------\n"); |
88 | 49 | |
50 | BotscriptParser parser; | |
115
9be16e1c1e44
- reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents:
113
diff
changeset
|
51 | parser.setReadOnly (true); |
9be16e1c1e44
- reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents:
113
diff
changeset
|
52 | parser.parseBotscript ("botc_defs.bts"); |
88 | 53 | |
115
9be16e1c1e44
- reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents:
113
diff
changeset
|
54 | for (CommandInfo* comm : getCommands()) |
9be16e1c1e44
- reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents:
113
diff
changeset
|
55 | print ("%1\n", comm->signature()); |
88 | 56 | |
115
9be16e1c1e44
- reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents:
113
diff
changeset
|
57 | print ("------------------------------------------------------\n"); |
9be16e1c1e44
- reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents:
113
diff
changeset
|
58 | print ("End of command list\n"); |
88 | 59 | exit (0); |
60 | } | |
61 | ||
62 | // Print header | |
63 | String header; | |
64 | String headerline; | |
115
9be16e1c1e44
- reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents:
113
diff
changeset
|
65 | header = format (APPNAME " version %1", versionString (true)); |
88 | 66 | |
67 | #ifdef DEBUG | |
68 | header += " (debug build)"; | |
69 | #endif | |
70 | ||
115
9be16e1c1e44
- reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents:
113
diff
changeset
|
71 | for (int i = 0; i < header.length() / 2; ++i) |
88 | 72 | headerline += "-="; |
73 | ||
74 | headerline += '-'; | |
115
9be16e1c1e44
- reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents:
113
diff
changeset
|
75 | print ("%2\n\n%1\n\n%2\n\n", header, headerline); |
88 | 76 | |
77 | if (argc < 2) | |
78 | { | |
79 | fprintf (stderr, "usage: %s <infile> [outfile] # compiles botscript\n", argv[0]); | |
80 | fprintf (stderr, " %s -l # lists commands\n", argv[0]); | |
81 | exit (1); | |
82 | } | |
83 | ||
84 | String outfile; | |
85 | ||
86 | if (argc < 3) | |
115
9be16e1c1e44
- reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents:
113
diff
changeset
|
87 | outfile = makeObjectFileName (argv[1]); |
88 | 88 | else |
89 | outfile = argv[2]; | |
90 | ||
91 | // Prepare reader and writer | |
92 | BotscriptParser* parser = new BotscriptParser; | |
93 | ||
94 | // We're set, begin parsing :) | |
115
9be16e1c1e44
- reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents:
113
diff
changeset
|
95 | print ("Parsing script...\n"); |
9be16e1c1e44
- reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents:
113
diff
changeset
|
96 | parser->parseBotscript (argv[1]); |
9be16e1c1e44
- reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents:
113
diff
changeset
|
97 | print ("Script parsed successfully.\n"); |
88 | 98 | |
99 | // Parse done, print statistics and write to file | |
115
9be16e1c1e44
- reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents:
113
diff
changeset
|
100 | int globalcount = parser->getHighestVarIndex (true) + 1; |
9be16e1c1e44
- reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents:
113
diff
changeset
|
101 | int statelocalcount = parser->getHighestVarIndex (false) + 1; |
9be16e1c1e44
- reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents:
113
diff
changeset
|
102 | int stringcount = countStringsInTable(); |
9be16e1c1e44
- reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents:
113
diff
changeset
|
103 | print ("%1 / %2 strings\n", stringcount, gMaxStringlistSize); |
9be16e1c1e44
- reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents:
113
diff
changeset
|
104 | print ("%1 / %2 global variable indices\n", globalcount, gMaxGlobalVars); |
9be16e1c1e44
- reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents:
113
diff
changeset
|
105 | print ("%1 / %2 state variable indices\n", statelocalcount, gMaxGlobalVars); |
9be16e1c1e44
- reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents:
113
diff
changeset
|
106 | print ("%1 / %2 events\n", parser->numEvents(), gMaxEvents); |
9be16e1c1e44
- reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents:
113
diff
changeset
|
107 | print ("%1 state%s1\n", parser->numStates()); |
88 | 108 | |
115
9be16e1c1e44
- reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents:
113
diff
changeset
|
109 | parser->writeToFile (outfile); |
88 | 110 | delete parser; |
105
6dbac3305614
- highly reworked variable support, variable declarations now are declared with 'var', uses are prefixed with '$', merged constant handling into variables
Teemu Piippo <crimsondusk64@gmail.com>
parents:
88
diff
changeset
|
111 | return 0; |
88 | 112 | } |
106
9174be9ac686
- improved error handling a tad
Teemu Piippo <crimsondusk64@gmail.com>
parents:
105
diff
changeset
|
113 | catch (std::exception& e) |
88 | 114 | { |
113
4d4c43eca4d7
- now uses a variadic template formatter instead of a macro
Teemu Piippo <crimsondusk64@gmail.com>
parents:
112
diff
changeset
|
115 | fprintf (stderr, "error: %s\n", e.what()); |
105
6dbac3305614
- highly reworked variable support, variable declarations now are declared with 'var', uses are prefixed with '$', merged constant handling into variables
Teemu Piippo <crimsondusk64@gmail.com>
parents:
88
diff
changeset
|
116 | return 1; |
88 | 117 | } |
118 | } | |
119 | ||
120 | // ============================================================================ | |
121 | // | |
122 | // Mutates given filename to an object filename | |
123 | // | |
115
9be16e1c1e44
- reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents:
113
diff
changeset
|
124 | String makeObjectFileName (String s) |
88 | 125 | { |
126 | // Locate the extension and chop it out | |
115
9be16e1c1e44
- reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents:
113
diff
changeset
|
127 | int extdot = s.lastIndexOf ("."); |
88 | 128 | |
115
9be16e1c1e44
- reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents:
113
diff
changeset
|
129 | if (extdot >= s.length() - 4) |
9be16e1c1e44
- reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents:
113
diff
changeset
|
130 | s -= (s.length() - extdot); |
88 | 131 | |
132 | s += ".o"; | |
133 | return s; | |
134 | } | |
135 | ||
136 | // ============================================================================ | |
137 | // | |
115
9be16e1c1e44
- reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents:
113
diff
changeset
|
138 | DataType getTypeByName (String token) |
88 | 139 | { |
115
9be16e1c1e44
- reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents:
113
diff
changeset
|
140 | token = token.toLowercase(); |
9be16e1c1e44
- reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents:
113
diff
changeset
|
141 | return (token == "int") ? TYPE_Int : |
9be16e1c1e44
- reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents:
113
diff
changeset
|
142 | (token == "str") ? TYPE_String : |
9be16e1c1e44
- reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents:
113
diff
changeset
|
143 | (token == "void") ? TYPE_Void : |
9be16e1c1e44
- reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents:
113
diff
changeset
|
144 | (token == "bool") ? TYPE_Bool : |
108
6409ece8297c
- refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
106
diff
changeset
|
145 | TYPE_Unknown; |
88 | 146 | } |
147 | ||
148 | ||
149 | // ============================================================================ | |
150 | // | |
151 | // Inverse operation - type name by value | |
152 | // | |
115
9be16e1c1e44
- reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents:
113
diff
changeset
|
153 | String dataTypeName (DataType type) |
88 | 154 | { |
155 | switch (type) | |
156 | { | |
108
6409ece8297c
- refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
106
diff
changeset
|
157 | case TYPE_Int: return "int"; break; |
6409ece8297c
- refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
106
diff
changeset
|
158 | case TYPE_String: return "str"; break; |
6409ece8297c
- refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
106
diff
changeset
|
159 | case TYPE_Void: return "void"; break; |
6409ece8297c
- refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
106
diff
changeset
|
160 | case TYPE_Bool: return "bool"; break; |
6409ece8297c
- refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
106
diff
changeset
|
161 | case TYPE_Unknown: return "???"; break; |
88 | 162 | } |
163 | ||
164 | return ""; | |
165 | } | |
166 | ||
167 | // ============================================================================= | |
168 | // | |
115
9be16e1c1e44
- reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents:
113
diff
changeset
|
169 | String makeVersionString (int major, int minor, int patch) |
88 | 170 | { |
115
9be16e1c1e44
- reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents:
113
diff
changeset
|
171 | String ver = format ("%1.%2", major, minor); |
88 | 172 | |
173 | if (patch != 0) | |
174 | { | |
175 | ver += "."; | |
176 | ver += patch; | |
177 | } | |
178 | ||
179 | return ver; | |
180 | } | |
181 | ||
182 | // ============================================================================= | |
183 | // | |
115
9be16e1c1e44
- reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents:
113
diff
changeset
|
184 | String versionString (bool longform) |
88 | 185 | { |
186 | String tag (GIT_DESCRIPTION); | |
187 | String version = tag; | |
188 | ||
115
9be16e1c1e44
- reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents:
113
diff
changeset
|
189 | if (longform && tag.endsWith ("-pre")) |
9be16e1c1e44
- reformatting... again
Teemu Piippo <crimsondusk64@gmail.com>
parents:
113
diff
changeset
|
190 | version += "-" + String (GIT_HASH).mid (0, 8); |
88 | 191 | |
192 | return version; | |
108
6409ece8297c
- refactored enums, macros split from Main.h to Macros.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
106
diff
changeset
|
193 | } |