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