Extra generic handle for the character mapping routines.
[idzebra-moved-to-github.git] / recctrl / recgrs.c
index c9c8a73..a7056a3 100644 (file)
@@ -1,10 +1,35 @@
 /*
- * Copyright (C) 1994-1996, Index Data I/S 
+ * Copyright (C) 1994-1997, Index Data I/S 
  * All rights reserved.
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: recgrs.c,v $
- * Revision 1.3  1997-02-24 10:41:50  adam
+ * Revision 1.10  1997-09-18 08:59:21  adam
+ * Extra generic handle for the character mapping routines.
+ *
+ * Revision 1.9  1997/09/17 12:19:21  adam
+ * Zebra version corresponds to YAZ version 1.4.
+ * Changed Zebra server so that it doesn't depend on global common_resource.
+ *
+ * Revision 1.8  1997/09/09 13:38:14  adam
+ * Partial port to WIN95/NT.
+ *
+ * Revision 1.7  1997/09/05 15:30:10  adam
+ * Changed prototype for chr_map_input - added const.
+ * Added support for C++, headers uses extern "C" for public definitions.
+ *
+ * Revision 1.6  1997/09/04 13:54:40  adam
+ * Added MARC filter - type grs.marc.<syntax> where syntax refers
+ * to abstract syntax. New method tellf in retrieve/extract method.
+ *
+ * Revision 1.5  1997/07/15 16:29:03  adam
+ * Initialized dummy variable to keep checker gcc happy.
+ *
+ * Revision 1.4  1997/04/30 08:56:08  quinn
+ * null
+ *
+ * Revision 1.2  1996/10/11  16:06:43  quinn
+ * Revision 1.3  1997/02/24 10:41:50  adam
  * Cleanup of code and commented out the "end element-end-record" code.
  *
  * Revision 1.2  1996/10/11 16:06:43  quinn
 #include <stdio.h>
 #include <assert.h>
 #include <sys/types.h>
+#ifndef WINDOWS
 #include <unistd.h>
+#endif
 
 #include <log.h>
 #include <oid.h>
@@ -121,6 +148,7 @@ static data1_node *read_grs_type (struct grs_read_info *p, const char *type)
     } tab[] = {
         { "sgml",  grs_read_sgml },
         { "regx",  grs_read_regx },
+        { "marc",  grs_read_marc },
         { NULL, NULL }
     };
     const char *cp = strchr (type, '.');
@@ -148,13 +176,13 @@ static void grs_init(void)
 static void dumpkeys_word(data1_node *n, struct recExtractCtrl *p,
     data1_att *att)
 {
-    char *b = n->u.data.data;
+    const char *b = n->u.data.data;
     int remain;
-    char **map = 0;
+    const char **map = 0;
 
     remain = n->u.data.len - (b - n->u.data.data);
     if (remain > 0)
-       map = (*p->map_chrs_input)(&b, remain);
+       map = (*p->map_chrs_input)(0, &b, remain);
 
     while (map)
     {
@@ -167,7 +195,7 @@ static void dumpkeys_word(data1_node *n, struct recExtractCtrl *p,
        {
            remain = n->u.data.len - (b - n->u.data.data);
            if (remain > 0)
-               map = (*p->map_chrs_input)(&b, remain);
+               map = (*p->map_chrs_input)(0, &b, remain);
            else
                map = 0;
        }
@@ -176,13 +204,13 @@ static void dumpkeys_word(data1_node *n, struct recExtractCtrl *p,
        i = 0;
        while (map && *map && **map != *CHR_SPACE)
        {
-           char *cp = *map;
+           const char *cp = *map;
 
            while (i < GRS_MAX_WORD && *cp)
                buf[i++] = *(cp++);
            remain = n->u.data.len - (b - n->u.data.data);
            if (remain > 0)
-               map = (*p->map_chrs_input)(&b, remain);
+               map = (*p->map_chrs_input)(0, &b, remain);
            else
                map = 0;
        }
@@ -202,14 +230,15 @@ static void dumpkeys_word(data1_node *n, struct recExtractCtrl *p,
 static void dumpkeys_phrase(data1_node *n, struct recExtractCtrl *p,
     data1_att *att)
 {
-    char *b = n->u.data.data;
-    char buf[GRS_MAX_WORD+1], **map = 0;
+    const char *b = n->u.data.data;
+    char buf[GRS_MAX_WORD+1];
+    const char **map = 0;
     RecWord wrd;
     int i = 0, remain;
 
     remain = n->u.data.len - (b - n->u.data.data);
     if (remain > 0)
-       map = (*p->map_chrs_input)(&b, remain);
+       map = (*p->map_chrs_input)(0, &b, remain);
 
     while (remain > 0 && i < GRS_MAX_WORD)
     {
@@ -217,7 +246,7 @@ static void dumpkeys_phrase(data1_node *n, struct recExtractCtrl *p,
        {
            remain = n->u.data.len - (b - n->u.data.data);
            if (remain > 0)
-               map = (*p->map_chrs_input)(&b, remain);
+               map = (*p->map_chrs_input)(0, &b, remain);
            else
                map = 0;
        }
@@ -228,7 +257,7 @@ static void dumpkeys_phrase(data1_node *n, struct recExtractCtrl *p,
            buf[i++] = *CHR_SPACE;
        while (map && *map && **map != *CHR_SPACE)
        {
-           char *cp = *map;
+           const char *cp = *map;
 
            if (i >= GRS_MAX_WORD)
                break;
@@ -236,7 +265,7 @@ static void dumpkeys_phrase(data1_node *n, struct recExtractCtrl *p,
                buf[i++] = *(cp++);
            remain = n->u.data.len - (b - n->u.data.data);
            if (remain > 0)
-               map = (*p->map_chrs_input)(&b, remain);
+               map = (*p->map_chrs_input)(0, &b, remain);
            else
                map = 0;
        }
@@ -300,7 +329,7 @@ static int dumpkeys(data1_node *n, struct recExtractCtrl *p, int level)
 
        if (n->which == DATA1N_data)
        {
-           data1_node *par = get_parent_tag(n);
+           data1_node *par = get_parent_tag(p->dh, n);
            data1_termlist *tlist = 0;
 
            if (p->flagShowRecords)
@@ -324,7 +353,7 @@ static int dumpkeys(data1_node *n, struct recExtractCtrl *p, int level)
             */
 
            while (!par->u.tag.element)
-               if (!par->parent || !(par = get_parent_tag(par->parent)))
+               if (!par->parent || !(par = get_parent_tag(p->dh, par->parent)))
                    break;
            if (!par)
                tlist = 0;
@@ -377,20 +406,22 @@ static int grs_extract(struct recExtractCtrl *p)
 
     gri.readf = p->readf;
     gri.seekf = p->seekf;
+    gri.tellf = p->tellf;
     gri.endf = p->endf;
     gri.fh = p->fh;
     gri.offset = p->offset;
     gri.mem = mem;
+    gri.dh = p->dh;
 
     n = read_grs_type (&gri, p->subType);
     if (!n)
         return -1;
     if (dumpkeys(n, p, 0) < 0)
     {
-       data1_free_tree(n);
+       data1_free_tree(p->dh, n);
        return -2;
     }
-    data1_free_tree(n);
+    data1_free_tree(p->dh, n);
     nmem_destroy(mem);
     return 0;
 }
@@ -398,7 +429,7 @@ static int grs_extract(struct recExtractCtrl *p)
 /*
  * Return: -1: Nothing done. 0: Ok. >0: Bib-1 diagnostic.
  */
-static int process_comp(data1_node *n, Z_RecordComposition *c)
+static int process_comp(data1_handle dh, data1_node *n, Z_RecordComposition *c)
 {
     data1_esetname *eset;
     Z_Espec1 *espec = 0;
@@ -409,7 +440,7 @@ static int process_comp(data1_node *n, Z_RecordComposition *c)
        case Z_RecordComp_simple:
            if (c->u.simple->which != Z_ElementSetNames_generic)
                return 26; /* only generic form supported. Fix this later */
-           if (!(eset = data1_getesetbyname(n->u.root.absyn,
+           if (!(eset = data1_getesetbyname(dh, n->u.root.absyn,
                c->u.simple->u.generic)))
            {
                logf(LOG_LOG, "Unknown esetname '%s'", c->u.simple->u.generic);
@@ -427,8 +458,10 @@ static int process_comp(data1_node *n, Z_RecordComposition *c)
                    switch (p->which)
                    {
                        case Z_ElementSpec_elementSetName:
-                           if (!(eset = data1_getesetbyname(n->u.root.absyn,
-                               p->u.elementSetName)))
+                           if (!(eset =
+                                 data1_getesetbyname(dh,
+                                                     n->u.root.absyn,
+                                                     p->u.elementSetName)))
                            {
                                logf(LOG_LOG, "Unknown esetname '%s'",
                                    p->u.elementSetName);
@@ -456,7 +489,7 @@ static int process_comp(data1_node *n, Z_RecordComposition *c)
                return 26; /* fix */
     }
     if (espec)
-       return data1_doespec1(n, espec);
+       return data1_doespec1(dh, n, espec);
     else
        return -1;
 }
@@ -472,27 +505,31 @@ static int grs_retrieve(struct recRetrieveCtrl *p)
     
     gri.readf = p->readf;
     gri.seekf = p->seekf;
+    gri.tellf = p->tellf;
     gri.endf = NULL;
     gri.fh = p->fh;
     gri.offset = 0;
     gri.mem = mem;
+    gri.dh = p->dh;
 
     node = read_grs_type (&gri, p->subType);
-/* node = data1_read_record(p->readf, p->fh, mem); */
     if (!node)
     {
        p->diagnostic = 2;
        return 0;
     }
-    if (p->score >= 0 && (new = data1_insert_taggeddata(node, node, "rank",
-       mem)))
+    if (p->score >= 0 && (new =
+                         data1_insert_taggeddata(p->dh, node,
+                                                 node, "rank",
+                                                 mem)))
     {
        new->u.data.what = DATA1I_num;
        new->u.data.data = new->u.data.lbuf;
        sprintf(new->u.data.data, "%d", p->score);
        new->u.data.len = strlen(new->u.data.data);
     }
-    if ((new = data1_insert_taggeddata(node, node, "localControlNumber", mem)))
+    if ((new = data1_insert_taggeddata(p->dh, node, node,
+                                      "localControlNumber", mem)))
     {
        new->u.data.what = DATA1I_text;
        new->u.data.data = new->u.data.lbuf;
@@ -512,6 +549,7 @@ static int grs_retrieve(struct recRetrieveCtrl *p)
        if ((oid = oid_getoidbyent(&oe)))
        {
            char tmp[128];
+           data1_handle dh = p->dh;
            char *p = tmp;
            int *ii;
 
@@ -524,8 +562,8 @@ static int grs_retrieve(struct recRetrieveCtrl *p)
            }
            *(p++) = '\0';
 
-           if ((new = data1_insert_taggeddata(node, node, "schemaIdentifier",
-               mem)))
+           if ((new = data1_insert_taggeddata(dh, node, node,
+                                              "schemaIdentifier", mem)))
            {
                new->u.data.what = DATA1I_oid;
                new->u.data.data = nmem_malloc(mem, p - tmp);
@@ -546,7 +584,7 @@ static int grs_retrieve(struct recRetrieveCtrl *p)
        if (map->target_absyn_ref == p->input_format)
        {
            onode = node;
-           if (!(node = data1_map_record(onode, map, mem)))
+           if (!(node = data1_map_record(p->dh, onode, map, mem)))
            {
                p->diagnostic = 14;
                return 0;
@@ -555,12 +593,12 @@ static int grs_retrieve(struct recRetrieveCtrl *p)
            break;
        }
 
-    if (p->comp && (res = process_comp(node, p->comp)) > 0)
+    if (p->comp && (res = process_comp(p->dh, node, p->comp)) > 0)
     {
        p->diagnostic = res;
        if (onode)
-           data1_free_tree(onode);
-       data1_free_tree(node);
+           data1_free_tree(p->dh, onode);
+       data1_free_tree(p->dh, node);
        nmem_destroy(mem);
        return 0;
     }
@@ -571,28 +609,32 @@ static int grs_retrieve(struct recRetrieveCtrl *p)
        p->input_format : VAL_SUTRS))
     {
        data1_marctab *marctab;
-       int dummy;
+        int dummy;
 
        case VAL_GRS1:
-           if (!(p->rec_buf = data1_nodetogr(node, selected, p->odr, &dummy)))
+           dummy = 0;
+           if (!(p->rec_buf = data1_nodetogr(p->dh, node, selected,
+                                             p->odr, &dummy)))
                p->diagnostic = 2; /* this should be better specified */
            else
                p->rec_len = -1;
            break;
        case VAL_EXPLAIN:
-           if (!(p->rec_buf = data1_nodetoexplain(node, selected, p->odr)))
+           if (!(p->rec_buf = data1_nodetoexplain(p->dh, node, selected,
+                                                  p->odr)))
                p->diagnostic = 2; /* this should be better specified */
            else
                p->rec_len = -1;
            break;
        case VAL_SUMMARY:
-           if (!(p->rec_buf = data1_nodetosummary(node, selected, p->odr)))
+           if (!(p->rec_buf = data1_nodetosummary(p->dh, node, selected,
+                                                  p->odr)))
                p->diagnostic = 2;
            else
                p->rec_len = -1;
            break;
        case VAL_SUTRS:
-           if (!(p->rec_buf = data1_nodetobuf(node, selected,
+           if (!(p->rec_buf = data1_nodetobuf(p->dh, node, selected,
                (int*)&p->rec_len)))
            {
                p->diagnostic = 2;
@@ -600,8 +642,8 @@ static int grs_retrieve(struct recRetrieveCtrl *p)
            }
            break;
        case VAL_SOIF:
-           if (!(p->rec_buf = data1_nodetosoif(node, selected,
-               (int*)&p->rec_len)))
+           if (!(p->rec_buf = data1_nodetosoif(p->dh, node, selected,
+                                               (int*)&p->rec_len)))
            {
                p->diagnostic = 2;
                break;
@@ -617,17 +659,18 @@ static int grs_retrieve(struct recRetrieveCtrl *p)
                p->diagnostic = 227;
                break;
            }
-           if (!(p->rec_buf = data1_nodetomarc(marctab, node, selected,
-               (int*)&p->rec_len)))
+           if (!(p->rec_buf = data1_nodetomarc(p->dh, marctab, node,
+                                               selected,
+                                               (int*)&p->rec_len)))
            {
                p->diagnostic = 2;
                break;
            }
     }
     if (node)
-       data1_free_tree(node);
+       data1_free_tree(p->dh, node);
     if (onode)
-       data1_free_tree(onode);
+       data1_free_tree(p->dh, onode);
     nmem_destroy(mem);
     return 0;
 }