Posted By

Tango on 07/06/14


Tagged

file include pawn samp gta


Versions (?)

Skript na prácu so súbormi typu ini


 / Published in: C
 

Skript vydaný pod Tangovou licenciou. Využíva viac RAM, aby obmedzil prístup k HDD. Podla testov je tento skript rýchlejší, než známy y_ini.

  1. #include <file>
  2.  
  3. #define _MAX_PARALEL 2 /* pocet suborov otvorenych naraz */
  4. #define _MAX_UDAJOV 5 /* pocet riadkov v subore */
  5. #define _MAX_ZNAKOV 52 /* pocet znakov na riadok */
  6. #define _MAX_BAJTOV 208 /* pocet bajtov na riadok */
  7. #define RIADOK_DLZKA _MAX_ZNAKOV
  8. #define ZAPISOVANIE 0
  9. #define CITANIE 1
  10.  
  11. #define VytvoritSubor(%0) fclose(fopen(%0, io_write))
  12. #define SuborExistuje(%0) fexist(%0)
  13.  
  14. static _menosuboru[_MAX_PARALEL][32];
  15. static _subory[_MAX_PARALEL][_MAX_UDAJOV][_MAX_ZNAKOV];
  16.  
  17. stock Subor:OtvoritSubor(menosuboru[], mod) {
  18. for (new i; i < _MAX_PARALEL; i++) {
  19. if (!_menosuboru[i][0]) {
  20. if (fexist(menosuboru)) {
  21. memcpy(_menosuboru[i], menosuboru, 0, 128, 32);
  22. if (mod) { /* ak citanie, naplnit cache */
  23. new File:handle = fopen(menosuboru, io_read);
  24. for (new j; j < _MAX_UDAJOV; j++)
  25. if (fread(handle, _subory[i][j]))
  26. strdel(_subory[i][j], strlen(_subory[i][j]) - 2, strlen(_subory[i][j]));
  27. else break;
  28. fclose(handle);
  29. }
  30. return Subor:i;
  31. }
  32. }
  33. }
  34. return Subor:-1;
  35. }
  36.  
  37. /* v tejto funkcii premenna _subory sa sprava ako cache - namiesto HDD sa cita z RAM */
  38. stock PrecitatString(Subor:handle, key[], string[]) {
  39. for (new i; i < _MAX_UDAJOV; i++) /* prehladat cache */
  40. if (!strfind(_subory[_:handle][i], key)) { /* if (strfind == 0) => ak nasiel */
  41. memcpy(string, _subory[_:handle][i][strlen(key) + 1], 0, _MAX_BAJTOV, _MAX_ZNAKOV);
  42. return;
  43. } /* cache miss */
  44. new najdene = -1, File:subor = fopen(_menosuboru[_:handle], io_read);
  45. naplnenie: /* naplnenie "cache" */
  46. for (new i; i < _MAX_UDAJOV; i++) {
  47. if (fread(subor, _subory[_:handle][i])) {
  48. strdel(_subory[_:handle][i], strlen(_subory[_:handle][i]) - 2, strlen(_subory[_:handle][i]));
  49. if (!strfind(_subory[_:handle][i], key))
  50. najdene = i;
  51. } else break;
  52. }
  53. if (najdene != -1) {
  54. fclose(subor);
  55. memcpy(string, _subory[_:handle][najdene][strlen(key) + 1], 0, _MAX_BAJTOV, _MAX_ZNAKOV);
  56. return;
  57. }
  58. goto naplnenie; /* uistite sa, ze key existuje, inak v tomto cykle zamrzne server */
  59. }
  60.  
  61. stock ZatvoritSubor(Subor:handle, mod) {
  62. if (!mod) _UlozitSubor(handle);
  63. else
  64. for (new i; i < _MAX_UDAJOV; i++)
  65. _subory[_:handle][i][0] = 0;
  66. _menosuboru[_:handle][0] = 0;
  67. }
  68.  
  69. static stock _UlozitSubor(Subor:handle) {
  70. new str[_MAX_ZNAKOV], pom, str2[24]; /* (MAX_ZNAKOV / 2) ~ strlen(key) */
  71. new File:ID, File:tmp;
  72. for (new i; (i < _MAX_UDAJOV) && _subory[_:handle][i][0]; i++)
  73. strins(_subory[_:handle][i], "\r\n", strlen(_subory[_:handle][i]));
  74. ID = fopen(_menosuboru[_:handle], io_readwrite);
  75. tmp = ftemp();
  76. while (fread(ID, str)) {
  77. pom = 0;
  78. memcpy(str2, str, 0, 96, 24);
  79. str2[strfind(str2, "=")] = 0; /* do docasneho retazca som skopiroval key */
  80. for (new i; i < _MAX_UDAJOV; i++) { /* ci ide iba o aktualizaciu udajov */
  81. if (!strfind(_subory[_:handle][i], str2)) {
  82. fwrite(tmp, _subory[_:handle][i]);
  83. _subory[_:handle][i][0] = 0;
  84. pom = 1;
  85. break;
  86. }
  87. }
  88. if (!pom) fwrite(tmp, str);
  89. }
  90. for (new i; i < _MAX_UDAJOV; i++) /* zapisem data, ktore este predtym neboli v subore */
  91. if (_subory[_:handle][i][0]) {
  92. fwrite(tmp, _subory[_:handle][i]);
  93. _subory[_:handle][i][0] = 0;
  94. }
  95. fseek(ID, 0, seek_start);
  96. fseek(tmp, 0, seek_start);
  97. while (fread(tmp, str)) /* z bufferu to zapisem do skutocneho suboru */
  98. fwrite(ID, str);
  99. fclose(tmp);
  100. fclose(ID);
  101. }
  102.  
  103. stock ZapisatString(Subor:handle, key[], string[]) { /* premenna _subory sa sprava ako buffer pre HDD */
  104. for (new i; i < _MAX_UDAJOV; i++) {
  105. if (!strfind(_subory[_:handle][i], key)) /* ak uz raz key zapisoval, nezapisem ho znovu */
  106. return;
  107. if (!_subory[_:handle][i][0]) { /* zapisem novy udaj na prazdne miesto v bufferi */
  108. memcpy(_subory[_:handle][i], key, 0, _MAX_BAJTOV, _MAX_ZNAKOV);
  109. strcat(_subory[_:handle][i], "=");
  110. strcat(_subory[_:handle][i], string); /* format bol pomalsi a cisto memcpy to blblo */
  111. return;
  112. }
  113. }
  114. _UlozitSubor(handle); /* ak sa nenaslo volne miesto, tak ulozit na disk a vyprazdnit buffer */
  115. return;
  116. }

Report this snippet  

You need to login to post a comment.