* src/SDCCglue.h: make tmpfileNameSet available for preOutName
authorbernhardheld <bernhardheld@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Sat, 15 Feb 2003 23:23:56 +0000 (23:23 +0000)
committerbernhardheld <bernhardheld@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Sat, 15 Feb 2003 23:23:56 +0000 (23:23 +0000)
* src/SDCCmain.c (preProcess): make sure, that preOutName will be deleted;
make -V work again; --c1mode reads now from stdin
* doc/sdccman.lyx: added --c1mode
* support/Util/SDCCerr.c: new messages for c1 mode
* support/Util/SDCCerr.h: new messages for c1 mode
* src/SDCC.lex (checkCurrFile): test if fullSrcFileName is NULL for c1mode

git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@2274 4a8a32a2-be11-0410-ad9d-d568d2c75423

ChangeLog
doc/sdccman.lyx
src/SDCC.lex
src/SDCCglue.h
src/SDCCmain.c
support/Util/SDCCerr.c
support/Util/SDCCerr.h

index 5f69290e98e242dfe2f0bf5d75db2137610ba678..cdecb3ff492500091ed21cd241d15b1e9aa6dade 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2003-02-15  Bernhard Held <bernhard@bernhardheld.de>
+
+       * src/SDCCglue.h: make tmpfileNameSet available for preOutName
+       * src/SDCCmain.c (preProcess): make sure, that preOutName will be deleted;
+       make -V work again; --c1mode reads now from stdin
+       * doc/sdccman.lyx: added --c1mode
+       * support/Util/SDCCerr.c: new messages for c1 mode
+       * support/Util/SDCCerr.h: new messages for c1 mode
+       * src/SDCC.lex (checkCurrFile): test if fullSrcFileName is NULL for c1mode
+
 2003-02-15    <johan@balder>
 
        * src/asm.c: new options: --no-c-code-in-asm and --i-code-in-asm
index 961650e8f032473fbeec97370dbbe620305e408f..b961c03f6b1b3112e83bb261fbd9fb75c89b3a53 100644 (file)
@@ -2008,6 +2008,15 @@ Other Options
 \labelwidthstring 00.00.0000
 
 
+\series bold 
+--c1mode
+\series default 
+ reads the preprocessed source from standard input and compiles it.
+ The file name for the assembler output must be specified using the -o option.
+\layout List
+\labelwidthstring 00.00.0000
+
+
 \series bold 
 -E
 \series default 
index 723352b42b82d5710f9148dccb381c6ee48a5a95..a400a6f0ca928ae6391203ce377e48d1965b5cf2 100644 (file)
@@ -41,7 +41,6 @@ char *currFname;
 
 extern int lineno, column;
 extern char *filename ;
-extern char *fullSrcFileName ;
 int   yylineno = 1               ;
 void count()                     ;
 int process_pragma(char *);
@@ -286,7 +285,9 @@ int checkCurrFile ( char *s)
     /* get the currentfile name info    */
     s++ ;
 
-    if ( strncmp(s,fullSrcFileName,strlen(fullSrcFileName)) == 0) {
+    /* in c1mode fullSrcFileName is NULL */
+    if ( fullSrcFileName &&
+         strncmp(s,fullSrcFileName,strlen(fullSrcFileName)) == 0) {
       lineno = yylineno = lNum;                                        
       currFname = fullSrcFileName ;
     }  else {
index 6b3a3b3ce192cd32529b02ff0b650a80c7a884c4..e2a61cae0fd706032097d319c306325e550e8be6 100644 (file)
@@ -1,25 +1,25 @@
 /*-------------------------------------------------------------------------
 
-  SDCCglue.h - glues everything we have done together into one file.                 
+  SDCCglue.h - glues everything we have done together into one file.
                 Written By -  Sandeep Dutta . sandeep.dutta@usa.net (1998)
-               
+
    This program is free software; you can redistribute it and/or modify it
    under the terms of the GNU General Public License as published by the
    Free Software Foundation; either version 2, or (at your option) any
    later version.
-   
+
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
-   
+
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-   
+
    In other words, you are welcome to use, share and improve this program.
    You are forbidden to forbid anyone else to use, share and improve
-   what you give them.   Help stamp out software-hoarding!  
+   what you give them.   Help stamp out software-hoarding!
 -------------------------------------------------------------------------*/
 #include "SDCCglobl.h"
 #include "SDCCmem.h"
@@ -37,6 +37,7 @@ int printIvalCharPtr (symbol *, sym_link *, value *, FILE *);
 extern symbol *interrupts[];
 extern set *publics;
 extern set *tmpfileSet;
+extern set *tmpfileNameSet;
 
 void rm_tmpfiles (void);
 int 
index 6f53e3fcaf9544cbe3871d7fa4c75b92b09ad687..e6f0f3ba9b94a58e8b5c51371fc7c175921cbf55 100644 (file)
@@ -51,7 +51,7 @@ extern int yyparse ();
 FILE *srcFile;                 /* source file          */
 FILE *cdbFile = NULL;          /* debugger information output file */
 char *fullSrcFileName;         /* full name for the source file; */
-                               /* can be NULL while linking without compiling */
+                               /* can be NULL while c1mode or linking without compiling */
 char *fullDstFileName;         /* full name for the output file; */
                                /* only given by -o, otherwise NULL */
 char *dstFileName;             /* destination file name without extension */
@@ -75,8 +75,7 @@ char *libPaths[128];
 int nlibPaths = 0;
 char *relFiles[128];
 int nrelFiles = 0;
-bool verboseExec = FALSE;
-char *preOutName;
+static char *preOutName;
 
 /* uncomment JAMIN_DS390 to always override and use ds390 port
   for mcs51 work.  This is temporary, for compatibility testing. */
@@ -127,7 +126,7 @@ char DefaultExePath[128];
 #define OPTION_NO_CCODE_IN_ASM "--no-c-code-in-asm"
 #define OPTION_ICODE_IN_ASM    "--i-code-in-asm"
 
-static const OPTION 
+static const OPTION
 optionsTable[] = {
     { 'm',  NULL,                   NULL, "Set the port to use e.g. -mz80." },
     { 'p',  NULL,                   NULL, "Select port specific processor e.g. -mpic14 -p16f84" },
@@ -138,7 +137,7 @@ optionsTable[] = {
     { 'U',  NULL,                   NULL, NULL },
     { 'C',  NULL,                   NULL, "Preprocessor option" },
     { 'M',  NULL,                   NULL, "Preprocessor option" },
-    { 'V',  NULL,                   &verboseExec, "Execute verbosely.  Show sub commands as they are run" },
+    { 'V',  NULL,                   &options.verboseExec, "Execute verbosely.  Show sub commands as they are run" },
     { 'S',  NULL,                   &noAssemble, "Compile only; do not assemble or link" },
     { 'W',  NULL,                   NULL, "Pass through options to the pre-processor (p), assembler (a) or linker (l)" },
     { 'L',  NULL,                   NULL, "Add the next field to the library search path" },
@@ -192,7 +191,7 @@ optionsTable[] = {
     { 0,    "--debug",              &options.debug, "Enable debugging symbol output" },
     { 'v',  OPTION_VERSION,         NULL, "Display sdcc's version" },
     { 'E',  "--preprocessonly",     &preProcOnly, "Preprocess only, do not compile" },
-    { 0,    "--c1mode",             &options.c1mode, "Act in c1 mode.  The input is preprocessed code, the output is assembly code." },
+    { 0,    "--c1mode",             &options.c1mode, "Act in c1 mode.  The standard input is preprocessed code, the output is assembly code." },
     { 0,    "--help",               NULL, "Display this help" },
     { 0,    OPTION_CALLEE_SAVES,    NULL, "<func[,func,...]> Cause the called function to save registers insted of the caller" },
     { 0,    "--nostdlib",           &options.nostdlib, "Do not include the standard library directory in the search path" },
@@ -434,7 +433,7 @@ printUsage ()
              "Usage : sdcc [options] filename\n"
              "Options :-\n"
              );
-    
+
     printOptions(optionsTable);
 
     for (i = 0; i < NUM_PORTS; i++)
@@ -541,7 +540,7 @@ processFile (char *s)
     }
 
   /* otherwise depending on the file type */
-  if (strcmp (fext, ".c") == 0 || strcmp (fext, ".C") == 0 || options.c1mode)
+  if (strcmp (fext, ".c") == 0 || strcmp (fext, ".C") == 0)
     {
       /* source file name : not if we already have a
          source file */
@@ -1148,11 +1147,49 @@ parseCmdLine (int argc, char **argv)
 
       if (!port->parseOption (&argc, argv, &i))
        {
-         /* no option must be a filename */
-          processFile (argv[i]);
+          /* no option must be a filename */
+          if (options.c1mode)
+            {
+               werror (W_NO_FILE_ARG_IN_C1, argv[i]);
+            }
+        else
+            {
+               processFile (argv[i]);
+            }
        }
     }
 
+  /* some sanity checks in c1 mode */
+  if (options.c1mode)
+    {
+      int i;
+
+      if (fullSrcFileName)
+       {
+         fclose (srcFile);
+         werror (W_NO_FILE_ARG_IN_C1, fullSrcFileName);
+       }
+      fullSrcFileName = NULL;
+      for (i = 0; i < nrelFiles; ++i)
+       {
+         werror (W_NO_FILE_ARG_IN_C1, relFiles[i]);
+       }
+      for (i = 0; i < nlibFiles; ++i)
+       {
+         werror (W_NO_FILE_ARG_IN_C1, libFiles[i]);
+       }
+      nrelFiles = nlibFiles = 0;
+      if (options.cc_only || noAssemble || preProcOnly)
+       {
+         werror (W_ILLEGAL_OPT_COMBINATION);
+       }
+      options.cc_only = noAssemble = preProcOnly = 0;
+      if (!dstFileName)
+       {
+         werror (E_NEED_OPT_O_IN_C1);
+         exit (1);
+       }
+    }
   /* if no dstFileName given with -o, we've to find one: */
   if (!dstFileName)
     {
@@ -1473,9 +1510,11 @@ assemble (char **envp)
 static int
 preProcess (char **envp)
 {
-  preOutName = NULL;
-
-  if (!options.c1mode)
+  if (options.c1mode)
+    {
+      yyin = stdin;
+    }
+  else
     {
       /* if using external stack define the macro */
       if (options.useXstack)
@@ -1533,13 +1572,16 @@ preProcess (char **envp)
       if (preProcOnly)
         {
           if (fullDstFileName)
+           {
               preOutName = Safe_strdup (fullDstFileName);
+           }
         }
       else
           preOutName = Safe_strdup (tempfilename ());
 
       /* Have to set cppoutfilename to something, even if just pre-processing. */
       setMainValue ("cppoutfilename", preOutName ? preOutName : "");
+      addSetHead (&tmpfileNameSet, preOutName);
 
       if (options.verbose)
        printf ("sdcc: Calling preprocessor...\n");
@@ -1548,31 +1590,19 @@ preProcess (char **envp)
 
       if (my_system (buffer))
        {
-          // @FIX: Dario Vecchio 03-05-2001
-          if (preOutName)
-            {
-              unlink (preOutName);
-              Safe_free (preOutName);
-            }
-          // EndFix
          exit (1);
        }
-
       if (preProcOnly)
-      {
-       exit (0);
-      }
-    }
-  else
-    {
-      preOutName = fullSrcFileName;
-    }
-
-  yyin = fopen (preOutName, "r");
-  if (yyin == NULL)
-    {
-      perror ("Preproc file not found\n");
-      exit (1);
+        {
+         exit (0);
+        }
+      yyin = fopen (preOutName, "r");
+      if (yyin == NULL)
+        {
+          perror ("Preproc file not found\n");
+          exit (1);
+        }
+      addSetHead (&tmpfileSet, yyin);
     }
 
   return 0;
@@ -1664,7 +1694,7 @@ _discoverPaths (const char *argv0)
       ExePathList[0] = BINDIR;
     }
 
-  do 
+  do
     {
       /* Case 1 */
       if (getenv (SDCCDIR_NAME) != NULL)
@@ -1717,7 +1747,7 @@ initValues (void)
 
   setMainValue ("dstfilename", dstFileName);
   setMainValue ("fullsrcfilename", fullSrcFileName ? fullSrcFileName : "fullsrcfilename");
-  
+
   if (options.cc_only && fullDstFileName)
     /* compile + assemble and -o given: -o specifies name of object file */
     {
@@ -1832,8 +1862,7 @@ main (int argc, char **argv, char **envp)
   parseCmdLine (argc, argv);
 
   /* if no input then printUsage & exit */
-  if ((!options.c1mode && !fullSrcFileName && !nrelFiles) ||
-      (options.c1mode && !fullSrcFileName))
+  if (!options.c1mode && !fullSrcFileName && !nrelFiles)
     {
       printUsage ();
       exit (0);
@@ -1849,7 +1878,7 @@ main (int argc, char **argv, char **envp)
   initMem ();
   port->finaliseOptions ();
 
-  if (fullSrcFileName)
+  if (fullSrcFileName || options.c1mode)
     {
       preProcess (envp);
 
@@ -1863,17 +1892,8 @@ main (int argc, char **argv, char **envp)
        printf ("sdcc: Generating code...\n");
 
       yyparse ();
-
       if (fatalError) {
-        // @FIX: Dario Vecchio 03-05-2001
-        if (preOutName) {
-          if (yyin && yyin != stdin)
-            fclose (yyin);
-          unlink (preOutName);
-          Safe_free (preOutName);
-        }
-        // EndFix
-        return 1;
+        exit (1);
       }
 
       if (TARGET_IS_PIC) {
@@ -1897,21 +1917,11 @@ main (int argc, char **argv, char **envp)
           assemble (envp);
         }
     }
-
   closeDumpFiles();
 
   if (cdbFile)
     fclose (cdbFile);
 
-  if (yyin && yyin != stdin)
-    fclose (yyin);
-
-  if (preOutName && !options.c1mode)
-    {
-      unlink (preOutName);
-      Safe_free (preOutName);
-    }
-
   if (!options.cc_only &&
       !fatalError &&
       !noAssemble &&
index 5aac4a73a2f00ece48a41172fdf0ad47bc31987e..86ae987e0c50dbe3cc945df0c58acd06d7752cd6 100644 (file)
@@ -71,13 +71,13 @@ struct
    "FATAL Compiler Internal Error in file '%s' line number '%d' : %s \n"
    "Contact Author with source code" },
 { E_LVALUE_REQUIRED, ERROR_LEVEL_ERROR,
-   "'lvalue' required for '%s' operation ." },
+   "'lvalue' required for '%s' operation." },
 { E_TMPFILE_FAILED, ERROR_LEVEL_ERROR,
    "Creation of temp file failed" },
 { E_FUNCTION_EXPECTED, ERROR_LEVEL_ERROR,
    "called object is not a function" },
 { E_USING_ERROR, ERROR_LEVEL_ERROR,
-   "'using', 'interrupt' or 'reentrant' must follow a function definiton .'%s'" },
+   "'using', 'interrupt' or 'reentrant' must follow a function definiton.'%s'" },
 { E_SFR_INIT, ERROR_LEVEL_ERROR,
    "Absolute address & initial value both cannot be specified for\n"
    " a 'sfr','sbit' storage class, initial value ignored '%s'" },
@@ -114,7 +114,7 @@ struct
 { E_INT_REQD, ERROR_LEVEL_ERROR,
    "type must be INT for bit field definition" },
 { E_BITFLD_SIZE, ERROR_LEVEL_ERROR,
-   "bit field size greater than 16 . assuming 16" },
+   "bit field size greater than 16. assuming 16" },
 { W_TRUNCATION, ERROR_LEVEL_WARNING,
    "high order truncation might occur" },
 { E_CODE_WRITE, ERROR_LEVEL_ERROR,
@@ -226,7 +226,7 @@ struct
 { E_OP_UNKNOWN_SIZE, ERROR_LEVEL_ERROR,
    "unknown size for operand" },
 { W_LONG_UNSUPPORTED, ERROR_LEVEL_WARNING,
-   "'%s' 'long' not supported , declared as 'int' ." },
+   "'%s' 'long' not supported , declared as 'int'." },
 { E_LITERAL_GENERIC, ERROR_LEVEL_ERROR,
     //"illegal cast of LITERAL value to 'generic' pointer: assuming 'xdata' pointer" },
     "illegal cast of LITERAL value to 'generic' pointer" },
@@ -293,7 +293,7 @@ struct
 { W_UNKNOWN_FEXT, ERROR_LEVEL_WARNING,
    "don't know what to do with file '%s'. file extension unsupported" },
 { W_TOO_MANY_SRC, ERROR_LEVEL_WARNING,
-   "cannot compile more than one source file . file '%s' ignored" },
+   "cannot compile more than one source file. file '%s' ignored" },
 { I_CYCLOMATIC, ERROR_LEVEL_INFO,
    "function '%s', # edges %d , # nodes %d , cyclomatic complexity %d" },
 { E_DIVIDE_BY_ZERO, ERROR_LEVEL_ERROR,
@@ -374,6 +374,12 @@ struct
     "if-statement condition always true, if-statement not generated" },
 { E_PARAM_NAME_OMITTED, ERROR_LEVEL_ERROR,
     "in function %s: name omitted for parameter %d" },
+{ W_NO_FILE_ARG_IN_C1, ERROR_LEVEL_WARNING,
+    "only standard input is compiled in c1 mode. file '%s' ignored" },
+{ E_NEED_OPT_O_IN_C1, ERROR_LEVEL_ERROR,
+    "must specify assembler file name with -o in c1 mode" },
+{ W_ILLEGAL_OPT_COMBINATION, ERROR_LEVEL_WARNING,
+    "illegal combination of options (--c1mode, -E, -S -c)" },
 };
 
 /*
index fcd04ea873b4d08b0ea4eaa3bf66a39ba70cada7..ce20b85343400db201487adc2a1e763c9d688a28 100644 (file)
@@ -175,6 +175,9 @@ SDCCERR - SDCC Standard error handler
 #define W_CAST_STRUCT_PTR 157 /* pointer to different structure types */
 #define W_IF_ALWAYS_TRUE 158
 #define E_PARAM_NAME_OMITTED 159
+#define W_NO_FILE_ARG_IN_C1 160
+#define E_NEED_OPT_O_IN_C1 161
+#define W_ILLEGAL_OPT_COMBINATION 162
 
 /** Describes the maximum error level that will be logged.  Any level
  *  includes all of the levels listed after it.