236 lines
6.8 KiB
MQL5
236 lines
6.8 KiB
MQL5
//+------------------------------------------------------------------+
|
|
//| Conv.mqh |
|
|
//| Copyright 2026, Niquel Mendoza. |
|
|
//| https://www.mql5.com |
|
|
//+------------------------------------------------------------------+
|
|
#property copyright "Copyright 2026, Niquel Mendoza."
|
|
#property link "https://www.mql5.com"
|
|
#property strict
|
|
|
|
#ifndef MQLARTICLES_UTILS_FA_STRING_CONV_MQH
|
|
#define MQLARTICLES_UTILS_FA_STRING_CONV_MQH
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
#include <TSN\\BInt\\Def.mqh>
|
|
#include <TSN\\Tables\\Basic.mqh>
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
namespace TSN
|
|
{
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
class CStringConvert
|
|
{
|
|
private:
|
|
|
|
|
|
public:
|
|
CStringConvert(void) {}
|
|
~CStringConvert(void) {}
|
|
|
|
//---
|
|
// static int s_len;
|
|
|
|
//--- to value genericos
|
|
template <typename T>
|
|
static void ToValueNSigned(const string& str, int& pos, T& v, const int s_len);
|
|
template <typename T>
|
|
static void ToValueNUnsigned(const string& str, int& pos, T& v, const int s_len);
|
|
|
|
|
|
//--- to number signed
|
|
static __forceinline void ToValue(const string& str, int& pos, long& v, const int s_len) { ToValueNSigned(str, pos, v, s_len); }
|
|
static __forceinline void ToValue(const string& str, int& pos, int& v, const int s_len) { ToValueNSigned(str, pos, v, s_len); }
|
|
static __forceinline void ToValue(const string& str, int& pos, short& v, const int s_len) { ToValueNSigned(str, pos, v, s_len); }
|
|
|
|
//--- ungisend
|
|
static __forceinline void ToValue(const string& str, int& pos, ulong& v, const int s_len) { ToValueNUnsigned(str, pos, v, s_len); }
|
|
static __forceinline void ToValue(const string& str, int& pos, uint& v, const int s_len) { ToValueNUnsigned(str, pos, v, s_len); }
|
|
static __forceinline void ToValue(const string& str, int& pos, ushort& v, const int s_len) { ToValueNUnsigned(str, pos, v, s_len); }
|
|
static __forceinline void ToValue(const string& str, int& pos, uchar& v, const int s_len) { ToValueNUnsigned(str, pos, v, s_len); }
|
|
|
|
|
|
//---
|
|
static void ToValue(const string& str, int& pos, double& v, const int s_len);
|
|
};
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
//int CStringConvert::s_len = 0;
|
|
#define MQLARTICLES_STRINGCONVERT_SINGCHEK(VAL, NV) \
|
|
if(ch > 9) \
|
|
{ \
|
|
if(++pos >= s_len) \
|
|
return; \
|
|
if(ch == 29) \
|
|
VAL = NV; \
|
|
ch = (uchar)str[pos] ^ '0'; \
|
|
} \
|
|
|
|
#define MQLARTICLES_STRINGCONVERT_DBL_F double(iv ^ (mask & (1LL << 63)))
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
static void CStringConvert::ToValue(const string &str, int &pos, double &v, const int s_len)
|
|
{
|
|
//---
|
|
long iv = 0;
|
|
uchar ch = (uchar)str[pos] ^ '0';
|
|
long mask = 0;
|
|
//---
|
|
MQLARTICLES_STRINGCONVERT_SINGCHEK(mask, -1)
|
|
//--- integer
|
|
while(true)
|
|
{
|
|
if(ch > 9)
|
|
{
|
|
v = MQLARTICLES_STRINGCONVERT_DBL_F;
|
|
break;
|
|
}
|
|
long c = (iv << 3) + (iv << 1) + ch;
|
|
if(c < 0)
|
|
{
|
|
// no entra el actual
|
|
int ez = 1; //
|
|
while(true)
|
|
{
|
|
if(++pos >= s_len)
|
|
break;
|
|
ch = (uchar)str[pos] ^ '0';
|
|
if(ch > 9)
|
|
break;
|
|
ez++;
|
|
}
|
|
v = MQLARTICLES_STRINGCONVERT_DBL_F * g_Pow10[ez];
|
|
break;
|
|
}
|
|
iv = c;
|
|
if(++pos >= s_len)
|
|
{
|
|
v = MQLARTICLES_STRINGCONVERT_DBL_F;
|
|
break;
|
|
}
|
|
ch = (uchar)str[pos] ^ '0';
|
|
}
|
|
//---
|
|
if(ch == 30 || (ch | 0x20) == 117)
|
|
{
|
|
//---
|
|
if(ch == 30)
|
|
{
|
|
if(++pos >= s_len)
|
|
return;
|
|
long frac_int = 0;
|
|
int fract_digits = 0;
|
|
while(true)
|
|
{
|
|
ch = (uchar)str[pos] ^ '0';
|
|
if(ch > 9)
|
|
break;
|
|
frac_int = (frac_int << 3) + (frac_int << 1) + ch;
|
|
fract_digits++;
|
|
if(++pos >= s_len)
|
|
break;
|
|
}
|
|
v += frac_int * g_Exp10[fract_digits];
|
|
}
|
|
//---
|
|
if((ch | 0x20) == 117)
|
|
{
|
|
if(++pos >= s_len)
|
|
return;
|
|
//---
|
|
bool exp_sign = true;
|
|
ch = (uchar)str[pos] ^ '0';
|
|
MQLARTICLES_STRINGCONVERT_SINGCHEK(exp_sign, false)
|
|
//---
|
|
ushort exp_val = 0;
|
|
while(true)
|
|
{
|
|
if(ch > 9)
|
|
break;
|
|
exp_val = (exp_val << 3) + (exp_val << 1) + ch;
|
|
if(++pos >= s_len)
|
|
break;
|
|
ch = (uchar)str[pos] ^ '0';
|
|
}
|
|
v *= (exp_sign) ? g_Pow10[exp_val] : g_Exp10[exp_val];
|
|
}
|
|
}
|
|
//---
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
template <typename T>
|
|
static void CStringConvert::ToValueNSigned(const string &str, int& pos, T& v, const int s_len)
|
|
{
|
|
//---
|
|
v = 0;
|
|
uchar ch = (uchar)str[pos] ^ '0';
|
|
T mask = 0;
|
|
//---
|
|
MQLARTICLES_STRINGCONVERT_SINGCHEK(mask, -1)
|
|
//---
|
|
while(true)
|
|
{
|
|
if(ch > 9)
|
|
break;
|
|
v = (v << 3) + (v << 1) + ch;
|
|
if(v < 0) // overflow
|
|
{
|
|
v = NUMBERUTILS_MAX_VALUE_OFT_SIGNED(T) ^ mask;
|
|
return;
|
|
}
|
|
if(++pos >= s_len)
|
|
break;
|
|
ch = (uchar)str[pos] ^ '0';
|
|
}
|
|
//--
|
|
v ^= mask;
|
|
v -= mask;
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
template <typename T>
|
|
static void CStringConvert::ToValueNUnsigned(const string &str, int& pos, T& v, const int s_len)
|
|
{
|
|
//---
|
|
v = 0;
|
|
uchar ch = (uchar)str[pos] ^ '0';
|
|
//---
|
|
if(ch > 9)
|
|
{
|
|
if(++pos >= s_len)
|
|
return;
|
|
ch = (uchar)str[pos] ^ '0';
|
|
}
|
|
//---
|
|
while(true)
|
|
{
|
|
if(ch > 9)
|
|
break;
|
|
v = (v << 3) + (v << 1) + ch;
|
|
if(v < ch) // overflow
|
|
{
|
|
v = NUMBERUTILS_MAX_VALUE_OFT_USIGNED(T);
|
|
return;
|
|
}
|
|
if(++pos >= s_len)
|
|
break;
|
|
ch = (uchar)str[pos] ^ '0';
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
#endif // MQLARTICLES_UTILS_FA_STRING_CONV_MQH
|
|
//+------------------------------------------------------------------+
|