1
0
mirror of https://github.com/VCMP-SqMod/SqMod.git synced 2025-01-18 19:47:15 +01:00

Update String.cpp

This commit is contained in:
Sandu Liviu Catalin 2021-04-20 19:50:17 +03:00
parent 68cbbdb831
commit 974b916b5c

View File

@ -754,37 +754,87 @@ static SQInteger SqStrExplode(HSQUIRRELVM vm)
} }
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------
static const SQChar * StrImplode(SQChar chr, Array & arr) static String StrImplode(StackStrF & sep, Array & arr)
{ {
// String buffer
String buf;
// Determine array size // Determine array size
const auto length = static_cast< int32_t >(arr.Length()); const auto length = static_cast< size_t >(arr.Length());
// Is there anything to implode? // Is there anything to implode?
if (length <= 0) if (length <= 0)
{ {
return _SC(""); // Default to an empty string return buf; // Default to an empty string
} }
// Obtain a temporary buffer // Estimate length
Buffer b(length * 32); buf.reserve(length * 32);
// Process array elements // Process array elements
for (SQInteger i = 0; i < length; ++i) const SQRESULT res = arr.Foreach([&](HSQUIRRELVM vm, SQInteger i) -> SQRESULT {
{ StackStrF str(vm, -1);
// Retrieve the element value as string // Retrieve the element value as string
SharedPtr< String > str = arr.GetValue< String >(i); if (SQ_FAILED(str.Proc(false)))
// Was there any value retrieved?
if (!!str)
{ {
// Append the value to the buffer return str.mRes; // Failed!
b.AppendS(str->data(), str->size());
} }
// Append the value to the buffer
buf.append(str.mPtr, static_cast< size_t >(str.mLen));
// Append the delimiter // Append the delimiter
b.Push(chr); buf.append(sep.mPtr, static_cast< size_t >(sep.mLen));
// Successfully processed
return SQ_OK;
});
// Succeeded?
if (SQ_FAILED(res))
{
buf.clear(); // NO!
}
else
{
buf.pop_back(); // Remove trailing separator
} }
// Move the cursor back one element
b.Retreat(1);
// Set that as the null character
b.Cursor() = '\0';
// Return the string // Return the string
return b.Get< SQChar >(); return buf;
}
// ------------------------------------------------------------------------------------------------
static String StrImplodeChar(SQChar chr, Array & arr)
{
// String buffer
String buf;
// Determine array size
const auto length = static_cast< size_t >(arr.Length());
// Is there anything to implode?
if (length <= 0)
{
return buf; // Default to an empty string
}
// Estimate length
buf.reserve(length * 32);
// Process array elements
const SQRESULT res = arr.Foreach([&](HSQUIRRELVM vm, SQInteger i) -> SQRESULT {
StackStrF str(vm, -1);
// Retrieve the element value as string
if (SQ_FAILED(str.Proc(false)))
{
return str.mRes; // Failed!
}
// Append the value to the buffer
buf.append(str.mPtr, static_cast< size_t >(str.mLen));
// Append the delimiter
buf.push_back(chr);
// Successfully processed
return SQ_OK;
});
// Succeeded?
if (SQ_FAILED(res))
{
buf.clear(); // NO!
}
else
{
buf.pop_back(); // Remove trailing separator
}
// Return the string
return buf;
} }
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------
@ -873,6 +923,7 @@ void Register_String(HSQUIRRELVM vm)
strns.Func(_SC("FromArray"), &FromArray) strns.Func(_SC("FromArray"), &FromArray)
.SquirrelFunc(_SC("Explode"), &SqStrExplode) .SquirrelFunc(_SC("Explode"), &SqStrExplode)
.Func(_SC("Implode"), &StrImplode) .Func(_SC("Implode"), &StrImplode)
.Func(_SC("ImplodeChar"), &StrImplodeChar)
.FmtFunc(_SC("Center"), &SqCenterStr) .FmtFunc(_SC("Center"), &SqCenterStr)
.FmtFunc(_SC("Left"), &SqLeftStr) .FmtFunc(_SC("Left"), &SqLeftStr)
.FmtFunc(_SC("Right"), &SqRightStr) .FmtFunc(_SC("Right"), &SqRightStr)