X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=util%2Fmarcdump.c;h=cec66ab347d4320f050eaa2499c31524bfb3ad69;hp=e0491c446625e068d0c9ea3f20db96df5bc47a3b;hb=725b07a551ac42b73d3b621e6a9b696cd13f42d0;hpb=0c46d2e66bdeea1600e700124a81a5d0a65d349e diff --git a/util/marcdump.c b/util/marcdump.c index e0491c4..cec66ab 100644 --- a/util/marcdump.c +++ b/util/marcdump.c @@ -42,6 +42,7 @@ #endif #include +#include #include #include #include @@ -117,6 +118,53 @@ static void marcdump_read_line(yaz_marc_t mt, const char *fname) fclose(inf); } +static void marcdump_read_json(yaz_marc_t mt, const char *fname) +{ + FILE *inf = fopen(fname, "rb"); + if (!inf) + { + 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) { @@ -133,8 +181,7 @@ static void marcdump_read_xml(yaz_marc_t mt, const char *fname) int type = xmlTextReaderNodeType(reader); if (type == XML_READER_TYPE_ELEMENT) { - const char *name = (const char *) - xmlTextReaderLocalName(reader); + char *name = (char *) xmlTextReaderLocalName(reader); if (!strcmp(name, "record") || !strcmp(name, "r")) { xmlNodePtr ptr = xmlTextReaderExpand(reader); @@ -158,8 +205,10 @@ static void marcdump_read_xml(yaz_marc_t mt, const char *fname) wrbuf_rewind(wrbuf); } } + xmlFree(name); } } + xmlFreeTextReader(reader); } #else xmlDocPtr doc = xmlParseFile(fname); @@ -244,6 +293,10 @@ static void dump(const char *fname, const char *from, const char *to, { marcdump_read_line(mt, fname); } + else if (input_format == YAZ_MARC_JSON) + { + marcdump_read_json(mt, fname); + } else if (input_format == YAZ_MARC_ISO2709) { FILE *inf = fopen(fname, "rb"); @@ -398,7 +451,10 @@ static void dump(const char *fname, const char *from, const char *to, { if ((i & 15) == 0) fprintf(cfile, " \""); - fprintf(cfile, "\\x%02X", p[i] & 255); + if (p[i] < 32 || p[i] > 126) + fprintf(cfile, "\" \"\\x%02X\" \"", p[i] & 255); + else + fputc(p[i], cfile); if (i < r - 1 && (i & 15) == 15) fprintf(cfile, "\"\n");