X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=util%2Foid.c;h=a5cc9d3156c87fa425d3c469bf54622ff4b9ec78;hb=526ab3aa282b1e732814846655eefc199f3f5106;hp=e5567a554eeb7505d6dcba813c6b999d1b121f5d;hpb=b86dedd714b84b52d7f1bfe71555d08367c2c179;p=yaz-moved-to-github.git diff --git a/util/oid.c b/util/oid.c index e5567a5..a5cc9d3 100644 --- a/util/oid.c +++ b/util/oid.c @@ -1,9 +1,26 @@ /* - * Copyright (c) 1995-2000, Index Data + * Copyright (c) 1995-2001, Index Data * See the file LICENSE for details. * * $Log: oid.c,v $ - * Revision 1.44 2000-10-02 13:58:50 adam + * Revision 1.49 2001-10-24 20:11:46 adam + * Removed SR OID's. + * + * Revision 1.48 2001/09/27 12:09:18 adam + * Function nmem_exit calls oid_exit (when reference is 0). + * + * Revision 1.47 2001/09/24 21:51:55 adam + * New Z39.50 OID utilities: yaz_oidval_to_z3950oid, yaz_str_to_z3950oid + * and yaz_z3950oid_to_str. + * + * Revision 1.46 2001/06/26 14:11:27 adam + * Added MUTEX functions for NMEM module (used by OID utility). + * + * Revision 1.45 2001/05/16 07:25:59 adam + * Modified oid_ent_to_oid so that if proto is general, then class + * is ignored (only oid value is compared). + * + * Revision 1.44 2000/10/02 13:58:50 adam * Added some OID's. * * Revision 1.43 2000/03/14 09:21:08 ian @@ -186,11 +203,13 @@ struct oident_list { static struct oident_list *oident_table = NULL; static int oid_value_dynamic = VAL_DYNAMIC; static int oid_init_flag = 0; +static NMEM_MUTEX oid_mutex = 0; +static NMEM oid_nmem = 0; /* * OID database */ -static oident oids[] = +static oident standard_oids[] = { /* General definitions */ {PROTO_GENERAL, CLASS_TRANSYN, VAL_BER, {2,1,1,-1}, @@ -433,88 +452,6 @@ static oident oids[] = "thesaurus-tagset"}, {PROTO_Z3950, CLASS_TAGSET, VAL_EXPLAIN, {14,1000,81,2,-1}, "Explain-tagset"}, - - - /* SR definitions. Note that some of them aren't defined by the - standard (yet), but are borrowed from Z3950v3 */ - {PROTO_SR, CLASS_ABSYN, VAL_APDU, {2,1,-1}, "SR-APDU" }, - - {PROTO_SR, CLASS_APPCTX, VAL_BASIC_CTX, {1,1,-1}, "SR-BASIC" }, - - {PROTO_SR, CLASS_ATTSET, VAL_BIB1, {3,1,-1}, "Bib-1" }, - {PROTO_SR, CLASS_ATTSET, VAL_EXP1, {3,2,-1}, "Exp-1" }, - {PROTO_SR, CLASS_ATTSET, VAL_EXT1, {3,3,-1}, "Ext-1" }, - {PROTO_SR, CLASS_ATTSET, VAL_CCL1, {3,4,-1}, "CCL-1" }, - {PROTO_SR, CLASS_ATTSET, VAL_GILS, {3,5,-1}, "GILS" }, - {PROTO_SR, CLASS_ATTSET, VAL_STAS, {3,6,-1}, "STAS", }, - {PROTO_SR, CLASS_ATTSET, VAL_COLLECT1, {3,7,-1}, "Collections-attset"}, - {PROTO_SR, CLASS_ATTSET, VAL_CIMI1, {3,8,-1}, "CIMI-attset"}, - {PROTO_SR, CLASS_ATTSET, VAL_GEO, {3,9,-1}, "Geo-attset"}, - - {PROTO_SR, CLASS_DIAGSET, VAL_BIB1, {4,1,-1}, "Bib-1" }, - {PROTO_SR, CLASS_DIAGSET, VAL_DIAG1, {4,2,-1}, "Diag-1" }, - - {PROTO_SR, CLASS_RECSYN, VAL_UNIMARC, {5,1,-1}, "Unimarc" }, - {PROTO_SR, CLASS_RECSYN, VAL_INTERMARC, {5,2,-1}, "Intermarc" }, - {PROTO_SR, CLASS_RECSYN, VAL_CCF, {5,3,-1}, "CCF" }, - {PROTO_SR, CLASS_RECSYN, VAL_USMARC, {5,10,-1}, "USmarc" }, - {PROTO_SR, CLASS_RECSYN, VAL_UKMARC, {5,11,-1}, "UKmarc" }, - {PROTO_SR, CLASS_RECSYN, VAL_NORMARC, {5,12,-1}, "Normarc" }, - {PROTO_SR, CLASS_RECSYN, VAL_LIBRISMARC,{5,13,-1}, "Librismarc" }, - {PROTO_SR, CLASS_RECSYN, VAL_DANMARC, {5,14,-1}, "Danmarc" }, - {PROTO_SR, CLASS_RECSYN, VAL_FINMARC, {5,15,-1}, "Finmarc" }, - {PROTO_SR, CLASS_RECSYN, VAL_MAB, {5,16,-1}, "MAB" }, - {PROTO_SR, CLASS_RECSYN, VAL_CANMARC, {5,17,-1}, "Canmarc" }, - {PROTO_SR, CLASS_RECSYN, VAL_MAB, {5,16,-1}, "MAB" }, - {PROTO_SR, CLASS_RECSYN, VAL_CANMARC, {5,17,-1}, "Canmarc" }, - {PROTO_SR, CLASS_RECSYN, VAL_SBN, {5,18,-1}, "SBN" }, - {PROTO_SR, CLASS_RECSYN, VAL_PICAMARC, {5,19,-1}, "Picamarc" }, - {PROTO_SR, CLASS_RECSYN, VAL_AUSMARC, {5,20,-1}, "Ausmarc" }, - {PROTO_SR, CLASS_RECSYN, VAL_IBERMARC, {5,21,-1}, "Ibermarc" }, - {PROTO_SR, CLASS_RECSYN, VAL_CATMARC, {5,22,-1}, "Catmarc" }, - {PROTO_SR, CLASS_RECSYN, VAL_MALMARC, {5,23,-1}, "Malmarc" }, - {PROTO_SR, CLASS_RECSYN, VAL_EXPLAIN, {5,100,-1}, "Explain" }, - {PROTO_SR, CLASS_RECSYN, VAL_SUTRS, {5,101,-1}, "SUTRS" }, - {PROTO_SR, CLASS_RECSYN, VAL_OPAC, {5,102,-1}, "OPAC" }, - {PROTO_SR, CLASS_RECSYN, VAL_SUMMARY, {5,103,-1}, "Summary" }, - {PROTO_SR, CLASS_RECSYN, VAL_GRS0, {5,104,-1}, "GRS-0" }, - {PROTO_SR, CLASS_RECSYN, VAL_GRS1, {5,105,-1}, "GRS-1" }, - {PROTO_SR, CLASS_RECSYN, VAL_EXTENDED, {5,106,-1}, "Extended" }, - {PROTO_SR, CLASS_RECSYN, VAL_FRAGMENT, {5,107,-1}, "Fragment" }, - - {PROTO_SR, CLASS_RESFORM, VAL_RESOURCE1, {7,1,-1}, "Resource-1" }, - {PROTO_SR, CLASS_RESFORM, VAL_RESOURCE2, {7,2,-1}, "Resource-2" }, - - {PROTO_SR, CLASS_ACCFORM, VAL_PROMPT1, {8,1,-1}, "Prompt-1" }, - {PROTO_SR, CLASS_ACCFORM, VAL_DES1, {8,2,-1}, "Des-1" }, - {PROTO_SR, CLASS_ACCFORM, VAL_KRB1, {8,3,-1}, "Krb-1" }, - - {PROTO_SR, CLASS_EXTSERV, VAL_PRESSET, {9,1,-1}, "Pers. set" }, - {PROTO_SR, CLASS_EXTSERV, VAL_PQUERY, {9,2,-1}, "Pers. query" }, - {PROTO_SR, CLASS_EXTSERV, VAL_PCQUERY, {9,3,-1}, "Per'd query" }, - {PROTO_SR, CLASS_EXTSERV, VAL_ITEMORDER, {9,4,-1}, "Item order" }, - {PROTO_SR, CLASS_EXTSERV, VAL_DBUPDATE, {9,5,-1}, "DB. Update" }, - {PROTO_SR, CLASS_EXTSERV, VAL_EXPORTSPEC,{9,6,-1}, "exp. spec." }, - {PROTO_SR, CLASS_EXTSERV, VAL_EXPORTINV, {9,7,-1}, "exp. inv." }, - - {PROTO_SR, CLASS_ELEMSPEC,VAL_ESPEC1, {11,1,-1}, "Espec-1" }, - - {PROTO_SR, CLASS_VARSET, VAL_VAR1, {12,1,-1}, "Variant-1" }, - - {PROTO_SR, CLASS_SCHEMA, VAL_WAIS, {13,1,-1}, "WAIS-schema" }, - {PROTO_SR, CLASS_SCHEMA, VAL_GILS, {13,2,-1}, "GILS-schema" }, - {PROTO_SR, CLASS_SCHEMA, VAL_COLLECT1, {13,3,-1}, "Collections-schema" }, - {PROTO_SR, CLASS_SCHEMA, VAL_GEO, {13,4,-1}, "Geo-schema" }, - {PROTO_SR, CLASS_SCHEMA, VAL_CIMI1, {13,5,-1}, "CIMI-schema" }, - - {PROTO_SR, CLASS_TAGSET, VAL_SETM, {14,1,-1}, "TagsetM" }, - {PROTO_SR, CLASS_TAGSET, VAL_SETG, {14,2,-1}, "TagsetG" }, - - {PROTO_SR, CLASS_TAGSET, VAL_STAS, {14,3,-1}, "STAS-tagset" }, - {PROTO_SR, CLASS_TAGSET, VAL_GILS, {14,4,-1}, "GILS-tagset" }, - {PROTO_SR, CLASS_TAGSET, VAL_COLLECT1, {14,5,-1}, "Collections-tagset"}, - {PROTO_SR, CLASS_TAGSET, VAL_CIMI1, {14,6,-1}, "CIMI-tagset" }, - {PROTO_NOP, CLASS_NOP, VAL_NOP, {-1}, 0 } }; @@ -580,28 +517,32 @@ void oid_transfer (struct oident *oident) void oid_init (void) { - if (oid_init_flag) - return; - /* oid_transfer is thread safe, so there's nothing wrong in having - two threads calling it simultaniously. On the other hand - no thread may exit oid_init before all OID's bave been - transferred - which is why checked is set after oid_transfer... - */ - oid_transfer (oids); - oid_init_flag = 1; + if (oid_init_flag == 0) + { + /* oid_transfer is thread safe, so there's nothing wrong in having + two threads calling it simultaniously. On the other hand + no thread may exit oid_init before all OID's bave been + transferred - which is why checked is set after oid_transfer... + */ + nmem_mutex_create (&oid_mutex); + nmem_mutex_enter (oid_mutex); + if (!oid_nmem) + oid_nmem = nmem_create (); + nmem_mutex_leave (oid_mutex); + oid_transfer (standard_oids); + oid_init_flag = 1; + } } void oid_exit (void) { - while (oident_table) + if (oid_init_flag) { - struct oident_list *this_p = oident_table; - oident_table = oident_table->next; - - xfree (this_p->oident.desc); - xfree (this_p); + oid_init_flag = 0; + nmem_mutex_destroy (&oid_mutex); + nmem_destroy (oid_nmem); + oid_nmem = 0; } - oid_init_flag = 0; } static struct oident *oid_getentbyoid_x(int *o) @@ -639,9 +580,9 @@ int *oid_ent_to_oid(struct oident *ent, int *ret) for (ol = oident_table; ol; ol = ol->next) { struct oident *p = &ol->oident; - if ((ent->proto == p->proto || p->proto == PROTO_GENERAL) && - (ent->oclass == p->oclass || p->oclass == CLASS_GENERAL) && - ent->value == p->value) + if (ent->value == p->value && + (p->proto == PROTO_GENERAL || (ent->proto == p->proto && + (ent->oclass == p->oclass || ent->oclass == CLASS_GENERAL)))) { if (p->proto == PROTO_Z3950) oid_oidcpy(ret, z3950_prefix); @@ -674,13 +615,14 @@ struct oident *oid_addent (int *oid, enum oid_proto proto, { struct oident *oident; - nmem_critical_enter (); + nmem_mutex_enter (oid_mutex); oident = oid_getentbyoid_x (oid); if (!oident) { char desc_str[200]; struct oident_list *oident_list; - oident_list = (struct oident_list *) xmalloc (sizeof(*oident_list)); + oident_list = (struct oident_list *) + nmem_malloc (oid_nmem, sizeof(*oident_list)); oident = &oident_list->oident; oident->proto = proto; oident->oclass = oclass; @@ -694,8 +636,7 @@ struct oident *oid_addent (int *oid, enum oid_proto proto, sprintf (desc_str+strlen(desc_str), ".%d", oid[i]); desc = desc_str; } - oident->desc = (char *) xmalloc (strlen(desc)+1); - strcpy (oident->desc, desc); + oident->desc = nmem_strdup (oid_nmem, desc); if (value == VAL_DYNAMIC) oident->value = (enum oid_value) (++oid_value_dynamic); else @@ -704,7 +645,7 @@ struct oident *oid_addent (int *oid, enum oid_proto proto, oident_list->next = oident_table; oident_table = oident_list; } - nmem_critical_leave (); + nmem_mutex_leave (oid_mutex); return oident; }