libuclを使ってみよう(ファイル読み込み編) 備考録とエトセトラ
UCLファイルのパーサ・エミッタの、C言語による実装として、libuclというライブラリがあります。
ここでは、そのライブラリの使い方の一例を紹介しようと思います。
この記事では、ファイルの読み込みを取り扱います。
コード例
パラメータ読み込みまでの簡易的な手順は、
- parserオブジェクトの作成
- parserへのファイル割り当て
- 入力したuclのエラーチェック
- parserオブジェクトから、ucl_objectを取得
- ucl_objectから値を検索し、読み出す
となります。
解説
parserオブジェクトの作成
ソースコードの46行目がこれに該当します。
’'’c parser = ucl_parser_new(UCL_PARSER_DEFAULT); ‘’’
ucl_parser_new関数は、引数にフラグパラメータをとり、これによりパーサの挙動を変化させることができます。
parserへのファイル割り当て
ソースコードの130行目がこれに該当します。
’'’c if(!ucl_parser_add_file(parser, path)) ‘’’
ucl_parser_add_file関数を使うことで、uclファイルをパーサに追加できます。
追加なので、複数回使うと、実行回数分だけパーサにuclファイルを追加(くっつける)ことができるとおもわれます。 (たぶん)
入力したuclのエラーチェック
ソースコードの138行目がこれに該当します。
’'’c uclerr = ucl_parser_get_error(parser); ‘’’
ucl_parser_get_error関数を使うことで、uclの構文チェックを行うことができます。
正常にパースできないようであれば、エラー内容を示す文字列が返ってきます。
おそらく、これは必須ではありませんが、やっておいたほうが無難であると思います。
parserオブジェクトから、ucl_objectを取得
ソースコードの147行目がこれに該当します。
’'’c uclobj = ucl_parser_get_object(parser); ‘’’
ucl_parser_get_object関数を使うことで、uclオブジェクトを取得できます。
このオブジェクトに対し、読み出し関数を使用して値を読み出していきます。
ucl_objectから値を検索し、読み出す
ソースコードの64行目からの処理がこれに該当します。
tgtobj = ucl_object_lookup_path(rootobj, test_key);
if(!tgtobj)
{
fprintf(stderr, "Error: %s: key \"%s\" not found.\n", path, test_key);
ucl_object_unref(rootobj);
ucl_parser_free(parser);
return -1;
}
result = ucl_object_toint_safe(tgtobj,&test_value);
if(result)
{
printf("%s: %s = %ld\n", path, test_key, test_value);
}
else
{
fprintf(stderr, "Error: %s: key \"%s\" isn't int value.\n", path, test_key);
}
ポイントは、ucl_object_lookup_path関数と、ucl_object_toint_safe関数で、
前者が値の検索、後者が値の取り出しを行っています。
検索関数・値の取り出し関数は他にも様々なものがあるので、ucl.hの中身を覗いてみてください。
複数のオブジェクトに対して処理を繰り返す みたいな処理は、たぶんucl_object_iterate関数あたりをつかえばできそうです。
コード例の使用例
main.c
#include <stdio.h>
#include "load/load.h"
int main(int argc, char** argv)
{
return ucl_fload("test.ucl");
}
こんな感じで。
以下のファイルを読み込むと、
test.ucl
{
hogehoge {
fugafuga : 30
}
}
出力結果はこんな感じ。
test.ucl: hogehoge.fugafuga = 30
プロジェクトのサンプルを、ここに置いておきます。
おわりに
libuclの使い方のキホンは分かったので、これからどんどん使っていきたいと思います。
関連記事
参考リンク
blog comments powered by Disqus