From: Dmitry Volyntsev Date: Fri, 17 Nov 2017 15:55:07 +0000 (+0300) Subject: Added support of oct literals. X-Git-Tag: 0.1.15~6 X-Git-Url: http://git.kaiwu.me/postgresql/log/contrib/postgres_fdw/static/gitweb.js?a=commitdiff_plain;h=f9c611fed673c683f1c406bf23bd06d754f6ed95;p=njs.git Added support of oct literals. --- diff --git a/njs/njs_lexer.c b/njs/njs_lexer.c index 71d89913..1b327ff8 100644 --- a/njs/njs_lexer.c +++ b/njs/njs_lexer.c @@ -543,19 +543,48 @@ njs_lexer_number(njs_lexer_t *lexer) p = lexer->start; c = p[-1]; - /* Hexadecimal literal values. */ + if (c == '0' && p != lexer->end) { - if (c == '0' && p != lexer->end && (*p == 'x' || *p == 'X')) { - p++; + /* Hexadecimal literal values. */ - if (p == lexer->end) { - return NJS_TOKEN_ILLEGAL; + if (*p == 'x' || *p == 'X') { + p++; + + if (p == lexer->end) { + return NJS_TOKEN_ILLEGAL; + } + + lexer->start = p; + lexer->number = njs_number_hex_parse(&lexer->start, lexer->end); + + return NJS_TOKEN_NUMBER; + } + + /* Octal literal values. */ + + if (*p == 'o') { + p++; + + if (p == lexer->end) { + return NJS_TOKEN_ILLEGAL; + } + + lexer->start = p; + lexer->number = njs_number_oct_parse(&lexer->start, lexer->end); + p = lexer->start; + + if (p < lexer->end && (*p == '8' || *p == '9')) { + return NJS_TOKEN_ILLEGAL; + } + + return NJS_TOKEN_NUMBER; } - lexer->start = p; - lexer->number = njs_number_hex_parse(&lexer->start, lexer->end); + /* Legacy Octal literals are deprecated. */ - return NJS_TOKEN_NUMBER; + if (*p >= '0' && *p <= '9') { + return NJS_TOKEN_ILLEGAL; + } } lexer->start = p - 1; diff --git a/njs/njs_number.c b/njs/njs_number.c index 15059a9e..affc5461 100644 --- a/njs/njs_number.c +++ b/njs/njs_number.c @@ -168,6 +168,34 @@ njs_number_dec_parse(u_char **start, u_char *end) } +uint64_t +njs_number_oct_parse(u_char **start, u_char *end) +{ + u_char c, *p; + uint64_t num; + + p = *start; + + num = 0; + + while (p < end) { + /* Values less than '0' become >= 208. */ + c = *p - '0'; + + if (nxt_slow_path(c > 7)) { + break; + } + + num = num * 8 + c; + p++; + } + + *start = p; + + return num; +} + + uint64_t njs_number_hex_parse(u_char **start, u_char *end) { diff --git a/njs/njs_number.h b/njs/njs_number.h index 3fabdcab..2c60fd99 100644 --- a/njs/njs_number.h +++ b/njs/njs_number.h @@ -13,6 +13,7 @@ uint32_t njs_value_to_index(njs_value_t *value); double njs_number_dec_parse(u_char **start, u_char *end); +uint64_t njs_number_oct_parse(u_char **start, u_char *end); uint64_t njs_number_hex_parse(u_char **start, u_char *end); int64_t njs_number_radix_parse(u_char **start, u_char *end, uint8_t radix); njs_ret_t njs_number_to_string(njs_vm_t *vm, njs_value_t *string, diff --git a/njs/test/njs_unit_test.c b/njs/test/njs_unit_test.c index f38d7dfa..da640509 100644 --- a/njs/test/njs_unit_test.c +++ b/njs/test/njs_unit_test.c @@ -121,6 +121,37 @@ static njs_unit_test_t njs_test[] = { nxt_string("+1\n"), nxt_string("1") }, + /* Octal Numbers. */ + + { nxt_string("0o0"), + nxt_string("0") }, + + { nxt_string("0o011"), + nxt_string("9") }, + + { nxt_string("-0o777"), + nxt_string("-511") }, + + /* Legacy Octal Numbers are deprecated. */ + + { nxt_string("00"), + nxt_string("SyntaxError: Unexpected token \"\" in 1") }, + + { nxt_string("08"), + nxt_string("SyntaxError: Unexpected token \"\" in 1") }, + + { nxt_string("09"), + nxt_string("SyntaxError: Unexpected token \"\" 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") }, + /* Hex Numbers. */ { nxt_string("0x0"),