|
|
1.1 root 1: #include <stdio.h>
2: #include "tsort.h"
3:
4:
5: /*
6: * Htab is the hash table.
7: */
8:
9: static struct wordlist *htable[HASHSIZE];
10:
11:
12: /*
13: * The function insert returns a pointer to the hash table entry
14: * corresponding to the name "str".
15: * If the entry is new, then it initializes the ancestors field to
16: * NULL.
17: */
18:
19: struct word *
20: insert(str)
21: register char *str;
22: {
23: register struct wordlist *ptr;
24: unsigned hindex;
25: unsigned hash();
26: struct word *newword();
27: struct wordlist *newwordl();
28:
29: hindex = hash(str) % HASHSIZE;
30: for (ptr=htable[hindex]; ptr != NULL; ptr=ptr->next)
31: if (strcmp(ptr->element->name, str) == 0)
32: return (ptr->element);
33: ptr = newwordl(newword(str));
34: ptr->next = htable[hindex];
35: htable[hindex] = ptr;
36: return (ptr->element);
37: }
38:
39:
40: /*
41: * The function hash computes the hash index of the
42: * string pointed to by "str".
43: */
44:
45: static unsigned
46: hash(str)
47: register char *str;
48: {
49: register unsigned result = 0;
50: register int ch;
51:
52: while ((ch = *str++) != '\0')
53: result = 128 * result - result + 16 * (ch % 16) + (ch / 16);
54: return (result);
55: }
56:
57:
58: /*
59: * Cmphash returns a pointer to a wordlist which is a linked list
60: * of all words in the hash table.
61: */
62:
63: struct wordlist *
64: cmphash()
65: {
66: register struct wordlist *mrk;
67: register struct wordlist *head;
68: register struct wordlist **htabp;
69:
70: head = NULL;
71: for (htabp = htable; htabp - htable < HASHSIZE; ++htabp)
72: if (*htabp != NULL) {
73: for (mrk = *htabp; mrk->next != NULL; mrk = mrk->next)
74: ;
75: mrk->next = head;
76: head = *htabp;
77: }
78: return (head);
79: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.