Assembler: Fix CPP lineinfo interpreter
authorMichael Buesch <mb@bu3sch.de>
Tue, 21 Sep 2010 11:51:11 +0000 (13:51 +0200)
committerMichael Buesch <mb@bu3sch.de>
Tue, 21 Sep 2010 11:51:11 +0000 (13:51 +0200)
Signed-off-by: Michael Buesch <mb@bu3sch.de>
assembler/args.c
assembler/parser.y
assembler/scanner.l
assembler/util.h

index 56707a1ac9e9d61e44f8879d63ff41679a939234..3f45129dd8fd18ae59aa66c7cd9fe398e9d12f9d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *   Copyright (C) 2006-2007  Michael Buesch <mb@bu3sch.de>
+ *   Copyright (C) 2006-2010  Michael Buesch <mb@bu3sch.de>
  *
  *   This program is free software; you can redistribute it and/or modify
  *   it under the terms of the GNU General Public License version 2
index 3e83c19597763320c4bfb8327aabdd46fb0c5ad2..b5ef6a86c2e3d136d6f3f6938f2a2146e913e315 100644 (file)
@@ -1,7 +1,7 @@
 %{
 
 /*
- *   Copyright (C) 2006-2007  Michael Buesch <mb@bu3sch.de>
+ *   Copyright (C) 2006-2010  Michael Buesch <mb@bu3sch.de>
  *
  *   This program is free software; you can redistribute it and/or modify
  *   it under the terms of the GNU General Public License version 2
index 11f38907da743740a13996007436eb4fdfb5bafe..dc6e6083514700926853e0e782c1a6d0bb8fa935 100644 (file)
@@ -1,7 +1,7 @@
 %{
 
 /*
- *   Copyright (C) 2006-2007  Michael Buesch <mb@bu3sch.de>
+ *   Copyright (C) 2006-2010  Michael Buesch <mb@bu3sch.de>
  *
  *   This program is free software; you can redistribute it and/or modify
  *   it under the terms of the GNU General Public License version 2
 
 #include "parser.h"
 #include "main.h"
+#include "util.h"
 
 #include <stdio.h>
-
-#undef min
-#define min(x,y)       ((x) < (y) ? (x) : (y))
+#include <ctype.h>
 
 
 static void interpret_cppinfo(const char *);
@@ -30,7 +29,7 @@ static inline void log_current_line(void)
        size_t len;
 
        len = min(sizeof(cur_lineinfo.linecopy) - 1, strlen(yytext));
-       strncpy(cur_lineinfo.linecopy, yytext, len);
+       memcpy(cur_lineinfo.linecopy, yytext, len);
        cur_lineinfo.linecopy[len] = '\0';
 }
 
@@ -43,7 +42,7 @@ NEWLINE               ((\r)|(\n)|(\r\n))
 %%
 
 ^.*$                                   { log_current_line(); REJECT; }
-#\ [0-9]+\ \".*\"[ ]*[0-9]*{NEWLINE}   { interpret_cppinfo(yytext); }
+#{WS}+[0-9]+{WS}+\".*\"[0-9 \t]*{NEWLINE}      { interpret_cppinfo(yytext); }
 
 
 {WS}+                  { update_lineinfo(); /* whitespace */ }
@@ -157,36 +156,44 @@ tram                      { update_lineinfo(); return IVAL_TRAM; }
 %%
 
 struct lineinfo cur_lineinfo;
-//FIXME The linenumber sometimes is wrong.
+
+static inline const char * strip_leading_ws(const char *str)
+{
+       while (*str != '\0' && isspace(*str))
+               str++;
+       return str;
+}
 
 static void interpret_cppinfo(const char *str)
 {
        const char * const orig = str;
        char tmp[64];
-       char *found;
+       const char *found;
+       char *tail;
 
        /* This will interpret lines added by CPP.
         * They look like:
-        *     # 3 "file.asm" 1
+        *     # lineno "filename" flags...
         */
 
-       if (*str == '\0')
+       str = strip_leading_ws(str);
+       if (*str != '#')
                goto error;
        str++; /* skip # character */
+       str = strip_leading_ws(str);
        if (*str == '\0')
                goto error;
-       str++; /* skip whitespace */
 
        /* Line number */
        found = strchr(str, ' ');
        if (!found)
                goto error;
        memset(tmp, 0, sizeof(tmp));
-       memcpy(tmp, str, min(sizeof(tmp) - 1,
-                            (size_t)(found - str)));
-       cur_lineinfo.lineno = strtoul(tmp, NULL, 10) - 1;
-       str = found;
-       str++;
+       memcpy(tmp, str, min(sizeof(tmp) - 1, (size_t)(found - str)));
+       cur_lineinfo.lineno = strtoul(tmp, &tail, 0);
+       if (*tail != '\0')
+               goto error;
+       str = strip_leading_ws(found);
 
        /* File name */
        if (*str != '\"')
@@ -198,9 +205,10 @@ static void interpret_cppinfo(const char *str)
        if (!found)
                goto error;
        memset(cur_lineinfo.file, 0, sizeof(cur_lineinfo.file));
-       memcpy(cur_lineinfo.file, str,
-              min(sizeof(cur_lineinfo.file) - 1,
-                  (size_t)(found - str)));
+       memcpy(cur_lineinfo.file, str, min(sizeof(cur_lineinfo.file) - 1,
+                                          (size_t)(found - str)));
+
+       /* We ignore the flags. */
 
        return;
 error:
index a3d1a82b68766ca014385a5d9cb801b58c8a4712..25bbbdb61785bd5be97755c5d1c8b3cec5ed1ab8 100644 (file)
@@ -7,6 +7,11 @@
 
 #define ARRAY_SIZE(x)  (sizeof(x)/sizeof(x[0]))
 
+#undef min
+#undef max
+#define min(x,y)       ((x) < (y) ? (x) : (y))
+#define max(x,y)       ((x) > (y) ? (x) : (y))
+
 
 void dump(const char *data,
          size_t size,