C++ compilation.
[idzebra-moved-to-github.git] / recctrl / marcread.c
index 3f09254..4e82a01 100644 (file)
@@ -1,10 +1,32 @@
 /*
- * Copyright (C) 1997, Index Data I/S 
+ * Copyright (C) 1997-1999, Index Data
  * All rights reserved.
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: marcread.c,v $
- * Revision 1.1  1997-09-04 13:54:40  adam
+ * Revision 1.8  1999-05-26 07:49:14  adam
+ * C++ compilation.
+ *
+ * Revision 1.7  1999/05/20 12:57:18  adam
+ * Implemented TCL filter. Updated recctrl system.
+ *
+ * Revision 1.6  1999/02/02 14:51:27  adam
+ * Updated WIN32 code specific sections. Changed header.
+ *
+ * Revision 1.5  1997/11/18 10:03:24  adam
+ * Member num_children removed from data1_node.
+ *
+ * Revision 1.4  1997/10/27 14:34:26  adam
+ * Fixed bug - data1 root node wasn't tagged at all!
+ *
+ * Revision 1.3  1997/09/24 13:36:51  adam
+ * *** empty log message ***
+ *
+ * Revision 1.2  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.1  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.
  *
@@ -18,9 +40,9 @@
 #include <marcdisp.h>
 #include "grsread.h"
 
-data1_node *data1_mk_node_wp (NMEM mem, data1_node *parent)
+data1_node *data1_mk_node_wp (data1_handle dh, NMEM mem, data1_node *parent)
 {
-    data1_node *res = data1_mk_node (mem);
+    data1_node *res = data1_mk_node (dh, mem);
     
     if (!parent)
         res->root = res;
@@ -32,7 +54,6 @@ data1_node *data1_mk_node_wp (NMEM mem, data1_node *parent)
             parent->child = parent->last_child = res;
         else
             parent->last_child->next = res;
-        parent->num_children++;
         parent->last_child = res;
     }
     return res;
@@ -44,16 +65,16 @@ static void destroy_data (struct data1_node *n)
     xfree (n->u.data.data);
 }
 
-data1_node *data1_mk_node_text (NMEM mem, data1_node *parent,
+data1_node *data1_mk_node_text (data1_handle dh, NMEM mem, data1_node *parent,
                                 const char *buf, size_t len)
 {
-    data1_node *res = data1_mk_node_wp (mem, parent);
+    data1_node *res = data1_mk_node_wp (dh, mem, parent);
     res->which = DATA1N_data;
     res->u.data.formatted_text = 0;
     res->u.data.what = DATA1I_text;
     res->u.data.len = len;
     if (res->u.data.len > DATA1_LOCALDATA) {
-        res->u.data.data = xmalloc (res->u.data.len);
+        res->u.data.data = (char *) xmalloc (res->u.data.len);
         res->destroy = destroy_data;
     }
     else
@@ -62,16 +83,16 @@ data1_node *data1_mk_node_text (NMEM mem, data1_node *parent,
     return res;
 }
 
-data1_node *data1_mk_node_tag (NMEM mem, data1_node *parent,
+data1_node *data1_mk_node_tag (data1_handle dh, NMEM mem, data1_node *parent,
                                const char *tag, size_t len)
 {
     data1_element *elem = NULL;
-    data1_node *partag = get_parent_tag(parent);
+    data1_node *partag = get_parent_tag(dh, parent);
     data1_node *res;
     data1_element *e = NULL;
     int localtag = 0;
     
-    res = data1_mk_node_wp (mem, parent);
+    res = data1_mk_node_wp (dh, mem, parent);
 
     res->which = DATA1N_tag;
     res->u.tag.tag = res->lbuf;
@@ -89,7 +110,7 @@ data1_node *data1_mk_node_tag (NMEM mem, data1_node *parent,
         if (!(e = partag->u.tag.element))
             localtag = 1;
     
-    elem = data1_getelementbytagname (res->root->u.root.absyn, e,
+    elem = data1_getelementbytagname (dh, res->root->u.root.absyn, e,
                                       res->u.tag.tag);
     res->u.tag.element = elem;
     res->u.tag.node_selected = 0;
@@ -119,6 +140,7 @@ data1_node *grs_read_marc (struct grs_read_info *p)
     data1_node *res_root;
     data1_absyn *absyn;
     char *absynName;
+    data1_marctab *marctab;
 
     if ((*p->readf)(p->fh, buf, 5) != 5)
         return NULL;
@@ -144,22 +166,30 @@ data1_node *grs_read_marc (struct grs_read_info *p)
     }
     absynName = p->type;
     logf (LOG_DEBUG, "absynName = %s", absynName);
-    if (!(absyn = data1_get_absyn (absynName)))
+    if (!(absyn = data1_get_absyn (p->dh, absynName)))
     {
         logf (LOG_WARN, "Unknown abstract syntax: %s", absynName);
         return NULL;
     }
-    res_root = data1_mk_node_wp (p->mem, NULL);
-    res_root->u.root.type = nmem_malloc (p->mem, strlen(absynName)+1);
+    res_root = data1_mk_node_wp (p->dh, p->mem, NULL);
+    res_root->which = DATA1N_root;
+    res_root->u.root.type = (char *) nmem_malloc (p->mem, strlen(absynName)+1);
     strcpy (res_root->u.root.type, absynName);
     res_root->u.root.absyn = absyn;
 
-    indicator_length = atoi_n (buf+10, 1);
-    identifier_length = atoi_n (buf+11, 1);
+    marctab = absyn->marc;
+
+    if (marctab && marctab->force_indicator_length >= 0)
+       indicator_length = marctab->force_indicator_length;
+    else
+       indicator_length = atoi_n (buf+10, 1);
+    if (marctab && marctab->force_identifier_length >= 0)
+       identifier_length = marctab->force_identifier_length;
+    else
+       identifier_length = atoi_n (buf+11, 1);
     base_address = atoi_n (buf+12, 4);
 
-    length_data_entry = atoi_n (buf+20, 1);
-    length_data_entry = atoi_n (buf+20, 1);
+
     length_data_entry = atoi_n (buf+20, 1);
     length_starting = atoi_n (buf+21, 1);
     length_implementation = atoi_n (buf+22, 1);
@@ -182,7 +212,7 @@ data1_node *grs_read_marc (struct grs_read_info *p)
         tag[3] = '\0';
 
         /* generate field node */
-        res = data1_mk_node_tag (p->mem, res_root, tag, 3);
+        res = data1_mk_node_tag (p->dh, p->mem, res_root, tag, 3);
 
 #if MARC_DEBUG
         fprintf (outf, "%s ", tag);
@@ -200,7 +230,8 @@ data1_node *grs_read_marc (struct grs_read_info *p)
 #if MARC_DEBUG
             int j;
 #endif
-            res = data1_mk_node_tag (p->mem, res, buf+i, indicator_length);
+            res = data1_mk_node_tag (p->dh, p->mem, res, buf+i,
+                                    indicator_length);
 #if MARC_DEBUG
             for (j = 0; j<indicator_length; j++)
                 fprintf (outf, "%c", buf[j+i]);
@@ -214,8 +245,9 @@ data1_node *grs_read_marc (struct grs_read_info *p)
         {
             if (memcmp (tag, "00", 2) && identifier_length)
             {
-               data1_node *res = data1_mk_node_tag (p->mem, parent, buf+i+1,
-                                                     identifier_length-1);
+               data1_node *res =
+                   data1_mk_node_tag (p->dh, p->mem, parent,
+                                      buf+i+1, identifier_length-1);
 #if MARC_DEBUG
                 fprintf (outf, " $"); 
                 for (j = 1; j<identifier_length; j++)
@@ -232,7 +264,7 @@ data1_node *grs_read_marc (struct grs_read_info *p)
 #endif
                     i++;
                 }
-                data1_mk_node_text (p->mem, res, buf + i0, i - i0);
+                data1_mk_node_text (p->dh, p->mem, res, buf + i0, i - i0);
                i0 = i;
             }
             else
@@ -245,8 +277,9 @@ data1_node *grs_read_marc (struct grs_read_info *p)
         }
         if (i > i0)
        {
-           data1_node *res = data1_mk_node_tag (p->mem, parent, "@", 1);
-            data1_mk_node_text (p->mem, res, buf + i0, i - i0);
+           data1_node *res = data1_mk_node_tag (p->dh, p->mem,
+                                                parent, "@", 1);
+            data1_mk_node_text (p->dh, p->mem, res, buf + i0, i - i0);
        }
 #if MARC_DEBUG
         fprintf (outf, "\n");
@@ -258,3 +291,21 @@ data1_node *grs_read_marc (struct grs_read_info *p)
     }
     return res_root;
 } 
+
+static void *grs_init_marc()
+{
+    return 0;
+}
+
+static void grs_destroy_marc(void *clientData)
+{
+}
+
+static struct recTypeGrs marc_type = {
+    "marc",
+    grs_init_marc,
+    grs_destroy_marc,
+    grs_read_marc
+};
+
+RecTypeGrs recTypeGrs_marc = &marc_type;