b3ff3707b07a9a91279b06b7ecc5669c21c3c1cd
[yaz-moved-to-github.git] / util / marcdump.c
1 /*
2  * Copyright (c) 1995-2002, Index Data
3  * See the file LICENSE for details.
4  * Sebastian Hammer, Adam Dickmeiss
5  *
6  * $Id: marcdump.c,v 1.17 2002-10-04 10:19:58 adam Exp $
7  */
8
9 #if HAVE_CONFIG_H
10 #include <config.h>
11 #endif
12
13 #include <stdio.h>
14 #include <stdlib.h>
15 #include <string.h>
16 #include <errno.h>
17 #include <yaz/wrbuf.h>
18 #include <yaz/marcdisp.h>
19 #include <yaz/yaz-util.h>
20 #include <yaz/xmalloc.h>
21 #include <yaz/options.h>
22
23 #ifndef SEEK_SET
24 #define SEEK_SET 0
25 #endif
26 #ifndef SEEK_END
27 #define SEEK_END 2
28 #endif
29
30 static void usage(const char *prog)
31 {
32     fprintf (stderr, "Usage: %s [-c cfile] [-x] [-O] [-v] file...\n", prog);
33
34
35 int main (int argc, char **argv)
36 {
37     int r;
38     char *arg;
39     int verbose = 0;
40     FILE *inf;
41     char buf[100001];
42     char *prog = *argv;
43     int no = 0;
44     int xml = 0;
45     FILE *cfile = 0;
46
47     while ((r = options("vc:xO", argv, argc, &arg)) != -2)
48     {
49         int count;
50         no++;
51         switch (r)
52         {
53         case 'c':
54             if (cfile)
55                 fclose (cfile);
56             cfile = fopen (arg, "w");
57             break;
58         case 'x':
59             xml = 1;
60             break;
61         case 'O':
62             xml = 2;
63             break;
64         case 0:
65             inf = fopen (arg, "r");
66             count = 0;
67             if (!inf)
68             {
69                 fprintf (stderr, "%s: cannot open %s:%s\n",
70                          prog, arg, strerror (errno));
71                 exit (1);
72             }
73             if (cfile)
74                 fprintf (cfile, "char *marc_records[] = {\n");
75             while (1)
76             {
77                 WRBUF wr = wrbuf_alloc();
78
79                 int len;
80                 
81                 r = fread (buf, 1, 5, inf);
82                 if (r < 5)
83                     break;
84                 len = atoi_n(buf, 5);
85                 if (len < 25 || len > 100000)
86                     break;
87                 len = len - 5;
88                 r = fread (buf + 5, 1, len, inf);
89                 if (r < len)
90                     break;
91                 r = yaz_marc_decode (buf, wr, verbose, -1, xml);
92                 if (r <= 0)
93                     break;
94                 fwrite (wrbuf_buf(wr), wrbuf_len(wr), 1, stdout);
95                 if (cfile)
96                 {
97                     char *p = buf;
98                     int i;
99                     if (count)
100                         fprintf (cfile, ",");
101                     fprintf (cfile, "\n");
102                     for (i = 0; i < r; i++)
103                     {
104                         if ((i & 15) == 0)
105                             fprintf (cfile, "  \"");
106                         fprintf (cfile, "\\x%02X", p[i] & 255);
107                         
108                         if (i < r - 1 && (i & 15) == 15)
109                             fprintf (cfile, "\"\n");
110                         
111                         }
112                     fprintf (cfile, "\"\n");
113                 }
114                 count++;
115             }
116             if (cfile)
117                 fprintf (cfile, "};\n");
118             break;
119         case 'v':
120             verbose++;
121             break;
122         default:
123             usage(prog);
124             exit (1);
125         }
126     }
127     if (cfile)
128         fclose (cfile);
129     if (!no)
130     {
131         usage(prog);
132         exit (1);
133     }
134     exit (0);
135 }