DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download
Index: ┃ T l

⟦b780307fb⟧ TextFile

    Length: 2762 (0xaca)
    Types: TextFile
    Names: »lookup.c«

Derivation

└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki
    └─ ⟦this⟧ »EUUGD11/euug-87hel/sec1/ispell/lookup.c« 

TextFile

/* -*- Mode:Text -*- */

/*
 * lookup.c - see if a word appears in the dictionary
 *
 * Pace Willisson, 1983
 */

#include <stdio.h>
#include "ispell.h"
#include "config.h"


struct dent *hashtbl;
int hashsize;

extern char hashname[];

static inited = 0;

linit ()
{
	int hashfd;
	struct hashheader hashheader;
	register int i;
	register struct dent *dp;

	if (inited)
		return;

	if ((hashfd = open (hashname, 0)) < 0) {
		fprintf (stderr, "can't open %s\r\n", hashname);
		return (-1);
	}

	hashsize = read (hashfd, &hashheader, sizeof hashheader);
	if (hashsize == 0) {
		/*
		 * Empty file - create an empty dummy table.  We
		 * actually have to have one entry since the hash
		 * algorithm involves a divide by the table size
		 * (actually modulo, but zero is still unacceptable).
		 * So we create an entry with a word of all lowercase,
		 * which can't match because the comparison string has
		 * been converted to uppercase by then.
		 */
		close (hashfd);
		hashsize = 1;		/* This prevents divides by zero */
		hashtbl = (struct dent *) calloc (1, sizeof (struct dent));
		if (hashtbl == NULL) {
			(void) fprintf (stderr,
			    "Couldn't allocate space for hash table\n");
			return (-1);
		}
		hashtbl[0].word = "xxxxxxxxxxx";
		hashtbl[0].next = NULL;
		hashtbl[0].keep = 0;
		hashtbl[0].used = 1;
		/* The flag bits don't matter, but calloc cleared them. */
		inited = 1;
		return 0;
	}
	else if (hashsize < 0  ||  hashheader.magic != MAGIC) {
		fprintf (stderr, "Illegal format hash table\r\n");
		return (-1);
	}
	hashstrings = (char *) malloc (hashheader.stringsize);
	hashtbl = (struct dent *) malloc (hashheader.tblsize * sizeof (struct dent));
	if (hashtbl == NULL  ||  hashstrings == NULL) {
		(void) fprintf (stderr,
		    "Couldn't allocate space for hash table\n");
		return (-1);
	}
	hashsize = hashheader.tblsize;

	read (hashfd, hashstrings, hashheader.stringsize);
	read (hashfd, hashtbl, hashheader.tblsize * sizeof (struct dent));
	close (hashfd);

	for (i = hashsize, dp = hashtbl;  --i >= 0;  dp++) {
		dp->word = &hashstrings [ (int)(dp->word) ];
		if (dp->next == (struct dent *) -1)
			dp->next = NULL;
		else
			dp->next = &hashtbl [ (int)(dp->next) ];
	}

	inited = 1;
	return (0);
}

/* n is length of s */
struct dent *
lookup (s, n, dotree)
register char *s;
{
	int i;
	register struct dent *dp;
	register char *s1, *s2;

	dp = &hashtbl [ hash (s, n, hashsize) ];
	for (  ; dp != NULL; dp = dp->next) {
		/* quick strcmp, but only for equality */
		s1 = dp->word;
		s2 = s;
		while (*s1 == *s2++)
			if (*s1++=='\0') {
				lastdent = dp;
				return (lastdent);
			}
	}
	if (dotree) {
		i = s[n];
		s[n] = '\0';
		if ((dp = treelookup (s)) != NULL)
			lastdent = dp;
		s[n] = i;
		return dp;
	}
	else
		return NULL;
}