X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fcqltransform.c;h=b5fe140e12ddfd652551dab643b9b67940ad7dfb;hp=f560445d9708a4aa33a85d3e7a1d7451364385a8;hb=a2a4b952e0742e1527fcb8c9a0e6c85fe35c65f8;hpb=9d12e94d17d3c31124221dc914aa36c9d8154643 diff --git a/src/cqltransform.c b/src/cqltransform.c index f560445..b5fe140 100644 --- a/src/cqltransform.c +++ b/src/cqltransform.c @@ -44,7 +44,7 @@ struct cql_transform_t_ { struct cql_prop_entry *entry; yaz_tok_cfg_t tok_cfg; int error; - char *addinfo; + WRBUF addinfo; NMEM nmem; }; @@ -54,7 +54,7 @@ cql_transform_t cql_transform_create(void) cql_transform_t ct = (cql_transform_t) xmalloc(sizeof(*ct)); ct->tok_cfg = yaz_tok_cfg_create(); ct->error = 0; - ct->addinfo = 0; + ct->addinfo = wrbuf_alloc(); ct->entry = 0; ct->nmem = nmem_create(); return ct; @@ -191,9 +191,8 @@ static int cql_transform_parse_tok_line(cql_transform_t ct, { ODR pr = odr_createmem(ODR_PRINT); Z_AttributeList *alp = &(*pp)->attr_list; - odr_setprint(pr, yaz_log_file()); + odr_setprint_noclose(pr, yaz_log_file()); z_AttributeList(pr, &alp, 0, 0); - odr_setprint(pr, 0); odr_destroy(pr); } } @@ -267,7 +266,7 @@ void cql_transform_close(cql_transform_t ct) xfree(pe); pe = pe_next; } - xfree(ct->addinfo); + wrbuf_destroy(ct->addinfo); yaz_tok_cfg_destroy(ct->tok_cfg); nmem_destroy(ct->nmem); xfree(ct); @@ -382,7 +381,7 @@ static const char *cql_lookup_property(cql_transform_t ct, return 0; } -int cql_pr_attr_uri(cql_transform_t ct, char **addinfo, const char *category, +int cql_pr_attr_uri(cql_transform_t ct, WRBUF addinfo, const char *category, const char *uri, const char *val, const char *default_val, void (*pr)(const char *buf, void *client_data), void *client_data, @@ -464,11 +463,11 @@ int cql_pr_attr_uri(cql_transform_t ct, char **addinfo, const char *category, if (errcode == 0) return 1; /* signal error, but do not set addinfo */ if (val) - *addinfo = xstrdup(val); + wrbuf_puts(addinfo, val); return errcode; } -int cql_pr_attr(cql_transform_t ct, char **addinfo, const char *category, +int cql_pr_attr(cql_transform_t ct, WRBUF addinfo, const char *category, const char *val, const char *default_val, void (*pr)(const char *buf, void *client_data), void *client_data, @@ -491,7 +490,7 @@ static void cql_pr_int(int val, static int cql_pr_prox(cql_transform_t ct, struct cql_node *mods, - char **addinfo, + WRBUF addinfo, void (*pr)(const char *buf, void *client_data), void *client_data) { @@ -523,7 +522,7 @@ static int cql_pr_prox(cql_transform_t ct, struct cql_node *mods, proxrel = 6; else { - *addinfo = xstrdup(relation); + wrbuf_puts(addinfo, relation); return YAZ_SRW_UNSUPP_PROX_RELATION; } } @@ -543,13 +542,13 @@ static int cql_pr_prox(cql_transform_t ct, struct cql_node *mods, unit = 8; else { - *addinfo = xstrdup(term); + wrbuf_puts(addinfo, term); return YAZ_SRW_UNSUPP_PROX_UNIT; } } else { - *addinfo = xstrdup(name); + wrbuf_puts(addinfo, name); return YAZ_SRW_UNSUPP_BOOLEAN_MODIFIER; } mods = mods->u.st.modifiers; @@ -580,7 +579,7 @@ static int has_modifier(struct cql_node *cn, const char *name) { } static int emit_term(cql_transform_t ct, - struct cql_node *cn, char **addinfo, + struct cql_node *cn, WRBUF addinfo, const char *term, int length, void (*pr)(const char *buf, void *client_data), void *client_data) @@ -778,7 +777,7 @@ static int emit_term(cql_transform_t ct, } static int emit_terms(cql_transform_t ct, struct cql_node *cn, - char **addinfo, + WRBUF addinfo, void (*pr)(const char *buf, void *client_data), void *client_data, const char *op) @@ -808,7 +807,7 @@ static int emit_terms(cql_transform_t ct, struct cql_node *cn, } static int emit_wordlist(cql_transform_t ct, struct cql_node *cn, - char **addinfo, + WRBUF addinfo, void (*pr)(const char *buf, void *client_data), void *client_data, const char *op) @@ -843,10 +842,10 @@ static int emit_wordlist(cql_transform_t ct, struct cql_node *cn, return r; } -int cql_transform_r(cql_transform_t ct, struct cql_node *cn, - char **addinfo, - void (*pr)(const char *buf, void *client_data), - void *client_data) +static int emit_node(cql_transform_t ct, struct cql_node *cn, + WRBUF addinfo, + void (*pr)(const char *buf, void *client_data), + void *client_data) { const char *ns; int r = 0; @@ -871,7 +870,6 @@ int cql_transform_r(cql_transform_t ct, struct cql_node *cn, } else { - *addinfo = 0; return YAZ_SRW_UNSUPP_CONTEXT_SET; } cql_pr_attr(ct, addinfo, "always", 0, 0, pr, client_data, 0); @@ -905,19 +903,19 @@ int cql_transform_r(cql_transform_t ct, struct cql_node *cn, else if (mods) { /* Boolean modifiers other than on proximity not supported */ - *addinfo = xstrdup(mods->u.st.index); + wrbuf_puts(addinfo, mods->u.st.index); return YAZ_SRW_UNSUPP_BOOLEAN_MODIFIER; } - r = cql_transform_r(ct, cn->u.boolean.left, addinfo, pr, client_data); + r = emit_node(ct, cn->u.boolean.left, addinfo, pr, client_data); if (r) return r; - r = cql_transform_r(ct, cn->u.boolean.right, addinfo, pr, client_data); + r = emit_node(ct, cn->u.boolean.right, addinfo, pr, client_data); if (r) return r; break; case CQL_NODE_SORT: - r = cql_transform_r(ct, cn->u.sort.search, addinfo, pr, client_data); + r = emit_node(ct, cn->u.sort.search, addinfo, pr, client_data); break; default: fprintf(stderr, "Fatal: impossible CQL node-type %d\n", cn->which); @@ -926,10 +924,10 @@ int cql_transform_r(cql_transform_t ct, struct cql_node *cn, return r; } -int cql_transform_cql2rpn(cql_transform_t ct, struct cql_node *cn, - char **addinfo, - void (*pr)(const char *buf, void *client_data), - void *client_data) +int cql_transform_r(cql_transform_t ct, struct cql_node *cn, + WRBUF addinfo, + void (*pr)(const char *buf, void *client_data), + void *client_data) { struct cql_prop_entry *e; NMEM nmem = nmem_create(); @@ -942,7 +940,7 @@ int cql_transform_cql2rpn(cql_transform_t ct, struct cql_node *cn, else if (!cql_strcmp(e->pattern, "set")) cql_apply_prefix(nmem, cn, 0, e->value); } - r = cql_transform_r(ct, cn, addinfo, pr, client_data); + r = emit_node(ct, cn, addinfo, pr, client_data); nmem_destroy(nmem); return r; } @@ -951,10 +949,10 @@ int cql_transform(cql_transform_t ct, struct cql_node *cn, void (*pr)(const char *buf, void *client_data), void *client_data) { - char *addinfo = 0; - int r = cql_transform_cql2rpn(ct, cn, &addinfo, pr, client_data); - cql_transform_set_error(ct, r, addinfo); - xfree(addinfo); + WRBUF addinfo = wrbuf_alloc(); + int r = cql_transform_r(ct, cn, addinfo, pr, client_data); + cql_transform_set_error(ct, r, wrbuf_cstr(addinfo)); + wrbuf_destroy(addinfo); return r; } @@ -989,14 +987,15 @@ int cql_transform_buf(cql_transform_t ct, struct cql_node *cn, int cql_transform_error(cql_transform_t ct, const char **addinfo) { - *addinfo = ct->addinfo; + *addinfo = wrbuf_len(ct->addinfo) ? wrbuf_cstr(ct->addinfo) : 0; return ct->error; } void cql_transform_set_error(cql_transform_t ct, int error, const char *addinfo) { - xfree(ct->addinfo); - ct->addinfo = addinfo ? xstrdup(addinfo) : 0; + wrbuf_rewind(ct->addinfo); + if (addinfo) + wrbuf_puts(ct->addinfo, addinfo); ct->error = error; }