076628e706ad9256d70644ac43870dbbd718b62a
[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.18 2002-12-03 10:03:27 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/marcdisp.h>
18 #include <yaz/yaz-util.h>
19 #include <yaz/xmalloc.h>
20 #include <yaz/options.h>
21
22 #ifndef SEEK_SET
23 #define SEEK_SET 0
24 #endif
25 #ifndef SEEK_END
26 #define SEEK_END 2
27 #endif
28
29 static void usage(const char *prog)
30 {
31     fprintf (stderr, "Usage: %s [-c cfile] [-x] [-O] [-X] [-v] file...\n",
32              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:xOX", 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 = YAZ_MARC_XML;
60             break;
61         case 'O':
62             xml = YAZ_MARC_OAIMARC;
63             break;
64         case 'X':
65             xml = YAZ_MARC_MARCXML;
66             break;
67         case 0:
68             inf = fopen (arg, "r");
69             count = 0;
70             if (!inf)
71             {
72                 fprintf (stderr, "%s: cannot open %s:%s\n",
73                          prog, arg, strerror (errno));
74                 exit (1);
75             }
76             if (cfile)
77                 fprintf (cfile, "char *marc_records[] = {\n");
78             while (1)
79             {
80                 WRBUF wr = wrbuf_alloc();
81
82                 int len;
83                 
84                 r = fread (buf, 1, 5, inf);
85                 if (r < 5)
86                     break;
87                 len = atoi_n(buf, 5);
88                 if (len < 25 || len > 100000)
89                     break;
90                 len = len - 5;
91                 r = fread (buf + 5, 1, len, inf);
92                 if (r < len)
93                     break;
94                 r = yaz_marc_decode (buf, wr, verbose, -1, xml);
95                 if (r <= 0)
96                     break;
97                 fwrite (wrbuf_buf(wr), wrbuf_len(wr), 1, stdout);
98                 if (cfile)
99                 {
100                     char *p = buf;
101                     int i;
102                     if (count)
103                         fprintf (cfile, ",");
104                     fprintf (cfile, "\n");
105                     for (i = 0; i < r; i++)
106                     {
107                         if ((i & 15) == 0)
108                             fprintf (cfile, "  \"");
109                         fprintf (cfile, "\\x%02X", p[i] & 255);
110                         
111                         if (i < r - 1 && (i & 15) == 15)
112                             fprintf (cfile, "\"\n");
113                         
114                         }
115                     fprintf (cfile, "\"\n");
116                 }
117                 count++;
118             }
119             if (cfile)
120                 fprintf (cfile, "};\n");
121             break;
122         case 'v':
123             verbose++;
124             break;
125         default:
126             usage(prog);
127             exit (1);
128         }
129     }
130     if (cfile)
131         fclose (cfile);
132     if (!no)
133     {
134         usage(prog);
135         exit (1);
136     }
137     exit (0);
138 }