+ 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;
+}
+
+static void destroy_marc(void *info)
+{
+ struct marc_info *mi = info;
+
+ nmem_destroy(mi->nmem);
+}
+
+int yaz_record_conv_configure_t(yaz_record_conv_t p, const xmlNode *ptr,
+ struct yaz_record_conv_type *types)
+{
+ struct yaz_record_conv_type bt[2];
+
+ /* register marc */
+ bt[0].construct = construct_marc;
+ bt[0].convert = convert_marc;
+ bt[0].destroy = destroy_marc;
+
+#if YAZ_HAVE_XSLT
+ /* register xslt */
+ bt[0].next = &bt[1];
+ bt[1].next = types;
+ bt[1].construct = construct_xslt;
+ bt[1].convert = convert_xslt;
+ bt[1].destroy = destroy_xslt;
+#else
+ bt[0].next = types;
+#endif
+
+ yaz_record_conv_reset(p);
+
+ /* parsing element children */
+ for (ptr = ptr->children; ptr; ptr = ptr->next)
+ {
+ struct yaz_record_conv_type *t;
+ struct yaz_record_conv_rule *r;
+ void *info = 0;
+ if (ptr->type != XML_ELEMENT_NODE)
+ continue;
+ for (t = &bt[0]; t; t = t->next)
+ {
+ wrbuf_rewind(p->wr_error);
+ info = t->construct(ptr, p->path, p->wr_error);
+
+ if (info || wrbuf_len(p->wr_error))
+ break;
+ /* info== 0 and no error reported , ie not handled by it */
+ }
+ if (!info)
+ {
+ if (wrbuf_len(p->wr_error) == 0)
+ wrbuf_printf(p->wr_error, "Element <backend>: expected "
+ "<marc> or <xslt> element, got <%s>"
+ , ptr->name);
+ return -1;
+ }
+ r = (struct yaz_record_conv_rule *) nmem_malloc(p->nmem, sizeof(*r));
+ r->next = 0;
+ r->info = info;
+ r->type = nmem_malloc(p->nmem, sizeof(*t));
+ memcpy(r->type, t, sizeof(*t));
+ *p->rules_p = r;
+ p->rules_p = &r->next;