+static void trav_attset (data1_handle dh, ZebraExplainInfo zei,
+ data1_attset *p_this)
+{
+ struct zebraExplainAttset *p_reg = zei->attsets;
+
+ if (!p_this)
+ return ;
+ while (p_reg)
+ {
+ if (!strcmp (p_this->name, p_reg->name))
+ break;
+ p_reg = p_reg->next;
+ }
+ if (!p_this)
+ {
+ p_reg = nmem_malloc (zei->nmem, sizeof (*p_reg));
+ p_reg->name = nmem_strdup (zei->nmem, p_this->name);
+ p_reg->ordinal = p_this->ordinal;
+ p_reg->next = zei->attsets;
+ zei->attsets = p_reg;
+ }
+ trav_attset (dh, zei, p_this->children);
+}
+
+static void trav_absyn (data1_handle dh, void *h, data1_absyn *a)
+{
+ logf (LOG_LOG, "absyn %s", a->name);
+ trav_attset (dh, (ZebraExplainInfo) h, a->attset);
+}
+
+static void zebraExplain_writeTarget (ZebraExplainInfo zei)
+{
+ struct zebDatabaseInfoB *zdi;
+ data1_node *node_tgtinfo, *node_list, *node_zebra;
+ Record trec;
+ int sgml_len;
+ char *sgml_buf;
+
+ if (!zei->dirty)
+ return;
+
+ trec = rec_get (zei->records, 1);
+ xfree (trec->info[recInfo_storeData]);
+
+ node_tgtinfo = data1_search_tag (zei->dh, zei->data1_target->child,
+ "targetInfo");
+ assert (node_tgtinfo);
+
+ node_zebra = data1_make_tag (zei->dh, node_tgtinfo,
+ "zebraInfo", zei->nmem);
+ data1_add_tagdata_text (zei->dh, node_zebra, "version",
+ ZEBRAVER, zei->nmem);
+ node_list = data1_add_tag (zei->dh, node_zebra,
+ "databaseList", zei->nmem);
+ for (zdi = zei->databaseInfo; zdi; zdi = zdi->next)
+ {
+ data1_node *node_db;
+ node_db = data1_add_tag (zei->dh, node_list,
+ "database", zei->nmem);
+ data1_add_tagdata_text (zei->dh, node_db, "name",
+ zdi->databaseName, zei->nmem);
+ data1_add_tagdata_int (zei->dh, node_db, "id",
+ zdi->sysno, zei->nmem);
+ }
+ data1_add_tagdata_int (zei->dh, node_zebra, "ordinalSU",
+ zei->ordinalSU, zei->nmem);
+
+ data1_add_tagdata_int (zei->dh, node_zebra, "runNumber",
+ zei->runNumber, zei->nmem);
+
+ node_list = data1_add_tag (zei->dh, node_zebra,
+ "attsetList", zei->nmem);
+ /* convert to "SGML" and write it */
+#if ZINFO_DEBUG
+ data1_pr_tree (zei->dh, zei->data1_target, stderr);
+#endif
+ sgml_buf = data1_nodetoidsgml(zei->dh, zei->data1_target,
+ 0, &sgml_len);
+ trec->info[recInfo_storeData] = xmalloc (sgml_len);
+ memcpy (trec->info[recInfo_storeData], sgml_buf, sgml_len);
+ trec->size[recInfo_storeData] = sgml_len;
+
+ rec_put (zei->records, &trec);
+}
+
+int zebraExplain_lookupSU (ZebraExplainInfo zei, int set, int use)
+{
+ struct zebSUInfoB *zsui;
+
+ assert (zei->curDatabaseInfo);
+ for (zsui = zei->curDatabaseInfo->SUInfo; zsui; zsui=zsui->next)