JsonParserByLeo/Src/JsonPathVM.mqh
Nique_372 366ed2bd5c
2026-10-01 13:36:22 -05:00

108 lines
3.2 KiB
MQL5

//+------------------------------------------------------------------+
//| JsonPathVM.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_JSONPATHVM_MQH
#define JSONPARSERBYLEO_SRC_JSONPATHVM_MQH
//+------------------------------------------------------------------+
//| Include |
//+------------------------------------------------------------------+
//--- maquinaria base
#include <TSN\\BSFL\\Query.mqh>
//--- backend
#include "JsonParser.mqh"
//--- utils
#include <TSN\\BSFL\\Utils.mqh>
//+------------------------------------------------------------------+
//| Implementancion de makekeyhash para la VM |
//+------------------------------------------------------------------+
namespace TSN
{
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
static bool CJsonParser::MakeKeyHashFNV1A64(const uchar &in[], int& i, int len, ulong& hash)
{
//---
hash = 14695981039346656037ULL;
for(;; i++) // nota aqui el " se nos garantiza pero igual en uncidoe hay que vertiicar el len
{
//---
const uchar ch = in[i];
if(ch == '\\')
{
const uchar next = g_tsn_table_json_unescape_table[in[++i]];
switch(next)
{
case TSN_TABLE_UNESCAPE_UNICODE:
{
if(i + 4 >= len)
return false;
//---
DOMBASEULTIS_MAKESTRING_CODE(code, i)
//--- Vefificamos low\high surrogate
if(code >= 0xD800 && code <= 0xDBFF)
{
if(i + 6 < len && in[i + 1] == '\\' && in[i + 2] == 'u')
{
int j = i + 2;
DOMBASEULTIS_MAKESTRING_CODE(low, j)
//---
if(low >= 0xDC00 && low <= 0xDFFF)
{
DOMBASEULTIS_MKH_ITER(code)
DOMBASEULTIS_MKH_ITER(low)
i = j;
break;
}
}
//---
// if(sizeof(TStrict) == JSONUNESCAPE_STRICT)
// return def;
DOMBASEULTIS_MKH_ITER(0xFFFD)
}
else
if(code >= 0xDC00 && code <= 0xDFFF)
{
//if(sizeof(TStrict) == JSONUNESCAPE_STRICT)
//return def;
DOMBASEULTIS_MKH_ITER(0xFFFD)
}
else
{
DOMBASEULTIS_MKH_ITER(code)
}
break;
}
case TSN_TABLE_UNESCAPE_INVALID:
return false;
default:
DOMBASEULTIS_MKH_ITER(next)
break;
}
continue;
}
if(ch == '"')
{
i++; // lo dejamos luego del "
return true;
}
//---
DOMBASEULTIS_MKH_ITER(ch)
}
return true;
}
//---
}
#endif // JSONPARSERBYLEO_SRC_JSONPATHVM_MQH