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