#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