LFS mode for yaz-marcdump so that it can read large ISO2709 files
[yaz-moved-to-github.git] / util / marcdump.c
index 3de8d76..0108bc6 100644 (file)
@@ -2,9 +2,11 @@
  * 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.31 2005-06-09 18:47:07 adam Exp $
  */
 
+#define _FILE_OFFSET_BITS 64
+
 #if HAVE_CONFIG_H
 #include <config.h>
 #endif
@@ -45,7 +47,7 @@
 
 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);
 } 
 
@@ -123,7 +125,7 @@ int main (int argc, char **argv)
 #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++;
@@ -138,7 +140,7 @@ int main (int argc, char **argv)
        case 'c':
            if (cfile)
                fclose (cfile);
-           cfile = fopen (arg, "w");
+           cfile = fopen(arg, "w");
            break;
         case 'x':
             xml = YAZ_MARC_SIMPLEXML;
@@ -146,6 +148,9 @@ int main (int argc, char **argv)
         case 'O':
             xml = YAZ_MARC_OAIMARC;
             break;
+       case 'e':
+           xml = YAZ_MARC_XCHANGE;
+           break;
         case 'X':
             xml = YAZ_MARC_MARCXML;
             break;
@@ -159,7 +164,7 @@ int main (int argc, char **argv)
            libxml_dom_test = 1;
            break;
         case 0:
-           inf = fopen (arg, "rb");
+           inf = fopen(arg, "rb");
            count = 0;
            if (!inf)
            {
@@ -190,34 +195,60 @@ int main (int argc, char **argv)
                 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)
@@ -253,7 +284,7 @@ int main (int argc, char **argv)
                        }
                    }
 #endif
-                    if (cfile)
+                    if (r > 0 && cfile)
                     {
                         char *p = buf;
                         int i;
@@ -273,6 +304,8 @@ int main (int argc, char **argv)
                         fprintf (cfile, "\"\n");
                     }
                    num++;
+                   if (verbose)
+                       printf("\n");
                 }
                 count++;
                 if (cd)