Coverage Report

Created: 2026-10-31 06:21

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/xpdf-4.06/xpdf/UTF8.cc
Line
Count
Source
1
//========================================================================
2
//
3
// UTF8.cc
4
//
5
// Copyright 2001-2017 Glyph & Cog, LLC
6
//
7
//========================================================================
8
9
#include <aconf.h>
10
#include "UTF8.h"
11
12
64.5k
int mapUTF8(Unicode u, char *buf, int bufSize) {
13
64.5k
  if        (u <= 0x0000007f) {
14
60.2k
    if (bufSize < 1) {
15
0
      return 0;
16
0
    }
17
60.2k
    buf[0] = (char)u;
18
60.2k
    return 1;
19
60.2k
  } else if (u <= 0x000007ff) {
20
1.53k
    if (bufSize < 2) {
21
0
      return 0;
22
0
    }
23
1.53k
    buf[0] = (char)(0xc0 + (u >> 6));
24
1.53k
    buf[1] = (char)(0x80 + (u & 0x3f));
25
1.53k
    return 2;
26
2.81k
  } else if (u <= 0x0000ffff) {
27
2.60k
    if (bufSize < 3) {
28
0
      return 0;
29
0
    }
30
2.60k
    buf[0] = (char)(0xe0 + (u >> 12));
31
2.60k
    buf[1] = (char)(0x80 + ((u >> 6) & 0x3f));
32
2.60k
    buf[2] = (char)(0x80 + (u & 0x3f));
33
2.60k
    return 3;
34
2.60k
  } else if (u <= 0x0010ffff) {
35
101
    if (bufSize < 4) {
36
0
      return 0;
37
0
    }
38
101
    buf[0] = (char)(0xf0 + (u >> 18));
39
101
    buf[1] = (char)(0x80 + ((u >> 12) & 0x3f));
40
101
    buf[2] = (char)(0x80 + ((u >> 6) & 0x3f));
41
101
    buf[3] = (char)(0x80 + (u & 0x3f));
42
101
    return 4;
43
106
  } else {
44
106
    return 0;
45
106
  }
46
64.5k
}
47
48
0
int mapUCS2(Unicode u, char *buf, int bufSize) {
49
0
  if (u <= 0xffff) {
50
0
    if (bufSize < 2) {
51
0
      return 0;
52
0
    }
53
0
    buf[0] = (char)((u >> 8) & 0xff);
54
0
    buf[1] = (char)(u & 0xff);
55
0
    return 2;
56
0
  } else {
57
0
    return 0;
58
0
  }
59
0
}
60
61
11.7M
GBool getUTF8(GString *s, int *i, Unicode *u) {
62
11.7M
  Guchar c0, c1, c2, c3, c4, c5;
63
64
11.7M
  if (*i >= s->getLength()) {
65
1.86k
    return gFalse;
66
1.86k
  }
67
11.7M
  c0 = (Guchar)s->getChar((*i)++);
68
11.7M
  if (c0 < 0x80) {
69
9.19M
    *u = (Unicode)c0;
70
9.19M
  } else if (c0 < 0xe0) {
71
1.63M
    if (*i < s->getLength() &&
72
1.63M
  ((c1 = (Guchar)s->getChar(*i)) & 0xc0) == 0x80) {
73
500k
      *i += 1;
74
500k
      *u = (Unicode)(((c0 & 0x1f) << 6) |
75
500k
         (c1 & 0x3f));
76
1.13M
    } else {
77
1.13M
      *u =  (Unicode)c0;
78
1.13M
    }
79
1.63M
  } else if (c0 < 0xf0) {
80
272k
    if (*i < s->getLength() - 1 &&
81
271k
  ((c1 = (Guchar)s->getChar(*i)) & 0xc0) == 0x80 &&
82
40.4k
  ((c2 = (Guchar)s->getChar(*i + 1)) & 0xc0) == 0x80) {
83
10.7k
      *i += 2;
84
10.7k
      *u = (Unicode)(((c0 & 0x0f) << 12) |
85
10.7k
         ((c1 & 0x3f) << 6) |
86
10.7k
         (c2 & 0x3f));
87
261k
    } else {
88
261k
      *u = (Unicode)c0;
89
261k
    }
90
605k
  } else if (c0 < 0xf8) {
91
92.5k
    if (*i < s->getLength() - 2 &&
92
92.1k
  ((c1 = (Guchar)s->getChar(*i)) & 0xc0) == 0x80 &&
93
32.8k
  ((c2 = (Guchar)s->getChar(*i + 1)) & 0xc0) == 0x80 &&
94
10.5k
  ((c3 = (Guchar)s->getChar(*i + 2)) & 0xc0) == 0x80) {
95
7.56k
      *i += 3;
96
7.56k
      *u = (Unicode)(((c0 & 0x07) << 18) |
97
7.56k
         ((c1 & 0x3f) << 12) |
98
7.56k
         ((c2 & 0x3f) << 6) |
99
7.56k
         (c3 & 0x3f));
100
84.9k
    } else {
101
84.9k
      *u = (Unicode)c0;
102
84.9k
    }
103
513k
  } else if (c0 < 0xfc) {
104
23.6k
    if (*i < s->getLength() - 3 &&
105
23.2k
  ((c1 = (Guchar)s->getChar(*i)) & 0xc0) == 0x80 &&
106
7.37k
  ((c2 = (Guchar)s->getChar(*i + 1)) & 0xc0) == 0x80 &&
107
5.74k
  ((c3 = (Guchar)s->getChar(*i + 2)) & 0xc0) == 0x80 &&
108
3.78k
  ((c4 = (Guchar)s->getChar(*i + 3)) & 0xc0) == 0x80) {
109
1.61k
      *i += 4;
110
1.61k
      *u = (Unicode)(((c0 & 0x03) << 24) |
111
1.61k
         ((c1 & 0x3f) << 18) |
112
1.61k
         ((c2 & 0x3f) << 12) |
113
1.61k
         ((c3 & 0x3f) << 6) |
114
1.61k
         (c4 & 0x3f));
115
22.0k
    } else {
116
22.0k
      *u = (Unicode)c0;
117
22.0k
    }
118
489k
  } else if (c0 < 0xfe) {
119
78.9k
    if (*i < s->getLength() - 4 &&
120
78.1k
  ((c1 = (Guchar)s->getChar(*i)) & 0xc0) == 0x80 &&
121
4.08k
  ((c2 = (Guchar)s->getChar(*i + 1)) & 0xc0) == 0x80 &&
122
2.42k
  ((c3 = (Guchar)s->getChar(*i + 2)) & 0xc0) == 0x80 &&
123
2.10k
  ((c4 = (Guchar)s->getChar(*i + 3)) & 0xc0) == 0x80 &&
124
1.76k
  ((c5 = (Guchar)s->getChar(*i + 4)) & 0xc0) == 0x80) {
125
983
      *i += 5;
126
983
      *u = (Unicode)(((c0 & 0x01) << 30) |
127
983
         ((c1 & 0x3f) << 24) |
128
983
         ((c2 & 0x3f) << 18) |
129
983
         ((c3 & 0x3f) << 12) |
130
983
         ((c4 & 0x3f) << 6) |
131
983
         (c5 & 0x3f));
132
77.9k
    } else {
133
77.9k
      *u = (Unicode)c0;
134
77.9k
    }
135
410k
  } else {
136
410k
    *u = (Unicode)c0;
137
410k
  }
138
11.7M
  return gTrue;
139
11.7M
}
140
141
3.87M
GBool getUTF16BE(GString *s, int *i, Unicode *u) {
142
3.87M
  int w0, w1;
143
144
3.87M
  if (*i >= s->getLength() - 1) {
145
30.2k
    return gFalse;
146
30.2k
  }
147
3.84M
  w0 = ((s->getChar(*i) & 0xff) << 8) | (s->getChar(*i + 1) & 0xff);
148
3.84M
  *i += 2;
149
3.84M
  if (w0 < 0xd800 || w0 >= 0xe000) {
150
3.75M
    *u = (Unicode)w0;
151
3.75M
  } else {
152
86.1k
    if (*i < s->getLength() - 1) {
153
85.8k
      w1 = ((s->getChar(*i) & 0xff) << 8) | (s->getChar(*i + 1) & 0xff);
154
85.8k
      *i += 2;
155
85.8k
      *u = 0x10000 + ((w0 - 0xd800) << 10) + (w1 - 0xdc00);
156
85.8k
    } else {
157
289
      *u = (Unicode)w0;
158
289
    }
159
86.1k
  }
160
3.84M
  return gTrue;
161
3.87M
}
162
163
13.8M
GBool getUTF16LE(GString *s, int *i, Unicode *u) {
164
13.8M
  int w0, w1;
165
166
13.8M
  if (*i >= s->getLength() - 1) {
167
59.7k
    return gFalse;
168
59.7k
  }
169
13.8M
  w0 = (s->getChar(*i) & 0xff) | ((s->getChar(*i + 1) & 0xff) << 8);
170
13.8M
  *i += 2;
171
13.8M
  if (w0 < 0xd800 || w0 >= 0xe000) {
172
13.7M
    *u = (Unicode)w0;
173
13.7M
  } else {
174
66.6k
    if (*i < s->getLength() - 1) {
175
64.5k
      w1 = (s->getChar(*i) & 0xff) | ((s->getChar(*i + 1) & 0xff) << 8);
176
64.5k
      *i += 2;
177
64.5k
      *u = 0x10000 + ((w0 - 0xd800) << 10) + (w1 - 0xdc00);
178
64.5k
    } else {
179
2.05k
      *u = (Unicode)w0;
180
2.05k
    }
181
66.6k
  }
182
13.8M
  return gTrue;
183
13.8M
}