+
+ if (argc == 3)
+ {
+ free (obj->setName);
+ if (ir_strdup (interp, &obj->setName, argv[2])
+ == TCL_ERROR)
+ return TCL_ERROR;
+ }
+ Tcl_AppendElement (interp, obj->setName);
+ return TCL_OK;
+}
+
+/*
+ * do_numberOfRecordsReturned: Get number of records returned
+ */
+static int do_numberOfRecordsReturned (void *o, Tcl_Interp *interp,
+ int argc, char **argv)
+{
+ IRSetObj *obj = o;
+
+ return get_set_int (&obj->numberOfRecordsReturned, interp, argc, argv);
+}
+
+static int get_marc_fields(Tcl_Interp *interp, Iso2709Rec rec,
+ int argc, char **argv)
+{
+ Iso2709Anchor a;
+ char *data;
+
+ if (!rec)
+ return TCL_OK;
+ a = iso2709_a_mk (rec);
+ while (iso2709_a_search (a, argv[4], argv[5], argv[6]))
+ {
+ if (!(iso2709_a_info_field (a, NULL, NULL, NULL, &data)))
+ break;
+ Tcl_AppendElement (interp, data);
+ iso2709_a_next (a);
+ }
+
+ iso2709_a_rm (a);
+ return TCL_OK;
+}
+
+static int get_marc_lines(Tcl_Interp *interp, Iso2709Rec rec,
+ int argc, char **argv)
+{
+ Iso2709Anchor a;
+ char *tag;
+ char *indicator;
+ char *identifier;
+ char *data;
+ char *ptag = "";
+
+ if (!rec)
+ return TCL_OK;
+ a = iso2709_a_mk (rec);
+ while (iso2709_a_search (a, argv[4], argv[5], argv[6]))
+ {
+ if (!(iso2709_a_info_field (a, &tag, &indicator, &identifier, &data)))
+ break;
+ if (strcmp (tag, ptag))
+ {
+ if (*ptag)
+ Tcl_AppendResult (interp, "}} ", NULL);
+ if (!indicator)
+ Tcl_AppendResult (interp, "{", tag, " {} {", NULL);
+ else
+ Tcl_AppendResult (interp, "{", tag, " {", indicator,
+ "} {", NULL);
+ ptag = tag;
+ }
+ if (!identifier)
+ Tcl_AppendResult (interp, "{{}", NULL);
+ else
+ Tcl_AppendResult (interp, "{", identifier, NULL);
+ Tcl_AppendElement (interp, data);
+ Tcl_AppendResult (interp, "} ", NULL);
+ iso2709_a_next (a);
+ }
+ if (*ptag)
+ Tcl_AppendResult (interp, "}} ", NULL);
+ iso2709_a_rm (a);
+ return TCL_OK;
+}
+
+/*
+ * do_recordType: Return record type (if any) at position.
+ */
+static int do_recordType (void *o, Tcl_Interp *interp, int argc, char **argv)
+{
+ IRSetObj *obj = o;
+ int offset;
+ IRRecordList *rl;
+
+ if (argc < 3)
+ {
+ sprintf (interp->result, "wrong # args");
+ return TCL_ERROR;
+ }
+ if (Tcl_GetInt (interp, argv[2], &offset)==TCL_ERROR)
+ return TCL_ERROR;
+ rl = find_IR_record (obj, offset);
+ if (!rl)
+ return TCL_OK;
+ switch (rl->which)
+ {
+ case Z_NamePlusRecord_databaseRecord:
+ interp->result = "databaseRecord";
+ break;
+ case Z_NamePlusRecord_surrogateDiagnostic:
+ interp->result = "surrogateDiagnostic";
+ break;
+ }
+ return TCL_OK;
+}
+
+/*
+ * do_recordDiag: Return diagnostic record info
+ */
+static int do_recordDiag (void *o, Tcl_Interp *interp, int argc, char **argv)
+{
+ IRSetObj *obj = o;
+ int offset;
+ IRRecordList *rl;
+ char buf[20];
+
+ if (argc < 3)
+ {
+ sprintf (interp->result, "wrong # args");
+ return TCL_ERROR;
+ }
+ if (Tcl_GetInt (interp, argv[2], &offset)==TCL_ERROR)
+ return TCL_ERROR;
+ rl = find_IR_record (obj, offset);
+ if (!rl)
+ {
+ Tcl_AppendResult (interp, "No record at #", argv[2], NULL);
+ return TCL_ERROR;
+ }
+ if (rl->which != Z_NamePlusRecord_surrogateDiagnostic)
+ {
+ Tcl_AppendResult (interp, "No Diagnostic record at #", argv[2], NULL);
+ return TCL_ERROR;
+ }
+ sprintf (buf, "%d", rl->u.diag.condition);
+ Tcl_AppendResult (interp, buf, " {",
+ (rl->u.diag.addinfo ? rl->u.diag.addinfo : ""),
+ "}", NULL);
+ return TCL_OK;
+}
+
+/*
+ * do_recordMarc: Get ISO2709 Record lines/fields
+ */
+static int do_recordMarc (void *o, Tcl_Interp *interp, int argc, char **argv)
+{
+ IRSetObj *obj = o;
+ int offset;
+ IRRecordList *rl;
+
+ if (argc < 4)
+ {
+ sprintf (interp->result, "wrong # args");
+ return TCL_ERROR;
+ }
+ if (Tcl_GetInt (interp, argv[2], &offset)==TCL_ERROR)
+ return TCL_ERROR;
+ rl = find_IR_record (obj, offset);
+ if (!rl)
+ {
+ Tcl_AppendResult (interp, "No record at #", argv[2], NULL);
+ return TCL_ERROR;
+ }
+ if (rl->which != Z_NamePlusRecord_databaseRecord)
+ {
+ Tcl_AppendResult (interp, "No MARC record at #", argv[2], NULL);
+ return TCL_ERROR;
+ }
+ if (!strcmp (argv[3], "field"))
+ return get_marc_fields (interp, rl->u.marc.rec, argc, argv);
+ else if (!strcmp (argv[3], "line"))
+ return get_marc_lines (interp, rl->u.marc.rec, argc, argv);
+ else
+ {
+ Tcl_AppendResult (interp, "field/line expected", NULL);
+ return TCL_ERROR;
+ }
+}
+
+
+/*
+ * do_responseStatus: Return response status (present or search)
+ */
+static int do_responseStatus (void *o, Tcl_Interp *interp,
+ int argc, char **argv)
+{
+ IRSetObj *obj = o;
+
+ if (!obj->recordFlag)
+ return TCL_OK;
+ switch (obj->which)
+ {
+ case Z_Records_DBOSD:
+ Tcl_AppendElement (interp, "DBOSD");
+ break;
+ case Z_Records_NSD:
+ return mk_nonSurrogateDiagnostics (interp, obj->condition,
+ obj->addinfo);
+ }
+ return TCL_OK;
+}
+
+/*
+ * do_present: Perform Present Request
+ */
+
+static int do_present (void *o, Tcl_Interp *interp,
+ int argc, char **argv)
+{
+ IRSetObj *obj = o;
+ IRObj *p = obj->parent;
+ Z_APDU apdu, *apdup = &apdu;
+ Z_PresentRequest req;
+ int start;
+ int number;
+ int r;