Merge branch 'master' into yaz-728
[yaz-moved-to-github.git] / src / oid_db.c
index 1c5448b..4dc088d 100644 (file)
@@ -1,11 +1,10 @@
-/*
- * Copyright (C) 1995-2007, Index Data ApS
+/* This file is part of the YAZ toolkit.
+ * Copyright (C) Index Data
  * See the file LICENSE for details.
- *
- * $Id: oid_db.c,v 1.1 2007-04-12 13:52:57 adam Exp $
  */
 
 /**
+ * \file oid_db.c
  * \brief OID Database
  */
 #if HAVE_CONFIG_H
 
 #include <stdlib.h>
 #include <string.h>
-#include <ctype.h>
 
 #include <yaz/yaz-util.h>
 #include <yaz/odr.h>
 #include <yaz/oid_util.h>
 #include <yaz/oid_db.h>
 
-struct yaz_oid_entry {
-    int oclass;
-    int oid[10];
-    char *name;
+struct yaz_oid_db {
+     struct yaz_oid_entry *entries;
+     struct yaz_oid_db *next;
+     int xmalloced;
 };
 
-#define Z3950_PREFIX 1, 2, 840, 10003
-
-static struct yaz_oid_entry standard_oids[] =
-{
-    /* General definitions */
-    {CLASS_TRANSYN, {2, 1, 1,-1}, "BER" },
-    {CLASS_TRANSYN, {1, 0, 2709, 1, 1,-1},  "ISO2709"},
-    {CLASS_GENERAL, {1, 0, 10161, 2, 1,-1},  OID_STR_ILL_1 },
-    {CLASS_ABSYN, {2, 1,-1}, "Z-APDU"}, 
-    {CLASS_APPCTX, {1, 1,-1}, "Z-BASIC"},
-    {CLASS_ATTSET, {Z3950_PREFIX, 3, 1,-1}, "Bib-1"},
-    {CLASS_ATTSET, {Z3950_PREFIX, 3, 2,-1}, "Exp-1"},
-    {CLASS_ATTSET, {Z3950_PREFIX, 3, 3,-1}, "Ext-1"},
-    {CLASS_ATTSET, {Z3950_PREFIX, 3, 4,-1}, "CCL-1"},
-    {CLASS_ATTSET, {Z3950_PREFIX, 3, 5,-1}, "GILS"},
-    {CLASS_ATTSET, {Z3950_PREFIX, 3, 5,-1}, "GILS-attset"},
-    {CLASS_ATTSET, {Z3950_PREFIX, 3, 6,-1}, "STAS-attset"},
-    {CLASS_ATTSET, {Z3950_PREFIX, 3, 7,-1}, "Collections-attset"},
-    {CLASS_ATTSET, {Z3950_PREFIX, 3, 8,-1}, "CIMI-attset"},
-    {CLASS_ATTSET, {Z3950_PREFIX, 3, 9,-1}, "Geo-attset"},
-    {CLASS_ATTSET, {Z3950_PREFIX, 3, 10,-1}, "ZBIG"},
-    {CLASS_ATTSET, {Z3950_PREFIX, 3, 11,-1}, "Util"},
-    {CLASS_ATTSET, {Z3950_PREFIX, 3, 12,-1}, "XD-1"},
-    {CLASS_ATTSET, {Z3950_PREFIX, 3, 13,-1}, "Zthes"},
-    {CLASS_ATTSET, {Z3950_PREFIX, 3, 14,-1}, "Fin-1"},
-    {CLASS_ATTSET, {Z3950_PREFIX, 3, 15,-1}, "Dan-1"},
-    {CLASS_ATTSET, {Z3950_PREFIX, 3, 16,-1}, "Holdings"},
-    {CLASS_ATTSET, {Z3950_PREFIX, 3, 17,-1}, "MARC"},
-    {CLASS_ATTSET, {Z3950_PREFIX, 3, 18,-1}, "Bib-2"},
-    {CLASS_ATTSET, {Z3950_PREFIX, 3, 19,-1}, "ZeeRex"},
-    /* New applications should use Zthes-1 instead of this Satan-spawn */
-    {CLASS_ATTSET, {Z3950_PREFIX, 3,1000, 81,1,-1},
-     "Thesaurus-attset"},
-    {CLASS_ATTSET, {Z3950_PREFIX, 3,1000, 81,2,-1},
-     "IDXPATH"},
-    {CLASS_ATTSET, {Z3950_PREFIX, 3,1000, 81,3,-1},
-     "EXTLITE"},
-    {CLASS_DIAGSET, {Z3950_PREFIX, 4, 1,-1},
-     OID_STR_BIB1},
-    {CLASS_DIAGSET, {Z3950_PREFIX, 4, 2,-1},
-     OID_STR_DIAG1},
-    {CLASS_DIAGSET, {Z3950_PREFIX, 4, 3,-1},
-     "Diag-ES"},
-    {CLASS_DIAGSET,  {Z3950_PREFIX, 4, 3,-1},
-     "Diag-General"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 1,-1},
-     "Unimarc"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 2,-1},
-     "Intermarc"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 3,-1},
-     "CCF"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 10,-1},
-     OID_STR_USMARC},
-    /* MARC21 is just an alias for the original USmarc */
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 10,-1},
-     "MARC21"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 11,-1},
-     "UKmarc"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 12,-1},
-     "Normarc"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 13,-1},
-     "Librismarc"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 14,-1},
-     "Danmarc"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 15,-1},
-     "Finmarc"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 16,-1},
-     "MAB"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 17,-1},
-     "Canmarc"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 18,-1},
-     "SBN"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 19,-1},
-     "Picamarc"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 20,-1},
-     "Ausmarc"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 21,-1},
-     "Ibermarc"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 22,-1},
-     "Carmarc"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 23,-1},
-     "Malmarc"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 24,-1},
-     "JPmarc"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 25,-1},
-     "SWEmarc"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 26,-1},
-     "SIGLEmarc"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 27,-1},
-     "ISDSmarc"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 28,-1},
-     "RUSmarc"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 29,-1},
-     "Hunmarc"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 30,-1},
-     "NACSIS-CATP"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 31,-1},
-     "FINMARC2000"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 32,-1},
-     "MARC21-fin"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 100,-1},
-     OID_STR_EXPLAIN},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 101,-1},
-     OID_STR_SUTRS},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 102,-1},
-     OID_STR_OPAC},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 103,-1},
-     OID_STR_SUMMARY},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 104,-1},
-     "GRS-0"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 105,-1},
-     OID_STR_GRS1 },
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 106,-1},
-     OID_STR_EXTENDED},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 107,-1},
-     "Fragment"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 109,1,-1},
-     "pdf"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 109,2,-1},
-     OID_STR_POSTSCRIPT},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 109,3,-1},
-     OID_STR_HTML},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 109,4,-1},
-     "tiff"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 109,5,-1},
-     "gif"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 109,6,-1},
-     "jpeg"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 109,7,-1},
-     "png"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 109,8,-1},
-     "mpeg"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 109,9,-1},
-     "sgml"},
-
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 110,1,-1},
-     "tiff-b"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 110,2,-1},
-     "wav"},
-
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 111,-1},
-     "SQL-RS"},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 1000, 81, 2,-1},
-     OID_STR_SOIF},
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 109, 10,-1},
-     OID_STR_XML },
-    {CLASS_RECSYN, {Z3950_PREFIX, 5, 109, 10,-1},
-     "application-XML"},
-    {CLASS_RECSYN,   {Z3950_PREFIX, 5, 109, 11,-1},
-     OID_STR_APPLICATION_XML },
-    {CLASS_RESFORM, {Z3950_PREFIX, 7, 1,-1},
-     "Resource-1"},
-    {CLASS_RESFORM, {Z3950_PREFIX, 7, 2,-1},
-     "Resource-2"},
-    {CLASS_RESFORM,  {Z3950_PREFIX, 7, 1000, 81, 1,-1},
-     "UNIverse-Resource-Report"},
-
-    {CLASS_ACCFORM, {Z3950_PREFIX, 8, 1,-1},
-     "Prompt-1"},
-    {CLASS_ACCFORM, {Z3950_PREFIX, 8, 2,-1},
-     "Des-1"},
-    {CLASS_ACCFORM, {Z3950_PREFIX, 8, 3,-1},
-     "Krb-1"},
-    {CLASS_EXTSERV, {Z3950_PREFIX, 9, 1,-1},
-     "Pers. set"},
-    {CLASS_EXTSERV, {Z3950_PREFIX, 9, 2,-1},
-     "Pers. query"},
-    {CLASS_EXTSERV, {Z3950_PREFIX, 9, 3,-1},
-     "Per'd query"},
-    {CLASS_EXTSERV, {Z3950_PREFIX, 9, 4,-1},
-     OID_STR_ITEMORDER },
-    {CLASS_EXTSERV, {Z3950_PREFIX, 9, 5,-1},
-     "DB. Update (first version)"},
-    {CLASS_EXTSERV, {Z3950_PREFIX, 9, 5,1,-1},
-     "DB. Update (second version)"},
-    {CLASS_EXTSERV, {Z3950_PREFIX, 9, 5, 1, 1,-1},
-     OID_STR_EXT_UPDATE},
-    {CLASS_EXTSERV, {Z3950_PREFIX, 9, 6,-1},
-     "exp. spec."},
-    {CLASS_EXTSERV, {Z3950_PREFIX, 9, 7,-1},
-     "exp. inv."},
-    {CLASS_EXTSERV,  {Z3950_PREFIX, 9, 1000, 81, 1,-1},
-     OID_STR_ADMIN},
-    {CLASS_USERINFO, {Z3950_PREFIX, 10, 1,-1},
-     "searchResult-1"},
-    {CLASS_USERINFO, {Z3950_PREFIX, 10, 2,-1},
-     "CharSetandLanguageNegotiation"},
-    {CLASS_USERINFO, {Z3950_PREFIX, 10, 3,-1},
-     OID_STR_USERINFO_1},
-    {CLASS_USERINFO,   {Z3950_PREFIX, 10, 4,-1},
-     "MultipleSearchTerms-1"},
-    {CLASS_USERINFO,   {Z3950_PREFIX, 10, 5,-1},
-     "MultipleSearchTerms-2"},
-    {CLASS_USERINFO, {Z3950_PREFIX, 10, 6,-1},
-     "DateTime"},
-    {CLASS_USERINFO, {Z3950_PREFIX, 10, 1000, 81, 1,-1},
-     OID_STR_PROXY},
-    {CLASS_USERINFO, {Z3950_PREFIX, 10, 1000, 81, 2,-1},
-     OID_STR_COOKIE},
-    {CLASS_USERINFO, {Z3950_PREFIX, 10, 1000, 81, 3,-1},
-     OID_STR_CLIENT_IP },
-    {CLASS_ELEMSPEC, {1, 2, 840, 1003, 11, 1,-1},
-     "Espec-1"},
-    {CLASS_VARSET, {Z3950_PREFIX, 12, 1,-1},
-     "Variant-1"},
-    {CLASS_SCHEMA, {Z3950_PREFIX, 13, 1,-1},
-     "WAIS-schema"},
-    {CLASS_SCHEMA, {Z3950_PREFIX, 13, 2,-1},
-     "GILS-schema"},
-    {CLASS_SCHEMA, {Z3950_PREFIX, 13, 3,-1},
-     "Collections-schema"},
-    {CLASS_SCHEMA, {Z3950_PREFIX, 13, 4,-1},
-     "Geo-schema"},
-    {CLASS_SCHEMA, {Z3950_PREFIX, 13, 5,-1},
-     "CIMI-schema"},
-    {CLASS_SCHEMA, {Z3950_PREFIX, 13, 6,-1},
-     "Update ES"},
-    {CLASS_SCHEMA, {Z3950_PREFIX, 13, 7,-1},
-     "Holdings"},
-    {CLASS_SCHEMA, {Z3950_PREFIX, 13, 8,-1},
-     "Zthes"},
-    {CLASS_SCHEMA, {Z3950_PREFIX, 13, 1000, 81, 1,-1},
-     "thesaurus-schema"},
-    {CLASS_SCHEMA, {Z3950_PREFIX, 13, 1000, 81, 2,-1},
-     "Explain-schema"},
-    {CLASS_TAGSET, {Z3950_PREFIX, 14, 1,-1},
-     "TagsetM"},
-    {CLASS_TAGSET, {Z3950_PREFIX, 14, 2,-1},
-     "TagsetG"},
-    {CLASS_TAGSET, {Z3950_PREFIX, 14, 3,-1},
-     "STAS-tagset"},
-    {CLASS_TAGSET, {Z3950_PREFIX, 14, 4,-1},
-     "GILS-tagset"},
-    {CLASS_TAGSET, {Z3950_PREFIX, 14, 5,-1},
-     "Collections-tagset"},
-    {CLASS_TAGSET, {Z3950_PREFIX, 14, 6,-1},
-     "CIMI-tagset"},
-    {CLASS_TAGSET, {Z3950_PREFIX, 14, 1000, 81, 1,-1},
-     "thesaurus-tagset"}, 
-    {CLASS_TAGSET, {Z3950_PREFIX, 14, 1000, 81, 2,-1},
-     "Explain-tagset"},
-    {CLASS_TAGSET, {Z3950_PREFIX, 14, 8,-1},
-     "Zthes-tagset"},
-    {CLASS_NEGOT, {Z3950_PREFIX, 15, 3,-1},
-     OID_STR_CHARNEG_3 },
-    {CLASS_NEGOT, {Z3950_PREFIX, 15, 4,-1},
-     OID_STR_CHARNEG_4 },
-    {CLASS_NEGOT, {Z3950_PREFIX, 15, 1000, 81,1,-1},
-     OID_STR_ID_CHARSET },
-    {CLASS_USERINFO, {1, 2, 840, 1003, 16,  2, -1},
-     "CQL"},
-    {CLASS_GENERAL, {1,0,10646,1,0,2,-1},
-     "UCS-2"},
-    {CLASS_GENERAL, {1,0,10646,1,0,4,-1},
-     "UCS-4"},
-    {CLASS_GENERAL, {1,0,10646,1,0,5,-1},
-     "UTF-16"},
-    {CLASS_GENERAL, {1,0,10646,1,0,8,-1},
-     "UTF-8"},
-    {CLASS_USERINFO, {Z3950_PREFIX, 10, 1000, 17, 1, -1},
-     "OCLC-userInfo"},
-    {CLASS_EXTSERV, {Z3950_PREFIX, 9, 1000,105,4,-1},
-     OID_STR_XMLES },
-    {CLASS_NOP, {-1}, 0}
+struct yaz_oid_db standard_db_l = {
+    0, 0, 0
 };
+yaz_oid_db_t standard_db = &standard_db_l;
 
 yaz_oid_db_t yaz_oid_std(void)
 {
-    return standard_oids;
+    return standard_db;
 }
 
-const int *yaz_string_to_oid(yaz_oid_db_t oid_list,
-                            int oclass, const char *name)
+#define get_entries(db) (db->xmalloced==0 ? yaz_oid_standard_entries : db->entries)
+
+const Odr_oid *yaz_string_to_oid(yaz_oid_db_t oid_db,
+                                 oid_class oclass, const char *name)
 {
-    for (; oid_list->name; oid_list++)
+    for (; oid_db; oid_db = oid_db->next)
     {
-       if (!yaz_matchstr(oid_list->name, name)
-           && (oclass == CLASS_GENERAL || oclass == oid_list->oclass))
-           return oid_list->oid;
+        struct yaz_oid_entry *e;
+        if (oclass != CLASS_GENERAL)
+        {
+            for (e = get_entries(oid_db); e->name; e++)
+            {
+                if (!yaz_matchstr(e->name, name) && oclass == e->oclass)
+                    return e->oid;
+            }
+        }
+        for (e = get_entries(oid_db); e->name; e++)
+        {
+            if (!yaz_matchstr(e->name, name))
+                return e->oid;
+        }
     }
     return 0;
 }
 
-int *yaz_string_to_oid_nmem(yaz_oid_db_t oid_list,
-                           int oclass, const char *name, NMEM nmem)
+Odr_oid *yaz_string_to_oid_nmem(yaz_oid_db_t oid_list,
+                                oid_class oclass, const char *name, NMEM nmem)
 {
-    const int *oid = yaz_string_to_oid(oid_list, oclass, name);
+    const Odr_oid *oid = yaz_string_to_oid(oid_list, oclass, name);
     if (oid)
        return odr_oiddup_nmem(nmem, oid);
     return odr_getoidbystr_nmem(nmem, name);
 }
 
-int *yaz_string_to_oid_odr(yaz_oid_db_t oid_list,
-                          int oclass, const char *name, ODR o)
+Odr_oid *yaz_string_to_oid_odr(yaz_oid_db_t oid_list,
+                               oid_class oclass, const char *name, ODR o)
 {
     return yaz_string_to_oid_nmem(oid_list, oclass, name, odr_getmem(o));
 }
 
-const char *yaz_oid_to_string(yaz_oid_db_t oid_list,
-                             const int *oid, int *oclass)
+const char *yaz_oid_to_string(yaz_oid_db_t oid_db,
+                             const Odr_oid *oid, oid_class *oclass)
 {
     if (!oid)
        return 0;
-    for (; oid_list->name; oid_list++)
+    for (; oid_db; oid_db = oid_db->next)
     {
-       if (!oid_oidcmp(oid_list->oid, oid))
+       struct yaz_oid_entry *e = get_entries(oid_db);
+       for (; e->name; e++)
        {
-           if (oclass)
-               *oclass = oid_list->oclass;
-           return oid_list->name;
+           if (!oid_oidcmp(e->oid, oid))
+           {
+               if (oclass)
+                   *oclass = e->oclass;
+               return e->name;
+           }
        }
     }
     return 0;
 }
 
-const char *yaz_oid_to_string_buf(const int *oid, int *oclass, char *buf)
+const char *yaz_oid_to_string_buf(const Odr_oid *oid, oid_class *oclass, char *buf)
 {
-    const char *p = yaz_oid_to_string(standard_oids, oid, oclass);
+    const char *p = yaz_oid_to_string(yaz_oid_std(), oid, oclass);
     if (p)
        return p;
     if (oclass)
        *oclass = CLASS_GENERAL;
-    return oid_to_dotstring(oid, buf);
+    return oid_oid_to_dotstring(oid, buf);
 }
 
-int yaz_oid_is_iso2709(const int *oid)
+
+char *oid_name_to_dotstring(oid_class oclass, const char *name, char *oid_buf)
+{
+    const Odr_oid *oid = yaz_string_to_oid(yaz_oid_std(), oclass, name);
+    if (oid)
+        return oid_oid_to_dotstring(oid, oid_buf);
+    return 0;
+}
+
+
+int yaz_oid_is_iso2709(const Odr_oid *oid)
 {
     if (oid_oidlen(oid) == 6 && oid[0] == 1 && oid[1] == 2
-       && oid[2] == 840 && oid[3] == 10003 && oid[4] == 5 
+       && oid[2] == 840 && oid[3] == 10003 && oid[4] == 5
        && oid[5] <= 29 && oid[5] != 16)
        return 1;
     return 0;
 }
 
-void yaz_oid_trav(yaz_oid_db_t oid_list,
-                 void (*func)(const int *oid,
-                              int oclass, const char *name,
+int yaz_oid_add(yaz_oid_db_t oid_db, oid_class oclass, const char *name,
+               const Odr_oid *new_oid)
+{
+    const Odr_oid *oid = yaz_string_to_oid(oid_db, oclass, name);
+    if (!oid)
+    {
+       struct yaz_oid_entry *ent;
+        Odr_oid *alloc_oid;
+
+       while (oid_db->next)
+           oid_db = oid_db->next;
+       oid_db->next = (struct yaz_oid_db *) xmalloc(sizeof(*oid_db->next));
+       oid_db = oid_db->next;
+
+       oid_db->next = 0;
+       oid_db->xmalloced = 1;
+       oid_db->entries = ent = (struct yaz_oid_entry *) xmalloc(2 * sizeof(*ent));
+
+        alloc_oid = (Odr_oid *)
+            xmalloc(sizeof(*alloc_oid) * (oid_oidlen(new_oid)+1));
+       oid_oidcpy(alloc_oid, new_oid);
+        ent[0].oid = alloc_oid;
+       ent[0].name = xstrdup(name);
+       ent[0].oclass = oclass;
+
+       ent[1].oid = 0;
+       ent[1].name = 0;
+       ent[1].oclass = CLASS_NOP;
+       return 0;
+    }
+    return -1;
+}
+
+yaz_oid_db_t yaz_oid_db_new(void)
+{
+    yaz_oid_db_t p = (yaz_oid_db_t) xmalloc(sizeof(*p));
+    p->entries = 0;
+    p->next = 0;
+    p->xmalloced = 1;
+    return p;
+}
+
+void yaz_oid_db_destroy(yaz_oid_db_t oid_db)
+{
+    while (oid_db)
+    {
+       yaz_oid_db_t p = oid_db;
+
+       oid_db = oid_db->next;
+       if (p->xmalloced)
+       {
+           struct yaz_oid_entry *e = p->entries;
+           for (; e->name; e++)
+               xfree (e->name);
+           xfree(p->entries);
+           xfree(p);
+       }
+    }
+}
+
+void yaz_oid_trav(yaz_oid_db_t oid_db,
+                 void (*func)(const Odr_oid *oid,
+                              oid_class oclass, const char *name,
                               void *client_data),
                  void *client_data)
 {
-    for (; oid_list->name; oid_list++)
-       func(oid_list->oid, oid_list->oclass, oid_list->name, client_data);
+    for (; oid_db; oid_db = oid_db->next)
+    {
+       struct yaz_oid_entry *e = get_entries(oid_db);
+
+       for (; e->name; e++)
+           func(e->oid, e->oclass, e->name, client_data);
+    }
 }
 
+/*
+ * Local variables:
+ * c-basic-offset: 4
+ * c-file-style: "Stroustrup"
+ * indent-tabs-mode: nil
+ * End:
+ * vim: shiftwidth=4 tabstop=8 expandtab
+ */
+