From: bernhardheld Date: Sat, 15 Feb 2003 23:23:56 +0000 (+0000) Subject: * src/SDCCglue.h: make tmpfileNameSet available for preOutName X-Git-Url: https://git.gag.com/?a=commitdiff_plain;h=315208ed05c5115661982da0deff5558c74042be;p=fw%2Fsdcc * 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 git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@2274 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- diff --git a/ChangeLog b/ChangeLog index 5f69290e..cdecb3ff 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2003-02-15 Bernhard Held + + * 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 * src/asm.c: new options: --no-c-code-in-asm and --i-code-in-asm diff --git a/doc/sdccman.lyx b/doc/sdccman.lyx index 961650e8..b961c03f 100644 --- a/doc/sdccman.lyx +++ b/doc/sdccman.lyx @@ -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 diff --git a/src/SDCC.lex b/src/SDCC.lex index 723352b4..a400a6f0 100644 --- a/src/SDCC.lex +++ b/src/SDCC.lex @@ -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 { diff --git a/src/SDCCglue.h b/src/SDCCglue.h index 6b3a3b3c..e2a61cae 100644 --- a/src/SDCCglue.h +++ b/src/SDCCglue.h @@ -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 diff --git a/src/SDCCmain.c b/src/SDCCmain.c index 6f53e3fc..e6f0f3ba 100644 --- a/src/SDCCmain.c +++ b/src/SDCCmain.c @@ -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, " 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 && diff --git a/support/Util/SDCCerr.c b/support/Util/SDCCerr.c index 5aac4a73..86ae987e 100644 --- a/support/Util/SDCCerr.c +++ b/support/Util/SDCCerr.c @@ -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)" }, }; /* diff --git a/support/Util/SDCCerr.h b/support/Util/SDCCerr.h index fcd04ea8..ce20b853 100644 --- a/support/Util/SDCCerr.h +++ b/support/Util/SDCCerr.h @@ -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.