From 4ef1ca6ec6bbafa57d2f30a3a8bdc7889eff7243 Mon Sep 17 00:00:00 2001 From: michaelh Date: Fri, 4 Feb 2000 03:45:26 +0000 Subject: [PATCH] Changed the command builder to something a bit more extendable. I dont know if I got all of the options - linker is unchecked. git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@61 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- src/SDCCmain.c | 172 +++++++++++++++++++++++++++++++------------------ 1 file changed, 109 insertions(+), 63 deletions(-) diff --git a/src/SDCCmain.c b/src/SDCCmain.c index 2d72e46b..ff58b609 100644 --- a/src/SDCCmain.c +++ b/src/SDCCmain.c @@ -51,7 +51,6 @@ char *fullSrcFileName ;/* full name for the source file */ char *srcFileName ;/* source file name with the .c stripped */ char *moduleName ;/* module name is srcFilename stripped of any path */ char *preArgv[128] ;/* pre-processor arguments */ -int preArgc = 0 ;/* pre-processor argument count */ int currRegBank = 0 ; struct optimize optimize ; struct options options ; @@ -116,6 +115,20 @@ char *preOutName; #define OPTION_CALLEE_SAVES "-callee-saves" #define OPTION_NOREGPARMS "-noregparms" +static const char *linkCmd[] = { + "$1", "-nf", "$2", NULL +}; + +static const char *preCmd[] = { + "sdcpp", "-version", "-Wall", "-lang-c++", "-DSDCC=1", + "-I" SDCC_INCLUDE_DIR, "$l", "$1", "$2", NULL +}; + +static const char *asmCmd[] = { + "$1", "-plosgffc", "$2.asm", NULL +}; + + extern PORT mcs51_port; extern PORT z80_port; @@ -145,13 +158,70 @@ static int _setPort(const char *name) return 1; } +static void _buildCmdLine(char *into, char **args, const char **cmds, + const char *p1, const char *p2, + const char *p3, const char **list) +{ + const char *p, *from; + + while (*cmds) { + *args = into; + args++; + + from = *cmds; + cmds++; + *into = '\0'; + + /* See if it has a '$' anywhere - if not, just copy */ + if ((p = strchr(from, '$'))) { + strncpy(into, from, p - from); + from = p+2; + p++; + switch (*p) { + case '1': + if (p1) + strcat(into, p1); + break; + case '2': + if (p2) + strcat(into, p2); + break; + case '3': + if (p3) + strcat(into, p3); + break; + case 'l': { + const char **tmp = list; + if (tmp) { + while (*tmp) { + strcpy(into, *tmp); + into += strlen(into)+1; + *args = into; + args++; + tmp++; + } + } + break; + } + default: + assert(0); + } + } + strcat(into, from); + if (strlen(into) == 0) + args--; + into += strlen(into)+1; + } + *args = NULL; +} + /*-----------------------------------------------------------------*/ /* printVersionInfo - prints the version info */ /*-----------------------------------------------------------------*/ void printVersionInfo () { int i; - + fprintf (stderr, "SDCC : "); for (i=0; ilinker.exec_name, srcFileName, NULL, NULL); - if (my_system("aslink",lnkArgs)) { + /* call the linker */ + if (my_system(argv[0], argv)) { perror("Cannot exec linker"); exit(1); } @@ -1009,67 +1074,48 @@ static void linkEdit (char **envp) /*-----------------------------------------------------------------*/ static void assemble (char **envp) { - char *asmArgs[128]; /* assembler arguments */ - /* PENDING: A bit messy */ - char buffer2[1024]; - - int i = 2; - - asmArgs[0] = port->assembler.exec_name; - - asmArgs[1] = port->assembler.debug_opts; - - /* add the extra options if any */ - for (; asmOptions[i-2] ; i++) - asmArgs[i] = asmOptions[i-2]; - - if (port->assembler.requires_output_name) { - sprintf(buffer2, srcFileName); - strcat(buffer2, ".o"); - asmArgs[i++] = buffer2; - } - - /* create the assembler file name */ - sprintf (buffer, srcFileName); - strcat (buffer, ".asm"); - asmArgs[i++] = buffer; + char *argv[128]; /* assembler arguments */ - asmArgs[i] = 0; /* end of args */ + _buildCmdLine(buffer, argv, asmCmd, port->assembler.exec_name, srcFileName, NULL, asmOptions); - if (my_system(port->assembler.exec_name, asmArgs)) { - perror("Cannot exec linker"); + if (my_system(argv[0], argv)) { + perror("Cannot exec assember"); exit(1); } } + + /*-----------------------------------------------------------------*/ /* preProcess - spawns the preprocessor with arguments */ /*-----------------------------------------------------------------*/ static int preProcess (char **envp) { - + char *argv[128]; + + preOutName = NULL; + /* if using external stack define the macro */ if ( options.useXstack ) - preArgv[preArgc++] = "-DSDCC_USE_XSTACK" ; + _addToList(preArgv, "-DSDCC_USE_XSTACK"); /* set the macro for stack autos */ if ( options.stackAuto ) - preArgv[preArgc++] = "-DSDCC_STACK_AUTO"; + _addToList(preArgv, "-DSDCC_STACK_AUTO"); /* set the macro for large model */ if ( options.model ) - preArgv[preArgc++] = "-DSDCC_MODEL_LARGE" ; + _addToList(preArgv, "-DSDCC_MODEL_LARGE"); else - preArgv[preArgc++] = "-DSDCC_MODEL_SMALL" ; + _addToList(preArgv, "-DSDCC_MODEL_SMALL"); - preArgv[preArgc++] = fullSrcFileName ; if (!preProcOnly) - preArgv[preArgc++] = preOutName = strdup(tmpnam(NULL)); - preArgv[preArgc] = NULL; + preOutName = strdup(tmpnam(NULL)); - preArgv[0] = "sdcpp"; + _buildCmdLine(buffer, argv, preCmd, fullSrcFileName, + preOutName, srcFileName, preArgv); - if (my_system("sdcpp",preArgv)) { + if (my_system(argv[0], argv)) { unlink (preOutName); perror("Cannot exec Preprocessor"); exit(1); -- 2.47.2