Table機能を使ってみる
APR(Apache Portable Runtime)のTable機能を使ってみました。Table機能を利用する場合の手順は次のようになるようです。
- apr_pool_create関数を使用して、Table機能で使用するメモリプールを作成します。
- apr_table_make関数を使用して、apr_table_tを作成します。
- 次の関数を使用して、要素を操作します。
- apr_table_tを使い終わったら、apr_pool_clearまたはapr_pool_destroy関数を使用して、メモリプールを破棄します。
主要な要素操作の関数
関数 | 概要 |
---|---|
apr_table_add | 要素を追加します。キーが重複しても場合、異なる要素として追加します。キーと値は内部的にコピーされます。 |
apr_table_addn | apr_table_addと同様ですが、キーと値は内部的にコピーされません。 |
apr_table_clear | 全要素を削除します。 |
apr_table_get | 指定されたキーに一致する要素を取得します。 |
apr_table_set | 要素を登録します。キーが重複する場合、上書きになります。キーと値は内部的にコピーされます。 |
apr_table_setn | apr_table_setと同様ですが、キーと値は内部的にコピーされません。 |
apr_table_unset | 要素を1つ削除します。 |
apr_table_elts | 全要素(apr_table_entry_t)の配列(apr_array_header_t)を取得します。 |
プログラム例
try_apr_table.c
/* * APR Table機能 * 新規作成:2008/01/14 */ #include <stdio.h> #include "apr_tables.h" void print_table(apr_table_t *table) { if (apr_is_empty_table(table)) { printf("要素はありません。\n"); } else { const apr_array_header_t *arr = apr_table_elts(table); int i; for (i = 0; i < arr->nelts; i++) { apr_table_entry_t *entry = (apr_table_entry_t *)(arr->elts + (arr->elt_size * i)); printf("%d番目の要素:キー=[%s],値=[%s]\n", i, entry->key, entry->val); } } } int main(int argc, char **argv) { char key1[] = "key1"; char key2[] = "key2"; char key3[] = "key3"; char val1[] = "value1"; char val2[] = "value2"; char val3[] = "value3"; // APRを初期化する。 apr_initialize(); // メモリプールを作成する。 apr_pool_t *pool = NULL; apr_status_t status = apr_pool_create(&pool, NULL); if (status == APR_SUCCESS) { // ------------------------------ // Tableの作成 // ------------------------------ // Tableを作成する。 // 初期領域サイズは、要素5個分とした。 apr_table_t *table = apr_table_make(pool, 5); // 要素を登録する。 apr_table_set(table, key1, val1); apr_table_set(table, key2, val2); apr_table_set(table, key3, val3); // 内容を出力する。 print_table(table); // ------------------------------ // 要素の変更 // ------------------------------ printf("変更前:[%s]\n", apr_table_get(table, key2)); apr_table_set(table, key2, "Hello"); printf("変更後:[%s]\n", apr_table_get(table, key2)); // ------------------------------ // 要素の削除 // ------------------------------ printf("要素の削除\n"); apr_table_unset(table, key2); print_table(table); // ------------------------------ // 全要素のクリア // ------------------------------ printf("要素のクリア\n"); apr_table_clear(table); print_table(table); // メモリプールを破棄します。 apr_pool_destroy(pool); } else { printf("メモリプールを作成できませんでした。\n"); } // APRを終了する。 apr_terminate(); return 0; }
実行結果
$ ./try_apr_table.exe
0番目の要素:キー=[key1],値=[value1]
1番目の要素:キー=[key2],値=[value2]
2番目の要素:キー=[key3],値=[value3]
変更前:[value2]
変更後:[Hello]
要素の削除
0番目の要素:キー=[key1],値=[value1]
1番目の要素:キー=[key3],値=[value3]
要素のクリア
要素はありません。
補足
参考サイト
Apache Portable Runtime: Table and Array Functions
http://apr.apache.org/docs/apr/1.2/group__apr__tables.html
井上の日誌 -Apacheの話-(2006-04-05)
https://www.codeblog.org/blog/inoue/20060405.html
動作環境
OS : Windows XP, Cygwin
APR Version : 1.2.12