equal
deleted
inserted
replaced
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(); |