Define simple configuration on INI files.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

126 rivejä
3.3 KiB

  1. #ifndef INI_CONFIG_H
  2. #define INI_CONFIG_H
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <stdint.h>
  6. #include <stdbool.h>
  7. #include <minIni.h>
  8. typedef struct {
  9. void* serialize;
  10. void* deserialize;
  11. } INI_ConfigSerializerPair;
  12. struct INI_ConfigItem;
  13. typedef void INI_ConfigLoadType(struct INI_ConfigItem*, const char*);
  14. typedef enum {
  15. INI_CONFIG_SAVE_ITEM_ERROR = -1,
  16. INI_CONFIG_SAVE_ITEM_OK,
  17. } INI_ConfigSaveItemResult;
  18. typedef INI_ConfigSaveItemResult INI_ConfigSaveType(struct INI_ConfigItem*, const char*);
  19. typedef void INI_ConfigOverrideType(struct INI_ConfigItem*, uint8_t, const char*[]);
  20. typedef struct {
  21. size_t size;
  22. INI_ConfigLoadType* load;
  23. INI_ConfigSaveType* save;
  24. INI_ConfigOverrideType* override;
  25. } INI_ConfigTypeFns;
  26. typedef struct INI_ConfigItem {
  27. INI_ConfigTypeFns fns;
  28. const char* section;
  29. const char* key;
  30. const char* cmdline_option;
  31. const void* default_value;
  32. void* validator;
  33. INI_ConfigSerializerPair transformer;
  34. void* dest;
  35. } INI_ConfigItem;
  36. void INI_ConfigGetDefaultPath(char*, size_t);
  37. const char* INI_ConfigGetCommandlineOption(uint8_t, const char*[], const char*);
  38. typedef enum {
  39. INI_CONFIG_INITIALIZE_RESULT_ERROR = -1,
  40. INI_CONFIG_INITIALIZE_RESULT_OK,
  41. INI_CONFIG_INITIALIZE_RESULT_WARNING
  42. } INI_ConfigInitializeResult;
  43. INI_ConfigInitializeResult INI_ConfigInitialize(INI_ConfigItem[], const char*, uint8_t, const char*[]);
  44. typedef int32_t INI_ConfigSaveResult;
  45. INI_ConfigSaveResult INI_ConfigSave(INI_ConfigItem[], const char*);
  46. void INI_ConfigLoadU8(INI_ConfigItem*, const char*);
  47. void INI_ConfigLoadU16(INI_ConfigItem*, const char*);
  48. void INI_ConfigLoadI32(INI_ConfigItem*, const char*);
  49. void INI_ConfigLoadString(INI_ConfigItem*, const char*);
  50. INI_ConfigSaveItemResult INI_ConfigSaveU8(INI_ConfigItem*, const char*);
  51. INI_ConfigSaveItemResult INI_ConfigSaveU16(INI_ConfigItem*, const char*);
  52. INI_ConfigSaveItemResult INI_ConfigSaveI32(INI_ConfigItem*, const char*);
  53. INI_ConfigSaveItemResult INI_ConfigSaveString(INI_ConfigItem*, const char*);
  54. void INI_ConfigOverrideU8(INI_ConfigItem*, uint8_t, const char*[]);
  55. void INI_ConfigOverrideU16(INI_ConfigItem*, uint8_t, const char*[]);
  56. void INI_ConfigOverrideI32(INI_ConfigItem*, uint8_t, const char*[]);
  57. void INI_ConfigOverrideString(INI_ConfigItem*, uint8_t, const char*[]);
  58. #define INI_CONFIG_TYPE_FNS_I32 (INI_ConfigTypeFns) { \
  59. .size = sizeof(int32_t), \
  60. .load = INI_ConfigLoadI32, \
  61. .save = INI_ConfigSaveI32, \
  62. .override = INI_ConfigOverrideI32, \
  63. }
  64. #define INI_CONFIG_TYPE_FNS_U16 (INI_ConfigTypeFns) { \
  65. .size = sizeof(uint16_t), \
  66. .load = INI_ConfigLoadU16, \
  67. .save = INI_ConfigSaveU16, \
  68. .override = INI_ConfigOverrideU16, \
  69. }
  70. #define INI_CONFIG_TYPE_FNS_U8 (INI_ConfigTypeFns) { \
  71. .size = sizeof(uint8_t), \
  72. .load = INI_ConfigLoadU8, \
  73. .save = INI_ConfigSaveU8, \
  74. .override = INI_ConfigOverrideU8, \
  75. }
  76. #define INI_CONFIG_TYPE_FNS_VOID (INI_ConfigTypeFns) { \
  77. .size = 0, \
  78. .load = NULL, \
  79. .save = NULL, \
  80. .override = NULL, \
  81. }
  82. #define INI_CONFIG_TYPE_FNS_STRING(X) (INI_ConfigTypeFns) { \
  83. .size = (X), \
  84. .load = INI_ConfigLoadString, \
  85. .save = INI_ConfigSaveString, \
  86. .override = INI_ConfigOverrideString, \
  87. }
  88. #define INI_CONFIG_ITEM_NULL (INI_ConfigItem) { \
  89. INI_CONFIG_TYPE_FNS_VOID, \
  90. NULL, \
  91. NULL, \
  92. NULL, \
  93. NULL, \
  94. NULL, \
  95. { \
  96. .serialize = NULL, \
  97. .deserialize = NULL, \
  98. }, \
  99. NULL, \
  100. }
  101. #endif