Updated WIN32 code specific sections. Changed header.
[idzebra-moved-to-github.git] / index / kdump.c
1 /*
2  * Copyright (C) 1994-1999, Index Data
3  * All rights reserved.
4  * Sebastian Hammer, Adam Dickmeiss
5  *
6  * $Log: kdump.c,v $
7  * Revision 1.17  1999-02-02 14:50:55  adam
8  * Updated WIN32 code specific sections. Changed header.
9  *
10  * Revision 1.16  1998/05/20 10:12:17  adam
11  * Implemented automatic EXPLAIN database maintenance.
12  * Modified Zebra to work with ASN.1 compiled version of YAZ.
13  *
14  * Revision 1.15  1998/03/05 08:45:12  adam
15  * New result set model and modular ranking system. Moved towards
16  * descent server API. System information stored as "SGML" records.
17  *
18  * Revision 1.14  1997/10/27 14:33:04  adam
19  * Moved towards generic character mapping depending on "structure"
20  * field in abstract syntax file. Fixed a few memory leaks. Fixed
21  * bug with negative integers when doing searches with relational
22  * operators.
23  *
24  * Revision 1.13  1997/09/09 13:38:07  adam
25  * Partial port to WIN95/NT.
26  *
27  * Revision 1.12  1997/09/05 09:52:32  adam
28  * Extra argument added to function chr_read_maptab (tab path).
29  *
30  * Revision 1.11  1996/10/29 14:06:49  adam
31  * Include zebrautl.h instead of alexutil.h.
32  *
33  * Revision 1.10  1996/06/04 14:56:12  quinn
34  * Fix
35  *
36  * Revision 1.9  1996/06/04  14:18:53  quinn
37  * Charmap work
38  *
39  * Revision 1.8  1996/06/04  10:18:59  adam
40  * Minor changes - removed include of ctype.h.
41  *
42  * Revision 1.7  1995/10/10  12:24:38  adam
43  * Temporary sort files are compressed.
44  *
45  * Revision 1.6  1995/09/29  14:01:42  adam
46  * Bug fixes.
47  *
48  * Revision 1.5  1995/09/11  13:09:35  adam
49  * More work on relevance feedback.
50  *
51  * Revision 1.4  1995/09/08  14:52:27  adam
52  * Minor changes. Dictionary is lower case now.
53  *
54  * Revision 1.3  1995/09/06  16:11:17  adam
55  * Option: only one word key per file.
56  *
57  * Revision 1.2  1995/09/04  12:33:42  adam
58  * Various cleanup. YAZ util used instead.
59  *
60  * Revision 1.1  1995/09/04  09:10:36  adam
61  * More work on index add/del/update.
62  * Merge sort implemented.
63  * Initial work on z39 server.
64  *
65  */
66 #include <stdio.h>
67 #include <string.h>
68 #include <assert.h>
69 #ifdef WIN32
70 #include <io.h>
71 #else
72 #include <unistd.h>
73 #endif
74 #include <assert.h>
75
76 #include <charmap.h>
77 #include "index.h"
78
79 char *prog;
80
81
82 int key_file_decode (FILE *f)
83 {
84     int c, d;
85
86     c = getc (f);
87     switch (c & 192) 
88     {
89     case 0:
90         d = c;
91         break;
92     case 64:
93         d = ((c&63) << 8) + (getc (f) & 0xff);
94         break;
95     case 128:
96         d = ((c&63) << 8) + (getc (f) & 0xff);
97         d = (d << 8) + (getc (f) & 0xff);
98         break;
99     case 192:
100         d = ((c&63) << 8) + (getc (f) & 0xff);
101         d = (d << 8) + (getc (f) & 0xff);
102         d = (d << 8) + (getc (f) & 0xff);
103         break;
104     }
105     return d;
106 }
107
108
109 static int read_one (FILE *inf, char *name, char *key, struct it_key *prevk)
110 {
111     int c;
112     int i = 0;
113     struct it_key itkey;
114     do
115     {
116         if ((c=getc(inf)) == EOF)
117             return 0;
118         name[i++] = c;
119     } while (c);
120     if (i > 1)
121         prevk->sysno = 0;
122     c = key_file_decode (inf);
123     key[0] = c & 1;
124     c = c >> 1;
125     itkey.sysno = c + prevk->sysno;
126     if (c)
127     {
128         prevk->sysno = itkey.sysno;
129         prevk->seqno = 0;
130     }
131     c = key_file_decode (inf);
132     itkey.seqno = c + prevk->seqno;
133     prevk->seqno = itkey.seqno;
134
135     memcpy (key+1, &itkey, sizeof(itkey));
136     return 1;
137 }
138
139 int main (int argc, char **argv)
140 {
141     int ret;
142     char *arg;
143     char *key_fname = NULL;
144     char key_string[IT_MAX_WORD];
145     char key_info[256];
146     ZebraMaps zm;
147     FILE *inf;
148     Res res = NULL;
149     struct it_key prevk;
150
151     prevk.sysno = 0;
152     prevk.seqno = 0;
153
154     prog = *argv;
155     while ((ret = options ("c:v:", argv, argc, &arg)) != -2)
156     {
157         if (ret == 0)
158         {
159             key_fname = arg;
160         }
161         else if (ret == 'v')
162         {
163             log_init (log_mask_str(arg), prog, NULL);
164         }
165         else if (ret == 'c')
166         {
167             if (!(res = res_open (arg)))
168             {
169                 logf(LOG_FATAL, "Failed to open resource file %s", arg);
170                 exit (1);
171             }
172         }
173         else
174         {
175             logf (LOG_FATAL, "Unknown option '-%s'", arg);
176             exit (1);
177         }
178     }
179     if (!key_fname)
180     {
181         fprintf (stderr, "kdump [-c config] [-v log] file\n");
182         exit (1);
183     }
184     if (!res)
185         res = res_open ("zebra.cfg");
186     zm = zebra_maps_open (res);
187     if (!(inf = fopen (key_fname, "r")))
188     {
189         logf (LOG_FATAL|LOG_ERRNO, "fopen %s", key_fname);
190         exit (1);
191     }
192     printf ("t  rg op  sysno seqno txt\n");
193     while (read_one (inf, key_string, key_info, &prevk))
194     {
195         struct it_key k;
196         int op;
197         char keybuf[IT_MAX_WORD+1];
198         char *to = keybuf;
199         const char *from = key_string;
200         int usedb_type = from[0];
201         int reg_type = from[1];
202
203         op = key_info[0];
204         memcpy (&k, 1+key_info, sizeof(k));
205
206         from += 2;  
207         while (*from)
208         {
209             const char *res = zebra_maps_output (zm, reg_type, &from);
210             while (*res)
211                 *(to++) = *(res++);
212         }
213         *to = '\0';
214         printf ("%c %3d %c %7d %5d %s\n", reg_type, usedb_type, op ? 'i':'d',
215                 k.sysno, k.seqno, keybuf);
216     }
217     zebra_maps_close (zm);
218     if (fclose (inf))
219     {
220         logf (LOG_FATAL|LOG_ERRNO, "fclose %s", key_fname);
221         exit (1);
222     }
223     
224     exit (0);
225 }