diff --git a/inspect.lua b/inspect.lua index c7179d1..e55f7c4 100644 --- a/inspect.lua +++ b/inspect.lua @@ -47,8 +47,18 @@ local controlCharsTranslation = { ["\r"] = "\\r", ["\t"] = "\\t", ["\v"] = "\\v" } +local controlCharsTranslationBeforeDigit = {} + +for i=0, 31 do + local ch = string.char(i) + if not controlCharsTranslation[ch] then + controlCharsTranslation[ch] = "\\"..i + controlCharsTranslationBeforeDigit[ch] = string.format("\\%03d",i) + end +end + local function escape(str) - local result = str:gsub("\\", "\\\\"):gsub("(%c)", controlCharsTranslation) + local result = str:gsub("\\", "\\\\"):gsub("(%c)%f[0-9]", controlCharsTranslationBeforeDigit):gsub("(%c)", controlCharsTranslation) return result end diff --git a/spec/inspect_spec.lua b/spec/inspect_spec.lua index 23868f0..4367fd4 100644 --- a/spec/inspect_spec.lua +++ b/spec/inspect_spec.lua @@ -38,6 +38,11 @@ describe( 'inspect', function() assert.equals('"I have \\b a back space"', inspect('I have \b a back space')) end) + it('escapes zeroes and other control characters properly', function() + assert.equals('"I have \\0 zeroes \\0000 and other \\1 control \\0010 characters \\6 \\17 \\0279 \\31"', + inspect('I have \0 zeroes \0000 and other \1 control \0010 characters \6 \17 \0279 \31')) + end) + it('backslashes its backslashes', function() assert.equals('"I have \\\\ a backslash"', inspect('I have \\ a backslash')) assert.equals('"I have \\\\\\\\ two backslashes"', inspect('I have \\\\ two backslashes'))