2 * Copyright (c) 1996-2000, Index Data.
3 * See the file LICENSE for details.
4 * Sebastian Hammer, Adam Dickmeiss
7 * Revision 1.5 2000-01-31 13:15:22 adam
8 * Removed uses of assert(3). Cleanup of ODR. CCL parser update so
9 * that some characters are not surrounded by spaces in resulting term.
12 * Revision 1.4 1999/12/20 15:20:13 adam
13 * Implemented ccl_pquery to convert from CCL tree to prefix query.
15 * Revision 1.3 1999/11/30 13:47:12 adam
16 * Improved installation. Moved header files to include/yaz.
18 * Revision 1.2 1999/06/16 12:00:08 adam
21 * Revision 1.1 1999/06/08 10:12:43 adam
22 * Moved file to be part of zutil (instead of util).
24 * Revision 1.13 1998/03/31 15:13:20 adam
25 * Development towards compiled ASN.1.
27 * Revision 1.12 1998/02/11 11:53:36 adam
28 * Changed code so that it compiles as C++.
30 * Revision 1.11 1997/11/24 11:33:57 adam
31 * Using function odr_nullval() instead of global ODR_NULLVAL when
34 * Revision 1.10 1997/09/29 08:58:25 adam
35 * Fixed conversion of trees so that true copy is made.
37 * Revision 1.9 1997/06/23 10:31:25 adam
38 * Added ODR argument to ccl_rpn_query and ccl_scan_query.
40 * Revision 1.8 1996/10/29 13:36:27 adam
49 #include <yaz/yaz-ccl.h>
51 static Z_RPNStructure *ccl_rpn_structure (ODR o, struct ccl_rpn_node *p);
53 static Z_AttributesPlusTerm *ccl_rpn_term (ODR o, struct ccl_rpn_node *p)
55 struct ccl_rpn_attr *attr;
57 Z_AttributesPlusTerm *zapt;
60 Z_AttributeElement **elements;
62 zapt = (Z_AttributesPlusTerm *)odr_malloc (o, sizeof(*zapt));
64 term_octet = (Odr_oct *)odr_malloc (o, sizeof(*term_octet));
66 term = (Z_Term *)odr_malloc (o, sizeof(*term));
68 for (attr = p->u.t.attr_list; attr; attr = attr->next)
71 elements = (Z_AttributeElement**)odr_nullval();
75 elements = (Z_AttributeElement **)
76 odr_malloc (o, num*sizeof(*elements));
77 for (attr = p->u.t.attr_list; attr; attr = attr->next, i++)
79 elements[i] = (Z_AttributeElement *)
80 odr_malloc (o, sizeof(**elements));
81 elements[i]->attributeType =
82 (int *)odr_malloc(o, sizeof(int));
83 *elements[i]->attributeType = attr->type;
84 elements[i]->attributeSet = 0;
85 elements[i]->which = Z_AttributeValue_numeric;
86 elements[i]->value.numeric =
87 (int *)odr_malloc (o, sizeof(int));
88 *elements[i]->value.numeric = attr->value;
92 zapt->attributes = (Z_AttributeList *)
93 odr_malloc (o, sizeof(*zapt->attributes));
94 zapt->attributes->num_attributes = num;
95 zapt->attributes->attributes = elements;
97 zapt->num_attributes = num;
98 zapt->attributeList = elements;
101 term->which = Z_Term_general;
102 term->u.general = term_octet;
103 term_octet->len = term_octet->size = strlen (p->u.t.term);
104 term_octet->buf = (unsigned char *)odr_malloc (o, term_octet->len+1);
105 strcpy ((char*) term_octet->buf, p->u.t.term);
109 static Z_Operand *ccl_rpn_simple (ODR o, struct ccl_rpn_node *p)
113 zo = (Z_Operand *)odr_malloc (o, sizeof(*zo));
118 zo->which = Z_Operand_APT;
119 zo->u.attributesPlusTerm = ccl_rpn_term (o, p);
122 zo->which = Z_Operand_resultSetId;
123 zo->u.resultSetId = p->u.setname;
131 static Z_Complex *ccl_rpn_complex (ODR o, struct ccl_rpn_node *p)
136 zc = (Z_Complex *)odr_malloc (o, sizeof(*zc));
137 zo = (Z_Operator *)odr_malloc (o, sizeof(*zo));
143 zo->which = Z_Operator_and;
144 zo->u.and = odr_nullval();
147 zo->which = Z_Operator_or;
148 zo->u.and = odr_nullval();
151 zo->which = Z_Operator_and_not;
152 zo->u.and = odr_nullval();
155 zo->which = Z_Operator_prox;
156 zo->u.prox = (Z_ProximityOperator *)
157 odr_malloc (o, sizeof(*zo->u.prox));
158 zo->u.prox->exclusion = 0;
160 zo->u.prox->distance = (int *)
161 odr_malloc (o, sizeof(*zo->u.prox->distance));
162 *zo->u.prox->distance = 2;
164 zo->u.prox->ordered = (bool_t *)
165 odr_malloc (o, sizeof(*zo->u.prox->ordered));
166 *zo->u.prox->ordered = 0;
168 zo->u.prox->relationType = (int *)
169 odr_malloc (o, sizeof(*zo->u.prox->relationType));
171 *zo->u.prox->relationType = Z_ProximityOperator_Prox_lessThan;
172 zo->u.prox->which = Z_ProximityOperator_known;
173 zo->u.prox->u.known =
174 odr_malloc (o, sizeof(*zo->u.prox->u.known));
175 *zo->u.prox->u.known = Z_ProxUnit_word;
177 *zo->u.prox->relationType = Z_Prox_lessThan;
178 zo->u.prox->which = Z_ProxCode_known;
179 zo->u.prox->proximityUnitCode = (int*)
180 odr_malloc (o, sizeof(*zo->u.prox->proximityUnitCode));
181 *zo->u.prox->proximityUnitCode = Z_ProxUnit_word;
187 zc->s1 = ccl_rpn_structure (o, p->u.p[0]);
188 zc->s2 = ccl_rpn_structure (o, p->u.p[1]);
192 static Z_RPNStructure *ccl_rpn_structure (ODR o, struct ccl_rpn_node *p)
196 zs = (Z_RPNStructure *)odr_malloc (o, sizeof(*zs));
203 zs->which = Z_RPNStructure_complex;
204 zs->u.complex = ccl_rpn_complex (o, p);
208 zs->which = Z_RPNStructure_simple;
209 zs->u.simple = ccl_rpn_simple (o, p);
217 Z_RPNQuery *ccl_rpn_query (ODR o, struct ccl_rpn_node *p)
221 zq = (Z_RPNQuery *)odr_malloc (o, sizeof(*zq));
222 zq->attributeSetId = NULL;
223 zq->RPNStructure = ccl_rpn_structure (o, p);
227 Z_AttributesPlusTerm *ccl_scan_query (ODR o, struct ccl_rpn_node *p)
229 if (p->kind != CCL_RPN_TERM)
231 return ccl_rpn_term (o, p);
234 static void ccl_pquery_complex (WRBUF w, struct ccl_rpn_node *p)
239 wrbuf_puts (w, "@and ");
242 wrbuf_puts(w, "@or ");
245 wrbuf_puts(w, "@not ");
248 wrbuf_puts(w, "@prox 0 2 0 1 known 2 ");
251 wrbuf_puts(w, "@ bad op (unknown) ");
253 ccl_pquery(w, p->u.p[0]);
254 ccl_pquery(w, p->u.p[1]);
257 void ccl_pquery (WRBUF w, struct ccl_rpn_node *p)
259 struct ccl_rpn_attr *att;
267 ccl_pquery_complex (w, p);
270 wrbuf_puts (w, "@set ");
271 wrbuf_puts (w, p->u.setname);
275 for (att = p->u.t.attr_list; att; att = att->next)
278 sprintf(tmpattr, "@attr %d=%d ", att->type, att->value);
279 wrbuf_puts (w, tmpattr);
282 wrbuf_puts (w, p->u.t.term);
283 wrbuf_puts (w, "} ");