* Sebastian Hammer, Adam Dickmeiss
*
* $Log: grs.c,v $
- * Revision 1.3 1996-03-05 09:21:01 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
+ * Function ir_tcl_get_grs_r enhanced so that specific elements can be
+ * extracted.
+ *
+ * Revision 1.3 1996/03/05 09:21:01 adam
* Bug fix: memory used by GRS records wasn't freed.
* Rewrote some of the error handling code - the connection is always
* closed before failback is called.
e = (*grs_record)->entries;
for (i = 0; i < (*grs_record)->noTags; i++, e++)
{
- switch (e->tagType)
+ switch (e->tagWhich)
{
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:
break;
}
}
- free ((*grs_record)->entries);
- free (*grs_record);
+ xfree ((*grs_record)->entries);
+ xfree (*grs_record);
*grs_record = NULL;
}
int i;
struct GRS_Record_entry *e = grs_record->entries;
- if (argno >= argc)
+ for (i = 0; i<grs_record->noTags; i++, e++)
{
- for (i = 0; i<grs_record->noTags; i++, e++)
+ int yes = 0;
+ if (argno >= argc)
+ yes = 1;
+ else
{
+ const char *cp0 = argv[argno];
+ const char *cp1 = strchr (cp0, ',');
- Tcl_AppendResult (interp, "{ ", NULL);
- sprintf (tmpbuf, "%d", e->tagType);
- Tcl_AppendElement (interp, tmpbuf);
-
- if (e->tagWhich == Z_StringOrNumeric_numeric)
- {
- Tcl_AppendResult (interp, " numeric ", NULL);
- sprintf (tmpbuf, "%d", e->tagVal.num);
- Tcl_AppendElement (interp, tmpbuf);
- }
+ if (!cp1 || cp1-cp0 < 1)
+ yes = 1;
else
{
- Tcl_AppendResult (interp, " string ", NULL);
- Tcl_AppendElement (interp, e->tagVal.str);
- }
- switch (e->dataWhich)
- {
- case Z_ElementData_octets:
- Tcl_AppendResult (interp, " octets {} ", NULL);
- break;
- case Z_ElementData_numeric:
- Tcl_AppendResult (interp, " numeric {} ", NULL);
- break;
- case Z_ElementData_date:
- Tcl_AppendResult (interp, " date {} ", NULL);
- break;
- case Z_ElementData_ext:
- Tcl_AppendResult (interp, " ext {} ", NULL);
- break;
- case Z_ElementData_string:
- Tcl_AppendResult (interp, " string ", NULL);
- Tcl_AppendElement (interp, e->tagData.str );
- break;
- case Z_ElementData_trueOrFalse:
- Tcl_AppendResult (interp, " bool ",
- e->tagData.bool ? "1" : "0", " ", NULL);
- break;
- case Z_ElementData_oid:
- Tcl_AppendResult (interp, " oid {} ", NULL);
- break;
- case Z_ElementData_intUnit:
- Tcl_AppendResult (interp, " intUnit {} ", NULL);
- break;
- case Z_ElementData_elementNotThere:
- Tcl_AppendResult (interp, " notThere {} ", NULL);
- break;
- case Z_ElementData_elementEmpty:
- Tcl_AppendResult (interp, " empty {} ", NULL);
- break;
- case Z_ElementData_noDataRequested:
- Tcl_AppendResult (interp, " notRequested {} ", NULL);
- break;
- case Z_ElementData_diagnostic:
- Tcl_AppendResult (interp, " diagnostic {} ", NULL);
- break;
- case Z_ElementData_subtree:
- Tcl_AppendResult (interp, " subtree { ", NULL);
- ir_tcl_get_grs_r (interp, e->tagData.sub, argc, argv, argno+1);
- Tcl_AppendResult (interp, " } ", NULL);
- break;
+ if (*cp0 == '(')
+ cp0++;
+ if (atoi(cp0) == e->tagType)
+ {
+ if (e->tagWhich == Z_StringOrNumeric_numeric)
+ {
+ if (atoi (cp1+1) == e->tagVal.num)
+ yes = 1;
+ }
+ else
+ {
+ 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;
+ }
+ }
}
+ }
+ if (!yes)
+ continue;
+ Tcl_AppendResult (interp, "{ ", NULL);
+ sprintf (tmpbuf, "%d", e->tagType);
+ Tcl_AppendElement (interp, tmpbuf);
+
+ if (e->tagWhich == Z_StringOrNumeric_numeric)
+ {
+ Tcl_AppendResult (interp, " numeric ", NULL);
+ sprintf (tmpbuf, "%d", e->tagVal.num);
+ Tcl_AppendElement (interp, tmpbuf);
+ }
+ else
+ {
+ Tcl_AppendResult (interp, " string ", NULL);
+ Tcl_AppendElement (interp, e->tagVal.str);
+ }
+ switch (e->dataWhich)
+ {
+ case Z_ElementData_octets:
+ Tcl_AppendResult (interp, " octets {} ", NULL);
+ break;
+ case Z_ElementData_numeric:
+ Tcl_AppendResult (interp, " numeric ", NULL);
+ sprintf (tmpbuf, "%d", e->tagData.num);
+ Tcl_AppendElement (interp, tmpbuf);
+ break;
+ case Z_ElementData_date:
+ Tcl_AppendResult (interp, " date {} ", NULL);
+ break;
+ case Z_ElementData_ext:
+ Tcl_AppendResult (interp, " ext {} ", NULL);
+ break;
+ case Z_ElementData_string:
+ Tcl_AppendResult (interp, " string ", NULL);
+ Tcl_AppendElement (interp, e->tagData.str);
+ break;
+ case Z_ElementData_trueOrFalse:
+ Tcl_AppendResult (interp, " bool ",
+ e->tagData.bool ? "1" : "0", " ", NULL);
+ break;
+ case Z_ElementData_oid:
+ Tcl_AppendResult (interp, " oid {} ", NULL);
+ break;
+ case Z_ElementData_intUnit:
+ Tcl_AppendResult (interp, " intUnit {} ", NULL);
+ break;
+ case Z_ElementData_elementNotThere:
+ Tcl_AppendResult (interp, " notThere {} ", NULL);
+ break;
+ case Z_ElementData_elementEmpty:
+ Tcl_AppendResult (interp, " empty {} ", NULL);
+ break;
+ case Z_ElementData_noDataRequested:
+ Tcl_AppendResult (interp, " notRequested {} ", NULL);
+ break;
+ case Z_ElementData_diagnostic:
+ Tcl_AppendResult (interp, " diagnostic {} ", NULL);
+ break;
+ case Z_ElementData_subtree:
+ Tcl_AppendResult (interp, " subtree { ", NULL);
+ ir_tcl_get_grs_r (interp, e->tagData.sub, argc, argv, argno+1);
Tcl_AppendResult (interp, " } ", NULL);
+ break;
}
+ Tcl_AppendResult (interp, " } ", NULL);
}
return TCL_OK;
}
int ir_tcl_get_grs (Tcl_Interp *interp, IrTcl_GRS_Record *grs_record,
int argc, char **argv)
{
- return ir_tcl_get_grs_r (interp, grs_record, argc, argv, 4);
+ return ir_tcl_get_grs_r (interp, grs_record, argc, argv, 3);
}