Comparison

util/format.lua @ 12035:dc7ab05005e8

util.format: Fix Lua 5.1 quirks thanks to ALL THE TESTS
author Kim Alvefur <zash@zash.se>
date Sat, 11 Dec 2021 20:40:23 +0100
parent 12033:161f8268c4b3
child 12036:2ce06f788093
comparison
equal deleted inserted replaced
12034:ee94ac51b2dd 12035:dc7ab05005e8
27 ["\021"] = "\226\144\149", ["\022"] = "\226\144\150", ["\023"] = "\226\144\151", 27 ["\021"] = "\226\144\149", ["\022"] = "\226\144\150", ["\023"] = "\226\144\151",
28 ["\024"] = "\226\144\152", ["\025"] = "\226\144\153", ["\026"] = "\226\144\154", 28 ["\024"] = "\226\144\152", ["\025"] = "\226\144\153", ["\026"] = "\226\144\154",
29 ["\027"] = "\226\144\155", ["\028"] = "\226\144\156", ["\029"] = "\226\144\157", 29 ["\027"] = "\226\144\155", ["\028"] = "\226\144\156", ["\029"] = "\226\144\157",
30 ["\030"] = "\226\144\158", ["\031"] = "\226\144\159", ["\127"] = "\226\144\161", 30 ["\030"] = "\226\144\158", ["\031"] = "\226\144\159", ["\127"] = "\226\144\161",
31 }; 31 };
32 local supports_p = pcall(string.format, "%p", ""); 32 local supports_p = pcall(string.format, "%p", ""); -- >= Lua 5.4
33 local supports_a = pcall(string.format, "%a", 0.0); -- > Lua 5.1
33 34
34 local function format(formatstring, ...) 35 local function format(formatstring, ...)
35 local args = pack(...); 36 local args = pack(...);
36 local args_length = args.n; 37 local args_length = args.n;
37 38
64 local t = type(arg); 65 local t = type(arg);
65 66
66 if option == "s" and t == "string" and not arg:find("[%z\1-\31\128-\255]") then 67 if option == "s" and t == "string" and not arg:find("[%z\1-\31\128-\255]") then
67 -- No UTF-8 or control characters, assumed to be the common case. 68 -- No UTF-8 or control characters, assumed to be the common case.
68 return 69 return
70 elseif option == "s" and t ~= "string" then
71 args[i] = tostring(arg);
69 end 72 end
70 73
71 if option ~= "s" and option ~= "q" and option ~= "p" then 74 if option ~= "s" and option ~= "q" and option ~= "p" then
72 -- all other options expect numbers 75 -- all other options expect numbers
73 if t ~= "number" then 76 if t ~= "number" then
77 spec = "[%s]"; 80 spec = "[%s]";
78 t = "string"; 81 t = "string";
79 elseif expects_integer[option] and num_type(arg) ~= "integer" then 82 elseif expects_integer[option] and num_type(arg) ~= "integer" then
80 args[i] = tostring(arg); 83 args[i] = tostring(arg);
81 return "[%s]"; 84 return "[%s]";
85 elseif (option == "a" or option == "A") and not supports_a then
86 return "%x";
82 else 87 else
83 return -- acceptable number 88 return -- acceptable number
84 end 89 end
85 end 90 end
86 91