kurukuru-papaのブログ

主に、ソフトウェア開発に関連したメモを書き溜めたいと思います。

Table機能を使ってみる

APR(Apache Portable Runtime)のTable機能を使ってみました。Table機能を利用する場合の手順は次のようになるようです。

  1. apr_pool_create関数を使用して、Table機能で使用するメモリプールを作成します。
  2. apr_table_make関数を使用して、apr_table_tを作成します。
  3. 次の関数を使用して、要素を操作します。
  4. 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