character.c - libgrapheme - unicode string library
(HTM) git clone git://git.suckless.org/libgrapheme
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
character.c (4417B)
---
1 /* See LICENSE file for copyright and license details. */
2 #include <stddef.h>
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <string.h>
6
7 #include "util.h"
8
9 #define FILE_DCP "data/DerivedCoreProperties.txt"
10 #define FILE_EMOJI "data/emoji-data.txt"
11 #define FILE_GRAPHEME "data/GraphemeBreakProperty.txt"
12
13 static const struct property_spec char_break_property[] = {
14 {
15 .enumname = "OTHER",
16 .file = NULL,
17 .ucdname = NULL,
18 },
19 {
20 .enumname = "BOTH_EXTEND_ICB_EXTEND",
21 .file = NULL,
22 .ucdname = NULL,
23 },
24 {
25 .enumname = "BOTH_EXTEND_ICB_LINKER",
26 .file = NULL,
27 .ucdname = NULL,
28 },
29 {
30 .enumname = "BOTH_ZWJ_ICB_EXTEND",
31 .file = NULL,
32 .ucdname = NULL,
33 },
34 {
35 .enumname = "CONTROL",
36 .file = FILE_GRAPHEME,
37 .ucdname = "Control",
38 },
39 {
40 .enumname = "CR",
41 .file = FILE_GRAPHEME,
42 .ucdname = "CR",
43 },
44 {
45 .enumname = "EXTEND",
46 .file = FILE_GRAPHEME,
47 .ucdname = "Extend",
48 },
49 {
50 .enumname = "EXTENDED_PICTOGRAPHIC",
51 .file = FILE_EMOJI,
52 .ucdname = "Extended_Pictographic",
53 },
54 {
55 .enumname = "HANGUL_L",
56 .file = FILE_GRAPHEME,
57 .ucdname = "L",
58 },
59 {
60 .enumname = "HANGUL_V",
61 .file = FILE_GRAPHEME,
62 .ucdname = "V",
63 },
64 {
65 .enumname = "HANGUL_T",
66 .file = FILE_GRAPHEME,
67 .ucdname = "T",
68 },
69 {
70 .enumname = "HANGUL_LV",
71 .file = FILE_GRAPHEME,
72 .ucdname = "LV",
73 },
74 {
75 .enumname = "HANGUL_LVT",
76 .file = FILE_GRAPHEME,
77 .ucdname = "LVT",
78 },
79 {
80 .enumname = "ICB_CONSONANT",
81 .file = FILE_DCP,
82 .ucdname = "InCB",
83 .ucdsubname = "Consonant",
84 },
85 {
86 .enumname = "ICB_EXTEND",
87 .file = FILE_DCP,
88 .ucdname = "InCB",
89 .ucdsubname = "Extend",
90 },
91 {
92 .enumname = "ICB_LINKER",
93 .file = FILE_DCP,
94 .ucdname = "InCB",
95 .ucdsubname = "Linker",
96 },
97 {
98 .enumname = "LF",
99 .file = FILE_GRAPHEME,
100 .ucdname = "LF",
101 },
102 {
103 .enumname = "PREPEND",
104 .file = FILE_GRAPHEME,
105 .ucdname = "Prepend",
106 },
107 {
108 .enumname = "REGIONAL_INDICATOR",
109 .file = FILE_GRAPHEME,
110 .ucdname = "Regional_Indicator",
111 },
112 {
113 .enumname = "SPACINGMARK",
114 .file = FILE_GRAPHEME,
115 .ucdname = "SpacingMark",
116 },
117 {
118 .enumname = "ZWJ",
119 .file = FILE_GRAPHEME,
120 .ucdname = "ZWJ",
121 },
122 };
123
124 static uint_least8_t
125 handle_conflict(uint_least32_t cp, uint_least8_t prop1, uint_least8_t prop2)
126 {
127 uint_least8_t result;
128
129 (void)cp;
130
131 if ((!strcmp(char_break_property[prop1].enumname, "EXTEND") &&
132 !strcmp(char_break_property[prop2].enumname, "ICB_EXTEND")) ||
133 (!strcmp(char_break_property[prop1].enumname, "ICB_EXTEND") &&
134 !strcmp(char_break_property[prop2].enumname, "EXTEND"))) {
135 for (result = 0; result < LEN(char_break_property); result++) {
136 if (!strcmp(char_break_property[result].enumname,
137 "BOTH_EXTEND_ICB_EXTEND")) {
138 break;
139 }
140 }
141 if (result == LEN(char_break_property)) {
142 fprintf(stderr, "handle_conflict: Internal error.\n");
143 exit(1);
144 }
145 } else if ((!strcmp(char_break_property[prop1].enumname, "EXTEND") &&
146 !strcmp(char_break_property[prop2].enumname,
147 "ICB_LINKER")) ||
148 (!strcmp(char_break_property[prop1].enumname,
149 "ICB_LINKER") &&
150 !strcmp(char_break_property[prop2].enumname, "EXTEND"))) {
151 for (result = 0; result < LEN(char_break_property); result++) {
152 if (!strcmp(char_break_property[result].enumname,
153 "BOTH_EXTEND_ICB_LINKER")) {
154 break;
155 }
156 }
157 if (result == LEN(char_break_property)) {
158 fprintf(stderr, "handle_conflict: Internal error.\n");
159 exit(1);
160 }
161 } else if ((!strcmp(char_break_property[prop1].enumname, "ZWJ") &&
162 !strcmp(char_break_property[prop2].enumname,
163 "ICB_EXTEND")) ||
164 (!strcmp(char_break_property[prop1].enumname,
165 "ICB_EXTEND") &&
166 !strcmp(char_break_property[prop2].enumname, "ZWJ"))) {
167 for (result = 0; result < LEN(char_break_property); result++) {
168 if (!strcmp(char_break_property[result].enumname,
169 "BOTH_ZWJ_ICB_EXTEND")) {
170 break;
171 }
172 }
173 if (result == LEN(char_break_property)) {
174 fprintf(stderr, "handle_conflict: Internal error.\n");
175 exit(1);
176 }
177 } else {
178 fprintf(stderr, "handle_conflict: Cannot handle conflict.\n");
179 exit(1);
180 }
181
182 return result;
183 }
184
185 int
186 main(int argc, char *argv[])
187 {
188 (void)argc;
189
190 properties_generate_break_property(
191 char_break_property, LEN(char_break_property), NULL,
192 handle_conflict, NULL, "char_break", argv[0]);
193
194 return 0;
195 }