The xmalloc/xfree functions from YAZ are used to manage memory.
[ir-tcl-moved-to-github.git] / grs.c
diff --git a/grs.c b/grs.c
index b8e9548..fc62ff9 100644 (file)
--- a/grs.c
+++ b/grs.c
@@ -5,7 +5,16 @@
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: grs.c,v $
- * Revision 1.5  1996-05-29 20:28:08  adam
+ * 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
  * Bug fix: Function ir_tcl_grs_del sometimes free'd bad memory.
  *
  * Revision 1.4  1996/05/29  06:37:42  adam
@@ -53,22 +62,22 @@ 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:
@@ -83,8 +92,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;
 }
 
@@ -174,12 +183,14 @@ static int ir_tcl_get_grs_r (Tcl_Interp *interp, IrTcl_GRS_Record *grs_record,
         else
         {
             const char *cp0 = argv[argno];
-            const char *cp1 = strchr (cp0, '.');
+            const char *cp1 = strchr (cp0, ',');
 
             if (!cp1 || cp1-cp0 < 1)
                 yes = 1;
             else
             {
+                if (*cp0 == '(')
+                    cp0++;
                 if (atoi(cp0) == e->tagType) 
                 {
                     if (e->tagWhich == Z_StringOrNumeric_numeric)
@@ -189,7 +200,11 @@ static int ir_tcl_get_grs_r (Tcl_Interp *interp, IrTcl_GRS_Record *grs_record,
                     }
                     else
                     {
-                        if (!strcmp (cp1+1, e->tagVal.str))
+                        int len = strlen(cp1+1);
+                        if (cp1[len] == ')')
+                            len--;
+                        if (len && strlen(e->tagVal.str) == len &&
+                            !memcmp (cp1+1, e->tagVal.str, len))
                             yes = 1;
                     }
                 }