susumu.yata
null+****@clear*****
Thu Sep 17 18:10:08 JST 2015
susumu.yata 2015-09-17 18:10:08 +0900 (Thu, 17 Sep 2015) New Revision: 43713eb46976feab0260efec4139ff501ebc079b https://github.com/groonga/groonga/commit/43713eb46976feab0260efec4139ff501ebc079b Message: grn_ts: use *_reserve_tokens() instead of *_push_token() Modified files: lib/ts.c Modified: lib/ts.c (+18 -9) =================================================================== --- lib/ts.c 2015-09-17 17:19:44 +0900 (c10c336) +++ lib/ts.c 2015-09-17 18:10:08 +0900 (9f7e0a9) @@ -4434,21 +4434,30 @@ grn_ts_expr_parser_tokenize_next(grn_ctx *ctx, grn_ts_expr_parser *parser, } } -/* grn_ts_expr_parser_push_token() appends a token. */ +/* + * grn_ts_expr_parser_reserve_tokens() extends a token buffer for a new token. + */ static grn_rc -grn_ts_expr_parser_push_token(grn_ctx *ctx, grn_ts_expr_parser *parser, - grn_ts_expr_token *token) { - size_t new_max_n_tokens, n_bytes; +grn_ts_expr_parser_reserve_tokens(grn_ctx *ctx, grn_ts_expr_parser *parser) { + size_t i, n_bytes, new_max_n_tokens; grn_ts_expr_token **new_tokens; - new_max_n_tokens = parser->max_n_tokens ? (parser->max_n_tokens * 2) : 1; + if (parser->n_tokens < parser->max_n_tokens) { + return GRN_SUCCESS; + } + new_max_n_tokens = parser->n_tokens * 2; + if (!new_max_n_tokens) { + new_max_n_tokens = 1; + } n_bytes = sizeof(grn_ts_expr_token *) * new_max_n_tokens; new_tokens = (grn_ts_expr_token **)GRN_REALLOC(parser->tokens, n_bytes); if (!new_tokens) { return GRN_NO_MEMORY_AVAILABLE; } + for (i = parser->n_tokens; i < new_max_n_tokens; i++) { + new_tokens[i] = NULL; + } parser->tokens = new_tokens; parser->max_n_tokens = new_max_n_tokens; - parser->tokens[parser->n_tokens++] = token; return GRN_SUCCESS; } @@ -4460,15 +4469,15 @@ grn_ts_expr_parser_tokenize(grn_ctx *ctx, grn_ts_expr_parser *parser, const char *end = str.ptr + str.size; grn_ts_expr_token *token; do { - grn_rc rc = grn_ts_expr_parser_tokenize_next(ctx, parser, rest, &token); + grn_rc rc = grn_ts_expr_parser_reserve_tokens(ctx, parser); if (rc != GRN_SUCCESS) { return rc; } - rc = grn_ts_expr_parser_push_token(ctx, parser, token); + rc = grn_ts_expr_parser_tokenize_next(ctx, parser, rest, &token); if (rc != GRN_SUCCESS) { - grn_ts_expr_token_close(ctx, token); return rc; } + parser->tokens[parser->n_tokens++] = token; rest.ptr = token->src.ptr + token->src.size; rest.size = end - rest.ptr; } while (token->type != GRN_TS_EXPR_END_TOKEN); -------------- next part -------------- HTML����������������������������... 다운로드