Documentation for this module may be created at Module:Sandbox/trappist the monk/strcmp/doc
--local function strcmp (str_a, str_b)
local function strcmp (frame)
local str_a = frame.args[1];
local str_b = frame.args[2];
str_a = str_a:gsub ('(%-%-templatestyles%-)%x+(%-)', '%100000000%2')
str_b = str_b:gsub ('(%-%-templatestyles%-)%x+(%-)', '%100000000%2')
local result = {};
local len_a = str_a:len();
local len_b = str_b:len();
local t_str_a = {}
local t_str_b = {}
local limit = len_a; -- assume that both strings are same length
if len_a == len_b then
if str_a == str_b then
return 'equal';
end
else
table.insert (result, 'length mismatch: a: ' .. len_a .. '; b: ' .. len_b);
if len_a < len_b then
limit = len_a;
else
limit = len_b;
end
end
for c in string.gmatch (str_a, '.') do
table.insert (t_str_a, c);
end
for c in str_b:gmatch ('.') do
table.insert (t_str_b, c);
end
local i = 1;
while i < limit do
if t_str_a[i] == t_str_b[i] then
i = i + 1; -- position of last equal character
else
break;
end
end
if len_a ~= len_b then -- if length mismatch
if not t_str_a[i] and t_str_b[i] or -- if one but not both are nil
t_str_a[i] and not t_str_b[i] then
i = i + 1; -- point to last matching character
end
end
if limit == i then -- if we tested <limit> number of characters
table.insert (result, 'strings eq to position: ' .. i);
else
table.insert (result, 'strings eq to position: ' .. i .. ': ' .. string.byte (t_str_a[i]) .. '(' .. t_str_a[i] .. ') ≠ ' .. string.byte (t_str_b[i]) .. '(' .. t_str_b[i] .. ')')
end
return table.concat (result, '<br />');
end
return {strcmp = strcmp}