changeset 108984:684f6b36230b

Use Unicode database for attribute tables in bidi.c. admin/unidata/bidimirror.awk: New file. admin/unidata/BidiMirroring.txt: New file from http://www.unicode.org/Public/6.0.0/ucd/BidiMirroring-6.0.0d1.txt. admin/unidata/Makefile.in: (../../src/bidimirror.h): New target. (all): Depend on ../../src/biditype.h and ../../src/bidimirror.h. admin/unidata/makefile.w32-in (../../src/bidimirror.h): New target. (all): Depend on ../../src/biditype.h and ../../src/bidimirror.h. admin/unidata/biditype.awk: New file. admin/unidata/Makefile.in (../../src/biditype.h): New target. admin/unidata/makefile.w32-in (../../src/biditype.h): New target. src/makefile.w32-in ($(BLD)/bidi.$(O)): Depend on biditype.h and bidimirror.h. src/deps.mk (bidi.o): Depend on biditype.h and bidimirror.h. src/bidi.c (bidi_initialize): Remove explicit initialization of bidi_type_table; include biditype.h instead. Don't support entries whose second codepoint is zero. Initialize bidi_mirror_table. (bidi_mirror_char): Use bidi_mirror_table. src/biditype.h: New file. src/bidimirror.h: New file.
author Eli Zaretskii <eliz@gnu.org>
date Sun, 13 Jun 2010 20:40:25 +0300
parents b7963ca9e06e (current diff) 7e588bac2220 (diff)
children f2d0b93e668c
files
diffstat 12 files changed, 1622 insertions(+), 295 deletions(-) [+]
line wrap: on
line diff
--- a/admin/ChangeLog	Sat Jun 12 19:26:40 2010 +0200
+++ b/admin/ChangeLog	Sun Jun 13 20:40:25 2010 +0300
@@ -1,3 +1,22 @@
+2010-06-12  Eli Zaretskii  <eliz@gnu.org>
+
+	* unidata/bidimirror.awk: New file.
+
+	* unidata/BidiMirroring.txt: New file from
+	http://www.unicode.org/Public/6.0.0/ucd/BidiMirroring-6.0.0d1.txt.
+
+	* unidata/Makefile.in: (../../src/bidimirror.h): New target.
+	(all): Depend on ../../src/biditype.h and ../../src/bidimirror.h.
+
+	* unidata/makefile.w32-in (../../src/bidimirror.h): New target.
+	(all): Depend on ../../src/biditype.h and ../../src/bidimirror.h.
+
+	* unidata/biditype.awk: New file.
+
+	* unidata/Makefile.in (../../src/biditype.h): New target.
+
+	* unidata/makefile.w32-in (../../src/biditype.h): New target.
+
 2010-06-09  Juanma Barranquero  <lekktu@gmail.com>
 
 	* unidata/UnicodeData.txt: Update from
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/admin/unidata/BidiMirroring.txt	Sun Jun 13 20:40:25 2010 +0300
@@ -0,0 +1,597 @@
+# BidiMirroring-6.0.0.txt
+# Date: 2009-11-10, 17:09:00 PST [KW]
+#
+# Bidi_Mirroring_Glyph Property
+# 
+# This file is an informative contributory data file in the
+# Unicode Character Database.
+#
+# Copyright (c) 1991-2009 Unicode, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# This data file lists characters that have the Bidi_Mirrored=True 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 6.0.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=True, 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 the code point itself, 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: Bidirectional Algorithm,
+# at http://www.unicode.org/unicode/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.
+# 
+# ############################################################
+
+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 # NOT AN ELEMENT OF
+220A; 220D # SMALL ELEMENT OF
+220B; 2208 # CONTAINS AS MEMBER
+220C; 2209 # DOES NOT CONTAIN AS MEMBER
+220D; 220A # SMALL CONTAINS AS MEMBER
+2215; 29F5 # DIVISION SLASH
+223C; 223D # TILDE OPERATOR
+223D; 223C # REVERSED TILDE
+2243; 22CD # ASYMPTOTICALLY 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
+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
+2773; 2772 # LIGHT RIGHT TORTOISE SHELL BRACKET
+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
+27D5; 27D6 # LEFT OUTER JOIN
+27D6; 27D5 # RIGHT OUTER JOIN
+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
+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
+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
+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
+2A8B; 2A8C # LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN
+2A8C; 2A8B # GREATER-THAN ABOVE DOUBLE-LINE EQUAL 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
+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
+2AB3; 2AB4 # PRECEDES ABOVE EQUALS SIGN
+2AB4; 2AB3 # SUCCEEDS ABOVE EQUALS SIGN
+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
+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
+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
+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
+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
+# 221F; RIGHT ANGLE
+# 2220; ANGLE
+# 2221; MEASURED ANGLE
+# 2222; SPHERICAL ANGLE
+# 2224; DOES NOT DIVIDE
+# 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
+# 2245; APPROXIMATELY 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
+# 224C; ALL EQUAL TO
+# 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
+# 22B8; MULTIMAP
+# 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
+# 27CC; LONG DIVISION
+# 27C0; THREE DIMENSIONAL ANGLE
+# 27D3; LOWER RIGHT CORNER WITH DOT
+# 27D4; UPPER LEFT CORNER WITH DOT
+# 27DC; LEFT MULTIMAP
+# 299B; MEASURED ANGLE OPENING LEFT
+# 299C; RIGHT ANGLE VARIANT WITH SQUARE
+# 299D; MEASURED RIGHT ANGLE WITH DOT
+# 299E; ANGLE WITH S INSIDE
+# 299F; ACUTE ANGLE
+# 29A0; SPHERICAL ANGLE OPENING LEFT
+# 29A1; SPHERICAL ANGLE OPENING UP
+# 29A2; TURNED ANGLE
+# 29A3; REVERSED ANGLE
+# 29A4; ANGLE WITH UNDERBAR
+# 29A5; REVERSED ANGLE WITH UNDERBAR
+# 29A6; OBLIQUE ANGLE OPENING UP
+# 29A7; OBLIQUE ANGLE OPENING DOWN
+# 29A8; MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT
+# 29A9; MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT
+# 29AA; MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT
+# 29AB; MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT
+# 29AC; MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP
+# 29AD; MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP
+# 29AE; MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN
+# 29AF; MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND 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
+# 29E8; DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK
+# 29E9; DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK
+# 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
+# 2A7B; LESS-THAN WITH QUESTION MARK ABOVE
+# 2A7C; GREATER-THAN WITH QUESTION MARK ABOVE
+# 2A85; LESS-THAN OR APPROXIMATE
+# 2A86; GREATER-THAN OR APPROXIMATE
+# 2A87; LESS-THAN AND SINGLE-LINE NOT EQUAL TO
+# 2A88; GREATER-THAN AND SINGLE-LINE NOT EQUAL TO
+# 2A89; LESS-THAN AND NOT APPROXIMATE
+# 2A8A; GREATER-THAN AND NOT APPROXIMATE
+# 2A8D; LESS-THAN ABOVE SIMILAR OR EQUAL
+# 2A8E; GREATER-THAN ABOVE SIMILAR OR EQUAL
+# 2A8F; LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN
+# 2A90; GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN
+# 2A9D; SIMILAR OR LESS-THAN
+# 2A9E; SIMILAR OR GREATER-THAN
+# 2A9F; SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN
+# 2AA0; SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN
+# 2AA3; DOUBLE NESTED LESS-THAN WITH UNDERBAR
+# 2AB1; PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO
+# 2AB2; SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO
+# 2AB5; PRECEDES ABOVE NOT EQUAL TO
+# 2AB6; SUCCEEDS ABOVE NOT EQUAL TO
+# 2AB7; PRECEDES ABOVE ALMOST EQUAL TO
+# 2AB8; SUCCEEDS ABOVE ALMOST EQUAL TO
+# 2AB9; PRECEDES ABOVE NOT ALMOST EQUAL TO
+# 2ABA; SUCCEEDS ABOVE NOT ALMOST EQUAL TO
+# 2AC7; SUBSET OF ABOVE TILDE OPERATOR
+# 2AC8; SUPERSET OF ABOVE TILDE OPERATOR
+# 2AC9; SUBSET OF ABOVE ALMOST EQUAL TO
+# 2ACA; SUPERSET OF ABOVE ALMOST EQUAL TO
+# 2ACB; SUBSET OF ABOVE NOT EQUAL TO
+# 2ACC; SUPERSET OF ABOVE NOT EQUAL TO
+# 2ADC; FORKING
+# 2AE2; VERTICAL BAR TRIPLE RIGHT TURNSTILE
+# 2AE6; LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL
+# 2AEE; DOES NOT DIVIDE WITH REVERSED NEGATION SLASH
+# 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
--- a/admin/unidata/Makefile.in	Sat Jun 12 19:26:40 2010 +0200
+++ b/admin/unidata/Makefile.in	Sun Jun 13 20:40:25 2010 +0300
@@ -23,7 +23,7 @@
 DSTDIR = ../../lisp/international
 RUNEMACS = ${EMACS} -Q --multibyte -batch
 
-all: ${DSTDIR}/charprop.el
+all: ${DSTDIR}/charprop.el ../../src/biditype.h ../../src/bidimirror.h
 
 .el.elc:
 	${RUNEMACS} -batch -f batch-byte-compile $<
@@ -37,6 +37,12 @@
 	cd ${DSTDIR}; \
 	${RUNEMACS} -batch --load $${ELC} -f unidata-gen-files $${DATA}
 
+../../src/biditype.h: UnicodeData.txt
+	gawk -F";" -f biditype.awk $< > $@
+
+../../src/bidimirror.h: BidiMirroring.txt
+	gawk -F"[; ]+" -f bidimirror.awk $< > $@
+
 install: charprop.el
 	cp charprop.el ${DSTDIR}
 	cp `sed -n 's/^;; FILE: //p' < charprop.el` ${DSTDIR}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/admin/unidata/bidimirror.awk	Sun Jun 13 20:40:25 2010 +0300
@@ -0,0 +1,37 @@
+# Generate data for bidi_mirroring_table, see src/bidi.c:bidi_initialize.
+
+# Copyright (C) 2010, Free Software Foundation, Inc.
+
+# This file is part of GNU Emacs.
+
+# GNU Emacs is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# GNU Emacs is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
+
+# Written by Eli Zaretskii <eliz@gnu.org>
+
+BEGIN {
+     printf "  struct {\n    int from, to;\n  } bidi_mirror[] = {\n";
+     first = 1;
+ }
+
+$1 !~ /^#/ && NF >= 2 {
+     if (!first)
+	 printf ",\n";
+     else
+	 first = 0;
+     printf "\t{ 0x%s, 0x%s }", $1, $2;
+ }
+
+END {
+     printf " };\n";
+ }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/admin/unidata/biditype.awk	Sun Jun 13 20:40:25 2010 +0300
@@ -0,0 +1,93 @@
+# Generate data for filling bidi_type_table, see src/bidi.c:bidi_initialize.
+
+# Copyright (C) 2010, Free Software Foundation, Inc.
+
+# This file is part of GNU Emacs.
+
+# GNU Emacs is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# GNU Emacs is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
+
+# Written by Eli Zaretskii <eliz@gnu.org>
+
+function trtype(type)
+{
+    # Types are listed in the order of decresing use in UnicodeData.txt:
+    if (type == "ON")
+	return "NEUTRAL_ON";
+    else if (type == "NSM")
+	return "WEAK_NSM";
+    else if (type == "AL")
+	return "STRONG_AL";
+    else if (type == "R")
+	return "STRONG_R";
+    else if (type == "BN")
+	return "WEAK_BN";
+    else if (type == "EN")
+	return "WEAK_EN";
+    else if (type == "ET")
+	return "WEAK_ET";
+    else if (type == "AN")
+	return "WEAK_AN";
+    else if (type == "WS")
+	return "NEUTRAL_WS";
+    else if (type == "CS")
+	return "WEAK_CS";
+    else if (type == "ES")
+	return "WEAK_ES";
+    else if (type == "B")
+	return "NEUTRAL_B";
+    else if (type == "S")
+	return "NEUTRAL_S";
+    else if (type == "LRE" || type == "RLE" || type == "LRO" || type == "RLO" || type == "PDF")
+	return type;
+    else if (type == "L")
+	return "STRONG_L";
+    else
+    {
+	printf "Unknown type: %s\n", type > "/dev/stderr";
+	exit 1;
+    }
+}
+
+BEGIN {
+     otype = "";
+     startcode = "";
+     endcode = "";
+     printf "  struct {\n    int from, to;\n    bidi_type_t type;\n  } bidi_type[] = {\n";
+     first = 1;
+ }
+
+ {   code = $1;
+     ntype = $5;
+     if (ntype != otype)
+     {
+	 # Don't output data for L, as that's the default value, see bidi.c.
+	 if (otype != "L" && startcode != "")
+	 {
+	     if (!first)
+		 printf ",\n";
+	     else
+		 first = 0;
+	     printf "\t{ 0x%s, 0x%s, %s }", startcode, endcode, trtype(otype);
+	 }
+	 otype = ntype;
+	 startcode = code;
+	 endcode = code;
+     }
+     else
+	 endcode = code;
+ }
+
+END {
+     printf " };\n";
+ }
--- a/admin/unidata/makefile.w32-in	Sat Jun 12 19:26:40 2010 +0200
+++ b/admin/unidata/makefile.w32-in	Sun Jun 13 20:40:25 2010 +0300
@@ -29,7 +29,7 @@
 # Quote EMACS so it could be a file name with embedded whitespace
 RUNEMACS = "$(EMACS)" -Q --multibyte -batch
 
-all: $(DSTDIR)/charprop.el
+all: $(DSTDIR)/charprop.el ../../src/biditype.h ../../src/bidimirror.h
 
 .el.elc:
 	$(RUNEMACS) -f batch-byte-compile $<
@@ -50,6 +50,16 @@
 
 ${DSTDIR}/charprop.el: charprop-$(SHELLTYPE)
 
+../../src/biditype.h: UnicodeData.txt
+	gawk -F";" -f biditype.awk -v BINMODE=2 $< > biditype.h
+	$(CP) biditype.h $@
+	$(DEL) biditype.h
+
+../../src/bidimirror.h: BidiMirroring.txt
+	gawk -F"[; ]+" -f bidimirror.awk -v BINMODE=2 $< > bidimirror.h
+	$(CP) bidimirror.h $@
+	$(DEL) bidimirror.h
+
 clean:
-	- $(DEL) unidata-gen.elc unidata.txt
+	- $(DEL) unidata-gen.elc unidata.txt biditype.h bidimirror.h
 
--- a/src/ChangeLog	Sat Jun 12 19:26:40 2010 +0200
+++ b/src/ChangeLog	Sun Jun 13 20:40:25 2010 +0300
@@ -1,5 +1,20 @@
 2010-06-12  Eli Zaretskii  <eliz@gnu.org>
 
+	* makefile.w32-in ($(BLD)/bidi.$(O)): Depend on biditype.h and
+	bidimirror.h.
+
+	* deps.mk (bidi.o): Depend on biditype.h and bidimirror.h.
+
+	* bidi.c (bidi_initialize): Remove explicit initialization of
+	bidi_type_table; include biditype.h instead.  Don't support
+	entries whose second codepoint is zero.  Initialize
+	bidi_mirror_table.
+	(bidi_mirror_char): Use bidi_mirror_table.
+
+	* biditype.h: New file.
+
+	* bidimirror.h: New file.
+
 	* window.c (syms_of_window): Doc fix (bug#6409).
 
 2010-06-12  Romain Francoise  <romain@orebokech.com>
--- a/src/bidi.c	Sat Jun 12 19:26:40 2010 +0200
+++ b/src/bidi.c	Sun Jun 13 20:40:25 2010 +0300
@@ -68,7 +68,7 @@
 
 static int bidi_initialized = 0;
 
-static Lisp_Object bidi_type_table;
+static Lisp_Object bidi_type_table, bidi_mirror_table;
 
 /* FIXME: Remove these when bidi_explicit_dir_char uses a lookup table.  */
 #define LRM_CHAR   0x200E
@@ -108,297 +108,26 @@
 static void
 bidi_initialize ()
 {
-  /* FIXME: This should come from the Unicode Database.  */
-  struct {
-    int from, to;
-    bidi_type_t type;
-  } bidi_type[] =
-      { { 0x0000, 0x0008, WEAK_BN },
-	{ 0x0009, 0x0000, NEUTRAL_S },
-	{ 0x000A, 0x0000, NEUTRAL_B },
-	{ 0x000B, 0x0000, NEUTRAL_S },
-	{ 0x000C, 0x0000, NEUTRAL_WS },
-	{ 0x000D, 0x0000, NEUTRAL_B },
-	{ 0x000E, 0x001B, WEAK_BN },
-	{ 0x001C, 0x001E, NEUTRAL_B },
-	{ 0x001F, 0x0000, NEUTRAL_S },
-	{ 0x0020, 0x0000, NEUTRAL_WS },
-	{ 0x0021, 0x0022, NEUTRAL_ON },
-	{ 0x0023, 0x0025, WEAK_ET },
-	{ 0x0026, 0x002A, NEUTRAL_ON },
-	{ 0x002B, 0x0000, WEAK_ES },
-	{ 0x002C, 0x0000, WEAK_CS },
-	{ 0x002D, 0x0000, WEAK_ES },
-	{ 0x002E, 0x002F, WEAK_CS },
-	{ 0x0030, 0x0039, WEAK_EN },
-	{ 0x003A, 0x0000, WEAK_CS },
-	{ 0x003B, 0x0040, NEUTRAL_ON },
-	{ 0x005B, 0x0060, NEUTRAL_ON },
-	{ 0x007B, 0x007E, NEUTRAL_ON },
-	{ 0x007F, 0x0084, WEAK_BN },
-	{ 0x0085, 0x0000, NEUTRAL_B },
-	{ 0x0086, 0x009F, WEAK_BN },
-	{ 0x00A0, 0x0000, WEAK_CS },
-	{ 0x00A1, 0x0000, NEUTRAL_ON },
-	{ 0x00A2, 0x00A5, WEAK_ET },
-	{ 0x00A6, 0x00A9, NEUTRAL_ON },
-	{ 0x00AB, 0x00AC, NEUTRAL_ON },
-	{ 0x00AD, 0x0000, WEAK_BN },
-	{ 0x00AE, 0x00Af, NEUTRAL_ON },
-	{ 0x00B0, 0x00B1, WEAK_ET },
-	{ 0x00B2, 0x00B3, WEAK_EN },
-	{ 0x00B4, 0x0000, NEUTRAL_ON },
-	{ 0x00B6, 0x00B8, NEUTRAL_ON },
-	{ 0x00B9, 0x0000, WEAK_EN },
-	{ 0x00BB, 0x00BF, NEUTRAL_ON },
-	{ 0x00D7, 0x0000, NEUTRAL_ON },
-	{ 0x00F7, 0x0000, NEUTRAL_ON },
-	{ 0x02B9, 0x02BA, NEUTRAL_ON },
-	{ 0x02C2, 0x02CF, NEUTRAL_ON },
-	{ 0x02D2, 0x02DF, NEUTRAL_ON },
-	{ 0x02E5, 0x02ED, NEUTRAL_ON },
-	{ 0x0300, 0x036F, WEAK_NSM },
-	{ 0x0374, 0x0375, NEUTRAL_ON },
-	{ 0x037E, 0x0385, NEUTRAL_ON },
-	{ 0x0387, 0x0000, NEUTRAL_ON },
-	{ 0x03F6, 0x0000, NEUTRAL_ON },
-	{ 0x0483, 0x0489, WEAK_NSM },
-	{ 0x058A, 0x0000, NEUTRAL_ON },
-	{ 0x0591, 0x05BD, WEAK_NSM },
-	{ 0x05BE, 0x0000, STRONG_R },
-	{ 0x05BF, 0x0000, WEAK_NSM },
-	{ 0x05C0, 0x0000, STRONG_R },
-	{ 0x05C1, 0x05C2, WEAK_NSM },
-	{ 0x05C3, 0x0000, STRONG_R },
-	{ 0x05C4, 0x05C5, WEAK_NSM },
-	{ 0x05C6, 0x0000, STRONG_R },
-	{ 0x05C7, 0x0000, WEAK_NSM },
-	{ 0x05D0, 0x05F4, STRONG_R },
-	{ 0x060C, 0x0000, WEAK_CS },
-	{ 0x061B, 0x064A, STRONG_AL },
-	{ 0x064B, 0x0655, WEAK_NSM },
-	{ 0x0660, 0x0669, WEAK_AN },
-	{ 0x066A, 0x0000, WEAK_ET },
-	{ 0x066B, 0x066C, WEAK_AN },
-	{ 0x066D, 0x066F, STRONG_AL },
-	{ 0x0670, 0x0000, WEAK_NSM },
-	{ 0x0671, 0x06D5, STRONG_AL },
-	{ 0x06D6, 0x06DC, WEAK_NSM },
-	{ 0x06DD, 0x0000, STRONG_AL },
-	{ 0x06DE, 0x06E4, WEAK_NSM },
-	{ 0x06E5, 0x06E6, STRONG_AL },
-	{ 0x06E7, 0x06E8, WEAK_NSM },
-	{ 0x06E9, 0x0000, NEUTRAL_ON },
-	{ 0x06EA, 0x06ED, WEAK_NSM },
-	{ 0x06F0, 0x06F9, WEAK_EN },
-	{ 0x06FA, 0x070D, STRONG_AL },
-	{ 0x070F, 0x0000, WEAK_BN },
-	{ 0x0710, 0x0000, STRONG_AL },
-	{ 0x0711, 0x0000, WEAK_NSM },
-	{ 0x0712, 0x072C, STRONG_AL },
-	{ 0x0730, 0x074A, WEAK_NSM },
-	{ 0x0780, 0x07A5, STRONG_AL },
-	{ 0x07A6, 0x07B0, WEAK_NSM },
-	{ 0x07B1, 0x0000, STRONG_AL },
-	{ 0x0901, 0x0902, WEAK_NSM },
-	{ 0x093C, 0x0000, WEAK_NSM },
-	{ 0x0941, 0x0948, WEAK_NSM },
-	{ 0x094D, 0x0000, WEAK_NSM },
-	{ 0x0951, 0x0954, WEAK_NSM },
-	{ 0x0962, 0x0963, WEAK_NSM },
-	{ 0x0981, 0x0000, WEAK_NSM },
-	{ 0x09BC, 0x0000, WEAK_NSM },
-	{ 0x09C1, 0x09C4, WEAK_NSM },
-	{ 0x09CD, 0x0000, WEAK_NSM },
-	{ 0x09E2, 0x09E3, WEAK_NSM },
-	{ 0x09F2, 0x09F3, WEAK_ET },
-	{ 0x0A02, 0x0000, WEAK_NSM },
-	{ 0x0A3C, 0x0000, WEAK_NSM },
-	{ 0x0A41, 0x0A4D, WEAK_NSM },
-	{ 0x0A70, 0x0A71, WEAK_NSM },
-	{ 0x0A81, 0x0A82, WEAK_NSM },
-	{ 0x0ABC, 0x0000, WEAK_NSM },
-	{ 0x0AC1, 0x0AC8, WEAK_NSM },
-	{ 0x0ACD, 0x0000, WEAK_NSM },
-	{ 0x0B01, 0x0000, WEAK_NSM },
-	{ 0x0B3C, 0x0000, WEAK_NSM },
-	{ 0x0B3F, 0x0000, WEAK_NSM },
-	{ 0x0B41, 0x0B43, WEAK_NSM },
-	{ 0x0B4D, 0x0B56, WEAK_NSM },
-	{ 0x0B82, 0x0000, WEAK_NSM },
-	{ 0x0BC0, 0x0000, WEAK_NSM },
-	{ 0x0BCD, 0x0000, WEAK_NSM },
-	{ 0x0C3E, 0x0C40, WEAK_NSM },
-	{ 0x0C46, 0x0C56, WEAK_NSM },
-	{ 0x0CBF, 0x0000, WEAK_NSM },
-	{ 0x0CC6, 0x0000, WEAK_NSM },
-	{ 0x0CCC, 0x0CCD, WEAK_NSM },
-	{ 0x0D41, 0x0D43, WEAK_NSM },
-	{ 0x0D4D, 0x0000, WEAK_NSM },
-	{ 0x0DCA, 0x0000, WEAK_NSM },
-	{ 0x0DD2, 0x0DD6, WEAK_NSM },
-	{ 0x0E31, 0x0000, WEAK_NSM },
-	{ 0x0E34, 0x0E3A, WEAK_NSM },
-	{ 0x0E3F, 0x0000, WEAK_ET },
-	{ 0x0E47, 0x0E4E, WEAK_NSM },
-	{ 0x0EB1, 0x0000, WEAK_NSM },
-	{ 0x0EB4, 0x0EBC, WEAK_NSM },
-	{ 0x0EC8, 0x0ECD, WEAK_NSM },
-	{ 0x0F18, 0x0F19, WEAK_NSM },
-	{ 0x0F35, 0x0000, WEAK_NSM },
-	{ 0x0F37, 0x0000, WEAK_NSM },
-	{ 0x0F39, 0x0000, WEAK_NSM },
-	{ 0x0F3A, 0x0F3D, NEUTRAL_ON },
-	{ 0x0F71, 0x0F7E, WEAK_NSM },
-	{ 0x0F80, 0x0F84, WEAK_NSM },
-	{ 0x0F86, 0x0F87, WEAK_NSM },
-	{ 0x0F90, 0x0FBC, WEAK_NSM },
-	{ 0x0FC6, 0x0000, WEAK_NSM },
-	{ 0x102D, 0x1030, WEAK_NSM },
-	{ 0x1032, 0x1037, WEAK_NSM },
-	{ 0x1039, 0x0000, WEAK_NSM },
-	{ 0x1058, 0x1059, WEAK_NSM },
-	{ 0x1680, 0x0000, NEUTRAL_WS },
-	{ 0x169B, 0x169C, NEUTRAL_ON },
-	{ 0x1712, 0x1714, WEAK_NSM },
-	{ 0x1732, 0x1734, WEAK_NSM },
-	{ 0x1752, 0x1753, WEAK_NSM },
-	{ 0x1772, 0x1773, WEAK_NSM },
-	{ 0x17B7, 0x17BD, WEAK_NSM },
-	{ 0x17C6, 0x0000, WEAK_NSM },
-	{ 0x17C9, 0x17D3, WEAK_NSM },
-	{ 0x17DB, 0x0000, WEAK_ET },
-	{ 0x1800, 0x180A, NEUTRAL_ON },
-	{ 0x180B, 0x180D, WEAK_NSM },
-	{ 0x180E, 0x0000, WEAK_BN },
-	{ 0x18A9, 0x0000, WEAK_NSM },
-	{ 0x1FBD, 0x0000, NEUTRAL_ON },
-	{ 0x1FBF, 0x1FC1, NEUTRAL_ON },
-	{ 0x1FCD, 0x1FCF, NEUTRAL_ON },
-	{ 0x1FDD, 0x1FDF, NEUTRAL_ON },
-	{ 0x1FED, 0x1FEF, NEUTRAL_ON },
-	{ 0x1FFD, 0x1FFE, NEUTRAL_ON },
-	{ 0x2000, 0x200A, NEUTRAL_WS },
-	{ 0x200B, 0x200D, WEAK_BN },
-	{ 0x200F, 0x0000, STRONG_R },
-	{ 0x2010, 0x2027, NEUTRAL_ON },
-	{ 0x2028, 0x0000, NEUTRAL_WS },
-	{ 0x2029, 0x0000, NEUTRAL_B },
-	{ 0x202A, 0x0000, LRE },
-	{ 0x202B, 0x0000, RLE },
-	{ 0x202C, 0x0000, PDF },
-	{ 0x202D, 0x0000, LRO },
-	{ 0x202E, 0x0000, RLO },
-	{ 0x202F, 0x0000, NEUTRAL_WS },
-	{ 0x2030, 0x2034, WEAK_ET },
-	{ 0x2035, 0x2057, NEUTRAL_ON },
-	{ 0x205F, 0x0000, NEUTRAL_WS },
-	{ 0x2060, 0x206F, WEAK_BN },
-	{ 0x2070, 0x0000, WEAK_EN },
-	{ 0x2074, 0x2079, WEAK_EN },
-	{ 0x207A, 0x207B, WEAK_ET },
-	{ 0x207C, 0x207E, NEUTRAL_ON },
-	{ 0x2080, 0x2089, WEAK_EN },
-	{ 0x208A, 0x208B, WEAK_ET },
-	{ 0x208C, 0x208E, NEUTRAL_ON },
-	{ 0x20A0, 0x20B1, WEAK_ET },
-	{ 0x20D0, 0x20EA, WEAK_NSM },
-	{ 0x2100, 0x2101, NEUTRAL_ON },
-	{ 0x2103, 0x2106, NEUTRAL_ON },
-	{ 0x2108, 0x2109, NEUTRAL_ON },
-	{ 0x2114, 0x0000, NEUTRAL_ON },
-	{ 0x2116, 0x2118, NEUTRAL_ON },
-	{ 0x211E, 0x2123, NEUTRAL_ON },
-	{ 0x2125, 0x0000, NEUTRAL_ON },
-	{ 0x2127, 0x0000, NEUTRAL_ON },
-	{ 0x2129, 0x0000, NEUTRAL_ON },
-	{ 0x212E, 0x0000, WEAK_ET },
-	{ 0x2132, 0x0000, NEUTRAL_ON },
-	{ 0x213A, 0x0000, NEUTRAL_ON },
-	{ 0x2140, 0x2144, NEUTRAL_ON },
-	{ 0x214A, 0x215F, NEUTRAL_ON },
-	{ 0x2190, 0x2211, NEUTRAL_ON },
-	{ 0x2212, 0x2213, WEAK_ET },
-	{ 0x2214, 0x2335, NEUTRAL_ON },
-	{ 0x237B, 0x2394, NEUTRAL_ON },
-	{ 0x2396, 0x244A, NEUTRAL_ON },
-	{ 0x2460, 0x249B, WEAK_EN },
-	{ 0x24EA, 0x0000, WEAK_EN },
-	{ 0x24EB, 0x2FFB, NEUTRAL_ON },
-	{ 0x3000, 0x0000, NEUTRAL_WS },
-	{ 0x3001, 0x3004, NEUTRAL_ON },
-	{ 0x3008, 0x3020, NEUTRAL_ON },
-	{ 0x302A, 0x302F, WEAK_NSM },
-	{ 0x3030, 0x0000, NEUTRAL_ON },
-	{ 0x3036, 0x3037, NEUTRAL_ON },
-	{ 0x303D, 0x303F, NEUTRAL_ON },
-	{ 0x3099, 0x309A, WEAK_NSM },
-	{ 0x309B, 0x309C, NEUTRAL_ON },
-	{ 0x30A0, 0x0000, NEUTRAL_ON },
-	{ 0x30FB, 0x0000, NEUTRAL_ON },
-	{ 0x3251, 0x325F, NEUTRAL_ON },
-	{ 0x32B1, 0x32BF, NEUTRAL_ON },
-	{ 0xA490, 0xA4C6, NEUTRAL_ON },
-	{ 0xFB1D, 0x0000, STRONG_R },
-	{ 0xFB1E, 0x0000, WEAK_NSM },
-	{ 0xFB1F, 0xFB28, STRONG_R },
-	{ 0xFB29, 0x0000, WEAK_ET },
-	{ 0xFB2A, 0xFB4F, STRONG_R },
-	{ 0xFB50, 0xFD3D, STRONG_AL },
-	{ 0xFD3E, 0xFD3F, NEUTRAL_ON },
-	{ 0xFD50, 0xFDFC, STRONG_AL },
-	{ 0xFE00, 0xFE23, WEAK_NSM },
-	{ 0xFE30, 0xFE4F, NEUTRAL_ON },
-	{ 0xFE50, 0x0000, WEAK_CS },
-	{ 0xFE51, 0x0000, NEUTRAL_ON },
-	{ 0xFE52, 0x0000, WEAK_CS },
-	{ 0xFE54, 0x0000, NEUTRAL_ON },
-	{ 0xFE55, 0x0000, WEAK_CS },
-	{ 0xFE56, 0xFE5E, NEUTRAL_ON },
-	{ 0xFE5F, 0x0000, WEAK_ET },
-	{ 0xFE60, 0xFE61, NEUTRAL_ON },
-	{ 0xFE62, 0xFE63, WEAK_ET },
-	{ 0xFE64, 0xFE68, NEUTRAL_ON },
-	{ 0xFE69, 0xFE6A, WEAK_ET },
-	{ 0xFE6B, 0x0000, NEUTRAL_ON },
-	{ 0xFE70, 0xFEFC, STRONG_AL },
-	{ 0xFEFF, 0x0000, WEAK_BN },
-	{ 0xFF01, 0xFF02, NEUTRAL_ON },
-	{ 0xFF03, 0xFF05, WEAK_ET },
-	{ 0xFF06, 0xFF0A, NEUTRAL_ON },
-	{ 0xFF0B, 0x0000, WEAK_ET },
-	{ 0xFF0C, 0x0000, WEAK_CS },
-	{ 0xFF0D, 0x0000, WEAK_ET },
-	{ 0xFF0E, 0x0000, WEAK_CS },
-	{ 0xFF0F, 0x0000, WEAK_ES },
-	{ 0xFF10, 0xFF19, WEAK_EN },
-	{ 0xFF1A, 0x0000, WEAK_CS },
-	{ 0xFF1B, 0xFF20, NEUTRAL_ON },
-	{ 0xFF3B, 0xFF40, NEUTRAL_ON },
-	{ 0xFF5B, 0xFF65, NEUTRAL_ON },
-	{ 0xFFE0, 0xFFE1, WEAK_ET },
-	{ 0xFFE2, 0xFFE4, NEUTRAL_ON },
-	{ 0xFFE5, 0xFFE6, WEAK_ET },
-	{ 0xFFE8, 0xFFEE, NEUTRAL_ON },
-	{ 0xFFF9, 0xFFFB, WEAK_BN },
-	{ 0xFFFC, 0xFFFD, NEUTRAL_ON },
-	{ 0x1D167, 0x1D169, WEAK_NSM },
-	{ 0x1D173, 0x1D17A, WEAK_BN },
-	{ 0x1D17B, 0x1D182, WEAK_NSM },
-	{ 0x1D185, 0x1D18B, WEAK_NSM },
-	{ 0x1D1AA, 0x1D1AD, WEAK_NSM },
-	{ 0x1D7CE, 0x1D7FF, WEAK_EN },
-	{ 0xE0001, 0xE007F, WEAK_BN } };
+
+#include "biditype.h"
+#include "bidimirror.h"
+
   int i;
 
   bidi_type_table = Fmake_char_table (Qnil, make_number (STRONG_L));
   staticpro (&bidi_type_table);
 
   for (i = 0; i < sizeof bidi_type / sizeof bidi_type[0]; i++)
-    char_table_set_range (bidi_type_table, bidi_type[i].from,
-			  bidi_type[i].to ? bidi_type[i].to : bidi_type[i].from,
+    char_table_set_range (bidi_type_table, bidi_type[i].from, bidi_type[i].to,
 			  make_number (bidi_type[i].type));
 
+  bidi_mirror_table = Fmake_char_table (Qnil, Qnil);
+  staticpro (&bidi_mirror_table);
+
+  for (i = 0; i < sizeof bidi_mirror / sizeof bidi_mirror[0]; i++)
+    char_table_set (bidi_mirror_table, bidi_mirror[i].from,
+		    make_number (bidi_mirror[i].to));
+
   Qparagraph_start = intern ("paragraph-start");
   staticpro (&Qparagraph_start);
   paragraph_start_re = Fsymbol_value (Qparagraph_start);
@@ -505,20 +234,27 @@
 
    Note: The conditions in UAX#9 clause L4 must be tested by the
    caller.  */
-/* FIXME: exceedingly temporary!  Should consult the Unicode database
-   of character properties.  */
 int
 bidi_mirror_char (int c)
 {
-  static const char mirrored_pairs[] = "()<>[]{}";
-  const char *p = c > 0 && c < 128 ? strchr (mirrored_pairs, c) : NULL;
+  Lisp_Object val;
 
-  if (p)
+  if (c == BIDI_EOB)
+    return c;
+  if (c < 0 || c > MAX_CHAR)
+    abort ();
+
+  val = CHAR_TABLE_REF (bidi_mirror_table, c);
+  if (INTEGERP (val))
     {
-      size_t i = p - mirrored_pairs;
+      int v = XINT (val);
 
-      return mirrored_pairs [(i ^ 1)];
+      if (v < 0 || v > MAX_CHAR)
+	abort ();
+
+      return v;
     }
+
   return c;
 }
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/bidimirror.h	Sun Jun 13 20:40:25 2010 +0300
@@ -0,0 +1,365 @@
+  struct {
+    int from, to;
+  } bidi_mirror[] = {
+	{ 0x0028, 0x0029 },
+	{ 0x0029, 0x0028 },
+	{ 0x003C, 0x003E },
+	{ 0x003E, 0x003C },
+	{ 0x005B, 0x005D },
+	{ 0x005D, 0x005B },
+	{ 0x007B, 0x007D },
+	{ 0x007D, 0x007B },
+	{ 0x00AB, 0x00BB },
+	{ 0x00BB, 0x00AB },
+	{ 0x0F3A, 0x0F3B },
+	{ 0x0F3B, 0x0F3A },
+	{ 0x0F3C, 0x0F3D },
+	{ 0x0F3D, 0x0F3C },
+	{ 0x169B, 0x169C },
+	{ 0x169C, 0x169B },
+	{ 0x2039, 0x203A },
+	{ 0x203A, 0x2039 },
+	{ 0x2045, 0x2046 },
+	{ 0x2046, 0x2045 },
+	{ 0x207D, 0x207E },
+	{ 0x207E, 0x207D },
+	{ 0x208D, 0x208E },
+	{ 0x208E, 0x208D },
+	{ 0x2208, 0x220B },
+	{ 0x2209, 0x220C },
+	{ 0x220A, 0x220D },
+	{ 0x220B, 0x2208 },
+	{ 0x220C, 0x2209 },
+	{ 0x220D, 0x220A },
+	{ 0x2215, 0x29F5 },
+	{ 0x223C, 0x223D },
+	{ 0x223D, 0x223C },
+	{ 0x2243, 0x22CD },
+	{ 0x2252, 0x2253 },
+	{ 0x2253, 0x2252 },
+	{ 0x2254, 0x2255 },
+	{ 0x2255, 0x2254 },
+	{ 0x2264, 0x2265 },
+	{ 0x2265, 0x2264 },
+	{ 0x2266, 0x2267 },
+	{ 0x2267, 0x2266 },
+	{ 0x2268, 0x2269 },
+	{ 0x2269, 0x2268 },
+	{ 0x226A, 0x226B },
+	{ 0x226B, 0x226A },
+	{ 0x226E, 0x226F },
+	{ 0x226F, 0x226E },
+	{ 0x2270, 0x2271 },
+	{ 0x2271, 0x2270 },
+	{ 0x2272, 0x2273 },
+	{ 0x2273, 0x2272 },
+	{ 0x2274, 0x2275 },
+	{ 0x2275, 0x2274 },
+	{ 0x2276, 0x2277 },
+	{ 0x2277, 0x2276 },
+	{ 0x2278, 0x2279 },
+	{ 0x2279, 0x2278 },
+	{ 0x227A, 0x227B },
+	{ 0x227B, 0x227A },
+	{ 0x227C, 0x227D },
+	{ 0x227D, 0x227C },
+	{ 0x227E, 0x227F },
+	{ 0x227F, 0x227E },
+	{ 0x2280, 0x2281 },
+	{ 0x2281, 0x2280 },
+	{ 0x2282, 0x2283 },
+	{ 0x2283, 0x2282 },
+	{ 0x2284, 0x2285 },
+	{ 0x2285, 0x2284 },
+	{ 0x2286, 0x2287 },
+	{ 0x2287, 0x2286 },
+	{ 0x2288, 0x2289 },
+	{ 0x2289, 0x2288 },
+	{ 0x228A, 0x228B },
+	{ 0x228B, 0x228A },
+	{ 0x228F, 0x2290 },
+	{ 0x2290, 0x228F },
+	{ 0x2291, 0x2292 },
+	{ 0x2292, 0x2291 },
+	{ 0x2298, 0x29B8 },
+	{ 0x22A2, 0x22A3 },
+	{ 0x22A3, 0x22A2 },
+	{ 0x22A6, 0x2ADE },
+	{ 0x22A8, 0x2AE4 },
+	{ 0x22A9, 0x2AE3 },
+	{ 0x22AB, 0x2AE5 },
+	{ 0x22B0, 0x22B1 },
+	{ 0x22B1, 0x22B0 },
+	{ 0x22B2, 0x22B3 },
+	{ 0x22B3, 0x22B2 },
+	{ 0x22B4, 0x22B5 },
+	{ 0x22B5, 0x22B4 },
+	{ 0x22B6, 0x22B7 },
+	{ 0x22B7, 0x22B6 },
+	{ 0x22C9, 0x22CA },
+	{ 0x22CA, 0x22C9 },
+	{ 0x22CB, 0x22CC },
+	{ 0x22CC, 0x22CB },
+	{ 0x22CD, 0x2243 },
+	{ 0x22D0, 0x22D1 },
+	{ 0x22D1, 0x22D0 },
+	{ 0x22D6, 0x22D7 },
+	{ 0x22D7, 0x22D6 },
+	{ 0x22D8, 0x22D9 },
+	{ 0x22D9, 0x22D8 },
+	{ 0x22DA, 0x22DB },
+	{ 0x22DB, 0x22DA },
+	{ 0x22DC, 0x22DD },
+	{ 0x22DD, 0x22DC },
+	{ 0x22DE, 0x22DF },
+	{ 0x22DF, 0x22DE },
+	{ 0x22E0, 0x22E1 },
+	{ 0x22E1, 0x22E0 },
+	{ 0x22E2, 0x22E3 },
+	{ 0x22E3, 0x22E2 },
+	{ 0x22E4, 0x22E5 },
+	{ 0x22E5, 0x22E4 },
+	{ 0x22E6, 0x22E7 },
+	{ 0x22E7, 0x22E6 },
+	{ 0x22E8, 0x22E9 },
+	{ 0x22E9, 0x22E8 },
+	{ 0x22EA, 0x22EB },
+	{ 0x22EB, 0x22EA },
+	{ 0x22EC, 0x22ED },
+	{ 0x22ED, 0x22EC },
+	{ 0x22F0, 0x22F1 },
+	{ 0x22F1, 0x22F0 },
+	{ 0x22F2, 0x22FA },
+	{ 0x22F3, 0x22FB },
+	{ 0x22F4, 0x22FC },
+	{ 0x22F6, 0x22FD },
+	{ 0x22F7, 0x22FE },
+	{ 0x22FA, 0x22F2 },
+	{ 0x22FB, 0x22F3 },
+	{ 0x22FC, 0x22F4 },
+	{ 0x22FD, 0x22F6 },
+	{ 0x22FE, 0x22F7 },
+	{ 0x2308, 0x2309 },
+	{ 0x2309, 0x2308 },
+	{ 0x230A, 0x230B },
+	{ 0x230B, 0x230A },
+	{ 0x2329, 0x232A },
+	{ 0x232A, 0x2329 },
+	{ 0x2768, 0x2769 },
+	{ 0x2769, 0x2768 },
+	{ 0x276A, 0x276B },
+	{ 0x276B, 0x276A },
+	{ 0x276C, 0x276D },
+	{ 0x276D, 0x276C },
+	{ 0x276E, 0x276F },
+	{ 0x276F, 0x276E },
+	{ 0x2770, 0x2771 },
+	{ 0x2771, 0x2770 },
+	{ 0x2772, 0x2773 },
+	{ 0x2773, 0x2772 },
+	{ 0x2774, 0x2775 },
+	{ 0x2775, 0x2774 },
+	{ 0x27C3, 0x27C4 },
+	{ 0x27C4, 0x27C3 },
+	{ 0x27C5, 0x27C6 },
+	{ 0x27C6, 0x27C5 },
+	{ 0x27C8, 0x27C9 },
+	{ 0x27C9, 0x27C8 },
+	{ 0x27D5, 0x27D6 },
+	{ 0x27D6, 0x27D5 },
+	{ 0x27DD, 0x27DE },
+	{ 0x27DE, 0x27DD },
+	{ 0x27E2, 0x27E3 },
+	{ 0x27E3, 0x27E2 },
+	{ 0x27E4, 0x27E5 },
+	{ 0x27E5, 0x27E4 },
+	{ 0x27E6, 0x27E7 },
+	{ 0x27E7, 0x27E6 },
+	{ 0x27E8, 0x27E9 },
+	{ 0x27E9, 0x27E8 },
+	{ 0x27EA, 0x27EB },
+	{ 0x27EB, 0x27EA },
+	{ 0x27EC, 0x27ED },
+	{ 0x27ED, 0x27EC },
+	{ 0x27EE, 0x27EF },
+	{ 0x27EF, 0x27EE },
+	{ 0x2983, 0x2984 },
+	{ 0x2984, 0x2983 },
+	{ 0x2985, 0x2986 },
+	{ 0x2986, 0x2985 },
+	{ 0x2987, 0x2988 },
+	{ 0x2988, 0x2987 },
+	{ 0x2989, 0x298A },
+	{ 0x298A, 0x2989 },
+	{ 0x298B, 0x298C },
+	{ 0x298C, 0x298B },
+	{ 0x298D, 0x2990 },
+	{ 0x298E, 0x298F },
+	{ 0x298F, 0x298E },
+	{ 0x2990, 0x298D },
+	{ 0x2991, 0x2992 },
+	{ 0x2992, 0x2991 },
+	{ 0x2993, 0x2994 },
+	{ 0x2994, 0x2993 },
+	{ 0x2995, 0x2996 },
+	{ 0x2996, 0x2995 },
+	{ 0x2997, 0x2998 },
+	{ 0x2998, 0x2997 },
+	{ 0x29B8, 0x2298 },
+	{ 0x29C0, 0x29C1 },
+	{ 0x29C1, 0x29C0 },
+	{ 0x29C4, 0x29C5 },
+	{ 0x29C5, 0x29C4 },
+	{ 0x29CF, 0x29D0 },
+	{ 0x29D0, 0x29CF },
+	{ 0x29D1, 0x29D2 },
+	{ 0x29D2, 0x29D1 },
+	{ 0x29D4, 0x29D5 },
+	{ 0x29D5, 0x29D4 },
+	{ 0x29D8, 0x29D9 },
+	{ 0x29D9, 0x29D8 },
+	{ 0x29DA, 0x29DB },
+	{ 0x29DB, 0x29DA },
+	{ 0x29F5, 0x2215 },
+	{ 0x29F8, 0x29F9 },
+	{ 0x29F9, 0x29F8 },
+	{ 0x29FC, 0x29FD },
+	{ 0x29FD, 0x29FC },
+	{ 0x2A2B, 0x2A2C },
+	{ 0x2A2C, 0x2A2B },
+	{ 0x2A2D, 0x2A2E },
+	{ 0x2A2E, 0x2A2D },
+	{ 0x2A34, 0x2A35 },
+	{ 0x2A35, 0x2A34 },
+	{ 0x2A3C, 0x2A3D },
+	{ 0x2A3D, 0x2A3C },
+	{ 0x2A64, 0x2A65 },
+	{ 0x2A65, 0x2A64 },
+	{ 0x2A79, 0x2A7A },
+	{ 0x2A7A, 0x2A79 },
+	{ 0x2A7D, 0x2A7E },
+	{ 0x2A7E, 0x2A7D },
+	{ 0x2A7F, 0x2A80 },
+	{ 0x2A80, 0x2A7F },
+	{ 0x2A81, 0x2A82 },
+	{ 0x2A82, 0x2A81 },
+	{ 0x2A83, 0x2A84 },
+	{ 0x2A84, 0x2A83 },
+	{ 0x2A8B, 0x2A8C },
+	{ 0x2A8C, 0x2A8B },
+	{ 0x2A91, 0x2A92 },
+	{ 0x2A92, 0x2A91 },
+	{ 0x2A93, 0x2A94 },
+	{ 0x2A94, 0x2A93 },
+	{ 0x2A95, 0x2A96 },
+	{ 0x2A96, 0x2A95 },
+	{ 0x2A97, 0x2A98 },
+	{ 0x2A98, 0x2A97 },
+	{ 0x2A99, 0x2A9A },
+	{ 0x2A9A, 0x2A99 },
+	{ 0x2A9B, 0x2A9C },
+	{ 0x2A9C, 0x2A9B },
+	{ 0x2AA1, 0x2AA2 },
+	{ 0x2AA2, 0x2AA1 },
+	{ 0x2AA6, 0x2AA7 },
+	{ 0x2AA7, 0x2AA6 },
+	{ 0x2AA8, 0x2AA9 },
+	{ 0x2AA9, 0x2AA8 },
+	{ 0x2AAA, 0x2AAB },
+	{ 0x2AAB, 0x2AAA },
+	{ 0x2AAC, 0x2AAD },
+	{ 0x2AAD, 0x2AAC },
+	{ 0x2AAF, 0x2AB0 },
+	{ 0x2AB0, 0x2AAF },
+	{ 0x2AB3, 0x2AB4 },
+	{ 0x2AB4, 0x2AB3 },
+	{ 0x2ABB, 0x2ABC },
+	{ 0x2ABC, 0x2ABB },
+	{ 0x2ABD, 0x2ABE },
+	{ 0x2ABE, 0x2ABD },
+	{ 0x2ABF, 0x2AC0 },
+	{ 0x2AC0, 0x2ABF },
+	{ 0x2AC1, 0x2AC2 },
+	{ 0x2AC2, 0x2AC1 },
+	{ 0x2AC3, 0x2AC4 },
+	{ 0x2AC4, 0x2AC3 },
+	{ 0x2AC5, 0x2AC6 },
+	{ 0x2AC6, 0x2AC5 },
+	{ 0x2ACD, 0x2ACE },
+	{ 0x2ACE, 0x2ACD },
+	{ 0x2ACF, 0x2AD0 },
+	{ 0x2AD0, 0x2ACF },
+	{ 0x2AD1, 0x2AD2 },
+	{ 0x2AD2, 0x2AD1 },
+	{ 0x2AD3, 0x2AD4 },
+	{ 0x2AD4, 0x2AD3 },
+	{ 0x2AD5, 0x2AD6 },
+	{ 0x2AD6, 0x2AD5 },
+	{ 0x2ADE, 0x22A6 },
+	{ 0x2AE3, 0x22A9 },
+	{ 0x2AE4, 0x22A8 },
+	{ 0x2AE5, 0x22AB },
+	{ 0x2AEC, 0x2AED },
+	{ 0x2AED, 0x2AEC },
+	{ 0x2AF7, 0x2AF8 },
+	{ 0x2AF8, 0x2AF7 },
+	{ 0x2AF9, 0x2AFA },
+	{ 0x2AFA, 0x2AF9 },
+	{ 0x2E02, 0x2E03 },
+	{ 0x2E03, 0x2E02 },
+	{ 0x2E04, 0x2E05 },
+	{ 0x2E05, 0x2E04 },
+	{ 0x2E09, 0x2E0A },
+	{ 0x2E0A, 0x2E09 },
+	{ 0x2E0C, 0x2E0D },
+	{ 0x2E0D, 0x2E0C },
+	{ 0x2E1C, 0x2E1D },
+	{ 0x2E1D, 0x2E1C },
+	{ 0x2E20, 0x2E21 },
+	{ 0x2E21, 0x2E20 },
+	{ 0x2E22, 0x2E23 },
+	{ 0x2E23, 0x2E22 },
+	{ 0x2E24, 0x2E25 },
+	{ 0x2E25, 0x2E24 },
+	{ 0x2E26, 0x2E27 },
+	{ 0x2E27, 0x2E26 },
+	{ 0x2E28, 0x2E29 },
+	{ 0x2E29, 0x2E28 },
+	{ 0x3008, 0x3009 },
+	{ 0x3009, 0x3008 },
+	{ 0x300A, 0x300B },
+	{ 0x300B, 0x300A },
+	{ 0x300C, 0x300D },
+	{ 0x300D, 0x300C },
+	{ 0x300E, 0x300F },
+	{ 0x300F, 0x300E },
+	{ 0x3010, 0x3011 },
+	{ 0x3011, 0x3010 },
+	{ 0x3014, 0x3015 },
+	{ 0x3015, 0x3014 },
+	{ 0x3016, 0x3017 },
+	{ 0x3017, 0x3016 },
+	{ 0x3018, 0x3019 },
+	{ 0x3019, 0x3018 },
+	{ 0x301A, 0x301B },
+	{ 0x301B, 0x301A },
+	{ 0xFE59, 0xFE5A },
+	{ 0xFE5A, 0xFE59 },
+	{ 0xFE5B, 0xFE5C },
+	{ 0xFE5C, 0xFE5B },
+	{ 0xFE5D, 0xFE5E },
+	{ 0xFE5E, 0xFE5D },
+	{ 0xFE64, 0xFE65 },
+	{ 0xFE65, 0xFE64 },
+	{ 0xFF08, 0xFF09 },
+	{ 0xFF09, 0xFF08 },
+	{ 0xFF1C, 0xFF1E },
+	{ 0xFF1E, 0xFF1C },
+	{ 0xFF3B, 0xFF3D },
+	{ 0xFF3D, 0xFF3B },
+	{ 0xFF5B, 0xFF5D },
+	{ 0xFF5D, 0xFF5B },
+	{ 0xFF5F, 0xFF60 },
+	{ 0xFF60, 0xFF5F },
+	{ 0xFF62, 0xFF63 },
+	{ 0xFF63, 0xFF62 } };
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/biditype.h	Sun Jun 13 20:40:25 2010 +0300
@@ -0,0 +1,446 @@
+  struct {
+    int from, to;
+    bidi_type_t type;
+  } bidi_type[] = {
+	{ 0x0000, 0x0008, WEAK_BN },
+	{ 0x0009, 0x0009, NEUTRAL_S },
+	{ 0x000A, 0x000A, NEUTRAL_B },
+	{ 0x000B, 0x000B, NEUTRAL_S },
+	{ 0x000C, 0x000C, NEUTRAL_WS },
+	{ 0x000D, 0x000D, NEUTRAL_B },
+	{ 0x000E, 0x001B, WEAK_BN },
+	{ 0x001C, 0x001E, NEUTRAL_B },
+	{ 0x001F, 0x001F, NEUTRAL_S },
+	{ 0x0020, 0x0020, NEUTRAL_WS },
+	{ 0x0021, 0x0022, NEUTRAL_ON },
+	{ 0x0023, 0x0025, WEAK_ET },
+	{ 0x0026, 0x002A, NEUTRAL_ON },
+	{ 0x002B, 0x002B, WEAK_ES },
+	{ 0x002C, 0x002C, WEAK_CS },
+	{ 0x002D, 0x002D, WEAK_ES },
+	{ 0x002E, 0x002F, WEAK_CS },
+	{ 0x0030, 0x0039, WEAK_EN },
+	{ 0x003A, 0x003A, WEAK_CS },
+	{ 0x003B, 0x0040, NEUTRAL_ON },
+	{ 0x005B, 0x0060, NEUTRAL_ON },
+	{ 0x007B, 0x007E, NEUTRAL_ON },
+	{ 0x007F, 0x0084, WEAK_BN },
+	{ 0x0085, 0x0085, NEUTRAL_B },
+	{ 0x0086, 0x009F, WEAK_BN },
+	{ 0x00A0, 0x00A0, WEAK_CS },
+	{ 0x00A1, 0x00A1, NEUTRAL_ON },
+	{ 0x00A2, 0x00A5, WEAK_ET },
+	{ 0x00A6, 0x00A9, NEUTRAL_ON },
+	{ 0x00AB, 0x00AC, NEUTRAL_ON },
+	{ 0x00AD, 0x00AD, WEAK_BN },
+	{ 0x00AE, 0x00AF, NEUTRAL_ON },
+	{ 0x00B0, 0x00B1, WEAK_ET },
+	{ 0x00B2, 0x00B3, WEAK_EN },
+	{ 0x00B4, 0x00B4, NEUTRAL_ON },
+	{ 0x00B6, 0x00B8, NEUTRAL_ON },
+	{ 0x00B9, 0x00B9, WEAK_EN },
+	{ 0x00BB, 0x00BF, NEUTRAL_ON },
+	{ 0x00D7, 0x00D7, NEUTRAL_ON },
+	{ 0x00F7, 0x00F7, NEUTRAL_ON },
+	{ 0x02B9, 0x02BA, NEUTRAL_ON },
+	{ 0x02C2, 0x02CF, NEUTRAL_ON },
+	{ 0x02D2, 0x02DF, NEUTRAL_ON },
+	{ 0x02E5, 0x02ED, NEUTRAL_ON },
+	{ 0x02EF, 0x02FF, NEUTRAL_ON },
+	{ 0x0300, 0x036F, WEAK_NSM },
+	{ 0x0374, 0x0375, NEUTRAL_ON },
+	{ 0x037E, 0x0385, NEUTRAL_ON },
+	{ 0x0387, 0x0387, NEUTRAL_ON },
+	{ 0x03F6, 0x03F6, NEUTRAL_ON },
+	{ 0x0483, 0x0489, WEAK_NSM },
+	{ 0x058A, 0x058A, NEUTRAL_ON },
+	{ 0x0591, 0x05BD, WEAK_NSM },
+	{ 0x05BE, 0x05BE, STRONG_R },
+	{ 0x05BF, 0x05BF, WEAK_NSM },
+	{ 0x05C0, 0x05C0, STRONG_R },
+	{ 0x05C1, 0x05C2, WEAK_NSM },
+	{ 0x05C3, 0x05C3, STRONG_R },
+	{ 0x05C4, 0x05C5, WEAK_NSM },
+	{ 0x05C6, 0x05C6, STRONG_R },
+	{ 0x05C7, 0x05C7, WEAK_NSM },
+	{ 0x05D0, 0x05F4, STRONG_R },
+	{ 0x0600, 0x0603, WEAK_AN },
+	{ 0x0606, 0x0607, NEUTRAL_ON },
+	{ 0x0608, 0x0608, STRONG_AL },
+	{ 0x0609, 0x060A, WEAK_ET },
+	{ 0x060B, 0x060B, STRONG_AL },
+	{ 0x060C, 0x060C, WEAK_CS },
+	{ 0x060D, 0x060D, STRONG_AL },
+	{ 0x060E, 0x060F, NEUTRAL_ON },
+	{ 0x0610, 0x061A, WEAK_NSM },
+	{ 0x061B, 0x064A, STRONG_AL },
+	{ 0x064B, 0x065F, WEAK_NSM },
+	{ 0x0660, 0x0669, WEAK_AN },
+	{ 0x066A, 0x066A, WEAK_ET },
+	{ 0x066B, 0x066C, WEAK_AN },
+	{ 0x066D, 0x066F, STRONG_AL },
+	{ 0x0670, 0x0670, WEAK_NSM },
+	{ 0x0671, 0x06D5, STRONG_AL },
+	{ 0x06D6, 0x06DC, WEAK_NSM },
+	{ 0x06DD, 0x06DD, WEAK_AN },
+	{ 0x06DE, 0x06E4, WEAK_NSM },
+	{ 0x06E5, 0x06E6, STRONG_AL },
+	{ 0x06E7, 0x06E8, WEAK_NSM },
+	{ 0x06E9, 0x06E9, NEUTRAL_ON },
+	{ 0x06EA, 0x06ED, WEAK_NSM },
+	{ 0x06EE, 0x06EF, STRONG_AL },
+	{ 0x06F0, 0x06F9, WEAK_EN },
+	{ 0x06FA, 0x070D, STRONG_AL },
+	{ 0x070F, 0x070F, WEAK_AN },
+	{ 0x0710, 0x0710, STRONG_AL },
+	{ 0x0711, 0x0711, WEAK_NSM },
+	{ 0x0712, 0x072F, STRONG_AL },
+	{ 0x0730, 0x074A, WEAK_NSM },
+	{ 0x074D, 0x07A5, STRONG_AL },
+	{ 0x07A6, 0x07B0, WEAK_NSM },
+	{ 0x07B1, 0x07B1, STRONG_AL },
+	{ 0x07C0, 0x07EA, STRONG_R },
+	{ 0x07EB, 0x07F3, WEAK_NSM },
+	{ 0x07F4, 0x07F5, STRONG_R },
+	{ 0x07F6, 0x07F9, NEUTRAL_ON },
+	{ 0x07FA, 0x0815, STRONG_R },
+	{ 0x0816, 0x0819, WEAK_NSM },
+	{ 0x081A, 0x081A, STRONG_R },
+	{ 0x081B, 0x0823, WEAK_NSM },
+	{ 0x0824, 0x0824, STRONG_R },
+	{ 0x0825, 0x0827, WEAK_NSM },
+	{ 0x0828, 0x0828, STRONG_R },
+	{ 0x0829, 0x082D, WEAK_NSM },
+	{ 0x0830, 0x0858, STRONG_R },
+	{ 0x0859, 0x085B, WEAK_NSM },
+	{ 0x085E, 0x085E, STRONG_R },
+	{ 0x0900, 0x0902, WEAK_NSM },
+	{ 0x093A, 0x093A, WEAK_NSM },
+	{ 0x093C, 0x093C, WEAK_NSM },
+	{ 0x0941, 0x0948, WEAK_NSM },
+	{ 0x094D, 0x094D, WEAK_NSM },
+	{ 0x0951, 0x0957, WEAK_NSM },
+	{ 0x0962, 0x0963, WEAK_NSM },
+	{ 0x0981, 0x0981, WEAK_NSM },
+	{ 0x09BC, 0x09BC, WEAK_NSM },
+	{ 0x09C1, 0x09C4, WEAK_NSM },
+	{ 0x09CD, 0x09CD, WEAK_NSM },
+	{ 0x09E2, 0x09E3, WEAK_NSM },
+	{ 0x09F2, 0x09F3, WEAK_ET },
+	{ 0x09FB, 0x09FB, WEAK_ET },
+	{ 0x0A01, 0x0A02, WEAK_NSM },
+	{ 0x0A3C, 0x0A3C, WEAK_NSM },
+	{ 0x0A41, 0x0A51, WEAK_NSM },
+	{ 0x0A70, 0x0A71, WEAK_NSM },
+	{ 0x0A75, 0x0A82, WEAK_NSM },
+	{ 0x0ABC, 0x0ABC, WEAK_NSM },
+	{ 0x0AC1, 0x0AC8, WEAK_NSM },
+	{ 0x0ACD, 0x0ACD, WEAK_NSM },
+	{ 0x0AE2, 0x0AE3, WEAK_NSM },
+	{ 0x0AF1, 0x0AF1, WEAK_ET },
+	{ 0x0B01, 0x0B01, WEAK_NSM },
+	{ 0x0B3C, 0x0B3C, WEAK_NSM },
+	{ 0x0B3F, 0x0B3F, WEAK_NSM },
+	{ 0x0B41, 0x0B44, WEAK_NSM },
+	{ 0x0B4D, 0x0B56, WEAK_NSM },
+	{ 0x0B62, 0x0B63, WEAK_NSM },
+	{ 0x0B82, 0x0B82, WEAK_NSM },
+	{ 0x0BC0, 0x0BC0, WEAK_NSM },
+	{ 0x0BCD, 0x0BCD, WEAK_NSM },
+	{ 0x0BF3, 0x0BF8, NEUTRAL_ON },
+	{ 0x0BF9, 0x0BF9, WEAK_ET },
+	{ 0x0BFA, 0x0BFA, NEUTRAL_ON },
+	{ 0x0C3E, 0x0C40, WEAK_NSM },
+	{ 0x0C46, 0x0C56, WEAK_NSM },
+	{ 0x0C62, 0x0C63, WEAK_NSM },
+	{ 0x0C78, 0x0C7E, NEUTRAL_ON },
+	{ 0x0CBC, 0x0CBC, WEAK_NSM },
+	{ 0x0CCC, 0x0CCD, WEAK_NSM },
+	{ 0x0CE2, 0x0CE3, WEAK_NSM },
+	{ 0x0D41, 0x0D44, WEAK_NSM },
+	{ 0x0D4D, 0x0D4D, WEAK_NSM },
+	{ 0x0D62, 0x0D63, WEAK_NSM },
+	{ 0x0DCA, 0x0DCA, WEAK_NSM },
+	{ 0x0DD2, 0x0DD6, WEAK_NSM },
+	{ 0x0E31, 0x0E31, WEAK_NSM },
+	{ 0x0E34, 0x0E3A, WEAK_NSM },
+	{ 0x0E3F, 0x0E3F, WEAK_ET },
+	{ 0x0E47, 0x0E4E, WEAK_NSM },
+	{ 0x0EB1, 0x0EB1, WEAK_NSM },
+	{ 0x0EB4, 0x0EBC, WEAK_NSM },
+	{ 0x0EC8, 0x0ECD, WEAK_NSM },
+	{ 0x0F18, 0x0F19, WEAK_NSM },
+	{ 0x0F35, 0x0F35, WEAK_NSM },
+	{ 0x0F37, 0x0F37, WEAK_NSM },
+	{ 0x0F39, 0x0F39, WEAK_NSM },
+	{ 0x0F3A, 0x0F3D, NEUTRAL_ON },
+	{ 0x0F71, 0x0F7E, WEAK_NSM },
+	{ 0x0F80, 0x0F84, WEAK_NSM },
+	{ 0x0F86, 0x0F87, WEAK_NSM },
+	{ 0x0F8D, 0x0FBC, WEAK_NSM },
+	{ 0x0FC6, 0x0FC6, WEAK_NSM },
+	{ 0x102D, 0x1030, WEAK_NSM },
+	{ 0x1032, 0x1037, WEAK_NSM },
+	{ 0x1039, 0x103A, WEAK_NSM },
+	{ 0x103D, 0x103E, WEAK_NSM },
+	{ 0x1058, 0x1059, WEAK_NSM },
+	{ 0x105E, 0x1060, WEAK_NSM },
+	{ 0x1071, 0x1074, WEAK_NSM },
+	{ 0x1082, 0x1082, WEAK_NSM },
+	{ 0x1085, 0x1086, WEAK_NSM },
+	{ 0x108D, 0x108D, WEAK_NSM },
+	{ 0x109D, 0x109D, WEAK_NSM },
+	{ 0x135D, 0x135F, WEAK_NSM },
+	{ 0x1390, 0x1399, NEUTRAL_ON },
+	{ 0x1400, 0x1400, NEUTRAL_ON },
+	{ 0x1680, 0x1680, NEUTRAL_WS },
+	{ 0x169B, 0x169C, NEUTRAL_ON },
+	{ 0x1712, 0x1714, WEAK_NSM },
+	{ 0x1732, 0x1734, WEAK_NSM },
+	{ 0x1752, 0x1753, WEAK_NSM },
+	{ 0x1772, 0x1773, WEAK_NSM },
+	{ 0x17B7, 0x17BD, WEAK_NSM },
+	{ 0x17C6, 0x17C6, WEAK_NSM },
+	{ 0x17C9, 0x17D3, WEAK_NSM },
+	{ 0x17DB, 0x17DB, WEAK_ET },
+	{ 0x17DD, 0x17DD, WEAK_NSM },
+	{ 0x17F0, 0x180A, NEUTRAL_ON },
+	{ 0x180B, 0x180D, WEAK_NSM },
+	{ 0x180E, 0x180E, NEUTRAL_WS },
+	{ 0x18A9, 0x18A9, WEAK_NSM },
+	{ 0x1920, 0x1922, WEAK_NSM },
+	{ 0x1927, 0x1928, WEAK_NSM },
+	{ 0x1932, 0x1932, WEAK_NSM },
+	{ 0x1939, 0x193B, WEAK_NSM },
+	{ 0x1940, 0x1945, NEUTRAL_ON },
+	{ 0x19DE, 0x19FF, NEUTRAL_ON },
+	{ 0x1A17, 0x1A18, WEAK_NSM },
+	{ 0x1A56, 0x1A56, WEAK_NSM },
+	{ 0x1A58, 0x1A60, WEAK_NSM },
+	{ 0x1A62, 0x1A62, WEAK_NSM },
+	{ 0x1A65, 0x1A6C, WEAK_NSM },
+	{ 0x1A73, 0x1A7F, WEAK_NSM },
+	{ 0x1B00, 0x1B03, WEAK_NSM },
+	{ 0x1B34, 0x1B34, WEAK_NSM },
+	{ 0x1B36, 0x1B3A, WEAK_NSM },
+	{ 0x1B3C, 0x1B3C, WEAK_NSM },
+	{ 0x1B42, 0x1B42, WEAK_NSM },
+	{ 0x1B6B, 0x1B73, WEAK_NSM },
+	{ 0x1B80, 0x1B81, WEAK_NSM },
+	{ 0x1BA2, 0x1BA5, WEAK_NSM },
+	{ 0x1BA8, 0x1BA9, WEAK_NSM },
+	{ 0x1BE6, 0x1BE6, WEAK_NSM },
+	{ 0x1BE8, 0x1BE9, WEAK_NSM },
+	{ 0x1BED, 0x1BED, WEAK_NSM },
+	{ 0x1BEF, 0x1BF1, WEAK_NSM },
+	{ 0x1C2C, 0x1C33, WEAK_NSM },
+	{ 0x1C36, 0x1C37, WEAK_NSM },
+	{ 0x1CD0, 0x1CD2, WEAK_NSM },
+	{ 0x1CD4, 0x1CE0, WEAK_NSM },
+	{ 0x1CE2, 0x1CE8, WEAK_NSM },
+	{ 0x1CED, 0x1CED, WEAK_NSM },
+	{ 0x1DC0, 0x1DFF, WEAK_NSM },
+	{ 0x1FBD, 0x1FBD, NEUTRAL_ON },
+	{ 0x1FBF, 0x1FC1, NEUTRAL_ON },
+	{ 0x1FCD, 0x1FCF, NEUTRAL_ON },
+	{ 0x1FDD, 0x1FDF, NEUTRAL_ON },
+	{ 0x1FED, 0x1FEF, NEUTRAL_ON },
+	{ 0x1FFD, 0x1FFE, NEUTRAL_ON },
+	{ 0x2000, 0x200A, NEUTRAL_WS },
+	{ 0x200B, 0x200D, WEAK_BN },
+	{ 0x200F, 0x200F, STRONG_R },
+	{ 0x2010, 0x2027, NEUTRAL_ON },
+	{ 0x2028, 0x2028, NEUTRAL_WS },
+	{ 0x2029, 0x2029, NEUTRAL_B },
+	{ 0x202A, 0x202A, LRE },
+	{ 0x202B, 0x202B, RLE },
+	{ 0x202C, 0x202C, PDF },
+	{ 0x202D, 0x202D, LRO },
+	{ 0x202E, 0x202E, RLO },
+	{ 0x202F, 0x202F, WEAK_CS },
+	{ 0x2030, 0x2034, WEAK_ET },
+	{ 0x2035, 0x2043, NEUTRAL_ON },
+	{ 0x2044, 0x2044, WEAK_CS },
+	{ 0x2045, 0x205E, NEUTRAL_ON },
+	{ 0x205F, 0x205F, NEUTRAL_WS },
+	{ 0x2060, 0x206F, WEAK_BN },
+	{ 0x2070, 0x2070, WEAK_EN },
+	{ 0x2074, 0x2079, WEAK_EN },
+	{ 0x207A, 0x207B, WEAK_ES },
+	{ 0x207C, 0x207E, NEUTRAL_ON },
+	{ 0x2080, 0x2089, WEAK_EN },
+	{ 0x208A, 0x208B, WEAK_ES },
+	{ 0x208C, 0x208E, NEUTRAL_ON },
+	{ 0x20A0, 0x20B8, WEAK_ET },
+	{ 0x20D0, 0x20F0, WEAK_NSM },
+	{ 0x2100, 0x2101, NEUTRAL_ON },
+	{ 0x2103, 0x2106, NEUTRAL_ON },
+	{ 0x2108, 0x2109, NEUTRAL_ON },
+	{ 0x2114, 0x2114, NEUTRAL_ON },
+	{ 0x2116, 0x2118, NEUTRAL_ON },
+	{ 0x211E, 0x2123, NEUTRAL_ON },
+	{ 0x2125, 0x2125, NEUTRAL_ON },
+	{ 0x2127, 0x2127, NEUTRAL_ON },
+	{ 0x2129, 0x2129, NEUTRAL_ON },
+	{ 0x212E, 0x212E, WEAK_ET },
+	{ 0x213A, 0x213B, NEUTRAL_ON },
+	{ 0x2140, 0x2144, NEUTRAL_ON },
+	{ 0x214A, 0x214D, NEUTRAL_ON },
+	{ 0x2150, 0x215F, NEUTRAL_ON },
+	{ 0x2189, 0x2211, NEUTRAL_ON },
+	{ 0x2212, 0x2212, WEAK_ES },
+	{ 0x2213, 0x2213, WEAK_ET },
+	{ 0x2214, 0x2335, NEUTRAL_ON },
+	{ 0x237B, 0x2394, NEUTRAL_ON },
+	{ 0x2396, 0x2487, NEUTRAL_ON },
+	{ 0x2488, 0x249B, WEAK_EN },
+	{ 0x24EA, 0x26AB, NEUTRAL_ON },
+	{ 0x26AD, 0x27FF, NEUTRAL_ON },
+	{ 0x2900, 0x2B59, NEUTRAL_ON },
+	{ 0x2CE5, 0x2CEA, NEUTRAL_ON },
+	{ 0x2CEF, 0x2CF1, WEAK_NSM },
+	{ 0x2CF9, 0x2CFF, NEUTRAL_ON },
+	{ 0x2D7F, 0x2D7F, WEAK_NSM },
+	{ 0x2DE0, 0x2DFF, WEAK_NSM },
+	{ 0x2E00, 0x2FFB, NEUTRAL_ON },
+	{ 0x3000, 0x3000, NEUTRAL_WS },
+	{ 0x3001, 0x3004, NEUTRAL_ON },
+	{ 0x3008, 0x3020, NEUTRAL_ON },
+	{ 0x302A, 0x302F, WEAK_NSM },
+	{ 0x3030, 0x3030, NEUTRAL_ON },
+	{ 0x3036, 0x3037, NEUTRAL_ON },
+	{ 0x303D, 0x303F, NEUTRAL_ON },
+	{ 0x3099, 0x309A, WEAK_NSM },
+	{ 0x309B, 0x309C, NEUTRAL_ON },
+	{ 0x30A0, 0x30A0, NEUTRAL_ON },
+	{ 0x30FB, 0x30FB, NEUTRAL_ON },
+	{ 0x31C0, 0x31E3, NEUTRAL_ON },
+	{ 0x321D, 0x321E, NEUTRAL_ON },
+	{ 0x3250, 0x325F, NEUTRAL_ON },
+	{ 0x327C, 0x327E, NEUTRAL_ON },
+	{ 0x32B1, 0x32BF, NEUTRAL_ON },
+	{ 0x32CC, 0x32CF, NEUTRAL_ON },
+	{ 0x3377, 0x337A, NEUTRAL_ON },
+	{ 0x33DE, 0x33DF, NEUTRAL_ON },
+	{ 0x33FF, 0x33FF, NEUTRAL_ON },
+	{ 0x4DC0, 0x4DFF, NEUTRAL_ON },
+	{ 0xA490, 0xA4C6, NEUTRAL_ON },
+	{ 0xA60D, 0xA60F, NEUTRAL_ON },
+	{ 0xA66F, 0xA672, WEAK_NSM },
+	{ 0xA673, 0xA673, NEUTRAL_ON },
+	{ 0xA67C, 0xA67D, WEAK_NSM },
+	{ 0xA67E, 0xA67F, NEUTRAL_ON },
+	{ 0xA6F0, 0xA6F1, WEAK_NSM },
+	{ 0xA700, 0xA721, NEUTRAL_ON },
+	{ 0xA788, 0xA788, NEUTRAL_ON },
+	{ 0xA802, 0xA802, WEAK_NSM },
+	{ 0xA806, 0xA806, WEAK_NSM },
+	{ 0xA80B, 0xA80B, WEAK_NSM },
+	{ 0xA825, 0xA826, WEAK_NSM },
+	{ 0xA828, 0xA82B, NEUTRAL_ON },
+	{ 0xA838, 0xA839, WEAK_ET },
+	{ 0xA874, 0xA877, NEUTRAL_ON },
+	{ 0xA8C4, 0xA8C4, WEAK_NSM },
+	{ 0xA8E0, 0xA8F1, WEAK_NSM },
+	{ 0xA926, 0xA92D, WEAK_NSM },
+	{ 0xA947, 0xA951, WEAK_NSM },
+	{ 0xA980, 0xA982, WEAK_NSM },
+	{ 0xA9B3, 0xA9B3, WEAK_NSM },
+	{ 0xA9B6, 0xA9B9, WEAK_NSM },
+	{ 0xA9BC, 0xA9BC, WEAK_NSM },
+	{ 0xAA29, 0xAA2E, WEAK_NSM },
+	{ 0xAA31, 0xAA32, WEAK_NSM },
+	{ 0xAA35, 0xAA36, WEAK_NSM },
+	{ 0xAA43, 0xAA43, WEAK_NSM },
+	{ 0xAA4C, 0xAA4C, WEAK_NSM },
+	{ 0xAAB0, 0xAAB0, WEAK_NSM },
+	{ 0xAAB2, 0xAAB4, WEAK_NSM },
+	{ 0xAAB7, 0xAAB8, WEAK_NSM },
+	{ 0xAABE, 0xAABF, WEAK_NSM },
+	{ 0xAAC1, 0xAAC1, WEAK_NSM },
+	{ 0xABE5, 0xABE5, WEAK_NSM },
+	{ 0xABE8, 0xABE8, WEAK_NSM },
+	{ 0xABED, 0xABED, WEAK_NSM },
+	{ 0xFB1D, 0xFB1D, STRONG_R },
+	{ 0xFB1E, 0xFB1E, WEAK_NSM },
+	{ 0xFB1F, 0xFB28, STRONG_R },
+	{ 0xFB29, 0xFB29, WEAK_ES },
+	{ 0xFB2A, 0xFB4F, STRONG_R },
+	{ 0xFB50, 0xFD3D, STRONG_AL },
+	{ 0xFD3E, 0xFD3F, NEUTRAL_ON },
+	{ 0xFD50, 0xFDFC, STRONG_AL },
+	{ 0xFDFD, 0xFDFD, NEUTRAL_ON },
+	{ 0xFE00, 0xFE0F, WEAK_NSM },
+	{ 0xFE10, 0xFE19, NEUTRAL_ON },
+	{ 0xFE20, 0xFE26, WEAK_NSM },
+	{ 0xFE30, 0xFE4F, NEUTRAL_ON },
+	{ 0xFE50, 0xFE50, WEAK_CS },
+	{ 0xFE51, 0xFE51, NEUTRAL_ON },
+	{ 0xFE52, 0xFE52, WEAK_CS },
+	{ 0xFE54, 0xFE54, NEUTRAL_ON },
+	{ 0xFE55, 0xFE55, WEAK_CS },
+	{ 0xFE56, 0xFE5E, NEUTRAL_ON },
+	{ 0xFE5F, 0xFE5F, WEAK_ET },
+	{ 0xFE60, 0xFE61, NEUTRAL_ON },
+	{ 0xFE62, 0xFE63, WEAK_ES },
+	{ 0xFE64, 0xFE68, NEUTRAL_ON },
+	{ 0xFE69, 0xFE6A, WEAK_ET },
+	{ 0xFE6B, 0xFE6B, NEUTRAL_ON },
+	{ 0xFE70, 0xFEFC, STRONG_AL },
+	{ 0xFEFF, 0xFEFF, WEAK_BN },
+	{ 0xFF01, 0xFF02, NEUTRAL_ON },
+	{ 0xFF03, 0xFF05, WEAK_ET },
+	{ 0xFF06, 0xFF0A, NEUTRAL_ON },
+	{ 0xFF0B, 0xFF0B, WEAK_ES },
+	{ 0xFF0C, 0xFF0C, WEAK_CS },
+	{ 0xFF0D, 0xFF0D, WEAK_ES },
+	{ 0xFF0E, 0xFF0F, WEAK_CS },
+	{ 0xFF10, 0xFF19, WEAK_EN },
+	{ 0xFF1A, 0xFF1A, WEAK_CS },
+	{ 0xFF1B, 0xFF20, NEUTRAL_ON },
+	{ 0xFF3B, 0xFF40, NEUTRAL_ON },
+	{ 0xFF5B, 0xFF65, NEUTRAL_ON },
+	{ 0xFFE0, 0xFFE1, WEAK_ET },
+	{ 0xFFE2, 0xFFE4, NEUTRAL_ON },
+	{ 0xFFE5, 0xFFE6, WEAK_ET },
+	{ 0xFFE8, 0xFFFD, NEUTRAL_ON },
+	{ 0x10101, 0x10101, NEUTRAL_ON },
+	{ 0x10140, 0x1019B, NEUTRAL_ON },
+	{ 0x101FD, 0x101FD, WEAK_NSM },
+	{ 0x10800, 0x1091B, STRONG_R },
+	{ 0x1091F, 0x1091F, NEUTRAL_ON },
+	{ 0x10920, 0x10A00, STRONG_R },
+	{ 0x10A01, 0x10A0F, WEAK_NSM },
+	{ 0x10A10, 0x10A33, STRONG_R },
+	{ 0x10A38, 0x10A3F, WEAK_NSM },
+	{ 0x10A40, 0x10B35, STRONG_R },
+	{ 0x10B39, 0x10B3F, NEUTRAL_ON },
+	{ 0x10B40, 0x10C48, STRONG_R },
+	{ 0x10E60, 0x10E7E, WEAK_AN },
+	{ 0x11001, 0x11001, WEAK_NSM },
+	{ 0x11038, 0x11046, WEAK_NSM },
+	{ 0x11052, 0x11065, NEUTRAL_ON },
+	{ 0x11080, 0x11081, WEAK_NSM },
+	{ 0x110B3, 0x110B6, WEAK_NSM },
+	{ 0x110B9, 0x110BA, WEAK_NSM },
+	{ 0x1D167, 0x1D169, WEAK_NSM },
+	{ 0x1D173, 0x1D17A, WEAK_BN },
+	{ 0x1D17B, 0x1D182, WEAK_NSM },
+	{ 0x1D185, 0x1D18B, WEAK_NSM },
+	{ 0x1D1AA, 0x1D1AD, WEAK_NSM },
+	{ 0x1D200, 0x1D241, NEUTRAL_ON },
+	{ 0x1D242, 0x1D244, WEAK_NSM },
+	{ 0x1D245, 0x1D356, NEUTRAL_ON },
+	{ 0x1D6DB, 0x1D6DB, NEUTRAL_ON },
+	{ 0x1D715, 0x1D715, NEUTRAL_ON },
+	{ 0x1D74F, 0x1D74F, NEUTRAL_ON },
+	{ 0x1D789, 0x1D789, NEUTRAL_ON },
+	{ 0x1D7C3, 0x1D7C3, NEUTRAL_ON },
+	{ 0x1D7CE, 0x1D7FF, WEAK_EN },
+	{ 0x1F000, 0x1F0DF, NEUTRAL_ON },
+	{ 0x1F100, 0x1F10A, WEAK_EN },
+	{ 0x1F300, 0x1F48B, NEUTRAL_ON },
+	{ 0x1F48D, 0x1F523, NEUTRAL_ON },
+	{ 0x1F525, 0x1F773, NEUTRAL_ON },
+	{ 0xE0001, 0xE007F, WEAK_BN },
+	{ 0xE0100, 0xE01EF, WEAK_NSM } };
--- a/src/deps.mk	Sat Jun 12 19:26:40 2010 +0200
+++ b/src/deps.mk	Sun Jun 13 20:40:25 2010 +0300
@@ -39,7 +39,8 @@
 
 atimer.o: atimer.c atimer.h syssignal.h systime.h lisp.h blockinput.h \
  $(config_h)
-bidi.o: bidi.c buffer.h character.h dispextern.h lisp.h $(config_h)
+bidi.o: bidi.c buffer.h character.h dispextern.h lisp.h \
+   biditype.h bidimirror.h $(config_h)
 buffer.o: buffer.c buffer.h region-cache.h commands.h window.h \
    $(INTERVALS_H) blockinput.h atimer.h systime.h character.h \
    indent.h keyboard.h coding.h keymap.h frame.h lisp.h $(config_h)
--- a/src/makefile.w32-in	Sat Jun 12 19:26:40 2010 +0200
+++ b/src/makefile.w32-in	Sun Jun 13 20:40:25 2010 +0300
@@ -344,6 +344,8 @@
 	$(SRC)/buffer.h \
 	$(SRC)/character.h \
 	$(SRC)/dispextern.h \
+	$(SRC)/biditype.h \
+	$(SRC)/bidimirror.h \
 	$(SRC)/w32gui.h
 
 $(BLD)/buffer.$(O) : \