"load_conf_file": Loading configuration files in C
hacker emblem Happy Hacking!


English Here (machine translation)

load_conf_file: 構成ファイルをメモリ展開するユーティリティ

この C 言語ユーティリティは、Java のプロパティ・ファイル形式あるいはDOS の ini ファイル形式いずれかの形式の構成ファイルをメモリ上に読み込み値の名で検索し、そして値に一致する項目が構成ファイルの何番目の項目として記述されていたかを求めることができるようにするためのユーティリティです。構成ファイルを展開したデータ構造が不要になったなら、必ず、動的に獲得したメモリを解放する必要があります。

API を使用するためのヘッダは conf_file_loader.h で、API の実装は conf_file_loader.c です。API の説明は、この文書で後述しています。

テスト・プログラム conf_file_loader-test.c そして make ファイル Makefile を記述しました。


API の説明

  1. 構成ファイルをメモリ上に展開する load_conf_file()
    Configuration_t *load_conf_file(char *path
    , char *comment_chars
    , char val_delimit
    )

    path には構成ファイルのパスを指定します。
    comment_chars にはコメント文字として使用するすべての文字を指定します。Java プロパティ・ファイル形式のコメント文字を指定するには JAVA_PROPERTY_FILE_COMMENT_CHARS マクロ ("#!/*") を、DOS ini ファイル形式の指定をするには DOS_INI_FILE_COMMENT_CHARS マクロ ("[;'/") を使用できます。
    val_delimit には構成ファイルの値の文字列を複数のフィールドに区切って扱う場合の区切り文字を指定します。val_delimit にヌル文字 '\0' を指定すると、値はひとつの項目だけからなるものとして扱います。

    行末にエスケープ文字 '\' がある場合、値の定義が次の行に継続しているものとして扱います。
    また、値が二重引用符 " で囲まれている場合は、メモリ展開時に、それらを取り除きます。

    path で指定されたファイルの拡張子が .INI あるいは .ini である場合を DOS INI ファイルと判定します。それ以外の拡張子の場合は、Java プロパティ・ファイル形式の構成ファイルであると判定します。Java プロパティ・ファイル形式の構成ファイルであると判定した場合、値の名と値自身のエスケープ・シーケンス ('\r', '\n', '\t', '\b', '\a') をデコードします。これら以外の文字がエスケープ文字 '\' の後に続く場合は、エスケープ文字をスキップします。DOS INI ファイル形式ではこの処理は行いません。

    構成ファイルの記述内容をメモリ上に展開出来た場合、Configuration_t 構造体のアドレスを返します。この構造体は API 内で動的に獲得されたメモリ上に展開されます。
    なんらかのエラーが発生した場合、NULL を返します。エラーの詳細は errno に出力されます。errno は以下の意味を持ちます。

    • EINVAL: 不正な引数の場合
    • EACCES: path ファイルの読み込み権限がない場合
    • EIO: path ファイルの読み込みに失敗した場合
    • ENOMEM: メモリ不足の場合

  2. 値の名前に一致する構成ファイル行情報を検索する get_row_matched_key()
    Conf_row_t *get_row_matched_key(Configuration_t *conf
    , char *key
    )

    conf には load_conf_file() の戻り値を指定します。
    key には検索する構成ファイル行情報の値の名前を指定します。

    行情報 Conf_row_t の詳細は以下のとおりです。

    • char * key : 行情報の名前
    • size_t vals_n : 行情報の値の個数
    • size_t vals_alloc_sz : 行情報の値ベクタ用に獲得されているメモリサイズ
    • char **vals : 行情報の値それぞれへのポインタのベクタ

    key と一致する行情報が検索できた場合は、Conf_row_t のアドレスを返します。検索に失敗した場合と不正な引数を渡された場合は、NULL を返します。不正な引数の場合は errno に EINVAL を出力し、key に一致する行情報が conf に存在しない場合は errno にゼロを出力します。

  3. ある名前の行情報に指定の値が何番目の項目として定義されているかを求める find_value_matched_key()
    char *find_value_matched_key(Configuration_t *conf
    , char *key
    , char *value
    , size_t *val_idx
    )

    conf には load_conf_file() の戻り値を指定します。
    key には検索する構成ファイル行情報の値の名前を指定します。
    value には項目の定義位置を求める値を指定します。
    val_idx には value に一致する項目の定義位置を出力します。

    key に一致する行情報が存在し、その値ベクタ中に value と一致するものが見つかった場合、ベクタ中の一致した文字列アドレスを返します。行情報あるいは値項目が見つからない場合と不正な引数が指定された場合には、NULL を返します。不正な引数を指定された場合は errno に EINVAL を、そうでなければゼロを出力します。

  4. メモリ上の構成ファイル情報を破棄する destroy_conf()
    void destroy_conf(Configuration_t *conf)

    conf には load_conf_file() の戻り値を指定します。

    conf の指す構成情報 Configuration_t から辿れるすべての動的獲得メモリを解放します。

    戻り値はありません。