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.

156 lines
4.4 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_ConfigTransformer;
  12. struct INI_ConfigItem;
  13. typedef void INI_ConfigTypeLoad(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_ConfigTypeSave(struct INI_ConfigItem*, const char*);
  19. typedef void INI_ConfigTypeOverride(struct INI_ConfigItem*, uint8_t, const char*[]);
  20. typedef struct {
  21. size_t size;
  22. INI_ConfigTypeLoad* load;
  23. INI_ConfigTypeSave* save;
  24. INI_ConfigTypeOverride* override;
  25. } INI_ConfigType;
  26. typedef struct INI_ConfigItem {
  27. INI_ConfigType type;
  28. const char* section;
  29. const char* key;
  30. const char* cmdline_option;
  31. const void* default_value;
  32. void* validator;
  33. INI_ConfigTransformer 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_ConfigLoadU32(INI_ConfigItem*, const char*);
  49. void INI_ConfigLoadI8(INI_ConfigItem*, const char*);
  50. void INI_ConfigLoadI16(INI_ConfigItem*, const char*);
  51. void INI_ConfigLoadI32(INI_ConfigItem*, const char*);
  52. void INI_ConfigLoadString(INI_ConfigItem*, const char*);
  53. INI_ConfigSaveItemResult INI_ConfigSaveU8(INI_ConfigItem*, const char*);
  54. INI_ConfigSaveItemResult INI_ConfigSaveU16(INI_ConfigItem*, const char*);
  55. INI_ConfigSaveItemResult INI_ConfigSaveU32(INI_ConfigItem*, const char*);
  56. INI_ConfigSaveItemResult INI_ConfigSaveI8(INI_ConfigItem*, const char*);
  57. INI_ConfigSaveItemResult INI_ConfigSaveI16(INI_ConfigItem*, const char*);
  58. INI_ConfigSaveItemResult INI_ConfigSaveI32(INI_ConfigItem*, const char*);
  59. INI_ConfigSaveItemResult INI_ConfigSaveString(INI_ConfigItem*, const char*);
  60. void INI_ConfigOverrideU8(INI_ConfigItem*, uint8_t, const char*[]);
  61. void INI_ConfigOverrideU16(INI_ConfigItem*, uint8_t, const char*[]);
  62. void INI_ConfigOverrideU32(INI_ConfigItem*, uint8_t, const char*[]);
  63. void INI_ConfigOverrideI8(INI_ConfigItem*, uint8_t, const char*[]);
  64. void INI_ConfigOverrideI16(INI_ConfigItem*, uint8_t, const char*[]);
  65. void INI_ConfigOverrideI32(INI_ConfigItem*, uint8_t, const char*[]);
  66. void INI_ConfigOverrideString(INI_ConfigItem*, uint8_t, const char*[]);
  67. #define INI_CONFIG_TYPE_U8 (INI_ConfigType) { \
  68. .size = sizeof(uint8_t), \
  69. .load = INI_ConfigLoadU8, \
  70. .save = INI_ConfigSaveU8, \
  71. .override = INI_ConfigOverrideU8, \
  72. }
  73. #define INI_CONFIG_TYPE_U16 (INI_ConfigType) { \
  74. .size = sizeof(uint16_t), \
  75. .load = INI_ConfigLoadU16, \
  76. .save = INI_ConfigSaveU16, \
  77. .override = INI_ConfigOverrideU16, \
  78. }
  79. #define INI_CONFIG_TYPE_U32 (INI_ConfigType) { \
  80. .size = sizeof(uint32_t), \
  81. .load = INI_ConfigLoadU32, \
  82. .save = INI_ConfigSaveU32, \
  83. .override = INI_ConfigOverrideU32, \
  84. }
  85. #define INI_CONFIG_TYPE_I8 (INI_ConfigType) { \
  86. .size = sizeof(int8_t), \
  87. .load = INI_ConfigLoadI8, \
  88. .save = INI_ConfigSaveI8, \
  89. .override = INI_ConfigOverrideI8, \
  90. }
  91. #define INI_CONFIG_TYPE_I16 (INI_ConfigType) { \
  92. .size = sizeof(int16_t), \
  93. .load = INI_ConfigLoadI16, \
  94. .save = INI_ConfigSaveI16, \
  95. .override = INI_ConfigOverrideI16, \
  96. }
  97. #define INI_CONFIG_TYPE_I32 (INI_ConfigType) { \
  98. .size = sizeof(int32_t), \
  99. .load = INI_ConfigLoadI32, \
  100. .save = INI_ConfigSaveI32, \
  101. .override = INI_ConfigOverrideI32, \
  102. }
  103. #define INI_CONFIG_TYPE_FNS_STRING(X) (INI_ConfigType) { \
  104. .size = (sizeof(char) * X), \
  105. .load = INI_ConfigLoadString, \
  106. .save = INI_ConfigSaveString, \
  107. .override = INI_ConfigOverrideString, \
  108. }
  109. #define INI_CONFIG_TRANSFORMER_NONE (INI_ConfigTransformer) { \
  110. .serialize = NULL, \
  111. .deserialize = NULL, \
  112. }
  113. #define INI_CONFIG_ITEM_NULL (INI_ConfigItem) { \
  114. (INI_ConfigType) { \
  115. .size = 0, \
  116. .load = NULL, \
  117. .save = NULL, \
  118. .override = NULL, \
  119. }, \
  120. NULL, \
  121. NULL, \
  122. NULL, \
  123. NULL, \
  124. NULL, \
  125. INI_CONFIG_TRANSFORMER_NONE, \
  126. NULL, \
  127. }
  128. #endif