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
27int 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
64int 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

source code of poppler/poppler/UnicodeMapFuncs.cc