SII.inc 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. //======================================================
  2. // Slick's INI Include 2.0.7
  3. //
  4. // (c) Copyright 2008-2010, [DRuG]Slick
  5. // This file is provided as is (no warranties).
  6. //======================================================
  7. #pragma dynamic 45000 // Change accordingly!!
  8. #if defined MAX_STRING
  9. #define INI_MAX_VALUE MAX_STRING
  10. #else
  11. #define INI_MAX_VALUE 128
  12. #endif
  13. #define INI_MAX_KEY 24
  14. #define INI_MAX_LINE (INI_MAX_KEY + INI_MAX_VALUE + 3)
  15. #define INI_MAX_FILENAME 256
  16. #define INI_MAX_LINES 256
  17. enum E_CACHE
  18. {
  19. E_KEY[INI_MAX_KEY],
  20. E_VALUE[INI_MAX_VALUE]
  21. }
  22. enum E_FILE
  23. {
  24. E_FILENAME[INI_MAX_FILENAME],
  25. bool: E_OPEN
  26. }
  27. static gCache[INI_MAX_LINES][E_CACHE];
  28. static gEmptyCache[E_CACHE];
  29. static gFile[E_FILE];
  30. static gNoFile[E_FILE];
  31. #define INI_Exist fexist
  32. stock INI_Open(const filename[])
  33. {
  34. if (!filename[0]) return false;
  35. if (gFile[E_OPEN])
  36. {
  37. if (!strcmp(gFile[E_FILENAME], filename, true)) return true;
  38. //return false;
  39. INI_Close();
  40. }
  41. new File: h;
  42. h = fopen(filename, io_readwrite);
  43. if (h)
  44. {
  45. INI_strcpy(gFile[E_FILENAME], filename, INI_MAX_FILENAME, INI_MAX_FILENAME);
  46. new line[INI_MAX_LINE];
  47. new ln = -1;
  48. new separator;
  49. while (((ln + 1) < INI_MAX_LINES) && (fread(h, line)))
  50. {
  51. ln ++;
  52. INI_StripLine(line);
  53. separator = strfind(line, "=", false);
  54. if ((line[0] == ';') || (line[0] == '=') || (separator == -1) || (separator > INI_MAX_KEY))
  55. {
  56. if (line[0] == ';')
  57. {
  58. INI_strcpy(gCache[ln][E_VALUE], line, INI_MAX_VALUE, INI_MAX_VALUE);
  59. }
  60. else
  61. {
  62. INI_strcpy(gCache[ln][E_VALUE][1], line, INI_MAX_VALUE - 1, INI_MAX_VALUE - 1);
  63. gCache[ln][E_VALUE][0] = ';';
  64. }
  65. continue;
  66. }
  67. INI_strcpy(gCache[ln][E_KEY], line, separator, INI_MAX_KEY);
  68. INI_strcpy(gCache[ln][E_VALUE], line[separator + 1], INI_MAX_VALUE, INI_MAX_VALUE);
  69. if (!gCache[ln][E_VALUE][0]) gCache[ln][E_VALUE][0] = ' ';
  70. }
  71. fclose(h);
  72. gFile[E_OPEN] = true;
  73. return 1;
  74. }
  75. return 0;
  76. }
  77. stock INI_Save()
  78. {
  79. if (!gFile[E_OPEN]) return false;
  80. new File: h;
  81. h = fopen(gFile[E_FILENAME], io_write);
  82. if (h)
  83. {
  84. new line[INI_MAX_LINE];
  85. new ln = -1;
  86. while (((ln + 1) < INI_MAX_LINES) && (gCache[ln + 1][E_VALUE][0]))
  87. {
  88. ln ++;
  89. if (gCache[ln][E_VALUE][0] == ';')
  90. {
  91. if (gCache[ln][E_VALUE][1])
  92. {
  93. format(line, sizeof(line), "%s\r\n", gCache[ln][E_VALUE]);
  94. fwrite(h, line);
  95. continue;
  96. }
  97. fwrite(h, "\r\n");
  98. continue;
  99. }
  100. format(line, sizeof(line), "%s=%s\r\n", gCache[ln][E_KEY], gCache[ln][E_VALUE]);
  101. fwrite(h, line);
  102. }
  103. fclose(h);
  104. return true;
  105. }
  106. return false;
  107. }
  108. stock INI_Close()
  109. {
  110. if (!gFile[E_OPEN]) return false;
  111. for (new ln; ln < INI_MAX_LINES; ln++) gCache[ln] = gEmptyCache;
  112. gFile = gNoFile;
  113. return true;
  114. }
  115. stock INI_ReadString(dest[], const key[], maxlength = sizeof(dest))
  116. {
  117. if ((!gFile[E_OPEN]) || (!key[0])) return false;
  118. new ln = -1;
  119. while (((ln + 1) < INI_MAX_LINES) && (gCache[ln + 1][E_VALUE][0]))
  120. {
  121. ln ++;
  122. if (gCache[ln][E_VALUE][0] == ';') continue;
  123. if (!strcmp(gCache[ln][E_KEY], key, false))
  124. {
  125. INI_strcpy(dest, gCache[ln][E_VALUE], INI_MAX_VALUE, maxlength);
  126. return true;
  127. }
  128. }
  129. return false;
  130. }
  131. stock INI_ReadInt(const key[])
  132. {
  133. new dest[12];
  134. if (INI_ReadString(dest, key)) return strval(dest);
  135. return false;
  136. }
  137. stock Float: INI_ReadFloat(const key[])
  138. {
  139. new dest[12];
  140. if (INI_ReadString(dest, key)) return floatstr(dest);
  141. return 0.0;
  142. }
  143. stock INI_WriteString(const key[], const value[])
  144. {
  145. if ((!gFile[E_OPEN]) || (!key[0]) || (key[0] == ';') || (strfind(key, "=", false) != -1)) return false;
  146. new ln = -1;
  147. while (((ln + 1) < INI_MAX_LINES) && (gCache[ln + 1][E_VALUE][0]))
  148. {
  149. ln ++;
  150. if (gCache[ln][E_VALUE][0] == ';') continue;
  151. if (!strcmp(gCache[ln][E_KEY], key, false))
  152. {
  153. INI_strcpy(gCache[ln][E_VALUE], value, INI_MAX_VALUE, INI_MAX_VALUE);
  154. return true;
  155. }
  156. }
  157. ln ++;
  158. if (ln < INI_MAX_LINES)
  159. {
  160. INI_strcpy(gCache[ln][E_KEY], key, INI_MAX_KEY, INI_MAX_KEY);
  161. INI_strcpy(gCache[ln][E_VALUE], value, INI_MAX_VALUE, INI_MAX_VALUE);
  162. return true;
  163. }
  164. return false;
  165. }
  166. stock INI_WriteInt(const key[], value)
  167. {
  168. new dest[12];
  169. format(dest, sizeof(dest), "%i", value);
  170. return INI_WriteString(key, dest);
  171. }
  172. stock INI_WriteFloat(const key[], Float: value)
  173. {
  174. new dest[12];
  175. format(dest, sizeof(dest), "%0.4f", value);
  176. return INI_WriteString(key, dest);
  177. }
  178. stock INI_RemoveEntry(const key[])
  179. {
  180. if ((!gFile[E_OPEN]) || (!key[0]) || (strfind(key, "=", false) != -1)) return false;
  181. new ln = -1;
  182. while (((ln + 1) < INI_MAX_LINES) && (gCache[ln + 1][E_VALUE][0]))
  183. {
  184. ln ++;
  185. if (gCache[ln][E_VALUE][0] == ';') continue;
  186. if (!strcmp(gCache[ln][E_KEY], key, false))
  187. {
  188. for (; ln < (INI_MAX_LINES - 1); ln ++)
  189. {
  190. INI_strcpy(gCache[ln][E_KEY], gCache[ln + 1][E_KEY], INI_MAX_KEY, INI_MAX_KEY);
  191. INI_strcpy(gCache[ln][E_VALUE], gCache[ln + 1][E_VALUE], INI_MAX_VALUE, INI_MAX_VALUE);
  192. }
  193. return true;
  194. }
  195. }
  196. return false;
  197. }
  198. stock INI_Remove(const filename[])
  199. {
  200. if (!filename[0]) return false;
  201. if ((gFile[E_OPEN]) && (!strcmp(gFile[E_FILENAME], filename, true))) gFile = gNoFile;
  202. return fremove(filename);
  203. }
  204. stock INI_strcpy(dest[], const source[], numcells = sizeof(source), maxlength = sizeof(dest))
  205. {
  206. new i;
  207. while ((source[i]) && (i < numcells) && (i < maxlength))
  208. {
  209. dest[i] = source[i];
  210. i ++;
  211. }
  212. dest[(i == maxlength) ? (i - 1) : (i)] = '\0';
  213. }
  214. stock INI_StripLine(string[])
  215. {
  216. new l;
  217. l = strlen(string);
  218. if (string[l - 2] == '\r') string[l - 2] = '\0';
  219. if (string[l - 1] == '\n') string[l - 1] = '\0';
  220. }