X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=util%2Fmarcdump.c;h=b963320d376919ba34ed082b7b76855274ab4578;hb=0faba8eaa6796ce9a1101e36d00d9b0d9f5ce3b2;hp=2dc36eff7a419601242453b2afce308bfaec345e;hpb=3eb8be5cd44ecdbd68ec3ca8a54ec86691ff9a4d;p=yaz-moved-to-github.git diff --git a/util/marcdump.c b/util/marcdump.c index 2dc36ef..b963320 100644 --- a/util/marcdump.c +++ b/util/marcdump.c @@ -1,8 +1,6 @@ -/* - * Copyright (C) 1995-2007, Index Data ApS +/* This file is part of the YAZ toolkit. + * Copyright (C) 1995-2011 Index Data * See the file LICENSE for details. - * - * $Id: marcdump.c,v 1.54 2007-12-17 20:59:32 adam Exp $ */ #define _FILE_OFFSET_BITS 64 @@ -14,10 +12,20 @@ #if YAZ_HAVE_XML2 #include #include -#include #include #include +/* Libxml2 version < 2.6.15. xmlreader not reliable/present */ +#if LIBXML_VERSION < 20615 +#define USE_XMLREADER 0 +#else +#define USE_XMLREADER 1 +#endif + +#if USE_XMLREADER +#include +#endif + #endif #include @@ -50,12 +58,23 @@ static char *prog; static void usage(const char *prog) { - fprintf (stderr, "Usage: %s [-c cfile] [-f from] [-t to] " - "[-i format] [-o format] " - "[-n] [-l pos=value] [-v] [-C chunk] [-s splitfname] [-p] file...\n", - 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) +{ + char vstr[20], sha1_str[41]; + + yaz_version(vstr, sha1_str); + printf("YAZ version: %s %s\n", YAZ_VERSION, YAZ_VERSION_SHA1); + if (strcmp(sha1_str, YAZ_VERSION_SHA1)) + printf("YAZ DLL/SO: %s %s\n", vstr, sha1_str); + exit(0); +} + static int getbyte_stream(void *client_data) { FILE *f = (FILE*) client_data; @@ -80,8 +99,8 @@ static void marcdump_read_line(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)); + fprintf(stderr, "%s: cannot open %s:%s\n", + prog, fname, strerror(errno)); exit(1); } @@ -93,33 +112,28 @@ static void marcdump_read_line(yaz_marc_t mt, const char *fname) fputs(wrbuf_cstr(wrbuf), stdout); wrbuf_destroy(wrbuf); } - { - WRBUF wrbuf = wrbuf_alloc(); - yaz_marc_write_trailer(mt, wrbuf); - fputs(wrbuf_cstr(wrbuf), stdout); - wrbuf_destroy(wrbuf); - } 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; - WRBUF wrbuf = wrbuf_alloc(); while ((ret = xmlTextReaderRead(reader)) == 1) { int type = xmlTextReaderNodeType(reader); if (type == XML_READER_TYPE_ELEMENT) { const char *name = (const char *) - xmlTextReaderConstName(reader); - if (!strcmp(name, "record")) + xmlTextReaderLocalName(reader); + if (!strcmp(name, "record") || !strcmp(name, "r")) { xmlNodePtr ptr = xmlTextReaderExpand(reader); @@ -128,6 +142,39 @@ static void marcdump_read_xml(yaz_marc_t mt, const char *fname) 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); + + fputs(wrbuf_cstr(wrbuf), stdout); + wrbuf_rewind(wrbuf); + } + } + } + } + } +#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) + fprintf(stderr, "yaz_marc_read_xml failed\n"); + else + { yaz_marc_write_mode(mt, wrbuf); fputs(wrbuf_cstr(wrbuf), stdout); @@ -136,11 +183,11 @@ static void marcdump_read_xml(yaz_marc_t mt, const char *fname) } } } - yaz_marc_write_trailer(mt, wrbuf); - fputs(wrbuf_cstr(wrbuf), stdout); - wrbuf_destroy(wrbuf); - xmlFreeTextReader(reader); + xmlFreeDoc(doc); } +#endif + fputs(wrbuf_cstr(wrbuf), stdout); + wrbuf_destroy(wrbuf); } #endif @@ -171,12 +218,12 @@ static void dump(const char *fname, const char *from, const char *to, } yaz_marc_iconv(mt, cd); } - yaz_marc_xml(mt, output_format); 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_XCHANGE) + 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); @@ -194,12 +241,12 @@ static void dump(const char *fname, const char *from, const char *to, int split_file_no = -1; if (!inf) { - fprintf (stderr, "%s: cannot open %s:%s\n", - prog, fname, strerror (errno)); + fprintf(stderr, "%s: cannot open %s:%s\n", + prog, fname, strerror(errno)); exit(1); } if (cfile) - fprintf (cfile, "char *marc_records[] = {\n"); + fprintf(cfile, "char *marc_records[] = {\n"); for(;; marc_no++) { const char *result = 0; @@ -209,12 +256,12 @@ static void dump(const char *fname, const char *from, const char *to, size_t r; char buf[100001]; - r = fread (buf, 1, 5, inf); + r = fread(buf, 1, 5, inf); if (r < 5) { if (r && print_offset && verbose) - printf ("\n", - (long) r); + printf("\n", + (long) r); break; } while (*buf < '0' || *buf > '9') @@ -235,14 +282,14 @@ static void dump(const char *fname, const char *from, const char *to, if (r < 1) { if (verbose || print_offset) - printf ("\n"); + printf("\n"); break; } if (print_offset) { long off = ftell(inf) - 5; - printf ("\n", - num, off, off); + printf("\n", + num, off, off); } len = atoi_n(buf, 5); if (len < 25 || len > 100000) @@ -253,14 +300,14 @@ static void dump(const char *fname, const char *from, const char *to, break; } rlen = len - 5; - r = fread (buf + 5, 1, rlen, inf); + r = fread(buf + 5, 1, rlen, inf); if (r < rlen) break; while (buf[len-1] != ISO2709_RS) { if (len > sizeof(buf)-2) break; - r = fread (buf + len, 1, 1, inf); + r = fread(buf + len, 1, 1, inf); if (r != 1) break; len++; @@ -297,35 +344,39 @@ static void dump(const char *fname, const char *from, const char *to, } len_result = rlen; r = yaz_marc_decode_buf(mt, buf, -1, &result, &len_result); - if (r > 0 && result) + if (r > 0 && result && len_result) { - fwrite (result, len_result, 1, stdout); + if (fwrite(result, len_result, 1, stdout) != 1) + { + fprintf(stderr, "Write to stdout failed\n"); + break; + } } if (r > 0 && cfile) { char *p = buf; size_t i; if (marc_no) - fprintf (cfile, ","); - fprintf (cfile, "\n"); + fprintf(cfile, ","); + fprintf(cfile, "\n"); for (i = 0; i < r; i++) { if ((i & 15) == 0) - fprintf (cfile, " \""); - fprintf (cfile, "\\x%02X", p[i] & 255); + fprintf(cfile, " \""); + fprintf(cfile, "\\x%02X", p[i] & 255); if (i < r - 1 && (i & 15) == 15) - fprintf (cfile, "\"\n"); + fprintf(cfile, "\"\n"); } - fprintf (cfile, "\"\n"); + fprintf(cfile, "\"\n"); } num++; if (verbose) printf("\n"); } if (cfile) - fprintf (cfile, "};\n"); + fprintf(cfile, "};\n"); fclose(inf); } { @@ -365,7 +416,7 @@ int main (int argc, char **argv) #endif prog = *argv; - while ((r = options("i:o:C:npvc:xOeXIf:t:s:l:", argv, argc, &arg)) != -2) + while ((r = options("i:o:C:npc:xOeXIf:t:s:l:Vv", argv, argc, &arg)) != -2) { no++; switch (r) @@ -392,8 +443,14 @@ int main (int argc, char **argv) rather than WRBUF */ if (strlen(arg) > 4 && strncmp(arg, "xml,", 4) == 0) { + /* Only supported for Libxml2 2.6.0 or later */ +#if LIBXML_VERSION >= 20600 arg = arg + 4; write_using_libxml2 = 1; +#else + fprintf(stderr, "%s: output using Libxml2 unsupported\n", prog); + exit(4); +#endif } output_format = yaz_marc_decode_formatstr(arg); if (output_format == -1) @@ -413,7 +470,7 @@ int main (int argc, char **argv) break; case 'c': if (cfile) - fclose (cfile); + fclose(cfile); cfile = fopen(arg, "w"); break; case 'x': @@ -462,23 +519,27 @@ int main (int argc, char **argv) case 'v': verbose++; break; + case 'V': + show_version(); + break; default: usage(prog); exit(1); } } if (cfile) - fclose (cfile); + fclose(cfile); if (!no) { usage(prog); - exit (1); + exit(1); } - exit (0); + exit(0); } /* * Local variables: * c-basic-offset: 4 + * c-file-style: "Stroustrup" * indent-tabs-mode: nil * End: * vim: shiftwidth=4 tabstop=8 expandtab