mirror of
https://github.com/VCMP-SqMod/SqMod.git
synced 2024-11-08 00:37:15 +01:00
Added several functions to the math library to count integer digts and generate floating point numbers from integers.
This commit is contained in:
parent
25cc612855
commit
be8b631aea
@ -5,6 +5,8 @@
|
|||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
namespace SqMod {
|
namespace SqMod {
|
||||||
@ -1064,6 +1066,93 @@ static SQInteger SqIsUnordered(HSQUIRRELVM vm)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------------------------------
|
||||||
|
static SQInteger SqDigits1(HSQUIRRELVM vm)
|
||||||
|
{
|
||||||
|
// Do we have the correct number of arguments?
|
||||||
|
if (sq_gettop(vm) <= 1)
|
||||||
|
{
|
||||||
|
return sq_throwerror(vm, "Wrong number of arguments");
|
||||||
|
}
|
||||||
|
// Fetch the integer value from the stack
|
||||||
|
Int64 n = PopStackLong(vm, 2);
|
||||||
|
// Start with 0 digits
|
||||||
|
Uint8 d = 0;
|
||||||
|
// Identify the number of digits
|
||||||
|
while (n != 0)
|
||||||
|
{
|
||||||
|
n /= 10;
|
||||||
|
++d;
|
||||||
|
}
|
||||||
|
// Push the number of digits on the stack
|
||||||
|
sq_pushinteger(vm, d);
|
||||||
|
// Specify that we have a value on the stack
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------------------------------
|
||||||
|
static SQInteger SqDigits0(HSQUIRRELVM vm)
|
||||||
|
{
|
||||||
|
// Do we have the correct number of arguments?
|
||||||
|
if (sq_gettop(vm) <= 1)
|
||||||
|
{
|
||||||
|
return sq_throwerror(vm, "Wrong number of arguments");
|
||||||
|
}
|
||||||
|
// Fetch the integer value from the stack
|
||||||
|
Int64 n = PopStackLong(vm, 2);
|
||||||
|
// Start with 0 digits
|
||||||
|
Uint8 d = 0;
|
||||||
|
// Identify the number of digits
|
||||||
|
do
|
||||||
|
{
|
||||||
|
n /= 10;
|
||||||
|
++d;
|
||||||
|
} while (n != 0);
|
||||||
|
// Push the number of digits on the stack
|
||||||
|
sq_pushinteger(vm, d);
|
||||||
|
// Specify that we have a value on the stack
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------------------------------
|
||||||
|
SQFloat SqIToF(Int64 sigv, Int64 expv, Int32 padn, Int32 padc, bool negf)
|
||||||
|
{
|
||||||
|
// The number of characters to add before the exponent
|
||||||
|
static CharT padb[64];
|
||||||
|
// Is the number of pad characters out of range?
|
||||||
|
if (padn >= 64)
|
||||||
|
{
|
||||||
|
STHROWF("Pad characters out of range: %d >= 64", padn);
|
||||||
|
}
|
||||||
|
// Is the pad character invalid?
|
||||||
|
else if (padc > 9 || padc < 0)
|
||||||
|
{
|
||||||
|
STHROWF("Invalid padding value: %d", padc);
|
||||||
|
}
|
||||||
|
// Write the padding characters
|
||||||
|
std::memset(padb, 48 + padc, padn);
|
||||||
|
// Add the null terminator
|
||||||
|
padb[padn] = '\0';
|
||||||
|
// The obtained string containing the floating point
|
||||||
|
CSStr fstr = nullptr;
|
||||||
|
// Generate the floating point value
|
||||||
|
if (negf)
|
||||||
|
{
|
||||||
|
fstr = ToStrF("-%lld.%s%lld", sigv, padb, expv);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fstr = ToStrF("%lld.%s%lld", sigv, padb, expv);
|
||||||
|
}
|
||||||
|
printf("'%s'\n", fstr);
|
||||||
|
// Now transform the resulted string to a floating point value
|
||||||
|
#ifdef SQUSEDOUBLE
|
||||||
|
return std::strtod(fstr, nullptr);
|
||||||
|
#else
|
||||||
|
return std::strtof(fstr, nullptr);
|
||||||
|
#endif // SQUSEDOUBLE
|
||||||
|
}
|
||||||
|
|
||||||
// ================================================================================================
|
// ================================================================================================
|
||||||
void Register_Math(HSQUIRRELVM vm)
|
void Register_Math(HSQUIRRELVM vm)
|
||||||
{
|
{
|
||||||
@ -1133,9 +1222,13 @@ void Register_Math(HSQUIRRELVM vm)
|
|||||||
.SquirrelFunc(_SC("IsLess"), &SqIsLess)
|
.SquirrelFunc(_SC("IsLess"), &SqIsLess)
|
||||||
.SquirrelFunc(_SC("IsLessEqual"), &SqIsLessEqual)
|
.SquirrelFunc(_SC("IsLessEqual"), &SqIsLessEqual)
|
||||||
.SquirrelFunc(_SC("IsLessGreater"), &SqIsLessGreater)
|
.SquirrelFunc(_SC("IsLessGreater"), &SqIsLessGreater)
|
||||||
.SquirrelFunc(_SC("IsUnordered"), &SqIsUnordered);
|
.SquirrelFunc(_SC("IsUnordered"), &SqIsUnordered)
|
||||||
|
.SquirrelFunc(_SC("Digits1"), &SqDigits1)
|
||||||
|
.SquirrelFunc(_SC("Digits0"), &SqDigits0);
|
||||||
|
|
||||||
RootTable(vm).Bind(_SC("SqMath"), mns);
|
RootTable(vm).Bind(_SC("SqMath"), mns);
|
||||||
|
|
||||||
|
RootTable(vm).Func(_SC("IToF"), &SqIToF);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user