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_fin() finalizes a writer. */ static void grn_ts_writer_fin(grn_ctx *ctx, grn_ts_writer *writer) { size_t i; if (writer->bufs) { for (i = 0; i < writer->n_exprs; i++) { grn_ts_buf_fin(ctx, &writer->bufs[i]); } GRN_FREE(writer->bufs); } if (writer->names) { GRN_FREE(writer->names); } GRN_OBJ_FIN(ctx, &writer->name_buf); if (writer->exprs) { for (i = 0; i < writer->n_exprs; i++) { grn_ts_expr_close(ctx, writer->exprs[i]); } GRN_FREE(writer->exprs); } if (writer->parser) { grn_ts_expr_parser_close(ctx, writer->parser); } }