aboutsummaryrefslogtreecommitdiffstats
path: root/libutf8_encode.c
blob: ab8567eb0239256a0261f6088592c7ae12a5da7e (plain) (blame)
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