#ifndef INI_CONFIG_H #define INI_CONFIG_H #include #include #include #include #include typedef struct { void* serialize; void* deserialize; } INI_ConfigTransformer; struct INI_ConfigItem; typedef void INI_ConfigTypeLoad(struct INI_ConfigItem*, const char*); typedef enum { INI_CONFIG_SAVE_ITEM_ERROR = -1, INI_CONFIG_SAVE_ITEM_OK, } INI_ConfigSaveItemResult; typedef INI_ConfigSaveItemResult INI_ConfigTypeSave(struct INI_ConfigItem*, const char*); typedef void INI_ConfigTypeOverride(struct INI_ConfigItem*, uint8_t, const char*[]); typedef struct { size_t size; INI_ConfigTypeLoad* load; INI_ConfigTypeSave* save; INI_ConfigTypeOverride* override; } INI_ConfigType; typedef struct INI_ConfigItem { INI_ConfigType type; const char* section; const char* key; const char* cmdline_option; const void* default_value; void* validator; INI_ConfigTransformer transformer; void* dest; } INI_ConfigItem; void INI_ConfigGetDefaultPath(char*, size_t); const char* INI_ConfigGetCommandlineOption(uint8_t, const char*[], const char*); typedef enum { INI_CONFIG_INITIALIZE_RESULT_ERROR = -1, INI_CONFIG_INITIALIZE_RESULT_OK, INI_CONFIG_INITIALIZE_RESULT_WARNING } INI_ConfigInitializeResult; INI_ConfigInitializeResult INI_ConfigInitialize(INI_ConfigItem[], const char*, uint8_t, const char*[]); typedef int32_t INI_ConfigSaveResult; INI_ConfigSaveResult INI_ConfigSave(INI_ConfigItem[], const char*); void INI_ConfigLoadU8(INI_ConfigItem*, const char*); void INI_ConfigLoadU16(INI_ConfigItem*, const char*); void INI_ConfigLoadU32(INI_ConfigItem*, const char*); void INI_ConfigLoadI8(INI_ConfigItem*, const char*); void INI_ConfigLoadI16(INI_ConfigItem*, const char*); void INI_ConfigLoadI32(INI_ConfigItem*, const char*); void INI_ConfigLoadString(INI_ConfigItem*, const char*); INI_ConfigSaveItemResult INI_ConfigSaveU8(INI_ConfigItem*, const char*); INI_ConfigSaveItemResult INI_ConfigSaveU16(INI_ConfigItem*, const char*); INI_ConfigSaveItemResult INI_ConfigSaveU32(INI_ConfigItem*, const char*); INI_ConfigSaveItemResult INI_ConfigSaveI8(INI_ConfigItem*, const char*); INI_ConfigSaveItemResult INI_ConfigSaveI16(INI_ConfigItem*, const char*); INI_ConfigSaveItemResult INI_ConfigSaveI32(INI_ConfigItem*, const char*); INI_ConfigSaveItemResult INI_ConfigSaveString(INI_ConfigItem*, const char*); void INI_ConfigOverrideU8(INI_ConfigItem*, uint8_t, const char*[]); void INI_ConfigOverrideU16(INI_ConfigItem*, uint8_t, const char*[]); void INI_ConfigOverrideU32(INI_ConfigItem*, uint8_t, const char*[]); void INI_ConfigOverrideI8(INI_ConfigItem*, uint8_t, const char*[]); void INI_ConfigOverrideI16(INI_ConfigItem*, uint8_t, const char*[]); void INI_ConfigOverrideI32(INI_ConfigItem*, uint8_t, const char*[]); void INI_ConfigOverrideString(INI_ConfigItem*, uint8_t, const char*[]); #define INI_CONFIG_TYPE_U8 (INI_ConfigType) { \ .size = sizeof(uint8_t), \ .load = INI_ConfigLoadU8, \ .save = INI_ConfigSaveU8, \ .override = INI_ConfigOverrideU8, \ } #define INI_CONFIG_TYPE_U16 (INI_ConfigType) { \ .size = sizeof(uint16_t), \ .load = INI_ConfigLoadU16, \ .save = INI_ConfigSaveU16, \ .override = INI_ConfigOverrideU16, \ } #define INI_CONFIG_TYPE_U32 (INI_ConfigType) { \ .size = sizeof(uint32_t), \ .load = INI_ConfigLoadU32, \ .save = INI_ConfigSaveU32, \ .override = INI_ConfigOverrideU32, \ } #define INI_CONFIG_TYPE_I8 (INI_ConfigType) { \ .size = sizeof(int8_t), \ .load = INI_ConfigLoadI8, \ .save = INI_ConfigSaveI8, \ .override = INI_ConfigOverrideI8, \ } #define INI_CONFIG_TYPE_I16 (INI_ConfigType) { \ .size = sizeof(int16_t), \ .load = INI_ConfigLoadI16, \ .save = INI_ConfigSaveI16, \ .override = INI_ConfigOverrideI16, \ } #define INI_CONFIG_TYPE_I32 (INI_ConfigType) { \ .size = sizeof(int32_t), \ .load = INI_ConfigLoadI32, \ .save = INI_ConfigSaveI32, \ .override = INI_ConfigOverrideI32, \ } #define INI_CONFIG_TYPE_FNS_STRING(X) (INI_ConfigType) { \ .size = (sizeof(char) * X), \ .load = INI_ConfigLoadString, \ .save = INI_ConfigSaveString, \ .override = INI_ConfigOverrideString, \ } #define INI_CONFIG_TRANSFORMER_NONE (INI_ConfigTransformer) { \ .serialize = NULL, \ .deserialize = NULL, \ } #define INI_CONFIG_ITEM_NULL (INI_ConfigItem) { \ (INI_ConfigType) { \ .size = 0, \ .load = NULL, \ .save = NULL, \ .override = NULL, \ }, \ NULL, \ NULL, \ NULL, \ NULL, \ NULL, \ INI_CONFIG_TRANSFORMER_NONE, \ NULL, \ } #endif