[Swfed-svn] swfed-svn [338] - itelator 系メソッドを追加

Back to archive index

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 */



Swfed-svn メーリングリストの案内
Back to archive index