Introduction
Introduction Statistics Contact Development Disclaimer Help
utf8-encode.c - libgrapheme - unicode string library
git clone git://git.suckless.org/libgrapheme
Log
Files
Refs
README
LICENSE
---
utf8-encode.c (2238B)
---
1 /* See LICENSE file for copyright and license details. */
2 #include <stddef.h>
3 #include <stdint.h>
4 #include <stdio.h>
5 #include <string.h>
6
7 #include "../grapheme.h"
8 #include "util.h"
9
10 static const struct {
11 uint_least32_t cp; /* input codepoint */
12 char *exp_arr; /* expected UTF-8 byte sequence */
13 size_t exp_len; /* expected length of UTF-8 sequence */
14 } enc_test[] = {
15 {
16 /* invalid codepoint (UTF-16 surrogate half) */
17 .cp = UINT32_C(0xD800),
18 .exp_arr = (char *)(unsigned char[]) { 0xEF, 0xBF, 0xBD …
19 .exp_len = 3,
20 },
21 {
22 /* invalid codepoint (UTF-16-unrepresentable) */
23 .cp = UINT32_C(0x110000),
24 .exp_arr = (char *)(unsigned char[]) { 0xEF, 0xBF, 0xBD …
25 .exp_len = 3,
26 },
27 {
28 /* codepoint encoded to a 1-byte sequence */
29 .cp = 0x01,
30 .exp_arr = (char *)(unsigned char[]) { 0x01 },
31 .exp_len = 1,
32 },
33 {
34 /* codepoint encoded to a 2-byte sequence */
35 .cp = 0xFF,
36 .exp_arr = (char *)(unsigned char[]) { 0xC3, 0xBF },
37 .exp_len = 2,
38 },
39 {
40 /* codepoint encoded to a 3-byte sequence */
41 .cp = 0xFFF,
42 .exp_arr = (char *)(unsigned char[]) { 0xE0, 0xBF, 0xBF …
43 .exp_len = 3,
44 },
45 {
46 /* codepoint encoded to a 4-byte sequence */
47 .cp = UINT32_C(0xFFFFF),
48 .exp_arr = (char *)(unsigned char[]) { 0xF3, 0xBF, 0xBF,…
49 .exp_len = 4,
50 },
51 };
52
53 int
54 main(int argc, char *argv[])
55 {
56 size_t i, j, failed;
57
58 (void)argc;
59
60 /* UTF-8 encoder test */
61 for (i = 0, failed = 0; i < LEN(enc_test); i++) {
62 char arr[4];
63 size_t len;
64
65 len = grapheme_encode_utf8(enc_test[i].cp, arr, LEN(arr)…
66
67 if (len != enc_test[i].exp_len ||
68 memcmp(arr, enc_test[i].exp_arr, len)) {
69 fprintf(stderr,
70 "%s, Failed test %zu: "
71 "Expected (",
72 argv[0], i);
73 for (j = 0; j < enc_test[i].exp_len; j++) {
74 fprintf(stderr, "0x%x", enc_test[i].exp_…
75 if (j + 1 < enc_test[i].exp_len) {
76 fprintf(stderr, " ");
77 }
78 }
79 fprintf(stderr, "), but got (");
80 for (j = 0; j < len; j++) {
81 fprintf(stderr, "0x%x", arr[j]);
82 if (j + 1 < len) {
83 fprintf(stderr, " ");
84 }
85 }
86 fprintf(stderr, ").\n");
87 failed++;
88 }
89 }
90 printf("%s: %zu/%zu unit tests passed.\n", argv[0],
91 LEN(enc_test) - failed, LEN(enc_test));
92
93 return (failed > 0) ? 1 : 0;
94 }
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.