Guest User

Untitled

a guest
Jun 22nd, 2013
219
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.26 KB | None | 0 0
  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.  
  8.  
  9. #pragma dynamic 45000 // Change accordingly!!
  10.  
  11. #if defined MAX_STRING
  12. #define INI_MAX_VALUE MAX_STRING
  13. #else
  14. #define INI_MAX_VALUE 256
  15. #endif
  16. #define INI_MAX_KEY 32
  17. #define INI_MAX_LINE (INI_MAX_KEY + INI_MAX_VALUE + 3)
  18. #define INI_MAX_FILENAME 256
  19. #define INI_MAX_LINES 2048
  20.  
  21.  
  22. enum E_CACHE
  23. {
  24. E_KEY[INI_MAX_KEY],
  25. E_VALUE[INI_MAX_VALUE]
  26. }
  27.  
  28. enum E_FILE
  29. {
  30. E_FILENAME[INI_MAX_FILENAME],
  31. bool: E_OPEN
  32. }
  33.  
  34. static gCache[INI_MAX_LINES][E_CACHE];
  35. static gEmptyCache[E_CACHE];
  36. static gFile[E_FILE];
  37. static gNoFile[E_FILE];
  38.  
  39.  
  40. #define INI_Exist fexist
  41.  
  42.  
  43. stock INI_Open(const filename[])
  44. {
  45. if (!filename[0]) return false;
  46. if (gFile[E_OPEN])
  47. {
  48. if (!strcmp(gFile[E_FILENAME], filename, true)) return true;
  49. //return false;
  50. INI_Close();
  51. }
  52. new File: h;
  53. h = fopen(filename, io_readwrite);
  54. if (h)
  55. {
  56. INI_strcpy(gFile[E_FILENAME], filename, INI_MAX_FILENAME, INI_MAX_FILENAME);
  57. new line[INI_MAX_LINE];
  58. new ln = -1;
  59. new separator;
  60. while (((ln + 1) < INI_MAX_LINES) && (fread(h, line)))
  61. {
  62. ln ++;
  63. INI_StripLine(line);
  64. separator = strfind(line, "=", false);
  65. if ((line[0] == ';') || (line[0] == '=') || (separator == -1) || (separator > INI_MAX_KEY))
  66. {
  67. if (line[0] == ';')
  68. {
  69. INI_strcpy(gCache[ln][E_VALUE], line, INI_MAX_VALUE, INI_MAX_VALUE);
  70. }
  71. else
  72. {
  73. INI_strcpy(gCache[ln][E_VALUE][1], line, INI_MAX_VALUE - 1, INI_MAX_VALUE - 1);
  74. gCache[ln][E_VALUE][0] = ';';
  75. }
  76. continue;
  77. }
  78. INI_strcpy(gCache[ln][E_KEY], line, separator, INI_MAX_KEY);
  79. INI_strcpy(gCache[ln][E_VALUE], line[separator + 1], INI_MAX_VALUE, INI_MAX_VALUE);
  80. if (!gCache[ln][E_VALUE][0]) gCache[ln][E_VALUE][0] = ' ';
  81. }
  82. fclose(h);
  83. gFile[E_OPEN] = true;
  84. return 1;
  85. }
  86. return 0;
  87. }
  88.  
  89.  
  90. stock INI_Save()
  91. {
  92. if (!gFile[E_OPEN]) return false;
  93. new File: h;
  94. h = fopen(gFile[E_FILENAME], io_write);
  95. if (h)
  96. {
  97. new line[INI_MAX_LINE];
  98. new ln = -1;
  99. while (((ln + 1) < INI_MAX_LINES) && (gCache[ln + 1][E_VALUE][0]))
  100. {
  101. ln ++;
  102. if (gCache[ln][E_VALUE][0] == ';')
  103. {
  104. if (gCache[ln][E_VALUE][1])
  105. {
  106. format(line, sizeof(line), "%s\r\n", gCache[ln][E_VALUE]);
  107. fwrite(h, line);
  108. continue;
  109. }
  110. fwrite(h, "\r\n");
  111. continue;
  112. }
  113. format(line, sizeof(line), "%s=%s\r\n", gCache[ln][E_KEY], gCache[ln][E_VALUE]);
  114. fwrite(h, line);
  115. }
  116. fclose(h);
  117. return true;
  118. }
  119. return false;
  120. }
  121.  
  122.  
  123. stock INI_Close()
  124. {
  125. if (!gFile[E_OPEN]) return false;
  126. for (new ln; ln < INI_MAX_LINES; ln++) gCache[ln] = gEmptyCache;
  127. gFile = gNoFile;
  128. return true;
  129. }
  130.  
  131.  
  132. stock INI_ReadString(dest[], const key[], maxlength = sizeof(dest))
  133. {
  134. if ((!gFile[E_OPEN]) || (!key[0])) return false;
  135. new ln = -1;
  136. while (((ln + 1) < INI_MAX_LINES) && (gCache[ln + 1][E_VALUE][0]))
  137. {
  138. ln ++;
  139. if (gCache[ln][E_VALUE][0] == ';') continue;
  140. if (!strcmp(gCache[ln][E_KEY], key, false))
  141. {
  142. INI_strcpy(dest, gCache[ln][E_VALUE], INI_MAX_VALUE, maxlength);
  143. return true;
  144. }
  145. }
  146. return false;
  147. }
  148.  
  149. stock bool:INI_Isset(const key[])
  150. {
  151. if ((!gFile[E_OPEN]) || (!key[0])) return false;
  152. new ln = -1;
  153. while (((ln + 1) < INI_MAX_LINES) && (gCache[ln + 1][E_VALUE][0]))
  154. {
  155. ln ++;
  156. if (gCache[ln][E_VALUE][0] == ';') continue;
  157. if (!strcmp(gCache[ln][E_KEY], key, false))
  158. {
  159. return true;
  160. }
  161. }
  162. return false;
  163. }
  164.  
  165. stock INI_ReadInt(const key[])
  166. {
  167. new dest[12];
  168. if (INI_ReadString(dest, key)) return strval(dest);
  169. return false;
  170. }
  171.  
  172.  
  173. stock Float: INI_ReadFloat(const key[])
  174. {
  175. new dest[12];
  176. if (INI_ReadString(dest, key)) return floatstr(dest);
  177. return 0.0;
  178. }
  179.  
  180. stock INI_ReturnString(const key[])
  181. {
  182. new dest[64];
  183. INI_ReadString(dest,key);
  184. return dest;
  185. }
  186.  
  187. stock INI_WriteString(const key[], const value[])
  188. {
  189. if ((!gFile[E_OPEN]) || (!key[0]) || (key[0] == ';') || (strfind(key, "=", false) != -1)) return false;
  190. new ln = -1;
  191. while (((ln + 1) < INI_MAX_LINES) && (gCache[ln + 1][E_VALUE][0]))
  192. {
  193. ln ++;
  194. if (gCache[ln][E_VALUE][0] == ';') continue;
  195. if (!strcmp(gCache[ln][E_KEY], key, false))
  196. {
  197. INI_strcpy(gCache[ln][E_VALUE], value, INI_MAX_VALUE, INI_MAX_VALUE);
  198. return true;
  199. }
  200. }
  201. ln ++;
  202. if (ln < INI_MAX_LINES)
  203. {
  204. INI_strcpy(gCache[ln][E_KEY], key, INI_MAX_KEY, INI_MAX_KEY);
  205. INI_strcpy(gCache[ln][E_VALUE], value, INI_MAX_VALUE, INI_MAX_VALUE);
  206. return true;
  207. }
  208. return false;
  209. }
  210.  
  211.  
  212. stock INI_WriteInt(const key[], value)
  213. {
  214. new dest[12];
  215. format(dest, sizeof(dest), "%i", value);
  216. return INI_WriteString(key, dest);
  217. }
  218.  
  219. stock bool:INI_ReadBool(const key[])
  220. {
  221. return INI_ReadInt(key)==1?true:false;
  222. }
  223. stock INI_WriteBool(const key[],bool:value)
  224. {
  225. INI_WriteInt(key,value==true?1:0);
  226. }
  227.  
  228. stock INI_WriteFloat(const key[], Float: value)
  229. {
  230. new dest[12];
  231. format(dest, sizeof(dest), "%0.4f", value);
  232. return INI_WriteString(key, dest);
  233. }
  234.  
  235.  
  236. stock INI_RemoveEntry(const key[])
  237. {
  238. if ((!gFile[E_OPEN]) || (!key[0]) || (strfind(key, "=", false) != -1)) return false;
  239. new ln = -1;
  240. while (((ln + 1) < INI_MAX_LINES) && (gCache[ln + 1][E_VALUE][0]))
  241. {
  242. ln ++;
  243. if (gCache[ln][E_VALUE][0] == ';') continue;
  244. if (!strcmp(gCache[ln][E_KEY], key, false))
  245. {
  246. for (; ln < (INI_MAX_LINES - 1); ln ++)
  247. {
  248. INI_strcpy(gCache[ln][E_KEY], gCache[ln + 1][E_KEY], INI_MAX_KEY, INI_MAX_KEY);
  249. INI_strcpy(gCache[ln][E_VALUE], gCache[ln + 1][E_VALUE], INI_MAX_VALUE, INI_MAX_VALUE);
  250. }
  251. return true;
  252. }
  253. }
  254. return false;
  255. }
  256.  
  257.  
  258. stock INI_Remove(const filename[])
  259. {
  260. if (!filename[0]) return false;
  261. if ((gFile[E_OPEN]) && (!strcmp(gFile[E_FILENAME], filename, true))) gFile = gNoFile;
  262. return fremove(filename);
  263. }
  264.  
  265.  
  266. stock INI_strcpy(dest[], const source[], numcells = sizeof(source), maxlength = sizeof(dest))
  267. {
  268. new i;
  269. while ((source[i]) && (i < numcells) && (i < maxlength))
  270. {
  271. dest[i] = source[i];
  272. i ++;
  273. }
  274. dest[(i == maxlength) ? (i - 1) : (i)] = '\0';
  275. }
  276.  
  277.  
  278. stock INI_StripLine(string[])
  279. {
  280. new l;
  281. l = strlen(string);
  282. if (string[l - 2] == '\r') string[l - 2] = '\0';
  283. if (string[l - 1] == '\n') string[l - 1] = '\0';
  284. }
Advertisement
Add Comment
Please, Sign In to add comment