X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCC.lex;h=edd1ee5dabcc6dd032800e0dc13ec2dfa17b730a;hb=06dc1e51d1f8aafff46e1ccfdd4e72d914e1d3a1;hp=9ff54cb70022877e4910ad770eb2305f37d39815;hpb=e6f797f8ccde60604461df6cbb869546fbfbbc2d;p=fw%2Fsdcc diff --git a/src/SDCC.lex b/src/SDCC.lex index 9ff54cb7..edd1ee5d 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 *); @@ -76,7 +75,10 @@ struct options save_options ; P_NOGCSE , P_CALLEE_SAVES, P_EXCLUDE , - P_LOOPREV + P_NOIV , + P_LOOPREV , + P_OVERLAY_ /* I had a strange conflict with P_OVERLAY while */ + /* cross-compiling for MINGW32 with gcc 3.2 */ }; %} @@ -91,8 +93,7 @@ struct options save_options ; "_endasm" { count(); *asmp = '\0'; - yylval.yyinline = malloc (strlen(asmbuff)+1); - strcpy(yylval.yyinline,asmbuff); + yylval.yyinline = strdup (asmbuff); BEGIN(INITIAL); return (INLINEASM); } @@ -171,11 +172,14 @@ struct options save_options ; "while" { count(); return(WHILE); } "xdata" { count(); TKEYWORD(XDATA); } "..." { 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); } +'(\\.|[^\\'])+' { 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); } @@ -243,7 +247,7 @@ struct options save_options ; } . { count() ; } %% - + int checkCurrFile ( char *s) { char lineNum[10] ; @@ -280,7 +284,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 { @@ -288,8 +294,7 @@ int checkCurrFile ( char *s) /* mark the end of the filename */ while (*s != '"') s++; *s = '\0'; - currFname = malloc (strlen(sb)+1); - strcpy(currFname,sb); + currFname = strdup (sb); lineno = yylineno = lNum; } filename = currFname ; @@ -320,11 +325,11 @@ int check_type() { /* check if it is in the typedef table */ if (findSym(TypedefTab,NULL,yytext)) { - strcpy(yylval.yychar,yytext); + strncpyz(yylval.yychar,yytext, SDCC_NAME_MAX); return (TYPE_NAME) ; } else { - strcpy (yylval.yychar,yytext); + strncpyz (yylval.yychar,yytext, SDCC_NAME_MAX); return(IDENTIFIER); } } @@ -406,6 +411,13 @@ char *stringLiteral () { } *str = '\0'; + /* If we aren't going to fix it, at least trap it. */ + if (strlen(strLitBuff) >= sizeof(strLitBuff)) + { + fprintf(stderr, "Internal error: strLitBuff overflowed.\n"); + exit(-1); + } + return strLitBuff; } @@ -453,9 +465,14 @@ void doPragma (int op, char *cp) case P_EXCLUDE: parseWithComma(options.excludeRegs, Safe_strdup(cp)); break; + case P_NOIV: + options.noiv = 1; + break; case P_LOOPREV: optimize.noLoopReverse = 1; break; + case P_OVERLAY_: + break; /* notyet */ } } @@ -536,6 +553,11 @@ int process_pragma(char *s) return 0; } + if (strncmp(cp,PRAGMA_NOIV,strlen(PRAGMA_NOIV)) == 0) { + doPragma(P_NOIV,cp+strlen(PRAGMA_NOIV)); + return 0; + } + if (strncmp(cp,PRAGMA_NOLOOPREV,strlen(PRAGMA_NOLOOPREV)) == 0) { doPragma(P_LOOPREV,NULL); return 0; @@ -567,10 +589,13 @@ int yyerror(char *s) { fflush(stdout); - if (yylineno && filename) - fprintf(stdout,"\n%s(%d) %s: token -> '%s' ; column %d\n", - filename,yylineno, - s,yytext,column); - fatalError++; + if (yylineno && filename) { + fprintf(stdout,"\n%s:%d: %s: token -> '%s' ; column %d\n", + filename,yylineno, + s,yytext,column); + fatalError++; + } else { + // this comes from an empy file, no problem + } return 0; }