sdcc now understands both formats:
authorborutr <borutr@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Fri, 31 Oct 2003 10:32:26 +0000 (10:32 +0000)
committerborutr <borutr@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Fri, 31 Oct 2003 10:32:26 +0000 (10:32 +0000)
'# <line_number> <file_name>' and
'#line <line_number> <file_name>'

git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@2971 4a8a32a2-be11-0410-ad9d-d568d2c75423

src/SDCC.lex

index 04aacc53228d690872dfce68794e24679d22424d..3b537bbd198c6e885fedf527b55fbe0def7b46c2 100644 (file)
@@ -81,47 +81,47 @@ static int checkCurrFile(char *s);
 <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); }
@@ -134,29 +134,29 @@ static int checkCurrFile(char *s);
 "_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); }
@@ -169,8 +169,8 @@ static int checkCurrFile(char *s);
 "=="           { 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('='); }
@@ -192,13 +192,13 @@ static int checkCurrFile(char *s);
 "^"            { 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(); }
 \\ {
   int ch = input();
@@ -208,7 +208,7 @@ static int checkCurrFile(char *s);
     unput(ch);
   }
 }
-.                         { count()    ; }
+.              { count(); }
 %%
 
 /* flex 2.5.31 undefines yytext_ptr, so we have to define it again */
@@ -219,93 +219,97 @@ static int checkCurrFile(char *s);
 
 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)
@@ -320,7 +324,6 @@ static char *stringLiteral(void)
   else
     dbuf_set_size(&dbuf, 0);
 
-
   dbuf_append(&dbuf, "\"", 1);
   /* put into the buffer till we hit the first \" */
 
@@ -373,11 +376,11 @@ static char *stringLiteral(void)
         }
       }
 
-      if (!ch) 
+      if (!ch)
         goto out;
 
       if (ch != '\"') {
-        unput(ch) ;
+        unput(ch);
         goto out;
       }
       break;
@@ -395,19 +398,19 @@ out:
 
 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 */
 };
@@ -500,15 +503,15 @@ static void doPragma(int op, char *cp)
     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:
@@ -559,8 +562,9 @@ static void doPragma(int op, char *cp)
 
 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;
@@ -586,18 +590,18 @@ static int process_pragma(char *s)
   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))
@@ -621,15 +625,15 @@ static int process_pragma(char *s)
    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;
 }
 
@@ -643,20 +647,18 @@ int yywrap(void)
 
 int yyerror(char *s)
 {
-   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;
+  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;
 }