details: http://hg.nginx.org/njs/rev/e210675daceb branches: changeset: 545:e210675daceb user: Valentin Bartenev <vb...@nginx.com> date: Sun Jul 01 10:01:53 2018 +0300 description: Added support of binary literals.
diffstat: njs/njs_lexer.c | 21 +++++++++++++++++++++ njs/njs_number.c | 29 +++++++++++++++++++++++++++++ njs/njs_number.h | 1 + njs/test/njs_unit_test.c | 20 ++++++++++++++++++++ 4 files changed, 71 insertions(+), 0 deletions(-) diffs (111 lines): diff -r 1cdf9c1a377d -r e210675daceb njs/njs_lexer.c --- a/njs/njs_lexer.c Sun Jul 01 09:59:45 2018 +0300 +++ b/njs/njs_lexer.c Sun Jul 01 10:01:53 2018 +0300 @@ -569,6 +569,27 @@ njs_lexer_number(njs_lexer_t *lexer) return NJS_TOKEN_NUMBER; } + /* Binary literal values. */ + + if (*p == 'b' || *p == 'B') { + p++; + + if (p == lexer->end) { + return NJS_TOKEN_ILLEGAL; + } + + lexer->start = p; + lexer->number = njs_number_bin_parse((const u_char **) &lexer->start, + lexer->end); + p = lexer->start; + + if (p < lexer->end && (*p >= '2' && *p <= '9')) { + return NJS_TOKEN_ILLEGAL; + } + + return NJS_TOKEN_NUMBER; + } + /* Legacy Octal literals are deprecated. */ if (*p >= '0' && *p <= '9') { diff -r 1cdf9c1a377d -r e210675daceb njs/njs_number.c --- a/njs/njs_number.c Sun Jul 01 09:59:45 2018 +0300 +++ b/njs/njs_number.c Sun Jul 01 10:01:53 2018 +0300 @@ -184,6 +184,35 @@ njs_number_oct_parse(const u_char **star uint64_t +njs_number_bin_parse(const u_char **start, const u_char *end) +{ + u_char c; + uint64_t num; + const u_char *p; + + p = *start; + + num = 0; + + while (p < end) { + /* Values less than '0' become >= 208. */ + c = *p - '0'; + + if (nxt_slow_path(c > 1)) { + break; + } + + num = num * 2 + c; + p++; + } + + *start = p; + + return num; +} + + +uint64_t njs_number_hex_parse(const u_char **start, const u_char *end) { u_char c; diff -r 1cdf9c1a377d -r e210675daceb njs/njs_number.h --- a/njs/njs_number.h Sun Jul 01 09:59:45 2018 +0300 +++ b/njs/njs_number.h Sun Jul 01 10:01:53 2018 +0300 @@ -14,6 +14,7 @@ uint32_t njs_value_to_index(const njs_value_t *value); double njs_number_dec_parse(const u_char **start, const u_char *end); uint64_t njs_number_oct_parse(const u_char **start, const u_char *end); +uint64_t njs_number_bin_parse(const u_char **start, const u_char *end); uint64_t njs_number_hex_parse(const u_char **start, const u_char *end); int64_t njs_number_radix_parse(const u_char **start, const u_char *end, uint8_t radix); diff -r 1cdf9c1a377d -r e210675daceb njs/test/njs_unit_test.c --- a/njs/test/njs_unit_test.c Sun Jul 01 09:59:45 2018 +0300 +++ b/njs/test/njs_unit_test.c Sun Jul 01 10:01:53 2018 +0300 @@ -147,6 +147,26 @@ static njs_unit_test_t njs_test[] = { nxt_string("0O778"), nxt_string("SyntaxError: Unexpected token \"\" in 1") }, + /* Binary Numbers. */ + + { nxt_string("0b0"), + nxt_string("0") }, + + { nxt_string("0B10"), + nxt_string("2") }, + + { nxt_string("0b0101"), + nxt_string("5") }, + + { nxt_string("-0B11111111"), + nxt_string("-255") }, + + { nxt_string("0b"), + nxt_string("SyntaxError: Unexpected token \"\" in 1") }, + + { nxt_string("0B12"), + nxt_string("SyntaxError: Unexpected token \"\" in 1") }, + /* Hex Numbers. */ { nxt_string("0x0"), _______________________________________________ nginx-devel mailing list nginx-devel@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-devel