grn_rc grn_ts_expr_parse(grn_ctx *ctx, grn_obj *table, grn_ts_str str, grn_ts_expr **expr) { grn_rc rc; grn_ts_expr *new_expr; grn_ts_expr_parser *parser; if (!ctx) { return GRN_INVALID_ARGUMENT; } if (!table || !grn_ts_obj_is_table(ctx, table) || (!str.ptr && str.size) || !expr) { GRN_TS_ERR_RETURN(GRN_INVALID_ARGUMENT, "invalid argument"); } rc = grn_ts_expr_parser_open(ctx, table, &parser); if (rc != GRN_SUCCESS) { return rc; } rc = grn_ts_expr_parser_parse(ctx, parser, str, &new_expr); grn_ts_expr_parser_close(ctx, parser); if (rc != GRN_SUCCESS) { return rc; } *expr = new_expr; return GRN_SUCCESS; }
/* grn_ts_writer_build() builds output expresions. */ static grn_rc grn_ts_writer_build(grn_ctx *ctx, grn_ts_writer *writer, grn_obj *table) { size_t i, n_names = grn_vector_size(ctx, &writer->name_buf); if (!n_names) { return GRN_SUCCESS; } writer->names = GRN_MALLOCN(grn_ts_str, n_names); if (!writer->names) { GRN_TS_ERR_RETURN(GRN_NO_MEMORY_AVAILABLE, "GRN_MALLOCN failed: %" GRN_FMT_SIZE " x %" GRN_FMT_SIZE, sizeof(grn_ts_str), n_names); } writer->exprs = GRN_MALLOCN(grn_ts_expr *, n_names); if (!writer->exprs) { GRN_TS_ERR_RETURN(GRN_NO_MEMORY_AVAILABLE, "GRN_MALLOCN failed: %" GRN_FMT_SIZE " x %" GRN_FMT_SIZE, sizeof(grn_ts_expr *), n_names); } for (i = 0; i < n_names; i++) { grn_rc rc; grn_ts_expr *new_expr; const char *name_ptr; size_t name_size = grn_vector_get_element(ctx, &writer->name_buf, i, &name_ptr, NULL, NULL); rc = grn_ts_expr_parser_parse(ctx, writer->parser, (grn_ts_str){ name_ptr, name_size }, &new_expr); if (rc != GRN_SUCCESS) { return rc; } writer->names[i].ptr = name_ptr; writer->names[i].size = name_size; writer->exprs[i] = new_expr; writer->n_exprs++; } return GRN_SUCCESS; }