+ fprintf(stderr, "%s: cannot open %s:%s\n",
+ prog, fname, strerror(errno));
+ exit(1);
+ }
+ else
+ {
+ const char *errmsg;
+ size_t errpos;
+ WRBUF w = wrbuf_alloc();
+ struct json_node *n;
+ int c;
+
+ while ((c = getc(inf)) != EOF)
+ wrbuf_putc(w, c);
+ n = json_parse2(wrbuf_cstr(w), &errmsg, &errpos);
+ if (n)
+ {
+ int r = yaz_marc_read_json_node(mt, n);
+ if (r == 0)
+ {
+ wrbuf_rewind(w);
+ yaz_marc_write_mode(mt, w);
+ fputs(wrbuf_cstr(w), stdout);
+ wrbuf_rewind(w);
+ }
+ else
+ {
+ fprintf(stderr, "%s: JSON MARC parsing failed ret=%d\n", fname,
+ r);
+ }
+ }
+ else
+ {
+ fprintf(stderr, "%s: JSON parse error: %s . pos=%ld\n", fname,
+ errmsg, (long) errpos);
+ }
+ wrbuf_destroy(w);
+ fclose(inf);
+ }
+}
+
+
+#if YAZ_HAVE_XML2
+static void marcdump_read_xml(yaz_marc_t mt, const char *fname)
+{
+ WRBUF wrbuf = wrbuf_alloc();
+#if USE_XMLREADER
+ xmlTextReaderPtr reader = xmlReaderForFile(fname, 0 /* encoding */,
+ 0 /* options */);
+
+ if (reader)
+ {
+ int ret;
+ while ((ret = xmlTextReaderRead(reader)) == 1)
+ {
+ int type = xmlTextReaderNodeType(reader);
+ if (type == XML_READER_TYPE_ELEMENT)
+ {
+ char *name = (char *) xmlTextReaderLocalName(reader);
+ if (!strcmp(name, "record") || !strcmp(name, "r"))
+ {
+ xmlNodePtr ptr = xmlTextReaderExpand(reader);
+
+ int r = yaz_marc_read_xml(mt, ptr);
+ if (r)
+ {
+ no_errors++;
+ fprintf(stderr, "yaz_marc_read_xml failed\n");
+ }
+ else
+ {
+ int write_rc = yaz_marc_write_mode(mt, wrbuf);
+ if (write_rc)
+ {
+ yaz_log(YLOG_WARN, "yaz_marc_write_mode: "
+ "write error: %d", write_rc);
+ no_errors++;
+ }
+ fputs(wrbuf_cstr(wrbuf), stdout);
+ wrbuf_rewind(wrbuf);
+ }
+ }
+ xmlFree(name);
+ }
+ }
+ xmlFreeTextReader(reader);
+ }
+#else
+ xmlDocPtr doc = xmlParseFile(fname);
+ if (doc)
+ {
+ xmlNodePtr ptr = xmlDocGetRootElement(doc);
+ for (; ptr; ptr = ptr->next)
+ {
+ if (ptr->type == XML_ELEMENT_NODE)
+ {
+ if (!strcmp((const char *) ptr->name, "collection"))
+ {
+ ptr = ptr->children;
+ continue;
+ }
+ if (!strcmp((const char *) ptr->name, "record") ||
+ !strcmp((const char *) ptr->name, "r"))
+ {
+ int r = yaz_marc_read_xml(mt, ptr);
+ if (r)
+ {
+ no_errors++;
+ fprintf(stderr, "yaz_marc_read_xml failed\n");
+ }
+ else
+ {
+ yaz_marc_write_mode(mt, wrbuf);
+
+ fputs(wrbuf_cstr(wrbuf), stdout);
+ wrbuf_rewind(wrbuf);
+ }
+ }
+ }
+ }
+ xmlFreeDoc(doc);
+ }
+#endif
+ fputs(wrbuf_cstr(wrbuf), stdout);
+ wrbuf_destroy(wrbuf);
+}
+#endif
+
+static void dump(const char *fname, const char *from, const char *to,
+ int input_format, int output_format,
+ int write_using_libxml2,
+ int print_offset, const char *split_fname, int split_chunk,
+ int verbose, FILE *cfile, const char *leader_spec)
+{
+ yaz_marc_t mt = yaz_marc_create();
+ yaz_iconv_t cd = 0;
+
+ if (yaz_marc_leader_spec(mt, leader_spec))
+ {
+ fprintf(stderr, "bad leader spec: %s\n", leader_spec);
+ yaz_marc_destroy(mt);
+ exit(2);
+ }
+ if (from && to)
+ {
+ cd = yaz_iconv_open(to, from);
+ if (!cd)
+ {
+ fprintf(stderr, "conversion from %s to %s "
+ "unsupported\n", from, to);
+ yaz_marc_destroy(mt);
+ exit(2);
+ }
+ yaz_marc_iconv(mt, cd);
+ }
+ yaz_marc_enable_collection(mt);
+ yaz_marc_xml(mt, output_format);
+ yaz_marc_write_using_libxml2(mt, write_using_libxml2);
+ yaz_marc_debug(mt, verbose);
+
+ if (input_format == YAZ_MARC_MARCXML || input_format == YAZ_MARC_TURBOMARC || input_format == YAZ_MARC_XCHANGE)
+ {
+#if YAZ_HAVE_XML2
+ marcdump_read_xml(mt, fname);
+#endif