DataConvert.inc 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484
  1. /****************************************************************************************************
  2. * *
  3. * )( Data Convert )( *
  4. * *
  5. * Copyright © 2017 Abyss Morgan. All rights reserved. *
  6. * Contributors: Crayder, Shiny *
  7. * *
  8. * Download: https://github.com/AbyssMorgan/SA-MP/tree/master/include/SAM *
  9. * Publication: http://forum.sa-mp.com/showthread.php?t=610012 *
  10. * Website: http://8.ct8.pl *
  11. * *
  12. * Plugins: SScanf *
  13. * Modules: None *
  14. * *
  15. * File Version: 2.0.0 *
  16. * SA:MP Version: 0.3.7 *
  17. * SScanf Version: 2.8.2 *
  18. * *
  19. * Definitions: *
  20. * FIRST_FILE_ADDRESS *
  21. * INVALID_FILE_ID *
  22. * INVALID_FILE_HANDLE *
  23. * INT_NUMBER_LEN *
  24. * HEX_NUMBER_LEN *
  25. * BIN_NUMBER_LEN *
  26. * OCT_NUMBER_LEN *
  27. * *
  28. * Functions: *
  29. * GetFileHandleID(File:handle); *
  30. * GetFileID(File:handle); *
  31. * bool:IsIdentical({AllTag,_}:variable1,{AllTag,_}:variable2); *
  32. * strcopy(input[],output[]); //string copy for warning 224: indeterminate array size *
  33. * fstrcopy(input[],output[],maxdest = sizeof(output)); //fast string copy *
  34. * ABCToCBA(input[],output[]); *
  35. * AnyToInt(string[],type,&bool:flag); *
  36. * IntToAny(value,output[],type); *
  37. * rot13(string[]); *
  38. * code128(input[],output[]); *
  39. * swap_int({Float,_}:int1,{Float,_}:int2); *
  40. * swap_string(string1[], string2[], dest1 = sizeof(string1), dest2 = sizeof(string2)); *
  41. * bool:ContainInSeries(value,...); *
  42. * bool:ContainInSeriesFloat(Float:value,Float:...); *
  43. * StringEqual(string1[],string2[],ignorecase); *
  44. * StringNotEqual(string1[],string2[],ignorecase); *
  45. * base64_decode(input[],output[]); //d:base64 *
  46. * base64_encode(input[],output[]); //e:base64 *
  47. * *
  48. * Validators: *
  49. * bool:IsDecimalNumber(string[]); *
  50. * bool:IsHexNumber(string[]); *
  51. * bool:IsBinaryNumber(string[]); *
  52. * bool:IsOctalNumber(string[]); *
  53. * bool:IsFloatNumber(string[]); *
  54. * *
  55. * Convert to Bool: *
  56. * bool:StringToBool(string[]); *
  57. * bool:IntToBool(value); *
  58. * *
  59. * Convert to Int: *
  60. * StringToInt(string[]); *
  61. * BoolToInt(bool:boolean); *
  62. * HexToInt(string[]); *
  63. * BinToInt(string[]); *
  64. * OctToInt(string[]); *
  65. * *
  66. * Convert to Hex: *
  67. * IntToHex(value); *
  68. * IntToHexEx(value); *
  69. * BinToHex(string[]); *
  70. * BinToHexEx(string[]); *
  71. * OctToHex(string[]); *
  72. * *
  73. * Convert to Bin: *
  74. * IntToBin(value); *
  75. * HexToBin(string[]); *
  76. * OctToBin(string[]); *
  77. * *
  78. * Convert to Oct: *
  79. * IntToOct(value); *
  80. * HexToOct(string[]); *
  81. * BinToOct(string[]); *
  82. * *
  83. * Binary Data Convert: *
  84. * FloatToInt(Float:value); //Convert Float binary data to Integer binary data ! *
  85. * Float:IntToFloat(value); //Convert Integer binary data to Float binary data ! *
  86. * *
  87. ****************************************************************************************************/
  88. /*
  89. //Check Version DataConvert.inc
  90. #if !defined _Data_Convert
  91. #error [ADM] You need DataConvert.inc v2.0.0
  92. #elseif !defined Data_Convert_Version
  93. #error [ADM] Update you DataConvert.inc to v2.0.0
  94. #elseif (Data_Convert_Version < 20000)
  95. #error [ADM] Update you DataConvert.inc to v2.0.0
  96. #endif
  97. */
  98. #if defined _Data_Convert
  99. #endinput
  100. #endif
  101. #define _Data_Convert
  102. #if defined _base64_included
  103. #error [ADM] Please remove deprecated file base64.inc
  104. #endif
  105. #if !defined sscanf
  106. #error [ADM] You need SScanf v2.8.2 (github.com/AbyssMorgan/SA-MP/tree/master/plugins)
  107. #endif
  108. #define Data_Convert_Version (20000) //a.b.c 10000*a+100*b+c
  109. new const LettersTable[] = {
  110. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
  111. };
  112. new const Decoder[] = {
  113. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  114. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  115. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  116. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  117. 0, 0, 0, 62, 0, 0, 0, 63, 52, 53,
  118. 54, 55, 56, 57, 58, 59, 60, 61, 0, 0,
  119. 0, 0, 0, 0, 0, 0, 1, 2, 3, 4,
  120. 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
  121. 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
  122. 25, 0, 0, 0, 0, 0, 0, 26, 27, 28,
  123. 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
  124. 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
  125. 49, 50, 51, 0, 0, 0, 0, 0, 0, 0,
  126. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  127. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  128. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  129. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  130. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  131. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  132. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  133. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  134. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  135. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  136. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  137. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  138. 0, 0, 0, 0, 0, 0
  139. };
  140. #if !defined isnull
  141. #define isnull(%1) ((!(%1[0])) || (((%1[0]) == '\1') && (!(%1[1]))))
  142. #endif
  143. #define INT_NUMBER_LEN 12
  144. #define HEX_NUMBER_LEN 12
  145. #define BIN_NUMBER_LEN 36
  146. #define OCT_NUMBER_LEN 14
  147. #define FIRST_FILE_ADDRESS (0x004E5A18)
  148. #define INVALID_FILE_ID (0xFFB1A5E7)
  149. #define INVALID_FILE_HANDLE (File:0)
  150. #define GetFileHandleID(%0) (_:%0)
  151. #define StringToInt(%0) strval(%0)
  152. #define IsIdentical(%0,%1) ((tagof(%0) == tagof(%1)) && (_:%0) == (_:%1))
  153. //swapvars by Crayder
  154. #define swap_int(%0,%1) (((%0) ^= (%1)), ((%1) ^= (%0)), ((%0) ^= (%1)))
  155. #define BoolToInt(%0) ((%0)?1:0)
  156. #define IntToBool(%0) (((%0) == 1)?true:false)
  157. #define FloatToInt(%0) (_:%0)
  158. #define IntToFloat(%0) (Float:%0)
  159. #define StringEqual(%0,%1,%2) (!strcmp((%0),(%1),(%2)))
  160. #define StringNotEqual(%0,%1,%2) (strcmp((%0),(%1),(%2)) != 0)
  161. stock ABCToCBA(input[],output[]){
  162. for(new i = 0, j = strlen(input); i < j; i++){
  163. output[j-(i+1)] = input[i];
  164. }
  165. output[strlen(input)] = EOS;
  166. }
  167. stock AnyToInt(string[],type,&bool:flag){
  168. new DC_Symbol, len = strlen(string), i = 1, value;
  169. if(string[0] >= 0x30 && string[0] <= 0x39){
  170. value = string[0] - 48;
  171. } else {
  172. value = string[0] - 55;
  173. }
  174. if(value >= type){
  175. flag = false;
  176. return 0;
  177. }
  178. while(i < len){
  179. if(string[i] >= 0x30 && string[i] <= 0x39){
  180. DC_Symbol = string[i] - 48;
  181. } else {
  182. DC_Symbol = string[i] - 55;
  183. }
  184. if(DC_Symbol >= type){
  185. flag = false;
  186. return 0;
  187. }
  188. value = value * type + DC_Symbol;
  189. i++;
  190. }
  191. flag = true;
  192. return value;
  193. }
  194. stock IntToAny(value,output[],type){
  195. new tmp = value, val[256], i = 0;
  196. while(tmp > 0){
  197. val[i] = (tmp % type);
  198. if(val[i] < 10){
  199. val[i] += 0x30;
  200. } else {
  201. val[i] += 0x37;
  202. }
  203. tmp /= type;
  204. i++;
  205. }
  206. val[i] = EOS;
  207. ABCToCBA(val,output);
  208. }
  209. stock strcopy(input[],output[]){
  210. for(new i = 0, j = strlen(input); i < j; i++){
  211. output[i] = input[i];
  212. }
  213. output[strlen(input)] = EOS;
  214. }
  215. stock fstrcopy(input[],output[],maxdest = sizeof(output)){
  216. output[0] = EOS;
  217. strcat(output,input,maxdest);
  218. output[strlen(input)] = EOS;
  219. }
  220. stock bool:IsDecimalNumber(string[]){
  221. new value = 0;
  222. return !(sscanf(string,"d",value));
  223. }
  224. stock bool:IsHexNumber(string[]){
  225. new value = 0;
  226. return !(sscanf(string,"x",value));
  227. }
  228. stock bool:IsBinaryNumber(string[]){
  229. new value = 0;
  230. return !(sscanf(string,"b",value));
  231. }
  232. stock bool:IsOctalNumber(string[]){
  233. new value = 0;
  234. return !(sscanf(string,"o",value));
  235. }
  236. stock bool:IsFloatNumber(string[]){
  237. new Float:value = 0;
  238. return !(sscanf(string,"f",value));
  239. }
  240. stock bool:swap_string(string1[],string2[],dest1 = sizeof(string1),dest2 = sizeof(string2)){
  241. if(dest1 < strlen(string2) || dest2 < strlen(string1)) return false;
  242. new swap_size = dest1;
  243. if(dest2 > swap_size) swap_size = dest2;
  244. for(new i = 0; i < swap_size; i++){
  245. swap_int(string1[i],string2[i]);
  246. }
  247. return true;
  248. }
  249. stock GetFileID(File:handle){
  250. return (handle == INVALID_FILE_HANDLE)?INVALID_FILE_ID:((GetFileHandleID(handle)-FIRST_FILE_ADDRESS)/32);
  251. }
  252. stock BinToInt(string[]){
  253. new value = 0;
  254. if(sscanf(string,"b",value)) return 0;
  255. return value;
  256. }
  257. stock HexToBin(string[]){
  258. new DC_Result[BIN_NUMBER_LEN], value = 0;
  259. sscanf(string,"x",value);
  260. format(DC_Result,sizeof(DC_Result),"%b",value);
  261. return DC_Result;
  262. }
  263. stock BinToHex(string[]){
  264. new DC_Result[HEX_NUMBER_LEN], value = 0;
  265. if(sscanf(string,"b",value)){
  266. format(DC_Result,sizeof(DC_Result),"0");
  267. } else {
  268. format(DC_Result,sizeof(DC_Result),"%06x",value);
  269. }
  270. return DC_Result;
  271. }
  272. stock BinToHexEx(string[]){
  273. new DC_Result[HEX_NUMBER_LEN], value = 0;
  274. if(sscanf(string,"b",value)){
  275. format(DC_Result,sizeof(DC_Result),"0");
  276. } else {
  277. format(DC_Result,sizeof(DC_Result),"%x",value);
  278. }
  279. return DC_Result;
  280. }
  281. stock IntToBin(value){
  282. new DC_Result[BIN_NUMBER_LEN];
  283. format(DC_Result,sizeof(DC_Result),"%b",value);
  284. return DC_Result;
  285. }
  286. stock bool:StringToBool(string[]){
  287. return (string[0] != '0');
  288. }
  289. stock HexToInt(string[]){
  290. new value = 0;
  291. if(sscanf(string,"x",value)) return 0;
  292. return value;
  293. }
  294. stock IntToHex(value){
  295. new DC_Result[HEX_NUMBER_LEN];
  296. format(DC_Result,sizeof(DC_Result),"%06x",value);
  297. return DC_Result;
  298. }
  299. stock IntToHexEx(value){
  300. new DC_Result[HEX_NUMBER_LEN];
  301. format(DC_Result,sizeof(DC_Result),"%x",value);
  302. return DC_Result;
  303. }
  304. stock OctToInt(string[]){
  305. new value = 0;
  306. if(sscanf(string,"o",value)) return 0;
  307. return value;
  308. }
  309. stock OctToHex(string[]){
  310. new DC_Result[HEX_NUMBER_LEN], value = 0;
  311. if(sscanf(string,"o",value)){
  312. format(DC_Result,sizeof(DC_Result),"0");
  313. } else {
  314. format(DC_Result,sizeof(DC_Result),"%x",value);
  315. }
  316. return DC_Result;
  317. }
  318. stock OctToBin(string[]){
  319. new DC_Result[BIN_NUMBER_LEN], value = 0;
  320. if(sscanf(string,"o",value)){
  321. format(DC_Result,sizeof(DC_Result),"0");
  322. } else {
  323. format(DC_Result,sizeof(DC_Result),"%b",value);
  324. }
  325. return DC_Result;
  326. }
  327. stock rot13(string[]){
  328. for(new i = 0, j = strlen(string); i < j; i++){
  329. if('a' <= string[i] <= 'z'){
  330. string[i] = (string[i] - 'a' + 13) % 26 + 'a';
  331. } else if('A' <= string[i] <= 'Z'){
  332. string[i] = (string[i] - 'A' + 13) % 26 + 'A';
  333. }
  334. }
  335. }
  336. stock code128(input[],output[]){
  337. for(new i = 0, j = strlen(input); i < j; i++){
  338. output[i] = (0xFF & input[i]+128);
  339. }
  340. output[strlen(input)] = EOS;
  341. }
  342. stock bool:ContainInSeries(value,...){
  343. for(new i = 1, j = numargs(); i < j; i++){
  344. if(getarg(i) == value) return true;
  345. }
  346. return false;
  347. }
  348. stock bool:ContainInSeriesFloat(Float:value,Float:...){
  349. for(new i = 1, j = numargs(); i < j; i++){
  350. if((Float:getarg(i)) == value) return true;
  351. }
  352. return false;
  353. }
  354. stock IntToOct(value){
  355. new DC_Result[OCT_NUMBER_LEN];
  356. IntToAny(value,DC_Result,8);
  357. return DC_Result;
  358. }
  359. stock HexToOct(string[]){
  360. new DC_Result[OCT_NUMBER_LEN];
  361. IntToAny(HexToInt(string),DC_Result,8);
  362. return DC_Result;
  363. }
  364. stock BinToOct(string[]){
  365. new DC_Result[OCT_NUMBER_LEN];
  366. IntToAny(BinToInt(string),DC_Result,8);
  367. return DC_Result;
  368. }
  369. //base64 by Shiny
  370. stock base64_decode(input[],output[]){
  371. new SpaceReplacer = '=', len = strlen(input), Position;
  372. for(new i = 0; i < len; i++){
  373. new char_[2];
  374. char_[0] = Decoder[input[i++]];
  375. char_[1] = Decoder[input[i]];
  376. char_[0] = (char_[0] << 2) | ((char_[1] >> 4) & 3);
  377. Position += format(output[Position], len, "%c", char_[0]);
  378. if(++i < len){
  379. char_[0] = input[i];
  380. if(char_[0] == SpaceReplacer) break;
  381. char_[0] = Decoder[input[i]];
  382. char_[1] = ((char_[1] << 4) & 240) | ((char_[0] >> 2) & 15);
  383. Position += format(output[Position], len, "%c", char_[1]);
  384. }
  385. if(++i < len){
  386. char_[1] = input[i];
  387. if(char_[1] == SpaceReplacer) break;
  388. char_[1] = Decoder[input[i]];
  389. char_[0] = ((char_[0] << 6) & 192) | char_[1];
  390. Position += format(output[Position], len, "%c", char_[0]);
  391. }
  392. }
  393. }
  394. stock base64_encode(input[],output[]){
  395. new SpaceReplacer = '=', len = strlen(input), Position;
  396. for(new i = 0 ; i < len ; i++){
  397. new Character;
  398. Character = (input[i] >> 2) & 63;
  399. Position += format(output[Position], len, "%c", LettersTable[Character]);
  400. Character = (input[i] << 4) & 63;
  401. if(++i < len){
  402. Character |= (input[i] >> 4) & 15;
  403. }
  404. Position += format(output[Position], len, "%c", LettersTable[Character]);
  405. if(i < len){
  406. Character = (input[i] << 2) & 63;
  407. if(++i < len){
  408. Character |= (input[i] >> 6) & 3;
  409. }
  410. Position += format(output[Position], len, "%c", LettersTable[Character]);
  411. } else {
  412. i++;
  413. Position += format(output[Position], len, "%c", SpaceReplacer);
  414. }
  415. if(i < len){
  416. Character = input[i] & 63;
  417. Position += format(output[Position], len, "%c", LettersTable[Character]);
  418. } else {
  419. Position += format(output[Position], len, "%c", SpaceReplacer);
  420. }
  421. }
  422. }
  423. #define e:base64 base64_encode
  424. #define d:base64 base64_decode
  425. //EOF