what you give them. Help stamp out software-hoarding!
-------------------------------------------------------------------------*/
-%option noyywrap
-
-D [0-9]
-L [a-zA-Z_]
-H [a-fA-F0-9]
-E [Ee][+-]?{D}+
-FS (f|F|l|L)
-IS (u|U|l|L)*
-%{
+D [0-9]
+L [a-zA-Z_]
+H [a-fA-F0-9]
+E [Ee][+-]?{D}+
+FS (f|F|l|L)
+IS (u|U|l|L)*
+%{
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include "newalloc.h"
#include "dbuf.h"
-static char *stringLiteral(void);
-char *currFname;
+#define TKEYWORD(token) return (isTargetKeyword(yytext) ? token :\
+ check_type())
extern int lineno, column;
extern char *filename;
-int mylineno = 1;
-static void count(void);
-static int process_pragma(char *);
-#undef yywrap
-#ifndef YYPROTO
-
-#ifdef YY_USE_PROTOS
-#define YY_PROTO(proto) proto
-#else
-#define YY_PROTO(proto) ()
-#endif
-
-#endif
-
-int yywrap YY_PROTO((void))
-{
- return(1);
-}
+/* global definitions */
+char *currFname;
+int mylineno = 1;
-static void yyunput (int, char *);
+/* local definitions */
+static struct dbuf_s asmbuff;
-static void my_unput(char c)
-{
- yyunput(c, (yytext_ptr));
-}
-
-#define TKEYWORD(token) return (isTargetKeyword(yytext) ? token :\
- check_type())
-char *asmbuff=NULL;
-int asmbuffSize=0;
-char *asmp ;
+/* forward declarations */
+static char *stringLiteral(void);
+static void count(void);
+static int process_pragma(char *);
static int check_type(void);
static int isTargetKeyword(char *s);
-static int checkCurrFile (char *s);
-//extern int processPragma (char *);
-//extern int printListing (int );
-struct optimize save_optimize;
-struct options save_options;
+static int checkCurrFile(char *s);
%}
%x asm
%%
-"_asm" {
- count();
- asmp = asmbuff = realloc (asmbuff, INITIAL_INLINEASM);
- asmbuffSize=INITIAL_INLINEASM;
- BEGIN(asm) ;
+"_asm" {
+ count();
+ assert(asmbuff.alloc == 0 && asmbuff.len == 0 && asmbuff.buf == NULL);
+ dbuf_init(&asmbuff, INITIAL_INLINEASM);
+ BEGIN(asm);
}
-<asm>"_endasm" {
+<asm>"_endasm" {
count();
- *asmp = '\0';
- yylval.yyinline = strdup (asmbuff);
+ yylval.yyinline = dbuf_c_str(&asmbuff);
+ dbuf_detach(&asmbuff);
BEGIN(INITIAL);
return (INLINEASM);
}
-<asm>. {
- if (asmp-asmbuff >= asmbuffSize-2) {
- // increase the buffersize with 50%
- int size=asmp-asmbuff;
- asmbuffSize=asmbuffSize*3/2;
- asmbuff = realloc (asmbuff, asmbuffSize);
- asmp=asmbuff+size;
- }
- *asmp++ = yytext[0];
+<asm>\n {
+ count();
+ dbuf_append(&asmbuff, yytext, 1);
}
-<asm>\n {
- count();
- if (asmp-asmbuff >= asmbuffSize-3) {
- // increase the buffersize with 50%
- int size=asmp-asmbuff;
- asmbuffSize=asmbuffSize*3/2;
- asmbuff = realloc (asmbuff, asmbuffSize);
- asmp=asmbuff+size;
- }
- *asmp++ = '\n' ;
+<asm>. {
+ dbuf_append(&asmbuff, yytext, 1);
}
-"at" { count(); TKEYWORD(AT) ; }
-"auto" { count(); return(AUTO); }
-"bit" { count(); TKEYWORD(BIT) ; }
+"at" { count(); TKEYWORD(AT); }
+"auto" { count(); return(AUTO); }
+"bit" { count(); TKEYWORD(BIT); }
"break" { count(); return(BREAK); }
"case" { count(); return(CASE); }
"char" { count(); return(CHAR); }
"code" { count(); TKEYWORD(CODE); }
"const" { count(); return(CONST); }
"continue" { count(); return(CONTINUE); }
-"critical" { count(); TKEYWORD(CRITICAL); }
-"data" { count(); TKEYWORD(DATA); }
+"critical" { count(); TKEYWORD(CRITICAL); }
+"data" { count(); TKEYWORD(DATA); }
"default" { count(); return(DEFAULT); }
"do" { count(); return(DO); }
"double" { count(); werror(W_DOUBLE_UNSUPPORTED);return(FLOAT); }
"else" { count(); return(ELSE); }
"enum" { count(); return(ENUM); }
"extern" { count(); return(EXTERN); }
-"far" { count(); TKEYWORD(XDATA); }
-"eeprom" { count(); TKEYWORD(EEPROM); }
+"far" { count(); TKEYWORD(XDATA); }
+"eeprom" { count(); TKEYWORD(EEPROM); }
"float" { count(); return(FLOAT); }
-"flash" { count(); TKEYWORD(CODE);}
+"flash" { count(); TKEYWORD(CODE); }
"for" { count(); return(FOR); }
-"goto" { count(); return(GOTO); }
-"idata" { count(); TKEYWORD(IDATA);}
+"goto" { count(); return(GOTO); }
+"idata" { count(); TKEYWORD(IDATA); }
"if" { count(); return(IF); }
"int" { count(); return(INT); }
-"interrupt" { count(); return(INTERRUPT);}
-"nonbanked" { count(); TKEYWORD(NONBANKED);}
-"banked" { count(); TKEYWORD(BANKED);}
-"long" { count(); return(LONG); }
-"near" { count(); TKEYWORD(DATA);}
+"interrupt" { count(); return(INTERRUPT); }
+"nonbanked" { count(); TKEYWORD(NONBANKED); }
+"banked" { count(); TKEYWORD(BANKED); }
+"long" { count(); return(LONG); }
+"near" { count(); TKEYWORD(DATA); }
"pdata" { count(); TKEYWORD(PDATA); }
-"reentrant" { count(); TKEYWORD(REENTRANT);}
+"reentrant" { count(); TKEYWORD(REENTRANT); }
"register" { count(); return(REGISTER); }
"return" { count(); return(RETURN); }
-"sfr" { count(); TKEYWORD(SFR) ; }
-"sbit" { count(); TKEYWORD(SBIT) ; }
+"sfr" { count(); TKEYWORD(SFR); }
+"sbit" { count(); TKEYWORD(SBIT); }
"short" { count(); return(SHORT); }
"signed" { count(); return(SIGNED); }
"sizeof" { count(); return(SIZEOF); }
-"sram" { count(); TKEYWORD(XDATA);}
+"sram" { count(); TKEYWORD(XDATA); }
"static" { count(); return(STATIC); }
"struct" { count(); return(STRUCT); }
"switch" { count(); return(SWITCH); }
"_naked" { count(); TKEYWORD(NAKED); }
"while" { count(); return(WHILE); }
"xdata" { count(); TKEYWORD(XDATA); }
-"..." { count(); return(VAR_ARGS);}
-"__typeof" { count(); return TYPEOF;}
-"_JavaNative" { count(); TKEYWORD(JAVANATIVE);}
-"_overlay" { count(); TKEYWORD(OVERLAY);}
+"..." { count(); return(VAR_ARGS); }
+"__typeof" { count(); return TYPEOF; }
+"_JavaNative" { count(); TKEYWORD(JAVANATIVE); }
+"_overlay" { count(); TKEYWORD(OVERLAY); }
{L}({L}|{D})* { count(); return(check_type()); }
0[xX]{H}+{IS}? { count(); yylval.val = constVal(yytext); return(CONSTANT); }
0{D}+{IS}? { count(); yylval.val = constVal(yytext); return(CONSTANT); }
{D}+{IS}? { count(); yylval.val = constVal(yytext); return(CONSTANT); }
-'(\\.|[^\\'])+' { count();yylval.val = charVal (yytext); return(CONSTANT); /* ' make syntax highliter happy */}
+'(\\.|[^\\'])+' { count();yylval.val = charVal (yytext); return(CONSTANT); /* ' make syntax highliter happy */ }
{D}+{E}{FS}? { count(); yylval.val = constFloatVal(yytext);return(CONSTANT); }
{D}*"."{D}+({E})?{FS}? { count(); yylval.val = constFloatVal(yytext);return(CONSTANT); }
-{D}+"."{D}*({E})?{FS}? { count(); yylval.val = constFloatVal(yytext);return(CONSTANT); }
-\" { count(); yylval.val=strVal(stringLiteral()); return(STRING_LITERAL);}
+{D}+"."{D}*({E})?{FS}? { count(); yylval.val = constFloatVal(yytext);return(CONSTANT); }
+\" { count(); yylval.val=strVal(stringLiteral()); return(STRING_LITERAL); }
">>=" { count(); yylval.yyint = RIGHT_ASSIGN ; return(RIGHT_ASSIGN); }
-"<<=" { count(); yylval.yyint = LEFT_ASSIGN ; return(LEFT_ASSIGN) ; }
-"+=" { count(); yylval.yyint = ADD_ASSIGN ; return(ADD_ASSIGN) ; }
-"-=" { count(); yylval.yyint = SUB_ASSIGN ; return(SUB_ASSIGN) ; }
-"*=" { count(); yylval.yyint = MUL_ASSIGN ; return(MUL_ASSIGN) ; }
-"/=" { count(); yylval.yyint = DIV_ASSIGN ; return(DIV_ASSIGN) ; }
-"%=" { count(); yylval.yyint = MOD_ASSIGN ; return(MOD_ASSIGN) ; }
-"&=" { count(); yylval.yyint = AND_ASSIGN ; return(AND_ASSIGN) ; }
-"^=" { count(); yylval.yyint = XOR_ASSIGN ; return(XOR_ASSIGN) ; }
-"|=" { count(); yylval.yyint = OR_ASSIGN ; return(OR_ASSIGN) ; }
+"<<=" { count(); yylval.yyint = LEFT_ASSIGN ; return(LEFT_ASSIGN); }
+"+=" { count(); yylval.yyint = ADD_ASSIGN ; return(ADD_ASSIGN); }
+"-=" { count(); yylval.yyint = SUB_ASSIGN ; return(SUB_ASSIGN); }
+"*=" { count(); yylval.yyint = MUL_ASSIGN ; return(MUL_ASSIGN); }
+"/=" { count(); yylval.yyint = DIV_ASSIGN ; return(DIV_ASSIGN); }
+"%=" { count(); yylval.yyint = MOD_ASSIGN ; return(MOD_ASSIGN); }
+"&=" { count(); yylval.yyint = AND_ASSIGN ; return(AND_ASSIGN); }
+"^=" { count(); yylval.yyint = XOR_ASSIGN ; return(XOR_ASSIGN); }
+"|=" { count(); yylval.yyint = OR_ASSIGN ; return(OR_ASSIGN); }
">>" { count(); return(RIGHT_OP); }
"<<" { count(); return(LEFT_OP); }
"++" { count(); return(INC_OP); }
"==" { count(); return(EQ_OP); }
"!=" { count(); return(NE_OP); }
";" { count(); return(';'); }
-"{" { count(); NestLevel++ ; return('{'); }
-"}" { count(); NestLevel--; return('}'); }
+"{" { count(); NestLevel++ ; return('{'); }
+"}" { count(); NestLevel--; return('}'); }
"," { count(); return(','); }
":" { count(); return(':'); }
"=" { count(); return('='); }
"^" { count(); return('^'); }
"|" { count(); return('|'); }
"?" { count(); return('?'); }
-^#line.*"\n" { count(); checkCurrFile(yytext); }
-^#pragma.*"\n" { count(); process_pragma(yytext); }
+^#pragma.*"\n" { count(); process_pragma(yytext); }
+^(#line.*"\n")|(#.*"\n") { count(); checkCurrFile(yytext); }
-^[^(]+"("[0-9]+") : error"[^\n]+ { werror(E_PRE_PROC_FAILED,yytext);count(); }
-^[^(]+"("[0-9]+") : warning"[^\n]+ { werror(W_PRE_PROC_WARNING,yytext);count(); }
-"\r\n" { count(); }
-"\n" { count(); }
+^[^(]+"("[0-9]+") : error"[^\n]+ { werror(E_PRE_PROC_FAILED, yytext); count(); }
+^[^(]+"("[0-9]+") : warning"[^\n]+ { werror(W_PRE_PROC_WARNING, yytext); count(); }
+"\r\n" { count(); }
+"\n" { count(); }
[ \t\v\f] { count(); }
\\ {
- char ch=input();
- if (ch!='\n') {
- // that could have been removed by the preprocessor anyway
+ int ch = input();
+ if (ch != '\n') {
+ /* that could have been removed by the preprocessor anyway */
werror (W_STRAY_BACKSLASH, column);
- my_unput(ch);
+ unput(ch);
}
}
-. { count() ; }
+. { count(); }
%%
+/* flex 2.5.31 undefines yytext_ptr, so we have to define it again */
+#ifndef yytext_ptr
+#define yytext_ptr yytext
+#endif
+
+
static int checkCurrFile (char *s)
{
- char lineNum[10] ;
- int lNum ;
- char *tptr ;
-
- /* first check if this is a #line */
- if ( strncmp(s,"#line",5) )
- return 0 ;
-
- /* get to the line number */
- while (!isdigit(*s))
- s++ ;
- tptr = lineNum ;
- while (isdigit(*s))
- *tptr++ = *s++ ;
- *tptr = '\0';
- sscanf(lineNum,"%d",&lNum);
-
+ int lNum;
+ char *tptr;
+
+ /* skip '#' character */
+ if (*s++ != '#')
+ return 0;
+
+ /* check if this is a #line
+ this is not standard and can be removed in the future */
+#define LINE_STR "line"
+#define LINE_LEN ((sizeof LINE_STR) - 1)
+
+ if (strncmp(s, LINE_STR, LINE_LEN) == 0)
+ s += LINE_LEN;
+
+ /* get the line number */
+ lNum = strtol(s, &tptr, 10);
+ if (tptr == s || !isspace(*tptr))
+ return 0;
+ s = tptr;
+
/* now see if we have a file name */
- while (*s != '\"' && *s)
- s++ ;
-
+ while (*s != '\"' && *s)
+ s++;
+
/* if we don't have a filename then */
/* set the current line number to */
/* line number if printFlag is on */
- if (!*s) {
- lineno = mylineno = lNum ;
+ if (!*s) {
+ lineno = mylineno = lNum;
return 0;
}
-
+
/* if we have a filename then check */
/* if it is "standard in" if yes then */
/* get the currentfile name info */
s++ ;
/* in c1mode fullSrcFileName is NULL */
- if ( fullSrcFileName &&
- strncmp(s,fullSrcFileName,strlen(fullSrcFileName)) == 0) {
- lineno = mylineno = lNum;
- currFname = fullSrcFileName ;
- } else {
- char *sb = s;
- /* mark the end of the filename */
- while (*s != '"') s++;
- *s = '\0';
- currFname = strdup (sb);
- lineno = mylineno = lNum;
+ if (fullSrcFileName &&
+ strncmp(s, fullSrcFileName, strlen(fullSrcFileName)) == 0) {
+ lineno = mylineno = lNum;
+ currFname = fullSrcFileName;
+ } else {
+ char *sb = s;
+ /* mark the end of the filename */
+ while (*s != '"') s++;
+ *s = '\0';
+ currFname = strdup (sb);
+ lineno = mylineno = lNum;
}
filename = currFname ;
return 0;
}
-
+
int column = 0;
int plineIdx =0;
static void count(void)
{
int i;
- for (i = 0; yytext[i] != '\0'; i++) {
- if (yytext[i] == '\n') {
+ for (i = 0; yytext[i] != '\0'; i++) {
+ if (yytext[i] == '\n') {
column = 0;
- lineno = ++mylineno ;
+ lineno = ++mylineno;
}
- else
+ else
if (yytext[i] == '\t')
- column += 8 - (column % 8);
+ column += 8 - (column % 8);
else
- column++;
+ column++;
}
/* ECHO; */
}
static int check_type(void)
{
- /* check if it is in the typedef table */
- if (findSym(TypedefTab,NULL,yytext)) {
- strncpyz(yylval.yychar,yytext, SDCC_NAME_MAX);
- return (TYPE_NAME) ;
- }
- else {
- strncpyz (yylval.yychar,yytext, SDCC_NAME_MAX);
- return(IDENTIFIER);
- }
+ /* check if it is in the typedef table */
+ if (findSym(TypedefTab, NULL, yytext)) {
+ strncpyz(yylval.yychar, yytext, SDCC_NAME_MAX);
+ return (TYPE_NAME);
+ }
+ else {
+ strncpyz (yylval.yychar, yytext, SDCC_NAME_MAX);
+ return(IDENTIFIER);
+ }
}
/*
* Change by JTV 2001-05-19 to not concantenate strings
- * to support ANSI hex and octal escape sequences in string liteals
+ * to support ANSI hex and octal escape sequences in string liteals
*/
static char *stringLiteral(void)
else
dbuf_set_size(&dbuf, 0);
-
dbuf_append(&dbuf, "\"", 1);
/* put into the buffer till we hit the first \" */
/* find the next non whitespace character */
/* if that is a double quote then carry on */
dbuf_append(&dbuf, "\"", 1); /* Pass end of this string or substring to evaluator */
- while ((ch = input()) && (isspace(ch) || ch=='\\')) {
+ while ((ch = input()) && (isspace(ch) || ch == '\\')) {
switch (ch) {
case '\\':
if ((ch = input()) != '\n') {
werror(W_STRAY_BACKSLASH, column);
- my_unput(ch);
+ unput(ch);
}
else {
lineno = ++mylineno;
}
}
- if (!ch)
+ if (!ch)
goto out;
if (ch != '\"') {
- my_unput(ch) ;
+ unput(ch);
goto out;
}
break;
enum pragma_id {
P_SAVE = 1,
- P_RESTORE ,
+ P_RESTORE,
P_NOINDUCTION,
P_NOINVARIANT,
- P_INDUCTION ,
- P_STACKAUTO ,
- P_NOJTBOUND ,
- P_NOOVERLAY ,
+ P_INDUCTION,
+ P_STACKAUTO,
+ P_NOJTBOUND,
+ P_NOOVERLAY,
P_LESSPEDANTIC,
- P_NOGCSE ,
+ P_NOGCSE,
P_CALLEE_SAVES,
- P_EXCLUDE ,
- P_NOIV ,
- P_LOOPREV ,
+ P_EXCLUDE,
+ P_NOIV,
+ P_LOOPREV,
P_OVERLAY_ /* I had a strange conflict with P_OVERLAY while */
/* cross-compiling for MINGW32 with gcc 3.2 */
};
break;
case P_NOINDUCTION:
- optimize.loopInduction = 0 ;
+ optimize.loopInduction = 0;
break;
case P_NOINVARIANT:
- optimize.loopInvariant = 0 ;
+ optimize.loopInvariant = 0;
break;
case P_INDUCTION:
- optimize.loopInduction = 1 ;
+ optimize.loopInduction = 1;
break;
case P_STACKAUTO:
static int process_pragma(char *s)
{
-#define NELEM(x) (sizeof (x) / sizeof (x)[0])
-#define PRAGMA "#pragma"
+#define NELEM(x) (sizeof (x) / sizeof (x)[0])
+#define PRAGMA_STR "#pragma"
+#define PRAGMA_LEN ((sizeof PRAGMA_STR) - 1)
static struct pragma_s {
const char *name;
int i;
/* find the pragma */
- while (strncmp(s, PRAGMA, (sizeof PRAGMA) - 1))
+ while (strncmp(s, PRAGMA_STR, PRAGMA_LEN))
s++;
- s += (sizeof PRAGMA) - 1;
-
+ s += PRAGMA_LEN;
+
/* look for the directive */
while(isspace(*s))
s++;
cp = s;
/* look for the end of the directive */
- while ((!isspace(*s)) && (*s != '\n'))
- s++ ;
+ while ((!isspace(*s)) && (*s != '\n'))
+ s++ ;
/* First give the port a chance */
if (port->process_pragma && !port->process_pragma(cp))
of a target specific keyword */
static int isTargetKeyword(char *s)
{
- int i;
-
- if (port->keywords == NULL)
- return 0;
- for ( i = 0 ; port->keywords[i] ; i++ ) {
- if (strcmp(port->keywords[i],s) == 0)
- return 1;
- }
-
+ int i;
+
+ if (port->keywords == NULL)
+ return 0;
+ for (i = 0 ; port->keywords[i] ; i++ ) {
+ if (strcmp(port->keywords[i],s) == 0)
+ return 1;
+ }
+
return 0;
}
+int yywrap(void)
+{
+ if (!STACK_EMPTY(options_stack) || !STACK_EMPTY(optimize_stack))
+ werror(W_SAVE_RESTORE);
+
+ return 1;
+}
+
int yyerror(char *s)
{
- fflush(stdout);
-
- if (mylineno && filename) {
- if(options.vc_err_style)
- fprintf(stdout,"\n%s(%d) : %s: token -> '%s' ; column %d\n",
- filename,mylineno,
- s,yytext,column);
- else
- fprintf(stdout,"\n%s:%d: %s: token -> '%s' ; column %d\n",
- filename,mylineno,
- s,yytext,column);
- fatalError++;
- } else {
- /* this comes from an empy file, no problem */
- }
- return 0;
+ fflush(stdout);
+
+ if (mylineno && filename) {
+ if(options.vc_err_style)
+ fprintf(stderr, "\n%s(%d) : %s: token -> '%s' ; column %d\n",
+ filename, mylineno, s, yytext, column);
+ else
+ fprintf(stderr, "\n%s:%d: %s: token -> '%s' ; column %d\n",
+ filename, mylineno, s ,yytext, column);
+ fatalError++;
+ } else {
+ /* this comes from an empy file, no problem */
+ }
+ return 0;
}