X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=index%2Fkdump.c;h=40ab26fc5edb7cf0f4b0fc3b6663748bf2df837e;hb=00796628a5c7dec56efe81be9cf781bb98afc47d;hp=8dfe3873f394fa0ed455cd82aef0ad7aac426771;hpb=a02c4cf957603c707fe9f4fde94a468f1d030dfb;p=idzebra-moved-to-github.git diff --git a/index/kdump.c b/index/kdump.c index 8dfe387..40ab26f 100644 --- a/index/kdump.c +++ b/index/kdump.c @@ -1,37 +1,127 @@ /* - * Copyright (C) 1995, Index Data I/S + * Copyright (C) 1994-1996, Index Data I/S * All rights reserved. * Sebastian Hammer, Adam Dickmeiss * * $Log: kdump.c,v $ - * Revision 1.1 1995-09-04 09:10:36 adam + * Revision 1.14 1997-10-27 14:33:04 adam + * Moved towards generic character mapping depending on "structure" + * field in abstract syntax file. Fixed a few memory leaks. Fixed + * bug with negative integers when doing searches with relational + * operators. + * + * Revision 1.13 1997/09/09 13:38:07 adam + * Partial port to WIN95/NT. + * + * Revision 1.12 1997/09/05 09:52:32 adam + * Extra argument added to function chr_read_maptab (tab path). + * + * Revision 1.11 1996/10/29 14:06:49 adam + * Include zebrautl.h instead of alexutil.h. + * + * Revision 1.10 1996/06/04 14:56:12 quinn + * Fix + * + * Revision 1.9 1996/06/04 14:18:53 quinn + * Charmap work + * + * Revision 1.8 1996/06/04 10:18:59 adam + * Minor changes - removed include of ctype.h. + * + * Revision 1.7 1995/10/10 12:24:38 adam + * Temporary sort files are compressed. + * + * Revision 1.6 1995/09/29 14:01:42 adam + * Bug fixes. + * + * Revision 1.5 1995/09/11 13:09:35 adam + * More work on relevance feedback. + * + * Revision 1.4 1995/09/08 14:52:27 adam + * Minor changes. Dictionary is lower case now. + * + * Revision 1.3 1995/09/06 16:11:17 adam + * Option: only one word key per file. + * + * Revision 1.2 1995/09/04 12:33:42 adam + * Various cleanup. YAZ util used instead. + * + * Revision 1.1 1995/09/04 09:10:36 adam * More work on index add/del/update. * Merge sort implemented. * Initial work on z39 server. * */ #include +#include #include +#ifdef WINDOWS +#include +#else #include +#endif +#include -#include +#include #include "index.h" char *prog; -static int read_one (FILE *inf, char *name, char *key) + +int key_file_decode (FILE *f) +{ + int c, d; + + c = getc (f); + switch (c & 192) + { + case 0: + d = c; + break; + case 64: + d = ((c&63) << 8) + (getc (f) & 0xff); + break; + case 128: + d = ((c&63) << 8) + (getc (f) & 0xff); + d = (d << 8) + (getc (f) & 0xff); + break; + case 192: + d = ((c&63) << 8) + (getc (f) & 0xff); + d = (d << 8) + (getc (f) & 0xff); + d = (d << 8) + (getc (f) & 0xff); + break; + } + return d; +} + + +static int read_one (FILE *inf, char *name, char *key, struct it_key *prevk) { int c; int i = 0; - name[0] = 0; + struct it_key itkey; do { if ((c=getc(inf)) == EOF) return 0; name[i++] = c; } while (c); - for (i = 0; i 1) + prevk->sysno = 0; + c = key_file_decode (inf); + key[0] = c & 1; + c = c >> 1; + itkey.sysno = c + prevk->sysno; + if (c) + { + prevk->sysno = itkey.sysno; + prevk->seqno = 0; + } + c = key_file_decode (inf); + itkey.seqno = c + prevk->seqno; + prevk->seqno = itkey.seqno; + + memcpy (key+1, &itkey, sizeof(itkey)); return 1; } @@ -40,12 +130,17 @@ int main (int argc, char **argv) int ret; char *arg; char *key_fname = NULL; - char key_string[1000]; + char key_string[IT_MAX_WORD]; char key_info[256]; FILE *inf; + struct it_key prevk; + chrmaptab map = 0; + + prevk.sysno = 0; + prevk.seqno = 0; prog = *argv; - while ((ret = options ("v:", argv, argc, &arg)) != -2) + while ((ret = options ("m:v:", argv, argc, &arg)) != -2) { if (ret == 0) { @@ -55,32 +150,58 @@ int main (int argc, char **argv) { log_init (log_mask_str(arg), prog, NULL); } + else if (ret == 'm') + { + if (!(map = chrmaptab_create (NULL, arg, 0))) + { + logf(LOG_FATAL, "Failed to open maptab"); + exit(1); + } + } else { - log (LOG_FATAL, "Unknown option '-%s'", arg); + logf (LOG_FATAL, "Unknown option '-%s'", arg); exit (1); } } if (!key_fname) { - fprintf (stderr, "kdump [-v log] file\n"); + fprintf (stderr, "kdump [-m maptab -v log] file\n"); exit (1); } if (!(inf = fopen (key_fname, "r"))) { - log (LOG_FATAL|LOG_ERRNO, "fopen %s", key_fname); + logf (LOG_FATAL|LOG_ERRNO, "fopen %s", key_fname); exit (1); } - while (read_one (inf, key_string, key_info)) + while (read_one (inf, key_string, key_info, &prevk)) { struct it_key k; + int op; + char keybuf[IT_MAX_WORD+1]; + + op = key_info[0]; + memcpy (&k, 1+key_info, sizeof(k)); + if (map) + { + char *to = keybuf, *from = key_string; - memcpy (&k, key_info+1, sizeof(k)); - printf ("%s sysno=%d op=%d\n", key_string, k.sysno, *key_info); + while (*from) + { + char *res = chr_map_output(map, from, 1); + while (*res) + *(to++) = *(res++); + } + *to = '\0'; + } + else + strcpy(keybuf, key_string); + printf ("%7d op=%d s=%-5d %s\n", k.sysno, op, k.seqno, + keybuf); } if (fclose (inf)) { - log (LOG_FATAL|LOG_ERRNO, "fclose %s", key_fname); + logf (LOG_FATAL|LOG_ERRNO, "fclose %s", key_fname); exit (1); }