aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--data/BidiMirroring633
-rwxr-xr-xgen/data-files1
-rwxr-xr-xgen/prop/bmg54
-rw-r--r--include/unicode/prop.h1
-rw-r--r--lib/unicode/prop/uprop_get_bmg.c472
5 files changed, 1161 insertions, 0 deletions
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 <none>, 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; <none>
+
+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);
+}