kvpconfig.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. #include "precompile.h"
  2. #include "kvpconfig.h"
  3. TOOLKIT_API int kvpconfig_init(struct kvpconfig_entry_t* pe, void *container)
  4. {
  5. struct kvpconfig_entry_t* entry = pe;
  6. while (entry && entry->key) {
  7. if (entry->type == KVP_INTEGER) {
  8. *(int*)((char*)container + entry->member_offset) = atoi(entry->default_value);
  9. } else if (entry->type == KVP_STRING) {
  10. char *tmp = _strdup(entry->default_value);
  11. char **member = (char**)((char*)container + entry->member_offset);
  12. *member = tmp;
  13. } else if (entry->type == KVP_BOOLEAN) {
  14. int *member = (int*)((char*)container + entry->member_offset);
  15. if (_stricmp(entry->default_value, "true") == 0 || _stricmp(entry->default_value, "1") == 0)
  16. *member = 1;
  17. else if (_stricmp(entry->default_value, "false") == 0 || _stricmp(entry->default_value, "0") == 0)
  18. *member = 0;
  19. else
  20. return -1;
  21. } else {
  22. assert(0);
  23. }
  24. entry++;
  25. }
  26. return 0;
  27. }
  28. TOOLKIT_API int kvpconfig_term(struct kvpconfig_entry_t* pe, void *container)
  29. {
  30. struct kvpconfig_entry_t* entry = pe;
  31. while (entry && entry->key) {
  32. if (entry->type == KVP_STRING) {
  33. char **member = (char**)((char*)container + entry->member_offset);
  34. if (*member)
  35. free(*member);
  36. }
  37. entry++;
  38. }
  39. return 0;
  40. }
  41. TOOLKIT_API int kvpconfig_set(struct kvpconfig_entry_t* pe,
  42. void *container,
  43. const char *key,
  44. const char *value)
  45. {
  46. struct kvpconfig_entry_t* entry = pe;
  47. while (entry && entry->key) {
  48. if (_stricmp(key, entry->key) == 0) {
  49. if (entry->type == KVP_INTEGER) {
  50. *(int*)((char*)container + entry->member_offset) = atoi(value);
  51. } else if (entry->type == KVP_STRING) {
  52. char **member = (char**)((char*)container + entry->member_offset);
  53. if (*member)
  54. free(*member);
  55. *member = _strdup(value);
  56. } else if (entry->type == KVP_BOOLEAN) {
  57. if (_stricmp(value, "true") == 0 || _stricmp(value, "1") == 0)
  58. *(int*)((char*)container + entry->member_offset) = 1;
  59. else if (_stricmp(value, "false") == 0 || _stricmp(value, "0") == 0)
  60. *(int*)((char*)container + entry->member_offset) = 0;
  61. else
  62. return -1;
  63. } else {
  64. assert(0);
  65. }
  66. return 0;
  67. }
  68. ++entry;
  69. }
  70. return -1;
  71. }
  72. TOOLKIT_API int kvpconfig_get(struct kvpconfig_entry_t* pe,
  73. void *container,
  74. const char *key,
  75. char *value)
  76. {
  77. struct kvpconfig_entry_t* entry = pe;
  78. while (entry && entry->key) {
  79. if (_stricmp(key, entry->key) == 0) {
  80. if (entry->type == KVP_INTEGER) {
  81. _itoa(*(int*)((char*)container + entry->member_offset), value, 10);
  82. } else if (entry->type == KVP_STRING) {
  83. strcpy(value, *(char**)((char*)container + entry->member_offset));
  84. } else if (entry->type == KVP_BOOLEAN) {
  85. int t = *(int*)((char*)container + entry->member_offset);
  86. strcpy(value, t ? "true" : "false");
  87. } else {
  88. assert(0);
  89. }
  90. return 0;
  91. }
  92. ++entry;
  93. }
  94. return -1;
  95. }