Advertisement
Guest User

Moonshaker 1.6a

a guest
Jan 6th, 2013
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 7.71 KB | None | 0 0
  1. /*
  2.     @author:    Mercsi
  3.     @name:      Moonshaker - Easy File reading & writing
  4.     @ver:       1.6a
  5.  
  6.     English version
  7.                                                                     in 2013
  8. */
  9.  
  10. // Includes -----------------------
  11. #include < A_SAMP >
  12.  
  13. // Macros -------------------------
  14.  
  15. // The maximum lenght of a line
  16. #define MAX_LINE_SIZE   (128)
  17. #define MAX_VALUE_SIZE  (32)
  18. #define MAX_KEY_SIZE    (32)
  19. #define MAX_FILE_SIZE   (64)
  20. #define MAX_LINES       (100)
  21.  
  22. // News ---------------------------
  23. new
  24.     INI_g_Value[MAX_LINES][MAX_VALUE_SIZE],     // Store value for each line.
  25.     INI_g_Key[MAX_LINES][MAX_KEY_SIZE],         // Store key for each line.
  26.     INI_g_FileN[MAX_FILE_SIZE],                 // Store filename o handled file.
  27.     File:INI_g_File,                            // Main variable for store file path.
  28.     INI_g_Line
  29.     ;
  30.  
  31. // Used to change mainfile to choosen
  32. stock INI_SetFile(targetfile[])
  33. {
  34.     new fh[200];
  35.     return format(fh, sizeof(fh), INI_g_FileN, targetfile);
  36. }
  37. // Return mainfile
  38. stock INI_GetFile()
  39.     return INI_g_FileN;
  40.  
  41. // Check if file exist
  42. stock INI_Exist(file[])
  43.     return fexist(file);
  44.  
  45. // Function for create a new file
  46. stock INI_Create(file[])
  47. {
  48.     if (!INI_Exist(file))
  49.     {
  50.         new File: f = fopen(file, io_append);
  51.  
  52.         if (fclose(f))
  53.         {
  54.             return 1;
  55.         }
  56.     }
  57.     return 0;
  58. }
  59.  
  60. /*
  61. *   Important function for load file
  62. *   This function must be called as firts of all
  63. *   other function (no for INI_Create function)
  64. */
  65.  
  66. stock INI_Load(file[])
  67. {
  68.     new
  69.         buf[MAX_LINE_SIZE],
  70.         line = -1,
  71.         pos
  72.     ;
  73.  
  74.     INI_g_File = fopen(file, io_read);
  75.     format(INI_g_FileN, MAX_FILE_SIZE, file);
  76.  
  77.     while(fread(INI_g_File, buf))
  78.     {
  79.         line++;
  80.         if(buf[strlen(buf)-2] == '\r')
  81.             buf[strlen(buf)-2] = EOS;
  82.  
  83.         if(buf[strlen(buf)-1] == '\n')
  84.             buf[strlen(buf)-1] = EOS;
  85.  
  86.         pos = charfind(buf, '=');
  87.  
  88.         new
  89.             start = 0,
  90.             key[MAX_KEY_SIZE],
  91.             value[MAX_VALUE_SIZE],
  92.             keylen, valuelen
  93.         ;
  94.             // Save key string
  95.         for (; start < pos; start++)
  96.         {
  97.             // pasting char
  98.             key [start] = buf[start];
  99.             if (!strcmp(buf[start], buf[pos], false))
  100.             keylen = buf[start];
  101.         }
  102.  
  103.         start = keylen + 1;
  104.  
  105.         for (; start < pos; start++)
  106.         {
  107.             value[start] = buf[start];
  108.             if (!strcmp(buf[start], buf[pos], false))
  109.                 valuelen = buf[start] - keylen;
  110.         }
  111.  
  112.         format(INI_g_Key[line], sizeof(INI_g_Key), key);
  113.         format(INI_g_Value[line], sizeof(INI_g_Value), value);
  114.  
  115.         // And increase lines value
  116.         INI_g_Line++;
  117.     }
  118.     return fclose(INI_g_File);
  119. }
  120.  
  121. // This remove file and erase global variable values
  122. stock INI_Remove(file[])
  123. {
  124.     if (file[0])
  125.     {
  126.         if (INI_g_FileN[0] && !strcmp(INI_g_FileN, file))
  127.             INI_g_FileN = EOS;
  128.  
  129.         return fremove(file);
  130.     }
  131.     return 0;
  132. }
  133.  
  134. // Used to read for boolean variables
  135. stock bool:INI_ReadBool(key[])
  136. {
  137.     new buf[16];
  138.     format(buf, sizeof(buf), "%s", INI_Read(key));
  139.     return (strval(buf) || (buf[0] && !strcmp(buf, "true", true)));
  140. }
  141.  
  142. // Used to read Hex strings
  143. stock INI_ReadHex(key[])
  144. {
  145.     new buf[16];
  146.     format(buf, sizeof(buf), "%d", B_Hash(key));
  147.     return INI_StrToHex(buf);
  148. }
  149.  
  150. // Used to read for float type of variable
  151. stock Float:INI_ReadFloat(key[])
  152.     return floatstr(INI_Read(key));
  153.  
  154. // Used to read integer type of variable
  155. stock INI_ReadInt(key[])
  156.     return strval(INI_Read(key));
  157.  
  158. /*
  159. *   This function is called from each function and
  160. *   type of variable is converted to respective type of called function
  161. */
  162. stock INI_Read(key[])
  163. {
  164.     new
  165.         line = -1
  166.     ;
  167.  
  168.     while((line < INI_g_Line) && (line < MAX_LINES))
  169.     {
  170.         line++;
  171.  
  172.         if (!strcmp(key, INI_g_Key[line], false))
  173.         {
  174.             return INI_g_Value[line];
  175.         }
  176.     }
  177.     return INI_g_Value[0];
  178. }
  179.  
  180. /*
  181. *   This write function is used for each function, which write value.
  182. *   Function is used for save string variable too.
  183. */
  184. stock INI_Write(key[], value[])
  185. {
  186.     if (key[0] && value[0])
  187.     {
  188.         new
  189.             bool:INI_l_Pos = false,
  190.             line = -1
  191.         ;
  192.  
  193.         if (!INI_g_FileN[0]) return 0;
  194.  
  195.         while((line < INI_g_Line) && (line < MAX_LINES))
  196.         {
  197.             line++;
  198.  
  199.             if (!INI_g_Key[line][0]) continue;
  200.  
  201.             if (strcmp(key, INI_g_Key[line], false) == 0)
  202.             {
  203.                 format(INI_g_Value[line], MAX_VALUE_SIZE, value[0] ? value : ("null"));
  204.                 INI_l_Pos = true;
  205.                 break;
  206.             }
  207.         }
  208.  
  209.         if (!INI_l_Pos)
  210.         {
  211.             INI_g_Line++;
  212.             format(INI_g_Key[line], MAX_KEY_SIZE, key);
  213.             format(INI_g_Value[line], MAX_VALUE_SIZE, value);
  214.         }
  215.     }
  216.     return 1;
  217. }
  218.  
  219. // Used for write boolean type of variable to file
  220. stock INI_WriteBool(key[], bool:value)
  221.     return INI_Write(key, value ? ("true") : ("false"));
  222.  
  223. // Used for write integer type of variable to file
  224. stock INI_WriteInt(key[], value)
  225. {
  226.     new buf[16];
  227.     format(buf, MAX_FILE_SIZE, "%d", value);
  228.     return INI_Write(key, buf);
  229. }
  230.  
  231. stock INI_WriteHex(key[], value)
  232. {
  233.     new buf[16];
  234.     INI_HexToStr(value, buf);
  235.     return INI_Write(key, buf);
  236. }
  237.  
  238. // Used for write float type of variable to file
  239. stock INI_WriteFloat(key[], Float:value)
  240. {
  241.     new buf[16];
  242.     format(buf, MAX_FILE_SIZE, "%3.f", value);
  243.     return INI_Write(key, buf);
  244. }
  245.  
  246. // Saved all changes and close handle file.
  247. stock INI_Close()
  248. {
  249.     new
  250.         INI_l_Line[MAX_LINE_SIZE],
  251.         line = -1
  252.     ;
  253.  
  254.     INI_g_File = fopen(INI_g_FileN, io_write);
  255.  
  256.     if (INI_g_File)
  257.     {
  258.         while((line < INI_g_Line) && (line < MAX_LINES))
  259.         {
  260.             line++;
  261.  
  262.             if (!strlen(INI_g_Key[line]) || !strlen(INI_g_Value[line])) continue;
  263.             format(INI_l_Line, sizeof(INI_l_Line), "%s=%s\r\n", INI_g_Key[line], INI_g_Value[line]);
  264.  
  265.             fwrite(INI_g_File, INI_l_Line);
  266.         }
  267.         EraseVars();
  268.         INI_g_Line = 0;
  269.     }
  270.     fclose(INI_g_File);
  271. }
  272.  
  273. stock EraseVars()
  274. {
  275.     // Erasing variable values
  276.     for(new i = 0; i < INI_g_Line; i++)
  277.     {
  278.         INI_g_Key[i][0] = 0;
  279.         INI_g_Value[i][0] = 0;
  280.     }
  281.     return 1;
  282. }
  283.  
  284. stock INI_HexToStr(value, key[], size = sizeof(key))
  285. {
  286.     static const chars [] =
  287.     {
  288.         '0', '1', '2', '3',
  289.         '4', '5', '6', '7',
  290.         '8', '9', 'A', 'B',
  291.         'C', 'D', 'E', 'F'
  292.     };
  293.  
  294.     new
  295.         buf [8 + 3] = "0x"
  296.     ;
  297.  
  298.     for (new i = 0; i < 8; ++i){
  299.         buf [2 + i] = chars [(value >>> ((7 - i) << 2)) & 0x0F];
  300.     }
  301.  
  302.     key[0] = EOS;
  303.     strcat(key, buf, size);
  304. }
  305.  
  306. stock INI_StrToHex(key[])
  307. {
  308.     new
  309.         i,
  310.         value
  311.     ;
  312.  
  313.     if (key [0] == '0' && (key [1] == 'x' || key [1] == 'X'))
  314.         i = 2;
  315.  
  316.     while (key[i])
  317.     {
  318.         value <<= 4;
  319.         switch (key [i])
  320.         {
  321.             case '0' .. '9':
  322.                 value |= key [i] - '0';
  323.  
  324.             case 'A' .. 'F':
  325.                 value |= key [i] - 'A' + 10;
  326.  
  327.             case 'a' .. 'f':
  328.                 value |= key [i] - 'a' + 10;
  329.  
  330.             default:
  331.                 return 0;
  332.         }
  333.         ++i;
  334.     }
  335.     return value;
  336. }
  337.  
  338. static stock charfind (string [], c)
  339. {
  340.     for (new i, len = strlen (string); i < len; ++i)
  341.         if (string [i] == c)
  342.             return i;
  343.     return -1;
  344. }
  345.  
  346. stock B_Hash(buf[])
  347. {
  348.     new length = strlen(buf);
  349.     new s1 = 1;
  350.     new s2 = 0;
  351.     for (new n=0,j=strlen(buf);n<j;n++)
  352.     {
  353.        s1 = (s1 + buf[n]) % 65521;
  354.        s2 = (s2 + s1)     % 65521;
  355.     }
  356.     return (s2 << 16) + s1;
  357. }
  358.  
  359. #if defined CONVERTDINI
  360.  
  361.         #define dini_Exists             INI_Exists
  362.         #define dini_Remove             INI_Remove
  363.         #define dini_Create             INI_Create
  364.         #define dini_Set                INI_Write
  365.         #define dini_Get                INI_Read
  366.         #define dini_IntSet             INI_WriteInt
  367.         #define dini_Int                INI_ReadInt
  368.         #define dini_BoolSet            INI_WriteBool
  369.         #define dini_Bool               INI_ReadBool
  370.         #define dini_FloatSet           INI_WriteFloat
  371.         #define dini_Float              INI_ReadFloat
  372.  
  373.         #if !defined _dini_included
  374.                 #define _dini_included
  375.         #endif
  376.  
  377. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement