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