current version
[opsoft_test.git] / silentbob / gclib / src / ehash.cxx
blob1ddaeef410cfc6a71442e0b5c2a9910b88e35d80
1 /*
2 * (c) Oleg Puchinin 2006
3 * graycardinalster@gmail.com
5 */
7 /* 2006-06-07 */
9 #include <stdio.h>
10 #include <stdlib.h>
11 #include <unistd.h>
12 #include <gclib/gclib.h>
13 #include <gclib/gclib_c.h>
15 EHash::EHash ()
20 EHash::~EHash ()
25 char * EHash::set (char *KEY, char *VALUE)
27 __dlist_entry_t *entry;
28 dkey_t * one;
30 entry = get_head ();
31 while (entry) {
32 one = (dkey_t *) entry->data;
33 if (EQ (KEY, one->KEY)) {
34 one->VALUE = VALUE;
35 break;
37 entry = entry->next;
40 if (! entry) {
41 one = CNEW (dkey_t, 1);
42 one->KEY = strdup (KEY);
43 one->VALUE = VALUE;
44 add_tail (LPCHAR (one));
47 return KEY;
50 char * EHash::get (char *KEY)
52 char * ret = NULL;
53 __dlist_entry_t * one;
54 one = get_head ();
56 if (! one)
57 return NULL;
59 while (true) {
60 if (EQ (KEY, ((dkey_t *) one->data)->KEY)) {
61 ret = ((dkey_t *) one->data)->VALUE;
62 break;
64 if (! one->next)
65 break;
66 one = one->next;
68 return ret;
71 char * EHash::del (char *KEY)
73 char * ret = NULL;
74 __dlist_entry_t * one;
76 one = get_head ();
77 while (one) {
78 if (EQ (KEY, ((dkey_t *) one->data)->KEY)) {
79 ret = ((dkey_t *) one->data)->VALUE;
80 DList::del (one);
81 break;
83 one = one->next;
86 return ret;
89 int EHash::from_file (char *f_name)
91 FILE * f;
92 char * m_buf;
93 char * d_set;
95 m_buf = CNEW (char, 4096);
96 f = fopen (f_name, "r");
97 if (! f)
98 return -1;
100 while (true) {
101 if (fgets (m_buf, 256, f) == NULL)
102 break;
104 if (m_buf[0] == '#')
105 continue;
107 chomp (m_buf);
108 d_set = strchr (m_buf, '=');
109 if (! d_set)
110 continue;
112 *d_set = '\0';
113 ++d_set;
114 strip (d_set);
115 strip2 (m_buf);
116 printf ("%s = %s\n", m_buf, d_set);
117 set (m_buf, strdup (d_set));
120 fclose (f);
121 DROP (m_buf);
122 return 0;
125 void EHash::foreach (Dhash_f f)
127 __dlist_entry_t * one;
128 dkey_t * key;
130 one = get_head ();
131 while (one) {
132 key = (dkey_t *) one->data;
133 f (key->KEY, key->VALUE);
134 one = one->next;
138 char * EHash::operator [] (char *S)
140 return get (S);