Improved installation. Moved header files to include/yaz.
[yaz-moved-to-github.git] / zutil / yaz-ccl.c
1 /*
2  * Copyright (c) 1996-1998, Index Data.
3  * See the file LICENSE for details.
4  * Sebastian Hammer, Adam Dickmeiss
5  *
6  * $Log: yaz-ccl.c,v $
7  * Revision 1.3  1999-11-30 13:47:12  adam
8  * Improved installation. Moved header files to include/yaz.
9  *
10  * Revision 1.2  1999/06/16 12:00:08  adam
11  * Added proximity.
12  *
13  * Revision 1.1  1999/06/08 10:12:43  adam
14  * Moved file to be part of zutil (instead of util).
15  *
16  * Revision 1.13  1998/03/31 15:13:20  adam
17  * Development towards compiled ASN.1.
18  *
19  * Revision 1.12  1998/02/11 11:53:36  adam
20  * Changed code so that it compiles as C++.
21  *
22  * Revision 1.11  1997/11/24 11:33:57  adam
23  * Using function odr_nullval() instead of global ODR_NULLVAL when
24  * appropriate.
25  *
26  * Revision 1.10  1997/09/29 08:58:25  adam
27  * Fixed conversion of trees so that true copy is made.
28  *
29  * Revision 1.9  1997/06/23 10:31:25  adam
30  * Added ODR argument to ccl_rpn_query and ccl_scan_query.
31  *
32  * Revision 1.8  1996/10/29 13:36:27  adam
33  * Added header.
34  *
35  */
36
37 #include <stdio.h>
38 #include <stdlib.h>
39 #include <string.h>
40 #include <assert.h>
41
42 #include <yaz/yaz-ccl.h>
43
44 static Z_RPNStructure *ccl_rpn_structure (ODR o, struct ccl_rpn_node *p);
45
46 static Z_AttributesPlusTerm *ccl_rpn_term (ODR o, struct ccl_rpn_node *p)
47 {
48     struct ccl_rpn_attr *attr;
49     int num = 0;
50     Z_AttributesPlusTerm *zapt;
51     Odr_oct *term_octet;
52     Z_Term *term;
53     Z_AttributeElement **elements;
54
55     zapt = (Z_AttributesPlusTerm *)odr_malloc (o, sizeof(*zapt));
56     assert (zapt);
57
58     term_octet = (Odr_oct *)odr_malloc (o, sizeof(*term_octet));
59     assert (term_octet);
60
61     term = (Z_Term *)odr_malloc (o, sizeof(*term));
62     assert(term);
63
64     for (attr = p->u.t.attr_list; attr; attr = attr->next)
65         num++;
66     if (!num)
67         elements = (Z_AttributeElement**)odr_nullval();
68     else
69     {
70         int i = 0;
71         elements = (Z_AttributeElement **)
72             odr_malloc (o, num*sizeof(*elements));
73         for (attr = p->u.t.attr_list; attr; attr = attr->next, i++)
74         {
75             elements[i] = (Z_AttributeElement *)
76                 odr_malloc (o, sizeof(**elements));
77             assert (elements[i]);
78             elements[i]->attributeType =
79                 (int *)odr_malloc(o, sizeof(int));
80             *elements[i]->attributeType = attr->type;
81             elements[i]->attributeSet = 0;
82             elements[i]->which = Z_AttributeValue_numeric;
83             elements[i]->value.numeric =
84                 (int *)odr_malloc (o, sizeof(int));
85             *elements[i]->value.numeric = attr->value;
86         }
87     }
88 #ifdef ASN_COMPILED
89     zapt->attributes = (Z_AttributeList *)
90         odr_malloc (o, sizeof(*zapt->attributes));
91     zapt->attributes->num_attributes = num;
92     zapt->attributes->attributes = elements;
93 #else
94     zapt->num_attributes = num;
95     zapt->attributeList = elements;
96 #endif    
97     zapt->term = term;
98     term->which = Z_Term_general;
99     term->u.general = term_octet;
100     term_octet->len = term_octet->size = strlen (p->u.t.term);
101     term_octet->buf = (unsigned char *)odr_malloc (o, term_octet->len+1);
102     strcpy ((char*) term_octet->buf, p->u.t.term);
103     return zapt;
104 }
105
106 static Z_Operand *ccl_rpn_simple (ODR o, struct ccl_rpn_node *p)
107 {
108     Z_Operand *zo;
109
110     zo = (Z_Operand *)odr_malloc (o, sizeof(*zo));
111     assert (zo);
112
113     switch (p->kind)
114     {
115     case CCL_RPN_TERM:
116         zo->which = Z_Operand_APT;
117         zo->u.attributesPlusTerm = ccl_rpn_term (o, p);
118         break;
119     case CCL_RPN_SET:
120         zo->which = Z_Operand_resultSetId;
121         zo->u.resultSetId = p->u.setname;
122         break;
123     default:
124         assert (0);
125     }
126     return zo;
127 }
128
129 static Z_Complex *ccl_rpn_complex (ODR o, struct ccl_rpn_node *p)
130 {
131     Z_Complex *zc;
132     Z_Operator *zo;
133
134     zc = (Z_Complex *)odr_malloc (o, sizeof(*zc));
135     assert (zc);
136     zo = (Z_Operator *)odr_malloc (o, sizeof(*zo));
137     assert (zo);
138
139     zc->roperator = zo;
140     switch (p->kind)
141     {
142     case CCL_RPN_AND:
143         zo->which = Z_Operator_and;
144         zo->u.and = odr_nullval();
145         break;
146     case CCL_RPN_OR:
147         zo->which = Z_Operator_or;
148         zo->u.and = odr_nullval();
149         break;
150     case CCL_RPN_NOT:
151         zo->which = Z_Operator_and_not;
152         zo->u.and = odr_nullval();
153         break;
154     case CCL_RPN_PROX:
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;
159
160         zo->u.prox->distance = (int *)
161             odr_malloc (o, sizeof(*zo->u.prox->distance));
162         *zo->u.prox->distance = 2;
163
164         zo->u.prox->ordered = (bool_t *)
165             odr_malloc (o, sizeof(*zo->u.prox->ordered));
166         *zo->u.prox->ordered = 0;
167
168         zo->u.prox->relationType = (int *)
169             odr_malloc (o, sizeof(*zo->u.prox->relationType));
170 #ifdef ASN_COMPILED
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;
176 #else
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;
182 #endif
183         break;
184     default:
185         assert (0);
186     }
187     zc->s1 = ccl_rpn_structure (o, p->u.p[0]);
188     zc->s2 = ccl_rpn_structure (o, p->u.p[1]);
189     return zc;
190 }
191
192 static Z_RPNStructure *ccl_rpn_structure (ODR o, struct ccl_rpn_node *p)
193 {
194     Z_RPNStructure *zs;
195
196     zs = (Z_RPNStructure *)odr_malloc (o, sizeof(*zs));
197     assert (zs);
198     switch (p->kind)
199     {
200     case CCL_RPN_AND:
201     case CCL_RPN_OR:
202     case CCL_RPN_NOT:
203     case CCL_RPN_PROX:
204         zs->which = Z_RPNStructure_complex;
205         zs->u.complex = ccl_rpn_complex (o, p);
206         break;
207     case CCL_RPN_TERM:
208     case CCL_RPN_SET:
209         zs->which = Z_RPNStructure_simple;
210         zs->u.simple = ccl_rpn_simple (o, p);
211         break;
212     default:
213         assert (0);
214     }
215     return zs;
216 }
217
218 Z_RPNQuery *ccl_rpn_query (ODR o, struct ccl_rpn_node *p)
219 {
220     Z_RPNQuery *zq;
221
222     zq = (Z_RPNQuery *)odr_malloc (o, sizeof(*zq));
223     assert (zq);
224     zq->attributeSetId = NULL;
225     zq->RPNStructure = ccl_rpn_structure (o, p);
226     return zq;
227 }
228
229 Z_AttributesPlusTerm *ccl_scan_query (ODR o, struct ccl_rpn_node *p)
230 {
231     if (p->kind != CCL_RPN_TERM)
232         return NULL;
233     return ccl_rpn_term (o, p);
234 }