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