ktable.c
最終更新:2009/10/10
001: /* ktable.c 002: * テーブルの例 003: * TABLE: apr_table_make / apr_table_set / apr_table_setn / 004: * apr_table_get / apr_table_elts / apr_table_add / apr_table_unset / 005: * apr_is_empty_table / apr_table_clear 006: */ 007: 008: #include "apr_general.h" 009: #include "apr_file_io.h" 010: 011: #include "apr_tables.h" 012: 013: #include "apr_strings.h" 014: 015: #include "mystab.h" 016: 017: /* 018: * apr_table_do 用コールバック関数 019: * ctxにはコールバック関数へのコンテクストデータ。 020: * この例ではファイルポインタ渡しに使用。 021: */ 022: 023: int table_cb (void *ctx, const char *key, const char *value) { 024: apr_file_t *out = (apr_file_t*)ctx; 025: apr_file_printf(out, "(%s)=(%s)\n", key, value); 026: return TRUE;/* TRUE:continue iteration. FALSE:stop iteration */ 027: } 028: 029: /* 030: * apr_table_do 用コールバック関数 031: * この例ではキー・値をコンカテネートしてみる。 032: */ 033: 034: typedef struct mydata { 035: apr_pool_t *pool; 036: char *str; /* あらかじめ、"" で初期化すること*/ 037: } mydata; 038: 039: int table_cb2 (void *ctx, const char *key, const char *value) { 040: mydata *md = (mydata*)ctx; 041: md->str = apr_psprintf(md->pool, "%s{%s}={%s}\n", md->str, key, value); 042: return TRUE;/* TRUE:continue iteration. FALSE:stop iteration */ 043: } 044: 045: 046: int apr_my_main (int ac, char **av, apr_file_t * astdin, apr_file_t * astdout, apr_file_t * astderr, apr_pool_t * pool) { 047: 048: char *keys[] = { 049: "key0" 050: , "key1" 051: , "key2" 052: , "key3" 053: }; 054: 055: char *values[] = { 056: "value0" 057: , "value1" 058: , "value2" 059: , "value3" 060: }; 061: 062: /* apr_table_make / apr_table_set / apr_table_setn / apr_table_get / apr_table_elts / apr_table_add 063: * apr_table_unset / apr_is_empty_table apr_table_clear 064: * INCLUDE: apr_tables.h 065: * LIBS: libapr-1.lib 066: */ 067: { 068: apr_table_t * tab; 069: int i; 070: 071: /* テーブルの生成 */ 072: 073: tab = apr_table_make(pool, 10); /* 第二引数はテーブルのサイズを指定するが、動的に変化する。*/ 074: 075: /* テーブルは空?(1 になるはず) */ 076: 077: apr_file_printf(astdout, "apr_is_empty_table=[%d]\n", apr_is_empty_table(tab)); 078: 079: /* キー・値の追加 */ 080: 081: for (i=0; i<4; i++) { 082: /* apr_table_set はキーとバリューの値を「複製」する。apr_table_setn とすると「複製」されない*/ 083: apr_table_set(tab, keys[i], values[i]); 084: } 085: 086: apr_table_set(tab, "FOO", "VALUE0"); 087: apr_table_set(tab, "BAR", "VALUE1"); 088: apr_table_set(tab, "QUUX", "VALUE2"); 089: 090: /* テーブルは空?(0 になるはず) */ 091: 092: apr_file_printf(astdout, "apr_is_empty_table=[%d]\n", apr_is_empty_table(tab)); 093: 094: /* キーに対応する値の表示 */ 095: 096: apr_file_printf(astdout, "---------------------------------------------\n"); 097: 098: apr_file_printf(astdout, "[%s]=>[%s]\n", "QUUX", apr_table_get(tab, "QUUX")); 099: 100: for (i=0; i<4; i++) { 101: apr_file_printf(astdout, "[%s]=>[%s]\n", keys[i], apr_table_get(tab, keys[i])); 102: } 103: 104: /* 存在しないキーに対応する値の表示(NULL になる)*/ 105: 106: apr_file_printf(astdout, "[%s]=>[%s]\n", "UNKNOWN", apr_table_get(tab, "UNKNOWN")); 107: 108: /* 格納されたキー・値の個数の表示 */ 109: 110: if (1) { 111: const apr_array_header_t *tarr = apr_table_elts(tab); 112: apr_file_printf(astdout, "---------------------------------------------\n"); 113: apr_file_printf(astdout, "size=[%d]\n", tarr->nelts); 114: } 115: 116: /* 格納されたキー・値の一覧表示(その1) */ 117: 118: if (1) { 119: const apr_table_entry_t *telts; 120: const apr_array_header_t *tarr = apr_table_elts(tab); 121: 122: telts = (const apr_table_entry_t*)tarr->elts; 123: 124: apr_file_printf(astdout, "---------------------------------------------\n"); 125: for (i = 0; i < tarr->nelts; i++) { 126: apr_file_printf(astdout, "%d: [%s]=[%s]\n", i, telts[i].key, telts[i].val); 127: } 128: } 129: 130: /* 格納されたキー・値の一覧表示(その2) */ 131: 132: if (1) { 133: apr_file_printf(astdout, "---------------------------------------------\n"); 134: apr_table_do(table_cb, astdout, tab, NULL); 135: } 136: 137: /* 格納されたキー・値の一覧表示(その2・コールバック関数もう一例) */ 138: 139: if (1) { 140: mydata md; 141: apr_file_printf(astdout, "#---------------------------------------------\n"); 142: md.pool = pool; 143: md.str = ""; 144: apr_table_do(table_cb2, &md, tab, NULL); 145: apr_file_printf(astdout, "%s", md.str); 146: } 147: 148: /* 格納されたキー・値の一覧表示(その2・コールバック関数もう一例+フィルタ) */ 149: 150: if (1) { 151: mydata md; 152: apr_file_printf(astdout, "#---------------------------------------------\n"); 153: md.pool = pool; 154: md.str = ""; 155: apr_table_do(table_cb2, &md, tab, "FOO", "BAR", "QUUX", NULL); /* キーが FOO, BAR, QUUX となるもののみ処理される*/ 156: apr_file_printf(astdout, "%s", md.str); 157: } 158: 159: 160: /* 値の変更 */ 161: apr_table_set(tab, "QUUX", "ANOTHER VALUE"); 162: apr_table_set(tab, "key3", "ANOTHER VALUE2"); 163: 164: /* 格納されたキー・値の一覧表示 */ 165: 166: if (1) { 167: apr_file_printf(astdout, "---------------------------------------------\n"); 168: apr_table_do(table_cb, astdout, tab, NULL); 169: } 170: 171: /* すでに存在するキーの値の追加(多重値) */ 172: /* apr_table_add はキーとバリューの値を「複製」する。apr_table_addn とすると「複製」されない*/ 173: 174: apr_table_add(tab, "FOO", "ANOTHER VALUE3"); 175: apr_table_add(tab, "key2", "ANOTHER VALUE4"); 176: 177: /* 格納されたキー・値の一覧表示 */ 178: 179: if (1) { 180: apr_file_printf(astdout, "---------------------------------------------\n"); 181: apr_table_do(table_cb, astdout, tab, NULL); 182: } 183: 184: /* 多重値になっているキーの値を apr_table_get すると(最初に登録したものになる) */ 185: 186: if (1) { 187: apr_file_printf(astdout, "---------------------------------------------\n"); 188: apr_file_printf(astdout, "[%s]=>[%s]\n", "FOO", apr_table_get(tab, "FOO")); 189: apr_file_printf(astdout, "[%s]=>[%s]\n", "key2", apr_table_get(tab, "key2")); 190: } 191: 192: /* キー・値の削除 */ 193: 194: apr_table_unset(tab, "BAR"); 195: apr_table_unset(tab, "key0"); 196: 197: /* 格納されたキー・値の一覧表示 */ 198: 199: if (1) { 200: apr_file_printf(astdout, "---------------------------------------------\n"); 201: apr_table_do(table_cb, astdout, tab, NULL); 202: } 203: 204: /* 多重値になっているキー・値の削除 */ 205: 206: apr_table_unset(tab, "FOO"); 207: apr_table_unset(tab, "key2"); 208: 209: /* 格納されたキー・値の一覧表示 */ 210: 211: if (1) { 212: apr_file_printf(astdout, "---------------------------------------------\n"); 213: apr_table_do(table_cb, astdout, tab, NULL); 214: } 215: 216: /* テーブルのクリア */ 217: apr_table_clear(tab); 218: 219: /* テーブルは空?(1 になるはず) */ 220: 221: apr_file_printf(astdout, "apr_is_empty_table=[%d]\n", apr_is_empty_table(tab)); 222: 223: 224: /* 格納されたキー・値の一覧表示(空なのでコールバック関数は呼ばれない) */ 225: 226: if (1) { 227: apr_file_printf(astdout, "---------------------------------------------\n"); 228: apr_table_do(table_cb, astdout, tab, NULL); 229: } 230: 231: 232: /* より汎用的には、こんな使い方が安全なのでは? */ 233: if (tab && ! apr_is_empty_table(tab)) { 234: apr_table_do(table_cb, astdout, tab, NULL); 235: } 236: 237: } 238: 239: 240: apr_file_printf(astdout, "\ndone.\n"); 241: return 0; /* 正常終了 */ 242: }
KAKU PROJECT (2009) |