Remove printf stmt
[yaz-moved-to-github.git] / zutil / yaz-ccl.c
1 /*
2  * Copyright (c) 1996-2002, Index Data.
3  * See the file LICENSE for details.
4  *
5  * $Id: yaz-ccl.c,v 1.17 2002-12-28 12:16:26 adam Exp $
6  */
7
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <string.h>
11
12 #include <yaz/yaz-ccl.h>
13 #include <yaz/pquery.h>
14
15 Z_RPNQuery *ccl_rpn_query (ODR o, struct ccl_rpn_node *p)
16 {
17     YAZ_PQF_Parser parser = yaz_pqf_create();
18     WRBUF wr = wrbuf_alloc();
19     Z_RPNQuery *q;
20
21     ccl_pquery(wr, p);
22
23     q = yaz_pqf_parse(parser, o, wrbuf_buf(wr));
24
25     wrbuf_free(wr, 1);
26     yaz_pqf_destroy(parser);
27     return q;
28 }
29
30 Z_AttributesPlusTerm *ccl_scan_query (ODR o, struct ccl_rpn_node *p)
31 {
32     YAZ_PQF_Parser parser = yaz_pqf_create();
33     WRBUF wr = wrbuf_alloc();
34     Z_AttributesPlusTerm *q;
35     Odr_oid *setp;
36
37     ccl_pquery(wr, p);
38
39     q = yaz_pqf_scan(parser, o, &setp, wrbuf_buf(wr));
40
41     wrbuf_free(wr, 1);
42     yaz_pqf_destroy(parser);
43     return q;
44 }
45
46 static void ccl_pquery_complex (WRBUF w, struct ccl_rpn_node *p)
47 {
48     switch (p->kind)
49     {
50     case CCL_RPN_AND:
51         wrbuf_puts(w, "@and ");
52         break;
53     case CCL_RPN_OR:
54         wrbuf_puts(w, "@or ");
55         break;
56     case CCL_RPN_NOT:
57         wrbuf_puts(w, "@not ");
58         break;
59     case CCL_RPN_PROX:
60         if (p->u.p[2] && p->u.p[2]->kind == CCL_RPN_TERM)
61         {
62             const char *cp = p->u.p[2]->u.t.term;
63             /* exlusion distance ordered relation which-code unit-code */
64             if (*cp == '!')
65             {   
66                 /* word order specified */
67                 if (isdigit(cp[1]))
68                     wrbuf_printf(w, "@prox 0 %s 1 2 k 2 ", cp+1);
69                 else
70                     wrbuf_printf(w, "@prox 0 1 1 2 k 2 ");
71             } 
72             else if (*cp == '%')
73             {
74                 /* word order not specified */
75                 if (isdigit(cp[1]))
76                     wrbuf_printf(w, "@prox 0 %s 0 2 k 2 ", cp+1);
77                 else
78                     wrbuf_printf(w, "@prox 0 1 0 2 k 2 ");
79             }
80         }
81         else
82             wrbuf_puts(w, "@prox 0 2 0 1 k 2 ");
83         break;
84     default:
85         wrbuf_puts(w, "@ bad op (unknown) ");
86     };
87     ccl_pquery(w, p->u.p[0]);
88     ccl_pquery(w, p->u.p[1]);
89 }
90         
91 void ccl_pquery (WRBUF w, struct ccl_rpn_node *p)
92 {
93     struct ccl_rpn_attr *att;
94     const char *cp;
95
96     switch (p->kind)
97     {
98     case CCL_RPN_AND:
99     case CCL_RPN_OR:
100     case CCL_RPN_NOT:
101     case CCL_RPN_PROX:
102         ccl_pquery_complex (w, p);
103         break;
104     case CCL_RPN_SET:
105         wrbuf_puts (w, "@set ");
106         wrbuf_puts (w, p->u.setname);
107         wrbuf_puts (w, " ");
108         break;
109     case CCL_RPN_TERM:
110         for (att = p->u.t.attr_list; att; att = att->next)
111         {
112             char tmpattr[128];
113             wrbuf_puts (w, "@attr ");
114             if (att->set)
115             {
116                 wrbuf_puts (w, att->set);
117                 wrbuf_puts (w, " ");
118             }
119             sprintf(tmpattr, "%d=%d ", att->type, att->value);
120             wrbuf_puts (w, tmpattr);
121         }
122         for (cp = p->u.t.term; *cp; cp++)
123         {
124             if (*cp == ' ' || *cp == '\\')
125                 wrbuf_putc (w, '\\');
126             wrbuf_putc (w, *cp);
127         }
128         wrbuf_puts (w, " ");
129         break;
130     }
131 }