//+------------------------------------------------------------------+ //| JsonUE.mqh | //| Copyright 2026, Niquel Mendoza. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2026, Niquel Mendoza." #property link "https://www.mql5.com" #property strict #ifndef JSONPARSERBYLEO_SRC_JSONCORE_JSONUET_MQH #define JSONPARSERBYLEO_SRC_JSONCORE_JSONUET_MQH //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ // unescap escpae backend #include //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ namespace TSN { //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ class JsonUET { public: JsonUET(void) {} ~JsonUET(void) {} //--- Tablas unescape escape // unescape static const uchar s_unescape_table[256]; // escape static const uchar s_escape_table[256]; }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ const uchar JsonUET::s_unescape_table[256] = { // char idx ascii //--- WS \ Invalid 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, //--- '"', // 0 0x22 \" = " 0xFF, // 1 0x23 # 0xFF, // 2 0x24 $ 0xFF, // 3 0x25 % 0xFF, // 4 0x26 & 0xFF, // 5 0x27 ' \' = ' 0xFF, // 6 0x28 ( 0xFF, // 7 0x29 ) 0xFF, // 8 0x2A * 0xFF, // 9 0x2B + 0xFF, // 10 0x2C , 0xFF, // 11 0x2D - 0xFF, // 12 0x2E . '/', // 13 0x2F / \/ = / 0xFF, // 14 0x30 0xFF, // 15 0x31 1 0xFF, // 16 0x32 2 0xFF, // 17 0x33 3 0xFF, // 18 0x34 4 0xFF, // 19 0x35 5 0xFF, // 20 0x36 6 0xFF, // 21 0x37 7 0xFF, // 22 0x38 8 0xFF, // 23 0x39 9 0xFF, // 24 0x3A : 0xFF, // 25 0x3B ; 0xFF, // 26 0x3C < 0xFF, // 27 0x3D = 0xFF, // 28 0x3E > 0xFF, // 29 0x3F ? 0xFF, // 30 0x40 @ 0xFF, // 31 0x41 A 0xFF, // 32 0x42 B 0xFF, // 33 0x43 C 0xFF, // 34 0x44 D 0xFF, // 35 0x45 E 0xFF, // 36 0x46 F 0xFF, // 37 0x47 G 0xFF, // 38 0x48 H 0xFF, // 39 0x49 I 0xFF, // 40 0x4A J 0xFF, // 41 0x4B K 0xFF, // 42 0x4C L 0xFF, // 43 0x4D M 0xFF, // 44 0x4E N 0xFF, // 45 0x4F O 0xFF, // 46 0x50 P 0xFF, // 47 0x51 Q 0xFF, // 48 0x52 R 0xFF, // 49 0x53 S 0xFF, // 50 0x54 T 0xFF, // 51 0x55 U 0xFF, // 52 0x56 V 0xFF, // 53 0x57 W 0xFF, // 54 0x58 X 0xFF, // 55 0x59 Y 0xFF, // 56 0x5A Z 0xFF, // 57 0x5B [ '\\', // 58 0x5C \ \\ = 0xFF, // 59 0x5D ] 0xFF, // 60 0x5E ^ 0xFF, // 61 0x5F _ 0xFF, // 62 0x60 ` 0xFF, // 63 0x61 a 0x08, // 64 0x62 b \b = backspace 0xFF, // 65 0x63 c 0xFF, // 66 0x64 d 0xFF, // 67 0x65 e 0x0C, // 68 0x66 f \f = form feed 0xFF, // 69 0x67 g 0xFF, // 70 0x68 h 0xFF, // 71 0x69 i 0xFF, // 72 0x6A j 0xFF, // 73 0x6B k 0xFF, // 74 0x6C l 0xFF, // 75 0x6D m 0x0A, // 76 0x6E n \n = newline 0xFF, // 77 0x6F o 0xFF, // 78 0x70 p 0xFF, // 79 0x71 q 0x0D, // 80 0x72 r \r = carriage return 0xFF, // 81 0x73 s 0x09, // 82 0x74 t \t = tab TSN_TABLE_UNESCAPE_UNICODE, // 83 0x75 u \uXXXX unicode 0xFF, // 84 0x76 v 0xFF, // 85 0x77 w 0xFF, // 86 0x78 x 0xFF, // 87 0x79 y 0xFF, // 88 0x7A z 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // 0x7B - 0x7F //--- Extended / high range (0x80 - 0xFF): all invalid for JSON escape context 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, }; const uchar JsonUET::s_escape_table[256] = { //--- 0x00–0x1F: caracteres de control TSN_TABLE_ESCAPE_UNICODE, // 0x00 \0 null TSN_TABLE_ESCAPE_UNICODE, // 0x01  TSN_TABLE_ESCAPE_UNICODE, // 0x02  TSN_TABLE_ESCAPE_UNICODE, // 0x03  TSN_TABLE_ESCAPE_UNICODE, // 0x04  TSN_TABLE_ESCAPE_UNICODE, // 0x05  TSN_TABLE_ESCAPE_UNICODE, // 0x06  TSN_TABLE_ESCAPE_UNICODE, // 0x07 'b', // 0x08 \b backspace 't', // 0x09 \t tab 'n', // 0x0A \n newline TSN_TABLE_ESCAPE_UNICODE, // 0x0B \v 'f', // 0x0C \f form feed 'r', // 0x0D \r carriage return TSN_TABLE_ESCAPE_UNICODE, // 0x0E  TSN_TABLE_ESCAPE_UNICODE, // 0x0F  TSN_TABLE_ESCAPE_UNICODE, // 0x10  TSN_TABLE_ESCAPE_UNICODE, // 0x11  TSN_TABLE_ESCAPE_UNICODE, // 0x12  TSN_TABLE_ESCAPE_UNICODE, // 0x13  TSN_TABLE_ESCAPE_UNICODE, // 0x14  TSN_TABLE_ESCAPE_UNICODE, // 0x15  TSN_TABLE_ESCAPE_UNICODE, // 0x16  TSN_TABLE_ESCAPE_UNICODE, // 0x17  TSN_TABLE_ESCAPE_UNICODE, // 0x18  TSN_TABLE_ESCAPE_UNICODE, // 0x19  TSN_TABLE_ESCAPE_UNICODE, // 0x1A  TSN_TABLE_ESCAPE_UNICODE, // 0x1B TSN_TABLE_ESCAPE_UNICODE, // 0x1C  TSN_TABLE_ESCAPE_UNICODE, // 0x1D  TSN_TABLE_ESCAPE_UNICODE, // 0x1E  TSN_TABLE_ESCAPE_UNICODE, // 0x1F  //--- 0x20–0x21: imprimibles 0xFF, // 0x20 ' ' space 0xFF, // 0x21 ! //--- 0x22: comilla doble '"', // 0x22 \" //--- 0x23–0x26: imprimibles 0xFF, // 0x23 # 0xFF, // 0x24 $ 0xFF, // 0x25 % 0xFF, // 0x26 & //--- 0x27: comilla simple 0xFF, // 0x27 \' //--- 0x28–0x2E: imprimibles 0xFF, // 0x28 ( 0xFF, // 0x29 ) 0xFF, // 0x2A * 0xFF, // 0x2B + 0xFF, // 0x2C , 0xFF, // 0x2D - 0xFF, // 0x2E . //--- 0x2F: slash '/', // 0x2F \/ //--- 0x30–0x5B: imprimibles 0xFF, // 0x30 0 0xFF, // 0x31 1 0xFF, // 0x32 2 0xFF, // 0x33 3 0xFF, // 0x34 4 0xFF, // 0x35 5 0xFF, // 0x36 6 0xFF, // 0x37 7 0xFF, // 0x38 8 0xFF, // 0x39 9 0xFF, // 0x3A : 0xFF, // 0x3B ; 0xFF, // 0x3C < 0xFF, // 0x3D = 0xFF, // 0x3E > 0xFF, // 0x3F ? 0xFF, // 0x40 @ 0xFF, // 0x41 A 0xFF, // 0x42 B 0xFF, // 0x43 C 0xFF, // 0x44 D 0xFF, // 0x45 E 0xFF, // 0x46 F 0xFF, // 0x47 G 0xFF, // 0x48 H 0xFF, // 0x49 I 0xFF, // 0x4A J 0xFF, // 0x4B K 0xFF, // 0x4C L 0xFF, // 0x4D M 0xFF, // 0x4E N 0xFF, // 0x4F O 0xFF, // 0x50 P 0xFF, // 0x51 Q 0xFF, // 0x52 R 0xFF, // 0x53 S 0xFF, // 0x54 T 0xFF, // 0x55 U 0xFF, // 0x56 V 0xFF, // 0x57 W 0xFF, // 0x58 X 0xFF, // 0x59 Y 0xFF, // 0x5A Z 0xFF, // 0x5B [ //--- 0x5C: backslash '\\', // 0x5C \\ //--- 0x5D–0x7E: imprimibles 0xFF, // 0x5D ] 0xFF, // 0x5E ^ 0xFF, // 0x5F _ 0xFF, // 0x60 ` 0xFF, // 0x61 a 0xFF, // 0x62 b 0xFF, // 0x63 c 0xFF, // 0x64 d 0xFF, // 0x65 e 0xFF, // 0x66 f 0xFF, // 0x67 g 0xFF, // 0x68 h 0xFF, // 0x69 i 0xFF, // 0x6A j 0xFF, // 0x6B k 0xFF, // 0x6C l 0xFF, // 0x6D m 0xFF, // 0x6E n 0xFF, // 0x6F o 0xFF, // 0x70 p 0xFF, // 0x71 q 0xFF, // 0x72 r 0xFF, // 0x73 s 0xFF, // 0x74 t 0xFF, // 0x75 u 0xFF, // 0x76 v 0xFF, // 0x77 w 0xFF, // 0x78 x 0xFF, // 0x79 y 0xFF, // 0x7A z 0xFF, // 0x7B { 0xFF, // 0x7C | 0xFF, // 0x7D } 0xFF, // 0x7E ~ //--- 0x7F: DEL (control) TSN_TABLE_ESCAPE_UNICODE, // 0x7F  //--- 0x80–0xFF: extended ASCII → \uXXXX TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, // 0x80–0x87 TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, // 0x88–0x8F TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, // 0x90–0x97 TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, // 0x98–0x9F TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, // 0xA0–0xA7 TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, // 0xA8–0xAF TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, // 0xB0–0xB7 TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, // 0xB8–0xBF TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, // 0xC0–0xC7 TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, // 0xC8–0xCF TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, // 0xD0–0xD7 TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, // 0xD8–0xDF TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, // 0xE0–0xE7 TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, // 0xE8–0xEF TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, // 0xF0–0xF7 TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, TSN_TABLE_ESCAPE_UNICODE, // 0xF8–0xFF }; //+------------------------------------------------------------------+ //| Alias para facilitar | //+------------------------------------------------------------------+ //--- uet #define JSONPBL_UET_JSCLASS TSN::JsonUET //--- make #define JSONPBL_MAKESTRING(RAW, I, LEN, STR) TSN::CBSFLUnescape::MakeString(RAW, (I), (LEN), STR) #define JSONPBL_MAKEHASH(RAW, I, LEN, HASH) TSN::CBSFLUnescape::MakeHash(RAW, (I), (LEN), HASH) #define JSONPBL_MAKEUARR(RAW, I, LEN, UARRAY, POS, SURRO) TSN::CBSFLUnescape::MakeUArray(RAW, (I), (LEN), UARRAY, POS) //--- #define JSONPBL_UET_ESCAPE_GET(POS) TSN::JsonUET::s_escape_table[POS]; //--- } //+------------------------------------------------------------------+ #endif // JSONPARSERBYLEO_SRC_JSONCORE_JSONUET_MQH