+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
\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
extern int lineno, column;
extern char *filename ;
-extern char *fullSrcFileName ;
int yylineno = 1 ;
void count() ;
int process_pragma(char *);
/* 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 {
/*-------------------------------------------------------------------------
- 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"
extern symbol *interrupts[];
extern set *publics;
extern set *tmpfileSet;
+extern set *tmpfileNameSet;
void rm_tmpfiles (void);
int
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 */
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. */
#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" },
{ '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" },
{ 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" },
"Usage : sdcc [options] filename\n"
"Options :-\n"
);
-
+
printOptions(optionsTable);
for (i = 0; i < NUM_PORTS; i++)
}
/* 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 */
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)
{
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)
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");
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;
ExePathList[0] = BINDIR;
}
- do
+ do
{
/* Case 1 */
if (getenv (SDCCDIR_NAME) != NULL)
setMainValue ("dstfilename", dstFileName);
setMainValue ("fullsrcfilename", fullSrcFileName ? fullSrcFileName : "fullsrcfilename");
-
+
if (options.cc_only && fullDstFileName)
/* compile + assemble and -o given: -o specifies name of object file */
{
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);
initMem ();
port->finaliseOptions ();
- if (fullSrcFileName)
+ if (fullSrcFileName || options.c1mode)
{
preProcess (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) {
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 &&
"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'" },
{ 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,
{ 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" },
{ 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,
"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)" },
};
/*
#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.