2 gcc -W -Wall -D__KEYVALUE_DEBUG__ -DMALLOC_DEBUG y_keyvalue.c swf_debug.c
7 #include "swf_define.h"
8 #include "y_keyvalue.h"
10 //#define Y_KEYVALUE_INITSIZE 10
11 #define Y_KEYVALUE_INITSIZE 1
18 y_keyvalue_t *st = calloc(sizeof(*st), 1);
20 fprintf(stderr, "y_keyvalue_open: calloc failed\n");
24 st->alloc_len = Y_KEYVALUE_INITSIZE;
25 st->table = malloc(sizeof(*st->table) * Y_KEYVALUE_INITSIZE);
30 y_keyvalue_close(y_keyvalue_t *st) {
32 for (i = 0 ; i < st->use_len ; i++) {
33 if (st->table[i].use) {
34 free(st->table[i].key);
35 free(st->table[i].value);
47 y_keyvalue_set(y_keyvalue_t *st, char *key, int key_len, char *value, int value_len) {
50 if (st->use_len < st->alloc_len) {
53 for (i = 0 ; i < st->alloc_len ; i++) {
54 if (st->table[i].use == 0) {
60 tmp = realloc(st->table, 2 * st->alloc_len * sizeof(*(st->table)));
62 fprintf(stderr, "y_keyvalue_set: realloc failed\n");
66 st->alloc_len = 2 * st->alloc_len;
70 st->table[offset].key = malloc(key_len);
71 if (st->table[offset].key == NULL) {
74 st->table[offset].value = malloc(value_len);
75 if (st->table[offset].value == NULL) {
76 free(st->table[offset].key);
79 memcpy(st->table[offset].key, key, key_len);
80 memcpy(st->table[offset].value, value, value_len);
81 st->table[offset].key_len = key_len;
82 st->table[offset].value_len = value_len;
83 st->table[offset].use = 1;
84 if (offset == st->use_len) {
85 st->use_len = offset + 1;
91 y_keyvalue_get(y_keyvalue_t *st, char *key, int key_len, int *value_len) {
93 for (i = 0 ; i < st->use_len ; i++) {
94 if ((st->table[i].use) &&
95 (st->table[i].key_len == key_len) &&
96 (memcmp(st->table[i].key, key, key_len) == 0)) {
97 *value_len = st->table[i].value_len;
98 return st->table[i].value;
105 y_keyvalue_delete(y_keyvalue_t *st, char *key, int key_len) {
107 for (i = 0 ; i < st->use_len ; i++) {
108 if ((st->table[i].use) &&
109 (st->table[i].key_len == key_len) &&
110 (memcmp(st->table[i].key, key, key_len) == 0)) {
111 free(st->table[i].key);
112 free(st->table[i].value);
113 st->table[i].key = 0;
114 st->table[i].value = 0;
115 st->table[i].use = 0;
123 * itelator reguler/reverse
126 y_keyvalue_rewind(y_keyvalue_t *st) {
127 for (st->get_offset = 0 ; st->get_offset < st->use_len; st->get_offset++) {
128 if (st->table[st->get_offset].use) {
135 y_keyvalue_seeklast(y_keyvalue_t *st) {
136 for (st->get_offset = st->use_len - 1 ; st->get_offset >= 0 ; st->get_offset--) {
137 if (st->table[st->get_offset].use) {
144 y_keyvalue_next(y_keyvalue_t *st) {
145 for (st->get_offset++; st->get_offset < st->use_len; st->get_offset++) {
146 if (st->table[st->get_offset].use) {
154 y_keyvalue_prev(y_keyvalue_t *st) {
155 for (st->get_offset--; st->get_offset >= 0; st->get_offset--) {
156 if (st->table[st->get_offset].use) {
165 y_keyvalue_get_currentkey(y_keyvalue_t *st, int *key_len) {
166 if (st->get_offset < 0) {
169 if (st->get_offset >= st->use_len) {
172 *key_len = st->table[st->get_offset].key_len;
173 return st->table[st->get_offset].key;
177 y_keyvalue_get_currentvalue(y_keyvalue_t *st, int *value_len) {
178 if (st->get_offset >= st->use_len) {
181 *value_len = st->table[st->get_offset].value_len;
182 return st->table[st->get_offset].value;
186 y_keyvalue_get_maxkeylength(y_keyvalue_t *st) {
189 for (i = 0 ; i < st->use_len ; i++) {
190 if (st->table[i].use) {
191 if (maxlen < st->table[i].key_len) {
192 maxlen = st->table[i].key_len;
200 y_keyvalue_get_maxvaluelength(y_keyvalue_t *st) {
203 for (i = 0 ; i < st->use_len ; i++) {
204 if (st->table[i].use) {
205 if (maxlen < st->table[i].value_len) {
206 maxlen = st->table[i].value_len;
214 y_keyvalue_get_maxkeyvaluelength(y_keyvalue_t *st) {
217 key_maxlen = y_keyvalue_get_maxkeylength(st);
218 value_maxlen = y_keyvalue_get_maxvaluelength(st);
219 return (key_maxlen>value_maxlen)?key_maxlen:value_maxlen;
223 y_keyvalue_dump(y_keyvalue_t *st) {
225 for (i = 0 ; i < st->use_len ; i++) {
227 if (st->table[i].use) {
228 printf("key:%.*s", st->table[i].key_len, st->table[i].key);
229 printf("value:%.*s", st->table[i].value_len, st->table[i].value);
238 #ifdef __KEYVALUE_DEBUG__
242 int key_len, value_len;
243 malloc_debug_start();
244 y_keyvalue_t *st = y_keyvalue_open();
245 y_keyvalue_set(st, "foo", 4, "baa", 4);
246 y_keyvalue_set(st, "baz", 4, "buz", 4);
247 printf("reguler iterate test\n");
248 y_keyvalue_rewind(st);
249 while (key = y_keyvalue_get_currentkey(st, &key_len)) {
251 value = y_keyvalue_get_currentvalue(st, &value_len);
252 printf("key=%s(%d), value=%s(%d)\n", key, key_len, value, value_len);
253 if (y_keyvalue_next(st) == 0) {
257 printf("reverse iterate test\n");
258 y_keyvalue_seeklast(st);
259 while (key = y_keyvalue_get_currentkey(st, &key_len)) {
261 value = y_keyvalue_get_currentvalue(st, &value_len);
262 printf("key=%s(%d), value=%s(%d)\n", key, key_len, value, value_len);
263 if (y_keyvalue_prev(st) == 0) {
267 printf("delete test\n");
268 y_keyvalue_delete(st, "foo", 4);
269 y_keyvalue_rewind(st);
270 while (key = y_keyvalue_get_currentkey(st, &key_len)) {
271 value = y_keyvalue_get_currentvalue(st, &value_len);
272 printf("key=%s(%d), value=%s(%d)\n", key, key_len, value, value_len);
273 if (y_keyvalue_next(st) == 0) {
277 y_keyvalue_close(st);
282 #endif /* __KEYVALUE_DEBUG__ */