From: Valentin Bartenev Date: Sun, 1 Jul 2018 07:01:53 +0000 (+0300) Subject: Added support of binary literals. X-Git-Url: http://www.kaiwu.me/postgresql/commit/?a=commitdiff_plain;h=303c987e01d8cc119b0098a4e9a5cc0944175258;p=njs.git Added support of binary literals. --- diff --git a/njs/njs_lexer.c b/njs/njs_lexer.c index 2b17c4dd..7c60b02a 100644 --- a/njs/njs_lexer.c +++ b/njs/njs_lexer.c @@ -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 --git a/njs/njs_number.c b/njs/njs_number.c index b9e642a6..b49e8d44 100644 --- a/njs/njs_number.c +++ b/njs/njs_number.c @@ -183,6 +183,35 @@ 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) +{ + 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) { diff --git a/njs/njs_number.h b/njs/njs_number.h index a1edda84..2b1fde27 100644 --- a/njs/njs_number.h +++ b/njs/njs_number.h @@ -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 --git a/njs/test/njs_unit_test.c b/njs/test/njs_unit_test.c index 0a898ae3..c690b34b 100644 --- a/njs/test/njs_unit_test.c +++ b/njs/test/njs_unit_test.c @@ -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"),