susumu.yata
null+****@clear*****
Mon Sep 28 20:41:11 JST 2015
susumu.yata 2015-09-28 20:41:11 +0900 (Mon, 28 Sep 2015) New Revision: e56878a8118366d790f057c14686359e18548c41 https://github.com/groonga/groonga/commit/e56878a8118366d790f057c14686359e18548c41 Message: grn_ts: support number literals with signs GitHub: #404 Modified files: lib/ts.c Modified: lib/ts.c (+35 -3) =================================================================== --- lib/ts.c 2015-09-28 20:26:51 +0900 (2f54782) +++ lib/ts.c 2015-09-28 20:41:11 +0900 (5297b9f) @@ -159,6 +159,40 @@ grn_ts_str_is_value_name(grn_ts_str str) { !memcmp(str.ptr, GRN_COLUMN_NAME_VALUE, GRN_COLUMN_NAME_VALUE_LEN); } +/* + * grn_ts_str_has_number_prefix() returns whether or not a string starts with a + * number or not. + */ +static grn_ts_bool +grn_ts_str_has_number_prefix(grn_ts_str str) { + if (!str.size) { + return GRN_FALSE; + } + if (grn_ts_byte_is_decimal(str.ptr[0])) { + return GRN_TRUE; + } + if (str.size == 1) { + return GRN_FALSE; + } + switch (str.ptr[0]) { + case '+': case '-': { + if (grn_ts_byte_is_decimal(str.ptr[1])) { + return GRN_TRUE; + } + if (str.size == 2) { + return GRN_FALSE; + } + return (str.ptr[1] == '.') && grn_ts_byte_is_decimal(str.ptr[2]); + } + case '.': { + return grn_ts_byte_is_decimal(str.ptr[1]); + } + default: { + return GRN_FALSE; + } + } +} + /*------------------------------------------------------------- * grn_ts_buf. */ @@ -5043,9 +5077,7 @@ grn_ts_expr_parser_tokenize_next(grn_ctx *ctx, grn_ts_expr_parser *parser, if (!rest.size) { return grn_ts_expr_parser_tokenize_end(ctx, parser, rest, token); } - if (grn_ts_byte_is_decimal(rest.ptr[0]) || - ((rest.size >= 2) && (rest.ptr[0] == '.') && - grn_ts_byte_is_decimal(rest.ptr[1]))) { + if (grn_ts_str_has_number_prefix(rest)) { return grn_ts_expr_parser_tokenize_number(ctx, parser, rest, token); } if (rest.ptr[0] == '"') { -------------- next part -------------- HTML����������������������������...Download