2 * Copyright (c) 1996-2003, Index Data.
3 * See the file LICENSE for details.
5 * $Id: yaz-ccl.c,v 1.20 2003-06-23 10:22:21 adam Exp $
13 #include <yaz/yaz-ccl.h>
14 #include <yaz/pquery.h>
16 Z_RPNQuery *ccl_rpn_query (ODR o, struct ccl_rpn_node *p)
18 YAZ_PQF_Parser parser = yaz_pqf_create();
19 WRBUF wr = wrbuf_alloc();
24 q = yaz_pqf_parse(parser, o, wrbuf_buf(wr));
27 yaz_pqf_destroy(parser);
31 Z_AttributesPlusTerm *ccl_scan_query (ODR o, struct ccl_rpn_node *p)
33 YAZ_PQF_Parser parser = yaz_pqf_create();
34 WRBUF wr = wrbuf_alloc();
35 Z_AttributesPlusTerm *q;
40 q = yaz_pqf_scan(parser, o, &setp, wrbuf_buf(wr));
43 yaz_pqf_destroy(parser);
47 static void ccl_pquery_complex (WRBUF w, struct ccl_rpn_node *p)
52 wrbuf_puts(w, "@and ");
55 wrbuf_puts(w, "@or ");
58 wrbuf_puts(w, "@not ");
61 if (p->u.p[2] && p->u.p[2]->kind == CCL_RPN_TERM)
63 const char *cp = p->u.p[2]->u.t.term;
64 /* exlusion distance ordered relation which-code unit-code */
67 /* word order specified */
69 wrbuf_printf(w, "@prox 0 %s 1 2 k 2 ", cp+1);
71 wrbuf_printf(w, "@prox 0 1 1 2 k 2 ");
75 /* word order not specified */
77 wrbuf_printf(w, "@prox 0 %s 0 2 k 2 ", cp+1);
79 wrbuf_printf(w, "@prox 0 1 0 2 k 2 ");
83 wrbuf_puts(w, "@prox 0 2 0 1 k 2 ");
86 wrbuf_puts(w, "@ bad op (unknown) ");
88 ccl_pquery(w, p->u.p[0]);
89 ccl_pquery(w, p->u.p[1]);
92 void ccl_pquery (WRBUF w, struct ccl_rpn_node *p)
94 struct ccl_rpn_attr *att;
103 ccl_pquery_complex (w, p);
106 wrbuf_puts (w, "@set ");
107 wrbuf_puts (w, p->u.setname);
111 for (att = p->u.t.attr_list; att; att = att->next)
114 wrbuf_puts (w, "@attr ");
117 wrbuf_puts (w, att->set);
122 case CCL_RPN_ATTR_NUMERIC:
123 sprintf(tmpattr, "%d=%d ", att->type, att->value.numeric);
124 wrbuf_puts (w, tmpattr);
126 case CCL_RPN_ATTR_STRING:
127 sprintf(tmpattr, "%d ", att->type);
128 wrbuf_puts (w, tmpattr);
129 wrbuf_puts(w, att->value.str);
133 for (cp = p->u.t.term; *cp; cp++)
135 if (*cp == ' ' || *cp == '\\')
136 wrbuf_putc (w, '\\');