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