159 lines
3.6 KiB
C++
159 lines
3.6 KiB
C++
#include <string>
|
|
#include <iostream>
|
|
#include <sstream>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <algorithm>
|
|
#include <cctype>
|
|
#include <math.h>
|
|
#include "DefScriptDefines.h"
|
|
#include "DefScriptTools.h"
|
|
|
|
|
|
std::string DefScriptTools::stringToLower(std::string s)
|
|
{
|
|
std::transform(s.begin(), s.end(), s.begin(), std::tolower);
|
|
return s;
|
|
}
|
|
|
|
std::string DefScriptTools::stringToUpper(std::string s)
|
|
{
|
|
std::transform(s.begin(), s.end(), s.begin(), std::toupper);
|
|
return s;
|
|
}
|
|
|
|
std::string DefScriptTools::toString(ldbl num)
|
|
{
|
|
std::stringstream ss;
|
|
ss.setf(std::ios_base::fixed);
|
|
ss.precision(15);
|
|
ss << Round(num,15);
|
|
std::string s(ss.str());
|
|
while(s[s.length()-1]=='0')
|
|
s.erase(s.length()-1,1);
|
|
if(s[s.length()-1]=='.')
|
|
s.erase(s.length()-1,1);
|
|
return s;
|
|
}
|
|
|
|
std::string DefScriptTools::toString(uint64 num)
|
|
{
|
|
std::stringstream ss;
|
|
ss << num;
|
|
return ss.str();
|
|
}
|
|
// convert a string into ldbl
|
|
// valid input formats:
|
|
// normal numbers: 5439
|
|
// hex numbers: 0xa56ff, 0XFF, 0xDEADBABE, etc (must begin with 0x)
|
|
// float numbers: 99.65, 0.025
|
|
// negative numbers: -100, -0x3d, -55.123
|
|
ldbl DefScriptTools::toNumber(std::string str)
|
|
{
|
|
ldbl num=0;
|
|
uint64 u=0;
|
|
bool negative=false;
|
|
if(str.empty())
|
|
return 0;
|
|
if(str[0]=='-')
|
|
{
|
|
str.erase(0,1);
|
|
negative=true;
|
|
}
|
|
unsigned int ppos=str.find('.');
|
|
str=stringToUpper(str);
|
|
|
|
if(str.length() > 2 && str[0]=='0' && str[1]=='X')
|
|
{
|
|
std::string lo(str.c_str()+2);
|
|
std::string hi;
|
|
while(lo.length()>8)
|
|
{
|
|
hi+=lo.at(0);
|
|
lo.erase(0,1);
|
|
}
|
|
unsigned int hibits,lobits;
|
|
hibits=strtoul(hi.c_str(),NULL,16);
|
|
lobits=strtoul(lo.c_str(),NULL,16);
|
|
u|=hibits;
|
|
u<<=32;
|
|
u|=lobits;
|
|
}
|
|
else
|
|
u = atoi64(str.c_str());
|
|
|
|
if(ppos!=std::string::npos)
|
|
{
|
|
std::string mantissa("0");
|
|
mantissa+=str.c_str()+ppos;
|
|
num=(ldbl)atof(mantissa.c_str());
|
|
}
|
|
|
|
num=(unsigned long double)num + u;
|
|
num=Round(num,10);
|
|
|
|
|
|
if(negative)
|
|
num = -num;
|
|
return num;
|
|
}
|
|
|
|
bool DefScriptTools::isTrue(std::string s)
|
|
{
|
|
if(s.empty() || s=="false" || s=="0")
|
|
return false;
|
|
return true;
|
|
}
|
|
|
|
uint64 DefScriptTools::toUint64(std::string str)
|
|
{
|
|
bool negative=false;
|
|
uint64 num;
|
|
if(str.empty())
|
|
return 0;
|
|
if(str[0]=='-')
|
|
{
|
|
str.erase(0,1);
|
|
negative=true;
|
|
}
|
|
str=stringToUpper(str);
|
|
if(str.length() > 2 && str[0]=='0' && str[1]=='X')
|
|
{
|
|
std::string lo(str.c_str()+2);
|
|
std::string hi;
|
|
while(lo.length()>8)
|
|
{
|
|
hi+=lo.at(0);
|
|
lo.erase(0,1);
|
|
}
|
|
unsigned int hibits,lobits;
|
|
hibits=strtoul(hi.c_str(),NULL,16);
|
|
lobits=strtoul(lo.c_str(),NULL,16);
|
|
num|=hibits;
|
|
num<<=32;
|
|
num|=lobits;
|
|
}
|
|
else
|
|
num = atoi64(str.c_str());
|
|
if(negative)
|
|
num = (uint64)(-1) - num; // is this correct?
|
|
return num;
|
|
}
|
|
|
|
uint64 DefScriptTools::atoi64(const char *str)
|
|
{
|
|
#if COMPILER == COMPILER_MICROSOFT
|
|
__int64 tmp = _atoi64(str);
|
|
return tmp;
|
|
#else
|
|
#error "Fix Me!"
|
|
//return _atoi64(str);
|
|
#endif
|
|
}
|
|
|
|
inline long double DefScriptTools::Round(long double z,unsigned int n)
|
|
{
|
|
static long double v[] = { 1, 10, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16 };
|
|
return floor(z * v[n] + 0.5) / v[n];
|
|
} |