1 | //======================================================================== |
2 | // |
3 | // UnicodeMapFuncs.cc |
4 | // |
5 | // Copyright 2001-2003 Glyph & Cog, LLC |
6 | // |
7 | //======================================================================== |
8 | |
9 | //======================================================================== |
10 | // |
11 | // Modified under the Poppler project - http://poppler.freedesktop.org |
12 | // |
13 | // All changes made under the Poppler project to this file are licensed |
14 | // under GPL version 2 or later |
15 | // |
16 | // Copyright (C) 2008 Koji Otani <sho@bbr.jp> |
17 | // Copyright (C) 2017 Adrian Johnson <ajohnson@redneon.com> |
18 | // Copyright (C) 2018 Albert Astals Cid <aacid@kde.org> |
19 | // |
20 | // To see a description of the changes please see the Changelog file that |
21 | // came with your tarball or type make ChangeLog if you are building from git |
22 | // |
23 | //======================================================================== |
24 | |
25 | #include "UnicodeMapFuncs.h" |
26 | |
27 | int mapUTF8(Unicode u, char *buf, int bufSize) |
28 | { |
29 | if (u <= 0x0000007f) { |
30 | if (bufSize < 1) { |
31 | return 0; |
32 | } |
33 | buf[0] = (char)u; |
34 | return 1; |
35 | } else if (u <= 0x000007ff) { |
36 | if (bufSize < 2) { |
37 | return 0; |
38 | } |
39 | buf[0] = (char)(0xc0 + (u >> 6)); |
40 | buf[1] = (char)(0x80 + (u & 0x3f)); |
41 | return 2; |
42 | } else if (u <= 0x0000ffff) { |
43 | if (bufSize < 3) { |
44 | return 0; |
45 | } |
46 | buf[0] = (char)(0xe0 + (u >> 12)); |
47 | buf[1] = (char)(0x80 + ((u >> 6) & 0x3f)); |
48 | buf[2] = (char)(0x80 + (u & 0x3f)); |
49 | return 3; |
50 | } else if (u <= 0x0010ffff) { |
51 | if (bufSize < 4) { |
52 | return 0; |
53 | } |
54 | buf[0] = (char)(0xf0 + (u >> 18)); |
55 | buf[1] = (char)(0x80 + ((u >> 12) & 0x3f)); |
56 | buf[2] = (char)(0x80 + ((u >> 6) & 0x3f)); |
57 | buf[3] = (char)(0x80 + (u & 0x3f)); |
58 | return 4; |
59 | } else { |
60 | return 0; |
61 | } |
62 | } |
63 | |
64 | int mapUTF16(Unicode u, char *buf, int bufSize) |
65 | { |
66 | if (u <= 0xffff) { |
67 | if (bufSize < 2) { |
68 | return 0; |
69 | } |
70 | buf[0] = (char)((u >> 8) & 0xff); |
71 | buf[1] = (char)(u & 0xff); |
72 | return 2; |
73 | } else if (u < 0x110000) { |
74 | Unicode uu; |
75 | |
76 | /* using surrogate pair */ |
77 | if (bufSize < 4) { |
78 | return 0; |
79 | } |
80 | uu = ((u - 0x10000) >> 10) + 0xd800; |
81 | buf[0] = (char)((uu >> 8) & 0xff); |
82 | buf[1] = (char)(uu & 0xff); |
83 | uu = (u & 0x3ff) + 0xdc00; |
84 | buf[2] = (char)((uu >> 8) & 0xff); |
85 | buf[3] = (char)(uu & 0xff); |
86 | return 4; |
87 | } else { |
88 | return 0; |
89 | } |
90 | } |
91 | |