X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=util%2Fmarcdump.c;h=adfc0151f0f2388d5bf845c63c1c08f1c05d5092;hp=b963320d376919ba34ed082b7b76855274ab4578;hb=30af0a1ebbea75c3e757eb03d3f988c61fce8511;hpb=058d8ab3655c243e23e0adcb29a8fea345e9fa53 diff --git a/util/marcdump.c b/util/marcdump.c index b963320..adfc015 100644 --- a/util/marcdump.c +++ b/util/marcdump.c @@ -1,5 +1,5 @@ /* This file is part of the YAZ toolkit. - * Copyright (C) 1995-2011 Index Data + * Copyright (C) Index Data * See the file LICENSE for details. */ @@ -42,9 +42,11 @@ #endif #include +#include #include #include #include +#include #ifndef SEEK_SET #define SEEK_SET 0 @@ -56,13 +58,15 @@ static char *prog; +static int no_errors = 0; + static void usage(const char *prog) { fprintf(stderr, "Usage: %s [-i format] [-o format] [-f from] [-t to] " "[-l pos=value] [-c cfile] [-s prefix] [-C size] [-n] " "[-p] [-v] [-V] file...\n", prog); -} +} static void show_version(void) { @@ -103,7 +107,7 @@ static void marcdump_read_line(yaz_marc_t mt, const char *fname) prog, fname, strerror(errno)); exit(1); } - + while (yaz_marc_read_line(mt, getbyte_stream, ungetbyte_stream, inf) == 0) { @@ -115,6 +119,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) { @@ -131,27 +182,34 @@ 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); - + 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); - + { + 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); @@ -172,11 +230,14 @@ static void marcdump_read_xml(yaz_marc_t mt, const char *fname) { 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); } @@ -233,6 +294,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"); @@ -255,27 +320,32 @@ static void dump(const char *fname, const char *from, const char *to, size_t len_result; size_t r; char buf[100001]; - + yaz_iconv_t cd1 = 0; + r = fread(buf, 1, 5, inf); if (r < 5) { - if (r && print_offset && verbose) + if (r == 0) /* normal EOF, all good */ + break; + if (print_offset && verbose) + { printf("\n", (long) r); + } break; } while (*buf < '0' || *buf > '9') { int i; long off = ftell(inf) - 5; - if (verbose || print_offset) - printf("\n", - *buf & 0xff, *buf & 0xff, - off, off); + printf("\n", + *buf & 0xff, *buf & 0xff, + off, off); for (i = 0; i<4; i++) buf[i] = buf[i+1]; r = fread(buf+4, 1, 1, inf); + no_errors++; if (r < 1) break; } @@ -295,23 +365,39 @@ static void dump(const char *fname, const char *from, const char *to, if (len < 25 || len > 100000) { long off = ftell(inf) - 5; - printf("Bad Length %ld read at offset %ld (%lx)\n", + printf("\n", (long)len, (long) off, (long) off); + no_errors++; break; } rlen = len - 5; r = fread(buf + 5, 1, rlen, inf); if (r < rlen) + { + long off = ftell(inf); + printf("\n", + (long) off, (long) off); + no_errors++; break; + } while (buf[len-1] != ISO2709_RS) { if (len > sizeof(buf)-2) + { + r = 0; break; + } r = fread(buf + len, 1, 1, inf); if (r != 1) break; len++; } + if (r < 1) + { + printf("\n"); + no_errors++; + break; + } if (split_fname) { char fname[256]; @@ -338,17 +424,35 @@ static void dump(const char *fname, const char *from, const char *to, fprintf(stderr, "Could write content to %s\n", fname); split_fname = 0; + no_errors++; } fclose(sf); } } len_result = rlen; + + if (yaz_marc_check_marc21_coding(from, buf, 26)) + { + cd1 = yaz_iconv_open(to, "utf-8"); + if (cd1) + yaz_marc_iconv(mt, cd1); + } r = yaz_marc_decode_buf(mt, buf, -1, &result, &len_result); + + if (cd1) + { + yaz_iconv_close(cd1); + yaz_marc_iconv(mt, cd); + } + + if (r == -1) + no_errors++; if (r > 0 && result && len_result) { if (fwrite(result, len_result, 1, stdout) != 1) { fprintf(stderr, "Write to stdout failed\n"); + no_errors++; break; } } @@ -363,11 +467,14 @@ 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"); - + } fprintf(cfile, "\"\n"); } @@ -416,6 +523,7 @@ int main (int argc, char **argv) #endif prog = *argv; + yaz_enable_panic_backtrace(prog); while ((r = options("i:o:C:npc:xOeXIf:t:s:l:Vv", argv, argc, &arg)) != -2) { no++; @@ -430,7 +538,7 @@ int main (int argc, char **argv) } #if YAZ_HAVE_XML2 #else - if (input_format == YAZ_MARC_MARCXML + if (input_format == YAZ_MARC_MARCXML || input_format == YAZ_MARC_XCHANGE) { fprintf(stderr, "%s: Libxml2 support not enabled\n", prog); @@ -519,7 +627,7 @@ int main (int argc, char **argv) case 'v': verbose++; break; - case 'V': + case 'V': show_version(); break; default: @@ -534,6 +642,8 @@ int main (int argc, char **argv) usage(prog); exit(1); } + if (no_errors) + exit(5); exit(0); } /*