//+------------------------------------------------------------------+ //| StrImp.mqh | //| Copyright 2026, Niquel Mendoza. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2026, Niquel Mendoza." #property link "https://www.mql5.com" #property strict #ifndef BASESPARSERSLAN_SRC_EXTRADEF_POINTER_STRIMP_MQH #define BASESPARSERSLAN_SRC_EXTRADEF_POINTER_STRIMP_MQH //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ #include "Cpiler.mqh" //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ namespace TSN { //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ BSFLPointerQuery::BSFLPointerQuery(const string& query, BSFLPointerCompiler& compiler) : m_i(0), m_last_err(BSFL_POINTER_ERR_NOT) { Set(query, compiler); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ __forceinline void BSFLPointerQuery::Set(const string &query, BSFLPointerCompiler &compiler) { compiler.Assing(query, CP_UTF8); compiler.CorrectPadding(); compiler.Compile(this); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void BSFLPointerQuery::ErrorFormat(string &desc) { //--- if(m_last_err == BSFL_POINTER_ERR_NOT) return; //--- desc.Reserve(256); desc = StringFormat("BSFL Pointer error [índex=%d]: ", (m_i >> 1)); //--- switch(m_last_err) { case BSFL_POINTER_ERR_KEY_NOT_EXIST: { const ulong v = m_ins[m_i + BSFLPTR_I_NUMBER]; desc += StringFormat("Key '%s' not exist in document", CharArrayToString(m_raw, BSFLPOINTER_BIT_GET_START(v), BSFLPOINTER_BIT_GET_LEN(v))); break; } case BSFL_POINTER_ERR_ARRAY_OUT_RANGE: { const int v = (int)m_ins[m_i + BSFLPTR_I_NUMBER]; desc += StringFormat("Array index = '%d', out of range or invalid", v); break; } case BSFL_POINTER_ERR_INVALID_NODE_TYPE: { desc += "Invalid node type, must by objet or array"; break; } default: break; } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void BSFLPointerQuery::ErrorInfo(void) { //--- if(m_last_err == BSFL_POINTER_ERR_NOT) return; //--- static string desc; ErrorFormat(desc); //--- const ulong v = m_ins[m_i + BSFLPTR_I_NUMBER]; int pos = BSFLPOINTER_BIT_GET_START(v) + 1; //--- static string out; CParserErrFormat::Format(ArraySize(m_raw), m_raw, 1, pos, desc, out); //--- Print(out); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void BSFLPointerQuery::CintaTypesInfo(void) { //--- PrintFormat("--- BSFLPointerQuery/Info ---"); PrintFormat("Total instructions = %d\nCurr Index = %d\nCurr last err = %d", m_size, m_i, m_last_err); //--- for(int i = 0; i < m_size; i += 2) { const ulong v = m_ins[i + BSFLPTR_I_NUMBER]; const int integer = (int)v; //--- PrintFormat("[%d] | Number = %d | Key = '%s' | Hash = '%I64u'", i, integer, CharArrayToString(m_raw, BSFLPOINTER_BIT_GET_START(v), BSFLPOINTER_BIT_GET_LEN(v)), m_ins[i + BSFLPTR_I_KEY] ); } } } //+------------------------------------------------------------------+ #endif // BASESPARSERSLAN_SRC_EXTRADEF_POINTER_STRIMP_MQH