Print this page
11972 resync smatch

@@ -91,13 +91,17 @@
         return buffer;
 }
 
 const char *show_ident(const struct ident *ident)
 {
-        static char buffer[256];
+        static char buff[4][256];
+        static int n;
+        char *buffer;
+
         if (!ident)
                 return "<noident>";
+        buffer = buff[3 & ++n];
         sprintf(buffer, "%.*s", ident->len, ident->name);
         return buffer;
 }
 
 static char *charstr(char *ptr, unsigned char c, unsigned char escape, unsigned char next)

@@ -127,11 +131,11 @@
 {
         static char buffer[4 * MAX_STRING + 3];
         char *ptr;
         int i;
 
-        if (!string->length)
+        if (!string || !string->length)
                 return "<bad_string>";
         ptr = buffer;
         *ptr++ = '"';
         for (i = 0; i < string->length-1; i++) {
                 const char *p = string->data + i;

@@ -447,10 +451,11 @@
 static struct token *mark_eof(stream_t *stream)
 {
         struct token *end;
 
         end = alloc_token(stream);
+        eof_token_entry.pos = end->pos;
         token_type(end) = TOKEN_STREAMEND;
         end->pos.newline = 1;
 
         eof_token_entry.next = &eof_token_entry;
         eof_token_entry.pos.newline = 1;

@@ -486,36 +491,24 @@
         Dot = 16,
         ValidSecond = 32,
         Quote = 64,
 };
 
-static const long cclass[257] = {
-        ['0' + 1 ... '7' + 1] = Digit | Hex,    /* \<octal> */
-        ['8' + 1 ... '9' + 1] = Digit | Hex,
+static const char cclass[257] = {
+        ['0' + 1 ... '9' + 1] = Digit | Hex,
         ['A' + 1 ... 'D' + 1] = Letter | Hex,
         ['E' + 1] = Letter | Hex | Exp, /* E<exp> */
         ['F' + 1] = Letter | Hex,
         ['G' + 1 ... 'O' + 1] = Letter,
         ['P' + 1] = Letter | Exp,       /* P<exp> */
         ['Q' + 1 ... 'Z' + 1] = Letter,
-        ['a' + 1 ... 'b' + 1] = Letter | Hex, /* \a, \b */
-        ['c' + 1 ... 'd' + 1] = Letter | Hex,
-        ['e' + 1] = Letter | Hex | Exp,/* \e, e<exp> */
-        ['f' + 1] = Letter | Hex,       /* \f */
-        ['g' + 1 ... 'm' + 1] = Letter,
-        ['n' + 1] = Letter,     /* \n */
-        ['o' + 1] = Letter,
+        ['a' + 1 ... 'd' + 1] = Letter | Hex,
+        ['e' + 1] = Letter | Hex | Exp, /* e<exp> */
+        ['f' + 1] = Letter | Hex,
+        ['g' + 1 ... 'o' + 1] = Letter,
         ['p' + 1] = Letter | Exp,       /* p<exp> */
-        ['q' + 1] = Letter,
-        ['r' + 1] = Letter,     /* \r */
-        ['s' + 1] = Letter,
-        ['t' + 1] = Letter,     /* \t */
-        ['u' + 1] = Letter,
-        ['v' + 1] = Letter,     /* \v */
-        ['w' + 1] = Letter,
-        ['x' + 1] = Letter,     /* \x<hex> */
-        ['y' + 1 ... 'z' + 1] = Letter,
+        ['q' + 1 ... 'z' + 1] = Letter,
         ['_' + 1] = Letter,
         ['.' + 1] = Dot | ValidSecond,
         ['=' + 1] = ValidSecond,
         ['+' + 1] = ValidSecond,
         ['-' + 1] = ValidSecond,

@@ -542,12 +535,11 @@
  */
 static int get_one_number(int c, int next, stream_t *stream)
 {
         struct token *token;
         static char buffer[4095];
-        char *p = buffer, *buf, *buffer_end = buffer + sizeof (buffer);
-        int len;
+        char *p = buffer, *buffer_end = buffer + sizeof (buffer);
 
         *p++ = c;
         for (;;) {
                 long class =  cclass[next + 1];
                 if (!(class & (Dot | Digit | Letter)))

@@ -571,17 +563,13 @@
                 buffer[0] = '1';
                 p = buffer + 1;
         }
 
         *p++ = 0;
-        len = p - buffer;
-        buf = __alloc_bytes(len);
-        memcpy(buf, buffer, len);
-
         token = stream->token;
         token_type(token) = TOKEN_NUMBER;
-        token->number = buf;
+        token->number = xmemdup(buffer, p - buffer);
         add_token(stream);
 
         return next;
 }
 

@@ -599,12 +587,12 @@
                 if (len < MAX_STRING)
                         buffer[len] = next;
                 len++;
                 if (next == '\n') {
                         warning(stream_pos(stream),
-                                "Newline in string or character constant");
-                        if (delim == '\'') /* assume it's lost ' */
+                                "missing terminating %c character", delim);
+                        /* assume delimiter is lost */
                                 break;
                 }
                 if (next == EOF) {
                         warning(stream_pos(stream),
                                 "End of file in middle of string");