svnno****@sourc*****
svnno****@sourc*****
2010年 11月 30日 (火) 01:07:40 JST
Revision: 338 http://sourceforge.jp/projects/swfed/svn/view?view=rev&revision=338 Author: yoya Date: 2010-11-30 01:07:40 +0900 (Tue, 30 Nov 2010) Log Message: ----------- - itelator 系メソッドを追加 - テスト用 main 追加 - 色々バグフィックス Modified Paths: -------------- trunk/src/y_strtable.c trunk/src/y_strtable.h -------------- next part -------------- Modified: trunk/src/y_strtable.c =================================================================== --- trunk/src/y_strtable.c 2010-11-28 17:11:43 UTC (rev 337) +++ trunk/src/y_strtable.c 2010-11-29 16:07:40 UTC (rev 338) @@ -1,3 +1,6 @@ +/* + gcc -W -Wall -D__STRTABLE_DEBUG__ -DMALLOC_DEBUG y_strtable.c swf_debug.c + */ #include <stdio.h> #include <malloc.h> #include <string.h> @@ -4,11 +7,14 @@ #include "swf_define.h" #include "y_strtable.h" -#define Y_STRTABLE_INITSIZE 10 +//#define Y_STRTABLE_INITSIZE 10 +#define Y_STRTABLE_INITSIZE 1 +/* + * open/close + */ y_strtable_t * y_strtable_open() { - int i; y_strtable_t *st = calloc(sizeof(*st), 1); if (st == NULL) { fprintf(stderr, "y_strtable_open: calloc failed\n"); @@ -16,10 +22,28 @@ } st->use_len = 0; st->alloc_len = Y_STRTABLE_INITSIZE; - st->table = malloc(sizeof(st->table) * Y_STRTABLE_INITSIZE); + st->table = malloc(sizeof(*st->table) * Y_STRTABLE_INITSIZE); return st; } +void +y_strtable_close(y_strtable_t *st) { + int i; + for (i = 0 ; i < st->use_len ; i++) { + if (st->table[i].use) { + free(st->table[i].key); + free(st->table[i].value); + } + } + free(st->table); + free(st); +} + + +/* + * set/get/delete + */ + int y_strtable_set(y_strtable_t *st, char *key, int key_len, char *value, int value_len) { int i, offset = -1; @@ -34,7 +58,7 @@ } } if (offset == -1) { - tmp = realloc(st->table, 2 * st->alloc_len); + tmp = realloc(st->table, 2 * st->alloc_len * sizeof(*(st->table))); if (tmp == NULL) { fprintf(stderr, "y_strtable_set: realloc failed\n"); return 1; @@ -55,10 +79,13 @@ } memcpy(st->table[offset].key, key, key_len); memcpy(st->table[offset].value, value, value_len); + st->table[offset].key_len = key_len; + st->table[offset].value_len = value_len; st->table[offset].use = 1; if (offset == st->use_len) { st->use_len = offset + 1; } + return 0; } char * @@ -93,15 +120,67 @@ return 1; } +/* + * itelator + */ void -y_strtable_close(y_strtable_t *st) { - int i; - for (i = 0 ; i < st->use_len ; i++) { - if (st->table[i].use) { - free(st->table[i].key); - free(st->table[i].value); +y_strtable_rewind(y_strtable_t *st) { + st->get_offset = -1; +} +int +y_strtable_hasnext(y_strtable_t *st) { + do { + st->get_offset++; + if (st->table[st->get_offset].use) { + return 1; // found } + } while (st->get_offset < st->use_len); + + return 0;// false + +} +char * +y_strtable_get_currentkey(y_strtable_t *st, int *key_len) { + if (st->get_offset >= st->use_len) { + return NULL; } - free(st->table); - free(st); + *key_len = st->table[st->get_offset].key_len; + return st->table[st->get_offset].key; } +char * +y_strtable_get_currentvalue(y_strtable_t *st, int *value_len) { + if (st->get_offset >= st->use_len) { + return NULL; + } + *value_len = st->table[st->get_offset].value_len; + return st->table[st->get_offset].value; +} + +#ifdef __STRTABLE_DEBUG__ + +int main(void) { + char *key, *value; + int key_len, value_len; + malloc_debug_start(); + y_strtable_t *st = y_strtable_open(); + y_strtable_set(st, "foo", 4, "baa", 4); + y_strtable_set(st, "baz", 4, "buz", 4); + y_strtable_rewind(st); + while(y_strtable_hasnext(st)) { + key = y_strtable_get_currentkey(st, &key_len); + value = y_strtable_get_currentvalue(st, &value_len); + printf("key=%s(%d), value=%s(%d)\n", key, key_len, value, value_len); + } + y_strtable_delete(st, "foo", 4); + y_strtable_rewind(st); + while(y_strtable_hasnext(st)) { + key = y_strtable_get_currentkey(st, &key_len); + value = y_strtable_get_currentvalue(st, &value_len); + printf("key=%s(%d), value=%s(%d)\n", key, key_len, value, value_len); + } + y_strtable_close(st); + malloc_debug_end(); + return 0; +} + +#endif /* __STRTABLE_DEBUG__ */ Modified: trunk/src/y_strtable.h =================================================================== --- trunk/src/y_strtable.h 2010-11-28 17:11:43 UTC (rev 337) +++ trunk/src/y_strtable.h 2010-11-29 16:07:40 UTC (rev 338) @@ -11,13 +11,24 @@ int use_len; int alloc_len; y_strtable_entry_t *table; + // + signed int get_offset; } y_strtable_t; +// open/close extern y_strtable_t *y_strtable_open(); +extern void y_strtable_close(y_strtable_t *st); + +// set/get/delete extern int y_strtable_set(y_strtable_t *st, char *key, int key_len, char *value, int value_len); extern char *y_strtable_get(y_strtable_t *st, char *key, int key_len,int *value_len); extern int y_strtable_delete(y_strtable_t *st, char *key, int key_len); -extern void y_strtable_close(y_strtable_t *st); +// itelator +extern void y_strtable_rewind(y_strtable_t *st); +extern int y_strtable_hasnext(y_strtable_t *st); +extern char * y_strtable_get_currentkey(y_strtable_t *st, int *key_len); +extern char * y_strtable_get_currentvalue(y_strtable_t *st, int *value_len); + #endif /* __STRTABLE_H */