/*
- * Copyright (C) 1995-2006, Index Data ApS
+ * Copyright (C) 1995-2007, Index Data ApS
* See the file LICENSE for details.
*
- * $Id: marcdump.c,v 1.44 2006-12-07 11:08:05 adam Exp $
+ * $Id: marcdump.c,v 1.52 2007-04-17 20:26:18 adam Exp $
*/
#define _FILE_OFFSET_BITS 64
static void usage(const char *prog)
{
- fprintf (stderr, "Usage: %s [-c cfile] [-f from] [-t to] [-x] [-X] [-e] "
- "[-I] [-n] [-l pos=value] [-v] [-C chunk] [-s splitfname] file...\n",
+ fprintf (stderr, "Usage: %s [-c cfile] [-f from] [-t to] "
+ "[-i format] [-o format] "
+ "[-n] [-l pos=value] [-v] [-C chunk] [-s splitfname] file...\n",
prog);
}
+static int getbyte_stream(void *client_data)
+{
+ FILE *f = (FILE*) client_data;
+
+ int c = fgetc(f);
+ if (c == EOF)
+ return 0;
+ return c;
+}
+
+static void ungetbyte_stream(int c, void *client_data)
+{
+ FILE *f = (FILE*) client_data;
+
+ if (c == 0)
+ c = EOF;
+ ungetc(c, f);
+}
+
+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));
+ exit(1);
+ }
+
+ while (yaz_marc_read_line(mt, getbyte_stream,
+ ungetbyte_stream, inf) == 0)
+ {
+ WRBUF wrbuf = wrbuf_alloc();
+ yaz_marc_write_mode(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)
{
{
yaz_marc_write_mode(mt, wrbuf);
- fputs(wrbuf_buf(wrbuf), stdout);
+ fputs(wrbuf_cstr(wrbuf), stdout);
}
- wrbuf_free(wrbuf, 1);
+ wrbuf_destroy(wrbuf);
}
xmlFreeDoc(doc);
}
#endif
static void dump(const char *fname, const char *from, const char *to,
- int read_xml, int xml,
+ 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_iconv(mt, cd);
}
- yaz_marc_xml(mt, xml);
+ yaz_marc_xml(mt, output_format);
+ yaz_marc_write_using_libxml2(mt, write_using_libxml2);
yaz_marc_debug(mt, verbose);
- if (read_xml)
+ if (input_format == YAZ_MARC_MARCXML || input_format == YAZ_MARC_XCHANGE)
{
#if YAZ_HAVE_XML2
marcdump_read_xml(mt, fname);
-#else
- return;
#endif
}
- else
+ else if (input_format == YAZ_MARC_LINE)
+ {
+ marcdump_read_line(mt, fname);
+ }
+ else if (input_format == YAZ_MARC_ISO2709)
{
FILE *inf = fopen(fname, "rb");
int num = 1;
fprintf (cfile, "char *marc_records[] = {\n");
for(;; marc_no++)
{
- char *result = 0;
+ const char *result = 0;
size_t len;
size_t rlen;
- int len_result;
+ size_t len_result;
size_t r;
char buf[100001];
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);
+ if (r != 1)
+ break;
+ len++;
+ }
if (split_fname)
{
char fname[256];
fclose(sf);
}
}
- len_result = (int) rlen;
+ len_result = rlen;
r = yaz_marc_decode_buf(mt, buf, -1, &result, &len_result);
if (r > 0 && result)
{
char *arg;
int verbose = 0;
int no = 0;
- int xml = 0;
+ int output_format = YAZ_MARC_LINE;
FILE *cfile = 0;
char *from = 0, *to = 0;
- int read_xml = 0;
+ int input_format = YAZ_MARC_ISO2709;
int split_chunk = 1;
const char *split_fname = 0;
const char *leader_spec = 0;
-
+ int write_using_libxml2 = 0;
+
#if HAVE_LOCALE_H
setlocale(LC_CTYPE, "");
#endif
#endif
prog = *argv;
- while ((r = options("C:npvc:xOeXIf:t:s:l:", argv, argc, &arg)) != -2)
+ while ((r = options("i:o:C:npvc:xOeXIf:t:s:l:", argv, argc, &arg)) != -2)
{
no++;
switch (r)
{
+ case 'i':
+ input_format = yaz_marc_decode_formatstr(arg);
+ if (input_format == -1)
+ {
+ fprintf(stderr, "%s: bad input format: %s\n", prog, arg);
+ exit(1);
+ }
+#if YAZ_HAVE_XML2
+#else
+ if (input_format == YAZ_MARC_MARCXML
+ || input_format == YAZ_MARC_XCHANGE)
+ {
+ fprintf(stderr, "%s: Libxml2 support not enabled\n", prog);
+ exit(3);
+ }
+#endif
+ break;
+ case 'o':
+ /* dirty hack so we can make Libxml2 do the writing ..
+ rather than WRBUF */
+ if (strlen(arg) > 4 && strncmp(arg, "xml,", 4) == 0)
+ {
+ arg = arg + 4;
+ write_using_libxml2 = 1;
+ }
+ output_format = yaz_marc_decode_formatstr(arg);
+ if (output_format == -1)
+ {
+ fprintf(stderr, "%s: bad output format: %s\n", prog, arg);
+ exit(1);
+ }
+ break;
case 'l':
leader_spec = arg;
break;
cfile = fopen(arg, "w");
break;
case 'x':
-#if YAZ_HAVE_XML2
- read_xml = 1;
-#else
- fprintf(stderr, "%s: -x not supported."
- " YAZ not compiled with Libxml2 support\n", prog);
- exit(3);
-#endif
+ fprintf(stderr, "%s: -x no longer supported. "
+ "Use -i marcxml instead\n", prog);
+ exit(1);
break;
case 'O':
fprintf(stderr, "%s: OAI MARC no longer supported."
exit(1);
break;
case 'e':
- xml = YAZ_MARC_XCHANGE;
+ fprintf(stderr, "%s: -e no longer supported. "
+ "Use -o marcxchange instead\n", prog);
+ exit(1);
break;
case 'X':
- xml = YAZ_MARC_MARCXML;
+ fprintf(stderr, "%s: -X no longer supported. "
+ "Use -o marcxml instead\n", prog);
+ exit(1);
break;
case 'I':
- xml = YAZ_MARC_ISO2709;
+ fprintf(stderr, "%s: -I no longer supported. "
+ "Use -o marc instead\n", prog);
+ exit(1);
break;
case 'n':
- xml = YAZ_MARC_CHECK;
+ output_format = YAZ_MARC_CHECK;
break;
case 'p':
print_offset = 1;
split_chunk = atoi(arg);
break;
case 0:
- dump(arg, from, to, read_xml, xml,
+ dump(arg, from, to, input_format, output_format,
+ write_using_libxml2,
print_offset, split_fname, split_chunk,
verbose, cfile, leader_spec);
break;
break;
default:
usage(prog);
- exit (1);
+ exit(1);
}
}
if (cfile)