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