+ /* fix */
+ return NULL;
+}
+
+Odr_oid **f_oid_seq (ExpHandle *eh, data1_node *n, int *num, oid_class oclass)
+{
+ Odr_oid **res;
+ data1_node *c;
+ int i;
+
+ *num = 0;
+ for (c = n->child ; c; c = c->next)
+ {
+ if (is_numeric_tag (eh, c) != 1000)
+ continue;
+ ++(*num);
+ }
+ if (!*num)
+ return NULL;
+ res = (int **)odr_malloc (eh->o, sizeof(*res) * (*num));
+ for (c = n->child, i = 0 ; c; c = c->next)
+ {
+ if (is_numeric_tag (eh, c) != 1000)
+ continue;
+ res[i++] = f_oid (eh, c, oclass);
+ }
+ return res;
+}
+
+char **f_string_seq (ExpHandle *eh, data1_node *n, int *num)
+{
+ char **res;
+ data1_node *c;
+ int i;
+
+ *num = 0;
+ for (c = n->child ; c; c = c->next)
+ {
+ if (!is_numeric_tag (eh, c) != 1001)
+ continue;
+ ++(*num);
+ }
+ if (!*num)
+ return NULL;
+ res = (char **)odr_malloc (eh->o, sizeof(*res) * (*num));
+ for (c = n->child, i = 0 ; c; c = c->next)
+ {
+ if (!is_numeric_tag (eh, c) != 1001)
+ continue;
+ res[i++] = f_string (eh, c);
+ }
+ return res;
+}
+
+char **f_humstring_seq (ExpHandle *eh, data1_node *n, int *num)
+{
+ /* fix */
+ return NULL;
+}
+
+
+Z_RpnCapabilities *f_rpnCapabilities (ExpHandle *eh, data1_node *c)
+{
+ Z_RpnCapabilities *res = (Z_RpnCapabilities *)odr_malloc (eh->o, sizeof(*res));
+
+ res->num_operators = 0;
+ res->operators = NULL;
+ res->resultSetAsOperandSupported = eh->false_value;
+ res->restrictionOperandSupported = eh->false_value;
+ res->proximity = NULL;
+ /* fix */ /* 550 - 560 */
+ return res;
+}
+
+Z_QueryTypeDetails **f_queryTypesSupported (ExpHandle *eh, data1_node *c,
+ int *num)
+{
+ data1_node *n;
+ Z_QueryTypeDetails **res;
+ int i;
+
+ *num = 0;
+ for (n = c->child; n; n = n->next)
+ {
+ if (is_numeric_tag(eh, n) != 519)
+ continue;
+ /* fix */ /* 518 and 520 */
+ (*num)++;
+ }
+ if (!*num)
+ return NULL;
+ res = (Z_QueryTypeDetails **)odr_malloc (eh->o, *num * sizeof(*res));
+ i = 0;
+ for (n = c->child; n; n = n->next)
+ {
+ if (is_numeric_tag(eh, n) == 519)
+ {
+ res[i] = (Z_QueryTypeDetails *)odr_malloc (eh->o, sizeof(**res));
+ res[i]->which = Z_QueryTypeDetails_rpn;
+ res[i]->u.rpn = f_rpnCapabilities (eh, n);
+ i++;
+ }
+ else
+ continue;
+ /* fix */ /* 518 and 520 */
+ }
+ return res;
+}
+
+static Z_AccessInfo *f_accessInfo(ExpHandle *eh, data1_node *n)
+{
+ Z_AccessInfo *res = (Z_AccessInfo *)odr_malloc(eh->o, sizeof(*res));
+ data1_node *c;
+
+ res->num_queryTypesSupported = 0;
+ res->queryTypesSupported = 0;
+ res->num_diagnosticsSets = 0;
+ res->diagnosticsSets = 0;
+ res->num_attributeSetIds = 0;
+ res->attributeSetIds = 0;
+ res->num_schemas = 0;
+ res->schemas = 0;
+ res->num_recordSyntaxes = 0;
+ res->recordSyntaxes = 0;
+ res->num_resourceChallenges = 0;
+ res->resourceChallenges = 0;
+ res->restrictedAccess = 0;
+ res->costInfo = 0;
+ res->num_variantSets = 0;
+ res->variantSets = 0;
+ res->num_elementSetNames = 0;
+ res->elementSetNames = 0;
+ res->num_unitSystems = 0;
+ res->unitSystems = 0;
+
+ for (c = n->child; c; c = c->next)
+ {
+ switch (is_numeric_tag (eh, c))
+ {
+ case 501:
+ res->queryTypesSupported =
+ f_queryTypesSupported (eh, c, &res->num_queryTypesSupported);
+ break;
+ case 503:
+ res->diagnosticsSets =
+ f_oid_seq(eh, c, &res->num_diagnosticsSets, CLASS_DIAGSET);
+ break;
+ case 505:
+ res->attributeSetIds =
+ f_oid_seq(eh, c, &res->num_attributeSetIds, CLASS_ATTSET);
+ break;
+ case 507:
+ res->schemas =
+ f_oid_seq(eh, c, &res->num_schemas, CLASS_SCHEMA);
+ break;
+ case 509:
+ res->recordSyntaxes =
+ f_oid_seq (eh, c, &res->num_recordSyntaxes, CLASS_RECSYN);
+ break;
+ case 511:
+ res->resourceChallenges =
+ f_oid_seq (eh, c, &res->num_resourceChallenges, CLASS_RESFORM);
+ break;
+ case 513: res->restrictedAccess = NULL; break; /* fix */
+ case 514: res->costInfo = NULL; break; /* fix */
+ case 515:
+ res->variantSets =
+ f_oid_seq (eh, c, &res->num_variantSets, CLASS_VARSET);
+ break;
+ case 516:
+ res->elementSetNames =
+ f_string_seq (eh, c, &res->num_elementSetNames);
+ break;
+ case 517:
+ res->unitSystems = f_string_seq (eh, c, &res->num_unitSystems);
+ break;
+ }
+ }
+ return res;
+}
+
+static int *f_recordCount(ExpHandle *eh, data1_node *c, int *which)
+{
+ int *r= (int *)odr_malloc(eh->o, sizeof(*r));
+ int *wp = which;
+ char intbuf[64];
+
+ c = c->child;
+ if (!is_numeric_tag (eh, c))
+ return 0;
+ if (c->u.tag.element->tag->value.numeric == 210)
+ *wp = Z_Exp_RecordCount_actualNumber;
+ else if (c->u.tag.element->tag->value.numeric == 211)
+ *wp = Z_Exp_RecordCount_approxNumber;
+ else
+ return 0;
+ if (!c->child || c->child->which != DATA1N_data)
+ return 0;
+ sprintf(intbuf, "%.*s", 63, c->child->u.data.data);
+ *r = atoi(intbuf);
+ return r;