Home | History | Annotate | Line # | Download | only in fsinfo
fsi_dict.c revision 1.1.1.1.8.1
      1 /*	$NetBSD: fsi_dict.c,v 1.1.1.1.8.1 2009/05/13 18:49:06 jym Exp $	*/
      2 
      3 /*
      4  * Copyright (c) 1997-2009 Erez Zadok
      5  * Copyright (c) 1989 Jan-Simon Pendry
      6  * Copyright (c) 1989 Imperial College of Science, Technology & Medicine
      7  * Copyright (c) 1989 The Regents of the University of California.
      8  * All rights reserved.
      9  *
     10  * This code is derived from software contributed to Berkeley by
     11  * Jan-Simon Pendry at Imperial College, London.
     12  *
     13  * Redistribution and use in source and binary forms, with or without
     14  * modification, are permitted provided that the following conditions
     15  * are met:
     16  * 1. Redistributions of source code must retain the above copyright
     17  *    notice, this list of conditions and the following disclaimer.
     18  * 2. Redistributions in binary form must reproduce the above copyright
     19  *    notice, this list of conditions and the following disclaimer in the
     20  *    documentation and/or other materials provided with the distribution.
     21  * 3. All advertising materials mentioning features or use of this software
     22  *    must display the following acknowledgment:
     23  *      This product includes software developed by the University of
     24  *      California, Berkeley and its contributors.
     25  * 4. Neither the name of the University nor the names of its contributors
     26  *    may be used to endorse or promote products derived from this software
     27  *    without specific prior written permission.
     28  *
     29  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     30  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     31  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     32  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     33  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     34  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     35  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     36  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     37  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     38  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     39  * SUCH DAMAGE.
     40  *
     41  *
     42  * File: am-utils/fsinfo/fsi_dict.c
     43  *
     44  */
     45 
     46 /*
     47  * Dictionary support
     48  */
     49 
     50 #ifdef HAVE_CONFIG_H
     51 # include <config.h>
     52 #endif /* HAVE_CONFIG_H */
     53 #include <am_defs.h>
     54 #include <fsi_data.h>
     55 #include <fsinfo.h>
     56 
     57 
     58 static int
     59 dict_hash(char *k)
     60 {
     61   u_int h;
     62 
     63   for (h = 0; *k; h += *k++) ;
     64   return h % DICTHASH;
     65 }
     66 
     67 
     68 dict *
     69 new_dict(void)
     70 {
     71   dict *dp = CALLOC(struct dict);
     72 
     73   return dp;
     74 }
     75 
     76 
     77 static void
     78 dict_add_data(dict_ent *de, char *v)
     79 {
     80   dict_data *dd = CALLOC(struct dict_data);
     81 
     82   dd->dd_data = v;
     83   ins_que(&dd->dd_q, de->de_q.q_back);
     84   de->de_count++;
     85 }
     86 
     87 
     88 static dict_ent *
     89 new_dict_ent(char *k)
     90 {
     91   dict_ent *de = CALLOC(struct dict_ent);
     92 
     93   de->de_key = k;
     94   init_que(&de->de_q);
     95   return de;
     96 }
     97 
     98 
     99 dict_ent *
    100 dict_locate(dict *dp, char *k)
    101 {
    102   dict_ent *de = dp->de[dict_hash(k)];
    103 
    104   while (de && !STREQ(de->de_key, k))
    105     de = de->de_next;
    106   return de;
    107 }
    108 
    109 
    110 void
    111 dict_add(dict *dp, char *k, char *v)
    112 {
    113   dict_ent *de = dict_locate(dp, k);
    114 
    115   if (!de) {
    116     dict_ent **dep = &dp->de[dict_hash(k)];
    117     de = new_dict_ent(k);
    118     de->de_next = *dep;
    119     *dep = de;
    120   }
    121   dict_add_data(de, v);
    122 }
    123 
    124 
    125 int
    126 dict_iter(dict *dp, int (*fn) (qelem *))
    127 {
    128   int i;
    129   int errors = 0;
    130 
    131   for (i = 0; i < DICTHASH; i++) {
    132     dict_ent *de = dp->de[i];
    133     while (de) {
    134       errors += (*fn) (&de->de_q);
    135       de = de->de_next;
    136     }
    137   }
    138   return errors;
    139 }
    140