1 /**************************************************************************/
2 /* */
3 /* Copyright (c) Microsoft Corporation. All rights reserved. */
4 /* */
5 /* This software is licensed under the Microsoft Software License */
6 /* Terms for Microsoft Azure RTOS. Full text of the license can be */
7 /* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
8 /* and in the root directory of this software. */
9 /* */
10 /**************************************************************************/
11
12
13 /**************************************************************************/
14 /**************************************************************************/
15 /** */
16 /** GUIX Component */
17 /** */
18 /** Utility (Utility) */
19 /** */
20 /**************************************************************************/
21 #define GX_SOURCE_CODE
22
23
24 /* Include necessary system files. */
25
26 #include "gx_api.h"
27 #include "gx_utility.h"
28
29 #if defined(GX_DYNAMIC_BIDI_TEXT_SUPPORT)
30 typedef struct GX_BIDI_MIRROR_STRUCT
31 {
32 USHORT gx_bidi_code;
33 USHORT gx_bidi_mirror_code;
34 } GX_BIDI_MIRROR;
35
36 static GX_CONST GX_BIDI_MIRROR _gx_bidi_mirroring[] =
37 {
38 {0x0028, 0x0029}, /* LEFT PARENTHESIS */
39 {0x0029, 0x0028}, /*RIGHT PARENTHESIS */
40 {0x003C, 0x003E}, /*LESS-THAN SIGN */
41 {0x003E, 0x003C}, /*GREATER-THAN SIGN */
42 {0x005B, 0x005D}, /*LEFT SQUARE BRACKET */
43 {0x005D, 0x005B}, /*RIGHT SQUARE BRACKET */
44 {0x007B, 0x007D}, /*LEFT CURLY BRACKET */
45 {0x007D, 0x007B}, /*RIGHT CURLY BRACKET */
46 {0x00AB, 0x00BB}, /*LEFT-POINTING DOUBLE ANGLE QUOTATION MARK */
47 {0x00BB, 0x00AB}, /*RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK */
48 {0x0F3A, 0x0F3B}, /*TIBETAN MARK GUG RTAGS GYON */
49 {0x0F3B, 0x0F3A}, /*TIBETAN MARK GUG RTAGS GYAS */
50 {0x0F3C, 0x0F3D}, /*TIBETAN MARK ANG KHANG GYON */
51 {0x0F3D, 0x0F3C}, /*TIBETAN MARK ANG KHANG GYAS */
52 {0x169B, 0x169C}, /*OGHAM FEATHER MARK */
53 {0x169C, 0x169B}, /*OGHAM REVERSED FEATHER MARK */
54 {0x2039, 0x203A}, /*SINGLE LEFT-POINTING ANGLE QUOTATION MARK */
55 {0x203A, 0x2039}, /*SINGLE RIGHT-POINTING ANGLE QUOTATION MARK */
56 {0x2045, 0x2046}, /*LEFT SQUARE BRACKET WITH QUILL */
57 {0x2046, 0x2045}, /*RIGHT SQUARE BRACKET WITH QUILL */
58 {0x207D, 0x207E}, /*SUPERSCRIPT LEFT PARENTHESIS */
59 {0x207E, 0x207D}, /*SUPERSCRIPT RIGHT PARENTHESIS */
60 {0x208D, 0x208E}, /*SUBSCRIPT LEFT PARENTHESIS */
61 {0x208E, 0x208D}, /*SUBSCRIPT RIGHT PARENTHESIS */
62 {0x2208, 0x220B}, /*ELEMENT OF */
63 {0x2209, 0x220C}, /*NOT AN ELEMENT OF */
64 {0x220A, 0x220D}, /*SMALL ELEMENT OF */
65 {0x220B, 0x2208}, /*CONTAINS AS MEMBER */
66 {0x220C, 0x2209}, /*DOES NOT CONTAIN AS MEMBER */
67 {0x220D, 0x220A}, /*SMALL CONTAINS AS MEMBER */
68 {0x2215, 0x29F5}, /*DIVISION SLASH */
69 {0x223C, 0x223D}, /*TILDE OPERATOR */
70 {0x223D, 0x223C}, /*REVERSED TILDE */
71 {0x2243, 0x22CD}, /*ASYMPTOTICALLY EQUAL TO */
72 {0x2252, 0x2253}, /*APPROXIMATELY EQUAL TO OR THE IMAGE OF */
73 {0x2253, 0x2252}, /*IMAGE OF OR APPROXIMATELY EQUAL TO */
74 {0x2254, 0x2255}, /*COLON EQUALS */
75 {0x2255, 0x2254}, /*EQUALS COLON */
76 {0x2264, 0x2265}, /*LESS-THAN OR EQUAL TO */
77 {0x2265, 0x2264}, /*GREATER-THAN OR EQUAL TO */
78 {0x2266, 0x2267}, /*LESS-THAN OVER EQUAL TO */
79 {0x2267, 0x2266}, /*GREATER-THAN OVER EQUAL TO */
80 {0x2268, 0x2269}, /*[BEST FIT] LESS-THAN BUT NOT EQUAL TO */
81 {0x2269, 0x2268}, /*[BEST FIT] GREATER-THAN BUT NOT EQUAL TO */
82 {0x226A, 0x226B}, /*MUCH LESS-THAN */
83 {0x226B, 0x226A}, /*MUCH GREATER-THAN */
84 {0x226E, 0x226F}, /*[BEST FIT] NOT LESS-THAN */
85 {0x226F, 0x226E}, /*[BEST FIT] NOT GREATER-THAN */
86 {0x2270, 0x2271}, /*[BEST FIT] NEITHER LESS-THAN NOR EQUAL TO */
87 {0x2271, 0x2270}, /*[BEST FIT] NEITHER GREATER-THAN NOR EQUAL TO */
88 {0x2272, 0x2273}, /*[BEST FIT] LESS-THAN OR EQUIVALENT TO */
89 {0x2273, 0x2272}, /*[BEST FIT] GREATER-THAN OR EQUIVALENT TO */
90 {0x2274, 0x2275}, /*[BEST FIT] NEITHER LESS-THAN NOR EQUIVALENT TO */
91 {0x2275, 0x2274}, /*[BEST FIT] NEITHER GREATER-THAN NOR EQUIVALENT TO */
92 {0x2276, 0x2277}, /*LESS-THAN OR GREATER-THAN */
93 {0x2277, 0x2276}, /*GREATER-THAN OR LESS-THAN */
94 {0x2278, 0x2279}, /*[BEST FIT] NEITHER LESS-THAN NOR GREATER-THAN */
95 {0x2279, 0x2278}, /*[BEST FIT] NEITHER GREATER-THAN NOR LESS-THAN */
96 {0x227A, 0x227B}, /*PRECEDES */
97 {0x227B, 0x227A}, /*SUCCEEDS */
98 {0x227C, 0x227D}, /*PRECEDES OR EQUAL TO */
99 {0x227D, 0x227C}, /*SUCCEEDS OR EQUAL TO */
100 {0x227E, 0x227F}, /*[BEST FIT] PRECEDES OR EQUIVALENT TO */
101 {0x227F, 0x227E}, /*[BEST FIT] SUCCEEDS OR EQUIVALENT TO */
102 {0x2280, 0x2281}, /*[BEST FIT] DOES NOT PRECEDE */
103 {0x2281, 0x2280}, /*[BEST FIT] DOES NOT SUCCEED */
104 {0x2282, 0x2283}, /*SUBSET OF */
105 {0x2283, 0x2282}, /*SUPERSET OF */
106 {0x2284, 0x2285}, /*[BEST FIT] NOT A SUBSET OF */
107 {0x2285, 0x2284}, /*[BEST FIT] NOT A SUPERSET OF */
108 {0x2286, 0x2287}, /*SUBSET OF OR EQUAL TO */
109 {0x2287, 0x2286}, /*SUPERSET OF OR EQUAL TO */
110 {0x2288, 0x2289}, /*[BEST FIT] NEITHER A SUBSET OF NOR EQUAL TO */
111 {0x2289, 0x2288}, /*[BEST FIT] NEITHER A SUPERSET OF NOR EQUAL TO */
112 {0x228A, 0x228B}, /*[BEST FIT] SUBSET OF WITH NOT EQUAL TO */
113 {0x228B, 0x228A}, /*[BEST FIT] SUPERSET OF WITH NOT EQUAL TO */
114 {0x228F, 0x2290}, /*SQUARE IMAGE OF */
115 {0x2290, 0x228F}, /*SQUARE ORIGINAL OF */
116 {0x2291, 0x2292}, /*SQUARE IMAGE OF OR EQUAL TO */
117 {0x2292, 0x2291}, /*SQUARE ORIGINAL OF OR EQUAL TO */
118 {0x2298, 0x29B8}, /*CIRCLED DIVISION SLASH */
119 {0x22A2, 0x22A3}, /*RIGHT TACK */
120 {0x22A3, 0x22A2}, /*LEFT TACK */
121 {0x22A6, 0x2ADE}, /*ASSERTION */
122 {0x22A8, 0x2AE4}, /*TRUE */
123 {0x22A9, 0x2AE3}, /*FORCES */
124 {0x22AB, 0x2AE5}, /*DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE */
125 {0x22B0, 0x22B1}, /*PRECEDES UNDER RELATION */
126 {0x22B1, 0x22B0}, /*SUCCEEDS UNDER RELATION */
127 {0x22B2, 0x22B3}, /*NORMAL SUBGROUP OF */
128 {0x22B3, 0x22B2}, /*CONTAINS AS NORMAL SUBGROUP */
129 {0x22B4, 0x22B5}, /*NORMAL SUBGROUP OF OR EQUAL TO */
130 {0x22B5, 0x22B4}, /*CONTAINS AS NORMAL SUBGROUP OR EQUAL TO */
131 {0x22B6, 0x22B7}, /*ORIGINAL OF */
132 {0x22B7, 0x22B6}, /*IMAGE OF */
133 {0x22C9, 0x22CA}, /*LEFT NORMAL FACTOR SEMIDIRECT PRODUCT */
134 {0x22CA, 0x22C9}, /*RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT */
135 {0x22CB, 0x22CC}, /*LEFT SEMIDIRECT PRODUCT */
136 {0x22CC, 0x22CB}, /*RIGHT SEMIDIRECT PRODUCT */
137 {0x22CD, 0x2243}, /*REVERSED TILDE EQUALS */
138 {0x22D0, 0x22D1}, /*DOUBLE SUBSET */
139 {0x22D1, 0x22D0}, /*DOUBLE SUPERSET */
140 {0x22D6, 0x22D7}, /*LESS-THAN WITH DOT */
141 {0x22D7, 0x22D6}, /*GREATER-THAN WITH DOT */
142 {0x22D8, 0x22D9}, /*VERY MUCH LESS-THAN */
143 {0x22D9, 0x22D8}, /*VERY MUCH GREATER-THAN */
144 {0x22DA, 0x22DB}, /*LESS-THAN EQUAL TO OR GREATER-THAN */
145 {0x22DB, 0x22DA}, /*GREATER-THAN EQUAL TO OR LESS-THAN */
146 {0x22DC, 0x22DD}, /*EQUAL TO OR LESS-THAN */
147 {0x22DD, 0x22DC}, /*EQUAL TO OR GREATER-THAN */
148 {0x22DE, 0x22DF}, /*EQUAL TO OR PRECEDES */
149 {0x22DF, 0x22DE}, /*EQUAL TO OR SUCCEEDS */
150 {0x22E0, 0x22E1}, /*[BEST FIT] DOES NOT PRECEDE OR EQUAL */
151 {0x22E1, 0x22E0}, /*[BEST FIT] DOES NOT SUCCEED OR EQUAL */
152 {0x22E2, 0x22E3}, /*[BEST FIT] NOT SQUARE IMAGE OF OR EQUAL TO */
153 {0x22E3, 0x22E2}, /*[BEST FIT] NOT SQUARE ORIGINAL OF OR EQUAL TO */
154 {0x22E4, 0x22E5}, /*[BEST FIT] SQUARE IMAGE OF OR NOT EQUAL TO */
155 {0x22E5, 0x22E4}, /*[BEST FIT] SQUARE ORIGINAL OF OR NOT EQUAL TO */
156 {0x22E6, 0x22E7}, /*[BEST FIT] LESS-THAN BUT NOT EQUIVALENT TO */
157 {0x22E7, 0x22E6}, /*[BEST FIT] GREATER-THAN BUT NOT EQUIVALENT TO */
158 {0x22E8, 0x22E9}, /*[BEST FIT] PRECEDES BUT NOT EQUIVALENT TO */
159 {0x22E9, 0x22E8}, /*[BEST FIT] SUCCEEDS BUT NOT EQUIVALENT TO */
160 {0x22EA, 0x22EB}, /*[BEST FIT] NOT NORMAL SUBGROUP OF */
161 {0x22EB, 0x22EA}, /*[BEST FIT] DOES NOT CONTAIN AS NORMAL SUBGROUP */
162 {0x22EC, 0x22ED}, /*[BEST FIT] NOT NORMAL SUBGROUP OF OR EQUAL TO */
163 {0x22ED, 0x22EC}, /*[BEST FIT] DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL */
164 {0x22F0, 0x22F1}, /*UP RIGHT DIAGONAL ELLIPSIS */
165 {0x22F1, 0x22F0}, /*DOWN RIGHT DIAGONAL ELLIPSIS */
166 {0x22F2, 0x22FA}, /*ELEMENT OF WITH LONG HORIZONTAL STROKE */
167 {0x22F3, 0x22FB}, /*ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE */
168 {0x22F4, 0x22FC}, /*SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE */
169 {0x22F6, 0x22FD}, /*ELEMENT OF WITH OVERBAR */
170 {0x22F7, 0x22FE}, /*SMALL ELEMENT OF WITH OVERBAR */
171 {0x22FA, 0x22F2}, /*CONTAINS WITH LONG HORIZONTAL STROKE */
172 {0x22FB, 0x22F3}, /*CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE */
173 {0x22FC, 0x22F4}, /*SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE */
174 {0x22FD, 0x22F6}, /*CONTAINS WITH OVERBAR */
175 {0x22FE, 0x22F7}, /*SMALL CONTAINS WITH OVERBAR */
176 {0x2308, 0x2309}, /*LEFT CEILING */
177 {0x2309, 0x2308}, /*RIGHT CEILING */
178 {0x230A, 0x230B}, /*LEFT FLOOR */
179 {0x230B, 0x230A}, /*RIGHT FLOOR */
180 {0x2329, 0x232A}, /*LEFT-POINTING ANGLE BRACKET */
181 {0x232A, 0x2329}, /*RIGHT-POINTING ANGLE BRACKET */
182 {0x2768, 0x2769}, /*MEDIUM LEFT PARENTHESIS ORNAMENT */
183 {0x2769, 0x2768}, /*MEDIUM RIGHT PARENTHESIS ORNAMENT */
184 {0x276A, 0x276B}, /*MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT */
185 {0x276B, 0x276A}, /*MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT */
186 {0x276C, 0x276D}, /*MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT */
187 {0x276D, 0x276C}, /*MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT */
188 {0x276E, 0x276F}, /*HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT */
189 {0x276F, 0x276E}, /*HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT */
190 {0x2770, 0x2771}, /*HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT */
191 {0x2771, 0x2770}, /*HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT */
192 {0x2772, 0x2773}, /*LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT */
193 {0x2773, 0x2772}, /*LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT */
194 {0x2774, 0x2775}, /*MEDIUM LEFT CURLY BRACKET ORNAMENT */
195 {0x2775, 0x2774}, /*MEDIUM RIGHT CURLY BRACKET ORNAMENT */
196 {0x27C3, 0x27C4}, /*OPEN SUBSET */
197 {0x27C4, 0x27C3}, /*OPEN SUPERSET */
198 {0x27C5, 0x27C6}, /*LEFT S-SHAPED BAG DELIMITER */
199 {0x27C6, 0x27C5}, /*RIGHT S-SHAPED BAG DELIMITER */
200 {0x27C8, 0x27C9}, /*REVERSE SOLIDUS PRECEDING SUBSET */
201 {0x27C9, 0x27C8}, /*SUPERSET PRECEDING SOLIDUS */
202 {0x27CB, 0x27CD}, /*MATHEMATICAL RISING DIAGONAL */
203 {0x27CD, 0x27CB}, /*MATHEMATICAL FALLING DIAGONAL */
204 {0x27D5, 0x27D6}, /*LEFT OUTER JOIN */
205 {0x27D6, 0x27D5}, /*RIGHT OUTER JOIN */
206 {0x27DD, 0x27DE}, /*LONG RIGHT TACK */
207 {0x27DE, 0x27DD}, /*LONG LEFT TACK */
208 {0x27E2, 0x27E3}, /*WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK */
209 {0x27E3, 0x27E2}, /*WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK */
210 {0x27E4, 0x27E5}, /*WHITE SQUARE WITH LEFTWARDS TICK */
211 {0x27E5, 0x27E4}, /*WHITE SQUARE WITH RIGHTWARDS TICK */
212 {0x27E6, 0x27E7}, /*MATHEMATICAL LEFT WHITE SQUARE BRACKET */
213 {0x27E7, 0x27E6}, /*MATHEMATICAL RIGHT WHITE SQUARE BRACKET */
214 {0x27E8, 0x27E9}, /*MATHEMATICAL LEFT ANGLE BRACKET */
215 {0x27E9, 0x27E8}, /*MATHEMATICAL RIGHT ANGLE BRACKET */
216 {0x27EA, 0x27EB}, /*MATHEMATICAL LEFT DOUBLE ANGLE BRACKET */
217 {0x27EB, 0x27EA}, /*MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET */
218 {0x27EC, 0x27ED}, /*MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET */
219 {0x27ED, 0x27EC}, /*MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET */
220 {0x27EE, 0x27EF}, /*MATHEMATICAL LEFT FLATTENED PARENTHESIS */
221 {0x27EF, 0x27EE}, /*MATHEMATICAL RIGHT FLATTENED PARENTHESIS */
222 {0x2983, 0x2984}, /*LEFT WHITE CURLY BRACKET */
223 {0x2984, 0x2983}, /*RIGHT WHITE CURLY BRACKET */
224 {0x2985, 0x2986}, /*LEFT WHITE PARENTHESIS */
225 {0x2986, 0x2985}, /*RIGHT WHITE PARENTHESIS */
226 {0x2987, 0x2988}, /*Z NOTATION LEFT IMAGE BRACKET */
227 {0x2988, 0x2987}, /*Z NOTATION RIGHT IMAGE BRACKET */
228 {0x2989, 0x298A}, /*Z NOTATION LEFT BINDING BRACKET */
229 {0x298A, 0x2989}, /*Z NOTATION RIGHT BINDING BRACKET */
230 {0x298B, 0x298C}, /*LEFT SQUARE BRACKET WITH UNDERBAR */
231 {0x298C, 0x298B}, /*RIGHT SQUARE BRACKET WITH UNDERBAR */
232 {0x298D, 0x2990}, /*LEFT SQUARE BRACKET WITH TICK IN TOP CORNER */
233 {0x298E, 0x298F}, /*RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER */
234 {0x298F, 0x298E}, /*LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER */
235 {0x2990, 0x298D}, /*RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER */
236 {0x2991, 0x2992}, /*LEFT ANGLE BRACKET WITH DOT */
237 {0x2992, 0x2991}, /*RIGHT ANGLE BRACKET WITH DOT */
238 {0x2993, 0x2994}, /*LEFT ARC LESS-THAN BRACKET */
239 {0x2994, 0x2993}, /*RIGHT ARC GREATER-THAN BRACKET */
240 {0x2995, 0x2996}, /*DOUBLE LEFT ARC GREATER-THAN BRACKET */
241 {0x2996, 0x2995}, /*DOUBLE RIGHT ARC LESS-THAN BRACKET */
242 {0x2997, 0x2998}, /*LEFT BLACK TORTOISE SHELL BRACKET */
243 {0x2998, 0x2997}, /*RIGHT BLACK TORTOISE SHELL BRACKET */
244 {0x29B8, 0x2298}, /*CIRCLED REVERSE SOLIDUS */
245 {0x29C0, 0x29C1}, /*CIRCLED LESS-THAN */
246 {0x29C1, 0x29C0}, /*CIRCLED GREATER-THAN */
247 {0x29C4, 0x29C5}, /*SQUARED RISING DIAGONAL SLASH */
248 {0x29C5, 0x29C4}, /*SQUARED FALLING DIAGONAL SLASH */
249 {0x29CF, 0x29D0}, /*LEFT TRIANGLE BESIDE VERTICAL BAR */
250 {0x29D0, 0x29CF}, /*VERTICAL BAR BESIDE RIGHT TRIANGLE */
251 {0x29D1, 0x29D2}, /*BOWTIE WITH LEFT HALF BLACK */
252 {0x29D2, 0x29D1}, /*BOWTIE WITH RIGHT HALF BLACK */
253 {0x29D4, 0x29D5}, /*TIMES WITH LEFT HALF BLACK */
254 {0x29D5, 0x29D4}, /*TIMES WITH RIGHT HALF BLACK */
255 {0x29D8, 0x29D9}, /*LEFT WIGGLY FENCE */
256 {0x29D9, 0x29D8}, /*RIGHT WIGGLY FENCE */
257 {0x29DA, 0x29DB}, /*LEFT DOUBLE WIGGLY FENCE */
258 {0x29DB, 0x29DA}, /*RIGHT DOUBLE WIGGLY FENCE */
259 {0x29F5, 0x2215}, /*REVERSE SOLIDUS OPERATOR */
260 {0x29F8, 0x29F9}, /*BIG SOLIDUS */
261 {0x29F9, 0x29F8}, /*BIG REVERSE SOLIDUS */
262 {0x29FC, 0x29FD}, /*LEFT-POINTING CURVED ANGLE BRACKET */
263 {0x29FD, 0x29FC}, /*RIGHT-POINTING CURVED ANGLE BRACKET */
264 {0x2A2B, 0x2A2C}, /*MINUS SIGN WITH FALLING DOTS */
265 {0x2A2C, 0x2A2B}, /*MINUS SIGN WITH RISING DOTS */
266 {0x2A2D, 0x2A2E}, /*PLUS SIGN IN LEFT HALF CIRCLE */
267 {0x2A2E, 0x2A2D}, /*PLUS SIGN IN RIGHT HALF CIRCLE */
268 {0x2A34, 0x2A35}, /*MULTIPLICATION SIGN IN LEFT HALF CIRCLE */
269 {0x2A35, 0x2A34}, /*MULTIPLICATION SIGN IN RIGHT HALF CIRCLE */
270 {0x2A3C, 0x2A3D}, /*INTERIOR PRODUCT */
271 {0x2A3D, 0x2A3C}, /*RIGHTHAND INTERIOR PRODUCT */
272 {0x2A64, 0x2A65}, /*Z NOTATION DOMAIN ANTIRESTRICTION */
273 {0x2A65, 0x2A64}, /*Z NOTATION RANGE ANTIRESTRICTION */
274 {0x2A79, 0x2A7A}, /*LESS-THAN WITH CIRCLE INSIDE */
275 {0x2A7A, 0x2A79}, /*GREATER-THAN WITH CIRCLE INSIDE */
276 {0x2A7D, 0x2A7E}, /*LESS-THAN OR SLANTED EQUAL TO */
277 {0x2A7E, 0x2A7D}, /*GREATER-THAN OR SLANTED EQUAL TO */
278 {0x2A7F, 0x2A80}, /*LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE */
279 {0x2A80, 0x2A7F}, /*GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE */
280 {0x2A81, 0x2A82}, /*LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE */
281 {0x2A82, 0x2A81}, /*GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE */
282 {0x2A83, 0x2A84}, /*LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT */
283 {0x2A84, 0x2A83}, /*GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT */
284 {0x2A8B, 0x2A8C}, /*LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN */
285 {0x2A8C, 0x2A8B}, /*GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN */
286 {0x2A91, 0x2A92}, /*LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL */
287 {0x2A92, 0x2A91}, /*GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL */
288 {0x2A93, 0x2A94}, /*LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL */
289 {0x2A94, 0x2A93}, /*GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL */
290 {0x2A95, 0x2A96}, /*SLANTED EQUAL TO OR LESS-THAN */
291 {0x2A96, 0x2A95}, /*SLANTED EQUAL TO OR GREATER-THAN */
292 {0x2A97, 0x2A98}, /*SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE */
293 {0x2A98, 0x2A97}, /*SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE */
294 {0x2A99, 0x2A9A}, /*DOUBLE-LINE EQUAL TO OR LESS-THAN */
295 {0x2A9A, 0x2A99}, /*DOUBLE-LINE EQUAL TO OR GREATER-THAN */
296 {0x2A9B, 0x2A9C}, /*DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN */
297 {0x2A9C, 0x2A9B}, /*DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN */
298 {0x2AA1, 0x2AA2}, /*DOUBLE NESTED LESS-THAN */
299 {0x2AA2, 0x2AA1}, /*DOUBLE NESTED GREATER-THAN */
300 {0x2AA6, 0x2AA7}, /*LESS-THAN CLOSED BY CURVE */
301 {0x2AA7, 0x2AA6}, /*GREATER-THAN CLOSED BY CURVE */
302 {0x2AA8, 0x2AA9}, /*LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL */
303 {0x2AA9, 0x2AA8}, /*GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL */
304 {0x2AAA, 0x2AAB}, /*SMALLER THAN */
305 {0x2AAB, 0x2AAA}, /*LARGER THAN */
306 {0x2AAC, 0x2AAD}, /*SMALLER THAN OR EQUAL TO */
307 {0x2AAD, 0x2AAC}, /*LARGER THAN OR EQUAL TO */
308 {0x2AAF, 0x2AB0}, /*PRECEDES ABOVE SINGLE-LINE EQUALS SIGN */
309 {0x2AB0, 0x2AAF}, /*SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN */
310 {0x2AB3, 0x2AB4}, /*PRECEDES ABOVE EQUALS SIGN */
311 {0x2AB4, 0x2AB3}, /*SUCCEEDS ABOVE EQUALS SIGN */
312 {0x2ABB, 0x2ABC}, /*DOUBLE PRECEDES */
313 {0x2ABC, 0x2ABB}, /*DOUBLE SUCCEEDS */
314 {0x2ABD, 0x2ABE}, /*SUBSET WITH DOT */
315 {0x2ABE, 0x2ABD}, /*SUPERSET WITH DOT */
316 {0x2ABF, 0x2AC0}, /*SUBSET WITH PLUS SIGN BELOW */
317 {0x2AC0, 0x2ABF}, /*SUPERSET WITH PLUS SIGN BELOW */
318 {0x2AC1, 0x2AC2}, /*SUBSET WITH MULTIPLICATION SIGN BELOW */
319 {0x2AC2, 0x2AC1}, /*SUPERSET WITH MULTIPLICATION SIGN BELOW */
320 {0x2AC3, 0x2AC4}, /*SUBSET OF OR EQUAL TO WITH DOT ABOVE */
321 {0x2AC4, 0x2AC3}, /*SUPERSET OF OR EQUAL TO WITH DOT ABOVE */
322 {0x2AC5, 0x2AC6}, /*SUBSET OF ABOVE EQUALS SIGN */
323 {0x2AC6, 0x2AC5}, /*SUPERSET OF ABOVE EQUALS SIGN */
324 {0x2ACD, 0x2ACE}, /*SQUARE LEFT OPEN BOX OPERATOR */
325 {0x2ACE, 0x2ACD}, /*SQUARE RIGHT OPEN BOX OPERATOR */
326 {0x2ACF, 0x2AD0}, /*CLOSED SUBSET */
327 {0x2AD0, 0x2ACF}, /*CLOSED SUPERSET */
328 {0x2AD1, 0x2AD2}, /*CLOSED SUBSET OR EQUAL TO */
329 {0x2AD2, 0x2AD1}, /*CLOSED SUPERSET OR EQUAL TO */
330 {0x2AD3, 0x2AD4}, /*SUBSET ABOVE SUPERSET */
331 {0x2AD4, 0x2AD3}, /*SUPERSET ABOVE SUBSET */
332 {0x2AD5, 0x2AD6}, /*SUBSET ABOVE SUBSET */
333 {0x2AD6, 0x2AD5}, /*SUPERSET ABOVE SUPERSET */
334 {0x2ADE, 0x22A6}, /*SHORT LEFT TACK */
335 {0x2AE3, 0x22A9}, /*DOUBLE VERTICAL BAR LEFT TURNSTILE */
336 {0x2AE4, 0x22A8}, /*VERTICAL BAR DOUBLE LEFT TURNSTILE */
337 {0x2AE5, 0x22AB}, /*DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE */
338 {0x2AEC, 0x2AED}, /*DOUBLE STROKE NOT SIGN */
339 {0x2AED, 0x2AEC}, /*REVERSED DOUBLE STROKE NOT SIGN */
340 {0x2AF7, 0x2AF8}, /*TRIPLE NESTED LESS-THAN */
341 {0x2AF8, 0x2AF7}, /*TRIPLE NESTED GREATER-THAN */
342 {0x2AF9, 0x2AFA}, /*DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO */
343 {0x2AFA, 0x2AF9}, /*DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO */
344 {0x2E02, 0x2E03}, /*LEFT SUBSTITUTION BRACKET */
345 {0x2E03, 0x2E02}, /*RIGHT SUBSTITUTION BRACKET */
346 {0x2E04, 0x2E05}, /*LEFT DOTTED SUBSTITUTION BRACKET */
347 {0x2E05, 0x2E04}, /*RIGHT DOTTED SUBSTITUTION BRACKET */
348 {0x2E09, 0x2E0A}, /*LEFT TRANSPOSITION BRACKET */
349 {0x2E0A, 0x2E09}, /*RIGHT TRANSPOSITION BRACKET */
350 {0x2E0C, 0x2E0D}, /*LEFT RAISED OMISSION BRACKET */
351 {0x2E0D, 0x2E0C}, /*RIGHT RAISED OMISSION BRACKET */
352 {0x2E1C, 0x2E1D}, /*LEFT LOW PARAPHRASE BRACKET */
353 {0x2E1D, 0x2E1C}, /*RIGHT LOW PARAPHRASE BRACKET */
354 {0x2E20, 0x2E21}, /*LEFT VERTICAL BAR WITH QUILL */
355 {0x2E21, 0x2E20}, /*RIGHT VERTICAL BAR WITH QUILL */
356 {0x2E22, 0x2E23}, /*TOP LEFT HALF BRACKET */
357 {0x2E23, 0x2E22}, /*TOP RIGHT HALF BRACKET */
358 {0x2E24, 0x2E25}, /*BOTTOM LEFT HALF BRACKET */
359 {0x2E25, 0x2E24}, /*BOTTOM RIGHT HALF BRACKET */
360 {0x2E26, 0x2E27}, /*LEFT SIDEWAYS U BRACKET */
361 {0x2E27, 0x2E26}, /*RIGHT SIDEWAYS U BRACKET */
362 {0x2E28, 0x2E29}, /*LEFT DOUBLE PARENTHESIS */
363 {0x2E29, 0x2E28}, /*RIGHT DOUBLE PARENTHESIS */
364 {0x3008, 0x3009}, /*LEFT ANGLE BRACKET */
365 {0x3009, 0x3008}, /*RIGHT ANGLE BRACKET */
366 {0x300A, 0x300B}, /*LEFT DOUBLE ANGLE BRACKET */
367 {0x300B, 0x300A}, /*RIGHT DOUBLE ANGLE BRACKET */
368 {0x300C, 0x300D}, /*[BEST FIT] LEFT CORNER BRACKET */
369 {0x300D, 0x300C}, /*[BEST FIT] RIGHT CORNER BRACKET */
370 {0x300E, 0x300F}, /*[BEST FIT] LEFT WHITE CORNER BRACKET */
371 {0x300F, 0x300E}, /*[BEST FIT] RIGHT WHITE CORNER BRACKET */
372 {0x3010, 0x3011}, /*LEFT BLACK LENTICULAR BRACKET */
373 {0x3011, 0x3010}, /*RIGHT BLACK LENTICULAR BRACKET */
374 {0x3014, 0x3015}, /*LEFT TORTOISE SHELL BRACKET */
375 {0x3015, 0x3014}, /*RIGHT TORTOISE SHELL BRACKET */
376 {0x3016, 0x3017}, /*LEFT WHITE LENTICULAR BRACKET */
377 {0x3017, 0x3016}, /*RIGHT WHITE LENTICULAR BRACKET */
378 {0x3018, 0x3019}, /*LEFT WHITE TORTOISE SHELL BRACKET */
379 {0x3019, 0x3018}, /*RIGHT WHITE TORTOISE SHELL BRACKET */
380 {0x301A, 0x301B}, /*LEFT WHITE SQUARE BRACKET */
381 {0x301B, 0x301A}, /*RIGHT WHITE SQUARE BRACKET */
382 {0xFE59, 0xFE5A}, /*SMALL LEFT PARENTHESIS */
383 {0xFE5A, 0xFE59}, /*SMALL RIGHT PARENTHESIS */
384 {0xFE5B, 0xFE5C}, /*SMALL LEFT CURLY BRACKET */
385 {0xFE5C, 0xFE5B}, /*SMALL RIGHT CURLY BRACKET */
386 {0xFE5D, 0xFE5E}, /*SMALL LEFT TORTOISE SHELL BRACKET */
387 {0xFE5E, 0xFE5D}, /*SMALL RIGHT TORTOISE SHELL BRACKET */
388 {0xFE64, 0xFE65}, /*SMALL LESS-THAN SIGN */
389 {0xFE65, 0xFE64}, /*SMALL GREATER-THAN SIGN */
390 {0xFF08, 0xFF09}, /*FULLWIDTH LEFT PARENTHESIS */
391 {0xFF09, 0xFF08}, /*FULLWIDTH RIGHT PARENTHESIS */
392 {0xFF1C, 0xFF1E}, /*FULLWIDTH LESS-THAN SIGN */
393 {0xFF1E, 0xFF1C}, /*FULLWIDTH GREATER-THAN SIGN */
394 {0xFF3B, 0xFF3D}, /*FULLWIDTH LEFT SQUARE BRACKET */
395 {0xFF3D, 0xFF3B}, /*FULLWIDTH RIGHT SQUARE BRACKET */
396 {0xFF5B, 0xFF5D}, /*FULLWIDTH LEFT CURLY BRACKET */
397 {0xFF5D, 0xFF5B}, /*FULLWIDTH RIGHT CURLY BRACKET */
398 {0xFF5F, 0xFF60}, /*FULLWIDTH LEFT WHITE PARENTHESIS */
399 {0xFF60, 0xFF5F}, /*FULLWIDTH RIGHT WHITE PARENTHESIS */
400 {0xFF62, 0xFF63}, /*[BEST FIT] HALFWIDTH LEFT CORNER BRACKET */
401 {0xFF63, 0xFF62}, /*[BEST FIT] HALFWIDTH RIGHT CORNER BRACKET*/
402 {0, 0}
403 };
404
405 /**************************************************************************/
406 /* */
407 /* FUNCTION RELEASE */
408 /* */
409 /* _gx_utility_bidi_mirroring_get PORTABLE C */
410 /* 6.1 */
411 /* AUTHOR */
412 /* */
413 /* Kenneth Maxwell, Microsoft Corporation */
414 /* */
415 /* DESCRIPTION */
416 /* */
417 /* This function gets the mirror code of a unicode. */
418 /* */
419 /* INPUT */
420 /* */
421 /* code Code point whose mirror code */
422 /* is retrieved */
423 /* mirror Retrieved mirror. */
424 /* */
425 /* OUTPUT */
426 /* */
427 /* status Completion status */
428 /* */
429 /* CALLS */
430 /* */
431 /* None */
432 /* */
433 /* CALLED BY */
434 /* */
435 /* Application Code */
436 /* */
437 /* RELEASE HISTORY */
438 /* */
439 /* DATE NAME DESCRIPTION */
440 /* */
441 /* 05-19-2020 Kenneth Maxwell Initial Version 6.0 */
442 /* 09-30-2020 Kenneth Maxwell Modified comment(s), */
443 /* resulting in version 6.1 */
444 /* */
445 /**************************************************************************/
_gx_utility_bidi_mirroring_get(USHORT code,USHORT * mirror)446 UINT _gx_utility_bidi_mirroring_get(USHORT code, USHORT *mirror)
447 {
448 GX_CONST GX_BIDI_MIRROR *entry = _gx_bidi_mirroring;
449
450 *mirror = 0;
451
452 while (entry -> gx_bidi_code)
453 {
454 if (entry -> gx_bidi_code == code)
455 {
456 *mirror = entry -> gx_bidi_mirror_code;
457 break;
458 }
459 entry++;
460 }
461
462 return GX_SUCCESS;
463 }
464
465 #endif
466
467