mirror of
https://github.com/neovim/neovim.git
synced 2024-12-24 13:15:09 -07:00
33464189bc
Lua's string.byte has a maximum (undocumented) allowable length, so vim.text.hencode fails on large strings with the error "string slice too long". Instead of converting the string to an array of bytes up front, convert each character to a byte one at a time.
36 lines
802 B
Lua
36 lines
802 B
Lua
-- Text processing functions.
|
|
|
|
local M = {}
|
|
|
|
--- Hex encode a string.
|
|
---
|
|
--- @param str string String to encode
|
|
--- @return string : Hex encoded string
|
|
function M.hexencode(str)
|
|
local enc = {} ---@type string[]
|
|
for i = 1, #str do
|
|
enc[i] = string.format('%02X', str:byte(i, i + 1))
|
|
end
|
|
return table.concat(enc)
|
|
end
|
|
|
|
--- Hex decode a string.
|
|
---
|
|
--- @param enc string String to decode
|
|
--- @return string? : Decoded string
|
|
--- @return string? : Error message, if any
|
|
function M.hexdecode(enc)
|
|
if #enc % 2 ~= 0 then
|
|
return nil, 'string must have an even number of hex characters'
|
|
end
|
|
|
|
local str = {} ---@type string[]
|
|
for i = 1, #enc, 2 do
|
|
local n = assert(tonumber(enc:sub(i, i + 1), 16))
|
|
str[#str + 1] = string.char(n)
|
|
end
|
|
return table.concat(str), nil
|
|
end
|
|
|
|
return M
|