#ifndef INI_CONFIG_H #define INI_CONFIG_H #include #include #include #include #include typedef struct { void* serialize; void* deserialize; } INI_ConfigSerializerPair; struct INI_ConfigItem; typedef void INI_ConfigLoadType(struct INI_ConfigItem*, const char*); typedef enum { INI_CONFIG_SAVE_ITEM_ERROR = -1, INI_CONFIG_SAVE_ITEM_OK, } INI_ConfigSaveItemResult; typedef INI_ConfigSaveItemResult INI_ConfigSaveType(struct INI_ConfigItem*, const char*); typedef void INI_ConfigOverrideType(struct INI_ConfigItem*, uint8_t, const char*[]); typedef struct { size_t size; INI_ConfigLoadType* load; INI_ConfigSaveType* save; INI_ConfigOverrideType* override; } INI_ConfigTypeFns; typedef struct INI_ConfigItem { INI_ConfigTypeFns fns; const char* section; const char* key; const char* cmdline_option; const void* default_value; void* validator; INI_ConfigSerializerPair 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_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_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_ConfigOverrideI32(INI_ConfigItem*, uint8_t, const char*[]); void INI_ConfigOverrideString(INI_ConfigItem*, uint8_t, const char*[]); #define INI_CONFIG_TYPE_FNS_I32 (INI_ConfigTypeFns) { \ .size = sizeof(int32_t), \ .load = INI_ConfigLoadI32, \ .save = INI_ConfigSaveI32, \ .override = INI_ConfigOverrideI32, \ } #define INI_CONFIG_TYPE_FNS_U16 (INI_ConfigTypeFns) { \ .size = sizeof(uint16_t), \ .load = INI_ConfigLoadU16, \ .save = INI_ConfigSaveU16, \ .override = INI_ConfigOverrideU16, \ } #define INI_CONFIG_TYPE_FNS_U8 (INI_ConfigTypeFns) { \ .size = sizeof(uint8_t), \ .load = INI_ConfigLoadU8, \ .save = INI_ConfigSaveU8, \ .override = INI_ConfigOverrideU8, \ } #define INI_CONFIG_TYPE_FNS_VOID (INI_ConfigTypeFns) { \ .size = 0, \ .load = NULL, \ .save = NULL, \ .override = NULL, \ } #define INI_CONFIG_TYPE_FNS_STRING(X) (INI_ConfigTypeFns) { \ .size = (X), \ .load = INI_ConfigLoadString, \ .save = INI_ConfigSaveString, \ .override = INI_ConfigOverrideString, \ } #define INI_CONFIG_ITEM_NULL (INI_ConfigItem) { \ INI_CONFIG_TYPE_FNS_VOID, \ NULL, \ NULL, \ NULL, \ NULL, \ NULL, \ { \ .serialize = NULL, \ .deserialize = NULL, \ }, \ NULL, \ } #endif