Hacked const and volatile modifiers a bit.
[fw/sdcc] / src / SDCC.lex
index ab68168ece0719e59ea802e323f0fefad70800b8..edd1ee5dabcc6dd032800e0dc13ec2dfa17b730a 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 *);
@@ -76,8 +75,10 @@ struct options  save_options  ;
      P_NOGCSE    ,
      P_CALLEE_SAVES,
      P_EXCLUDE   ,
+     P_NOIV      ,
      P_LOOPREV   ,
-     P_OVERLAY
+     P_OVERLAY_             /* I had a strange conflict with P_OVERLAY while */
+                    /* cross-compiling for MINGW32 with gcc 3.2 */
  };
 
 %}
@@ -92,8 +93,7 @@ struct options  save_options  ;
 <asm>"_endasm" { 
   count();
   *asmp = '\0';
-  yylval.yyinline = malloc (strlen(asmbuff)+1);
-  strcpy(yylval.yyinline,asmbuff);
+  yylval.yyinline = strdup (asmbuff);
   BEGIN(INITIAL);
   return (INLINEASM);
 }
@@ -284,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 {
@@ -292,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 ;
@@ -324,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);
        }
 }
@@ -410,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;
 }
 
@@ -457,10 +465,13 @@ 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:
+    case P_OVERLAY_:
        break; /* notyet */
     }
 }
@@ -542,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;
@@ -573,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;
 }