/* khashtable.c * ハッシュテーブルの例 * HASHTABLE: apr_hash_make / apr_hash_set / apr_hash_get / apr_hash_count / apr_hash_first / apr_hash_next / apr_hash_this */ #include "apr_general.h" #include "apr_file_io.h" #include "apr_hash.h" #include "mystab.h" void disp_k_v(const char *key, int kLen, const char *value, void *ctx) { apr_file_t *out = (apr_file_t*)ctx; apr_file_printf(out, "ITER [%s]=[%s]\n", key, value); } /* * ハッシュテーブルのイテレータ関数 */ void apr_hash_foreach (apr_pool_t *pool, apr_hash_t *ht, void *f, void *ctx) { void (*func)(const char *, int, const char *, void *) = f; const void *k; void *v; apr_ssize_t kLen; apr_hash_index_t *hi; for (hi = apr_hash_first(pool, ht); hi; hi=apr_hash_next(hi)) { apr_hash_this(hi, &k, &kLen, &v); (*func)((const char*)k, kLen, (const char*)v, ctx); } } int apr_my_main (int ac, char **av, apr_file_t * astdin, apr_file_t * astdout, apr_file_t * astderr, apr_pool_t * pool) { char *keys[] = { "key0" , "key1" , "key2" , "key3" }; char *values[] = { "value0" , "value1" , "value2" , "value3" }; /* apr_hash_make / apr_hash_set / apr_hash_get / apr_hash_count / apr_hash_first / apr_hash_next / apr_hash_this * INCLUDE: apr_hash.h * LIBS: libapr-1.lib */ { apr_hash_t * ht; int i; /* ハッシュテーブルの生成 */ ht = apr_hash_make(pool); /* キー・値の追加 */ for (i=0; i<4; i++) { apr_hash_set(ht, keys[i], APR_HASH_KEY_STRING, values[i]); } apr_hash_set(ht, "FOO", APR_HASH_KEY_STRING, "VALUE0"); apr_hash_set(ht, "BAR", APR_HASH_KEY_STRING, "VALUE1"); apr_hash_set(ht, "QUUX", APR_HASH_KEY_STRING, "VALUE2"); /* キーに対応する値の表示 */ apr_file_printf(astdout, "[%s]=>[%s]\n", "QUUX", (char*)apr_hash_get(ht, "QUUX", APR_HASH_KEY_STRING)); for (i=0; i<4; i++) { apr_file_printf(astdout, "[%s]=>[%s]\n", keys[i], (char*)apr_hash_get(ht, keys[i], APR_HASH_KEY_STRING)); } /* 格納されたキー・値の個数の表示 */ apr_file_printf(astdout, "size=[%d]\n", apr_hash_count(ht)); /* 格納されたキー・値の一覧表示 */ apr_hash_foreach(pool, ht, disp_k_v, astdout); /* 値の変更 */ apr_hash_set(ht, "QUUX", APR_HASH_KEY_STRING, "ANOTHER VALUE"); apr_hash_set(ht, "key3", APR_HASH_KEY_STRING, "ANOTHER VALUE2"); /* キーに対応する値の表示 */ apr_file_printf(astdout, "[%s]=>[%s]\n", "QUUX", (char*)apr_hash_get(ht, "QUUX", APR_HASH_KEY_STRING)); for (i=0; i<4; i++) { apr_file_printf(astdout, "[%s]=>[%s]\n", keys[i], (char*)apr_hash_get(ht, keys[i], APR_HASH_KEY_STRING)); } /* 格納されたキー・値の個数の表示 */ apr_file_printf(astdout, "size=[%d]\n", apr_hash_count(ht)); /* 格納されたキー・値の一覧表示 */ apr_hash_foreach(pool, ht, disp_k_v, astdout); /* キー・値の削除 */ apr_hash_set(ht, "QUUX", APR_HASH_KEY_STRING, NULL); /* キーに対応する値の表示 */ apr_file_printf(astdout, "[%s]=>[%s]\n", "QUUX", (char*)apr_hash_get(ht, "QUUX", APR_HASH_KEY_STRING)); for (i=0; i<4; i++) { apr_file_printf(astdout, "[%s]=>[%s]\n", keys[i], (char*)apr_hash_get(ht, keys[i], APR_HASH_KEY_STRING)); } /* 格納されたキー・値の個数の表示 */ apr_file_printf(astdout, "size=[%d]\n", apr_hash_count(ht)); /* 格納されたキー・値の一覧表示 */ apr_hash_foreach(pool, ht, disp_k_v, astdout); /* ハッシュテーブルのクリア */ apr_hash_clear(ht); /* キーに対応する値の表示 */ apr_file_printf(astdout, "[%s]=>[%s]\n", "QUUX", (char*)apr_hash_get(ht, "QUUX", APR_HASH_KEY_STRING)); for (i=0; i<4; i++) { apr_file_printf(astdout, "[%s]=>[%s]\n", keys[i], (char*)apr_hash_get(ht, keys[i], APR_HASH_KEY_STRING)); } /* 格納されたキー・値の個数の表示 */ apr_file_printf(astdout, "size=[%d]\n", apr_hash_count(ht)); /* 格納されたキー・値の一覧表示 */ apr_hash_foreach(pool, ht, disp_k_v, astdout); } apr_file_printf(astdout, "\ndone.\n"); return 0; /* 正常終了 */ }