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