src/SDCCmain.c (preProcess): minor cleanup: eliminate preOutName
[fw/sdcc] / src / SDCCmain.c
index e6f0f3ba9b94a58e8b5c51371fc7c175921cbf55..308175e216eb28a4500b6d638e7e0b7e29ae43a6 100644 (file)
@@ -54,6 +54,7 @@ char *fullSrcFileName;                /* full name for the source file; */
                                /* can be NULL while c1mode or linking without compiling */
 char *fullDstFileName;         /* full name for the output file; */
                                /* only given by -o, otherwise NULL */
+size_t fullDstFileNameLen;     /* size of previous string. */
 char *dstFileName;             /* destination file name without extension */
 char *dstPath = "";            /* path for the output files; */
                                /* "" is equivalent with cwd */
@@ -75,7 +76,6 @@ char *libPaths[128];
 int nlibPaths = 0;
 char *relFiles[128];
 int nrelFiles = 0;
-static char *preOutName;
 
 /* uncomment JAMIN_DS390 to always override and use ds390 port
   for mcs51 work.  This is temporary, for compatibility testing. */
@@ -86,7 +86,7 @@ int ds390_jammed = 0;
 
 // Globally accessible scratch buffer for file names.
 char scratchFileName[PATH_MAX];
-char buffer[PATH_MAX];
+char buffer[PATH_MAX * 2];
 
 // In MSC VC6 default search path for exe's to path for this
 
@@ -114,6 +114,7 @@ char DefaultExePath[128];
 #define OPTION_DATA_LOC                "--data-loc"
 #define OPTION_CODE_LOC                "--code-loc"
 #define OPTION_IDATA_LOC       "--idata-loc"
+#define OPTION_NO_LABEL_OPT     "--nolabelopt"
 #define OPTION_NO_LOOP_INV     "--noinvariant"
 #define OPTION_NO_LOOP_IND     "--noinduction"
 #define OPTION_LESS_PEDANTIC   "--lesspedantic"
@@ -151,6 +152,7 @@ optionsTable[] = {
     { 0,    "--stack-10bit",        &options.stack10bit, "use the 10bit stack for ds390 (default)" },
     { 0,    "--xstack",             &options.useXstack, "Use external stack" },
     { 0,    OPTION_NO_GCSE,         NULL, "Disable the GCSE optimisation" },
+    { 0,    OPTION_NO_LABEL_OPT,    NULL, "Disable label optimisation" },
     { 0,    OPTION_NO_LOOP_INV,     NULL, "Disable optimisation of invariants" },
     { 0,    OPTION_NO_LOOP_IND,     NULL, NULL },
     { 0,    "--nojtbound",          &optimize.noJTabBoundary, "Don't generate boundary check for jump tables" },
@@ -390,16 +392,14 @@ printVersionInfo ()
           " (CYGWIN)\n"
 #elif defined __MINGW32__
           " (MINGW32) \n"
-#else
-#  ifdef __DJGPP__
+#elif defined __DJGPP__
           " (DJGPP) \n"
-#  else
-#    if defined(_MSC_VER)
-          " (WIN32) \n"
-#    else
+#elif defined(_MSC_VER)
+          " (MSVC) \n"
+#elif defined(__BORLANDC__)
+          " (BORLANDC) \n"
+#else
           " (UNIX) \n"
-#    endif
-#  endif
 #endif
 
           ,VersionString
@@ -559,7 +559,7 @@ processFile (char *s)
        }
 
       /* copy the file name into the buffer */
-      strcpy (buffer, s);
+      strncpyz (buffer, s, sizeof(buffer));
 
       /* get rid of the "."-extension */
 
@@ -694,7 +694,10 @@ tryHandleUnsupportedOpt(char **argv, int *pi)
                         (longOpt && unsupportedOptTable[i].longOpt && !strcmp(unsupportedOptTable[i].longOpt, longOpt))) {
                         // Found an unsupported opt.
                         char buffer[100];
-                        sprintf(buffer, "%s%c%c", longOpt ? longOpt : "", shortOpt ? '-' : ' ', shortOpt ? shortOpt : ' ');
+                        SNPRINTF(buffer, sizeof(buffer), 
+                                "%s%c%c", 
+                                longOpt ? longOpt : "", 
+                                shortOpt ? '-' : ' ', shortOpt ? shortOpt : ' ');
                         werror (W_UNSUPP_OPTION, buffer, unsupportedOptTable[i].message);
                         return 1;
                     }
@@ -953,6 +956,12 @@ parseCmdLine (int argc, char **argv)
              continue;
            }
 
+         if (strcmp (argv[i], OPTION_NO_LABEL_OPT) == 0)
+           {
+             optimize.label4 = 0;
+             continue;
+           }
+
          if (strcmp (argv[i], OPTION_NO_LOOP_IND) == 0)
            {
              optimize.loopInduction = 0;
@@ -1028,7 +1037,8 @@ parseCmdLine (int argc, char **argv)
                 char *p;
 
                 /* copy the file name into the buffer */
-                strcpy (buffer, getStringArg("-o", argv, &i, argc));
+                strncpyz(buffer, getStringArg("-o", argv, &i, argc), 
+                        sizeof(buffer));
                 /* point to last character */
                 p = buffer + strlen (buffer) - 1;
                 if (*p == DIR_SEPARATOR_CHAR)
@@ -1040,6 +1050,7 @@ parseCmdLine (int argc, char **argv)
                 else
                   {
                     fullDstFileName = Safe_strdup (buffer);
+                   fullDstFileNameLen = strlen(fullDstFileName) + 1;
 
                     /* get rid of the "."-extension */
 
@@ -1133,7 +1144,7 @@ parseCmdLine (int argc, char **argv)
                if (sOpt == 'Y')
                  sOpt = 'I';
 
-               sprintf (buffer, "-%c%s", sOpt, rest);
+               SNPRINTF (buffer, sizeof(buffer), "-%c%s", sOpt, rest);
                addToList (preArgv, buffer);
              }
              break;
@@ -1196,16 +1207,19 @@ parseCmdLine (int argc, char **argv)
       /* use the modulename from the C-source */
       if (fullSrcFileName)
         {
-          dstFileName = Safe_alloc (strlen (dstPath) + strlen (moduleName) + 1);
-          strcpy (dstFileName, dstPath);
-          strcat (dstFileName, moduleName);
+         size_t bufSize = strlen (dstPath) + strlen (moduleName) + 1;
+
+         dstFileName = Safe_alloc (bufSize);
+          strncpyz (dstFileName, dstPath, bufSize);
+          strncatz (dstFileName, moduleName, bufSize);
         }
       /* use the modulename from the first object file */
       else if (nrelFiles >= 1)
         {
           char *objectName;
+         size_t bufSize;
 
-          strcpy (buffer, relFiles[0]);
+          strncpyz (buffer, relFiles[0], sizeof(buffer));
           /* remove extension (it must be .rel) */
           *strrchr (buffer, '.') = '\0';
           /* remove path */
@@ -1218,9 +1232,10 @@ parseCmdLine (int argc, char **argv)
             {
               objectName = buffer;
             }
-          dstFileName = Safe_alloc (strlen (dstPath) + strlen (objectName) + 1);
-          strcpy (dstFileName, dstPath);
-          strcat (dstFileName, objectName);
+         bufSize = strlen (dstPath) + strlen (objectName) + 1;  
+          dstFileName = Safe_alloc (bufSize);
+          strncpyz (dstFileName, dstPath, bufSize);
+          strncatz (dstFileName, objectName, bufSize);
         }
       /* else no module given: help text is displayed */
     }
@@ -1232,7 +1247,8 @@ parseCmdLine (int argc, char **argv)
   /* if debug option is set the open the cdbFile */
   if (options.debug && fullSrcFileName)
     {
-      sprintf (scratchFileName, "%s.adb", dstFileName); //JCF: Nov 30, 2002
+      SNPRINTF (scratchFileName, sizeof(scratchFileName), 
+               "%s.adb", dstFileName); //JCF: Nov 30, 2002
       if ((cdbFile = fopen (scratchFileName, "w")) == NULL)
        werror (E_FILE_OPEN_ERR, scratchFileName);
       else
@@ -1255,7 +1271,8 @@ linkEdit (char **envp)
   int i, system_ret;
 
   /* first we need to create the <filename>.lnk file */
-  sprintf (scratchFileName, "%s.lnk", dstFileName);
+  SNPRINTF (scratchFileName, sizeof(scratchFileName), 
+           "%s.lnk", dstFileName);
   if (!(lnkfile = fopen (scratchFileName, "w")))
     {
       werror (E_FILE_OPEN_ERR, scratchFileName);
@@ -1387,33 +1404,35 @@ linkEdit (char **envp)
   /* -o option overrides default name? */
   if (fullDstFileName)
     {
-      strcpy (scratchFileName, fullDstFileName);
+      strncpyz (scratchFileName, fullDstFileName, sizeof(scratchFileName));
     }
   else
     {
       /* the linked file gets the name of the first modul */
       if (fullSrcFileName)
         {
-          strcpy (scratchFileName, dstFileName);
+          strncpyz (scratchFileName, dstFileName, sizeof(scratchFileName));
         }
       else
         {
-          strcpy (scratchFileName, relFiles[0]);
+          strncpyz (scratchFileName, relFiles[0], sizeof(scratchFileName));
           /* strip ".rel" extension */
           *strrchr (scratchFileName, '.') = '\0';
         }
-      strcat (scratchFileName, options.out_fmt ? ".S19" : ".ihx");
+      strncatz (scratchFileName, 
+               options.out_fmt ? ".S19" : ".ihx",
+               sizeof(scratchFileName));
     }
 
   if (port->linker.cmd)
     {
       char buffer2[PATH_MAX];
       buildCmdLine (buffer2, port->linker.cmd, dstFileName, scratchFileName, NULL, NULL);
-      buildCmdLine2 (buffer, buffer2);
+      buildCmdLine2 (buffer, buffer2, sizeof(buffer));
     }
   else
     {
-      buildCmdLine2 (buffer, port->linker.mcmd);
+      buildCmdLine2 (buffer, port->linker.mcmd, sizeof(buffer));
     }
 
   system_ret = my_system (buffer);
@@ -1425,16 +1444,24 @@ linkEdit (char **envp)
       /* the linked file gets the name of the first modul */
       if (fullSrcFileName)
         {
-          strcpy (scratchFileName, dstFileName);
+          strncpyz (scratchFileName, dstFileName, sizeof(scratchFileName));
           p = strlen (scratchFileName) + scratchFileName;
         }
       else
         {
-          strcpy (scratchFileName, relFiles[0]);
+          strncpyz (scratchFileName, relFiles[0], sizeof(scratchFileName));
           /* strip "rel" extension */
-          p = strrchr (scratchFileName, '.') + 1;
+          p = strrchr (scratchFileName, '.');
+         if (p)
+           {
+               p++;
+               *p = 0;
+           }
+           
         }
-      strcpy (p, options.out_fmt ? "S19" : "ihx");
+      strncatz (scratchFileName,
+               options.out_fmt ? "S19" : "ihx",
+               sizeof(scratchFileName));
       rename (scratchFileName, fullDstFileName);
 
       q = strrchr (fullDstFileName, '.');
@@ -1446,13 +1473,19 @@ linkEdit (char **envp)
       else
         {
           /* no extension: append new extensions */
+         /* Don't we want to append a period here ? */
           q = strlen (fullDstFileName) + fullDstFileName;
         }
-      strcpy (p, "map");
-      strcpy (q, "map");
+               
+      *p = 0;  
+      strncatz (scratchFileName, "map", sizeof(scratchFileName));
+      *q = 0;
+      strncatz(fullDstFileName, "map", fullDstFileNameLen);
       rename (scratchFileName, fullDstFileName);
-      strcpy (p, "mem");
-      strcpy (q, "mem");
+      *p = 0;  
+      strncatz (scratchFileName, "mem", sizeof(scratchFileName));
+      *q = 0;
+      strncatz(fullDstFileName, "mem", fullDstFileNameLen);    
       rename (scratchFileName, fullDstFileName);
     }
   if (system_ret)
@@ -1471,11 +1504,12 @@ assemble (char **envp)
 
     /* -o option overrides default name? */
     if (options.cc_only && fullDstFileName) {
-        strcpy (scratchFileName, fullDstFileName);
+        strncpyz (scratchFileName, fullDstFileName, sizeof(scratchFileName));
     } else {
         /* the assembled file gets the name of the first modul */
-        strcpy (scratchFileName, dstFileName);
-        strcat (scratchFileName, port->linker.rel_ext);
+        strncpyz (scratchFileName, dstFileName, sizeof(scratchFileName));
+        strncatz (scratchFileName, port->linker.rel_ext, 
+                 sizeof(scratchFileName));
     }
 
     if (port->assembler.do_assemble) {
@@ -1486,7 +1520,7 @@ assemble (char **envp)
                      options.debug ? port->assembler.debug_opts : port->assembler.plain_opts,
                      asmOptions);
     } else {
-       buildCmdLine2 (buffer, port->assembler.mcmd);
+       buildCmdLine2 (buffer, port->assembler.mcmd, sizeof(buffer));
     }
 
     if (my_system (buffer)) {
@@ -1498,8 +1532,10 @@ assemble (char **envp)
     /* TODO: most assembler don't have a -o parameter */
     /* -o option overrides default name? */
     if (options.cc_only && fullDstFileName) {
-        strcpy (scratchFileName, dstFileName);
-        strcat (scratchFileName, port->linker.rel_ext);
+        strncpyz (scratchFileName, dstFileName, sizeof(scratchFileName));
+        strncatz (scratchFileName, 
+                 port->linker.rel_ext,
+                 sizeof(scratchFileName));
         rename (scratchFileName, fullDstFileName);
     }
 }
@@ -1569,40 +1605,36 @@ preProcess (char **envp)
 
       setMainValue ("cppextraopts", join(preArgv));
 
-      if (preProcOnly)
-        {
-          if (fullDstFileName)
-           {
-              preOutName = Safe_strdup (fullDstFileName);
-           }
-        }
+      if (preProcOnly && fullDstFileName)
+       {
+         /* -E and -o given */
+         setMainValue ("cppoutfilename", fullDstFileName);
+       }
       else
-          preOutName = Safe_strdup (tempfilename ());
-
-      /* Have to set cppoutfilename to something, even if just pre-processing. */
-      setMainValue ("cppoutfilename", preOutName ? preOutName : "");
-      addSetHead (&tmpfileNameSet, preOutName);
+       {
+         /* Have to set cppoutfilename to something, even if piping */
+         setMainValue ("cppoutfilename", "");
+       }
 
       if (options.verbose)
        printf ("sdcc: Calling preprocessor...\n");
 
-      buildCmdLine2 (buffer, _preCmd);
+      buildCmdLine2 (buffer, _preCmd, sizeof(buffer));
 
-      if (my_system (buffer))
-       {
+      if (preProcOnly) {
+        if (my_system (buffer)) {
          exit (1);
        }
-      if (preProcOnly)
-        {
-         exit (0);
-        }
-      yyin = fopen (preOutName, "r");
-      if (yyin == NULL)
-        {
-          perror ("Preproc file not found\n");
+
+        exit (0);
+      }
+
+      yyin = my_popen (buffer);
+      if (yyin == NULL) {
+          perror ("Preproc file not found");
           exit (1);
-        }
-      addSetHead (&tmpfileSet, yyin);
+      }
+      addSetHead (&pipeSet, yyin);
     }
 
   return 0;
@@ -1617,8 +1649,8 @@ _setPaths (const char *pprefix)
       where expected.  If so, set.
   */
   getPathDifference (buffer, PREFIX, SDCC_INCLUDE_DIR);
-  strcpy (scratchFileName, pprefix);
-  strcat (scratchFileName, buffer);
+  strncpyz (scratchFileName, pprefix, sizeof(scratchFileName));
+  strncatz (scratchFileName, buffer, sizeof(scratchFileName));
 
   if (pathExists (scratchFileName))
     {
@@ -1630,8 +1662,8 @@ _setPaths (const char *pprefix)
     }
 
   getPathDifference (buffer, PREFIX, SDCC_LIB_DIR);
-  strcpy (scratchFileName, pprefix);
-  strcat (scratchFileName, buffer);
+  strncpyz (scratchFileName, pprefix, sizeof(scratchFileName));
+  strncatz (scratchFileName, buffer, sizeof(scratchFileName));
 
   if (pathExists (scratchFileName))
     {
@@ -1675,7 +1707,7 @@ _discoverPaths (const char *argv0)
    */
   if (strchr (argv0, DIR_SEPARATOR_CHAR))
     {
-      strcpy (scratchFileName, argv0);
+      strncpyz (scratchFileName, argv0, sizeof(scratchFileName));
       *strrchr (scratchFileName, DIR_SEPARATOR_CHAR) = '\0';
       setMainValue ("bindir", scratchFileName);
       ExePathList[0] = Safe_strdup (scratchFileName);
@@ -1683,8 +1715,8 @@ _discoverPaths (const char *argv0)
   else if (getenv (SDCCDIR_NAME) != NULL)
     {
       getPathDifference (buffer, PREFIX, BINDIR);
-      strcpy (scratchFileName, getenv (SDCCDIR_NAME));
-      strcat (scratchFileName, buffer);
+      strncpyz (scratchFileName, getenv (SDCCDIR_NAME), sizeof(scratchFileName));
+      strncatz (scratchFileName, buffer, sizeof(scratchFileName));
       setMainValue ("bindir", scratchFileName);
       ExePathList[0] = Safe_strdup (scratchFileName);
     }
@@ -1892,6 +1924,10 @@ main (int argc, char **argv, char **envp)
        printf ("sdcc: Generating code...\n");
 
       yyparse ();
+
+      pclose(yyin);
+      deleteSetItem(&pipeSet, yyin);
+
       if (fatalError) {
         exit (1);
       }