Welcome! Log In Create A New Profile

Advanced

[njs] Added information about illegal token in number parsing.

July 03, 2018 08:50AM
details: http://hg.nginx.org/njs/rev/3aef480987d6
branches:
changeset: 552:3aef480987d6
user: Igor Sysoev <igor@sysoev.ru>
date: Tue Jul 03 15:48:03 2018 +0300
description:
Added information about illegal token in number parsing.

diffstat:

njs/njs_lexer.c | 61 +++++++++++++++++++++++++----------------------
njs/test/njs_unit_test.c | 26 ++++++++++----------
2 files changed, 46 insertions(+), 41 deletions(-)

diffs (195 lines):

diff -r f20bf1b5db20 -r 3aef480987d6 njs/njs_lexer.c
--- a/njs/njs_lexer.c Tue Jul 03 14:15:29 2018 +0300
+++ b/njs/njs_lexer.c Tue Jul 03 15:48:03 2018 +0300
@@ -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_c


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;
}


diff -r f20bf1b5db20 -r 3aef480987d6 njs/test/njs_unit_test.c
--- a/njs/test/njs_unit_test.c Tue Jul 03 14:15:29 2018 +0300
+++ b/njs/test/njs_unit_test.c Tue Jul 03 15:48:03 2018 +0300
@@ -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") },
_______________________________________________
nginx-devel mailing list
nginx-devel@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-devel
Subject Author Views Posted

[njs] Added information about illegal token in number parsing.

Igor Sysoev 511 July 03, 2018 08:50AM



Sorry, you do not have permission to post/reply in this forum.

Online Users

Guests: 46
Record Number of Users: 6 on February 13, 2018
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready