Advertisement
DraKiNs

[Include] bIni 3.0

Oct 3rd, 2011
465
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 11.49 KB | None | 0 0
  1. ////////////////////////////////////////////////////////////////////////////////
  2. //
  3. //
  4. //        #### ########   ######     ######## ########    ###    ##     ##
  5. //         ##  ##     ## ##    ##       ##    ##         ## ##   ###   ###
  6. //         ##  ##     ## ##             ##    ##        ##   ##  #### ####
  7. //         ##  ########   ######        ##    ######   ##     ## ## ### ##
  8. //         ##  ##              ##       ##    ##       ######### ##     ##
  9. //         ##  ##        ##    ##       ##    ##       ##     ## ##     ##
  10. //        #### ##         ######        ##    ######## ##     ## ##     ##
  11. //
  12. //
  13. //            Criado por Bruno da Silva (iPs DraKiNs) and [S]trong
  14. //                           Special thanks to Double-O-Seven
  15. //
  16. //                        !!!   NOW COMPACTIBLE DINI AND DOF2 FILES   !!!
  17. //
  18. //          Acesse meu blog sobre programação www.ips-team.blogspot.com
  19. //
  20. //          [iPs]TeaM soluções de programação em geral (agora com cursos)
  21. //
  22. //                  www.ips-team.6te.net/smforum (contate-nos)
  23. //
  24. //              [iPs]Ini Files (pós fini 5.0) Versão 3.0 (ultra rápido)
  25. //
  26. //
  27. /////////////////////////////////////////////////////////////////////////////////
  28.  
  29.  
  30. // Funções Atuais:
  31.  
  32. //   CallBack INI_WriteString("key", "valor")
  33. //   CallBack INI_WriteFloat("key", valor)
  34. //   CallBack INI_WriteInt("key", valor)
  35. //   CallBack INI_WriteBool("key", bool:valor)
  36.  
  37. //   CallBack INI_ReadString("key")
  38. //   CallBack INI_ReadInt("key")
  39. //   CallBack INI_ReadFloat("key")
  40. //   CallBack INI_ReadBool("key")
  41.  
  42. //   CallBack INI_Create()
  43. //   CallBack INI_Delete()
  44. //   CallBack INI_Open("arquivo")
  45.  
  46. //   CallBack INI_Isset("tag")
  47. //   CallBack INI_Print()
  48.  
  49. //   CallBack INI_Close()
  50. //   CallBack INI_Save()
  51.  
  52. #pragma dynamic 45000
  53. #define MAX_LINES       999
  54. #define MAX_CHARS   256
  55.  
  56. #define CallBack%0(%1)  stock %0(%1)
  57. #define Variable%0<%1>          static stock %0[%1]
  58.  
  59.  
  60. #define strcpy(%0,%1,%2)        strcat((%0[0] = EOS, %0), %1, %2 + 1)
  61.  
  62. #define INI_Isset(%0)           (INI_ReadInt(tagExists) == 0xFF)
  63. #define INI_Create(%1)          fclose(fopen(%1, io_write))
  64. #define INI_WriteBool(%0, %1)       INI_WriteString(%0, %1 ? ("true") : ("false"))
  65. #define INI_ReadInt(%0)         strval(INI_ReadString(%0))
  66. #define INI_ReadFloat(%0)       floatstr(INI_ReadString(%0))
  67. #define INI_Delete(%0)          fremove(%0)
  68.  
  69. ////////////////////////////////////////////////////////////////////////////////
  70.  
  71.  
  72.  
  73.  
  74. Variable nomeKey        <MAX_LINES>[MAX_CHARS >>> 1];
  75. Variable valorKey       <MAX_LINES>[MAX_CHARS >>> 1];
  76. Variable valorNumerico  <MAX_LINES>;
  77. Variable nomeArquivo    <MAX_CHARS / 2>;
  78. new totalLinhas = 0;
  79.  
  80. ////////////////////////////////////////////////////////////////////////////////
  81.  
  82.  
  83. static stringTemporariaRetornar[MAX_CHARS / 2] = "255";
  84.  
  85. CallBack INI_ReadString(keyGet[])
  86. {  
  87.     new i = 0, valorGetNumerico = INI_HashString(keyGet);
  88.  
  89.    
  90.     for(i = 0;  i != totalLinhas ; ++i) if(valorGetNumerico == valorNumerico[i])
  91.     {      
  92.         if(strcmp(nomeKey[i], keyGet, false)) continue;
  93.  
  94.         return valorKey[i];
  95.     }  
  96.     return stringTemporariaRetornar;
  97. }
  98.  
  99.  
  100.  
  101. ////////////////////////////////////////////////////////////////////////////////
  102.  
  103. CallBack INI_Open(arquivoLer[])
  104. {
  105.     if((strlen(nomeKey[0]) || strlen(valorKey[0]))) INI_Save(), INI_Close();
  106.  
  107.     new
  108.         bufferArquivo[MAX_CHARS],
  109.  
  110.         linhasArquivo = 0xFFFFFFFF,
  111.  
  112.         bufferIntArquivo = 0xFFFFFFFF,
  113.  
  114.         File:arquivoFopen = fopen(arquivoLer, io_read);
  115.  
  116.  
  117.     format(nomeArquivo, MAX_CHARS >>> 2, arquivoLer);
  118.  
  119.     while(fread(arquivoFopen, bufferArquivo))
  120.     {
  121.  
  122.         bufferIntArquivo = strfind(bufferArquivo, "=", true);
  123.  
  124.         if(bufferIntArquivo == -1 || bufferIntArquivo > MAX_CHARS) continue;
  125.        
  126.         #if defined DOF2_SetInt
  127.         {
  128.             ++bufferIntArquivo;
  129.         }
  130.         #endif
  131.  
  132.         bufferArquivo[strlen(bufferArquivo) - 2]  = '\0';
  133.  
  134.         format(valorKey[++linhasArquivo], MAX_CHARS >>> 1, bufferArquivo[bufferIntArquivo+1]);
  135.  
  136.         #if defined DOF2_SetInt
  137.         {
  138.             bufferIntArquivo =- 2;
  139.         }
  140.         #endif
  141.  
  142.         bufferArquivo[bufferIntArquivo] = EOS;
  143.  
  144.         format(nomeKey[linhasArquivo], MAX_CHARS >>> 1, bufferArquivo);
  145.  
  146.         valorNumerico[linhasArquivo] = INI_HashString(bufferArquivo);
  147.  
  148.  
  149.     }
  150.     totalLinhas = linhasArquivo+1;
  151.  
  152.     return fclose(arquivoFopen), true;
  153. }
  154.  
  155.  
  156. ////////////////////////////////////////////////////////////////////////////////
  157.  
  158. CallBack INI_HashString(buffer[])
  159. {
  160.     new totalContado = 0;
  161.     for(new i = strlen(buffer); i != -1; i--)
  162.     {
  163.         totalContado += buffer[i];
  164.     }
  165.     return  totalContado;
  166. }
  167.  
  168. ////////////////////////////////////////////////////////////////////////////////
  169.  
  170. CallBack INI_Save()
  171. {
  172.     new
  173.         i = 0,
  174.         line[MAX_CHARS]
  175.     ;
  176.  
  177.     new File:arquivoFopen = fopen(nomeArquivo, io_write);
  178.  
  179.     for( ; i != totalLinhas ; ++i)
  180.     {      
  181.         format(line, MAX_CHARS, "%s=%s\r\n", nomeKey[i], valorKey[i]);
  182.         fwrite(arquivoFopen, line);
  183.     }
  184.     return fclose(arquivoFopen);
  185. }
  186.  
  187. ////////////////////////////////////////////////////////////////////////////////
  188.  
  189. CallBack INI_Print()
  190. {
  191.     for(new i ; i != totalLinhas ; ++i)
  192.     {
  193.         printf("%s=%s",nomeKey[i],valorKey[i]);
  194.     }
  195.     return true;
  196. }
  197.  
  198. ////////////////////////////////////////////////////////////////////////////////
  199.  
  200. CallBack INI_Close()
  201. {
  202.     nomeArquivo[0] = EOS;
  203.    
  204.     for(new i; i != totalLinhas ; ++i)
  205.     {
  206.         nomeKey[i][0] = EOS;
  207.         valorKey[i][0] = EOS;
  208.         valorNumerico[i] = 0;
  209.     }  
  210.     return totalLinhas = 0, true;
  211. }
  212.  
  213. ////////////////////////////////////////////////////////////////////////////////
  214.  
  215. CallBack INI_WriteString(keySet[], valueSet[])
  216. {
  217.    
  218.     new i, valorGetNumerico = INI_HashString(keySet);
  219.  
  220.  
  221.     for( ;  i != totalLinhas ; ++i) if(valorGetNumerico == valorNumerico[i])
  222.     {
  223.         if(strcmp(nomeKey[i], keySet, false)) continue;
  224.  
  225.         return strcpy(valorKey[i], valueSet, MAX_CHARS);       
  226.     }
  227.     valorNumerico[i]=valorGetNumerico ;
  228.  
  229.     return strcpy(nomeKey[i], keySet, MAX_CHARS), strcpy(valorKey[i], valueSet, MAX_CHARS), totalLinhas++, true;
  230. }
  231.  
  232.  
  233. ////////////////////////////////////////////////////////////////////////////////
  234.  
  235. CallBack INI_ReadBool(keySet[], valueSet)
  236. {
  237.     static destinoString[20];
  238.     format(destinoString, sizeof(destinoString), "%i", valueSet);
  239.     return !strcmp(destinoString, "false") ? (false) : (true);
  240. }
  241.  
  242.  
  243. ////////////////////////////////////////////////////////////////////////////////
  244.  
  245. CallBack INI_WriteInt(keySet[], valueSet)
  246. {
  247.     static destinoString[20];
  248.     format(destinoString, sizeof(destinoString), "%i", valueSet);
  249.     return INI_WriteString(keySet, destinoString);
  250. }
  251.  
  252. ////////////////////////////////////////////////////////////////////////////////
  253.  
  254. CallBack INI_WriteFloat(keySet[],Float:valueSet)
  255. {
  256.     static destinoString[20];
  257.     format(destinoString, sizeof(destinoString), "%f", valueSet);
  258.    
  259.     return INI_WriteString(keySet, destinoString);
  260. }
  261.  
  262.  
  263. /*
  264.  *            Dini 1.5.1
  265.  *       (c) Copyright 2006 by DracoBlue
  266.  *
  267.  * @author    : DracoBlue (http://dracoblue.com)
  268.  * @date      : 13th May 2006
  269.  * @update    : 2rd Oct 2011 (Bruno da Silva bIni dini Update)
  270.  * @require   : DUtils 1.8
  271.  *
  272.  * This file is provided as is (no warranties).
  273.  *
  274.  * Feel free to use it, a little message in
  275.  * about box is honouring thing, isn't it?
  276.  *
  277.  */
  278.  
  279.  
  280. #define MAX_STRING 0xFF
  281. #if defined _dini_included
  282.   #endinput
  283. #endif
  284.  
  285. #define _dini_included
  286. #pragma library dini
  287.  
  288. #if defined MAX_STRING
  289. #define DINI_MAX_STRING MAX_STRING
  290. #else
  291. #define DINI_MAX_STRING 255
  292. #endif
  293.  
  294. stock dini_Exists(filename[]) {
  295.     return fexist(filename);
  296. }
  297.  
  298. stock dini_Remove(filename[]) {
  299.     return fremove(filename);
  300. }
  301.  
  302. stock dini_Create(filename[]) {
  303.     if (fexist(filename)) return false;
  304.     new File:fhnd;
  305.     fhnd=fopen(filename,io_write);
  306.     if (fhnd) {
  307.         fclose(fhnd);
  308.         return true;
  309.     }
  310.     return false;
  311. }
  312.  
  313. stock  dini_Set(filename[],key[],value[])
  314. {
  315.     static
  316.         antigoFile[48]
  317.     ;
  318.  
  319.     if(!strcmp(filename, antigoFile, true) && strlen(antigoFile))
  320.     {
  321.        
  322.         INI_WriteString(key, value);       
  323.     }
  324.     else
  325.     {
  326.         if(strlen(antigoFile) > 1)
  327.         {
  328.             INI_Save(), INI_Close();
  329.         }
  330.  
  331.         INI_Open(filename);
  332.  
  333.         format(antigoFile, 48, filename);
  334.  
  335.         INI_WriteString(key, value);   
  336.  
  337.        
  338.     }  
  339.     return true;
  340. }
  341.  
  342.  
  343. stock  dini_Get(filename[], key[])
  344. {
  345.     static
  346.         antigoFile[48],
  347.         retornoValue[255]
  348.     ;
  349.  
  350.     if(!strcmp(filename, antigoFile, true) && strlen(antigoFile))
  351.     {
  352.         return retornoValue = INI_ReadString(key), retornoValue;
  353.     }
  354.  
  355.     if(strlen(antigoFile) > 1)
  356.     {
  357.         INI_Save(), INI_Close();
  358.     }
  359.  
  360.     INI_Open(filename);
  361.        
  362.     format(antigoFile, 48, filename);
  363.  
  364.     return retornoValue = INI_ReadString(key), retornoValue;
  365. }
  366.  
  367.  
  368. stock dini_IntSet(filename[],key[],value) {
  369.    new valuestring[DINI_MAX_STRING];
  370.    format(valuestring,DINI_MAX_STRING,"%d",value);
  371.    return dini_Set(filename,key,valuestring);
  372. }
  373.  
  374. stock dini_Int(filename[],key[]) {
  375.    return strval(dini_Get(filename,key));
  376. }
  377.  
  378. stock dini_FloatSet(filename[],key[],Float:value) {
  379.    new valuestring[DINI_MAX_STRING];
  380.    format(valuestring,DINI_MAX_STRING,"%f",value);
  381.    return dini_Set(filename,key,valuestring);
  382. }
  383.  
  384. stock Float:dini_Float(filename[],key[]) {
  385.    return floatstr(dini_Get(filename,key));
  386. }
  387.  
  388. stock dini_Bool(filename[],key[]) {
  389.    return strval(dini_Get(filename,key));
  390. }
  391.  
  392. stock dini_BoolSet(filename[],key[],value) {
  393.     if (value) {
  394.         return dini_Set(filename,key,"1");
  395.     }
  396.     return dini_Set(filename,key,"0");
  397. }
  398.  
  399. stock dini_Unset(filename[],key[]) {
  400.     // If we have no key, it can't be set
  401.     // we also have no chance to unset the key, if all together is bigger then the max string
  402.     new key_length = strlen(key);
  403.     if (key_length==0 || key_length+2>DINI_MAX_STRING) return false;
  404.    
  405.     new File:fohnd, File:fwhnd;
  406.     new tmpres[DINI_MAX_STRING];
  407.    
  408.     // Let's remove the old *.part file if there was one.
  409.     format(tmpres,DINI_MAX_STRING,"%s.part",filename);
  410.     fremove(tmpres);
  411.    
  412.     // We'll open the source file.
  413.     fohnd=fopen(filename,io_read);
  414.     if (!fohnd) return false;
  415.    
  416.     fwhnd=fopen(tmpres,io_write);
  417.     if (!fwhnd) {
  418.         // we can't open the second file for writing, so .. let's close the open one and exit.
  419.         fclose(fohnd);
  420.         return false;
  421.     }
  422.    
  423.     while (fread(fohnd,tmpres)) {
  424.         if (
  425.             tmpres[key_length]=='='
  426.             && !strcmp(tmpres, key, true, key_length)  
  427.         ) {
  428.                 // We've got what needs to be removed!
  429.         } else {
  430.             DINI_StripNewLine(tmpres);
  431.             fwrite(fwhnd,tmpres);
  432.             fwrite(fwhnd,"\r\n");
  433.         }
  434.     }
  435.    
  436.     fclose(fohnd);
  437.     fclose(fwhnd);
  438.  
  439.     format(tmpres,DINI_MAX_STRING,"%s.part",filename);
  440.     if (DINI_fcopytextfile(tmpres,filename)) {
  441.         return fremove(tmpres);
  442.     }
  443.     return false;
  444. }
  445.  
  446.  
  447.  
  448. stock  dini_Isset(filename[],key[]) {
  449.     new File:fohnd;
  450.     new tmpres[MAX_STRING];
  451.     fohnd=fopen(filename,io_read);
  452.     if (!fohnd) return false;
  453.     while (fread(fohnd,tmpres)) {
  454.         StripNewLine(tmpres);
  455.         if (equal(dini_PRIVATE_ExtractKey(tmpres),key,true)) {
  456.             /* We've got what we need */
  457.             fclose(fohnd);
  458.             return true;
  459.         }
  460.     }
  461.     fclose(fohnd);
  462.     return false;
  463. }
  464.  
  465. stock DINI_StripNewLine(string[]) {
  466.     new len = strlen(string);
  467.     if (string[0]==0) return ;
  468.     if ((string[len - 1] == '\n') || (string[len - 1] == '\r')) {
  469.         string[len - 1] = 0;
  470.         if (string[0]==0) return ;
  471.         if ((string[len - 2] == '\n') || (string[len - 2] == '\r')) string[len - 2] = 0;
  472.     }
  473. }
  474.  
  475. stock DINI_fcopytextfile(oldname[],newname[]) {
  476.     new File:ohnd,File:nhnd;
  477.     if (!fexist(oldname)) return false;
  478.     ohnd=fopen(oldname,io_read);
  479.     if (!ohnd) return false;
  480.     nhnd=fopen(newname,io_write);
  481.     if (!nhnd) {
  482.         fclose(ohnd);
  483.         return false;
  484.     }
  485.     new tmpres[DINI_MAX_STRING];
  486.     while (fread(ohnd,tmpres)) {
  487.         DINI_StripNewLine(tmpres);
  488.         format(tmpres,sizeof(tmpres),"%s\r\n",tmpres);
  489.         fwrite(nhnd,tmpres);
  490.     }
  491.     fclose(ohnd);
  492.     fclose(nhnd);
  493.     return true;
  494. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement