mirror of
https://github.com/ZDoom/acc.git
synced 2024-11-15 08:51:53 +00:00
0dcf40afe6
- Silenced some conversion warnings made by VC++ 6. - Added the current working directory (.) as an automatic include directory, just ahead of the program directory, for compatibility with older ACCs that had no include path handling. SVN r2016 (trunk)
312 lines
7.6 KiB
C
312 lines
7.6 KiB
C
|
|
//**************************************************************************
|
|
//**
|
|
//** acc.c
|
|
//**
|
|
//**************************************************************************
|
|
|
|
// HEADER FILES ------------------------------------------------------------
|
|
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
#include <ctype.h>
|
|
#include "common.h"
|
|
#include "token.h"
|
|
#include "error.h"
|
|
#include "symbol.h"
|
|
#include "misc.h"
|
|
#include "pcode.h"
|
|
#include "parse.h"
|
|
#include "strlist.h"
|
|
|
|
// MACROS ------------------------------------------------------------------
|
|
|
|
#define VERSION_TEXT "1.48"
|
|
#define COPYRIGHT_YEARS_TEXT "1995"
|
|
|
|
// TYPES -------------------------------------------------------------------
|
|
|
|
// EXTERNAL FUNCTION PROTOTYPES --------------------------------------------
|
|
|
|
// PUBLIC FUNCTION PROTOTYPES ----------------------------------------------
|
|
|
|
// PRIVATE FUNCTION PROTOTYPES ---------------------------------------------
|
|
|
|
static void Init(void);
|
|
static void DisplayBanner(void);
|
|
static void DisplayUsage(void);
|
|
static void OpenDebugFile(char *name);
|
|
static void ProcessArgs(void);
|
|
|
|
// EXTERNAL DATA DECLARATIONS ----------------------------------------------
|
|
|
|
// PUBLIC DATA DEFINITIONS -------------------------------------------------
|
|
|
|
boolean acs_BigEndianHost;
|
|
boolean acs_VerboseMode;
|
|
boolean acs_DebugMode;
|
|
FILE *acs_DebugFile;
|
|
char acs_SourceFileName[MAX_FILE_NAME_LENGTH];
|
|
|
|
// PRIVATE DATA DEFINITIONS ------------------------------------------------
|
|
|
|
static int ArgCount;
|
|
static char **ArgVector;
|
|
static char ObjectFileName[MAX_FILE_NAME_LENGTH];
|
|
|
|
// CODE --------------------------------------------------------------------
|
|
|
|
//==========================================================================
|
|
//
|
|
// main
|
|
//
|
|
//==========================================================================
|
|
|
|
int main(int argc, char **argv)
|
|
{
|
|
int i;
|
|
|
|
ArgCount = argc;
|
|
ArgVector = argv;
|
|
DisplayBanner();
|
|
Init();
|
|
TK_OpenSource(acs_SourceFileName);
|
|
PC_OpenObject(ObjectFileName, DEFAULT_OBJECT_SIZE, 0);
|
|
PA_Parse();
|
|
PC_CloseObject();
|
|
TK_CloseSource();
|
|
|
|
MS_Message(MSG_NORMAL, "\n\"%s\":\n %d line%s (%d included)\n",
|
|
acs_SourceFileName, tk_Line, tk_Line == 1 ? "" : "s",
|
|
tk_IncludedLines);
|
|
MS_Message(MSG_NORMAL, " %d function%s\n %d script%s\n",
|
|
pc_FunctionCount, pc_FunctionCount == 1 ? "" : "s",
|
|
pa_ScriptCount, pa_ScriptCount == 1 ? "" : "s");
|
|
for (i = 0; pa_TypedScriptCounts[i].TypeName; i++)
|
|
{
|
|
if (pa_TypedScriptCounts[i].TypeCount > 0)
|
|
{
|
|
MS_Message(MSG_NORMAL, "%5d %s\n",
|
|
pa_TypedScriptCounts[i].TypeCount,
|
|
pa_TypedScriptCounts[i].TypeName);
|
|
}
|
|
}
|
|
MS_Message(MSG_NORMAL, " %d global variable%s\n"
|
|
" %d world variable%s\n"
|
|
" %d map variable%s\n"
|
|
" %d global array%s\n"
|
|
" %d world array%s\n",
|
|
pa_GlobalVarCount, pa_GlobalVarCount == 1 ? "" : "s",
|
|
pa_WorldVarCount, pa_WorldVarCount == 1 ? "" : "s",
|
|
pa_MapVarCount, pa_MapVarCount == 1 ? "" : "s",
|
|
pa_GlobalArrayCount, pa_GlobalArrayCount == 1 ? "" : "s",
|
|
pa_WorldArrayCount, pa_WorldArrayCount == 1 ? "" : "s"
|
|
);
|
|
MS_Message(MSG_NORMAL, " object \"%s\": %d bytes\n",
|
|
ObjectFileName, pc_Address);
|
|
ERR_RemoveErrorFile();
|
|
return 0;
|
|
}
|
|
|
|
//==========================================================================
|
|
//
|
|
// DisplayBanner
|
|
//
|
|
//==========================================================================
|
|
|
|
static void DisplayBanner(void)
|
|
{
|
|
fprintf(stderr, "\nOriginal ACC Version 1.10 by Ben Gokey\n");
|
|
fprintf(stderr, "Copyright (c) "COPYRIGHT_YEARS_TEXT
|
|
" Raven Software, Corp.\n\n");
|
|
fprintf(stderr, "This is version "VERSION_TEXT" ("__DATE__")\n");
|
|
fprintf(stderr, "This software is not supported by Raven Software or Activision\n");
|
|
fprintf(stderr, "ZDoom changes and language extensions by Randy Heit\n");
|
|
fprintf(stderr, "Further changes by Brad Carney\n");
|
|
fprintf(stderr, "Even more changes by James Bentler\n");
|
|
fprintf(stderr, "Some additions by Michael \"Necromage\" Weber\n");
|
|
fprintf(stderr, "Error reporting improvements and limit expansion by Ty Halderman\n");
|
|
fprintf(stderr, "Include paths added by Pascal vd Heiden\n");
|
|
}
|
|
|
|
//==========================================================================
|
|
//
|
|
// Init
|
|
//
|
|
//==========================================================================
|
|
|
|
static void Init(void)
|
|
{
|
|
short endianTest = 1;
|
|
|
|
if (*(char *)&endianTest)
|
|
acs_BigEndianHost = NO;
|
|
else
|
|
acs_BigEndianHost = YES;
|
|
acs_VerboseMode = YES;
|
|
acs_DebugMode = NO;
|
|
acs_DebugFile = NULL;
|
|
TK_Init();
|
|
SY_Init();
|
|
STR_Init();
|
|
ProcessArgs();
|
|
MS_Message(MSG_NORMAL, "Host byte order: %s endian\n",
|
|
acs_BigEndianHost ? "BIG" : "LITTLE");
|
|
}
|
|
|
|
//==========================================================================
|
|
//
|
|
// ProcessArgs
|
|
//
|
|
// Pascal 12/11/08
|
|
// Allowing space after options (option parameter as the next argument)
|
|
//
|
|
//==========================================================================
|
|
|
|
static void ProcessArgs(void)
|
|
{
|
|
int i = 1;
|
|
int count = 0;
|
|
char *text;
|
|
char option;
|
|
|
|
while(i < ArgCount)
|
|
{
|
|
text = ArgVector[i];
|
|
|
|
if(*text == '-')
|
|
{
|
|
// Option
|
|
text++;
|
|
if(*text == 0)
|
|
{
|
|
DisplayUsage();
|
|
}
|
|
option = toupper(*text++);
|
|
switch(option)
|
|
{
|
|
case 'I':
|
|
if((i + 1) < ArgCount)
|
|
{
|
|
TK_AddIncludePath(ArgVector[++i]);
|
|
}
|
|
break;
|
|
|
|
case 'D':
|
|
acs_DebugMode = YES;
|
|
acs_VerboseMode = YES;
|
|
if(*text != 0)
|
|
{
|
|
OpenDebugFile(text);
|
|
}
|
|
break;
|
|
|
|
case 'H':
|
|
pc_NoShrink = TRUE;
|
|
pc_HexenCase = TRUE;
|
|
break;
|
|
|
|
default:
|
|
DisplayUsage();
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Input/output file
|
|
count++;
|
|
switch(count)
|
|
{
|
|
case 1:
|
|
strcpy(acs_SourceFileName, text);
|
|
MS_SuggestFileExt(acs_SourceFileName, ".acs");
|
|
break;
|
|
|
|
case 2:
|
|
strcpy(ObjectFileName, text);
|
|
MS_SuggestFileExt(ObjectFileName, ".o");
|
|
break;
|
|
|
|
default:
|
|
DisplayUsage();
|
|
break;
|
|
}
|
|
}
|
|
|
|
// Next arg
|
|
i++;
|
|
}
|
|
|
|
if(count == 0)
|
|
{
|
|
DisplayUsage();
|
|
}
|
|
|
|
TK_AddIncludePath(".");
|
|
TK_AddProgramIncludePath(ArgVector[0]);
|
|
|
|
if(count == 1)
|
|
{
|
|
strcpy(ObjectFileName, acs_SourceFileName);
|
|
MS_StripFileExt(ObjectFileName);
|
|
MS_SuggestFileExt(ObjectFileName, ".o");
|
|
}
|
|
}
|
|
|
|
//==========================================================================
|
|
//
|
|
// DisplayUsage
|
|
//
|
|
//==========================================================================
|
|
|
|
static void DisplayUsage(void)
|
|
{
|
|
puts("\nUsage: ACC [options] source[.acs] [object[.o]]\n");
|
|
puts("-i [path] Add include path to find include files");
|
|
puts("-d[file] Output debugging information");
|
|
puts("-h Create pcode compatible with Hexen and old ZDooms");
|
|
exit(1);
|
|
}
|
|
|
|
//==========================================================================
|
|
//
|
|
// OpenDebugFile
|
|
//
|
|
//==========================================================================
|
|
|
|
static void OpenDebugFile(char *name)
|
|
{
|
|
if((acs_DebugFile = fopen(name, "w")) == NULL)
|
|
{
|
|
ERR_Exit(ERR_CANT_OPEN_DBGFILE, NO, "File: \"%s\".", name);
|
|
}
|
|
}
|
|
|
|
//==========================================================================
|
|
//
|
|
// OptionExists
|
|
//
|
|
//==========================================================================
|
|
|
|
/*
|
|
static boolean OptionExists(char *name)
|
|
{
|
|
int i;
|
|
char *arg;
|
|
|
|
for(i = 1; i < ArgCount; i++)
|
|
{
|
|
arg = ArgVector[i];
|
|
if(*arg == '-')
|
|
{
|
|
arg++;
|
|
if(MS_StrCmp(name, arg) == 0)
|
|
{
|
|
return YES;
|
|
}
|
|
}
|
|
}
|
|
return NO;
|
|
}
|
|
*/
|