+ {
+ wrbuf_printf(wr_error, "Element <marc inputformat='%s'>: "
+ " Unsupported input format"
+ " defined by attribute value",
+ input_format);
+ nmem_destroy(info->nmem);
+ return 0;
+ }
+
+ if (!output_format)
+ {
+ wrbuf_printf(wr_error,
+ "Element <marc>: attribute 'outputformat' required");
+ nmem_destroy(info->nmem);
+ return 0;
+ }
+ else if (!strcmp(output_format, "line"))
+ {
+ info->output_format_mode = YAZ_MARC_LINE;
+ }
+ else if (!strcmp(output_format, "marcxml"))
+ {
+ info->output_format_mode = YAZ_MARC_MARCXML;
+ if (info->input_charset && !info->output_charset)
+ info->output_charset = "utf-8";
+ }
+ else if (!strcmp(output_format, "turbomarc"))
+ {
+ info->output_format_mode = YAZ_MARC_TURBOMARC;
+ if (info->input_charset && !info->output_charset)
+ info->output_charset = "utf-8";
+ }
+ else if (!strcmp(output_format, "marc"))
+ {
+ info->output_format_mode = YAZ_MARC_ISO2709;
+ }
+ else if (!strcmp(output_format, "marcxchange"))
+ {
+ info->output_format_mode = YAZ_MARC_XCHANGE;
+ if (info->input_charset && !info->output_charset)
+ info->output_charset = "utf-8";
+ }
+ else
+ {
+ wrbuf_printf(wr_error, "Element <marc outputformat='%s'>: "
+ " Unsupported output format"
+ " defined by attribute value",
+ output_format);
+ nmem_destroy(info->nmem);
+ return 0;
+ }
+ if (info->input_charset && info->output_charset)
+ {
+ yaz_iconv_t cd = yaz_iconv_open(info->output_charset,
+ info->input_charset);
+ if (!cd)
+ {
+ wrbuf_printf(wr_error,
+ "Element <marc inputcharset='%s' outputcharset='%s'>:"
+ " Unsupported character set mapping"
+ " defined by attribute values",
+ info->input_charset, info->output_charset);
+ nmem_destroy(info->nmem);
+ return 0;
+ }
+ yaz_iconv_close(cd);
+ }
+ else if (!info->output_charset)
+ {
+ wrbuf_printf(wr_error, "Element <marc>: "
+ "attribute 'outputcharset' missing");
+ nmem_destroy(info->nmem);
+ return 0;
+ }
+ 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(info->nmem, info->input_charset);
+ info->output_charset = nmem_strdup(info->nmem, info->output_charset);
+ return info;
+}
+
+static int convert_marc(void *info, WRBUF record, WRBUF wr_error)
+{
+ struct marc_info *mi = info;
+ int ret = 0;
+
+ yaz_iconv_t cd = yaz_iconv_open(mi->output_charset, mi->input_charset);
+ 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)
+ {
+ int sz = yaz_marc_read_iso2709(mt, wrbuf_buf(record),
+ wrbuf_len(record));
+ if (sz > 0)
+ ret = 0;
+ else
+ ret = -1;
+ }
+ else if (mi->input_format_mode == YAZ_MARC_MARCXML ||
+ mi->input_format_mode == YAZ_MARC_TURBOMARC)
+ {
+ xmlDocPtr doc = xmlParseMemory(wrbuf_buf(record),
+ wrbuf_len(record));
+ if (!doc)
+ {
+ wrbuf_printf(wr_error, "xmlParseMemory failed");
+ ret = -1;
+ }
+ else
+ {
+ ret = yaz_marc_read_xml(mt, xmlDocGetRootElement(doc));
+ if (ret)
+ wrbuf_printf(wr_error, "yaz_marc_read_xml failed");
+ }
+ xmlFreeDoc(doc);
+ }
+ else
+ {
+ wrbuf_printf(wr_error, "unsupported input format");
+ ret = -1;
+ }
+ if (ret == 0)
+ {
+ wrbuf_rewind(record);
+ ret = yaz_marc_write_mode(mt, record);
+ if (ret)
+ wrbuf_printf(wr_error, "yaz_marc_write_mode failed");
+ }
+ if (cd)
+ yaz_iconv_close(cd);
+ yaz_marc_destroy(mt);
+ return ret;