mirror of
				https://github.com/neovim/neovim.git
				synced 2025-10-26 12:27:24 +00:00 
			
		
		
		
	 33464189bc
			
		
	
	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
 |