1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
/* See LICENSE file for copyright and license details. */
#include "common.h"
#ifndef TEST
size_t
libutf8_encode(char *out_buffer, uint_least32_t codepoint)
{
size_t n = libutf8_encode_measure(codepoint);
ENCODE(n);
return n;
}
#else
int
main(void)
{
/* Already mostly tested in libutf8_encode_measure */
uint_least32_t cp;
char buf[128];
char ones[128];
unsigned char bit;
size_t i, n;
SET_UP_TEST();
memset(ones, 255, sizeof(ones));
for (cp = 0u; cp < (uint_least32_t)0x200000ul; cp++) {
memset(buf, 255, sizeof(buf));
n = libutf8_encode(buf, cp);
assert(!memcmp(&buf[n], ones, sizeof(buf) - n));
for (i = 1u; i < n; i++)
assert(((unsigned char)buf[i] & 0xC0u) == 0x80u);
if (n == 1u) {
assert(((unsigned char)buf[0u] & 0x80u) == 0x00u);
continue;
}
bit = (unsigned char)0x80u;
for (i = 0u; i < n; i++, bit >>= 1)
assert((unsigned char)buf[0u] & bit);
assert(!((unsigned char)buf[0u] & bit));
}
memset(buf, 255, sizeof(buf));
assert(libutf8_encode(buf, (uint_least32_t)1 << 31) == 0u);
assert(!memcmp(buf, ones, sizeof(buf)));
return 0;
}
#endif
|