struct cql_prop_entry *entry;
yaz_tok_cfg_t tok_cfg;
int error;
- char *addinfo;
+ WRBUF addinfo;
NMEM nmem;
};
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;
{
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);
}
}
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);
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,
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,
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)
{
proxrel = 6;
else
{
- *addinfo = xstrdup(relation);
+ wrbuf_puts(addinfo, relation);
return YAZ_SRW_UNSUPP_PROX_RELATION;
}
}
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;
}
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)
}
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)
}
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)
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;
}
else
{
- *addinfo = 0;
return YAZ_SRW_UNSUPP_CONTEXT_SET;
}
cql_pr_attr(ct, addinfo, "always", 0, 0, pr, client_data, 0);
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);
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();
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;
}
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;
}
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;
}