Added grs1 display utility
authorAdam Dickmeiss <adam@indexdata.dk>
Tue, 22 Oct 2002 10:29:58 +0000 (10:29 +0000)
committerAdam Dickmeiss <adam@indexdata.dk>
Tue, 22 Oct 2002 10:29:58 +0000 (10:29 +0000)
zutil/grs1disp.c [new file with mode: 0644]

diff --git a/zutil/grs1disp.c b/zutil/grs1disp.c
new file mode 100644 (file)
index 0000000..21221b5
--- /dev/null
@@ -0,0 +1,117 @@
+/*
+ * Copyright (c) 2002, Index Data.
+ * See the file LICENSE for details.
+ *
+ * $Id: grs1disp.c,v 1.1 2002-10-22 10:29:58 adam Exp $
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+
+#include <yaz/proto.h>
+
+static void display_variant(WRBUF w, Z_Variant *v, int level)
+{
+    int i;
+
+    for (i = 0; i < v->num_triples; i++)
+    {
+        printf("%*sclass=%d,type=%d", level * 4, "", *v->triples[i]->zclass,
+            *v->triples[i]->type);
+        if (v->triples[i]->which == Z_Triple_internationalString)
+            printf(",value=%s\n", v->triples[i]->value.internationalString);
+        else
+            printf("\n");
+    }
+}
+
+static void display_grs1(WRBUF w, Z_GenericRecord *r, int level)
+{
+    int i;
+
+    if (!r)
+    {
+        return;
+    }
+    for (i = 0; i < r->num_elements; i++)
+    {
+        Z_TaggedElement *t;
+
+        wrbuf_printf(w, "%*s", level * 4, "");
+        t = r->elements[i];
+        wrbuf_printf(w, "(");
+        if (t->tagType)
+            wrbuf_printf(w, "%d,", *t->tagType);
+        else
+            wrbuf_printf(w, "?,");
+        if (t->tagValue->which == Z_StringOrNumeric_numeric)
+            wrbuf_printf(w, "%d) ", *t->tagValue->u.numeric);
+        else
+            wrbuf_printf(w, "%s) ", t->tagValue->u.string);
+        if (t->content->which == Z_ElementData_subtree)
+        {
+            if (!t->content->u.subtree)
+                printf (" (no subtree)\n");
+            else
+            {
+                wrbuf_printf(w, "\n");
+                display_grs1(w, t->content->u.subtree, level+1);
+            }
+        }
+        else if (t->content->which == Z_ElementData_string)
+            wrbuf_printf(w, "%s\n", t->content->u.string);
+        else if (t->content->which == Z_ElementData_numeric)
+            wrbuf_printf(w, "%d\n", *t->content->u.numeric);
+        else if (t->content->which == Z_ElementData_oid)
+        {
+            int *ip = t->content->u.oid;
+            oident *oent;
+            
+            if ((oent = oid_getentbyoid(t->content->u.oid)))
+                wrbuf_printf(w, "OID: %s\n", oent->desc);
+            else
+            {
+                wrbuf_printf(w, "{");
+                while (ip && *ip >= 0)
+                    wrbuf_printf(w, " %d", *(ip++));
+                wrbuf_printf(w, " }\n");
+            }
+        }
+        else if (t->content->which == Z_ElementData_noDataRequested)
+            wrbuf_printf(w, "[No data requested]\n");
+        else if (t->content->which == Z_ElementData_elementEmpty)
+            wrbuf_printf(w, "[Element empty]\n");
+        else if (t->content->which == Z_ElementData_elementNotThere)
+            wrbuf_printf(w, "[Element not there]\n");
+        else if (t->content->which == Z_ElementData_date)
+            wrbuf_printf(w, "Date: %s\n", t->content->u.date);
+        else if (t->content->which == Z_ElementData_ext)
+        {
+            printf ("External\n");
+            /* we cannot print externals here. Srry */
+        } 
+        else
+            wrbuf_printf(w, "? type = %d\n",t->content->which);
+        if (t->appliedVariant)
+            display_variant(w, t->appliedVariant, level+1);
+        if (t->metaData && t->metaData->supportedVariants)
+        {
+            int c;
+
+            wrbuf_printf(w, "%*s---- variant list\n", (level+1)*4, "");
+            for (c = 0; c < t->metaData->num_supportedVariants; c++)
+            {
+                wrbuf_printf(w, "%*svariant #%d\n", (level+1)*4, "", c);
+                display_variant(w, t->metaData->supportedVariants[c], level+2);
+            }
+        }
+    }
+}
+
+void yaz_display_grs1(WRBUF wrbuf, Z_GenericRecord *r, int flags)
+{
+    display_grs1 (wrbuf, r, 0);
+}
+