Directive s=pw sets structure to phrase if term includes blank(s).
[yaz-moved-to-github.git] / util / oid.c
index bdfc16f..e5567a5 100644 (file)
@@ -1,10 +1,30 @@
 /*
- * Copyright (c) 1995-1999, Index Data
+ * Copyright (c) 1995-2000, Index Data
  * See the file LICENSE for details.
- * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: oid.c,v $
- * Revision 1.37  1999-09-13 12:51:15  adam
+ * Revision 1.44  2000-10-02 13:58:50  adam
+ * Added some OID's.
+ *
+ * Revision 1.43  2000/03/14 09:21:08  ian
+ * Added Admin Extended Service OID
+ *
+ * Revision 1.42  2000/02/29 13:44:55  adam
+ * Check for config.h (currently not generated).
+ *
+ * Revision 1.41  2000/01/10 15:16:53  adam
+ * Added several OID's.
+ *
+ * Revision 1.40  2000/01/06 14:59:13  adam
+ * Added oid_init/oid_exit. Changed oid_exit.
+ *
+ * Revision 1.39  1999/12/16 23:36:19  adam
+ * Implemented ILL protocol. Minor updates ASN.1 compiler.
+ *
+ * Revision 1.38  1999/11/30 13:47:12  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.37  1999/09/13 12:51:15  adam
  * Added CLIENT IP OID.
  *
  * Revision 1.36  1999/05/27 13:02:20  adam
  * We could (and should?) extend this so that the user app can add new
  * entries to the list at initialization.
  */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
 
 #include <stdlib.h>
 #include <string.h>
 #include <ctype.h>
 
-#include <oid.h>
-#include <yaz-util.h>
+#include <yaz/oid.h>
+#include <yaz/yaz-util.h>
 
 static int z3950_prefix[] = { 1, 2, 840, 10003, -1 };
 static int sr_prefix[]    = { 1, 0, 10163, -1 };
@@ -162,6 +185,7 @@ struct oident_list {
 
 static struct oident_list *oident_table = NULL;
 static int oid_value_dynamic = VAL_DYNAMIC;
+static int oid_init_flag = 0;
 
 /*
  * OID database
@@ -173,6 +197,8 @@ static oident oids[] =
      "BER" },
     {PROTO_GENERAL, CLASS_TRANSYN, VAL_ISO2709,      {1,0,2709,1,1,-1},
      "ISO2709"},
+    {PROTO_GENERAL, CLASS_GENERAL, VAL_ISO_ILL_1,    {1,2,10161,2,1,-1},
+     "ISOILL-1"},
     /* Z39.50v3 definitions */
     {PROTO_Z3950,   CLASS_ABSYN,   VAL_APDU,         {2,1,-1},
      "Z-APDU"},    
@@ -196,12 +222,32 @@ static oident oids[] =
      "CIMI-attset"},
     {PROTO_Z3950,   CLASS_ATTSET,  VAL_GEO,          {3,9,-1},
      "Geo-attset"},
+
+    {PROTO_Z3950,   CLASS_ATTSET,  VAL_ZBIG,         {3,10,-1},
+     "ZBIG"},
+    {PROTO_Z3950,   CLASS_ATTSET,  VAL_UTIL,         {3,11,-1},
+     "Util"},
+    {PROTO_Z3950,   CLASS_ATTSET,  VAL_XD1,          {3,12,-1},
+     "XD-1"},
+    {PROTO_Z3950,   CLASS_ATTSET,  VAL_ZTHES,        {3,13,-1},
+     "Zthes"},
+    {PROTO_Z3950,   CLASS_ATTSET,  VAL_FIN1,         {3,14,-1},
+     "Fin-1"},
+    {PROTO_Z3950,   CLASS_ATTSET,  VAL_DAN1,         {3,15,-1},
+     "Dan-1"},
+    {PROTO_Z3950,   CLASS_ATTSET,  VAL_HOLDINGS,     {3,16,-1},
+     "Holdings"},
+
     {PROTO_Z3950,   CLASS_ATTSET,  VAL_THESAURUS,    {3,1000,81,1,-1},
      "Thesaurus-attset"},
     {PROTO_Z3950,   CLASS_DIAGSET, VAL_BIB1,         {4,1,-1},
      "Bib-1"},
     {PROTO_Z3950,   CLASS_DIAGSET, VAL_DIAG1,        {4,2,-1},
      "Diag-1"},
+    {PROTO_Z3950,   CLASS_DIAGSET, VAL_DIAG_ES,      {4,3,-1},
+     "Diag-ES"},
+    {PROTO_Z3950,   CLASS_DIAGSET, VAL_DIAG_GENERAL, {4,3,-1},
+     "Diag-General"},
     {PROTO_Z3950,   CLASS_RECSYN,  VAL_UNIMARC,      {5,1,-1},
      "Unimarc"},
     {PROTO_Z3950,   CLASS_RECSYN,  VAL_INTERMARC,    {5,2,-1},
@@ -236,6 +282,18 @@ static oident oids[] =
      "Carmarc"},
     {PROTO_Z3950,   CLASS_RECSYN,  VAL_MALMARC,      {5,23,-1},
      "Malmarc"},
+    {PROTO_Z3950,   CLASS_RECSYN,  VAL_JPMARC,       {5,24,-1},
+     "JPmarc"},
+    {PROTO_Z3950,   CLASS_RECSYN,  VAL_SWEMARC,      {5,25,-1},
+     "SWEmarc"},
+    {PROTO_Z3950,   CLASS_RECSYN,  VAL_SIGLEMARC,    {5,26,-1},
+     "SIGLEmarc"},
+    {PROTO_Z3950,   CLASS_RECSYN,  VAL_ISDSMARC,     {5,27,-1},
+     "ISDSmarc"},
+    {PROTO_Z3950,   CLASS_RECSYN,  VAL_RUSMARC,      {5,28,-1},
+     "RUSmarc"},
+    {PROTO_Z3950,   CLASS_RECSYN,  VAL_HUNMARC,      {5,29,-1},
+     "Hunmarc"},
     {PROTO_Z3950,   CLASS_RECSYN,  VAL_EXPLAIN,      {5,100,-1},
      "Explain"},
     {PROTO_Z3950,   CLASS_RECSYN,  VAL_SUTRS,        {5,101,-1},
@@ -278,10 +336,6 @@ static oident oids[] =
 
     {PROTO_Z3950,   CLASS_RECSYN,  VAL_SQLRS,        {5,111,-1},
      "SQL-RS"},
-#if 0
-    {PROTO_Z3950,   CLASS_RECSYN,  VAL_ID_SGML,      {5,1000,81,1,-1},
-     "ID-SGML" },
-#endif
     {PROTO_Z3950,   CLASS_RECSYN,  VAL_SOIF,         {5,1000,81,2,-1},
      "SOIF" },
     {PROTO_Z3950,   CLASS_RECSYN,  VAL_TEXT_XML,     {5,109,10,-1},
@@ -319,7 +373,8 @@ static oident oids[] =
      "exp. spec."},
     {PROTO_Z3950,   CLASS_EXTSERV, VAL_EXPORTINV,    {9,7,-1},
      "exp. inv."},
-
+    {PROTO_Z3950,   CLASS_EXTSERV, VAL_ADMINSERVICE, {9,81,1,-1},
+     "Admin"},
     {PROTO_Z3950,   CLASS_USERINFO,VAL_SEARCHRES1,   {10,1,-1},
      "searchResult-1"},
     {PROTO_Z3950,   CLASS_USERINFO,VAL_CHARLANG,     {10,2,-1},
@@ -354,6 +409,10 @@ static oident oids[] =
      "CIMI-schema"},
     {PROTO_Z3950,   CLASS_SCHEMA,  VAL_UPDATEES,     {13,6,-1},
      "Update ES"},
+    {PROTO_Z3950,   CLASS_SCHEMA,  VAL_HOLDINGS,     {13,7,-1},
+     "Holdings"},
+    {PROTO_Z3950,   CLASS_SCHEMA,  VAL_ZTHES,        {13,8,-1},
+     "Zthes"},
     {PROTO_Z3950,   CLASS_SCHEMA,  VAL_THESAURUS,    {13,1000,81,1,-1},
      "thesaurus-schema"},
     {PROTO_Z3950,   CLASS_SCHEMA,  VAL_EXPLAIN,      {13,1000,81,2,-1},
@@ -519,16 +578,31 @@ void oid_transfer (struct oident *oident)
     }
 }
 
-static void oid_init (void)
+void oid_init (void)
 {
-    static int checked = 0;
-    
-    if (checked)
+    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);
-    checked = 1;
+    oid_init_flag = 1;
 }
 
+void oid_exit (void)
+{
+    while (oident_table)
+    {
+       struct oident_list *this_p = oident_table;
+       oident_table = oident_table->next;
+
+       xfree (this_p->oident.desc);
+       xfree (this_p);
+    }
+    oid_init_flag = 0;
+}
 
 static struct oident *oid_getentbyoid_x(int *o)
 {
@@ -606,7 +680,7 @@ struct oident *oid_addent (int *oid, enum oid_proto proto,
     {
        char desc_str[200];
        struct oident_list *oident_list;
-       oident_list = (struct oident_list *) malloc (sizeof(*oident_list));
+       oident_list = (struct oident_list *) xmalloc (sizeof(*oident_list));
        oident = &oident_list->oident;
        oident->proto = proto;
        oident->oclass = oclass;
@@ -620,7 +694,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 *) malloc (strlen(desc)+1);
+       oident->desc = (char *) xmalloc (strlen(desc)+1);
        strcpy (oident->desc, desc);
        if (value == VAL_DYNAMIC)
            oident->value = (enum oid_value) (++oid_value_dynamic);