2 //**************************************************************************
\r
6 //**************************************************************************
\r
8 // HEADER FILES ------------------------------------------------------------
\r
21 #include "strlist.h"
\r
23 // MACROS ------------------------------------------------------------------
\r
25 #define VERSION_TEXT "1.54"
\r
26 #define COPYRIGHT_YEARS_TEXT "1995"
\r
28 // TYPES -------------------------------------------------------------------
\r
30 // EXTERNAL FUNCTION PROTOTYPES --------------------------------------------
\r
32 // PUBLIC FUNCTION PROTOTYPES ----------------------------------------------
\r
34 // PRIVATE FUNCTION PROTOTYPES ---------------------------------------------
\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
42 // EXTERNAL DATA DECLARATIONS ----------------------------------------------
\r
44 // PUBLIC DATA DEFINITIONS -------------------------------------------------
\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
52 // PRIVATE DATA DEFINITIONS ------------------------------------------------
\r
54 static int ArgCount;
\r
55 static char **ArgVector;
\r
56 static char ObjectFileName[MAX_FILE_NAME_LENGTH];
\r
58 // CODE --------------------------------------------------------------------
\r
60 //==========================================================================
\r
64 //==========================================================================
\r
66 int main(int argc, char **argv)
\r
74 TK_OpenSource(acs_SourceFileName);
\r
75 PC_OpenObject(ObjectFileName, DEFAULT_OBJECT_SIZE, 0);
\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
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
88 if (pa_TypedScriptCounts[i].TypeCount > 0)
\r
90 MS_Message(MSG_NORMAL, "%5d %s\n",
\r
91 pa_TypedScriptCounts[i].TypeCount,
\r
92 pa_TypedScriptCounts[i].TypeName);
\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
106 MS_Message(MSG_NORMAL, " object \"%s\": %d bytes\n",
\r
107 ObjectFileName, pc_Address);
\r
108 ERR_RemoveErrorFile();
\r
112 //==========================================================================
\r
116 //==========================================================================
\r
118 static void DisplayBanner(void)
\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
133 //==========================================================================
\r
137 //==========================================================================
\r
139 static void Init(void)
\r
141 short endianTest = 1;
\r
143 if (*(char *)&endianTest)
\r
144 acs_BigEndianHost = NO;
\r
146 acs_BigEndianHost = YES;
\r
147 acs_VerboseMode = YES;
\r
148 acs_DebugMode = NO;
\r
149 acs_DebugFile = NULL;
\r
154 MS_Message(MSG_NORMAL, "Host byte order: %s endian\n",
\r
155 acs_BigEndianHost ? "BIG" : "LITTLE");
\r
158 //==========================================================================
\r
163 // Allowing space after options (option parameter as the next argument)
\r
165 //==========================================================================
\r
167 static void ProcessArgs(void)
\r
174 while(i < ArgCount)
\r
176 text = ArgVector[i];
\r
186 option = toupper(*text++);
\r
190 if((i + 1) < ArgCount)
\r
192 TK_AddIncludePath(ArgVector[++i]);
\r
197 acs_DebugMode = YES;
\r
198 acs_VerboseMode = YES;
\r
201 OpenDebugFile(text);
\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
219 // Input/output file
\r
224 strcpy(acs_SourceFileName, text);
\r
225 MS_SuggestFileExt(acs_SourceFileName, ".acs");
\r
229 strcpy(ObjectFileName, text);
\r
230 MS_SuggestFileExt(ObjectFileName, ".o");
\r
248 TK_AddIncludePath(".");
\r
250 TK_AddIncludePath("/usr/local/share/acc/");
\r
252 TK_AddProgramIncludePath(ArgVector[0]);
\r
256 strcpy(ObjectFileName, acs_SourceFileName);
\r
257 MS_StripFileExt(ObjectFileName);
\r
258 MS_SuggestFileExt(ObjectFileName, ".o");
\r
262 //==========================================================================
\r
266 //==========================================================================
\r
268 static void DisplayUsage(void)
\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
278 //==========================================================================
\r
282 //==========================================================================
\r
284 static void OpenDebugFile(char *name)
\r
286 if((acs_DebugFile = fopen(name, "w")) == NULL)
\r
288 ERR_Exit(ERR_CANT_OPEN_DBGFILE, NO, "File: \"%s\".", name);
\r
292 //==========================================================================
\r
296 //==========================================================================
\r
299 static boolean OptionExists(char *name)
\r
304 for(i = 1; i < ArgCount; i++)
\r
306 arg = ArgVector[i];
\r
310 if(MS_StrCmp(name, arg) == 0)
\r