From 1891a7ab41007b52166ac5027389f0191193f997 Mon Sep 17 00:00:00 2001 From: Adam Dickmeiss Date: Fri, 17 Nov 1995 15:54:41 +0000 Subject: [PATCH] Started work on virtual directory structure. --- index/Makefile | 4 +- index/dirs.c | 139 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ index/trav.c | 17 ++++++- 3 files changed, 157 insertions(+), 3 deletions(-) create mode 100644 index/dirs.c diff --git a/index/Makefile b/index/Makefile index 06a2c19..9abdee1 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.18 1995-11-16 17:00:55 adam Exp $ +# $Id: Makefile,v 1.19 1995-11-17 15:54:41 adam Exp $ SHELL=/bin/sh RANLIB=ranlib @@ -14,7 +14,7 @@ TPROG1=index TPROG2=kdump TPROG3=zserver DEFS=$(INCLUDE) -O1 = main.o dir.o trav.o extract.o kinput.o kcompare.o \ +O1 = main.o dir.o dirs.o trav.o extract.o kinput.o kcompare.o \ symtab.o text.o recctrl.o structrec.o recindex.o O2 = kdump.o O3 = zserver.o kcompare.o zrpn.o zsets.o text.o recctrl.o structrec.o \ diff --git a/index/dirs.c b/index/dirs.c new file mode 100644 index 0000000..d4460ba --- /dev/null +++ b/index/dirs.c @@ -0,0 +1,139 @@ +/* + * Copyright (C) 1994-1995, Index Data I/S + * All rights reserved. + * Sebastian Hammer, Adam Dickmeiss + * + * $Log: dirs.c,v $ + * Revision 1.1 1995-11-17 15:54:42 adam + * Started work on virtual directory structure. + * + * Revision 1.9 1995/10/30 13:42:12 adam + * Added errno.h + * + * Revision 1.8 1995/10/10 13:59:23 adam + * Function rset_open changed its wflag parameter to general flags. + * + * Revision 1.7 1995/09/28 09:19:40 adam + * xfree/xmalloc used everywhere. + * Extract/retrieve method seems to work for text records. + * + * Revision 1.6 1995/09/08 14:52:26 adam + * Minor changes. Dictionary is lower case now. + * + * Revision 1.5 1995/09/06 16:11:16 adam + * Option: only one word key per file. + * + * Revision 1.4 1995/09/04 12:33:41 adam + * Various cleanup. YAZ util used instead. + * + * Revision 1.3 1995/09/01 14:06:35 adam + * Split of work into more files. + * + * Revision 1.2 1995/09/01 10:57:07 adam + * Minor changes. + * + * Revision 1.1 1995/09/01 10:34:51 adam + * Added dir.c + * + */ +#include +#include +#include +#include +#include + +#include +#include "index.h" + +struct dirs_entry { + char path[160]; + int sysno; +}; + +struct dirs_info { + int no; + struct dirs_entry *entries; +}; + +struct dirs_client_info { + struct dirs_info *di; + int no_max; + char *prefix; + int prelen; +}; + +static int dirs_client_proc (Dict_char *name, const char *info, int pos, + void *client) +{ + struct dirs_client_info *ci = client; + + if (memcmp (name, ci->prefix, ci->prelen)) + return 1; + if (ci->di->no == ci->no_max) + { + if (ci->no_max > 0) + { + struct dirs_entry *arn; + + ci->no_max += 1000; + arn = malloc (sizeof(*arn) * (ci->no_max)); + if (!arn) + { + logf (LOG_FATAL|LOG_ERRNO, "malloc"); + exit (1); + } + memcpy (arn, ci->di->entries, ci->di->no * sizeof(*arn)); + free (ci->di->entries); + ci->di->entries = arn; + } + } + strcpy ((ci->di->entries + ci->di->no)->path, name); + memcpy (&(ci->di->entries + ci->di->no)->sysno, info+1, *info); + assert (*info == sizeof(ci->di->entries->sysno)); + ++(ci->di->no); + return 0; +} + +struct dirs_info *dirs_open (Dict dict, const char *rep) +{ + static char wname[200]; + static char pname[200]; + int dirid; + char *dinfo; + struct dirs_client_info dirs_client_info; + struct dirs_info *p; + int before, after; + + sprintf (wname, "d%s", rep); + dinfo = dict_lookup (dict, wname); + if (!dinfo) + return NULL; + if (!(p = malloc (sizeof (*p)))) + { + logf (LOG_FATAL|LOG_ERRNO, "malloc"); + exit (1); + } + memcpy (&dirid, dinfo+1, sizeof(dirid)); + sprintf (wname, "%d.", dirid); + strcpy (pname, wname); + + p->no = 0; + dirs_client_info.di = p; + dirs_client_info.no_max = 0; + dirs_client_info.prefix = wname; + dirs_client_info.prelen = strlen(wname); + strcpy (pname, wname); + dict_scan (dict, pname, &before, &after, &dirs_client_info, + dirs_client_proc); + + return p; +} + +void dirs_free (struct dirs_info **pp) +{ + struct dirs_info *p = *pp; + + free (p->entries); + free (p); + *pp = NULL; +} diff --git a/index/trav.c b/index/trav.c index 2d888c9..f2f4f35 100644 --- a/index/trav.c +++ b/index/trav.c @@ -4,7 +4,10 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: trav.c,v $ - * Revision 1.5 1995-10-17 18:02:09 adam + * Revision 1.6 1995-11-17 15:54:42 adam + * Started work on virtual directory structure. + * + * Revision 1.5 1995/10/17 18:02:09 adam * New feature: databases. Implemented as prefix to words in dictionary. * * Revision 1.4 1995/09/28 09:19:46 adam @@ -300,3 +303,15 @@ void repository (int cmd, const char *rep, const char *base_path, repository_extract_r (cmd, rep_tmp1, databaseName); } +void repositoryUpdate (const char *src, char *databaseName) +{ + struct dir_entry *e_src; + int i_src = 0; + struct stat fs_src; + size_t src_len = strlen (src); + + e_src = dir_open (src); + + if (!e_src) + return; +} -- 1.7.10.4