X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fcl65%2Fmain.c;h=4268a569bcff7cdc984cf8424b9d6855017978b9;hb=2abd077dfd5388da6dd3faf434cad24b97cf4aa9;hp=de66ce9c163c6e5f0a263a44c4f2de44c5a25c0f;hpb=58a7fec4ba931e135d96ef221f4ee9c3d95b18ed;p=cc65 diff --git a/src/cl65/main.c b/src/cl65/main.c index de66ce9c1..4268a569b 100644 --- a/src/cl65/main.c +++ b/src/cl65/main.c @@ -1,48 +1,60 @@ /*****************************************************************************/ -/* */ -/* main.c */ -/* */ -/* Main module for the cl65 compile-and-link utility */ -/* */ -/* */ -/* */ -/* (C) 1999-2012, Ullrich von Bassewitz */ +/* */ +/* main.c */ +/* */ +/* Main module for the cl65 compile-and-link utility */ +/* */ +/* */ +/* */ +/* (C) 1999-2013, Ullrich von Bassewitz */ /* Roemerstrasse 52 */ /* D-70794 Filderstadt */ /* EMail: uz@cc65.org */ -/* */ -/* */ -/* This software is provided 'as-is', without any expressed or implied */ +/* */ +/* */ +/* This software is provided 'as-is', without any expressed or implied */ /* warranty. In no event will the authors be held liable for any damages */ -/* arising from the use of this software. */ -/* */ +/* arising from the use of this software. */ +/* */ /* Permission is granted to anyone to use this software for any purpose, */ /* including commercial applications, and to alter it and redistribute it */ -/* freely, subject to the following restrictions: */ -/* */ +/* freely, subject to the following restrictions: */ +/* */ /* 1. The origin of this software must not be misrepresented; you must not */ /* claim that you wrote the original software. If you use this software */ /* in a product, an acknowledgment in the product documentation would be */ -/* appreciated but is not required. */ +/* appreciated but is not required. */ /* 2. Altered source versions must be plainly marked as such, and must not */ -/* be misrepresented as being the original software. */ -/* 3. This notice may not be removed or altered from any source */ -/* distribution. */ -/* */ +/* be misrepresented as being the original software. */ +/* 3. This notice may not be removed or altered from any source */ +/* distribution. */ +/* */ /*****************************************************************************/ /* Check out if we have a spawn() function on the system, or if we must use - * our own. - */ -#if defined(__WATCOMC__) || defined(_MSC_VER) || defined(__MINGW32__) || defined(__DJGPP__) -# define HAVE_SPAWN 1 +** our own. +*/ +#if defined(_WIN32) +# define HAVE_SPAWN 1 #else -# define NEED_SPAWN 1 +# define NEED_SPAWN 1 #endif -#if defined(_MSC_VER) -# pragma warning(disable : 4996) + +/* GCC strictly follows http://c-faq.com/ansi/constmismatch.html and issues an +** 'incompatible pointer type' warning - that can't be suppressed via #pragma. +** The spawnvp() prototype of MinGW (http://www.mingw.org/) differs from the +** one of MinGW-w64 (http://mingw-w64.sourceforge.net/) regarding constness. +** So there's no alternative to actually distinguish these environments :-( +*/ +#define SPAWN_ARGV_CONST_CAST +#if defined(__MINGW32__) +# include <_mingw.h> +# if !defined(__MINGW64_VERSION_MAJOR) +# undef SPAWN_ARGV_CONST_CAST +# define SPAWN_ARGV_CONST_CAST (const char* const *) +# endif #endif @@ -51,7 +63,7 @@ #include #include #include -#ifdef HAVE_SPAWN +#if defined(HAVE_SPAWN) # include #endif @@ -73,7 +85,7 @@ /*****************************************************************************/ -/* Data */ +/* Data */ /*****************************************************************************/ @@ -81,15 +93,15 @@ /* Struct that describes a command */ typedef struct CmdDesc CmdDesc; struct CmdDesc { - char* Name; /* The command name */ + char* Name; /* The command name */ - unsigned ArgCount; /* Count of arguments */ - unsigned ArgMax; /* Maximum count of arguments */ - char** Args; /* The arguments */ + unsigned ArgCount; /* Count of arguments */ + unsigned ArgMax; /* Maximum count of arguments */ + char** Args; /* The arguments */ - unsigned FileCount; /* Count of files to translate */ - unsigned FileMax; /* Maximum count of files */ - char** Files; /* The files */ + unsigned FileCount; /* Count of files to translate */ + unsigned FileMax; /* Maximum count of files */ + char** Files; /* The files */ }; /* Command descriptors for the different programs */ @@ -110,8 +122,8 @@ static const char* OutputName = 0; static const char* LinkerConfig = 0; /* The name of the first input file. This will be used to construct the - * executable file name if no explicit name is given. - */ +** executable file name if no explicit name is given. +*/ static const char* FirstInput = 0; /* The names of the files for dependency generation */ @@ -125,7 +137,7 @@ static int Module = 0; #define MODULE_EXT ".o65" /* Name of the target specific runtime library */ -static char* TargetLib = 0; +static char* TargetLib = 0; @@ -136,7 +148,7 @@ static char* TargetLib = 0; #if defined(NEED_SPAWN) -# if defined(SPAWN_AMIGA) +# if defined(_AMIGA) # include "spawn-amiga.inc" # else # include "spawn-unix.inc" @@ -146,7 +158,7 @@ static char* TargetLib = 0; /*****************************************************************************/ -/* Command structure handling */ +/* Command structure handling */ /*****************************************************************************/ @@ -155,7 +167,7 @@ static void CmdExpand (CmdDesc* Cmd) /* Expand the argument vector */ { unsigned NewMax = Cmd->ArgMax + 10; - char** NewArgs = xmalloc (NewMax * sizeof (char*)); + char** NewArgs = xmalloc (NewMax * sizeof (char*)); memcpy (NewArgs, Cmd->Args, Cmd->ArgMax * sizeof (char*)); xfree (Cmd->Args); Cmd->Args = NewArgs; @@ -174,9 +186,9 @@ static void CmdAddArg (CmdDesc* Cmd, const char* Arg) /* Add a copy of the new argument, allow a NULL pointer */ if (Arg) { - Cmd->Args[Cmd->ArgCount++] = xstrdup (Arg); + Cmd->Args[Cmd->ArgCount++] = xstrdup (Arg); } else { - Cmd->Args[Cmd->ArgCount++] = 0; + Cmd->Args[Cmd->ArgCount++] = 0; } } @@ -214,8 +226,8 @@ static void CmdAddArgList (CmdDesc* Cmd, const char* ArgList) ++Cmd->ArgCount; /* If the argument was terminated by a comma, skip it, otherwise - * we're done. - */ + ** we're done. + */ if (*P == ',') { /* Start over at next char */ Arg = ++P; @@ -236,9 +248,9 @@ static void CmdDelArgs (CmdDesc* Cmd, unsigned LastValid) /* Remove all arguments with an index greater than LastValid */ { while (Cmd->ArgCount > LastValid) { - Cmd->ArgCount--; - xfree (Cmd->Args [Cmd->ArgCount]); - Cmd->Args [Cmd->ArgCount] = 0; + Cmd->ArgCount--; + xfree (Cmd->Args [Cmd->ArgCount]); + Cmd->Args [Cmd->ArgCount] = 0; } } @@ -249,48 +261,56 @@ static void CmdAddFile (CmdDesc* Cmd, const char* File) { /* Expand the file vector if needed */ if (Cmd->FileCount == Cmd->FileMax) { - unsigned NewMax = Cmd->FileMax + 10; - char** NewFiles = xmalloc (NewMax * sizeof (char*)); - memcpy (NewFiles, Cmd->Files, Cmd->FileMax * sizeof (char*)); - xfree (Cmd->Files); - Cmd->Files = NewFiles; - Cmd->FileMax = NewMax; + unsigned NewMax = Cmd->FileMax + 10; + char** NewFiles = xmalloc (NewMax * sizeof (char*)); + memcpy (NewFiles, Cmd->Files, Cmd->FileMax * sizeof (char*)); + xfree (Cmd->Files); + Cmd->Files = NewFiles; + Cmd->FileMax = NewMax; } /* If the file name is not NULL (which is legal and is used to terminate - * the file list), check if the file name does already exist in the file - * list and print a warning if so. Regardless of the search result, add - * the file. - */ + ** the file list), check if the file name does already exist in the file + ** list and print a warning if so. Regardless of the search result, add + ** the file. + */ if (File) { - unsigned I; - for (I = 0; I < Cmd->FileCount; ++I) { - if (strcmp (Cmd->Files[I], File) == 0) { - /* Duplicate file */ - Warning ("Duplicate file in argument list: `%s'", File); - /* No need to search further */ - break; - } - } - - /* Add the file */ - Cmd->Files [Cmd->FileCount++] = xstrdup (File); + unsigned I; + for (I = 0; I < Cmd->FileCount; ++I) { + if (strcmp (Cmd->Files[I], File) == 0) { + /* Duplicate file */ + Warning ("Duplicate file in argument list: `%s'", File); + /* No need to search further */ + break; + } + } + + /* Add the file */ + Cmd->Files [Cmd->FileCount++] = xstrdup (File); } else { - /* Add a NULL pointer */ - Cmd->Files [Cmd->FileCount++] = 0; + /* Add a NULL pointer */ + Cmd->Files [Cmd->FileCount++] = 0; } } -static void CmdInit (CmdDesc* Cmd, const char* Path) -/* Initialize the command using the given path to the executable */ +static void CmdInit (CmdDesc* Cmd, const char* Path, const char* Name) +/* Initialize the command using the given path and name of the executable */ { + char* FullName; + + FullName = (char*) xmalloc (strlen (Path) + strlen (Name) + 1); + strcpy (FullName, Path); + strcat (FullName, Name); + /* Remember the command */ - Cmd->Name = xstrdup (Path); + Cmd->Name = xstrdup (FullName); /* Use the command name as first argument */ - CmdAddArg (Cmd, Path); + CmdAddArg (Cmd, FullName); + + xfree (FullName); } @@ -316,14 +336,14 @@ static void CmdPrint (CmdDesc* Cmd, FILE* F) { unsigned I; for (I = 0; I < Cmd->ArgCount && Cmd->Args[I] != 0; ++I) { - fprintf (F, "%s ", Cmd->Args[I]); + fprintf (F, "%s ", Cmd->Args[I]); } } /*****************************************************************************/ -/* Target handling */ +/* Target handling */ /*****************************************************************************/ @@ -334,14 +354,14 @@ static void SetTargetFiles (void) /* Determine the names of the target specific library file */ if (Target != TGT_NONE) { - /* Get a pointer to the system name and its length */ - const char* TargetName = GetTargetName (Target); - unsigned TargetNameLen = strlen (TargetName); + /* Get a pointer to the system name and its length */ + const char* TargetName = GetTargetName (Target); + unsigned TargetNameLen = strlen (TargetName); - /* Set the library file */ - TargetLib = xmalloc (TargetNameLen + 4 + 1); - memcpy (TargetLib, TargetName, TargetNameLen); - strcpy (TargetLib + TargetNameLen, ".lib"); + /* Set the library file */ + TargetLib = xmalloc (TargetNameLen + 4 + 1); + memcpy (TargetLib, TargetName, TargetNameLen); + strcpy (TargetLib + TargetNameLen, ".lib"); } } @@ -349,7 +369,7 @@ static void SetTargetFiles (void) /*****************************************************************************/ -/* Subprocesses */ +/* Subprocesses */ /*****************************************************************************/ @@ -361,21 +381,21 @@ static void ExecProgram (CmdDesc* Cmd) /* If in debug mode, output the command line we will execute */ if (Debug) { - printf ("Executing: "); - CmdPrint (Cmd, stdout); - printf ("\n"); + printf ("Executing: "); + CmdPrint (Cmd, stdout); + printf ("\n"); } /* Call the program */ - Status = spawnvp (P_WAIT, Cmd->Name, Cmd->Args); + Status = spawnvp (P_WAIT, Cmd->Name, SPAWN_ARGV_CONST_CAST Cmd->Args); /* Check the result code */ if (Status < 0) { - /* Error executing the program */ - Error ("Cannot execute `%s': %s", Cmd->Name, strerror (errno)); + /* Error executing the program */ + Error ("Cannot execute `%s': %s", Cmd->Name, strerror (errno)); } else if (Status != 0) { - /* Called program had an error */ - exit (Status); + /* Called program had an error */ + exit (Status); } } @@ -387,34 +407,34 @@ static void Link (void) unsigned I; /* Since linking is always the final step, if we have an output file name - * given, set it here. If we don't have an explicit output name given, - * try to build one from the name of the first input file. - */ + ** given, set it here. If we don't have an explicit output name given, + ** try to build one from the name of the first input file. + */ if (OutputName) { - CmdSetOutput (&LD65, OutputName); + CmdSetOutput (&LD65, OutputName); } else if (FirstInput && FindExt (FirstInput)) { /* Only if ext present! */ const char* Extension = Module? MODULE_EXT : ""; - char* Output = MakeFilename (FirstInput, Extension); - CmdSetOutput (&LD65, Output); - xfree (Output); + char* Output = MakeFilename (FirstInput, Extension); + CmdSetOutput (&LD65, Output); + xfree (Output); } /* If we have a linker config file given, add it to the command line. - * Otherwise pass the target to the linker if we have one. - */ + ** Otherwise pass the target to the linker if we have one. + */ if (LinkerConfig) { if (Module) { Error ("Cannot use -C and --module together"); } - CmdAddArg2 (&LD65, "-C", LinkerConfig); + CmdAddArg2 (&LD65, "-C", LinkerConfig); } else if (Module) { CmdSetTarget (&LD65, TGT_MODULE); } else { - CmdSetTarget (&LD65, Target); + CmdSetTarget (&LD65, Target); } /* Determine which target libraries are needed */ @@ -422,12 +442,12 @@ static void Link (void) /* Add all object files as parameters */ for (I = 0; I < LD65.FileCount; ++I) { - CmdAddArg (&LD65, LD65.Files [I]); + CmdAddArg (&LD65, LD65.Files [I]); } /* Add the system runtime library */ if (TargetLib) { - CmdAddArg (&LD65, TargetLib); + CmdAddArg (&LD65, TargetLib); } /* Terminate the argument list with a NULL pointer */ @@ -441,9 +461,9 @@ static void Link (void) static void AssembleFile (const char* File, unsigned ArgCount) /* Common routine to assemble a file. Will be called by Assemble() and - * AssembleIntermediate(). Adds options common for both routines and - * assembles the file. Will remove excess arguments after assembly. - */ +** AssembleIntermediate(). Adds options common for both routines and +** assembles the file. Will remove excess arguments after assembly. +*/ { /* Set the target system */ CmdSetTarget (&CA65, Target); @@ -451,12 +471,12 @@ static void AssembleFile (const char* File, unsigned ArgCount) /* Check if this is the last processing step */ if (DoLink) { /* We're linking later. Add the output file of the assembly - * the the file list of the linker. The name of the output - * file is that of the input file with ".s" replaced by ".o". - */ - char* ObjName = MakeFilename (File, ".o"); - CmdAddFile (&LD65, ObjName); - xfree (ObjName); + ** the the file list of the linker. The name of the output + ** file is that of the input file with ".s" replaced by ".o". + */ + char* ObjName = MakeFilename (File, ".o"); + CmdAddFile (&LD65, ObjName); + xfree (ObjName); } else { /* This is the final step. If an output name is given, set it */ if (OutputName) { @@ -481,13 +501,13 @@ static void AssembleFile (const char* File, unsigned ArgCount) static void AssembleIntermediate (const char* SourceFile) /* Assemble an intermediate file which was generated by a previous processing - * step with SourceFile as input. The -dep options won't be added and - * the intermediate assembler file is removed after assembly. - */ +** step with SourceFile as input. The -dep options won't be added and +** the intermediate assembler file is removed after assembly. +*/ { /* Generate the name of the assembler output file from the source file - * name. It's the same name with the extension replaced by ".s" - */ + ** name. It's the same name with the extension replaced by ".s" + */ char* AsmName = MakeFilename (SourceFile, ".s"); /* Assemble the intermediate assembler file */ @@ -512,9 +532,9 @@ static void Assemble (const char* File) unsigned ArgCount = CA65.ArgCount; /* We aren't assembling an intermediate file, but one requested by the - * user. So add a few options here if they were given on the command - * line. - */ + ** user. So add a few options here if they were given on the command + ** line. + */ if (DepName && *DepName) { CmdAddArg2 (&CA65, "--create-dep", DepName); } @@ -540,10 +560,10 @@ static void Compile (const char* File) /* Check if this is the final step */ if (DoAssemble) { /* We will assemble this file later. If a dependency file is to be - * generated, set the dependency target to be the final object file, - * not the intermediate assembler file. But beware: There may be an - * output name specified for the assembler. - */ + ** generated, set the dependency target to be the final object file, + ** not the intermediate assembler file. But beware: There may be an + ** output name specified for the assembler. + */ if (DepName || FullDepName) { /* Was an output name for the assembler specified? */ if (!DoLink && OutputName) { @@ -558,8 +578,8 @@ static void Compile (const char* File) } } else { /* If we won't assemble, this is the final step. In this case, set - * the output name if it was given. - */ + ** the output name if it was given. + */ if (OutputName) { CmdSetOutput (&CC65, OutputName); } @@ -578,11 +598,11 @@ static void Compile (const char* File) CmdDelArgs (&CC65, ArgCount); /* If this is not the final step, assemble the generated file, then - * remove it - */ + ** remove it + */ if (DoAssemble) { /* Assemble the intermediate file and remove it */ - AssembleIntermediate (File); + AssembleIntermediate (File); } } @@ -595,8 +615,8 @@ static void CompileRes (const char* File) unsigned ArgCount = GRC.ArgCount; /* Resource files need an geos-apple or geos-cbm target but this - * is checked within grc65. - */ + ** is checked within grc65. + */ CmdSetTarget (&GRC, Target); /* Add the file as argument for the resource compiler */ @@ -612,11 +632,11 @@ static void CompileRes (const char* File) CmdDelArgs (&GRC, ArgCount); /* If this is not the final step, assemble the generated file, then - * remove it - */ + ** remove it + */ if (DoAssemble) { /* Assemble the intermediate file and remove it */ - AssembleIntermediate (File); + AssembleIntermediate (File); } } @@ -629,10 +649,10 @@ static void ConvertO65 (const char* File) unsigned ArgCount = CO65.ArgCount; /* If we won't assemble, this is the final step. In this case, set the - * output name. - */ + ** output name. + */ if (!DoAssemble && OutputName) { - CmdSetOutput (&CO65, OutputName); + CmdSetOutput (&CO65, OutputName); } /* Add the file as argument for the object file converter */ @@ -648,18 +668,18 @@ static void ConvertO65 (const char* File) CmdDelArgs (&CO65, ArgCount); /* If this is not the final step, assemble the generated file, then - * remove it - */ + ** remove it + */ if (DoAssemble) { /* Assemble the intermediate file and remove it */ - AssembleIntermediate (File); + AssembleIntermediate (File); } } /*****************************************************************************/ -/* Code */ +/* Code */ /*****************************************************************************/ @@ -724,7 +744,6 @@ static void Usage (void) " --debug-info\t\t\tAdd debug info\n" " --feature name\t\tSet an emulation feature\n" " --force-import sym\t\tForce an import of symbol `sym'\n" - " --forget-inc-paths\t\tForget include search paths (compiler)\n" " --help\t\t\tHelp (this text)\n" " --include-dir dir\t\tSet a compiler include directory path\n" " --ld-args options\t\tPass options to the linker\n" @@ -758,7 +777,7 @@ static void Usage (void) static void OptAddSource (const char* Opt attribute ((unused)), - const char* Arg attribute ((unused))) + const char* Arg attribute ((unused))) /* Strict source code as comments to the generated asm code */ { CmdAddArg (&CC65, "-T"); @@ -832,7 +851,7 @@ static void OptCfgPath (const char* Opt attribute ((unused)), const char* Arg) static void OptCheckStack (const char* Opt attribute ((unused)), - const char* Arg attribute ((unused))) + const char* Arg attribute ((unused))) /* Handle the --check-stack option */ { CmdAddArg (&CC65, "--check-stack"); @@ -928,7 +947,7 @@ static void OptDataName (const char* Opt attribute ((unused)), const char* Arg) static void OptDebug (const char* Opt attribute ((unused)), - const char* Arg attribute ((unused))) + const char* Arg attribute ((unused))) /* Debug mode (compiler and cl65 utility) */ { CmdAddArg (&CC65, "-d"); @@ -939,7 +958,7 @@ static void OptDebug (const char* Opt attribute ((unused)), static void OptDebugInfo (const char* Opt attribute ((unused)), - const char* Arg attribute ((unused))) + const char* Arg attribute ((unused))) /* Debug Info - add to compiler and assembler */ { CmdAddArg (&CC65, "-g"); @@ -965,17 +984,8 @@ static void OptForceImport (const char* Opt attribute ((unused)), const char* Ar -static void OptForgetIncPaths (const char* Opt attribute ((unused)), - const char* Arg attribute ((unused))) -/* Forget all currently defined include paths */ -{ - CmdAddArg (&CC65, "--forget-inc-paths"); -} - - - static void OptHelp (const char* Opt attribute ((unused)), - const char* Arg attribute ((unused))) + const char* Arg attribute ((unused))) /* Print help - cl65 */ { Usage (); @@ -1033,14 +1043,14 @@ static void OptListing (const char* Opt attribute ((unused)), const char* Arg) static void OptListTargets (const char* Opt attribute ((unused)), - const char* Arg attribute ((unused))) + const char* Arg attribute ((unused))) /* List all targets */ { target_t T; /* List the targets */ for (T = TGT_NONE; T < TGT_COUNT; ++T) { - printf ("%s\n", GetTargetName (T)); + printf ("%s\n", GetTargetName (T)); } /* Terminate */ @@ -1142,7 +1152,7 @@ static void OptRodataName (const char* Opt attribute ((unused)), const char* Arg static void OptSignedChars (const char* Opt attribute ((unused)), - const char* Arg attribute ((unused))) + const char* Arg attribute ((unused))) /* Make default characters signed */ { CmdAddArg (&CC65, "-j"); @@ -1167,7 +1177,7 @@ static void OptStartAddr (const char* Opt attribute ((unused)), const char* Arg) static void OptStaticLocals (const char* Opt attribute ((unused)), - const char* Arg attribute ((unused))) + const char* Arg attribute ((unused))) /* Place local variables in static storage */ { CmdAddArg (&CC65, "-Cl"); @@ -1189,7 +1199,7 @@ static void OptTarget (const char* Opt attribute ((unused)), const char* Arg) static void OptVerbose (const char* Opt attribute ((unused)), - const char* Arg attribute ((unused))) + const char* Arg attribute ((unused))) /* Verbose mode (compiler, assembler, linker) */ { CmdAddArg (&CC65, "-v"); @@ -1201,12 +1211,10 @@ static void OptVerbose (const char* Opt attribute ((unused)), static void OptVersion (const char* Opt attribute ((unused)), - const char* Arg attribute ((unused))) + const char* Arg attribute ((unused))) /* Print version number */ { - fprintf (stderr, - "cl65 V%s - (C) Copyright 1998-2011 Ullrich von Bassewitz\n", - GetVersionAsString ()); + fprintf (stderr, "cl65 V%s\n", GetVersionAsString ()); } @@ -1232,70 +1240,86 @@ int main (int argc, char* argv []) { /* Program long options */ static const LongOpt OptTab[] = { - { "--add-source", 0, OptAddSource }, + { "--add-source", 0, OptAddSource }, { "--asm-args", 1, OptAsmArgs }, - { "--asm-define", 1, OptAsmDefine }, - { "--asm-include-dir", 1, OptAsmIncludeDir }, + { "--asm-define", 1, OptAsmDefine }, + { "--asm-include-dir", 1, OptAsmIncludeDir }, { "--bin-include-dir", 1, OptBinIncludeDir }, - { "--bss-label", 1, OptBssLabel }, - { "--bss-name", 1, OptBssName }, + { "--bss-label", 1, OptBssLabel }, + { "--bss-name", 1, OptBssName }, { "--cc-args", 1, OptCCArgs }, - { "--cfg-path", 1, OptCfgPath }, - { "--check-stack", 0, OptCheckStack }, - { "--code-label", 1, OptCodeLabel }, - { "--code-name", 1, OptCodeName }, - { "--codesize", 1, OptCodeSize }, + { "--cfg-path", 1, OptCfgPath }, + { "--check-stack", 0, OptCheckStack }, + { "--code-label", 1, OptCodeLabel }, + { "--code-name", 1, OptCodeName }, + { "--codesize", 1, OptCodeSize }, { "--config", 1, OptConfig }, - { "--cpu", 1, OptCPU }, - { "--create-dep", 1, OptCreateDep }, - { "--create-full-dep", 1, OptCreateFullDep }, - { "--data-label", 1, OptDataLabel }, - { "--data-name", 1, OptDataName }, - { "--debug", 0, OptDebug }, - { "--debug-info", 0, OptDebugInfo }, - { "--feature", 1, OptFeature }, + { "--cpu", 1, OptCPU }, + { "--create-dep", 1, OptCreateDep }, + { "--create-full-dep", 1, OptCreateFullDep }, + { "--data-label", 1, OptDataLabel }, + { "--data-name", 1, OptDataName }, + { "--debug", 0, OptDebug }, + { "--debug-info", 0, OptDebugInfo }, + { "--feature", 1, OptFeature }, { "--force-import", 1, OptForceImport }, - { "--forget-inc-paths", 0, OptForgetIncPaths }, - { "--help", 0, OptHelp }, - { "--include-dir", 1, OptIncludeDir }, + { "--help", 0, OptHelp }, + { "--include-dir", 1, OptIncludeDir }, { "--ld-args", 1, OptLdArgs }, - { "--lib", 1, OptLib }, - { "--lib-path", 1, OptLibPath }, - { "--list-targets", 0, OptListTargets }, - { "--listing", 1, OptListing }, + { "--lib", 1, OptLib }, + { "--lib-path", 1, OptLibPath }, + { "--list-targets", 0, OptListTargets }, + { "--listing", 1, OptListing }, { "--list-bytes", 1, OptListBytes }, - { "--mapfile", 1, OptMapFile }, + { "--mapfile", 1, OptMapFile }, { "--memory-model", 1, OptMemoryModel }, { "--module", 0, OptModule }, { "--module-id", 1, OptModuleId }, { "--o65-model", 1, OptO65Model }, - { "--obj", 1, OptObj }, - { "--obj-path", 1, OptObjPath }, + { "--obj", 1, OptObj }, + { "--obj-path", 1, OptObjPath }, { "--register-space", 1, OptRegisterSpace }, { "--register-vars", 0, OptRegisterVars }, - { "--rodata-name", 1, OptRodataName }, - { "--signed-chars", 0, OptSignedChars }, + { "--rodata-name", 1, OptRodataName }, + { "--signed-chars", 0, OptSignedChars }, { "--standard", 1, OptStandard }, - { "--start-addr", 1, OptStartAddr }, - { "--static-locals", 0, OptStaticLocals }, - { "--target", 1, OptTarget }, - { "--verbose", 0, OptVerbose }, - { "--version", 0, OptVersion }, - { "--zeropage-label", 1, OptZeropageLabel }, - { "--zeropage-name", 1, OptZeropageName }, + { "--start-addr", 1, OptStartAddr }, + { "--static-locals", 0, OptStaticLocals }, + { "--target", 1, OptTarget }, + { "--verbose", 0, OptVerbose }, + { "--version", 0, OptVersion }, + { "--zeropage-label", 1, OptZeropageLabel }, + { "--zeropage-name", 1, OptZeropageName }, }; + char* CmdPath; unsigned I; /* Initialize the cmdline module */ InitCmdLine (&argc, &argv, "cl65"); /* Initialize the command descriptors */ - CmdInit (&CC65, "cc65"); - CmdInit (&CA65, "ca65"); - CmdInit (&CO65, "co65"); - CmdInit (&LD65, "ld65"); - CmdInit (&GRC, "grc65"); + if (argc == 0) { + CmdPath = xstrdup (""); + } else { + char* Ptr; + CmdPath = xstrdup (argv[0]); + Ptr = strrchr (CmdPath, '/'); + if (Ptr == 0) { + Ptr = strrchr (CmdPath, '\\'); + } + if (Ptr == 0) { + *CmdPath = '\0'; + } else { + *(Ptr + 1) = '\0'; + } + } + CmdInit (&CC65, CmdPath, "cc65"); + CmdInit (&CA65, CmdPath, "ca65"); + CmdInit (&CO65, CmdPath, "co65"); + CmdInit (&LD65, CmdPath, "ld65"); + CmdInit (&GRC, CmdPath, "grc65"); + xfree (CmdPath); /* Our default target is the C64 instead of "none" */ Target = TGT_C64; @@ -1304,216 +1328,213 @@ int main (int argc, char* argv []) I = 1; while (I < ArgCount) { - /* Get the argument */ - const char* Arg = ArgVec[I]; - - /* Check for an option */ - if (Arg [0] == '-') { - - switch (Arg [1]) { - - case '-': - LongOption (&I, OptTab, sizeof(OptTab)/sizeof(OptTab[0])); - break; - - case 'C': - if (Arg[2] == 'l' && Arg[3] == '\0') { - /* Make local variables static */ - OptStaticLocals (Arg, 0); - } else { - /* Specify linker config file */ - OptConfig (Arg, GetArg (&I, 2)); - } - break; - - case 'D': - /* Define a preprocessor symbol (compiler) */ - CmdAddArg2 (&CC65, "-D", GetArg (&I, 2)); - break; - - case 'I': - /* Include directory (compiler) */ - OptIncludeDir (Arg, GetArg (&I, 2)); - break; - - case 'L': - if (Arg[2] == 'n' && Arg[3] == '\0') { - /* VICE label file (linker) */ - CmdAddArg2 (&LD65, "-Ln", GetArg (&I, 3)); - } else { + /* Get the argument */ + const char* Arg = ArgVec[I]; + + /* Check for an option */ + if (Arg [0] == '-') { + + switch (Arg [1]) { + + case '-': + LongOption (&I, OptTab, sizeof(OptTab)/sizeof(OptTab[0])); + break; + + case 'C': + if (Arg[2] == 'l' && Arg[3] == '\0') { + /* Make local variables static */ + OptStaticLocals (Arg, 0); + } else { + /* Specify linker config file */ + OptConfig (Arg, GetArg (&I, 2)); + } + break; + + case 'D': + /* Define a preprocessor symbol (compiler) */ + CmdAddArg2 (&CC65, "-D", GetArg (&I, 2)); + break; + + case 'I': + /* Include directory (compiler) */ + OptIncludeDir (Arg, GetArg (&I, 2)); + break; + + case 'L': + if (Arg[2] == 'n' && Arg[3] == '\0') { + /* VICE label file (linker) */ + CmdAddArg2 (&LD65, "-Ln", GetArg (&I, 3)); + } else { /* Library search path (linker) */ OptLibPath (Arg, GetArg (&I, 2)); - } - break; + } + break; - case 'O': - /* Optimize code (compiler, also covers -Oi and others) */ - CmdAddArg (&CC65, Arg); - break; + case 'O': + /* Optimize code (compiler, also covers -Oi and others) */ + CmdAddArg (&CC65, Arg); + break; - case 'S': - /* Dont assemble and link the created files */ + case 'S': + /* Dont assemble and link the created files */ DoAssemble = 0; - DoLink = 0; - break; - - case 'T': - /* Include source as comment (compiler) */ - OptAddSource (Arg, 0); - break; - - case 'V': - /* Print version number */ - OptVersion (Arg, 0); - break; - - case 'W': - if (Arg[2] == 'a' && Arg[3] == '\0') { - /* -Wa: Pass options to assembler */ - OptAsmArgs (Arg, GetArg (&I, 3)); - } else if (Arg[2] == 'c' && Arg[3] == '\0') { - /* -Wc: Pass options to compiler */ - OptCCArgs (Arg, GetArg (&I, 3)); - } else if (Arg[2] == 'l' && Arg[3] == '\0') { - /* -Wl: Pass options to linker */ - OptLdArgs (Arg, GetArg (&I, 3)); - } else { - /* Anything else: Suppress warnings (compiler) */ - CmdAddArg2 (&CC65, "-W", GetArg (&I, 2)); - } - break; - - case 'c': - /* Don't link the resulting files */ - DoLink = 0; - break; - - case 'd': - /* Debug mode (compiler) */ - OptDebug (Arg, 0); - break; - - case 'g': - /* Debugging - add to compiler and assembler */ - OptDebugInfo (Arg, 0); - break; - - case 'h': - case '?': - /* Print help - cl65 */ - OptHelp (Arg, 0); - break; - - case 'j': - /* Default characters are signed */ - OptSignedChars (Arg, 0); - break; - - case 'l': - /* Create an assembler listing */ - OptListing (Arg, GetArg (&I, 2)); - break; - - case 'm': - /* Create a map file (linker) */ - OptMapFile (Arg, GetArg (&I, 2)); - break; - - case 'o': - /* Name the output file */ - OutputName = GetArg (&I, 2); - break; - - case 'r': - /* Enable register variables */ - OptRegisterVars (Arg, 0); - break; - - case 't': - /* Set target system - compiler, assembler and linker */ - OptTarget (Arg, GetArg (&I, 2)); - break; - - case 'u': - /* Force an import (linker) */ - OptForceImport (Arg, GetArg (&I, 2)); - break; - - case 'v': - if (Arg [2] == 'm') { - /* Verbose map file (linker) */ - CmdAddArg (&LD65, "-vm"); - } else { - /* Verbose mode (compiler, assembler, linker) */ - OptVerbose (Arg, 0); - } - break; - - default: - UnknownOption (Arg); - } - } else { - - /* Remember the first file name */ - if (FirstInput == 0) { - FirstInput = Arg; - } - - /* Determine the file type by the extension */ - switch (GetFileType (Arg)) { - - case FILETYPE_C: - /* Compile the file */ - Compile (Arg); - break; - - case FILETYPE_ASM: - /* Assemble the file */ - if (DoAssemble) { - Assemble (Arg); - } - break; - - case FILETYPE_OBJ: - case FILETYPE_LIB: - /* Add to the linker files */ - CmdAddFile (&LD65, Arg); - break; - - case FILETYPE_GR: - /* Add to the resource compiler files */ - CompileRes (Arg); - break; + DoLink = 0; + break; + + case 'T': + /* Include source as comment (compiler) */ + OptAddSource (Arg, 0); + break; + + case 'V': + /* Print version number */ + OptVersion (Arg, 0); + break; + + case 'W': + if (Arg[2] == 'a' && Arg[3] == '\0') { + /* -Wa: Pass options to assembler */ + OptAsmArgs (Arg, GetArg (&I, 3)); + } else if (Arg[2] == 'c' && Arg[3] == '\0') { + /* -Wc: Pass options to compiler */ + OptCCArgs (Arg, GetArg (&I, 3)); + } else if (Arg[2] == 'l' && Arg[3] == '\0') { + /* -Wl: Pass options to linker */ + OptLdArgs (Arg, GetArg (&I, 3)); + } else { + /* Anything else: Suppress warnings (compiler) */ + CmdAddArg2 (&CC65, "-W", GetArg (&I, 2)); + } + break; + + case 'c': + /* Don't link the resulting files */ + DoLink = 0; + break; + + case 'd': + /* Debug mode (compiler) */ + OptDebug (Arg, 0); + break; + + case 'g': + /* Debugging - add to compiler and assembler */ + OptDebugInfo (Arg, 0); + break; + + case 'h': + case '?': + /* Print help - cl65 */ + OptHelp (Arg, 0); + break; + + case 'j': + /* Default characters are signed */ + OptSignedChars (Arg, 0); + break; + + case 'l': + /* Create an assembler listing */ + OptListing (Arg, GetArg (&I, 2)); + break; + + case 'm': + /* Create a map file (linker) */ + OptMapFile (Arg, GetArg (&I, 2)); + break; + + case 'o': + /* Name the output file */ + OutputName = GetArg (&I, 2); + break; + + case 'r': + /* Enable register variables */ + OptRegisterVars (Arg, 0); + break; + + case 't': + /* Set target system - compiler, assembler and linker */ + OptTarget (Arg, GetArg (&I, 2)); + break; + + case 'u': + /* Force an import (linker) */ + OptForceImport (Arg, GetArg (&I, 2)); + break; + + case 'v': + if (Arg [2] == 'm') { + /* Verbose map file (linker) */ + CmdAddArg (&LD65, "-vm"); + } else { + /* Verbose mode (compiler, assembler, linker) */ + OptVerbose (Arg, 0); + } + break; + + default: + UnknownOption (Arg); + } + } else { + + /* Remember the first file name */ + if (FirstInput == 0) { + FirstInput = Arg; + } + + /* Determine the file type by the extension */ + switch (GetFileType (Arg)) { + + case FILETYPE_C: + /* Compile the file */ + Compile (Arg); + break; + + case FILETYPE_ASM: + /* Assemble the file */ + if (DoAssemble) { + Assemble (Arg); + } + break; + + case FILETYPE_OBJ: + case FILETYPE_LIB: + /* Add to the linker files */ + CmdAddFile (&LD65, Arg); + break; + + case FILETYPE_GR: + /* Add to the resource compiler files */ + CompileRes (Arg); + break; case FILETYPE_O65: /* Add the the object file converter files */ ConvertO65 (Arg); break; - default: - Error ("Don't know what to do with `%s'", Arg); + default: + Error ("Don't know what to do with `%s'", Arg); - } + } - } + } - /* Next argument */ - ++I; + /* Next argument */ + ++I; } /* Check if we had any input files */ if (FirstInput == 0) { - Warning ("No input files"); + Warning ("No input files"); } /* Link the given files if requested and if we have any */ if (DoLink && LD65.FileCount > 0) { - Link (); + Link (); } /* Return an apropriate exit code */ return EXIT_SUCCESS; } - - -