8 static Z_RPNStructure *ccl_rpn_structure (struct ccl_rpn_node *p);
10 static Z_AttributesPlusTerm *ccl_rpn_term (struct ccl_rpn_node *p)
12 struct ccl_rpn_attr *attr;
14 Z_AttributesPlusTerm *zapt;
18 zapt = malloc (sizeof(*zapt));
21 term_octet = malloc (sizeof(*term_octet));
24 term = malloc(sizeof(*term));
27 for (attr = p->u.t.attr_list; attr; attr = attr->next)
29 zapt->num_attributes = num;
33 zapt->attributeList = malloc (num*sizeof(*zapt->attributeList));
34 assert (zapt->attributeList);
35 for (attr = p->u.t.attr_list; attr; attr = attr->next, i++)
37 zapt->attributeList[i] = malloc (sizeof(**zapt->attributeList));
38 assert (zapt->attributeList[i]);
39 zapt->attributeList[i]->attributeType =
41 zapt->attributeList[i]->attributeValue =
46 zapt->attributeList = ODR_NULLVAL;
49 term->which = Z_Term_general;
50 term->u.general = term_octet;
51 term_octet->buf = (unsigned char*) p->u.t.term;
52 term_octet->len = term_octet->size = strlen (p->u.t.term);
56 static Z_Operand *ccl_rpn_simple (struct ccl_rpn_node *p)
60 zo = malloc (sizeof(*zo));
66 zo->which = Z_Operand_APT;
67 zo->u.attributesPlusTerm = ccl_rpn_term (p);
70 zo->which = Z_Operand_resultSetId;
71 zo->u.resultSetId = p->u.setname;
79 static Z_Complex *ccl_rpn_complex (struct ccl_rpn_node *p)
84 zc = malloc (sizeof(*zc));
86 zo = malloc (sizeof(*zo));
93 zo->which = Z_Operator_and;
94 zo->u.and = ODR_NULLVAL;
97 zo->which = Z_Operator_or;
98 zo->u.and = ODR_NULLVAL;
101 zo->which = Z_Operator_and_not;
102 zo->u.and = ODR_NULLVAL;
107 zc->s1 = ccl_rpn_structure (p->u.p[0]);
108 zc->s2 = ccl_rpn_structure (p->u.p[1]);
112 static Z_RPNStructure *ccl_rpn_structure (struct ccl_rpn_node *p)
116 zs = malloc (sizeof(*zs));
124 zs->which = Z_RPNStructure_complex;
125 zs->u.complex = ccl_rpn_complex (p);
129 zs->which = Z_RPNStructure_simple;
130 zs->u.simple = ccl_rpn_simple (p);
138 Z_RPNQuery *ccl_rpn_query (struct ccl_rpn_node *p)
142 zq = malloc (sizeof(*zq));
144 zq->attributeSetId = NULL;
145 zq->RPNStructure = ccl_rpn_structure (p);
149 Z_AttributesPlusTerm *ccl_scan_query (struct ccl_rpn_node *p)
151 if (p->kind != CCL_RPN_TERM)
153 return ccl_rpn_term (p);