mirror of
https://github.com/luau-lang/luau.git
synced 2025-05-04 10:33:46 +01:00
Add %* format specifier
This commit is contained in:
parent
d3b566c258
commit
9feb7eaa01
3 changed files with 44 additions and 0 deletions
|
@ -8,6 +8,8 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
LUAU_FASTFLAGVARIABLE(LuauTostringFormatSpecifier, false);
|
||||||
|
|
||||||
/* macro to `unsign' a character */
|
/* macro to `unsign' a character */
|
||||||
#define uchar(c) ((unsigned char)(c))
|
#define uchar(c) ((unsigned char)(c))
|
||||||
|
|
||||||
|
@ -1032,6 +1034,26 @@ static int str_format(lua_State* L)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
case '*':
|
||||||
|
{
|
||||||
|
if (!FFlag::LuauTostringFormatSpecifier)
|
||||||
|
{
|
||||||
|
luaL_error(L, "invalid option '%%*' to 'format'");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (formatItemSize != 1)
|
||||||
|
{
|
||||||
|
luaL_error(L, "'%%*' does not take a form");
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t length;
|
||||||
|
const char* string = luaL_tolstring(L, arg, &length);
|
||||||
|
|
||||||
|
luaL_addlstring(&b, string, length);
|
||||||
|
|
||||||
|
continue; /* skip the `addsize' at the end */
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
{ /* also treat cases `pnLlh' */
|
{ /* also treat cases `pnLlh' */
|
||||||
luaL_error(L, "invalid option '%%%c' to 'format'", *(strfrmt - 1));
|
luaL_error(L, "invalid option '%%%c' to 'format'", *(strfrmt - 1));
|
||||||
|
|
|
@ -291,6 +291,8 @@ TEST_CASE("Clear")
|
||||||
|
|
||||||
TEST_CASE("Strings")
|
TEST_CASE("Strings")
|
||||||
{
|
{
|
||||||
|
ScopedFastFlag sff{"LuauTostringFormatSpecifier", true};
|
||||||
|
|
||||||
runConformance("strings.lua");
|
runConformance("strings.lua");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -130,6 +130,26 @@ assert(string.format('"-%20s.20s"', string.rep("%", 2000)) ==
|
||||||
-- longest number that can be formated
|
-- longest number that can be formated
|
||||||
assert(string.len(string.format('%99.99f', -1e308)) >= 100)
|
assert(string.len(string.format('%99.99f', -1e308)) >= 100)
|
||||||
|
|
||||||
|
local function return_one_thing()
|
||||||
|
return "hi"
|
||||||
|
end
|
||||||
|
local function return_two_nils()
|
||||||
|
return nil, nil
|
||||||
|
end
|
||||||
|
|
||||||
|
assert(string.format("%*", return_one_thing()) == "hi")
|
||||||
|
assert(string.format("%* %*", return_two_nils()) == "nil nil")
|
||||||
|
assert(pcall(function()
|
||||||
|
string.format("%* %* %*", return_two_nils())
|
||||||
|
end) == false)
|
||||||
|
|
||||||
|
assert(string.format("%*", "a\0b\0c") == "a\0b\0c")
|
||||||
|
assert(string.format("%*", string.rep("doge", 3000)) == string.rep("doge", 3000))
|
||||||
|
|
||||||
|
assert(pcall(function()
|
||||||
|
string.format("%#*", "bad form")
|
||||||
|
end) == false)
|
||||||
|
|
||||||
assert(loadstring("return 1\n--comentário sem EOL no final")() == 1)
|
assert(loadstring("return 1\n--comentário sem EOL no final")() == 1)
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue