/*
* 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.5 1996-05-29 20:28:08 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
* Bug fix: Function ir_tcl_grs_del sometimes free'd bad memory.
*
* Revision 1.4 1996/05/29 06:37:42 adam
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:
break;
}
}
- free ((*grs_record)->entries);
- free (*grs_record);
+ xfree ((*grs_record)->entries);
+ xfree (*grs_record);
*grs_record = NULL;
}
for (i = 0; i < r->num_elements; i++, e++)
{
Z_TaggedElement *t;
+ int len;
t = r->elements[i];
if (t->tagType)
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;
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)
}
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;
}
}
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);