From ce20a8a823a2df86ace4862008684c71a4f06cd2 Mon Sep 17 00:00:00 2001 From: Adam Dickmeiss Date: Thu, 14 Sep 1995 07:48:13 +0000 Subject: [PATCH] Record control management. --- include/recctrl.h | 43 +++++++++++++++ index/Makefile | 6 +-- index/extract.c | 153 +++++++++++++++++++++++------------------------------ index/index.h | 15 +++--- index/kcompare.c | 25 +++++---- index/main.c | 6 ++- 6 files changed, 137 insertions(+), 111 deletions(-) create mode 100644 include/recctrl.h diff --git a/include/recctrl.h b/include/recctrl.h new file mode 100644 index 0000000..ed6ace9 --- /dev/null +++ b/include/recctrl.h @@ -0,0 +1,43 @@ +/* + * Copyright (C) 1994-1995, Index Data I/S + * All rights reserved. + * Sebastian Hammer, Adam Dickmeiss + * + * $Log: recctrl.h,v $ + * Revision 1.1 1995-09-14 07:48:13 adam + * Record control management. + * + */ + +#ifndef RECCTRL_H +#define RECCTRL_H + +typedef struct { + int attrSet; + int attrUse; + enum { + Word_String, + Word_Numeric + } which; + union { + char *string; + int numeric; + } u; + int seqno; +} RecWord; + +struct recExtractCtrl { + FILE *inf; + char *subType; + void (*init)(RecWord *p); + void (*add)(const RecWord *p); +}; + +typedef struct recType +{ + char *name; + void (*init)(void); + int (*extract)(struct recExtractCtrl *ctrl); +} *RecType; + +#endif diff --git a/index/Makefile b/index/Makefile index b9c1bf8..97f5505 100644 --- a/index/Makefile +++ b/index/Makefile @@ -1,7 +1,7 @@ # Copyright (C) 1995, Index Data I/S # All rights reserved. # Sebastian Hammer, Adam Dickmeiss -# $Id: Makefile,v 1.8 1995-09-11 13:09:31 adam Exp $ +# $Id: Makefile,v 1.9 1995-09-14 07:48:20 adam Exp $ SHELL=/bin/sh RANLIB=ranlib @@ -12,9 +12,9 @@ TPROG1=index TPROG2=kdump TPROG3=zserver DEFS=$(INCLUDE) -O1 = main.o dir.o trav.o extract.o kinput.o kcompare.o ksort.o symtab.o +O1 = main.o dir.o trav.o extract.o kinput.o kcompare.o ksort.o symtab.o text.o O2 = kdump.o -O3 = zserver.o kcompare.o zrpn.o zsets.o +O3 = zserver.o kcompare.o zrpn.o zsets.o text.o CPP=cc -E all: $(TPROG1) $(TPROG2) $(TPROG3) diff --git a/index/extract.c b/index/extract.c index ce4ed96..4808868 100644 --- a/index/extract.c +++ b/index/extract.c @@ -4,7 +4,10 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: extract.c,v $ - * Revision 1.7 1995-09-11 13:09:32 adam + * Revision 1.8 1995-09-14 07:48:22 adam + * Record control management. + * + * Revision 1.7 1995/09/11 13:09:32 adam * More work on relevance feedback. * * Revision 1.6 1995/09/08 14:52:27 adam @@ -35,16 +38,17 @@ #include #include +#include #include "index.h" -#define KEY_BUF_SIZE 100000 - static Dict file_idx; static SYSNO sysno_next; static int key_fd = -1; static int sys_idx_fd = -1; static char *key_buf; -static int key_offset; +static int key_offset, key_buf_size; +static int key_cmd; +static int key_sysno; void key_open (const char *fname) { @@ -57,11 +61,8 @@ void key_open (const char *fname) exit (1); } logf (LOG_DEBUG, "key_open of %s", fname); - if (!(key_buf = malloc (KEY_BUF_SIZE))) - { - logf (LOG_FATAL|LOG_ERRNO, "malloc"); - exit (1); - } + key_buf_size = 49100; + key_buf = xmalloc (key_buf_size); key_offset = 0; if (!(file_idx = dict_open (FNAME_FILE_DICT, 40, 1))) { @@ -92,11 +93,11 @@ int key_close (void) dict_insert (file_idx, ".", sizeof(sysno_next), &sysno_next); dict_close (file_idx); key_fd = -1; - logf (LOG_DEBUG, "key close - key file exist"); + xfree (key_buf); return 1; } -void key_flush (void) +void wordFlush (int sysno) { size_t i = 0; int w; @@ -116,88 +117,49 @@ void key_flush (void) key_offset = 0; } -void key_write (int cmd, struct it_key *k, const char *str) +static void wordInit (RecWord *p) { - char x; - size_t slen = strlen(str); - - if (key_offset + sizeof(*k) + slen >= KEY_BUF_SIZE - 2) - key_flush (); - x = (cmd == 'a') ? 1 : 0; - memcpy (key_buf + key_offset, str, slen+1); - key_offset += slen+1; - memcpy (key_buf + key_offset, &x, 1); - key_offset++; - memcpy (key_buf + key_offset, k, sizeof(*k)); - key_offset += sizeof(*k); + p->attrSet = 1; + p->attrUse = 1; + p->which = Word_String; } -#if !IT_KEY_HAVE_SEQNO -void key_write_x (struct strtab *t, int cmd, struct it_key *k, const char *str) +static void wordAdd (const RecWord *p) { - void **oldinfo; + struct it_key key; + char x; + size_t i; - if (strtab_src (t, str, &oldinfo)) - ((struct it_key *) *oldinfo)->freq++; - else + if (key_offset + 1000 > key_buf_size) { - *oldinfo = xmalloc (sizeof(*k)); - memcpy (*oldinfo, k, sizeof(*k)); - ((struct it_key *) *oldinfo)->freq = 1; - } -} -#endif - -void key_rec_flush (const char *str, void *info, void *data) -{ - key_write (*((int*) data), (struct it_key *)info, str); - xfree (info); -} + char *new_key_buf; -void text_extract (struct strtab *t, SYSNO sysno, int cmd, const char *fname) -{ - FILE *inf; - struct it_key k; -#if IT_KEY_HAVE_SEQNO - int seqno = 1; -#endif - int c; - char w[IT_MAX_WORD]; - - logf (LOG_DEBUG, "Text extract of %d", sysno); - k.sysno = sysno; - inf = fopen (fname, "r"); - if (!inf) - { - logf (LOG_WARN|LOG_ERRNO, "open %s", fname); - return; + key_buf_size *= 2; + new_key_buf = xmalloc (2*key_buf_size); + memcpy (new_key_buf, key_buf, key_offset); + xfree (key_buf); + key_buf = new_key_buf; } - while ((c=getc (inf)) != EOF) + switch (p->which) { - int i = 0; - while (i < IT_MAX_WORD-1 && c != EOF && isalnum(c)) - { - w[i++] = index_char_cvt (c); - c = getc (inf); - } - if (i) - { - w[i] = 0; - -#if IT_KEY_HAVE_FIELD - k.field = 0; -#endif -#if IT_KEY_HAVE_SEQNO - k.seqno = seqno++; - key_write (cmd, &k, w); -#else - key_write_x (t, cmd, &k, w); -#endif - } - if (c == EOF) - break; + case Word_String: + for (i = 0; p->u.string[i]; i++) + key_buf[key_offset++] = index_char_cvt (p->u.string[i]); + key_buf[key_offset++] = '\0'; + break; + default: + return ; } - fclose (inf); + x = (key_cmd == 'a') ? 1 : 0; + memcpy (key_buf + key_offset, &x, 1); + key_offset++; + + key.sysno = key_sysno; + key.attrSet = p->attrSet; + key.attrUse = p->attrUse; + key.seqno = p->seqno; + memcpy (key_buf + key_offset, &key, sizeof(key)); + key_offset += sizeof(key); } void file_extract (int cmd, const char *fname, const char *kname) @@ -208,7 +170,9 @@ void file_extract (int cmd, const char *fname, const char *kname) char ext_res[128]; const char *file_type; void *file_info; - struct strtab *t; + FILE *inf; + struct recExtractCtrl extractCtrl; + RecType rt; logf (LOG_DEBUG, "%c %s k=%s", cmd, fname, kname); for (i = strlen(fname); --i >= 0; ) @@ -236,10 +200,25 @@ void file_extract (int cmd, const char *fname, const char *kname) } else memcpy (&sysno, (char*) file_info+1, sizeof(sysno)); - t = strtab_mk (); + + if (!(inf = fopen (fname, "r"))) + { + logf (LOG_WARN|LOG_ERRNO, "open %s", fname); + return; + } if (!strcmp (file_type, "text")) - text_extract (t, sysno, cmd, fname); - strtab_del (t, key_rec_flush, &cmd); + rt = recTypeText; + else + return; + extractCtrl.inf = inf; + extractCtrl.subType = ""; + extractCtrl.init = wordInit; + extractCtrl.add = wordAdd; + key_sysno = sysno; + key_cmd = cmd; + (*rt->extract)(&extractCtrl); + fclose (inf); + wordFlush (sysno); } diff --git a/index/index.h b/index/index.h index ac519d2..f3acfd5 100644 --- a/index/index.h +++ b/index/index.h @@ -4,7 +4,10 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: index.h,v $ - * Revision 1.9 1995-09-11 13:09:33 adam + * Revision 1.10 1995-09-14 07:48:23 adam + * Record control management. + * + * Revision 1.9 1995/09/11 13:09:33 adam * More work on relevance feedback. * * Revision 1.8 1995/09/08 14:52:27 adam @@ -45,14 +48,9 @@ struct it_key { int sysno; -#if IT_KEY_HAVE_SEQNO int seqno; -#else - int freq; -#endif -#if IT_KEY_HAVE_FIELD - int field; -#endif + unsigned attrSet : 3; + unsigned attrUse : 13; }; struct dir_entry { @@ -68,7 +66,6 @@ void file_extract (int cmd, const char *fname, const char *kname); void key_open (const char *fname); int key_close (void); -void key_flush (void); void key_write (int cmd, struct it_key *k, const char *str); int key_compare (const void *p1, const void *p2); void key_logdump (int mask, const void *p); diff --git a/index/kcompare.c b/index/kcompare.c index bb37339..fc633e1 100644 --- a/index/kcompare.c +++ b/index/kcompare.c @@ -4,7 +4,10 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: kcompare.c,v $ - * Revision 1.5 1995-09-11 13:09:34 adam + * Revision 1.6 1995-09-14 07:48:23 adam + * Record control management. + * + * Revision 1.5 1995/09/11 13:09:34 adam * More work on relevance feedback. * * Revision 1.4 1995/09/08 14:52:27 adam @@ -39,11 +42,8 @@ void key_logdump (int logmask, const void *p) struct it_key key; memcpy (&key, p, sizeof(key)); -#if IT_KEY_HAVE_SEQNO - logf (logmask, "%7d s=%-3d", key.sysno, key.seqno); -#else - logf (logmask, "%7d f=%-3d", key.sysno, key.freq); -#endif + logf (logmask, "%7d s=%-4d f=%d,%d", key.sysno, key.seqno, + key.attrSet, key.attrUse); } int key_compare (const void *p1, const void *p2) @@ -75,15 +75,20 @@ int key_compare (const void *p1, const void *p2) return -1; } #endif -#if IT_KEY_HAVE_FIELD - if (i1.field != i2.field) + if (i1.attrSet != i2.attrSet) { - if (i1.field > i2.field) + if (i1.attrSet > i2.attrSet) + return 1; + else + return -1; + } + if (i1.attrUse != i2.attrUse) + { + if (i1.attrUse > i2.attrUse) return 1; else return -1; } -#endif return 0; } diff --git a/index/main.c b/index/main.c index f8e1362..a270a89 100644 --- a/index/main.c +++ b/index/main.c @@ -4,7 +4,10 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: main.c,v $ - * Revision 1.8 1995-09-06 16:11:18 adam + * Revision 1.9 1995-09-14 07:48:24 adam + * Record control management. + * + * Revision 1.8 1995/09/06 16:11:18 adam * Option: only one word key per file. * * Revision 1.7 1995/09/05 15:28:39 adam @@ -108,7 +111,6 @@ int main (int argc, char **argv) "base cmd1 dir1 cmd2 dir2 ...\n"); exit (1); } - key_flush (); if (!key_close ()) exit (0); logf (LOG_LOG, "Sorting"); -- 1.7.10.4