record_conv: leader spec may be given for marc element
[yaz-moved-to-github.git] / src / record_conv.c
index 5ef8913..212e96b 100644 (file)
@@ -57,6 +57,7 @@ struct marc_info {
     const char *output_charset;
     int input_format_mode;
     int output_format_mode;
+    const char *leader_spec;
 };
 
 /** \brief tranformation info (rule info) */
@@ -97,7 +98,7 @@ void yaz_record_conv_destroy(yaz_record_conv_t p)
 }
 
 #if YAZ_HAVE_XSLT
-static void *construct_xslt(yaz_record_conv_t p, const xmlNode *ptr,
+static void *construct_xslt(const xmlNode *ptr,
                             const char *path, WRBUF wr_error)
 {
     struct _xmlAttr *attr;
@@ -241,7 +242,7 @@ static void destroy_xslt(void *info)
 #endif
 
 
-static void *construct_marc(yaz_record_conv_t p, const xmlNode *ptr,
+static void *construct_marc(const xmlNode *ptr,
                             const char *path, WRBUF wr_error)
 {
     NMEM nmem = nmem_create();
@@ -261,6 +262,7 @@ static void *construct_marc(yaz_record_conv_t p, const xmlNode *ptr,
     info->output_charset = 0;
     info->input_format_mode = 0;
     info->output_format_mode = 0;
+    info->leader_spec = 0;
 
     for (attr = ptr->properties; attr; attr = attr->next)
     {
@@ -276,6 +278,10 @@ static void *construct_marc(yaz_record_conv_t p, const xmlNode *ptr,
         else if (!xmlStrcmp(attr->name, BAD_CAST "outputformat") &&
             attr->children && attr->children->type == XML_TEXT_NODE)
             output_format = (const char *) attr->children->content;
+        else if (!xmlStrcmp(attr->name, BAD_CAST "leaderspec") &&
+                 attr->children && attr->children->type == XML_TEXT_NODE)
+            info->leader_spec =
+                nmem_strdup(info->nmem,(const char *) attr->children->content);
         else
         {
             wrbuf_printf(wr_error, "Element <marc>: expected attributes"
@@ -288,7 +294,7 @@ static void *construct_marc(yaz_record_conv_t p, const xmlNode *ptr,
     }
     if (!input_format)
     {
-        wrbuf_printf(p->wr_error, "Element <marc>: "
+        wrbuf_printf(wr_error, "Element <marc>: "
                      "attribute 'inputformat' required");
         nmem_destroy(info->nmem);
         return 0;
@@ -364,7 +370,7 @@ static void *construct_marc(yaz_record_conv_t p, const xmlNode *ptr,
                                         info->input_charset);
         if (!cd)
         {
-            wrbuf_printf(p->wr_error, 
+            wrbuf_printf(wr_error, 
                          "Element <marc inputcharset='%s' outputcharset='%s'>:"
                          " Unsupported character set mapping"
                          " defined by attribute values",
@@ -374,22 +380,22 @@ static void *construct_marc(yaz_record_conv_t p, const xmlNode *ptr,
         }
         yaz_iconv_close(cd);
     }
-    else if (info->input_charset)
+    else if (!info->output_charset)
     {
         wrbuf_printf(wr_error, "Element <marc>: "
                      "attribute 'outputcharset' missing");
         nmem_destroy(info->nmem);
         return 0;
     }
-    else if (info->output_charset)
+    else if (!info->input_charset)
     {
         wrbuf_printf(wr_error, "Element <marc>: "
                      "attribute 'inputcharset' missing");
         nmem_destroy(info->nmem);
         return 0;
     }
-    info->input_charset = nmem_strdup(p->nmem, info->input_charset);
-    info->output_charset = nmem_strdup(p->nmem, info->output_charset);
+    info->input_charset = nmem_strdup(info->nmem, info->input_charset);
+    info->output_charset = nmem_strdup(info->nmem, info->output_charset);
     return info;
 }
 
@@ -402,7 +408,9 @@ static int convert_marc(void *info, WRBUF record, WRBUF wr_error)
     yaz_marc_t mt = yaz_marc_create();
     
     yaz_marc_xml(mt, mi->output_format_mode);
-    
+    if (mi->leader_spec)
+        yaz_marc_leader_spec(mt, mi->leader_spec);
+        
     if (cd)
         yaz_marc_iconv(mt, cd);
     if (mi->input_format_mode == YAZ_MARC_ISO2709)
@@ -491,7 +499,7 @@ int yaz_record_conv_configure_t(yaz_record_conv_t p, const xmlNode *ptr,
         for (t = &bt[0]; t; t = t->next)
         {
             wrbuf_rewind(p->wr_error);
-            info = t->construct(p, ptr, p->path, p->wr_error);
+            info = t->construct(ptr, p->path, p->wr_error);
 
             if (info || wrbuf_len(p->wr_error))
                 break;