Added body-of-text to BIB-1 ANY and the WAIS profile
[yaz-moved-to-github.git] / retrieval / d1_grs.c
index 650f9c7..f990323 100644 (file)
@@ -4,7 +4,19 @@
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: d1_grs.c,v $
- * Revision 1.1  1995-11-01 11:56:07  quinn
+ * 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
  * Added Retrieval (data management) functions en masse.
  *
  *
@@ -16,7 +28,7 @@
 #include <proto.h>
 #include <log.h>
 
-#include "data1.h"
+#include <data1.h>
 
 #define D1_VARIANTARRAY 20 /* fixed max length on sup'd variant-list. Lazy me */
 
@@ -133,6 +145,8 @@ 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];
+
        switch (n->u.data.what)
        {
            case DATA1I_num:
@@ -146,6 +160,12 @@ static Z_ElementData *nodetoelementdata(data1_node *n, int select, int leaf,
                memcpy(res->u.string, n->u.data.data, n->u.data.len);
                res->u.string[n->u.data.len] = '\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.");
                return 0;
@@ -174,6 +194,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,
@@ -192,7 +216,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)
     {
@@ -222,16 +246,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;
 }