Add intermediate files from PDF production.
[yaz-moved-to-github.git] / retrieval / d1_marc.c
index fc0127a..e410b7c 100644 (file)
@@ -3,7 +3,7 @@
  * See the file LICENSE for details.
  * Sebastian Hammer, Adam Dickmeiss
  *
- * $Id: d1_marc.c,v 1.20 2002-07-03 14:09:34 adam Exp $
+ * $Id: d1_marc.c,v 1.27 2002-08-28 19:34:50 adam Exp $
  */
 
 
@@ -144,6 +144,7 @@ data1_marctab *data1_read_marctab (data1_handle dh, const char *file)
     return res;
 }
 
+
 /*
  * Locate some data under this node. This routine should handle variants
  * prettily.
@@ -152,20 +153,32 @@ static char *get_data(data1_node *n, int *len)
 {
     char *r;
 
-    while (n->which != DATA1N_data && n->child)
-       n = n->child;
-    if (n->which != DATA1N_data || 
-       (n->u.data.what != DATA1I_text && n->u.data.what != DATA1I_num))
+    while (n)
     {
-       r = "[Structured/included data]";
-       *len = strlen(r);
-       return r;
-    }
+        if (n->which == DATA1N_data)
+        {
+            int i;
+            *len = n->u.data.len;
 
-    *len = n->u.data.len;
-    while (*len && d1_isspace(n->u.data.data[*len - 1]))
-       (*len)--;
-    return n->u.data.data;
+            for (i = 0; i<*len; i++)
+                if (!d1_isspace(n->u.data.data[i]))
+                    break;
+            while (*len && d1_isspace(n->u.data.data[*len - 1]))
+                (*len)--;
+            *len = *len - i;
+            if (*len > 0)
+                return n->u.data.data + i;
+        }
+        if (n->which == DATA1N_tag)
+            n = n->child;
+       else if (n->which == DATA1N_data)
+            n = n->next;
+       else
+            break;     
+    }
+    r = "";
+    *len = strlen(r);
+    return r;
 }
 
 static void memint (char *p, int val, int len)
@@ -194,8 +207,9 @@ static int is_indicator (data1_marctab *p, data1_node *subf)
     return 0;
 }
 
-static int nodetomarc(data1_marctab *p, data1_node *n, int selected,
-    char **buf, int *size)
+static int nodetomarc(data1_handle dh,
+                     data1_marctab *p, data1_node *n, int selected,
+                      char **buf, int *size)
 {
     int len = 26;
     int dlen;
@@ -217,14 +231,24 @@ static int nodetomarc(data1_marctab *p, data1_node *n, int selected,
        }
        if (selected && !field->u.tag.node_selected)
            continue;
+
+       subf = field->child;
+        if (!subf)
+            continue;
+
         len += 4 + p->length_data_entry + p->length_starting
             + p->length_implementation;
         base_address += 3 + p->length_data_entry + p->length_starting
             + p->length_implementation;
-       subf = field->child;
 
        if (subf->which == DATA1N_data)
             is00X = 1;
+       if (!data1_is_xmlmode(dh))
+        {
+            if (subf->which == DATA1N_tag && !strcmp(subf->u.tag.tag, "@"))
+                is00X = 1;
+        }
+            
        
         if (!is00X)
             len += p->indicator_length;  
@@ -272,9 +296,16 @@ static int nodetomarc(data1_marctab *p, data1_node *n, int selected,
            continue;
 
        subf = field->child;
+        if (!subf)
+            continue;
 
         if (subf->which == DATA1N_data)
             is00X = 1;
+       if (!data1_is_xmlmode(dh))
+        {
+            if (subf->which == DATA1N_tag && !strcmp(subf->u.tag.tag, "@"))
+                is00X = 1;
+        }
 
        if (is_indicator (p, subf))
        {
@@ -331,6 +362,6 @@ char *data1_nodetomarc(data1_handle dh, data1_marctab *p, data1_node *n,
     n = data1_get_root_tag (dh, n);
     if (!n)
         return 0;
-    *len = nodetomarc(p, n, selected, buf, size);
+    *len = nodetomarc(dh, p, n, selected, buf, size);
     return *buf;
 }