From: Alexander Borisov Date: Tue, 23 Apr 2019 15:10:37 +0000 (+0300) Subject: Added macro for converting surrogate pair to code point. X-Git-Tag: 0.3.2~51 X-Git-Url: http://www.kaiwu.me/postgresql/commit/?a=commitdiff_plain;h=44e9ad6b9d434ca031b15532e2eb703d7715bb81;p=njs.git Added macro for converting surrogate pair to code point. --- diff --git a/njs/njs_json.c b/njs/njs_json.c index e94d506a..203c236f 100644 --- a/njs/njs_json.c +++ b/njs/njs_json.c @@ -820,7 +820,7 @@ njs_json_parse_string(njs_json_parse_ctx_t *ctx, njs_value_t *value, return NULL; } - utf = 0x10000 + ((utf - 0xd800) << 10) + (utf_low - 0xdc00); + utf = njs_string_surrogate_pair(utf, utf_low); } s = nxt_utf8_encode(s, utf); diff --git a/njs/njs_parser_terminal.c b/njs/njs_parser_terminal.c index 77ade529..72226c0e 100644 --- a/njs/njs_parser_terminal.c +++ b/njs/njs_parser_terminal.c @@ -1048,10 +1048,8 @@ njs_parser_escape_string_create(njs_vm_t *vm, njs_parser_t *parser, src++; } - /* Surrogate pair. */ - if (cp_pair != 0) { - cp = 0x10000 + ((cp_pair - 0xd800) << 10) + (cp - 0xdc00); + cp = njs_string_surrogate_pair(cp_pair, cp); cp_pair = 0; } else if (cp >= 0xd800 && cp <= 0xdfff) { @@ -1184,14 +1182,12 @@ njs_parser_escape_string_calc_length(njs_vm_t *vm, njs_parser_t *parser, } } - /* Surrogate pair. */ - if (cp_pair != 0) { if (nxt_slow_path(cp < 0xdc00 || cp > 0xdfff)) { goto invalid_pair; } - cp = 0x10000 + ((cp_pair - 0xd800) << 10) + (cp - 0xdc00); + cp = njs_string_surrogate_pair(cp_pair, cp); cp_pair = 0; } else if (cp >= 0xd800 && cp <= 0xdfff) { diff --git a/njs/njs_string.h b/njs/njs_string.h index f3c64621..bf227d91 100644 --- a/njs/njs_string.h +++ b/njs/njs_string.h @@ -27,6 +27,10 @@ /* The maximum signed int32_t. */ #define NJS_STRING_MAX_LENGTH 0x7fffffff +/* Converting surrogate pair to code point. */ +#define njs_string_surrogate_pair(high, low) \ + (0x10000 + ((high - 0xd800) << 10) + (low - 0xdc00)) + /* * NJS_STRING_MAP_STRIDE should be power of two to use shift and binary * AND operations instead of division and remainder operations but no