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