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