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