Introduction
Introduction Statistics Contact Development Disclaimer Help
bidirectional.c - libgrapheme - unicode string library
git clone git://git.suckless.org/libgrapheme
Log
Files
Refs
README
LICENSE
---
bidirectional.c (3630B)
---
1 /* See LICENSE file for copyright and license details. */
2 #include <inttypes.h>
3 #include <stdbool.h>
4 #include <stdint.h>
5 #include <stdio.h>
6
7 #include "../gen/bidirectional-test.h"
8 #include "../gen/bidirectional.h"
9 #include "../gen/types.h"
10 #include "../grapheme.h"
11 #include "util.h"
12
13 static inline int_least16_t
14 get_mirror_offset(uint_least32_t cp)
15 {
16 if (cp <= UINT32_C(0x10FFFF)) {
17 return mirror_minor[mirror_major[cp >> 8] + (cp & 0xFF)];
18 } else {
19 return 0;
20 }
21 }
22
23 int
24 main(int argc, char *argv[])
25 {
26 enum grapheme_bidirectional_direction resolved;
27 uint_least32_t data[512], output[512],
28 target; /* TODO iterate and get max, allocate */
29 int_least8_t lev[512];
30 size_t i, num_tests, failed, datalen, levlen, outputlen, ret, j,…
31 ret2;
32
33 datalen = LEN(data);
34 levlen = LEN(lev);
35 outputlen = LEN(output);
36
37 (void)argc;
38
39 for (i = 0, num_tests = 0; i < LEN(bidirectional_test); i++) {
40 num_tests += bidirectional_test[i].modelen;
41 }
42
43 for (i = 0, failed = 0; i < LEN(bidirectional_test); i++) {
44 for (m = 0; m < bidirectional_test[i].modelen; m++) {
45 ret = grapheme_bidirectional_preprocess_paragrap…
46 bidirectional_test[i].cp,
47 bidirectional_test[i].cplen,
48 bidirectional_test[i].mode[m], data, dat…
49 &resolved);
50 ret2 = 0;
51
52 if (ret != bidirectional_test[i].cplen ||
53 ret > datalen) {
54 goto err;
55 }
56
57 /* resolved paragraph level (if specified in the…
58 */
59 if (bidirectional_test[i].resolved !=
60 GRAPHEME_BIDIRECTIONAL_DIRECTION_NEU…
61 resolved != bidirectional_test[i].resolved) {
62 goto err;
63 }
64
65 /* line levels */
66 ret = grapheme_bidirectional_get_line_embedding_…
67 data, ret, lev, levlen);
68
69 if (ret > levlen) {
70 goto err;
71 }
72
73 for (j = 0; j < ret; j++) {
74 if (lev[j] != bidirectional_test[i].leve…
75 goto err;
76 }
77 }
78
79 /* reordering */
80 ret2 = grapheme_bidirectional_reorder_line(
81 bidirectional_test[i].cp, data, ret, out…
82 outputlen);
83
84 if (ret2 != bidirectional_test[i].reorderlen) {
85 goto err;
86 }
87
88 for (j = 0; j < ret2; j++) {
89 target = bidirectional_test[i]
90 .cp[bidirectional_test[…
91 .reorder[j]…
92 if (output[j] !=
93 (uint_least32_t)((int_least32_t)targ…
94 get_mirror_offset(
95 target))) {
96 goto err;
97 }
98 }
99
100 continue;
101 err:
102 fprintf(stderr,
103 "%s: Failed conformance test %zu (mode %…
104 argv[0], i, bidirectional_test[i].mode[m…
105 for (j = 0; j < bidirectional_test[i].cplen; j++…
106 fprintf(stderr, " 0x%04" PRIXLEAST32,
107 bidirectional_test[i].cp[j]);
108 }
109 fprintf(stderr, " ],\n\tlevels: got (");
110 for (j = 0; j < ret; j++) {
111 fprintf(stderr, " %" PRIdLEAST8,
112 (int_least8_t)lev[j]);
113 }
114 fprintf(stderr, " ),\n\tlevels: expected (");
115 for (j = 0; j < ret; j++) {
116 fprintf(stderr, " %" PRIdLEAST8,
117 bidirectional_test[i].level[j]);
118 }
119 fprintf(stderr, " ).\n");
120
121 fprintf(stderr, "\treordering: got (");
122 for (j = 0; j < ret2; j++) {
123 fprintf(stderr, " 0x%04" PRIxLEAST32,
124 output[j]);
125 }
126 fprintf(stderr, " ),\n\treordering: expected (");
127 for (j = 0; j < bidirectional_test[i].reorderlen…
128 fprintf(stderr, " 0x%04" PRIxLEAST32,
129 bidirectional_test[i]
130 .cp[bidirectional_test[i]
131 .reorder[j]]…
132 }
133 fprintf(stderr, " ).\n");
134
135 failed++;
136 }
137 }
138 printf("%s: %zu/%zu conformance tests passed.\n", argv[0],
139 num_tests - failed, num_tests);
140
141 return 0;
142 }
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.