xref: /original-bsd/usr.sbin/amd/fsinfo/fsi_dict.c (revision 049d63db)
1 /*
2  * $Id: fsi_dict.c,v 5.2 90/10/21 22:34:21 jsp Exp $
3  *
4  * Copyright (c) 1989 Jan-Simon Pendry
5  * Copyright (c) 1989 Imperial College of Science, Technology & Medicine
6  * Copyright (c) 1989 The Regents of the University of California.
7  * All rights reserved.
8  *
9  * This code is derived from software contributed to Berkeley by
10  * Jan-Simon Pendry at Imperial College, London.
11  *
12  * %sccs.include.redist.c%
13  *
14  *	@(#)fsi_dict.c	5.2 (Berkeley) 03/17/91
15  */
16 
17 /*
18  * Dictionary support
19  */
20 
21 #include "../fsinfo/fsinfo.h"
22 
23 static int dict_hash(k)
24 char *k;
25 {
26 	unsigned int h;
27 
28 	for (h = 0; *k; h += *k++)
29 		;
30 	return h % DICTHASH;
31 }
32 
33 dict *new_dict()
34 {
35 	dict *dp = ALLOC(dict);
36 	return dp;
37 }
38 
39 static void dict_add_data(de, v)
40 dict_ent *de;
41 char *v;
42 {
43 	dict_data *dd = ALLOC(dict_data);
44 	dd->dd_data = v;
45 	ins_que(&dd->dd_q, de->de_q.q_back);
46 	de->de_count++;
47 }
48 
49 static dict_ent *new_dict_ent(k)
50 char *k;
51 {
52 	dict_ent *de = ALLOC(dict_ent);
53 	de->de_key = k;
54 	init_que(&de->de_q);
55 	return de;
56 }
57 
58 dict_ent *dict_locate(dp, k)
59 dict *dp;
60 char *k;
61 {
62 	dict_ent *de = dp->de[dict_hash(k)];
63 	while (de && !STREQ(de->de_key, k))
64 		de = de->de_next;
65 
66 	return de;
67 }
68 
69 void dict_add(dp, k, v)
70 dict *dp;
71 char *k, *v;
72 {
73 	dict_ent *de = dict_locate(dp, k);
74 	if (!de) {
75 		dict_ent **dep = &dp->de[dict_hash(k)];
76 		de = new_dict_ent(k);
77 		de->de_next = *dep;
78 		*dep = de;
79 	}
80 	dict_add_data(de, v);
81 }
82 
83 int dict_iter(dp, fn)
84 dict *dp;
85 int (*fn)();
86 {
87 	int i;
88 	int errors = 0;
89 
90 	for (i = 0; i < DICTHASH; i++) {
91 		dict_ent *de = dp->de[i];
92 		while (de) {
93 			errors += (*fn)(&de->de_q);
94 			de = de->de_next;
95 		}
96 	}
97 	return errors;
98 }
99