+ for (zsui = &zei->curDatabaseInfo->attributeDetails->SUInfo;
+ *zsui; zsui = &(*zsui)->next)
+ if ( (index_type == -1 || (*zsui)->info.index_type == index_type)
+ && (*zsui)->info.cat == cat
+ && (*zsui)->info.which == ZEB_SU_STR
+ && !yaz_matchstr((*zsui)->info.u.str, str))
+ {
+ struct zebSUInfoB *zsui_this = *zsui;
+
+ /* take it out of the list and move to front */
+ *zsui = (*zsui)->next;
+ zsui_this->next = zei->curDatabaseInfo->attributeDetails->SUInfo;
+ zei->curDatabaseInfo->attributeDetails->SUInfo = zsui_this;
+
+ return zsui_this->info.ordinal;
+ }
+ return -1;
+}
+
+int zebraExplain_trav_ord(ZebraExplainInfo zei, void *handle,
+ int (*f)(void *handle, int ord))
+{
+ struct zebDatabaseInfoB *zdb = zei->curDatabaseInfo;
+ if (zdb)
+ {
+ struct zebSUInfoB *zsui = zdb->attributeDetails->SUInfo;
+ for ( ;zsui; zsui = zsui->next)
+ (*f)(handle, zsui->info.ordinal);
+ }
+ return 0;
+}
+
+
+struct zebSUInfoB *zebraExplain_get_sui_info (ZebraExplainInfo zei, int ord,
+ int dirty_mark,
+ const char **db)
+{
+ struct zebDatabaseInfoB *zdb;
+
+ for (zdb = zei->databaseInfo; zdb; zdb = zdb->next)
+ {
+ struct zebSUInfoB **zsui;
+
+ if (zdb->attributeDetails->readFlag)
+ zebraExplain_readAttributeDetails (zei, zdb->attributeDetails);
+
+ for (zsui = &zdb->attributeDetails->SUInfo; *zsui;
+ zsui = &(*zsui)->next)
+ if ((*zsui)->info.ordinal == ord)
+ {
+ struct zebSUInfoB *zsui_this = *zsui;
+
+ /* take it out of the list and move to front */
+ *zsui = (*zsui)->next;
+ zsui_this->next = zdb->attributeDetails->SUInfo;
+ zdb->attributeDetails->SUInfo = zsui_this;
+
+ if (dirty_mark)
+ zdb->attributeDetails->dirty = 1;
+ if (db)
+ *db = zdb->databaseName;
+ return zsui_this;
+ }
+ }
+ return 0;
+}
+
+
+
+int zebraExplain_ord_adjust_occurrences(ZebraExplainInfo zei, int ord,
+ int term_delta, int doc_delta)
+{
+ struct zebSUInfoB *zsui = zebraExplain_get_sui_info(zei, ord, 1, 0);
+ if (zsui)
+ {
+ zsui->info.term_occurrences += term_delta;
+ zsui->info.doc_occurrences += doc_delta;
+ return 0;
+ }
+ return -1;
+}
+
+int zebraExplain_ord_get_occurrences(ZebraExplainInfo zei, int ord,
+ zint *term_occurrences,
+ zint *doc_occurrences)
+{
+ struct zebSUInfoB *zsui = zebraExplain_get_sui_info(zei, ord, 0, 0);
+ if (zsui)
+ {
+ *term_occurrences = zsui->info.term_occurrences;
+ *doc_occurrences = zsui->info.doc_occurrences;
+ return 0;
+ }
+ return -1;
+}
+
+zint zebraExplain_ord_get_doc_occurrences(ZebraExplainInfo zei, int ord)
+{
+ struct zebSUInfoB *zsui = zebraExplain_get_sui_info(zei, ord, 0, 0);
+ if (zsui)
+ return zsui->info.doc_occurrences;
+ return 0;
+}
+
+zint zebraExplain_ord_get_term_occurrences(ZebraExplainInfo zei, int ord)
+{
+ struct zebSUInfoB *zsui = zebraExplain_get_sui_info(zei, ord, 0, 0);
+ if (zsui)
+ return zsui->info.term_occurrences;
+ return 0;
+}
+
+int zebraExplain_lookup_ord(ZebraExplainInfo zei, int ord,
+ int *index_type,
+ const char **db,
+ const char **string_index)
+{
+ struct zebSUInfoB *zsui;
+
+ if (index_type)
+ *index_type = 0;
+ if (string_index)
+ *string_index = 0;
+
+ zsui = zebraExplain_get_sui_info(zei, ord, 0, db);
+ if (zsui)
+ {
+ if (zsui->info.which == ZEB_SU_STR)
+ if (string_index)
+ *string_index = zsui->info.u.str;
+ if (index_type)
+ *index_type = zsui->info.index_type;
+ return 0;
+ }