parsecfg は指定された設定ファイルを読み込み、各設定内容を 解析し動的に確保したメモリに保存するためのライブラリです。
parsecfg を使用するには ANSI C 準拠のコンパイラが必要です。 動作確認は gcc version 2.95.2 で行っています。
また、必須ではありませんが、あなたのプログラムで GNU gettext を 使用することを強くお勧めします。gettext によるメッセージ出力の 国際化は、英語を母国語としない人々にとって非常にありがたいことです。 gettext に関する詳細は http://core.ring.gr.jp/pub/doc/gnu-info-j/gettext/gettext-ja_toc.html を参照してください。
parsecfg.c と parsecfg.h をあなたのプログラムの一部として取り込むだけ。
設定ファイルを cfgParse 関数で取り込むには、cfgStruct 構造体の配列を作成し、 初期化する必要があります。配列のそれぞれの要素にはパラメータの名前と その種類、および取得した値を記録する変数のアドレス (設定ファイルが INI タイプの場合は値を記録する変数へのポインタの アドレス) を記述します。
cfgStruct 構造体は parsecfg.h で以下のように宣言されています。
typedef struct{ char *parameterName; cfgValueType type; void *value; } cfgStruct;
parameterName はパラメータ (キーワード) の名前、type はパラメータの型、 value は設定内容を記録する変数のアドレス (またはポインタのアドレス) です。
type には以下の種類があります。
設定内容が「True」「Yes」「T」「Y」「1」ならば 1 を、 「False」「No」「F」「N」「0」ならば 0 を記録します。 大文字小文字は区別しません。
int 型の設定内容を記録します。
unsigned int 型の設定内容を記録します。
long 型の設定内容を記録します。
unsigned long 型の設定内容を記録します。
float 型の設定内容を記録します。
double 型の設定内容を記録します。
文字列の設定内容を記録します。
複数の文字列を連結リストとして記録します。
構造体配列の終りであることを示します。
詳しくはサンプルプログラム (sample.c) を見てください。 サンプルプログラムは make でコンパイルできます。
これらの関数を使用するファイルでは最初に parsecfg.h を インクルードしてください。
void cfgSetFatalFunc(void (*f)(int, const char *, int, const char *))
cfgSetFatalFunc 関数は設定ファイルの解析時にエラーが発生した 場合に呼び出す関数を指定します。この関数を呼び出さなかった場合には parsecfg.c のエラー処理関数が使われます。
int cfgParse(const char *file, cfgStruct cfg[], cfgFileType type)
cfgParse 関数を呼び出すことで file で指定された設定ファイル が解析され、値がメモリに記録されます。
type は設定ファイルの種類で、ここに CFG_SIMPLE を指定すると 単純な 1 対 1 の設定ファイルとして処理します。CFG_INI を指定すると Windoze の INI ファイル (あるいは SAMBA) 風のセクションモデルとして 処理します。
返り値は読み込んだセクション数 (1,2,3,...) です。type に CFG_SIMPLE を指定した場合は通常 0 が返ります。もしエラーが発生すると -1 が返ります。
int cfgDump(const char *file, cfgStruct cfg[], cfgFileType type, int max)
cfgDump 関数は設定をファイルに書き出す関数です。
file は書き出すファイル名で、type は設定ファイルの種類です。 max にはセクション数を指定します。type が CFG_SIMPLE の場合は 何を指定しても構いません (通常は 0 を指定するでしょう)。
int fetchVarFromCfgFile(const char *file, char *parameter_name, void *result_value, cfgValueType value_type, cfgFileType file_type, int section_num, const char *section_name)
fetchVarFromCfgFile 関数を使うことで、file で指定された 設定ファイルから parameter_name で指定されたパラメータの設定値を 抽出することができます。
結果はポインタ result_value で示されたアドレスに格納されます。この 変数の種類は value_type で指定します。
file_type は設定ファイルの種類です。
section_num は設定値を抽出したいセクション番号を指定します。 もしこれが 0 以下ならば、セクション番号ではなく、section_name で 指定されたセクション名から抽出します。 file_type が CFG_SIMPLE の場合は何を指定しても構いません (通常は 0 と NULL を指定するでしょう)。
設定値が正常に取得できたら 0 が返ります。失敗したら -1 が返ります。
int cfgSectionNameToNumber(const char *name)
cfgSectionNameToNumber 関数はセクション名をセクション番号に 変換する関数です。
セクション名が引数に指定した name と一致するセクション番号 (0,1,2,...) が返ります。一致するセクションがなかった場合には -1 が返ります。 なお、セクション名の大文字小文字は区別しません。
char *cfgSectionNumberToName(int num)
cfgSectionNumberToName 関数は上の cfgSectionNameToNumber 関数とは逆に、 セクション番号からセクション名を取得します。
存在しないセクション番号を指定すると NULL が返ります。
int cfgAllocForNewSection(cfgStruct cfg[], const char *name)
cfgAllocForNewSection 関数は新しいセクションを定義するために 必要なメモリを確保します。新く作られるセクション名には name で 指定された名前が付けられます。
成功したら現在のセクション数 (1,2,3,...) が、失敗したら -1 が返ります。
int cfgStoreValue(cfgStruct cfg[], const char *parameter, const char *value,cfgFileType type,int section)
cfgStoreValue 関数は value を cfg に従って変数に格納します。 type は設定ファイルの種類です。section には値を格納する セクション番号 (0,1,2,...) を指定します。 type が CFG_SIMPLE の場合は何を指定しても構いません (通常は 0 を 指定するでしょう)。
成功したら 0 が、失敗したら -1 が返ります。
空白文字 (スペース) とタブ文字は常に読み飛ばされます。これらの 特殊文字を含みたい場合はダブルクォーテーション " かシングル クォーテーション ' で全体を囲みます。 ダブルクォーテーションを含みたい場合はシングルクォーテーションで 囲んでください。逆も ok です。
シャープ記号 # の後ろはコメントと認識し、読み飛ばされます。
パラメータの大文字小文字は区別しません。 基本的な記述は、パラメータと値をイコール = で結んだものです。
# PARAMETER = VALUE ParameterINT = 65535 ParameterSTRING = GNU/Linux QuotedString = 'I pronounce "Linux" as "Leenooks".' TRUEorFALSE = FaLsE
同じパラメータが複数あった場合、設定値の種類が CFG_STRING_LIST ならば全てが記録されます。その他であれば一番最後に記述されたもの だけが有効になります。
# multiple parameters # CFG_INT ParameterINT = 255 # ignored ParameterINT = 65535 # stored # CFG_STRING_LIST ListString = "Debian GNU/Linux" # stored ListString = "FreeBSD" # stored
連結リストに複数の値を指定したい時には以下の形式も利用できます。
# for linked list ListString = { Internet "Exploder" }
INI 風なセクションモデルの場合は、各セクション名を [ と ] で囲みます。
# Windoze INI-like file [Linux] STRING = rule! VALUE = 99999999 [Windoze] STRING = suck! VALUE = -99999999
詳しくは sample.cfg および sample.ini を見てください。
Copyright (C) 1999-2001 Yuuki NINOMIYA (二之宮 祐樹) <gm@debian.or.jp>
本プログラムはフリー・ソフトウェアです。あなたは、Free Software Foundation が公表した GNU 一般公有使用許諾のバージョン 2、あるいは それ以降の各バージョンの中からいずれかを選択し、そのバージョンが 定める条項に従って本プログラムを再頒布または変更することができます。
本プログラムは有用とは思いますが、頒布にあたっては、市場性および 特定目的適合性についての暗黙の保証を含めて、いかなる保証も 行ないません。詳細については GNU 一般公有使用許諾書をお読みください。
あなたは、本プログラムと一緒に GNU 一般公有使用許諾の写しを 受け取っているはずです。そうでない場合は、Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA へ 手紙を書いてください。
特にありません。
特にありません。
特にありません。
感想、提案、バグレポート、パッチ等はいつでも歓迎します。 お気軽にお送りください。
Yuuki NINOMIYA (二之宮 祐樹) <gm@debian.or.jp>
http://www.enjoy.ne.jp/~gm/index-ja.html
最新の parsecfg の公式リリースは以下の URI からダウンロードできます。
http://www.enjoy.ne.jp/~gm/program/parsecfg/index-ja.html
最新のソースコードは Anonymous CVS で取得できます。 リポジトリは :pserver:anonymous@linuxlovers.yi.org:/var/cvs を、 プロジェクト名は parsecfg を、パスワードは anonymous を指定してください。
% cvs -d :pserver:anonymous@linuxlovers.yi.org:/var/cvs login (Logging in to anonymous@linuxlovers.yi.org) CVS password: anonymous % cvs -d :pserver:anonymous@linuxlovers.yi.org:/var/cvs checkout parsecfg
CVS の詳しい使い方は http://www-vox.dj.kit.ac.jp/nishi/cvs/cvs-manual/cvs-jp_toc.html を参照してください。
A Configuration File Parser Using C++ and STL
コメントやバグレポート、提案を送ってくれた人々に感謝します。
そして、parsecfg を使ってくれるあなたにありがとう!