Fixes
[opsoft.git] / silentbob / gclib / src / dhash.cxx
blob5bedd7d61b38b6de4dd45c8249d1b396c179e9ad
1 /*
2 * (c) Oleg Puchinin 2005,2006
3 * graycardinalster@gmail.com
5 * June 2006 - [DEPRECATED] Use EHash instead.
6 */
8 #include <gclib/gclib.h>
9 #include <gclib/gclib_c.h>
11 DHash::DHash (int asize)
13 if (asize)
14 size = asize;
15 else
16 size = 256;
18 keys = CNEW(char *, size);
19 values = CNEW(char *, size);
20 types = CNEW(int, size);
21 memset (keys, 0, sizeof (char *) * size);
22 memset (values, 0, sizeof (char *) * size);
23 memset (types, 0, (sizeof (int)) * size);
26 DHash::~DHash ()
28 int i;
30 for (i = 0; i < size; i++) {
31 if (keys[i] != NULL)
32 free (keys[i]);
34 DROP (keys);
35 DROP (values);
36 DROP (types);
39 bool DHash::set (char * KEY, char * VALUE, int TYPE)
41 int i;
43 for (i = 0; i < size; i++) {
44 if (keys[i] && EQ (keys[i], KEY)) {
45 values[i] = VALUE;
46 types[i] = TYPE;
47 return true;
51 for (i = 0; i < size; i++) {
52 if (keys[i] == NULL) {
53 keys[i] = strdup (KEY);
54 values[i] = VALUE;
55 types[i] = TYPE;
56 return true;
60 return false;
63 bool DHash::set (char * KEY, long VALUE, int TYPE)
65 return set (KEY, LPCHAR (VALUE), DHASH_INT);
68 char * DHash::get (char * KEY)
70 int i;
72 for (i = 0; i < size; i++) {
73 if (keys[i] && EQ (keys[i], KEY)) {
74 return values[i];
78 return NULL;
81 char * DHash::del (char * KEY)
83 int i;
85 for (i = 0; i < size; i++) {
86 if (keys[i] && EQ (keys[i], KEY)) {
87 keys[i] = NULL;
88 return values[i];
92 return NULL;
95 void DHash::foreach (Dhash_f func)
97 int i;
99 for (i = 0; i < size; i++)
100 func (keys[i], values[i]);
103 int DHash::from_file (char *f_name)
105 FILE * f;
106 char * m_buf;
107 char * d_key;
108 char * d_set;
110 m_buf = CNEW (char, 4096);
111 f = fopen (f_name, "r");
112 if (! f)
113 return -1;
115 while (true) {
116 if (fgets (m_buf, 256, f) == NULL)
117 break;
119 if (m_buf[0] == '#')
120 continue;
122 chomp (m_buf);
123 d_key = strchr (m_buf, '=');
124 if (! d_key)
125 continue;
127 d_set = d_key;
128 *d_set = '\0';
129 while ((*(--d_key) == ' ' || *d_key == '\t')
130 && d_key != m_buf)
131 *d_key = '\0';
133 while (*(++d_set) && (*d_set == ' ' || *d_set == '\t'));
135 set (m_buf, strdup (d_set));
138 fclose (f);
139 DROP (m_buf);
140 return 0;