Keep log level app2,app3. It is still being used
[yaz-moved-to-github.git] / util / marcdump.c
index d441855..ca9b324 100644 (file)
@@ -1,8 +1,8 @@
 /*
- * Copyright (c) 1995-2004, Index Data
+ * Copyright (C) 1995-2005, Index Data ApS
  * See the file LICENSE for details.
  *
- * $Id: marcdump.c,v 1.25 2004-08-07 08:18:20 adam Exp $
+ * $Id: marcdump.c,v 1.30 2005-04-20 13:17:29 adam Exp $
  */
 
 #if HAVE_CONFIG_H
@@ -45,7 +45,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 +123,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++;
@@ -146,6 +146,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;
@@ -190,34 +193,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 +282,7 @@ int main (int argc, char **argv)
                        }
                    }
 #endif
-                    if (cfile)
+                    if (r > 0 && cfile)
                     {
                         char *p = buf;
                         int i;
@@ -273,6 +302,8 @@ int main (int argc, char **argv)
                         fprintf (cfile, "\"\n");
                     }
                    num++;
+                   if (verbose)
+                       printf("\n");
                 }
                 count++;
                 if (cd)