prg-lang-2 / final / BlackJack / config.h
config.h
Raw
#ifndef CONFIG_H
#define CONFIG_H

#include <stdio.h>
#include <stdlib.h>

/** 設定項目のキーの最大長 */
#define CONFIG_MAX_KEY_LENGTH 64

/** 設定項目の値の最大長 */
#define CONFIG_MAX_VALUE_LENGTH 64

/**
 * @brief 設定項目の構造体
 *
 * キーと値のペアで1つの設定項目を表現する。
 */
typedef struct ConfigItem
{
    char key[CONFIG_MAX_KEY_LENGTH];     /**< 設定のキー */
    char value[CONFIG_MAX_VALUE_LENGTH]; /**< 設定の値 */
} ConfigItem;

/**
 * @brief 設定管理構造体
 *
 * 全ての設定項目とその数を管理する。
 */
typedef struct Config
{
    ConfigItem *items; /**< 設定項目の配列 */
    int count;         /**< 設定項目の数 */
} Config;

/**
 * @brief 設定ファイルの読み込み
 *
 * 指定されたファイルから設定を読み込む。ファイルが存在しない場合は
 * デフォルト値で新規作成する。各行は"キー=値"の形式である必要がある。
 *
 * @param filename 設定ファイルのパス
 * @return Config* 読み込んだ設定へのポインタ、失敗時は`NULL`
 */
Config *loadConfig(const char *filename);

/**
 * @brief 文字列値の取得
 *
 * @param config 設定構造体
 * @param key 検索するキー
 * @return const char* 見つかった値の文字列、見つからない場合は`NULL`
 */
const char *getConfigValue(const Config *config, const char *key);

/**
 * @brief 整数値の取得
 *
 * @param config 設定構造体
 * @param key 検索するキー
 * @param target 解析した値を格納するポインタ
 * @return int 成功時は`0`、キーが見つからないまたは値が不正な場合は`1`
 */
int getConfigValueInt(const Config *config, const char *key, int *target);

/**
 * @brief 長整数値の取得
 *
 * @param config 設定構造体
 * @param key 検索するキー
 * @param target 解析した値を格納するポインタ
 * @return int 成功時は0、キーが見つからないまたは値が不正な場合は1
 */
int getConfigValueLong(const Config *config, const char *key, long *target);

/**
 * @brief 浮動小数点値の取得
 *
 * @param config 設定構造体
 * @param key 検索するキー
 * @param target 解析した値を格納するポインタ
 * @return int 成功時は0、キーが見つからないまたは値が不正な場合は1
 */
int getConfigValueDouble(const Config *config, const char *key, double *target);

#endif