]> git.kaiwu.me - njs.git/commitdiff
Added information about illegal token in number parsing.
authorIgor Sysoev <igor@sysoev.ru>
Tue, 3 Jul 2018 12:48:03 +0000 (15:48 +0300)
committerIgor Sysoev <igor@sysoev.ru>
Tue, 3 Jul 2018 12:48:03 +0000 (15:48 +0300)
njs/njs_lexer.c
njs/test/njs_unit_test.c

index 7c60b02a4b900aa2a3280add676d33f66ac3dcca..8e22f309eddb71bea4de7315f65a434e33e8c52d 100644 (file)
@@ -21,7 +21,7 @@ struct njs_lexer_multi_s {
 static njs_token_t njs_lexer_next_token(njs_lexer_t *lexer);
 static njs_token_t njs_lexer_word(njs_lexer_t *lexer, u_char c);
 static njs_token_t njs_lexer_string(njs_lexer_t *lexer, u_char quote);
-static njs_token_t njs_lexer_number(njs_lexer_t *lexer);
+static njs_token_t njs_lexer_number(njs_lexer_t *lexer, u_char c);
 static njs_token_t njs_lexer_multi(njs_lexer_t *lexer,
     njs_token_t token, nxt_uint_t n, const njs_lexer_multi_t *multi);
 static njs_token_t njs_lexer_division(njs_lexer_t *lexer,
@@ -316,7 +316,7 @@ njs_lexer_next_token(njs_lexer_t *lexer)
             return njs_lexer_string(lexer, c);
 
         case NJS_TOKEN_DIGIT:
-            return njs_lexer_number(lexer);
+            return njs_lexer_number(lexer, c);
 
         case NJS_TOKEN_ASSIGNMENT:
             n = nxt_nitems(njs_assignment_token),
@@ -523,12 +523,11 @@ njs_lexer_string(njs_lexer_t *lexer, u_char quote)
 
 
 static njs_token_t
-njs_lexer_number(njs_lexer_t *lexer)
+njs_lexer_number(njs_lexer_t *lexer, u_char c)
 {
-    u_char  c, *p;
+    const u_char  *p;
 
     p = lexer->start;
-    c = p[-1];
 
     if (c == '0' && p != lexer->end) {
 
@@ -538,14 +537,12 @@ njs_lexer_number(njs_lexer_t *lexer)
             p++;
 
             if (p == lexer->end) {
-                return NJS_TOKEN_ILLEGAL;
+                goto illegal_token;
             }
 
-            lexer->start = p;
-            lexer->number = njs_number_hex_parse((const u_char **) &lexer->start,
-                                                 lexer->end);
+            lexer->number = njs_number_hex_parse(&p, lexer->end);
 
-            return NJS_TOKEN_NUMBER;
+            goto done;
         }
 
         /* Octal literal values. */
@@ -554,19 +551,16 @@ njs_lexer_number(njs_lexer_t *lexer)
             p++;
 
             if (p == lexer->end) {
-                return NJS_TOKEN_ILLEGAL;
+                goto illegal_token;
             }
 
-            lexer->start = p;
-            lexer->number = njs_number_oct_parse((const u_char **) &lexer->start,
-                                                 lexer->end);
-            p = lexer->start;
+            lexer->number = njs_number_oct_parse(&p, lexer->end);
 
             if (p < lexer->end && (*p == '8' || *p == '9')) {
-                return NJS_TOKEN_ILLEGAL;
+                goto illegal_trailer;
             }
 
-            return NJS_TOKEN_NUMBER;
+            goto done;
         }
 
         /* Binary literal values. */
@@ -575,33 +569,44 @@ njs_lexer_number(njs_lexer_t *lexer)
             p++;
 
             if (p == lexer->end) {
-                return NJS_TOKEN_ILLEGAL;
+                goto illegal_token;
             }
 
-            lexer->start = p;
-            lexer->number = njs_number_bin_parse((const u_char **) &lexer->start,
-                                                 lexer->end);
-            p = lexer->start;
+            lexer->number = njs_number_bin_parse(&p, lexer->end);
 
             if (p < lexer->end && (*p >= '2' && *p <= '9')) {
-                return NJS_TOKEN_ILLEGAL;
+                goto illegal_trailer;
             }
 
-            return NJS_TOKEN_NUMBER;
+            goto done;
         }
 
         /* Legacy Octal literals are deprecated. */
 
         if (*p >= '0' && *p <= '9') {
-            return NJS_TOKEN_ILLEGAL;
+            goto illegal_trailer;
         }
     }
 
-    lexer->start = p - 1;
-    lexer->number = njs_number_dec_parse((const u_char **) &lexer->start,
-                                         lexer->end);
+    p--;
+    lexer->number = njs_number_dec_parse(&p, lexer->end);
+
+done:
+
+    lexer->start = (u_char *) p;
 
     return NJS_TOKEN_NUMBER;
+
+illegal_trailer:
+
+    p++;
+
+illegal_token:
+
+    lexer->text.start = lexer->start - 1;
+    lexer->text.length = p - lexer->text.start;
+
+    return NJS_TOKEN_ILLEGAL;
 }
 
 
index b82085f85cf3b76b56d9b449968cafde9ac3b4a7..9027d1b50941d7f8bdaf0647083e2ff0f62e51a8 100644 (file)
@@ -127,25 +127,25 @@ static njs_unit_test_t  njs_test[] =
     { nxt_string("-0O777"),
       nxt_string("-511") },
 
+    { nxt_string("0o"),
+      nxt_string("SyntaxError: Unexpected token \"0o\" in 1") },
+
+    { nxt_string("0O778"),
+      nxt_string("SyntaxError: Unexpected token \"0O778\" in 1") },
+
     /* Legacy Octal Numbers are deprecated. */
 
     { nxt_string("00"),
-      nxt_string("SyntaxError: Unexpected token \"\" in 1") },
+      nxt_string("SyntaxError: Unexpected token \"00\" in 1") },
 
     { nxt_string("08"),
-      nxt_string("SyntaxError: Unexpected token \"\" in 1") },
+      nxt_string("SyntaxError: Unexpected token \"08\" in 1") },
 
     { nxt_string("09"),
-      nxt_string("SyntaxError: Unexpected token \"\" in 1") },
+      nxt_string("SyntaxError: Unexpected token \"09\" in 1") },
 
     { nxt_string("0011"),
-      nxt_string("SyntaxError: Unexpected token \"\" in 1") },
-
-    { nxt_string("0o"),
-      nxt_string("SyntaxError: Unexpected token \"\" in 1") },
-
-    { nxt_string("0O778"),
-      nxt_string("SyntaxError: Unexpected token \"\" in 1") },
+      nxt_string("SyntaxError: Unexpected token \"00\" in 1") },
 
     /* Binary Numbers. */
 
@@ -162,10 +162,10 @@ static njs_unit_test_t  njs_test[] =
       nxt_string("-255") },
 
     { nxt_string("0b"),
-      nxt_string("SyntaxError: Unexpected token \"\" in 1") },
+      nxt_string("SyntaxError: Unexpected token \"0b\" in 1") },
 
     { nxt_string("0B12"),
-      nxt_string("SyntaxError: Unexpected token \"\" in 1") },
+      nxt_string("SyntaxError: Unexpected token \"0B12\" in 1") },
 
     /* Hex Numbers. */
 
@@ -182,7 +182,7 @@ static njs_unit_test_t  njs_test[] =
       nxt_string("48879") },
 
     { nxt_string("0x"),
-      nxt_string("SyntaxError: Unexpected token \"\" in 1") },
+      nxt_string("SyntaxError: Unexpected token \"0x\" in 1") },
 
     { nxt_string("0xffff."),
       nxt_string("SyntaxError: Unexpected token \"\" in 1") },