X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Foid_db.c;h=4dc088dcfdb6a45cf46f207b4f7ef190662b0d9a;hp=3795bba3b86bd5bc713b7c0e495b6ec9dd48532f;hb=4df8de77ce5d4d97a9d5588f49a5c8298183776e;hpb=3cdfbd27dfc8dd15619f127ae78bf0f71b27dd6d diff --git a/src/oid_db.c b/src/oid_db.c index 3795bba..4dc088d 100644 --- a/src/oid_db.c +++ b/src/oid_db.c @@ -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.5 2007-04-16 21:53:09 adam Exp $ */ /** + * \file oid_db.c * \brief OID Database */ #if HAVE_CONFIG_H @@ -14,7 +13,6 @@ #include #include -#include #include #include @@ -28,7 +26,7 @@ struct yaz_oid_db { }; struct yaz_oid_db standard_db_l = { - yaz_oid_standard_entries, 0, 0 + 0, 0, 0 }; yaz_oid_db_t standard_db = &standard_db_l; @@ -37,21 +35,23 @@ yaz_oid_db_t yaz_oid_std(void) return standard_db; } -const int *yaz_string_to_oid(yaz_oid_db_t oid_db, - 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_db; oid_db = oid_db->next) { struct yaz_oid_entry *e; if (oclass != CLASS_GENERAL) { - for (e = oid_db->entries; e->name; e++) + for (e = get_entries(oid_db); e->name; e++) { if (!yaz_matchstr(e->name, name) && oclass == e->oclass) return e->oid; } } - for (e = oid_db->entries; e->name; e++) + for (e = get_entries(oid_db); e->name; e++) { if (!yaz_matchstr(e->name, name)) return e->oid; @@ -60,29 +60,29 @@ const int *yaz_string_to_oid(yaz_oid_db_t oid_db, 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_db, - const int *oid, int *oclass) + const Odr_oid *oid, oid_class *oclass) { if (!oid) return 0; for (; oid_db; oid_db = oid_db->next) { - struct yaz_oid_entry *e = oid_db->entries; + struct yaz_oid_entry *e = get_entries(oid_db); for (; e->name; e++) { if (!oid_oidcmp(e->oid, oid)) @@ -96,9 +96,9 @@ const char *yaz_oid_to_string(yaz_oid_db_t oid_db, 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_db, oid, oclass); + const char *p = yaz_oid_to_string(yaz_oid_std(), oid, oclass); if (p) return p; if (oclass) @@ -106,34 +106,45 @@ const char *yaz_oid_to_string_buf(const int *oid, int *oclass, char *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; } -int yaz_oid_add(yaz_oid_db_t oid_db, int oclass, const char *name, - const int *new_oid) +int yaz_oid_add(yaz_oid_db_t oid_db, oid_class oclass, const char *name, + const Odr_oid *new_oid) { - const int *oid = yaz_string_to_oid(oid_db, oclass, name); + const Odr_oid *oid = yaz_string_to_oid(oid_db, oclass, name); if (!oid) { struct yaz_oid_entry *ent; - int *alloc_oid; + Odr_oid *alloc_oid; while (oid_db->next) oid_db = oid_db->next; - oid_db->next = xmalloc(sizeof(*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 = xmalloc(2 * sizeof(*ent)); + oid_db->entries = ent = (struct yaz_oid_entry *) xmalloc(2 * sizeof(*ent)); - alloc_oid = xmalloc(sizeof(*alloc_oid) * (oid_oidlen(new_oid)+1)); + 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); @@ -149,7 +160,7 @@ int yaz_oid_add(yaz_oid_db_t oid_db, int oclass, const char *name, yaz_oid_db_t yaz_oid_db_new(void) { - yaz_oid_db_t p = xmalloc(sizeof(*p)); + yaz_oid_db_t p = (yaz_oid_db_t) xmalloc(sizeof(*p)); p->entries = 0; p->next = 0; p->xmalloced = 1; @@ -175,15 +186,15 @@ void yaz_oid_db_destroy(yaz_oid_db_t oid_db) } void yaz_oid_trav(yaz_oid_db_t oid_db, - void (*func)(const int *oid, - int oclass, const char *name, + void (*func)(const Odr_oid *oid, + oid_class oclass, const char *name, void *client_data), void *client_data) { for (; oid_db; oid_db = oid_db->next) { - struct yaz_oid_entry *e = oid_db->entries; - + struct yaz_oid_entry *e = get_entries(oid_db); + for (; e->name; e++) func(e->oid, e->oclass, e->name, client_data); } @@ -192,6 +203,7 @@ void yaz_oid_trav(yaz_oid_db_t oid_db, /* * Local variables: * c-basic-offset: 4 + * c-file-style: "Stroustrup" * indent-tabs-mode: nil * End: * vim: shiftwidth=4 tabstop=8 expandtab