OSDN Git Service

added SetActivatorToPlayer to zspecial.acs
[zandronum/zandronum-acc.git] / acc.c
1 \r
2 //**************************************************************************\r
3 //**\r
4 //** acc.c\r
5 //**\r
6 //**************************************************************************\r
7 \r
8 // HEADER FILES ------------------------------------------------------------\r
9 \r
10 #include <stdio.h>\r
11 #include <string.h>\r
12 #include <stdlib.h>\r
13 #include <ctype.h>\r
14 #include "common.h"\r
15 #include "token.h"\r
16 #include "error.h"\r
17 #include "symbol.h"\r
18 #include "misc.h"\r
19 #include "pcode.h"\r
20 #include "parse.h"\r
21 #include "strlist.h"\r
22 \r
23 // MACROS ------------------------------------------------------------------\r
24 \r
25 #define VERSION_TEXT "1.54"\r
26 #define COPYRIGHT_YEARS_TEXT "1995"\r
27 \r
28 // TYPES -------------------------------------------------------------------\r
29 \r
30 // EXTERNAL FUNCTION PROTOTYPES --------------------------------------------\r
31 \r
32 // PUBLIC FUNCTION PROTOTYPES ----------------------------------------------\r
33 \r
34 // PRIVATE FUNCTION PROTOTYPES ---------------------------------------------\r
35 \r
36 static void Init(void);\r
37 static void DisplayBanner(void);\r
38 static void DisplayUsage(void);\r
39 static void OpenDebugFile(char *name);\r
40 static void ProcessArgs(void);\r
41 \r
42 // EXTERNAL DATA DECLARATIONS ----------------------------------------------\r
43 \r
44 // PUBLIC DATA DEFINITIONS -------------------------------------------------\r
45 \r
46 boolean acs_BigEndianHost;\r
47 boolean acs_VerboseMode;\r
48 boolean acs_DebugMode;\r
49 FILE *acs_DebugFile;\r
50 char acs_SourceFileName[MAX_FILE_NAME_LENGTH];\r
51 \r
52 // PRIVATE DATA DEFINITIONS ------------------------------------------------\r
53 \r
54 static int ArgCount;\r
55 static char **ArgVector;\r
56 static char ObjectFileName[MAX_FILE_NAME_LENGTH];\r
57 \r
58 // CODE --------------------------------------------------------------------\r
59 \r
60 //==========================================================================\r
61 //\r
62 // main\r
63 //\r
64 //==========================================================================\r
65 \r
66 int main(int argc, char **argv)\r
67 {\r
68         int i;\r
69 \r
70         ArgCount = argc;\r
71         ArgVector = argv;\r
72         DisplayBanner();\r
73         Init();\r
74         TK_OpenSource(acs_SourceFileName);\r
75         PC_OpenObject(ObjectFileName, DEFAULT_OBJECT_SIZE, 0);\r
76         PA_Parse();\r
77         PC_CloseObject();\r
78         TK_CloseSource();\r
79 \r
80         MS_Message(MSG_NORMAL, "\n\"%s\":\n  %d line%s (%d included)\n",\r
81                 acs_SourceFileName, tk_Line, tk_Line == 1 ? "" : "s",\r
82                 tk_IncludedLines);\r
83         MS_Message(MSG_NORMAL, "  %d function%s\n  %d script%s\n",\r
84                 pc_FunctionCount, pc_FunctionCount == 1 ? "" : "s",\r
85                 pa_ScriptCount, pa_ScriptCount == 1 ? "" : "s");\r
86         for (i = 0; pa_TypedScriptCounts[i].TypeName; i++)\r
87         {\r
88                 if (pa_TypedScriptCounts[i].TypeCount > 0)\r
89                 {\r
90                         MS_Message(MSG_NORMAL, "%5d %s\n",\r
91                                 pa_TypedScriptCounts[i].TypeCount,\r
92                                 pa_TypedScriptCounts[i].TypeName);\r
93                 }\r
94         }\r
95         MS_Message(MSG_NORMAL, "  %d global variable%s\n"\r
96                                                    "  %d world variable%s\n"\r
97                                                    "  %d map variable%s\n"\r
98                                                    "  %d global array%s\n"\r
99                                                    "  %d world array%s\n",\r
100                 pa_GlobalVarCount, pa_GlobalVarCount == 1 ? "" : "s",\r
101                 pa_WorldVarCount, pa_WorldVarCount == 1 ? "" : "s",\r
102                 pa_MapVarCount, pa_MapVarCount == 1 ? "" : "s",\r
103                 pa_GlobalArrayCount, pa_GlobalArrayCount == 1 ? "" : "s",\r
104                 pa_WorldArrayCount, pa_WorldArrayCount == 1 ? "" : "s"\r
105                 );\r
106         MS_Message(MSG_NORMAL, "  object \"%s\": %d bytes\n",\r
107                 ObjectFileName, pc_Address);\r
108         ERR_RemoveErrorFile();\r
109         return 0;\r
110 }\r
111 \r
112 //==========================================================================\r
113 //\r
114 // DisplayBanner\r
115 //\r
116 //==========================================================================\r
117 \r
118 static void DisplayBanner(void)\r
119 {\r
120         fprintf(stderr, "\nOriginal ACC Version 1.10 by Ben Gokey\n");\r
121         fprintf(stderr, "Copyright (c) "COPYRIGHT_YEARS_TEXT\r
122                 " Raven Software, Corp.\n\n");\r
123         fprintf(stderr, "This is version "VERSION_TEXT" ("__DATE__")\n");\r
124         fprintf(stderr, "This software is not supported by Raven Software or Activision\n");\r
125         fprintf(stderr, "ZDoom changes and language extensions by Randy Heit\n");\r
126         fprintf(stderr, "Further changes by Brad Carney\n");\r
127         fprintf(stderr, "Even more changes by James Bentler\n");\r
128         fprintf(stderr, "Some additions by Michael \"Necromage\" Weber\n");\r
129         fprintf(stderr, "Error reporting improvements and limit expansion by Ty Halderman\n");\r
130         fprintf(stderr, "Include paths added by Pascal vd Heiden\n");\r
131 }\r
132 \r
133 //==========================================================================\r
134 //\r
135 // Init\r
136 //\r
137 //==========================================================================\r
138 \r
139 static void Init(void)\r
140 {\r
141         short endianTest = 1;\r
142 \r
143         if (*(char *)&endianTest)\r
144                 acs_BigEndianHost = NO;\r
145         else\r
146                 acs_BigEndianHost = YES;\r
147         acs_VerboseMode = YES;\r
148         acs_DebugMode = NO;\r
149         acs_DebugFile = NULL;\r
150         TK_Init();\r
151         SY_Init();\r
152         STR_Init();\r
153         ProcessArgs();\r
154         MS_Message(MSG_NORMAL, "Host byte order: %s endian\n",\r
155                 acs_BigEndianHost ? "BIG" : "LITTLE");\r
156 }\r
157 \r
158 //==========================================================================\r
159 //\r
160 // ProcessArgs\r
161 //\r
162 // Pascal 12/11/08\r
163 // Allowing space after options (option parameter as the next argument)\r
164 //\r
165 //==========================================================================\r
166 \r
167 static void ProcessArgs(void)\r
168 {\r
169         int i = 1;\r
170         int count = 0;\r
171         char *text;\r
172         char option;\r
173         \r
174         while(i < ArgCount)\r
175         {\r
176                 text = ArgVector[i];\r
177                 \r
178                 if(*text == '-')\r
179                 {\r
180                         // Option\r
181                         text++;\r
182                         if(*text == 0)\r
183                         {\r
184                                 DisplayUsage();\r
185                         }\r
186                         option = toupper(*text++);\r
187                         switch(option)\r
188                         {\r
189                                 case 'I':\r
190                                         if((i + 1) < ArgCount)\r
191                                         {\r
192                                                 TK_AddIncludePath(ArgVector[++i]);\r
193                                         }\r
194                                         break;\r
195                                         \r
196                                 case 'D':\r
197                                         acs_DebugMode = YES;\r
198                                         acs_VerboseMode = YES;\r
199                                         if(*text != 0)\r
200                                         {\r
201                                                 OpenDebugFile(text);\r
202                                         }\r
203                                         break;\r
204                                         \r
205                                 case 'H':\r
206                                         pc_NoShrink = TRUE;\r
207                                         pc_HexenCase = TRUE;\r
208                                         pc_EnforceHexen = toupper(*text) != 'H';\r
209                                         pc_WarnNotHexen = toupper(*text) == 'H';\r
210                                         break;\r
211                                         \r
212                                 default:\r
213                                         DisplayUsage();\r
214                                         break;\r
215                         }\r
216                 }\r
217                 else\r
218                 {\r
219                         // Input/output file\r
220                         count++;\r
221                         switch(count)\r
222                         {\r
223                                 case 1:\r
224                                         strcpy(acs_SourceFileName, text);\r
225                                         MS_SuggestFileExt(acs_SourceFileName, ".acs");\r
226                                         break;\r
227                                         \r
228                                 case 2:\r
229                                         strcpy(ObjectFileName, text);\r
230                                         MS_SuggestFileExt(ObjectFileName, ".o");\r
231                                         break;\r
232                                         \r
233                                 default:\r
234                                         DisplayUsage();\r
235                                         break;\r
236                         }\r
237                 }\r
238                 \r
239                 // Next arg\r
240                 i++;\r
241         }\r
242         \r
243         if(count == 0)\r
244         {\r
245                 DisplayUsage();\r
246         }\r
247 \r
248         TK_AddIncludePath(".");\r
249 #ifdef unix\r
250         TK_AddIncludePath("/usr/local/share/acc/");\r
251 #endif\r
252         TK_AddProgramIncludePath(ArgVector[0]);\r
253         \r
254         if(count == 1)\r
255         {\r
256                 strcpy(ObjectFileName, acs_SourceFileName);\r
257                 MS_StripFileExt(ObjectFileName);\r
258                 MS_SuggestFileExt(ObjectFileName, ".o");\r
259         }\r
260 }\r
261 \r
262 //==========================================================================\r
263 //\r
264 // DisplayUsage\r
265 //\r
266 //==========================================================================\r
267 \r
268 static void DisplayUsage(void)\r
269 {\r
270         puts("\nUsage: ACC [options] source[.acs] [object[.o]]\n");\r
271         puts("-i [path]  Add include path to find include files");\r
272         puts("-d[file]   Output debugging information");\r
273         puts("-h         Create pcode compatible with Hexen and old ZDooms");\r
274         puts("-hh        Like -h, but use of new features is only a warning");\r
275         exit(1);\r
276 }\r
277 \r
278 //==========================================================================\r
279 //\r
280 // OpenDebugFile\r
281 //\r
282 //==========================================================================\r
283 \r
284 static void OpenDebugFile(char *name)\r
285 {\r
286         if((acs_DebugFile = fopen(name, "w")) == NULL)\r
287         {\r
288                 ERR_Exit(ERR_CANT_OPEN_DBGFILE, NO, "File: \"%s\".", name);\r
289         }\r
290 }\r
291 \r
292 //==========================================================================\r
293 //\r
294 // OptionExists\r
295 //\r
296 //==========================================================================\r
297 \r
298 /*\r
299 static boolean OptionExists(char *name)\r
300 {\r
301         int i;\r
302         char *arg;\r
303 \r
304         for(i = 1; i < ArgCount; i++)\r
305         {\r
306                 arg = ArgVector[i];\r
307                 if(*arg == '-')\r
308                 {\r
309                         arg++;\r
310                         if(MS_StrCmp(name, arg) == 0)\r
311                         {\r
312                                 return YES;\r
313                         }\r
314                 }\r
315         }\r
316         return NO;\r
317 }\r
318 */\r