* Copyright (C) 1995-2005, Index Data ApS
* See the file LICENSE for details.
*
- * $Id: marcdump.c,v 1.26 2005-01-15 19:47:15 adam Exp $
+ * $Id: marcdump.c,v 1.30 2005-04-20 13:17:29 adam Exp $
*/
#if HAVE_CONFIG_H
static void usage(const char *prog)
{
- fprintf (stderr, "Usage: %s [-c cfile] [-f from] [-t to] [-x] [-O] [-X] [-I] [-v] file...\n",
+ fprintf (stderr, "Usage: %s [-c cfile] [-f from] [-t to] [-x] [-O] [-X] [-e] [-I] [-v] file...\n",
prog);
}
#endif
#endif
- while ((r = options("pvc:xOXIf:t:2", argv, argc, &arg)) != -2)
+ while ((r = options("pvc:xOeXIf:t:2", argv, argc, &arg)) != -2)
{
int count;
no++;
case 'O':
xml = YAZ_MARC_OAIMARC;
break;
+ case 'e':
+ xml = YAZ_MARC_XCHANGE;
+ break;
case 'X':
xml = YAZ_MARC_MARCXML;
break;
while (1)
{
int len;
- char *result;
+ char *result = 0;
int rlen;
r = fread (buf, 1, 5, inf);
if (r < 5)
{
- if (r && print_offset)
- printf ("Extra %d bytes", r);
+ if (r && print_offset && verbose)
+ printf ("<!-- Extra %d bytes at end of file -->\n", r);
break;
}
+ while (*buf < '0' || *buf > '9')
+ {
+ int i;
+ long off = ftell(inf) - 5;
+ if (verbose || print_offset)
+ printf("<!-- Skipping bad byte %d (0x%02X) at offset "
+ "%ld (0x%lx) -->\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);
+ if (r < 1)
+ break;
+ }
+ if (r < 1)
+ {
+ if (verbose || print_offset)
+ printf ("<!-- End of file with data -->\n");
+ break;
+ }
if (print_offset)
{
- long off = ftell(inf);
- printf ("Record %d offset %ld\n", num, (long) off);
+ long off = ftell(inf) - 5;
+ printf ("<!-- Record %d offset %ld (0x%lx) -->\n",
+ num, off, off);
}
len = atoi_n(buf, 5);
if (len < 25 || len > 100000)
+ {
+ long off = ftell(inf) - 5;
+ printf("Bad Length %d read at offset %ld (%lx)\n",
+ len, (long) off, (long) off);
break;
+ }
len = len - 5;
r = fread (buf + 5, 1, len, inf);
if (r < len)
break;
r = yaz_marc_decode_buf (mt, buf, -1, &result, &rlen);
- if (r <= 0)
- break;
- fwrite (result, rlen, 1, stdout);
+ if (result)
+ fwrite (result, rlen, 1, stdout);
#if HAVE_XML2
- if (libxml_dom_test)
+ if (r > 0 && libxml_dom_test)
{
xmlDocPtr doc = xmlParseMemory(result, rlen);
if (!doc)
}
}
#endif
- if (cfile)
+ if (r > 0 && cfile)
{
char *p = buf;
int i;
fprintf (cfile, "\"\n");
}
num++;
+ if (verbose)
+ printf("\n");
}
count++;
if (cd)