-void Yaz_Z_Query::oid2str(Odr_oid *o, WRBUF buf)
-{
- for (; *o >= 0; o++) {
- char ibuf[16];
- sprintf(ibuf, "%d", *o);
- wrbuf_puts(buf, ibuf);
- if (o[1] > 0)
- wrbuf_putc(buf, '.');
- }
-}
-
-void Yaz_Z_Query::pr_term(WRBUF wbuf, char *buf, int len)
-{
- int i;
- wrbuf_putc(wbuf, '"');
- for (i = 0; i<len; i++)
- {
- int ch = buf[i];
- if (ch == '"')
- wrbuf_putc(wbuf, '\\');
- wrbuf_putc(wbuf, ch);
- }
- wrbuf_puts(wbuf, "\" ");
-}
-
-int Yaz_Z_Query::rpn2pquery(Z_RPNStructure *s, WRBUF buf)
-{
- if (s->which == Z_RPNStructure_simple)
- {
- Z_Operand *o = s->u.simple;
-
- if (o->which == Z_Operand_APT)
- {
- Z_AttributesPlusTerm *at = s->u.simple->u.attributesPlusTerm;
- if (at->attributes) {
- int i;
- for (i = 0; i < at->attributes->num_attributes; i++) {
- wrbuf_puts(buf, "@attr ");
- if (at->attributes->attributes[i]->attributeSet) {
- oid2str(at->attributes->attributes[i]->attributeSet, buf);
- wrbuf_putc(buf, ' ');
- }
- wrbuf_printf(buf, "%d=", *at->attributes->attributes[i]->attributeType);
- wrbuf_printf(buf, "%d ", *at->attributes->attributes[i]->value.numeric);
- }
- }
- if (at->term->which == Z_Term_general)
- {
- pr_term(buf, (char*) at->term->u.general->buf,
- at->term->u.general->len);
- }
- else if (at->term->which == Z_Term_characterString)
- {
- wrbuf_puts(buf, "@term string ");
- pr_term(buf, at->term->u.characterString,
- strlen(at->term->u.characterString));
-
- }
- }
- else if (o->which == Z_Operand_resultSetId)
- {
- wrbuf_printf(buf, "@set %s ", o->u.resultSetId);
- }
- }
- else if (s->which == Z_RPNStructure_complex)
- {
- Z_Complex *c = s->u.complex;
-
- switch (c->roperator->which) {
- case Z_Operator_and: wrbuf_puts(buf, "@and "); break;
- case Z_Operator_or: wrbuf_puts(buf, "@or "); break;
- case Z_Operator_and_not: wrbuf_puts(buf, "@not "); break;
- case Z_Operator_prox: wrbuf_puts(buf, "@prox "); break;
- default: wrbuf_puts(buf, "@unknown ");
- }
- if (!rpn2pquery(c->s1, buf))
- return 0;
- if (!rpn2pquery(c->s2, buf))
- return 0;
- }
- return 1;
-}
-
-WRBUF Yaz_Z_Query::zquery2pquery(Z_Query *q)
-{
- WRBUF buf = wrbuf_alloc();
-
- if (q->which != Z_Query_type_1 && q->which != Z_Query_type_101)
- return 0;
- if (q->u.type_1->attributeSetId) {
- /* Output attribute set ID */
- wrbuf_puts(buf, "@attrset ");
- oid2str(q->u.type_1->attributeSetId, buf);
- wrbuf_putc(buf, ' ');
- }
- return rpn2pquery(q->u.type_1->RPNStructure, buf) ? buf : 0;
-}
-