From bbbeab43e067a7f009b74df72ed9b083f3ecef58 Mon Sep 17 00:00:00 2001 From: Thomas Voss Date: Mon, 15 Apr 2024 20:57:48 +0200 Subject: Add uprop_get_bmg() --- data/BidiMirroring | 633 +++++++++++++++++++++++++++++++++++++++ gen/data-files | 1 + gen/prop/bmg | 54 ++++ include/unicode/prop.h | 1 + lib/unicode/prop/uprop_get_bmg.c | 472 +++++++++++++++++++++++++++++ 5 files changed, 1161 insertions(+) create mode 100644 data/BidiMirroring create mode 100755 gen/prop/bmg create mode 100644 lib/unicode/prop/uprop_get_bmg.c diff --git a/data/BidiMirroring b/data/BidiMirroring new file mode 100644 index 0000000..7e58cc4 --- /dev/null +++ b/data/BidiMirroring @@ -0,0 +1,633 @@ +# BidiMirroring-15.1.0.txt +# Date: 2023-01-05 +# © 2023 Unicode®, Inc. +# For terms of use, see https://www.unicode.org/terms_of_use.html +# +# Unicode Character Database +# For documentation, see https://www.unicode.org/reports/tr44/ +# +# Bidi_Mirroring_Glyph Property +# +# This file is an informative contributory data file in the +# Unicode Character Database. +# +# This data file lists characters that have the Bidi_Mirrored=Yes property +# value, for which there is another Unicode character that typically has a glyph +# that is the mirror image of the original character's glyph. +# +# The repertoire covered by the file is Unicode 15.1.0. +# +# The file contains a list of lines with mappings from one code point +# to another one for character-based mirroring. +# Note that for "real" mirroring, a rendering engine needs to select +# appropriate alternative glyphs, and that many Unicode characters do not +# have a mirror-image Unicode character. +# +# Each mapping line contains two fields, separated by a semicolon (';'). +# Each of the two fields contains a code point represented as a +# variable-length hexadecimal value with 4 to 6 digits. +# A comment indicates where the characters are "BEST FIT" mirroring. +# +# Code points for which Bidi_Mirrored=Yes, but for which no appropriate +# characters exist with mirrored glyphs, are +# listed as comments at the end of the file. +# +# Formally, the default value of the Bidi_Mirroring_Glyph property +# for each code point is , unless a mapping to +# some other character is specified in this data file. When a code +# point has the default value for the Bidi_Mirroring_Glyph property, +# that means that no other character exists whose glyph is suitable +# for character-based mirroring. +# +# For information on bidi mirroring, see UAX #9: Unicode Bidirectional Algorithm, +# at https://www.unicode.org/reports/tr9/ +# +# This file was originally created by Markus Scherer. +# Extended for Unicode 3.2, 4.0, 4.1, 5.0, 5.1, 5.2, and 6.0 by Ken Whistler, +# and for subsequent versions by Ken Whistler, Laurentiu Iancu, and Roozbeh Pournader. +# +# Historical and Compatibility Information: +# +# The OpenType Mirroring Pairs List (OMPL) is frozen to match the +# Unicode 5.1 version of the Bidi_Mirroring_Glyph property (2008). +# See https://www.microsoft.com/typography/otspec/ompl.txt +# +# The Unicode 6.1 version of the Bidi_Mirroring_Glyph property (2011) +# added one mirroring pair: 27CB <--> 27CD. +# +# The Unicode 11.0 version of the Bidi_Mirroring_Glyph property (2018) +# underwent a substantial revision, to formally recognize all of the +# exact mirroring pairs and "BEST FIT" mirroring pairs that had been +# added after the freezing of the OMPL list. As a result, starting +# with Unicode 11.0, the bmg mapping values more accurately reflect +# the current status of glyphs for Bidi_Mirrored characters in +# the Unicode Standard, but this listing now extends significantly +# beyond the frozen OMPL list. Implementers should be aware of this +# intentional distinction. +# +# ############################################################ +# +# Property: Bidi_Mirroring_Glyph +# +# @missing: 0000..10FFFF; + +0028; 0029 # LEFT PARENTHESIS +0029; 0028 # RIGHT PARENTHESIS +003C; 003E # LESS-THAN SIGN +003E; 003C # GREATER-THAN SIGN +005B; 005D # LEFT SQUARE BRACKET +005D; 005B # RIGHT SQUARE BRACKET +007B; 007D # LEFT CURLY BRACKET +007D; 007B # RIGHT CURLY BRACKET +00AB; 00BB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +00BB; 00AB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0F3A; 0F3B # TIBETAN MARK GUG RTAGS GYON +0F3B; 0F3A # TIBETAN MARK GUG RTAGS GYAS +0F3C; 0F3D # TIBETAN MARK ANG KHANG GYON +0F3D; 0F3C # TIBETAN MARK ANG KHANG GYAS +169B; 169C # OGHAM FEATHER MARK +169C; 169B # OGHAM REVERSED FEATHER MARK +2039; 203A # SINGLE LEFT-POINTING ANGLE QUOTATION MARK +203A; 2039 # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +2045; 2046 # LEFT SQUARE BRACKET WITH QUILL +2046; 2045 # RIGHT SQUARE BRACKET WITH QUILL +207D; 207E # SUPERSCRIPT LEFT PARENTHESIS +207E; 207D # SUPERSCRIPT RIGHT PARENTHESIS +208D; 208E # SUBSCRIPT LEFT PARENTHESIS +208E; 208D # SUBSCRIPT RIGHT PARENTHESIS +2208; 220B # ELEMENT OF +2209; 220C # [BEST FIT] NOT AN ELEMENT OF +220A; 220D # SMALL ELEMENT OF +220B; 2208 # CONTAINS AS MEMBER +220C; 2209 # [BEST FIT] DOES NOT CONTAIN AS MEMBER +220D; 220A # SMALL CONTAINS AS MEMBER +2215; 29F5 # DIVISION SLASH +221F; 2BFE # RIGHT ANGLE +2220; 29A3 # ANGLE +2221; 299B # MEASURED ANGLE +2222; 29A0 # SPHERICAL ANGLE +2224; 2AEE # DOES NOT DIVIDE +223C; 223D # TILDE OPERATOR +223D; 223C # REVERSED TILDE +2243; 22CD # ASYMPTOTICALLY EQUAL TO +2245; 224C # APPROXIMATELY EQUAL TO +224C; 2245 # ALL EQUAL TO +2252; 2253 # APPROXIMATELY EQUAL TO OR THE IMAGE OF +2253; 2252 # IMAGE OF OR APPROXIMATELY EQUAL TO +2254; 2255 # COLON EQUALS +2255; 2254 # EQUALS COLON +2264; 2265 # LESS-THAN OR EQUAL TO +2265; 2264 # GREATER-THAN OR EQUAL TO +2266; 2267 # LESS-THAN OVER EQUAL TO +2267; 2266 # GREATER-THAN OVER EQUAL TO +2268; 2269 # [BEST FIT] LESS-THAN BUT NOT EQUAL TO +2269; 2268 # [BEST FIT] GREATER-THAN BUT NOT EQUAL TO +226A; 226B # MUCH LESS-THAN +226B; 226A # MUCH GREATER-THAN +226E; 226F # [BEST FIT] NOT LESS-THAN +226F; 226E # [BEST FIT] NOT GREATER-THAN +2270; 2271 # [BEST FIT] NEITHER LESS-THAN NOR EQUAL TO +2271; 2270 # [BEST FIT] NEITHER GREATER-THAN NOR EQUAL TO +2272; 2273 # [BEST FIT] LESS-THAN OR EQUIVALENT TO +2273; 2272 # [BEST FIT] GREATER-THAN OR EQUIVALENT TO +2274; 2275 # [BEST FIT] NEITHER LESS-THAN NOR EQUIVALENT TO +2275; 2274 # [BEST FIT] NEITHER GREATER-THAN NOR EQUIVALENT TO +2276; 2277 # LESS-THAN OR GREATER-THAN +2277; 2276 # GREATER-THAN OR LESS-THAN +2278; 2279 # [BEST FIT] NEITHER LESS-THAN NOR GREATER-THAN +2279; 2278 # [BEST FIT] NEITHER GREATER-THAN NOR LESS-THAN +227A; 227B # PRECEDES +227B; 227A # SUCCEEDS +227C; 227D # PRECEDES OR EQUAL TO +227D; 227C # SUCCEEDS OR EQUAL TO +227E; 227F # [BEST FIT] PRECEDES OR EQUIVALENT TO +227F; 227E # [BEST FIT] SUCCEEDS OR EQUIVALENT TO +2280; 2281 # [BEST FIT] DOES NOT PRECEDE +2281; 2280 # [BEST FIT] DOES NOT SUCCEED +2282; 2283 # SUBSET OF +2283; 2282 # SUPERSET OF +2284; 2285 # [BEST FIT] NOT A SUBSET OF +2285; 2284 # [BEST FIT] NOT A SUPERSET OF +2286; 2287 # SUBSET OF OR EQUAL TO +2287; 2286 # SUPERSET OF OR EQUAL TO +2288; 2289 # [BEST FIT] NEITHER A SUBSET OF NOR EQUAL TO +2289; 2288 # [BEST FIT] NEITHER A SUPERSET OF NOR EQUAL TO +228A; 228B # [BEST FIT] SUBSET OF WITH NOT EQUAL TO +228B; 228A # [BEST FIT] SUPERSET OF WITH NOT EQUAL TO +228F; 2290 # SQUARE IMAGE OF +2290; 228F # SQUARE ORIGINAL OF +2291; 2292 # SQUARE IMAGE OF OR EQUAL TO +2292; 2291 # SQUARE ORIGINAL OF OR EQUAL TO +2298; 29B8 # CIRCLED DIVISION SLASH +22A2; 22A3 # RIGHT TACK +22A3; 22A2 # LEFT TACK +22A6; 2ADE # ASSERTION +22A8; 2AE4 # TRUE +22A9; 2AE3 # FORCES +22AB; 2AE5 # DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE +22B0; 22B1 # PRECEDES UNDER RELATION +22B1; 22B0 # SUCCEEDS UNDER RELATION +22B2; 22B3 # NORMAL SUBGROUP OF +22B3; 22B2 # CONTAINS AS NORMAL SUBGROUP +22B4; 22B5 # NORMAL SUBGROUP OF OR EQUAL TO +22B5; 22B4 # CONTAINS AS NORMAL SUBGROUP OR EQUAL TO +22B6; 22B7 # ORIGINAL OF +22B7; 22B6 # IMAGE OF +22B8; 27DC # MULTIMAP +22C9; 22CA # LEFT NORMAL FACTOR SEMIDIRECT PRODUCT +22CA; 22C9 # RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT +22CB; 22CC # LEFT SEMIDIRECT PRODUCT +22CC; 22CB # RIGHT SEMIDIRECT PRODUCT +22CD; 2243 # REVERSED TILDE EQUALS +22D0; 22D1 # DOUBLE SUBSET +22D1; 22D0 # DOUBLE SUPERSET +22D6; 22D7 # LESS-THAN WITH DOT +22D7; 22D6 # GREATER-THAN WITH DOT +22D8; 22D9 # VERY MUCH LESS-THAN +22D9; 22D8 # VERY MUCH GREATER-THAN +22DA; 22DB # LESS-THAN EQUAL TO OR GREATER-THAN +22DB; 22DA # GREATER-THAN EQUAL TO OR LESS-THAN +22DC; 22DD # EQUAL TO OR LESS-THAN +22DD; 22DC # EQUAL TO OR GREATER-THAN +22DE; 22DF # EQUAL TO OR PRECEDES +22DF; 22DE # EQUAL TO OR SUCCEEDS +22E0; 22E1 # [BEST FIT] DOES NOT PRECEDE OR EQUAL +22E1; 22E0 # [BEST FIT] DOES NOT SUCCEED OR EQUAL +22E2; 22E3 # [BEST FIT] NOT SQUARE IMAGE OF OR EQUAL TO +22E3; 22E2 # [BEST FIT] NOT SQUARE ORIGINAL OF OR EQUAL TO +22E4; 22E5 # [BEST FIT] SQUARE IMAGE OF OR NOT EQUAL TO +22E5; 22E4 # [BEST FIT] SQUARE ORIGINAL OF OR NOT EQUAL TO +22E6; 22E7 # [BEST FIT] LESS-THAN BUT NOT EQUIVALENT TO +22E7; 22E6 # [BEST FIT] GREATER-THAN BUT NOT EQUIVALENT TO +22E8; 22E9 # [BEST FIT] PRECEDES BUT NOT EQUIVALENT TO +22E9; 22E8 # [BEST FIT] SUCCEEDS BUT NOT EQUIVALENT TO +22EA; 22EB # [BEST FIT] NOT NORMAL SUBGROUP OF +22EB; 22EA # [BEST FIT] DOES NOT CONTAIN AS NORMAL SUBGROUP +22EC; 22ED # [BEST FIT] NOT NORMAL SUBGROUP OF OR EQUAL TO +22ED; 22EC # [BEST FIT] DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL +22F0; 22F1 # UP RIGHT DIAGONAL ELLIPSIS +22F1; 22F0 # DOWN RIGHT DIAGONAL ELLIPSIS +22F2; 22FA # ELEMENT OF WITH LONG HORIZONTAL STROKE +22F3; 22FB # ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE +22F4; 22FC # SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE +22F6; 22FD # ELEMENT OF WITH OVERBAR +22F7; 22FE # SMALL ELEMENT OF WITH OVERBAR +22FA; 22F2 # CONTAINS WITH LONG HORIZONTAL STROKE +22FB; 22F3 # CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE +22FC; 22F4 # SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE +22FD; 22F6 # CONTAINS WITH OVERBAR +22FE; 22F7 # SMALL CONTAINS WITH OVERBAR +2308; 2309 # LEFT CEILING +2309; 2308 # RIGHT CEILING +230A; 230B # LEFT FLOOR +230B; 230A # RIGHT FLOOR +2329; 232A # LEFT-POINTING ANGLE BRACKET +232A; 2329 # RIGHT-POINTING ANGLE BRACKET +2768; 2769 # MEDIUM LEFT PARENTHESIS ORNAMENT +2769; 2768 # MEDIUM RIGHT PARENTHESIS ORNAMENT +276A; 276B # MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT +276B; 276A # MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT +276C; 276D # MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT +276D; 276C # MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT +276E; 276F # HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT +276F; 276E # HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT +2770; 2771 # HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT +2771; 2770 # HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT +2772; 2773 # LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT +2773; 2772 # LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT +2774; 2775 # MEDIUM LEFT CURLY BRACKET ORNAMENT +2775; 2774 # MEDIUM RIGHT CURLY BRACKET ORNAMENT +27C3; 27C4 # OPEN SUBSET +27C4; 27C3 # OPEN SUPERSET +27C5; 27C6 # LEFT S-SHAPED BAG DELIMITER +27C6; 27C5 # RIGHT S-SHAPED BAG DELIMITER +27C8; 27C9 # REVERSE SOLIDUS PRECEDING SUBSET +27C9; 27C8 # SUPERSET PRECEDING SOLIDUS +27CB; 27CD # MATHEMATICAL RISING DIAGONAL +27CD; 27CB # MATHEMATICAL FALLING DIAGONAL +27D5; 27D6 # LEFT OUTER JOIN +27D6; 27D5 # RIGHT OUTER JOIN +27DC; 22B8 # LEFT MULTIMAP +27DD; 27DE # LONG RIGHT TACK +27DE; 27DD # LONG LEFT TACK +27E2; 27E3 # WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK +27E3; 27E2 # WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK +27E4; 27E5 # WHITE SQUARE WITH LEFTWARDS TICK +27E5; 27E4 # WHITE SQUARE WITH RIGHTWARDS TICK +27E6; 27E7 # MATHEMATICAL LEFT WHITE SQUARE BRACKET +27E7; 27E6 # MATHEMATICAL RIGHT WHITE SQUARE BRACKET +27E8; 27E9 # MATHEMATICAL LEFT ANGLE BRACKET +27E9; 27E8 # MATHEMATICAL RIGHT ANGLE BRACKET +27EA; 27EB # MATHEMATICAL LEFT DOUBLE ANGLE BRACKET +27EB; 27EA # MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET +27EC; 27ED # MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET +27ED; 27EC # MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET +27EE; 27EF # MATHEMATICAL LEFT FLATTENED PARENTHESIS +27EF; 27EE # MATHEMATICAL RIGHT FLATTENED PARENTHESIS +2983; 2984 # LEFT WHITE CURLY BRACKET +2984; 2983 # RIGHT WHITE CURLY BRACKET +2985; 2986 # LEFT WHITE PARENTHESIS +2986; 2985 # RIGHT WHITE PARENTHESIS +2987; 2988 # Z NOTATION LEFT IMAGE BRACKET +2988; 2987 # Z NOTATION RIGHT IMAGE BRACKET +2989; 298A # Z NOTATION LEFT BINDING BRACKET +298A; 2989 # Z NOTATION RIGHT BINDING BRACKET +298B; 298C # LEFT SQUARE BRACKET WITH UNDERBAR +298C; 298B # RIGHT SQUARE BRACKET WITH UNDERBAR +298D; 2990 # LEFT SQUARE BRACKET WITH TICK IN TOP CORNER +298E; 298F # RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +298F; 298E # LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +2990; 298D # RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER +2991; 2992 # LEFT ANGLE BRACKET WITH DOT +2992; 2991 # RIGHT ANGLE BRACKET WITH DOT +2993; 2994 # LEFT ARC LESS-THAN BRACKET +2994; 2993 # RIGHT ARC GREATER-THAN BRACKET +2995; 2996 # DOUBLE LEFT ARC GREATER-THAN BRACKET +2996; 2995 # DOUBLE RIGHT ARC LESS-THAN BRACKET +2997; 2998 # LEFT BLACK TORTOISE SHELL BRACKET +2998; 2997 # RIGHT BLACK TORTOISE SHELL BRACKET +299B; 2221 # MEASURED ANGLE OPENING LEFT +29A0; 2222 # SPHERICAL ANGLE OPENING LEFT +29A3; 2220 # REVERSED ANGLE +29A4; 29A5 # ANGLE WITH UNDERBAR +29A5; 29A4 # REVERSED ANGLE WITH UNDERBAR +29A8; 29A9 # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT +29A9; 29A8 # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT +29AA; 29AB # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT +29AB; 29AA # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT +29AC; 29AD # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP +29AD; 29AC # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP +29AE; 29AF # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN +29AF; 29AE # MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN +29B8; 2298 # CIRCLED REVERSE SOLIDUS +29C0; 29C1 # CIRCLED LESS-THAN +29C1; 29C0 # CIRCLED GREATER-THAN +29C4; 29C5 # SQUARED RISING DIAGONAL SLASH +29C5; 29C4 # SQUARED FALLING DIAGONAL SLASH +29CF; 29D0 # LEFT TRIANGLE BESIDE VERTICAL BAR +29D0; 29CF # VERTICAL BAR BESIDE RIGHT TRIANGLE +29D1; 29D2 # BOWTIE WITH LEFT HALF BLACK +29D2; 29D1 # BOWTIE WITH RIGHT HALF BLACK +29D4; 29D5 # TIMES WITH LEFT HALF BLACK +29D5; 29D4 # TIMES WITH RIGHT HALF BLACK +29D8; 29D9 # LEFT WIGGLY FENCE +29D9; 29D8 # RIGHT WIGGLY FENCE +29DA; 29DB # LEFT DOUBLE WIGGLY FENCE +29DB; 29DA # RIGHT DOUBLE WIGGLY FENCE +29E8; 29E9 # DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK +29E9; 29E8 # DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK +29F5; 2215 # REVERSE SOLIDUS OPERATOR +29F8; 29F9 # BIG SOLIDUS +29F9; 29F8 # BIG REVERSE SOLIDUS +29FC; 29FD # LEFT-POINTING CURVED ANGLE BRACKET +29FD; 29FC # RIGHT-POINTING CURVED ANGLE BRACKET +2A2B; 2A2C # MINUS SIGN WITH FALLING DOTS +2A2C; 2A2B # MINUS SIGN WITH RISING DOTS +2A2D; 2A2E # PLUS SIGN IN LEFT HALF CIRCLE +2A2E; 2A2D # PLUS SIGN IN RIGHT HALF CIRCLE +2A34; 2A35 # MULTIPLICATION SIGN IN LEFT HALF CIRCLE +2A35; 2A34 # MULTIPLICATION SIGN IN RIGHT HALF CIRCLE +2A3C; 2A3D # INTERIOR PRODUCT +2A3D; 2A3C # RIGHTHAND INTERIOR PRODUCT +2A64; 2A65 # Z NOTATION DOMAIN ANTIRESTRICTION +2A65; 2A64 # Z NOTATION RANGE ANTIRESTRICTION +2A79; 2A7A # LESS-THAN WITH CIRCLE INSIDE +2A7A; 2A79 # GREATER-THAN WITH CIRCLE INSIDE +2A7B; 2A7C # [BEST FIT] LESS-THAN WITH QUESTION MARK ABOVE +2A7C; 2A7B # [BEST FIT] GREATER-THAN WITH QUESTION MARK ABOVE +2A7D; 2A7E # LESS-THAN OR SLANTED EQUAL TO +2A7E; 2A7D # GREATER-THAN OR SLANTED EQUAL TO +2A7F; 2A80 # LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE +2A80; 2A7F # GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE +2A81; 2A82 # LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE +2A82; 2A81 # GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE +2A83; 2A84 # LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT +2A84; 2A83 # GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT +2A85; 2A86 # [BEST FIT] LESS-THAN OR APPROXIMATE +2A86; 2A85 # [BEST FIT] GREATER-THAN OR APPROXIMATE +2A87; 2A88 # [BEST FIT] LESS-THAN AND SINGLE-LINE NOT EQUAL TO +2A88; 2A87 # [BEST FIT] GREATER-THAN AND SINGLE-LINE NOT EQUAL TO +2A89; 2A8A # [BEST FIT] LESS-THAN AND NOT APPROXIMATE +2A8A; 2A89 # [BEST FIT] GREATER-THAN AND NOT APPROXIMATE +2A8B; 2A8C # LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN +2A8C; 2A8B # GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN +2A8D; 2A8E # [BEST FIT] LESS-THAN ABOVE SIMILAR OR EQUAL +2A8E; 2A8D # [BEST FIT] GREATER-THAN ABOVE SIMILAR OR EQUAL +2A8F; 2A90 # [BEST FIT] LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN +2A90; 2A8F # [BEST FIT] GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN +2A91; 2A92 # LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL +2A92; 2A91 # GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL +2A93; 2A94 # LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL +2A94; 2A93 # GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL +2A95; 2A96 # SLANTED EQUAL TO OR LESS-THAN +2A96; 2A95 # SLANTED EQUAL TO OR GREATER-THAN +2A97; 2A98 # SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE +2A98; 2A97 # SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE +2A99; 2A9A # DOUBLE-LINE EQUAL TO OR LESS-THAN +2A9A; 2A99 # DOUBLE-LINE EQUAL TO OR GREATER-THAN +2A9B; 2A9C # DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN +2A9C; 2A9B # DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN +2A9D; 2A9E # [BEST FIT] SIMILAR OR LESS-THAN +2A9E; 2A9D # [BEST FIT] SIMILAR OR GREATER-THAN +2A9F; 2AA0 # [BEST FIT] SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN +2AA0; 2A9F # [BEST FIT] SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN +2AA1; 2AA2 # DOUBLE NESTED LESS-THAN +2AA2; 2AA1 # DOUBLE NESTED GREATER-THAN +2AA6; 2AA7 # LESS-THAN CLOSED BY CURVE +2AA7; 2AA6 # GREATER-THAN CLOSED BY CURVE +2AA8; 2AA9 # LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL +2AA9; 2AA8 # GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL +2AAA; 2AAB # SMALLER THAN +2AAB; 2AAA # LARGER THAN +2AAC; 2AAD # SMALLER THAN OR EQUAL TO +2AAD; 2AAC # LARGER THAN OR EQUAL TO +2AAF; 2AB0 # PRECEDES ABOVE SINGLE-LINE EQUALS SIGN +2AB0; 2AAF # SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN +2AB1; 2AB2 # [BEST FIT] PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO +2AB2; 2AB1 # [BEST FIT] SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO +2AB3; 2AB4 # PRECEDES ABOVE EQUALS SIGN +2AB4; 2AB3 # SUCCEEDS ABOVE EQUALS SIGN +2AB5; 2AB6 # [BEST FIT] PRECEDES ABOVE NOT EQUAL TO +2AB6; 2AB5 # [BEST FIT] SUCCEEDS ABOVE NOT EQUAL TO +2AB7; 2AB8 # [BEST FIT] PRECEDES ABOVE ALMOST EQUAL TO +2AB8; 2AB7 # [BEST FIT] SUCCEEDS ABOVE ALMOST EQUAL TO +2AB9; 2ABA # [BEST FIT] PRECEDES ABOVE NOT ALMOST EQUAL TO +2ABA; 2AB9 # [BEST FIT] SUCCEEDS ABOVE NOT ALMOST EQUAL TO +2ABB; 2ABC # DOUBLE PRECEDES +2ABC; 2ABB # DOUBLE SUCCEEDS +2ABD; 2ABE # SUBSET WITH DOT +2ABE; 2ABD # SUPERSET WITH DOT +2ABF; 2AC0 # SUBSET WITH PLUS SIGN BELOW +2AC0; 2ABF # SUPERSET WITH PLUS SIGN BELOW +2AC1; 2AC2 # SUBSET WITH MULTIPLICATION SIGN BELOW +2AC2; 2AC1 # SUPERSET WITH MULTIPLICATION SIGN BELOW +2AC3; 2AC4 # SUBSET OF OR EQUAL TO WITH DOT ABOVE +2AC4; 2AC3 # SUPERSET OF OR EQUAL TO WITH DOT ABOVE +2AC5; 2AC6 # SUBSET OF ABOVE EQUALS SIGN +2AC6; 2AC5 # SUPERSET OF ABOVE EQUALS SIGN +2AC7; 2AC8 # [BEST FIT] SUBSET OF ABOVE TILDE OPERATOR +2AC8; 2AC7 # [BEST FIT] SUPERSET OF ABOVE TILDE OPERATOR +2AC9; 2ACA # [BEST FIT] SUBSET OF ABOVE ALMOST EQUAL TO +2ACA; 2AC9 # [BEST FIT] SUPERSET OF ABOVE ALMOST EQUAL TO +2ACB; 2ACC # [BEST FIT] SUBSET OF ABOVE NOT EQUAL TO +2ACC; 2ACB # [BEST FIT] SUPERSET OF ABOVE NOT EQUAL TO +2ACD; 2ACE # SQUARE LEFT OPEN BOX OPERATOR +2ACE; 2ACD # SQUARE RIGHT OPEN BOX OPERATOR +2ACF; 2AD0 # CLOSED SUBSET +2AD0; 2ACF # CLOSED SUPERSET +2AD1; 2AD2 # CLOSED SUBSET OR EQUAL TO +2AD2; 2AD1 # CLOSED SUPERSET OR EQUAL TO +2AD3; 2AD4 # SUBSET ABOVE SUPERSET +2AD4; 2AD3 # SUPERSET ABOVE SUBSET +2AD5; 2AD6 # SUBSET ABOVE SUBSET +2AD6; 2AD5 # SUPERSET ABOVE SUPERSET +2ADE; 22A6 # SHORT LEFT TACK +2AE3; 22A9 # DOUBLE VERTICAL BAR LEFT TURNSTILE +2AE4; 22A8 # VERTICAL BAR DOUBLE LEFT TURNSTILE +2AE5; 22AB # DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE +2AEC; 2AED # DOUBLE STROKE NOT SIGN +2AED; 2AEC # REVERSED DOUBLE STROKE NOT SIGN +2AEE; 2224 # DOES NOT DIVIDE WITH REVERSED NEGATION SLASH +2AF7; 2AF8 # TRIPLE NESTED LESS-THAN +2AF8; 2AF7 # TRIPLE NESTED GREATER-THAN +2AF9; 2AFA # DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO +2AFA; 2AF9 # DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO +2BFE; 221F # REVERSED RIGHT ANGLE +2E02; 2E03 # LEFT SUBSTITUTION BRACKET +2E03; 2E02 # RIGHT SUBSTITUTION BRACKET +2E04; 2E05 # LEFT DOTTED SUBSTITUTION BRACKET +2E05; 2E04 # RIGHT DOTTED SUBSTITUTION BRACKET +2E09; 2E0A # LEFT TRANSPOSITION BRACKET +2E0A; 2E09 # RIGHT TRANSPOSITION BRACKET +2E0C; 2E0D # LEFT RAISED OMISSION BRACKET +2E0D; 2E0C # RIGHT RAISED OMISSION BRACKET +2E1C; 2E1D # LEFT LOW PARAPHRASE BRACKET +2E1D; 2E1C # RIGHT LOW PARAPHRASE BRACKET +2E20; 2E21 # LEFT VERTICAL BAR WITH QUILL +2E21; 2E20 # RIGHT VERTICAL BAR WITH QUILL +2E22; 2E23 # TOP LEFT HALF BRACKET +2E23; 2E22 # TOP RIGHT HALF BRACKET +2E24; 2E25 # BOTTOM LEFT HALF BRACKET +2E25; 2E24 # BOTTOM RIGHT HALF BRACKET +2E26; 2E27 # LEFT SIDEWAYS U BRACKET +2E27; 2E26 # RIGHT SIDEWAYS U BRACKET +2E28; 2E29 # LEFT DOUBLE PARENTHESIS +2E29; 2E28 # RIGHT DOUBLE PARENTHESIS +2E55; 2E56 # LEFT SQUARE BRACKET WITH STROKE +2E56; 2E55 # RIGHT SQUARE BRACKET WITH STROKE +2E57; 2E58 # LEFT SQUARE BRACKET WITH DOUBLE STROKE +2E58; 2E57 # RIGHT SQUARE BRACKET WITH DOUBLE STROKE +2E59; 2E5A # TOP HALF LEFT PARENTHESIS +2E5A; 2E59 # TOP HALF RIGHT PARENTHESIS +2E5B; 2E5C # BOTTOM HALF LEFT PARENTHESIS +2E5C; 2E5B # BOTTOM HALF RIGHT PARENTHESIS +3008; 3009 # LEFT ANGLE BRACKET +3009; 3008 # RIGHT ANGLE BRACKET +300A; 300B # LEFT DOUBLE ANGLE BRACKET +300B; 300A # RIGHT DOUBLE ANGLE BRACKET +300C; 300D # [BEST FIT] LEFT CORNER BRACKET +300D; 300C # [BEST FIT] RIGHT CORNER BRACKET +300E; 300F # [BEST FIT] LEFT WHITE CORNER BRACKET +300F; 300E # [BEST FIT] RIGHT WHITE CORNER BRACKET +3010; 3011 # LEFT BLACK LENTICULAR BRACKET +3011; 3010 # RIGHT BLACK LENTICULAR BRACKET +3014; 3015 # LEFT TORTOISE SHELL BRACKET +3015; 3014 # RIGHT TORTOISE SHELL BRACKET +3016; 3017 # LEFT WHITE LENTICULAR BRACKET +3017; 3016 # RIGHT WHITE LENTICULAR BRACKET +3018; 3019 # LEFT WHITE TORTOISE SHELL BRACKET +3019; 3018 # RIGHT WHITE TORTOISE SHELL BRACKET +301A; 301B # LEFT WHITE SQUARE BRACKET +301B; 301A # RIGHT WHITE SQUARE BRACKET +FE59; FE5A # SMALL LEFT PARENTHESIS +FE5A; FE59 # SMALL RIGHT PARENTHESIS +FE5B; FE5C # SMALL LEFT CURLY BRACKET +FE5C; FE5B # SMALL RIGHT CURLY BRACKET +FE5D; FE5E # SMALL LEFT TORTOISE SHELL BRACKET +FE5E; FE5D # SMALL RIGHT TORTOISE SHELL BRACKET +FE64; FE65 # SMALL LESS-THAN SIGN +FE65; FE64 # SMALL GREATER-THAN SIGN +FF08; FF09 # FULLWIDTH LEFT PARENTHESIS +FF09; FF08 # FULLWIDTH RIGHT PARENTHESIS +FF1C; FF1E # FULLWIDTH LESS-THAN SIGN +FF1E; FF1C # FULLWIDTH GREATER-THAN SIGN +FF3B; FF3D # FULLWIDTH LEFT SQUARE BRACKET +FF3D; FF3B # FULLWIDTH RIGHT SQUARE BRACKET +FF5B; FF5D # FULLWIDTH LEFT CURLY BRACKET +FF5D; FF5B # FULLWIDTH RIGHT CURLY BRACKET +FF5F; FF60 # FULLWIDTH LEFT WHITE PARENTHESIS +FF60; FF5F # FULLWIDTH RIGHT WHITE PARENTHESIS +FF62; FF63 # [BEST FIT] HALFWIDTH LEFT CORNER BRACKET +FF63; FF62 # [BEST FIT] HALFWIDTH RIGHT CORNER BRACKET + +# The following characters have no appropriate mirroring character. +# For these characters it is up to the rendering system +# to provide mirrored glyphs. + +# 2140; DOUBLE-STRUCK N-ARY SUMMATION +# 2201; COMPLEMENT +# 2202; PARTIAL DIFFERENTIAL +# 2203; THERE EXISTS +# 2204; THERE DOES NOT EXIST +# 2211; N-ARY SUMMATION +# 2216; SET MINUS +# 221A; SQUARE ROOT +# 221B; CUBE ROOT +# 221C; FOURTH ROOT +# 221D; PROPORTIONAL TO +# 2226; NOT PARALLEL TO +# 222B; INTEGRAL +# 222C; DOUBLE INTEGRAL +# 222D; TRIPLE INTEGRAL +# 222E; CONTOUR INTEGRAL +# 222F; SURFACE INTEGRAL +# 2230; VOLUME INTEGRAL +# 2231; CLOCKWISE INTEGRAL +# 2232; CLOCKWISE CONTOUR INTEGRAL +# 2233; ANTICLOCKWISE CONTOUR INTEGRAL +# 2239; EXCESS +# 223B; HOMOTHETIC +# 223E; INVERTED LAZY S +# 223F; SINE WAVE +# 2240; WREATH PRODUCT +# 2241; NOT TILDE +# 2242; MINUS TILDE +# 2244; NOT ASYMPTOTICALLY EQUAL TO +# 2246; APPROXIMATELY BUT NOT ACTUALLY EQUAL TO +# 2247; NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO +# 2248; ALMOST EQUAL TO +# 2249; NOT ALMOST EQUAL TO +# 224A; ALMOST EQUAL OR EQUAL TO +# 224B; TRIPLE TILDE +# 225F; QUESTIONED EQUAL TO +# 2260; NOT EQUAL TO +# 2262; NOT IDENTICAL TO +# 228C; MULTISET +# 22A7; MODELS +# 22AA; TRIPLE VERTICAL BAR RIGHT TURNSTILE +# 22AC; DOES NOT PROVE +# 22AD; NOT TRUE +# 22AE; DOES NOT FORCE +# 22AF; NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE +# 22BE; RIGHT ANGLE WITH ARC +# 22BF; RIGHT TRIANGLE +# 22F5; ELEMENT OF WITH DOT ABOVE +# 22F8; ELEMENT OF WITH UNDERBAR +# 22F9; ELEMENT OF WITH TWO HORIZONTAL STROKES +# 22FF; Z NOTATION BAG MEMBERSHIP +# 2320; TOP HALF INTEGRAL +# 2321; BOTTOM HALF INTEGRAL +# 27C0; THREE DIMENSIONAL ANGLE +# 27CC; LONG DIVISION +# 27D3; LOWER RIGHT CORNER WITH DOT +# 27D4; UPPER LEFT CORNER WITH DOT +# 299C; RIGHT ANGLE VARIANT WITH SQUARE +# 299D; MEASURED RIGHT ANGLE WITH DOT +# 299E; ANGLE WITH S INSIDE +# 299F; ACUTE ANGLE +# 29A2; TURNED ANGLE +# 29A6; OBLIQUE ANGLE OPENING UP +# 29A7; OBLIQUE ANGLE OPENING DOWN +# 29C2; CIRCLE WITH SMALL CIRCLE TO THE RIGHT +# 29C3; CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT +# 29C9; TWO JOINED SQUARES +# 29CE; RIGHT TRIANGLE ABOVE LEFT TRIANGLE +# 29DC; INCOMPLETE INFINITY +# 29E1; INCREASES AS +# 29E3; EQUALS SIGN AND SLANTED PARALLEL +# 29E4; EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE +# 29E5; IDENTICAL TO AND SLANTED PARALLEL +# 29F4; RULE-DELAYED +# 29F6; SOLIDUS WITH OVERBAR +# 29F7; REVERSE SOLIDUS WITH HORIZONTAL STROKE +# 2A0A; MODULO TWO SUM +# 2A0B; SUMMATION WITH INTEGRAL +# 2A0C; QUADRUPLE INTEGRAL OPERATOR +# 2A0D; FINITE PART INTEGRAL +# 2A0E; INTEGRAL WITH DOUBLE STROKE +# 2A0F; INTEGRAL AVERAGE WITH SLASH +# 2A10; CIRCULATION FUNCTION +# 2A11; ANTICLOCKWISE INTEGRATION +# 2A12; LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE +# 2A13; LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE +# 2A14; LINE INTEGRATION NOT INCLUDING THE POLE +# 2A15; INTEGRAL AROUND A POINT OPERATOR +# 2A16; QUATERNION INTEGRAL OPERATOR +# 2A17; INTEGRAL WITH LEFTWARDS ARROW WITH HOOK +# 2A18; INTEGRAL WITH TIMES SIGN +# 2A19; INTEGRAL WITH INTERSECTION +# 2A1A; INTEGRAL WITH UNION +# 2A1B; INTEGRAL WITH OVERBAR +# 2A1C; INTEGRAL WITH UNDERBAR +# 2A1E; LARGE LEFT TRIANGLE OPERATOR +# 2A1F; Z NOTATION SCHEMA COMPOSITION +# 2A20; Z NOTATION SCHEMA PIPING +# 2A21; Z NOTATION SCHEMA PROJECTION +# 2A24; PLUS SIGN WITH TILDE ABOVE +# 2A26; PLUS SIGN WITH TILDE BELOW +# 2A29; MINUS SIGN WITH COMMA ABOVE +# 2A3E; Z NOTATION RELATIONAL COMPOSITION +# 2A57; SLOPING LARGE OR +# 2A58; SLOPING LARGE AND +# 2A6A; TILDE OPERATOR WITH DOT ABOVE +# 2A6B; TILDE OPERATOR WITH RISING DOTS +# 2A6C; SIMILAR MINUS SIMILAR +# 2A6D; CONGRUENT WITH DOT ABOVE +# 2A6F; ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT +# 2A70; APPROXIMATELY EQUAL OR EQUAL TO +# 2A73; EQUALS SIGN ABOVE TILDE OPERATOR +# 2A74; DOUBLE COLON EQUAL +# 2AA3; DOUBLE NESTED LESS-THAN WITH UNDERBAR +# 2ADC; FORKING +# 2AE2; VERTICAL BAR TRIPLE RIGHT TURNSTILE +# 2AE6; LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL +# 2AF3; PARALLEL WITH TILDE OPERATOR +# 2AFB; TRIPLE SOLIDUS BINARY RELATION +# 2AFD; DOUBLE SOLIDUS OPERATOR +# 1D6DB; MATHEMATICAL BOLD PARTIAL DIFFERENTIAL +# 1D715; MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL +# 1D74F; MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL +# 1D789; MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL +# 1D7C3; MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL + +# EOF diff --git a/gen/data-files b/gen/data-files index b377eb2..a762333 100755 --- a/gen/data-files +++ b/gen/data-files @@ -9,6 +9,7 @@ readonly BASE=https://www.unicode.org/Public/UCD/latest/ucd readonly PATHS=' auxiliary/GraphemeBreakProperty BidiBrackets +BidiMirroring Blocks CaseFolding DerivedAge diff --git a/gen/prop/bmg b/gen/prop/bmg new file mode 100755 index 0000000..ae5beff --- /dev/null +++ b/gen/prop/bmg @@ -0,0 +1,54 @@ +#!/bin/sh + +set -e +cd "${0%/*}/../.." +exec >lib/unicode/prop/uprop_get_bmg.c + +gawk ' +BEGIN { + FS = " *(; *|#.*)" + + print "/* This file is autogenerated by gen/prop/bmg; DO NOT EDIT. */" + print "" + print "#include \"__bsearch.h\"" + print "#include \"macros.h\"" + print "#include \"rune.h\"" + print "#include \"unicode/prop.h\"" + print "" +} + +/^[^#]/ { + props[strtonum("0X" $1)] = strtonum("0X" $2) +} + +END { + print "static constexpr rune lookup_lat1[] = {" + for (i = 0; i < 0x100; i++) { + if (i % 8 == 0) + printf "\t" + printf "0x%02X,%s", (props[i] ? props[i] : 0), \ + i % 8 == 7 ? "\n" : " " + } + print "};" + print "" + print "static const struct {" + print "\trune k, v;" + print "} lookup[] = {" + + for (i = 0x100; i <= 0x10FFFF; i++) { + if (!props[i]) + continue + printf "\t{RUNE_C(0x%06X), RUNE_C(0x%06X)},\n", i, props[i] + } + + print "};" + print "" + print "__MLIB_DEFINE_BSEARCH_KV(rune, lookup, 0)" + print "" + print "rune" + print "uprop_get_bmg(rune ch)" + print "{" + print "\treturn ch < lengthof(lookup_lat1) ? lookup_lat1[ch] : mlib_lookup_kv(ch);" + print "}" +} +' data/BidiMirroring diff --git a/include/unicode/prop.h b/include/unicode/prop.h index f63c67b..c22fb33 100644 --- a/include/unicode/prop.h +++ b/include/unicode/prop.h @@ -766,6 +766,7 @@ enum uprop_sc { [[__mlib_uprop_attrs]] enum uprop_lb uprop_get_lb(rune); [[__mlib_uprop_attrs]] enum uprop_nt uprop_get_nt(rune); [[__mlib_uprop_attrs]] enum uprop_sc uprop_get_sc(rune); +[[__mlib_uprop_attrs]] rune uprop_get_bmg(rune); [[__mlib_uprop_attrs]] rune uprop_get_bpb(rune); [[__mlib_uprop_attrs]] rune uprop_get_scf(rune, bool); [[__mlib_uprop_attrs]] rune uprop_get_slc(rune); diff --git a/lib/unicode/prop/uprop_get_bmg.c b/lib/unicode/prop/uprop_get_bmg.c new file mode 100644 index 0000000..629e7f1 --- /dev/null +++ b/lib/unicode/prop/uprop_get_bmg.c @@ -0,0 +1,472 @@ +/* This file is autogenerated by gen/prop/bmg; DO NOT EDIT. */ + +#include "__bsearch.h" +#include "macros.h" +#include "rune.h" +#include "unicode/prop.h" + +static constexpr rune lookup_lat1[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x29, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x3C, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x5D, 0x00, 0x5B, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x7D, 0x00, 0x7B, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xBB, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xAB, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +static const struct { + rune k, v; +} lookup[] = { + {RUNE_C(0x000F3A), RUNE_C(0x000F3B)}, + {RUNE_C(0x000F3B), RUNE_C(0x000F3A)}, + {RUNE_C(0x000F3C), RUNE_C(0x000F3D)}, + {RUNE_C(0x000F3D), RUNE_C(0x000F3C)}, + {RUNE_C(0x00169B), RUNE_C(0x00169C)}, + {RUNE_C(0x00169C), RUNE_C(0x00169B)}, + {RUNE_C(0x002039), RUNE_C(0x00203A)}, + {RUNE_C(0x00203A), RUNE_C(0x002039)}, + {RUNE_C(0x002045), RUNE_C(0x002046)}, + {RUNE_C(0x002046), RUNE_C(0x002045)}, + {RUNE_C(0x00207D), RUNE_C(0x00207E)}, + {RUNE_C(0x00207E), RUNE_C(0x00207D)}, + {RUNE_C(0x00208D), RUNE_C(0x00208E)}, + {RUNE_C(0x00208E), RUNE_C(0x00208D)}, + {RUNE_C(0x002208), RUNE_C(0x00220B)}, + {RUNE_C(0x002209), RUNE_C(0x00220C)}, + {RUNE_C(0x00220A), RUNE_C(0x00220D)}, + {RUNE_C(0x00220B), RUNE_C(0x002208)}, + {RUNE_C(0x00220C), RUNE_C(0x002209)}, + {RUNE_C(0x00220D), RUNE_C(0x00220A)}, + {RUNE_C(0x002215), RUNE_C(0x0029F5)}, + {RUNE_C(0x00221F), RUNE_C(0x002BFE)}, + {RUNE_C(0x002220), RUNE_C(0x0029A3)}, + {RUNE_C(0x002221), RUNE_C(0x00299B)}, + {RUNE_C(0x002222), RUNE_C(0x0029A0)}, + {RUNE_C(0x002224), RUNE_C(0x002AEE)}, + {RUNE_C(0x00223C), RUNE_C(0x00223D)}, + {RUNE_C(0x00223D), RUNE_C(0x00223C)}, + {RUNE_C(0x002243), RUNE_C(0x0022CD)}, + {RUNE_C(0x002245), RUNE_C(0x00224C)}, + {RUNE_C(0x00224C), RUNE_C(0x002245)}, + {RUNE_C(0x002252), RUNE_C(0x002253)}, + {RUNE_C(0x002253), RUNE_C(0x002252)}, + {RUNE_C(0x002254), RUNE_C(0x002255)}, + {RUNE_C(0x002255), RUNE_C(0x002254)}, + {RUNE_C(0x002264), RUNE_C(0x002265)}, + {RUNE_C(0x002265), RUNE_C(0x002264)}, + {RUNE_C(0x002266), RUNE_C(0x002267)}, + {RUNE_C(0x002267), RUNE_C(0x002266)}, + {RUNE_C(0x002268), RUNE_C(0x002269)}, + {RUNE_C(0x002269), RUNE_C(0x002268)}, + {RUNE_C(0x00226A), RUNE_C(0x00226B)}, + {RUNE_C(0x00226B), RUNE_C(0x00226A)}, + {RUNE_C(0x00226E), RUNE_C(0x00226F)}, + {RUNE_C(0x00226F), RUNE_C(0x00226E)}, + {RUNE_C(0x002270), RUNE_C(0x002271)}, + {RUNE_C(0x002271), RUNE_C(0x002270)}, + {RUNE_C(0x002272), RUNE_C(0x002273)}, + {RUNE_C(0x002273), RUNE_C(0x002272)}, + {RUNE_C(0x002274), RUNE_C(0x002275)}, + {RUNE_C(0x002275), RUNE_C(0x002274)}, + {RUNE_C(0x002276), RUNE_C(0x002277)}, + {RUNE_C(0x002277), RUNE_C(0x002276)}, + {RUNE_C(0x002278), RUNE_C(0x002279)}, + {RUNE_C(0x002279), RUNE_C(0x002278)}, + {RUNE_C(0x00227A), RUNE_C(0x00227B)}, + {RUNE_C(0x00227B), RUNE_C(0x00227A)}, + {RUNE_C(0x00227C), RUNE_C(0x00227D)}, + {RUNE_C(0x00227D), RUNE_C(0x00227C)}, + {RUNE_C(0x00227E), RUNE_C(0x00227F)}, + {RUNE_C(0x00227F), RUNE_C(0x00227E)}, + {RUNE_C(0x002280), RUNE_C(0x002281)}, + {RUNE_C(0x002281), RUNE_C(0x002280)}, + {RUNE_C(0x002282), RUNE_C(0x002283)}, + {RUNE_C(0x002283), RUNE_C(0x002282)}, + {RUNE_C(0x002284), RUNE_C(0x002285)}, + {RUNE_C(0x002285), RUNE_C(0x002284)}, + {RUNE_C(0x002286), RUNE_C(0x002287)}, + {RUNE_C(0x002287), RUNE_C(0x002286)}, + {RUNE_C(0x002288), RUNE_C(0x002289)}, + {RUNE_C(0x002289), RUNE_C(0x002288)}, + {RUNE_C(0x00228A), RUNE_C(0x00228B)}, + {RUNE_C(0x00228B), RUNE_C(0x00228A)}, + {RUNE_C(0x00228F), RUNE_C(0x002290)}, + {RUNE_C(0x002290), RUNE_C(0x00228F)}, + {RUNE_C(0x002291), RUNE_C(0x002292)}, + {RUNE_C(0x002292), RUNE_C(0x002291)}, + {RUNE_C(0x002298), RUNE_C(0x0029B8)}, + {RUNE_C(0x0022A2), RUNE_C(0x0022A3)}, + {RUNE_C(0x0022A3), RUNE_C(0x0022A2)}, + {RUNE_C(0x0022A6), RUNE_C(0x002ADE)}, + {RUNE_C(0x0022A8), RUNE_C(0x002AE4)}, + {RUNE_C(0x0022A9), RUNE_C(0x002AE3)}, + {RUNE_C(0x0022AB), RUNE_C(0x002AE5)}, + {RUNE_C(0x0022B0), RUNE_C(0x0022B1)}, + {RUNE_C(0x0022B1), RUNE_C(0x0022B0)}, + {RUNE_C(0x0022B2), RUNE_C(0x0022B3)}, + {RUNE_C(0x0022B3), RUNE_C(0x0022B2)}, + {RUNE_C(0x0022B4), RUNE_C(0x0022B5)}, + {RUNE_C(0x0022B5), RUNE_C(0x0022B4)}, + {RUNE_C(0x0022B6), RUNE_C(0x0022B7)}, + {RUNE_C(0x0022B7), RUNE_C(0x0022B6)}, + {RUNE_C(0x0022B8), RUNE_C(0x0027DC)}, + {RUNE_C(0x0022C9), RUNE_C(0x0022CA)}, + {RUNE_C(0x0022CA), RUNE_C(0x0022C9)}, + {RUNE_C(0x0022CB), RUNE_C(0x0022CC)}, + {RUNE_C(0x0022CC), RUNE_C(0x0022CB)}, + {RUNE_C(0x0022CD), RUNE_C(0x002243)}, + {RUNE_C(0x0022D0), RUNE_C(0x0022D1)}, + {RUNE_C(0x0022D1), RUNE_C(0x0022D0)}, + {RUNE_C(0x0022D6), RUNE_C(0x0022D7)}, + {RUNE_C(0x0022D7), RUNE_C(0x0022D6)}, + {RUNE_C(0x0022D8), RUNE_C(0x0022D9)}, + {RUNE_C(0x0022D9), RUNE_C(0x0022D8)}, + {RUNE_C(0x0022DA), RUNE_C(0x0022DB)}, + {RUNE_C(0x0022DB), RUNE_C(0x0022DA)}, + {RUNE_C(0x0022DC), RUNE_C(0x0022DD)}, + {RUNE_C(0x0022DD), RUNE_C(0x0022DC)}, + {RUNE_C(0x0022DE), RUNE_C(0x0022DF)}, + {RUNE_C(0x0022DF), RUNE_C(0x0022DE)}, + {RUNE_C(0x0022E0), RUNE_C(0x0022E1)}, + {RUNE_C(0x0022E1), RUNE_C(0x0022E0)}, + {RUNE_C(0x0022E2), RUNE_C(0x0022E3)}, + {RUNE_C(0x0022E3), RUNE_C(0x0022E2)}, + {RUNE_C(0x0022E4), RUNE_C(0x0022E5)}, + {RUNE_C(0x0022E5), RUNE_C(0x0022E4)}, + {RUNE_C(0x0022E6), RUNE_C(0x0022E7)}, + {RUNE_C(0x0022E7), RUNE_C(0x0022E6)}, + {RUNE_C(0x0022E8), RUNE_C(0x0022E9)}, + {RUNE_C(0x0022E9), RUNE_C(0x0022E8)}, + {RUNE_C(0x0022EA), RUNE_C(0x0022EB)}, + {RUNE_C(0x0022EB), RUNE_C(0x0022EA)}, + {RUNE_C(0x0022EC), RUNE_C(0x0022ED)}, + {RUNE_C(0x0022ED), RUNE_C(0x0022EC)}, + {RUNE_C(0x0022F0), RUNE_C(0x0022F1)}, + {RUNE_C(0x0022F1), RUNE_C(0x0022F0)}, + {RUNE_C(0x0022F2), RUNE_C(0x0022FA)}, + {RUNE_C(0x0022F3), RUNE_C(0x0022FB)}, + {RUNE_C(0x0022F4), RUNE_C(0x0022FC)}, + {RUNE_C(0x0022F6), RUNE_C(0x0022FD)}, + {RUNE_C(0x0022F7), RUNE_C(0x0022FE)}, + {RUNE_C(0x0022FA), RUNE_C(0x0022F2)}, + {RUNE_C(0x0022FB), RUNE_C(0x0022F3)}, + {RUNE_C(0x0022FC), RUNE_C(0x0022F4)}, + {RUNE_C(0x0022FD), RUNE_C(0x0022F6)}, + {RUNE_C(0x0022FE), RUNE_C(0x0022F7)}, + {RUNE_C(0x002308), RUNE_C(0x002309)}, + {RUNE_C(0x002309), RUNE_C(0x002308)}, + {RUNE_C(0x00230A), RUNE_C(0x00230B)}, + {RUNE_C(0x00230B), RUNE_C(0x00230A)}, + {RUNE_C(0x002329), RUNE_C(0x00232A)}, + {RUNE_C(0x00232A), RUNE_C(0x002329)}, + {RUNE_C(0x002768), RUNE_C(0x002769)}, + {RUNE_C(0x002769), RUNE_C(0x002768)}, + {RUNE_C(0x00276A), RUNE_C(0x00276B)}, + {RUNE_C(0x00276B), RUNE_C(0x00276A)}, + {RUNE_C(0x00276C), RUNE_C(0x00276D)}, + {RUNE_C(0x00276D), RUNE_C(0x00276C)}, + {RUNE_C(0x00276E), RUNE_C(0x00276F)}, + {RUNE_C(0x00276F), RUNE_C(0x00276E)}, + {RUNE_C(0x002770), RUNE_C(0x002771)}, + {RUNE_C(0x002771), RUNE_C(0x002770)}, + {RUNE_C(0x002772), RUNE_C(0x002773)}, + {RUNE_C(0x002773), RUNE_C(0x002772)}, + {RUNE_C(0x002774), RUNE_C(0x002775)}, + {RUNE_C(0x002775), RUNE_C(0x002774)}, + {RUNE_C(0x0027C3), RUNE_C(0x0027C4)}, + {RUNE_C(0x0027C4), RUNE_C(0x0027C3)}, + {RUNE_C(0x0027C5), RUNE_C(0x0027C6)}, + {RUNE_C(0x0027C6), RUNE_C(0x0027C5)}, + {RUNE_C(0x0027C8), RUNE_C(0x0027C9)}, + {RUNE_C(0x0027C9), RUNE_C(0x0027C8)}, + {RUNE_C(0x0027CB), RUNE_C(0x0027CD)}, + {RUNE_C(0x0027CD), RUNE_C(0x0027CB)}, + {RUNE_C(0x0027D5), RUNE_C(0x0027D6)}, + {RUNE_C(0x0027D6), RUNE_C(0x0027D5)}, + {RUNE_C(0x0027DC), RUNE_C(0x0022B8)}, + {RUNE_C(0x0027DD), RUNE_C(0x0027DE)}, + {RUNE_C(0x0027DE), RUNE_C(0x0027DD)}, + {RUNE_C(0x0027E2), RUNE_C(0x0027E3)}, + {RUNE_C(0x0027E3), RUNE_C(0x0027E2)}, + {RUNE_C(0x0027E4), RUNE_C(0x0027E5)}, + {RUNE_C(0x0027E5), RUNE_C(0x0027E4)}, + {RUNE_C(0x0027E6), RUNE_C(0x0027E7)}, + {RUNE_C(0x0027E7), RUNE_C(0x0027E6)}, + {RUNE_C(0x0027E8), RUNE_C(0x0027E9)}, + {RUNE_C(0x0027E9), RUNE_C(0x0027E8)}, + {RUNE_C(0x0027EA), RUNE_C(0x0027EB)}, + {RUNE_C(0x0027EB), RUNE_C(0x0027EA)}, + {RUNE_C(0x0027EC), RUNE_C(0x0027ED)}, + {RUNE_C(0x0027ED), RUNE_C(0x0027EC)}, + {RUNE_C(0x0027EE), RUNE_C(0x0027EF)}, + {RUNE_C(0x0027EF), RUNE_C(0x0027EE)}, + {RUNE_C(0x002983), RUNE_C(0x002984)}, + {RUNE_C(0x002984), RUNE_C(0x002983)}, + {RUNE_C(0x002985), RUNE_C(0x002986)}, + {RUNE_C(0x002986), RUNE_C(0x002985)}, + {RUNE_C(0x002987), RUNE_C(0x002988)}, + {RUNE_C(0x002988), RUNE_C(0x002987)}, + {RUNE_C(0x002989), RUNE_C(0x00298A)}, + {RUNE_C(0x00298A), RUNE_C(0x002989)}, + {RUNE_C(0x00298B), RUNE_C(0x00298C)}, + {RUNE_C(0x00298C), RUNE_C(0x00298B)}, + {RUNE_C(0x00298D), RUNE_C(0x002990)}, + {RUNE_C(0x00298E), RUNE_C(0x00298F)}, + {RUNE_C(0x00298F), RUNE_C(0x00298E)}, + {RUNE_C(0x002990), RUNE_C(0x00298D)}, + {RUNE_C(0x002991), RUNE_C(0x002992)}, + {RUNE_C(0x002992), RUNE_C(0x002991)}, + {RUNE_C(0x002993), RUNE_C(0x002994)}, + {RUNE_C(0x002994), RUNE_C(0x002993)}, + {RUNE_C(0x002995), RUNE_C(0x002996)}, + {RUNE_C(0x002996), RUNE_C(0x002995)}, + {RUNE_C(0x002997), RUNE_C(0x002998)}, + {RUNE_C(0x002998), RUNE_C(0x002997)}, + {RUNE_C(0x00299B), RUNE_C(0x002221)}, + {RUNE_C(0x0029A0), RUNE_C(0x002222)}, + {RUNE_C(0x0029A3), RUNE_C(0x002220)}, + {RUNE_C(0x0029A4), RUNE_C(0x0029A5)}, + {RUNE_C(0x0029A5), RUNE_C(0x0029A4)}, + {RUNE_C(0x0029A8), RUNE_C(0x0029A9)}, + {RUNE_C(0x0029A9), RUNE_C(0x0029A8)}, + {RUNE_C(0x0029AA), RUNE_C(0x0029AB)}, + {RUNE_C(0x0029AB), RUNE_C(0x0029AA)}, + {RUNE_C(0x0029AC), RUNE_C(0x0029AD)}, + {RUNE_C(0x0029AD), RUNE_C(0x0029AC)}, + {RUNE_C(0x0029AE), RUNE_C(0x0029AF)}, + {RUNE_C(0x0029AF), RUNE_C(0x0029AE)}, + {RUNE_C(0x0029B8), RUNE_C(0x002298)}, + {RUNE_C(0x0029C0), RUNE_C(0x0029C1)}, + {RUNE_C(0x0029C1), RUNE_C(0x0029C0)}, + {RUNE_C(0x0029C4), RUNE_C(0x0029C5)}, + {RUNE_C(0x0029C5), RUNE_C(0x0029C4)}, + {RUNE_C(0x0029CF), RUNE_C(0x0029D0)}, + {RUNE_C(0x0029D0), RUNE_C(0x0029CF)}, + {RUNE_C(0x0029D1), RUNE_C(0x0029D2)}, + {RUNE_C(0x0029D2), RUNE_C(0x0029D1)}, + {RUNE_C(0x0029D4), RUNE_C(0x0029D5)}, + {RUNE_C(0x0029D5), RUNE_C(0x0029D4)}, + {RUNE_C(0x0029D8), RUNE_C(0x0029D9)}, + {RUNE_C(0x0029D9), RUNE_C(0x0029D8)}, + {RUNE_C(0x0029DA), RUNE_C(0x0029DB)}, + {RUNE_C(0x0029DB), RUNE_C(0x0029DA)}, + {RUNE_C(0x0029E8), RUNE_C(0x0029E9)}, + {RUNE_C(0x0029E9), RUNE_C(0x0029E8)}, + {RUNE_C(0x0029F5), RUNE_C(0x002215)}, + {RUNE_C(0x0029F8), RUNE_C(0x0029F9)}, + {RUNE_C(0x0029F9), RUNE_C(0x0029F8)}, + {RUNE_C(0x0029FC), RUNE_C(0x0029FD)}, + {RUNE_C(0x0029FD), RUNE_C(0x0029FC)}, + {RUNE_C(0x002A2B), RUNE_C(0x002A2C)}, + {RUNE_C(0x002A2C), RUNE_C(0x002A2B)}, + {RUNE_C(0x002A2D), RUNE_C(0x002A2E)}, + {RUNE_C(0x002A2E), RUNE_C(0x002A2D)}, + {RUNE_C(0x002A34), RUNE_C(0x002A35)}, + {RUNE_C(0x002A35), RUNE_C(0x002A34)}, + {RUNE_C(0x002A3C), RUNE_C(0x002A3D)}, + {RUNE_C(0x002A3D), RUNE_C(0x002A3C)}, + {RUNE_C(0x002A64), RUNE_C(0x002A65)}, + {RUNE_C(0x002A65), RUNE_C(0x002A64)}, + {RUNE_C(0x002A79), RUNE_C(0x002A7A)}, + {RUNE_C(0x002A7A), RUNE_C(0x002A79)}, + {RUNE_C(0x002A7B), RUNE_C(0x002A7C)}, + {RUNE_C(0x002A7C), RUNE_C(0x002A7B)}, + {RUNE_C(0x002A7D), RUNE_C(0x002A7E)}, + {RUNE_C(0x002A7E), RUNE_C(0x002A7D)}, + {RUNE_C(0x002A7F), RUNE_C(0x002A80)}, + {RUNE_C(0x002A80), RUNE_C(0x002A7F)}, + {RUNE_C(0x002A81), RUNE_C(0x002A82)}, + {RUNE_C(0x002A82), RUNE_C(0x002A81)}, + {RUNE_C(0x002A83), RUNE_C(0x002A84)}, + {RUNE_C(0x002A84), RUNE_C(0x002A83)}, + {RUNE_C(0x002A85), RUNE_C(0x002A86)}, + {RUNE_C(0x002A86), RUNE_C(0x002A85)}, + {RUNE_C(0x002A87), RUNE_C(0x002A88)}, + {RUNE_C(0x002A88), RUNE_C(0x002A87)}, + {RUNE_C(0x002A89), RUNE_C(0x002A8A)}, + {RUNE_C(0x002A8A), RUNE_C(0x002A89)}, + {RUNE_C(0x002A8B), RUNE_C(0x002A8C)}, + {RUNE_C(0x002A8C), RUNE_C(0x002A8B)}, + {RUNE_C(0x002A8D), RUNE_C(0x002A8E)}, + {RUNE_C(0x002A8E), RUNE_C(0x002A8D)}, + {RUNE_C(0x002A8F), RUNE_C(0x002A90)}, + {RUNE_C(0x002A90), RUNE_C(0x002A8F)}, + {RUNE_C(0x002A91), RUNE_C(0x002A92)}, + {RUNE_C(0x002A92), RUNE_C(0x002A91)}, + {RUNE_C(0x002A93), RUNE_C(0x002A94)}, + {RUNE_C(0x002A94), RUNE_C(0x002A93)}, + {RUNE_C(0x002A95), RUNE_C(0x002A96)}, + {RUNE_C(0x002A96), RUNE_C(0x002A95)}, + {RUNE_C(0x002A97), RUNE_C(0x002A98)}, + {RUNE_C(0x002A98), RUNE_C(0x002A97)}, + {RUNE_C(0x002A99), RUNE_C(0x002A9A)}, + {RUNE_C(0x002A9A), RUNE_C(0x002A99)}, + {RUNE_C(0x002A9B), RUNE_C(0x002A9C)}, + {RUNE_C(0x002A9C), RUNE_C(0x002A9B)}, + {RUNE_C(0x002A9D), RUNE_C(0x002A9E)}, + {RUNE_C(0x002A9E), RUNE_C(0x002A9D)}, + {RUNE_C(0x002A9F), RUNE_C(0x002AA0)}, + {RUNE_C(0x002AA0), RUNE_C(0x002A9F)}, + {RUNE_C(0x002AA1), RUNE_C(0x002AA2)}, + {RUNE_C(0x002AA2), RUNE_C(0x002AA1)}, + {RUNE_C(0x002AA6), RUNE_C(0x002AA7)}, + {RUNE_C(0x002AA7), RUNE_C(0x002AA6)}, + {RUNE_C(0x002AA8), RUNE_C(0x002AA9)}, + {RUNE_C(0x002AA9), RUNE_C(0x002AA8)}, + {RUNE_C(0x002AAA), RUNE_C(0x002AAB)}, + {RUNE_C(0x002AAB), RUNE_C(0x002AAA)}, + {RUNE_C(0x002AAC), RUNE_C(0x002AAD)}, + {RUNE_C(0x002AAD), RUNE_C(0x002AAC)}, + {RUNE_C(0x002AAF), RUNE_C(0x002AB0)}, + {RUNE_C(0x002AB0), RUNE_C(0x002AAF)}, + {RUNE_C(0x002AB1), RUNE_C(0x002AB2)}, + {RUNE_C(0x002AB2), RUNE_C(0x002AB1)}, + {RUNE_C(0x002AB3), RUNE_C(0x002AB4)}, + {RUNE_C(0x002AB4), RUNE_C(0x002AB3)}, + {RUNE_C(0x002AB5), RUNE_C(0x002AB6)}, + {RUNE_C(0x002AB6), RUNE_C(0x002AB5)}, + {RUNE_C(0x002AB7), RUNE_C(0x002AB8)}, + {RUNE_C(0x002AB8), RUNE_C(0x002AB7)}, + {RUNE_C(0x002AB9), RUNE_C(0x002ABA)}, + {RUNE_C(0x002ABA), RUNE_C(0x002AB9)}, + {RUNE_C(0x002ABB), RUNE_C(0x002ABC)}, + {RUNE_C(0x002ABC), RUNE_C(0x002ABB)}, + {RUNE_C(0x002ABD), RUNE_C(0x002ABE)}, + {RUNE_C(0x002ABE), RUNE_C(0x002ABD)}, + {RUNE_C(0x002ABF), RUNE_C(0x002AC0)}, + {RUNE_C(0x002AC0), RUNE_C(0x002ABF)}, + {RUNE_C(0x002AC1), RUNE_C(0x002AC2)}, + {RUNE_C(0x002AC2), RUNE_C(0x002AC1)}, + {RUNE_C(0x002AC3), RUNE_C(0x002AC4)}, + {RUNE_C(0x002AC4), RUNE_C(0x002AC3)}, + {RUNE_C(0x002AC5), RUNE_C(0x002AC6)}, + {RUNE_C(0x002AC6), RUNE_C(0x002AC5)}, + {RUNE_C(0x002AC7), RUNE_C(0x002AC8)}, + {RUNE_C(0x002AC8), RUNE_C(0x002AC7)}, + {RUNE_C(0x002AC9), RUNE_C(0x002ACA)}, + {RUNE_C(0x002ACA), RUNE_C(0x002AC9)}, + {RUNE_C(0x002ACB), RUNE_C(0x002ACC)}, + {RUNE_C(0x002ACC), RUNE_C(0x002ACB)}, + {RUNE_C(0x002ACD), RUNE_C(0x002ACE)}, + {RUNE_C(0x002ACE), RUNE_C(0x002ACD)}, + {RUNE_C(0x002ACF), RUNE_C(0x002AD0)}, + {RUNE_C(0x002AD0), RUNE_C(0x002ACF)}, + {RUNE_C(0x002AD1), RUNE_C(0x002AD2)}, + {RUNE_C(0x002AD2), RUNE_C(0x002AD1)}, + {RUNE_C(0x002AD3), RUNE_C(0x002AD4)}, + {RUNE_C(0x002AD4), RUNE_C(0x002AD3)}, + {RUNE_C(0x002AD5), RUNE_C(0x002AD6)}, + {RUNE_C(0x002AD6), RUNE_C(0x002AD5)}, + {RUNE_C(0x002ADE), RUNE_C(0x0022A6)}, + {RUNE_C(0x002AE3), RUNE_C(0x0022A9)}, + {RUNE_C(0x002AE4), RUNE_C(0x0022A8)}, + {RUNE_C(0x002AE5), RUNE_C(0x0022AB)}, + {RUNE_C(0x002AEC), RUNE_C(0x002AED)}, + {RUNE_C(0x002AED), RUNE_C(0x002AEC)}, + {RUNE_C(0x002AEE), RUNE_C(0x002224)}, + {RUNE_C(0x002AF7), RUNE_C(0x002AF8)}, + {RUNE_C(0x002AF8), RUNE_C(0x002AF7)}, + {RUNE_C(0x002AF9), RUNE_C(0x002AFA)}, + {RUNE_C(0x002AFA), RUNE_C(0x002AF9)}, + {RUNE_C(0x002BFE), RUNE_C(0x00221F)}, + {RUNE_C(0x002E02), RUNE_C(0x002E03)}, + {RUNE_C(0x002E03), RUNE_C(0x002E02)}, + {RUNE_C(0x002E04), RUNE_C(0x002E05)}, + {RUNE_C(0x002E05), RUNE_C(0x002E04)}, + {RUNE_C(0x002E09), RUNE_C(0x002E0A)}, + {RUNE_C(0x002E0A), RUNE_C(0x002E09)}, + {RUNE_C(0x002E0C), RUNE_C(0x002E0D)}, + {RUNE_C(0x002E0D), RUNE_C(0x002E0C)}, + {RUNE_C(0x002E1C), RUNE_C(0x002E1D)}, + {RUNE_C(0x002E1D), RUNE_C(0x002E1C)}, + {RUNE_C(0x002E20), RUNE_C(0x002E21)}, + {RUNE_C(0x002E21), RUNE_C(0x002E20)}, + {RUNE_C(0x002E22), RUNE_C(0x002E23)}, + {RUNE_C(0x002E23), RUNE_C(0x002E22)}, + {RUNE_C(0x002E24), RUNE_C(0x002E25)}, + {RUNE_C(0x002E25), RUNE_C(0x002E24)}, + {RUNE_C(0x002E26), RUNE_C(0x002E27)}, + {RUNE_C(0x002E27), RUNE_C(0x002E26)}, + {RUNE_C(0x002E28), RUNE_C(0x002E29)}, + {RUNE_C(0x002E29), RUNE_C(0x002E28)}, + {RUNE_C(0x002E55), RUNE_C(0x002E56)}, + {RUNE_C(0x002E56), RUNE_C(0x002E55)}, + {RUNE_C(0x002E57), RUNE_C(0x002E58)}, + {RUNE_C(0x002E58), RUNE_C(0x002E57)}, + {RUNE_C(0x002E59), RUNE_C(0x002E5A)}, + {RUNE_C(0x002E5A), RUNE_C(0x002E59)}, + {RUNE_C(0x002E5B), RUNE_C(0x002E5C)}, + {RUNE_C(0x002E5C), RUNE_C(0x002E5B)}, + {RUNE_C(0x003008), RUNE_C(0x003009)}, + {RUNE_C(0x003009), RUNE_C(0x003008)}, + {RUNE_C(0x00300A), RUNE_C(0x00300B)}, + {RUNE_C(0x00300B), RUNE_C(0x00300A)}, + {RUNE_C(0x00300C), RUNE_C(0x00300D)}, + {RUNE_C(0x00300D), RUNE_C(0x00300C)}, + {RUNE_C(0x00300E), RUNE_C(0x00300F)}, + {RUNE_C(0x00300F), RUNE_C(0x00300E)}, + {RUNE_C(0x003010), RUNE_C(0x003011)}, + {RUNE_C(0x003011), RUNE_C(0x003010)}, + {RUNE_C(0x003014), RUNE_C(0x003015)}, + {RUNE_C(0x003015), RUNE_C(0x003014)}, + {RUNE_C(0x003016), RUNE_C(0x003017)}, + {RUNE_C(0x003017), RUNE_C(0x003016)}, + {RUNE_C(0x003018), RUNE_C(0x003019)}, + {RUNE_C(0x003019), RUNE_C(0x003018)}, + {RUNE_C(0x00301A), RUNE_C(0x00301B)}, + {RUNE_C(0x00301B), RUNE_C(0x00301A)}, + {RUNE_C(0x00FE59), RUNE_C(0x00FE5A)}, + {RUNE_C(0x00FE5A), RUNE_C(0x00FE59)}, + {RUNE_C(0x00FE5B), RUNE_C(0x00FE5C)}, + {RUNE_C(0x00FE5C), RUNE_C(0x00FE5B)}, + {RUNE_C(0x00FE5D), RUNE_C(0x00FE5E)}, + {RUNE_C(0x00FE5E), RUNE_C(0x00FE5D)}, + {RUNE_C(0x00FE64), RUNE_C(0x00FE65)}, + {RUNE_C(0x00FE65), RUNE_C(0x00FE64)}, + {RUNE_C(0x00FF08), RUNE_C(0x00FF09)}, + {RUNE_C(0x00FF09), RUNE_C(0x00FF08)}, + {RUNE_C(0x00FF1C), RUNE_C(0x00FF1E)}, + {RUNE_C(0x00FF1E), RUNE_C(0x00FF1C)}, + {RUNE_C(0x00FF3B), RUNE_C(0x00FF3D)}, + {RUNE_C(0x00FF3D), RUNE_C(0x00FF3B)}, + {RUNE_C(0x00FF5B), RUNE_C(0x00FF5D)}, + {RUNE_C(0x00FF5D), RUNE_C(0x00FF5B)}, + {RUNE_C(0x00FF5F), RUNE_C(0x00FF60)}, + {RUNE_C(0x00FF60), RUNE_C(0x00FF5F)}, + {RUNE_C(0x00FF62), RUNE_C(0x00FF63)}, + {RUNE_C(0x00FF63), RUNE_C(0x00FF62)}, +}; + +__MLIB_DEFINE_BSEARCH_KV(rune, lookup, 0) + +rune +uprop_get_bmg(rune ch) +{ + return ch < lengthof(lookup_lat1) ? lookup_lat1[ch] : mlib_lookup_kv(ch); +} -- cgit v1.2.3