util/json.lua
changeset 5517 9d7349bbe4d2
parent 5516 9733836629f9
child 5561 52eef11cd8af
equal deleted inserted replaced
5516:9733836629f9 5517:9d7349bbe4d2
     1 -- Prosody IM
     1 -- Prosody IM
     2 -- Copyright (C) 2008-2010 Matthew Wild
     2 -- Copyright (C) 2008-2010 Matthew Wild
     3 -- Copyright (C) 2008-2010 Waqas Hussain
     3 -- Copyright (C) 2008-2010 Waqas Hussain
     4 --
       
     5 -- utf8char copyright (C) 2007 Rici Lake
       
     6 --
     4 --
     7 -- This project is MIT/X11 licensed. Please see the
     5 -- This project is MIT/X11 licensed. Please see the
     8 -- COPYING file in the source package for more information.
     6 -- COPYING file in the source package for more information.
     9 --
     7 --
    10 
     8 
    39 for i=0,31 do
    37 for i=0,31 do
    40 	local ch = s_char(i);
    38 	local ch = s_char(i);
    41 	if not escapes[ch] then escapes[ch] = ("\\u%.4X"):format(i); end
    39 	if not escapes[ch] then escapes[ch] = ("\\u%.4X"):format(i); end
    42 end
    40 end
    43 
    41 
    44 local function utf8char(i)
    42 local function codepoint_to_utf8(code)
    45 	if i >= 0 then
    43 	if code < 0x80 then return s_char(code); end
    46 		i = i - i%1
    44 	local bits0_6 = code % 64;
    47 		if i < 128 then
    45 	if code < 0x800 then
    48 			return s_char(i)
    46 		local bits6_5 = (code - bits0_6) / 64;
    49 		else
    47 		return s_char(0x80 + 0x40 + bits6_5, 0x80 + bits0_6);
    50 			local c1 = i % 64
    48 	end
    51 			i = (i - c1) / 64
    49 	local bits0_12 = code % 4096;
    52 			if i < 32 then
    50 	local bits6_6 = (bits0_12 - bits0_6) / 64;
    53 				return s_char(0xC0+i, 0x80+c1)
    51 	local bits12_4 = (code - bits0_12) / 4096;
    54 			else
    52 	return s_char(0x80 + 0x40 + 0x20 + bits12_4, 0x80 + bits6_6, 0x80 + bits0_6);
    55         			local c2 = i % 64
    53 end
    56         			i = (i - c2) / 64
       
    57         			if i < 16 and (i ~= 13 or c2 < 32) then
       
    58         				return s_char(0xE0+i, 0x80+c2, 0x80+c1)
       
    59         			elseif i >= 16 and i < 0x110 then
       
    60         				local c3 = i % 64
       
    61         				i = (i - c3) / 64
       
    62         				return s_char(0xF0+i, 0x80+c3, 0x80+c2, 0x80+c1)
       
    63         			end
       
    64 			end
       
    65 		end
       
    66 	end
       
    67 end
       
    68 
       
    69 
    54 
    70 local valid_types = {
    55 local valid_types = {
    71 	number  = true,
    56 	number  = true,
    72 	string  = true,
    57 	string  = true,
    73 	table   = true,
    58 	table   = true,
   290 						next();
   275 						next();
   291 						if not ch then error("unexpected eof in string"); end
   276 						if not ch then error("unexpected eof in string"); end
   292 						if not ch:match("[0-9a-fA-F]") then error("invalid unicode escape sequence in string"); end
   277 						if not ch:match("[0-9a-fA-F]") then error("invalid unicode escape sequence in string"); end
   293 						seq = seq..ch;
   278 						seq = seq..ch;
   294 					end
   279 					end
   295 					s = s..utf8char(tonumber(seq, 16));
   280 					s = s..codepoint_to_utf8(tonumber(seq, 16));
   296 					next();
   281 					next();
   297 				else error("invalid escape sequence in string"); end
   282 				else error("invalid escape sequence in string"); end
   298 			end
   283 			end
   299 			if ch == "\"" then
   284 			if ch == "\"" then
   300 				next();
   285 				next();