OSDN Git Service

ACC Line_SetTextureScale
[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.47"\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                                         break;\r
209                                         \r
210                                 default:\r
211                                         DisplayUsage();\r
212                                         break;\r
213                         }\r
214                 }\r
215                 else\r
216                 {\r
217                         // Input/output file\r
218                         count++;\r
219                         switch(count)\r
220                         {\r
221                                 case 1:\r
222                                         strcpy(acs_SourceFileName, text);\r
223                                         MS_SuggestFileExt(acs_SourceFileName, ".acs");\r
224                                         break;\r
225                                         \r
226                                 case 2:\r
227                                         strcpy(ObjectFileName, text);\r
228                                         MS_SuggestFileExt(ObjectFileName, ".o");\r
229                                         break;\r
230                                         \r
231                                 default:\r
232                                         DisplayUsage();\r
233                                         break;\r
234                         }\r
235                 }\r
236                 \r
237                 // Next arg\r
238                 i++;\r
239         }\r
240         \r
241         if(count == 0)\r
242         {\r
243                 DisplayUsage();\r
244         }\r
245 \r
246         TK_AddProgramIncludePath(ArgVector[0]);\r
247         \r
248         if(count == 1)\r
249         {\r
250                 strcpy(ObjectFileName, acs_SourceFileName);\r
251                 MS_StripFileExt(ObjectFileName);\r
252                 MS_SuggestFileExt(ObjectFileName, ".o");\r
253         }\r
254 }\r
255 \r
256 //==========================================================================\r
257 //\r
258 // DisplayUsage\r
259 //\r
260 //==========================================================================\r
261 \r
262 static void DisplayUsage(void)\r
263 {\r
264         puts("\nUsage: ACC [options] source[.acs] [object[.o]]\n");\r
265         puts("-i [path]  Add include path to find include files");\r
266         puts("-d[file]   Output debugging information");\r
267         puts("-h         Create pcode compatible with Hexen and old ZDooms");\r
268         exit(1);\r
269 }\r
270 \r
271 //==========================================================================\r
272 //\r
273 // OpenDebugFile\r
274 //\r
275 //==========================================================================\r
276 \r
277 static void OpenDebugFile(char *name)\r
278 {\r
279         if((acs_DebugFile = fopen(name, "w")) == NULL)\r
280         {\r
281                 ERR_Exit(ERR_CANT_OPEN_DBGFILE, NO, "File: \"%s\".", name);\r
282         }\r
283 }\r
284 \r
285 //==========================================================================\r
286 //\r
287 // OptionExists\r
288 //\r
289 //==========================================================================\r
290 \r
291 /*\r
292 static boolean OptionExists(char *name)\r
293 {\r
294         int i;\r
295         char *arg;\r
296 \r
297         for(i = 1; i < ArgCount; i++)\r
298         {\r
299                 arg = ArgVector[i];\r
300                 if(*arg == '-')\r
301                 {\r
302                         arg++;\r
303                         if(MS_StrCmp(name, arg) == 0)\r
304                         {\r
305                                 return YES;\r
306                         }\r
307                 }\r
308         }\r
309         return NO;\r
310 }\r
311 */\r