Allow YAZ 2 series only
[ir-tcl-moved-to-github.git] / grs.c
diff --git a/grs.c b/grs.c
index fa8de69..2adc2e0 100644 (file)
--- a/grs.c
+++ b/grs.c
@@ -1,11 +1,26 @@
 /*
  * IR toolkit for tcl/tk
- * (c) Index Data 1995
+ * (c) Index Data 1995-1997
  * See the file LICENSE for details.
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: grs.c,v $
- * Revision 1.6  1996-06-05 08:59:23  adam
+ * Revision 1.11  1997-11-19 11:22:09  adam
+ * Object identifiers can be accessed in GRS-1 records.
+ *
+ * Revision 1.10  1997/09/09 10:19:52  adam
+ * New MSV5.0 port with fewer warnings.
+ *
+ * Revision 1.9  1996/08/16 15:07:44  adam
+ * First work on Explain.
+ *
+ * Revision 1.8  1996/07/03  13:31:10  adam
+ * The xmalloc/xfree functions from YAZ are used to manage memory.
+ *
+ * Revision 1.7  1996/06/05  09:26:20  adam
+ * Bug fix: the change above introduced an error.
+ *
+ * Revision 1.6  1996/06/05  08:59:23  adam
  * Changed syntax of element specs in GRS-1 retrieval.
  *
  * Revision 1.5  1996/05/29  20:28:08  adam
@@ -56,25 +71,27 @@ void ir_tcl_grs_del (IrTcl_GRS_Record **grs_record)
         case Z_StringOrNumeric_numeric:
             break;
         default:
-            free (e->tagVal.str);
+            xfree (e->tagVal.str);
         }
         switch (e->dataWhich)
         {
         case Z_ElementData_octets:
-            free (e->tagData.octets.buf);
+            xfree (e->tagData.octets.buf);
             break;
         case Z_ElementData_numeric:
             break;
         case Z_ElementData_date:
-            free (e->tagData.str);
+            xfree (e->tagData.str);
             break;            
         case Z_ElementData_ext:
             break;
         case Z_ElementData_string:
-           free (e->tagData.str);
+           xfree (e->tagData.str);
             break;
         case Z_ElementData_trueOrFalse:
         case Z_ElementData_oid:
+           xfree (e->tagData.oid);
+           break;
         case Z_ElementData_intUnit:
         case Z_ElementData_elementNotThere:
         case Z_ElementData_elementEmpty:
@@ -86,8 +103,8 @@ void ir_tcl_grs_del (IrTcl_GRS_Record **grs_record)
             break;
         }
     }
-    free ((*grs_record)->entries);
-    free (*grs_record);
+    xfree ((*grs_record)->entries);
+    xfree (*grs_record);
     *grs_record = NULL;
 }
 
@@ -110,6 +127,7 @@ void ir_tcl_grs_mk (Z_GenericRecord *r, IrTcl_GRS_Record **grs_record)
     for (i = 0; i < r->num_elements; i++, e++)
     {
         Z_TaggedElement *t;
+       int len;
 
         t = r->elements[i];
         if (t->tagType)
@@ -146,6 +164,10 @@ void ir_tcl_grs_mk (Z_GenericRecord *r, IrTcl_GRS_Record **grs_record)
             e->tagData.bool = *t->content->u.trueOrFalse;
             break;
         case Z_ElementData_oid:
+           len = 1+oid_oidlen (t->content->u.oid);
+           e->tagData.oid = ir_tcl_malloc (len * sizeof(*e->tagData.oid));
+           memcpy (e->tagData.oid, t->content->u.oid,
+                   len * sizeof(*e->tagData.oid));
             break;
         case Z_ElementData_intUnit:
             break;
@@ -184,7 +206,7 @@ static int ir_tcl_get_grs_r (Tcl_Interp *interp, IrTcl_GRS_Record *grs_record,
             else
             {
                 if (*cp0 == '(')
-                    cp++;
+                    cp0++;
                 if (atoi(cp0) == e->tagType) 
                 {
                     if (e->tagWhich == Z_StringOrNumeric_numeric)
@@ -194,7 +216,11 @@ static int ir_tcl_get_grs_r (Tcl_Interp *interp, IrTcl_GRS_Record *grs_record,
                     }
                     else
                     {
-                        if (!strcmp (cp1+1, e->tagVal.str))
+                        size_t len = strlen(cp1+1);
+                        if (cp1[len] == ')')
+                            len--;
+                        if (len && strlen(e->tagVal.str) == len &&
+                            !memcmp (cp1+1, e->tagVal.str, len))
                             yes = 1;
                     }
                 }
@@ -242,7 +268,20 @@ static int ir_tcl_get_grs_r (Tcl_Interp *interp, IrTcl_GRS_Record *grs_record,
                               e->tagData.bool ? "1" : "0", " ", NULL);
             break;
         case Z_ElementData_oid:
-            Tcl_AppendResult (interp, " oid {} ", NULL);
+            Tcl_AppendResult (interp, " oid", NULL);
+           if (!e->tagData.oid)
+               Tcl_AppendResult (interp, "{}", NULL);
+           else
+           {
+               int i;
+               int sep = ' ';
+               for (i = 0; e->tagData.oid[i] >= 0; i++)
+               {
+                   sprintf (tmpbuf, "%c%d", sep, e->tagData.oid[i]);
+                   Tcl_AppendResult (interp, tmpbuf, NULL);
+                   sep = '.';
+               }
+           }
             break;
         case Z_ElementData_intUnit:
             Tcl_AppendResult (interp, " intUnit {} ", NULL);