System headerfiles gathered in yconfig
[yaz-moved-to-github.git] / retrieval / d1_grs.c
index a3ea519..9033c4d 100644 (file)
@@ -4,7 +4,19 @@
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: d1_grs.c,v $
- * Revision 1.2  1995-11-01 13:54:46  quinn
+ * Revision 1.6  1996-07-06 19:58:34  quinn
+ * System headerfiles gathered in yconfig
+ *
+ * Revision 1.5  1996/06/03  09:46:42  quinn
+ * Added OID data type.
+ *
+ * Revision 1.4  1996/05/01  12:45:30  quinn
+ * Support use of local tag names in abs file.
+ *
+ * Revision 1.3  1995/11/13  09:27:35  quinn
+ * Fiddling with the variant stuff.
+ *
+ * Revision 1.2  1995/11/01  13:54:46  quinn
  * Minor adjustments
  *
  * Revision 1.1  1995/11/01  11:56:07  quinn
@@ -128,6 +140,10 @@ static Z_ElementData *nodetoelementdata(data1_node *n, int select, int leaf,
     ODR o)
 {
     Z_ElementData *res = odr_malloc(o, sizeof(*res));
+    data1_node *p;
+
+    for (p = n->parent; p && p->which != DATA1N_tag; p = p->parent)
+       ;
 
     if (!n)
     {
@@ -136,6 +152,9 @@ static Z_ElementData *nodetoelementdata(data1_node *n, int select, int leaf,
     }
     else if (n->which == DATA1N_data && (leaf || n->parent->num_children == 1))
     {
+       char str[512];
+       int toget;
+
        switch (n->u.data.what)
        {
            case DATA1I_num:
@@ -144,10 +163,19 @@ static Z_ElementData *nodetoelementdata(data1_node *n, int select, int leaf,
                *res->u.numeric = atoi(n->u.data.data);
                break;
            case DATA1I_text:
+               toget = n->u.data.len;
+               if (p->u.tag.get_bytes > 0 && p->u.tag.get_bytes < toget)
+                   toget = p->u.tag.get_bytes;
                res->which = Z_ElementData_string;
-               res->u.string = odr_malloc(o, n->u.data.len+1);
-               memcpy(res->u.string, n->u.data.data, n->u.data.len);
-               res->u.string[n->u.data.len] = '\0';
+               res->u.string = odr_malloc(o, toget+1);
+               memcpy(res->u.string, n->u.data.data, toget);
+               res->u.string[toget] = '\0';
+               break;
+           case DATA1I_oid:
+               res->which = Z_ElementData_oid;
+               strncpy(str, n->u.data.data, n->u.data.len);
+               str[n->u.data.len] = '\0';
+               res->u.oid = odr_getoidbystr(o, str);
                break;
            default:
                logf(LOG_WARN, "Can't handle datatype.");
@@ -177,6 +205,10 @@ static Z_TaggedElement *nodetotaggedelement(data1_node *n, int select, ODR o)
        data = n->child;
        leaf = 0;
     }
+    /*
+     * If we're a data element at this point, we need to insert a
+     * wellKnown tag to wrap us up.
+     */
     else if (n->which == DATA1N_data || n->which == DATA1N_variant)
     {
        if (!(tag = data1_gettagbyname(n->root->u.root.absyn->tagset,
@@ -195,7 +227,7 @@ static Z_TaggedElement *nodetotaggedelement(data1_node *n, int select, ODR o)
     }
 
     res->tagType = odr_malloc(o, sizeof(int));
-    *res->tagType = tag ? tag->tagset->type : 3;
+    *res->tagType = (tag && tag->tagset) ? tag->tagset->type : 3;
     res->tagValue = odr_malloc(o, sizeof(Z_StringOrNumeric));
     if (tag && tag->which == DATA1T_numeric)
     {
@@ -225,16 +257,24 @@ static Z_TaggedElement *nodetotaggedelement(data1_node *n, int select, ODR o)
        int nvars = 0;
 
        res->metaData = get_ElementMetaData(o);
-       if (traverse_triples(data, 0, res->metaData, o) < 0)
-           return 0;
+       if (n->which == DATA1N_tag && n->u.tag.make_variantlist)
+           if (traverse_triples(data, 0, res->metaData, o) < 0)
+               return 0;
        while (data && data->which == DATA1N_variant)
        {
            nvars++;
            data = data->child;
        }
-       res->appliedVariant = make_variant(data->parent, nvars-1, o);
+       if (n->which != DATA1N_tag || !n->u.tag.no_data_requested)
+           res->appliedVariant = make_variant(data->parent, nvars-1, o);
+    }
+    if (n->which == DATA1N_tag && n->u.tag.no_data_requested)
+    {
+       res->content = odr_malloc(o, sizeof(*res->content));
+       res->content->which = Z_ElementData_noDataRequested;
+       res->content->u.noDataRequested = ODR_NULLVAL;
     }
-    if (!(res->content = nodetoelementdata(data, select, leaf, o)))
+    else if (!(res->content = nodetoelementdata(data, select, leaf, o)))
        return 0;
     return res;
 }