diff options
author | behdad <behdad> | 2004-04-25 18:47:56 +0000 |
---|---|---|
committer | behdad <behdad> | 2004-04-25 18:47:56 +0000 |
commit | 63d12e574eb5cfe95290b303bac0950c25afe397 (patch) | |
tree | 2757438976050621d3b23a75d3405303594c2d54 | |
download | fribidi-63d12e574eb5cfe95290b303bac0950c25afe397.tar.gz |
Initial revision
91 files changed, 19125 insertions, 0 deletions
diff --git a/.cvsignore b/.cvsignore new file mode 100644 index 0000000..ce21673 --- /dev/null +++ b/.cvsignore @@ -0,0 +1,19 @@ +ChangeLog.bak +INSTALL +aclocal.m4 +autom4te.cache +fribidi.pc +fribidi.spec +config.guess +config.h +config.h.in +config.log +config.status +config.sub +configure +depcomp +install-sh +libtool +ltmain.sh +missing +stamp-h1 diff --git a/.indent.pro b/.indent.pro new file mode 100644 index 0000000..35a5cb6 --- /dev/null +++ b/.indent.pro @@ -0,0 +1,19 @@ +-gnu +-bfda +-bfde +-T TypeLink +-T LevelInfo +-T FriBidiChar +-T FriBidiStrIndex +-T FriBidiMaskType +-T FriBidiCharType +-T FriBidiPropCharType +-T FriBidiLevel +-T FriBidiCharSet +-T FriBidiCharSetHandler +-T FriBidiMemChunk +-T FriBidiEnv +-T fribidi_uint8 +-T fribidi_uint16 +-T fribidi_uint32 +-T fribidi_boolean @@ -0,0 +1 @@ +behdad: Behdad Esfahbod <behdad@gnu.org> @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + <one line to give the library's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + <signature of Ty Coon>, 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + @@ -0,0 +1,7 @@ + +The GIMP uses GNU Libtool in order to build shared libraries on a +variety of systems. While this is very nice for making usable +binaries, it can be a pain when trying to debug a program. For that +reason, compilation of shared libraries can be turned off by +specifying the `--disable-shared' option to `configure'. + @@ -0,0 +1,34 @@ +FriBidi was first developed by Dov Grobgeld of the Ivrix project, a few +releases happened there, up to 0.1.15. This was late 2000. + +Behdad Esfahbod of the FarsiWeb project started reading and hacking FriBidi +in the same days. As per request of Roozbeh Pournader from the FarsiWeb +project, FriBidi development was moved to SourceForge (http://www.sf.net/), +under the same name (http://fribidi.sf.net/). + +Behdad started applying patches in early 2001, and became the new +maintainer. He first aimed for full compliance of the standard, and then +applied the GNU Coding Standards. The effort was then released in the +Iranian New Year celebrations on 2001-03-29 as FriBidi 0.9.0. + +Since then, FriBidi has been quite stable. A few other releases were made, +to fix bugs, code cleanup, etc which all led to the release of FriBidi +0.10.4 on 2002-05-19. It turned out to be quite stable, and is shipped by +several distributions these days (~2003). + +Behdad promised a major redesign of the interface and the code to code, but +it almost never happened, at least not before Iranian New Years of March +2004. In the mean time, FriBidi was dubbed as a GNU package by Richard +Stallman. The first time was in 2002, and he mis-spelled it as "FreeBidi". +Next time in 2003 he addressed the correct name "FriBidi", but the +transition to gnu.org (http://www.gnu.org/) never happened, due to long +down-times of gnu.org due to several administrative problems. + +GNU FriBidi was finally moved to the FreeDesktop project +(http://www.freedesktop.org), which it lives a peaceful life these days +(http://www.freedesktop.org/Software/FriBidi). Major cleanup made to the +build system, and was reimported from scratch in the FreeDesktop CVS. The +old CVS repository is still available under the "fribidi-sf.net" module. + +You can find more details in the file ChangeLog.old in the GNU FriBidi CVS +repository. diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..2565fed --- /dev/null +++ b/Makefile.am @@ -0,0 +1,54 @@ +############################################################################## +## $Id: Makefile.am,v 1.1 2004-04-25 18:47:57 behdad Exp $ +## $Author: behdad $ +## $Date: 2004-04-25 18:47:57 $ +## $Revision: 1.1 $ +## $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/Makefile.am,v $ +############################################################################## +## -*- Automake -*- +## Process this file with automake to produce Makefile.in + +## The order of subdirs is important, don't change without a reason. +SUBDIRS = tablegen charset lib bin doc test + +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = @PACKAGE@.pc + +MAINTAINERCLEANFILES = \ + $(srcdir)/INSTALL \ + $(srcdir)/aclocal.m4 \ + $(srcdir)/autoscan.log \ + $(srcdir)/compile \ + $(srcdir)/config.guess \ + $(srcdir)/config.h.in \ + $(srcdir)/config.sub \ + $(srcdir)/configure \ + $(srcdir)/configure.scan \ + $(srcdir)/depcomp \ + $(srcdir)/install-sh \ + $(srcdir)/ltmain.sh \ + $(srcdir)/missing \ + `find "$(srcdir)" -type f -name Makefile.in -print` \ + `find "$(srcdir)" -type f -name "*~" -print` + +# Indent all C source and header files + +.PHONY: indent + +indent: $(srcdir)/.indent.pro + cd "$(srcdir)" && \ + find . -type f -mindepth 2 -name "*.[ch]" -print | \ + xargs ./missing --run indent + + +# Creating ChangeLog from CVS log, with cvs2cl: + +MAINTAINERCLEANFILES += ChangeLog ChangeLog.bak + +EXTRA_DIST = ChangeLog + +ChangeLog: + if test -d "$(srcdir)/CVS"; then \ + cd "$(srcdir)" && \ + ./missing --run cvs2cl --stdout --utc --FSF -U AUTHORS; \ + fi > $@ @@ -0,0 +1,18 @@ +Overview of changes between 0.10.4 and 0.19.0 +============================================= +* Unicode 4.0.1 data files used. +* Has been dubbed GNU FriBidi by Richard Stallman +* Restructured. + +Overview of changes between 0.10.2 and 0.10.4 +============================================= +* Unicode 3.2 data files used. + +Overview of changes between 0.10.1 and 0.10.2 +============================================= +* Rule L3 of UAX#9 implemented. Now fribidi implements the whole Unicode + BiDi Algorithm. +* The autogenerated table files now contain much fewer symbols, which reduces + the relocation time of the library. + +See ChangeLog for more descriptive list of changes. @@ -0,0 +1,152 @@ +This is GNU FriBidi +The Free Implementation of the Unicode Bidirectional Algorithm. + +Background +========== + +One of the missing links stopping the penetration of free software in Middle +East is the lack of support for the Arabic and Hebrew alphabets. In order to +have proper Arabic and Hebrew support, the BiDi algorithm should have been +implemented. It is our hope that this library will stimulate more free +software in the Middle Eastern countries. + +Audience +======== + +It is our hope that this library will stimulate the implementation of Hebrew +and Arabic in lots of free software. Here is a small list of projects that +would benefit from the use of the GNU FriBidi library, but of course there are +many more: Wine, Mozilla, Qt, KDE, lynx, OpenOffice. + +GNU FriBidi is already being used in projects like Pango (resulting in GTK+ +and GNOME using GNU FriBidi), AbiWord, MLTerm, MPlayer, and BiCon. + +Dependencies +============ + +Currently GNU FriBidi does not depend on any other library. It uses GNU Build +System for build and installation on POSIX systems. There are some files to +assist you creating a w32 DLL in the w32/ folder. + +Downloading +=========== + +The latest version of GNU FriBidi may be found at: + + http://www.freedesktop.org/Software/FriBidi + +Building +======== + +See INSTALL for a description of how to build and install this library. + +License +========= + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +This library 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 +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library, in a file named COPYING; if not, write to the +Free Software Foundation, Inc., 59 Temple Place, Suite 330, +Boston, MA 02111-1307 USA + +Implementation +============== + +The library implements the algorithm described in the "Unicode Standard +Annex #9, The Bidirectional Algorithm", available at +http://www.unicode.org/unicode/reports/tr9/. GNU Fribidi has been tested +exhaustively against the Unicode Reference Code, and to the best of our +knowledge, it completely conforms to the specification, always producing +the same result as the Reference Code. + +The library uses Unicode (UTF32) entirely. The character properties are +automatically extracted from the Unicode data files, available from: + + http://www.unicode.org/Public/UNIDATA/ + +This means that every Unicode character is treated in strict accordance +with the Unicode specification. + +There is a limited support for character set conversion from/to the UTF32 +encoding. Data in these character sets must be converted into UTF32 before +the library may be used. iconv(3) can always do a better job on that, so you +may find that the character sets conversion code is typically turned off on +POSIX machines. + +The reordering of characters is typically done through the function: + + fribidi_boolean + fribidi_log2vis(/* input */ + FriBidiChar *str, + FriBidiStrIndex len, + FriBidiCharType *pbase_dir, + /* output */ + FriBidiChar *visual_str, + FriBidiStrIndex *position_L_to_V_list, + FriBidiStrIndex *position_V_to_L_list, + FriBidiLevel *embedding_level_list + ) + + +where + str is the Unicode input string + len is the length of the unicode string + pbase_dir is the input and output base direction. If + base == FRIBIDI_TYPE_ON then fribidi_log2vis + calculates the base direction on its own + according to the BiDi algorithm. + visual_str The reordered output unicode string. + position_L_to_V_list Maps the positions in the logical string to + positions in the visual string. + position_V_to_L_list Maps the positions in the visual string to + the positions in the logical string. + embedding_level_list Returns the classification of each character. Even + levels indicate LTR characters, and odd levels + indicate RTL characters. The main use of this + list is in interactive applications when the + embedding e.g. level determines cursor display. + +In any of the output pointers == NULL, then that information is not +calculated. + +How it looks like +================= + +Have a look at tests directory, to see some input and outputs, which +CapRTL charset means that CAPITAL letters are right to left, and digits +6, 7, 8, 9 are Arabic digits, try 'fribidi --charsetdesc CapRTL' for the +full description. + +Executable +========== + +There is also a command-line utilitity called fribidi that loops over +the text of a file and performs the BiDi algorithm on each line, also +used for testing the algorithm. Run fribidi with the --help option to +learn about usage. The command-line utility is known to have problems +with line-breaking and ltov/vtol lists. + +Bugs and comments +================= + +Report GNU FriBidi bugs at: + + http://freedesktop.org/cgi-bin/bugzilla/enter_bug.cgi?product=FriBidi + +And send your comments to: + + fribidi-discuss@lists.sourceforge.net + + +Behdad Esfahbod +behdad@gnu.org +10 April 2004 @@ -0,0 +1,33 @@ +Thanks to: + + +Members of the Linux-il and Arabeyes communities + * For the feedbacks. + * For the constant pressure on keep the wheel rolling. + +Mark Davis + * For writing the Unicode Standard Annex #9. + + + +And for the previous versions of FriBidi (up to 2002), thanks to: + + +Dov Grobgeld <dov@imagic.weizmann.ac.il> + * Initial author, and maintainer before the 0.9 releases. + +Franck Portaneri + * For the Mozilla BiDi languges support document; + +Owen Tayler <otaylor@redhat.com> + * Contributed very important memory leak and speed patches. + +Pablo Saratxaga <pablo@mandrakesoft.com> + * Contributed several arabic charset converters. + +Omer Zak <omerz@actcom.co.il> + * Contributed several bug fixes, and several considerations for + embedded systems. + +Roozbeh Pournader <roozbeh@sharif.edu> + * Fixed small things here and there. @@ -0,0 +1,13 @@ +Implementation issues: + +* BidiTypes enum in manual. + +* Update CapRTL with new Unicode reference code. + +* Revise reorder API, in fribidi_main.c reorder after link break. + +* Add an option to fribidi_main.c to assume two consecutive returns as + paragraph separators. + +* Design better apis to do reorder based on available levels, remove + explicit marks then calculate position maps, .... diff --git a/bin/Makefile.am b/bin/Makefile.am new file mode 100644 index 0000000..6d8209a --- /dev/null +++ b/bin/Makefile.am @@ -0,0 +1,25 @@ +bin_PROGRAMS = fribidi + +noinst_PROGRAMS = fribidi-benchmark + +getopt_SOURCES = getopt.c getopt1.c getopt_int.h getopt.h + +fribidi_SOURCES = fribidi-main.c $(getopt_SOURCES) + +fribidi_benchmark_SOURCES = fribidi-benchmark.c $(getopt_SOURCES) + +AM_CPPFLAGS = \ + -I$(top_builddir)/lib \ + -I$(top_srcdir)/lib \ + -I$(top_srcdir)/charset \ + $(GLIB_CFLAGS) + +LDADD = $(top_builddir)/lib/libfribidi.la $(GLIB_LIBS) + +if FRIBIDI_CHARSETS +else # !FRIBIDI_CHARSETS +LDADD += $(top_builddir)/charset/libfribidi-char-sets.la +endif # !FRIBIDI_CHARSETS + +$(top_builddir)/lib/libfribidi.la: + cd $(top_builddir)/lib && $(MAKE) $(AM_MAKEFLAGS) libfribidi.la diff --git a/bin/fribidi-benchmark.c b/bin/fribidi-benchmark.c new file mode 100644 index 0000000..9fd015c --- /dev/null +++ b/bin/fribidi-benchmark.c @@ -0,0 +1,278 @@ +/* FriBidi + * fribidi-benchmark.c - command line benchmark tool for libfribidi + * + * $Id: fribidi-benchmark.c,v 1.1 2004-04-25 18:47:57 behdad Exp $ + * $Author: behdad $ + * $Date: 2004-04-25 18:47:57 $ + * $Revision: 1.1 $ + * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/bin/fribidi-benchmark.c,v $ + * + * Authors: + * Behdad Esfahbod, 2001, 2002, 2004 + * Dov Grobgeld, 1999, 2000 + * + * Copyright (C) 2004 Sharif FarsiWeb, Inc + * Copyright (C) 2001,2002 Behdad Esfahbod + * Copyright (C) 1999,2000 Dov Grobgeld + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library, in a file named COPYING; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA + * + * For licensing issues, contact <license@farsiweb.info>. + */ + +#include <fribidi.h> + +#include <common.h> + +#include <stdio.h> +#if STDC_HEADERS +# include <stdlib.h> +# include <stddef.h> +#else +# if HAVE_STDLIB_H +# include <stdlib.h> +# endif +#endif +#if HAVE_STRING_H +# if !STDC_HEADERS && HAVE_MEMORY_H +# include <memory.h> +# endif +# include <string.h> +#endif +#if HAVE_STRINGS_H +# include <strings.h> +#endif +#if HAVE_SYS_TIMES_H +# include <sys/times.h> +#endif + +#include "getopt.h" + +#define appname "fribidi_benchmark" + +#define MAX_STR_LEN 1000 + +static void +die2 ( + const char *fmt, + const char *arg +) +{ + fprintf (stderr, "%s: ", appname); + if (fmt) + fprintf (stderr, fmt, arg); + fprintf (stderr, "Try `%s --help' for more information.\n", appname); + exit (-1); +} + +#define TEST_STRING \ + "a THE QUICK -123,456 (FOX JUMPS ) DOG the quick !1@7#4&5^ over the dog " \ + "123,456 OVER THE 5%+ 4.0 LAZY" +#define TEST_STRING_EXPLICIT \ + "this is _LJUST_o a _lsimple _Rte%ST_o th_oat HAS A _LPDF missing" \ + "AnD hOw_L AbOuT, 123,987 tHiS_o a GO_oOD - _L_oTE_oST. " \ + "here_L is_o_o_o _R a good one_o And _r 123,987_LT_oHE_R next_o oNE:" \ + "_R_r and the last _LONE_o IS THE _rbest _lONE and" \ + "a _L_L_L_LL_L_L_L_L_L_L_L_L_Rbug_o_o_o_o_o_o" \ + "_R_r and the last _LONE_o IS THE _rbest _lONE and" \ + "A REAL BIG_l_o BUG! _L _l_r_R_L_laslaj siw_o_Rlkj sslk" \ + "a _L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_Rbug" \ + "here_L is_o_o_o _R ab one_o _r 123,987_LT_oHE_R t_o oNE:" \ + +int niter; + +static void +help ( + void +) +{ + printf + ("Usage: " appname " [OPTION]...\n" + "A program for benchmarking the speed of the " FRIBIDI_NAME + " library.\n" "\n" + " -h, --help Display this information and exit\n" + " -V, --version Display version information and exit\n" + " -n, --niter N Number of iterations. Default is %d.\n" + "\nReport bugs online at\n<" FRIBIDI_BUGREPORT ">.\n", niter); + exit (0); +} + +static void +version ( + void +) +{ + printf (appname " %s", fribidi_version_info); + exit (0); +} + +static double +utime ( + void +) +{ + struct tms tb; + times (&tb); + return 0.01 * tb.tms_utime; +} + +static void +benchmark ( + char *S_, + int niter +) +{ + int len, i; + FriBidiChar us[MAX_STR_LEN], out_us[MAX_STR_LEN]; + FriBidiStrIndex positionLtoV[MAX_STR_LEN], positionVtoL[MAX_STR_LEN]; + FriBidiLevel embedding_list[MAX_STR_LEN]; + FriBidiCharType base; + double time0, time1; + + { + int j; + len = strlen (S_); + for (i = 0, j = 0; i < len; i++) + { + if (S_[i] == '_') + switch (S_[++i]) + { + case '>': + us[j++] = FRIBIDI_CHAR_LRM; + break; + case '<': + us[j++] = FRIBIDI_CHAR_RLM; + break; + case 'l': + us[j++] = FRIBIDI_CHAR_LRE; + break; + case 'r': + us[j++] = FRIBIDI_CHAR_RLE; + break; + case 'L': + us[j++] = FRIBIDI_CHAR_LRO; + break; + case 'R': + us[j++] = FRIBIDI_CHAR_RLO; + break; + case 'o': + us[j++] = FRIBIDI_CHAR_PDF; + break; + case '_': + us[j++] = '_'; + break; + default: + us[j++] = '_'; + i--; + break; + } + else + us[j++] = S_[i]; + if (us[j] >= 'A' && us[j] <= 'F') + us[j] += FRIBIDI_CHAR_ARABIC_ALEF - 'A'; + else if (us[j] >= 'G' && us[j] <= 'Z') + us[j] += FRIBIDI_CHAR_HEBREW_ALEF - 'G'; + else if (us[j] >= '6' && us[j] <= '9') + us[j] += FRIBIDI_CHAR_ARABIC_ZERO - '0'; + } + len = j; + } + + /* Start timer */ + time0 = utime (); + + for (i = 0; i < niter; i++) + { + /* Create a bidi string */ + base = FRIBIDI_TYPE_ON; + fribidi_log2vis (us, len, &base, + /* output */ + out_us, positionVtoL, positionLtoV, embedding_list); + } + + /* stop timer */ + time1 = utime (); + + /* output result */ + printf ("Length = %d\n", len); + printf ("Iterations = %d\n", niter); + printf ("%d len*iterations in %f seconds\n", len * niter, time1 - time0); + printf ("= %.0f kilo.length.iterations/second\n", + 1.0 * len * niter / 1000 / (time1 - time0)); + + return; +} + +int +main ( + int argc, + char *argv[] +) +{ + niter = 2000; + + /* Parse the command line */ + argv[0] = appname; + while (1) + { + int option_index = 0, c; + static struct option long_options[] = { + {"help", 0, 0, 'h'}, + {"version", 0, 0, 'V'}, + {"niter", 0, 0, 'n'}, + {0, 0, 0, 0} + }; + + c = getopt_long (argc, argv, "hVn:", long_options, &option_index); + if (c == -1) + break; + + switch (c) + { + case 0: + break; + case 'h': + help (); + break; + case 'V': + version (); + break; + case 'n': + niter = atoi (optarg); + if (niter <= 0) + die2 ("invalid number of iterations `%s'\n", optarg); + break; + case ':': + case '?': + die2 (NULL, NULL); + break; + default: + break; + } + } + + printf ("* Without explicit marks:\n"); + benchmark (TEST_STRING, niter); + printf ("\n"); + printf ("* With explicit marks:\n"); + benchmark (TEST_STRING_EXPLICIT, niter); + + return 0; +} + +/* Editor directions: + * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent + */ diff --git a/bin/fribidi-main.c b/bin/fribidi-main.c new file mode 100644 index 0000000..60d8fbf --- /dev/null +++ b/bin/fribidi-main.c @@ -0,0 +1,597 @@ +/* FriBidi + * fribidi-main.c - command line program for libfribidi + * + * $Id: fribidi-main.c,v 1.1 2004-04-25 18:47:57 behdad Exp $ + * $Author: behdad $ + * $Date: 2004-04-25 18:47:57 $ + * $Revision: 1.1 $ + * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/bin/fribidi-main.c,v $ + * + * Authors: + * Behdad Esfahbod, 2001, 2002, 2004 + * Dov Grobgeld, 1999, 2000 + * + * Copyright (C) 2004 Sharif FarsiWeb, Inc + * Copyright (C) 2001,2002 Behdad Esfahbod + * Copyright (C) 1999,2000 Dov Grobgeld + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library, in a file named COPYING; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA + * + * For licensing issues, contact <license@farsiweb.info>. + */ + +#include <fribidi.h> +#if !FRIBIDI_CHARSETS +# if FRIBIDI_MAIN_USE_ICONV_H +# include <iconv.h> +# else /* !FRIBIDI_MAIN_USE_ICONV_H */ +# include <fribidi-char-sets.h> +# endif /* FRIBIDI_MAIN_USE_ICONV_H */ +#endif /* !FRIBIDI_CHARSETS */ + +#include <common.h> + +#include <stdio.h> +#if STDC_HEADERS +# include <stdlib.h> +# include <stddef.h> +#else +# if HAVE_STDLIB_H +# include <stdlib.h> +# endif +#endif +#if HAVE_STRING_H +# if !STDC_HEADERS && HAVE_MEMORY_H +# include <memory.h> +# endif +# include <string.h> +#endif +#if HAVE_STRINGS_H +# include <strings.h> +#endif +#if HAVE_SYS_TIMES_H +# include <sys/times.h> +#endif + +#include "getopt.h" + +#define appname "fribidi" + +#define MAX_STR_LEN 65000 + + +#define ALLOCATE(tp,ln) ((tp *) malloc (sizeof (tp) * (ln))) + +static void +die2 ( + const char *fmt, + const char *arg +) +{ + fprintf (stderr, "%s: ", appname); + if (fmt) + fprintf (stderr, fmt, arg); + fprintf (stderr, "Try `%s --help' for more information.\n", appname); + exit (-1); +} + +#define die1(msg) die2("%s", msg) + +fribidi_boolean do_break, do_pad, do_mirror, do_reorder_nsm, do_clean; +fribidi_boolean show_input, show_visual, show_basedir; +fribidi_boolean show_ltov, show_vtol, show_levels; +int text_width; +char *char_set; +char *bol_text, *eol_text; +FriBidiCharType input_base_direction; +#if FRIBIDI_MAIN_USE_ICONV_H +iconv_t to_ucs4, from_ucs4; +#else /* !FRIBIDI_MAIN_USE_ICONV_H */ +int char_set_num; +#endif /* !FRIBIDI_MAIN_USE_ICONV_H */ + +static void +help ( + void +) +{ + /* Break help string into little ones, to assure ISO C89 conformance */ + printf ("Usage: " appname " [OPTION]... [FILE]...\n" + "A command line interface for the " FRIBIDI_NAME " library.\n" + "Convert a logical string to visual.\n" + "\n" + " -h, --help Display this information and exit\n" + " -V, --version Display version information and exit\n" + " -v, --verbose Verbose mode, same as --basedir --ltov --vtol\n" + " --levels --changes\n"); + printf (" -d, --debug Output debug information\n" + " -t, --test Test " FRIBIDI_NAME + ", same as --clean --nobreak\n" + " --showinput --reordernsm\n"); +#if FRIBIDI_MAIN_USE_ICONV_H + printf (" -c, --charset CS Specify character set, default is %s.\n" + " CS should be a valid iconv character set name\n", + char_set); +#else /* !FRIBIDI_MAIN_USE_ICONV_H */ + printf (" -c, --charset CS Specify character set, default is %s\n" + " --charsetdesc CS Show descriptions for character set CS and exit\n" + " --caprtl Old style: set character set to CapRTL\n", + char_set); +#endif /* !FRIBIDI_MAIN_USE_ICONV_H */ + printf (" --showinput Output the input string too\n" + " --nopad Do not right justify RTL lines\n" + " --nobreak Do not break long lines\n" + " -w, --width W Screen width for padding, default is %d, but if\n" + " enviroment variable COLUMNS is defined, its value\n" + " will be used, --width overrides both of them.\n", + text_width); + printf + (" -B, --bol BOL Output string BOL before the visual string\n" + " -E, --eol EOL Output string EOL after the visual string\n" + " --rtl Force base direction to RTL\n" + " --ltr Force base direction to LTR\n" + " --wrtl Set base direction to RTL if no strong character found\n"); + printf + (" --wltr Set base direction to LTR if no strong character found\n" + " (default)\n" + " --nomirror Turn mirroring off, to do it later\n" + " --reordernsm Reorder NSM sequences to follow their base character\n" + " --clean Remove explicit format codes in visual string\n" + " output, currently does not affect other outputs\n" + " --basedir Output Base Direction\n"); + printf (" --ltov Output Logical to Visual position map\n" + " --vtol Output Visual to Logical position map\n" + " --levels Output Embedding Levels\n" + " --novisual Do not output the visual string, to be used with\n" + " --basedir, --ltov, --vtol, --levels, --changes\n"); + printf (" All string indexes are zero based\n" "\n" "Output:\n" + " For each line of input, output something like this:\n" + " [input-str` => '][BOL][[padding space]visual-str][EOL]\n" + " [\\n base-dir][\\n ltov-map][\\n vtol-map][\\n levels][\\n changes]\n"); + +#if !FRIBIDI_MAIN_USE_ICONV_H + { + int i; + printf ("\n" "Available character sets:\n"); + for (i = 1; i <= FRIBIDI_CHAR_SETS_NUM; i++) + printf (" * %-10s: %-25s%1s\n", + fribidi_char_set_name (i), fribidi_char_set_title (i), + (fribidi_char_set_desc (i) ? "X" : "")); + printf + (" X: Character set has descriptions, use --charsetdesc to see\n"); + } +#endif /* !FRIBIDI_MAIN_USE_ICONV_H */ + + printf ("\nReport bugs online at\n<" FRIBIDI_BUGREPORT ">.\n"); + exit (0); +} + +static void +version ( + void +) +{ + printf (appname " %s", fribidi_version_info); + exit (0); +} + +int +main ( + int argc, + char *argv[] +) +{ + int exit_val; + fribidi_boolean file_found; + char *s; + FILE *IN; + + text_width = 80; + do_break = TRUE; + do_pad = TRUE; + do_mirror = TRUE; + do_clean = FALSE; + do_reorder_nsm = FALSE; + show_input = FALSE; + show_visual = TRUE; + show_basedir = FALSE; + show_ltov = FALSE; + show_vtol = FALSE; + show_levels = FALSE; + char_set = "UTF-8"; + bol_text = NULL; + eol_text = NULL; + input_base_direction = FRIBIDI_TYPE_ON; + + if ((s = getenv ("COLUMNS"))) + { + int i; + + i = atoi (s); + if (i > 0) + text_width = i; + } + +#define CHARSETDESC 257 +#define CAPRTL 258 + + /* Parse the command line with getopt library */ + /* Must set argv[0], getopt uses it to generate error messages */ + argv[0] = appname; + while (1) + { + int option_index = 0, c; + static struct option long_options[] = { + {"help", 0, 0, 'h'}, + {"version", 0, 0, 'V'}, + {"verbose", 0, 0, 'v'}, + {"debug", 0, 0, 'd'}, + {"test", 0, 0, 't'}, + {"charset", 1, 0, 'c'}, +#if !FRIBIDI_MAIN_USE_ICONV_H + {"charsetdesc", 1, 0, CHARSETDESC}, + {"caprtl", 0, 0, CAPRTL}, +#endif /* FRIBIDI_MAIN_USE_ICONV_H */ + {"showinput", 0, &show_input, TRUE}, + {"nopad", 0, &do_pad, FALSE}, + {"nobreak", 0, &do_break, FALSE}, + {"width", 1, 0, 'w'}, + {"bol", 1, 0, 'B'}, + {"eol", 1, 0, 'E'}, + {"nomirror", 0, &do_mirror, FALSE}, + {"reordernsm", 0, &do_reorder_nsm, TRUE}, + {"clean", 0, &do_clean, TRUE}, + {"ltr", 0, (int *) (void *) &input_base_direction, FRIBIDI_TYPE_L}, + {"rtl", 0, (int *) (void *) &input_base_direction, FRIBIDI_TYPE_R}, + {"wltr", 0, (int *) (void *) &input_base_direction, FRIBIDI_TYPE_WL}, + {"wrtl", 0, (int *) (void *) &input_base_direction, FRIBIDI_TYPE_WR}, + {"basedir", 0, &show_basedir, TRUE}, + {"ltov", 0, &show_ltov, TRUE}, + {"vtol", 0, &show_vtol, TRUE}, + {"levels", 0, &show_levels, TRUE}, + {"novisual", 0, &show_visual, FALSE}, + {0, 0, 0, 0} + }; + + c = + getopt_long (argc, argv, "hVvdtc:w:B:E:", long_options, + &option_index); + if (c == -1) + break; + + switch (c) + { + case 0: + break; + case 'h': + help (); + break; + case 'V': + version (); + break; + case 'v': + show_basedir = show_ltov = show_vtol = show_levels = TRUE; + break; + case 'w': + text_width = atoi (optarg); + if (text_width <= 0) + die2 ("invalid screen width `%s'\n", optarg); + break; + case 'B': + bol_text = optarg; + break; + case 'E': + eol_text = optarg; + break; + case 'd': + if (!fribidi_set_debug (TRUE)) + die1 + ("lib" FRIBIDI + " must be compiled with DEBUG option to enable\nturn debug info on.\n"); + break; + case 't': + do_clean = show_input = do_reorder_nsm = TRUE; + do_break = FALSE; + break; + case 'c': + char_set = strdup (optarg); + break; +#if !FRIBIDI_MAIN_USE_ICONV_H + case CAPRTL: + char_set = "CapRTL"; + break; + case CHARSETDESC: + char_set = strdup (optarg); + char_set_num = fribidi_parse_charset (char_set); + if (!char_set_num) + die2 ("unrecognized character set `%s'\n", char_set); + if (!fribidi_char_set_desc (char_set_num)) + die2 ("no description available for character set `%s'\n", + fribidi_char_set_name (char_set_num)); + else + printf ("Descriptions for character set %s:\n" + "\n" "%s", fribidi_char_set_title (char_set_num), + fribidi_char_set_desc (char_set_num)); + exit (0); + break; +#endif /* !FRIBIDI_MAIN_USE_ICONV_H */ + case ':': + case '?': + die2 (NULL, NULL); + break; + default: + break; + } + } + +#if FRIBIDI_MAIN_USE_ICONV_H + to_ucs4 = iconv_open ("WCHAR_T", char_set); + from_ucs4 = iconv_open (char_set, "WCHAR_T"); +#else /* !FRIBIDI_MAIN_USE_ICONV_H */ + char_set_num = fribidi_parse_charset (char_set); +#endif /* !FRIBIDI_MAIN_USE_ICONV_H */ + +#if FRIBIDI_MAIN_USE_ICONV_H + if (to_ucs4 == (iconv_t) (-1) || from_ucs4 == (iconv_t) (-1)) +#else /* !FRIBIDI_MAIN_USE_ICONV_H */ + if (!char_set_num) +#endif /* !FRIBIDI_MAIN_USE_ICONV_H */ + die2 ("unrecognized character set `%s'\n", char_set); + + fribidi_set_mirroring (do_mirror); + fribidi_set_reorder_nsm (do_reorder_nsm); + exit_val = 0; + file_found = FALSE; + while (optind < argc || !file_found) + { + char *S_; + + S_ = optind < argc ? argv[optind++] : "-"; + file_found = TRUE; + + /* Open the infile for reading */ + if (S_[0] == '-' && !S_[1]) + { + IN = stdin; + } + else + { + IN = fopen (S_, "r"); + if (!IN) + { + fprintf (stderr, "%s: %s: no such file or directory\n", + appname, S_); + exit_val = 1; + continue; + } + } + + /* Read and process input one line at a time */ + { + char S_[MAX_STR_LEN]; + int padding_width, break_width; + + padding_width = show_input ? (text_width - 10) / 2 : text_width; + break_width = do_break ? padding_width : 3 * MAX_STR_LEN; + + while (fgets (S_, sizeof (S_) - 1, IN)) + { + char *new_line, *nl_found; + FriBidiChar logical[MAX_STR_LEN]; + char outstring[MAX_STR_LEN]; + FriBidiCharType base; + FriBidiStrIndex len; + + nl_found = ""; + S_[sizeof (S_) - 1] = 0; + len = strlen (S_); + /* chop */ + if (S_[len - 1] == '\n') + { + len--; + S_[len] = '\0'; + new_line = "\n"; + } + else + new_line = ""; + +#if FRIBIDI_MAIN_USE_ICONV_H + { + char *st = S_, *ust = (char *) logical; + int in_len = (int) len; + len = sizeof logical; + iconv (to_ucs4, &st, &in_len, &ust, (int *) &len); + len = (FriBidiChar *) ust - logical; + } +#else /* !FRIBIDI_MAIN_USE_ICONV_H */ + len = fribidi_charset_to_unicode (char_set_num, S_, len, logical); +#endif /* !FRIBIDI_MAIN_USE_ICONV_H */ + + { + FriBidiChar *visual; + FriBidiStrIndex *ltov, *vtol; + FriBidiLevel *levels; + FriBidiStrIndex new_len; + fribidi_boolean log2vis; + + visual = show_visual ? ALLOCATE (FriBidiChar, + len + 1 + ) : NULL; + ltov = show_ltov ? ALLOCATE (FriBidiStrIndex, + len + 1 + ) : NULL; + vtol = show_vtol ? ALLOCATE (FriBidiStrIndex, + len + 1 + ) : NULL; + levels = show_levels ? ALLOCATE (FriBidiLevel, + len + 1 + ) : NULL; + + /* Create a bidi string. */ + base = input_base_direction; + log2vis = fribidi_log2vis (logical, len, &base, + /* output */ + visual, ltov, vtol, levels); + if (log2vis) + { + + if (show_input) + printf ("%-*s => ", padding_width, S_); + + new_len = len; + + /* Remove explicit marks, if asked for. */ + if (do_clean) + len = + fribidi_remove_bidi_marks (visual, len, ltov, vtol, + levels); + + if (show_visual) + { + printf (nl_found); + + if (bol_text) + printf ("%s", bol_text); + + /* Convert it to input charset and print. */ + { + FriBidiStrIndex idx, st; + for (idx = 0; idx < len;) + { + FriBidiStrIndex wid, inlen; + + wid = break_width; + st = idx; +#if !FRIBIDI_MAIN_USE_ICONV_H + if (char_set_num != FRIBIDI_CHAR_SET_CAP_RTL) +#endif /* !FRIBIDI_MAIN_USE_ICONV_H */ + while (wid > 0 && idx < len) + { + wid -= + fribidi_get_type (visual[idx]) & + (FRIBIDI_MASK_BN | FRIBIDI_MASK_NSM) ? 0 : + 1; + idx++; + } +#if !FRIBIDI_MAIN_USE_ICONV_H + else + while (wid > 0 && idx < len) + { + wid--; + idx++; + } +#endif /* !FRIBIDI_MAIN_USE_ICONV_H */ + if (wid < 0 && idx > st + 1) + idx--; + inlen = idx - st; + +#if FRIBIDI_MAIN_USE_ICONV_H + { + char *str = outstring, *ust = + (char *) (visual + st); + int in_len = inlen * sizeof visual[0]; + new_len = sizeof outstring; + iconv (from_ucs4, &ust, &in_len, &str, + (int *) &new_len); + *str = '\0'; + new_len = str - outstring; + } +#else /* !FRIBIDI_MAIN_USE_ICONV_H */ + new_len = + fribidi_unicode_to_charset (char_set_num, + visual + st, inlen, + outstring); +#endif /* !FRIBIDI_MAIN_USE_ICONV_H */ + if (FRIBIDI_IS_RTL (base)) + printf ("%*s", + (int) (do_pad ? (padding_width + + strlen (outstring) - + (break_width - + wid)) : 0), + outstring); + else + printf ("%s", outstring); + if (idx < len) + printf ("\n"); + } + } + if (eol_text) + printf ("%s", eol_text); + + nl_found = "\n"; + } + if (show_basedir) + { + printf (nl_found); + printf ("Base direction: %s", + (FRIBIDI_DIR_TO_LEVEL (base) ? "R" : "L")); + nl_found = "\n"; + } + if (show_ltov) + { + FriBidiStrIndex i; + + printf (nl_found); + for (i = 0; i < len; i++) + printf ("%ld ", (long) ltov[i]); + nl_found = "\n"; + } + if (show_vtol) + { + FriBidiStrIndex i; + + printf (nl_found); + for (i = 0; i < len; i++) + printf ("%ld ", (long) vtol[i]); + nl_found = "\n"; + } + if (show_levels) + { + FriBidiStrIndex i; + + printf (nl_found); + for (i = 0; i < len; i++) + printf ("%d ", (int) levels[i]); + nl_found = "\n"; + } + } + else + { + exit_val = 2; + } + + if (show_visual) + free (visual); + if (show_ltov) + free (ltov); + if (show_vtol) + free (vtol); + if (show_levels) + free (levels); + } + + if (*nl_found) + printf (new_line); + } + } + } + + return exit_val; +} + +/* Editor directions: + * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent + */ diff --git a/bin/getopt.c b/bin/getopt.c new file mode 100644 index 0000000..74330fa --- /dev/null +++ b/bin/getopt.c @@ -0,0 +1,1268 @@ +/* Getopt for GNU. + NOTE: getopt is now part of the C library, so if you don't know what + "Keep this file name-space clean" means, talk to drepper@gnu.org + before changing it! + Copyright (C) 1987,88,89,90,91,92,93,94,95,96,98,99,2000,2001,2002,2003,2004 + Free Software Foundation, Inc. + This file is part of the GNU C Library. + + This program 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 2, or (at your option) + any later version. + + This program 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 this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +/* This tells Alpha OSF/1 not to define a getopt prototype in <stdio.h>. + Ditto for AIX 3.2 and <stdlib.h>. */ +#ifndef _NO_PROTO +# define _NO_PROTO +#endif + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <stdio.h> + +/* Comment out all this code if we are using the GNU C Library, and are not + actually compiling the library itself. This code is part of the GNU C + Library, but also included in many other GNU distributions. Compiling + and linking in this code is a waste when using the GNU C library + (especially if it is a shared library). Rather than having every GNU + program understand `configure --with-gnu-libc' and omit the object files, + it is simpler to just do this in the source for each such file. */ + +#define GETOPT_INTERFACE_VERSION 2 +#if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2 +# include <gnu-versions.h> +# if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION +# define ELIDE_CODE +# endif +#endif + +#ifndef ELIDE_CODE + + +/* This needs to come after some library #include + to get __GNU_LIBRARY__ defined. */ +#ifdef __GNU_LIBRARY__ +/* Don't include stdlib.h for non-GNU C libraries because some of them + contain conflicting prototypes for getopt. */ +# include <stdlib.h> +# include <unistd.h> +#endif /* GNU C library. */ + +#include <string.h> + +#ifdef VMS +# include <unixlib.h> +#endif + +#ifdef _LIBC +# include <libintl.h> +#else +# include "gettext.h" +# define _(msgid) gettext (msgid) +#endif + +#if defined _LIBC && defined USE_IN_LIBIO +# include <wchar.h> +#endif + +#ifndef attribute_hidden +# define attribute_hidden +#endif + +/* This version of `getopt' appears to the caller like standard Unix `getopt' + but it behaves differently for the user, since it allows the user + to intersperse the options with the other arguments. + + As `getopt' works, it permutes the elements of ARGV so that, + when it is done, all the options precede everything else. Thus + all application programs are extended to handle flexible argument order. + + Setting the environment variable POSIXLY_CORRECT disables permutation. + Then the behavior is completely standard. + + GNU application programs can use a third alternative mode in which + they can distinguish the relative order of options and other arguments. */ + +#include "getopt.h" +#include "getopt_int.h" + +/* For communication from `getopt' to the caller. + When `getopt' finds an option that takes an argument, + the argument value is returned here. + Also, when `ordering' is RETURN_IN_ORDER, + each non-option ARGV-element is returned here. */ + +char *optarg; + +/* Index in ARGV of the next element to be scanned. + This is used for communication to and from the caller + and for communication between successive calls to `getopt'. + + On entry to `getopt', zero means this is the first call; initialize. + + When `getopt' returns -1, this is the index of the first of the + non-option elements that the caller should itself scan. + + Otherwise, `optind' communicates from one call to the next + how much of ARGV has been scanned so far. */ + +/* 1003.2 says this must be 1 before any call. */ +int optind = 1; + +/* Callers store zero here to inhibit the error message + for unrecognized options. */ + +int opterr = 1; + +/* Set to an option character which was unrecognized. + This must be initialized on some systems to avoid linking in the + system's own getopt implementation. */ + +int optopt = '?'; + +/* Keep a global copy of all internal members of getopt_data. */ + +static struct _getopt_data getopt_data; + + +#ifndef __GNU_LIBRARY__ + +/* Avoid depending on library functions or files + whose names are inconsistent. */ + +#ifndef getenv +extern char *getenv ( +); +#endif + +#endif /* not __GNU_LIBRARY__ */ + +#ifdef _LIBC +/* Stored original parameters. + XXX This is no good solution. We should rather copy the args so + that we can compare them later. But we must not use malloc(3). */ +extern int __libc_argc; +extern char **__libc_argv; + +/* Bash 2.0 gives us an environment variable containing flags + indicating ARGV elements that should not be considered arguments. */ + +# ifdef USE_NONOPTION_FLAGS +/* Defined in getopt_init.c */ +extern char *__getopt_nonoption_flags; +# endif + +# ifdef USE_NONOPTION_FLAGS +# define SWAP_FLAGS(ch1, ch2) \ + if (d->__nonoption_flags_len > 0) \ + { \ + char __tmp = __getopt_nonoption_flags[ch1]; \ + __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2]; \ + __getopt_nonoption_flags[ch2] = __tmp; \ + } +# else +# define SWAP_FLAGS(ch1, ch2) +# endif +#else /* !_LIBC */ +# define SWAP_FLAGS(ch1, ch2) +#endif /* _LIBC */ + +/* Exchange two adjacent subsequences of ARGV. + One subsequence is elements [first_nonopt,last_nonopt) + which contains all the non-options that have been skipped so far. + The other is elements [last_nonopt,optind), which contains all + the options processed since those non-options were skipped. + + `first_nonopt' and `last_nonopt' are relocated so that they describe + the new indices of the non-options in ARGV after they are moved. */ + +static void +exchange ( + char **argv, + struct _getopt_data *d +) +{ + int bottom = d->__first_nonopt; + int middle = d->__last_nonopt; + int top = d->optind; + char *tem; + + /* Exchange the shorter segment with the far end of the longer segment. + That puts the shorter segment into the right place. + It leaves the longer segment in the right place overall, + but it consists of two parts that need to be swapped next. */ + +#if defined _LIBC && defined USE_NONOPTION_FLAGS + /* First make sure the handling of the `__getopt_nonoption_flags' + string can work normally. Our top argument must be in the range + of the string. */ + if (d->__nonoption_flags_len > 0 && top >= d->__nonoption_flags_max_len) + { + /* We must extend the array. The user plays games with us and + presents new arguments. */ + char *new_str = malloc (top + 1); + if (new_str == NULL) + d->__nonoption_flags_len = d->__nonoption_flags_max_len = 0; + else + { + memset (__mempcpy (new_str, __getopt_nonoption_flags, + d->__nonoption_flags_max_len), + '\0', top + 1 - d->__nonoption_flags_max_len); + d->__nonoption_flags_max_len = top + 1; + __getopt_nonoption_flags = new_str; + } + } +#endif + + while (top > middle && middle > bottom) + { + if (top - middle > middle - bottom) + { + /* Bottom segment is the short one. */ + int len = middle - bottom; + register int i; + + /* Swap it with the top part of the top segment. */ + for (i = 0; i < len; i++) + { + tem = argv[bottom + i]; + argv[bottom + i] = argv[top - (middle - bottom) + i]; + argv[top - (middle - bottom) + i] = tem; + SWAP_FLAGS (bottom + i, top - (middle - bottom) + i); + } + /* Exclude the moved bottom segment from further swapping. */ + top -= len; + } + else + { + /* Top segment is the short one. */ + int len = top - middle; + register int i; + + /* Swap it with the bottom part of the bottom segment. */ + for (i = 0; i < len; i++) + { + tem = argv[bottom + i]; + argv[bottom + i] = argv[middle + i]; + argv[middle + i] = tem; + SWAP_FLAGS (bottom + i, middle + i); + } + /* Exclude the moved top segment from further swapping. */ + bottom += len; + } + } + + /* Update records for the slots the non-options now occupy. */ + + d->__first_nonopt += (d->optind - d->__last_nonopt); + d->__last_nonopt = d->optind; +} + +/* Initialize the internal data when the first call is made. */ + +static const char * +_getopt_initialize ( + int argc, + char *const *argv, + const char *optstring, + struct _getopt_data *d +) +{ + /* Start processing options with ARGV-element 1 (since ARGV-element 0 + is the program name); the sequence of previously skipped + non-option ARGV-elements is empty. */ + + d->__first_nonopt = d->__last_nonopt = d->optind; + + d->__nextchar = NULL; + + d->__posixly_correct = !!getenv ("POSIXLY_CORRECT"); + + /* Determine how to handle the ordering of options and nonoptions. */ + + if (optstring[0] == '-') + { + d->__ordering = RETURN_IN_ORDER; + ++optstring; + } + else if (optstring[0] == '+') + { + d->__ordering = REQUIRE_ORDER; + ++optstring; + } + else if (d->__posixly_correct) + d->__ordering = REQUIRE_ORDER; + else + d->__ordering = PERMUTE; + +#if defined _LIBC && defined USE_NONOPTION_FLAGS + if (!d->__posixly_correct && argc == __libc_argc && argv == __libc_argv) + { + if (d->__nonoption_flags_max_len == 0) + { + if (__getopt_nonoption_flags == NULL + || __getopt_nonoption_flags[0] == '\0') + d->__nonoption_flags_max_len = -1; + else + { + const char *orig_str = __getopt_nonoption_flags; + int len = d->__nonoption_flags_max_len = strlen (orig_str); + if (d->__nonoption_flags_max_len < argc) + d->__nonoption_flags_max_len = argc; + __getopt_nonoption_flags = + (char *) malloc (d->__nonoption_flags_max_len); + if (__getopt_nonoption_flags == NULL) + d->__nonoption_flags_max_len = -1; + else + memset (__mempcpy (__getopt_nonoption_flags, orig_str, len), + '\0', d->__nonoption_flags_max_len - len); + } + } + d->__nonoption_flags_len = d->__nonoption_flags_max_len; + } + else + d->__nonoption_flags_len = 0; +#endif + + return optstring; +} + +/* Scan elements of ARGV (whose length is ARGC) for option characters + given in OPTSTRING. + + If an element of ARGV starts with '-', and is not exactly "-" or "--", + then it is an option element. The characters of this element + (aside from the initial '-') are option characters. If `getopt' + is called repeatedly, it returns successively each of the option characters + from each of the option elements. + + If `getopt' finds another option character, it returns that character, + updating `optind' and `nextchar' so that the next call to `getopt' can + resume the scan with the following option character or ARGV-element. + + If there are no more option characters, `getopt' returns -1. + Then `optind' is the index in ARGV of the first ARGV-element + that is not an option. (The ARGV-elements have been permuted + so that those that are not options now come last.) + + OPTSTRING is a string containing the legitimate option characters. + If an option character is seen that is not listed in OPTSTRING, + return '?' after printing an error message. If you set `opterr' to + zero, the error message is suppressed but we still return '?'. + + If a char in OPTSTRING is followed by a colon, that means it wants an arg, + so the following text in the same ARGV-element, or the text of the following + ARGV-element, is returned in `optarg'. Two colons mean an option that + wants an optional arg; if there is text in the current ARGV-element, + it is returned in `optarg', otherwise `optarg' is set to zero. + + If OPTSTRING starts with `-' or `+', it requests different methods of + handling the non-option ARGV-elements. + See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above. + + Long-named options begin with `--' instead of `-'. + Their names may be abbreviated as long as the abbreviation is unique + or is an exact match for some defined option. If they have an + argument, it follows the option name in the same ARGV-element, separated + from the option name by a `=', or else the in next ARGV-element. + When `getopt' finds a long-named option, it returns 0 if that option's + `flag' field is nonzero, the value of the option's `val' field + if the `flag' field is zero. + + The elements of ARGV aren't really const, because we permute them. + But we pretend they're const in the prototype to be compatible + with other systems. + + LONGOPTS is a vector of `struct option' terminated by an + element containing a name which is zero. + + LONGIND returns the index in LONGOPT of the long-named option found. + It is only valid when a long-named option has been found by the most + recent call. + + If LONG_ONLY is nonzero, '-' as well as '--' can introduce + long-named options. */ + +int +_getopt_internal_r ( + int argc, + char *const *argv, + const char *optstring, + const struct option *longopts, + int *longind, + int long_only, + struct _getopt_data *d +) +{ + int print_errors = d->opterr; + if (optstring[0] == ':') + print_errors = 0; + + if (argc < 1) + return -1; + + d->optarg = NULL; + + if (d->optind == 0 || !d->__initialized) + { + if (d->optind == 0) + d->optind = 1; /* Don't scan ARGV[0], the program name. */ + optstring = _getopt_initialize (argc, argv, optstring, d); + d->__initialized = 1; + } + + /* Test whether ARGV[optind] points to a non-option argument. + Either it does not have option syntax, or there is an environment flag + from the shell indicating it is not an option. The later information + is only used when the used in the GNU libc. */ +#if defined _LIBC && defined USE_NONOPTION_FLAGS +# define NONOPTION_P (argv[d->optind][0] != '-' || argv[d->optind][1] == '\0' \ + || (d->optind < d->__nonoption_flags_len \ + && __getopt_nonoption_flags[d->optind] == '1')) +#else +# define NONOPTION_P (argv[d->optind][0] != '-' || argv[d->optind][1] == '\0') +#endif + + if (d->__nextchar == NULL || *d->__nextchar == '\0') + { + /* Advance to the next ARGV-element. */ + + /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been + moved back by the user (who may also have changed the arguments). */ + if (d->__last_nonopt > d->optind) + d->__last_nonopt = d->optind; + if (d->__first_nonopt > d->optind) + d->__first_nonopt = d->optind; + + if (d->__ordering == PERMUTE) + { + /* If we have just processed some options following some non-options, + exchange them so that the options come first. */ + + if (d->__first_nonopt != d->__last_nonopt + && d->__last_nonopt != d->optind) + exchange ((char **) argv, d); + else if (d->__last_nonopt != d->optind) + d->__first_nonopt = d->optind; + + /* Skip any additional non-options + and extend the range of non-options previously skipped. */ + + while (d->optind < argc && NONOPTION_P) + d->optind++; + d->__last_nonopt = d->optind; + } + + /* The special ARGV-element `--' means premature end of options. + Skip it like a null option, + then exchange with previous non-options as if it were an option, + then skip everything else like a non-option. */ + + if (d->optind != argc && !strcmp (argv[d->optind], "--")) + { + d->optind++; + + if (d->__first_nonopt != d->__last_nonopt + && d->__last_nonopt != d->optind) + exchange ((char **) argv, d); + else if (d->__first_nonopt == d->__last_nonopt) + d->__first_nonopt = d->optind; + d->__last_nonopt = argc; + + d->optind = argc; + } + + /* If we have done all the ARGV-elements, stop the scan + and back over any non-options that we skipped and permuted. */ + + if (d->optind == argc) + { + /* Set the next-arg-index to point at the non-options + that we previously skipped, so the caller will digest them. */ + if (d->__first_nonopt != d->__last_nonopt) + d->optind = d->__first_nonopt; + return -1; + } + + /* If we have come to a non-option and did not permute it, + either stop the scan or describe it to the caller and pass it by. */ + + if (NONOPTION_P) + { + if (d->__ordering == REQUIRE_ORDER) + return -1; + d->optarg = argv[d->optind++]; + return 1; + } + + /* We have found another option-ARGV-element. + Skip the initial punctuation. */ + + d->__nextchar = (argv[d->optind] + 1 + + (longopts != NULL && argv[d->optind][1] == '-')); + } + + /* Decode the current option-ARGV-element. */ + + /* Check whether the ARGV-element is a long option. + + If long_only and the ARGV-element has the form "-f", where f is + a valid short option, don't consider it an abbreviated form of + a long option that starts with f. Otherwise there would be no + way to give the -f short option. + + On the other hand, if there's a long option "fubar" and + the ARGV-element is "-fu", do consider that an abbreviation of + the long option, just like "--fu", and not "-f" with arg "u". + + This distinction seems to be the most useful approach. */ + + if (longopts != NULL + && (argv[d->optind][1] == '-' + || (long_only && (argv[d->optind][2] + || !strchr (optstring, argv[d->optind][1]))))) + { + char *nameend; + const struct option *p; + const struct option *pfound = NULL; + int exact = 0; + int ambig = 0; + int indfound = -1; + int option_index; + + for (nameend = d->__nextchar; *nameend && *nameend != '='; nameend++) + /* Do nothing. */ ; + + /* Test all long options for either exact match + or abbreviated matches. */ + for (p = longopts, option_index = 0; p->name; p++, option_index++) + if (!strncmp (p->name, d->__nextchar, nameend - d->__nextchar)) + { + if ((unsigned int) (nameend - d->__nextchar) + == (unsigned int) strlen (p->name)) + { + /* Exact match found. */ + pfound = p; + indfound = option_index; + exact = 1; + break; + } + else if (pfound == NULL) + { + /* First nonexact match found. */ + pfound = p; + indfound = option_index; + } + else if (long_only + || pfound->has_arg != p->has_arg + || pfound->flag != p->flag || pfound->val != p->val) + /* Second or later nonexact match found. */ + ambig = 1; + } + + if (ambig && !exact) + { + if (print_errors) + { +#if defined _LIBC && defined USE_IN_LIBIO + char *buf; + + if (__asprintf (&buf, _("%s: option `%s' is ambiguous\n"), + argv[0], argv[d->optind]) >= 0) + { + _IO_flockfile (stderr); + + int old_flags2 = ((_IO_FILE *) stderr)->_flags2; + ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; + + if (_IO_fwide (stderr, 0) > 0) + __fwprintf (stderr, L"%s", buf); + else + fputs (buf, stderr); + + ((_IO_FILE *) stderr)->_flags2 = old_flags2; + _IO_funlockfile (stderr); + + free (buf); + } +#else + fprintf (stderr, _("%s: option `%s' is ambiguous\n"), + argv[0], argv[d->optind]); +#endif + } + d->__nextchar += strlen (d->__nextchar); + d->optind++; + d->optopt = 0; + return '?'; + } + + if (pfound != NULL) + { + option_index = indfound; + d->optind++; + if (*nameend) + { + /* Don't test has_arg with >, because some C compilers don't + allow it to be used on enums. */ + if (pfound->has_arg) + d->optarg = nameend + 1; + else + { + if (print_errors) + { +#if defined _LIBC && defined USE_IN_LIBIO + char *buf; + int n; +#endif + + if (argv[d->optind - 1][1] == '-') + { + /* --option */ +#if defined _LIBC && defined USE_IN_LIBIO + n = __asprintf (&buf, _("\ +%s: option `--%s' doesn't allow an argument\n"), argv[0], pfound->name); +#else + fprintf (stderr, _("\ +%s: option `--%s' doesn't allow an argument\n"), argv[0], pfound->name); +#endif + } + else + { + /* +option or -option */ +#if defined _LIBC && defined USE_IN_LIBIO + n = __asprintf (&buf, _("\ +%s: option `%c%s' doesn't allow an argument\n"), argv[0], argv[d->optind - 1][0], pfound->name); +#else + fprintf (stderr, _("\ +%s: option `%c%s' doesn't allow an argument\n"), argv[0], argv[d->optind - 1][0], pfound->name); +#endif + } + +#if defined _LIBC && defined USE_IN_LIBIO + if (n >= 0) + { + _IO_flockfile (stderr); + + int old_flags2 = ((_IO_FILE *) stderr)->_flags2; + ((_IO_FILE *) stderr)->_flags2 + |= _IO_FLAGS2_NOTCANCEL; + + if (_IO_fwide (stderr, 0) > 0) + __fwprintf (stderr, L"%s", buf); + else + fputs (buf, stderr); + + ((_IO_FILE *) stderr)->_flags2 = old_flags2; + _IO_funlockfile (stderr); + + free (buf); + } +#endif + } + + d->__nextchar += strlen (d->__nextchar); + + d->optopt = pfound->val; + return '?'; + } + } + else if (pfound->has_arg == 1) + { + if (d->optind < argc) + d->optarg = argv[d->optind++]; + else + { + if (print_errors) + { +#if defined _LIBC && defined USE_IN_LIBIO + char *buf; + + if (__asprintf (&buf, _("\ +%s: option `%s' requires an argument\n"), argv[0], argv[d->optind - 1]) >= 0) + { + _IO_flockfile (stderr); + + int old_flags2 = ((_IO_FILE *) stderr)->_flags2; + ((_IO_FILE *) stderr)->_flags2 + |= _IO_FLAGS2_NOTCANCEL; + + if (_IO_fwide (stderr, 0) > 0) + __fwprintf (stderr, L"%s", buf); + else + fputs (buf, stderr); + + ((_IO_FILE *) stderr)->_flags2 = old_flags2; + _IO_funlockfile (stderr); + + free (buf); + } +#else + fprintf (stderr, + _("%s: option `%s' requires an argument\n"), + argv[0], argv[d->optind - 1]); +#endif + } + d->__nextchar += strlen (d->__nextchar); + d->optopt = pfound->val; + return optstring[0] == ':' ? ':' : '?'; + } + } + d->__nextchar += strlen (d->__nextchar); + if (longind != NULL) + *longind = option_index; + if (pfound->flag) + { + *(pfound->flag) = pfound->val; + return 0; + } + return pfound->val; + } + + /* Can't find it as a long option. If this is not getopt_long_only, + or the option starts with '--' or is not a valid short + option, then it's an error. + Otherwise interpret it as a short option. */ + if (!long_only || argv[d->optind][1] == '-' + || strchr (optstring, *d->__nextchar) == NULL) + { + if (print_errors) + { +#if defined _LIBC && defined USE_IN_LIBIO + char *buf; + int n; +#endif + + if (argv[d->optind][1] == '-') + { + /* --option */ +#if defined _LIBC && defined USE_IN_LIBIO + n = __asprintf (&buf, _("%s: unrecognized option `--%s'\n"), + argv[0], d->__nextchar); +#else + fprintf (stderr, _("%s: unrecognized option `--%s'\n"), + argv[0], d->__nextchar); +#endif + } + else + { + /* +option or -option */ +#if defined _LIBC && defined USE_IN_LIBIO + n = __asprintf (&buf, _("%s: unrecognized option `%c%s'\n"), + argv[0], argv[d->optind][0], d->__nextchar); +#else + fprintf (stderr, _("%s: unrecognized option `%c%s'\n"), + argv[0], argv[d->optind][0], d->__nextchar); +#endif + } + +#if defined _LIBC && defined USE_IN_LIBIO + if (n >= 0) + { + _IO_flockfile (stderr); + + int old_flags2 = ((_IO_FILE *) stderr)->_flags2; + ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; + + if (_IO_fwide (stderr, 0) > 0) + __fwprintf (stderr, L"%s", buf); + else + fputs (buf, stderr); + + ((_IO_FILE *) stderr)->_flags2 = old_flags2; + _IO_funlockfile (stderr); + + free (buf); + } +#endif + } + d->__nextchar = (char *) ""; + d->optind++; + d->optopt = 0; + return '?'; + } + } + + /* Look at and handle the next short option-character. */ + + { + char c = *d->__nextchar++; + char *temp = strchr (optstring, c); + + /* Increment `optind' when we start to process its last character. */ + if (*d->__nextchar == '\0') + ++d->optind; + + if (temp == NULL || c == ':') + { + if (print_errors) + { +#if defined _LIBC && defined USE_IN_LIBIO + char *buf; + int n; +#endif + + if (d->__posixly_correct) + { + /* 1003.2 specifies the format of this message. */ +#if defined _LIBC && defined USE_IN_LIBIO + n = __asprintf (&buf, _("%s: illegal option -- %c\n"), + argv[0], c); +#else + fprintf (stderr, _("%s: illegal option -- %c\n"), argv[0], c); +#endif + } + else + { +#if defined _LIBC && defined USE_IN_LIBIO + n = __asprintf (&buf, _("%s: invalid option -- %c\n"), + argv[0], c); +#else + fprintf (stderr, _("%s: invalid option -- %c\n"), argv[0], c); +#endif + } + +#if defined _LIBC && defined USE_IN_LIBIO + if (n >= 0) + { + _IO_flockfile (stderr); + + int old_flags2 = ((_IO_FILE *) stderr)->_flags2; + ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; + + if (_IO_fwide (stderr, 0) > 0) + __fwprintf (stderr, L"%s", buf); + else + fputs (buf, stderr); + + ((_IO_FILE *) stderr)->_flags2 = old_flags2; + _IO_funlockfile (stderr); + + free (buf); + } +#endif + } + d->optopt = c; + return '?'; + } + /* Convenience. Treat POSIX -W foo same as long option --foo */ + if (temp[0] == 'W' && temp[1] == ';') + { + char *nameend; + const struct option *p; + const struct option *pfound = NULL; + int exact = 0; + int ambig = 0; + int indfound = 0; + int option_index; + + /* This is an option that requires an argument. */ + if (*d->__nextchar != '\0') + { + d->optarg = d->__nextchar; + /* If we end this ARGV-element by taking the rest as an arg, + we must advance to the next element now. */ + d->optind++; + } + else if (d->optind == argc) + { + if (print_errors) + { + /* 1003.2 specifies the format of this message. */ +#if defined _LIBC && defined USE_IN_LIBIO + char *buf; + + if (__asprintf (&buf, + _("%s: option requires an argument -- %c\n"), + argv[0], c) >= 0) + { + _IO_flockfile (stderr); + + int old_flags2 = ((_IO_FILE *) stderr)->_flags2; + ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; + + if (_IO_fwide (stderr, 0) > 0) + __fwprintf (stderr, L"%s", buf); + else + fputs (buf, stderr); + + ((_IO_FILE *) stderr)->_flags2 = old_flags2; + _IO_funlockfile (stderr); + + free (buf); + } +#else + fprintf (stderr, _("%s: option requires an argument -- %c\n"), + argv[0], c); +#endif + } + d->optopt = c; + if (optstring[0] == ':') + c = ':'; + else + c = '?'; + return c; + } + else + /* We already incremented `d->optind' once; + increment it again when taking next ARGV-elt as argument. */ + d->optarg = argv[d->optind++]; + + /* optarg is now the argument, see if it's in the + table of longopts. */ + + for (d->__nextchar = nameend = d->optarg; *nameend && *nameend != '='; + nameend++) + /* Do nothing. */ ; + + /* Test all long options for either exact match + or abbreviated matches. */ + for (p = longopts, option_index = 0; p->name; p++, option_index++) + if (!strncmp (p->name, d->__nextchar, nameend - d->__nextchar)) + { + if ((unsigned int) (nameend - d->__nextchar) == + strlen (p->name)) + { + /* Exact match found. */ + pfound = p; + indfound = option_index; + exact = 1; + break; + } + else if (pfound == NULL) + { + /* First nonexact match found. */ + pfound = p; + indfound = option_index; + } + else + /* Second or later nonexact match found. */ + ambig = 1; + } + if (ambig && !exact) + { + if (print_errors) + { +#if defined _LIBC && defined USE_IN_LIBIO + char *buf; + + if (__asprintf (&buf, _("%s: option `-W %s' is ambiguous\n"), + argv[0], argv[d->optind]) >= 0) + { + _IO_flockfile (stderr); + + int old_flags2 = ((_IO_FILE *) stderr)->_flags2; + ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; + + if (_IO_fwide (stderr, 0) > 0) + __fwprintf (stderr, L"%s", buf); + else + fputs (buf, stderr); + + ((_IO_FILE *) stderr)->_flags2 = old_flags2; + _IO_funlockfile (stderr); + + free (buf); + } +#else + fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"), + argv[0], argv[d->optind]); +#endif + } + d->__nextchar += strlen (d->__nextchar); + d->optind++; + return '?'; + } + if (pfound != NULL) + { + option_index = indfound; + if (*nameend) + { + /* Don't test has_arg with >, because some C compilers don't + allow it to be used on enums. */ + if (pfound->has_arg) + d->optarg = nameend + 1; + else + { + if (print_errors) + { +#if defined _LIBC && defined USE_IN_LIBIO + char *buf; + + if (__asprintf (&buf, _("\ +%s: option `-W %s' doesn't allow an argument\n"), argv[0], pfound->name) >= 0) + { + _IO_flockfile (stderr); + + int old_flags2 = ((_IO_FILE *) stderr)->_flags2; + ((_IO_FILE *) stderr)->_flags2 + |= _IO_FLAGS2_NOTCANCEL; + + if (_IO_fwide (stderr, 0) > 0) + __fwprintf (stderr, L"%s", buf); + else + fputs (buf, stderr); + + ((_IO_FILE *) stderr)->_flags2 = old_flags2; + _IO_funlockfile (stderr); + + free (buf); + } +#else + fprintf (stderr, _("\ +%s: option `-W %s' doesn't allow an argument\n"), argv[0], pfound->name); +#endif + } + + d->__nextchar += strlen (d->__nextchar); + return '?'; + } + } + else if (pfound->has_arg == 1) + { + if (d->optind < argc) + d->optarg = argv[d->optind++]; + else + { + if (print_errors) + { +#if defined _LIBC && defined USE_IN_LIBIO + char *buf; + + if (__asprintf (&buf, _("\ +%s: option `%s' requires an argument\n"), argv[0], argv[d->optind - 1]) >= 0) + { + _IO_flockfile (stderr); + + int old_flags2 = ((_IO_FILE *) stderr)->_flags2; + ((_IO_FILE *) stderr)->_flags2 + |= _IO_FLAGS2_NOTCANCEL; + + if (_IO_fwide (stderr, 0) > 0) + __fwprintf (stderr, L"%s", buf); + else + fputs (buf, stderr); + + ((_IO_FILE *) stderr)->_flags2 = old_flags2; + _IO_funlockfile (stderr); + + free (buf); + } +#else + fprintf (stderr, + _("%s: option `%s' requires an argument\n"), + argv[0], argv[d->optind - 1]); +#endif + } + d->__nextchar += strlen (d->__nextchar); + return optstring[0] == ':' ? ':' : '?'; + } + } + d->__nextchar += strlen (d->__nextchar); + if (longind != NULL) + *longind = option_index; + if (pfound->flag) + { + *(pfound->flag) = pfound->val; + return 0; + } + return pfound->val; + } + d->__nextchar = NULL; + return 'W'; /* Let the application handle it. */ + } + if (temp[1] == ':') + { + if (temp[2] == ':') + { + /* This is an option that accepts an argument optionally. */ + if (*d->__nextchar != '\0') + { + d->optarg = d->__nextchar; + d->optind++; + } + else + d->optarg = NULL; + d->__nextchar = NULL; + } + else + { + /* This is an option that requires an argument. */ + if (*d->__nextchar != '\0') + { + d->optarg = d->__nextchar; + /* If we end this ARGV-element by taking the rest as an arg, + we must advance to the next element now. */ + d->optind++; + } + else if (d->optind == argc) + { + if (print_errors) + { + /* 1003.2 specifies the format of this message. */ +#if defined _LIBC && defined USE_IN_LIBIO + char *buf; + + if (__asprintf (&buf, _("\ +%s: option requires an argument -- %c\n"), argv[0], c) >= 0) + { + _IO_flockfile (stderr); + + int old_flags2 = ((_IO_FILE *) stderr)->_flags2; + ((_IO_FILE *) stderr)->_flags2 |= + _IO_FLAGS2_NOTCANCEL; + + if (_IO_fwide (stderr, 0) > 0) + __fwprintf (stderr, L"%s", buf); + else + fputs (buf, stderr); + + ((_IO_FILE *) stderr)->_flags2 = old_flags2; + _IO_funlockfile (stderr); + + free (buf); + } +#else + fprintf (stderr, + _("%s: option requires an argument -- %c\n"), + argv[0], c); +#endif + } + d->optopt = c; + if (optstring[0] == ':') + c = ':'; + else + c = '?'; + } + else + /* We already incremented `optind' once; + increment it again when taking next ARGV-elt as argument. */ + d->optarg = argv[d->optind++]; + d->__nextchar = NULL; + } + } + return c; + } +} + +int +_getopt_internal ( + int argc, + char *const *argv, + const char *optstring, + const struct option *longopts, + int *longind, + int long_only +) +{ + int result; + + getopt_data.optind = optind; + getopt_data.opterr = opterr; + + result = _getopt_internal_r (argc, argv, optstring, longopts, + longind, long_only, &getopt_data); + + optind = getopt_data.optind; + optarg = getopt_data.optarg; + optopt = getopt_data.optopt; + + return result; +} + +int +getopt ( + int argc, + char *const *argv, + const char *optstring +) +{ + return _getopt_internal (argc, argv, optstring, + (const struct option *) 0, (int *) 0, 0); +} + +#endif /* Not ELIDE_CODE. */ + +#ifdef TEST + +/* Compile with -DTEST to make an executable for use in testing + the above definition of `getopt'. */ + +int +main ( + int argc, + char **argv +) +{ + int c; + int digit_optind = 0; + + while (1) + { + int this_option_optind = optind ? optind : 1; + + c = getopt (argc, argv, "abc:d:0123456789"); + if (c == -1) + break; + + switch (c) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + if (digit_optind != 0 && digit_optind != this_option_optind) + printf ("digits occur in two different argv-elements.\n"); + digit_optind = this_option_optind; + printf ("option %c\n", c); + break; + + case 'a': + printf ("option a\n"); + break; + + case 'b': + printf ("option b\n"); + break; + + case 'c': + printf ("option c with value `%s'\n", optarg); + break; + + case '?': + break; + + default: + printf ("?? getopt returned character code 0%o ??\n", c); + } + } + + if (optind < argc) + { + printf ("non-option ARGV-elements: "); + while (optind < argc) + printf ("%s ", argv[optind++]); + printf ("\n"); + } + + exit (0); +} + +#endif /* TEST */ diff --git a/bin/getopt.h b/bin/getopt.h new file mode 100644 index 0000000..48ccab4 --- /dev/null +++ b/bin/getopt.h @@ -0,0 +1,187 @@ +/* Declarations for getopt. + Copyright (C) 1989-1994,1996-1999,2001,2003,2004 + Free Software Foundation, Inc. + This file is part of the GNU C Library. + + This program 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 2, or (at your option) + any later version. + + This program 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 this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifndef _GETOPT_H + +#ifndef __need_getopt +# define _GETOPT_H 1 +#endif + +/* If __GNU_LIBRARY__ is not already defined, either we are being used + standalone, or this is the first header included in the source file. + If we are being used with glibc, we need to include <features.h>, but + that does not exist if we are standalone. So: if __GNU_LIBRARY__ is + not defined, include <ctype.h>, which will pull in <features.h> for us + if it's from glibc. (Why ctype.h? It's guaranteed to exist and it + doesn't flood the namespace with stuff the way some other headers do.) */ +#if !defined __GNU_LIBRARY__ +# include <ctype.h> +#endif + +#ifndef __THROW +# ifndef __GNUC_PREREQ +# define __GNUC_PREREQ(maj, min) (0) +# endif +# if defined __cplusplus && __GNUC_PREREQ (2,8) +# define __THROW throw () +# else +# define __THROW +# endif +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* For communication from `getopt' to the caller. + When `getopt' finds an option that takes an argument, + the argument value is returned here. + Also, when `ordering' is RETURN_IN_ORDER, + each non-option ARGV-element is returned here. */ + + extern char *optarg; + +/* Index in ARGV of the next element to be scanned. + This is used for communication to and from the caller + and for communication between successive calls to `getopt'. + + On entry to `getopt', zero means this is the first call; initialize. + + When `getopt' returns -1, this is the index of the first of the + non-option elements that the caller should itself scan. + + Otherwise, `optind' communicates from one call to the next + how much of ARGV has been scanned so far. */ + + extern int optind; + +/* Callers store zero here to inhibit the error message `getopt' prints + for unrecognized options. */ + + extern int opterr; + +/* Set to an option character which was unrecognized. */ + + extern int optopt; + +#ifndef __need_getopt +/* Describe the long-named options requested by the application. + The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector + of `struct option' terminated by an element containing a name which is + zero. + + The field `has_arg' is: + no_argument (or 0) if the option does not take an argument, + required_argument (or 1) if the option requires an argument, + optional_argument (or 2) if the option takes an optional argument. + + If the field `flag' is not NULL, it points to a variable that is set + to the value given in the field `val' when the option is found, but + left unchanged if the option is not found. + + To have a long-named option do something other than set an `int' to + a compiled-in constant, such as set a value from `optarg', set the + option's `flag' field to zero and its `val' field to a nonzero + value (the equivalent single-letter option character, if there is + one). For long options that have a zero `flag' field, `getopt' + returns the contents of the `val' field. */ + + struct option + { + const char *name; + /* has_arg can't be an enum because some compilers complain about + type mismatches in all the code that assumes it is an int. */ + int has_arg; + int *flag; + int val; + }; + +/* Names for the values of the `has_arg' field of `struct option'. */ + +# define no_argument 0 +# define required_argument 1 +# define optional_argument 2 +#endif /* need getopt */ + + +/* Get definitions and prototypes for functions to process the + arguments in ARGV (ARGC of them, minus the program name) for + options given in OPTS. + + Return the option character from OPTS just read. Return -1 when + there are no more options. For unrecognized options, or options + missing arguments, `optopt' is set to the option letter, and '?' is + returned. + + The OPTS string is a list of characters which are recognized option + letters, optionally followed by colons, specifying that that letter + takes an argument, to be placed in `optarg'. + + If a letter in OPTS is followed by two colons, its argument is + optional. This behavior is specific to the GNU `getopt'. + + The argument `--' causes premature termination of argument + scanning, explicitly telling `getopt' that there are no more + options. + + If OPTS begins with `--', then non-option arguments are treated as + arguments to the option '\0'. This behavior is specific to the GNU + `getopt'. */ + +#ifdef __GNU_LIBRARY__ +/* Many other libraries have conflicting prototypes for getopt, with + differences in the consts, in stdlib.h. To avoid compilation + errors, only prototype getopt for the GNU C library. */ + extern int getopt ( + int ___argc, + char *const *___argv, + const char *__shortopts + ) __THROW; +#else /* not __GNU_LIBRARY__ */ + extern int getopt ( + ); +#endif /* __GNU_LIBRARY__ */ + +#ifndef __need_getopt + extern int getopt_long ( + int ___argc, + char *const *___argv, + const char *__shortopts, + const struct option *__longopts, + int *__longind + ) __THROW; + extern int getopt_long_only ( + int ___argc, + char *const *___argv, + const char *__shortopts, + const struct option *__longopts, + int *__longind + ) __THROW; + +#endif + +#ifdef __cplusplus +} +#endif + +/* Make sure we later can get all the definitions and declarations. */ +#undef __need_getopt + +#endif /* getopt.h */ diff --git a/bin/getopt1.c b/bin/getopt1.c new file mode 100644 index 0000000..656d556 --- /dev/null +++ b/bin/getopt1.c @@ -0,0 +1,213 @@ +/* getopt_long and getopt_long_only entry points for GNU getopt. + Copyright (C) 1987,88,89,90,91,92,93,94,96,97,98,2004 + Free Software Foundation, Inc. + This file is part of the GNU C Library. + + This program 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 2, or (at your option) + any later version. + + This program 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 this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#ifdef _LIBC +# include <getopt.h> +#else +# include "getopt.h" +#endif +#include "getopt_int.h" + +#include <stdio.h> + +/* Comment out all this code if we are using the GNU C Library, and are not + actually compiling the library itself. This code is part of the GNU C + Library, but also included in many other GNU distributions. Compiling + and linking in this code is a waste when using the GNU C library + (especially if it is a shared library). Rather than having every GNU + program understand `configure --with-gnu-libc' and omit the object files, + it is simpler to just do this in the source for each such file. */ + +#define GETOPT_INTERFACE_VERSION 2 +#if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2 +#include <gnu-versions.h> +#if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION +#define ELIDE_CODE +#endif +#endif + +#ifndef ELIDE_CODE + + +/* This needs to come after some library #include + to get __GNU_LIBRARY__ defined. */ +#ifdef __GNU_LIBRARY__ +#include <stdlib.h> +#endif + +#ifndef NULL +#define NULL 0 +#endif + +int +getopt_long ( + int argc, + char *const *argv, + const char *options, + const struct option *long_options, + int *opt_index +) +{ + return _getopt_internal (argc, argv, options, long_options, opt_index, 0); +} + +int +_getopt_long_r ( + int argc, + char *const *argv, + const char *options, + const struct option *long_options, + int *opt_index, + struct _getopt_data *d +) +{ + return _getopt_internal_r (argc, argv, options, long_options, opt_index, + 0, d); +} + +/* Like getopt_long, but '-' as well as '--' can indicate a long option. + If an option that starts with '-' (not '--') doesn't match a long option, + but does match a short option, it is parsed as a short option + instead. */ + +int +getopt_long_only ( + int argc, + char *const *argv, + const char *options, + const struct option *long_options, + int *opt_index +) +{ + return _getopt_internal (argc, argv, options, long_options, opt_index, 1); +} + +int +_getopt_long_only_r ( + int argc, + char *const *argv, + const char *options, + const struct option *long_options, + int *opt_index, + struct _getopt_data *d +) +{ + return _getopt_internal_r (argc, argv, options, long_options, opt_index, + 1, d); +} + +#endif /* Not ELIDE_CODE. */ + +#ifdef TEST + +#include <stdio.h> + +int +main ( + int argc, + char **argv +) +{ + int c; + int digit_optind = 0; + + while (1) + { + int this_option_optind = optind ? optind : 1; + int option_index = 0; + static struct option long_options[] = { + {"add", 1, 0, 0}, + {"append", 0, 0, 0}, + {"delete", 1, 0, 0}, + {"verbose", 0, 0, 0}, + {"create", 0, 0, 0}, + {"file", 1, 0, 0}, + {0, 0, 0, 0} + }; + + c = getopt_long (argc, argv, "abc:d:0123456789", + long_options, &option_index); + if (c == -1) + break; + + switch (c) + { + case 0: + printf ("option %s", long_options[option_index].name); + if (optarg) + printf (" with arg %s", optarg); + printf ("\n"); + break; + + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + if (digit_optind != 0 && digit_optind != this_option_optind) + printf ("digits occur in two different argv-elements.\n"); + digit_optind = this_option_optind; + printf ("option %c\n", c); + break; + + case 'a': + printf ("option a\n"); + break; + + case 'b': + printf ("option b\n"); + break; + + case 'c': + printf ("option c with value `%s'\n", optarg); + break; + + case 'd': + printf ("option d with value `%s'\n", optarg); + break; + + case '?': + break; + + default: + printf ("?? getopt returned character code 0%o ??\n", c); + } + } + + if (optind < argc) + { + printf ("non-option ARGV-elements: "); + while (optind < argc) + printf ("%s ", argv[optind++]); + printf ("\n"); + } + + exit (0); +} + +#endif /* TEST */ diff --git a/bin/getopt_int.h b/bin/getopt_int.h new file mode 100644 index 0000000..d3da519 --- /dev/null +++ b/bin/getopt_int.h @@ -0,0 +1,145 @@ +/* Internal declarations for getopt. + Copyright (C) 1989-1994,1996-1999,2001,2003,2004 + Free Software Foundation, Inc. + This file is part of the GNU C Library. + + This program 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 2, or (at your option) + any later version. + + This program 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 this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifndef _GETOPT_INT_H +#define _GETOPT_INT_H 1 + +extern int _getopt_internal ( + int ___argc, + char *const *___argv, + const char *__shortopts, + const struct option *__longopts, + int *__longind, + int __long_only +); + + +/* Reentrant versions which can handle parsing multiple argument + vectors at the same time. */ + +/* Data type for reentrant functions. */ +struct _getopt_data +{ + /* These have exactly the same meaning as the corresponding global + variables, except that they are used for the reentrant + versions of getopt. */ + int optind; + int opterr; + int optopt; + char *optarg; + + /* Internal members. */ + + /* True if the internal members have been initialized. */ + int __initialized; + + /* The next char to be scanned in the option-element + in which the last option character we returned was found. + This allows us to pick up the scan where we left off. + + If this is zero, or a null string, it means resume the scan + by advancing to the next ARGV-element. */ + char *__nextchar; + + /* Describe how to deal with options that follow non-option ARGV-elements. + + If the caller did not specify anything, + the default is REQUIRE_ORDER if the environment variable + POSIXLY_CORRECT is defined, PERMUTE otherwise. + + REQUIRE_ORDER means don't recognize them as options; + stop option processing when the first non-option is seen. + This is what Unix does. + This mode of operation is selected by either setting the environment + variable POSIXLY_CORRECT, or using `+' as the first character + of the list of option characters. + + PERMUTE is the default. We permute the contents of ARGV as we + scan, so that eventually all the non-options are at the end. + This allows options to be given in any order, even with programs + that were not written to expect this. + + RETURN_IN_ORDER is an option available to programs that were + written to expect options and other ARGV-elements in any order + and that care about the ordering of the two. We describe each + non-option ARGV-element as if it were the argument of an option + with character code 1. Using `-' as the first character of the + list of option characters selects this mode of operation. + + The special argument `--' forces an end of option-scanning regardless + of the value of `ordering'. In the case of RETURN_IN_ORDER, only + `--' can cause `getopt' to return -1 with `optind' != ARGC. */ + + enum + { + REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER + } __ordering; + + /* If the POSIXLY_CORRECT environment variable is set. */ + int __posixly_correct; + + + /* Handle permutation of arguments. */ + + /* Describe the part of ARGV that contains non-options that have + been skipped. `first_nonopt' is the index in ARGV of the first + of them; `last_nonopt' is the index after the last of them. */ + + int __first_nonopt; + int __last_nonopt; + +#if defined _LIBC && defined USE_NONOPTION_FLAGS + int __nonoption_flags_max_len; + int __nonoption_flags_len; +# endif +}; + +/* The initializer is necessary to set OPTIND and OPTERR to their + default values and to clear the initialization flag. */ +#define _GETOPT_DATA_INITIALIZER { 1, 1 } + +extern int _getopt_internal_r ( + int ___argc, + char *const *___argv, + const char *__shortopts, + const struct option *__longopts, + int *__longind, + int __long_only, + struct _getopt_data *__data +); + +extern int _getopt_long_r ( + int ___argc, + char *const *___argv, + const char *__shortopts, + const struct option *__longopts, + int *__longind, + struct _getopt_data *__data +); + +extern int _getopt_long_only_r ( + int ___argc, + char *const *___argv, + const char *__shortopts, + const struct option *__longopts, + int *__longind, + struct _getopt_data *__data +); + +#endif /* getopt_int.h */ diff --git a/bootstrap b/bootstrap new file mode 100755 index 0000000..698da99 --- /dev/null +++ b/bootstrap @@ -0,0 +1,110 @@ +#! /bin/sh +############################################################################## +# $Id: bootstrap,v 1.1 2004-04-25 18:47:56 behdad Exp $ +# $Author: behdad +# $Date: 2004-04-25 18:47:56 $ +# $Revision: 1.1 $ +# $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/bootstrap,v $ +############################################################################## +# -*- Bootstrap -*- +# Run this file to produce a configure script. + +DEFAULTARGS="--force --install --autoreconf=auto" + +for arg in $DEFAULTARGS $* +do + case $arg in + -h | --help) + HELP=--help ;; + -V | --version) + VERSION=--version ;; + -v | --verbose) + VERBOSE=--verbose ;; + -d | --debug) + DEBUG=--debug ;; + -W | --warning | --warnings=yes) + WARNINGS=--warnings=all ;; + --no-warning | --warnings=no) + WARNINGS= ;; + --warning=*) + WARNINGS=$arg ;; + -f | --force | --force=yes | --force-missing) + FORCE=--force ;; + --no-force | --force=no) + FORCE=--no-force ;; + -i | --install | --install=yes | -a | --add-missing) + INSTALL=--install ;; + --no-install | --install=no) + INSTALL= ;; + -s | --symlink | --symlink=yes | --no-copy | --copy=no) + SYMLINK=--symlink ;; + --no-symlink | --symlink=no | --copy | --copy=yes) + SYMLINK= ;; + -m | --make | --make=yes) + MAKE=--make ;; + --no-make | --make=no) + MAKE= ;; + -n | --dry-run) + DRYRUN=echo ;; + --autoreconf=auto) + AUTORECONF=auto ;; + --autoreconf | --autoreconf=yes) + AUTORECONF=yes ;; + --no-autoreconf | --autoreconf=no) + AUTORECONF= ;; + *) + echo Ignoring unknown parameter $arg + esac +done + +test -z "$SYMLINK" && COPY=--copy +test -n "$INSTALL" && ADDMISSING=--add-missing + +# use autoreconf if possible, just check for version 2+ +if test "$AUTORECONF" = auto; then + case `autoreconf --version 2>/dev/null` in + *"autoreconf (GNU Autoconf) 2."* ) + echo Usable autoreconf found, running + ;; + *) + AUTORECONF= + ;; + esac +fi + +if test -n "$AUTORECONF"; then + $DRYRUN autoreconf $HELP $VERSION $VERBOSE $DEBUG $FORCE $INSTALL $SYMLINK $MAKE $WARNINGS + exit $? +fi + +# add files 'config.guess', 'config.sub', 'ltconfig', 'ltmain.sh' +$DRYRUN libtoolize $HELP $VERSION --automake $COPY $DEBUG $FORCE || exit 1 + +# generate 'aclocal.m4' +if test -f configure.ac -o configure.in; then + $DRYRUN aclocal $HELP $VERSION $VERBOSE $FORCE || exit 1 +fi + +# generate 'config.h.in' +if test -f configure.ac -o configure.in; then + $DRYRUN autoheader $HELP $VERSION $VERBOSE $DEBUG $FORCE $WARNINGS || exit 1 +fi + +# generate Makefile.in's from Makefile.am's +if test -f Makefile.am; then + $DRYRUN automake $HELP $VERSION $VERBOSE $ADDMISSING $COPY $FORCE $WARNINGS || exit 1 +fi + +# generate configure from configure.ac +if test -f configure.ac -o -f configure.in; then + $DRYRUN autoconf $HELP $VERSION $VERBOSE $DEBUG $FORCE $WARNINGS || exit 1 +fi + +if test -n "$MAKE"; then + if test -f ./configure; then + $DRYRUN ./configure $HELP $VERSION || exit 1 + fi + if test -f Makefile; then + $DRYRUN make || exit 1 + fi +fi diff --git a/charset/Headers.mk b/charset/Headers.mk new file mode 100644 index 0000000..2f6fb29 --- /dev/null +++ b/charset/Headers.mk @@ -0,0 +1,9 @@ +libfribidi_char_sets_la_headers = \ + fribidi-char-sets-cap-rtl.h \ + fribidi-char-sets-cp1255.h \ + fribidi-char-sets-cp1256.h \ + fribidi-char-sets.h \ + fribidi-char-sets-iso8859-6.h \ + fribidi-char-sets-iso8859-8.h \ + fribidi-char-sets-list.h \ + fribidi-char-sets-utf8.h diff --git a/charset/Makefile.am b/charset/Makefile.am new file mode 100644 index 0000000..0c7004f --- /dev/null +++ b/charset/Makefile.am @@ -0,0 +1,48 @@ +noinst_LTLIBRARIES = libfribidi-char-sets.la + +AM_CPPFLAGS = \ + -I$(top_builddir)/lib \ + -I$(top_srcdir)/lib \ + $(GLIB_CFLAGS) + +pkginclude_HEADERS = + +libfribidi_char_sets_la_LDFLAGS = +libfribidi_char_sets_la_LIBADD = + +if FRIBIDI_CHARSETS + +if PLATFORM_WIN32 +no_undefined = -no-undefined +endif # PLATFORM_WIN32 + +libfribidi_char_sets_la_LDFLAGS += $(no_undefined) +libfribidi_char_sets_la_LIBADD += $(GLIB_LIBS) + +if OS_WIN32 +libfribidi_char_sets_la_LDFLAGS += -export-symbols +endif # OS_WIN32 + +include Headers.mk +pkginclude_HEADERS += $(libfribidi_char_sets_la_headers) + +else # !FRIBIDI_CHARSETS + +libfribidi_char_sets_la_LDFLAGS += -static + +endif # !FRIBIDI_CHARSETS + +libfribidi_char_sets_la_SOURCES = \ + fribidi-char-sets-cap-rtl.c \ + fribidi-char-sets-cp1255.c \ + fribidi-char-sets-cp1256.c \ + fribidi-char-sets.c \ + fribidi-char-sets-iso8859-6.c \ + fribidi-char-sets-iso8859-8.c \ + fribidi-char-sets-utf8.c + +$(top_builddir)/config.h: $(top_srcdir)/config.h.in + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) config.h + +$(top_builddir)/lib/fribidi-config.h: $(top_srcdir)/lib/fribidi-config.h.in + cd $(top_builddir)/lib && $(MAKE) $(AM_MAKEFLAGS) fribidi-config.h diff --git a/charset/fribidi-char-sets-cap-rtl.c b/charset/fribidi-char-sets-cap-rtl.c new file mode 100644 index 0000000..9fb46ea --- /dev/null +++ b/charset/fribidi-char-sets-cap-rtl.c @@ -0,0 +1,336 @@ +/* FriBidi + * fribidi-char-sets-cap-rtl.c - CapRTL character set conversion routines + * + * $Id: fribidi-char-sets-cap-rtl.c,v 1.1 2004-04-25 18:47:57 behdad Exp $ + * $Author: behdad $ + * $Date: 2004-04-25 18:47:57 $ + * $Revision: 1.1 $ + * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/charset/fribidi-char-sets-cap-rtl.c,v $ + * + * Authors: + * Behdad Esfahbod, 2001, 2002, 2004 + * Dov Grobgeld, 1999, 2000 + * + * Copyright (C) 2004 Sharif FarsiWeb, Inc + * Copyright (C) 2001,2002 Behdad Esfahbod + * Copyright (C) 1999,2000 Dov Grobgeld + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library, in a file named COPYING; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA + * + * For licensing issues, contact <license@farsiweb.info>. + */ + +#include <fribidi-char-sets-cap-rtl.h> + +#include <fribidi-unicode.h> +#include <fribidi-mirroring.h> +#include <fribidi-bidi-type.h> + +#include <common.h> +#include <bidi-types.h> + +#include <stdio.h> + +#define WS FRIBIDI_PROP_TYPE_WS +#define BS FRIBIDI_PROP_TYPE_BS +#define EO FRIBIDI_PROP_TYPE_EO +#define CTL FRIBIDI_PROP_TYPE_CTL +#define LRE FRIBIDI_PROP_TYPE_LRE +#define RLE FRIBIDI_PROP_TYPE_RLE +#define ES FRIBIDI_PROP_TYPE_ES +#define LRO FRIBIDI_PROP_TYPE_LRO +#define RLO FRIBIDI_PROP_TYPE_RLO +#define AL FRIBIDI_PROP_TYPE_AL +#define SS FRIBIDI_PROP_TYPE_SS +#define ET FRIBIDI_PROP_TYPE_ET +#define NSM FRIBIDI_PROP_TYPE_NSM +#define LTR FRIBIDI_PROP_TYPE_LTR +#define ON FRIBIDI_PROP_TYPE_ON +#define AN FRIBIDI_PROP_TYPE_AN +#define BN FRIBIDI_PROP_TYPE_BN +#define RTL FRIBIDI_PROP_TYPE_RTL +#define CS FRIBIDI_PROP_TYPE_CS +#define PDF FRIBIDI_PROP_TYPE_PDF +#define EN FRIBIDI_PROP_TYPE_EN + +static FriBidiPropCharType CapRTLCharTypes[] = { +/* *INDENT-OFF* */ + ON, ON, ON, ON, LTR,RTL,ON, ON, ON, ON, ON, ON, ON, BS, RLO,RLE, /* 00-0f */ + LRO,LRE,PDF,WS, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, /* 10-1f */ + WS, ON, ON, ON, ET, ON, ON, ON, ON, ON, ON, ET, CS, ON, ES, ES, /* 20-2f */ + EN, EN, EN, EN, EN, EN, AN, AN, AN, AN, CS, ON, ON, ON, ON, ON, /* 30-3f */ + RTL,AL, AL, AL, AL, AL, AL, RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL, /* 40-4f */ + RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,ON, BS, ON, ON, ON, /* 50-5f */ + NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, /* 60-6f */ + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,ON, SS, ON, WS, ON, /* 70-7f */ +/* *INDENT-ON* */ +}; + +#undef WS +#undef BS +#undef EO +#undef CTL +#undef LRE +#undef RLE +#undef ES +#undef LRO +#undef RLO +#undef AL +#undef SS +#undef ET +#undef NSM +#undef LTR +#undef ON +#undef AN +#undef BN +#undef RTL +#undef CS +#undef PDF +#undef EN + +#define CAPRTL_CHARS (sizeof CapRTLCharTypes / sizeof CapRTLCharTypes[0]) + +static FriBidiChar *caprtl_to_unicode = NULL; + +static void +init_cap_rtl ( + void +) +{ + int request[_FRIBIDI_PROP_TYPES_COUNT + 1]; + int i, count; + + caprtl_to_unicode = + (FriBidiChar *) fribidi_malloc (CAPRTL_CHARS * + sizeof caprtl_to_unicode[0]); + for (i = 0; i < _FRIBIDI_PROP_TYPES_COUNT; i++) + request[i] = 0; + for (i = 0; i < CAPRTL_CHARS; i++) + if (fribidi_get_mirror_char (i, NULL)) + caprtl_to_unicode[i] = i; + for (count = 0, i = 0; i < CAPRTL_CHARS; i++) + if (caprtl_to_unicode[i] == 0) + { + request[(unsigned char) CapRTLCharTypes[i]]++; + count++; + } + for (i = 1; i < 0x10000 && count; i++) /* Assign BMP chars to CapRTL entries */ + if (!fribidi_get_mirror_char (i, NULL)) + { + int j, k; + for (j = 0; j < _FRIBIDI_PROP_TYPES_COUNT; j++) + if (fribidi_prop_to_type_[j] == fribidi_get_bidi_type (i)) + break; + if (!request[j]) /* Do not need this type */ + continue; + for (k = 0; k < CAPRTL_CHARS; k++) + if (!caprtl_to_unicode[k] && j == CapRTLCharTypes[k]) + break; + if (k < CAPRTL_CHARS) + { + request[j]--; + count--; + caprtl_to_unicode[k] = i; + } + } +} + +static char +fribidi_unicode_to_cap_rtl_c ( + /* input */ + FriBidiChar uch +) +{ + int i; + + if (!caprtl_to_unicode) + init_cap_rtl (); + + for (i = 0; i < CAPRTL_CHARS; i++) + if (uch == caprtl_to_unicode[i]) + return (char) i; + return '?'; +} + +FriBidiStrIndex +fribidi_cap_rtl_to_unicode ( + /* input */ + const char *s, + FriBidiStrIndex len, + /* output */ + FriBidiChar *us +) +{ + FriBidiStrIndex i, j; + + if (!caprtl_to_unicode) + init_cap_rtl (); + + j = 0; + for (i = 0; i < len; i++) + { + char ch; + + ch = s[i]; + if (ch == '_') + { + switch (ch = s[++i]) + { + case '>': + us[j++] = FRIBIDI_CHAR_LRM; + break; + case '<': + us[j++] = FRIBIDI_CHAR_RLM; + break; + case 'l': + us[j++] = FRIBIDI_CHAR_LRE; + break; + case 'r': + us[j++] = FRIBIDI_CHAR_RLE; + break; + case 'o': + us[j++] = FRIBIDI_CHAR_PDF; + break; + case 'L': + us[j++] = FRIBIDI_CHAR_LRO; + break; + case 'R': + us[j++] = FRIBIDI_CHAR_RLO; + break; + case '_': + us[j++] = '_'; + break; + default: + us[j++] = '_'; + i--; + break; + } + } + else + us[j++] = caprtl_to_unicode[(int) s[i]]; + } + + return j; +} + +FriBidiStrIndex +fribidi_unicode_to_cap_rtl ( + /* input */ + const FriBidiChar *us, + int len, + /* output */ + char *s +) +{ + int i, j; + + j = 0; + for (i = 0; i < len; i++) + { + FriBidiChar ch = us[i]; + if (!FRIBIDI_IS_EXPLICIT (fribidi_get_type (ch)) && ch != '_' + && ch != FRIBIDI_CHAR_LRM && ch != FRIBIDI_CHAR_RLM) + s[j++] = fribidi_unicode_to_cap_rtl_c (ch); + else + { + s[j++] = '_'; + switch (ch) + { + case FRIBIDI_CHAR_LRM: + s[j++] = '>'; + break; + case FRIBIDI_CHAR_RLM: + s[j++] = '<'; + break; + case FRIBIDI_CHAR_LRE: + s[j++] = 'l'; + break; + case FRIBIDI_CHAR_RLE: + s[j++] = 'r'; + break; + case FRIBIDI_CHAR_PDF: + s[j++] = 'o'; + break; + case FRIBIDI_CHAR_LRO: + s[j++] = 'L'; + break; + case FRIBIDI_CHAR_RLO: + s[j++] = 'R'; + break; + case '_': + s[j++] = '_'; + break; + default: + j--; + if (ch < 256) + s[j++] = fribidi_unicode_to_cap_rtl_c (ch); + else + s[j++] = '?'; + break; + } + } + } + s[j] = 0; + + return j; +} + +const char * +fribidi_char_set_desc_cap_rtl ( + void +) +{ + static char *s = 0; + int l, i, j; + + if (s) + return s; + + l = 10000; + s = (char *) fribidi_malloc (l); + i = 0; + i += sprintf (s + i, /*l - i, */ + "CapRTL is a character set for testing with the reference\n" + "implementation, with explicit marks escape strings, and\n" + "the property that contains all unicode character types in\n" + "ASCII range 1-127.\n" + "\n" + "Warning: CapRTL character types are subject to change.\n" + "\n" "CapRTL's character types:\n"); + for (j = 0; j < CAPRTL_CHARS; j++) + { + if (j % 4 == 0) + s[i++] = '\n'; + i += sprintf (s + i, /*l - i, */ " * 0x%02x %c%c %-3s ", j, + j < 0x20 ? '^' : ' ', + j < 0x20 ? j + '@' : j < 0x7f ? j : ' ', + fribidi_type_name (fribidi_prop_to_type_ + [(unsigned char) CapRTLCharTypes[j]])); + } + i += sprintf (s + i, /*l - i, */ + "\n\n" + "Escape sequences:\n" + " Character `_' is used to escape explicit marks. The list is:\n" + " * _> LRM\n" " * _< RLM\n" + " * _l LRE\n" " * _r RLE\n" + " * _L LRO\n" " * _R RLO\n" + " * _o PDF\n" " * __ `_' itself\n" "\n"); + return s; +} + +/* Editor directions: + * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent + */ diff --git a/charset/fribidi-char-sets-cap-rtl.h b/charset/fribidi-char-sets-cap-rtl.h new file mode 100644 index 0000000..ebcae45 --- /dev/null +++ b/charset/fribidi-char-sets-cap-rtl.h @@ -0,0 +1,70 @@ +/* FriBidi + * fribidi-char-sets-cap-rtl.h - CapRTL character set conversion routines + * + * $Id: fribidi-char-sets-cap-rtl.h,v 1.1 2004-04-25 18:47:57 behdad Exp $ + * $Author: behdad $ + * $Date: 2004-04-25 18:47:57 $ + * $Revision: 1.1 $ + * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/charset/fribidi-char-sets-cap-rtl.h,v $ + * + * Authors: + * Behdad Esfahbod, 2001, 2002, 2004 + * Dov Grobgeld, 1999, 2000 + * + * Copyright (C) 2004 Sharif FarsiWeb, Inc + * Copyright (C) 2001,2002 Behdad Esfahbod + * Copyright (C) 1999,2000 Dov Grobgeld + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library, in a file named COPYING; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA + * + * For licensing issues, contact <license@farsiweb.info>. + */ + +#ifndef _FRIBIDI_CHAR_SETS_CAP_RTL_H +#define _FRIBIDI_CHAR_SETS_CAP_RTL_H + +#include "fribidi-common.h" + +#include "fribidi-types.h" + +#define fribidi_char_set_name_cap_rtl "CapRTL" +#define fribidi_char_set_title_cap_rtl "CapRTL (Test)" + +#define fribidi_char_set_desc_cap_rtl FRIBIDI_NAMESPACE(char_set_desc_cap_rtl) +const char *fribidi_char_set_desc_cap_rtl ( + void +); + +#define fribidi_cap_rtl_to_unicode FRIBIDI_NAMESPACE(cap_rtl_to_unicode) +FriBidiStrIndex fribidi_cap_rtl_to_unicode ( + const char *s, + FriBidiStrIndex length, + FriBidiChar *us +); + +#define fribidi_unicode_to_cap_rtl FRIBIDI_NAMESPACE(unicode_to_cap_rtl) +FriBidiStrIndex fribidi_unicode_to_cap_rtl ( + const FriBidiChar *us, + FriBidiStrIndex length, + char *s +); + +#include "fribidi-enddecls.h" + +#endif /* !_FRIBIDI_CHAR_SETS_CAP_RTL_H */ +/* Editor directions: + * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent + */ diff --git a/charset/fribidi-char-sets-cp1255.c b/charset/fribidi-char-sets-cp1255.c new file mode 100644 index 0000000..02a72ba --- /dev/null +++ b/charset/fribidi-char-sets-cp1255.c @@ -0,0 +1,106 @@ +/* FriBidi + * fribidi-char-sets-cp1255.c - CP1255 character set conversion routines + * + * $Id: fribidi-char-sets-cp1255.c,v 1.1 2004-04-25 18:47:57 behdad Exp $ + * $Author: behdad $ + * $Date: 2004-04-25 18:47:57 $ + * $Revision: 1.1 $ + * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/charset/fribidi-char-sets-cp1255.c,v $ + * + * Authors: + * Behdad Esfahbod, 2001, 2002, 2004 + * Dov Grobgeld, 1999, 2000 + * + * Copyright (C) 2004 Sharif FarsiWeb, Inc + * Copyright (C) 2001,2002 Behdad Esfahbod + * Copyright (C) 1999,2000 Dov Grobgeld + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library, in a file named COPYING; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA + * + * For licensing issues, contact <license@farsiweb.info>. + */ + +#include <fribidi-char-sets-cp1255.h> + +#include <common.h> + +#define ISO_ALEF 0xE0 +#define ISO_TAV 0xFA +#define CP1255_SHEVA 0xC0 +#define CP1255_SOF_PASUQ 0xD3 +#define CP1255_DOUBLE_VAV 0xD4 +#define CP1255_GERSHAYIM 0xD8 + +#define UNI_ALEF 0x05D0 +#define UNI_TAV 0x05EA +#define UNI_SHEVA 0x05B0 +#define UNI_SOF_PASUQ 0x05C3 +#define UNI_DOUBLE_VAV 0x05F0 +#define UNI_GERSHAYIM 0x05F4 + +static FriBidiChar fribidi_cp1255_to_unicode_tab[] = { /* 0x80-0xBF */ + 0x20AC, 0x0081, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, + 0x02C6, 0x2030, 0x008a, 0x2039, 0x008c, 0x008d, 0x008e, 0x008f, + 0x0090, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x02DC, 0x2122, 0x009a, 0x203A, 0x009c, 0x009d, 0x009e, 0x009f, + 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x20AA, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x00D7, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x00B9, 0x00F7, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF +}; + +FriBidiChar +fribidi_cp1255_to_unicode_c ( + /* input */ + char sch +) +{ + register unsigned char ch = (unsigned char) sch; + if (ch >= ISO_ALEF && ch <= ISO_TAV) + return ch - ISO_ALEF + UNI_ALEF; + else if (ch >= CP1255_SHEVA && ch <= CP1255_SOF_PASUQ) + return ch - CP1255_SHEVA + UNI_SHEVA; + else if (ch >= CP1255_DOUBLE_VAV && ch <= CP1255_GERSHAYIM) + return ch - CP1255_DOUBLE_VAV + UNI_DOUBLE_VAV; + /* cp1256 specific chars */ + else if (ch >= 0x80 && ch <= 0xbf) + return fribidi_cp1255_to_unicode_tab[ch - 0x80]; + else + return ch; +} + +char +fribidi_unicode_to_cp1255_c ( + /* input */ + FriBidiChar uch +) +{ + if (uch >= UNI_ALEF && uch <= UNI_TAV) + return (char) (uch - UNI_ALEF + ISO_ALEF); + if (uch >= UNI_SHEVA && uch <= UNI_SOF_PASUQ) + return (char) (uch - UNI_SHEVA + CP1255_SHEVA); + if (uch >= UNI_DOUBLE_VAV && uch <= UNI_GERSHAYIM) + return (char) (uch - UNI_DOUBLE_VAV + CP1255_DOUBLE_VAV); + /* TODO: handle pre-composed and presentation chars */ + else if (uch < 256) + return (char) uch; + else + return '?'; +} + +/* Editor directions: + * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent + */ diff --git a/charset/fribidi-char-sets-cp1255.h b/charset/fribidi-char-sets-cp1255.h new file mode 100644 index 0000000..011c913 --- /dev/null +++ b/charset/fribidi-char-sets-cp1255.h @@ -0,0 +1,62 @@ +/* FriBidi + * fribidi-char-sets-cp1255.h - CP1255 character set conversion routines + * + * $Id: fribidi-char-sets-cp1255.h,v 1.1 2004-04-25 18:47:57 behdad Exp $ + * $Author: behdad $ + * $Date: 2004-04-25 18:47:57 $ + * $Revision: 1.1 $ + * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/charset/fribidi-char-sets-cp1255.h,v $ + * + * Authors: + * Behdad Esfahbod, 2001, 2002, 2004 + * Dov Grobgeld, 1999, 2000 + * + * Copyright (C) 2004 Sharif FarsiWeb, Inc + * Copyright (C) 2001,2002 Behdad Esfahbod + * Copyright (C) 1999,2000 Dov Grobgeld + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library, in a file named COPYING; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA + * + * For licensing issues, contact <license@farsiweb.info>. + */ + +#ifndef _FRIBIDI_CHAR_SETS_CP1255_H +#define _FRIBIDI_CHAR_SETS_CP1255_H + +#include "fribidi-common.h" + +#include "fribidi-types.h" + +#define fribidi_char_set_name_cp1255 "CP1255" +#define fribidi_char_set_title_cp1255 "CP1255 (MS Hebrew/Yiddish)" +#define fribidi_char_set_desc_cp1255 NULL + +#define fribidi_cp1255_to_unicode_c FRIBIDI_NAMESPACE(cp1255_to_unicode_c) +FriBidiChar fribidi_cp1255_to_unicode_c ( + char ch +); + +#define fribidi_unicode_to_cp1255_c FRIBIDI_NAMESPACE(unicode_to_cp1255_c) +char fribidi_unicode_to_cp1255_c ( + FriBidiChar uch +); + +#include "fribidi-enddecls.h" + +#endif /* !_FRIBIDI_CHAR_SETS_CP1255_H */ +/* Editor directions: + * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent + */ diff --git a/charset/fribidi-char-sets-cp1256.c b/charset/fribidi-char-sets-cp1256.c new file mode 100644 index 0000000..1470da3 --- /dev/null +++ b/charset/fribidi-char-sets-cp1256.c @@ -0,0 +1,223 @@ +/* FriBidi + * fribidi-char-sets-cp1256.c - CP1256 character set conversion routines + * + * $Id: fribidi-char-sets-cp1256.c,v 1.1 2004-04-25 18:47:57 behdad Exp $ + * $Author: behdad $ + * $Date: 2004-04-25 18:47:57 $ + * $Revision: 1.1 $ + * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/charset/fribidi-char-sets-cp1256.c,v $ + * + * Authors: + * Behdad Esfahbod, 2001, 2002, 2004 + * Dov Grobgeld, 1999, 2000 + * + * Copyright (C) 2004 Sharif FarsiWeb, Inc + * Copyright (C) 2001,2002 Behdad Esfahbod + * Copyright (C) 1999,2000 Dov Grobgeld + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library, in a file named COPYING; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA + * + * For licensing issues, contact <license@farsiweb.info>. + */ + +#include <fribidi-char-sets-cp1256.h> + +#include <common.h> + +#define ISO_HAMZA 0xc1 +#define CP1256_DAD 0xD6 + +#define UNI_HAMZA 0x0621 +#define UNI_DAD 0x0636 + +static FriBidiChar fribidi_cp1256_to_unicode_tab[] = { /* 0x80-0xFF */ + 0x20AC, 0x067E, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, + 0x02C6, 0x2030, 0x0679, 0x2039, 0x0152, 0x0686, 0x0698, 0x0688, + 0x06AF, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x06A9, 0x2122, 0x0691, 0x203A, 0x0153, 0x200C, 0x200D, 0x06BA, + 0x00A0, 0x060C, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x06BE, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x00B9, 0x061B, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x061F, + 0x06C1, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, + 0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F, + 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x00D7, + 0x0637, 0x0638, 0x0639, 0x063A, 0x0640, 0x0641, 0x0642, 0x0643, + 0x00E0, 0x0644, 0x00E2, 0x0645, 0x0646, 0x0647, 0x0648, 0x00E7, + 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x0649, 0x064A, 0x00EE, 0x00EF, + 0x064B, 0x064C, 0x064D, 0x064E, 0x00F4, 0x064F, 0x0650, 0x00F7, + 0x0651, 0x00F9, 0x0652, 0x00FB, 0x00FC, 0x200E, 0x200F, 0x00ff +}; + +FriBidiChar +fribidi_cp1256_to_unicode_c ( + /* input */ + char sch +) +{ + register unsigned char ch = (unsigned char) sch; + if (ch >= 0x80) + return fribidi_cp1256_to_unicode_tab[ch - 0x80]; + else + return ch; +} + +char +fribidi_unicode_to_cp1256_c ( + /* input */ + FriBidiChar uch +) +{ + if (uch < 256) + return (char) uch; + if (uch >= UNI_HAMZA && uch <= UNI_DAD) + return (char) (uch - UNI_HAMZA + ISO_HAMZA); + else + switch (uch) + { + case 0x0152: + return (char) 0x8c; + case 0x0153: + return (char) 0x9c; + case 0x0192: + return (char) 0x83; + case 0x02C6: + return (char) 0x88; + case 0x060C: + return (char) 0xA1; + case 0x061B: + return (char) 0xBA; + case 0x061F: + return (char) 0xBF; + case 0x0637: + return (char) 0xD8; + case 0x0638: + return (char) 0xD9; + case 0x0639: + return (char) 0xDA; + case 0x063A: + return (char) 0xDB; + case 0x0640: + return (char) 0xDC; + case 0x0641: + return (char) 0xDD; + case 0x0642: + return (char) 0xDE; + case 0x0643: + return (char) 0xDF; + case 0x0644: + return (char) 0xE1; + case 0x0645: + return (char) 0xE3; + case 0x0646: + return (char) 0xE4; + case 0x0647: + return (char) 0xE5; + case 0x0648: + return (char) 0xE6; + case 0x0649: + return (char) 0xEC; + case 0x064A: + return (char) 0xED; + case 0x064B: + return (char) 0xF0; + case 0x064C: + return (char) 0xF1; + case 0x064D: + return (char) 0xF2; + case 0x064E: + return (char) 0xF3; + case 0x064F: + return (char) 0xF5; + case 0x0650: + return (char) 0xF6; + case 0x0651: + return (char) 0xF8; + case 0x0652: + return (char) 0xFA; + case 0x0679: + return (char) 0x8A; + case 0x067E: + return (char) 0x81; + case 0x0686: + return (char) 0x8D; + case 0x0688: + return (char) 0x8F; + case 0x0691: + return (char) 0x9A; + case 0x0698: + return (char) 0x8E; + case 0x06A9: + return (char) 0x98; + case 0x06AF: + return (char) 0x90; + case 0x06BA: + return (char) 0x9F; + case 0x06BE: + return (char) 0xAA; + case 0x06C1: + return (char) 0xC0; + case 0x200C: + return (char) 0x9D; + case 0x200D: + return (char) 0x9E; + case 0x200E: + return (char) 0xFD; + case 0x200F: + return (char) 0xFE; + case 0x2013: + return (char) 0x96; + case 0x2014: + return (char) 0x97; + case 0x2018: + return (char) 0x91; + case 0x2019: + return (char) 0x92; + case 0x201A: + return (char) 0x82; + case 0x201C: + return (char) 0x93; + case 0x201D: + return (char) 0x94; + case 0x201E: + return (char) 0x84; + case 0x2020: + return (char) 0x86; + case 0x2021: + return (char) 0x87; + case 0x2022: + return (char) 0x95; + case 0x2026: + return (char) 0x85; + case 0x2030: + return (char) 0x89; + case 0x2039: + return (char) 0x8B; + case 0x203A: + return (char) 0x9B; + case 0x20AC: + return (char) 0x80; + case 0x2122: + return (char) 0x99; + + default: + return '?'; + } +} + +/* Editor directions: + * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent + */ diff --git a/charset/fribidi-char-sets-cp1256.h b/charset/fribidi-char-sets-cp1256.h new file mode 100644 index 0000000..ecf2605 --- /dev/null +++ b/charset/fribidi-char-sets-cp1256.h @@ -0,0 +1,62 @@ +/* FriBidi + * fribidi-char-sets-cp1256.h - CP1256 character set conversion routines + * + * $Id: fribidi-char-sets-cp1256.h,v 1.1 2004-04-25 18:47:57 behdad Exp $ + * $Author: behdad $ + * $Date: 2004-04-25 18:47:57 $ + * $Revision: 1.1 $ + * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/charset/fribidi-char-sets-cp1256.h,v $ + * + * Authors: + * Behdad Esfahbod, 2001, 2002, 2004 + * Dov Grobgeld, 1999, 2000 + * + * Copyright (C) 2004 Sharif FarsiWeb, Inc + * Copyright (C) 2001,2002 Behdad Esfahbod + * Copyright (C) 1999,2000 Dov Grobgeld + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library, in a file named COPYING; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA + * + * For licensing issues, contact <license@farsiweb.info>. + */ + +#ifndef _FRIBIDI_CHAR_SETS_CP1256_H +#define _FRIBIDI_CHAR_SETS_CP1256_H + +#include "fribidi-common.h" + +#include "fribidi-types.h" + +#define fribidi_char_set_name_cp1256 "CP1256" +#define fribidi_char_set_title_cp1256 "CP1256 (MS Arabic)" +#define fribidi_char_set_desc_cp1256 NULL + +#define fribidi_cp1256_to_unicode_c FRIBIDI_NAMESPACE(cp1256_to_unicode_c) +FriBidiChar fribidi_cp1256_to_unicode_c ( + char ch +); + +#define fribidi_unicode_to_cp1256_c FRIBIDI_NAMESPACE(unicode_to_cp1256_c) +char fribidi_unicode_to_cp1256_c ( + FriBidiChar uch +); + +#include "fribidi-enddecls.h" + +#endif /* !_FRIBIDI_CHAR_SETS_CP1256_H */ +/* Editor directions: + * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent + */ diff --git a/charset/fribidi-char-sets-iso8859-6.c b/charset/fribidi-char-sets-iso8859-6.c new file mode 100644 index 0000000..e238a4b --- /dev/null +++ b/charset/fribidi-char-sets-iso8859-6.c @@ -0,0 +1,81 @@ +/* FriBidi + * fribidi-char-sets-iso8859-6.c - ISO8859-6 character set conversion routines + * + * $Id: fribidi-char-sets-iso8859-6.c,v 1.1 2004-04-25 18:47:57 behdad Exp $ + * $Author: behdad $ + * $Date: 2004-04-25 18:47:57 $ + * $Revision: 1.1 $ + * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/charset/fribidi-char-sets-iso8859-6.c,v $ + * + * Authors: + * Behdad Esfahbod, 2001, 2002, 2004 + * Dov Grobgeld, 1999, 2000 + * + * Copyright (C) 2004 Sharif FarsiWeb, Inc + * Copyright (C) 2001,2002 Behdad Esfahbod + * Copyright (C) 1999,2000 Dov Grobgeld + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library, in a file named COPYING; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA + * + * For licensing issues, contact <license@farsiweb.info>. + */ + +#include <fribidi-char-sets-iso8859-6.h> + +#include <common.h> + +#define ISO_HAMZA 0xc1 +#define ISO_SUKUN 0xf2 + +#define UNI_HAMZA 0x0621 +#define UNI_SUKUN 0x0652 + +FriBidiChar +fribidi_iso8859_6_to_unicode_c ( + /* input */ + char sch +) +{ + register unsigned char ch = (unsigned char) sch; + if (ch >= ISO_HAMZA && ch <= ISO_SUKUN) + return ch - ISO_HAMZA + UNI_HAMZA; + else + return ch; +} + +char +fribidi_unicode_to_iso8859_6_c ( + /* input */ + FriBidiChar uch +) +{ + if (uch >= UNI_HAMZA && uch <= UNI_SUKUN) + return (char) (uch - UNI_HAMZA + ISO_HAMZA); + else if (uch < 256) + return (char) uch; + else if (uch == 0x060c) + return (char) 0xac; + else if (uch == 0x061b) + return (char) 0xbb; + else if (uch == 0x061f) + return (char) 0xbf; + else + return '?'; +} + +/* Editor directions: + * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent + */ diff --git a/charset/fribidi-char-sets-iso8859-6.h b/charset/fribidi-char-sets-iso8859-6.h new file mode 100644 index 0000000..159ccbd --- /dev/null +++ b/charset/fribidi-char-sets-iso8859-6.h @@ -0,0 +1,62 @@ +/* FriBidi + * fribidi-char-sets-iso8859-6.h - ISO8859-6 character set conversion routines + * + * $Id: fribidi-char-sets-iso8859-6.h,v 1.1 2004-04-25 18:47:57 behdad Exp $ + * $Author: behdad $ + * $Date: 2004-04-25 18:47:57 $ + * $Revision: 1.1 $ + * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/charset/fribidi-char-sets-iso8859-6.h,v $ + * + * Authors: + * Behdad Esfahbod, 2001, 2002, 2004 + * Dov Grobgeld, 1999, 2000 + * + * Copyright (C) 2004 Sharif FarsiWeb, Inc + * Copyright (C) 2001,2002 Behdad Esfahbod + * Copyright (C) 1999,2000 Dov Grobgeld + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library, in a file named COPYING; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA + * + * For licensing issues, contact <license@farsiweb.info>. + */ + +#ifndef _FRIBIDI_CHAR_SETS_ISO8859_6_H +#define _FRIBIDI_CHAR_SETS_ISO8859_6_H + +#include "fribidi-common.h" + +#include "fribidi-types.h" + +#define fribidi_char_set_name_iso8859_6 "ISO8859-6" +#define fribidi_char_set_title_iso8859_6 "ISO8859-6 (Arabic)" +#define fribidi_char_set_desc_iso8859_6 NULL + +#define fribidi_iso8859_6_to_unicode_c FRIBIDI_NAMESPACE(iso8859_6_to_unicode_c) +FriBidiChar fribidi_iso8859_6_to_unicode_c ( + char ch +); + +#define fribidi_unicode_to_iso8859_6_c FRIBIDI_NAMESPACE(unicode_to_iso8859_6_c) +char fribidi_unicode_to_iso8859_6_c ( + FriBidiChar uch +); + +#include "fribidi-enddecls.h" + +#endif /* !_FRIBIDI_CHAR_SETS_ISO8859_6_H */ +/* Editor directions: + * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent + */ diff --git a/charset/fribidi-char-sets-iso8859-8.c b/charset/fribidi-char-sets-iso8859-8.c new file mode 100644 index 0000000..4b86b94 --- /dev/null +++ b/charset/fribidi-char-sets-iso8859-8.c @@ -0,0 +1,120 @@ +/* FriBidi + * fribidi-char-sets-iso8859-8.c - ISO8859-8 character set conversion routines + * + * $Id: fribidi-char-sets-iso8859-8.c,v 1.1 2004-04-25 18:47:57 behdad Exp $ + * $Author: behdad $ + * $Date: 2004-04-25 18:47:57 $ + * $Revision: 1.1 $ + * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/charset/fribidi-char-sets-iso8859-8.c,v $ + * + * Authors: + * Behdad Esfahbod, 2001, 2002, 2004 + * Dov Grobgeld, 1999, 2000 + * + * Copyright (C) 2004 Sharif FarsiWeb, Inc + * Copyright (C) 2001,2002 Behdad Esfahbod + * Copyright (C) 1999,2000 Dov Grobgeld + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library, in a file named COPYING; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA + * + * For licensing issues, contact <license@farsiweb.info>. + */ + +#include <fribidi-char-sets-iso8859-8.h> + +#include <fribidi-unicode.h> + +#include <common.h> + +/* The following are proposed extensions to ISO8859-8. */ +#define ISO_8859_8_LRM 0xFD +#define ISO_8859_8_RLM 0xFE +#define ISO_8859_8_LRE 0xFB +#define ISO_8859_8_RLE 0xFC +#define ISO_8859_8_PDF 0xDD +#define ISO_8859_8_LRO 0xDB +#define ISO_8859_8_RLO 0xDC +#define ISO_ALEF 0xE0 +#define ISO_TAV 0xFA + +#define UNI_ALEF 0x05D0 +#define UNI_TAV 0x05EA + +FriBidiChar +fribidi_iso8859_8_to_unicode_c ( + /* input */ + char sch +) +{ + register unsigned char ch = (unsigned char) sch; + if (ch < ISO_8859_8_LRO) + return ch; + else if (ch >= ISO_ALEF && ch <= ISO_TAV) + return ch - ISO_ALEF + UNI_ALEF; + switch (ch) + { + case ISO_8859_8_RLM: + return FRIBIDI_CHAR_RLM; + case ISO_8859_8_LRM: + return FRIBIDI_CHAR_LRM; + case ISO_8859_8_RLO: + return FRIBIDI_CHAR_RLO; + case ISO_8859_8_LRO: + return FRIBIDI_CHAR_LRO; + case ISO_8859_8_RLE: + return FRIBIDI_CHAR_RLE; + case ISO_8859_8_LRE: + return FRIBIDI_CHAR_LRE; + case ISO_8859_8_PDF: + return FRIBIDI_CHAR_PDF; + default: + return '?'; + } +} + +char +fribidi_unicode_to_iso8859_8_c ( + /* input */ + FriBidiChar uch +) +{ + if (uch < 128) + return (char) uch; + if (uch >= UNI_ALEF && uch <= UNI_TAV) + return (char) (uch - UNI_ALEF + ISO_ALEF); + switch (uch) + { + case FRIBIDI_CHAR_RLM: + return (char) ISO_8859_8_RLM; + case FRIBIDI_CHAR_LRM: + return (char) ISO_8859_8_LRM; + case FRIBIDI_CHAR_RLO: + return (char) ISO_8859_8_RLO; + case FRIBIDI_CHAR_LRO: + return (char) ISO_8859_8_LRO; + case FRIBIDI_CHAR_RLE: + return (char) ISO_8859_8_RLE; + case FRIBIDI_CHAR_LRE: + return (char) ISO_8859_8_LRE; + case FRIBIDI_CHAR_PDF: + return (char) ISO_8859_8_PDF; + } + return '?'; +} + +/* Editor directions: + * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent + */ diff --git a/charset/fribidi-char-sets-iso8859-8.h b/charset/fribidi-char-sets-iso8859-8.h new file mode 100644 index 0000000..ccc7b16 --- /dev/null +++ b/charset/fribidi-char-sets-iso8859-8.h @@ -0,0 +1,62 @@ +/* FriBidi + * fribidi-char-sets-iso8859-8.h - ISO8859-8 character set conversion routines + * + * $Id: fribidi-char-sets-iso8859-8.h,v 1.1 2004-04-25 18:47:57 behdad Exp $ + * $Author: behdad $ + * $Date: 2004-04-25 18:47:57 $ + * $Revision: 1.1 $ + * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/charset/fribidi-char-sets-iso8859-8.h,v $ + * + * Authors: + * Behdad Esfahbod, 2001, 2002, 2004 + * Dov Grobgeld, 1999, 2000 + * + * Copyright (C) 2004 Sharif FarsiWeb, Inc + * Copyright (C) 2001,2002 Behdad Esfahbod + * Copyright (C) 1999,2000 Dov Grobgeld + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library, in a file named COPYING; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA + * + * For licensing issues, contact <license@farsiweb.info>. + */ + +#ifndef _FRIBIDI_CHAR_SETS_ISO8859_8_H +#define _FRIBIDI_CHAR_SETS_ISO8859_8_H + +#include "fribidi-common.h" + +#include "fribidi-types.h" + +#define fribidi_char_set_name_iso8859_8 "ISO8859-8" +#define fribidi_char_set_title_iso8859_8 "ISO8859-8 (Hebrew)" +#define fribidi_char_set_desc_iso8859_8 NULL + +#define fribidi_iso8859_8_to_unicode_c FRIBIDI_NAMESPACE(iso8859_8_to_unicode_c) +FriBidiChar fribidi_iso8859_8_to_unicode_c ( + char ch +); + +#define fribidi_unicode_to_iso8859_8_c FRIBIDI_NAMESPACE(unicode_to_iso8859_8_c) +char fribidi_unicode_to_iso8859_8_c ( + FriBidiChar uch +); + +#include "fribidi-enddecls.h" + +#endif /* !_FRIBIDI_CHAR_SETS_ISO8859_8_H */ +/* Editor directions: + * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent + */ diff --git a/charset/fribidi-char-sets-list.h b/charset/fribidi-char-sets-list.h new file mode 100644 index 0000000..c5df751 --- /dev/null +++ b/charset/fribidi-char-sets-list.h @@ -0,0 +1,56 @@ +#ifndef __C2MAN__ +/* FriBidi + * fribidi-char-sets-list.h - list of supported character sets + * + * $Id: fribidi-char-sets-list.h,v 1.1 2004-04-25 18:47:57 behdad Exp $ + * $Author: behdad $ + * $Date: 2004-04-25 18:47:57 $ + * $Revision: 1.1 $ + * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/charset/fribidi-char-sets-list.h,v $ + * + * Author: + * Behdad Esfahbod, 2001, 2002, 2004 + * + * Copyright (C) 2004 Sharif FarsiWeb, Inc. + * Copyright (C) 2001,2002 Behdad Esfahbod + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library, in a file named COPYING; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA + * + * For licensing issues, contact <license@farsiweb.info>. + */ +/* *INDENT-OFF* */ + +/* The order of types in this list should not be important at compile time, + * but apparently it should not be changed after compilation! */ +#endif /* !__C2MAN__ */ +#ifdef _FRIBIDI_ADD_CHAR_SET +# define _FRIBIDI_ADD_CHAR_SET_OTHERS _FRIBIDI_ADD_CHAR_SET +# define _FRIBIDI_ADD_CHAR_SET_ONE2ONE _FRIBIDI_ADD_CHAR_SET +#endif /* _FRIBIDI_ADD_CHAR_SET */ +_FRIBIDI_ADD_CHAR_SET_OTHERS (UTF8, utf8) /* UTF-8 (Unicode) */ +_FRIBIDI_ADD_CHAR_SET_OTHERS (CAP_RTL, cap_rtl) /* CapRTL (Test) */ +_FRIBIDI_ADD_CHAR_SET_ONE2ONE (ISO8859_6, iso8859_6) /* ISO8859-6 (Arabic) */ +_FRIBIDI_ADD_CHAR_SET_ONE2ONE (ISO8859_8, iso8859_8) /* ISO8859-8 (Hebrew) */ +_FRIBIDI_ADD_CHAR_SET_ONE2ONE (CP1255, cp1255) /* CP1255 (MS Hebrew/Yiddish) */ +_FRIBIDI_ADD_CHAR_SET_ONE2ONE (CP1256, cp1256) /* CP1256 (MS Arabic) */ +#ifdef _FRIBIDI_ADD_CHAR_SET +# undef _FRIBIDI_ADD_CHAR_SET_OTHERS +# undef _FRIBIDI_ADD_CHAR_SET_ONE2ONE +#endif /* _FRIBIDI_ADD_CHAR_SET */ + +#ifndef __C2MAN__ +/* *INDENT-ON* */ +#endif /* !__C2MAN__ */ diff --git a/charset/fribidi-char-sets-utf8.c b/charset/fribidi-char-sets-utf8.c new file mode 100644 index 0000000..79d1ab9 --- /dev/null +++ b/charset/fribidi-char-sets-utf8.c @@ -0,0 +1,126 @@ +/* FriBidi + * fribidi-char-sets-utf8.c - UTF-8 character set conversion routines + * + * $Id: fribidi-char-sets-utf8.c,v 1.1 2004-04-25 18:47:57 behdad Exp $ + * $Author: behdad $ + * $Date: 2004-04-25 18:47:57 $ + * $Revision: 1.1 $ + * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/charset/fribidi-char-sets-utf8.c,v $ + * + * Authors: + * Behdad Esfahbod, 2001, 2002, 2004 + * Dov Grobgeld, 1999, 2000 + * + * Copyright (C) 2004 Sharif FarsiWeb, Inc + * Copyright (C) 2001,2002 Behdad Esfahbod + * Copyright (C) 1999,2000 Dov Grobgeld + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library, in a file named COPYING; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA + * + * For licensing issues, contact <license@farsiweb.info>. + */ + +#include <fribidi-char-sets-utf8.h> + +#include <fribidi-unicode.h> + +#include <common.h> + +FriBidiStrIndex +fribidi_utf8_to_unicode ( + /* input */ + const char *ss, + FriBidiStrIndex len, + /* output */ + FriBidiChar *us +) +{ + FriBidiStrIndex length; + const unsigned char *s = (unsigned char *) ss; + const unsigned char *t = s; + + length = 0; + while (s - t < len) + { + register unsigned char ch = *s; + if (ch <= 0x7f) /* one byte */ + { + *us++ = *s++; + } + else if (ch <= 0xdf) /* 2 byte */ + { + *us++ = ((*s & 0x1f) << 6) + (*(s + 1) & 0x3f); + s += 2; + } + else /* 3 byte */ + { + *us++ = + ((int) (*s & 0x0f) << 12) + + ((*(s + 1) & 0x3f) << 6) + (*(s + 2) & 0x3f); + s += 3; + } + length++; + } + return (length); +} + +FriBidiStrIndex +fribidi_unicode_to_utf8 ( + /* input */ + const FriBidiChar *us, + FriBidiStrIndex len, + /* output */ + char *ss +) +{ + int i; + unsigned char *s = (unsigned char *) ss; + unsigned char *t = s; + + for (i = 0; i < len; i++) + { + FriBidiChar mychar = us[i]; + if (mychar <= 0x7F) + { /* 7 sig bits */ + *t++ = mychar; + } + else if (mychar <= 0x7FF) + { /* 11 sig bits */ + *t++ = 0xC0 | (unsigned char) (mychar >> 6); /* upper 5 bits */ + *t++ = 0x80 | (unsigned char) (mychar & 0x3F); /* lower 6 bits */ + } + else if (mychar <= 0xFFFF) + { /* 16 sig bits */ + *t++ = 0xE0 | (unsigned char) (mychar >> 12); /* upper 4 bits */ + *t++ = 0x80 | (unsigned char) ((mychar >> 6) & 0x3F); /* next 6 bits */ + *t++ = 0x80 | (unsigned char) (mychar & 0x3F); /* lowest 6 bits */ + } + else if (mychar < FRIBIDI_UNICODE_CHARS) + { /* 21 sig bits */ + *t++ = 0xF0 | (unsigned char) ((mychar >> 18) & 0x07); /* upper 3 bits */ + *t++ = 0x80 | (unsigned char) ((mychar >> 12) & 0x3F); /* next 6 bits */ + *t++ = 0x80 | (unsigned char) ((mychar >> 6) & 0x3F); /* next 6 bits */ + *t++ = 0x80 | (unsigned char) (mychar & 0x3F); /* lowest 6 bits */ + } + } + *t = 0; + + return (t - s); +} + +/* Editor directions: + * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent + */ diff --git a/charset/fribidi-char-sets-utf8.h b/charset/fribidi-char-sets-utf8.h new file mode 100644 index 0000000..aaf9a53 --- /dev/null +++ b/charset/fribidi-char-sets-utf8.h @@ -0,0 +1,66 @@ +/* FriBidi + * fribidi-char-sets-utf8.h - UTF-8 character set conversion routines + * + * $Id: fribidi-char-sets-utf8.h,v 1.1 2004-04-25 18:47:57 behdad Exp $ + * $Author: behdad $ + * $Date: 2004-04-25 18:47:57 $ + * $Revision: 1.1 $ + * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/charset/fribidi-char-sets-utf8.h,v $ + * + * Authors: + * Behdad Esfahbod, 2001, 2002, 2004 + * Dov Grobgeld, 1999, 2000 + * + * Copyright (C) 2004 Sharif FarsiWeb, Inc + * Copyright (C) 2001,2002 Behdad Esfahbod + * Copyright (C) 1999,2000 Dov Grobgeld + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library, in a file named COPYING; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA + * + * For licensing issues, contact <license@farsiweb.info>. + */ + +#ifndef _FRIBIDI_CHAR_SETS_UTF8_H +#define _FRIBIDI_CHAR_SETS_UTF8_H + +#include "fribidi-common.h" + +#include "fribidi-types.h" + +#define fribidi_char_set_name_utf8 "UTF-8" +#define fribidi_char_set_title_utf8 "UTF-8 (Unicode)" +#define fribidi_char_set_desc_utf8 NULL + +#define fribidi_utf8_to_unicode FRIBIDI_NAMESPACE(utf8_to_unicode) +FriBidiStrIndex fribidi_utf8_to_unicode ( + const char *s, + FriBidiStrIndex length, + FriBidiChar *us +); + +#define fribidi_unicode_to_utf8 FRIBIDI_NAMESPACE(unicode_to_utf8) +FriBidiStrIndex fribidi_unicode_to_utf8 ( + const FriBidiChar *us, + FriBidiStrIndex length, + char *s +); + +#include "fribidi-enddecls.h" + +#endif /* !_FRIBIDI_CHAR_SETS_UTF8_H */ +/* Editor directions: + * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent + */ diff --git a/charset/fribidi-char-sets.c b/charset/fribidi-char-sets.c new file mode 100644 index 0000000..8ef5482 --- /dev/null +++ b/charset/fribidi-char-sets.c @@ -0,0 +1,230 @@ +/* FriBidi + * fribidi-char-sets.c - character set conversion routines + * + * $Id: fribidi-char-sets.c,v 1.1 2004-04-25 18:47:57 behdad Exp $ + * $Author: behdad $ + * $Date: 2004-04-25 18:47:57 $ + * $Revision: 1.1 $ + * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/charset/fribidi-char-sets.c,v $ + * + * Authors: + * Behdad Esfahbod, 2001, 2002, 2004 + * Dov Grobgeld, 1999, 2000 + * + * Copyright (C) 2004 Sharif FarsiWeb, Inc + * Copyright (C) 2001,2002 Behdad Esfahbod + * Copyright (C) 1999,2000 Dov Grobgeld + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library, in a file named COPYING; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA + * + * For licensing issues, contact <license@farsiweb.info>. + */ + +#include <fribidi-char-sets.h> + +#include <common.h> + +typedef struct +{ + FriBidiChar ( + *charset_to_unicode_c + ) ( + char ch + ); + + FriBidiStrIndex ( + *charset_to_unicode + ) ( + const char *s, + FriBidiStrIndex len, + FriBidiChar *us + ); + + char ( + *unicode_to_charset_c + ) ( + FriBidiChar uch + ); + + FriBidiStrIndex ( + *unicode_to_charset + ) ( + const FriBidiChar *us, + FriBidiStrIndex len, + char *s + ); + + const char *name; + + const char *title; + + const char *( + *desc + ) ( + void + ); +} +FriBidiCharSetHandler; + +static FriBidiCharSetHandler char_sets[FRIBIDI_CHAR_SETS_NUM + 1] = { + {NULL, NULL, NULL, NULL, "N/A", "Character set not available", NULL}, +# define _FRIBIDI_ADD_CHAR_SET_ONE2ONE(CHAR_SET, char_set) \ + { \ + fribidi_##char_set##_to_unicode_c, \ + NULL, \ + fribidi_unicode_to_##char_set##_c, \ + NULL, \ + fribidi_char_set_name_##char_set, \ + fribidi_char_set_title_##char_set, \ + fribidi_char_set_desc_##char_set \ + }, +# define _FRIBIDI_ADD_CHAR_SET_OTHERS(CHAR_SET, char_set) \ + { \ + NULL, \ + fribidi_##char_set##_to_unicode, \ + NULL, \ + fribidi_unicode_to_##char_set, \ + fribidi_char_set_name_##char_set, \ + fribidi_char_set_title_##char_set, \ + fribidi_char_set_desc_##char_set \ + }, +# include <fribidi-char-sets-list.h> +# undef _FRIBIDI_ADD_CHAR_SET_OTHERS +# undef _FRIBIDI_ADD_CHAR_SET_ONE2ONE +}; + +#if !FRIBIDI_USE_GLIB +static char +toupper ( + /* input */ + char c +) +{ + return c < 'a' || c > 'z' ? c : c + 'A' - 'a'; +} + +static int +fribidi_strcasecmp ( + /* input */ + const char *s1, + const char *s2 +) +{ + while (*s1 && toupper (*s1) == toupper (*s2)) + { + s1++; + s2++; + } + return *s1 - *s2; +} +#else /* FRIBIDI_USE_GLIB */ +# include <glib/gstrfuncs.h> +# define fribidi_strcasecmp g_ascii_strcasecmp +#endif /* FRIBIDI_USE_GLIB */ + +FRIBIDI_ENTRY FriBidiCharSet +fribidi_parse_charset ( + /* input */ + const char *s +) +{ + int i; + + for (i = FRIBIDI_CHAR_SETS_NUM; i; i--) + if (fribidi_strcasecmp (s, char_sets[i].name) == 0) + return i; + + return FRIBIDI_CHAR_SET_NOT_FOUND; +} + +FRIBIDI_ENTRY FriBidiStrIndex +fribidi_charset_to_unicode ( + /* input */ + FriBidiCharSet char_set, + const char *s, + FriBidiStrIndex len, + /* output */ + FriBidiChar *us +) +{ + if (char_sets[char_set].charset_to_unicode) + return (*char_sets[char_set].charset_to_unicode) (s, len, us); + else if (char_sets[char_set].charset_to_unicode_c) + { + register FriBidiStrIndex l; + for (l = len; l; l--) + *us++ = (*char_sets[char_set].charset_to_unicode_c) (*s++); + return len; + } + else + return 0; +} + +FRIBIDI_ENTRY FriBidiStrIndex +fribidi_unicode_to_charset ( + /* input */ + FriBidiCharSet char_set, + const FriBidiChar *us, + FriBidiStrIndex len, + /* output */ + char *s +) +{ + if (char_sets[char_set].unicode_to_charset) + return (*char_sets[char_set].unicode_to_charset) (us, len, s); + else if (char_sets[char_set].unicode_to_charset_c) + { + register FriBidiStrIndex l; + for (l = len; l; l--) + *s++ = (*char_sets[char_set].unicode_to_charset_c) (*us++); + *s = '\0'; + return len; + } + else + return 0; +} + +FRIBIDI_ENTRY const char * +fribidi_char_set_name ( + /* input */ + FriBidiCharSet char_set +) +{ + return char_sets[char_set].name ? char_sets[char_set].name : ""; +} + +FRIBIDI_ENTRY const char * +fribidi_char_set_title ( + /* input */ + FriBidiCharSet char_set +) +{ + return char_sets[char_set].title ? char_sets[char_set]. + title : fribidi_char_set_name (char_set); +} + +FRIBIDI_ENTRY const char * +fribidi_char_set_desc ( + /* input */ + FriBidiCharSet char_set +) +{ + return char_sets[char_set].desc ? char_sets[char_set].desc () : NULL; +} + +/* Editor directions: + * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent + */ diff --git a/charset/fribidi-char-sets.h b/charset/fribidi-char-sets.h new file mode 100644 index 0000000..5508da9 --- /dev/null +++ b/charset/fribidi-char-sets.h @@ -0,0 +1,125 @@ +/* FriBidi + * fribidi-char-sets.h - character set conversion routines + * + * $Id: fribidi-char-sets.h,v 1.1 2004-04-25 18:47:57 behdad Exp $ + * $Author: behdad $ + * $Date: 2004-04-25 18:47:57 $ + * $Revision: 1.1 $ + * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/charset/fribidi-char-sets.h,v $ + * + * Authors: + * Behdad Esfahbod, 2001, 2002, 2004 + * Dov Grobgeld, 1999, 2000 + * + * Copyright (C) 2004 Sharif FarsiWeb, Inc + * Copyright (C) 2001,2002 Behdad Esfahbod + * Copyright (C) 1999,2000 Dov Grobgeld + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library, in a file named COPYING; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA + * + * For licensing issues, contact <license@farsiweb.info>. + */ +#ifndef _FRIBIDI_CHAR_SETS_H +#define _FRIBIDI_CHAR_SETS_H + +#include "fribidi-common.h" + +#include "fribidi-types.h" + +#include "fribidi-char-sets-cap-rtl.h" +#include "fribidi-char-sets-utf8.h" +#include "fribidi-char-sets-iso8859-6.h" +#include "fribidi-char-sets-cp1256.h" +#include "fribidi-char-sets-iso8859-8.h" +#include "fribidi-char-sets-cp1255.h" + +#include "fribidi-begindecls.h" + +typedef enum +{ + _FRIBIDI_CHAR_SET_NOT_FOUND, +# define _FRIBIDI_ADD_CHAR_SET(CHAR_SET, char_set) FRIBIDI_CHAR_SET_##CHAR_SET, +# include "fribidi-char-sets-list.h" +# undef _FRIBIDI_ADD_CHAR_SET + _FRIBIDI_CHAR_SETS_NUM_PLUS_ONE +} +FriBidiCharSet; + +#define FRIBIDI_CHAR_SET_NOT_FOUND _FRIBIDI_CHAR_SET_NOT_FOUND +#define FRIBIDI_CHAR_SETS_NUM (_FRIBIDI_CHAR_SETS_NUM_PLUS_ONE - 1) + + +#define fribidi_charset_to_unicode FRIBIDI_NAMESPACE(charset_to_unicode) +/* fribidi_charset_to_unicode - convert string to Unicode + * + * This function converts an string from a character set, to a Unicode string. + * + * Returns: The length of the new string. + */ +FRIBIDI_ENTRY FriBidiStrIndex fribidi_charset_to_unicode ( + FriBidiCharSet char_set, /* character set to convert from */ + const char *s, /* input string encoded in char_set */ + FriBidiStrIndex len, /* input string length */ + FriBidiChar *us /* output Unicode string */ +); + +#define fribidi_unicode_to_charset FRIBIDI_NAMESPACE(unicode_to_charset) +/* fribidi_unicode_to_charset - convert string from Unicode + * + * This function converts a Unicode string to an string in another character + * set. It also zero-terminates the output string. + * + * Returns: The length of the new string. + */ +FRIBIDI_ENTRY FriBidiStrIndex fribidi_unicode_to_charset ( + FriBidiCharSet char_set, /* character set to conver to */ + const FriBidiChar *us, /* input Unicode string */ + FriBidiStrIndex len, /* input string length */ + char *s /* output string encoded in char_set */ +); + +#define fribidi_parse_charset FRIBIDI_NAMESPACE(parse_charset) +/* fribidi_parse_charset - parse character set name + * + * Returns: The character set named s, or FRIBIDI_CHAR_SET_NOT_FOUND if the + * character set is not available. + */ +FRIBIDI_ENTRY FriBidiCharSet fribidi_parse_charset ( + const char *s /* input name of the character set */ +); + + +#define fribidi_char_set_name FRIBIDI_NAMESPACE(char_set_name) +FRIBIDI_ENTRY const char *fribidi_char_set_name ( + FriBidiCharSet char_set +); + +#define fribidi_char_set_title FRIBIDI_NAMESPACE(char_set_title) +FRIBIDI_ENTRY const char *fribidi_char_set_title ( + FriBidiCharSet char_set +); + +#define fribidi_char_set_desc FRIBIDI_NAMESPACE(char_set_desc) +FRIBIDI_ENTRY const char *fribidi_char_set_desc ( + FriBidiCharSet char_set +); + +#include "fribidi-enddecls.h" + +#endif /* !_FRIBIDI_CHAR_SETS_H */ +/* Editor directions: + * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent + */ diff --git a/configure.ac b/configure.ac new file mode 100644 index 0000000..6790762 --- /dev/null +++ b/configure.ac @@ -0,0 +1,208 @@ +############################################################################## +## $Id: configure.ac,v 1.1 2004-04-25 18:47:56 behdad Exp $ +## $Auther: behdad $ +## $Date: 2004-04-25 18:47:56 $ +## $Revision: 1.1 $ +## $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/configure.ac,v $ +############################################################################## +## -*- Autoconf -*- +## Process this file with autoconf to produce a configure script. +## Use autoupdate to update this file for newer versions of autoconf. +## Use autoscan to check if you need to add something to this file. + +AC_PREREQ(2.59) + +dnl Define different version variables. +dnl +dnl Making releases: +dnl FRIBIDI_MICRO_VERSION++; +dnl FRIBIDI_INTERFACE_AGE++; +dnl FRIBIDI_RPM_RELEASE = 1; +dnl +dnl If any functions have been added: +dnl FRIBIDI_INTERFACE_AGE = 0; +dnl FRIBIDI_INTERFACE_VERSION++; +dnl FRIBIDI_BINARY_AGE++; +dnl +dnl If binary backwards compatibility has been broken: +dnl FRIBIDI_BINARY_AGE = FRIBIDI_INTERFACE_AGE = 0; +dnl +dnl Building RPMs: +dnl FRIBIDI_RPM_RELEASE++; +dnl +m4_define(fribidi_major_version, 0)dnl +m4_define(fribidi_minor_version, 19)dnl +m4_define(fribidi_micro_version, 0)dnl +m4_define(fribidi_version,fribidi_major_version.fribidi_minor_version.fribidi_micro_version)dnl +m4_define(fribidi_interface_version, 3)dnl +m4_define(fribidi_interface_age, 0)dnl +m4_define(fribidi_binary_age, 3)dnl +m4_define(fribidi_rpm_release, 1)dnl +dnl + +AC_INIT([GNU FriBidi],fribidi_version(),[http://freedesktop.org/cgi-bin/bugzilla/enter_bug.cgi?product=FriBidi]) +AC_REVISION([$Id: configure.ac,v 1.1 2004-04-25 18:47:56 behdad Exp $]) +AC_CONFIG_SRCDIR(lib/fribidi.h) +AC_CONFIG_HEADERS(config.h) +AM_INIT_AUTOMAKE([gnits]) + +FRIBIDI_MAJOR_VERSION=fribidi_major_version() +FRIBIDI_MINOR_VERSION=fribidi_minor_version() +FRIBIDI_MICRO_VERSION=fribidi_micro_version() +FRIBIDI_VERSION=fribidi_version() +FRIBIDI_INTERFACE_VERSION=fribidi_interface_version() +FRIBIDI_INTERFACE_AGE=fribidi_interface_age() +FRIBIDI_BINARY_AGE=fribidi_binary_age() +FRIBIDI_RPM_RELEASE=fribidi_rpm_release + +AC_SUBST(FRIBIDI_MAJOR_VERSION) +AC_SUBST(FRIBIDI_MINOR_VERSION) +AC_SUBST(FRIBIDI_MICRO_VERSION) +AC_SUBST(FRIBIDI_VERSION) +AC_SUBST(FRIBIDI_INTERFACE_VERSION) +AC_SUBST(FRIBIDI_INTERFACE_AGE) +AC_SUBST(FRIBIDI_BINARY_AGE) +AC_SUBST(FRIBIDI_RPM_RELEASE) + +dnl libtool versioning. +m4_define(lt_current, fribidi_interface_version())dnl +m4_define(lt_revision, fribidi_interface_age())dnl +m4_define(lt_age, fribidi_binary_age())dnl +LT_VERSION_INFO=lt_current():lt_revision():lt_age() +LT_CURRENT_MINUS_AGE=m4_eval(lt_current - lt_age) + +AC_SUBST(LT_VERSION_INFO) +AC_SUBST(LT_CURRENT_MINUS_AGE) + +dnl ========================================================================== + +# Checks for Win32. +AC_MSG_CHECKING([for native Win32]) + case "$host" in + *-*-mingw*) os_win32=yes ;; + *) pango_os_win32=no ;; + esac +AC_MSG_RESULT([$os_win32]) +AM_CONDITIONAL(OS_WIN32, test "$os_win32" = "yes") +AC_MSG_CHECKING([for some Win32 platform]) + case "$host" in + *-*-mingw*|*-*-cygwin*) platform_win32=yes ;; + *) platform_win32=no ;; + esac +AC_MSG_RESULT([$platform_win32]) +AM_CONDITIONAL(PLATFORM_WIN32, test "$platform_win32" = "yes") + +# Checks for programs. +AC_PROG_CC +AC_PROG_INSTALL +AC_LIBTOOL_WIN32_DLL +AC_PROG_LIBTOOL + +# Checks for header files. +AC_HEADER_STDC +AC_HEADER_TIME +AC_CHECK_HEADERS([stdlib.h string.h strings.h inttypes.h stdbool.h wchar.h sys/times.h]) + +# Checks for typedefs and structures. +AC_C_CONST +AC_C_INLINE +AC_CHECK_SIZEOF(int) +AC_CHECK_SIZEOF(short) +AC_CHECK_SIZEOF(void *) +AC_CHECK_SIZEOF(wchar_t) + +# Checks for compiler characteristics. +changequote(,)dnl +if test "x$GCC" = "xyes"; then + case " $CFLAGS " in + *[\ \ ]-Wall[\ \ ]*) ;; + *) CFLAGS="$CFLAGS -Wall " ;; + esac + case " $CFLAGS " in + *[\ \ ]-pedantic[\ \ ]*) ;; + *) CFLAGS="$CFLAGS -pedantic " ;; + esac +fi +changequote([,])dnl + +# Checks for library functions. +AC_CHECK_FUNCS([memmove memset strdup]) +AC_TYPE_SIGNAL + +# Checks for configure options + +m4_define(debug_default, + m4_if(m4_eval(fribidi_minor_version() % 2),1,yes,minimum)) + +# --enable-debug +AC_ARG_ENABLE(debug, + AS_HELP_STRING([--enable-debug], + [turn on debugging @<:@default=debug_default()@:>@]),, + enableval=debug_default()) +if test x$enableval = xyes; then + AC_DEFINE(DEBUG,1, + [Define to 1 if you want to include debug code in the library]) +fi + +# --enable-malloc +AC_ARG_ENABLE(debug, + AS_HELP_STRING([--enable-malloc], + [use simple malloc instead of memory chunks])) +if test x$enable_glib = xyes; then + AC_DEFINE(USE_SIMPLE_MALLOC,1, + [Define to 1 if you want to use simple mallocs instead of memory chunks]) +fi + +# --disable-charsets +AC_ARG_ENABLE(charsets, + AS_HELP_STRING([--disable-charsets], + [exclude charset conversion codes from the library])) +if test x$enable_charsets = xno; then + FRIBIDI_CHARSETS=0 +else + FRIBIDI_CHARSETS=1 +fi +AC_SUBST(FRIBIDI_CHARSETS) +AM_CONDITIONAL(FRIBIDI_CHARSETS, test x$FRIBIDI_CHARSETS = x1) + +# --without-glib +AC_ARG_WITH(glib, + AS_HELP_STRING([--without-glib], + [do not use Glib])) +GLIB_PACKAGE=glib-2.0 +GLIB_LIBS= +GLIB_CFLAGS= +if test x$with_glib = xyes; then + PKG_CHECK_MODULES(GLIB,$GLIB_PACKAGE) + FRIBIDI_USE_GLIB=1 +else +if test x$with_glib = xno; then + FRIBIDI_USE_GLIB=0 +else + PKG_CHECK_MODULES(GLIB,$GLIB_PACKAGE, + FRIBIDI_USE_GLIB=1, + FRIBIDI_USE_GLIB=0) +fi +fi +if test x$FRIBIDI_USER_GLIB = x0; then + GLIB_PACKAGE= +fi +AC_SUBST(GLIB_PACKAGE) +AC_SUBST(GLIB_LIBS) +AC_SUBST(GLIB_CFLAGS) +AC_SUBST(FRIBIDI_USE_GLIB) +AM_CONDITIONAL(FRIBIDI_USE_GLIB, test "$FRIBIDI_USE_GLIB" = 1) + +# Generate output +AC_CONFIG_FILES([fribidi.pc + fribidi.spec + lib/fribidi-config.h + Makefile + tablegen/Makefile + tablegen/unidata/Makefile + charset/Makefile + lib/Makefile + bin/Makefile + doc/Makefile + test/Makefile]) +AC_OUTPUT diff --git a/doc/Makefile.am b/doc/Makefile.am new file mode 100644 index 0000000..c1db3d6 --- /dev/null +++ b/doc/Makefile.am @@ -0,0 +1,27 @@ + +libfribidi_mans = \ + fribidi_get_bidi_type.3 + fribidi_get_bidi_types.3 + fribidi_log2vis.3 + fribidi_log2vis_get_embedding_levels.3 + fribidi_remove_bidi_marks.3 + fribidi_get_mirror_char.3 + fribidi_debug_status.3 + fribidi_set_debug.3 + fribidi_mirroring_status.3 + fribidi_set_mirroring.3 + fribidi_reorder_nsm_status.3 + fribidi_set_reorder_nsm.3 + + +if FRIBIDI_CHARSETS + + +endif + +headers = +include $(top_srcdir)/charset/Headers.mk +headers += $(libfribidi_char_sets_la_headers) +include $(top_srcdir)/lib/Headers.mk +headers += $(libfribidi_la_headers) + diff --git a/fribidi.pc.in b/fribidi.pc.in new file mode 100644 index 0000000..5db6e50 --- /dev/null +++ b/fribidi.pc.in @@ -0,0 +1,13 @@ +# @configure_input@ + +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: @PACKAGE_NAME@ +Description: Unicode Bidirectional Algorithm Library +Requires: @GLIB_PACKAGE@ +Version: @VERSION@ +Libs: -L${libdir} -lfribidi +Cflags: -I${includedir}/@PACKAGE@ diff --git a/fribidi.spec.in b/fribidi.spec.in new file mode 100644 index 0000000..056a7ff --- /dev/null +++ b/fribidi.spec.in @@ -0,0 +1,145 @@ +# This spec file creates three packages: +# +# Everything: +# (this is equivalent to two others together) +# @PACKAGE@N-version-release-arch.rpm +# Runtime material: Shared library and command line tool +# lib@PACKAGE@N-version-release-arch.rpm +# Development material: Static library and header files +# (requires lib@PACKAGE@N) +# lib@PACKAGE@N-devel-version-release-arch.rpm +# Where N is the major version number. + +%define name @PACKAGE@ +%define ver @FRIBIDI_VERSION@ +%define major @FRIBIDI_MAJOR_VERSION@ +%define minor @FRIBIDI_MINOR_VERSION@ +%define micro @FRIBIDI_MICRO_VERSION@ +%define apiver @FRIBIDI_INTERFACE_VERSION@ +%define rel @FRIBIDI_RPM_RELEASE@ +%define prefix %{_prefix} + +Name: %{name} +Version: %{ver} +Release: %{rel} +Serial: %{apiver} +License: LGPL +Source: http://prdownloads.sourceforge.net/%{name}/%{name}-%{ver}.tar.gz +URL: http://%{name}.sourceforge.net/ +BuildRoot: %{_tmppath}/%{name} +Summary: Library implementing the Unicode Bidirectional Algorithm +Group: System/Libraries +%description +A library to handle bidirectional scripts (eg. hebrew, arabic), so that +the display is done in the proper way; while the text data itself is +always written in logical order. + +%package -n %{name}%{major} +Summary: Library implementing the Unicode Bidirectional Algorithm +Group: System/Libraries +Provides: lib%{name}%{major} +Provides: lib%{name}%{major}-devel +%description -n %{name}%{major} +A library to handle bidirectional scripts (eg. hebrew, arabic), so that +the display is done in the proper way; while the text data itself is +always written in logical order. + +Install %{name}%{major} if you want to run or develop programs that use %{name}. + + +%package -n lib%{name}%{major} +Summary: Library implementing the Unicode Bidirectional Algorithm +Group: System/Libraries +Conflicts: %{name}%{major} +%description -n lib%{name}%{major} +The lib%{name}%{major} package includes the shared libraries for the %{name}%{major} package. + +Install lib%{name}%{major} if you want to run programs which use %{name}. + + +%package -n lib%{name}%{major}-devel +Summary: Library implementing the Unicode Bidirectional Algorithm +Group: Development/C +Requires: lib%{name}%{major} = %{ver} +Conflicts: %{name}%{major} +%description -n lib%{name}%{major}-devel +The lib%{name}%{major}-devel package includes the static libraries and header files +for the %{name}%{major} package. + +Install lib%{name}%{major}-devel if you want to develop programs which will use +%{name}. + + +%prep +%setup + +%build +if [ ! -x ./configure ];then +./bootstrap +fi + +./configure %{_target_platform} \ + --prefix=%{_prefix} --exec-prefix=%{_exec_prefix} \ + --bindir=%{_bindir} --sbindir=%{_sbindir} \ + --sysconfdir=%{_sysconfdir} --datadir=%{_datadir} \ + --includedir=%{_includedir} \ + --libdir=%{_libdir} --libexecdir=%{_libexecdir} \ + --mandir=%{_mandir} --infodir=%{_infodir} \ + --localstatedir=%{_localstatedir} --sharedstatedir=%{_sharedstatedir} + +make OPT_CFLAGS="$RPM_OPT_FLAGS" + +%install +rm -rf "$RPM_BUILD_ROOT" +mkdir -p "$RPM_BUILD_ROOT%{prefix}" +make DESTDIR="$RPM_BUILD_ROOT" install + + +%clean +rm -rf "$RPM_BUILD_ROOT" + +%post -n %{name}%{major} -p /sbin/ldconfig +%postun -n %{name}%{major} -p /sbin/ldconfig + +%post -n lib%{name}%{major} -p /sbin/ldconfig +%postun -n lib%{name}%{major} -p /sbin/ldconfig + +%files -n %{name}%{major} +%defattr(-,root,root) +%doc README AUTHORS COPYING ChangeLog TODO THANKS NEWS +%{_bindir}/%{name} +%{_bindir}/%{name}-config +%{_libdir}/*.so.* +%{_libdir}/pkgconfig/%{name}.pc +%{_libdir}/*.a +%{_libdir}/*.la +%{_libdir}/*.so +%{_includedir}/* + +%files -n lib%{name}%{major} +%defattr(-, root, root) +%doc README AUTHORS COPYING ChangeLog TODO THANKS NEWS +%{_bindir}/%{name} +%{_bindir}/%{name}-config +%{_libdir}/*.so.* + +%files -n lib%{name}%{major}-devel +%defattr(-, root, root) +%{_libdir}/*.a +%{_libdir}/*.la +%{_libdir}/*.so +%{_includedir}/* +%{_libdir}/pkgconfig/%{name}.pc + + +%changelog + +* Tue Mar 12 2002 Behdad Esfahbod <behdad@bamdad.org> +- Use License instead of Copyright +- Moved pkgconfig to devel package instead of lib package. + +* Sat Jan 26 2002 Behdad Esfahbod <behdad@bamdad.org> +- CFLAGS changed to OPT_CFLAGS. + +* Wed Jan 9 2002 Behdad Esfahbod <behdad@bamdad.org> +- First spec released. diff --git a/gen.tab/Makefile.am b/gen.tab/Makefile.am new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/gen.tab/Makefile.am diff --git a/gen.tab/gen-bidi-type-tab.c b/gen.tab/gen-bidi-type-tab.c new file mode 100644 index 0000000..dbfa590 --- /dev/null +++ b/gen.tab/gen-bidi-type-tab.c @@ -0,0 +1,267 @@ +/* FriBidi - Library of BiDi algorithm + * Copyright (C) 2001,2002 Behdad Esfahbod. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library, in a file named COPYING; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA + * + * For licensing issues, contact <fwpg@sharif.edu>. + */ + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include "packtab.h" +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include "fribidi_unicode.h" + +#ifndef SIZEOF_CHAR +#define SIZEOF_CHAR sizeof (char) +#endif + +static void +err ( + char *msg +) +{ + fprintf (stderr, "fribidi_create_char_types: %s\n", msg); + exit (1); +} + +static void +err2 ( + char *fmt, + char *p +) +{ + fprintf (stderr, "fribidi_create_char_types: "); + fprintf (stderr, fmt, p); + fprintf (stderr, "\n"); + exit (1); +} + +/* *INDENT-OFF* */ +struct +{ + char *name; + int key; +} +type_names[] = +{ + {"LTR", 0}, {"L", 0}, + {"RTL", 1}, {"R", 1}, + {"AL", 2}, + {"ON", 3}, + {"BN", 4}, + {"AN", 5}, + {"BS", 6}, {"B", 6}, + {"CS", 7}, + {"EN", 8}, + {"ES", 9}, + {"ET", 10}, + {"LRE", 11}, + {"LRO", 12}, + {"NSM", 13}, + {"PDF", 14}, + {"RLE", 15}, + {"RLO", 16}, + {"SS", 17}, {"S", 17}, + {"WS", 18}, +}; +/* *INDENT-ON* */ + +#define type_names_count (sizeof (type_names) / sizeof (type_names[0])) + +static char *names[type_names_count]; + +static char *unidata_file; + +static char +get_type ( + char *s +) +{ + int i; + + for (i = 0; i < type_names_count; i++) + if (!strcmp (s, type_names[i].name)) + return type_names[i].key; + err2 ("type name `%s' not found", s); + return 0; +} + +#define table_name "FriBidiPropertyBlock" +#define key_type_name "FriBidiPropCharType" +#define macro_name "FRIBIDI_GET_TYPE" +#define function_name "fribidi_get_type_internal" +#define char_type_name "FriBidiCharType" +#define char_name "FriBidiChar" +#define prop_to_type_name "fribidi_prop_to_type" +#define default_type "LTR" +#define export_api "FRIBIDI_API" + +static int table[FRIBIDI_UNICODE_CHARS]; + +static void +init_table ( +) +{ + int i; + int deftype = get_type (default_type), + RTL = get_type ("RTL"), AL = get_type ("AL"); + + for (i = 0; i < type_names_count; i++) + names[i] = 0; + for (i = type_names_count - 1; i >= 0; i--) + names[type_names[i].key] = type_names[i].name; + + /* initialize table */ + for (i = 0; i < FRIBIDI_UNICODE_CHARS; i++) + table[i] = deftype; + for (i = 0x590; i < 0x600; i++) + table[i] = RTL; + for (i = 0xFB1D; i < 0xFB50; i++) + table[i] = RTL; + for (i = 0x600; i < 0x7C0; i++) + table[i] = AL; + for (i = 0xFB50; i < 0xFE00; i++) + table[i] = AL; + for (i = 0xFE70; i < 0xFF00; i++) + table[i] = AL; +} + +static void +read_unicode_data ( +) +{ + char s[500], tp[10]; + unsigned int i; + FILE *f; + + printf ("Reading `UnicodeData.txt'\n"); + if (!(f = fopen (unidata_file, "rt"))) + err2 ("error: cannot open `%s' for reading", unidata_file); + while (fgets (s, sizeof s, f)) + { + sscanf (s, "%x;%*[^;];%*[^;];%*[^;];%[^;]", &i, tp); + table[i] = get_type (tp); + } + fclose (f); +} + +static char * +headermacro ( + char *file +) +{ + char *t = strdup (file); + char *p = t; + while (*p) + { + if (*p >= 'a' && *p <= 'z') + *p += 'A' - 'a'; + else if ((*p < 'A' || *p > 'Z') && (*p < '0' || *p > '9')) + *p = '_'; + p++; + } + return t; +} + +static void +write_char_type ( + char *file, + int max_depth +) +{ + int i; + FILE *f; + char *FILENAME = headermacro (file); + + printf ("Writing `%s', it may take a few minutes\n", file); + if (!(f = fopen (file, "wt"))) + err2 ("error: cannot open `%s' for writing", file); + fprintf (f, "/*\n" + " This file was automatically created from UnicodeData.txt version %s\n" + " by fribidi_create_char_types\n*/\n\n", FRIBIDI_UNICODE_VERSION); + + fprintf (f, "#ifndef %s\n#define %s\n\n#include \"fribidi.h\"\n\n", + FILENAME, FILENAME); + + for (i = 0; i < type_names_count; i++) + if (names[i]) + fprintf (f, "#define %s FRIBIDI_PROP_TYPE_%s\n", names[i], names[i]); + fprintf (f, "\n"); + + fprintf (f, "#define PACKTAB_UINT8 fribidi_uint8\n"); + fprintf (f, "#define PACKTAB_UINT16 fribidi_uint16\n"); + fprintf (f, "#define PACKTAB_UINT32 fribidi_uint32\n"); + + if (!pack_table + (table, FRIBIDI_UNICODE_CHARS, SIZEOF_CHAR, max_depth, 3, names, + key_type_name, table_name, macro_name, f)) + err ("error: insufficient memory, decrease max_depth"); + + for (i = type_names_count - 1; i >= 0; i--) + if (names[i]) + fprintf (f, "#undef %s\n", names[i]); + + fprintf (f, + "/*======================================================================\n" + " * %s() returns the bidi type of a character.\n" + " *----------------------------------------------------------------------*/\n" + "%s %s\n" + "%s (%s uch)\n" + "{\n" + " if (uch < 0x%x)\n" + " return %s[(unsigned char)%s (uch)];\n" + " else\n" + " return FRIBIDI_TYPE_%s;\n" + " /* Non-Unicode chars */\n" + "}\n" + "\n", + function_name, export_api, char_type_name, function_name, + char_name, FRIBIDI_UNICODE_CHARS, prop_to_type_name, macro_name, + default_type); + fprintf (f, "\n#endif /* %s */\n", FILENAME); + + fclose (f); +} + +int +main ( + int argc, + char **argv +) +{ + int max_depth; + char file[50], *p; + if (argc < 2) + err ("usage: fribidi_create_char_types max_depth [UnicodeData.txt path]"); + p = (argc >= 3) ? argv[2] : "unidata"; + unidata_file = malloc (50 + strlen (p)); + sprintf (unidata_file, "%s/UnicodeData.txt", p); + max_depth = atoi (argv[1]); + if (!max_depth) + err ("invalid depth"); + if (max_depth < 2 || max_depth > 9) + err2 ("invalid max_depth `%s', max_depth should be between 2 and 9", + argv[1]); + sprintf (file, "fribidi_tab_char_type_%d.i", max_depth); + init_table (); + read_unicode_data (); + write_char_type (file, max_depth); + return 0; +} diff --git a/gen.tab/gen-mirroring-tab.c b/gen.tab/gen-mirroring-tab.c new file mode 100644 index 0000000..611b1b4 --- /dev/null +++ b/gen.tab/gen-mirroring-tab.c @@ -0,0 +1,152 @@ +/* FriBidi - Library of BiDi algorithm + * Copyright (C) 2001,2002 Behdad Esfahbod. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library, in a file named COPYING; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA + * + * For licensing issues, contact <fwpg@sharif.edu>. + */ + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif +#include "fribidi_unicode.h" + +static void +err2 ( + char *fmt, + char *p +) +{ + fprintf (stderr, "fribidi_create_mirroring: error: "); + fprintf (stderr, fmt, p); + fprintf (stderr, "\n"); + exit (1); +} + +static int table[0x110000]; +static char *bidi_mirroring_file; + +static int mirroring_count; + +static void +read_bidi_mirroring ( +) +{ + char s[500]; + unsigned int i, j; + FILE *f; + + for (i = 0; i < 0x110000; i++) + table[i] = 0; + mirroring_count = 0; + printf ("Reading `BidiMirroring.txt'\n"); + if (!(f = fopen (bidi_mirroring_file, "rt"))) + err2 ("cannot open `%s' for reading", bidi_mirroring_file); +/* fgets (s, sizeof s, f); + sscanf (s, "# BidiMirroring-%s.txt", bidi_mirroring_version = malloc (20));*/ + while (fgets (s, sizeof s, f)) + { + if (s[0] == '#' || s[0] == '\0' || s[0] == '\n') + continue; + sscanf (s, "%x; %x", &i, &j); + table[i] = j; + table[j] = i; + mirroring_count++; + } + fclose (f); +} + +static char * +headermacro ( + char *file +) +{ + char *t = strdup (file); + char *p = t; + while (*p) + { + if (*p >= 'a' && *p <= 'z') + *p += 'A' - 'a'; + else if ((*p < 'A' || *p > 'Z') && (*p < '0' || *p > '9')) + *p = '_'; + p++; + } + return t; +} + +static void +write_mirror ( + char *file +) +{ + int i; + FILE *f; + char *FILENAME = headermacro (file); + + printf ("Writing `%s'\n", file); + if (!(f = fopen (file, "wt"))) + err2 ("cannot open `%s' for writing", file); + fprintf (f, "/*\n" + " This file was automatically created from BidiMirroring.txt, version %s\n" + " by fribidi_create_mirroring\n*/\n\n", FRIBIDI_UNICODE_VERSION); + fprintf (f, "#ifndef %s\n#define %s\n\n#include \"fribidi.h\"\n\n", + FILENAME, FILENAME); + fprintf (f, "/*\n" + " Mirrored characters include all the characters in the Unicode list\n" + " that have been declared as being mirrored and that have a mirrored\n" + " equivalent.\n" + "\n" + " There are lots of characters that are designed as being mirrored\n" + " but do not have any mirrored glyph, e.g. the sign for there exist.\n"); + fprintf (f, + " Are these used in Arabic? That is are all the mathematical signs\n" + " that are assigned to be mirrorable actually mirrored in Arabic?\n" + " If that is the case, we'll change the below code to include also\n" + " characters that mirror to themself. It will then be the responsibility\n" + " of the display engine to actually mirror these.\n" "*/\n\n"); + fprintf (f, "/* *INDENT-OFF" "* */\n\n"); + fprintf (f, "static const struct\n" + "{\n" + " FriBidiChar ch, mirrored_ch;\n" + "}\n" "FriBidiMirroredChars[] =\n" "{\n"); + for (i = 0; i < 0x110000; i++) + if (table[i]) + fprintf (f, " {0x%04X, 0x%04X},\n", i, table[i]); + fprintf (f, "} ;\n\n"); + fprintf (f, "/* *INDE" "NT-ON* */\n\n"); + fprintf (f, "const int nFriBidiMirroredChars = %d;\n\n", mirroring_count); + fprintf (f, "\n#endif /* %s */\n", FILENAME); + fclose (f); +} + +int +main ( + int argc, + char **argv +) +{ + char *p; + + p = (argc >= 2) ? argv[1] : "unidata"; + bidi_mirroring_file = malloc (50 + strlen (p)); + sprintf (bidi_mirroring_file, "%s/BidiMirroring.txt", p); + read_bidi_mirroring (); + write_mirror ("fribidi_tab_mirroring.i"); + return 0; +} diff --git a/gen.tab/packtab.c b/gen.tab/packtab.c new file mode 100644 index 0000000..311090a --- /dev/null +++ b/gen.tab/packtab.c @@ -0,0 +1,364 @@ +/* PackTab - Pack a static table + * Copyright (C) 2001 Behdad Esfahbod. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library, in a file named COPYING; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA + * + * For licensing issues, contact <fwpg@sharif.edu>. + */ + +/* + 8 <= N <= 2^21 + int key + 1 <= max_depth <= 21 +*/ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "packtab.h" + +typedef int uni_table[1024 * 1024 * 2]; +static int n, a, max_depth, N, digits, tab_width, per_row; +static uni_table temp, x, perm, *tab; +static int pow[22], cluster, cmpcluster; +static char **name, *key_type_name, *table_name, *macro_name; +static FILE *f; + +static void +init ( + int *base +) +{ + int i; + pow[0] = 1; + for (i = 1; i <= 21; i++) + pow[i] = pow[i - 1] * 2; + for (n = 21; pow[n] > N || N % pow[n]; n--) + ; + digits = (n + 3) / 4; + for (i = 6; i; i--) + if (pow[i] * (tab_width + 1) < 80) + break; + per_row = pow[i]; +} + +static int +compare ( + const void *r, + const void *s +) +{ + int i; + for (i = 0; i < cmpcluster; i++) + if (((int *) r)[i] != ((int *) s)[i]) + return ((int *) r)[i] - ((int *) s)[i]; + return 0; +} + +static int lev, p[22], t[22], c[22], clusters[22], s, nn; +static int best_lev, best_p[22], best_t[22], best_c[22], best_cluster[22], + best_s; + +static void +found ( + void +) +{ + int i; + + if (s < best_s) + { + best_s = s; + best_lev = lev; + for (i = 0; i <= lev; i++) + { + best_p[i] = p[i]; + best_c[i] = c[i]; + best_t[i] = t[i]; + best_cluster[i] = clusters[i]; + } + } +} + +static void +bt ( + int node_size +) +{ + int i, j, k, y, sbak, key_bytes; + + if (t[lev] == 1) + { + found (); + return; + } + if (lev == max_depth) + return; + + for (i = 1 - t[lev] % 2; i <= nn + (t[lev] >> nn) % 2; i++) + { + nn -= (p[lev] = i); + clusters[lev] = cluster = (i && nn >= 0) ? pow[i] : t[lev]; + cmpcluster = cluster + 1; + + t[lev + 1] = (t[lev] - 1) / cluster + 1; + for (j = 0; j < t[lev + 1]; j++) + { + memmove (temp + j * cmpcluster, tab[lev] + j * cluster, + cluster * sizeof (tab[lev][0])); + temp[j * cmpcluster + cluster] = j; + } + qsort (temp, t[lev + 1], cmpcluster * sizeof (temp[0]), compare); + for (j = 0; j < t[lev + 1]; j++) + { + perm[j] = temp[j * cmpcluster + cluster]; + temp[j * cmpcluster + cluster] = 0; + } + k = 1; + y = 0; + tab[lev + 1][perm[0]] = perm[0]; + for (j = 1; j < t[lev + 1]; j++) + { + if (compare (temp + y, temp + y + cmpcluster)) + { + k++; + tab[lev + 1][perm[j]] = perm[j]; + } + else + tab[lev + 1][perm[j]] = tab[lev + 1][perm[j - 1]]; + y += cmpcluster; + } + sbak = s; + s += k * node_size * cluster; + c[lev] = k; + + if (s >= best_s) + { + s = sbak; + nn += i; + return; + } + + key_bytes = k * cluster; + key_bytes = key_bytes < 0xff ? 1 : key_bytes < 0xffff ? 2 : 4; + lev++; + bt (key_bytes); + lev--; + + s = sbak; + nn += i; + } +} + +static void +solve ( + void +) +{ + best_lev = max_depth + 2; + best_s = N * a * 2; + lev = 0; + s = 0; + nn = n; + t[0] = N; + bt (a); +} + +static void +write_array ( + int max_key +) +{ + int i, j, k, y, ii, ofs; + char *key_type; + + if (best_t[lev] == 1) + return; + + nn -= (i = best_p[lev]); + cluster = best_cluster[lev]; + cmpcluster = cluster + 1; + + t[lev + 1] = best_t[lev + 1]; + for (j = 0; j < t[lev + 1]; j++) + { + memmove (temp + j * cmpcluster, tab[lev] + j * cluster, + cluster * sizeof (tab[lev][0])); + temp[j * cmpcluster + cluster] = j; + } + qsort (temp, t[lev + 1], cmpcluster * sizeof (temp[0]), compare); + for (j = 0; j < t[lev + 1]; j++) + { + perm[j] = temp[j * cmpcluster + cluster]; + temp[j * cmpcluster + cluster] = 0; + } + k = 1; + y = 0; + tab[lev + 1][perm[0]] = x[0] = perm[0]; + for (j = 1; j < t[lev + 1]; j++) + { + if (compare (temp + y, temp + y + cmpcluster)) + { + x[k] = perm[j]; + tab[lev + 1][perm[j]] = x[k]; + k++; + } + else + tab[lev + 1][perm[j]] = tab[lev + 1][perm[j - 1]]; + y += cmpcluster; + } + + i = 0; + for (ii = 1; ii < k; ii++) + if (x[ii] < x[i]) + i = ii; + + key_type = !lev ? key_type_name : + max_key <= 0xff ? "PACKTAB_UINT8" : + max_key <= 0xffff ? "PACKTAB_UINT16" : "PACKTAB_UINT32"; + fprintf (f, "static const %s %sLevel%d[%d*%d] = {", key_type, table_name, + best_lev - lev - 1, cluster, k); + ofs = 0; + for (ii = 0; ii < k; ii++) + { + int kk, jj; + fprintf (f, "\n\n#define %sLevel%d_%0*X 0x%0X\n", table_name, + best_lev - lev - 1, digits, x[i] * pow[n - nn], ofs); + kk = x[i] * cluster; + if (!lev) + if (name) + for (j = 0; j < cluster; j++) + { + if (!(j % per_row) && j != cluster - 1) + fprintf (f, "\n "); + fprintf (f, "%*s,", tab_width, name[tab[lev][kk++]]); + } + else + for (j = 0; j < cluster; j++) + { + if (!(j % per_row) && j != cluster - 1) + fprintf (f, "\n "); + fprintf (f, "%*d,", tab_width, tab[lev][kk++]); + } + else + for (j = 0; j < cluster; j++, kk++) + fprintf (f, "\n %sLevel%d_%0*X, /* %0*X..%0*X */", table_name, + best_lev - lev, digits, + tab[lev][kk] * pow[n - nn - best_p[lev]], digits, + x[i] * pow[n - nn] + j * pow[n - nn - best_p[lev]], digits, + x[i] * pow[n - nn] + (j + 1) * pow[n - nn - best_p[lev]] - + 1); + ofs += cluster; + jj = i; + for (j = 0; j < k; j++) + if (x[j] > x[i] && (x[j] < x[jj] || jj == i)) + jj = j; + i = jj; + } + fprintf (f, "\n};\n\n"); + lev++; + write_array (cluster * k); + lev--; +} + +static void +write_source ( + void +) +{ + int i, j; + + lev = 0; + s = 0; + nn = n; + t[0] = N; + fprintf (f, "\n" "/* *INDENT-OFF* */\n\n"); + write_array (0); + fprintf (f, "/* *INDENT-ON* */\n\n"); + + fprintf (f, "#define %s(x)", macro_name); + j = 1; + for (i = best_lev - 1; i >= 0; i--) + { + fprintf (f, "\t\\\n\t%sLevel%d[(x)", table_name, i); + if (j != 1) + fprintf (f, "/%d", j); + if (i) + fprintf (f, "%%%d +", pow[best_p[best_lev - 1 - i]]); + j *= best_cluster[best_lev - 1 - i]; + } + for (i = 0; i < best_lev; i++) + fprintf (f, "]"); + fprintf (f, "\n\n"); +} + +static void +write_out ( +) +{ + int i; + fprintf (f, "/*\n" + " Automatically generated by packtab.c version %d\n\n" + " just use %s(key)\n\n" + " assumed sizeof(%s) == %d\n" + " required memory: %d\n" + " lookups: %d\n" + " partition shape: %s", + packtab_version, macro_name, key_type_name, a, best_s, best_lev, + table_name); + for (i = best_lev - 1; i >= 0; i--) + fprintf (f, "[%d]", best_cluster[i]); + fprintf (f, "\n" " different table entries:"); + for (i = best_lev - 1; i >= 0; i--) + fprintf (f, " %d", best_c[i]); + fprintf (f, "\n*/\n"); + write_source (); +} + +int +pack_table ( + int *base, + int key_num, + int key_size, + int p_max_depth, + int p_tab_width, + char **p_name, + char *p_key_type_name, + char *p_table_name, + char *p_macro_name, + FILE * out +) +{ + N = key_num; + a = key_size; + max_depth = p_max_depth; + tab_width = p_tab_width; + name = p_name; + key_type_name = p_key_type_name; + table_name = p_table_name; + macro_name = p_macro_name; + f = out; + init (base); + if (!(tab = malloc ((n + 1) * sizeof (tab[0])))) + return 0; + memmove (tab[0], base, key_num * sizeof (int)); + solve (); + write_out (); + free (tab); + return 1; +} + +/* End of packtab.c */ diff --git a/gen.tab/packtab.h b/gen.tab/packtab.h new file mode 100644 index 0000000..6a80e13 --- /dev/null +++ b/gen.tab/packtab.h @@ -0,0 +1,49 @@ +/* PackTab - Pack a static table + * Copyright (C) 2001 Behdad Esfahbod. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library, in a file named COPYING; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA + * + * For licensing issues, contact <fwpg@sharif.edu>. + */ + +#ifndef PACKTAB_H +#define PACKTAB_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +#define packtab_version 2 + + int pack_table ( + int *base, + int key_num, + int key_size, + int max_depth, + int tab_width, + char **name, + char *key_type_name, + char *table_name, + char *macro_name, + FILE * out + ); + +#ifdef __cplusplus +} +#endif + +#endif /* PACKTAB_H */ diff --git a/gen.tab/unidata/BidiMirroring.txt b/gen.tab/unidata/BidiMirroring.txt new file mode 100644 index 0000000..f799da1 --- /dev/null +++ b/gen.tab/unidata/BidiMirroring.txt @@ -0,0 +1,525 @@ +# BidiMirroring-4.0.0.txt +# +# This file is an informative supplement to the UnicodeData file. It +# lists characters that have the mirrored property +# where 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 4.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 with the "mirrored" property but no appropriate mirrors are +# listed as comments at the end of the file. +# +# 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 and 4.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 +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 # NEITHER LESS-THAN NOR GREATER-THAN +2279; 2278 # 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 +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 +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; 2A2C # 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 +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 +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 + +# 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 +# 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 diff --git a/gen.tab/unidata/ReadMe.txt b/gen.tab/unidata/ReadMe.txt new file mode 100644 index 0000000..763a23f --- /dev/null +++ b/gen.tab/unidata/ReadMe.txt @@ -0,0 +1,40 @@ +2004 March 30 + +This directory contains the Unicode Character Database +data files. + +Currently, the Unicode Character Database files are at +the version level: + + Unicode Standard, Version 4.0.1 + +For information about the standard itself, see: + +http://www.unicode.org/versions/Unicode4.0.1/ + +Detailed documentation of the files constituting the +Unicode Character Database (contributory data files for +the standard itself) can be found in UCD.html. + +Unihan.txt is a very large file. A zipped version is +also provided for downloading convenience: Unihan.zip. + +The current Unicode 4.0.1 version of Unihan.txt is also available in +two compressed formats in the Unicode 4.0.1 update directory. See: +http://www.unicode.org/Public/4.0-Update1/ +or +ftp://ftp.unicode.org/Public/4.0-Update1/ + +Unihan-4.0.1.zip for Windows. (Use winzip) +Unihan-4.0.1.txt.gz for Unix. (Use gzip or gunzip) + +Note that the files are zipped in +exactly the same format they have on the server (with Unix +line endings). From a browser, right-clicking on +Unihan.zip will allow automatic download and unzip on a +Windows system with winzip installed. + + + + + diff --git a/gen.tab/unidata/extracted/DerivedBidiClass.txt b/gen.tab/unidata/extracted/DerivedBidiClass.txt new file mode 100644 index 0000000..c1ffc1d --- /dev/null +++ b/gen.tab/unidata/extracted/DerivedBidiClass.txt @@ -0,0 +1,1299 @@ +# DerivedBidiClass-4.0.1.txt +# Date: 2004-03-11, 18:33:24 GMT [MD] +# +# Unicode Character Database +# Copyright (c) 1991-2004 Unicode, Inc. +# For terms of use, see http://www.unicode.org/terms_of_use.html +# For documentation, see UCD.html + +# ================================================ + +# Bidi Class (listing UnicodeData.txt, field 4: see UCD.html) + +# All code points not explicitly listed for Bidi_Class +# have the value Left_To_Right (L). + +# ================================================ + +# Bidi_Class=Left_To_Right + +0041..005A ; L # L& [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z +0061..007A ; L # L& [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z +00AA ; L # L& FEMININE ORDINAL INDICATOR +00B5 ; L # L& MICRO SIGN +00BA ; L # L& MASCULINE ORDINAL INDICATOR +00C0..00D6 ; L # L& [23] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER O WITH DIAERESIS +00D8..00F6 ; L # L& [31] LATIN CAPITAL LETTER O WITH STROKE..LATIN SMALL LETTER O WITH DIAERESIS +00F8..01BA ; L # L& [195] LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER EZH WITH TAIL +01BB ; L # Lo LATIN LETTER TWO WITH STROKE +01BC..01BF ; L # L& [4] LATIN CAPITAL LETTER TONE FIVE..LATIN LETTER WYNN +01C0..01C3 ; L # Lo [4] LATIN LETTER DENTAL CLICK..LATIN LETTER RETROFLEX CLICK +01C4..0236 ; L # L& [115] LATIN CAPITAL LETTER DZ WITH CARON..LATIN SMALL LETTER T WITH CURL +0250..02AF ; L # L& [96] LATIN SMALL LETTER TURNED A..LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL +02B0..02B8 ; L # Lm [9] MODIFIER LETTER SMALL H..MODIFIER LETTER SMALL Y +02BB..02C1 ; L # Lm [7] MODIFIER LETTER TURNED COMMA..MODIFIER LETTER REVERSED GLOTTAL STOP +02D0..02D1 ; L # Lm [2] MODIFIER LETTER TRIANGULAR COLON..MODIFIER LETTER HALF TRIANGULAR COLON +02E0..02E4 ; L # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP +02EE ; L # Lm MODIFIER LETTER DOUBLE APOSTROPHE +037A ; L # Lm GREEK YPOGEGRAMMENI +0386 ; L # L& GREEK CAPITAL LETTER ALPHA WITH TONOS +0388..038A ; L # L& [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS +038C ; L # L& GREEK CAPITAL LETTER OMICRON WITH TONOS +038E..03A1 ; L # L& [20] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK CAPITAL LETTER RHO +03A3..03CE ; L # L& [44] GREEK CAPITAL LETTER SIGMA..GREEK SMALL LETTER OMEGA WITH TONOS +03D0..03F5 ; L # L& [38] GREEK BETA SYMBOL..GREEK LUNATE EPSILON SYMBOL +03F7..03FB ; L # L& [5] GREEK CAPITAL LETTER SHO..GREEK SMALL LETTER SAN +0400..0481 ; L # L& [130] CYRILLIC CAPITAL LETTER IE WITH GRAVE..CYRILLIC SMALL LETTER KOPPA +0482 ; L # So CYRILLIC THOUSANDS SIGN +048A..04CE ; L # L& [69] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER EM WITH TAIL +04D0..04F5 ; L # L& [38] CYRILLIC CAPITAL LETTER A WITH BREVE..CYRILLIC SMALL LETTER CHE WITH DIAERESIS +04F8..04F9 ; L # L& [2] CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS..CYRILLIC SMALL LETTER YERU WITH DIAERESIS +0500..050F ; L # L& [16] CYRILLIC CAPITAL LETTER KOMI DE..CYRILLIC SMALL LETTER KOMI TJE +0531..0556 ; L # L& [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH +0559 ; L # Lm ARMENIAN MODIFIER LETTER LEFT HALF RING +055A..055F ; L # Po [6] ARMENIAN APOSTROPHE..ARMENIAN ABBREVIATION MARK +0561..0587 ; L # L& [39] ARMENIAN SMALL LETTER AYB..ARMENIAN SMALL LIGATURE ECH YIWN +0589 ; L # Po ARMENIAN FULL STOP +0903 ; L # Mc DEVANAGARI SIGN VISARGA +0904..0939 ; L # Lo [54] DEVANAGARI LETTER SHORT A..DEVANAGARI LETTER HA +093D ; L # Lo DEVANAGARI SIGN AVAGRAHA +093E..0940 ; L # Mc [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II +0949..094C ; L # Mc [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU +0950 ; L # Lo DEVANAGARI OM +0958..0961 ; L # Lo [10] DEVANAGARI LETTER QA..DEVANAGARI LETTER VOCALIC LL +0964..0965 ; L # Po [2] DEVANAGARI DANDA..DEVANAGARI DOUBLE DANDA +0966..096F ; L # Nd [10] DEVANAGARI DIGIT ZERO..DEVANAGARI DIGIT NINE +0970 ; L # Po DEVANAGARI ABBREVIATION SIGN +0982..0983 ; L # Mc [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA +0985..098C ; L # Lo [8] BENGALI LETTER A..BENGALI LETTER VOCALIC L +098F..0990 ; L # Lo [2] BENGALI LETTER E..BENGALI LETTER AI +0993..09A8 ; L # Lo [22] BENGALI LETTER O..BENGALI LETTER NA +09AA..09B0 ; L # Lo [7] BENGALI LETTER PA..BENGALI LETTER RA +09B2 ; L # Lo BENGALI LETTER LA +09B6..09B9 ; L # Lo [4] BENGALI LETTER SHA..BENGALI LETTER HA +09BD ; L # Lo BENGALI SIGN AVAGRAHA +09BE..09C0 ; L # Mc [3] BENGALI VOWEL SIGN AA..BENGALI VOWEL SIGN II +09C7..09C8 ; L # Mc [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI +09CB..09CC ; L # Mc [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU +09D7 ; L # Mc BENGALI AU LENGTH MARK +09DC..09DD ; L # Lo [2] BENGALI LETTER RRA..BENGALI LETTER RHA +09DF..09E1 ; L # Lo [3] BENGALI LETTER YYA..BENGALI LETTER VOCALIC LL +09E6..09EF ; L # Nd [10] BENGALI DIGIT ZERO..BENGALI DIGIT NINE +09F0..09F1 ; L # Lo [2] BENGALI LETTER RA WITH MIDDLE DIAGONAL..BENGALI LETTER RA WITH LOWER DIAGONAL +09F4..09F9 ; L # No [6] BENGALI CURRENCY NUMERATOR ONE..BENGALI CURRENCY DENOMINATOR SIXTEEN +09FA ; L # So BENGALI ISSHAR +0A03 ; L # Mc GURMUKHI SIGN VISARGA +0A05..0A0A ; L # Lo [6] GURMUKHI LETTER A..GURMUKHI LETTER UU +0A0F..0A10 ; L # Lo [2] GURMUKHI LETTER EE..GURMUKHI LETTER AI +0A13..0A28 ; L # Lo [22] GURMUKHI LETTER OO..GURMUKHI LETTER NA +0A2A..0A30 ; L # Lo [7] GURMUKHI LETTER PA..GURMUKHI LETTER RA +0A32..0A33 ; L # Lo [2] GURMUKHI LETTER LA..GURMUKHI LETTER LLA +0A35..0A36 ; L # Lo [2] GURMUKHI LETTER VA..GURMUKHI LETTER SHA +0A38..0A39 ; L # Lo [2] GURMUKHI LETTER SA..GURMUKHI LETTER HA +0A3E..0A40 ; L # Mc [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II +0A59..0A5C ; L # Lo [4] GURMUKHI LETTER KHHA..GURMUKHI LETTER RRA +0A5E ; L # Lo GURMUKHI LETTER FA +0A66..0A6F ; L # Nd [10] GURMUKHI DIGIT ZERO..GURMUKHI DIGIT NINE +0A72..0A74 ; L # Lo [3] GURMUKHI IRI..GURMUKHI EK ONKAR +0A83 ; L # Mc GUJARATI SIGN VISARGA +0A85..0A8D ; L # Lo [9] GUJARATI LETTER A..GUJARATI VOWEL CANDRA E +0A8F..0A91 ; L # Lo [3] GUJARATI LETTER E..GUJARATI VOWEL CANDRA O +0A93..0AA8 ; L # Lo [22] GUJARATI LETTER O..GUJARATI LETTER NA +0AAA..0AB0 ; L # Lo [7] GUJARATI LETTER PA..GUJARATI LETTER RA +0AB2..0AB3 ; L # Lo [2] GUJARATI LETTER LA..GUJARATI LETTER LLA +0AB5..0AB9 ; L # Lo [5] GUJARATI LETTER VA..GUJARATI LETTER HA +0ABD ; L # Lo GUJARATI SIGN AVAGRAHA +0ABE..0AC0 ; L # Mc [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II +0AC9 ; L # Mc GUJARATI VOWEL SIGN CANDRA O +0ACB..0ACC ; L # Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU +0AD0 ; L # Lo GUJARATI OM +0AE0..0AE1 ; L # Lo [2] GUJARATI LETTER VOCALIC RR..GUJARATI LETTER VOCALIC LL +0AE6..0AEF ; L # Nd [10] GUJARATI DIGIT ZERO..GUJARATI DIGIT NINE +0B02..0B03 ; L # Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA +0B05..0B0C ; L # Lo [8] ORIYA LETTER A..ORIYA LETTER VOCALIC L +0B0F..0B10 ; L # Lo [2] ORIYA LETTER E..ORIYA LETTER AI +0B13..0B28 ; L # Lo [22] ORIYA LETTER O..ORIYA LETTER NA +0B2A..0B30 ; L # Lo [7] ORIYA LETTER PA..ORIYA LETTER RA +0B32..0B33 ; L # Lo [2] ORIYA LETTER LA..ORIYA LETTER LLA +0B35..0B39 ; L # Lo [5] ORIYA LETTER VA..ORIYA LETTER HA +0B3D ; L # Lo ORIYA SIGN AVAGRAHA +0B3E ; L # Mc ORIYA VOWEL SIGN AA +0B40 ; L # Mc ORIYA VOWEL SIGN II +0B47..0B48 ; L # Mc [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI +0B4B..0B4C ; L # Mc [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU +0B57 ; L # Mc ORIYA AU LENGTH MARK +0B5C..0B5D ; L # Lo [2] ORIYA LETTER RRA..ORIYA LETTER RHA +0B5F..0B61 ; L # Lo [3] ORIYA LETTER YYA..ORIYA LETTER VOCALIC LL +0B66..0B6F ; L # Nd [10] ORIYA DIGIT ZERO..ORIYA DIGIT NINE +0B70 ; L # So ORIYA ISSHAR +0B71 ; L # Lo ORIYA LETTER WA +0B83 ; L # Lo TAMIL SIGN VISARGA +0B85..0B8A ; L # Lo [6] TAMIL LETTER A..TAMIL LETTER UU +0B8E..0B90 ; L # Lo [3] TAMIL LETTER E..TAMIL LETTER AI +0B92..0B95 ; L # Lo [4] TAMIL LETTER O..TAMIL LETTER KA +0B99..0B9A ; L # Lo [2] TAMIL LETTER NGA..TAMIL LETTER CA +0B9C ; L # Lo TAMIL LETTER JA +0B9E..0B9F ; L # Lo [2] TAMIL LETTER NYA..TAMIL LETTER TTA +0BA3..0BA4 ; L # Lo [2] TAMIL LETTER NNA..TAMIL LETTER TA +0BA8..0BAA ; L # Lo [3] TAMIL LETTER NA..TAMIL LETTER PA +0BAE..0BB5 ; L # Lo [8] TAMIL LETTER MA..TAMIL LETTER VA +0BB7..0BB9 ; L # Lo [3] TAMIL LETTER SSA..TAMIL LETTER HA +0BBE..0BBF ; L # Mc [2] TAMIL VOWEL SIGN AA..TAMIL VOWEL SIGN I +0BC1..0BC2 ; L # Mc [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU +0BC6..0BC8 ; L # Mc [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI +0BCA..0BCC ; L # Mc [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU +0BD7 ; L # Mc TAMIL AU LENGTH MARK +0BE7..0BEF ; L # Nd [9] TAMIL DIGIT ONE..TAMIL DIGIT NINE +0BF0..0BF2 ; L # No [3] TAMIL NUMBER TEN..TAMIL NUMBER ONE THOUSAND +0C01..0C03 ; L # Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA +0C05..0C0C ; L # Lo [8] TELUGU LETTER A..TELUGU LETTER VOCALIC L +0C0E..0C10 ; L # Lo [3] TELUGU LETTER E..TELUGU LETTER AI +0C12..0C28 ; L # Lo [23] TELUGU LETTER O..TELUGU LETTER NA +0C2A..0C33 ; L # Lo [10] TELUGU LETTER PA..TELUGU LETTER LLA +0C35..0C39 ; L # Lo [5] TELUGU LETTER VA..TELUGU LETTER HA +0C41..0C44 ; L # Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR +0C60..0C61 ; L # Lo [2] TELUGU LETTER VOCALIC RR..TELUGU LETTER VOCALIC LL +0C66..0C6F ; L # Nd [10] TELUGU DIGIT ZERO..TELUGU DIGIT NINE +0C82..0C83 ; L # Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA +0C85..0C8C ; L # Lo [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L +0C8E..0C90 ; L # Lo [3] KANNADA LETTER E..KANNADA LETTER AI +0C92..0CA8 ; L # Lo [23] KANNADA LETTER O..KANNADA LETTER NA +0CAA..0CB3 ; L # Lo [10] KANNADA LETTER PA..KANNADA LETTER LLA +0CB5..0CB9 ; L # Lo [5] KANNADA LETTER VA..KANNADA LETTER HA +0CBD ; L # Lo KANNADA SIGN AVAGRAHA +0CBE ; L # Mc KANNADA VOWEL SIGN AA +0CBF ; L # Mn KANNADA VOWEL SIGN I +0CC0..0CC4 ; L # Mc [5] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN VOCALIC RR +0CC6 ; L # Mn KANNADA VOWEL SIGN E +0CC7..0CC8 ; L # Mc [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI +0CCA..0CCB ; L # Mc [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO +0CD5..0CD6 ; L # Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK +0CDE ; L # Lo KANNADA LETTER FA +0CE0..0CE1 ; L # Lo [2] KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL +0CE6..0CEF ; L # Nd [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE +0D02..0D03 ; L # Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA +0D05..0D0C ; L # Lo [8] MALAYALAM LETTER A..MALAYALAM LETTER VOCALIC L +0D0E..0D10 ; L # Lo [3] MALAYALAM LETTER E..MALAYALAM LETTER AI +0D12..0D28 ; L # Lo [23] MALAYALAM LETTER O..MALAYALAM LETTER NA +0D2A..0D39 ; L # Lo [16] MALAYALAM LETTER PA..MALAYALAM LETTER HA +0D3E..0D40 ; L # Mc [3] MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN II +0D46..0D48 ; L # Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI +0D4A..0D4C ; L # Mc [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU +0D57 ; L # Mc MALAYALAM AU LENGTH MARK +0D60..0D61 ; L # Lo [2] MALAYALAM LETTER VOCALIC RR..MALAYALAM LETTER VOCALIC LL +0D66..0D6F ; L # Nd [10] MALAYALAM DIGIT ZERO..MALAYALAM DIGIT NINE +0D82..0D83 ; L # Mc [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA +0D85..0D96 ; L # Lo [18] SINHALA LETTER AYANNA..SINHALA LETTER AUYANNA +0D9A..0DB1 ; L # Lo [24] SINHALA LETTER ALPAPRAANA KAYANNA..SINHALA LETTER DANTAJA NAYANNA +0DB3..0DBB ; L # Lo [9] SINHALA LETTER SANYAKA DAYANNA..SINHALA LETTER RAYANNA +0DBD ; L # Lo SINHALA LETTER DANTAJA LAYANNA +0DC0..0DC6 ; L # Lo [7] SINHALA LETTER VAYANNA..SINHALA LETTER FAYANNA +0DCF..0DD1 ; L # Mc [3] SINHALA VOWEL SIGN AELA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA +0DD8..0DDF ; L # Mc [8] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN GAYANUKITTA +0DF2..0DF3 ; L # Mc [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA +0DF4 ; L # Po SINHALA PUNCTUATION KUNDDALIYA +0E01..0E30 ; L # Lo [48] THAI CHARACTER KO KAI..THAI CHARACTER SARA A +0E32..0E33 ; L # Lo [2] THAI CHARACTER SARA AA..THAI CHARACTER SARA AM +0E40..0E45 ; L # Lo [6] THAI CHARACTER SARA E..THAI CHARACTER LAKKHANGYAO +0E46 ; L # Lm THAI CHARACTER MAIYAMOK +0E4F ; L # Po THAI CHARACTER FONGMAN +0E50..0E59 ; L # Nd [10] THAI DIGIT ZERO..THAI DIGIT NINE +0E5A..0E5B ; L # Po [2] THAI CHARACTER ANGKHANKHU..THAI CHARACTER KHOMUT +0E81..0E82 ; L # Lo [2] LAO LETTER KO..LAO LETTER KHO SUNG +0E84 ; L # Lo LAO LETTER KHO TAM +0E87..0E88 ; L # Lo [2] LAO LETTER NGO..LAO LETTER CO +0E8A ; L # Lo LAO LETTER SO TAM +0E8D ; L # Lo LAO LETTER NYO +0E94..0E97 ; L # Lo [4] LAO LETTER DO..LAO LETTER THO TAM +0E99..0E9F ; L # Lo [7] LAO LETTER NO..LAO LETTER FO SUNG +0EA1..0EA3 ; L # Lo [3] LAO LETTER MO..LAO LETTER LO LING +0EA5 ; L # Lo LAO LETTER LO LOOT +0EA7 ; L # Lo LAO LETTER WO +0EAA..0EAB ; L # Lo [2] LAO LETTER SO SUNG..LAO LETTER HO SUNG +0EAD..0EB0 ; L # Lo [4] LAO LETTER O..LAO VOWEL SIGN A +0EB2..0EB3 ; L # Lo [2] LAO VOWEL SIGN AA..LAO VOWEL SIGN AM +0EBD ; L # Lo LAO SEMIVOWEL SIGN NYO +0EC0..0EC4 ; L # Lo [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI +0EC6 ; L # Lm LAO KO LA +0ED0..0ED9 ; L # Nd [10] LAO DIGIT ZERO..LAO DIGIT NINE +0EDC..0EDD ; L # Lo [2] LAO HO NO..LAO HO MO +0F00 ; L # Lo TIBETAN SYLLABLE OM +0F01..0F03 ; L # So [3] TIBETAN MARK GTER YIG MGO TRUNCATED A..TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA +0F04..0F12 ; L # Po [15] TIBETAN MARK INITIAL YIG MGO MDUN MA..TIBETAN MARK RGYA GRAM SHAD +0F13..0F17 ; L # So [5] TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN..TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS +0F1A..0F1F ; L # So [6] TIBETAN SIGN RDEL DKAR GCIG..TIBETAN SIGN RDEL DKAR RDEL NAG +0F20..0F29 ; L # Nd [10] TIBETAN DIGIT ZERO..TIBETAN DIGIT NINE +0F2A..0F33 ; L # No [10] TIBETAN DIGIT HALF ONE..TIBETAN DIGIT HALF ZERO +0F34 ; L # So TIBETAN MARK BSDUS RTAGS +0F36 ; L # So TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN +0F38 ; L # So TIBETAN MARK CHE MGO +0F3E..0F3F ; L # Mc [2] TIBETAN SIGN YAR TSHES..TIBETAN SIGN MAR TSHES +0F40..0F47 ; L # Lo [8] TIBETAN LETTER KA..TIBETAN LETTER JA +0F49..0F6A ; L # Lo [34] TIBETAN LETTER NYA..TIBETAN LETTER FIXED-FORM RA +0F7F ; L # Mc TIBETAN SIGN RNAM BCAD +0F85 ; L # Po TIBETAN MARK PALUTA +0F88..0F8B ; L # Lo [4] TIBETAN SIGN LCE TSA CAN..TIBETAN SIGN GRU MED RGYINGS +0FBE..0FC5 ; L # So [8] TIBETAN KU RU KHA..TIBETAN SYMBOL RDO RJE +0FC7..0FCC ; L # So [6] TIBETAN SYMBOL RDO RJE RGYA GRAM..TIBETAN SYMBOL NOR BU BZHI -KHYIL +0FCF ; L # So TIBETAN SIGN RDEL NAG GSUM +1000..1021 ; L # Lo [34] MYANMAR LETTER KA..MYANMAR LETTER A +1023..1027 ; L # Lo [5] MYANMAR LETTER I..MYANMAR LETTER E +1029..102A ; L # Lo [2] MYANMAR LETTER O..MYANMAR LETTER AU +102C ; L # Mc MYANMAR VOWEL SIGN AA +1031 ; L # Mc MYANMAR VOWEL SIGN E +1038 ; L # Mc MYANMAR SIGN VISARGA +1040..1049 ; L # Nd [10] MYANMAR DIGIT ZERO..MYANMAR DIGIT NINE +104A..104F ; L # Po [6] MYANMAR SIGN LITTLE SECTION..MYANMAR SYMBOL GENITIVE +1050..1055 ; L # Lo [6] MYANMAR LETTER SHA..MYANMAR LETTER VOCALIC LL +1056..1057 ; L # Mc [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR +10A0..10C5 ; L # L& [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE +10D0..10F8 ; L # Lo [41] GEORGIAN LETTER AN..GEORGIAN LETTER ELIFI +10FB ; L # Po GEORGIAN PARAGRAPH SEPARATOR +1100..1159 ; L # Lo [90] HANGUL CHOSEONG KIYEOK..HANGUL CHOSEONG YEORINHIEUH +115F..11A2 ; L # Lo [68] HANGUL CHOSEONG FILLER..HANGUL JUNGSEONG SSANGARAEA +11A8..11F9 ; L # Lo [82] HANGUL JONGSEONG KIYEOK..HANGUL JONGSEONG YEORINHIEUH +1200..1206 ; L # Lo [7] ETHIOPIC SYLLABLE HA..ETHIOPIC SYLLABLE HO +1208..1246 ; L # Lo [63] ETHIOPIC SYLLABLE LA..ETHIOPIC SYLLABLE QO +1248 ; L # Lo ETHIOPIC SYLLABLE QWA +124A..124D ; L # Lo [4] ETHIOPIC SYLLABLE QWI..ETHIOPIC SYLLABLE QWE +1250..1256 ; L # Lo [7] ETHIOPIC SYLLABLE QHA..ETHIOPIC SYLLABLE QHO +1258 ; L # Lo ETHIOPIC SYLLABLE QHWA +125A..125D ; L # Lo [4] ETHIOPIC SYLLABLE QHWI..ETHIOPIC SYLLABLE QHWE +1260..1286 ; L # Lo [39] ETHIOPIC SYLLABLE BA..ETHIOPIC SYLLABLE XO +1288 ; L # Lo ETHIOPIC SYLLABLE XWA +128A..128D ; L # Lo [4] ETHIOPIC SYLLABLE XWI..ETHIOPIC SYLLABLE XWE +1290..12AE ; L # Lo [31] ETHIOPIC SYLLABLE NA..ETHIOPIC SYLLABLE KO +12B0 ; L # Lo ETHIOPIC SYLLABLE KWA +12B2..12B5 ; L # Lo [4] ETHIOPIC SYLLABLE KWI..ETHIOPIC SYLLABLE KWE +12B8..12BE ; L # Lo [7] ETHIOPIC SYLLABLE KXA..ETHIOPIC SYLLABLE KXO +12C0 ; L # Lo ETHIOPIC SYLLABLE KXWA +12C2..12C5 ; L # Lo [4] ETHIOPIC SYLLABLE KXWI..ETHIOPIC SYLLABLE KXWE +12C8..12CE ; L # Lo [7] ETHIOPIC SYLLABLE WA..ETHIOPIC SYLLABLE WO +12D0..12D6 ; L # Lo [7] ETHIOPIC SYLLABLE PHARYNGEAL A..ETHIOPIC SYLLABLE PHARYNGEAL O +12D8..12EE ; L # Lo [23] ETHIOPIC SYLLABLE ZA..ETHIOPIC SYLLABLE YO +12F0..130E ; L # Lo [31] ETHIOPIC SYLLABLE DA..ETHIOPIC SYLLABLE GO +1310 ; L # Lo ETHIOPIC SYLLABLE GWA +1312..1315 ; L # Lo [4] ETHIOPIC SYLLABLE GWI..ETHIOPIC SYLLABLE GWE +1318..131E ; L # Lo [7] ETHIOPIC SYLLABLE GGA..ETHIOPIC SYLLABLE GGO +1320..1346 ; L # Lo [39] ETHIOPIC SYLLABLE THA..ETHIOPIC SYLLABLE TZO +1348..135A ; L # Lo [19] ETHIOPIC SYLLABLE FA..ETHIOPIC SYLLABLE FYA +1361..1368 ; L # Po [8] ETHIOPIC WORDSPACE..ETHIOPIC PARAGRAPH SEPARATOR +1369..1371 ; L # Nd [9] ETHIOPIC DIGIT ONE..ETHIOPIC DIGIT NINE +1372..137C ; L # No [11] ETHIOPIC NUMBER TEN..ETHIOPIC NUMBER TEN THOUSAND +13A0..13F4 ; L # Lo [85] CHEROKEE LETTER A..CHEROKEE LETTER YV +1401..166C ; L # Lo [620] CANADIAN SYLLABICS E..CANADIAN SYLLABICS CARRIER TTSA +166D..166E ; L # Po [2] CANADIAN SYLLABICS CHI SIGN..CANADIAN SYLLABICS FULL STOP +166F..1676 ; L # Lo [8] CANADIAN SYLLABICS QAI..CANADIAN SYLLABICS NNGAA +1681..169A ; L # Lo [26] OGHAM LETTER BEITH..OGHAM LETTER PEITH +16A0..16EA ; L # Lo [75] RUNIC LETTER FEHU FEOH FE F..RUNIC LETTER X +16EB..16ED ; L # Po [3] RUNIC SINGLE PUNCTUATION..RUNIC CROSS PUNCTUATION +16EE..16F0 ; L # Nl [3] RUNIC ARLAUG SYMBOL..RUNIC BELGTHOR SYMBOL +1700..170C ; L # Lo [13] TAGALOG LETTER A..TAGALOG LETTER YA +170E..1711 ; L # Lo [4] TAGALOG LETTER LA..TAGALOG LETTER HA +1720..1731 ; L # Lo [18] HANUNOO LETTER A..HANUNOO LETTER HA +1735..1736 ; L # Po [2] PHILIPPINE SINGLE PUNCTUATION..PHILIPPINE DOUBLE PUNCTUATION +1740..1751 ; L # Lo [18] BUHID LETTER A..BUHID LETTER HA +1760..176C ; L # Lo [13] TAGBANWA LETTER A..TAGBANWA LETTER YA +176E..1770 ; L # Lo [3] TAGBANWA LETTER LA..TAGBANWA LETTER SA +1780..17B3 ; L # Lo [52] KHMER LETTER KA..KHMER INDEPENDENT VOWEL QAU +17B4..17B5 ; L # Cf [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA +17B6 ; L # Mc KHMER VOWEL SIGN AA +17BE..17C5 ; L # Mc [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU +17C7..17C8 ; L # Mc [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU +17D4..17D6 ; L # Po [3] KHMER SIGN KHAN..KHMER SIGN CAMNUC PII KUUH +17D7 ; L # Lm KHMER SIGN LEK TOO +17D8..17DA ; L # Po [3] KHMER SIGN BEYYAL..KHMER SIGN KOOMUUT +17DC ; L # Lo KHMER SIGN AVAKRAHASANYA +17E0..17E9 ; L # Nd [10] KHMER DIGIT ZERO..KHMER DIGIT NINE +1810..1819 ; L # Nd [10] MONGOLIAN DIGIT ZERO..MONGOLIAN DIGIT NINE +1820..1842 ; L # Lo [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI +1843 ; L # Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN +1844..1877 ; L # Lo [52] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER MANCHU ZHA +1880..18A8 ; L # Lo [41] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER MANCHU ALI GALI BHA +1900..191C ; L # Lo [29] LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER HA +1923..1926 ; L # Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU +1930..1931 ; L # Mc [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA +1933..1938 ; L # Mc [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA +1946..194F ; L # Nd [10] LIMBU DIGIT ZERO..LIMBU DIGIT NINE +1950..196D ; L # Lo [30] TAI LE LETTER KA..TAI LE LETTER AI +1970..1974 ; L # Lo [5] TAI LE LETTER TONE-2..TAI LE LETTER TONE-6 +1D00..1D2B ; L # L& [44] LATIN LETTER SMALL CAPITAL A..CYRILLIC LETTER SMALL CAPITAL EL +1D2C..1D61 ; L # Lm [54] MODIFIER LETTER CAPITAL A..MODIFIER LETTER SMALL CHI +1D62..1D6B ; L # L& [10] LATIN SUBSCRIPT SMALL LETTER I..LATIN SMALL LETTER UE +1E00..1E9B ; L # L& [156] LATIN CAPITAL LETTER A WITH RING BELOW..LATIN SMALL LETTER LONG S WITH DOT ABOVE +1EA0..1EF9 ; L # L& [90] LATIN CAPITAL LETTER A WITH DOT BELOW..LATIN SMALL LETTER Y WITH TILDE +1F00..1F15 ; L # L& [22] GREEK SMALL LETTER ALPHA WITH PSILI..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA +1F18..1F1D ; L # L& [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA +1F20..1F45 ; L # L& [38] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA +1F48..1F4D ; L # L& [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA +1F50..1F57 ; L # L& [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI +1F59 ; L # L& GREEK CAPITAL LETTER UPSILON WITH DASIA +1F5B ; L # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA +1F5D ; L # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA +1F5F..1F7D ; L # L& [31] GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI..GREEK SMALL LETTER OMEGA WITH OXIA +1F80..1FB4 ; L # L& [53] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI +1FB6..1FBC ; L # L& [7] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI +1FBE ; L # L& GREEK PROSGEGRAMMENI +1FC2..1FC4 ; L # L& [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI +1FC6..1FCC ; L # L& [7] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI +1FD0..1FD3 ; L # L& [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA +1FD6..1FDB ; L # L& [6] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK CAPITAL LETTER IOTA WITH OXIA +1FE0..1FEC ; L # L& [13] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA +1FF2..1FF4 ; L # L& [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI +1FF6..1FFC ; L # L& [7] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI +200E ; L # Cf LEFT-TO-RIGHT MARK +2071 ; L # L& SUPERSCRIPT LATIN SMALL LETTER I +207F ; L # L& SUPERSCRIPT LATIN SMALL LETTER N +2102 ; L # L& DOUBLE-STRUCK CAPITAL C +2107 ; L # L& EULER CONSTANT +210A..2113 ; L # L& [10] SCRIPT SMALL G..SCRIPT SMALL L +2115 ; L # L& DOUBLE-STRUCK CAPITAL N +2119..211D ; L # L& [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R +2124 ; L # L& DOUBLE-STRUCK CAPITAL Z +2126 ; L # L& OHM SIGN +2128 ; L # L& BLACK-LETTER CAPITAL Z +212A..212D ; L # L& [4] KELVIN SIGN..BLACK-LETTER CAPITAL C +212F..2131 ; L # L& [3] SCRIPT SMALL E..SCRIPT CAPITAL F +2133..2134 ; L # L& [2] SCRIPT CAPITAL M..SCRIPT SMALL O +2135..2138 ; L # Lo [4] ALEF SYMBOL..DALET SYMBOL +2139 ; L # L& INFORMATION SOURCE +213D..213F ; L # L& [3] DOUBLE-STRUCK SMALL GAMMA..DOUBLE-STRUCK CAPITAL PI +2145..2149 ; L # L& [5] DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL J +2160..2183 ; L # Nl [36] ROMAN NUMERAL ONE..ROMAN NUMERAL REVERSED ONE HUNDRED +2336..237A ; L # So [69] APL FUNCTIONAL SYMBOL I-BEAM..APL FUNCTIONAL SYMBOL ALPHA +2395 ; L # So APL FUNCTIONAL SYMBOL QUAD +249C..24E9 ; L # So [78] PARENTHESIZED LATIN SMALL LETTER A..CIRCLED LATIN SMALL LETTER Z +2800..28FF ; L # So [256] BRAILLE PATTERN BLANK..BRAILLE PATTERN DOTS-12345678 +3005 ; L # Lm IDEOGRAPHIC ITERATION MARK +3006 ; L # Lo IDEOGRAPHIC CLOSING MARK +3007 ; L # Nl IDEOGRAPHIC NUMBER ZERO +3021..3029 ; L # Nl [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE +3031..3035 ; L # Lm [5] VERTICAL KANA REPEAT MARK..VERTICAL KANA REPEAT MARK LOWER HALF +3038..303A ; L # Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY +303B ; L # Lm VERTICAL IDEOGRAPHIC ITERATION MARK +303C ; L # Lo MASU MARK +3041..3096 ; L # Lo [86] HIRAGANA LETTER SMALL A..HIRAGANA LETTER SMALL KE +309D..309E ; L # Lm [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK +309F ; L # Lo HIRAGANA DIGRAPH YORI +30A1..30FA ; L # Lo [90] KATAKANA LETTER SMALL A..KATAKANA LETTER VO +30FC..30FE ; L # Lm [3] KATAKANA-HIRAGANA PROLONGED SOUND MARK..KATAKANA VOICED ITERATION MARK +30FF ; L # Lo KATAKANA DIGRAPH KOTO +3105..312C ; L # Lo [40] BOPOMOFO LETTER B..BOPOMOFO LETTER GN +3131..318E ; L # Lo [94] HANGUL LETTER KIYEOK..HANGUL LETTER ARAEAE +3190..3191 ; L # So [2] IDEOGRAPHIC ANNOTATION LINKING MARK..IDEOGRAPHIC ANNOTATION REVERSE MARK +3192..3195 ; L # No [4] IDEOGRAPHIC ANNOTATION ONE MARK..IDEOGRAPHIC ANNOTATION FOUR MARK +3196..319F ; L # So [10] IDEOGRAPHIC ANNOTATION TOP MARK..IDEOGRAPHIC ANNOTATION MAN MARK +31A0..31B7 ; L # Lo [24] BOPOMOFO LETTER BU..BOPOMOFO FINAL LETTER H +31F0..31FF ; L # Lo [16] KATAKANA LETTER SMALL KU..KATAKANA LETTER SMALL RO +3200..321C ; L # So [29] PARENTHESIZED HANGUL KIYEOK..PARENTHESIZED HANGUL CIEUC U +3220..3229 ; L # No [10] PARENTHESIZED IDEOGRAPH ONE..PARENTHESIZED IDEOGRAPH TEN +322A..3243 ; L # So [26] PARENTHESIZED IDEOGRAPH MOON..PARENTHESIZED IDEOGRAPH REACH +3260..327B ; L # So [28] CIRCLED HANGUL KIYEOK..CIRCLED HANGUL HIEUH A +327F ; L # So KOREAN STANDARD SYMBOL +3280..3289 ; L # No [10] CIRCLED IDEOGRAPH ONE..CIRCLED IDEOGRAPH TEN +328A..32B0 ; L # So [39] CIRCLED IDEOGRAPH MOON..CIRCLED IDEOGRAPH NIGHT +32C0..32CB ; L # So [12] IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY..IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER +32D0..32FE ; L # So [47] CIRCLED KATAKANA A..CIRCLED KATAKANA WO +3300..3376 ; L # So [119] SQUARE APAATO..SQUARE PC +337B..33DD ; L # So [99] SQUARE ERA NAME HEISEI..SQUARE WB +33E0..33FE ; L # So [31] IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE..IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE +3400..4DB5 ; L # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5 +4E00..9FA5 ; L # Lo [20902] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FA5 +A000..A48C ; L # Lo [1165] YI SYLLABLE IT..YI SYLLABLE YYR +AC00..D7A3 ; L # Lo [11172] HANGUL SYLLABLE GA..HANGUL SYLLABLE HIH +E000..F8FF ; L # Co [6400] <private-use-E000>..<private-use-F8FF> +F900..FA2D ; L # Lo [302] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA2D +FA30..FA6A ; L # Lo [59] CJK COMPATIBILITY IDEOGRAPH-FA30..CJK COMPATIBILITY IDEOGRAPH-FA6A +FB00..FB06 ; L # L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST +FB13..FB17 ; L # L& [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH +FF21..FF3A ; L # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z +FF41..FF5A ; L # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z +FF66..FF6F ; L # Lo [10] HALFWIDTH KATAKANA LETTER WO..HALFWIDTH KATAKANA LETTER SMALL TU +FF70 ; L # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK +FF71..FF9D ; L # Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAKANA LETTER N +FF9E..FF9F ; L # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK +FFA0..FFBE ; L # Lo [31] HALFWIDTH HANGUL FILLER..HALFWIDTH HANGUL LETTER HIEUH +FFC2..FFC7 ; L # Lo [6] HALFWIDTH HANGUL LETTER A..HALFWIDTH HANGUL LETTER E +FFCA..FFCF ; L # Lo [6] HALFWIDTH HANGUL LETTER YEO..HALFWIDTH HANGUL LETTER OE +FFD2..FFD7 ; L # Lo [6] HALFWIDTH HANGUL LETTER YO..HALFWIDTH HANGUL LETTER YU +FFDA..FFDC ; L # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I +10000..1000B ; L # Lo [12] LINEAR B SYLLABLE B008 A..LINEAR B SYLLABLE B046 JE +1000D..10026 ; L # Lo [26] LINEAR B SYLLABLE B036 JO..LINEAR B SYLLABLE B032 QO +10028..1003A ; L # Lo [19] LINEAR B SYLLABLE B060 RA..LINEAR B SYLLABLE B042 WO +1003C..1003D ; L # Lo [2] LINEAR B SYLLABLE B017 ZA..LINEAR B SYLLABLE B074 ZE +1003F..1004D ; L # Lo [15] LINEAR B SYLLABLE B020 ZO..LINEAR B SYLLABLE B091 TWO +10050..1005D ; L # Lo [14] LINEAR B SYMBOL B018..LINEAR B SYMBOL B089 +10080..100FA ; L # Lo [123] LINEAR B IDEOGRAM B100 MAN..LINEAR B IDEOGRAM VESSEL B305 +10100 ; L # Po AEGEAN WORD SEPARATOR LINE +10102 ; L # So AEGEAN CHECK MARK +10107..10133 ; L # No [45] AEGEAN NUMBER ONE..AEGEAN NUMBER NINETY THOUSAND +10137..1013F ; L # So [9] AEGEAN WEIGHT BASE UNIT..AEGEAN MEASURE THIRD SUBUNIT +10300..1031E ; L # Lo [31] OLD ITALIC LETTER A..OLD ITALIC LETTER UU +10320..10323 ; L # No [4] OLD ITALIC NUMERAL ONE..OLD ITALIC NUMERAL FIFTY +10330..10349 ; L # Lo [26] GOTHIC LETTER AHSA..GOTHIC LETTER OTHAL +1034A ; L # Nl GOTHIC LETTER NINE HUNDRED +10380..1039D ; L # Lo [30] UGARITIC LETTER ALPA..UGARITIC LETTER SSU +1039F ; L # Po UGARITIC WORD DIVIDER +10400..1044F ; L # L& [80] DESERET CAPITAL LETTER LONG I..DESERET SMALL LETTER EW +10450..1049D ; L # Lo [78] SHAVIAN LETTER PEEP..OSMANYA LETTER OO +104A0..104A9 ; L # Nd [10] OSMANYA DIGIT ZERO..OSMANYA DIGIT NINE +1D000..1D0F5 ; L # So [246] BYZANTINE MUSICAL SYMBOL PSILI..BYZANTINE MUSICAL SYMBOL GORGON NEO KATO +1D100..1D126 ; L # So [39] MUSICAL SYMBOL SINGLE BARLINE..MUSICAL SYMBOL DRUM CLEF-2 +1D12A..1D164 ; L # So [59] MUSICAL SYMBOL DOUBLE SHARP..MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE +1D165..1D166 ; L # Mc [2] MUSICAL SYMBOL COMBINING STEM..MUSICAL SYMBOL COMBINING SPRECHGESANG STEM +1D16A..1D16C ; L # So [3] MUSICAL SYMBOL FINGERED TREMOLO-1..MUSICAL SYMBOL FINGERED TREMOLO-3 +1D16D..1D172 ; L # Mc [6] MUSICAL SYMBOL COMBINING AUGMENTATION DOT..MUSICAL SYMBOL COMBINING FLAG-5 +1D183..1D184 ; L # So [2] MUSICAL SYMBOL ARPEGGIATO UP..MUSICAL SYMBOL ARPEGGIATO DOWN +1D18C..1D1A9 ; L # So [30] MUSICAL SYMBOL RINFORZANDO..MUSICAL SYMBOL DEGREE SLASH +1D1AE..1D1DD ; L # So [48] MUSICAL SYMBOL PEDAL MARK..MUSICAL SYMBOL PES SUBPUNCTIS +1D400..1D454 ; L # L& [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G +1D456..1D49C ; L # L& [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A +1D49E..1D49F ; L # L& [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D +1D4A2 ; L # L& MATHEMATICAL SCRIPT CAPITAL G +1D4A5..1D4A6 ; L # L& [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K +1D4A9..1D4AC ; L # L& [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q +1D4AE..1D4B9 ; L # L& [12] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT SMALL D +1D4BB ; L # L& MATHEMATICAL SCRIPT SMALL F +1D4BD..1D4C3 ; L # L& [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N +1D4C5..1D505 ; L # L& [65] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL FRAKTUR CAPITAL B +1D507..1D50A ; L # L& [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G +1D50D..1D514 ; L # L& [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q +1D516..1D51C ; L # L& [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y +1D51E..1D539 ; L # L& [28] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B +1D53B..1D53E ; L # L& [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G +1D540..1D544 ; L # L& [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M +1D546 ; L # L& MATHEMATICAL DOUBLE-STRUCK CAPITAL O +1D54A..1D550 ; L # L& [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y +1D552..1D6A3 ; L # L& [338] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL MONOSPACE SMALL Z +1D6A8..1D6C0 ; L # L& [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA +1D6C1 ; L # Sm MATHEMATICAL BOLD NABLA +1D6C2..1D6DA ; L # L& [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA +1D6DB ; L # Sm MATHEMATICAL BOLD PARTIAL DIFFERENTIAL +1D6DC..1D6FA ; L # L& [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA +1D6FB ; L # Sm MATHEMATICAL ITALIC NABLA +1D6FC..1D714 ; L # L& [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA +1D715 ; L # Sm MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL +1D716..1D734 ; L # L& [31] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA +1D735 ; L # Sm MATHEMATICAL BOLD ITALIC NABLA +1D736..1D74E ; L # L& [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA +1D74F ; L # Sm MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL +1D750..1D76E ; L # L& [31] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA +1D76F ; L # Sm MATHEMATICAL SANS-SERIF BOLD NABLA +1D770..1D788 ; L # L& [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA +1D789 ; L # Sm MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL +1D78A..1D7A8 ; L # L& [31] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA +1D7A9 ; L # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA +1D7AA..1D7C2 ; L # L& [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA +1D7C3 ; L # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL +1D7C4..1D7C9 ; L # L& [6] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL +20000..2A6D6 ; L # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6 +2F800..2FA1D ; L # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D +F0000..FFFFD ; L # Co [65534] <private-use-F0000>..<private-use-FFFFD> +100000..10FFFD; L # Co [65534] <private-use-100000>..<private-use-10FFFD> + +# The above property value applies to 873851 code points not listed here. +# Total code points: 1102638 + +# ================================================ + +# Bidi_Class=Right_To_Left + +0590 ; R # Cn <reserved-0590> +05A2 ; R # Cn <reserved-05A2> +05BA ; R # Cn <reserved-05BA> +05BE ; R # Po HEBREW PUNCTUATION MAQAF +05C0 ; R # Po HEBREW PUNCTUATION PASEQ +05C3 ; R # Po HEBREW PUNCTUATION SOF PASUQ +05C5..05CF ; R # Cn [11] <reserved-05C5>..<reserved-05CF> +05D0..05EA ; R # Lo [27] HEBREW LETTER ALEF..HEBREW LETTER TAV +05EB..05EF ; R # Cn [5] <reserved-05EB>..<reserved-05EF> +05F0..05F2 ; R # Lo [3] HEBREW LIGATURE YIDDISH DOUBLE VAV..HEBREW LIGATURE YIDDISH DOUBLE YOD +05F3..05F4 ; R # Po [2] HEBREW PUNCTUATION GERESH..HEBREW PUNCTUATION GERSHAYIM +05F5..05FF ; R # Cn [11] <reserved-05F5>..<reserved-05FF> +07C0..08FF ; R # Cn [320] <reserved-07C0>..<reserved-08FF> +200F ; R # Cf RIGHT-TO-LEFT MARK +FB1D ; R # Lo HEBREW LETTER YOD WITH HIRIQ +FB1F..FB28 ; R # Lo [10] HEBREW LIGATURE YIDDISH YOD YOD PATAH..HEBREW LETTER WIDE TAV +FB2A..FB36 ; R # Lo [13] HEBREW LETTER SHIN WITH SHIN DOT..HEBREW LETTER ZAYIN WITH DAGESH +FB37 ; R # Cn <reserved-FB37> +FB38..FB3C ; R # Lo [5] HEBREW LETTER TET WITH DAGESH..HEBREW LETTER LAMED WITH DAGESH +FB3D ; R # Cn <reserved-FB3D> +FB3E ; R # Lo HEBREW LETTER MEM WITH DAGESH +FB3F ; R # Cn <reserved-FB3F> +FB40..FB41 ; R # Lo [2] HEBREW LETTER NUN WITH DAGESH..HEBREW LETTER SAMEKH WITH DAGESH +FB42 ; R # Cn <reserved-FB42> +FB43..FB44 ; R # Lo [2] HEBREW LETTER FINAL PE WITH DAGESH..HEBREW LETTER PE WITH DAGESH +FB45 ; R # Cn <reserved-FB45> +FB46..FB4F ; R # Lo [10] HEBREW LETTER TSADI WITH DAGESH..HEBREW LIGATURE ALEF LAMED +10800..10805 ; R # Lo [6] CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA +10806..10807 ; R # Cn [2] <reserved-10806>..<reserved-10807> +10808 ; R # Lo CYPRIOT SYLLABLE JO +10809 ; R # Cn <reserved-10809> +1080A..10835 ; R # Lo [44] CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO +10836 ; R # Cn <reserved-10836> +10837..10838 ; R # Lo [2] CYPRIOT SYLLABLE XA..CYPRIOT SYLLABLE XE +10839..1083B ; R # Cn [3] <reserved-10839>..<reserved-1083B> +1083C ; R # Lo CYPRIOT SYLLABLE ZA +1083D..1083E ; R # Cn [2] <reserved-1083D>..<reserved-1083E> +1083F ; R # Lo CYPRIOT SYLLABLE ZO +10840..10FFF ; R # Cn [1984] <reserved-10840>..<reserved-10FFF> + +# Total code points: 2483 + +# ================================================ + +# Bidi_Class=European_Number + +0030..0039 ; EN # Nd [10] DIGIT ZERO..DIGIT NINE +00B2..00B3 ; EN # No [2] SUPERSCRIPT TWO..SUPERSCRIPT THREE +00B9 ; EN # No SUPERSCRIPT ONE +06F0..06F9 ; EN # Nd [10] EXTENDED ARABIC-INDIC DIGIT ZERO..EXTENDED ARABIC-INDIC DIGIT NINE +2070 ; EN # No SUPERSCRIPT ZERO +2074..2079 ; EN # No [6] SUPERSCRIPT FOUR..SUPERSCRIPT NINE +2080..2089 ; EN # No [10] SUBSCRIPT ZERO..SUBSCRIPT NINE +2488..249B ; EN # No [20] DIGIT ONE FULL STOP..NUMBER TWENTY FULL STOP +FF10..FF19 ; EN # Nd [10] FULLWIDTH DIGIT ZERO..FULLWIDTH DIGIT NINE +1D7CE..1D7FF ; EN # Nd [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE + +# Total code points: 120 + +# ================================================ + +# Bidi_Class=European_Separator + +002B ; ES # Sm PLUS SIGN +002D ; ES # Pd HYPHEN-MINUS +FF0F ; ES # Po FULLWIDTH SOLIDUS + +# Total code points: 3 + +# ================================================ + +# Bidi_Class=European_Terminator + +0023 ; ET # Po NUMBER SIGN +0024 ; ET # Sc DOLLAR SIGN +0025 ; ET # Po PERCENT SIGN +00A2..00A5 ; ET # Sc [4] CENT SIGN..YEN SIGN +00B0 ; ET # So DEGREE SIGN +00B1 ; ET # Sm PLUS-MINUS SIGN +066A ; ET # Po ARABIC PERCENT SIGN +09F2..09F3 ; ET # Sc [2] BENGALI RUPEE MARK..BENGALI RUPEE SIGN +0AF1 ; ET # Sc GUJARATI RUPEE SIGN +0BF9 ; ET # Sc TAMIL RUPEE SIGN +0E3F ; ET # Sc THAI CURRENCY SYMBOL BAHT +17DB ; ET # Sc KHMER CURRENCY SYMBOL RIEL +2030..2034 ; ET # Po [5] PER MILLE SIGN..TRIPLE PRIME +207A..207B ; ET # Sm [2] SUPERSCRIPT PLUS SIGN..SUPERSCRIPT MINUS +208A..208B ; ET # Sm [2] SUBSCRIPT PLUS SIGN..SUBSCRIPT MINUS +20A0..20B1 ; ET # Sc [18] EURO-CURRENCY SIGN..PESO SIGN +212E ; ET # So ESTIMATED SYMBOL +2212..2213 ; ET # Sm [2] MINUS SIGN..MINUS-OR-PLUS SIGN +FB29 ; ET # Sm HEBREW LETTER ALTERNATIVE PLUS SIGN +FE5F ; ET # Po SMALL NUMBER SIGN +FE62 ; ET # Sm SMALL PLUS SIGN +FE63 ; ET # Pd SMALL HYPHEN-MINUS +FE69 ; ET # Sc SMALL DOLLAR SIGN +FE6A ; ET # Po SMALL PERCENT SIGN +FF03 ; ET # Po FULLWIDTH NUMBER SIGN +FF04 ; ET # Sc FULLWIDTH DOLLAR SIGN +FF05 ; ET # Po FULLWIDTH PERCENT SIGN +FF0B ; ET # Sm FULLWIDTH PLUS SIGN +FF0D ; ET # Pd FULLWIDTH HYPHEN-MINUS +FFE0..FFE1 ; ET # Sc [2] FULLWIDTH CENT SIGN..FULLWIDTH POUND SIGN +FFE5..FFE6 ; ET # Sc [2] FULLWIDTH YEN SIGN..FULLWIDTH WON SIGN + +# Total code points: 61 + +# ================================================ + +# Bidi_Class=Arabic_Number + +0660..0669 ; AN # Nd [10] ARABIC-INDIC DIGIT ZERO..ARABIC-INDIC DIGIT NINE +066B..066C ; AN # Po [2] ARABIC DECIMAL SEPARATOR..ARABIC THOUSANDS SEPARATOR + +# Total code points: 12 + +# ================================================ + +# Bidi_Class=Common_Separator + +002C ; CS # Po COMMA +002E..002F ; CS # Po [2] FULL STOP..SOLIDUS +003A ; CS # Po COLON +00A0 ; CS # Zs NO-BREAK SPACE +060C ; CS # Po ARABIC COMMA +2044 ; CS # Sm FRACTION SLASH +FE50 ; CS # Po SMALL COMMA +FE52 ; CS # Po SMALL FULL STOP +FE55 ; CS # Po SMALL COLON +FF0C ; CS # Po FULLWIDTH COMMA +FF0E ; CS # Po FULLWIDTH FULL STOP +FF1A ; CS # Po FULLWIDTH COLON + +# Total code points: 13 + +# ================================================ + +# Bidi_Class=Paragraph_Separator + +000A ; B # Cc <control-000A> +000D ; B # Cc <control-000D> +001C..001E ; B # Cc [3] <control-001C>..<control-001E> +0085 ; B # Cc <control-0085> +2029 ; B # Zp PARAGRAPH SEPARATOR + +# Total code points: 7 + +# ================================================ + +# Bidi_Class=Segment_Separator + +0009 ; S # Cc <control-0009> +000B ; S # Cc <control-000B> +001F ; S # Cc <control-001F> + +# Total code points: 3 + +# ================================================ + +# Bidi_Class=White_Space + +000C ; WS # Cc <control-000C> +0020 ; WS # Zs SPACE +1680 ; WS # Zs OGHAM SPACE MARK +180E ; WS # Zs MONGOLIAN VOWEL SEPARATOR +2000..200A ; WS # Zs [11] EN QUAD..HAIR SPACE +2028 ; WS # Zl LINE SEPARATOR +202F ; WS # Zs NARROW NO-BREAK SPACE +205F ; WS # Zs MEDIUM MATHEMATICAL SPACE +3000 ; WS # Zs IDEOGRAPHIC SPACE + +# Total code points: 19 + +# ================================================ + +# Bidi_Class=Other_Neutral + +0021..0022 ; ON # Po [2] EXCLAMATION MARK..QUOTATION MARK +0026..0027 ; ON # Po [2] AMPERSAND..APOSTROPHE +0028 ; ON # Ps LEFT PARENTHESIS +0029 ; ON # Pe RIGHT PARENTHESIS +002A ; ON # Po ASTERISK +003B ; ON # Po SEMICOLON +003C..003E ; ON # Sm [3] LESS-THAN SIGN..GREATER-THAN SIGN +003F..0040 ; ON # Po [2] QUESTION MARK..COMMERCIAL AT +005B ; ON # Ps LEFT SQUARE BRACKET +005C ; ON # Po REVERSE SOLIDUS +005D ; ON # Pe RIGHT SQUARE BRACKET +005E ; ON # Sk CIRCUMFLEX ACCENT +005F ; ON # Pc LOW LINE +0060 ; ON # Sk GRAVE ACCENT +007B ; ON # Ps LEFT CURLY BRACKET +007C ; ON # Sm VERTICAL LINE +007D ; ON # Pe RIGHT CURLY BRACKET +007E ; ON # Sm TILDE +00A1 ; ON # Po INVERTED EXCLAMATION MARK +00A6..00A7 ; ON # So [2] BROKEN BAR..SECTION SIGN +00A8 ; ON # Sk DIAERESIS +00A9 ; ON # So COPYRIGHT SIGN +00AB ; ON # Pi LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +00AC ; ON # Sm NOT SIGN +00AE ; ON # So REGISTERED SIGN +00AF ; ON # Sk MACRON +00B4 ; ON # Sk ACUTE ACCENT +00B6 ; ON # So PILCROW SIGN +00B7 ; ON # Po MIDDLE DOT +00B8 ; ON # Sk CEDILLA +00BB ; ON # Pf RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +00BC..00BE ; ON # No [3] VULGAR FRACTION ONE QUARTER..VULGAR FRACTION THREE QUARTERS +00BF ; ON # Po INVERTED QUESTION MARK +00D7 ; ON # Sm MULTIPLICATION SIGN +00F7 ; ON # Sm DIVISION SIGN +02B9..02BA ; ON # Lm [2] MODIFIER LETTER PRIME..MODIFIER LETTER DOUBLE PRIME +02C2..02C5 ; ON # Sk [4] MODIFIER LETTER LEFT ARROWHEAD..MODIFIER LETTER DOWN ARROWHEAD +02C6..02CF ; ON # Lm [10] MODIFIER LETTER CIRCUMFLEX ACCENT..MODIFIER LETTER LOW ACUTE ACCENT +02D2..02DF ; ON # Sk [14] MODIFIER LETTER CENTRED RIGHT HALF RING..MODIFIER LETTER CROSS ACCENT +02E5..02ED ; ON # Sk [9] MODIFIER LETTER EXTRA-HIGH TONE BAR..MODIFIER LETTER UNASPIRATED +02EF..02FF ; ON # Sk [17] MODIFIER LETTER LOW DOWN ARROWHEAD..MODIFIER LETTER LOW LEFT ARROW +0374..0375 ; ON # Sk [2] GREEK NUMERAL SIGN..GREEK LOWER NUMERAL SIGN +037E ; ON # Po GREEK QUESTION MARK +0384..0385 ; ON # Sk [2] GREEK TONOS..GREEK DIALYTIKA TONOS +0387 ; ON # Po GREEK ANO TELEIA +03F6 ; ON # Sm GREEK REVERSED LUNATE EPSILON SYMBOL +058A ; ON # Pd ARMENIAN HYPHEN +060E..060F ; ON # So [2] ARABIC POETIC VERSE SIGN..ARABIC SIGN MISRA +06E9 ; ON # So ARABIC PLACE OF SAJDAH +0BF3..0BF8 ; ON # So [6] TAMIL DAY SIGN..TAMIL AS ABOVE SIGN +0BFA ; ON # So TAMIL NUMBER SIGN +0F3A ; ON # Ps TIBETAN MARK GUG RTAGS GYON +0F3B ; ON # Pe TIBETAN MARK GUG RTAGS GYAS +0F3C ; ON # Ps TIBETAN MARK ANG KHANG GYON +0F3D ; ON # Pe TIBETAN MARK ANG KHANG GYAS +169B ; ON # Ps OGHAM FEATHER MARK +169C ; ON # Pe OGHAM REVERSED FEATHER MARK +17F0..17F9 ; ON # No [10] KHMER SYMBOL LEK ATTAK SON..KHMER SYMBOL LEK ATTAK PRAM-BUON +1800..1805 ; ON # Po [6] MONGOLIAN BIRGA..MONGOLIAN FOUR DOTS +1806 ; ON # Pd MONGOLIAN TODO SOFT HYPHEN +1807..180A ; ON # Po [4] MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER..MONGOLIAN NIRUGU +1940 ; ON # So LIMBU SIGN LOO +1944..1945 ; ON # Po [2] LIMBU EXCLAMATION MARK..LIMBU QUESTION MARK +19E0..19FF ; ON # So [32] KHMER SYMBOL PATHAMASAT..KHMER SYMBOL DAP-PRAM ROC +1FBD ; ON # Sk GREEK KORONIS +1FBF..1FC1 ; ON # Sk [3] GREEK PSILI..GREEK DIALYTIKA AND PERISPOMENI +1FCD..1FCF ; ON # Sk [3] GREEK PSILI AND VARIA..GREEK PSILI AND PERISPOMENI +1FDD..1FDF ; ON # Sk [3] GREEK DASIA AND VARIA..GREEK DASIA AND PERISPOMENI +1FED..1FEF ; ON # Sk [3] GREEK DIALYTIKA AND VARIA..GREEK VARIA +1FFD..1FFE ; ON # Sk [2] GREEK OXIA..GREEK DASIA +2010..2015 ; ON # Pd [6] HYPHEN..HORIZONTAL BAR +2016..2017 ; ON # Po [2] DOUBLE VERTICAL LINE..DOUBLE LOW LINE +2018 ; ON # Pi LEFT SINGLE QUOTATION MARK +2019 ; ON # Pf RIGHT SINGLE QUOTATION MARK +201A ; ON # Ps SINGLE LOW-9 QUOTATION MARK +201B..201C ; ON # Pi [2] SINGLE HIGH-REVERSED-9 QUOTATION MARK..LEFT DOUBLE QUOTATION MARK +201D ; ON # Pf RIGHT DOUBLE QUOTATION MARK +201E ; ON # Ps DOUBLE LOW-9 QUOTATION MARK +201F ; ON # Pi DOUBLE HIGH-REVERSED-9 QUOTATION MARK +2020..2027 ; ON # Po [8] DAGGER..HYPHENATION POINT +2035..2038 ; ON # Po [4] REVERSED PRIME..CARET +2039 ; ON # Pi SINGLE LEFT-POINTING ANGLE QUOTATION MARK +203A ; ON # Pf SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +203B..203E ; ON # Po [4] REFERENCE MARK..OVERLINE +203F..2040 ; ON # Pc [2] UNDERTIE..CHARACTER TIE +2041..2043 ; ON # Po [3] CARET INSERTION POINT..HYPHEN BULLET +2045 ; ON # Ps LEFT SQUARE BRACKET WITH QUILL +2046 ; ON # Pe RIGHT SQUARE BRACKET WITH QUILL +2047..2051 ; ON # Po [11] DOUBLE QUESTION MARK..TWO ASTERISKS ALIGNED VERTICALLY +2052 ; ON # Sm COMMERCIAL MINUS SIGN +2053 ; ON # Po SWUNG DASH +2054 ; ON # Pc INVERTED UNDERTIE +2057 ; ON # Po QUADRUPLE PRIME +207C ; ON # Sm SUPERSCRIPT EQUALS SIGN +207D ; ON # Ps SUPERSCRIPT LEFT PARENTHESIS +207E ; ON # Pe SUPERSCRIPT RIGHT PARENTHESIS +208C ; ON # Sm SUBSCRIPT EQUALS SIGN +208D ; ON # Ps SUBSCRIPT LEFT PARENTHESIS +208E ; ON # Pe SUBSCRIPT RIGHT PARENTHESIS +2100..2101 ; ON # So [2] ACCOUNT OF..ADDRESSED TO THE SUBJECT +2103..2106 ; ON # So [4] DEGREE CELSIUS..CADA UNA +2108..2109 ; ON # So [2] SCRUPLE..DEGREE FAHRENHEIT +2114 ; ON # So L B BAR SYMBOL +2116..2118 ; ON # So [3] NUMERO SIGN..SCRIPT CAPITAL P +211E..2123 ; ON # So [6] PRESCRIPTION TAKE..VERSICLE +2125 ; ON # So OUNCE SIGN +2127 ; ON # So INVERTED OHM SIGN +2129 ; ON # So TURNED GREEK SMALL LETTER IOTA +2132 ; ON # So TURNED CAPITAL F +213A..213B ; ON # So [2] ROTATED CAPITAL Q..FACSIMILE SIGN +2140..2144 ; ON # Sm [5] DOUBLE-STRUCK N-ARY SUMMATION..TURNED SANS-SERIF CAPITAL Y +214A ; ON # So PROPERTY LINE +214B ; ON # Sm TURNED AMPERSAND +2153..215F ; ON # No [13] VULGAR FRACTION ONE THIRD..FRACTION NUMERATOR ONE +2190..2194 ; ON # Sm [5] LEFTWARDS ARROW..LEFT RIGHT ARROW +2195..2199 ; ON # So [5] UP DOWN ARROW..SOUTH WEST ARROW +219A..219B ; ON # Sm [2] LEFTWARDS ARROW WITH STROKE..RIGHTWARDS ARROW WITH STROKE +219C..219F ; ON # So [4] LEFTWARDS WAVE ARROW..UPWARDS TWO HEADED ARROW +21A0 ; ON # Sm RIGHTWARDS TWO HEADED ARROW +21A1..21A2 ; ON # So [2] DOWNWARDS TWO HEADED ARROW..LEFTWARDS ARROW WITH TAIL +21A3 ; ON # Sm RIGHTWARDS ARROW WITH TAIL +21A4..21A5 ; ON # So [2] LEFTWARDS ARROW FROM BAR..UPWARDS ARROW FROM BAR +21A6 ; ON # Sm RIGHTWARDS ARROW FROM BAR +21A7..21AD ; ON # So [7] DOWNWARDS ARROW FROM BAR..LEFT RIGHT WAVE ARROW +21AE ; ON # Sm LEFT RIGHT ARROW WITH STROKE +21AF..21CD ; ON # So [31] DOWNWARDS ZIGZAG ARROW..LEFTWARDS DOUBLE ARROW WITH STROKE +21CE..21CF ; ON # Sm [2] LEFT RIGHT DOUBLE ARROW WITH STROKE..RIGHTWARDS DOUBLE ARROW WITH STROKE +21D0..21D1 ; ON # So [2] LEFTWARDS DOUBLE ARROW..UPWARDS DOUBLE ARROW +21D2 ; ON # Sm RIGHTWARDS DOUBLE ARROW +21D3 ; ON # So DOWNWARDS DOUBLE ARROW +21D4 ; ON # Sm LEFT RIGHT DOUBLE ARROW +21D5..21F3 ; ON # So [31] UP DOWN DOUBLE ARROW..UP DOWN WHITE ARROW +21F4..2211 ; ON # Sm [30] RIGHT ARROW WITH SMALL CIRCLE..N-ARY SUMMATION +2214..22FF ; ON # Sm [236] DOT PLUS..Z NOTATION BAG MEMBERSHIP +2300..2307 ; ON # So [8] DIAMETER SIGN..WAVY LINE +2308..230B ; ON # Sm [4] LEFT CEILING..RIGHT FLOOR +230C..231F ; ON # So [20] BOTTOM RIGHT CROP..BOTTOM RIGHT CORNER +2320..2321 ; ON # Sm [2] TOP HALF INTEGRAL..BOTTOM HALF INTEGRAL +2322..2328 ; ON # So [7] FROWN..KEYBOARD +2329 ; ON # Ps LEFT-POINTING ANGLE BRACKET +232A ; ON # Pe RIGHT-POINTING ANGLE BRACKET +232B..2335 ; ON # So [11] ERASE TO THE LEFT..COUNTERSINK +237B ; ON # So NOT CHECK MARK +237C ; ON # Sm RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW +237D..2394 ; ON # So [24] SHOULDERED OPEN BOX..SOFTWARE-FUNCTION SYMBOL +2396..239A ; ON # So [5] DECIMAL SEPARATOR KEY SYMBOL..CLEAR SCREEN SYMBOL +239B..23B3 ; ON # Sm [25] LEFT PARENTHESIS UPPER HOOK..SUMMATION BOTTOM +23B4 ; ON # Ps TOP SQUARE BRACKET +23B5 ; ON # Pe BOTTOM SQUARE BRACKET +23B6 ; ON # Po BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET +23B7..23D0 ; ON # So [26] RADICAL SYMBOL BOTTOM..VERTICAL LINE EXTENSION +2400..2426 ; ON # So [39] SYMBOL FOR NULL..SYMBOL FOR SUBSTITUTE FORM TWO +2440..244A ; ON # So [11] OCR HOOK..OCR DOUBLE BACKSLASH +2460..2487 ; ON # No [40] CIRCLED DIGIT ONE..PARENTHESIZED NUMBER TWENTY +24EA..24FF ; ON # No [22] CIRCLED DIGIT ZERO..NEGATIVE CIRCLED DIGIT ZERO +2500..25B6 ; ON # So [183] BOX DRAWINGS LIGHT HORIZONTAL..BLACK RIGHT-POINTING TRIANGLE +25B7 ; ON # Sm WHITE RIGHT-POINTING TRIANGLE +25B8..25C0 ; ON # So [9] BLACK RIGHT-POINTING SMALL TRIANGLE..BLACK LEFT-POINTING TRIANGLE +25C1 ; ON # Sm WHITE LEFT-POINTING TRIANGLE +25C2..25F7 ; ON # So [54] BLACK LEFT-POINTING SMALL TRIANGLE..WHITE CIRCLE WITH UPPER RIGHT QUADRANT +25F8..25FF ; ON # Sm [8] UPPER LEFT TRIANGLE..LOWER RIGHT TRIANGLE +2600..2617 ; ON # So [24] BLACK SUN WITH RAYS..BLACK SHOGI PIECE +2619..266E ; ON # So [86] REVERSED ROTATED FLORAL HEART BULLET..MUSIC NATURAL SIGN +266F ; ON # Sm MUSIC SHARP SIGN +2670..267D ; ON # So [14] WEST SYRIAC CROSS..PARTIALLY-RECYCLED PAPER SYMBOL +2680..2691 ; ON # So [18] DIE FACE-1..BLACK FLAG +26A0..26A1 ; ON # So [2] WARNING SIGN..HIGH VOLTAGE SIGN +2701..2704 ; ON # So [4] UPPER BLADE SCISSORS..WHITE SCISSORS +2706..2709 ; ON # So [4] TELEPHONE LOCATION SIGN..ENVELOPE +270C..2727 ; ON # So [28] VICTORY HAND..WHITE FOUR POINTED STAR +2729..274B ; ON # So [35] STRESS OUTLINED WHITE STAR..HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK +274D ; ON # So SHADOWED WHITE CIRCLE +274F..2752 ; ON # So [4] LOWER RIGHT DROP-SHADOWED WHITE SQUARE..UPPER RIGHT SHADOWED WHITE SQUARE +2756 ; ON # So BLACK DIAMOND MINUS WHITE X +2758..275E ; ON # So [7] LIGHT VERTICAL BAR..HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT +2761..2767 ; ON # So [7] CURVED STEM PARAGRAPH SIGN ORNAMENT..ROTATED FLORAL HEART BULLET +2768 ; ON # Ps MEDIUM LEFT PARENTHESIS ORNAMENT +2769 ; ON # Pe MEDIUM RIGHT PARENTHESIS ORNAMENT +276A ; ON # Ps MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT +276B ; ON # Pe MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT +276C ; ON # Ps MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT +276D ; ON # Pe MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT +276E ; ON # Ps HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT +276F ; ON # Pe HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT +2770 ; ON # Ps HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT +2771 ; ON # Pe HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT +2772 ; ON # Ps LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT +2773 ; ON # Pe LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT +2774 ; ON # Ps MEDIUM LEFT CURLY BRACKET ORNAMENT +2775 ; ON # Pe MEDIUM RIGHT CURLY BRACKET ORNAMENT +2776..2793 ; ON # No [30] DINGBAT NEGATIVE CIRCLED DIGIT ONE..DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN +2794 ; ON # So HEAVY WIDE-HEADED RIGHTWARDS ARROW +2798..27AF ; ON # So [24] HEAVY SOUTH EAST ARROW..NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW +27B1..27BE ; ON # So [14] NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW..OPEN-OUTLINED RIGHTWARDS ARROW +27D0..27E5 ; ON # Sm [22] WHITE DIAMOND WITH CENTRED DOT..WHITE SQUARE WITH RIGHTWARDS TICK +27E6 ; ON # Ps MATHEMATICAL LEFT WHITE SQUARE BRACKET +27E7 ; ON # Pe MATHEMATICAL RIGHT WHITE SQUARE BRACKET +27E8 ; ON # Ps MATHEMATICAL LEFT ANGLE BRACKET +27E9 ; ON # Pe MATHEMATICAL RIGHT ANGLE BRACKET +27EA ; ON # Ps MATHEMATICAL LEFT DOUBLE ANGLE BRACKET +27EB ; ON # Pe MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET +27F0..27FF ; ON # Sm [16] UPWARDS QUADRUPLE ARROW..LONG RIGHTWARDS SQUIGGLE ARROW +2900..2982 ; ON # Sm [131] RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE..Z NOTATION TYPE COLON +2983 ; ON # Ps LEFT WHITE CURLY BRACKET +2984 ; ON # Pe RIGHT WHITE CURLY BRACKET +2985 ; ON # Ps LEFT WHITE PARENTHESIS +2986 ; ON # Pe RIGHT WHITE PARENTHESIS +2987 ; ON # Ps Z NOTATION LEFT IMAGE BRACKET +2988 ; ON # Pe Z NOTATION RIGHT IMAGE BRACKET +2989 ; ON # Ps Z NOTATION LEFT BINDING BRACKET +298A ; ON # Pe Z NOTATION RIGHT BINDING BRACKET +298B ; ON # Ps LEFT SQUARE BRACKET WITH UNDERBAR +298C ; ON # Pe RIGHT SQUARE BRACKET WITH UNDERBAR +298D ; ON # Ps LEFT SQUARE BRACKET WITH TICK IN TOP CORNER +298E ; ON # Pe RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +298F ; ON # Ps LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +2990 ; ON # Pe RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER +2991 ; ON # Ps LEFT ANGLE BRACKET WITH DOT +2992 ; ON # Pe RIGHT ANGLE BRACKET WITH DOT +2993 ; ON # Ps LEFT ARC LESS-THAN BRACKET +2994 ; ON # Pe RIGHT ARC GREATER-THAN BRACKET +2995 ; ON # Ps DOUBLE LEFT ARC GREATER-THAN BRACKET +2996 ; ON # Pe DOUBLE RIGHT ARC LESS-THAN BRACKET +2997 ; ON # Ps LEFT BLACK TORTOISE SHELL BRACKET +2998 ; ON # Pe RIGHT BLACK TORTOISE SHELL BRACKET +2999..29D7 ; ON # Sm [63] DOTTED FENCE..BLACK HOURGLASS +29D8 ; ON # Ps LEFT WIGGLY FENCE +29D9 ; ON # Pe RIGHT WIGGLY FENCE +29DA ; ON # Ps LEFT DOUBLE WIGGLY FENCE +29DB ; ON # Pe RIGHT DOUBLE WIGGLY FENCE +29DC..29FB ; ON # Sm [32] INCOMPLETE INFINITY..TRIPLE PLUS +29FC ; ON # Ps LEFT-POINTING CURVED ANGLE BRACKET +29FD ; ON # Pe RIGHT-POINTING CURVED ANGLE BRACKET +29FE..2AFF ; ON # Sm [258] TINY..N-ARY WHITE VERTICAL BAR +2B00..2B0D ; ON # So [14] NORTH EAST WHITE ARROW..UP DOWN BLACK ARROW +2E80..2E99 ; ON # So [26] CJK RADICAL REPEAT..CJK RADICAL RAP +2E9B..2EF3 ; ON # So [89] CJK RADICAL CHOKE..CJK RADICAL C-SIMPLIFIED TURTLE +2F00..2FD5 ; ON # So [214] KANGXI RADICAL ONE..KANGXI RADICAL FLUTE +2FF0..2FFB ; ON # So [12] IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT..IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID +3001..3003 ; ON # Po [3] IDEOGRAPHIC COMMA..DITTO MARK +3004 ; ON # So JAPANESE INDUSTRIAL STANDARD SYMBOL +3008 ; ON # Ps LEFT ANGLE BRACKET +3009 ; ON # Pe RIGHT ANGLE BRACKET +300A ; ON # Ps LEFT DOUBLE ANGLE BRACKET +300B ; ON # Pe RIGHT DOUBLE ANGLE BRACKET +300C ; ON # Ps LEFT CORNER BRACKET +300D ; ON # Pe RIGHT CORNER BRACKET +300E ; ON # Ps LEFT WHITE CORNER BRACKET +300F ; ON # Pe RIGHT WHITE CORNER BRACKET +3010 ; ON # Ps LEFT BLACK LENTICULAR BRACKET +3011 ; ON # Pe RIGHT BLACK LENTICULAR BRACKET +3012..3013 ; ON # So [2] POSTAL MARK..GETA MARK +3014 ; ON # Ps LEFT TORTOISE SHELL BRACKET +3015 ; ON # Pe RIGHT TORTOISE SHELL BRACKET +3016 ; ON # Ps LEFT WHITE LENTICULAR BRACKET +3017 ; ON # Pe RIGHT WHITE LENTICULAR BRACKET +3018 ; ON # Ps LEFT WHITE TORTOISE SHELL BRACKET +3019 ; ON # Pe RIGHT WHITE TORTOISE SHELL BRACKET +301A ; ON # Ps LEFT WHITE SQUARE BRACKET +301B ; ON # Pe RIGHT WHITE SQUARE BRACKET +301C ; ON # Pd WAVE DASH +301D ; ON # Ps REVERSED DOUBLE PRIME QUOTATION MARK +301E..301F ; ON # Pe [2] DOUBLE PRIME QUOTATION MARK..LOW DOUBLE PRIME QUOTATION MARK +3020 ; ON # So POSTAL MARK FACE +3030 ; ON # Pd WAVY DASH +3036..3037 ; ON # So [2] CIRCLED POSTAL MARK..IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL +303D ; ON # Po PART ALTERNATION MARK +303E..303F ; ON # So [2] IDEOGRAPHIC VARIATION INDICATOR..IDEOGRAPHIC HALF FILL SPACE +309B..309C ; ON # Sk [2] KATAKANA-HIRAGANA VOICED SOUND MARK..KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +30A0 ; ON # Pd KATAKANA-HIRAGANA DOUBLE HYPHEN +30FB ; ON # Pc KATAKANA MIDDLE DOT +321D..321E ; ON # So [2] PARENTHESIZED KOREAN CHARACTER OJEON..PARENTHESIZED KOREAN CHARACTER O HU +3250 ; ON # So PARTNERSHIP SIGN +3251..325F ; ON # No [15] CIRCLED NUMBER TWENTY ONE..CIRCLED NUMBER THIRTY FIVE +327C..327D ; ON # So [2] CIRCLED KOREAN CHARACTER CHAMKO..CIRCLED KOREAN CHARACTER JUEUI +32B1..32BF ; ON # No [15] CIRCLED NUMBER THIRTY SIX..CIRCLED NUMBER FIFTY +32CC..32CF ; ON # So [4] SQUARE HG..LIMITED LIABILITY SIGN +3377..337A ; ON # So [4] SQUARE DM..SQUARE IU +33DE..33DF ; ON # So [2] SQUARE V OVER M..SQUARE A OVER M +33FF ; ON # So SQUARE GAL +4DC0..4DFF ; ON # So [64] HEXAGRAM FOR THE CREATIVE HEAVEN..HEXAGRAM FOR BEFORE COMPLETION +A490..A4C6 ; ON # So [55] YI RADICAL QOT..YI RADICAL KE +FD3E ; ON # Ps ORNATE LEFT PARENTHESIS +FD3F ; ON # Pe ORNATE RIGHT PARENTHESIS +FDFD ; ON # So ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM +FE30 ; ON # Po PRESENTATION FORM FOR VERTICAL TWO DOT LEADER +FE31..FE32 ; ON # Pd [2] PRESENTATION FORM FOR VERTICAL EM DASH..PRESENTATION FORM FOR VERTICAL EN DASH +FE33..FE34 ; ON # Pc [2] PRESENTATION FORM FOR VERTICAL LOW LINE..PRESENTATION FORM FOR VERTICAL WAVY LOW LINE +FE35 ; ON # Ps PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS +FE36 ; ON # Pe PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS +FE37 ; ON # Ps PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET +FE38 ; ON # Pe PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET +FE39 ; ON # Ps PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET +FE3A ; ON # Pe PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET +FE3B ; ON # Ps PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET +FE3C ; ON # Pe PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET +FE3D ; ON # Ps PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET +FE3E ; ON # Pe PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET +FE3F ; ON # Ps PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET +FE40 ; ON # Pe PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET +FE41 ; ON # Ps PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET +FE42 ; ON # Pe PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET +FE43 ; ON # Ps PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET +FE44 ; ON # Pe PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET +FE45..FE46 ; ON # Po [2] SESAME DOT..WHITE SESAME DOT +FE47 ; ON # Ps PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET +FE48 ; ON # Pe PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET +FE49..FE4C ; ON # Po [4] DASHED OVERLINE..DOUBLE WAVY OVERLINE +FE4D..FE4F ; ON # Pc [3] DASHED LOW LINE..WAVY LOW LINE +FE51 ; ON # Po SMALL IDEOGRAPHIC COMMA +FE54 ; ON # Po SMALL SEMICOLON +FE56..FE57 ; ON # Po [2] SMALL QUESTION MARK..SMALL EXCLAMATION MARK +FE58 ; ON # Pd SMALL EM DASH +FE59 ; ON # Ps SMALL LEFT PARENTHESIS +FE5A ; ON # Pe SMALL RIGHT PARENTHESIS +FE5B ; ON # Ps SMALL LEFT CURLY BRACKET +FE5C ; ON # Pe SMALL RIGHT CURLY BRACKET +FE5D ; ON # Ps SMALL LEFT TORTOISE SHELL BRACKET +FE5E ; ON # Pe SMALL RIGHT TORTOISE SHELL BRACKET +FE60..FE61 ; ON # Po [2] SMALL AMPERSAND..SMALL ASTERISK +FE64..FE66 ; ON # Sm [3] SMALL LESS-THAN SIGN..SMALL EQUALS SIGN +FE68 ; ON # Po SMALL REVERSE SOLIDUS +FE6B ; ON # Po SMALL COMMERCIAL AT +FF01..FF02 ; ON # Po [2] FULLWIDTH EXCLAMATION MARK..FULLWIDTH QUOTATION MARK +FF06..FF07 ; ON # Po [2] FULLWIDTH AMPERSAND..FULLWIDTH APOSTROPHE +FF08 ; ON # Ps FULLWIDTH LEFT PARENTHESIS +FF09 ; ON # Pe FULLWIDTH RIGHT PARENTHESIS +FF0A ; ON # Po FULLWIDTH ASTERISK +FF1B ; ON # Po FULLWIDTH SEMICOLON +FF1C..FF1E ; ON # Sm [3] FULLWIDTH LESS-THAN SIGN..FULLWIDTH GREATER-THAN SIGN +FF1F..FF20 ; ON # Po [2] FULLWIDTH QUESTION MARK..FULLWIDTH COMMERCIAL AT +FF3B ; ON # Ps FULLWIDTH LEFT SQUARE BRACKET +FF3C ; ON # Po FULLWIDTH REVERSE SOLIDUS +FF3D ; ON # Pe FULLWIDTH RIGHT SQUARE BRACKET +FF3E ; ON # Sk FULLWIDTH CIRCUMFLEX ACCENT +FF3F ; ON # Pc FULLWIDTH LOW LINE +FF40 ; ON # Sk FULLWIDTH GRAVE ACCENT +FF5B ; ON # Ps FULLWIDTH LEFT CURLY BRACKET +FF5C ; ON # Sm FULLWIDTH VERTICAL LINE +FF5D ; ON # Pe FULLWIDTH RIGHT CURLY BRACKET +FF5E ; ON # Sm FULLWIDTH TILDE +FF5F ; ON # Ps FULLWIDTH LEFT WHITE PARENTHESIS +FF60 ; ON # Pe FULLWIDTH RIGHT WHITE PARENTHESIS +FF61 ; ON # Po HALFWIDTH IDEOGRAPHIC FULL STOP +FF62 ; ON # Ps HALFWIDTH LEFT CORNER BRACKET +FF63 ; ON # Pe HALFWIDTH RIGHT CORNER BRACKET +FF64 ; ON # Po HALFWIDTH IDEOGRAPHIC COMMA +FF65 ; ON # Pc HALFWIDTH KATAKANA MIDDLE DOT +FFE2 ; ON # Sm FULLWIDTH NOT SIGN +FFE3 ; ON # Sk FULLWIDTH MACRON +FFE4 ; ON # So FULLWIDTH BROKEN BAR +FFE8 ; ON # So HALFWIDTH FORMS LIGHT VERTICAL +FFE9..FFEC ; ON # Sm [4] HALFWIDTH LEFTWARDS ARROW..HALFWIDTH DOWNWARDS ARROW +FFED..FFEE ; ON # So [2] HALFWIDTH BLACK SQUARE..HALFWIDTH WHITE CIRCLE +FFF9..FFFB ; ON # Cf [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR +FFFC..FFFD ; ON # So [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHARACTER +10101 ; ON # Po AEGEAN WORD SEPARATOR DOT +1D300..1D356 ; ON # So [87] MONOGRAM FOR EARTH..TETRAGRAM FOR FOSTERING + +# Total code points: 2793 + +# ================================================ + +# Bidi_Class=Boundary_Neutral + +0000..0008 ; BN # Cc [9] <control-0000>..<control-0008> +000E..001B ; BN # Cc [14] <control-000E>..<control-001B> +007F..0084 ; BN # Cc [6] <control-007F>..<control-0084> +0086..009F ; BN # Cc [26] <control-0086>..<control-009F> +00AD ; BN # Cf SOFT HYPHEN +070F ; BN # Cf SYRIAC ABBREVIATION MARK +200B..200D ; BN # Cf [3] ZERO WIDTH SPACE..ZERO WIDTH JOINER +2060..2063 ; BN # Cf [4] WORD JOINER..INVISIBLE SEPARATOR +2064..2069 ; BN # Cn [6] <reserved-2064>..<reserved-2069> +206A..206F ; BN # Cf [6] INHIBIT SYMMETRIC SWAPPING..NOMINAL DIGIT SHAPES +FDD0..FDEF ; BN # Cn [32] <noncharacter-FDD0>..<noncharacter-FDEF> +FEFF ; BN # Cf ZERO WIDTH NO-BREAK SPACE +FFF0..FFF8 ; BN # Cn [9] <reserved-FFF0>..<reserved-FFF8> +FFFE..FFFF ; BN # Cn [2] <noncharacter-FFFE>..<noncharacter-FFFF> +1D173..1D17A ; BN # Cf [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE +1FFFE..1FFFF ; BN # Cn [2] <noncharacter-1FFFE>..<noncharacter-1FFFF> +2FFFE..2FFFF ; BN # Cn [2] <noncharacter-2FFFE>..<noncharacter-2FFFF> +3FFFE..3FFFF ; BN # Cn [2] <noncharacter-3FFFE>..<noncharacter-3FFFF> +4FFFE..4FFFF ; BN # Cn [2] <noncharacter-4FFFE>..<noncharacter-4FFFF> +5FFFE..5FFFF ; BN # Cn [2] <noncharacter-5FFFE>..<noncharacter-5FFFF> +6FFFE..6FFFF ; BN # Cn [2] <noncharacter-6FFFE>..<noncharacter-6FFFF> +7FFFE..7FFFF ; BN # Cn [2] <noncharacter-7FFFE>..<noncharacter-7FFFF> +8FFFE..8FFFF ; BN # Cn [2] <noncharacter-8FFFE>..<noncharacter-8FFFF> +9FFFE..9FFFF ; BN # Cn [2] <noncharacter-9FFFE>..<noncharacter-9FFFF> +AFFFE..AFFFF ; BN # Cn [2] <noncharacter-AFFFE>..<noncharacter-AFFFF> +BFFFE..BFFFF ; BN # Cn [2] <noncharacter-BFFFE>..<noncharacter-BFFFF> +CFFFE..CFFFF ; BN # Cn [2] <noncharacter-CFFFE>..<noncharacter-CFFFF> +DFFFE..E0000 ; BN # Cn [3] <noncharacter-DFFFE>..<reserved-E0000> +E0001 ; BN # Cf LANGUAGE TAG +E0002..E001F ; BN # Cn [30] <reserved-E0002>..<reserved-E001F> +E0020..E007F ; BN # Cf [96] TAG SPACE..CANCEL TAG +E0080..E00FF ; BN # Cn [128] <reserved-E0080>..<reserved-E00FF> +E01F0..E0FFF ; BN # Cn [3600] <reserved-E01F0>..<reserved-E0FFF> +EFFFE..EFFFF ; BN # Cn [2] <noncharacter-EFFFE>..<noncharacter-EFFFF> +FFFFE..FFFFF ; BN # Cn [2] <noncharacter-FFFFE>..<noncharacter-FFFFF> +10FFFE..10FFFF; BN # Cn [2] <noncharacter-10FFFE>..<noncharacter-10FFFF> + +# Total code points: 4016 + +# ================================================ + +# Bidi_Class=Nonspacing_Mark + +0300..0357 ; NSM # Mn [88] COMBINING GRAVE ACCENT..COMBINING RIGHT HALF RING ABOVE +035D..036F ; NSM # Mn [19] COMBINING DOUBLE BREVE..COMBINING LATIN SMALL LETTER X +0483..0486 ; NSM # Mn [4] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC PSILI PNEUMATA +0488..0489 ; NSM # Me [2] COMBINING CYRILLIC HUNDRED THOUSANDS SIGN..COMBINING CYRILLIC MILLIONS SIGN +0591..05A1 ; NSM # Mn [17] HEBREW ACCENT ETNAHTA..HEBREW ACCENT PAZER +05A3..05B9 ; NSM # Mn [23] HEBREW ACCENT MUNAH..HEBREW POINT HOLAM +05BB..05BD ; NSM # Mn [3] HEBREW POINT QUBUTS..HEBREW POINT METEG +05BF ; NSM # Mn HEBREW POINT RAFE +05C1..05C2 ; NSM # Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT +05C4 ; NSM # Mn HEBREW MARK UPPER DOT +0610..0615 ; NSM # Mn [6] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL HIGH TAH +064B..0658 ; NSM # Mn [14] ARABIC FATHATAN..ARABIC MARK NOON GHUNNA +0670 ; NSM # Mn ARABIC LETTER SUPERSCRIPT ALEF +06D6..06DC ; NSM # Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN +06DE ; NSM # Me ARABIC START OF RUB EL HIZB +06DF..06E4 ; NSM # Mn [6] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA +06E7..06E8 ; NSM # Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON +06EA..06ED ; NSM # Mn [4] ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM +0711 ; NSM # Mn SYRIAC LETTER SUPERSCRIPT ALAPH +0730..074A ; NSM # Mn [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH +07A6..07B0 ; NSM # Mn [11] THAANA ABAFILI..THAANA SUKUN +0901..0902 ; NSM # Mn [2] DEVANAGARI SIGN CANDRABINDU..DEVANAGARI SIGN ANUSVARA +093C ; NSM # Mn DEVANAGARI SIGN NUKTA +0941..0948 ; NSM # Mn [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI +094D ; NSM # Mn DEVANAGARI SIGN VIRAMA +0951..0954 ; NSM # Mn [4] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI ACUTE ACCENT +0962..0963 ; NSM # Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL +0981 ; NSM # Mn BENGALI SIGN CANDRABINDU +09BC ; NSM # Mn BENGALI SIGN NUKTA +09C1..09C4 ; NSM # Mn [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR +09CD ; NSM # Mn BENGALI SIGN VIRAMA +09E2..09E3 ; NSM # Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL +0A01..0A02 ; NSM # Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI +0A3C ; NSM # Mn GURMUKHI SIGN NUKTA +0A41..0A42 ; NSM # Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU +0A47..0A48 ; NSM # Mn [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI +0A4B..0A4D ; NSM # Mn [3] GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA +0A70..0A71 ; NSM # Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK +0A81..0A82 ; NSM # Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA +0ABC ; NSM # Mn GUJARATI SIGN NUKTA +0AC1..0AC5 ; NSM # Mn [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E +0AC7..0AC8 ; NSM # Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI +0ACD ; NSM # Mn GUJARATI SIGN VIRAMA +0AE2..0AE3 ; NSM # Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL +0B01 ; NSM # Mn ORIYA SIGN CANDRABINDU +0B3C ; NSM # Mn ORIYA SIGN NUKTA +0B3F ; NSM # Mn ORIYA VOWEL SIGN I +0B41..0B43 ; NSM # Mn [3] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC R +0B4D ; NSM # Mn ORIYA SIGN VIRAMA +0B56 ; NSM # Mn ORIYA AI LENGTH MARK +0B82 ; NSM # Mn TAMIL SIGN ANUSVARA +0BC0 ; NSM # Mn TAMIL VOWEL SIGN II +0BCD ; NSM # Mn TAMIL SIGN VIRAMA +0C3E..0C40 ; NSM # Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II +0C46..0C48 ; NSM # Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI +0C4A..0C4D ; NSM # Mn [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA +0C55..0C56 ; NSM # Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK +0CBC ; NSM # Mn KANNADA SIGN NUKTA +0CCC..0CCD ; NSM # Mn [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA +0D41..0D43 ; NSM # Mn [3] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC R +0D4D ; NSM # Mn MALAYALAM SIGN VIRAMA +0DCA ; NSM # Mn SINHALA SIGN AL-LAKUNA +0DD2..0DD4 ; NSM # Mn [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA +0DD6 ; NSM # Mn SINHALA VOWEL SIGN DIGA PAA-PILLA +0E31 ; NSM # Mn THAI CHARACTER MAI HAN-AKAT +0E34..0E3A ; NSM # Mn [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU +0E47..0E4E ; NSM # Mn [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN +0EB1 ; NSM # Mn LAO VOWEL SIGN MAI KAN +0EB4..0EB9 ; NSM # Mn [6] LAO VOWEL SIGN I..LAO VOWEL SIGN UU +0EBB..0EBC ; NSM # Mn [2] LAO VOWEL SIGN MAI KON..LAO SEMIVOWEL SIGN LO +0EC8..0ECD ; NSM # Mn [6] LAO TONE MAI EK..LAO NIGGAHITA +0F18..0F19 ; NSM # Mn [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS +0F35 ; NSM # Mn TIBETAN MARK NGAS BZUNG NYI ZLA +0F37 ; NSM # Mn TIBETAN MARK NGAS BZUNG SGOR RTAGS +0F39 ; NSM # Mn TIBETAN MARK TSA -PHRU +0F71..0F7E ; NSM # Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO +0F80..0F84 ; NSM # Mn [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA +0F86..0F87 ; NSM # Mn [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS +0F90..0F97 ; NSM # Mn [8] TIBETAN SUBJOINED LETTER KA..TIBETAN SUBJOINED LETTER JA +0F99..0FBC ; NSM # Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA +0FC6 ; NSM # Mn TIBETAN SYMBOL PADMA GDAN +102D..1030 ; NSM # Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU +1032 ; NSM # Mn MYANMAR VOWEL SIGN AI +1036..1037 ; NSM # Mn [2] MYANMAR SIGN ANUSVARA..MYANMAR SIGN DOT BELOW +1039 ; NSM # Mn MYANMAR SIGN VIRAMA +1058..1059 ; NSM # Mn [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL +1712..1714 ; NSM # Mn [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA +1732..1734 ; NSM # Mn [3] HANUNOO VOWEL SIGN I..HANUNOO SIGN PAMUDPOD +1752..1753 ; NSM # Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U +1772..1773 ; NSM # Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U +17B7..17BD ; NSM # Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA +17C6 ; NSM # Mn KHMER SIGN NIKAHIT +17C9..17D3 ; NSM # Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT +17DD ; NSM # Mn KHMER SIGN ATTHACAN +180B..180D ; NSM # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE +18A9 ; NSM # Mn MONGOLIAN LETTER ALI GALI DAGALGA +1920..1922 ; NSM # Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U +1927..1928 ; NSM # Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O +1929..192B ; NSM # Mc [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA +1932 ; NSM # Mn LIMBU SMALL LETTER ANUSVARA +1939..193B ; NSM # Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I +20D0..20DC ; NSM # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE +20DD..20E0 ; NSM # Me [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH +20E1 ; NSM # Mn COMBINING LEFT RIGHT ARROW ABOVE +20E2..20E4 ; NSM # Me [3] COMBINING ENCLOSING SCREEN..COMBINING ENCLOSING UPWARD POINTING TRIANGLE +20E5..20EA ; NSM # Mn [6] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING LEFTWARDS ARROW OVERLAY +302A..302F ; NSM # Mn [6] IDEOGRAPHIC LEVEL TONE MARK..HANGUL DOUBLE DOT TONE MARK +3099..309A ; NSM # Mn [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +FB1E ; NSM # Mn HEBREW POINT JUDEO-SPANISH VARIKA +FE00..FE0F ; NSM # Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16 +FE20..FE23 ; NSM # Mn [4] COMBINING LIGATURE LEFT HALF..COMBINING DOUBLE TILDE RIGHT HALF +1D167..1D169 ; NSM # Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3 +1D17B..1D182 ; NSM # Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE +1D185..1D18B ; NSM # Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE +1D1AA..1D1AD ; NSM # Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO +E0100..E01EF ; NSM # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 + +# Total code points: 803 + +# ================================================ + +# Bidi_Class=Arabic_Letter + +0600..0603 ; AL # Cf [4] ARABIC NUMBER SIGN..ARABIC SIGN SAFHA +0604..060B ; AL # Cn [8] <reserved-0604>..<reserved-060B> +060D ; AL # Po ARABIC DATE SEPARATOR +0616..061A ; AL # Cn [5] <reserved-0616>..<reserved-061A> +061B ; AL # Po ARABIC SEMICOLON +061C..061E ; AL # Cn [3] <reserved-061C>..<reserved-061E> +061F ; AL # Po ARABIC QUESTION MARK +0620 ; AL # Cn <reserved-0620> +0621..063A ; AL # Lo [26] ARABIC LETTER HAMZA..ARABIC LETTER GHAIN +063B..063F ; AL # Cn [5] <reserved-063B>..<reserved-063F> +0640 ; AL # Lm ARABIC TATWEEL +0641..064A ; AL # Lo [10] ARABIC LETTER FEH..ARABIC LETTER YEH +0659..065F ; AL # Cn [7] <reserved-0659>..<reserved-065F> +066D ; AL # Po ARABIC FIVE POINTED STAR +066E..066F ; AL # Lo [2] ARABIC LETTER DOTLESS BEH..ARABIC LETTER DOTLESS QAF +0671..06D3 ; AL # Lo [99] ARABIC LETTER ALEF WASLA..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE +06D4 ; AL # Po ARABIC FULL STOP +06D5 ; AL # Lo ARABIC LETTER AE +06DD ; AL # Cf ARABIC END OF AYAH +06E5..06E6 ; AL # Lm [2] ARABIC SMALL WAW..ARABIC SMALL YEH +06EE..06EF ; AL # Lo [2] ARABIC LETTER DAL WITH INVERTED V..ARABIC LETTER REH WITH INVERTED V +06FA..06FC ; AL # Lo [3] ARABIC LETTER SHEEN WITH DOT BELOW..ARABIC LETTER GHAIN WITH DOT BELOW +06FD..06FE ; AL # So [2] ARABIC SIGN SINDHI AMPERSAND..ARABIC SIGN SINDHI POSTPOSITION MEN +06FF ; AL # Lo ARABIC LETTER HEH WITH INVERTED V +0700..070D ; AL # Po [14] SYRIAC END OF PARAGRAPH..SYRIAC HARKLEAN ASTERISCUS +070E ; AL # Cn <reserved-070E> +0710 ; AL # Lo SYRIAC LETTER ALAPH +0712..072F ; AL # Lo [30] SYRIAC LETTER BETH..SYRIAC LETTER PERSIAN DHALATH +074B..074C ; AL # Cn [2] <reserved-074B>..<reserved-074C> +074D..074F ; AL # Lo [3] SYRIAC LETTER SOGDIAN ZHAIN..SYRIAC LETTER SOGDIAN FE +0750..077F ; AL # Cn [48] <reserved-0750>..<reserved-077F> +0780..07A5 ; AL # Lo [38] THAANA LETTER HAA..THAANA LETTER WAAVU +07B1 ; AL # Lo THAANA LETTER NAA +07B2..07BF ; AL # Cn [14] <reserved-07B2>..<reserved-07BF> +FB50..FBB1 ; AL # Lo [98] ARABIC LETTER ALEF WASLA ISOLATED FORM..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM +FBB2..FBD2 ; AL # Cn [33] <reserved-FBB2>..<reserved-FBD2> +FBD3..FD3D ; AL # Lo [363] ARABIC LETTER NG ISOLATED FORM..ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM +FD40..FD4F ; AL # Cn [16] <reserved-FD40>..<reserved-FD4F> +FD50..FD8F ; AL # Lo [64] ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM..ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM +FD90..FD91 ; AL # Cn [2] <reserved-FD90>..<reserved-FD91> +FD92..FDC7 ; AL # Lo [54] ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM +FDC8..FDCF ; AL # Cn [8] <reserved-FDC8>..<reserved-FDCF> +FDF0..FDFB ; AL # Lo [12] ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM..ARABIC LIGATURE JALLAJALALOUHOU +FDFC ; AL # Sc RIAL SIGN +FDFE..FDFF ; AL # Cn [2] <reserved-FDFE>..<reserved-FDFF> +FE70..FE74 ; AL # Lo [5] ARABIC FATHATAN ISOLATED FORM..ARABIC KASRATAN ISOLATED FORM +FE75 ; AL # Cn <reserved-FE75> +FE76..FEFC ; AL # Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF FINAL FORM +FEFD..FEFE ; AL # Cn [2] <reserved-FEFD>..<reserved-FEFE> + +# Total code points: 1136 + +# ================================================ + +# Bidi_Class=Left_To_Right_Override + +202D ; LRO # Cf LEFT-TO-RIGHT OVERRIDE + +# Total code points: 1 + +# ================================================ + +# Bidi_Class=Right_To_Left_Override + +202E ; RLO # Cf RIGHT-TO-LEFT OVERRIDE + +# Total code points: 1 + +# ================================================ + +# Bidi_Class=Left_To_Right_Embedding + +202A ; LRE # Cf LEFT-TO-RIGHT EMBEDDING + +# Total code points: 1 + +# ================================================ + +# Bidi_Class=Right_To_Left_Embedding + +202B ; RLE # Cf RIGHT-TO-LEFT EMBEDDING + +# Total code points: 1 + +# ================================================ + +# Bidi_Class=Pop_Directional_Format + +202C ; PDF # Cf POP DIRECTIONAL FORMATTING + +# Total code points: 1 diff --git a/gen.tab/unidata/extracted/DerivedDecompositionType.txt b/gen.tab/unidata/extracted/DerivedDecompositionType.txt new file mode 100644 index 0000000..7b79695 --- /dev/null +++ b/gen.tab/unidata/extracted/DerivedDecompositionType.txt @@ -0,0 +1,933 @@ +# DerivedDecompositionType-4.0.1.txt +# Date: 2004-03-02, 02:41:56 GMT [MD] +# +# Unicode Character Database +# Copyright (c) 1991-2004 Unicode, Inc. +# For terms of use, see http://www.unicode.org/terms_of_use.html +# For documentation, see UCD.html + +# ================================================ + +# Decomposition_Type (from UnicodeData.txt, field 5: see UCD.html) + +# All code points not explicitly listed for Decomposition_Type +# have the value None. + +# ================================================ + +00C0..00C5 ; Canonical # L& [6] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER A WITH RING ABOVE +00C7..00CF ; Canonical # L& [9] LATIN CAPITAL LETTER C WITH CEDILLA..LATIN CAPITAL LETTER I WITH DIAERESIS +00D1..00D6 ; Canonical # L& [6] LATIN CAPITAL LETTER N WITH TILDE..LATIN CAPITAL LETTER O WITH DIAERESIS +00D9..00DD ; Canonical # L& [5] LATIN CAPITAL LETTER U WITH GRAVE..LATIN CAPITAL LETTER Y WITH ACUTE +00E0..00E5 ; Canonical # L& [6] LATIN SMALL LETTER A WITH GRAVE..LATIN SMALL LETTER A WITH RING ABOVE +00E7..00EF ; Canonical # L& [9] LATIN SMALL LETTER C WITH CEDILLA..LATIN SMALL LETTER I WITH DIAERESIS +00F1..00F6 ; Canonical # L& [6] LATIN SMALL LETTER N WITH TILDE..LATIN SMALL LETTER O WITH DIAERESIS +00F9..00FD ; Canonical # L& [5] LATIN SMALL LETTER U WITH GRAVE..LATIN SMALL LETTER Y WITH ACUTE +00FF..010F ; Canonical # L& [17] LATIN SMALL LETTER Y WITH DIAERESIS..LATIN SMALL LETTER D WITH CARON +0112..0125 ; Canonical # L& [20] LATIN CAPITAL LETTER E WITH MACRON..LATIN SMALL LETTER H WITH CIRCUMFLEX +0128..0130 ; Canonical # L& [9] LATIN CAPITAL LETTER I WITH TILDE..LATIN CAPITAL LETTER I WITH DOT ABOVE +0134..0137 ; Canonical # L& [4] LATIN CAPITAL LETTER J WITH CIRCUMFLEX..LATIN SMALL LETTER K WITH CEDILLA +0139..013E ; Canonical # L& [6] LATIN CAPITAL LETTER L WITH ACUTE..LATIN SMALL LETTER L WITH CARON +0143..0148 ; Canonical # L& [6] LATIN CAPITAL LETTER N WITH ACUTE..LATIN SMALL LETTER N WITH CARON +014C..0151 ; Canonical # L& [6] LATIN CAPITAL LETTER O WITH MACRON..LATIN SMALL LETTER O WITH DOUBLE ACUTE +0154..0165 ; Canonical # L& [18] LATIN CAPITAL LETTER R WITH ACUTE..LATIN SMALL LETTER T WITH CARON +0168..017E ; Canonical # L& [23] LATIN CAPITAL LETTER U WITH TILDE..LATIN SMALL LETTER Z WITH CARON +01A0..01A1 ; Canonical # L& [2] LATIN CAPITAL LETTER O WITH HORN..LATIN SMALL LETTER O WITH HORN +01AF..01B0 ; Canonical # L& [2] LATIN CAPITAL LETTER U WITH HORN..LATIN SMALL LETTER U WITH HORN +01CD..01DC ; Canonical # L& [16] LATIN CAPITAL LETTER A WITH CARON..LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE +01DE..01E3 ; Canonical # L& [6] LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON..LATIN SMALL LETTER AE WITH MACRON +01E6..01F0 ; Canonical # L& [11] LATIN CAPITAL LETTER G WITH CARON..LATIN SMALL LETTER J WITH CARON +01F4..01F5 ; Canonical # L& [2] LATIN CAPITAL LETTER G WITH ACUTE..LATIN SMALL LETTER G WITH ACUTE +01F8..021B ; Canonical # L& [36] LATIN CAPITAL LETTER N WITH GRAVE..LATIN SMALL LETTER T WITH COMMA BELOW +021E..021F ; Canonical # L& [2] LATIN CAPITAL LETTER H WITH CARON..LATIN SMALL LETTER H WITH CARON +0226..0233 ; Canonical # L& [14] LATIN CAPITAL LETTER A WITH DOT ABOVE..LATIN SMALL LETTER Y WITH MACRON +0340..0341 ; Canonical # Mn [2] COMBINING GRAVE TONE MARK..COMBINING ACUTE TONE MARK +0343..0344 ; Canonical # Mn [2] COMBINING GREEK KORONIS..COMBINING GREEK DIALYTIKA TONOS +0374 ; Canonical # Sk GREEK NUMERAL SIGN +037E ; Canonical # Po GREEK QUESTION MARK +0385 ; Canonical # Sk GREEK DIALYTIKA TONOS +0386 ; Canonical # L& GREEK CAPITAL LETTER ALPHA WITH TONOS +0387 ; Canonical # Po GREEK ANO TELEIA +0388..038A ; Canonical # L& [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS +038C ; Canonical # L& GREEK CAPITAL LETTER OMICRON WITH TONOS +038E..0390 ; Canonical # L& [3] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS +03AA..03B0 ; Canonical # L& [7] GREEK CAPITAL LETTER IOTA WITH DIALYTIKA..GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS +03CA..03CE ; Canonical # L& [5] GREEK SMALL LETTER IOTA WITH DIALYTIKA..GREEK SMALL LETTER OMEGA WITH TONOS +03D3..03D4 ; Canonical # L& [2] GREEK UPSILON WITH ACUTE AND HOOK SYMBOL..GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL +0400..0401 ; Canonical # L& [2] CYRILLIC CAPITAL LETTER IE WITH GRAVE..CYRILLIC CAPITAL LETTER IO +0403 ; Canonical # L& CYRILLIC CAPITAL LETTER GJE +0407 ; Canonical # L& CYRILLIC CAPITAL LETTER YI +040C..040E ; Canonical # L& [3] CYRILLIC CAPITAL LETTER KJE..CYRILLIC CAPITAL LETTER SHORT U +0419 ; Canonical # L& CYRILLIC CAPITAL LETTER SHORT I +0439 ; Canonical # L& CYRILLIC SMALL LETTER SHORT I +0450..0451 ; Canonical # L& [2] CYRILLIC SMALL LETTER IE WITH GRAVE..CYRILLIC SMALL LETTER IO +0453 ; Canonical # L& CYRILLIC SMALL LETTER GJE +0457 ; Canonical # L& CYRILLIC SMALL LETTER YI +045C..045E ; Canonical # L& [3] CYRILLIC SMALL LETTER KJE..CYRILLIC SMALL LETTER SHORT U +0476..0477 ; Canonical # L& [2] CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT..CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT +04C1..04C2 ; Canonical # L& [2] CYRILLIC CAPITAL LETTER ZHE WITH BREVE..CYRILLIC SMALL LETTER ZHE WITH BREVE +04D0..04D3 ; Canonical # L& [4] CYRILLIC CAPITAL LETTER A WITH BREVE..CYRILLIC SMALL LETTER A WITH DIAERESIS +04D6..04D7 ; Canonical # L& [2] CYRILLIC CAPITAL LETTER IE WITH BREVE..CYRILLIC SMALL LETTER IE WITH BREVE +04DA..04DF ; Canonical # L& [6] CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS..CYRILLIC SMALL LETTER ZE WITH DIAERESIS +04E2..04E7 ; Canonical # L& [6] CYRILLIC CAPITAL LETTER I WITH MACRON..CYRILLIC SMALL LETTER O WITH DIAERESIS +04EA..04F5 ; Canonical # L& [12] CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS..CYRILLIC SMALL LETTER CHE WITH DIAERESIS +04F8..04F9 ; Canonical # L& [2] CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS..CYRILLIC SMALL LETTER YERU WITH DIAERESIS +0622..0626 ; Canonical # Lo [5] ARABIC LETTER ALEF WITH MADDA ABOVE..ARABIC LETTER YEH WITH HAMZA ABOVE +06C0 ; Canonical # Lo ARABIC LETTER HEH WITH YEH ABOVE +06C2 ; Canonical # Lo ARABIC LETTER HEH GOAL WITH HAMZA ABOVE +06D3 ; Canonical # Lo ARABIC LETTER YEH BARREE WITH HAMZA ABOVE +0929 ; Canonical # Lo DEVANAGARI LETTER NNNA +0931 ; Canonical # Lo DEVANAGARI LETTER RRA +0934 ; Canonical # Lo DEVANAGARI LETTER LLLA +0958..095F ; Canonical # Lo [8] DEVANAGARI LETTER QA..DEVANAGARI LETTER YYA +09CB..09CC ; Canonical # Mc [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU +09DC..09DD ; Canonical # Lo [2] BENGALI LETTER RRA..BENGALI LETTER RHA +09DF ; Canonical # Lo BENGALI LETTER YYA +0A33 ; Canonical # Lo GURMUKHI LETTER LLA +0A36 ; Canonical # Lo GURMUKHI LETTER SHA +0A59..0A5B ; Canonical # Lo [3] GURMUKHI LETTER KHHA..GURMUKHI LETTER ZA +0A5E ; Canonical # Lo GURMUKHI LETTER FA +0B48 ; Canonical # Mc ORIYA VOWEL SIGN AI +0B4B..0B4C ; Canonical # Mc [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU +0B5C..0B5D ; Canonical # Lo [2] ORIYA LETTER RRA..ORIYA LETTER RHA +0B94 ; Canonical # Lo TAMIL LETTER AU +0BCA..0BCC ; Canonical # Mc [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU +0C48 ; Canonical # Mn TELUGU VOWEL SIGN AI +0CC0 ; Canonical # Mc KANNADA VOWEL SIGN II +0CC7..0CC8 ; Canonical # Mc [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI +0CCA..0CCB ; Canonical # Mc [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO +0D4A..0D4C ; Canonical # Mc [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU +0DDA ; Canonical # Mc SINHALA VOWEL SIGN DIGA KOMBUVA +0DDC..0DDE ; Canonical # Mc [3] SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA..SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA +0F43 ; Canonical # Lo TIBETAN LETTER GHA +0F4D ; Canonical # Lo TIBETAN LETTER DDHA +0F52 ; Canonical # Lo TIBETAN LETTER DHA +0F57 ; Canonical # Lo TIBETAN LETTER BHA +0F5C ; Canonical # Lo TIBETAN LETTER DZHA +0F69 ; Canonical # Lo TIBETAN LETTER KSSA +0F73 ; Canonical # Mn TIBETAN VOWEL SIGN II +0F75..0F76 ; Canonical # Mn [2] TIBETAN VOWEL SIGN UU..TIBETAN VOWEL SIGN VOCALIC R +0F78 ; Canonical # Mn TIBETAN VOWEL SIGN VOCALIC L +0F81 ; Canonical # Mn TIBETAN VOWEL SIGN REVERSED II +0F93 ; Canonical # Mn TIBETAN SUBJOINED LETTER GHA +0F9D ; Canonical # Mn TIBETAN SUBJOINED LETTER DDHA +0FA2 ; Canonical # Mn TIBETAN SUBJOINED LETTER DHA +0FA7 ; Canonical # Mn TIBETAN SUBJOINED LETTER BHA +0FAC ; Canonical # Mn TIBETAN SUBJOINED LETTER DZHA +0FB9 ; Canonical # Mn TIBETAN SUBJOINED LETTER KSSA +1026 ; Canonical # Lo MYANMAR LETTER UU +1E00..1E99 ; Canonical # L& [154] LATIN CAPITAL LETTER A WITH RING BELOW..LATIN SMALL LETTER Y WITH RING ABOVE +1E9B ; Canonical # L& LATIN SMALL LETTER LONG S WITH DOT ABOVE +1EA0..1EF9 ; Canonical # L& [90] LATIN CAPITAL LETTER A WITH DOT BELOW..LATIN SMALL LETTER Y WITH TILDE +1F00..1F15 ; Canonical # L& [22] GREEK SMALL LETTER ALPHA WITH PSILI..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA +1F18..1F1D ; Canonical # L& [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA +1F20..1F45 ; Canonical # L& [38] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA +1F48..1F4D ; Canonical # L& [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA +1F50..1F57 ; Canonical # L& [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI +1F59 ; Canonical # L& GREEK CAPITAL LETTER UPSILON WITH DASIA +1F5B ; Canonical # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA +1F5D ; Canonical # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA +1F5F..1F7D ; Canonical # L& [31] GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI..GREEK SMALL LETTER OMEGA WITH OXIA +1F80..1FB4 ; Canonical # L& [53] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI +1FB6..1FBC ; Canonical # L& [7] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI +1FBE ; Canonical # L& GREEK PROSGEGRAMMENI +1FC1 ; Canonical # Sk GREEK DIALYTIKA AND PERISPOMENI +1FC2..1FC4 ; Canonical # L& [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI +1FC6..1FCC ; Canonical # L& [7] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI +1FCD..1FCF ; Canonical # Sk [3] GREEK PSILI AND VARIA..GREEK PSILI AND PERISPOMENI +1FD0..1FD3 ; Canonical # L& [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA +1FD6..1FDB ; Canonical # L& [6] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK CAPITAL LETTER IOTA WITH OXIA +1FDD..1FDF ; Canonical # Sk [3] GREEK DASIA AND VARIA..GREEK DASIA AND PERISPOMENI +1FE0..1FEC ; Canonical # L& [13] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA +1FED..1FEF ; Canonical # Sk [3] GREEK DIALYTIKA AND VARIA..GREEK VARIA +1FF2..1FF4 ; Canonical # L& [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI +1FF6..1FFC ; Canonical # L& [7] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI +1FFD ; Canonical # Sk GREEK OXIA +2000..2001 ; Canonical # Zs [2] EN QUAD..EM QUAD +2126 ; Canonical # L& OHM SIGN +212A..212B ; Canonical # L& [2] KELVIN SIGN..ANGSTROM SIGN +219A..219B ; Canonical # Sm [2] LEFTWARDS ARROW WITH STROKE..RIGHTWARDS ARROW WITH STROKE +21AE ; Canonical # Sm LEFT RIGHT ARROW WITH STROKE +21CD ; Canonical # So LEFTWARDS DOUBLE ARROW WITH STROKE +21CE..21CF ; Canonical # Sm [2] LEFT RIGHT DOUBLE ARROW WITH STROKE..RIGHTWARDS DOUBLE ARROW WITH STROKE +2204 ; Canonical # Sm THERE DOES NOT EXIST +2209 ; Canonical # Sm NOT AN ELEMENT OF +220C ; Canonical # Sm DOES NOT CONTAIN AS MEMBER +2224 ; Canonical # Sm DOES NOT DIVIDE +2226 ; Canonical # Sm NOT PARALLEL TO +2241 ; Canonical # Sm NOT TILDE +2244 ; Canonical # Sm NOT ASYMPTOTICALLY EQUAL TO +2247 ; Canonical # Sm NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO +2249 ; Canonical # Sm NOT ALMOST EQUAL TO +2260 ; Canonical # Sm NOT EQUAL TO +2262 ; Canonical # Sm NOT IDENTICAL TO +226D..2271 ; Canonical # Sm [5] NOT EQUIVALENT TO..NEITHER GREATER-THAN NOR EQUAL TO +2274..2275 ; Canonical # Sm [2] NEITHER LESS-THAN NOR EQUIVALENT TO..NEITHER GREATER-THAN NOR EQUIVALENT TO +2278..2279 ; Canonical # Sm [2] NEITHER LESS-THAN NOR GREATER-THAN..NEITHER GREATER-THAN NOR LESS-THAN +2280..2281 ; Canonical # Sm [2] DOES NOT PRECEDE..DOES NOT SUCCEED +2284..2285 ; Canonical # Sm [2] NOT A SUBSET OF..NOT A SUPERSET OF +2288..2289 ; Canonical # Sm [2] NEITHER A SUBSET OF NOR EQUAL TO..NEITHER A SUPERSET OF NOR EQUAL TO +22AC..22AF ; Canonical # Sm [4] DOES NOT PROVE..NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE +22E0..22E3 ; Canonical # Sm [4] DOES NOT PRECEDE OR EQUAL..NOT SQUARE ORIGINAL OF OR EQUAL TO +22EA..22ED ; Canonical # Sm [4] NOT NORMAL SUBGROUP OF..DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL +2329 ; Canonical # Ps LEFT-POINTING ANGLE BRACKET +232A ; Canonical # Pe RIGHT-POINTING ANGLE BRACKET +2ADC ; Canonical # Sm FORKING +304C ; Canonical # Lo HIRAGANA LETTER GA +304E ; Canonical # Lo HIRAGANA LETTER GI +3050 ; Canonical # Lo HIRAGANA LETTER GU +3052 ; Canonical # Lo HIRAGANA LETTER GE +3054 ; Canonical # Lo HIRAGANA LETTER GO +3056 ; Canonical # Lo HIRAGANA LETTER ZA +3058 ; Canonical # Lo HIRAGANA LETTER ZI +305A ; Canonical # Lo HIRAGANA LETTER ZU +305C ; Canonical # Lo HIRAGANA LETTER ZE +305E ; Canonical # Lo HIRAGANA LETTER ZO +3060 ; Canonical # Lo HIRAGANA LETTER DA +3062 ; Canonical # Lo HIRAGANA LETTER DI +3065 ; Canonical # Lo HIRAGANA LETTER DU +3067 ; Canonical # Lo HIRAGANA LETTER DE +3069 ; Canonical # Lo HIRAGANA LETTER DO +3070..3071 ; Canonical # Lo [2] HIRAGANA LETTER BA..HIRAGANA LETTER PA +3073..3074 ; Canonical # Lo [2] HIRAGANA LETTER BI..HIRAGANA LETTER PI +3076..3077 ; Canonical # Lo [2] HIRAGANA LETTER BU..HIRAGANA LETTER PU +3079..307A ; Canonical # Lo [2] HIRAGANA LETTER BE..HIRAGANA LETTER PE +307C..307D ; Canonical # Lo [2] HIRAGANA LETTER BO..HIRAGANA LETTER PO +3094 ; Canonical # Lo HIRAGANA LETTER VU +309E ; Canonical # Lm HIRAGANA VOICED ITERATION MARK +30AC ; Canonical # Lo KATAKANA LETTER GA +30AE ; Canonical # Lo KATAKANA LETTER GI +30B0 ; Canonical # Lo KATAKANA LETTER GU +30B2 ; Canonical # Lo KATAKANA LETTER GE +30B4 ; Canonical # Lo KATAKANA LETTER GO +30B6 ; Canonical # Lo KATAKANA LETTER ZA +30B8 ; Canonical # Lo KATAKANA LETTER ZI +30BA ; Canonical # Lo KATAKANA LETTER ZU +30BC ; Canonical # Lo KATAKANA LETTER ZE +30BE ; Canonical # Lo KATAKANA LETTER ZO +30C0 ; Canonical # Lo KATAKANA LETTER DA +30C2 ; Canonical # Lo KATAKANA LETTER DI +30C5 ; Canonical # Lo KATAKANA LETTER DU +30C7 ; Canonical # Lo KATAKANA LETTER DE +30C9 ; Canonical # Lo KATAKANA LETTER DO +30D0..30D1 ; Canonical # Lo [2] KATAKANA LETTER BA..KATAKANA LETTER PA +30D3..30D4 ; Canonical # Lo [2] KATAKANA LETTER BI..KATAKANA LETTER PI +30D6..30D7 ; Canonical # Lo [2] KATAKANA LETTER BU..KATAKANA LETTER PU +30D9..30DA ; Canonical # Lo [2] KATAKANA LETTER BE..KATAKANA LETTER PE +30DC..30DD ; Canonical # Lo [2] KATAKANA LETTER BO..KATAKANA LETTER PO +30F4 ; Canonical # Lo KATAKANA LETTER VU +30F7..30FA ; Canonical # Lo [4] KATAKANA LETTER VA..KATAKANA LETTER VO +30FE ; Canonical # Lm KATAKANA VOICED ITERATION MARK +AC00..D7A3 ; Canonical # Lo [11172] HANGUL SYLLABLE GA..HANGUL SYLLABLE HIH +F900..FA0D ; Canonical # Lo [270] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA0D +FA10 ; Canonical # Lo CJK COMPATIBILITY IDEOGRAPH-FA10 +FA12 ; Canonical # Lo CJK COMPATIBILITY IDEOGRAPH-FA12 +FA15..FA1E ; Canonical # Lo [10] CJK COMPATIBILITY IDEOGRAPH-FA15..CJK COMPATIBILITY IDEOGRAPH-FA1E +FA20 ; Canonical # Lo CJK COMPATIBILITY IDEOGRAPH-FA20 +FA22 ; Canonical # Lo CJK COMPATIBILITY IDEOGRAPH-FA22 +FA25..FA26 ; Canonical # Lo [2] CJK COMPATIBILITY IDEOGRAPH-FA25..CJK COMPATIBILITY IDEOGRAPH-FA26 +FA2A..FA2D ; Canonical # Lo [4] CJK COMPATIBILITY IDEOGRAPH-FA2A..CJK COMPATIBILITY IDEOGRAPH-FA2D +FA30..FA6A ; Canonical # Lo [59] CJK COMPATIBILITY IDEOGRAPH-FA30..CJK COMPATIBILITY IDEOGRAPH-FA6A +FB1D ; Canonical # Lo HEBREW LETTER YOD WITH HIRIQ +FB1F ; Canonical # Lo HEBREW LIGATURE YIDDISH YOD YOD PATAH +FB2A..FB36 ; Canonical # Lo [13] HEBREW LETTER SHIN WITH SHIN DOT..HEBREW LETTER ZAYIN WITH DAGESH +FB38..FB3C ; Canonical # Lo [5] HEBREW LETTER TET WITH DAGESH..HEBREW LETTER LAMED WITH DAGESH +FB3E ; Canonical # Lo HEBREW LETTER MEM WITH DAGESH +FB40..FB41 ; Canonical # Lo [2] HEBREW LETTER NUN WITH DAGESH..HEBREW LETTER SAMEKH WITH DAGESH +FB43..FB44 ; Canonical # Lo [2] HEBREW LETTER FINAL PE WITH DAGESH..HEBREW LETTER PE WITH DAGESH +FB46..FB4E ; Canonical # Lo [9] HEBREW LETTER TSADI WITH DAGESH..HEBREW LETTER PE WITH RAFE +1D15E..1D164 ; Canonical # So [7] MUSICAL SYMBOL HALF NOTE..MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE +1D1BB..1D1C0 ; Canonical # So [6] MUSICAL SYMBOL MINIMA..MUSICAL SYMBOL FUSA BLACK +2F800..2FA1D ; Canonical # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D + +# Total code points: 13098 + +# ================================================ + +00A8 ; Compat # Sk DIAERESIS +00AF ; Compat # Sk MACRON +00B4 ; Compat # Sk ACUTE ACCENT +00B5 ; Compat # L& MICRO SIGN +00B8 ; Compat # Sk CEDILLA +0132..0133 ; Compat # L& [2] LATIN CAPITAL LIGATURE IJ..LATIN SMALL LIGATURE IJ +013F..0140 ; Compat # L& [2] LATIN CAPITAL LETTER L WITH MIDDLE DOT..LATIN SMALL LETTER L WITH MIDDLE DOT +0149 ; Compat # L& LATIN SMALL LETTER N PRECEDED BY APOSTROPHE +017F ; Compat # L& LATIN SMALL LETTER LONG S +01C4..01CC ; Compat # L& [9] LATIN CAPITAL LETTER DZ WITH CARON..LATIN SMALL LETTER NJ +01F1..01F3 ; Compat # L& [3] LATIN CAPITAL LETTER DZ..LATIN SMALL LETTER DZ +02D8..02DD ; Compat # Sk [6] BREVE..DOUBLE ACUTE ACCENT +037A ; Compat # Lm GREEK YPOGEGRAMMENI +0384 ; Compat # Sk GREEK TONOS +03D0..03D2 ; Compat # L& [3] GREEK BETA SYMBOL..GREEK UPSILON WITH HOOK SYMBOL +03D5..03D6 ; Compat # L& [2] GREEK PHI SYMBOL..GREEK PI SYMBOL +03F0..03F2 ; Compat # L& [3] GREEK KAPPA SYMBOL..GREEK LUNATE SIGMA SYMBOL +03F4..03F5 ; Compat # L& [2] GREEK CAPITAL THETA SYMBOL..GREEK LUNATE EPSILON SYMBOL +03F9 ; Compat # L& GREEK CAPITAL LUNATE SIGMA SYMBOL +0587 ; Compat # L& ARMENIAN SMALL LIGATURE ECH YIWN +0675..0678 ; Compat # Lo [4] ARABIC LETTER HIGH HAMZA ALEF..ARABIC LETTER HIGH HAMZA YEH +0E33 ; Compat # Lo THAI CHARACTER SARA AM +0EB3 ; Compat # Lo LAO VOWEL SIGN AM +0EDC..0EDD ; Compat # Lo [2] LAO HO NO..LAO HO MO +0F77 ; Compat # Mn TIBETAN VOWEL SIGN VOCALIC RR +0F79 ; Compat # Mn TIBETAN VOWEL SIGN VOCALIC LL +1E9A ; Compat # L& LATIN SMALL LETTER A WITH RIGHT HALF RING +1FBD ; Compat # Sk GREEK KORONIS +1FBF..1FC0 ; Compat # Sk [2] GREEK PSILI..GREEK PERISPOMENI +1FFE ; Compat # Sk GREEK DASIA +2002..2006 ; Compat # Zs [5] EN SPACE..SIX-PER-EM SPACE +2008..200A ; Compat # Zs [3] PUNCTUATION SPACE..HAIR SPACE +2017 ; Compat # Po DOUBLE LOW LINE +2024..2026 ; Compat # Po [3] ONE DOT LEADER..HORIZONTAL ELLIPSIS +2033..2034 ; Compat # Po [2] DOUBLE PRIME..TRIPLE PRIME +2036..2037 ; Compat # Po [2] REVERSED DOUBLE PRIME..REVERSED TRIPLE PRIME +203C ; Compat # Po DOUBLE EXCLAMATION MARK +203E ; Compat # Po OVERLINE +2047..2049 ; Compat # Po [3] DOUBLE QUESTION MARK..EXCLAMATION QUESTION MARK +2057 ; Compat # Po QUADRUPLE PRIME +205F ; Compat # Zs MEDIUM MATHEMATICAL SPACE +20A8 ; Compat # Sc RUPEE SIGN +2100..2101 ; Compat # So [2] ACCOUNT OF..ADDRESSED TO THE SUBJECT +2103 ; Compat # So DEGREE CELSIUS +2105..2106 ; Compat # So [2] CARE OF..CADA UNA +2107 ; Compat # L& EULER CONSTANT +2109 ; Compat # So DEGREE FAHRENHEIT +2116 ; Compat # So NUMERO SIGN +2121 ; Compat # So TELEPHONE SIGN +2135..2138 ; Compat # Lo [4] ALEF SYMBOL..DALET SYMBOL +213B ; Compat # So FACSIMILE SIGN +2160..217F ; Compat # Nl [32] ROMAN NUMERAL ONE..SMALL ROMAN NUMERAL ONE THOUSAND +222C..222D ; Compat # Sm [2] DOUBLE INTEGRAL..TRIPLE INTEGRAL +222F..2230 ; Compat # Sm [2] SURFACE INTEGRAL..VOLUME INTEGRAL +2474..249B ; Compat # No [40] PARENTHESIZED DIGIT ONE..NUMBER TWENTY FULL STOP +249C..24B5 ; Compat # So [26] PARENTHESIZED LATIN SMALL LETTER A..PARENTHESIZED LATIN SMALL LETTER Z +2A0C ; Compat # Sm QUADRUPLE INTEGRAL OPERATOR +2A74..2A76 ; Compat # Sm [3] DOUBLE COLON EQUAL..THREE CONSECUTIVE EQUALS SIGNS +2E9F ; Compat # So CJK RADICAL MOTHER +2EF3 ; Compat # So CJK RADICAL C-SIMPLIFIED TURTLE +2F00..2FD5 ; Compat # So [214] KANGXI RADICAL ONE..KANGXI RADICAL FLUTE +3036 ; Compat # So CIRCLED POSTAL MARK +3038..303A ; Compat # Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY +309B..309C ; Compat # Sk [2] KATAKANA-HIRAGANA VOICED SOUND MARK..KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +3131..318E ; Compat # Lo [94] HANGUL LETTER KIYEOK..HANGUL LETTER ARAEAE +3200..321E ; Compat # So [31] PARENTHESIZED HANGUL KIYEOK..PARENTHESIZED KOREAN CHARACTER O HU +3220..3229 ; Compat # No [10] PARENTHESIZED IDEOGRAPH ONE..PARENTHESIZED IDEOGRAPH TEN +322A..3243 ; Compat # So [26] PARENTHESIZED IDEOGRAPH MOON..PARENTHESIZED IDEOGRAPH REACH +32C0..32CB ; Compat # So [12] IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY..IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER +3358..3370 ; Compat # So [25] IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO..IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR +33E0..33FE ; Compat # So [31] IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE..IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE +FB00..FB06 ; Compat # L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST +FB13..FB17 ; Compat # L& [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH +FB4F ; Compat # Lo HEBREW LIGATURE ALEF LAMED +FE49..FE4C ; Compat # Po [4] DASHED OVERLINE..DOUBLE WAVY OVERLINE +FE4D..FE4F ; Compat # Pc [3] DASHED LOW LINE..WAVY LOW LINE + +# Total code points: 673 + +# ================================================ + +2102 ; Font # L& DOUBLE-STRUCK CAPITAL C +210A..2113 ; Font # L& [10] SCRIPT SMALL G..SCRIPT SMALL L +2115 ; Font # L& DOUBLE-STRUCK CAPITAL N +2119..211D ; Font # L& [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R +2124 ; Font # L& DOUBLE-STRUCK CAPITAL Z +2128 ; Font # L& BLACK-LETTER CAPITAL Z +212C..212D ; Font # L& [2] SCRIPT CAPITAL B..BLACK-LETTER CAPITAL C +212F..2131 ; Font # L& [3] SCRIPT SMALL E..SCRIPT CAPITAL F +2133..2134 ; Font # L& [2] SCRIPT CAPITAL M..SCRIPT SMALL O +2139 ; Font # L& INFORMATION SOURCE +213D..213F ; Font # L& [3] DOUBLE-STRUCK SMALL GAMMA..DOUBLE-STRUCK CAPITAL PI +2140 ; Font # Sm DOUBLE-STRUCK N-ARY SUMMATION +2145..2149 ; Font # L& [5] DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL J +FB20..FB28 ; Font # Lo [9] HEBREW LETTER ALTERNATIVE AYIN..HEBREW LETTER WIDE TAV +FB29 ; Font # Sm HEBREW LETTER ALTERNATIVE PLUS SIGN +1D400..1D454 ; Font # L& [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G +1D456..1D49C ; Font # L& [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A +1D49E..1D49F ; Font # L& [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D +1D4A2 ; Font # L& MATHEMATICAL SCRIPT CAPITAL G +1D4A5..1D4A6 ; Font # L& [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K +1D4A9..1D4AC ; Font # L& [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q +1D4AE..1D4B9 ; Font # L& [12] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT SMALL D +1D4BB ; Font # L& MATHEMATICAL SCRIPT SMALL F +1D4BD..1D4C3 ; Font # L& [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N +1D4C5..1D505 ; Font # L& [65] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL FRAKTUR CAPITAL B +1D507..1D50A ; Font # L& [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G +1D50D..1D514 ; Font # L& [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q +1D516..1D51C ; Font # L& [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y +1D51E..1D539 ; Font # L& [28] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B +1D53B..1D53E ; Font # L& [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G +1D540..1D544 ; Font # L& [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M +1D546 ; Font # L& MATHEMATICAL DOUBLE-STRUCK CAPITAL O +1D54A..1D550 ; Font # L& [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y +1D552..1D6A3 ; Font # L& [338] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL MONOSPACE SMALL Z +1D6A8..1D6C0 ; Font # L& [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA +1D6C1 ; Font # Sm MATHEMATICAL BOLD NABLA +1D6C2..1D6DA ; Font # L& [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA +1D6DB ; Font # Sm MATHEMATICAL BOLD PARTIAL DIFFERENTIAL +1D6DC..1D6FA ; Font # L& [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA +1D6FB ; Font # Sm MATHEMATICAL ITALIC NABLA +1D6FC..1D714 ; Font # L& [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA +1D715 ; Font # Sm MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL +1D716..1D734 ; Font # L& [31] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA +1D735 ; Font # Sm MATHEMATICAL BOLD ITALIC NABLA +1D736..1D74E ; Font # L& [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA +1D74F ; Font # Sm MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL +1D750..1D76E ; Font # L& [31] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA +1D76F ; Font # Sm MATHEMATICAL SANS-SERIF BOLD NABLA +1D770..1D788 ; Font # L& [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA +1D789 ; Font # Sm MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL +1D78A..1D7A8 ; Font # L& [31] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA +1D7A9 ; Font # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA +1D7AA..1D7C2 ; Font # L& [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA +1D7C3 ; Font # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL +1D7C4..1D7C9 ; Font # L& [6] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL +1D7CE..1D7FF ; Font # Nd [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE + +# Total code points: 1038 + +# ================================================ + +00A0 ; Nobreak # Zs NO-BREAK SPACE +0F0C ; Nobreak # Po TIBETAN MARK DELIMITER TSHEG BSTAR +2007 ; Nobreak # Zs FIGURE SPACE +2011 ; Nobreak # Pd NON-BREAKING HYPHEN +202F ; Nobreak # Zs NARROW NO-BREAK SPACE + +# Total code points: 5 + +# ================================================ + +FB54 ; Initial # Lo ARABIC LETTER BEEH INITIAL FORM +FB58 ; Initial # Lo ARABIC LETTER PEH INITIAL FORM +FB5C ; Initial # Lo ARABIC LETTER BEHEH INITIAL FORM +FB60 ; Initial # Lo ARABIC LETTER TTEHEH INITIAL FORM +FB64 ; Initial # Lo ARABIC LETTER TEHEH INITIAL FORM +FB68 ; Initial # Lo ARABIC LETTER TTEH INITIAL FORM +FB6C ; Initial # Lo ARABIC LETTER VEH INITIAL FORM +FB70 ; Initial # Lo ARABIC LETTER PEHEH INITIAL FORM +FB74 ; Initial # Lo ARABIC LETTER DYEH INITIAL FORM +FB78 ; Initial # Lo ARABIC LETTER NYEH INITIAL FORM +FB7C ; Initial # Lo ARABIC LETTER TCHEH INITIAL FORM +FB80 ; Initial # Lo ARABIC LETTER TCHEHEH INITIAL FORM +FB90 ; Initial # Lo ARABIC LETTER KEHEH INITIAL FORM +FB94 ; Initial # Lo ARABIC LETTER GAF INITIAL FORM +FB98 ; Initial # Lo ARABIC LETTER GUEH INITIAL FORM +FB9C ; Initial # Lo ARABIC LETTER NGOEH INITIAL FORM +FBA2 ; Initial # Lo ARABIC LETTER RNOON INITIAL FORM +FBA8 ; Initial # Lo ARABIC LETTER HEH GOAL INITIAL FORM +FBAC ; Initial # Lo ARABIC LETTER HEH DOACHASHMEE INITIAL FORM +FBD5 ; Initial # Lo ARABIC LETTER NG INITIAL FORM +FBE6 ; Initial # Lo ARABIC LETTER E INITIAL FORM +FBE8 ; Initial # Lo ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM +FBF8 ; Initial # Lo ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM +FBFB ; Initial # Lo ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM +FBFE ; Initial # Lo ARABIC LETTER FARSI YEH INITIAL FORM +FC97..FCDE ; Initial # Lo [72] ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM..ARABIC LIGATURE YEH WITH HEH INITIAL FORM +FD2D..FD33 ; Initial # Lo [7] ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM..ARABIC LIGATURE TAH WITH MEEM INITIAL FORM +FD50 ; Initial # Lo ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM +FD52..FD57 ; Initial # Lo [6] ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM..ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM +FD59 ; Initial # Lo ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM +FD5C..FD5D ; Initial # Lo [2] ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM..ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM +FD60..FD61 ; Initial # Lo [2] ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM..ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM +FD63 ; Initial # Lo ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM +FD65 ; Initial # Lo ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM +FD68 ; Initial # Lo ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM +FD6B ; Initial # Lo ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM +FD6D ; Initial # Lo ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM +FD70 ; Initial # Lo ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM +FD72..FD73 ; Initial # Lo [2] ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM..ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM +FD77 ; Initial # Lo ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM +FD7D ; Initial # Lo ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM +FD83 ; Initial # Lo ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM +FD86 ; Initial # Lo ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM +FD88..FD8A ; Initial # Lo [3] ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM..ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM +FD8C..FD8F ; Initial # Lo [4] ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM..ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM +FD92..FD95 ; Initial # Lo [4] ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM..ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM +FD98 ; Initial # Lo ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM +FD9D ; Initial # Lo ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM +FDB4..FDB5 ; Initial # Lo [2] ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM..ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM +FDB8 ; Initial # Lo ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM +FDBA ; Initial # Lo ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM +FDC3..FDC5 ; Initial # Lo [3] ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM..ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM +FE8B ; Initial # Lo ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM +FE91 ; Initial # Lo ARABIC LETTER BEH INITIAL FORM +FE97 ; Initial # Lo ARABIC LETTER TEH INITIAL FORM +FE9B ; Initial # Lo ARABIC LETTER THEH INITIAL FORM +FE9F ; Initial # Lo ARABIC LETTER JEEM INITIAL FORM +FEA3 ; Initial # Lo ARABIC LETTER HAH INITIAL FORM +FEA7 ; Initial # Lo ARABIC LETTER KHAH INITIAL FORM +FEB3 ; Initial # Lo ARABIC LETTER SEEN INITIAL FORM +FEB7 ; Initial # Lo ARABIC LETTER SHEEN INITIAL FORM +FEBB ; Initial # Lo ARABIC LETTER SAD INITIAL FORM +FEBF ; Initial # Lo ARABIC LETTER DAD INITIAL FORM +FEC3 ; Initial # Lo ARABIC LETTER TAH INITIAL FORM +FEC7 ; Initial # Lo ARABIC LETTER ZAH INITIAL FORM +FECB ; Initial # Lo ARABIC LETTER AIN INITIAL FORM +FECF ; Initial # Lo ARABIC LETTER GHAIN INITIAL FORM +FED3 ; Initial # Lo ARABIC LETTER FEH INITIAL FORM +FED7 ; Initial # Lo ARABIC LETTER QAF INITIAL FORM +FEDB ; Initial # Lo ARABIC LETTER KAF INITIAL FORM +FEDF ; Initial # Lo ARABIC LETTER LAM INITIAL FORM +FEE3 ; Initial # Lo ARABIC LETTER MEEM INITIAL FORM +FEE7 ; Initial # Lo ARABIC LETTER NOON INITIAL FORM +FEEB ; Initial # Lo ARABIC LETTER HEH INITIAL FORM +FEF3 ; Initial # Lo ARABIC LETTER YEH INITIAL FORM + +# Total code points: 171 + +# ================================================ + +FB55 ; Medial # Lo ARABIC LETTER BEEH MEDIAL FORM +FB59 ; Medial # Lo ARABIC LETTER PEH MEDIAL FORM +FB5D ; Medial # Lo ARABIC LETTER BEHEH MEDIAL FORM +FB61 ; Medial # Lo ARABIC LETTER TTEHEH MEDIAL FORM +FB65 ; Medial # Lo ARABIC LETTER TEHEH MEDIAL FORM +FB69 ; Medial # Lo ARABIC LETTER TTEH MEDIAL FORM +FB6D ; Medial # Lo ARABIC LETTER VEH MEDIAL FORM +FB71 ; Medial # Lo ARABIC LETTER PEHEH MEDIAL FORM +FB75 ; Medial # Lo ARABIC LETTER DYEH MEDIAL FORM +FB79 ; Medial # Lo ARABIC LETTER NYEH MEDIAL FORM +FB7D ; Medial # Lo ARABIC LETTER TCHEH MEDIAL FORM +FB81 ; Medial # Lo ARABIC LETTER TCHEHEH MEDIAL FORM +FB91 ; Medial # Lo ARABIC LETTER KEHEH MEDIAL FORM +FB95 ; Medial # Lo ARABIC LETTER GAF MEDIAL FORM +FB99 ; Medial # Lo ARABIC LETTER GUEH MEDIAL FORM +FB9D ; Medial # Lo ARABIC LETTER NGOEH MEDIAL FORM +FBA3 ; Medial # Lo ARABIC LETTER RNOON MEDIAL FORM +FBA9 ; Medial # Lo ARABIC LETTER HEH GOAL MEDIAL FORM +FBAD ; Medial # Lo ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM +FBD6 ; Medial # Lo ARABIC LETTER NG MEDIAL FORM +FBE7 ; Medial # Lo ARABIC LETTER E MEDIAL FORM +FBE9 ; Medial # Lo ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM +FBFF ; Medial # Lo ARABIC LETTER FARSI YEH MEDIAL FORM +FCDF..FCF4 ; Medial # Lo [22] ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM..ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM +FD34..FD3B ; Medial # Lo [8] ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM..ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM +FE71 ; Medial # Lo ARABIC TATWEEL WITH FATHATAN ABOVE +FE77 ; Medial # Lo ARABIC FATHA MEDIAL FORM +FE79 ; Medial # Lo ARABIC DAMMA MEDIAL FORM +FE7B ; Medial # Lo ARABIC KASRA MEDIAL FORM +FE7D ; Medial # Lo ARABIC SHADDA MEDIAL FORM +FE7F ; Medial # Lo ARABIC SUKUN MEDIAL FORM +FE8C ; Medial # Lo ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM +FE92 ; Medial # Lo ARABIC LETTER BEH MEDIAL FORM +FE98 ; Medial # Lo ARABIC LETTER TEH MEDIAL FORM +FE9C ; Medial # Lo ARABIC LETTER THEH MEDIAL FORM +FEA0 ; Medial # Lo ARABIC LETTER JEEM MEDIAL FORM +FEA4 ; Medial # Lo ARABIC LETTER HAH MEDIAL FORM +FEA8 ; Medial # Lo ARABIC LETTER KHAH MEDIAL FORM +FEB4 ; Medial # Lo ARABIC LETTER SEEN MEDIAL FORM +FEB8 ; Medial # Lo ARABIC LETTER SHEEN MEDIAL FORM +FEBC ; Medial # Lo ARABIC LETTER SAD MEDIAL FORM +FEC0 ; Medial # Lo ARABIC LETTER DAD MEDIAL FORM +FEC4 ; Medial # Lo ARABIC LETTER TAH MEDIAL FORM +FEC8 ; Medial # Lo ARABIC LETTER ZAH MEDIAL FORM +FECC ; Medial # Lo ARABIC LETTER AIN MEDIAL FORM +FED0 ; Medial # Lo ARABIC LETTER GHAIN MEDIAL FORM +FED4 ; Medial # Lo ARABIC LETTER FEH MEDIAL FORM +FED8 ; Medial # Lo ARABIC LETTER QAF MEDIAL FORM +FEDC ; Medial # Lo ARABIC LETTER KAF MEDIAL FORM +FEE0 ; Medial # Lo ARABIC LETTER LAM MEDIAL FORM +FEE4 ; Medial # Lo ARABIC LETTER MEEM MEDIAL FORM +FEE8 ; Medial # Lo ARABIC LETTER NOON MEDIAL FORM +FEEC ; Medial # Lo ARABIC LETTER HEH MEDIAL FORM +FEF4 ; Medial # Lo ARABIC LETTER YEH MEDIAL FORM + +# Total code points: 82 + +# ================================================ + +FB51 ; Final # Lo ARABIC LETTER ALEF WASLA FINAL FORM +FB53 ; Final # Lo ARABIC LETTER BEEH FINAL FORM +FB57 ; Final # Lo ARABIC LETTER PEH FINAL FORM +FB5B ; Final # Lo ARABIC LETTER BEHEH FINAL FORM +FB5F ; Final # Lo ARABIC LETTER TTEHEH FINAL FORM +FB63 ; Final # Lo ARABIC LETTER TEHEH FINAL FORM +FB67 ; Final # Lo ARABIC LETTER TTEH FINAL FORM +FB6B ; Final # Lo ARABIC LETTER VEH FINAL FORM +FB6F ; Final # Lo ARABIC LETTER PEHEH FINAL FORM +FB73 ; Final # Lo ARABIC LETTER DYEH FINAL FORM +FB77 ; Final # Lo ARABIC LETTER NYEH FINAL FORM +FB7B ; Final # Lo ARABIC LETTER TCHEH FINAL FORM +FB7F ; Final # Lo ARABIC LETTER TCHEHEH FINAL FORM +FB83 ; Final # Lo ARABIC LETTER DDAHAL FINAL FORM +FB85 ; Final # Lo ARABIC LETTER DAHAL FINAL FORM +FB87 ; Final # Lo ARABIC LETTER DUL FINAL FORM +FB89 ; Final # Lo ARABIC LETTER DDAL FINAL FORM +FB8B ; Final # Lo ARABIC LETTER JEH FINAL FORM +FB8D ; Final # Lo ARABIC LETTER RREH FINAL FORM +FB8F ; Final # Lo ARABIC LETTER KEHEH FINAL FORM +FB93 ; Final # Lo ARABIC LETTER GAF FINAL FORM +FB97 ; Final # Lo ARABIC LETTER GUEH FINAL FORM +FB9B ; Final # Lo ARABIC LETTER NGOEH FINAL FORM +FB9F ; Final # Lo ARABIC LETTER NOON GHUNNA FINAL FORM +FBA1 ; Final # Lo ARABIC LETTER RNOON FINAL FORM +FBA5 ; Final # Lo ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM +FBA7 ; Final # Lo ARABIC LETTER HEH GOAL FINAL FORM +FBAB ; Final # Lo ARABIC LETTER HEH DOACHASHMEE FINAL FORM +FBAF ; Final # Lo ARABIC LETTER YEH BARREE FINAL FORM +FBB1 ; Final # Lo ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM +FBD4 ; Final # Lo ARABIC LETTER NG FINAL FORM +FBD8 ; Final # Lo ARABIC LETTER U FINAL FORM +FBDA ; Final # Lo ARABIC LETTER OE FINAL FORM +FBDC ; Final # Lo ARABIC LETTER YU FINAL FORM +FBDF ; Final # Lo ARABIC LETTER VE FINAL FORM +FBE1 ; Final # Lo ARABIC LETTER KIRGHIZ OE FINAL FORM +FBE3 ; Final # Lo ARABIC LETTER KIRGHIZ YU FINAL FORM +FBE5 ; Final # Lo ARABIC LETTER E FINAL FORM +FBEB ; Final # Lo ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM +FBED ; Final # Lo ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM +FBEF ; Final # Lo ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM +FBF1 ; Final # Lo ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM +FBF3 ; Final # Lo ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM +FBF5 ; Final # Lo ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM +FBF7 ; Final # Lo ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM +FBFA ; Final # Lo ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM +FBFD ; Final # Lo ARABIC LETTER FARSI YEH FINAL FORM +FC64..FC96 ; Final # Lo [51] ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM..ARABIC LIGATURE YEH WITH YEH FINAL FORM +FD11..FD2C ; Final # Lo [28] ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM..ARABIC LIGATURE DAD WITH REH FINAL FORM +FD3C ; Final # Lo ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM +FD51 ; Final # Lo ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM +FD58 ; Final # Lo ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM +FD5A..FD5B ; Final # Lo [2] ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM..ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM +FD5E..FD5F ; Final # Lo [2] ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM..ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM +FD62 ; Final # Lo ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM +FD64 ; Final # Lo ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM +FD66..FD67 ; Final # Lo [2] ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM..ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM +FD69..FD6A ; Final # Lo [2] ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM..ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM +FD6C ; Final # Lo ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM +FD6E..FD6F ; Final # Lo [2] ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM..ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM +FD71 ; Final # Lo ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM +FD74..FD76 ; Final # Lo [3] ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM..ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM +FD78..FD7C ; Final # Lo [5] ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM..ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM +FD7E..FD82 ; Final # Lo [5] ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM..ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM +FD84..FD85 ; Final # Lo [2] ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM..ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM +FD87 ; Final # Lo ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM +FD8B ; Final # Lo ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM +FD96..FD97 ; Final # Lo [2] ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM +FD99..FD9C ; Final # Lo [4] ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM..ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM +FD9E..FDB3 ; Final # Lo [22] ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM..ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM +FDB6..FDB7 ; Final # Lo [2] ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM..ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM +FDB9 ; Final # Lo ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM +FDBB..FDC2 ; Final # Lo [8] ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM..ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM +FDC6..FDC7 ; Final # Lo [2] ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM +FE82 ; Final # Lo ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM +FE84 ; Final # Lo ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM +FE86 ; Final # Lo ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM +FE88 ; Final # Lo ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM +FE8A ; Final # Lo ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM +FE8E ; Final # Lo ARABIC LETTER ALEF FINAL FORM +FE90 ; Final # Lo ARABIC LETTER BEH FINAL FORM +FE94 ; Final # Lo ARABIC LETTER TEH MARBUTA FINAL FORM +FE96 ; Final # Lo ARABIC LETTER TEH FINAL FORM +FE9A ; Final # Lo ARABIC LETTER THEH FINAL FORM +FE9E ; Final # Lo ARABIC LETTER JEEM FINAL FORM +FEA2 ; Final # Lo ARABIC LETTER HAH FINAL FORM +FEA6 ; Final # Lo ARABIC LETTER KHAH FINAL FORM +FEAA ; Final # Lo ARABIC LETTER DAL FINAL FORM +FEAC ; Final # Lo ARABIC LETTER THAL FINAL FORM +FEAE ; Final # Lo ARABIC LETTER REH FINAL FORM +FEB0 ; Final # Lo ARABIC LETTER ZAIN FINAL FORM +FEB2 ; Final # Lo ARABIC LETTER SEEN FINAL FORM +FEB6 ; Final # Lo ARABIC LETTER SHEEN FINAL FORM +FEBA ; Final # Lo ARABIC LETTER SAD FINAL FORM +FEBE ; Final # Lo ARABIC LETTER DAD FINAL FORM +FEC2 ; Final # Lo ARABIC LETTER TAH FINAL FORM +FEC6 ; Final # Lo ARABIC LETTER ZAH FINAL FORM +FECA ; Final # Lo ARABIC LETTER AIN FINAL FORM +FECE ; Final # Lo ARABIC LETTER GHAIN FINAL FORM +FED2 ; Final # Lo ARABIC LETTER FEH FINAL FORM +FED6 ; Final # Lo ARABIC LETTER QAF FINAL FORM +FEDA ; Final # Lo ARABIC LETTER KAF FINAL FORM +FEDE ; Final # Lo ARABIC LETTER LAM FINAL FORM +FEE2 ; Final # Lo ARABIC LETTER MEEM FINAL FORM +FEE6 ; Final # Lo ARABIC LETTER NOON FINAL FORM +FEEA ; Final # Lo ARABIC LETTER HEH FINAL FORM +FEEE ; Final # Lo ARABIC LETTER WAW FINAL FORM +FEF0 ; Final # Lo ARABIC LETTER ALEF MAKSURA FINAL FORM +FEF2 ; Final # Lo ARABIC LETTER YEH FINAL FORM +FEF6 ; Final # Lo ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM +FEF8 ; Final # Lo ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM +FEFA ; Final # Lo ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM +FEFC ; Final # Lo ARABIC LIGATURE LAM WITH ALEF FINAL FORM + +# Total code points: 240 + +# ================================================ + +FB50 ; Isolated # Lo ARABIC LETTER ALEF WASLA ISOLATED FORM +FB52 ; Isolated # Lo ARABIC LETTER BEEH ISOLATED FORM +FB56 ; Isolated # Lo ARABIC LETTER PEH ISOLATED FORM +FB5A ; Isolated # Lo ARABIC LETTER BEHEH ISOLATED FORM +FB5E ; Isolated # Lo ARABIC LETTER TTEHEH ISOLATED FORM +FB62 ; Isolated # Lo ARABIC LETTER TEHEH ISOLATED FORM +FB66 ; Isolated # Lo ARABIC LETTER TTEH ISOLATED FORM +FB6A ; Isolated # Lo ARABIC LETTER VEH ISOLATED FORM +FB6E ; Isolated # Lo ARABIC LETTER PEHEH ISOLATED FORM +FB72 ; Isolated # Lo ARABIC LETTER DYEH ISOLATED FORM +FB76 ; Isolated # Lo ARABIC LETTER NYEH ISOLATED FORM +FB7A ; Isolated # Lo ARABIC LETTER TCHEH ISOLATED FORM +FB7E ; Isolated # Lo ARABIC LETTER TCHEHEH ISOLATED FORM +FB82 ; Isolated # Lo ARABIC LETTER DDAHAL ISOLATED FORM +FB84 ; Isolated # Lo ARABIC LETTER DAHAL ISOLATED FORM +FB86 ; Isolated # Lo ARABIC LETTER DUL ISOLATED FORM +FB88 ; Isolated # Lo ARABIC LETTER DDAL ISOLATED FORM +FB8A ; Isolated # Lo ARABIC LETTER JEH ISOLATED FORM +FB8C ; Isolated # Lo ARABIC LETTER RREH ISOLATED FORM +FB8E ; Isolated # Lo ARABIC LETTER KEHEH ISOLATED FORM +FB92 ; Isolated # Lo ARABIC LETTER GAF ISOLATED FORM +FB96 ; Isolated # Lo ARABIC LETTER GUEH ISOLATED FORM +FB9A ; Isolated # Lo ARABIC LETTER NGOEH ISOLATED FORM +FB9E ; Isolated # Lo ARABIC LETTER NOON GHUNNA ISOLATED FORM +FBA0 ; Isolated # Lo ARABIC LETTER RNOON ISOLATED FORM +FBA4 ; Isolated # Lo ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM +FBA6 ; Isolated # Lo ARABIC LETTER HEH GOAL ISOLATED FORM +FBAA ; Isolated # Lo ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM +FBAE ; Isolated # Lo ARABIC LETTER YEH BARREE ISOLATED FORM +FBB0 ; Isolated # Lo ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM +FBD3 ; Isolated # Lo ARABIC LETTER NG ISOLATED FORM +FBD7 ; Isolated # Lo ARABIC LETTER U ISOLATED FORM +FBD9 ; Isolated # Lo ARABIC LETTER OE ISOLATED FORM +FBDB ; Isolated # Lo ARABIC LETTER YU ISOLATED FORM +FBDD..FBDE ; Isolated # Lo [2] ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM..ARABIC LETTER VE ISOLATED FORM +FBE0 ; Isolated # Lo ARABIC LETTER KIRGHIZ OE ISOLATED FORM +FBE2 ; Isolated # Lo ARABIC LETTER KIRGHIZ YU ISOLATED FORM +FBE4 ; Isolated # Lo ARABIC LETTER E ISOLATED FORM +FBEA ; Isolated # Lo ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM +FBEC ; Isolated # Lo ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM +FBEE ; Isolated # Lo ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM +FBF0 ; Isolated # Lo ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM +FBF2 ; Isolated # Lo ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM +FBF4 ; Isolated # Lo ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM +FBF6 ; Isolated # Lo ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM +FBF9 ; Isolated # Lo ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM +FBFC ; Isolated # Lo ARABIC LETTER FARSI YEH ISOLATED FORM +FC00..FC63 ; Isolated # Lo [100] ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM..ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM +FCF5..FD10 ; Isolated # Lo [28] ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM..ARABIC LIGATURE DAD WITH REH ISOLATED FORM +FD3D ; Isolated # Lo ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM +FDF0..FDFB ; Isolated # Lo [12] ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM..ARABIC LIGATURE JALLAJALALOUHOU +FDFC ; Isolated # Sc RIAL SIGN +FE70 ; Isolated # Lo ARABIC FATHATAN ISOLATED FORM +FE72 ; Isolated # Lo ARABIC DAMMATAN ISOLATED FORM +FE74 ; Isolated # Lo ARABIC KASRATAN ISOLATED FORM +FE76 ; Isolated # Lo ARABIC FATHA ISOLATED FORM +FE78 ; Isolated # Lo ARABIC DAMMA ISOLATED FORM +FE7A ; Isolated # Lo ARABIC KASRA ISOLATED FORM +FE7C ; Isolated # Lo ARABIC SHADDA ISOLATED FORM +FE7E ; Isolated # Lo ARABIC SUKUN ISOLATED FORM +FE80..FE81 ; Isolated # Lo [2] ARABIC LETTER HAMZA ISOLATED FORM..ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM +FE83 ; Isolated # Lo ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM +FE85 ; Isolated # Lo ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM +FE87 ; Isolated # Lo ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM +FE89 ; Isolated # Lo ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM +FE8D ; Isolated # Lo ARABIC LETTER ALEF ISOLATED FORM +FE8F ; Isolated # Lo ARABIC LETTER BEH ISOLATED FORM +FE93 ; Isolated # Lo ARABIC LETTER TEH MARBUTA ISOLATED FORM +FE95 ; Isolated # Lo ARABIC LETTER TEH ISOLATED FORM +FE99 ; Isolated # Lo ARABIC LETTER THEH ISOLATED FORM +FE9D ; Isolated # Lo ARABIC LETTER JEEM ISOLATED FORM +FEA1 ; Isolated # Lo ARABIC LETTER HAH ISOLATED FORM +FEA5 ; Isolated # Lo ARABIC LETTER KHAH ISOLATED FORM +FEA9 ; Isolated # Lo ARABIC LETTER DAL ISOLATED FORM +FEAB ; Isolated # Lo ARABIC LETTER THAL ISOLATED FORM +FEAD ; Isolated # Lo ARABIC LETTER REH ISOLATED FORM +FEAF ; Isolated # Lo ARABIC LETTER ZAIN ISOLATED FORM +FEB1 ; Isolated # Lo ARABIC LETTER SEEN ISOLATED FORM +FEB5 ; Isolated # Lo ARABIC LETTER SHEEN ISOLATED FORM +FEB9 ; Isolated # Lo ARABIC LETTER SAD ISOLATED FORM +FEBD ; Isolated # Lo ARABIC LETTER DAD ISOLATED FORM +FEC1 ; Isolated # Lo ARABIC LETTER TAH ISOLATED FORM +FEC5 ; Isolated # Lo ARABIC LETTER ZAH ISOLATED FORM +FEC9 ; Isolated # Lo ARABIC LETTER AIN ISOLATED FORM +FECD ; Isolated # Lo ARABIC LETTER GHAIN ISOLATED FORM +FED1 ; Isolated # Lo ARABIC LETTER FEH ISOLATED FORM +FED5 ; Isolated # Lo ARABIC LETTER QAF ISOLATED FORM +FED9 ; Isolated # Lo ARABIC LETTER KAF ISOLATED FORM +FEDD ; Isolated # Lo ARABIC LETTER LAM ISOLATED FORM +FEE1 ; Isolated # Lo ARABIC LETTER MEEM ISOLATED FORM +FEE5 ; Isolated # Lo ARABIC LETTER NOON ISOLATED FORM +FEE9 ; Isolated # Lo ARABIC LETTER HEH ISOLATED FORM +FEED ; Isolated # Lo ARABIC LETTER WAW ISOLATED FORM +FEEF ; Isolated # Lo ARABIC LETTER ALEF MAKSURA ISOLATED FORM +FEF1 ; Isolated # Lo ARABIC LETTER YEH ISOLATED FORM +FEF5 ; Isolated # Lo ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM +FEF7 ; Isolated # Lo ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM +FEF9 ; Isolated # Lo ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM +FEFB ; Isolated # Lo ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM + +# Total code points: 238 + +# ================================================ + +2460..2473 ; Circle # No [20] CIRCLED DIGIT ONE..CIRCLED NUMBER TWENTY +24B6..24E9 ; Circle # So [52] CIRCLED LATIN CAPITAL LETTER A..CIRCLED LATIN SMALL LETTER Z +24EA ; Circle # No CIRCLED DIGIT ZERO +3251..325F ; Circle # No [15] CIRCLED NUMBER TWENTY ONE..CIRCLED NUMBER THIRTY FIVE +3260..327D ; Circle # So [30] CIRCLED HANGUL KIYEOK..CIRCLED KOREAN CHARACTER JUEUI +3280..3289 ; Circle # No [10] CIRCLED IDEOGRAPH ONE..CIRCLED IDEOGRAPH TEN +328A..32B0 ; Circle # So [39] CIRCLED IDEOGRAPH MOON..CIRCLED IDEOGRAPH NIGHT +32B1..32BF ; Circle # No [15] CIRCLED NUMBER THIRTY SIX..CIRCLED NUMBER FIFTY +32D0..32FE ; Circle # So [47] CIRCLED KATAKANA A..CIRCLED KATAKANA WO + +# Total code points: 229 + +# ================================================ + +00AA ; Super # L& FEMININE ORDINAL INDICATOR +00B2..00B3 ; Super # No [2] SUPERSCRIPT TWO..SUPERSCRIPT THREE +00B9 ; Super # No SUPERSCRIPT ONE +00BA ; Super # L& MASCULINE ORDINAL INDICATOR +02B0..02B8 ; Super # Lm [9] MODIFIER LETTER SMALL H..MODIFIER LETTER SMALL Y +02E0..02E4 ; Super # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP +1D2C..1D2E ; Super # Lm [3] MODIFIER LETTER CAPITAL A..MODIFIER LETTER CAPITAL B +1D30..1D3A ; Super # Lm [11] MODIFIER LETTER CAPITAL D..MODIFIER LETTER CAPITAL N +1D3C..1D4D ; Super # Lm [18] MODIFIER LETTER CAPITAL O..MODIFIER LETTER SMALL G +1D4F..1D61 ; Super # Lm [19] MODIFIER LETTER SMALL K..MODIFIER LETTER SMALL CHI +2070 ; Super # No SUPERSCRIPT ZERO +2071 ; Super # L& SUPERSCRIPT LATIN SMALL LETTER I +2074..2079 ; Super # No [6] SUPERSCRIPT FOUR..SUPERSCRIPT NINE +207A..207C ; Super # Sm [3] SUPERSCRIPT PLUS SIGN..SUPERSCRIPT EQUALS SIGN +207D ; Super # Ps SUPERSCRIPT LEFT PARENTHESIS +207E ; Super # Pe SUPERSCRIPT RIGHT PARENTHESIS +207F ; Super # L& SUPERSCRIPT LATIN SMALL LETTER N +2120 ; Super # So SERVICE MARK +2122 ; Super # So TRADE MARK SIGN +3192..3195 ; Super # No [4] IDEOGRAPHIC ANNOTATION ONE MARK..IDEOGRAPHIC ANNOTATION FOUR MARK +3196..319F ; Super # So [10] IDEOGRAPHIC ANNOTATION TOP MARK..IDEOGRAPHIC ANNOTATION MAN MARK + +# Total code points: 100 + +# ================================================ + +1D62..1D6A ; Sub # L& [9] LATIN SUBSCRIPT SMALL LETTER I..GREEK SUBSCRIPT SMALL LETTER CHI +2080..2089 ; Sub # No [10] SUBSCRIPT ZERO..SUBSCRIPT NINE +208A..208C ; Sub # Sm [3] SUBSCRIPT PLUS SIGN..SUBSCRIPT EQUALS SIGN +208D ; Sub # Ps SUBSCRIPT LEFT PARENTHESIS +208E ; Sub # Pe SUBSCRIPT RIGHT PARENTHESIS + +# Total code points: 24 + +# ================================================ + +309F ; Vertical # Lo HIRAGANA DIGRAPH YORI +30FF ; Vertical # Lo KATAKANA DIGRAPH KOTO +FE30 ; Vertical # Po PRESENTATION FORM FOR VERTICAL TWO DOT LEADER +FE31..FE32 ; Vertical # Pd [2] PRESENTATION FORM FOR VERTICAL EM DASH..PRESENTATION FORM FOR VERTICAL EN DASH +FE33..FE34 ; Vertical # Pc [2] PRESENTATION FORM FOR VERTICAL LOW LINE..PRESENTATION FORM FOR VERTICAL WAVY LOW LINE +FE35 ; Vertical # Ps PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS +FE36 ; Vertical # Pe PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS +FE37 ; Vertical # Ps PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET +FE38 ; Vertical # Pe PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET +FE39 ; Vertical # Ps PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET +FE3A ; Vertical # Pe PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET +FE3B ; Vertical # Ps PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET +FE3C ; Vertical # Pe PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET +FE3D ; Vertical # Ps PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET +FE3E ; Vertical # Pe PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET +FE3F ; Vertical # Ps PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET +FE40 ; Vertical # Pe PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET +FE41 ; Vertical # Ps PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET +FE42 ; Vertical # Pe PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET +FE43 ; Vertical # Ps PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET +FE44 ; Vertical # Pe PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET +FE47 ; Vertical # Ps PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET +FE48 ; Vertical # Pe PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET + +# Total code points: 25 + +# ================================================ + +3000 ; Wide # Zs IDEOGRAPHIC SPACE +FF01..FF03 ; Wide # Po [3] FULLWIDTH EXCLAMATION MARK..FULLWIDTH NUMBER SIGN +FF04 ; Wide # Sc FULLWIDTH DOLLAR SIGN +FF05..FF07 ; Wide # Po [3] FULLWIDTH PERCENT SIGN..FULLWIDTH APOSTROPHE +FF08 ; Wide # Ps FULLWIDTH LEFT PARENTHESIS +FF09 ; Wide # Pe FULLWIDTH RIGHT PARENTHESIS +FF0A ; Wide # Po FULLWIDTH ASTERISK +FF0B ; Wide # Sm FULLWIDTH PLUS SIGN +FF0C ; Wide # Po FULLWIDTH COMMA +FF0D ; Wide # Pd FULLWIDTH HYPHEN-MINUS +FF0E..FF0F ; Wide # Po [2] FULLWIDTH FULL STOP..FULLWIDTH SOLIDUS +FF10..FF19 ; Wide # Nd [10] FULLWIDTH DIGIT ZERO..FULLWIDTH DIGIT NINE +FF1A..FF1B ; Wide # Po [2] FULLWIDTH COLON..FULLWIDTH SEMICOLON +FF1C..FF1E ; Wide # Sm [3] FULLWIDTH LESS-THAN SIGN..FULLWIDTH GREATER-THAN SIGN +FF1F..FF20 ; Wide # Po [2] FULLWIDTH QUESTION MARK..FULLWIDTH COMMERCIAL AT +FF21..FF3A ; Wide # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z +FF3B ; Wide # Ps FULLWIDTH LEFT SQUARE BRACKET +FF3C ; Wide # Po FULLWIDTH REVERSE SOLIDUS +FF3D ; Wide # Pe FULLWIDTH RIGHT SQUARE BRACKET +FF3E ; Wide # Sk FULLWIDTH CIRCUMFLEX ACCENT +FF3F ; Wide # Pc FULLWIDTH LOW LINE +FF40 ; Wide # Sk FULLWIDTH GRAVE ACCENT +FF41..FF5A ; Wide # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z +FF5B ; Wide # Ps FULLWIDTH LEFT CURLY BRACKET +FF5C ; Wide # Sm FULLWIDTH VERTICAL LINE +FF5D ; Wide # Pe FULLWIDTH RIGHT CURLY BRACKET +FF5E ; Wide # Sm FULLWIDTH TILDE +FF5F ; Wide # Ps FULLWIDTH LEFT WHITE PARENTHESIS +FF60 ; Wide # Pe FULLWIDTH RIGHT WHITE PARENTHESIS +FFE0..FFE1 ; Wide # Sc [2] FULLWIDTH CENT SIGN..FULLWIDTH POUND SIGN +FFE2 ; Wide # Sm FULLWIDTH NOT SIGN +FFE3 ; Wide # Sk FULLWIDTH MACRON +FFE4 ; Wide # So FULLWIDTH BROKEN BAR +FFE5..FFE6 ; Wide # Sc [2] FULLWIDTH YEN SIGN..FULLWIDTH WON SIGN + +# Total code points: 104 + +# ================================================ + +FF61 ; Narrow # Po HALFWIDTH IDEOGRAPHIC FULL STOP +FF62 ; Narrow # Ps HALFWIDTH LEFT CORNER BRACKET +FF63 ; Narrow # Pe HALFWIDTH RIGHT CORNER BRACKET +FF64 ; Narrow # Po HALFWIDTH IDEOGRAPHIC COMMA +FF65 ; Narrow # Pc HALFWIDTH KATAKANA MIDDLE DOT +FF66..FF6F ; Narrow # Lo [10] HALFWIDTH KATAKANA LETTER WO..HALFWIDTH KATAKANA LETTER SMALL TU +FF70 ; Narrow # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK +FF71..FF9D ; Narrow # Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAKANA LETTER N +FF9E..FF9F ; Narrow # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK +FFA0..FFBE ; Narrow # Lo [31] HALFWIDTH HANGUL FILLER..HALFWIDTH HANGUL LETTER HIEUH +FFC2..FFC7 ; Narrow # Lo [6] HALFWIDTH HANGUL LETTER A..HALFWIDTH HANGUL LETTER E +FFCA..FFCF ; Narrow # Lo [6] HALFWIDTH HANGUL LETTER YEO..HALFWIDTH HANGUL LETTER OE +FFD2..FFD7 ; Narrow # Lo [6] HALFWIDTH HANGUL LETTER YO..HALFWIDTH HANGUL LETTER YU +FFDA..FFDC ; Narrow # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I +FFE8 ; Narrow # So HALFWIDTH FORMS LIGHT VERTICAL +FFE9..FFEC ; Narrow # Sm [4] HALFWIDTH LEFTWARDS ARROW..HALFWIDTH DOWNWARDS ARROW +FFED..FFEE ; Narrow # So [2] HALFWIDTH BLACK SQUARE..HALFWIDTH WHITE CIRCLE + +# Total code points: 122 + +# ================================================ + +FE50..FE52 ; Small # Po [3] SMALL COMMA..SMALL FULL STOP +FE54..FE57 ; Small # Po [4] SMALL SEMICOLON..SMALL EXCLAMATION MARK +FE58 ; Small # Pd SMALL EM DASH +FE59 ; Small # Ps SMALL LEFT PARENTHESIS +FE5A ; Small # Pe SMALL RIGHT PARENTHESIS +FE5B ; Small # Ps SMALL LEFT CURLY BRACKET +FE5C ; Small # Pe SMALL RIGHT CURLY BRACKET +FE5D ; Small # Ps SMALL LEFT TORTOISE SHELL BRACKET +FE5E ; Small # Pe SMALL RIGHT TORTOISE SHELL BRACKET +FE5F..FE61 ; Small # Po [3] SMALL NUMBER SIGN..SMALL ASTERISK +FE62 ; Small # Sm SMALL PLUS SIGN +FE63 ; Small # Pd SMALL HYPHEN-MINUS +FE64..FE66 ; Small # Sm [3] SMALL LESS-THAN SIGN..SMALL EQUALS SIGN +FE68 ; Small # Po SMALL REVERSE SOLIDUS +FE69 ; Small # Sc SMALL DOLLAR SIGN +FE6A..FE6B ; Small # Po [2] SMALL PERCENT SIGN..SMALL COMMERCIAL AT + +# Total code points: 26 + +# ================================================ + +3250 ; Square # So PARTNERSHIP SIGN +32CC..32CF ; Square # So [4] SQUARE HG..LIMITED LIABILITY SIGN +3300..3357 ; Square # So [88] SQUARE APAATO..SQUARE WATTO +3371..33DF ; Square # So [111] SQUARE HPA..SQUARE A OVER M +33FF ; Square # So SQUARE GAL + +# Total code points: 205 + +# ================================================ + +00BC..00BE ; Fraction # No [3] VULGAR FRACTION ONE QUARTER..VULGAR FRACTION THREE QUARTERS +2153..215F ; Fraction # No [13] VULGAR FRACTION ONE THIRD..FRACTION NUMERATOR ONE + +# Total code points: 16 diff --git a/gen.tab/unidata/extracted/DerivedJoiningType.txt b/gen.tab/unidata/extracted/DerivedJoiningType.txt new file mode 100644 index 0000000..57e560a --- /dev/null +++ b/gen.tab/unidata/extracted/DerivedJoiningType.txt @@ -0,0 +1,215 @@ +# DerivedJoiningType-4.0.1.txt +# Date: 2004-03-02, 02:42:08 GMT [MD] +# +# Unicode Character Database +# Copyright (c) 1991-2004 Unicode, Inc. +# For terms of use, see http://www.unicode.org/terms_of_use.html +# For documentation, see UCD.html + +# ================================================ + +# Type T is derived, as described in ArabicShaping.txt + +# All code points not explicitly listed for Joining_Type +# have the value Non_Joining (U). + +# ================================================ + +# Joining_Type=Join_Causing + +0640 ; C # Lm ARABIC TATWEEL +200D ; C # Cf ZERO WIDTH JOINER + +# Total code points: 2 + +# ================================================ + +# Joining_Type=Dual_Joining + +0626 ; D # Lo ARABIC LETTER YEH WITH HAMZA ABOVE +0628 ; D # Lo ARABIC LETTER BEH +062A..062E ; D # Lo [5] ARABIC LETTER TEH..ARABIC LETTER KHAH +0633..063A ; D # Lo [8] ARABIC LETTER SEEN..ARABIC LETTER GHAIN +0641..0647 ; D # Lo [7] ARABIC LETTER FEH..ARABIC LETTER HEH +0649..064A ; D # Lo [2] ARABIC LETTER ALEF MAKSURA..ARABIC LETTER YEH +066E..066F ; D # Lo [2] ARABIC LETTER DOTLESS BEH..ARABIC LETTER DOTLESS QAF +0678..0687 ; D # Lo [16] ARABIC LETTER HIGH HAMZA YEH..ARABIC LETTER TCHEHEH +069A..06BF ; D # Lo [38] ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE..ARABIC LETTER TCHEH WITH DOT ABOVE +06C1 ; D # Lo ARABIC LETTER HEH GOAL +06CC ; D # Lo ARABIC LETTER FARSI YEH +06CE ; D # Lo ARABIC LETTER YEH WITH SMALL V +06D0..06D1 ; D # Lo [2] ARABIC LETTER E..ARABIC LETTER YEH WITH THREE DOTS BELOW +06FA..06FC ; D # Lo [3] ARABIC LETTER SHEEN WITH DOT BELOW..ARABIC LETTER GHAIN WITH DOT BELOW +06FF ; D # Lo ARABIC LETTER HEH WITH INVERTED V +0712..0714 ; D # Lo [3] SYRIAC LETTER BETH..SYRIAC LETTER GAMAL GARSHUNI +071A..071D ; D # Lo [4] SYRIAC LETTER HETH..SYRIAC LETTER YUDH +071F..0727 ; D # Lo [9] SYRIAC LETTER KAPH..SYRIAC LETTER REVERSED PE +0729 ; D # Lo SYRIAC LETTER QAPH +072B ; D # Lo SYRIAC LETTER SHIN +072D..072E ; D # Lo [2] SYRIAC LETTER PERSIAN BHETH..SYRIAC LETTER PERSIAN GHAMAL +074E..074F ; D # Lo [2] SYRIAC LETTER SOGDIAN KHAPH..SYRIAC LETTER SOGDIAN FE + +# Total code points: 111 + +# ================================================ + +# Joining_Type=Right_Joining + +0622..0625 ; R # Lo [4] ARABIC LETTER ALEF WITH MADDA ABOVE..ARABIC LETTER ALEF WITH HAMZA BELOW +0627 ; R # Lo ARABIC LETTER ALEF +0629 ; R # Lo ARABIC LETTER TEH MARBUTA +062F..0632 ; R # Lo [4] ARABIC LETTER DAL..ARABIC LETTER ZAIN +0648 ; R # Lo ARABIC LETTER WAW +0671..0673 ; R # Lo [3] ARABIC LETTER ALEF WASLA..ARABIC LETTER ALEF WITH WAVY HAMZA BELOW +0675..0677 ; R # Lo [3] ARABIC LETTER HIGH HAMZA ALEF..ARABIC LETTER U WITH HAMZA ABOVE +0688..0699 ; R # Lo [18] ARABIC LETTER DDAL..ARABIC LETTER REH WITH FOUR DOTS ABOVE +06C0 ; R # Lo ARABIC LETTER HEH WITH YEH ABOVE +06C2..06CB ; R # Lo [10] ARABIC LETTER HEH GOAL WITH HAMZA ABOVE..ARABIC LETTER VE +06CD ; R # Lo ARABIC LETTER YEH WITH TAIL +06CF ; R # Lo ARABIC LETTER WAW WITH DOT ABOVE +06D2..06D3 ; R # Lo [2] ARABIC LETTER YEH BARREE..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE +06D5 ; R # Lo ARABIC LETTER AE +06EE..06EF ; R # Lo [2] ARABIC LETTER DAL WITH INVERTED V..ARABIC LETTER REH WITH INVERTED V +0710 ; R # Lo SYRIAC LETTER ALAPH +0715..0719 ; R # Lo [5] SYRIAC LETTER DALATH..SYRIAC LETTER ZAIN +071E ; R # Lo SYRIAC LETTER YUDH HE +0728 ; R # Lo SYRIAC LETTER SADHE +072A ; R # Lo SYRIAC LETTER RISH +072C ; R # Lo SYRIAC LETTER TAW +072F ; R # Lo SYRIAC LETTER PERSIAN DHALATH +074D ; R # Lo SYRIAC LETTER SOGDIAN ZHAIN + +# Total code points: 65 + +# ================================================ + +# Joining_Type=Transparent + +00AD ; T # Cf SOFT HYPHEN +0300..0357 ; T # Mn [88] COMBINING GRAVE ACCENT..COMBINING RIGHT HALF RING ABOVE +035D..036F ; T # Mn [19] COMBINING DOUBLE BREVE..COMBINING LATIN SMALL LETTER X +0483..0486 ; T # Mn [4] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC PSILI PNEUMATA +0591..05A1 ; T # Mn [17] HEBREW ACCENT ETNAHTA..HEBREW ACCENT PAZER +05A3..05B9 ; T # Mn [23] HEBREW ACCENT MUNAH..HEBREW POINT HOLAM +05BB..05BD ; T # Mn [3] HEBREW POINT QUBUTS..HEBREW POINT METEG +05BF ; T # Mn HEBREW POINT RAFE +05C1..05C2 ; T # Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT +05C4 ; T # Mn HEBREW MARK UPPER DOT +0610..0615 ; T # Mn [6] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL HIGH TAH +064B..0658 ; T # Mn [14] ARABIC FATHATAN..ARABIC MARK NOON GHUNNA +0670 ; T # Mn ARABIC LETTER SUPERSCRIPT ALEF +06D6..06DC ; T # Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN +06DF..06E4 ; T # Mn [6] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA +06E7..06E8 ; T # Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON +06EA..06ED ; T # Mn [4] ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM +070F ; T # Cf SYRIAC ABBREVIATION MARK +0711 ; T # Mn SYRIAC LETTER SUPERSCRIPT ALAPH +0730..074A ; T # Mn [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH +07A6..07B0 ; T # Mn [11] THAANA ABAFILI..THAANA SUKUN +0901..0902 ; T # Mn [2] DEVANAGARI SIGN CANDRABINDU..DEVANAGARI SIGN ANUSVARA +093C ; T # Mn DEVANAGARI SIGN NUKTA +0941..0948 ; T # Mn [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI +094D ; T # Mn DEVANAGARI SIGN VIRAMA +0951..0954 ; T # Mn [4] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI ACUTE ACCENT +0962..0963 ; T # Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL +0981 ; T # Mn BENGALI SIGN CANDRABINDU +09BC ; T # Mn BENGALI SIGN NUKTA +09C1..09C4 ; T # Mn [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR +09CD ; T # Mn BENGALI SIGN VIRAMA +09E2..09E3 ; T # Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL +0A01..0A02 ; T # Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI +0A3C ; T # Mn GURMUKHI SIGN NUKTA +0A41..0A42 ; T # Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU +0A47..0A48 ; T # Mn [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI +0A4B..0A4D ; T # Mn [3] GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA +0A70..0A71 ; T # Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK +0A81..0A82 ; T # Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA +0ABC ; T # Mn GUJARATI SIGN NUKTA +0AC1..0AC5 ; T # Mn [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E +0AC7..0AC8 ; T # Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI +0ACD ; T # Mn GUJARATI SIGN VIRAMA +0AE2..0AE3 ; T # Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL +0B01 ; T # Mn ORIYA SIGN CANDRABINDU +0B3C ; T # Mn ORIYA SIGN NUKTA +0B3F ; T # Mn ORIYA VOWEL SIGN I +0B41..0B43 ; T # Mn [3] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC R +0B4D ; T # Mn ORIYA SIGN VIRAMA +0B56 ; T # Mn ORIYA AI LENGTH MARK +0B82 ; T # Mn TAMIL SIGN ANUSVARA +0BC0 ; T # Mn TAMIL VOWEL SIGN II +0BCD ; T # Mn TAMIL SIGN VIRAMA +0C3E..0C40 ; T # Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II +0C46..0C48 ; T # Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI +0C4A..0C4D ; T # Mn [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA +0C55..0C56 ; T # Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK +0CBC ; T # Mn KANNADA SIGN NUKTA +0CBF ; T # Mn KANNADA VOWEL SIGN I +0CC6 ; T # Mn KANNADA VOWEL SIGN E +0CCC..0CCD ; T # Mn [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA +0D41..0D43 ; T # Mn [3] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC R +0D4D ; T # Mn MALAYALAM SIGN VIRAMA +0DCA ; T # Mn SINHALA SIGN AL-LAKUNA +0DD2..0DD4 ; T # Mn [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA +0DD6 ; T # Mn SINHALA VOWEL SIGN DIGA PAA-PILLA +0E31 ; T # Mn THAI CHARACTER MAI HAN-AKAT +0E34..0E3A ; T # Mn [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU +0E47..0E4E ; T # Mn [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN +0EB1 ; T # Mn LAO VOWEL SIGN MAI KAN +0EB4..0EB9 ; T # Mn [6] LAO VOWEL SIGN I..LAO VOWEL SIGN UU +0EBB..0EBC ; T # Mn [2] LAO VOWEL SIGN MAI KON..LAO SEMIVOWEL SIGN LO +0EC8..0ECD ; T # Mn [6] LAO TONE MAI EK..LAO NIGGAHITA +0F18..0F19 ; T # Mn [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS +0F35 ; T # Mn TIBETAN MARK NGAS BZUNG NYI ZLA +0F37 ; T # Mn TIBETAN MARK NGAS BZUNG SGOR RTAGS +0F39 ; T # Mn TIBETAN MARK TSA -PHRU +0F71..0F7E ; T # Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO +0F80..0F84 ; T # Mn [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA +0F86..0F87 ; T # Mn [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS +0F90..0F97 ; T # Mn [8] TIBETAN SUBJOINED LETTER KA..TIBETAN SUBJOINED LETTER JA +0F99..0FBC ; T # Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA +0FC6 ; T # Mn TIBETAN SYMBOL PADMA GDAN +102D..1030 ; T # Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU +1032 ; T # Mn MYANMAR VOWEL SIGN AI +1036..1037 ; T # Mn [2] MYANMAR SIGN ANUSVARA..MYANMAR SIGN DOT BELOW +1039 ; T # Mn MYANMAR SIGN VIRAMA +1058..1059 ; T # Mn [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL +1712..1714 ; T # Mn [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA +1732..1734 ; T # Mn [3] HANUNOO VOWEL SIGN I..HANUNOO SIGN PAMUDPOD +1752..1753 ; T # Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U +1772..1773 ; T # Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U +17B4..17B5 ; T # Cf [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA +17B7..17BD ; T # Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA +17C6 ; T # Mn KHMER SIGN NIKAHIT +17C9..17D3 ; T # Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT +17DD ; T # Mn KHMER SIGN ATTHACAN +180B..180D ; T # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE +18A9 ; T # Mn MONGOLIAN LETTER ALI GALI DAGALGA +1920..1922 ; T # Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U +1927..1928 ; T # Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O +1932 ; T # Mn LIMBU SMALL LETTER ANUSVARA +1939..193B ; T # Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I +200B ; T # Cf ZERO WIDTH SPACE +200E..200F ; T # Cf [2] LEFT-TO-RIGHT MARK..RIGHT-TO-LEFT MARK +202A..202E ; T # Cf [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE +2060..2063 ; T # Cf [4] WORD JOINER..INVISIBLE SEPARATOR +206A..206F ; T # Cf [6] INHIBIT SYMMETRIC SWAPPING..NOMINAL DIGIT SHAPES +20D0..20DC ; T # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE +20E1 ; T # Mn COMBINING LEFT RIGHT ARROW ABOVE +20E5..20EA ; T # Mn [6] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING LEFTWARDS ARROW OVERLAY +302A..302F ; T # Mn [6] IDEOGRAPHIC LEVEL TONE MARK..HANGUL DOUBLE DOT TONE MARK +3099..309A ; T # Mn [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +FB1E ; T # Mn HEBREW POINT JUDEO-SPANISH VARIKA +FE00..FE0F ; T # Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16 +FE20..FE23 ; T # Mn [4] COMBINING LIGATURE LEFT HALF..COMBINING DOUBLE TILDE RIGHT HALF +FEFF ; T # Cf ZERO WIDTH NO-BREAK SPACE +FFF9..FFFB ; T # Cf [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR +1D167..1D169 ; T # Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3 +1D173..1D17A ; T # Cf [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE +1D17B..1D182 ; T # Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE +1D185..1D18B ; T # Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE +1D1AA..1D1AD ; T # Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO +E0001 ; T # Cf LANGUAGE TAG +E0020..E007F ; T # Cf [96] TAG SPACE..CANCEL TAG +E0100..E01EF ; T # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 + +# Total code points: 923 diff --git a/lib/Headers.mk b/lib/Headers.mk new file mode 100644 index 0000000..9ea5381 --- /dev/null +++ b/lib/Headers.mk @@ -0,0 +1,14 @@ +libfribidi_la_headers = \ + fribidi-begindecls.h \ + fribidi-bidi.h \ + fribidi-bidi-type.h \ + fribidi-bidi-types.h \ + fribidi-common.h \ + fribidi-config.h \ + fribidi-enddecls.h \ + fribidi-env.h \ + fribidi-mirroring.h \ + fribidi-types.h \ + fribidi-unicode.h \ + fribidi-unicode-version.h \ + fribidi.h # should be the last entry diff --git a/lib/Makefile.am b/lib/Makefile.am new file mode 100644 index 0000000..b260142 --- /dev/null +++ b/lib/Makefile.am @@ -0,0 +1,75 @@ +lib_LTLIBRARIES = libfribidi.la + +AM_CPPFLAGS = $(GLIB_CFLAGS) + +if PLATFORM_WIN32 +no_undefined = -no-undefined +endif # PLATFORM_WIN32 + +libfribidi_la_LDFLAGS = -version-info $(LT_VERSION_INFO) $(no_undefined) +libfribidi_la_LIBADD = $(GLIB_LIBS) +libfribidi_la_DEPENDENCIES = + +if OS_WIN32 +libfribidi_la_LDFLAGS += -export-symbols +endif # OS_WIN32 + +if FRIBIDI_CHARSETS + +AM_CPPFLAGS += -I$(top_srcdir)/charset +libfribidi_la_LIBADD += $(top_builddir)/charset/libfribidi-char-sets.la +libfribidi_la_DEPENDENCIES += $(top_builddir)/charset/libfribidi-char-sets.la + +$(top_builddir)/charset/libfribidi-char-sets.la: + cd $(top_builddir)/lib && $(MAKE) $(AM_MAKEFLAGS) libfribidi-char-sets.la + +endif # FRIBIDI_CHARSETS + +include Headers.mk +pkginclude_HEADERS = $(libfribidi_la_headers) + +libfribidi_la_SOURCES = \ + bidi-types.h \ + bidi-types-list.h \ + bidi-type-table.i \ + common.h \ + debug.h \ + fribidi.c \ + fribidi-bidi.c \ + fribidi-bidi-type.c \ + fribidi-bidi-types.c \ + fribidi-env.c \ + fribidi-mem.c \ + fribidi-mirroring.c \ + mem.h \ + mirroring-table.i + +BUILT_SOURCES= \ + bidi-type-table.i \ + mirroring-table.i \ + fribidi-config.h \ + fribidi-unicode-version.h + +MAINTAINERCLEANFILES = $(BUILT_SOURCES) + +fribidi_tab_mirroring_0.i: $(fribidi_create_mirroring_SOURCES) fribidi_types.h \ + unidata/BidiMirroring.txt + $(MAKE) fribidi_create_mirroring + if test -d unidata; then UNIDATA=unidata; \ + else UNIDATA="$(srcdir)/unidata"; fi && \ + ./fribidi_create_mirroring "$$UNIDATA" || \ + ($(RM) "$@"; false) + +fribidi_tab_bidi_type.i: $(fribidi_create_char_types_SOURCES) \ + unidata/UnicodeData.txt + $(MAKE) fribidi_create_char_types + if test -d unidata; then UNIDATA=unidata; \ + else UNIDATA="$(srcdir)/unidata"; fi && \ + ./fribidi_create_char_types "`echo "$@" \ + | $(SED) 's/[^0-9]*//g'`" "$$UNIDATA" || \ + ($(RM) "$@"; false) + $(RM) fribidi_tab_char_type_stamp + $(MAKE) fribidi_tab_char_type_stamp + +$(top_builddir)/config.h: $(top_srcdir)/config.h.in + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) config.h diff --git a/lib/bidi-type-table.i b/lib/bidi-type-table.i new file mode 100644 index 0000000..c37c962 --- /dev/null +++ b/lib/bidi-type-table.i @@ -0,0 +1,5228 @@ +/* + This file was automatically created from UnicodeData.txt version 3.2.0 + by fribidi_create_char_types +*/ + +#ifndef FRIBIDI_TAB_CHAR_TYPE_2_I +#define FRIBIDI_TAB_CHAR_TYPE_2_I + +#include "bidi-types.h" + +#define LTR FRIBIDI_PROP_TYPE_LTR +#define RTL FRIBIDI_PROP_TYPE_RTL +#define AL FRIBIDI_PROP_TYPE_AL +#define ON FRIBIDI_PROP_TYPE_ON +#define BN FRIBIDI_PROP_TYPE_BN +#define AN FRIBIDI_PROP_TYPE_AN +#define BS FRIBIDI_PROP_TYPE_BS +#define CS FRIBIDI_PROP_TYPE_CS +#define EN FRIBIDI_PROP_TYPE_EN +#define ES FRIBIDI_PROP_TYPE_ES +#define ET FRIBIDI_PROP_TYPE_ET +#define LRE FRIBIDI_PROP_TYPE_LRE +#define LRO FRIBIDI_PROP_TYPE_LRO +#define NSM FRIBIDI_PROP_TYPE_NSM +#define PDF FRIBIDI_PROP_TYPE_PDF +#define RLE FRIBIDI_PROP_TYPE_RLE +#define RLO FRIBIDI_PROP_TYPE_RLO +#define SS FRIBIDI_PROP_TYPE_SS +#define WS FRIBIDI_PROP_TYPE_WS + +#define PACKTAB_UINT8 fribidi_uint8 +#define PACKTAB_UINT16 fribidi_uint16 +#define PACKTAB_UINT32 fribidi_uint32 +/* + Automatically generated by packtab.c version 2 + + just use FRIBIDI_GET_TYPE(key) + + assumed sizeof(FriBidiPropCharType) == 1 + required memory: 19200 + lookups: 2 + partition shape: FriBidiPropertyBlock[4352][256] + different table entries: 1 41 +*/ + +/* *INDENT-OFF* */ + +static const FriBidiPropCharType FriBidiPropertyBlockLevel1[256*41] = { + +#define FriBidiPropertyBlockLevel1_0000 0x0 + + BN, BN, BN, BN, BN, BN, BN, BN, BN, SS, BS, SS, WS, BS, BN, BN, + BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BS, BS, BS, SS, + WS, ON, ON, ET, ET, ET, ON, ON, ON, ON, ON, ET, CS, ET, CS, ES, + EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, CS, ON, ON, ON, ON, ON, + ON,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, ON, ON, ON, ON, ON, + ON,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, ON, ON, ON, ON, BN, + BN, BN, BN, BN, BN, BS, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, + BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, + CS, ON, ET, ET, ET, ET, ON, ON, ON, ON,LTR, ON, ON, ON, ON, ON, + ET, ET, EN, EN, ON,LTR, ON, ON, ON, EN,LTR, ON, ON, ON, ON, ON, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR, ON,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR, ON,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + +#define FriBidiPropertyBlockLevel1_0100 0x100 + + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + +#define FriBidiPropertyBlockLevel1_0200 0x200 + + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, ON, ON,LTR,LTR,LTR,LTR,LTR, + LTR,LTR, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + LTR,LTR, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + LTR,LTR,LTR,LTR,LTR, ON, ON, ON, ON, ON, ON, ON, ON, ON,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + +#define FriBidiPropertyBlockLevel1_0300 0x300 + + NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM, + NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM, + NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM, + NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM, + NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM, + LTR,LTR,LTR,LTR, ON, ON,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, ON,LTR, + LTR,LTR,LTR,LTR, ON, ON,LTR, ON,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR, ON,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + +#define FriBidiPropertyBlockLevel1_0400 0x400 + + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,NSM,NSM,NSM,NSM,LTR,NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + +#define FriBidiPropertyBlockLevel1_0500 0x500 + + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, ON,LTR,LTR,LTR,LTR,LTR, + RTL,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM, + NSM,NSM,RTL,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM, + NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,RTL,NSM,NSM,NSM,RTL,NSM, + RTL,NSM,NSM,RTL,NSM,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL, + RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL, + RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL, + RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL, + +#define FriBidiPropertyBlockLevel1_0600 0x600 + + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, CS, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,NSM,NSM,NSM,NSM,NSM, + NSM,NSM,NSM,NSM,NSM,NSM, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AN, AN, AN, AN, AN, AN, AN, AN, AN, AN, ET, AN, AN, AL, AL, AL, + NSM, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL,NSM,NSM,NSM,NSM,NSM,NSM,NSM, AL,NSM,NSM, + NSM,NSM,NSM,NSM,NSM, AL, AL,NSM,NSM, ON,NSM,NSM,NSM,NSM, AL, AL, + EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, AL, AL, AL, AL, AL, AL, + +#define FriBidiPropertyBlockLevel1_0700 0x700 + + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, BN, + AL,NSM, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM, + NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM, + NSM, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + +#define FriBidiPropertyBlockLevel1_0900 0x800 + + LTR,NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,LTR,LTR,LTR, + LTR,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,LTR,LTR,LTR,LTR,NSM,LTR,LTR, + LTR,NSM,NSM,NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,LTR,LTR,LTR, + LTR,NSM,NSM,NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR, ET, ET,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + +#define FriBidiPropertyBlockLevel1_0A00 0x900 + + LTR,LTR,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,LTR,LTR,LTR, + LTR,NSM,NSM,LTR,LTR,LTR,LTR,NSM,NSM,LTR,LTR,NSM,NSM,NSM,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,LTR,LTR,LTR, + LTR,NSM,NSM,NSM,NSM,NSM,LTR,NSM,NSM,LTR,LTR,LTR,LTR,NSM,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + +#define FriBidiPropertyBlockLevel1_0B00 0xA00 + + LTR,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,LTR,LTR,NSM, + LTR,NSM,NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + +#define FriBidiPropertyBlockLevel1_0C00 0xB00 + + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,NSM, + NSM,LTR,LTR,LTR,LTR,LTR,NSM,NSM,NSM,LTR,NSM,NSM,NSM,NSM,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM, + LTR,LTR,LTR,LTR,LTR,LTR,NSM,LTR,LTR,LTR,LTR,LTR,NSM,NSM,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + +#define FriBidiPropertyBlockLevel1_0D00 0xC00 + + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,NSM,NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,NSM,NSM,NSM,LTR,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + +#define FriBidiPropertyBlockLevel1_0E00 0xD00 + + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,NSM,LTR,LTR,NSM,NSM,NSM,NSM,NSM,NSM,NSM,LTR,LTR,LTR,LTR, ET, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,NSM,LTR,LTR,NSM,NSM,NSM,NSM,NSM,NSM,LTR,NSM,NSM,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,NSM,NSM,NSM,NSM,NSM,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + +#define FriBidiPropertyBlockLevel1_0F00 0xE00 + + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,NSM,LTR,NSM,LTR,NSM, ON, ON, ON, ON,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,LTR, + NSM,NSM,NSM,NSM,NSM,LTR,NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,LTR,NSM,NSM,NSM,NSM,NSM,NSM,NSM, + NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM, + NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + +#define FriBidiPropertyBlockLevel1_1000 0xF00 + + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,NSM,NSM, + NSM,LTR,NSM,LTR,LTR,LTR,NSM,NSM,LTR,NSM,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + +#define FriBidiPropertyBlockLevel1_1600 0x1000 + + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + WS,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, ON, ON,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + +#define FriBidiPropertyBlockLevel1_1700 0x1100 + + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,NSM,NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,NSM,NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,NSM,NSM,NSM,NSM,NSM,NSM,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,NSM,LTR,LTR,NSM,NSM,NSM,NSM,NSM,NSM,NSM, + NSM,NSM,NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR, ET,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + +#define FriBidiPropertyBlockLevel1_1800 0x1200 + + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,NSM,NSM,NSM, BN,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + +#define FriBidiPropertyBlockLevel1_1F00 0x1300 + + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, ON,LTR, ON, + ON, ON,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, ON, ON, ON, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, ON, ON, ON, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, ON, ON, ON, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, ON, ON,LTR, + +#define FriBidiPropertyBlockLevel1_2000 0x1400 + + WS, WS, WS, WS, WS, WS, WS, WS, WS, WS, WS, BN, BN, BN,LTR,RTL, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, WS, BS,LRE,RLE,PDF,LRO,RLO, WS, + ET, ET, ET, ET, ET, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON,LTR,LTR,LTR,LTR, ON,LTR,LTR,LTR,LTR,LTR,LTR,LTR, WS, + BN, BN, BN, BN,LTR,LTR,LTR,LTR,LTR,LTR, BN, BN, BN, BN, BN, BN, + EN,LTR,LTR,LTR, EN, EN, EN, EN, EN, EN, ET, ET, ON, ON, ON,LTR, + EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, ET, ET, ON, ON, ON,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, + ET, ET,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM, + NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + +#define FriBidiPropertyBlockLevel1_2100 0x1500 + + ON, ON,LTR, ON, ON, ON, ON,LTR, ON, ON,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR, ON,LTR, ON, ON, ON,LTR,LTR,LTR,LTR,LTR, ON, ON, + ON, ON, ON, ON,LTR, ON,LTR, ON,LTR, ON,LTR,LTR,LTR,LTR, ET,LTR, + LTR,LTR, ON,LTR,LTR,LTR,LTR,LTR,LTR,LTR, ON,LTR,LTR,LTR,LTR,LTR, + ON, ON, ON, ON, ON,LTR,LTR,LTR,LTR,LTR, ON, ON,LTR,LTR,LTR,LTR, + LTR,LTR,LTR, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + +#define FriBidiPropertyBlockLevel1_2200 0x1600 + + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ET, ET, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + +#define FriBidiPropertyBlockLevel1_2300 0x1700 + + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON,LTR, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + +#define FriBidiPropertyBlockLevel1_2400 0x1800 + + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, + EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, + EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, + EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, EN, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,LTR, + +#define FriBidiPropertyBlockLevel1_2500 0x1900 + + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + +#define FriBidiPropertyBlockLevel1_2600 0x1A00 + + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON,LTR,LTR, ON, ON,LTR, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,LTR,LTR, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + +#define FriBidiPropertyBlockLevel1_2700 0x1B00 + + LTR, ON, ON, ON, ON,LTR, ON, ON, ON, ON,LTR,LTR, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON,LTR, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,LTR, ON,LTR, ON, + ON, ON, ON,LTR,LTR,LTR, ON,LTR, ON, ON, ON, ON, ON, ON, ON,LTR, + LTR, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON,LTR,LTR,LTR, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + LTR, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,LTR,LTR,LTR,LTR, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + +#define FriBidiPropertyBlockLevel1_2E00 0x1C00 + + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,LTR, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + +#define FriBidiPropertyBlockLevel1_2F00 0x1D00 + + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,LTR,LTR,LTR,LTR, + +#define FriBidiPropertyBlockLevel1_3000 0x1E00 + + WS, ON, ON, ON, ON,LTR,LTR,LTR, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,NSM,NSM,NSM,NSM,NSM, + ON,LTR,LTR,LTR,LTR,LTR, ON, ON,LTR,LTR,LTR,LTR,LTR, ON, ON, ON, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,NSM, ON, ON,LTR,LTR,LTR, + ON,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, ON,LTR,LTR,LTR,LTR, + +#define FriBidiPropertyBlockLevel1_3200 0x1F00 + + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + +#define FriBidiPropertyBlockLevel1_A400 0x2000 + + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + +#define FriBidiPropertyBlockLevel1_FB00 0x2100 + + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,RTL,NSM,RTL, + RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL, ET,RTL,RTL,RTL,RTL,RTL,RTL, + RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL, + RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + +#define FriBidiPropertyBlockLevel1_FC00 0x2200 + + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + +#define FriBidiPropertyBlockLevel1_FD00 0x2300 + + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, ON, ON, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + +#define FriBidiPropertyBlockLevel1_FE00 0x2400 + + NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + NSM,NSM,NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON,LTR,LTR, ON, ON, ON, ON, ON, ON, ON, + CS, ON, CS,LTR, ON, CS, ON, ON, ON, ON, ON, ON, ON, ON, ON, ET, + ON, ON, ET, ET, ON, ON, ON,LTR, ON, ET, ET, ON,LTR,LTR,LTR,LTR, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, BN, + +#define FriBidiPropertyBlockLevel1_FF00 0x2500 + + LTR, ON, ON, ET, ET, ET, ON, ON, ON, ON, ON, ET, CS, ET, CS, ES, + EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, CS, ON, ON, ON, ON, ON, + ON,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, ON, ON, ON, ON, ON, + ON,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + ET, ET, ON, ON, ON, ET, ET,LTR, ON, ON, ON, ON, ON, ON, ON,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, BN, BN, BN, ON, ON,LTR,LTR, + +#define FriBidiPropertyBlockLevel1_1D100 0x2600 + + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR, BN, BN, BN, BN, BN, BN, BN, BN,NSM,NSM,NSM,NSM,NSM, + NSM,NSM,NSM,LTR,LTR,NSM,NSM,NSM,NSM,NSM,NSM,NSM,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,NSM,NSM,NSM,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + +#define FriBidiPropertyBlockLevel1_1D700 0x2700 + + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, EN, EN, + EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, + EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, + EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, + +#define FriBidiPropertyBlockLevel1_E0000 0x2800 + + LTR, BN,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, + BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, + BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, + BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, + BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, + BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, + LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, +}; + +static const PACKTAB_UINT16 FriBidiPropertyBlockLevel0[4352*1] = { + +#define FriBidiPropertyBlockLevel0_0000 0x0 + + FriBidiPropertyBlockLevel1_0000, /* 0000..00FF */ + FriBidiPropertyBlockLevel1_0100, /* 0100..01FF */ + FriBidiPropertyBlockLevel1_0200, /* 0200..02FF */ + FriBidiPropertyBlockLevel1_0300, /* 0300..03FF */ + FriBidiPropertyBlockLevel1_0400, /* 0400..04FF */ + FriBidiPropertyBlockLevel1_0500, /* 0500..05FF */ + FriBidiPropertyBlockLevel1_0600, /* 0600..06FF */ + FriBidiPropertyBlockLevel1_0700, /* 0700..07FF */ + FriBidiPropertyBlockLevel1_0100, /* 0800..08FF */ + FriBidiPropertyBlockLevel1_0900, /* 0900..09FF */ + FriBidiPropertyBlockLevel1_0A00, /* 0A00..0AFF */ + FriBidiPropertyBlockLevel1_0B00, /* 0B00..0BFF */ + FriBidiPropertyBlockLevel1_0C00, /* 0C00..0CFF */ + FriBidiPropertyBlockLevel1_0D00, /* 0D00..0DFF */ + FriBidiPropertyBlockLevel1_0E00, /* 0E00..0EFF */ + FriBidiPropertyBlockLevel1_0F00, /* 0F00..0FFF */ + FriBidiPropertyBlockLevel1_1000, /* 1000..10FF */ + FriBidiPropertyBlockLevel1_0100, /* 1100..11FF */ + FriBidiPropertyBlockLevel1_0100, /* 1200..12FF */ + FriBidiPropertyBlockLevel1_0100, /* 1300..13FF */ + FriBidiPropertyBlockLevel1_0100, /* 1400..14FF */ + FriBidiPropertyBlockLevel1_0100, /* 1500..15FF */ + FriBidiPropertyBlockLevel1_1600, /* 1600..16FF */ + FriBidiPropertyBlockLevel1_1700, /* 1700..17FF */ + FriBidiPropertyBlockLevel1_1800, /* 1800..18FF */ + FriBidiPropertyBlockLevel1_0100, /* 1900..19FF */ + FriBidiPropertyBlockLevel1_0100, /* 1A00..1AFF */ + FriBidiPropertyBlockLevel1_0100, /* 1B00..1BFF */ + FriBidiPropertyBlockLevel1_0100, /* 1C00..1CFF */ + FriBidiPropertyBlockLevel1_0100, /* 1D00..1DFF */ + FriBidiPropertyBlockLevel1_0100, /* 1E00..1EFF */ + FriBidiPropertyBlockLevel1_1F00, /* 1F00..1FFF */ + FriBidiPropertyBlockLevel1_2000, /* 2000..20FF */ + FriBidiPropertyBlockLevel1_2100, /* 2100..21FF */ + FriBidiPropertyBlockLevel1_2200, /* 2200..22FF */ + FriBidiPropertyBlockLevel1_2300, /* 2300..23FF */ + FriBidiPropertyBlockLevel1_2400, /* 2400..24FF */ + FriBidiPropertyBlockLevel1_2500, /* 2500..25FF */ + FriBidiPropertyBlockLevel1_2600, /* 2600..26FF */ + FriBidiPropertyBlockLevel1_2700, /* 2700..27FF */ + FriBidiPropertyBlockLevel1_2500, /* 2800..28FF */ + FriBidiPropertyBlockLevel1_2500, /* 2900..29FF */ + FriBidiPropertyBlockLevel1_2500, /* 2A00..2AFF */ + FriBidiPropertyBlockLevel1_0100, /* 2B00..2BFF */ + FriBidiPropertyBlockLevel1_0100, /* 2C00..2CFF */ + FriBidiPropertyBlockLevel1_0100, /* 2D00..2DFF */ + FriBidiPropertyBlockLevel1_2E00, /* 2E00..2EFF */ + FriBidiPropertyBlockLevel1_2F00, /* 2F00..2FFF */ + FriBidiPropertyBlockLevel1_3000, /* 3000..30FF */ + FriBidiPropertyBlockLevel1_0100, /* 3100..31FF */ + FriBidiPropertyBlockLevel1_3200, /* 3200..32FF */ + FriBidiPropertyBlockLevel1_0100, /* 3300..33FF */ + FriBidiPropertyBlockLevel1_0100, /* 3400..34FF */ + FriBidiPropertyBlockLevel1_0100, /* 3500..35FF */ + FriBidiPropertyBlockLevel1_0100, /* 3600..36FF */ + FriBidiPropertyBlockLevel1_0100, /* 3700..37FF */ + FriBidiPropertyBlockLevel1_0100, /* 3800..38FF */ + FriBidiPropertyBlockLevel1_0100, /* 3900..39FF */ + FriBidiPropertyBlockLevel1_0100, /* 3A00..3AFF */ + FriBidiPropertyBlockLevel1_0100, /* 3B00..3BFF */ + FriBidiPropertyBlockLevel1_0100, /* 3C00..3CFF */ + FriBidiPropertyBlockLevel1_0100, /* 3D00..3DFF */ + FriBidiPropertyBlockLevel1_0100, /* 3E00..3EFF */ + FriBidiPropertyBlockLevel1_0100, /* 3F00..3FFF */ + FriBidiPropertyBlockLevel1_0100, /* 4000..40FF */ + FriBidiPropertyBlockLevel1_0100, /* 4100..41FF */ + FriBidiPropertyBlockLevel1_0100, /* 4200..42FF */ + FriBidiPropertyBlockLevel1_0100, /* 4300..43FF */ + FriBidiPropertyBlockLevel1_0100, /* 4400..44FF */ + FriBidiPropertyBlockLevel1_0100, /* 4500..45FF */ + FriBidiPropertyBlockLevel1_0100, /* 4600..46FF */ + FriBidiPropertyBlockLevel1_0100, /* 4700..47FF */ + FriBidiPropertyBlockLevel1_0100, /* 4800..48FF */ + FriBidiPropertyBlockLevel1_0100, /* 4900..49FF */ + FriBidiPropertyBlockLevel1_0100, /* 4A00..4AFF */ + FriBidiPropertyBlockLevel1_0100, /* 4B00..4BFF */ + FriBidiPropertyBlockLevel1_0100, /* 4C00..4CFF */ + FriBidiPropertyBlockLevel1_0100, /* 4D00..4DFF */ + FriBidiPropertyBlockLevel1_0100, /* 4E00..4EFF */ + FriBidiPropertyBlockLevel1_0100, /* 4F00..4FFF */ + FriBidiPropertyBlockLevel1_0100, /* 5000..50FF */ + FriBidiPropertyBlockLevel1_0100, /* 5100..51FF */ + FriBidiPropertyBlockLevel1_0100, /* 5200..52FF */ + FriBidiPropertyBlockLevel1_0100, /* 5300..53FF */ + FriBidiPropertyBlockLevel1_0100, /* 5400..54FF */ + FriBidiPropertyBlockLevel1_0100, /* 5500..55FF */ + FriBidiPropertyBlockLevel1_0100, /* 5600..56FF */ + FriBidiPropertyBlockLevel1_0100, /* 5700..57FF */ + FriBidiPropertyBlockLevel1_0100, /* 5800..58FF */ + FriBidiPropertyBlockLevel1_0100, /* 5900..59FF */ + FriBidiPropertyBlockLevel1_0100, /* 5A00..5AFF */ + FriBidiPropertyBlockLevel1_0100, /* 5B00..5BFF */ + FriBidiPropertyBlockLevel1_0100, /* 5C00..5CFF */ + FriBidiPropertyBlockLevel1_0100, /* 5D00..5DFF */ + FriBidiPropertyBlockLevel1_0100, /* 5E00..5EFF */ + FriBidiPropertyBlockLevel1_0100, /* 5F00..5FFF */ + FriBidiPropertyBlockLevel1_0100, /* 6000..60FF */ + FriBidiPropertyBlockLevel1_0100, /* 6100..61FF */ + FriBidiPropertyBlockLevel1_0100, /* 6200..62FF */ + FriBidiPropertyBlockLevel1_0100, /* 6300..63FF */ + FriBidiPropertyBlockLevel1_0100, /* 6400..64FF */ + FriBidiPropertyBlockLevel1_0100, /* 6500..65FF */ + FriBidiPropertyBlockLevel1_0100, /* 6600..66FF */ + FriBidiPropertyBlockLevel1_0100, /* 6700..67FF */ + FriBidiPropertyBlockLevel1_0100, /* 6800..68FF */ + FriBidiPropertyBlockLevel1_0100, /* 6900..69FF */ + FriBidiPropertyBlockLevel1_0100, /* 6A00..6AFF */ + FriBidiPropertyBlockLevel1_0100, /* 6B00..6BFF */ + FriBidiPropertyBlockLevel1_0100, /* 6C00..6CFF */ + FriBidiPropertyBlockLevel1_0100, /* 6D00..6DFF */ + FriBidiPropertyBlockLevel1_0100, /* 6E00..6EFF */ + FriBidiPropertyBlockLevel1_0100, /* 6F00..6FFF */ + FriBidiPropertyBlockLevel1_0100, /* 7000..70FF */ + FriBidiPropertyBlockLevel1_0100, /* 7100..71FF */ + FriBidiPropertyBlockLevel1_0100, /* 7200..72FF */ + FriBidiPropertyBlockLevel1_0100, /* 7300..73FF */ + FriBidiPropertyBlockLevel1_0100, /* 7400..74FF */ + FriBidiPropertyBlockLevel1_0100, /* 7500..75FF */ + FriBidiPropertyBlockLevel1_0100, /* 7600..76FF */ + FriBidiPropertyBlockLevel1_0100, /* 7700..77FF */ + FriBidiPropertyBlockLevel1_0100, /* 7800..78FF */ + FriBidiPropertyBlockLevel1_0100, /* 7900..79FF */ + FriBidiPropertyBlockLevel1_0100, /* 7A00..7AFF */ + FriBidiPropertyBlockLevel1_0100, /* 7B00..7BFF */ + FriBidiPropertyBlockLevel1_0100, /* 7C00..7CFF */ + FriBidiPropertyBlockLevel1_0100, /* 7D00..7DFF */ + FriBidiPropertyBlockLevel1_0100, /* 7E00..7EFF */ + FriBidiPropertyBlockLevel1_0100, /* 7F00..7FFF */ + FriBidiPropertyBlockLevel1_0100, /* 8000..80FF */ + FriBidiPropertyBlockLevel1_0100, /* 8100..81FF */ + FriBidiPropertyBlockLevel1_0100, /* 8200..82FF */ + FriBidiPropertyBlockLevel1_0100, /* 8300..83FF */ + FriBidiPropertyBlockLevel1_0100, /* 8400..84FF */ + FriBidiPropertyBlockLevel1_0100, /* 8500..85FF */ + FriBidiPropertyBlockLevel1_0100, /* 8600..86FF */ + FriBidiPropertyBlockLevel1_0100, /* 8700..87FF */ + FriBidiPropertyBlockLevel1_0100, /* 8800..88FF */ + FriBidiPropertyBlockLevel1_0100, /* 8900..89FF */ + FriBidiPropertyBlockLevel1_0100, /* 8A00..8AFF */ + FriBidiPropertyBlockLevel1_0100, /* 8B00..8BFF */ + FriBidiPropertyBlockLevel1_0100, /* 8C00..8CFF */ + FriBidiPropertyBlockLevel1_0100, /* 8D00..8DFF */ + FriBidiPropertyBlockLevel1_0100, /* 8E00..8EFF */ + FriBidiPropertyBlockLevel1_0100, /* 8F00..8FFF */ + FriBidiPropertyBlockLevel1_0100, /* 9000..90FF */ + FriBidiPropertyBlockLevel1_0100, /* 9100..91FF */ + FriBidiPropertyBlockLevel1_0100, /* 9200..92FF */ + FriBidiPropertyBlockLevel1_0100, /* 9300..93FF */ + FriBidiPropertyBlockLevel1_0100, /* 9400..94FF */ + FriBidiPropertyBlockLevel1_0100, /* 9500..95FF */ + FriBidiPropertyBlockLevel1_0100, /* 9600..96FF */ + FriBidiPropertyBlockLevel1_0100, /* 9700..97FF */ + FriBidiPropertyBlockLevel1_0100, /* 9800..98FF */ + FriBidiPropertyBlockLevel1_0100, /* 9900..99FF */ + FriBidiPropertyBlockLevel1_0100, /* 9A00..9AFF */ + FriBidiPropertyBlockLevel1_0100, /* 9B00..9BFF */ + FriBidiPropertyBlockLevel1_0100, /* 9C00..9CFF */ + FriBidiPropertyBlockLevel1_0100, /* 9D00..9DFF */ + FriBidiPropertyBlockLevel1_0100, /* 9E00..9EFF */ + FriBidiPropertyBlockLevel1_0100, /* 9F00..9FFF */ + FriBidiPropertyBlockLevel1_0100, /* A000..A0FF */ + FriBidiPropertyBlockLevel1_0100, /* A100..A1FF */ + FriBidiPropertyBlockLevel1_0100, /* A200..A2FF */ + FriBidiPropertyBlockLevel1_0100, /* A300..A3FF */ + FriBidiPropertyBlockLevel1_A400, /* A400..A4FF */ + FriBidiPropertyBlockLevel1_0100, /* A500..A5FF */ + FriBidiPropertyBlockLevel1_0100, /* A600..A6FF */ + FriBidiPropertyBlockLevel1_0100, /* A700..A7FF */ + FriBidiPropertyBlockLevel1_0100, /* A800..A8FF */ + FriBidiPropertyBlockLevel1_0100, /* A900..A9FF */ + FriBidiPropertyBlockLevel1_0100, /* AA00..AAFF */ + FriBidiPropertyBlockLevel1_0100, /* AB00..ABFF */ + FriBidiPropertyBlockLevel1_0100, /* AC00..ACFF */ + FriBidiPropertyBlockLevel1_0100, /* AD00..ADFF */ + FriBidiPropertyBlockLevel1_0100, /* AE00..AEFF */ + FriBidiPropertyBlockLevel1_0100, /* AF00..AFFF */ + FriBidiPropertyBlockLevel1_0100, /* B000..B0FF */ + FriBidiPropertyBlockLevel1_0100, /* B100..B1FF */ + FriBidiPropertyBlockLevel1_0100, /* B200..B2FF */ + FriBidiPropertyBlockLevel1_0100, /* B300..B3FF */ + FriBidiPropertyBlockLevel1_0100, /* B400..B4FF */ + FriBidiPropertyBlockLevel1_0100, /* B500..B5FF */ + FriBidiPropertyBlockLevel1_0100, /* B600..B6FF */ + FriBidiPropertyBlockLevel1_0100, /* B700..B7FF */ + FriBidiPropertyBlockLevel1_0100, /* B800..B8FF */ + FriBidiPropertyBlockLevel1_0100, /* B900..B9FF */ + FriBidiPropertyBlockLevel1_0100, /* BA00..BAFF */ + FriBidiPropertyBlockLevel1_0100, /* BB00..BBFF */ + FriBidiPropertyBlockLevel1_0100, /* BC00..BCFF */ + FriBidiPropertyBlockLevel1_0100, /* BD00..BDFF */ + FriBidiPropertyBlockLevel1_0100, /* BE00..BEFF */ + FriBidiPropertyBlockLevel1_0100, /* BF00..BFFF */ + FriBidiPropertyBlockLevel1_0100, /* C000..C0FF */ + FriBidiPropertyBlockLevel1_0100, /* C100..C1FF */ + FriBidiPropertyBlockLevel1_0100, /* C200..C2FF */ + FriBidiPropertyBlockLevel1_0100, /* C300..C3FF */ + FriBidiPropertyBlockLevel1_0100, /* C400..C4FF */ + FriBidiPropertyBlockLevel1_0100, /* C500..C5FF */ + FriBidiPropertyBlockLevel1_0100, /* C600..C6FF */ + FriBidiPropertyBlockLevel1_0100, /* C700..C7FF */ + FriBidiPropertyBlockLevel1_0100, /* C800..C8FF */ + FriBidiPropertyBlockLevel1_0100, /* C900..C9FF */ + FriBidiPropertyBlockLevel1_0100, /* CA00..CAFF */ + FriBidiPropertyBlockLevel1_0100, /* CB00..CBFF */ + FriBidiPropertyBlockLevel1_0100, /* CC00..CCFF */ + FriBidiPropertyBlockLevel1_0100, /* CD00..CDFF */ + FriBidiPropertyBlockLevel1_0100, /* CE00..CEFF */ + FriBidiPropertyBlockLevel1_0100, /* CF00..CFFF */ + FriBidiPropertyBlockLevel1_0100, /* D000..D0FF */ + FriBidiPropertyBlockLevel1_0100, /* D100..D1FF */ + FriBidiPropertyBlockLevel1_0100, /* D200..D2FF */ + FriBidiPropertyBlockLevel1_0100, /* D300..D3FF */ + FriBidiPropertyBlockLevel1_0100, /* D400..D4FF */ + FriBidiPropertyBlockLevel1_0100, /* D500..D5FF */ + FriBidiPropertyBlockLevel1_0100, /* D600..D6FF */ + FriBidiPropertyBlockLevel1_0100, /* D700..D7FF */ + FriBidiPropertyBlockLevel1_0100, /* D800..D8FF */ + FriBidiPropertyBlockLevel1_0100, /* D900..D9FF */ + FriBidiPropertyBlockLevel1_0100, /* DA00..DAFF */ + FriBidiPropertyBlockLevel1_0100, /* DB00..DBFF */ + FriBidiPropertyBlockLevel1_0100, /* DC00..DCFF */ + FriBidiPropertyBlockLevel1_0100, /* DD00..DDFF */ + FriBidiPropertyBlockLevel1_0100, /* DE00..DEFF */ + FriBidiPropertyBlockLevel1_0100, /* DF00..DFFF */ + FriBidiPropertyBlockLevel1_0100, /* E000..E0FF */ + FriBidiPropertyBlockLevel1_0100, /* E100..E1FF */ + FriBidiPropertyBlockLevel1_0100, /* E200..E2FF */ + FriBidiPropertyBlockLevel1_0100, /* E300..E3FF */ + FriBidiPropertyBlockLevel1_0100, /* E400..E4FF */ + FriBidiPropertyBlockLevel1_0100, /* E500..E5FF */ + FriBidiPropertyBlockLevel1_0100, /* E600..E6FF */ + FriBidiPropertyBlockLevel1_0100, /* E700..E7FF */ + FriBidiPropertyBlockLevel1_0100, /* E800..E8FF */ + FriBidiPropertyBlockLevel1_0100, /* E900..E9FF */ + FriBidiPropertyBlockLevel1_0100, /* EA00..EAFF */ + FriBidiPropertyBlockLevel1_0100, /* EB00..EBFF */ + FriBidiPropertyBlockLevel1_0100, /* EC00..ECFF */ + FriBidiPropertyBlockLevel1_0100, /* ED00..EDFF */ + FriBidiPropertyBlockLevel1_0100, /* EE00..EEFF */ + FriBidiPropertyBlockLevel1_0100, /* EF00..EFFF */ + FriBidiPropertyBlockLevel1_0100, /* F000..F0FF */ + FriBidiPropertyBlockLevel1_0100, /* F100..F1FF */ + FriBidiPropertyBlockLevel1_0100, /* F200..F2FF */ + FriBidiPropertyBlockLevel1_0100, /* F300..F3FF */ + FriBidiPropertyBlockLevel1_0100, /* F400..F4FF */ + FriBidiPropertyBlockLevel1_0100, /* F500..F5FF */ + FriBidiPropertyBlockLevel1_0100, /* F600..F6FF */ + FriBidiPropertyBlockLevel1_0100, /* F700..F7FF */ + FriBidiPropertyBlockLevel1_0100, /* F800..F8FF */ + FriBidiPropertyBlockLevel1_0100, /* F900..F9FF */ + FriBidiPropertyBlockLevel1_0100, /* FA00..FAFF */ + FriBidiPropertyBlockLevel1_FB00, /* FB00..FBFF */ + FriBidiPropertyBlockLevel1_FC00, /* FC00..FCFF */ + FriBidiPropertyBlockLevel1_FD00, /* FD00..FDFF */ + FriBidiPropertyBlockLevel1_FE00, /* FE00..FEFF */ + FriBidiPropertyBlockLevel1_FF00, /* FF00..FFFF */ + FriBidiPropertyBlockLevel1_0100, /* 10000..100FF */ + FriBidiPropertyBlockLevel1_0100, /* 10100..101FF */ + FriBidiPropertyBlockLevel1_0100, /* 10200..102FF */ + FriBidiPropertyBlockLevel1_0100, /* 10300..103FF */ + FriBidiPropertyBlockLevel1_0100, /* 10400..104FF */ + FriBidiPropertyBlockLevel1_0100, /* 10500..105FF */ + FriBidiPropertyBlockLevel1_0100, /* 10600..106FF */ + FriBidiPropertyBlockLevel1_0100, /* 10700..107FF */ + FriBidiPropertyBlockLevel1_0100, /* 10800..108FF */ + FriBidiPropertyBlockLevel1_0100, /* 10900..109FF */ + FriBidiPropertyBlockLevel1_0100, /* 10A00..10AFF */ + FriBidiPropertyBlockLevel1_0100, /* 10B00..10BFF */ + FriBidiPropertyBlockLevel1_0100, /* 10C00..10CFF */ + FriBidiPropertyBlockLevel1_0100, /* 10D00..10DFF */ + FriBidiPropertyBlockLevel1_0100, /* 10E00..10EFF */ + FriBidiPropertyBlockLevel1_0100, /* 10F00..10FFF */ + FriBidiPropertyBlockLevel1_0100, /* 11000..110FF */ + FriBidiPropertyBlockLevel1_0100, /* 11100..111FF */ + FriBidiPropertyBlockLevel1_0100, /* 11200..112FF */ + FriBidiPropertyBlockLevel1_0100, /* 11300..113FF */ + FriBidiPropertyBlockLevel1_0100, /* 11400..114FF */ + FriBidiPropertyBlockLevel1_0100, /* 11500..115FF */ + FriBidiPropertyBlockLevel1_0100, /* 11600..116FF */ + FriBidiPropertyBlockLevel1_0100, /* 11700..117FF */ + FriBidiPropertyBlockLevel1_0100, /* 11800..118FF */ + FriBidiPropertyBlockLevel1_0100, /* 11900..119FF */ + FriBidiPropertyBlockLevel1_0100, /* 11A00..11AFF */ + FriBidiPropertyBlockLevel1_0100, /* 11B00..11BFF */ + FriBidiPropertyBlockLevel1_0100, /* 11C00..11CFF */ + FriBidiPropertyBlockLevel1_0100, /* 11D00..11DFF */ + FriBidiPropertyBlockLevel1_0100, /* 11E00..11EFF */ + FriBidiPropertyBlockLevel1_0100, /* 11F00..11FFF */ + FriBidiPropertyBlockLevel1_0100, /* 12000..120FF */ + FriBidiPropertyBlockLevel1_0100, /* 12100..121FF */ + FriBidiPropertyBlockLevel1_0100, /* 12200..122FF */ + FriBidiPropertyBlockLevel1_0100, /* 12300..123FF */ + FriBidiPropertyBlockLevel1_0100, /* 12400..124FF */ + FriBidiPropertyBlockLevel1_0100, /* 12500..125FF */ + FriBidiPropertyBlockLevel1_0100, /* 12600..126FF */ + FriBidiPropertyBlockLevel1_0100, /* 12700..127FF */ + FriBidiPropertyBlockLevel1_0100, /* 12800..128FF */ + FriBidiPropertyBlockLevel1_0100, /* 12900..129FF */ + FriBidiPropertyBlockLevel1_0100, /* 12A00..12AFF */ + FriBidiPropertyBlockLevel1_0100, /* 12B00..12BFF */ + FriBidiPropertyBlockLevel1_0100, /* 12C00..12CFF */ + FriBidiPropertyBlockLevel1_0100, /* 12D00..12DFF */ + FriBidiPropertyBlockLevel1_0100, /* 12E00..12EFF */ + FriBidiPropertyBlockLevel1_0100, /* 12F00..12FFF */ + FriBidiPropertyBlockLevel1_0100, /* 13000..130FF */ + FriBidiPropertyBlockLevel1_0100, /* 13100..131FF */ + FriBidiPropertyBlockLevel1_0100, /* 13200..132FF */ + FriBidiPropertyBlockLevel1_0100, /* 13300..133FF */ + FriBidiPropertyBlockLevel1_0100, /* 13400..134FF */ + FriBidiPropertyBlockLevel1_0100, /* 13500..135FF */ + FriBidiPropertyBlockLevel1_0100, /* 13600..136FF */ + FriBidiPropertyBlockLevel1_0100, /* 13700..137FF */ + FriBidiPropertyBlockLevel1_0100, /* 13800..138FF */ + FriBidiPropertyBlockLevel1_0100, /* 13900..139FF */ + FriBidiPropertyBlockLevel1_0100, /* 13A00..13AFF */ + FriBidiPropertyBlockLevel1_0100, /* 13B00..13BFF */ + FriBidiPropertyBlockLevel1_0100, /* 13C00..13CFF */ + FriBidiPropertyBlockLevel1_0100, /* 13D00..13DFF */ + FriBidiPropertyBlockLevel1_0100, /* 13E00..13EFF */ + FriBidiPropertyBlockLevel1_0100, /* 13F00..13FFF */ + FriBidiPropertyBlockLevel1_0100, /* 14000..140FF */ + FriBidiPropertyBlockLevel1_0100, /* 14100..141FF */ + FriBidiPropertyBlockLevel1_0100, /* 14200..142FF */ + FriBidiPropertyBlockLevel1_0100, /* 14300..143FF */ + FriBidiPropertyBlockLevel1_0100, /* 14400..144FF */ + FriBidiPropertyBlockLevel1_0100, /* 14500..145FF */ + FriBidiPropertyBlockLevel1_0100, /* 14600..146FF */ + FriBidiPropertyBlockLevel1_0100, /* 14700..147FF */ + FriBidiPropertyBlockLevel1_0100, /* 14800..148FF */ + FriBidiPropertyBlockLevel1_0100, /* 14900..149FF */ + FriBidiPropertyBlockLevel1_0100, /* 14A00..14AFF */ + FriBidiPropertyBlockLevel1_0100, /* 14B00..14BFF */ + FriBidiPropertyBlockLevel1_0100, /* 14C00..14CFF */ + FriBidiPropertyBlockLevel1_0100, /* 14D00..14DFF */ + FriBidiPropertyBlockLevel1_0100, /* 14E00..14EFF */ + FriBidiPropertyBlockLevel1_0100, /* 14F00..14FFF */ + FriBidiPropertyBlockLevel1_0100, /* 15000..150FF */ + FriBidiPropertyBlockLevel1_0100, /* 15100..151FF */ + FriBidiPropertyBlockLevel1_0100, /* 15200..152FF */ + FriBidiPropertyBlockLevel1_0100, /* 15300..153FF */ + FriBidiPropertyBlockLevel1_0100, /* 15400..154FF */ + FriBidiPropertyBlockLevel1_0100, /* 15500..155FF */ + FriBidiPropertyBlockLevel1_0100, /* 15600..156FF */ + FriBidiPropertyBlockLevel1_0100, /* 15700..157FF */ + FriBidiPropertyBlockLevel1_0100, /* 15800..158FF */ + FriBidiPropertyBlockLevel1_0100, /* 15900..159FF */ + FriBidiPropertyBlockLevel1_0100, /* 15A00..15AFF */ + FriBidiPropertyBlockLevel1_0100, /* 15B00..15BFF */ + FriBidiPropertyBlockLevel1_0100, /* 15C00..15CFF */ + FriBidiPropertyBlockLevel1_0100, /* 15D00..15DFF */ + FriBidiPropertyBlockLevel1_0100, /* 15E00..15EFF */ + FriBidiPropertyBlockLevel1_0100, /* 15F00..15FFF */ + FriBidiPropertyBlockLevel1_0100, /* 16000..160FF */ + FriBidiPropertyBlockLevel1_0100, /* 16100..161FF */ + FriBidiPropertyBlockLevel1_0100, /* 16200..162FF */ + FriBidiPropertyBlockLevel1_0100, /* 16300..163FF */ + FriBidiPropertyBlockLevel1_0100, /* 16400..164FF */ + FriBidiPropertyBlockLevel1_0100, /* 16500..165FF */ + FriBidiPropertyBlockLevel1_0100, /* 16600..166FF */ + FriBidiPropertyBlockLevel1_0100, /* 16700..167FF */ + FriBidiPropertyBlockLevel1_0100, /* 16800..168FF */ + FriBidiPropertyBlockLevel1_0100, /* 16900..169FF */ + FriBidiPropertyBlockLevel1_0100, /* 16A00..16AFF */ + FriBidiPropertyBlockLevel1_0100, /* 16B00..16BFF */ + FriBidiPropertyBlockLevel1_0100, /* 16C00..16CFF */ + FriBidiPropertyBlockLevel1_0100, /* 16D00..16DFF */ + FriBidiPropertyBlockLevel1_0100, /* 16E00..16EFF */ + FriBidiPropertyBlockLevel1_0100, /* 16F00..16FFF */ + FriBidiPropertyBlockLevel1_0100, /* 17000..170FF */ + FriBidiPropertyBlockLevel1_0100, /* 17100..171FF */ + FriBidiPropertyBlockLevel1_0100, /* 17200..172FF */ + FriBidiPropertyBlockLevel1_0100, /* 17300..173FF */ + FriBidiPropertyBlockLevel1_0100, /* 17400..174FF */ + FriBidiPropertyBlockLevel1_0100, /* 17500..175FF */ + FriBidiPropertyBlockLevel1_0100, /* 17600..176FF */ + FriBidiPropertyBlockLevel1_0100, /* 17700..177FF */ + FriBidiPropertyBlockLevel1_0100, /* 17800..178FF */ + FriBidiPropertyBlockLevel1_0100, /* 17900..179FF */ + FriBidiPropertyBlockLevel1_0100, /* 17A00..17AFF */ + FriBidiPropertyBlockLevel1_0100, /* 17B00..17BFF */ + FriBidiPropertyBlockLevel1_0100, /* 17C00..17CFF */ + FriBidiPropertyBlockLevel1_0100, /* 17D00..17DFF */ + FriBidiPropertyBlockLevel1_0100, /* 17E00..17EFF */ + FriBidiPropertyBlockLevel1_0100, /* 17F00..17FFF */ + FriBidiPropertyBlockLevel1_0100, /* 18000..180FF */ + FriBidiPropertyBlockLevel1_0100, /* 18100..181FF */ + FriBidiPropertyBlockLevel1_0100, /* 18200..182FF */ + FriBidiPropertyBlockLevel1_0100, /* 18300..183FF */ + FriBidiPropertyBlockLevel1_0100, /* 18400..184FF */ + FriBidiPropertyBlockLevel1_0100, /* 18500..185FF */ + FriBidiPropertyBlockLevel1_0100, /* 18600..186FF */ + FriBidiPropertyBlockLevel1_0100, /* 18700..187FF */ + FriBidiPropertyBlockLevel1_0100, /* 18800..188FF */ + FriBidiPropertyBlockLevel1_0100, /* 18900..189FF */ + FriBidiPropertyBlockLevel1_0100, /* 18A00..18AFF */ + FriBidiPropertyBlockLevel1_0100, /* 18B00..18BFF */ + FriBidiPropertyBlockLevel1_0100, /* 18C00..18CFF */ + FriBidiPropertyBlockLevel1_0100, /* 18D00..18DFF */ + FriBidiPropertyBlockLevel1_0100, /* 18E00..18EFF */ + FriBidiPropertyBlockLevel1_0100, /* 18F00..18FFF */ + FriBidiPropertyBlockLevel1_0100, /* 19000..190FF */ + FriBidiPropertyBlockLevel1_0100, /* 19100..191FF */ + FriBidiPropertyBlockLevel1_0100, /* 19200..192FF */ + FriBidiPropertyBlockLevel1_0100, /* 19300..193FF */ + FriBidiPropertyBlockLevel1_0100, /* 19400..194FF */ + FriBidiPropertyBlockLevel1_0100, /* 19500..195FF */ + FriBidiPropertyBlockLevel1_0100, /* 19600..196FF */ + FriBidiPropertyBlockLevel1_0100, /* 19700..197FF */ + FriBidiPropertyBlockLevel1_0100, /* 19800..198FF */ + FriBidiPropertyBlockLevel1_0100, /* 19900..199FF */ + FriBidiPropertyBlockLevel1_0100, /* 19A00..19AFF */ + FriBidiPropertyBlockLevel1_0100, /* 19B00..19BFF */ + FriBidiPropertyBlockLevel1_0100, /* 19C00..19CFF */ + FriBidiPropertyBlockLevel1_0100, /* 19D00..19DFF */ + FriBidiPropertyBlockLevel1_0100, /* 19E00..19EFF */ + FriBidiPropertyBlockLevel1_0100, /* 19F00..19FFF */ + FriBidiPropertyBlockLevel1_0100, /* 1A000..1A0FF */ + FriBidiPropertyBlockLevel1_0100, /* 1A100..1A1FF */ + FriBidiPropertyBlockLevel1_0100, /* 1A200..1A2FF */ + FriBidiPropertyBlockLevel1_0100, /* 1A300..1A3FF */ + FriBidiPropertyBlockLevel1_0100, /* 1A400..1A4FF */ + FriBidiPropertyBlockLevel1_0100, /* 1A500..1A5FF */ + FriBidiPropertyBlockLevel1_0100, /* 1A600..1A6FF */ + FriBidiPropertyBlockLevel1_0100, /* 1A700..1A7FF */ + FriBidiPropertyBlockLevel1_0100, /* 1A800..1A8FF */ + FriBidiPropertyBlockLevel1_0100, /* 1A900..1A9FF */ + FriBidiPropertyBlockLevel1_0100, /* 1AA00..1AAFF */ + FriBidiPropertyBlockLevel1_0100, /* 1AB00..1ABFF */ + FriBidiPropertyBlockLevel1_0100, /* 1AC00..1ACFF */ + FriBidiPropertyBlockLevel1_0100, /* 1AD00..1ADFF */ + FriBidiPropertyBlockLevel1_0100, /* 1AE00..1AEFF */ + FriBidiPropertyBlockLevel1_0100, /* 1AF00..1AFFF */ + FriBidiPropertyBlockLevel1_0100, /* 1B000..1B0FF */ + FriBidiPropertyBlockLevel1_0100, /* 1B100..1B1FF */ + FriBidiPropertyBlockLevel1_0100, /* 1B200..1B2FF */ + FriBidiPropertyBlockLevel1_0100, /* 1B300..1B3FF */ + FriBidiPropertyBlockLevel1_0100, /* 1B400..1B4FF */ + FriBidiPropertyBlockLevel1_0100, /* 1B500..1B5FF */ + FriBidiPropertyBlockLevel1_0100, /* 1B600..1B6FF */ + FriBidiPropertyBlockLevel1_0100, /* 1B700..1B7FF */ + FriBidiPropertyBlockLevel1_0100, /* 1B800..1B8FF */ + FriBidiPropertyBlockLevel1_0100, /* 1B900..1B9FF */ + FriBidiPropertyBlockLevel1_0100, /* 1BA00..1BAFF */ + FriBidiPropertyBlockLevel1_0100, /* 1BB00..1BBFF */ + FriBidiPropertyBlockLevel1_0100, /* 1BC00..1BCFF */ + FriBidiPropertyBlockLevel1_0100, /* 1BD00..1BDFF */ + FriBidiPropertyBlockLevel1_0100, /* 1BE00..1BEFF */ + FriBidiPropertyBlockLevel1_0100, /* 1BF00..1BFFF */ + FriBidiPropertyBlockLevel1_0100, /* 1C000..1C0FF */ + FriBidiPropertyBlockLevel1_0100, /* 1C100..1C1FF */ + FriBidiPropertyBlockLevel1_0100, /* 1C200..1C2FF */ + FriBidiPropertyBlockLevel1_0100, /* 1C300..1C3FF */ + FriBidiPropertyBlockLevel1_0100, /* 1C400..1C4FF */ + FriBidiPropertyBlockLevel1_0100, /* 1C500..1C5FF */ + FriBidiPropertyBlockLevel1_0100, /* 1C600..1C6FF */ + FriBidiPropertyBlockLevel1_0100, /* 1C700..1C7FF */ + FriBidiPropertyBlockLevel1_0100, /* 1C800..1C8FF */ + FriBidiPropertyBlockLevel1_0100, /* 1C900..1C9FF */ + FriBidiPropertyBlockLevel1_0100, /* 1CA00..1CAFF */ + FriBidiPropertyBlockLevel1_0100, /* 1CB00..1CBFF */ + FriBidiPropertyBlockLevel1_0100, /* 1CC00..1CCFF */ + FriBidiPropertyBlockLevel1_0100, /* 1CD00..1CDFF */ + FriBidiPropertyBlockLevel1_0100, /* 1CE00..1CEFF */ + FriBidiPropertyBlockLevel1_0100, /* 1CF00..1CFFF */ + FriBidiPropertyBlockLevel1_0100, /* 1D000..1D0FF */ + FriBidiPropertyBlockLevel1_1D100, /* 1D100..1D1FF */ + FriBidiPropertyBlockLevel1_0100, /* 1D200..1D2FF */ + FriBidiPropertyBlockLevel1_0100, /* 1D300..1D3FF */ + FriBidiPropertyBlockLevel1_0100, /* 1D400..1D4FF */ + FriBidiPropertyBlockLevel1_0100, /* 1D500..1D5FF */ + FriBidiPropertyBlockLevel1_0100, /* 1D600..1D6FF */ + FriBidiPropertyBlockLevel1_1D700, /* 1D700..1D7FF */ + FriBidiPropertyBlockLevel1_0100, /* 1D800..1D8FF */ + FriBidiPropertyBlockLevel1_0100, /* 1D900..1D9FF */ + FriBidiPropertyBlockLevel1_0100, /* 1DA00..1DAFF */ + FriBidiPropertyBlockLevel1_0100, /* 1DB00..1DBFF */ + FriBidiPropertyBlockLevel1_0100, /* 1DC00..1DCFF */ + FriBidiPropertyBlockLevel1_0100, /* 1DD00..1DDFF */ + FriBidiPropertyBlockLevel1_0100, /* 1DE00..1DEFF */ + FriBidiPropertyBlockLevel1_0100, /* 1DF00..1DFFF */ + FriBidiPropertyBlockLevel1_0100, /* 1E000..1E0FF */ + FriBidiPropertyBlockLevel1_0100, /* 1E100..1E1FF */ + FriBidiPropertyBlockLevel1_0100, /* 1E200..1E2FF */ + FriBidiPropertyBlockLevel1_0100, /* 1E300..1E3FF */ + FriBidiPropertyBlockLevel1_0100, /* 1E400..1E4FF */ + FriBidiPropertyBlockLevel1_0100, /* 1E500..1E5FF */ + FriBidiPropertyBlockLevel1_0100, /* 1E600..1E6FF */ + FriBidiPropertyBlockLevel1_0100, /* 1E700..1E7FF */ + FriBidiPropertyBlockLevel1_0100, /* 1E800..1E8FF */ + FriBidiPropertyBlockLevel1_0100, /* 1E900..1E9FF */ + FriBidiPropertyBlockLevel1_0100, /* 1EA00..1EAFF */ + FriBidiPropertyBlockLevel1_0100, /* 1EB00..1EBFF */ + FriBidiPropertyBlockLevel1_0100, /* 1EC00..1ECFF */ + FriBidiPropertyBlockLevel1_0100, /* 1ED00..1EDFF */ + FriBidiPropertyBlockLevel1_0100, /* 1EE00..1EEFF */ + FriBidiPropertyBlockLevel1_0100, /* 1EF00..1EFFF */ + FriBidiPropertyBlockLevel1_0100, /* 1F000..1F0FF */ + FriBidiPropertyBlockLevel1_0100, /* 1F100..1F1FF */ + FriBidiPropertyBlockLevel1_0100, /* 1F200..1F2FF */ + FriBidiPropertyBlockLevel1_0100, /* 1F300..1F3FF */ + FriBidiPropertyBlockLevel1_0100, /* 1F400..1F4FF */ + FriBidiPropertyBlockLevel1_0100, /* 1F500..1F5FF */ + FriBidiPropertyBlockLevel1_0100, /* 1F600..1F6FF */ + FriBidiPropertyBlockLevel1_0100, /* 1F700..1F7FF */ + FriBidiPropertyBlockLevel1_0100, /* 1F800..1F8FF */ + FriBidiPropertyBlockLevel1_0100, /* 1F900..1F9FF */ + FriBidiPropertyBlockLevel1_0100, /* 1FA00..1FAFF */ + FriBidiPropertyBlockLevel1_0100, /* 1FB00..1FBFF */ + FriBidiPropertyBlockLevel1_0100, /* 1FC00..1FCFF */ + FriBidiPropertyBlockLevel1_0100, /* 1FD00..1FDFF */ + FriBidiPropertyBlockLevel1_0100, /* 1FE00..1FEFF */ + FriBidiPropertyBlockLevel1_0100, /* 1FF00..1FFFF */ + FriBidiPropertyBlockLevel1_0100, /* 20000..200FF */ + FriBidiPropertyBlockLevel1_0100, /* 20100..201FF */ + FriBidiPropertyBlockLevel1_0100, /* 20200..202FF */ + FriBidiPropertyBlockLevel1_0100, /* 20300..203FF */ + FriBidiPropertyBlockLevel1_0100, /* 20400..204FF */ + FriBidiPropertyBlockLevel1_0100, /* 20500..205FF */ + FriBidiPropertyBlockLevel1_0100, /* 20600..206FF */ + FriBidiPropertyBlockLevel1_0100, /* 20700..207FF */ + FriBidiPropertyBlockLevel1_0100, /* 20800..208FF */ + FriBidiPropertyBlockLevel1_0100, /* 20900..209FF */ + FriBidiPropertyBlockLevel1_0100, /* 20A00..20AFF */ + FriBidiPropertyBlockLevel1_0100, /* 20B00..20BFF */ + FriBidiPropertyBlockLevel1_0100, /* 20C00..20CFF */ + FriBidiPropertyBlockLevel1_0100, /* 20D00..20DFF */ + FriBidiPropertyBlockLevel1_0100, /* 20E00..20EFF */ + FriBidiPropertyBlockLevel1_0100, /* 20F00..20FFF */ + FriBidiPropertyBlockLevel1_0100, /* 21000..210FF */ + FriBidiPropertyBlockLevel1_0100, /* 21100..211FF */ + FriBidiPropertyBlockLevel1_0100, /* 21200..212FF */ + FriBidiPropertyBlockLevel1_0100, /* 21300..213FF */ + FriBidiPropertyBlockLevel1_0100, /* 21400..214FF */ + FriBidiPropertyBlockLevel1_0100, /* 21500..215FF */ + FriBidiPropertyBlockLevel1_0100, /* 21600..216FF */ + FriBidiPropertyBlockLevel1_0100, /* 21700..217FF */ + FriBidiPropertyBlockLevel1_0100, /* 21800..218FF */ + FriBidiPropertyBlockLevel1_0100, /* 21900..219FF */ + FriBidiPropertyBlockLevel1_0100, /* 21A00..21AFF */ + FriBidiPropertyBlockLevel1_0100, /* 21B00..21BFF */ + FriBidiPropertyBlockLevel1_0100, /* 21C00..21CFF */ + FriBidiPropertyBlockLevel1_0100, /* 21D00..21DFF */ + FriBidiPropertyBlockLevel1_0100, /* 21E00..21EFF */ + FriBidiPropertyBlockLevel1_0100, /* 21F00..21FFF */ + FriBidiPropertyBlockLevel1_0100, /* 22000..220FF */ + FriBidiPropertyBlockLevel1_0100, /* 22100..221FF */ + FriBidiPropertyBlockLevel1_0100, /* 22200..222FF */ + FriBidiPropertyBlockLevel1_0100, /* 22300..223FF */ + FriBidiPropertyBlockLevel1_0100, /* 22400..224FF */ + FriBidiPropertyBlockLevel1_0100, /* 22500..225FF */ + FriBidiPropertyBlockLevel1_0100, /* 22600..226FF */ + FriBidiPropertyBlockLevel1_0100, /* 22700..227FF */ + FriBidiPropertyBlockLevel1_0100, /* 22800..228FF */ + FriBidiPropertyBlockLevel1_0100, /* 22900..229FF */ + FriBidiPropertyBlockLevel1_0100, /* 22A00..22AFF */ + FriBidiPropertyBlockLevel1_0100, /* 22B00..22BFF */ + FriBidiPropertyBlockLevel1_0100, /* 22C00..22CFF */ + FriBidiPropertyBlockLevel1_0100, /* 22D00..22DFF */ + FriBidiPropertyBlockLevel1_0100, /* 22E00..22EFF */ + FriBidiPropertyBlockLevel1_0100, /* 22F00..22FFF */ + FriBidiPropertyBlockLevel1_0100, /* 23000..230FF */ + FriBidiPropertyBlockLevel1_0100, /* 23100..231FF */ + FriBidiPropertyBlockLevel1_0100, /* 23200..232FF */ + FriBidiPropertyBlockLevel1_0100, /* 23300..233FF */ + FriBidiPropertyBlockLevel1_0100, /* 23400..234FF */ + FriBidiPropertyBlockLevel1_0100, /* 23500..235FF */ + FriBidiPropertyBlockLevel1_0100, /* 23600..236FF */ + FriBidiPropertyBlockLevel1_0100, /* 23700..237FF */ + FriBidiPropertyBlockLevel1_0100, /* 23800..238FF */ + FriBidiPropertyBlockLevel1_0100, /* 23900..239FF */ + FriBidiPropertyBlockLevel1_0100, /* 23A00..23AFF */ + FriBidiPropertyBlockLevel1_0100, /* 23B00..23BFF */ + FriBidiPropertyBlockLevel1_0100, /* 23C00..23CFF */ + FriBidiPropertyBlockLevel1_0100, /* 23D00..23DFF */ + FriBidiPropertyBlockLevel1_0100, /* 23E00..23EFF */ + FriBidiPropertyBlockLevel1_0100, /* 23F00..23FFF */ + FriBidiPropertyBlockLevel1_0100, /* 24000..240FF */ + FriBidiPropertyBlockLevel1_0100, /* 24100..241FF */ + FriBidiPropertyBlockLevel1_0100, /* 24200..242FF */ + FriBidiPropertyBlockLevel1_0100, /* 24300..243FF */ + FriBidiPropertyBlockLevel1_0100, /* 24400..244FF */ + FriBidiPropertyBlockLevel1_0100, /* 24500..245FF */ + FriBidiPropertyBlockLevel1_0100, /* 24600..246FF */ + FriBidiPropertyBlockLevel1_0100, /* 24700..247FF */ + FriBidiPropertyBlockLevel1_0100, /* 24800..248FF */ + FriBidiPropertyBlockLevel1_0100, /* 24900..249FF */ + FriBidiPropertyBlockLevel1_0100, /* 24A00..24AFF */ + FriBidiPropertyBlockLevel1_0100, /* 24B00..24BFF */ + FriBidiPropertyBlockLevel1_0100, /* 24C00..24CFF */ + FriBidiPropertyBlockLevel1_0100, /* 24D00..24DFF */ + FriBidiPropertyBlockLevel1_0100, /* 24E00..24EFF */ + FriBidiPropertyBlockLevel1_0100, /* 24F00..24FFF */ + FriBidiPropertyBlockLevel1_0100, /* 25000..250FF */ + FriBidiPropertyBlockLevel1_0100, /* 25100..251FF */ + FriBidiPropertyBlockLevel1_0100, /* 25200..252FF */ + FriBidiPropertyBlockLevel1_0100, /* 25300..253FF */ + FriBidiPropertyBlockLevel1_0100, /* 25400..254FF */ + FriBidiPropertyBlockLevel1_0100, /* 25500..255FF */ + FriBidiPropertyBlockLevel1_0100, /* 25600..256FF */ + FriBidiPropertyBlockLevel1_0100, /* 25700..257FF */ + FriBidiPropertyBlockLevel1_0100, /* 25800..258FF */ + FriBidiPropertyBlockLevel1_0100, /* 25900..259FF */ + FriBidiPropertyBlockLevel1_0100, /* 25A00..25AFF */ + FriBidiPropertyBlockLevel1_0100, /* 25B00..25BFF */ + FriBidiPropertyBlockLevel1_0100, /* 25C00..25CFF */ + FriBidiPropertyBlockLevel1_0100, /* 25D00..25DFF */ + FriBidiPropertyBlockLevel1_0100, /* 25E00..25EFF */ + FriBidiPropertyBlockLevel1_0100, /* 25F00..25FFF */ + FriBidiPropertyBlockLevel1_0100, /* 26000..260FF */ + FriBidiPropertyBlockLevel1_0100, /* 26100..261FF */ + FriBidiPropertyBlockLevel1_0100, /* 26200..262FF */ + FriBidiPropertyBlockLevel1_0100, /* 26300..263FF */ + FriBidiPropertyBlockLevel1_0100, /* 26400..264FF */ + FriBidiPropertyBlockLevel1_0100, /* 26500..265FF */ + FriBidiPropertyBlockLevel1_0100, /* 26600..266FF */ + FriBidiPropertyBlockLevel1_0100, /* 26700..267FF */ + FriBidiPropertyBlockLevel1_0100, /* 26800..268FF */ + FriBidiPropertyBlockLevel1_0100, /* 26900..269FF */ + FriBidiPropertyBlockLevel1_0100, /* 26A00..26AFF */ + FriBidiPropertyBlockLevel1_0100, /* 26B00..26BFF */ + FriBidiPropertyBlockLevel1_0100, /* 26C00..26CFF */ + FriBidiPropertyBlockLevel1_0100, /* 26D00..26DFF */ + FriBidiPropertyBlockLevel1_0100, /* 26E00..26EFF */ + FriBidiPropertyBlockLevel1_0100, /* 26F00..26FFF */ + FriBidiPropertyBlockLevel1_0100, /* 27000..270FF */ + FriBidiPropertyBlockLevel1_0100, /* 27100..271FF */ + FriBidiPropertyBlockLevel1_0100, /* 27200..272FF */ + FriBidiPropertyBlockLevel1_0100, /* 27300..273FF */ + FriBidiPropertyBlockLevel1_0100, /* 27400..274FF */ + FriBidiPropertyBlockLevel1_0100, /* 27500..275FF */ + FriBidiPropertyBlockLevel1_0100, /* 27600..276FF */ + FriBidiPropertyBlockLevel1_0100, /* 27700..277FF */ + FriBidiPropertyBlockLevel1_0100, /* 27800..278FF */ + FriBidiPropertyBlockLevel1_0100, /* 27900..279FF */ + FriBidiPropertyBlockLevel1_0100, /* 27A00..27AFF */ + FriBidiPropertyBlockLevel1_0100, /* 27B00..27BFF */ + FriBidiPropertyBlockLevel1_0100, /* 27C00..27CFF */ + FriBidiPropertyBlockLevel1_0100, /* 27D00..27DFF */ + FriBidiPropertyBlockLevel1_0100, /* 27E00..27EFF */ + FriBidiPropertyBlockLevel1_0100, /* 27F00..27FFF */ + FriBidiPropertyBlockLevel1_0100, /* 28000..280FF */ + FriBidiPropertyBlockLevel1_0100, /* 28100..281FF */ + FriBidiPropertyBlockLevel1_0100, /* 28200..282FF */ + FriBidiPropertyBlockLevel1_0100, /* 28300..283FF */ + FriBidiPropertyBlockLevel1_0100, /* 28400..284FF */ + FriBidiPropertyBlockLevel1_0100, /* 28500..285FF */ + FriBidiPropertyBlockLevel1_0100, /* 28600..286FF */ + FriBidiPropertyBlockLevel1_0100, /* 28700..287FF */ + FriBidiPropertyBlockLevel1_0100, /* 28800..288FF */ + FriBidiPropertyBlockLevel1_0100, /* 28900..289FF */ + FriBidiPropertyBlockLevel1_0100, /* 28A00..28AFF */ + FriBidiPropertyBlockLevel1_0100, /* 28B00..28BFF */ + FriBidiPropertyBlockLevel1_0100, /* 28C00..28CFF */ + FriBidiPropertyBlockLevel1_0100, /* 28D00..28DFF */ + FriBidiPropertyBlockLevel1_0100, /* 28E00..28EFF */ + FriBidiPropertyBlockLevel1_0100, /* 28F00..28FFF */ + FriBidiPropertyBlockLevel1_0100, /* 29000..290FF */ + FriBidiPropertyBlockLevel1_0100, /* 29100..291FF */ + FriBidiPropertyBlockLevel1_0100, /* 29200..292FF */ + FriBidiPropertyBlockLevel1_0100, /* 29300..293FF */ + FriBidiPropertyBlockLevel1_0100, /* 29400..294FF */ + FriBidiPropertyBlockLevel1_0100, /* 29500..295FF */ + FriBidiPropertyBlockLevel1_0100, /* 29600..296FF */ + FriBidiPropertyBlockLevel1_0100, /* 29700..297FF */ + FriBidiPropertyBlockLevel1_0100, /* 29800..298FF */ + FriBidiPropertyBlockLevel1_0100, /* 29900..299FF */ + FriBidiPropertyBlockLevel1_0100, /* 29A00..29AFF */ + FriBidiPropertyBlockLevel1_0100, /* 29B00..29BFF */ + FriBidiPropertyBlockLevel1_0100, /* 29C00..29CFF */ + FriBidiPropertyBlockLevel1_0100, /* 29D00..29DFF */ + FriBidiPropertyBlockLevel1_0100, /* 29E00..29EFF */ + FriBidiPropertyBlockLevel1_0100, /* 29F00..29FFF */ + FriBidiPropertyBlockLevel1_0100, /* 2A000..2A0FF */ + FriBidiPropertyBlockLevel1_0100, /* 2A100..2A1FF */ + FriBidiPropertyBlockLevel1_0100, /* 2A200..2A2FF */ + FriBidiPropertyBlockLevel1_0100, /* 2A300..2A3FF */ + FriBidiPropertyBlockLevel1_0100, /* 2A400..2A4FF */ + FriBidiPropertyBlockLevel1_0100, /* 2A500..2A5FF */ + FriBidiPropertyBlockLevel1_0100, /* 2A600..2A6FF */ + FriBidiPropertyBlockLevel1_0100, /* 2A700..2A7FF */ + FriBidiPropertyBlockLevel1_0100, /* 2A800..2A8FF */ + FriBidiPropertyBlockLevel1_0100, /* 2A900..2A9FF */ + FriBidiPropertyBlockLevel1_0100, /* 2AA00..2AAFF */ + FriBidiPropertyBlockLevel1_0100, /* 2AB00..2ABFF */ + FriBidiPropertyBlockLevel1_0100, /* 2AC00..2ACFF */ + FriBidiPropertyBlockLevel1_0100, /* 2AD00..2ADFF */ + FriBidiPropertyBlockLevel1_0100, /* 2AE00..2AEFF */ + FriBidiPropertyBlockLevel1_0100, /* 2AF00..2AFFF */ + FriBidiPropertyBlockLevel1_0100, /* 2B000..2B0FF */ + FriBidiPropertyBlockLevel1_0100, /* 2B100..2B1FF */ + FriBidiPropertyBlockLevel1_0100, /* 2B200..2B2FF */ + FriBidiPropertyBlockLevel1_0100, /* 2B300..2B3FF */ + FriBidiPropertyBlockLevel1_0100, /* 2B400..2B4FF */ + FriBidiPropertyBlockLevel1_0100, /* 2B500..2B5FF */ + FriBidiPropertyBlockLevel1_0100, /* 2B600..2B6FF */ + FriBidiPropertyBlockLevel1_0100, /* 2B700..2B7FF */ + FriBidiPropertyBlockLevel1_0100, /* 2B800..2B8FF */ + FriBidiPropertyBlockLevel1_0100, /* 2B900..2B9FF */ + FriBidiPropertyBlockLevel1_0100, /* 2BA00..2BAFF */ + FriBidiPropertyBlockLevel1_0100, /* 2BB00..2BBFF */ + FriBidiPropertyBlockLevel1_0100, /* 2BC00..2BCFF */ + FriBidiPropertyBlockLevel1_0100, /* 2BD00..2BDFF */ + FriBidiPropertyBlockLevel1_0100, /* 2BE00..2BEFF */ + FriBidiPropertyBlockLevel1_0100, /* 2BF00..2BFFF */ + FriBidiPropertyBlockLevel1_0100, /* 2C000..2C0FF */ + FriBidiPropertyBlockLevel1_0100, /* 2C100..2C1FF */ + FriBidiPropertyBlockLevel1_0100, /* 2C200..2C2FF */ + FriBidiPropertyBlockLevel1_0100, /* 2C300..2C3FF */ + FriBidiPropertyBlockLevel1_0100, /* 2C400..2C4FF */ + FriBidiPropertyBlockLevel1_0100, /* 2C500..2C5FF */ + FriBidiPropertyBlockLevel1_0100, /* 2C600..2C6FF */ + FriBidiPropertyBlockLevel1_0100, /* 2C700..2C7FF */ + FriBidiPropertyBlockLevel1_0100, /* 2C800..2C8FF */ + FriBidiPropertyBlockLevel1_0100, /* 2C900..2C9FF */ + FriBidiPropertyBlockLevel1_0100, /* 2CA00..2CAFF */ + FriBidiPropertyBlockLevel1_0100, /* 2CB00..2CBFF */ + FriBidiPropertyBlockLevel1_0100, /* 2CC00..2CCFF */ + FriBidiPropertyBlockLevel1_0100, /* 2CD00..2CDFF */ + FriBidiPropertyBlockLevel1_0100, /* 2CE00..2CEFF */ + FriBidiPropertyBlockLevel1_0100, /* 2CF00..2CFFF */ + FriBidiPropertyBlockLevel1_0100, /* 2D000..2D0FF */ + FriBidiPropertyBlockLevel1_0100, /* 2D100..2D1FF */ + FriBidiPropertyBlockLevel1_0100, /* 2D200..2D2FF */ + FriBidiPropertyBlockLevel1_0100, /* 2D300..2D3FF */ + FriBidiPropertyBlockLevel1_0100, /* 2D400..2D4FF */ + FriBidiPropertyBlockLevel1_0100, /* 2D500..2D5FF */ + FriBidiPropertyBlockLevel1_0100, /* 2D600..2D6FF */ + FriBidiPropertyBlockLevel1_0100, /* 2D700..2D7FF */ + FriBidiPropertyBlockLevel1_0100, /* 2D800..2D8FF */ + FriBidiPropertyBlockLevel1_0100, /* 2D900..2D9FF */ + FriBidiPropertyBlockLevel1_0100, /* 2DA00..2DAFF */ + FriBidiPropertyBlockLevel1_0100, /* 2DB00..2DBFF */ + FriBidiPropertyBlockLevel1_0100, /* 2DC00..2DCFF */ + FriBidiPropertyBlockLevel1_0100, /* 2DD00..2DDFF */ + FriBidiPropertyBlockLevel1_0100, /* 2DE00..2DEFF */ + FriBidiPropertyBlockLevel1_0100, /* 2DF00..2DFFF */ + FriBidiPropertyBlockLevel1_0100, /* 2E000..2E0FF */ + FriBidiPropertyBlockLevel1_0100, /* 2E100..2E1FF */ + FriBidiPropertyBlockLevel1_0100, /* 2E200..2E2FF */ + FriBidiPropertyBlockLevel1_0100, /* 2E300..2E3FF */ + FriBidiPropertyBlockLevel1_0100, /* 2E400..2E4FF */ + FriBidiPropertyBlockLevel1_0100, /* 2E500..2E5FF */ + FriBidiPropertyBlockLevel1_0100, /* 2E600..2E6FF */ + FriBidiPropertyBlockLevel1_0100, /* 2E700..2E7FF */ + FriBidiPropertyBlockLevel1_0100, /* 2E800..2E8FF */ + FriBidiPropertyBlockLevel1_0100, /* 2E900..2E9FF */ + FriBidiPropertyBlockLevel1_0100, /* 2EA00..2EAFF */ + FriBidiPropertyBlockLevel1_0100, /* 2EB00..2EBFF */ + FriBidiPropertyBlockLevel1_0100, /* 2EC00..2ECFF */ + FriBidiPropertyBlockLevel1_0100, /* 2ED00..2EDFF */ + FriBidiPropertyBlockLevel1_0100, /* 2EE00..2EEFF */ + FriBidiPropertyBlockLevel1_0100, /* 2EF00..2EFFF */ + FriBidiPropertyBlockLevel1_0100, /* 2F000..2F0FF */ + FriBidiPropertyBlockLevel1_0100, /* 2F100..2F1FF */ + FriBidiPropertyBlockLevel1_0100, /* 2F200..2F2FF */ + FriBidiPropertyBlockLevel1_0100, /* 2F300..2F3FF */ + FriBidiPropertyBlockLevel1_0100, /* 2F400..2F4FF */ + FriBidiPropertyBlockLevel1_0100, /* 2F500..2F5FF */ + FriBidiPropertyBlockLevel1_0100, /* 2F600..2F6FF */ + FriBidiPropertyBlockLevel1_0100, /* 2F700..2F7FF */ + FriBidiPropertyBlockLevel1_0100, /* 2F800..2F8FF */ + FriBidiPropertyBlockLevel1_0100, /* 2F900..2F9FF */ + FriBidiPropertyBlockLevel1_0100, /* 2FA00..2FAFF */ + FriBidiPropertyBlockLevel1_0100, /* 2FB00..2FBFF */ + FriBidiPropertyBlockLevel1_0100, /* 2FC00..2FCFF */ + FriBidiPropertyBlockLevel1_0100, /* 2FD00..2FDFF */ + FriBidiPropertyBlockLevel1_0100, /* 2FE00..2FEFF */ + FriBidiPropertyBlockLevel1_0100, /* 2FF00..2FFFF */ + FriBidiPropertyBlockLevel1_0100, /* 30000..300FF */ + FriBidiPropertyBlockLevel1_0100, /* 30100..301FF */ + FriBidiPropertyBlockLevel1_0100, /* 30200..302FF */ + FriBidiPropertyBlockLevel1_0100, /* 30300..303FF */ + FriBidiPropertyBlockLevel1_0100, /* 30400..304FF */ + FriBidiPropertyBlockLevel1_0100, /* 30500..305FF */ + FriBidiPropertyBlockLevel1_0100, /* 30600..306FF */ + FriBidiPropertyBlockLevel1_0100, /* 30700..307FF */ + FriBidiPropertyBlockLevel1_0100, /* 30800..308FF */ + FriBidiPropertyBlockLevel1_0100, /* 30900..309FF */ + FriBidiPropertyBlockLevel1_0100, /* 30A00..30AFF */ + FriBidiPropertyBlockLevel1_0100, /* 30B00..30BFF */ + FriBidiPropertyBlockLevel1_0100, /* 30C00..30CFF */ + FriBidiPropertyBlockLevel1_0100, /* 30D00..30DFF */ + FriBidiPropertyBlockLevel1_0100, /* 30E00..30EFF */ + FriBidiPropertyBlockLevel1_0100, /* 30F00..30FFF */ + FriBidiPropertyBlockLevel1_0100, /* 31000..310FF */ + FriBidiPropertyBlockLevel1_0100, /* 31100..311FF */ + FriBidiPropertyBlockLevel1_0100, /* 31200..312FF */ + FriBidiPropertyBlockLevel1_0100, /* 31300..313FF */ + FriBidiPropertyBlockLevel1_0100, /* 31400..314FF */ + FriBidiPropertyBlockLevel1_0100, /* 31500..315FF */ + FriBidiPropertyBlockLevel1_0100, /* 31600..316FF */ + FriBidiPropertyBlockLevel1_0100, /* 31700..317FF */ + FriBidiPropertyBlockLevel1_0100, /* 31800..318FF */ + FriBidiPropertyBlockLevel1_0100, /* 31900..319FF */ + FriBidiPropertyBlockLevel1_0100, /* 31A00..31AFF */ + FriBidiPropertyBlockLevel1_0100, /* 31B00..31BFF */ + FriBidiPropertyBlockLevel1_0100, /* 31C00..31CFF */ + FriBidiPropertyBlockLevel1_0100, /* 31D00..31DFF */ + FriBidiPropertyBlockLevel1_0100, /* 31E00..31EFF */ + FriBidiPropertyBlockLevel1_0100, /* 31F00..31FFF */ + FriBidiPropertyBlockLevel1_0100, /* 32000..320FF */ + FriBidiPropertyBlockLevel1_0100, /* 32100..321FF */ + FriBidiPropertyBlockLevel1_0100, /* 32200..322FF */ + FriBidiPropertyBlockLevel1_0100, /* 32300..323FF */ + FriBidiPropertyBlockLevel1_0100, /* 32400..324FF */ + FriBidiPropertyBlockLevel1_0100, /* 32500..325FF */ + FriBidiPropertyBlockLevel1_0100, /* 32600..326FF */ + FriBidiPropertyBlockLevel1_0100, /* 32700..327FF */ + FriBidiPropertyBlockLevel1_0100, /* 32800..328FF */ + FriBidiPropertyBlockLevel1_0100, /* 32900..329FF */ + FriBidiPropertyBlockLevel1_0100, /* 32A00..32AFF */ + FriBidiPropertyBlockLevel1_0100, /* 32B00..32BFF */ + FriBidiPropertyBlockLevel1_0100, /* 32C00..32CFF */ + FriBidiPropertyBlockLevel1_0100, /* 32D00..32DFF */ + FriBidiPropertyBlockLevel1_0100, /* 32E00..32EFF */ + FriBidiPropertyBlockLevel1_0100, /* 32F00..32FFF */ + FriBidiPropertyBlockLevel1_0100, /* 33000..330FF */ + FriBidiPropertyBlockLevel1_0100, /* 33100..331FF */ + FriBidiPropertyBlockLevel1_0100, /* 33200..332FF */ + FriBidiPropertyBlockLevel1_0100, /* 33300..333FF */ + FriBidiPropertyBlockLevel1_0100, /* 33400..334FF */ + FriBidiPropertyBlockLevel1_0100, /* 33500..335FF */ + FriBidiPropertyBlockLevel1_0100, /* 33600..336FF */ + FriBidiPropertyBlockLevel1_0100, /* 33700..337FF */ + FriBidiPropertyBlockLevel1_0100, /* 33800..338FF */ + FriBidiPropertyBlockLevel1_0100, /* 33900..339FF */ + FriBidiPropertyBlockLevel1_0100, /* 33A00..33AFF */ + FriBidiPropertyBlockLevel1_0100, /* 33B00..33BFF */ + FriBidiPropertyBlockLevel1_0100, /* 33C00..33CFF */ + FriBidiPropertyBlockLevel1_0100, /* 33D00..33DFF */ + FriBidiPropertyBlockLevel1_0100, /* 33E00..33EFF */ + FriBidiPropertyBlockLevel1_0100, /* 33F00..33FFF */ + FriBidiPropertyBlockLevel1_0100, /* 34000..340FF */ + FriBidiPropertyBlockLevel1_0100, /* 34100..341FF */ + FriBidiPropertyBlockLevel1_0100, /* 34200..342FF */ + FriBidiPropertyBlockLevel1_0100, /* 34300..343FF */ + FriBidiPropertyBlockLevel1_0100, /* 34400..344FF */ + FriBidiPropertyBlockLevel1_0100, /* 34500..345FF */ + FriBidiPropertyBlockLevel1_0100, /* 34600..346FF */ + FriBidiPropertyBlockLevel1_0100, /* 34700..347FF */ + FriBidiPropertyBlockLevel1_0100, /* 34800..348FF */ + FriBidiPropertyBlockLevel1_0100, /* 34900..349FF */ + FriBidiPropertyBlockLevel1_0100, /* 34A00..34AFF */ + FriBidiPropertyBlockLevel1_0100, /* 34B00..34BFF */ + FriBidiPropertyBlockLevel1_0100, /* 34C00..34CFF */ + FriBidiPropertyBlockLevel1_0100, /* 34D00..34DFF */ + FriBidiPropertyBlockLevel1_0100, /* 34E00..34EFF */ + FriBidiPropertyBlockLevel1_0100, /* 34F00..34FFF */ + FriBidiPropertyBlockLevel1_0100, /* 35000..350FF */ + FriBidiPropertyBlockLevel1_0100, /* 35100..351FF */ + FriBidiPropertyBlockLevel1_0100, /* 35200..352FF */ + FriBidiPropertyBlockLevel1_0100, /* 35300..353FF */ + FriBidiPropertyBlockLevel1_0100, /* 35400..354FF */ + FriBidiPropertyBlockLevel1_0100, /* 35500..355FF */ + FriBidiPropertyBlockLevel1_0100, /* 35600..356FF */ + FriBidiPropertyBlockLevel1_0100, /* 35700..357FF */ + FriBidiPropertyBlockLevel1_0100, /* 35800..358FF */ + FriBidiPropertyBlockLevel1_0100, /* 35900..359FF */ + FriBidiPropertyBlockLevel1_0100, /* 35A00..35AFF */ + FriBidiPropertyBlockLevel1_0100, /* 35B00..35BFF */ + FriBidiPropertyBlockLevel1_0100, /* 35C00..35CFF */ + FriBidiPropertyBlockLevel1_0100, /* 35D00..35DFF */ + FriBidiPropertyBlockLevel1_0100, /* 35E00..35EFF */ + FriBidiPropertyBlockLevel1_0100, /* 35F00..35FFF */ + FriBidiPropertyBlockLevel1_0100, /* 36000..360FF */ + FriBidiPropertyBlockLevel1_0100, /* 36100..361FF */ + FriBidiPropertyBlockLevel1_0100, /* 36200..362FF */ + FriBidiPropertyBlockLevel1_0100, /* 36300..363FF */ + FriBidiPropertyBlockLevel1_0100, /* 36400..364FF */ + FriBidiPropertyBlockLevel1_0100, /* 36500..365FF */ + FriBidiPropertyBlockLevel1_0100, /* 36600..366FF */ + FriBidiPropertyBlockLevel1_0100, /* 36700..367FF */ + FriBidiPropertyBlockLevel1_0100, /* 36800..368FF */ + FriBidiPropertyBlockLevel1_0100, /* 36900..369FF */ + FriBidiPropertyBlockLevel1_0100, /* 36A00..36AFF */ + FriBidiPropertyBlockLevel1_0100, /* 36B00..36BFF */ + FriBidiPropertyBlockLevel1_0100, /* 36C00..36CFF */ + FriBidiPropertyBlockLevel1_0100, /* 36D00..36DFF */ + FriBidiPropertyBlockLevel1_0100, /* 36E00..36EFF */ + FriBidiPropertyBlockLevel1_0100, /* 36F00..36FFF */ + FriBidiPropertyBlockLevel1_0100, /* 37000..370FF */ + FriBidiPropertyBlockLevel1_0100, /* 37100..371FF */ + FriBidiPropertyBlockLevel1_0100, /* 37200..372FF */ + FriBidiPropertyBlockLevel1_0100, /* 37300..373FF */ + FriBidiPropertyBlockLevel1_0100, /* 37400..374FF */ + FriBidiPropertyBlockLevel1_0100, /* 37500..375FF */ + FriBidiPropertyBlockLevel1_0100, /* 37600..376FF */ + FriBidiPropertyBlockLevel1_0100, /* 37700..377FF */ + FriBidiPropertyBlockLevel1_0100, /* 37800..378FF */ + FriBidiPropertyBlockLevel1_0100, /* 37900..379FF */ + FriBidiPropertyBlockLevel1_0100, /* 37A00..37AFF */ + FriBidiPropertyBlockLevel1_0100, /* 37B00..37BFF */ + FriBidiPropertyBlockLevel1_0100, /* 37C00..37CFF */ + FriBidiPropertyBlockLevel1_0100, /* 37D00..37DFF */ + FriBidiPropertyBlockLevel1_0100, /* 37E00..37EFF */ + FriBidiPropertyBlockLevel1_0100, /* 37F00..37FFF */ + FriBidiPropertyBlockLevel1_0100, /* 38000..380FF */ + FriBidiPropertyBlockLevel1_0100, /* 38100..381FF */ + FriBidiPropertyBlockLevel1_0100, /* 38200..382FF */ + FriBidiPropertyBlockLevel1_0100, /* 38300..383FF */ + FriBidiPropertyBlockLevel1_0100, /* 38400..384FF */ + FriBidiPropertyBlockLevel1_0100, /* 38500..385FF */ + FriBidiPropertyBlockLevel1_0100, /* 38600..386FF */ + FriBidiPropertyBlockLevel1_0100, /* 38700..387FF */ + FriBidiPropertyBlockLevel1_0100, /* 38800..388FF */ + FriBidiPropertyBlockLevel1_0100, /* 38900..389FF */ + FriBidiPropertyBlockLevel1_0100, /* 38A00..38AFF */ + FriBidiPropertyBlockLevel1_0100, /* 38B00..38BFF */ + FriBidiPropertyBlockLevel1_0100, /* 38C00..38CFF */ + FriBidiPropertyBlockLevel1_0100, /* 38D00..38DFF */ + FriBidiPropertyBlockLevel1_0100, /* 38E00..38EFF */ + FriBidiPropertyBlockLevel1_0100, /* 38F00..38FFF */ + FriBidiPropertyBlockLevel1_0100, /* 39000..390FF */ + FriBidiPropertyBlockLevel1_0100, /* 39100..391FF */ + FriBidiPropertyBlockLevel1_0100, /* 39200..392FF */ + FriBidiPropertyBlockLevel1_0100, /* 39300..393FF */ + FriBidiPropertyBlockLevel1_0100, /* 39400..394FF */ + FriBidiPropertyBlockLevel1_0100, /* 39500..395FF */ + FriBidiPropertyBlockLevel1_0100, /* 39600..396FF */ + FriBidiPropertyBlockLevel1_0100, /* 39700..397FF */ + FriBidiPropertyBlockLevel1_0100, /* 39800..398FF */ + FriBidiPropertyBlockLevel1_0100, /* 39900..399FF */ + FriBidiPropertyBlockLevel1_0100, /* 39A00..39AFF */ + FriBidiPropertyBlockLevel1_0100, /* 39B00..39BFF */ + FriBidiPropertyBlockLevel1_0100, /* 39C00..39CFF */ + FriBidiPropertyBlockLevel1_0100, /* 39D00..39DFF */ + FriBidiPropertyBlockLevel1_0100, /* 39E00..39EFF */ + FriBidiPropertyBlockLevel1_0100, /* 39F00..39FFF */ + FriBidiPropertyBlockLevel1_0100, /* 3A000..3A0FF */ + FriBidiPropertyBlockLevel1_0100, /* 3A100..3A1FF */ + FriBidiPropertyBlockLevel1_0100, /* 3A200..3A2FF */ + FriBidiPropertyBlockLevel1_0100, /* 3A300..3A3FF */ + FriBidiPropertyBlockLevel1_0100, /* 3A400..3A4FF */ + FriBidiPropertyBlockLevel1_0100, /* 3A500..3A5FF */ + FriBidiPropertyBlockLevel1_0100, /* 3A600..3A6FF */ + FriBidiPropertyBlockLevel1_0100, /* 3A700..3A7FF */ + FriBidiPropertyBlockLevel1_0100, /* 3A800..3A8FF */ + FriBidiPropertyBlockLevel1_0100, /* 3A900..3A9FF */ + FriBidiPropertyBlockLevel1_0100, /* 3AA00..3AAFF */ + FriBidiPropertyBlockLevel1_0100, /* 3AB00..3ABFF */ + FriBidiPropertyBlockLevel1_0100, /* 3AC00..3ACFF */ + FriBidiPropertyBlockLevel1_0100, /* 3AD00..3ADFF */ + FriBidiPropertyBlockLevel1_0100, /* 3AE00..3AEFF */ + FriBidiPropertyBlockLevel1_0100, /* 3AF00..3AFFF */ + FriBidiPropertyBlockLevel1_0100, /* 3B000..3B0FF */ + FriBidiPropertyBlockLevel1_0100, /* 3B100..3B1FF */ + FriBidiPropertyBlockLevel1_0100, /* 3B200..3B2FF */ + FriBidiPropertyBlockLevel1_0100, /* 3B300..3B3FF */ + FriBidiPropertyBlockLevel1_0100, /* 3B400..3B4FF */ + FriBidiPropertyBlockLevel1_0100, /* 3B500..3B5FF */ + FriBidiPropertyBlockLevel1_0100, /* 3B600..3B6FF */ + FriBidiPropertyBlockLevel1_0100, /* 3B700..3B7FF */ + FriBidiPropertyBlockLevel1_0100, /* 3B800..3B8FF */ + FriBidiPropertyBlockLevel1_0100, /* 3B900..3B9FF */ + FriBidiPropertyBlockLevel1_0100, /* 3BA00..3BAFF */ + FriBidiPropertyBlockLevel1_0100, /* 3BB00..3BBFF */ + FriBidiPropertyBlockLevel1_0100, /* 3BC00..3BCFF */ + FriBidiPropertyBlockLevel1_0100, /* 3BD00..3BDFF */ + FriBidiPropertyBlockLevel1_0100, /* 3BE00..3BEFF */ + FriBidiPropertyBlockLevel1_0100, /* 3BF00..3BFFF */ + FriBidiPropertyBlockLevel1_0100, /* 3C000..3C0FF */ + FriBidiPropertyBlockLevel1_0100, /* 3C100..3C1FF */ + FriBidiPropertyBlockLevel1_0100, /* 3C200..3C2FF */ + FriBidiPropertyBlockLevel1_0100, /* 3C300..3C3FF */ + FriBidiPropertyBlockLevel1_0100, /* 3C400..3C4FF */ + FriBidiPropertyBlockLevel1_0100, /* 3C500..3C5FF */ + FriBidiPropertyBlockLevel1_0100, /* 3C600..3C6FF */ + FriBidiPropertyBlockLevel1_0100, /* 3C700..3C7FF */ + FriBidiPropertyBlockLevel1_0100, /* 3C800..3C8FF */ + FriBidiPropertyBlockLevel1_0100, /* 3C900..3C9FF */ + FriBidiPropertyBlockLevel1_0100, /* 3CA00..3CAFF */ + FriBidiPropertyBlockLevel1_0100, /* 3CB00..3CBFF */ + FriBidiPropertyBlockLevel1_0100, /* 3CC00..3CCFF */ + FriBidiPropertyBlockLevel1_0100, /* 3CD00..3CDFF */ + FriBidiPropertyBlockLevel1_0100, /* 3CE00..3CEFF */ + FriBidiPropertyBlockLevel1_0100, /* 3CF00..3CFFF */ + FriBidiPropertyBlockLevel1_0100, /* 3D000..3D0FF */ + FriBidiPropertyBlockLevel1_0100, /* 3D100..3D1FF */ + FriBidiPropertyBlockLevel1_0100, /* 3D200..3D2FF */ + FriBidiPropertyBlockLevel1_0100, /* 3D300..3D3FF */ + FriBidiPropertyBlockLevel1_0100, /* 3D400..3D4FF */ + FriBidiPropertyBlockLevel1_0100, /* 3D500..3D5FF */ + FriBidiPropertyBlockLevel1_0100, /* 3D600..3D6FF */ + FriBidiPropertyBlockLevel1_0100, /* 3D700..3D7FF */ + FriBidiPropertyBlockLevel1_0100, /* 3D800..3D8FF */ + FriBidiPropertyBlockLevel1_0100, /* 3D900..3D9FF */ + FriBidiPropertyBlockLevel1_0100, /* 3DA00..3DAFF */ + FriBidiPropertyBlockLevel1_0100, /* 3DB00..3DBFF */ + FriBidiPropertyBlockLevel1_0100, /* 3DC00..3DCFF */ + FriBidiPropertyBlockLevel1_0100, /* 3DD00..3DDFF */ + FriBidiPropertyBlockLevel1_0100, /* 3DE00..3DEFF */ + FriBidiPropertyBlockLevel1_0100, /* 3DF00..3DFFF */ + FriBidiPropertyBlockLevel1_0100, /* 3E000..3E0FF */ + FriBidiPropertyBlockLevel1_0100, /* 3E100..3E1FF */ + FriBidiPropertyBlockLevel1_0100, /* 3E200..3E2FF */ + FriBidiPropertyBlockLevel1_0100, /* 3E300..3E3FF */ + FriBidiPropertyBlockLevel1_0100, /* 3E400..3E4FF */ + FriBidiPropertyBlockLevel1_0100, /* 3E500..3E5FF */ + FriBidiPropertyBlockLevel1_0100, /* 3E600..3E6FF */ + FriBidiPropertyBlockLevel1_0100, /* 3E700..3E7FF */ + FriBidiPropertyBlockLevel1_0100, /* 3E800..3E8FF */ + FriBidiPropertyBlockLevel1_0100, /* 3E900..3E9FF */ + FriBidiPropertyBlockLevel1_0100, /* 3EA00..3EAFF */ + FriBidiPropertyBlockLevel1_0100, /* 3EB00..3EBFF */ + FriBidiPropertyBlockLevel1_0100, /* 3EC00..3ECFF */ + FriBidiPropertyBlockLevel1_0100, /* 3ED00..3EDFF */ + FriBidiPropertyBlockLevel1_0100, /* 3EE00..3EEFF */ + FriBidiPropertyBlockLevel1_0100, /* 3EF00..3EFFF */ + FriBidiPropertyBlockLevel1_0100, /* 3F000..3F0FF */ + FriBidiPropertyBlockLevel1_0100, /* 3F100..3F1FF */ + FriBidiPropertyBlockLevel1_0100, /* 3F200..3F2FF */ + FriBidiPropertyBlockLevel1_0100, /* 3F300..3F3FF */ + FriBidiPropertyBlockLevel1_0100, /* 3F400..3F4FF */ + FriBidiPropertyBlockLevel1_0100, /* 3F500..3F5FF */ + FriBidiPropertyBlockLevel1_0100, /* 3F600..3F6FF */ + FriBidiPropertyBlockLevel1_0100, /* 3F700..3F7FF */ + FriBidiPropertyBlockLevel1_0100, /* 3F800..3F8FF */ + FriBidiPropertyBlockLevel1_0100, /* 3F900..3F9FF */ + FriBidiPropertyBlockLevel1_0100, /* 3FA00..3FAFF */ + FriBidiPropertyBlockLevel1_0100, /* 3FB00..3FBFF */ + FriBidiPropertyBlockLevel1_0100, /* 3FC00..3FCFF */ + FriBidiPropertyBlockLevel1_0100, /* 3FD00..3FDFF */ + FriBidiPropertyBlockLevel1_0100, /* 3FE00..3FEFF */ + FriBidiPropertyBlockLevel1_0100, /* 3FF00..3FFFF */ + FriBidiPropertyBlockLevel1_0100, /* 40000..400FF */ + FriBidiPropertyBlockLevel1_0100, /* 40100..401FF */ + FriBidiPropertyBlockLevel1_0100, /* 40200..402FF */ + FriBidiPropertyBlockLevel1_0100, /* 40300..403FF */ + FriBidiPropertyBlockLevel1_0100, /* 40400..404FF */ + FriBidiPropertyBlockLevel1_0100, /* 40500..405FF */ + FriBidiPropertyBlockLevel1_0100, /* 40600..406FF */ + FriBidiPropertyBlockLevel1_0100, /* 40700..407FF */ + FriBidiPropertyBlockLevel1_0100, /* 40800..408FF */ + FriBidiPropertyBlockLevel1_0100, /* 40900..409FF */ + FriBidiPropertyBlockLevel1_0100, /* 40A00..40AFF */ + FriBidiPropertyBlockLevel1_0100, /* 40B00..40BFF */ + FriBidiPropertyBlockLevel1_0100, /* 40C00..40CFF */ + FriBidiPropertyBlockLevel1_0100, /* 40D00..40DFF */ + FriBidiPropertyBlockLevel1_0100, /* 40E00..40EFF */ + FriBidiPropertyBlockLevel1_0100, /* 40F00..40FFF */ + FriBidiPropertyBlockLevel1_0100, /* 41000..410FF */ + FriBidiPropertyBlockLevel1_0100, /* 41100..411FF */ + FriBidiPropertyBlockLevel1_0100, /* 41200..412FF */ + FriBidiPropertyBlockLevel1_0100, /* 41300..413FF */ + FriBidiPropertyBlockLevel1_0100, /* 41400..414FF */ + FriBidiPropertyBlockLevel1_0100, /* 41500..415FF */ + FriBidiPropertyBlockLevel1_0100, /* 41600..416FF */ + FriBidiPropertyBlockLevel1_0100, /* 41700..417FF */ + FriBidiPropertyBlockLevel1_0100, /* 41800..418FF */ + FriBidiPropertyBlockLevel1_0100, /* 41900..419FF */ + FriBidiPropertyBlockLevel1_0100, /* 41A00..41AFF */ + FriBidiPropertyBlockLevel1_0100, /* 41B00..41BFF */ + FriBidiPropertyBlockLevel1_0100, /* 41C00..41CFF */ + FriBidiPropertyBlockLevel1_0100, /* 41D00..41DFF */ + FriBidiPropertyBlockLevel1_0100, /* 41E00..41EFF */ + FriBidiPropertyBlockLevel1_0100, /* 41F00..41FFF */ + FriBidiPropertyBlockLevel1_0100, /* 42000..420FF */ + FriBidiPropertyBlockLevel1_0100, /* 42100..421FF */ + FriBidiPropertyBlockLevel1_0100, /* 42200..422FF */ + FriBidiPropertyBlockLevel1_0100, /* 42300..423FF */ + FriBidiPropertyBlockLevel1_0100, /* 42400..424FF */ + FriBidiPropertyBlockLevel1_0100, /* 42500..425FF */ + FriBidiPropertyBlockLevel1_0100, /* 42600..426FF */ + FriBidiPropertyBlockLevel1_0100, /* 42700..427FF */ + FriBidiPropertyBlockLevel1_0100, /* 42800..428FF */ + FriBidiPropertyBlockLevel1_0100, /* 42900..429FF */ + FriBidiPropertyBlockLevel1_0100, /* 42A00..42AFF */ + FriBidiPropertyBlockLevel1_0100, /* 42B00..42BFF */ + FriBidiPropertyBlockLevel1_0100, /* 42C00..42CFF */ + FriBidiPropertyBlockLevel1_0100, /* 42D00..42DFF */ + FriBidiPropertyBlockLevel1_0100, /* 42E00..42EFF */ + FriBidiPropertyBlockLevel1_0100, /* 42F00..42FFF */ + FriBidiPropertyBlockLevel1_0100, /* 43000..430FF */ + FriBidiPropertyBlockLevel1_0100, /* 43100..431FF */ + FriBidiPropertyBlockLevel1_0100, /* 43200..432FF */ + FriBidiPropertyBlockLevel1_0100, /* 43300..433FF */ + FriBidiPropertyBlockLevel1_0100, /* 43400..434FF */ + FriBidiPropertyBlockLevel1_0100, /* 43500..435FF */ + FriBidiPropertyBlockLevel1_0100, /* 43600..436FF */ + FriBidiPropertyBlockLevel1_0100, /* 43700..437FF */ + FriBidiPropertyBlockLevel1_0100, /* 43800..438FF */ + FriBidiPropertyBlockLevel1_0100, /* 43900..439FF */ + FriBidiPropertyBlockLevel1_0100, /* 43A00..43AFF */ + FriBidiPropertyBlockLevel1_0100, /* 43B00..43BFF */ + FriBidiPropertyBlockLevel1_0100, /* 43C00..43CFF */ + FriBidiPropertyBlockLevel1_0100, /* 43D00..43DFF */ + FriBidiPropertyBlockLevel1_0100, /* 43E00..43EFF */ + FriBidiPropertyBlockLevel1_0100, /* 43F00..43FFF */ + FriBidiPropertyBlockLevel1_0100, /* 44000..440FF */ + FriBidiPropertyBlockLevel1_0100, /* 44100..441FF */ + FriBidiPropertyBlockLevel1_0100, /* 44200..442FF */ + FriBidiPropertyBlockLevel1_0100, /* 44300..443FF */ + FriBidiPropertyBlockLevel1_0100, /* 44400..444FF */ + FriBidiPropertyBlockLevel1_0100, /* 44500..445FF */ + FriBidiPropertyBlockLevel1_0100, /* 44600..446FF */ + FriBidiPropertyBlockLevel1_0100, /* 44700..447FF */ + FriBidiPropertyBlockLevel1_0100, /* 44800..448FF */ + FriBidiPropertyBlockLevel1_0100, /* 44900..449FF */ + FriBidiPropertyBlockLevel1_0100, /* 44A00..44AFF */ + FriBidiPropertyBlockLevel1_0100, /* 44B00..44BFF */ + FriBidiPropertyBlockLevel1_0100, /* 44C00..44CFF */ + FriBidiPropertyBlockLevel1_0100, /* 44D00..44DFF */ + FriBidiPropertyBlockLevel1_0100, /* 44E00..44EFF */ + FriBidiPropertyBlockLevel1_0100, /* 44F00..44FFF */ + FriBidiPropertyBlockLevel1_0100, /* 45000..450FF */ + FriBidiPropertyBlockLevel1_0100, /* 45100..451FF */ + FriBidiPropertyBlockLevel1_0100, /* 45200..452FF */ + FriBidiPropertyBlockLevel1_0100, /* 45300..453FF */ + FriBidiPropertyBlockLevel1_0100, /* 45400..454FF */ + FriBidiPropertyBlockLevel1_0100, /* 45500..455FF */ + FriBidiPropertyBlockLevel1_0100, /* 45600..456FF */ + FriBidiPropertyBlockLevel1_0100, /* 45700..457FF */ + FriBidiPropertyBlockLevel1_0100, /* 45800..458FF */ + FriBidiPropertyBlockLevel1_0100, /* 45900..459FF */ + FriBidiPropertyBlockLevel1_0100, /* 45A00..45AFF */ + FriBidiPropertyBlockLevel1_0100, /* 45B00..45BFF */ + FriBidiPropertyBlockLevel1_0100, /* 45C00..45CFF */ + FriBidiPropertyBlockLevel1_0100, /* 45D00..45DFF */ + FriBidiPropertyBlockLevel1_0100, /* 45E00..45EFF */ + FriBidiPropertyBlockLevel1_0100, /* 45F00..45FFF */ + FriBidiPropertyBlockLevel1_0100, /* 46000..460FF */ + FriBidiPropertyBlockLevel1_0100, /* 46100..461FF */ + FriBidiPropertyBlockLevel1_0100, /* 46200..462FF */ + FriBidiPropertyBlockLevel1_0100, /* 46300..463FF */ + FriBidiPropertyBlockLevel1_0100, /* 46400..464FF */ + FriBidiPropertyBlockLevel1_0100, /* 46500..465FF */ + FriBidiPropertyBlockLevel1_0100, /* 46600..466FF */ + FriBidiPropertyBlockLevel1_0100, /* 46700..467FF */ + FriBidiPropertyBlockLevel1_0100, /* 46800..468FF */ + FriBidiPropertyBlockLevel1_0100, /* 46900..469FF */ + FriBidiPropertyBlockLevel1_0100, /* 46A00..46AFF */ + FriBidiPropertyBlockLevel1_0100, /* 46B00..46BFF */ + FriBidiPropertyBlockLevel1_0100, /* 46C00..46CFF */ + FriBidiPropertyBlockLevel1_0100, /* 46D00..46DFF */ + FriBidiPropertyBlockLevel1_0100, /* 46E00..46EFF */ + FriBidiPropertyBlockLevel1_0100, /* 46F00..46FFF */ + FriBidiPropertyBlockLevel1_0100, /* 47000..470FF */ + FriBidiPropertyBlockLevel1_0100, /* 47100..471FF */ + FriBidiPropertyBlockLevel1_0100, /* 47200..472FF */ + FriBidiPropertyBlockLevel1_0100, /* 47300..473FF */ + FriBidiPropertyBlockLevel1_0100, /* 47400..474FF */ + FriBidiPropertyBlockLevel1_0100, /* 47500..475FF */ + FriBidiPropertyBlockLevel1_0100, /* 47600..476FF */ + FriBidiPropertyBlockLevel1_0100, /* 47700..477FF */ + FriBidiPropertyBlockLevel1_0100, /* 47800..478FF */ + FriBidiPropertyBlockLevel1_0100, /* 47900..479FF */ + FriBidiPropertyBlockLevel1_0100, /* 47A00..47AFF */ + FriBidiPropertyBlockLevel1_0100, /* 47B00..47BFF */ + FriBidiPropertyBlockLevel1_0100, /* 47C00..47CFF */ + FriBidiPropertyBlockLevel1_0100, /* 47D00..47DFF */ + FriBidiPropertyBlockLevel1_0100, /* 47E00..47EFF */ + FriBidiPropertyBlockLevel1_0100, /* 47F00..47FFF */ + FriBidiPropertyBlockLevel1_0100, /* 48000..480FF */ + FriBidiPropertyBlockLevel1_0100, /* 48100..481FF */ + FriBidiPropertyBlockLevel1_0100, /* 48200..482FF */ + FriBidiPropertyBlockLevel1_0100, /* 48300..483FF */ + FriBidiPropertyBlockLevel1_0100, /* 48400..484FF */ + FriBidiPropertyBlockLevel1_0100, /* 48500..485FF */ + FriBidiPropertyBlockLevel1_0100, /* 48600..486FF */ + FriBidiPropertyBlockLevel1_0100, /* 48700..487FF */ + FriBidiPropertyBlockLevel1_0100, /* 48800..488FF */ + FriBidiPropertyBlockLevel1_0100, /* 48900..489FF */ + FriBidiPropertyBlockLevel1_0100, /* 48A00..48AFF */ + FriBidiPropertyBlockLevel1_0100, /* 48B00..48BFF */ + FriBidiPropertyBlockLevel1_0100, /* 48C00..48CFF */ + FriBidiPropertyBlockLevel1_0100, /* 48D00..48DFF */ + FriBidiPropertyBlockLevel1_0100, /* 48E00..48EFF */ + FriBidiPropertyBlockLevel1_0100, /* 48F00..48FFF */ + FriBidiPropertyBlockLevel1_0100, /* 49000..490FF */ + FriBidiPropertyBlockLevel1_0100, /* 49100..491FF */ + FriBidiPropertyBlockLevel1_0100, /* 49200..492FF */ + FriBidiPropertyBlockLevel1_0100, /* 49300..493FF */ + FriBidiPropertyBlockLevel1_0100, /* 49400..494FF */ + FriBidiPropertyBlockLevel1_0100, /* 49500..495FF */ + FriBidiPropertyBlockLevel1_0100, /* 49600..496FF */ + FriBidiPropertyBlockLevel1_0100, /* 49700..497FF */ + FriBidiPropertyBlockLevel1_0100, /* 49800..498FF */ + FriBidiPropertyBlockLevel1_0100, /* 49900..499FF */ + FriBidiPropertyBlockLevel1_0100, /* 49A00..49AFF */ + FriBidiPropertyBlockLevel1_0100, /* 49B00..49BFF */ + FriBidiPropertyBlockLevel1_0100, /* 49C00..49CFF */ + FriBidiPropertyBlockLevel1_0100, /* 49D00..49DFF */ + FriBidiPropertyBlockLevel1_0100, /* 49E00..49EFF */ + FriBidiPropertyBlockLevel1_0100, /* 49F00..49FFF */ + FriBidiPropertyBlockLevel1_0100, /* 4A000..4A0FF */ + FriBidiPropertyBlockLevel1_0100, /* 4A100..4A1FF */ + FriBidiPropertyBlockLevel1_0100, /* 4A200..4A2FF */ + FriBidiPropertyBlockLevel1_0100, /* 4A300..4A3FF */ + FriBidiPropertyBlockLevel1_0100, /* 4A400..4A4FF */ + FriBidiPropertyBlockLevel1_0100, /* 4A500..4A5FF */ + FriBidiPropertyBlockLevel1_0100, /* 4A600..4A6FF */ + FriBidiPropertyBlockLevel1_0100, /* 4A700..4A7FF */ + FriBidiPropertyBlockLevel1_0100, /* 4A800..4A8FF */ + FriBidiPropertyBlockLevel1_0100, /* 4A900..4A9FF */ + FriBidiPropertyBlockLevel1_0100, /* 4AA00..4AAFF */ + FriBidiPropertyBlockLevel1_0100, /* 4AB00..4ABFF */ + FriBidiPropertyBlockLevel1_0100, /* 4AC00..4ACFF */ + FriBidiPropertyBlockLevel1_0100, /* 4AD00..4ADFF */ + FriBidiPropertyBlockLevel1_0100, /* 4AE00..4AEFF */ + FriBidiPropertyBlockLevel1_0100, /* 4AF00..4AFFF */ + FriBidiPropertyBlockLevel1_0100, /* 4B000..4B0FF */ + FriBidiPropertyBlockLevel1_0100, /* 4B100..4B1FF */ + FriBidiPropertyBlockLevel1_0100, /* 4B200..4B2FF */ + FriBidiPropertyBlockLevel1_0100, /* 4B300..4B3FF */ + FriBidiPropertyBlockLevel1_0100, /* 4B400..4B4FF */ + FriBidiPropertyBlockLevel1_0100, /* 4B500..4B5FF */ + FriBidiPropertyBlockLevel1_0100, /* 4B600..4B6FF */ + FriBidiPropertyBlockLevel1_0100, /* 4B700..4B7FF */ + FriBidiPropertyBlockLevel1_0100, /* 4B800..4B8FF */ + FriBidiPropertyBlockLevel1_0100, /* 4B900..4B9FF */ + FriBidiPropertyBlockLevel1_0100, /* 4BA00..4BAFF */ + FriBidiPropertyBlockLevel1_0100, /* 4BB00..4BBFF */ + FriBidiPropertyBlockLevel1_0100, /* 4BC00..4BCFF */ + FriBidiPropertyBlockLevel1_0100, /* 4BD00..4BDFF */ + FriBidiPropertyBlockLevel1_0100, /* 4BE00..4BEFF */ + FriBidiPropertyBlockLevel1_0100, /* 4BF00..4BFFF */ + FriBidiPropertyBlockLevel1_0100, /* 4C000..4C0FF */ + FriBidiPropertyBlockLevel1_0100, /* 4C100..4C1FF */ + FriBidiPropertyBlockLevel1_0100, /* 4C200..4C2FF */ + FriBidiPropertyBlockLevel1_0100, /* 4C300..4C3FF */ + FriBidiPropertyBlockLevel1_0100, /* 4C400..4C4FF */ + FriBidiPropertyBlockLevel1_0100, /* 4C500..4C5FF */ + FriBidiPropertyBlockLevel1_0100, /* 4C600..4C6FF */ + FriBidiPropertyBlockLevel1_0100, /* 4C700..4C7FF */ + FriBidiPropertyBlockLevel1_0100, /* 4C800..4C8FF */ + FriBidiPropertyBlockLevel1_0100, /* 4C900..4C9FF */ + FriBidiPropertyBlockLevel1_0100, /* 4CA00..4CAFF */ + FriBidiPropertyBlockLevel1_0100, /* 4CB00..4CBFF */ + FriBidiPropertyBlockLevel1_0100, /* 4CC00..4CCFF */ + FriBidiPropertyBlockLevel1_0100, /* 4CD00..4CDFF */ + FriBidiPropertyBlockLevel1_0100, /* 4CE00..4CEFF */ + FriBidiPropertyBlockLevel1_0100, /* 4CF00..4CFFF */ + FriBidiPropertyBlockLevel1_0100, /* 4D000..4D0FF */ + FriBidiPropertyBlockLevel1_0100, /* 4D100..4D1FF */ + FriBidiPropertyBlockLevel1_0100, /* 4D200..4D2FF */ + FriBidiPropertyBlockLevel1_0100, /* 4D300..4D3FF */ + FriBidiPropertyBlockLevel1_0100, /* 4D400..4D4FF */ + FriBidiPropertyBlockLevel1_0100, /* 4D500..4D5FF */ + FriBidiPropertyBlockLevel1_0100, /* 4D600..4D6FF */ + FriBidiPropertyBlockLevel1_0100, /* 4D700..4D7FF */ + FriBidiPropertyBlockLevel1_0100, /* 4D800..4D8FF */ + FriBidiPropertyBlockLevel1_0100, /* 4D900..4D9FF */ + FriBidiPropertyBlockLevel1_0100, /* 4DA00..4DAFF */ + FriBidiPropertyBlockLevel1_0100, /* 4DB00..4DBFF */ + FriBidiPropertyBlockLevel1_0100, /* 4DC00..4DCFF */ + FriBidiPropertyBlockLevel1_0100, /* 4DD00..4DDFF */ + FriBidiPropertyBlockLevel1_0100, /* 4DE00..4DEFF */ + FriBidiPropertyBlockLevel1_0100, /* 4DF00..4DFFF */ + FriBidiPropertyBlockLevel1_0100, /* 4E000..4E0FF */ + FriBidiPropertyBlockLevel1_0100, /* 4E100..4E1FF */ + FriBidiPropertyBlockLevel1_0100, /* 4E200..4E2FF */ + FriBidiPropertyBlockLevel1_0100, /* 4E300..4E3FF */ + FriBidiPropertyBlockLevel1_0100, /* 4E400..4E4FF */ + FriBidiPropertyBlockLevel1_0100, /* 4E500..4E5FF */ + FriBidiPropertyBlockLevel1_0100, /* 4E600..4E6FF */ + FriBidiPropertyBlockLevel1_0100, /* 4E700..4E7FF */ + FriBidiPropertyBlockLevel1_0100, /* 4E800..4E8FF */ + FriBidiPropertyBlockLevel1_0100, /* 4E900..4E9FF */ + FriBidiPropertyBlockLevel1_0100, /* 4EA00..4EAFF */ + FriBidiPropertyBlockLevel1_0100, /* 4EB00..4EBFF */ + FriBidiPropertyBlockLevel1_0100, /* 4EC00..4ECFF */ + FriBidiPropertyBlockLevel1_0100, /* 4ED00..4EDFF */ + FriBidiPropertyBlockLevel1_0100, /* 4EE00..4EEFF */ + FriBidiPropertyBlockLevel1_0100, /* 4EF00..4EFFF */ + FriBidiPropertyBlockLevel1_0100, /* 4F000..4F0FF */ + FriBidiPropertyBlockLevel1_0100, /* 4F100..4F1FF */ + FriBidiPropertyBlockLevel1_0100, /* 4F200..4F2FF */ + FriBidiPropertyBlockLevel1_0100, /* 4F300..4F3FF */ + FriBidiPropertyBlockLevel1_0100, /* 4F400..4F4FF */ + FriBidiPropertyBlockLevel1_0100, /* 4F500..4F5FF */ + FriBidiPropertyBlockLevel1_0100, /* 4F600..4F6FF */ + FriBidiPropertyBlockLevel1_0100, /* 4F700..4F7FF */ + FriBidiPropertyBlockLevel1_0100, /* 4F800..4F8FF */ + FriBidiPropertyBlockLevel1_0100, /* 4F900..4F9FF */ + FriBidiPropertyBlockLevel1_0100, /* 4FA00..4FAFF */ + FriBidiPropertyBlockLevel1_0100, /* 4FB00..4FBFF */ + FriBidiPropertyBlockLevel1_0100, /* 4FC00..4FCFF */ + FriBidiPropertyBlockLevel1_0100, /* 4FD00..4FDFF */ + FriBidiPropertyBlockLevel1_0100, /* 4FE00..4FEFF */ + FriBidiPropertyBlockLevel1_0100, /* 4FF00..4FFFF */ + FriBidiPropertyBlockLevel1_0100, /* 50000..500FF */ + FriBidiPropertyBlockLevel1_0100, /* 50100..501FF */ + FriBidiPropertyBlockLevel1_0100, /* 50200..502FF */ + FriBidiPropertyBlockLevel1_0100, /* 50300..503FF */ + FriBidiPropertyBlockLevel1_0100, /* 50400..504FF */ + FriBidiPropertyBlockLevel1_0100, /* 50500..505FF */ + FriBidiPropertyBlockLevel1_0100, /* 50600..506FF */ + FriBidiPropertyBlockLevel1_0100, /* 50700..507FF */ + FriBidiPropertyBlockLevel1_0100, /* 50800..508FF */ + FriBidiPropertyBlockLevel1_0100, /* 50900..509FF */ + FriBidiPropertyBlockLevel1_0100, /* 50A00..50AFF */ + FriBidiPropertyBlockLevel1_0100, /* 50B00..50BFF */ + FriBidiPropertyBlockLevel1_0100, /* 50C00..50CFF */ + FriBidiPropertyBlockLevel1_0100, /* 50D00..50DFF */ + FriBidiPropertyBlockLevel1_0100, /* 50E00..50EFF */ + FriBidiPropertyBlockLevel1_0100, /* 50F00..50FFF */ + FriBidiPropertyBlockLevel1_0100, /* 51000..510FF */ + FriBidiPropertyBlockLevel1_0100, /* 51100..511FF */ + FriBidiPropertyBlockLevel1_0100, /* 51200..512FF */ + FriBidiPropertyBlockLevel1_0100, /* 51300..513FF */ + FriBidiPropertyBlockLevel1_0100, /* 51400..514FF */ + FriBidiPropertyBlockLevel1_0100, /* 51500..515FF */ + FriBidiPropertyBlockLevel1_0100, /* 51600..516FF */ + FriBidiPropertyBlockLevel1_0100, /* 51700..517FF */ + FriBidiPropertyBlockLevel1_0100, /* 51800..518FF */ + FriBidiPropertyBlockLevel1_0100, /* 51900..519FF */ + FriBidiPropertyBlockLevel1_0100, /* 51A00..51AFF */ + FriBidiPropertyBlockLevel1_0100, /* 51B00..51BFF */ + FriBidiPropertyBlockLevel1_0100, /* 51C00..51CFF */ + FriBidiPropertyBlockLevel1_0100, /* 51D00..51DFF */ + FriBidiPropertyBlockLevel1_0100, /* 51E00..51EFF */ + FriBidiPropertyBlockLevel1_0100, /* 51F00..51FFF */ + FriBidiPropertyBlockLevel1_0100, /* 52000..520FF */ + FriBidiPropertyBlockLevel1_0100, /* 52100..521FF */ + FriBidiPropertyBlockLevel1_0100, /* 52200..522FF */ + FriBidiPropertyBlockLevel1_0100, /* 52300..523FF */ + FriBidiPropertyBlockLevel1_0100, /* 52400..524FF */ + FriBidiPropertyBlockLevel1_0100, /* 52500..525FF */ + FriBidiPropertyBlockLevel1_0100, /* 52600..526FF */ + FriBidiPropertyBlockLevel1_0100, /* 52700..527FF */ + FriBidiPropertyBlockLevel1_0100, /* 52800..528FF */ + FriBidiPropertyBlockLevel1_0100, /* 52900..529FF */ + FriBidiPropertyBlockLevel1_0100, /* 52A00..52AFF */ + FriBidiPropertyBlockLevel1_0100, /* 52B00..52BFF */ + FriBidiPropertyBlockLevel1_0100, /* 52C00..52CFF */ + FriBidiPropertyBlockLevel1_0100, /* 52D00..52DFF */ + FriBidiPropertyBlockLevel1_0100, /* 52E00..52EFF */ + FriBidiPropertyBlockLevel1_0100, /* 52F00..52FFF */ + FriBidiPropertyBlockLevel1_0100, /* 53000..530FF */ + FriBidiPropertyBlockLevel1_0100, /* 53100..531FF */ + FriBidiPropertyBlockLevel1_0100, /* 53200..532FF */ + FriBidiPropertyBlockLevel1_0100, /* 53300..533FF */ + FriBidiPropertyBlockLevel1_0100, /* 53400..534FF */ + FriBidiPropertyBlockLevel1_0100, /* 53500..535FF */ + FriBidiPropertyBlockLevel1_0100, /* 53600..536FF */ + FriBidiPropertyBlockLevel1_0100, /* 53700..537FF */ + FriBidiPropertyBlockLevel1_0100, /* 53800..538FF */ + FriBidiPropertyBlockLevel1_0100, /* 53900..539FF */ + FriBidiPropertyBlockLevel1_0100, /* 53A00..53AFF */ + FriBidiPropertyBlockLevel1_0100, /* 53B00..53BFF */ + FriBidiPropertyBlockLevel1_0100, /* 53C00..53CFF */ + FriBidiPropertyBlockLevel1_0100, /* 53D00..53DFF */ + FriBidiPropertyBlockLevel1_0100, /* 53E00..53EFF */ + FriBidiPropertyBlockLevel1_0100, /* 53F00..53FFF */ + FriBidiPropertyBlockLevel1_0100, /* 54000..540FF */ + FriBidiPropertyBlockLevel1_0100, /* 54100..541FF */ + FriBidiPropertyBlockLevel1_0100, /* 54200..542FF */ + FriBidiPropertyBlockLevel1_0100, /* 54300..543FF */ + FriBidiPropertyBlockLevel1_0100, /* 54400..544FF */ + FriBidiPropertyBlockLevel1_0100, /* 54500..545FF */ + FriBidiPropertyBlockLevel1_0100, /* 54600..546FF */ + FriBidiPropertyBlockLevel1_0100, /* 54700..547FF */ + FriBidiPropertyBlockLevel1_0100, /* 54800..548FF */ + FriBidiPropertyBlockLevel1_0100, /* 54900..549FF */ + FriBidiPropertyBlockLevel1_0100, /* 54A00..54AFF */ + FriBidiPropertyBlockLevel1_0100, /* 54B00..54BFF */ + FriBidiPropertyBlockLevel1_0100, /* 54C00..54CFF */ + FriBidiPropertyBlockLevel1_0100, /* 54D00..54DFF */ + FriBidiPropertyBlockLevel1_0100, /* 54E00..54EFF */ + FriBidiPropertyBlockLevel1_0100, /* 54F00..54FFF */ + FriBidiPropertyBlockLevel1_0100, /* 55000..550FF */ + FriBidiPropertyBlockLevel1_0100, /* 55100..551FF */ + FriBidiPropertyBlockLevel1_0100, /* 55200..552FF */ + FriBidiPropertyBlockLevel1_0100, /* 55300..553FF */ + FriBidiPropertyBlockLevel1_0100, /* 55400..554FF */ + FriBidiPropertyBlockLevel1_0100, /* 55500..555FF */ + FriBidiPropertyBlockLevel1_0100, /* 55600..556FF */ + FriBidiPropertyBlockLevel1_0100, /* 55700..557FF */ + FriBidiPropertyBlockLevel1_0100, /* 55800..558FF */ + FriBidiPropertyBlockLevel1_0100, /* 55900..559FF */ + FriBidiPropertyBlockLevel1_0100, /* 55A00..55AFF */ + FriBidiPropertyBlockLevel1_0100, /* 55B00..55BFF */ + FriBidiPropertyBlockLevel1_0100, /* 55C00..55CFF */ + FriBidiPropertyBlockLevel1_0100, /* 55D00..55DFF */ + FriBidiPropertyBlockLevel1_0100, /* 55E00..55EFF */ + FriBidiPropertyBlockLevel1_0100, /* 55F00..55FFF */ + FriBidiPropertyBlockLevel1_0100, /* 56000..560FF */ + FriBidiPropertyBlockLevel1_0100, /* 56100..561FF */ + FriBidiPropertyBlockLevel1_0100, /* 56200..562FF */ + FriBidiPropertyBlockLevel1_0100, /* 56300..563FF */ + FriBidiPropertyBlockLevel1_0100, /* 56400..564FF */ + FriBidiPropertyBlockLevel1_0100, /* 56500..565FF */ + FriBidiPropertyBlockLevel1_0100, /* 56600..566FF */ + FriBidiPropertyBlockLevel1_0100, /* 56700..567FF */ + FriBidiPropertyBlockLevel1_0100, /* 56800..568FF */ + FriBidiPropertyBlockLevel1_0100, /* 56900..569FF */ + FriBidiPropertyBlockLevel1_0100, /* 56A00..56AFF */ + FriBidiPropertyBlockLevel1_0100, /* 56B00..56BFF */ + FriBidiPropertyBlockLevel1_0100, /* 56C00..56CFF */ + FriBidiPropertyBlockLevel1_0100, /* 56D00..56DFF */ + FriBidiPropertyBlockLevel1_0100, /* 56E00..56EFF */ + FriBidiPropertyBlockLevel1_0100, /* 56F00..56FFF */ + FriBidiPropertyBlockLevel1_0100, /* 57000..570FF */ + FriBidiPropertyBlockLevel1_0100, /* 57100..571FF */ + FriBidiPropertyBlockLevel1_0100, /* 57200..572FF */ + FriBidiPropertyBlockLevel1_0100, /* 57300..573FF */ + FriBidiPropertyBlockLevel1_0100, /* 57400..574FF */ + FriBidiPropertyBlockLevel1_0100, /* 57500..575FF */ + FriBidiPropertyBlockLevel1_0100, /* 57600..576FF */ + FriBidiPropertyBlockLevel1_0100, /* 57700..577FF */ + FriBidiPropertyBlockLevel1_0100, /* 57800..578FF */ + FriBidiPropertyBlockLevel1_0100, /* 57900..579FF */ + FriBidiPropertyBlockLevel1_0100, /* 57A00..57AFF */ + FriBidiPropertyBlockLevel1_0100, /* 57B00..57BFF */ + FriBidiPropertyBlockLevel1_0100, /* 57C00..57CFF */ + FriBidiPropertyBlockLevel1_0100, /* 57D00..57DFF */ + FriBidiPropertyBlockLevel1_0100, /* 57E00..57EFF */ + FriBidiPropertyBlockLevel1_0100, /* 57F00..57FFF */ + FriBidiPropertyBlockLevel1_0100, /* 58000..580FF */ + FriBidiPropertyBlockLevel1_0100, /* 58100..581FF */ + FriBidiPropertyBlockLevel1_0100, /* 58200..582FF */ + FriBidiPropertyBlockLevel1_0100, /* 58300..583FF */ + FriBidiPropertyBlockLevel1_0100, /* 58400..584FF */ + FriBidiPropertyBlockLevel1_0100, /* 58500..585FF */ + FriBidiPropertyBlockLevel1_0100, /* 58600..586FF */ + FriBidiPropertyBlockLevel1_0100, /* 58700..587FF */ + FriBidiPropertyBlockLevel1_0100, /* 58800..588FF */ + FriBidiPropertyBlockLevel1_0100, /* 58900..589FF */ + FriBidiPropertyBlockLevel1_0100, /* 58A00..58AFF */ + FriBidiPropertyBlockLevel1_0100, /* 58B00..58BFF */ + FriBidiPropertyBlockLevel1_0100, /* 58C00..58CFF */ + FriBidiPropertyBlockLevel1_0100, /* 58D00..58DFF */ + FriBidiPropertyBlockLevel1_0100, /* 58E00..58EFF */ + FriBidiPropertyBlockLevel1_0100, /* 58F00..58FFF */ + FriBidiPropertyBlockLevel1_0100, /* 59000..590FF */ + FriBidiPropertyBlockLevel1_0100, /* 59100..591FF */ + FriBidiPropertyBlockLevel1_0100, /* 59200..592FF */ + FriBidiPropertyBlockLevel1_0100, /* 59300..593FF */ + FriBidiPropertyBlockLevel1_0100, /* 59400..594FF */ + FriBidiPropertyBlockLevel1_0100, /* 59500..595FF */ + FriBidiPropertyBlockLevel1_0100, /* 59600..596FF */ + FriBidiPropertyBlockLevel1_0100, /* 59700..597FF */ + FriBidiPropertyBlockLevel1_0100, /* 59800..598FF */ + FriBidiPropertyBlockLevel1_0100, /* 59900..599FF */ + FriBidiPropertyBlockLevel1_0100, /* 59A00..59AFF */ + FriBidiPropertyBlockLevel1_0100, /* 59B00..59BFF */ + FriBidiPropertyBlockLevel1_0100, /* 59C00..59CFF */ + FriBidiPropertyBlockLevel1_0100, /* 59D00..59DFF */ + FriBidiPropertyBlockLevel1_0100, /* 59E00..59EFF */ + FriBidiPropertyBlockLevel1_0100, /* 59F00..59FFF */ + FriBidiPropertyBlockLevel1_0100, /* 5A000..5A0FF */ + FriBidiPropertyBlockLevel1_0100, /* 5A100..5A1FF */ + FriBidiPropertyBlockLevel1_0100, /* 5A200..5A2FF */ + FriBidiPropertyBlockLevel1_0100, /* 5A300..5A3FF */ + FriBidiPropertyBlockLevel1_0100, /* 5A400..5A4FF */ + FriBidiPropertyBlockLevel1_0100, /* 5A500..5A5FF */ + FriBidiPropertyBlockLevel1_0100, /* 5A600..5A6FF */ + FriBidiPropertyBlockLevel1_0100, /* 5A700..5A7FF */ + FriBidiPropertyBlockLevel1_0100, /* 5A800..5A8FF */ + FriBidiPropertyBlockLevel1_0100, /* 5A900..5A9FF */ + FriBidiPropertyBlockLevel1_0100, /* 5AA00..5AAFF */ + FriBidiPropertyBlockLevel1_0100, /* 5AB00..5ABFF */ + FriBidiPropertyBlockLevel1_0100, /* 5AC00..5ACFF */ + FriBidiPropertyBlockLevel1_0100, /* 5AD00..5ADFF */ + FriBidiPropertyBlockLevel1_0100, /* 5AE00..5AEFF */ + FriBidiPropertyBlockLevel1_0100, /* 5AF00..5AFFF */ + FriBidiPropertyBlockLevel1_0100, /* 5B000..5B0FF */ + FriBidiPropertyBlockLevel1_0100, /* 5B100..5B1FF */ + FriBidiPropertyBlockLevel1_0100, /* 5B200..5B2FF */ + FriBidiPropertyBlockLevel1_0100, /* 5B300..5B3FF */ + FriBidiPropertyBlockLevel1_0100, /* 5B400..5B4FF */ + FriBidiPropertyBlockLevel1_0100, /* 5B500..5B5FF */ + FriBidiPropertyBlockLevel1_0100, /* 5B600..5B6FF */ + FriBidiPropertyBlockLevel1_0100, /* 5B700..5B7FF */ + FriBidiPropertyBlockLevel1_0100, /* 5B800..5B8FF */ + FriBidiPropertyBlockLevel1_0100, /* 5B900..5B9FF */ + FriBidiPropertyBlockLevel1_0100, /* 5BA00..5BAFF */ + FriBidiPropertyBlockLevel1_0100, /* 5BB00..5BBFF */ + FriBidiPropertyBlockLevel1_0100, /* 5BC00..5BCFF */ + FriBidiPropertyBlockLevel1_0100, /* 5BD00..5BDFF */ + FriBidiPropertyBlockLevel1_0100, /* 5BE00..5BEFF */ + FriBidiPropertyBlockLevel1_0100, /* 5BF00..5BFFF */ + FriBidiPropertyBlockLevel1_0100, /* 5C000..5C0FF */ + FriBidiPropertyBlockLevel1_0100, /* 5C100..5C1FF */ + FriBidiPropertyBlockLevel1_0100, /* 5C200..5C2FF */ + FriBidiPropertyBlockLevel1_0100, /* 5C300..5C3FF */ + FriBidiPropertyBlockLevel1_0100, /* 5C400..5C4FF */ + FriBidiPropertyBlockLevel1_0100, /* 5C500..5C5FF */ + FriBidiPropertyBlockLevel1_0100, /* 5C600..5C6FF */ + FriBidiPropertyBlockLevel1_0100, /* 5C700..5C7FF */ + FriBidiPropertyBlockLevel1_0100, /* 5C800..5C8FF */ + FriBidiPropertyBlockLevel1_0100, /* 5C900..5C9FF */ + FriBidiPropertyBlockLevel1_0100, /* 5CA00..5CAFF */ + FriBidiPropertyBlockLevel1_0100, /* 5CB00..5CBFF */ + FriBidiPropertyBlockLevel1_0100, /* 5CC00..5CCFF */ + FriBidiPropertyBlockLevel1_0100, /* 5CD00..5CDFF */ + FriBidiPropertyBlockLevel1_0100, /* 5CE00..5CEFF */ + FriBidiPropertyBlockLevel1_0100, /* 5CF00..5CFFF */ + FriBidiPropertyBlockLevel1_0100, /* 5D000..5D0FF */ + FriBidiPropertyBlockLevel1_0100, /* 5D100..5D1FF */ + FriBidiPropertyBlockLevel1_0100, /* 5D200..5D2FF */ + FriBidiPropertyBlockLevel1_0100, /* 5D300..5D3FF */ + FriBidiPropertyBlockLevel1_0100, /* 5D400..5D4FF */ + FriBidiPropertyBlockLevel1_0100, /* 5D500..5D5FF */ + FriBidiPropertyBlockLevel1_0100, /* 5D600..5D6FF */ + FriBidiPropertyBlockLevel1_0100, /* 5D700..5D7FF */ + FriBidiPropertyBlockLevel1_0100, /* 5D800..5D8FF */ + FriBidiPropertyBlockLevel1_0100, /* 5D900..5D9FF */ + FriBidiPropertyBlockLevel1_0100, /* 5DA00..5DAFF */ + FriBidiPropertyBlockLevel1_0100, /* 5DB00..5DBFF */ + FriBidiPropertyBlockLevel1_0100, /* 5DC00..5DCFF */ + FriBidiPropertyBlockLevel1_0100, /* 5DD00..5DDFF */ + FriBidiPropertyBlockLevel1_0100, /* 5DE00..5DEFF */ + FriBidiPropertyBlockLevel1_0100, /* 5DF00..5DFFF */ + FriBidiPropertyBlockLevel1_0100, /* 5E000..5E0FF */ + FriBidiPropertyBlockLevel1_0100, /* 5E100..5E1FF */ + FriBidiPropertyBlockLevel1_0100, /* 5E200..5E2FF */ + FriBidiPropertyBlockLevel1_0100, /* 5E300..5E3FF */ + FriBidiPropertyBlockLevel1_0100, /* 5E400..5E4FF */ + FriBidiPropertyBlockLevel1_0100, /* 5E500..5E5FF */ + FriBidiPropertyBlockLevel1_0100, /* 5E600..5E6FF */ + FriBidiPropertyBlockLevel1_0100, /* 5E700..5E7FF */ + FriBidiPropertyBlockLevel1_0100, /* 5E800..5E8FF */ + FriBidiPropertyBlockLevel1_0100, /* 5E900..5E9FF */ + FriBidiPropertyBlockLevel1_0100, /* 5EA00..5EAFF */ + FriBidiPropertyBlockLevel1_0100, /* 5EB00..5EBFF */ + FriBidiPropertyBlockLevel1_0100, /* 5EC00..5ECFF */ + FriBidiPropertyBlockLevel1_0100, /* 5ED00..5EDFF */ + FriBidiPropertyBlockLevel1_0100, /* 5EE00..5EEFF */ + FriBidiPropertyBlockLevel1_0100, /* 5EF00..5EFFF */ + FriBidiPropertyBlockLevel1_0100, /* 5F000..5F0FF */ + FriBidiPropertyBlockLevel1_0100, /* 5F100..5F1FF */ + FriBidiPropertyBlockLevel1_0100, /* 5F200..5F2FF */ + FriBidiPropertyBlockLevel1_0100, /* 5F300..5F3FF */ + FriBidiPropertyBlockLevel1_0100, /* 5F400..5F4FF */ + FriBidiPropertyBlockLevel1_0100, /* 5F500..5F5FF */ + FriBidiPropertyBlockLevel1_0100, /* 5F600..5F6FF */ + FriBidiPropertyBlockLevel1_0100, /* 5F700..5F7FF */ + FriBidiPropertyBlockLevel1_0100, /* 5F800..5F8FF */ + FriBidiPropertyBlockLevel1_0100, /* 5F900..5F9FF */ + FriBidiPropertyBlockLevel1_0100, /* 5FA00..5FAFF */ + FriBidiPropertyBlockLevel1_0100, /* 5FB00..5FBFF */ + FriBidiPropertyBlockLevel1_0100, /* 5FC00..5FCFF */ + FriBidiPropertyBlockLevel1_0100, /* 5FD00..5FDFF */ + FriBidiPropertyBlockLevel1_0100, /* 5FE00..5FEFF */ + FriBidiPropertyBlockLevel1_0100, /* 5FF00..5FFFF */ + FriBidiPropertyBlockLevel1_0100, /* 60000..600FF */ + FriBidiPropertyBlockLevel1_0100, /* 60100..601FF */ + FriBidiPropertyBlockLevel1_0100, /* 60200..602FF */ + FriBidiPropertyBlockLevel1_0100, /* 60300..603FF */ + FriBidiPropertyBlockLevel1_0100, /* 60400..604FF */ + FriBidiPropertyBlockLevel1_0100, /* 60500..605FF */ + FriBidiPropertyBlockLevel1_0100, /* 60600..606FF */ + FriBidiPropertyBlockLevel1_0100, /* 60700..607FF */ + FriBidiPropertyBlockLevel1_0100, /* 60800..608FF */ + FriBidiPropertyBlockLevel1_0100, /* 60900..609FF */ + FriBidiPropertyBlockLevel1_0100, /* 60A00..60AFF */ + FriBidiPropertyBlockLevel1_0100, /* 60B00..60BFF */ + FriBidiPropertyBlockLevel1_0100, /* 60C00..60CFF */ + FriBidiPropertyBlockLevel1_0100, /* 60D00..60DFF */ + FriBidiPropertyBlockLevel1_0100, /* 60E00..60EFF */ + FriBidiPropertyBlockLevel1_0100, /* 60F00..60FFF */ + FriBidiPropertyBlockLevel1_0100, /* 61000..610FF */ + FriBidiPropertyBlockLevel1_0100, /* 61100..611FF */ + FriBidiPropertyBlockLevel1_0100, /* 61200..612FF */ + FriBidiPropertyBlockLevel1_0100, /* 61300..613FF */ + FriBidiPropertyBlockLevel1_0100, /* 61400..614FF */ + FriBidiPropertyBlockLevel1_0100, /* 61500..615FF */ + FriBidiPropertyBlockLevel1_0100, /* 61600..616FF */ + FriBidiPropertyBlockLevel1_0100, /* 61700..617FF */ + FriBidiPropertyBlockLevel1_0100, /* 61800..618FF */ + FriBidiPropertyBlockLevel1_0100, /* 61900..619FF */ + FriBidiPropertyBlockLevel1_0100, /* 61A00..61AFF */ + FriBidiPropertyBlockLevel1_0100, /* 61B00..61BFF */ + FriBidiPropertyBlockLevel1_0100, /* 61C00..61CFF */ + FriBidiPropertyBlockLevel1_0100, /* 61D00..61DFF */ + FriBidiPropertyBlockLevel1_0100, /* 61E00..61EFF */ + FriBidiPropertyBlockLevel1_0100, /* 61F00..61FFF */ + FriBidiPropertyBlockLevel1_0100, /* 62000..620FF */ + FriBidiPropertyBlockLevel1_0100, /* 62100..621FF */ + FriBidiPropertyBlockLevel1_0100, /* 62200..622FF */ + FriBidiPropertyBlockLevel1_0100, /* 62300..623FF */ + FriBidiPropertyBlockLevel1_0100, /* 62400..624FF */ + FriBidiPropertyBlockLevel1_0100, /* 62500..625FF */ + FriBidiPropertyBlockLevel1_0100, /* 62600..626FF */ + FriBidiPropertyBlockLevel1_0100, /* 62700..627FF */ + FriBidiPropertyBlockLevel1_0100, /* 62800..628FF */ + FriBidiPropertyBlockLevel1_0100, /* 62900..629FF */ + FriBidiPropertyBlockLevel1_0100, /* 62A00..62AFF */ + FriBidiPropertyBlockLevel1_0100, /* 62B00..62BFF */ + FriBidiPropertyBlockLevel1_0100, /* 62C00..62CFF */ + FriBidiPropertyBlockLevel1_0100, /* 62D00..62DFF */ + FriBidiPropertyBlockLevel1_0100, /* 62E00..62EFF */ + FriBidiPropertyBlockLevel1_0100, /* 62F00..62FFF */ + FriBidiPropertyBlockLevel1_0100, /* 63000..630FF */ + FriBidiPropertyBlockLevel1_0100, /* 63100..631FF */ + FriBidiPropertyBlockLevel1_0100, /* 63200..632FF */ + FriBidiPropertyBlockLevel1_0100, /* 63300..633FF */ + FriBidiPropertyBlockLevel1_0100, /* 63400..634FF */ + FriBidiPropertyBlockLevel1_0100, /* 63500..635FF */ + FriBidiPropertyBlockLevel1_0100, /* 63600..636FF */ + FriBidiPropertyBlockLevel1_0100, /* 63700..637FF */ + FriBidiPropertyBlockLevel1_0100, /* 63800..638FF */ + FriBidiPropertyBlockLevel1_0100, /* 63900..639FF */ + FriBidiPropertyBlockLevel1_0100, /* 63A00..63AFF */ + FriBidiPropertyBlockLevel1_0100, /* 63B00..63BFF */ + FriBidiPropertyBlockLevel1_0100, /* 63C00..63CFF */ + FriBidiPropertyBlockLevel1_0100, /* 63D00..63DFF */ + FriBidiPropertyBlockLevel1_0100, /* 63E00..63EFF */ + FriBidiPropertyBlockLevel1_0100, /* 63F00..63FFF */ + FriBidiPropertyBlockLevel1_0100, /* 64000..640FF */ + FriBidiPropertyBlockLevel1_0100, /* 64100..641FF */ + FriBidiPropertyBlockLevel1_0100, /* 64200..642FF */ + FriBidiPropertyBlockLevel1_0100, /* 64300..643FF */ + FriBidiPropertyBlockLevel1_0100, /* 64400..644FF */ + FriBidiPropertyBlockLevel1_0100, /* 64500..645FF */ + FriBidiPropertyBlockLevel1_0100, /* 64600..646FF */ + FriBidiPropertyBlockLevel1_0100, /* 64700..647FF */ + FriBidiPropertyBlockLevel1_0100, /* 64800..648FF */ + FriBidiPropertyBlockLevel1_0100, /* 64900..649FF */ + FriBidiPropertyBlockLevel1_0100, /* 64A00..64AFF */ + FriBidiPropertyBlockLevel1_0100, /* 64B00..64BFF */ + FriBidiPropertyBlockLevel1_0100, /* 64C00..64CFF */ + FriBidiPropertyBlockLevel1_0100, /* 64D00..64DFF */ + FriBidiPropertyBlockLevel1_0100, /* 64E00..64EFF */ + FriBidiPropertyBlockLevel1_0100, /* 64F00..64FFF */ + FriBidiPropertyBlockLevel1_0100, /* 65000..650FF */ + FriBidiPropertyBlockLevel1_0100, /* 65100..651FF */ + FriBidiPropertyBlockLevel1_0100, /* 65200..652FF */ + FriBidiPropertyBlockLevel1_0100, /* 65300..653FF */ + FriBidiPropertyBlockLevel1_0100, /* 65400..654FF */ + FriBidiPropertyBlockLevel1_0100, /* 65500..655FF */ + FriBidiPropertyBlockLevel1_0100, /* 65600..656FF */ + FriBidiPropertyBlockLevel1_0100, /* 65700..657FF */ + FriBidiPropertyBlockLevel1_0100, /* 65800..658FF */ + FriBidiPropertyBlockLevel1_0100, /* 65900..659FF */ + FriBidiPropertyBlockLevel1_0100, /* 65A00..65AFF */ + FriBidiPropertyBlockLevel1_0100, /* 65B00..65BFF */ + FriBidiPropertyBlockLevel1_0100, /* 65C00..65CFF */ + FriBidiPropertyBlockLevel1_0100, /* 65D00..65DFF */ + FriBidiPropertyBlockLevel1_0100, /* 65E00..65EFF */ + FriBidiPropertyBlockLevel1_0100, /* 65F00..65FFF */ + FriBidiPropertyBlockLevel1_0100, /* 66000..660FF */ + FriBidiPropertyBlockLevel1_0100, /* 66100..661FF */ + FriBidiPropertyBlockLevel1_0100, /* 66200..662FF */ + FriBidiPropertyBlockLevel1_0100, /* 66300..663FF */ + FriBidiPropertyBlockLevel1_0100, /* 66400..664FF */ + FriBidiPropertyBlockLevel1_0100, /* 66500..665FF */ + FriBidiPropertyBlockLevel1_0100, /* 66600..666FF */ + FriBidiPropertyBlockLevel1_0100, /* 66700..667FF */ + FriBidiPropertyBlockLevel1_0100, /* 66800..668FF */ + FriBidiPropertyBlockLevel1_0100, /* 66900..669FF */ + FriBidiPropertyBlockLevel1_0100, /* 66A00..66AFF */ + FriBidiPropertyBlockLevel1_0100, /* 66B00..66BFF */ + FriBidiPropertyBlockLevel1_0100, /* 66C00..66CFF */ + FriBidiPropertyBlockLevel1_0100, /* 66D00..66DFF */ + FriBidiPropertyBlockLevel1_0100, /* 66E00..66EFF */ + FriBidiPropertyBlockLevel1_0100, /* 66F00..66FFF */ + FriBidiPropertyBlockLevel1_0100, /* 67000..670FF */ + FriBidiPropertyBlockLevel1_0100, /* 67100..671FF */ + FriBidiPropertyBlockLevel1_0100, /* 67200..672FF */ + FriBidiPropertyBlockLevel1_0100, /* 67300..673FF */ + FriBidiPropertyBlockLevel1_0100, /* 67400..674FF */ + FriBidiPropertyBlockLevel1_0100, /* 67500..675FF */ + FriBidiPropertyBlockLevel1_0100, /* 67600..676FF */ + FriBidiPropertyBlockLevel1_0100, /* 67700..677FF */ + FriBidiPropertyBlockLevel1_0100, /* 67800..678FF */ + FriBidiPropertyBlockLevel1_0100, /* 67900..679FF */ + FriBidiPropertyBlockLevel1_0100, /* 67A00..67AFF */ + FriBidiPropertyBlockLevel1_0100, /* 67B00..67BFF */ + FriBidiPropertyBlockLevel1_0100, /* 67C00..67CFF */ + FriBidiPropertyBlockLevel1_0100, /* 67D00..67DFF */ + FriBidiPropertyBlockLevel1_0100, /* 67E00..67EFF */ + FriBidiPropertyBlockLevel1_0100, /* 67F00..67FFF */ + FriBidiPropertyBlockLevel1_0100, /* 68000..680FF */ + FriBidiPropertyBlockLevel1_0100, /* 68100..681FF */ + FriBidiPropertyBlockLevel1_0100, /* 68200..682FF */ + FriBidiPropertyBlockLevel1_0100, /* 68300..683FF */ + FriBidiPropertyBlockLevel1_0100, /* 68400..684FF */ + FriBidiPropertyBlockLevel1_0100, /* 68500..685FF */ + FriBidiPropertyBlockLevel1_0100, /* 68600..686FF */ + FriBidiPropertyBlockLevel1_0100, /* 68700..687FF */ + FriBidiPropertyBlockLevel1_0100, /* 68800..688FF */ + FriBidiPropertyBlockLevel1_0100, /* 68900..689FF */ + FriBidiPropertyBlockLevel1_0100, /* 68A00..68AFF */ + FriBidiPropertyBlockLevel1_0100, /* 68B00..68BFF */ + FriBidiPropertyBlockLevel1_0100, /* 68C00..68CFF */ + FriBidiPropertyBlockLevel1_0100, /* 68D00..68DFF */ + FriBidiPropertyBlockLevel1_0100, /* 68E00..68EFF */ + FriBidiPropertyBlockLevel1_0100, /* 68F00..68FFF */ + FriBidiPropertyBlockLevel1_0100, /* 69000..690FF */ + FriBidiPropertyBlockLevel1_0100, /* 69100..691FF */ + FriBidiPropertyBlockLevel1_0100, /* 69200..692FF */ + FriBidiPropertyBlockLevel1_0100, /* 69300..693FF */ + FriBidiPropertyBlockLevel1_0100, /* 69400..694FF */ + FriBidiPropertyBlockLevel1_0100, /* 69500..695FF */ + FriBidiPropertyBlockLevel1_0100, /* 69600..696FF */ + FriBidiPropertyBlockLevel1_0100, /* 69700..697FF */ + FriBidiPropertyBlockLevel1_0100, /* 69800..698FF */ + FriBidiPropertyBlockLevel1_0100, /* 69900..699FF */ + FriBidiPropertyBlockLevel1_0100, /* 69A00..69AFF */ + FriBidiPropertyBlockLevel1_0100, /* 69B00..69BFF */ + FriBidiPropertyBlockLevel1_0100, /* 69C00..69CFF */ + FriBidiPropertyBlockLevel1_0100, /* 69D00..69DFF */ + FriBidiPropertyBlockLevel1_0100, /* 69E00..69EFF */ + FriBidiPropertyBlockLevel1_0100, /* 69F00..69FFF */ + FriBidiPropertyBlockLevel1_0100, /* 6A000..6A0FF */ + FriBidiPropertyBlockLevel1_0100, /* 6A100..6A1FF */ + FriBidiPropertyBlockLevel1_0100, /* 6A200..6A2FF */ + FriBidiPropertyBlockLevel1_0100, /* 6A300..6A3FF */ + FriBidiPropertyBlockLevel1_0100, /* 6A400..6A4FF */ + FriBidiPropertyBlockLevel1_0100, /* 6A500..6A5FF */ + FriBidiPropertyBlockLevel1_0100, /* 6A600..6A6FF */ + FriBidiPropertyBlockLevel1_0100, /* 6A700..6A7FF */ + FriBidiPropertyBlockLevel1_0100, /* 6A800..6A8FF */ + FriBidiPropertyBlockLevel1_0100, /* 6A900..6A9FF */ + FriBidiPropertyBlockLevel1_0100, /* 6AA00..6AAFF */ + FriBidiPropertyBlockLevel1_0100, /* 6AB00..6ABFF */ + FriBidiPropertyBlockLevel1_0100, /* 6AC00..6ACFF */ + FriBidiPropertyBlockLevel1_0100, /* 6AD00..6ADFF */ + FriBidiPropertyBlockLevel1_0100, /* 6AE00..6AEFF */ + FriBidiPropertyBlockLevel1_0100, /* 6AF00..6AFFF */ + FriBidiPropertyBlockLevel1_0100, /* 6B000..6B0FF */ + FriBidiPropertyBlockLevel1_0100, /* 6B100..6B1FF */ + FriBidiPropertyBlockLevel1_0100, /* 6B200..6B2FF */ + FriBidiPropertyBlockLevel1_0100, /* 6B300..6B3FF */ + FriBidiPropertyBlockLevel1_0100, /* 6B400..6B4FF */ + FriBidiPropertyBlockLevel1_0100, /* 6B500..6B5FF */ + FriBidiPropertyBlockLevel1_0100, /* 6B600..6B6FF */ + FriBidiPropertyBlockLevel1_0100, /* 6B700..6B7FF */ + FriBidiPropertyBlockLevel1_0100, /* 6B800..6B8FF */ + FriBidiPropertyBlockLevel1_0100, /* 6B900..6B9FF */ + FriBidiPropertyBlockLevel1_0100, /* 6BA00..6BAFF */ + FriBidiPropertyBlockLevel1_0100, /* 6BB00..6BBFF */ + FriBidiPropertyBlockLevel1_0100, /* 6BC00..6BCFF */ + FriBidiPropertyBlockLevel1_0100, /* 6BD00..6BDFF */ + FriBidiPropertyBlockLevel1_0100, /* 6BE00..6BEFF */ + FriBidiPropertyBlockLevel1_0100, /* 6BF00..6BFFF */ + FriBidiPropertyBlockLevel1_0100, /* 6C000..6C0FF */ + FriBidiPropertyBlockLevel1_0100, /* 6C100..6C1FF */ + FriBidiPropertyBlockLevel1_0100, /* 6C200..6C2FF */ + FriBidiPropertyBlockLevel1_0100, /* 6C300..6C3FF */ + FriBidiPropertyBlockLevel1_0100, /* 6C400..6C4FF */ + FriBidiPropertyBlockLevel1_0100, /* 6C500..6C5FF */ + FriBidiPropertyBlockLevel1_0100, /* 6C600..6C6FF */ + FriBidiPropertyBlockLevel1_0100, /* 6C700..6C7FF */ + FriBidiPropertyBlockLevel1_0100, /* 6C800..6C8FF */ + FriBidiPropertyBlockLevel1_0100, /* 6C900..6C9FF */ + FriBidiPropertyBlockLevel1_0100, /* 6CA00..6CAFF */ + FriBidiPropertyBlockLevel1_0100, /* 6CB00..6CBFF */ + FriBidiPropertyBlockLevel1_0100, /* 6CC00..6CCFF */ + FriBidiPropertyBlockLevel1_0100, /* 6CD00..6CDFF */ + FriBidiPropertyBlockLevel1_0100, /* 6CE00..6CEFF */ + FriBidiPropertyBlockLevel1_0100, /* 6CF00..6CFFF */ + FriBidiPropertyBlockLevel1_0100, /* 6D000..6D0FF */ + FriBidiPropertyBlockLevel1_0100, /* 6D100..6D1FF */ + FriBidiPropertyBlockLevel1_0100, /* 6D200..6D2FF */ + FriBidiPropertyBlockLevel1_0100, /* 6D300..6D3FF */ + FriBidiPropertyBlockLevel1_0100, /* 6D400..6D4FF */ + FriBidiPropertyBlockLevel1_0100, /* 6D500..6D5FF */ + FriBidiPropertyBlockLevel1_0100, /* 6D600..6D6FF */ + FriBidiPropertyBlockLevel1_0100, /* 6D700..6D7FF */ + FriBidiPropertyBlockLevel1_0100, /* 6D800..6D8FF */ + FriBidiPropertyBlockLevel1_0100, /* 6D900..6D9FF */ + FriBidiPropertyBlockLevel1_0100, /* 6DA00..6DAFF */ + FriBidiPropertyBlockLevel1_0100, /* 6DB00..6DBFF */ + FriBidiPropertyBlockLevel1_0100, /* 6DC00..6DCFF */ + FriBidiPropertyBlockLevel1_0100, /* 6DD00..6DDFF */ + FriBidiPropertyBlockLevel1_0100, /* 6DE00..6DEFF */ + FriBidiPropertyBlockLevel1_0100, /* 6DF00..6DFFF */ + FriBidiPropertyBlockLevel1_0100, /* 6E000..6E0FF */ + FriBidiPropertyBlockLevel1_0100, /* 6E100..6E1FF */ + FriBidiPropertyBlockLevel1_0100, /* 6E200..6E2FF */ + FriBidiPropertyBlockLevel1_0100, /* 6E300..6E3FF */ + FriBidiPropertyBlockLevel1_0100, /* 6E400..6E4FF */ + FriBidiPropertyBlockLevel1_0100, /* 6E500..6E5FF */ + FriBidiPropertyBlockLevel1_0100, /* 6E600..6E6FF */ + FriBidiPropertyBlockLevel1_0100, /* 6E700..6E7FF */ + FriBidiPropertyBlockLevel1_0100, /* 6E800..6E8FF */ + FriBidiPropertyBlockLevel1_0100, /* 6E900..6E9FF */ + FriBidiPropertyBlockLevel1_0100, /* 6EA00..6EAFF */ + FriBidiPropertyBlockLevel1_0100, /* 6EB00..6EBFF */ + FriBidiPropertyBlockLevel1_0100, /* 6EC00..6ECFF */ + FriBidiPropertyBlockLevel1_0100, /* 6ED00..6EDFF */ + FriBidiPropertyBlockLevel1_0100, /* 6EE00..6EEFF */ + FriBidiPropertyBlockLevel1_0100, /* 6EF00..6EFFF */ + FriBidiPropertyBlockLevel1_0100, /* 6F000..6F0FF */ + FriBidiPropertyBlockLevel1_0100, /* 6F100..6F1FF */ + FriBidiPropertyBlockLevel1_0100, /* 6F200..6F2FF */ + FriBidiPropertyBlockLevel1_0100, /* 6F300..6F3FF */ + FriBidiPropertyBlockLevel1_0100, /* 6F400..6F4FF */ + FriBidiPropertyBlockLevel1_0100, /* 6F500..6F5FF */ + FriBidiPropertyBlockLevel1_0100, /* 6F600..6F6FF */ + FriBidiPropertyBlockLevel1_0100, /* 6F700..6F7FF */ + FriBidiPropertyBlockLevel1_0100, /* 6F800..6F8FF */ + FriBidiPropertyBlockLevel1_0100, /* 6F900..6F9FF */ + FriBidiPropertyBlockLevel1_0100, /* 6FA00..6FAFF */ + FriBidiPropertyBlockLevel1_0100, /* 6FB00..6FBFF */ + FriBidiPropertyBlockLevel1_0100, /* 6FC00..6FCFF */ + FriBidiPropertyBlockLevel1_0100, /* 6FD00..6FDFF */ + FriBidiPropertyBlockLevel1_0100, /* 6FE00..6FEFF */ + FriBidiPropertyBlockLevel1_0100, /* 6FF00..6FFFF */ + FriBidiPropertyBlockLevel1_0100, /* 70000..700FF */ + FriBidiPropertyBlockLevel1_0100, /* 70100..701FF */ + FriBidiPropertyBlockLevel1_0100, /* 70200..702FF */ + FriBidiPropertyBlockLevel1_0100, /* 70300..703FF */ + FriBidiPropertyBlockLevel1_0100, /* 70400..704FF */ + FriBidiPropertyBlockLevel1_0100, /* 70500..705FF */ + FriBidiPropertyBlockLevel1_0100, /* 70600..706FF */ + FriBidiPropertyBlockLevel1_0100, /* 70700..707FF */ + FriBidiPropertyBlockLevel1_0100, /* 70800..708FF */ + FriBidiPropertyBlockLevel1_0100, /* 70900..709FF */ + FriBidiPropertyBlockLevel1_0100, /* 70A00..70AFF */ + FriBidiPropertyBlockLevel1_0100, /* 70B00..70BFF */ + FriBidiPropertyBlockLevel1_0100, /* 70C00..70CFF */ + FriBidiPropertyBlockLevel1_0100, /* 70D00..70DFF */ + FriBidiPropertyBlockLevel1_0100, /* 70E00..70EFF */ + FriBidiPropertyBlockLevel1_0100, /* 70F00..70FFF */ + FriBidiPropertyBlockLevel1_0100, /* 71000..710FF */ + FriBidiPropertyBlockLevel1_0100, /* 71100..711FF */ + FriBidiPropertyBlockLevel1_0100, /* 71200..712FF */ + FriBidiPropertyBlockLevel1_0100, /* 71300..713FF */ + FriBidiPropertyBlockLevel1_0100, /* 71400..714FF */ + FriBidiPropertyBlockLevel1_0100, /* 71500..715FF */ + FriBidiPropertyBlockLevel1_0100, /* 71600..716FF */ + FriBidiPropertyBlockLevel1_0100, /* 71700..717FF */ + FriBidiPropertyBlockLevel1_0100, /* 71800..718FF */ + FriBidiPropertyBlockLevel1_0100, /* 71900..719FF */ + FriBidiPropertyBlockLevel1_0100, /* 71A00..71AFF */ + FriBidiPropertyBlockLevel1_0100, /* 71B00..71BFF */ + FriBidiPropertyBlockLevel1_0100, /* 71C00..71CFF */ + FriBidiPropertyBlockLevel1_0100, /* 71D00..71DFF */ + FriBidiPropertyBlockLevel1_0100, /* 71E00..71EFF */ + FriBidiPropertyBlockLevel1_0100, /* 71F00..71FFF */ + FriBidiPropertyBlockLevel1_0100, /* 72000..720FF */ + FriBidiPropertyBlockLevel1_0100, /* 72100..721FF */ + FriBidiPropertyBlockLevel1_0100, /* 72200..722FF */ + FriBidiPropertyBlockLevel1_0100, /* 72300..723FF */ + FriBidiPropertyBlockLevel1_0100, /* 72400..724FF */ + FriBidiPropertyBlockLevel1_0100, /* 72500..725FF */ + FriBidiPropertyBlockLevel1_0100, /* 72600..726FF */ + FriBidiPropertyBlockLevel1_0100, /* 72700..727FF */ + FriBidiPropertyBlockLevel1_0100, /* 72800..728FF */ + FriBidiPropertyBlockLevel1_0100, /* 72900..729FF */ + FriBidiPropertyBlockLevel1_0100, /* 72A00..72AFF */ + FriBidiPropertyBlockLevel1_0100, /* 72B00..72BFF */ + FriBidiPropertyBlockLevel1_0100, /* 72C00..72CFF */ + FriBidiPropertyBlockLevel1_0100, /* 72D00..72DFF */ + FriBidiPropertyBlockLevel1_0100, /* 72E00..72EFF */ + FriBidiPropertyBlockLevel1_0100, /* 72F00..72FFF */ + FriBidiPropertyBlockLevel1_0100, /* 73000..730FF */ + FriBidiPropertyBlockLevel1_0100, /* 73100..731FF */ + FriBidiPropertyBlockLevel1_0100, /* 73200..732FF */ + FriBidiPropertyBlockLevel1_0100, /* 73300..733FF */ + FriBidiPropertyBlockLevel1_0100, /* 73400..734FF */ + FriBidiPropertyBlockLevel1_0100, /* 73500..735FF */ + FriBidiPropertyBlockLevel1_0100, /* 73600..736FF */ + FriBidiPropertyBlockLevel1_0100, /* 73700..737FF */ + FriBidiPropertyBlockLevel1_0100, /* 73800..738FF */ + FriBidiPropertyBlockLevel1_0100, /* 73900..739FF */ + FriBidiPropertyBlockLevel1_0100, /* 73A00..73AFF */ + FriBidiPropertyBlockLevel1_0100, /* 73B00..73BFF */ + FriBidiPropertyBlockLevel1_0100, /* 73C00..73CFF */ + FriBidiPropertyBlockLevel1_0100, /* 73D00..73DFF */ + FriBidiPropertyBlockLevel1_0100, /* 73E00..73EFF */ + FriBidiPropertyBlockLevel1_0100, /* 73F00..73FFF */ + FriBidiPropertyBlockLevel1_0100, /* 74000..740FF */ + FriBidiPropertyBlockLevel1_0100, /* 74100..741FF */ + FriBidiPropertyBlockLevel1_0100, /* 74200..742FF */ + FriBidiPropertyBlockLevel1_0100, /* 74300..743FF */ + FriBidiPropertyBlockLevel1_0100, /* 74400..744FF */ + FriBidiPropertyBlockLevel1_0100, /* 74500..745FF */ + FriBidiPropertyBlockLevel1_0100, /* 74600..746FF */ + FriBidiPropertyBlockLevel1_0100, /* 74700..747FF */ + FriBidiPropertyBlockLevel1_0100, /* 74800..748FF */ + FriBidiPropertyBlockLevel1_0100, /* 74900..749FF */ + FriBidiPropertyBlockLevel1_0100, /* 74A00..74AFF */ + FriBidiPropertyBlockLevel1_0100, /* 74B00..74BFF */ + FriBidiPropertyBlockLevel1_0100, /* 74C00..74CFF */ + FriBidiPropertyBlockLevel1_0100, /* 74D00..74DFF */ + FriBidiPropertyBlockLevel1_0100, /* 74E00..74EFF */ + FriBidiPropertyBlockLevel1_0100, /* 74F00..74FFF */ + FriBidiPropertyBlockLevel1_0100, /* 75000..750FF */ + FriBidiPropertyBlockLevel1_0100, /* 75100..751FF */ + FriBidiPropertyBlockLevel1_0100, /* 75200..752FF */ + FriBidiPropertyBlockLevel1_0100, /* 75300..753FF */ + FriBidiPropertyBlockLevel1_0100, /* 75400..754FF */ + FriBidiPropertyBlockLevel1_0100, /* 75500..755FF */ + FriBidiPropertyBlockLevel1_0100, /* 75600..756FF */ + FriBidiPropertyBlockLevel1_0100, /* 75700..757FF */ + FriBidiPropertyBlockLevel1_0100, /* 75800..758FF */ + FriBidiPropertyBlockLevel1_0100, /* 75900..759FF */ + FriBidiPropertyBlockLevel1_0100, /* 75A00..75AFF */ + FriBidiPropertyBlockLevel1_0100, /* 75B00..75BFF */ + FriBidiPropertyBlockLevel1_0100, /* 75C00..75CFF */ + FriBidiPropertyBlockLevel1_0100, /* 75D00..75DFF */ + FriBidiPropertyBlockLevel1_0100, /* 75E00..75EFF */ + FriBidiPropertyBlockLevel1_0100, /* 75F00..75FFF */ + FriBidiPropertyBlockLevel1_0100, /* 76000..760FF */ + FriBidiPropertyBlockLevel1_0100, /* 76100..761FF */ + FriBidiPropertyBlockLevel1_0100, /* 76200..762FF */ + FriBidiPropertyBlockLevel1_0100, /* 76300..763FF */ + FriBidiPropertyBlockLevel1_0100, /* 76400..764FF */ + FriBidiPropertyBlockLevel1_0100, /* 76500..765FF */ + FriBidiPropertyBlockLevel1_0100, /* 76600..766FF */ + FriBidiPropertyBlockLevel1_0100, /* 76700..767FF */ + FriBidiPropertyBlockLevel1_0100, /* 76800..768FF */ + FriBidiPropertyBlockLevel1_0100, /* 76900..769FF */ + FriBidiPropertyBlockLevel1_0100, /* 76A00..76AFF */ + FriBidiPropertyBlockLevel1_0100, /* 76B00..76BFF */ + FriBidiPropertyBlockLevel1_0100, /* 76C00..76CFF */ + FriBidiPropertyBlockLevel1_0100, /* 76D00..76DFF */ + FriBidiPropertyBlockLevel1_0100, /* 76E00..76EFF */ + FriBidiPropertyBlockLevel1_0100, /* 76F00..76FFF */ + FriBidiPropertyBlockLevel1_0100, /* 77000..770FF */ + FriBidiPropertyBlockLevel1_0100, /* 77100..771FF */ + FriBidiPropertyBlockLevel1_0100, /* 77200..772FF */ + FriBidiPropertyBlockLevel1_0100, /* 77300..773FF */ + FriBidiPropertyBlockLevel1_0100, /* 77400..774FF */ + FriBidiPropertyBlockLevel1_0100, /* 77500..775FF */ + FriBidiPropertyBlockLevel1_0100, /* 77600..776FF */ + FriBidiPropertyBlockLevel1_0100, /* 77700..777FF */ + FriBidiPropertyBlockLevel1_0100, /* 77800..778FF */ + FriBidiPropertyBlockLevel1_0100, /* 77900..779FF */ + FriBidiPropertyBlockLevel1_0100, /* 77A00..77AFF */ + FriBidiPropertyBlockLevel1_0100, /* 77B00..77BFF */ + FriBidiPropertyBlockLevel1_0100, /* 77C00..77CFF */ + FriBidiPropertyBlockLevel1_0100, /* 77D00..77DFF */ + FriBidiPropertyBlockLevel1_0100, /* 77E00..77EFF */ + FriBidiPropertyBlockLevel1_0100, /* 77F00..77FFF */ + FriBidiPropertyBlockLevel1_0100, /* 78000..780FF */ + FriBidiPropertyBlockLevel1_0100, /* 78100..781FF */ + FriBidiPropertyBlockLevel1_0100, /* 78200..782FF */ + FriBidiPropertyBlockLevel1_0100, /* 78300..783FF */ + FriBidiPropertyBlockLevel1_0100, /* 78400..784FF */ + FriBidiPropertyBlockLevel1_0100, /* 78500..785FF */ + FriBidiPropertyBlockLevel1_0100, /* 78600..786FF */ + FriBidiPropertyBlockLevel1_0100, /* 78700..787FF */ + FriBidiPropertyBlockLevel1_0100, /* 78800..788FF */ + FriBidiPropertyBlockLevel1_0100, /* 78900..789FF */ + FriBidiPropertyBlockLevel1_0100, /* 78A00..78AFF */ + FriBidiPropertyBlockLevel1_0100, /* 78B00..78BFF */ + FriBidiPropertyBlockLevel1_0100, /* 78C00..78CFF */ + FriBidiPropertyBlockLevel1_0100, /* 78D00..78DFF */ + FriBidiPropertyBlockLevel1_0100, /* 78E00..78EFF */ + FriBidiPropertyBlockLevel1_0100, /* 78F00..78FFF */ + FriBidiPropertyBlockLevel1_0100, /* 79000..790FF */ + FriBidiPropertyBlockLevel1_0100, /* 79100..791FF */ + FriBidiPropertyBlockLevel1_0100, /* 79200..792FF */ + FriBidiPropertyBlockLevel1_0100, /* 79300..793FF */ + FriBidiPropertyBlockLevel1_0100, /* 79400..794FF */ + FriBidiPropertyBlockLevel1_0100, /* 79500..795FF */ + FriBidiPropertyBlockLevel1_0100, /* 79600..796FF */ + FriBidiPropertyBlockLevel1_0100, /* 79700..797FF */ + FriBidiPropertyBlockLevel1_0100, /* 79800..798FF */ + FriBidiPropertyBlockLevel1_0100, /* 79900..799FF */ + FriBidiPropertyBlockLevel1_0100, /* 79A00..79AFF */ + FriBidiPropertyBlockLevel1_0100, /* 79B00..79BFF */ + FriBidiPropertyBlockLevel1_0100, /* 79C00..79CFF */ + FriBidiPropertyBlockLevel1_0100, /* 79D00..79DFF */ + FriBidiPropertyBlockLevel1_0100, /* 79E00..79EFF */ + FriBidiPropertyBlockLevel1_0100, /* 79F00..79FFF */ + FriBidiPropertyBlockLevel1_0100, /* 7A000..7A0FF */ + FriBidiPropertyBlockLevel1_0100, /* 7A100..7A1FF */ + FriBidiPropertyBlockLevel1_0100, /* 7A200..7A2FF */ + FriBidiPropertyBlockLevel1_0100, /* 7A300..7A3FF */ + FriBidiPropertyBlockLevel1_0100, /* 7A400..7A4FF */ + FriBidiPropertyBlockLevel1_0100, /* 7A500..7A5FF */ + FriBidiPropertyBlockLevel1_0100, /* 7A600..7A6FF */ + FriBidiPropertyBlockLevel1_0100, /* 7A700..7A7FF */ + FriBidiPropertyBlockLevel1_0100, /* 7A800..7A8FF */ + FriBidiPropertyBlockLevel1_0100, /* 7A900..7A9FF */ + FriBidiPropertyBlockLevel1_0100, /* 7AA00..7AAFF */ + FriBidiPropertyBlockLevel1_0100, /* 7AB00..7ABFF */ + FriBidiPropertyBlockLevel1_0100, /* 7AC00..7ACFF */ + FriBidiPropertyBlockLevel1_0100, /* 7AD00..7ADFF */ + FriBidiPropertyBlockLevel1_0100, /* 7AE00..7AEFF */ + FriBidiPropertyBlockLevel1_0100, /* 7AF00..7AFFF */ + FriBidiPropertyBlockLevel1_0100, /* 7B000..7B0FF */ + FriBidiPropertyBlockLevel1_0100, /* 7B100..7B1FF */ + FriBidiPropertyBlockLevel1_0100, /* 7B200..7B2FF */ + FriBidiPropertyBlockLevel1_0100, /* 7B300..7B3FF */ + FriBidiPropertyBlockLevel1_0100, /* 7B400..7B4FF */ + FriBidiPropertyBlockLevel1_0100, /* 7B500..7B5FF */ + FriBidiPropertyBlockLevel1_0100, /* 7B600..7B6FF */ + FriBidiPropertyBlockLevel1_0100, /* 7B700..7B7FF */ + FriBidiPropertyBlockLevel1_0100, /* 7B800..7B8FF */ + FriBidiPropertyBlockLevel1_0100, /* 7B900..7B9FF */ + FriBidiPropertyBlockLevel1_0100, /* 7BA00..7BAFF */ + FriBidiPropertyBlockLevel1_0100, /* 7BB00..7BBFF */ + FriBidiPropertyBlockLevel1_0100, /* 7BC00..7BCFF */ + FriBidiPropertyBlockLevel1_0100, /* 7BD00..7BDFF */ + FriBidiPropertyBlockLevel1_0100, /* 7BE00..7BEFF */ + FriBidiPropertyBlockLevel1_0100, /* 7BF00..7BFFF */ + FriBidiPropertyBlockLevel1_0100, /* 7C000..7C0FF */ + FriBidiPropertyBlockLevel1_0100, /* 7C100..7C1FF */ + FriBidiPropertyBlockLevel1_0100, /* 7C200..7C2FF */ + FriBidiPropertyBlockLevel1_0100, /* 7C300..7C3FF */ + FriBidiPropertyBlockLevel1_0100, /* 7C400..7C4FF */ + FriBidiPropertyBlockLevel1_0100, /* 7C500..7C5FF */ + FriBidiPropertyBlockLevel1_0100, /* 7C600..7C6FF */ + FriBidiPropertyBlockLevel1_0100, /* 7C700..7C7FF */ + FriBidiPropertyBlockLevel1_0100, /* 7C800..7C8FF */ + FriBidiPropertyBlockLevel1_0100, /* 7C900..7C9FF */ + FriBidiPropertyBlockLevel1_0100, /* 7CA00..7CAFF */ + FriBidiPropertyBlockLevel1_0100, /* 7CB00..7CBFF */ + FriBidiPropertyBlockLevel1_0100, /* 7CC00..7CCFF */ + FriBidiPropertyBlockLevel1_0100, /* 7CD00..7CDFF */ + FriBidiPropertyBlockLevel1_0100, /* 7CE00..7CEFF */ + FriBidiPropertyBlockLevel1_0100, /* 7CF00..7CFFF */ + FriBidiPropertyBlockLevel1_0100, /* 7D000..7D0FF */ + FriBidiPropertyBlockLevel1_0100, /* 7D100..7D1FF */ + FriBidiPropertyBlockLevel1_0100, /* 7D200..7D2FF */ + FriBidiPropertyBlockLevel1_0100, /* 7D300..7D3FF */ + FriBidiPropertyBlockLevel1_0100, /* 7D400..7D4FF */ + FriBidiPropertyBlockLevel1_0100, /* 7D500..7D5FF */ + FriBidiPropertyBlockLevel1_0100, /* 7D600..7D6FF */ + FriBidiPropertyBlockLevel1_0100, /* 7D700..7D7FF */ + FriBidiPropertyBlockLevel1_0100, /* 7D800..7D8FF */ + FriBidiPropertyBlockLevel1_0100, /* 7D900..7D9FF */ + FriBidiPropertyBlockLevel1_0100, /* 7DA00..7DAFF */ + FriBidiPropertyBlockLevel1_0100, /* 7DB00..7DBFF */ + FriBidiPropertyBlockLevel1_0100, /* 7DC00..7DCFF */ + FriBidiPropertyBlockLevel1_0100, /* 7DD00..7DDFF */ + FriBidiPropertyBlockLevel1_0100, /* 7DE00..7DEFF */ + FriBidiPropertyBlockLevel1_0100, /* 7DF00..7DFFF */ + FriBidiPropertyBlockLevel1_0100, /* 7E000..7E0FF */ + FriBidiPropertyBlockLevel1_0100, /* 7E100..7E1FF */ + FriBidiPropertyBlockLevel1_0100, /* 7E200..7E2FF */ + FriBidiPropertyBlockLevel1_0100, /* 7E300..7E3FF */ + FriBidiPropertyBlockLevel1_0100, /* 7E400..7E4FF */ + FriBidiPropertyBlockLevel1_0100, /* 7E500..7E5FF */ + FriBidiPropertyBlockLevel1_0100, /* 7E600..7E6FF */ + FriBidiPropertyBlockLevel1_0100, /* 7E700..7E7FF */ + FriBidiPropertyBlockLevel1_0100, /* 7E800..7E8FF */ + FriBidiPropertyBlockLevel1_0100, /* 7E900..7E9FF */ + FriBidiPropertyBlockLevel1_0100, /* 7EA00..7EAFF */ + FriBidiPropertyBlockLevel1_0100, /* 7EB00..7EBFF */ + FriBidiPropertyBlockLevel1_0100, /* 7EC00..7ECFF */ + FriBidiPropertyBlockLevel1_0100, /* 7ED00..7EDFF */ + FriBidiPropertyBlockLevel1_0100, /* 7EE00..7EEFF */ + FriBidiPropertyBlockLevel1_0100, /* 7EF00..7EFFF */ + FriBidiPropertyBlockLevel1_0100, /* 7F000..7F0FF */ + FriBidiPropertyBlockLevel1_0100, /* 7F100..7F1FF */ + FriBidiPropertyBlockLevel1_0100, /* 7F200..7F2FF */ + FriBidiPropertyBlockLevel1_0100, /* 7F300..7F3FF */ + FriBidiPropertyBlockLevel1_0100, /* 7F400..7F4FF */ + FriBidiPropertyBlockLevel1_0100, /* 7F500..7F5FF */ + FriBidiPropertyBlockLevel1_0100, /* 7F600..7F6FF */ + FriBidiPropertyBlockLevel1_0100, /* 7F700..7F7FF */ + FriBidiPropertyBlockLevel1_0100, /* 7F800..7F8FF */ + FriBidiPropertyBlockLevel1_0100, /* 7F900..7F9FF */ + FriBidiPropertyBlockLevel1_0100, /* 7FA00..7FAFF */ + FriBidiPropertyBlockLevel1_0100, /* 7FB00..7FBFF */ + FriBidiPropertyBlockLevel1_0100, /* 7FC00..7FCFF */ + FriBidiPropertyBlockLevel1_0100, /* 7FD00..7FDFF */ + FriBidiPropertyBlockLevel1_0100, /* 7FE00..7FEFF */ + FriBidiPropertyBlockLevel1_0100, /* 7FF00..7FFFF */ + FriBidiPropertyBlockLevel1_0100, /* 80000..800FF */ + FriBidiPropertyBlockLevel1_0100, /* 80100..801FF */ + FriBidiPropertyBlockLevel1_0100, /* 80200..802FF */ + FriBidiPropertyBlockLevel1_0100, /* 80300..803FF */ + FriBidiPropertyBlockLevel1_0100, /* 80400..804FF */ + FriBidiPropertyBlockLevel1_0100, /* 80500..805FF */ + FriBidiPropertyBlockLevel1_0100, /* 80600..806FF */ + FriBidiPropertyBlockLevel1_0100, /* 80700..807FF */ + FriBidiPropertyBlockLevel1_0100, /* 80800..808FF */ + FriBidiPropertyBlockLevel1_0100, /* 80900..809FF */ + FriBidiPropertyBlockLevel1_0100, /* 80A00..80AFF */ + FriBidiPropertyBlockLevel1_0100, /* 80B00..80BFF */ + FriBidiPropertyBlockLevel1_0100, /* 80C00..80CFF */ + FriBidiPropertyBlockLevel1_0100, /* 80D00..80DFF */ + FriBidiPropertyBlockLevel1_0100, /* 80E00..80EFF */ + FriBidiPropertyBlockLevel1_0100, /* 80F00..80FFF */ + FriBidiPropertyBlockLevel1_0100, /* 81000..810FF */ + FriBidiPropertyBlockLevel1_0100, /* 81100..811FF */ + FriBidiPropertyBlockLevel1_0100, /* 81200..812FF */ + FriBidiPropertyBlockLevel1_0100, /* 81300..813FF */ + FriBidiPropertyBlockLevel1_0100, /* 81400..814FF */ + FriBidiPropertyBlockLevel1_0100, /* 81500..815FF */ + FriBidiPropertyBlockLevel1_0100, /* 81600..816FF */ + FriBidiPropertyBlockLevel1_0100, /* 81700..817FF */ + FriBidiPropertyBlockLevel1_0100, /* 81800..818FF */ + FriBidiPropertyBlockLevel1_0100, /* 81900..819FF */ + FriBidiPropertyBlockLevel1_0100, /* 81A00..81AFF */ + FriBidiPropertyBlockLevel1_0100, /* 81B00..81BFF */ + FriBidiPropertyBlockLevel1_0100, /* 81C00..81CFF */ + FriBidiPropertyBlockLevel1_0100, /* 81D00..81DFF */ + FriBidiPropertyBlockLevel1_0100, /* 81E00..81EFF */ + FriBidiPropertyBlockLevel1_0100, /* 81F00..81FFF */ + FriBidiPropertyBlockLevel1_0100, /* 82000..820FF */ + FriBidiPropertyBlockLevel1_0100, /* 82100..821FF */ + FriBidiPropertyBlockLevel1_0100, /* 82200..822FF */ + FriBidiPropertyBlockLevel1_0100, /* 82300..823FF */ + FriBidiPropertyBlockLevel1_0100, /* 82400..824FF */ + FriBidiPropertyBlockLevel1_0100, /* 82500..825FF */ + FriBidiPropertyBlockLevel1_0100, /* 82600..826FF */ + FriBidiPropertyBlockLevel1_0100, /* 82700..827FF */ + FriBidiPropertyBlockLevel1_0100, /* 82800..828FF */ + FriBidiPropertyBlockLevel1_0100, /* 82900..829FF */ + FriBidiPropertyBlockLevel1_0100, /* 82A00..82AFF */ + FriBidiPropertyBlockLevel1_0100, /* 82B00..82BFF */ + FriBidiPropertyBlockLevel1_0100, /* 82C00..82CFF */ + FriBidiPropertyBlockLevel1_0100, /* 82D00..82DFF */ + FriBidiPropertyBlockLevel1_0100, /* 82E00..82EFF */ + FriBidiPropertyBlockLevel1_0100, /* 82F00..82FFF */ + FriBidiPropertyBlockLevel1_0100, /* 83000..830FF */ + FriBidiPropertyBlockLevel1_0100, /* 83100..831FF */ + FriBidiPropertyBlockLevel1_0100, /* 83200..832FF */ + FriBidiPropertyBlockLevel1_0100, /* 83300..833FF */ + FriBidiPropertyBlockLevel1_0100, /* 83400..834FF */ + FriBidiPropertyBlockLevel1_0100, /* 83500..835FF */ + FriBidiPropertyBlockLevel1_0100, /* 83600..836FF */ + FriBidiPropertyBlockLevel1_0100, /* 83700..837FF */ + FriBidiPropertyBlockLevel1_0100, /* 83800..838FF */ + FriBidiPropertyBlockLevel1_0100, /* 83900..839FF */ + FriBidiPropertyBlockLevel1_0100, /* 83A00..83AFF */ + FriBidiPropertyBlockLevel1_0100, /* 83B00..83BFF */ + FriBidiPropertyBlockLevel1_0100, /* 83C00..83CFF */ + FriBidiPropertyBlockLevel1_0100, /* 83D00..83DFF */ + FriBidiPropertyBlockLevel1_0100, /* 83E00..83EFF */ + FriBidiPropertyBlockLevel1_0100, /* 83F00..83FFF */ + FriBidiPropertyBlockLevel1_0100, /* 84000..840FF */ + FriBidiPropertyBlockLevel1_0100, /* 84100..841FF */ + FriBidiPropertyBlockLevel1_0100, /* 84200..842FF */ + FriBidiPropertyBlockLevel1_0100, /* 84300..843FF */ + FriBidiPropertyBlockLevel1_0100, /* 84400..844FF */ + FriBidiPropertyBlockLevel1_0100, /* 84500..845FF */ + FriBidiPropertyBlockLevel1_0100, /* 84600..846FF */ + FriBidiPropertyBlockLevel1_0100, /* 84700..847FF */ + FriBidiPropertyBlockLevel1_0100, /* 84800..848FF */ + FriBidiPropertyBlockLevel1_0100, /* 84900..849FF */ + FriBidiPropertyBlockLevel1_0100, /* 84A00..84AFF */ + FriBidiPropertyBlockLevel1_0100, /* 84B00..84BFF */ + FriBidiPropertyBlockLevel1_0100, /* 84C00..84CFF */ + FriBidiPropertyBlockLevel1_0100, /* 84D00..84DFF */ + FriBidiPropertyBlockLevel1_0100, /* 84E00..84EFF */ + FriBidiPropertyBlockLevel1_0100, /* 84F00..84FFF */ + FriBidiPropertyBlockLevel1_0100, /* 85000..850FF */ + FriBidiPropertyBlockLevel1_0100, /* 85100..851FF */ + FriBidiPropertyBlockLevel1_0100, /* 85200..852FF */ + FriBidiPropertyBlockLevel1_0100, /* 85300..853FF */ + FriBidiPropertyBlockLevel1_0100, /* 85400..854FF */ + FriBidiPropertyBlockLevel1_0100, /* 85500..855FF */ + FriBidiPropertyBlockLevel1_0100, /* 85600..856FF */ + FriBidiPropertyBlockLevel1_0100, /* 85700..857FF */ + FriBidiPropertyBlockLevel1_0100, /* 85800..858FF */ + FriBidiPropertyBlockLevel1_0100, /* 85900..859FF */ + FriBidiPropertyBlockLevel1_0100, /* 85A00..85AFF */ + FriBidiPropertyBlockLevel1_0100, /* 85B00..85BFF */ + FriBidiPropertyBlockLevel1_0100, /* 85C00..85CFF */ + FriBidiPropertyBlockLevel1_0100, /* 85D00..85DFF */ + FriBidiPropertyBlockLevel1_0100, /* 85E00..85EFF */ + FriBidiPropertyBlockLevel1_0100, /* 85F00..85FFF */ + FriBidiPropertyBlockLevel1_0100, /* 86000..860FF */ + FriBidiPropertyBlockLevel1_0100, /* 86100..861FF */ + FriBidiPropertyBlockLevel1_0100, /* 86200..862FF */ + FriBidiPropertyBlockLevel1_0100, /* 86300..863FF */ + FriBidiPropertyBlockLevel1_0100, /* 86400..864FF */ + FriBidiPropertyBlockLevel1_0100, /* 86500..865FF */ + FriBidiPropertyBlockLevel1_0100, /* 86600..866FF */ + FriBidiPropertyBlockLevel1_0100, /* 86700..867FF */ + FriBidiPropertyBlockLevel1_0100, /* 86800..868FF */ + FriBidiPropertyBlockLevel1_0100, /* 86900..869FF */ + FriBidiPropertyBlockLevel1_0100, /* 86A00..86AFF */ + FriBidiPropertyBlockLevel1_0100, /* 86B00..86BFF */ + FriBidiPropertyBlockLevel1_0100, /* 86C00..86CFF */ + FriBidiPropertyBlockLevel1_0100, /* 86D00..86DFF */ + FriBidiPropertyBlockLevel1_0100, /* 86E00..86EFF */ + FriBidiPropertyBlockLevel1_0100, /* 86F00..86FFF */ + FriBidiPropertyBlockLevel1_0100, /* 87000..870FF */ + FriBidiPropertyBlockLevel1_0100, /* 87100..871FF */ + FriBidiPropertyBlockLevel1_0100, /* 87200..872FF */ + FriBidiPropertyBlockLevel1_0100, /* 87300..873FF */ + FriBidiPropertyBlockLevel1_0100, /* 87400..874FF */ + FriBidiPropertyBlockLevel1_0100, /* 87500..875FF */ + FriBidiPropertyBlockLevel1_0100, /* 87600..876FF */ + FriBidiPropertyBlockLevel1_0100, /* 87700..877FF */ + FriBidiPropertyBlockLevel1_0100, /* 87800..878FF */ + FriBidiPropertyBlockLevel1_0100, /* 87900..879FF */ + FriBidiPropertyBlockLevel1_0100, /* 87A00..87AFF */ + FriBidiPropertyBlockLevel1_0100, /* 87B00..87BFF */ + FriBidiPropertyBlockLevel1_0100, /* 87C00..87CFF */ + FriBidiPropertyBlockLevel1_0100, /* 87D00..87DFF */ + FriBidiPropertyBlockLevel1_0100, /* 87E00..87EFF */ + FriBidiPropertyBlockLevel1_0100, /* 87F00..87FFF */ + FriBidiPropertyBlockLevel1_0100, /* 88000..880FF */ + FriBidiPropertyBlockLevel1_0100, /* 88100..881FF */ + FriBidiPropertyBlockLevel1_0100, /* 88200..882FF */ + FriBidiPropertyBlockLevel1_0100, /* 88300..883FF */ + FriBidiPropertyBlockLevel1_0100, /* 88400..884FF */ + FriBidiPropertyBlockLevel1_0100, /* 88500..885FF */ + FriBidiPropertyBlockLevel1_0100, /* 88600..886FF */ + FriBidiPropertyBlockLevel1_0100, /* 88700..887FF */ + FriBidiPropertyBlockLevel1_0100, /* 88800..888FF */ + FriBidiPropertyBlockLevel1_0100, /* 88900..889FF */ + FriBidiPropertyBlockLevel1_0100, /* 88A00..88AFF */ + FriBidiPropertyBlockLevel1_0100, /* 88B00..88BFF */ + FriBidiPropertyBlockLevel1_0100, /* 88C00..88CFF */ + FriBidiPropertyBlockLevel1_0100, /* 88D00..88DFF */ + FriBidiPropertyBlockLevel1_0100, /* 88E00..88EFF */ + FriBidiPropertyBlockLevel1_0100, /* 88F00..88FFF */ + FriBidiPropertyBlockLevel1_0100, /* 89000..890FF */ + FriBidiPropertyBlockLevel1_0100, /* 89100..891FF */ + FriBidiPropertyBlockLevel1_0100, /* 89200..892FF */ + FriBidiPropertyBlockLevel1_0100, /* 89300..893FF */ + FriBidiPropertyBlockLevel1_0100, /* 89400..894FF */ + FriBidiPropertyBlockLevel1_0100, /* 89500..895FF */ + FriBidiPropertyBlockLevel1_0100, /* 89600..896FF */ + FriBidiPropertyBlockLevel1_0100, /* 89700..897FF */ + FriBidiPropertyBlockLevel1_0100, /* 89800..898FF */ + FriBidiPropertyBlockLevel1_0100, /* 89900..899FF */ + FriBidiPropertyBlockLevel1_0100, /* 89A00..89AFF */ + FriBidiPropertyBlockLevel1_0100, /* 89B00..89BFF */ + FriBidiPropertyBlockLevel1_0100, /* 89C00..89CFF */ + FriBidiPropertyBlockLevel1_0100, /* 89D00..89DFF */ + FriBidiPropertyBlockLevel1_0100, /* 89E00..89EFF */ + FriBidiPropertyBlockLevel1_0100, /* 89F00..89FFF */ + FriBidiPropertyBlockLevel1_0100, /* 8A000..8A0FF */ + FriBidiPropertyBlockLevel1_0100, /* 8A100..8A1FF */ + FriBidiPropertyBlockLevel1_0100, /* 8A200..8A2FF */ + FriBidiPropertyBlockLevel1_0100, /* 8A300..8A3FF */ + FriBidiPropertyBlockLevel1_0100, /* 8A400..8A4FF */ + FriBidiPropertyBlockLevel1_0100, /* 8A500..8A5FF */ + FriBidiPropertyBlockLevel1_0100, /* 8A600..8A6FF */ + FriBidiPropertyBlockLevel1_0100, /* 8A700..8A7FF */ + FriBidiPropertyBlockLevel1_0100, /* 8A800..8A8FF */ + FriBidiPropertyBlockLevel1_0100, /* 8A900..8A9FF */ + FriBidiPropertyBlockLevel1_0100, /* 8AA00..8AAFF */ + FriBidiPropertyBlockLevel1_0100, /* 8AB00..8ABFF */ + FriBidiPropertyBlockLevel1_0100, /* 8AC00..8ACFF */ + FriBidiPropertyBlockLevel1_0100, /* 8AD00..8ADFF */ + FriBidiPropertyBlockLevel1_0100, /* 8AE00..8AEFF */ + FriBidiPropertyBlockLevel1_0100, /* 8AF00..8AFFF */ + FriBidiPropertyBlockLevel1_0100, /* 8B000..8B0FF */ + FriBidiPropertyBlockLevel1_0100, /* 8B100..8B1FF */ + FriBidiPropertyBlockLevel1_0100, /* 8B200..8B2FF */ + FriBidiPropertyBlockLevel1_0100, /* 8B300..8B3FF */ + FriBidiPropertyBlockLevel1_0100, /* 8B400..8B4FF */ + FriBidiPropertyBlockLevel1_0100, /* 8B500..8B5FF */ + FriBidiPropertyBlockLevel1_0100, /* 8B600..8B6FF */ + FriBidiPropertyBlockLevel1_0100, /* 8B700..8B7FF */ + FriBidiPropertyBlockLevel1_0100, /* 8B800..8B8FF */ + FriBidiPropertyBlockLevel1_0100, /* 8B900..8B9FF */ + FriBidiPropertyBlockLevel1_0100, /* 8BA00..8BAFF */ + FriBidiPropertyBlockLevel1_0100, /* 8BB00..8BBFF */ + FriBidiPropertyBlockLevel1_0100, /* 8BC00..8BCFF */ + FriBidiPropertyBlockLevel1_0100, /* 8BD00..8BDFF */ + FriBidiPropertyBlockLevel1_0100, /* 8BE00..8BEFF */ + FriBidiPropertyBlockLevel1_0100, /* 8BF00..8BFFF */ + FriBidiPropertyBlockLevel1_0100, /* 8C000..8C0FF */ + FriBidiPropertyBlockLevel1_0100, /* 8C100..8C1FF */ + FriBidiPropertyBlockLevel1_0100, /* 8C200..8C2FF */ + FriBidiPropertyBlockLevel1_0100, /* 8C300..8C3FF */ + FriBidiPropertyBlockLevel1_0100, /* 8C400..8C4FF */ + FriBidiPropertyBlockLevel1_0100, /* 8C500..8C5FF */ + FriBidiPropertyBlockLevel1_0100, /* 8C600..8C6FF */ + FriBidiPropertyBlockLevel1_0100, /* 8C700..8C7FF */ + FriBidiPropertyBlockLevel1_0100, /* 8C800..8C8FF */ + FriBidiPropertyBlockLevel1_0100, /* 8C900..8C9FF */ + FriBidiPropertyBlockLevel1_0100, /* 8CA00..8CAFF */ + FriBidiPropertyBlockLevel1_0100, /* 8CB00..8CBFF */ + FriBidiPropertyBlockLevel1_0100, /* 8CC00..8CCFF */ + FriBidiPropertyBlockLevel1_0100, /* 8CD00..8CDFF */ + FriBidiPropertyBlockLevel1_0100, /* 8CE00..8CEFF */ + FriBidiPropertyBlockLevel1_0100, /* 8CF00..8CFFF */ + FriBidiPropertyBlockLevel1_0100, /* 8D000..8D0FF */ + FriBidiPropertyBlockLevel1_0100, /* 8D100..8D1FF */ + FriBidiPropertyBlockLevel1_0100, /* 8D200..8D2FF */ + FriBidiPropertyBlockLevel1_0100, /* 8D300..8D3FF */ + FriBidiPropertyBlockLevel1_0100, /* 8D400..8D4FF */ + FriBidiPropertyBlockLevel1_0100, /* 8D500..8D5FF */ + FriBidiPropertyBlockLevel1_0100, /* 8D600..8D6FF */ + FriBidiPropertyBlockLevel1_0100, /* 8D700..8D7FF */ + FriBidiPropertyBlockLevel1_0100, /* 8D800..8D8FF */ + FriBidiPropertyBlockLevel1_0100, /* 8D900..8D9FF */ + FriBidiPropertyBlockLevel1_0100, /* 8DA00..8DAFF */ + FriBidiPropertyBlockLevel1_0100, /* 8DB00..8DBFF */ + FriBidiPropertyBlockLevel1_0100, /* 8DC00..8DCFF */ + FriBidiPropertyBlockLevel1_0100, /* 8DD00..8DDFF */ + FriBidiPropertyBlockLevel1_0100, /* 8DE00..8DEFF */ + FriBidiPropertyBlockLevel1_0100, /* 8DF00..8DFFF */ + FriBidiPropertyBlockLevel1_0100, /* 8E000..8E0FF */ + FriBidiPropertyBlockLevel1_0100, /* 8E100..8E1FF */ + FriBidiPropertyBlockLevel1_0100, /* 8E200..8E2FF */ + FriBidiPropertyBlockLevel1_0100, /* 8E300..8E3FF */ + FriBidiPropertyBlockLevel1_0100, /* 8E400..8E4FF */ + FriBidiPropertyBlockLevel1_0100, /* 8E500..8E5FF */ + FriBidiPropertyBlockLevel1_0100, /* 8E600..8E6FF */ + FriBidiPropertyBlockLevel1_0100, /* 8E700..8E7FF */ + FriBidiPropertyBlockLevel1_0100, /* 8E800..8E8FF */ + FriBidiPropertyBlockLevel1_0100, /* 8E900..8E9FF */ + FriBidiPropertyBlockLevel1_0100, /* 8EA00..8EAFF */ + FriBidiPropertyBlockLevel1_0100, /* 8EB00..8EBFF */ + FriBidiPropertyBlockLevel1_0100, /* 8EC00..8ECFF */ + FriBidiPropertyBlockLevel1_0100, /* 8ED00..8EDFF */ + FriBidiPropertyBlockLevel1_0100, /* 8EE00..8EEFF */ + FriBidiPropertyBlockLevel1_0100, /* 8EF00..8EFFF */ + FriBidiPropertyBlockLevel1_0100, /* 8F000..8F0FF */ + FriBidiPropertyBlockLevel1_0100, /* 8F100..8F1FF */ + FriBidiPropertyBlockLevel1_0100, /* 8F200..8F2FF */ + FriBidiPropertyBlockLevel1_0100, /* 8F300..8F3FF */ + FriBidiPropertyBlockLevel1_0100, /* 8F400..8F4FF */ + FriBidiPropertyBlockLevel1_0100, /* 8F500..8F5FF */ + FriBidiPropertyBlockLevel1_0100, /* 8F600..8F6FF */ + FriBidiPropertyBlockLevel1_0100, /* 8F700..8F7FF */ + FriBidiPropertyBlockLevel1_0100, /* 8F800..8F8FF */ + FriBidiPropertyBlockLevel1_0100, /* 8F900..8F9FF */ + FriBidiPropertyBlockLevel1_0100, /* 8FA00..8FAFF */ + FriBidiPropertyBlockLevel1_0100, /* 8FB00..8FBFF */ + FriBidiPropertyBlockLevel1_0100, /* 8FC00..8FCFF */ + FriBidiPropertyBlockLevel1_0100, /* 8FD00..8FDFF */ + FriBidiPropertyBlockLevel1_0100, /* 8FE00..8FEFF */ + FriBidiPropertyBlockLevel1_0100, /* 8FF00..8FFFF */ + FriBidiPropertyBlockLevel1_0100, /* 90000..900FF */ + FriBidiPropertyBlockLevel1_0100, /* 90100..901FF */ + FriBidiPropertyBlockLevel1_0100, /* 90200..902FF */ + FriBidiPropertyBlockLevel1_0100, /* 90300..903FF */ + FriBidiPropertyBlockLevel1_0100, /* 90400..904FF */ + FriBidiPropertyBlockLevel1_0100, /* 90500..905FF */ + FriBidiPropertyBlockLevel1_0100, /* 90600..906FF */ + FriBidiPropertyBlockLevel1_0100, /* 90700..907FF */ + FriBidiPropertyBlockLevel1_0100, /* 90800..908FF */ + FriBidiPropertyBlockLevel1_0100, /* 90900..909FF */ + FriBidiPropertyBlockLevel1_0100, /* 90A00..90AFF */ + FriBidiPropertyBlockLevel1_0100, /* 90B00..90BFF */ + FriBidiPropertyBlockLevel1_0100, /* 90C00..90CFF */ + FriBidiPropertyBlockLevel1_0100, /* 90D00..90DFF */ + FriBidiPropertyBlockLevel1_0100, /* 90E00..90EFF */ + FriBidiPropertyBlockLevel1_0100, /* 90F00..90FFF */ + FriBidiPropertyBlockLevel1_0100, /* 91000..910FF */ + FriBidiPropertyBlockLevel1_0100, /* 91100..911FF */ + FriBidiPropertyBlockLevel1_0100, /* 91200..912FF */ + FriBidiPropertyBlockLevel1_0100, /* 91300..913FF */ + FriBidiPropertyBlockLevel1_0100, /* 91400..914FF */ + FriBidiPropertyBlockLevel1_0100, /* 91500..915FF */ + FriBidiPropertyBlockLevel1_0100, /* 91600..916FF */ + FriBidiPropertyBlockLevel1_0100, /* 91700..917FF */ + FriBidiPropertyBlockLevel1_0100, /* 91800..918FF */ + FriBidiPropertyBlockLevel1_0100, /* 91900..919FF */ + FriBidiPropertyBlockLevel1_0100, /* 91A00..91AFF */ + FriBidiPropertyBlockLevel1_0100, /* 91B00..91BFF */ + FriBidiPropertyBlockLevel1_0100, /* 91C00..91CFF */ + FriBidiPropertyBlockLevel1_0100, /* 91D00..91DFF */ + FriBidiPropertyBlockLevel1_0100, /* 91E00..91EFF */ + FriBidiPropertyBlockLevel1_0100, /* 91F00..91FFF */ + FriBidiPropertyBlockLevel1_0100, /* 92000..920FF */ + FriBidiPropertyBlockLevel1_0100, /* 92100..921FF */ + FriBidiPropertyBlockLevel1_0100, /* 92200..922FF */ + FriBidiPropertyBlockLevel1_0100, /* 92300..923FF */ + FriBidiPropertyBlockLevel1_0100, /* 92400..924FF */ + FriBidiPropertyBlockLevel1_0100, /* 92500..925FF */ + FriBidiPropertyBlockLevel1_0100, /* 92600..926FF */ + FriBidiPropertyBlockLevel1_0100, /* 92700..927FF */ + FriBidiPropertyBlockLevel1_0100, /* 92800..928FF */ + FriBidiPropertyBlockLevel1_0100, /* 92900..929FF */ + FriBidiPropertyBlockLevel1_0100, /* 92A00..92AFF */ + FriBidiPropertyBlockLevel1_0100, /* 92B00..92BFF */ + FriBidiPropertyBlockLevel1_0100, /* 92C00..92CFF */ + FriBidiPropertyBlockLevel1_0100, /* 92D00..92DFF */ + FriBidiPropertyBlockLevel1_0100, /* 92E00..92EFF */ + FriBidiPropertyBlockLevel1_0100, /* 92F00..92FFF */ + FriBidiPropertyBlockLevel1_0100, /* 93000..930FF */ + FriBidiPropertyBlockLevel1_0100, /* 93100..931FF */ + FriBidiPropertyBlockLevel1_0100, /* 93200..932FF */ + FriBidiPropertyBlockLevel1_0100, /* 93300..933FF */ + FriBidiPropertyBlockLevel1_0100, /* 93400..934FF */ + FriBidiPropertyBlockLevel1_0100, /* 93500..935FF */ + FriBidiPropertyBlockLevel1_0100, /* 93600..936FF */ + FriBidiPropertyBlockLevel1_0100, /* 93700..937FF */ + FriBidiPropertyBlockLevel1_0100, /* 93800..938FF */ + FriBidiPropertyBlockLevel1_0100, /* 93900..939FF */ + FriBidiPropertyBlockLevel1_0100, /* 93A00..93AFF */ + FriBidiPropertyBlockLevel1_0100, /* 93B00..93BFF */ + FriBidiPropertyBlockLevel1_0100, /* 93C00..93CFF */ + FriBidiPropertyBlockLevel1_0100, /* 93D00..93DFF */ + FriBidiPropertyBlockLevel1_0100, /* 93E00..93EFF */ + FriBidiPropertyBlockLevel1_0100, /* 93F00..93FFF */ + FriBidiPropertyBlockLevel1_0100, /* 94000..940FF */ + FriBidiPropertyBlockLevel1_0100, /* 94100..941FF */ + FriBidiPropertyBlockLevel1_0100, /* 94200..942FF */ + FriBidiPropertyBlockLevel1_0100, /* 94300..943FF */ + FriBidiPropertyBlockLevel1_0100, /* 94400..944FF */ + FriBidiPropertyBlockLevel1_0100, /* 94500..945FF */ + FriBidiPropertyBlockLevel1_0100, /* 94600..946FF */ + FriBidiPropertyBlockLevel1_0100, /* 94700..947FF */ + FriBidiPropertyBlockLevel1_0100, /* 94800..948FF */ + FriBidiPropertyBlockLevel1_0100, /* 94900..949FF */ + FriBidiPropertyBlockLevel1_0100, /* 94A00..94AFF */ + FriBidiPropertyBlockLevel1_0100, /* 94B00..94BFF */ + FriBidiPropertyBlockLevel1_0100, /* 94C00..94CFF */ + FriBidiPropertyBlockLevel1_0100, /* 94D00..94DFF */ + FriBidiPropertyBlockLevel1_0100, /* 94E00..94EFF */ + FriBidiPropertyBlockLevel1_0100, /* 94F00..94FFF */ + FriBidiPropertyBlockLevel1_0100, /* 95000..950FF */ + FriBidiPropertyBlockLevel1_0100, /* 95100..951FF */ + FriBidiPropertyBlockLevel1_0100, /* 95200..952FF */ + FriBidiPropertyBlockLevel1_0100, /* 95300..953FF */ + FriBidiPropertyBlockLevel1_0100, /* 95400..954FF */ + FriBidiPropertyBlockLevel1_0100, /* 95500..955FF */ + FriBidiPropertyBlockLevel1_0100, /* 95600..956FF */ + FriBidiPropertyBlockLevel1_0100, /* 95700..957FF */ + FriBidiPropertyBlockLevel1_0100, /* 95800..958FF */ + FriBidiPropertyBlockLevel1_0100, /* 95900..959FF */ + FriBidiPropertyBlockLevel1_0100, /* 95A00..95AFF */ + FriBidiPropertyBlockLevel1_0100, /* 95B00..95BFF */ + FriBidiPropertyBlockLevel1_0100, /* 95C00..95CFF */ + FriBidiPropertyBlockLevel1_0100, /* 95D00..95DFF */ + FriBidiPropertyBlockLevel1_0100, /* 95E00..95EFF */ + FriBidiPropertyBlockLevel1_0100, /* 95F00..95FFF */ + FriBidiPropertyBlockLevel1_0100, /* 96000..960FF */ + FriBidiPropertyBlockLevel1_0100, /* 96100..961FF */ + FriBidiPropertyBlockLevel1_0100, /* 96200..962FF */ + FriBidiPropertyBlockLevel1_0100, /* 96300..963FF */ + FriBidiPropertyBlockLevel1_0100, /* 96400..964FF */ + FriBidiPropertyBlockLevel1_0100, /* 96500..965FF */ + FriBidiPropertyBlockLevel1_0100, /* 96600..966FF */ + FriBidiPropertyBlockLevel1_0100, /* 96700..967FF */ + FriBidiPropertyBlockLevel1_0100, /* 96800..968FF */ + FriBidiPropertyBlockLevel1_0100, /* 96900..969FF */ + FriBidiPropertyBlockLevel1_0100, /* 96A00..96AFF */ + FriBidiPropertyBlockLevel1_0100, /* 96B00..96BFF */ + FriBidiPropertyBlockLevel1_0100, /* 96C00..96CFF */ + FriBidiPropertyBlockLevel1_0100, /* 96D00..96DFF */ + FriBidiPropertyBlockLevel1_0100, /* 96E00..96EFF */ + FriBidiPropertyBlockLevel1_0100, /* 96F00..96FFF */ + FriBidiPropertyBlockLevel1_0100, /* 97000..970FF */ + FriBidiPropertyBlockLevel1_0100, /* 97100..971FF */ + FriBidiPropertyBlockLevel1_0100, /* 97200..972FF */ + FriBidiPropertyBlockLevel1_0100, /* 97300..973FF */ + FriBidiPropertyBlockLevel1_0100, /* 97400..974FF */ + FriBidiPropertyBlockLevel1_0100, /* 97500..975FF */ + FriBidiPropertyBlockLevel1_0100, /* 97600..976FF */ + FriBidiPropertyBlockLevel1_0100, /* 97700..977FF */ + FriBidiPropertyBlockLevel1_0100, /* 97800..978FF */ + FriBidiPropertyBlockLevel1_0100, /* 97900..979FF */ + FriBidiPropertyBlockLevel1_0100, /* 97A00..97AFF */ + FriBidiPropertyBlockLevel1_0100, /* 97B00..97BFF */ + FriBidiPropertyBlockLevel1_0100, /* 97C00..97CFF */ + FriBidiPropertyBlockLevel1_0100, /* 97D00..97DFF */ + FriBidiPropertyBlockLevel1_0100, /* 97E00..97EFF */ + FriBidiPropertyBlockLevel1_0100, /* 97F00..97FFF */ + FriBidiPropertyBlockLevel1_0100, /* 98000..980FF */ + FriBidiPropertyBlockLevel1_0100, /* 98100..981FF */ + FriBidiPropertyBlockLevel1_0100, /* 98200..982FF */ + FriBidiPropertyBlockLevel1_0100, /* 98300..983FF */ + FriBidiPropertyBlockLevel1_0100, /* 98400..984FF */ + FriBidiPropertyBlockLevel1_0100, /* 98500..985FF */ + FriBidiPropertyBlockLevel1_0100, /* 98600..986FF */ + FriBidiPropertyBlockLevel1_0100, /* 98700..987FF */ + FriBidiPropertyBlockLevel1_0100, /* 98800..988FF */ + FriBidiPropertyBlockLevel1_0100, /* 98900..989FF */ + FriBidiPropertyBlockLevel1_0100, /* 98A00..98AFF */ + FriBidiPropertyBlockLevel1_0100, /* 98B00..98BFF */ + FriBidiPropertyBlockLevel1_0100, /* 98C00..98CFF */ + FriBidiPropertyBlockLevel1_0100, /* 98D00..98DFF */ + FriBidiPropertyBlockLevel1_0100, /* 98E00..98EFF */ + FriBidiPropertyBlockLevel1_0100, /* 98F00..98FFF */ + FriBidiPropertyBlockLevel1_0100, /* 99000..990FF */ + FriBidiPropertyBlockLevel1_0100, /* 99100..991FF */ + FriBidiPropertyBlockLevel1_0100, /* 99200..992FF */ + FriBidiPropertyBlockLevel1_0100, /* 99300..993FF */ + FriBidiPropertyBlockLevel1_0100, /* 99400..994FF */ + FriBidiPropertyBlockLevel1_0100, /* 99500..995FF */ + FriBidiPropertyBlockLevel1_0100, /* 99600..996FF */ + FriBidiPropertyBlockLevel1_0100, /* 99700..997FF */ + FriBidiPropertyBlockLevel1_0100, /* 99800..998FF */ + FriBidiPropertyBlockLevel1_0100, /* 99900..999FF */ + FriBidiPropertyBlockLevel1_0100, /* 99A00..99AFF */ + FriBidiPropertyBlockLevel1_0100, /* 99B00..99BFF */ + FriBidiPropertyBlockLevel1_0100, /* 99C00..99CFF */ + FriBidiPropertyBlockLevel1_0100, /* 99D00..99DFF */ + FriBidiPropertyBlockLevel1_0100, /* 99E00..99EFF */ + FriBidiPropertyBlockLevel1_0100, /* 99F00..99FFF */ + FriBidiPropertyBlockLevel1_0100, /* 9A000..9A0FF */ + FriBidiPropertyBlockLevel1_0100, /* 9A100..9A1FF */ + FriBidiPropertyBlockLevel1_0100, /* 9A200..9A2FF */ + FriBidiPropertyBlockLevel1_0100, /* 9A300..9A3FF */ + FriBidiPropertyBlockLevel1_0100, /* 9A400..9A4FF */ + FriBidiPropertyBlockLevel1_0100, /* 9A500..9A5FF */ + FriBidiPropertyBlockLevel1_0100, /* 9A600..9A6FF */ + FriBidiPropertyBlockLevel1_0100, /* 9A700..9A7FF */ + FriBidiPropertyBlockLevel1_0100, /* 9A800..9A8FF */ + FriBidiPropertyBlockLevel1_0100, /* 9A900..9A9FF */ + FriBidiPropertyBlockLevel1_0100, /* 9AA00..9AAFF */ + FriBidiPropertyBlockLevel1_0100, /* 9AB00..9ABFF */ + FriBidiPropertyBlockLevel1_0100, /* 9AC00..9ACFF */ + FriBidiPropertyBlockLevel1_0100, /* 9AD00..9ADFF */ + FriBidiPropertyBlockLevel1_0100, /* 9AE00..9AEFF */ + FriBidiPropertyBlockLevel1_0100, /* 9AF00..9AFFF */ + FriBidiPropertyBlockLevel1_0100, /* 9B000..9B0FF */ + FriBidiPropertyBlockLevel1_0100, /* 9B100..9B1FF */ + FriBidiPropertyBlockLevel1_0100, /* 9B200..9B2FF */ + FriBidiPropertyBlockLevel1_0100, /* 9B300..9B3FF */ + FriBidiPropertyBlockLevel1_0100, /* 9B400..9B4FF */ + FriBidiPropertyBlockLevel1_0100, /* 9B500..9B5FF */ + FriBidiPropertyBlockLevel1_0100, /* 9B600..9B6FF */ + FriBidiPropertyBlockLevel1_0100, /* 9B700..9B7FF */ + FriBidiPropertyBlockLevel1_0100, /* 9B800..9B8FF */ + FriBidiPropertyBlockLevel1_0100, /* 9B900..9B9FF */ + FriBidiPropertyBlockLevel1_0100, /* 9BA00..9BAFF */ + FriBidiPropertyBlockLevel1_0100, /* 9BB00..9BBFF */ + FriBidiPropertyBlockLevel1_0100, /* 9BC00..9BCFF */ + FriBidiPropertyBlockLevel1_0100, /* 9BD00..9BDFF */ + FriBidiPropertyBlockLevel1_0100, /* 9BE00..9BEFF */ + FriBidiPropertyBlockLevel1_0100, /* 9BF00..9BFFF */ + FriBidiPropertyBlockLevel1_0100, /* 9C000..9C0FF */ + FriBidiPropertyBlockLevel1_0100, /* 9C100..9C1FF */ + FriBidiPropertyBlockLevel1_0100, /* 9C200..9C2FF */ + FriBidiPropertyBlockLevel1_0100, /* 9C300..9C3FF */ + FriBidiPropertyBlockLevel1_0100, /* 9C400..9C4FF */ + FriBidiPropertyBlockLevel1_0100, /* 9C500..9C5FF */ + FriBidiPropertyBlockLevel1_0100, /* 9C600..9C6FF */ + FriBidiPropertyBlockLevel1_0100, /* 9C700..9C7FF */ + FriBidiPropertyBlockLevel1_0100, /* 9C800..9C8FF */ + FriBidiPropertyBlockLevel1_0100, /* 9C900..9C9FF */ + FriBidiPropertyBlockLevel1_0100, /* 9CA00..9CAFF */ + FriBidiPropertyBlockLevel1_0100, /* 9CB00..9CBFF */ + FriBidiPropertyBlockLevel1_0100, /* 9CC00..9CCFF */ + FriBidiPropertyBlockLevel1_0100, /* 9CD00..9CDFF */ + FriBidiPropertyBlockLevel1_0100, /* 9CE00..9CEFF */ + FriBidiPropertyBlockLevel1_0100, /* 9CF00..9CFFF */ + FriBidiPropertyBlockLevel1_0100, /* 9D000..9D0FF */ + FriBidiPropertyBlockLevel1_0100, /* 9D100..9D1FF */ + FriBidiPropertyBlockLevel1_0100, /* 9D200..9D2FF */ + FriBidiPropertyBlockLevel1_0100, /* 9D300..9D3FF */ + FriBidiPropertyBlockLevel1_0100, /* 9D400..9D4FF */ + FriBidiPropertyBlockLevel1_0100, /* 9D500..9D5FF */ + FriBidiPropertyBlockLevel1_0100, /* 9D600..9D6FF */ + FriBidiPropertyBlockLevel1_0100, /* 9D700..9D7FF */ + FriBidiPropertyBlockLevel1_0100, /* 9D800..9D8FF */ + FriBidiPropertyBlockLevel1_0100, /* 9D900..9D9FF */ + FriBidiPropertyBlockLevel1_0100, /* 9DA00..9DAFF */ + FriBidiPropertyBlockLevel1_0100, /* 9DB00..9DBFF */ + FriBidiPropertyBlockLevel1_0100, /* 9DC00..9DCFF */ + FriBidiPropertyBlockLevel1_0100, /* 9DD00..9DDFF */ + FriBidiPropertyBlockLevel1_0100, /* 9DE00..9DEFF */ + FriBidiPropertyBlockLevel1_0100, /* 9DF00..9DFFF */ + FriBidiPropertyBlockLevel1_0100, /* 9E000..9E0FF */ + FriBidiPropertyBlockLevel1_0100, /* 9E100..9E1FF */ + FriBidiPropertyBlockLevel1_0100, /* 9E200..9E2FF */ + FriBidiPropertyBlockLevel1_0100, /* 9E300..9E3FF */ + FriBidiPropertyBlockLevel1_0100, /* 9E400..9E4FF */ + FriBidiPropertyBlockLevel1_0100, /* 9E500..9E5FF */ + FriBidiPropertyBlockLevel1_0100, /* 9E600..9E6FF */ + FriBidiPropertyBlockLevel1_0100, /* 9E700..9E7FF */ + FriBidiPropertyBlockLevel1_0100, /* 9E800..9E8FF */ + FriBidiPropertyBlockLevel1_0100, /* 9E900..9E9FF */ + FriBidiPropertyBlockLevel1_0100, /* 9EA00..9EAFF */ + FriBidiPropertyBlockLevel1_0100, /* 9EB00..9EBFF */ + FriBidiPropertyBlockLevel1_0100, /* 9EC00..9ECFF */ + FriBidiPropertyBlockLevel1_0100, /* 9ED00..9EDFF */ + FriBidiPropertyBlockLevel1_0100, /* 9EE00..9EEFF */ + FriBidiPropertyBlockLevel1_0100, /* 9EF00..9EFFF */ + FriBidiPropertyBlockLevel1_0100, /* 9F000..9F0FF */ + FriBidiPropertyBlockLevel1_0100, /* 9F100..9F1FF */ + FriBidiPropertyBlockLevel1_0100, /* 9F200..9F2FF */ + FriBidiPropertyBlockLevel1_0100, /* 9F300..9F3FF */ + FriBidiPropertyBlockLevel1_0100, /* 9F400..9F4FF */ + FriBidiPropertyBlockLevel1_0100, /* 9F500..9F5FF */ + FriBidiPropertyBlockLevel1_0100, /* 9F600..9F6FF */ + FriBidiPropertyBlockLevel1_0100, /* 9F700..9F7FF */ + FriBidiPropertyBlockLevel1_0100, /* 9F800..9F8FF */ + FriBidiPropertyBlockLevel1_0100, /* 9F900..9F9FF */ + FriBidiPropertyBlockLevel1_0100, /* 9FA00..9FAFF */ + FriBidiPropertyBlockLevel1_0100, /* 9FB00..9FBFF */ + FriBidiPropertyBlockLevel1_0100, /* 9FC00..9FCFF */ + FriBidiPropertyBlockLevel1_0100, /* 9FD00..9FDFF */ + FriBidiPropertyBlockLevel1_0100, /* 9FE00..9FEFF */ + FriBidiPropertyBlockLevel1_0100, /* 9FF00..9FFFF */ + FriBidiPropertyBlockLevel1_0100, /* A0000..A00FF */ + FriBidiPropertyBlockLevel1_0100, /* A0100..A01FF */ + FriBidiPropertyBlockLevel1_0100, /* A0200..A02FF */ + FriBidiPropertyBlockLevel1_0100, /* A0300..A03FF */ + FriBidiPropertyBlockLevel1_0100, /* A0400..A04FF */ + FriBidiPropertyBlockLevel1_0100, /* A0500..A05FF */ + FriBidiPropertyBlockLevel1_0100, /* A0600..A06FF */ + FriBidiPropertyBlockLevel1_0100, /* A0700..A07FF */ + FriBidiPropertyBlockLevel1_0100, /* A0800..A08FF */ + FriBidiPropertyBlockLevel1_0100, /* A0900..A09FF */ + FriBidiPropertyBlockLevel1_0100, /* A0A00..A0AFF */ + FriBidiPropertyBlockLevel1_0100, /* A0B00..A0BFF */ + FriBidiPropertyBlockLevel1_0100, /* A0C00..A0CFF */ + FriBidiPropertyBlockLevel1_0100, /* A0D00..A0DFF */ + FriBidiPropertyBlockLevel1_0100, /* A0E00..A0EFF */ + FriBidiPropertyBlockLevel1_0100, /* A0F00..A0FFF */ + FriBidiPropertyBlockLevel1_0100, /* A1000..A10FF */ + FriBidiPropertyBlockLevel1_0100, /* A1100..A11FF */ + FriBidiPropertyBlockLevel1_0100, /* A1200..A12FF */ + FriBidiPropertyBlockLevel1_0100, /* A1300..A13FF */ + FriBidiPropertyBlockLevel1_0100, /* A1400..A14FF */ + FriBidiPropertyBlockLevel1_0100, /* A1500..A15FF */ + FriBidiPropertyBlockLevel1_0100, /* A1600..A16FF */ + FriBidiPropertyBlockLevel1_0100, /* A1700..A17FF */ + FriBidiPropertyBlockLevel1_0100, /* A1800..A18FF */ + FriBidiPropertyBlockLevel1_0100, /* A1900..A19FF */ + FriBidiPropertyBlockLevel1_0100, /* A1A00..A1AFF */ + FriBidiPropertyBlockLevel1_0100, /* A1B00..A1BFF */ + FriBidiPropertyBlockLevel1_0100, /* A1C00..A1CFF */ + FriBidiPropertyBlockLevel1_0100, /* A1D00..A1DFF */ + FriBidiPropertyBlockLevel1_0100, /* A1E00..A1EFF */ + FriBidiPropertyBlockLevel1_0100, /* A1F00..A1FFF */ + FriBidiPropertyBlockLevel1_0100, /* A2000..A20FF */ + FriBidiPropertyBlockLevel1_0100, /* A2100..A21FF */ + FriBidiPropertyBlockLevel1_0100, /* A2200..A22FF */ + FriBidiPropertyBlockLevel1_0100, /* A2300..A23FF */ + FriBidiPropertyBlockLevel1_0100, /* A2400..A24FF */ + FriBidiPropertyBlockLevel1_0100, /* A2500..A25FF */ + FriBidiPropertyBlockLevel1_0100, /* A2600..A26FF */ + FriBidiPropertyBlockLevel1_0100, /* A2700..A27FF */ + FriBidiPropertyBlockLevel1_0100, /* A2800..A28FF */ + FriBidiPropertyBlockLevel1_0100, /* A2900..A29FF */ + FriBidiPropertyBlockLevel1_0100, /* A2A00..A2AFF */ + FriBidiPropertyBlockLevel1_0100, /* A2B00..A2BFF */ + FriBidiPropertyBlockLevel1_0100, /* A2C00..A2CFF */ + FriBidiPropertyBlockLevel1_0100, /* A2D00..A2DFF */ + FriBidiPropertyBlockLevel1_0100, /* A2E00..A2EFF */ + FriBidiPropertyBlockLevel1_0100, /* A2F00..A2FFF */ + FriBidiPropertyBlockLevel1_0100, /* A3000..A30FF */ + FriBidiPropertyBlockLevel1_0100, /* A3100..A31FF */ + FriBidiPropertyBlockLevel1_0100, /* A3200..A32FF */ + FriBidiPropertyBlockLevel1_0100, /* A3300..A33FF */ + FriBidiPropertyBlockLevel1_0100, /* A3400..A34FF */ + FriBidiPropertyBlockLevel1_0100, /* A3500..A35FF */ + FriBidiPropertyBlockLevel1_0100, /* A3600..A36FF */ + FriBidiPropertyBlockLevel1_0100, /* A3700..A37FF */ + FriBidiPropertyBlockLevel1_0100, /* A3800..A38FF */ + FriBidiPropertyBlockLevel1_0100, /* A3900..A39FF */ + FriBidiPropertyBlockLevel1_0100, /* A3A00..A3AFF */ + FriBidiPropertyBlockLevel1_0100, /* A3B00..A3BFF */ + FriBidiPropertyBlockLevel1_0100, /* A3C00..A3CFF */ + FriBidiPropertyBlockLevel1_0100, /* A3D00..A3DFF */ + FriBidiPropertyBlockLevel1_0100, /* A3E00..A3EFF */ + FriBidiPropertyBlockLevel1_0100, /* A3F00..A3FFF */ + FriBidiPropertyBlockLevel1_0100, /* A4000..A40FF */ + FriBidiPropertyBlockLevel1_0100, /* A4100..A41FF */ + FriBidiPropertyBlockLevel1_0100, /* A4200..A42FF */ + FriBidiPropertyBlockLevel1_0100, /* A4300..A43FF */ + FriBidiPropertyBlockLevel1_0100, /* A4400..A44FF */ + FriBidiPropertyBlockLevel1_0100, /* A4500..A45FF */ + FriBidiPropertyBlockLevel1_0100, /* A4600..A46FF */ + FriBidiPropertyBlockLevel1_0100, /* A4700..A47FF */ + FriBidiPropertyBlockLevel1_0100, /* A4800..A48FF */ + FriBidiPropertyBlockLevel1_0100, /* A4900..A49FF */ + FriBidiPropertyBlockLevel1_0100, /* A4A00..A4AFF */ + FriBidiPropertyBlockLevel1_0100, /* A4B00..A4BFF */ + FriBidiPropertyBlockLevel1_0100, /* A4C00..A4CFF */ + FriBidiPropertyBlockLevel1_0100, /* A4D00..A4DFF */ + FriBidiPropertyBlockLevel1_0100, /* A4E00..A4EFF */ + FriBidiPropertyBlockLevel1_0100, /* A4F00..A4FFF */ + FriBidiPropertyBlockLevel1_0100, /* A5000..A50FF */ + FriBidiPropertyBlockLevel1_0100, /* A5100..A51FF */ + FriBidiPropertyBlockLevel1_0100, /* A5200..A52FF */ + FriBidiPropertyBlockLevel1_0100, /* A5300..A53FF */ + FriBidiPropertyBlockLevel1_0100, /* A5400..A54FF */ + FriBidiPropertyBlockLevel1_0100, /* A5500..A55FF */ + FriBidiPropertyBlockLevel1_0100, /* A5600..A56FF */ + FriBidiPropertyBlockLevel1_0100, /* A5700..A57FF */ + FriBidiPropertyBlockLevel1_0100, /* A5800..A58FF */ + FriBidiPropertyBlockLevel1_0100, /* A5900..A59FF */ + FriBidiPropertyBlockLevel1_0100, /* A5A00..A5AFF */ + FriBidiPropertyBlockLevel1_0100, /* A5B00..A5BFF */ + FriBidiPropertyBlockLevel1_0100, /* A5C00..A5CFF */ + FriBidiPropertyBlockLevel1_0100, /* A5D00..A5DFF */ + FriBidiPropertyBlockLevel1_0100, /* A5E00..A5EFF */ + FriBidiPropertyBlockLevel1_0100, /* A5F00..A5FFF */ + FriBidiPropertyBlockLevel1_0100, /* A6000..A60FF */ + FriBidiPropertyBlockLevel1_0100, /* A6100..A61FF */ + FriBidiPropertyBlockLevel1_0100, /* A6200..A62FF */ + FriBidiPropertyBlockLevel1_0100, /* A6300..A63FF */ + FriBidiPropertyBlockLevel1_0100, /* A6400..A64FF */ + FriBidiPropertyBlockLevel1_0100, /* A6500..A65FF */ + FriBidiPropertyBlockLevel1_0100, /* A6600..A66FF */ + FriBidiPropertyBlockLevel1_0100, /* A6700..A67FF */ + FriBidiPropertyBlockLevel1_0100, /* A6800..A68FF */ + FriBidiPropertyBlockLevel1_0100, /* A6900..A69FF */ + FriBidiPropertyBlockLevel1_0100, /* A6A00..A6AFF */ + FriBidiPropertyBlockLevel1_0100, /* A6B00..A6BFF */ + FriBidiPropertyBlockLevel1_0100, /* A6C00..A6CFF */ + FriBidiPropertyBlockLevel1_0100, /* A6D00..A6DFF */ + FriBidiPropertyBlockLevel1_0100, /* A6E00..A6EFF */ + FriBidiPropertyBlockLevel1_0100, /* A6F00..A6FFF */ + FriBidiPropertyBlockLevel1_0100, /* A7000..A70FF */ + FriBidiPropertyBlockLevel1_0100, /* A7100..A71FF */ + FriBidiPropertyBlockLevel1_0100, /* A7200..A72FF */ + FriBidiPropertyBlockLevel1_0100, /* A7300..A73FF */ + FriBidiPropertyBlockLevel1_0100, /* A7400..A74FF */ + FriBidiPropertyBlockLevel1_0100, /* A7500..A75FF */ + FriBidiPropertyBlockLevel1_0100, /* A7600..A76FF */ + FriBidiPropertyBlockLevel1_0100, /* A7700..A77FF */ + FriBidiPropertyBlockLevel1_0100, /* A7800..A78FF */ + FriBidiPropertyBlockLevel1_0100, /* A7900..A79FF */ + FriBidiPropertyBlockLevel1_0100, /* A7A00..A7AFF */ + FriBidiPropertyBlockLevel1_0100, /* A7B00..A7BFF */ + FriBidiPropertyBlockLevel1_0100, /* A7C00..A7CFF */ + FriBidiPropertyBlockLevel1_0100, /* A7D00..A7DFF */ + FriBidiPropertyBlockLevel1_0100, /* A7E00..A7EFF */ + FriBidiPropertyBlockLevel1_0100, /* A7F00..A7FFF */ + FriBidiPropertyBlockLevel1_0100, /* A8000..A80FF */ + FriBidiPropertyBlockLevel1_0100, /* A8100..A81FF */ + FriBidiPropertyBlockLevel1_0100, /* A8200..A82FF */ + FriBidiPropertyBlockLevel1_0100, /* A8300..A83FF */ + FriBidiPropertyBlockLevel1_0100, /* A8400..A84FF */ + FriBidiPropertyBlockLevel1_0100, /* A8500..A85FF */ + FriBidiPropertyBlockLevel1_0100, /* A8600..A86FF */ + FriBidiPropertyBlockLevel1_0100, /* A8700..A87FF */ + FriBidiPropertyBlockLevel1_0100, /* A8800..A88FF */ + FriBidiPropertyBlockLevel1_0100, /* A8900..A89FF */ + FriBidiPropertyBlockLevel1_0100, /* A8A00..A8AFF */ + FriBidiPropertyBlockLevel1_0100, /* A8B00..A8BFF */ + FriBidiPropertyBlockLevel1_0100, /* A8C00..A8CFF */ + FriBidiPropertyBlockLevel1_0100, /* A8D00..A8DFF */ + FriBidiPropertyBlockLevel1_0100, /* A8E00..A8EFF */ + FriBidiPropertyBlockLevel1_0100, /* A8F00..A8FFF */ + FriBidiPropertyBlockLevel1_0100, /* A9000..A90FF */ + FriBidiPropertyBlockLevel1_0100, /* A9100..A91FF */ + FriBidiPropertyBlockLevel1_0100, /* A9200..A92FF */ + FriBidiPropertyBlockLevel1_0100, /* A9300..A93FF */ + FriBidiPropertyBlockLevel1_0100, /* A9400..A94FF */ + FriBidiPropertyBlockLevel1_0100, /* A9500..A95FF */ + FriBidiPropertyBlockLevel1_0100, /* A9600..A96FF */ + FriBidiPropertyBlockLevel1_0100, /* A9700..A97FF */ + FriBidiPropertyBlockLevel1_0100, /* A9800..A98FF */ + FriBidiPropertyBlockLevel1_0100, /* A9900..A99FF */ + FriBidiPropertyBlockLevel1_0100, /* A9A00..A9AFF */ + FriBidiPropertyBlockLevel1_0100, /* A9B00..A9BFF */ + FriBidiPropertyBlockLevel1_0100, /* A9C00..A9CFF */ + FriBidiPropertyBlockLevel1_0100, /* A9D00..A9DFF */ + FriBidiPropertyBlockLevel1_0100, /* A9E00..A9EFF */ + FriBidiPropertyBlockLevel1_0100, /* A9F00..A9FFF */ + FriBidiPropertyBlockLevel1_0100, /* AA000..AA0FF */ + FriBidiPropertyBlockLevel1_0100, /* AA100..AA1FF */ + FriBidiPropertyBlockLevel1_0100, /* AA200..AA2FF */ + FriBidiPropertyBlockLevel1_0100, /* AA300..AA3FF */ + FriBidiPropertyBlockLevel1_0100, /* AA400..AA4FF */ + FriBidiPropertyBlockLevel1_0100, /* AA500..AA5FF */ + FriBidiPropertyBlockLevel1_0100, /* AA600..AA6FF */ + FriBidiPropertyBlockLevel1_0100, /* AA700..AA7FF */ + FriBidiPropertyBlockLevel1_0100, /* AA800..AA8FF */ + FriBidiPropertyBlockLevel1_0100, /* AA900..AA9FF */ + FriBidiPropertyBlockLevel1_0100, /* AAA00..AAAFF */ + FriBidiPropertyBlockLevel1_0100, /* AAB00..AABFF */ + FriBidiPropertyBlockLevel1_0100, /* AAC00..AACFF */ + FriBidiPropertyBlockLevel1_0100, /* AAD00..AADFF */ + FriBidiPropertyBlockLevel1_0100, /* AAE00..AAEFF */ + FriBidiPropertyBlockLevel1_0100, /* AAF00..AAFFF */ + FriBidiPropertyBlockLevel1_0100, /* AB000..AB0FF */ + FriBidiPropertyBlockLevel1_0100, /* AB100..AB1FF */ + FriBidiPropertyBlockLevel1_0100, /* AB200..AB2FF */ + FriBidiPropertyBlockLevel1_0100, /* AB300..AB3FF */ + FriBidiPropertyBlockLevel1_0100, /* AB400..AB4FF */ + FriBidiPropertyBlockLevel1_0100, /* AB500..AB5FF */ + FriBidiPropertyBlockLevel1_0100, /* AB600..AB6FF */ + FriBidiPropertyBlockLevel1_0100, /* AB700..AB7FF */ + FriBidiPropertyBlockLevel1_0100, /* AB800..AB8FF */ + FriBidiPropertyBlockLevel1_0100, /* AB900..AB9FF */ + FriBidiPropertyBlockLevel1_0100, /* ABA00..ABAFF */ + FriBidiPropertyBlockLevel1_0100, /* ABB00..ABBFF */ + FriBidiPropertyBlockLevel1_0100, /* ABC00..ABCFF */ + FriBidiPropertyBlockLevel1_0100, /* ABD00..ABDFF */ + FriBidiPropertyBlockLevel1_0100, /* ABE00..ABEFF */ + FriBidiPropertyBlockLevel1_0100, /* ABF00..ABFFF */ + FriBidiPropertyBlockLevel1_0100, /* AC000..AC0FF */ + FriBidiPropertyBlockLevel1_0100, /* AC100..AC1FF */ + FriBidiPropertyBlockLevel1_0100, /* AC200..AC2FF */ + FriBidiPropertyBlockLevel1_0100, /* AC300..AC3FF */ + FriBidiPropertyBlockLevel1_0100, /* AC400..AC4FF */ + FriBidiPropertyBlockLevel1_0100, /* AC500..AC5FF */ + FriBidiPropertyBlockLevel1_0100, /* AC600..AC6FF */ + FriBidiPropertyBlockLevel1_0100, /* AC700..AC7FF */ + FriBidiPropertyBlockLevel1_0100, /* AC800..AC8FF */ + FriBidiPropertyBlockLevel1_0100, /* AC900..AC9FF */ + FriBidiPropertyBlockLevel1_0100, /* ACA00..ACAFF */ + FriBidiPropertyBlockLevel1_0100, /* ACB00..ACBFF */ + FriBidiPropertyBlockLevel1_0100, /* ACC00..ACCFF */ + FriBidiPropertyBlockLevel1_0100, /* ACD00..ACDFF */ + FriBidiPropertyBlockLevel1_0100, /* ACE00..ACEFF */ + FriBidiPropertyBlockLevel1_0100, /* ACF00..ACFFF */ + FriBidiPropertyBlockLevel1_0100, /* AD000..AD0FF */ + FriBidiPropertyBlockLevel1_0100, /* AD100..AD1FF */ + FriBidiPropertyBlockLevel1_0100, /* AD200..AD2FF */ + FriBidiPropertyBlockLevel1_0100, /* AD300..AD3FF */ + FriBidiPropertyBlockLevel1_0100, /* AD400..AD4FF */ + FriBidiPropertyBlockLevel1_0100, /* AD500..AD5FF */ + FriBidiPropertyBlockLevel1_0100, /* AD600..AD6FF */ + FriBidiPropertyBlockLevel1_0100, /* AD700..AD7FF */ + FriBidiPropertyBlockLevel1_0100, /* AD800..AD8FF */ + FriBidiPropertyBlockLevel1_0100, /* AD900..AD9FF */ + FriBidiPropertyBlockLevel1_0100, /* ADA00..ADAFF */ + FriBidiPropertyBlockLevel1_0100, /* ADB00..ADBFF */ + FriBidiPropertyBlockLevel1_0100, /* ADC00..ADCFF */ + FriBidiPropertyBlockLevel1_0100, /* ADD00..ADDFF */ + FriBidiPropertyBlockLevel1_0100, /* ADE00..ADEFF */ + FriBidiPropertyBlockLevel1_0100, /* ADF00..ADFFF */ + FriBidiPropertyBlockLevel1_0100, /* AE000..AE0FF */ + FriBidiPropertyBlockLevel1_0100, /* AE100..AE1FF */ + FriBidiPropertyBlockLevel1_0100, /* AE200..AE2FF */ + FriBidiPropertyBlockLevel1_0100, /* AE300..AE3FF */ + FriBidiPropertyBlockLevel1_0100, /* AE400..AE4FF */ + FriBidiPropertyBlockLevel1_0100, /* AE500..AE5FF */ + FriBidiPropertyBlockLevel1_0100, /* AE600..AE6FF */ + FriBidiPropertyBlockLevel1_0100, /* AE700..AE7FF */ + FriBidiPropertyBlockLevel1_0100, /* AE800..AE8FF */ + FriBidiPropertyBlockLevel1_0100, /* AE900..AE9FF */ + FriBidiPropertyBlockLevel1_0100, /* AEA00..AEAFF */ + FriBidiPropertyBlockLevel1_0100, /* AEB00..AEBFF */ + FriBidiPropertyBlockLevel1_0100, /* AEC00..AECFF */ + FriBidiPropertyBlockLevel1_0100, /* AED00..AEDFF */ + FriBidiPropertyBlockLevel1_0100, /* AEE00..AEEFF */ + FriBidiPropertyBlockLevel1_0100, /* AEF00..AEFFF */ + FriBidiPropertyBlockLevel1_0100, /* AF000..AF0FF */ + FriBidiPropertyBlockLevel1_0100, /* AF100..AF1FF */ + FriBidiPropertyBlockLevel1_0100, /* AF200..AF2FF */ + FriBidiPropertyBlockLevel1_0100, /* AF300..AF3FF */ + FriBidiPropertyBlockLevel1_0100, /* AF400..AF4FF */ + FriBidiPropertyBlockLevel1_0100, /* AF500..AF5FF */ + FriBidiPropertyBlockLevel1_0100, /* AF600..AF6FF */ + FriBidiPropertyBlockLevel1_0100, /* AF700..AF7FF */ + FriBidiPropertyBlockLevel1_0100, /* AF800..AF8FF */ + FriBidiPropertyBlockLevel1_0100, /* AF900..AF9FF */ + FriBidiPropertyBlockLevel1_0100, /* AFA00..AFAFF */ + FriBidiPropertyBlockLevel1_0100, /* AFB00..AFBFF */ + FriBidiPropertyBlockLevel1_0100, /* AFC00..AFCFF */ + FriBidiPropertyBlockLevel1_0100, /* AFD00..AFDFF */ + FriBidiPropertyBlockLevel1_0100, /* AFE00..AFEFF */ + FriBidiPropertyBlockLevel1_0100, /* AFF00..AFFFF */ + FriBidiPropertyBlockLevel1_0100, /* B0000..B00FF */ + FriBidiPropertyBlockLevel1_0100, /* B0100..B01FF */ + FriBidiPropertyBlockLevel1_0100, /* B0200..B02FF */ + FriBidiPropertyBlockLevel1_0100, /* B0300..B03FF */ + FriBidiPropertyBlockLevel1_0100, /* B0400..B04FF */ + FriBidiPropertyBlockLevel1_0100, /* B0500..B05FF */ + FriBidiPropertyBlockLevel1_0100, /* B0600..B06FF */ + FriBidiPropertyBlockLevel1_0100, /* B0700..B07FF */ + FriBidiPropertyBlockLevel1_0100, /* B0800..B08FF */ + FriBidiPropertyBlockLevel1_0100, /* B0900..B09FF */ + FriBidiPropertyBlockLevel1_0100, /* B0A00..B0AFF */ + FriBidiPropertyBlockLevel1_0100, /* B0B00..B0BFF */ + FriBidiPropertyBlockLevel1_0100, /* B0C00..B0CFF */ + FriBidiPropertyBlockLevel1_0100, /* B0D00..B0DFF */ + FriBidiPropertyBlockLevel1_0100, /* B0E00..B0EFF */ + FriBidiPropertyBlockLevel1_0100, /* B0F00..B0FFF */ + FriBidiPropertyBlockLevel1_0100, /* B1000..B10FF */ + FriBidiPropertyBlockLevel1_0100, /* B1100..B11FF */ + FriBidiPropertyBlockLevel1_0100, /* B1200..B12FF */ + FriBidiPropertyBlockLevel1_0100, /* B1300..B13FF */ + FriBidiPropertyBlockLevel1_0100, /* B1400..B14FF */ + FriBidiPropertyBlockLevel1_0100, /* B1500..B15FF */ + FriBidiPropertyBlockLevel1_0100, /* B1600..B16FF */ + FriBidiPropertyBlockLevel1_0100, /* B1700..B17FF */ + FriBidiPropertyBlockLevel1_0100, /* B1800..B18FF */ + FriBidiPropertyBlockLevel1_0100, /* B1900..B19FF */ + FriBidiPropertyBlockLevel1_0100, /* B1A00..B1AFF */ + FriBidiPropertyBlockLevel1_0100, /* B1B00..B1BFF */ + FriBidiPropertyBlockLevel1_0100, /* B1C00..B1CFF */ + FriBidiPropertyBlockLevel1_0100, /* B1D00..B1DFF */ + FriBidiPropertyBlockLevel1_0100, /* B1E00..B1EFF */ + FriBidiPropertyBlockLevel1_0100, /* B1F00..B1FFF */ + FriBidiPropertyBlockLevel1_0100, /* B2000..B20FF */ + FriBidiPropertyBlockLevel1_0100, /* B2100..B21FF */ + FriBidiPropertyBlockLevel1_0100, /* B2200..B22FF */ + FriBidiPropertyBlockLevel1_0100, /* B2300..B23FF */ + FriBidiPropertyBlockLevel1_0100, /* B2400..B24FF */ + FriBidiPropertyBlockLevel1_0100, /* B2500..B25FF */ + FriBidiPropertyBlockLevel1_0100, /* B2600..B26FF */ + FriBidiPropertyBlockLevel1_0100, /* B2700..B27FF */ + FriBidiPropertyBlockLevel1_0100, /* B2800..B28FF */ + FriBidiPropertyBlockLevel1_0100, /* B2900..B29FF */ + FriBidiPropertyBlockLevel1_0100, /* B2A00..B2AFF */ + FriBidiPropertyBlockLevel1_0100, /* B2B00..B2BFF */ + FriBidiPropertyBlockLevel1_0100, /* B2C00..B2CFF */ + FriBidiPropertyBlockLevel1_0100, /* B2D00..B2DFF */ + FriBidiPropertyBlockLevel1_0100, /* B2E00..B2EFF */ + FriBidiPropertyBlockLevel1_0100, /* B2F00..B2FFF */ + FriBidiPropertyBlockLevel1_0100, /* B3000..B30FF */ + FriBidiPropertyBlockLevel1_0100, /* B3100..B31FF */ + FriBidiPropertyBlockLevel1_0100, /* B3200..B32FF */ + FriBidiPropertyBlockLevel1_0100, /* B3300..B33FF */ + FriBidiPropertyBlockLevel1_0100, /* B3400..B34FF */ + FriBidiPropertyBlockLevel1_0100, /* B3500..B35FF */ + FriBidiPropertyBlockLevel1_0100, /* B3600..B36FF */ + FriBidiPropertyBlockLevel1_0100, /* B3700..B37FF */ + FriBidiPropertyBlockLevel1_0100, /* B3800..B38FF */ + FriBidiPropertyBlockLevel1_0100, /* B3900..B39FF */ + FriBidiPropertyBlockLevel1_0100, /* B3A00..B3AFF */ + FriBidiPropertyBlockLevel1_0100, /* B3B00..B3BFF */ + FriBidiPropertyBlockLevel1_0100, /* B3C00..B3CFF */ + FriBidiPropertyBlockLevel1_0100, /* B3D00..B3DFF */ + FriBidiPropertyBlockLevel1_0100, /* B3E00..B3EFF */ + FriBidiPropertyBlockLevel1_0100, /* B3F00..B3FFF */ + FriBidiPropertyBlockLevel1_0100, /* B4000..B40FF */ + FriBidiPropertyBlockLevel1_0100, /* B4100..B41FF */ + FriBidiPropertyBlockLevel1_0100, /* B4200..B42FF */ + FriBidiPropertyBlockLevel1_0100, /* B4300..B43FF */ + FriBidiPropertyBlockLevel1_0100, /* B4400..B44FF */ + FriBidiPropertyBlockLevel1_0100, /* B4500..B45FF */ + FriBidiPropertyBlockLevel1_0100, /* B4600..B46FF */ + FriBidiPropertyBlockLevel1_0100, /* B4700..B47FF */ + FriBidiPropertyBlockLevel1_0100, /* B4800..B48FF */ + FriBidiPropertyBlockLevel1_0100, /* B4900..B49FF */ + FriBidiPropertyBlockLevel1_0100, /* B4A00..B4AFF */ + FriBidiPropertyBlockLevel1_0100, /* B4B00..B4BFF */ + FriBidiPropertyBlockLevel1_0100, /* B4C00..B4CFF */ + FriBidiPropertyBlockLevel1_0100, /* B4D00..B4DFF */ + FriBidiPropertyBlockLevel1_0100, /* B4E00..B4EFF */ + FriBidiPropertyBlockLevel1_0100, /* B4F00..B4FFF */ + FriBidiPropertyBlockLevel1_0100, /* B5000..B50FF */ + FriBidiPropertyBlockLevel1_0100, /* B5100..B51FF */ + FriBidiPropertyBlockLevel1_0100, /* B5200..B52FF */ + FriBidiPropertyBlockLevel1_0100, /* B5300..B53FF */ + FriBidiPropertyBlockLevel1_0100, /* B5400..B54FF */ + FriBidiPropertyBlockLevel1_0100, /* B5500..B55FF */ + FriBidiPropertyBlockLevel1_0100, /* B5600..B56FF */ + FriBidiPropertyBlockLevel1_0100, /* B5700..B57FF */ + FriBidiPropertyBlockLevel1_0100, /* B5800..B58FF */ + FriBidiPropertyBlockLevel1_0100, /* B5900..B59FF */ + FriBidiPropertyBlockLevel1_0100, /* B5A00..B5AFF */ + FriBidiPropertyBlockLevel1_0100, /* B5B00..B5BFF */ + FriBidiPropertyBlockLevel1_0100, /* B5C00..B5CFF */ + FriBidiPropertyBlockLevel1_0100, /* B5D00..B5DFF */ + FriBidiPropertyBlockLevel1_0100, /* B5E00..B5EFF */ + FriBidiPropertyBlockLevel1_0100, /* B5F00..B5FFF */ + FriBidiPropertyBlockLevel1_0100, /* B6000..B60FF */ + FriBidiPropertyBlockLevel1_0100, /* B6100..B61FF */ + FriBidiPropertyBlockLevel1_0100, /* B6200..B62FF */ + FriBidiPropertyBlockLevel1_0100, /* B6300..B63FF */ + FriBidiPropertyBlockLevel1_0100, /* B6400..B64FF */ + FriBidiPropertyBlockLevel1_0100, /* B6500..B65FF */ + FriBidiPropertyBlockLevel1_0100, /* B6600..B66FF */ + FriBidiPropertyBlockLevel1_0100, /* B6700..B67FF */ + FriBidiPropertyBlockLevel1_0100, /* B6800..B68FF */ + FriBidiPropertyBlockLevel1_0100, /* B6900..B69FF */ + FriBidiPropertyBlockLevel1_0100, /* B6A00..B6AFF */ + FriBidiPropertyBlockLevel1_0100, /* B6B00..B6BFF */ + FriBidiPropertyBlockLevel1_0100, /* B6C00..B6CFF */ + FriBidiPropertyBlockLevel1_0100, /* B6D00..B6DFF */ + FriBidiPropertyBlockLevel1_0100, /* B6E00..B6EFF */ + FriBidiPropertyBlockLevel1_0100, /* B6F00..B6FFF */ + FriBidiPropertyBlockLevel1_0100, /* B7000..B70FF */ + FriBidiPropertyBlockLevel1_0100, /* B7100..B71FF */ + FriBidiPropertyBlockLevel1_0100, /* B7200..B72FF */ + FriBidiPropertyBlockLevel1_0100, /* B7300..B73FF */ + FriBidiPropertyBlockLevel1_0100, /* B7400..B74FF */ + FriBidiPropertyBlockLevel1_0100, /* B7500..B75FF */ + FriBidiPropertyBlockLevel1_0100, /* B7600..B76FF */ + FriBidiPropertyBlockLevel1_0100, /* B7700..B77FF */ + FriBidiPropertyBlockLevel1_0100, /* B7800..B78FF */ + FriBidiPropertyBlockLevel1_0100, /* B7900..B79FF */ + FriBidiPropertyBlockLevel1_0100, /* B7A00..B7AFF */ + FriBidiPropertyBlockLevel1_0100, /* B7B00..B7BFF */ + FriBidiPropertyBlockLevel1_0100, /* B7C00..B7CFF */ + FriBidiPropertyBlockLevel1_0100, /* B7D00..B7DFF */ + FriBidiPropertyBlockLevel1_0100, /* B7E00..B7EFF */ + FriBidiPropertyBlockLevel1_0100, /* B7F00..B7FFF */ + FriBidiPropertyBlockLevel1_0100, /* B8000..B80FF */ + FriBidiPropertyBlockLevel1_0100, /* B8100..B81FF */ + FriBidiPropertyBlockLevel1_0100, /* B8200..B82FF */ + FriBidiPropertyBlockLevel1_0100, /* B8300..B83FF */ + FriBidiPropertyBlockLevel1_0100, /* B8400..B84FF */ + FriBidiPropertyBlockLevel1_0100, /* B8500..B85FF */ + FriBidiPropertyBlockLevel1_0100, /* B8600..B86FF */ + FriBidiPropertyBlockLevel1_0100, /* B8700..B87FF */ + FriBidiPropertyBlockLevel1_0100, /* B8800..B88FF */ + FriBidiPropertyBlockLevel1_0100, /* B8900..B89FF */ + FriBidiPropertyBlockLevel1_0100, /* B8A00..B8AFF */ + FriBidiPropertyBlockLevel1_0100, /* B8B00..B8BFF */ + FriBidiPropertyBlockLevel1_0100, /* B8C00..B8CFF */ + FriBidiPropertyBlockLevel1_0100, /* B8D00..B8DFF */ + FriBidiPropertyBlockLevel1_0100, /* B8E00..B8EFF */ + FriBidiPropertyBlockLevel1_0100, /* B8F00..B8FFF */ + FriBidiPropertyBlockLevel1_0100, /* B9000..B90FF */ + FriBidiPropertyBlockLevel1_0100, /* B9100..B91FF */ + FriBidiPropertyBlockLevel1_0100, /* B9200..B92FF */ + FriBidiPropertyBlockLevel1_0100, /* B9300..B93FF */ + FriBidiPropertyBlockLevel1_0100, /* B9400..B94FF */ + FriBidiPropertyBlockLevel1_0100, /* B9500..B95FF */ + FriBidiPropertyBlockLevel1_0100, /* B9600..B96FF */ + FriBidiPropertyBlockLevel1_0100, /* B9700..B97FF */ + FriBidiPropertyBlockLevel1_0100, /* B9800..B98FF */ + FriBidiPropertyBlockLevel1_0100, /* B9900..B99FF */ + FriBidiPropertyBlockLevel1_0100, /* B9A00..B9AFF */ + FriBidiPropertyBlockLevel1_0100, /* B9B00..B9BFF */ + FriBidiPropertyBlockLevel1_0100, /* B9C00..B9CFF */ + FriBidiPropertyBlockLevel1_0100, /* B9D00..B9DFF */ + FriBidiPropertyBlockLevel1_0100, /* B9E00..B9EFF */ + FriBidiPropertyBlockLevel1_0100, /* B9F00..B9FFF */ + FriBidiPropertyBlockLevel1_0100, /* BA000..BA0FF */ + FriBidiPropertyBlockLevel1_0100, /* BA100..BA1FF */ + FriBidiPropertyBlockLevel1_0100, /* BA200..BA2FF */ + FriBidiPropertyBlockLevel1_0100, /* BA300..BA3FF */ + FriBidiPropertyBlockLevel1_0100, /* BA400..BA4FF */ + FriBidiPropertyBlockLevel1_0100, /* BA500..BA5FF */ + FriBidiPropertyBlockLevel1_0100, /* BA600..BA6FF */ + FriBidiPropertyBlockLevel1_0100, /* BA700..BA7FF */ + FriBidiPropertyBlockLevel1_0100, /* BA800..BA8FF */ + FriBidiPropertyBlockLevel1_0100, /* BA900..BA9FF */ + FriBidiPropertyBlockLevel1_0100, /* BAA00..BAAFF */ + FriBidiPropertyBlockLevel1_0100, /* BAB00..BABFF */ + FriBidiPropertyBlockLevel1_0100, /* BAC00..BACFF */ + FriBidiPropertyBlockLevel1_0100, /* BAD00..BADFF */ + FriBidiPropertyBlockLevel1_0100, /* BAE00..BAEFF */ + FriBidiPropertyBlockLevel1_0100, /* BAF00..BAFFF */ + FriBidiPropertyBlockLevel1_0100, /* BB000..BB0FF */ + FriBidiPropertyBlockLevel1_0100, /* BB100..BB1FF */ + FriBidiPropertyBlockLevel1_0100, /* BB200..BB2FF */ + FriBidiPropertyBlockLevel1_0100, /* BB300..BB3FF */ + FriBidiPropertyBlockLevel1_0100, /* BB400..BB4FF */ + FriBidiPropertyBlockLevel1_0100, /* BB500..BB5FF */ + FriBidiPropertyBlockLevel1_0100, /* BB600..BB6FF */ + FriBidiPropertyBlockLevel1_0100, /* BB700..BB7FF */ + FriBidiPropertyBlockLevel1_0100, /* BB800..BB8FF */ + FriBidiPropertyBlockLevel1_0100, /* BB900..BB9FF */ + FriBidiPropertyBlockLevel1_0100, /* BBA00..BBAFF */ + FriBidiPropertyBlockLevel1_0100, /* BBB00..BBBFF */ + FriBidiPropertyBlockLevel1_0100, /* BBC00..BBCFF */ + FriBidiPropertyBlockLevel1_0100, /* BBD00..BBDFF */ + FriBidiPropertyBlockLevel1_0100, /* BBE00..BBEFF */ + FriBidiPropertyBlockLevel1_0100, /* BBF00..BBFFF */ + FriBidiPropertyBlockLevel1_0100, /* BC000..BC0FF */ + FriBidiPropertyBlockLevel1_0100, /* BC100..BC1FF */ + FriBidiPropertyBlockLevel1_0100, /* BC200..BC2FF */ + FriBidiPropertyBlockLevel1_0100, /* BC300..BC3FF */ + FriBidiPropertyBlockLevel1_0100, /* BC400..BC4FF */ + FriBidiPropertyBlockLevel1_0100, /* BC500..BC5FF */ + FriBidiPropertyBlockLevel1_0100, /* BC600..BC6FF */ + FriBidiPropertyBlockLevel1_0100, /* BC700..BC7FF */ + FriBidiPropertyBlockLevel1_0100, /* BC800..BC8FF */ + FriBidiPropertyBlockLevel1_0100, /* BC900..BC9FF */ + FriBidiPropertyBlockLevel1_0100, /* BCA00..BCAFF */ + FriBidiPropertyBlockLevel1_0100, /* BCB00..BCBFF */ + FriBidiPropertyBlockLevel1_0100, /* BCC00..BCCFF */ + FriBidiPropertyBlockLevel1_0100, /* BCD00..BCDFF */ + FriBidiPropertyBlockLevel1_0100, /* BCE00..BCEFF */ + FriBidiPropertyBlockLevel1_0100, /* BCF00..BCFFF */ + FriBidiPropertyBlockLevel1_0100, /* BD000..BD0FF */ + FriBidiPropertyBlockLevel1_0100, /* BD100..BD1FF */ + FriBidiPropertyBlockLevel1_0100, /* BD200..BD2FF */ + FriBidiPropertyBlockLevel1_0100, /* BD300..BD3FF */ + FriBidiPropertyBlockLevel1_0100, /* BD400..BD4FF */ + FriBidiPropertyBlockLevel1_0100, /* BD500..BD5FF */ + FriBidiPropertyBlockLevel1_0100, /* BD600..BD6FF */ + FriBidiPropertyBlockLevel1_0100, /* BD700..BD7FF */ + FriBidiPropertyBlockLevel1_0100, /* BD800..BD8FF */ + FriBidiPropertyBlockLevel1_0100, /* BD900..BD9FF */ + FriBidiPropertyBlockLevel1_0100, /* BDA00..BDAFF */ + FriBidiPropertyBlockLevel1_0100, /* BDB00..BDBFF */ + FriBidiPropertyBlockLevel1_0100, /* BDC00..BDCFF */ + FriBidiPropertyBlockLevel1_0100, /* BDD00..BDDFF */ + FriBidiPropertyBlockLevel1_0100, /* BDE00..BDEFF */ + FriBidiPropertyBlockLevel1_0100, /* BDF00..BDFFF */ + FriBidiPropertyBlockLevel1_0100, /* BE000..BE0FF */ + FriBidiPropertyBlockLevel1_0100, /* BE100..BE1FF */ + FriBidiPropertyBlockLevel1_0100, /* BE200..BE2FF */ + FriBidiPropertyBlockLevel1_0100, /* BE300..BE3FF */ + FriBidiPropertyBlockLevel1_0100, /* BE400..BE4FF */ + FriBidiPropertyBlockLevel1_0100, /* BE500..BE5FF */ + FriBidiPropertyBlockLevel1_0100, /* BE600..BE6FF */ + FriBidiPropertyBlockLevel1_0100, /* BE700..BE7FF */ + FriBidiPropertyBlockLevel1_0100, /* BE800..BE8FF */ + FriBidiPropertyBlockLevel1_0100, /* BE900..BE9FF */ + FriBidiPropertyBlockLevel1_0100, /* BEA00..BEAFF */ + FriBidiPropertyBlockLevel1_0100, /* BEB00..BEBFF */ + FriBidiPropertyBlockLevel1_0100, /* BEC00..BECFF */ + FriBidiPropertyBlockLevel1_0100, /* BED00..BEDFF */ + FriBidiPropertyBlockLevel1_0100, /* BEE00..BEEFF */ + FriBidiPropertyBlockLevel1_0100, /* BEF00..BEFFF */ + FriBidiPropertyBlockLevel1_0100, /* BF000..BF0FF */ + FriBidiPropertyBlockLevel1_0100, /* BF100..BF1FF */ + FriBidiPropertyBlockLevel1_0100, /* BF200..BF2FF */ + FriBidiPropertyBlockLevel1_0100, /* BF300..BF3FF */ + FriBidiPropertyBlockLevel1_0100, /* BF400..BF4FF */ + FriBidiPropertyBlockLevel1_0100, /* BF500..BF5FF */ + FriBidiPropertyBlockLevel1_0100, /* BF600..BF6FF */ + FriBidiPropertyBlockLevel1_0100, /* BF700..BF7FF */ + FriBidiPropertyBlockLevel1_0100, /* BF800..BF8FF */ + FriBidiPropertyBlockLevel1_0100, /* BF900..BF9FF */ + FriBidiPropertyBlockLevel1_0100, /* BFA00..BFAFF */ + FriBidiPropertyBlockLevel1_0100, /* BFB00..BFBFF */ + FriBidiPropertyBlockLevel1_0100, /* BFC00..BFCFF */ + FriBidiPropertyBlockLevel1_0100, /* BFD00..BFDFF */ + FriBidiPropertyBlockLevel1_0100, /* BFE00..BFEFF */ + FriBidiPropertyBlockLevel1_0100, /* BFF00..BFFFF */ + FriBidiPropertyBlockLevel1_0100, /* C0000..C00FF */ + FriBidiPropertyBlockLevel1_0100, /* C0100..C01FF */ + FriBidiPropertyBlockLevel1_0100, /* C0200..C02FF */ + FriBidiPropertyBlockLevel1_0100, /* C0300..C03FF */ + FriBidiPropertyBlockLevel1_0100, /* C0400..C04FF */ + FriBidiPropertyBlockLevel1_0100, /* C0500..C05FF */ + FriBidiPropertyBlockLevel1_0100, /* C0600..C06FF */ + FriBidiPropertyBlockLevel1_0100, /* C0700..C07FF */ + FriBidiPropertyBlockLevel1_0100, /* C0800..C08FF */ + FriBidiPropertyBlockLevel1_0100, /* C0900..C09FF */ + FriBidiPropertyBlockLevel1_0100, /* C0A00..C0AFF */ + FriBidiPropertyBlockLevel1_0100, /* C0B00..C0BFF */ + FriBidiPropertyBlockLevel1_0100, /* C0C00..C0CFF */ + FriBidiPropertyBlockLevel1_0100, /* C0D00..C0DFF */ + FriBidiPropertyBlockLevel1_0100, /* C0E00..C0EFF */ + FriBidiPropertyBlockLevel1_0100, /* C0F00..C0FFF */ + FriBidiPropertyBlockLevel1_0100, /* C1000..C10FF */ + FriBidiPropertyBlockLevel1_0100, /* C1100..C11FF */ + FriBidiPropertyBlockLevel1_0100, /* C1200..C12FF */ + FriBidiPropertyBlockLevel1_0100, /* C1300..C13FF */ + FriBidiPropertyBlockLevel1_0100, /* C1400..C14FF */ + FriBidiPropertyBlockLevel1_0100, /* C1500..C15FF */ + FriBidiPropertyBlockLevel1_0100, /* C1600..C16FF */ + FriBidiPropertyBlockLevel1_0100, /* C1700..C17FF */ + FriBidiPropertyBlockLevel1_0100, /* C1800..C18FF */ + FriBidiPropertyBlockLevel1_0100, /* C1900..C19FF */ + FriBidiPropertyBlockLevel1_0100, /* C1A00..C1AFF */ + FriBidiPropertyBlockLevel1_0100, /* C1B00..C1BFF */ + FriBidiPropertyBlockLevel1_0100, /* C1C00..C1CFF */ + FriBidiPropertyBlockLevel1_0100, /* C1D00..C1DFF */ + FriBidiPropertyBlockLevel1_0100, /* C1E00..C1EFF */ + FriBidiPropertyBlockLevel1_0100, /* C1F00..C1FFF */ + FriBidiPropertyBlockLevel1_0100, /* C2000..C20FF */ + FriBidiPropertyBlockLevel1_0100, /* C2100..C21FF */ + FriBidiPropertyBlockLevel1_0100, /* C2200..C22FF */ + FriBidiPropertyBlockLevel1_0100, /* C2300..C23FF */ + FriBidiPropertyBlockLevel1_0100, /* C2400..C24FF */ + FriBidiPropertyBlockLevel1_0100, /* C2500..C25FF */ + FriBidiPropertyBlockLevel1_0100, /* C2600..C26FF */ + FriBidiPropertyBlockLevel1_0100, /* C2700..C27FF */ + FriBidiPropertyBlockLevel1_0100, /* C2800..C28FF */ + FriBidiPropertyBlockLevel1_0100, /* C2900..C29FF */ + FriBidiPropertyBlockLevel1_0100, /* C2A00..C2AFF */ + FriBidiPropertyBlockLevel1_0100, /* C2B00..C2BFF */ + FriBidiPropertyBlockLevel1_0100, /* C2C00..C2CFF */ + FriBidiPropertyBlockLevel1_0100, /* C2D00..C2DFF */ + FriBidiPropertyBlockLevel1_0100, /* C2E00..C2EFF */ + FriBidiPropertyBlockLevel1_0100, /* C2F00..C2FFF */ + FriBidiPropertyBlockLevel1_0100, /* C3000..C30FF */ + FriBidiPropertyBlockLevel1_0100, /* C3100..C31FF */ + FriBidiPropertyBlockLevel1_0100, /* C3200..C32FF */ + FriBidiPropertyBlockLevel1_0100, /* C3300..C33FF */ + FriBidiPropertyBlockLevel1_0100, /* C3400..C34FF */ + FriBidiPropertyBlockLevel1_0100, /* C3500..C35FF */ + FriBidiPropertyBlockLevel1_0100, /* C3600..C36FF */ + FriBidiPropertyBlockLevel1_0100, /* C3700..C37FF */ + FriBidiPropertyBlockLevel1_0100, /* C3800..C38FF */ + FriBidiPropertyBlockLevel1_0100, /* C3900..C39FF */ + FriBidiPropertyBlockLevel1_0100, /* C3A00..C3AFF */ + FriBidiPropertyBlockLevel1_0100, /* C3B00..C3BFF */ + FriBidiPropertyBlockLevel1_0100, /* C3C00..C3CFF */ + FriBidiPropertyBlockLevel1_0100, /* C3D00..C3DFF */ + FriBidiPropertyBlockLevel1_0100, /* C3E00..C3EFF */ + FriBidiPropertyBlockLevel1_0100, /* C3F00..C3FFF */ + FriBidiPropertyBlockLevel1_0100, /* C4000..C40FF */ + FriBidiPropertyBlockLevel1_0100, /* C4100..C41FF */ + FriBidiPropertyBlockLevel1_0100, /* C4200..C42FF */ + FriBidiPropertyBlockLevel1_0100, /* C4300..C43FF */ + FriBidiPropertyBlockLevel1_0100, /* C4400..C44FF */ + FriBidiPropertyBlockLevel1_0100, /* C4500..C45FF */ + FriBidiPropertyBlockLevel1_0100, /* C4600..C46FF */ + FriBidiPropertyBlockLevel1_0100, /* C4700..C47FF */ + FriBidiPropertyBlockLevel1_0100, /* C4800..C48FF */ + FriBidiPropertyBlockLevel1_0100, /* C4900..C49FF */ + FriBidiPropertyBlockLevel1_0100, /* C4A00..C4AFF */ + FriBidiPropertyBlockLevel1_0100, /* C4B00..C4BFF */ + FriBidiPropertyBlockLevel1_0100, /* C4C00..C4CFF */ + FriBidiPropertyBlockLevel1_0100, /* C4D00..C4DFF */ + FriBidiPropertyBlockLevel1_0100, /* C4E00..C4EFF */ + FriBidiPropertyBlockLevel1_0100, /* C4F00..C4FFF */ + FriBidiPropertyBlockLevel1_0100, /* C5000..C50FF */ + FriBidiPropertyBlockLevel1_0100, /* C5100..C51FF */ + FriBidiPropertyBlockLevel1_0100, /* C5200..C52FF */ + FriBidiPropertyBlockLevel1_0100, /* C5300..C53FF */ + FriBidiPropertyBlockLevel1_0100, /* C5400..C54FF */ + FriBidiPropertyBlockLevel1_0100, /* C5500..C55FF */ + FriBidiPropertyBlockLevel1_0100, /* C5600..C56FF */ + FriBidiPropertyBlockLevel1_0100, /* C5700..C57FF */ + FriBidiPropertyBlockLevel1_0100, /* C5800..C58FF */ + FriBidiPropertyBlockLevel1_0100, /* C5900..C59FF */ + FriBidiPropertyBlockLevel1_0100, /* C5A00..C5AFF */ + FriBidiPropertyBlockLevel1_0100, /* C5B00..C5BFF */ + FriBidiPropertyBlockLevel1_0100, /* C5C00..C5CFF */ + FriBidiPropertyBlockLevel1_0100, /* C5D00..C5DFF */ + FriBidiPropertyBlockLevel1_0100, /* C5E00..C5EFF */ + FriBidiPropertyBlockLevel1_0100, /* C5F00..C5FFF */ + FriBidiPropertyBlockLevel1_0100, /* C6000..C60FF */ + FriBidiPropertyBlockLevel1_0100, /* C6100..C61FF */ + FriBidiPropertyBlockLevel1_0100, /* C6200..C62FF */ + FriBidiPropertyBlockLevel1_0100, /* C6300..C63FF */ + FriBidiPropertyBlockLevel1_0100, /* C6400..C64FF */ + FriBidiPropertyBlockLevel1_0100, /* C6500..C65FF */ + FriBidiPropertyBlockLevel1_0100, /* C6600..C66FF */ + FriBidiPropertyBlockLevel1_0100, /* C6700..C67FF */ + FriBidiPropertyBlockLevel1_0100, /* C6800..C68FF */ + FriBidiPropertyBlockLevel1_0100, /* C6900..C69FF */ + FriBidiPropertyBlockLevel1_0100, /* C6A00..C6AFF */ + FriBidiPropertyBlockLevel1_0100, /* C6B00..C6BFF */ + FriBidiPropertyBlockLevel1_0100, /* C6C00..C6CFF */ + FriBidiPropertyBlockLevel1_0100, /* C6D00..C6DFF */ + FriBidiPropertyBlockLevel1_0100, /* C6E00..C6EFF */ + FriBidiPropertyBlockLevel1_0100, /* C6F00..C6FFF */ + FriBidiPropertyBlockLevel1_0100, /* C7000..C70FF */ + FriBidiPropertyBlockLevel1_0100, /* C7100..C71FF */ + FriBidiPropertyBlockLevel1_0100, /* C7200..C72FF */ + FriBidiPropertyBlockLevel1_0100, /* C7300..C73FF */ + FriBidiPropertyBlockLevel1_0100, /* C7400..C74FF */ + FriBidiPropertyBlockLevel1_0100, /* C7500..C75FF */ + FriBidiPropertyBlockLevel1_0100, /* C7600..C76FF */ + FriBidiPropertyBlockLevel1_0100, /* C7700..C77FF */ + FriBidiPropertyBlockLevel1_0100, /* C7800..C78FF */ + FriBidiPropertyBlockLevel1_0100, /* C7900..C79FF */ + FriBidiPropertyBlockLevel1_0100, /* C7A00..C7AFF */ + FriBidiPropertyBlockLevel1_0100, /* C7B00..C7BFF */ + FriBidiPropertyBlockLevel1_0100, /* C7C00..C7CFF */ + FriBidiPropertyBlockLevel1_0100, /* C7D00..C7DFF */ + FriBidiPropertyBlockLevel1_0100, /* C7E00..C7EFF */ + FriBidiPropertyBlockLevel1_0100, /* C7F00..C7FFF */ + FriBidiPropertyBlockLevel1_0100, /* C8000..C80FF */ + FriBidiPropertyBlockLevel1_0100, /* C8100..C81FF */ + FriBidiPropertyBlockLevel1_0100, /* C8200..C82FF */ + FriBidiPropertyBlockLevel1_0100, /* C8300..C83FF */ + FriBidiPropertyBlockLevel1_0100, /* C8400..C84FF */ + FriBidiPropertyBlockLevel1_0100, /* C8500..C85FF */ + FriBidiPropertyBlockLevel1_0100, /* C8600..C86FF */ + FriBidiPropertyBlockLevel1_0100, /* C8700..C87FF */ + FriBidiPropertyBlockLevel1_0100, /* C8800..C88FF */ + FriBidiPropertyBlockLevel1_0100, /* C8900..C89FF */ + FriBidiPropertyBlockLevel1_0100, /* C8A00..C8AFF */ + FriBidiPropertyBlockLevel1_0100, /* C8B00..C8BFF */ + FriBidiPropertyBlockLevel1_0100, /* C8C00..C8CFF */ + FriBidiPropertyBlockLevel1_0100, /* C8D00..C8DFF */ + FriBidiPropertyBlockLevel1_0100, /* C8E00..C8EFF */ + FriBidiPropertyBlockLevel1_0100, /* C8F00..C8FFF */ + FriBidiPropertyBlockLevel1_0100, /* C9000..C90FF */ + FriBidiPropertyBlockLevel1_0100, /* C9100..C91FF */ + FriBidiPropertyBlockLevel1_0100, /* C9200..C92FF */ + FriBidiPropertyBlockLevel1_0100, /* C9300..C93FF */ + FriBidiPropertyBlockLevel1_0100, /* C9400..C94FF */ + FriBidiPropertyBlockLevel1_0100, /* C9500..C95FF */ + FriBidiPropertyBlockLevel1_0100, /* C9600..C96FF */ + FriBidiPropertyBlockLevel1_0100, /* C9700..C97FF */ + FriBidiPropertyBlockLevel1_0100, /* C9800..C98FF */ + FriBidiPropertyBlockLevel1_0100, /* C9900..C99FF */ + FriBidiPropertyBlockLevel1_0100, /* C9A00..C9AFF */ + FriBidiPropertyBlockLevel1_0100, /* C9B00..C9BFF */ + FriBidiPropertyBlockLevel1_0100, /* C9C00..C9CFF */ + FriBidiPropertyBlockLevel1_0100, /* C9D00..C9DFF */ + FriBidiPropertyBlockLevel1_0100, /* C9E00..C9EFF */ + FriBidiPropertyBlockLevel1_0100, /* C9F00..C9FFF */ + FriBidiPropertyBlockLevel1_0100, /* CA000..CA0FF */ + FriBidiPropertyBlockLevel1_0100, /* CA100..CA1FF */ + FriBidiPropertyBlockLevel1_0100, /* CA200..CA2FF */ + FriBidiPropertyBlockLevel1_0100, /* CA300..CA3FF */ + FriBidiPropertyBlockLevel1_0100, /* CA400..CA4FF */ + FriBidiPropertyBlockLevel1_0100, /* CA500..CA5FF */ + FriBidiPropertyBlockLevel1_0100, /* CA600..CA6FF */ + FriBidiPropertyBlockLevel1_0100, /* CA700..CA7FF */ + FriBidiPropertyBlockLevel1_0100, /* CA800..CA8FF */ + FriBidiPropertyBlockLevel1_0100, /* CA900..CA9FF */ + FriBidiPropertyBlockLevel1_0100, /* CAA00..CAAFF */ + FriBidiPropertyBlockLevel1_0100, /* CAB00..CABFF */ + FriBidiPropertyBlockLevel1_0100, /* CAC00..CACFF */ + FriBidiPropertyBlockLevel1_0100, /* CAD00..CADFF */ + FriBidiPropertyBlockLevel1_0100, /* CAE00..CAEFF */ + FriBidiPropertyBlockLevel1_0100, /* CAF00..CAFFF */ + FriBidiPropertyBlockLevel1_0100, /* CB000..CB0FF */ + FriBidiPropertyBlockLevel1_0100, /* CB100..CB1FF */ + FriBidiPropertyBlockLevel1_0100, /* CB200..CB2FF */ + FriBidiPropertyBlockLevel1_0100, /* CB300..CB3FF */ + FriBidiPropertyBlockLevel1_0100, /* CB400..CB4FF */ + FriBidiPropertyBlockLevel1_0100, /* CB500..CB5FF */ + FriBidiPropertyBlockLevel1_0100, /* CB600..CB6FF */ + FriBidiPropertyBlockLevel1_0100, /* CB700..CB7FF */ + FriBidiPropertyBlockLevel1_0100, /* CB800..CB8FF */ + FriBidiPropertyBlockLevel1_0100, /* CB900..CB9FF */ + FriBidiPropertyBlockLevel1_0100, /* CBA00..CBAFF */ + FriBidiPropertyBlockLevel1_0100, /* CBB00..CBBFF */ + FriBidiPropertyBlockLevel1_0100, /* CBC00..CBCFF */ + FriBidiPropertyBlockLevel1_0100, /* CBD00..CBDFF */ + FriBidiPropertyBlockLevel1_0100, /* CBE00..CBEFF */ + FriBidiPropertyBlockLevel1_0100, /* CBF00..CBFFF */ + FriBidiPropertyBlockLevel1_0100, /* CC000..CC0FF */ + FriBidiPropertyBlockLevel1_0100, /* CC100..CC1FF */ + FriBidiPropertyBlockLevel1_0100, /* CC200..CC2FF */ + FriBidiPropertyBlockLevel1_0100, /* CC300..CC3FF */ + FriBidiPropertyBlockLevel1_0100, /* CC400..CC4FF */ + FriBidiPropertyBlockLevel1_0100, /* CC500..CC5FF */ + FriBidiPropertyBlockLevel1_0100, /* CC600..CC6FF */ + FriBidiPropertyBlockLevel1_0100, /* CC700..CC7FF */ + FriBidiPropertyBlockLevel1_0100, /* CC800..CC8FF */ + FriBidiPropertyBlockLevel1_0100, /* CC900..CC9FF */ + FriBidiPropertyBlockLevel1_0100, /* CCA00..CCAFF */ + FriBidiPropertyBlockLevel1_0100, /* CCB00..CCBFF */ + FriBidiPropertyBlockLevel1_0100, /* CCC00..CCCFF */ + FriBidiPropertyBlockLevel1_0100, /* CCD00..CCDFF */ + FriBidiPropertyBlockLevel1_0100, /* CCE00..CCEFF */ + FriBidiPropertyBlockLevel1_0100, /* CCF00..CCFFF */ + FriBidiPropertyBlockLevel1_0100, /* CD000..CD0FF */ + FriBidiPropertyBlockLevel1_0100, /* CD100..CD1FF */ + FriBidiPropertyBlockLevel1_0100, /* CD200..CD2FF */ + FriBidiPropertyBlockLevel1_0100, /* CD300..CD3FF */ + FriBidiPropertyBlockLevel1_0100, /* CD400..CD4FF */ + FriBidiPropertyBlockLevel1_0100, /* CD500..CD5FF */ + FriBidiPropertyBlockLevel1_0100, /* CD600..CD6FF */ + FriBidiPropertyBlockLevel1_0100, /* CD700..CD7FF */ + FriBidiPropertyBlockLevel1_0100, /* CD800..CD8FF */ + FriBidiPropertyBlockLevel1_0100, /* CD900..CD9FF */ + FriBidiPropertyBlockLevel1_0100, /* CDA00..CDAFF */ + FriBidiPropertyBlockLevel1_0100, /* CDB00..CDBFF */ + FriBidiPropertyBlockLevel1_0100, /* CDC00..CDCFF */ + FriBidiPropertyBlockLevel1_0100, /* CDD00..CDDFF */ + FriBidiPropertyBlockLevel1_0100, /* CDE00..CDEFF */ + FriBidiPropertyBlockLevel1_0100, /* CDF00..CDFFF */ + FriBidiPropertyBlockLevel1_0100, /* CE000..CE0FF */ + FriBidiPropertyBlockLevel1_0100, /* CE100..CE1FF */ + FriBidiPropertyBlockLevel1_0100, /* CE200..CE2FF */ + FriBidiPropertyBlockLevel1_0100, /* CE300..CE3FF */ + FriBidiPropertyBlockLevel1_0100, /* CE400..CE4FF */ + FriBidiPropertyBlockLevel1_0100, /* CE500..CE5FF */ + FriBidiPropertyBlockLevel1_0100, /* CE600..CE6FF */ + FriBidiPropertyBlockLevel1_0100, /* CE700..CE7FF */ + FriBidiPropertyBlockLevel1_0100, /* CE800..CE8FF */ + FriBidiPropertyBlockLevel1_0100, /* CE900..CE9FF */ + FriBidiPropertyBlockLevel1_0100, /* CEA00..CEAFF */ + FriBidiPropertyBlockLevel1_0100, /* CEB00..CEBFF */ + FriBidiPropertyBlockLevel1_0100, /* CEC00..CECFF */ + FriBidiPropertyBlockLevel1_0100, /* CED00..CEDFF */ + FriBidiPropertyBlockLevel1_0100, /* CEE00..CEEFF */ + FriBidiPropertyBlockLevel1_0100, /* CEF00..CEFFF */ + FriBidiPropertyBlockLevel1_0100, /* CF000..CF0FF */ + FriBidiPropertyBlockLevel1_0100, /* CF100..CF1FF */ + FriBidiPropertyBlockLevel1_0100, /* CF200..CF2FF */ + FriBidiPropertyBlockLevel1_0100, /* CF300..CF3FF */ + FriBidiPropertyBlockLevel1_0100, /* CF400..CF4FF */ + FriBidiPropertyBlockLevel1_0100, /* CF500..CF5FF */ + FriBidiPropertyBlockLevel1_0100, /* CF600..CF6FF */ + FriBidiPropertyBlockLevel1_0100, /* CF700..CF7FF */ + FriBidiPropertyBlockLevel1_0100, /* CF800..CF8FF */ + FriBidiPropertyBlockLevel1_0100, /* CF900..CF9FF */ + FriBidiPropertyBlockLevel1_0100, /* CFA00..CFAFF */ + FriBidiPropertyBlockLevel1_0100, /* CFB00..CFBFF */ + FriBidiPropertyBlockLevel1_0100, /* CFC00..CFCFF */ + FriBidiPropertyBlockLevel1_0100, /* CFD00..CFDFF */ + FriBidiPropertyBlockLevel1_0100, /* CFE00..CFEFF */ + FriBidiPropertyBlockLevel1_0100, /* CFF00..CFFFF */ + FriBidiPropertyBlockLevel1_0100, /* D0000..D00FF */ + FriBidiPropertyBlockLevel1_0100, /* D0100..D01FF */ + FriBidiPropertyBlockLevel1_0100, /* D0200..D02FF */ + FriBidiPropertyBlockLevel1_0100, /* D0300..D03FF */ + FriBidiPropertyBlockLevel1_0100, /* D0400..D04FF */ + FriBidiPropertyBlockLevel1_0100, /* D0500..D05FF */ + FriBidiPropertyBlockLevel1_0100, /* D0600..D06FF */ + FriBidiPropertyBlockLevel1_0100, /* D0700..D07FF */ + FriBidiPropertyBlockLevel1_0100, /* D0800..D08FF */ + FriBidiPropertyBlockLevel1_0100, /* D0900..D09FF */ + FriBidiPropertyBlockLevel1_0100, /* D0A00..D0AFF */ + FriBidiPropertyBlockLevel1_0100, /* D0B00..D0BFF */ + FriBidiPropertyBlockLevel1_0100, /* D0C00..D0CFF */ + FriBidiPropertyBlockLevel1_0100, /* D0D00..D0DFF */ + FriBidiPropertyBlockLevel1_0100, /* D0E00..D0EFF */ + FriBidiPropertyBlockLevel1_0100, /* D0F00..D0FFF */ + FriBidiPropertyBlockLevel1_0100, /* D1000..D10FF */ + FriBidiPropertyBlockLevel1_0100, /* D1100..D11FF */ + FriBidiPropertyBlockLevel1_0100, /* D1200..D12FF */ + FriBidiPropertyBlockLevel1_0100, /* D1300..D13FF */ + FriBidiPropertyBlockLevel1_0100, /* D1400..D14FF */ + FriBidiPropertyBlockLevel1_0100, /* D1500..D15FF */ + FriBidiPropertyBlockLevel1_0100, /* D1600..D16FF */ + FriBidiPropertyBlockLevel1_0100, /* D1700..D17FF */ + FriBidiPropertyBlockLevel1_0100, /* D1800..D18FF */ + FriBidiPropertyBlockLevel1_0100, /* D1900..D19FF */ + FriBidiPropertyBlockLevel1_0100, /* D1A00..D1AFF */ + FriBidiPropertyBlockLevel1_0100, /* D1B00..D1BFF */ + FriBidiPropertyBlockLevel1_0100, /* D1C00..D1CFF */ + FriBidiPropertyBlockLevel1_0100, /* D1D00..D1DFF */ + FriBidiPropertyBlockLevel1_0100, /* D1E00..D1EFF */ + FriBidiPropertyBlockLevel1_0100, /* D1F00..D1FFF */ + FriBidiPropertyBlockLevel1_0100, /* D2000..D20FF */ + FriBidiPropertyBlockLevel1_0100, /* D2100..D21FF */ + FriBidiPropertyBlockLevel1_0100, /* D2200..D22FF */ + FriBidiPropertyBlockLevel1_0100, /* D2300..D23FF */ + FriBidiPropertyBlockLevel1_0100, /* D2400..D24FF */ + FriBidiPropertyBlockLevel1_0100, /* D2500..D25FF */ + FriBidiPropertyBlockLevel1_0100, /* D2600..D26FF */ + FriBidiPropertyBlockLevel1_0100, /* D2700..D27FF */ + FriBidiPropertyBlockLevel1_0100, /* D2800..D28FF */ + FriBidiPropertyBlockLevel1_0100, /* D2900..D29FF */ + FriBidiPropertyBlockLevel1_0100, /* D2A00..D2AFF */ + FriBidiPropertyBlockLevel1_0100, /* D2B00..D2BFF */ + FriBidiPropertyBlockLevel1_0100, /* D2C00..D2CFF */ + FriBidiPropertyBlockLevel1_0100, /* D2D00..D2DFF */ + FriBidiPropertyBlockLevel1_0100, /* D2E00..D2EFF */ + FriBidiPropertyBlockLevel1_0100, /* D2F00..D2FFF */ + FriBidiPropertyBlockLevel1_0100, /* D3000..D30FF */ + FriBidiPropertyBlockLevel1_0100, /* D3100..D31FF */ + FriBidiPropertyBlockLevel1_0100, /* D3200..D32FF */ + FriBidiPropertyBlockLevel1_0100, /* D3300..D33FF */ + FriBidiPropertyBlockLevel1_0100, /* D3400..D34FF */ + FriBidiPropertyBlockLevel1_0100, /* D3500..D35FF */ + FriBidiPropertyBlockLevel1_0100, /* D3600..D36FF */ + FriBidiPropertyBlockLevel1_0100, /* D3700..D37FF */ + FriBidiPropertyBlockLevel1_0100, /* D3800..D38FF */ + FriBidiPropertyBlockLevel1_0100, /* D3900..D39FF */ + FriBidiPropertyBlockLevel1_0100, /* D3A00..D3AFF */ + FriBidiPropertyBlockLevel1_0100, /* D3B00..D3BFF */ + FriBidiPropertyBlockLevel1_0100, /* D3C00..D3CFF */ + FriBidiPropertyBlockLevel1_0100, /* D3D00..D3DFF */ + FriBidiPropertyBlockLevel1_0100, /* D3E00..D3EFF */ + FriBidiPropertyBlockLevel1_0100, /* D3F00..D3FFF */ + FriBidiPropertyBlockLevel1_0100, /* D4000..D40FF */ + FriBidiPropertyBlockLevel1_0100, /* D4100..D41FF */ + FriBidiPropertyBlockLevel1_0100, /* D4200..D42FF */ + FriBidiPropertyBlockLevel1_0100, /* D4300..D43FF */ + FriBidiPropertyBlockLevel1_0100, /* D4400..D44FF */ + FriBidiPropertyBlockLevel1_0100, /* D4500..D45FF */ + FriBidiPropertyBlockLevel1_0100, /* D4600..D46FF */ + FriBidiPropertyBlockLevel1_0100, /* D4700..D47FF */ + FriBidiPropertyBlockLevel1_0100, /* D4800..D48FF */ + FriBidiPropertyBlockLevel1_0100, /* D4900..D49FF */ + FriBidiPropertyBlockLevel1_0100, /* D4A00..D4AFF */ + FriBidiPropertyBlockLevel1_0100, /* D4B00..D4BFF */ + FriBidiPropertyBlockLevel1_0100, /* D4C00..D4CFF */ + FriBidiPropertyBlockLevel1_0100, /* D4D00..D4DFF */ + FriBidiPropertyBlockLevel1_0100, /* D4E00..D4EFF */ + FriBidiPropertyBlockLevel1_0100, /* D4F00..D4FFF */ + FriBidiPropertyBlockLevel1_0100, /* D5000..D50FF */ + FriBidiPropertyBlockLevel1_0100, /* D5100..D51FF */ + FriBidiPropertyBlockLevel1_0100, /* D5200..D52FF */ + FriBidiPropertyBlockLevel1_0100, /* D5300..D53FF */ + FriBidiPropertyBlockLevel1_0100, /* D5400..D54FF */ + FriBidiPropertyBlockLevel1_0100, /* D5500..D55FF */ + FriBidiPropertyBlockLevel1_0100, /* D5600..D56FF */ + FriBidiPropertyBlockLevel1_0100, /* D5700..D57FF */ + FriBidiPropertyBlockLevel1_0100, /* D5800..D58FF */ + FriBidiPropertyBlockLevel1_0100, /* D5900..D59FF */ + FriBidiPropertyBlockLevel1_0100, /* D5A00..D5AFF */ + FriBidiPropertyBlockLevel1_0100, /* D5B00..D5BFF */ + FriBidiPropertyBlockLevel1_0100, /* D5C00..D5CFF */ + FriBidiPropertyBlockLevel1_0100, /* D5D00..D5DFF */ + FriBidiPropertyBlockLevel1_0100, /* D5E00..D5EFF */ + FriBidiPropertyBlockLevel1_0100, /* D5F00..D5FFF */ + FriBidiPropertyBlockLevel1_0100, /* D6000..D60FF */ + FriBidiPropertyBlockLevel1_0100, /* D6100..D61FF */ + FriBidiPropertyBlockLevel1_0100, /* D6200..D62FF */ + FriBidiPropertyBlockLevel1_0100, /* D6300..D63FF */ + FriBidiPropertyBlockLevel1_0100, /* D6400..D64FF */ + FriBidiPropertyBlockLevel1_0100, /* D6500..D65FF */ + FriBidiPropertyBlockLevel1_0100, /* D6600..D66FF */ + FriBidiPropertyBlockLevel1_0100, /* D6700..D67FF */ + FriBidiPropertyBlockLevel1_0100, /* D6800..D68FF */ + FriBidiPropertyBlockLevel1_0100, /* D6900..D69FF */ + FriBidiPropertyBlockLevel1_0100, /* D6A00..D6AFF */ + FriBidiPropertyBlockLevel1_0100, /* D6B00..D6BFF */ + FriBidiPropertyBlockLevel1_0100, /* D6C00..D6CFF */ + FriBidiPropertyBlockLevel1_0100, /* D6D00..D6DFF */ + FriBidiPropertyBlockLevel1_0100, /* D6E00..D6EFF */ + FriBidiPropertyBlockLevel1_0100, /* D6F00..D6FFF */ + FriBidiPropertyBlockLevel1_0100, /* D7000..D70FF */ + FriBidiPropertyBlockLevel1_0100, /* D7100..D71FF */ + FriBidiPropertyBlockLevel1_0100, /* D7200..D72FF */ + FriBidiPropertyBlockLevel1_0100, /* D7300..D73FF */ + FriBidiPropertyBlockLevel1_0100, /* D7400..D74FF */ + FriBidiPropertyBlockLevel1_0100, /* D7500..D75FF */ + FriBidiPropertyBlockLevel1_0100, /* D7600..D76FF */ + FriBidiPropertyBlockLevel1_0100, /* D7700..D77FF */ + FriBidiPropertyBlockLevel1_0100, /* D7800..D78FF */ + FriBidiPropertyBlockLevel1_0100, /* D7900..D79FF */ + FriBidiPropertyBlockLevel1_0100, /* D7A00..D7AFF */ + FriBidiPropertyBlockLevel1_0100, /* D7B00..D7BFF */ + FriBidiPropertyBlockLevel1_0100, /* D7C00..D7CFF */ + FriBidiPropertyBlockLevel1_0100, /* D7D00..D7DFF */ + FriBidiPropertyBlockLevel1_0100, /* D7E00..D7EFF */ + FriBidiPropertyBlockLevel1_0100, /* D7F00..D7FFF */ + FriBidiPropertyBlockLevel1_0100, /* D8000..D80FF */ + FriBidiPropertyBlockLevel1_0100, /* D8100..D81FF */ + FriBidiPropertyBlockLevel1_0100, /* D8200..D82FF */ + FriBidiPropertyBlockLevel1_0100, /* D8300..D83FF */ + FriBidiPropertyBlockLevel1_0100, /* D8400..D84FF */ + FriBidiPropertyBlockLevel1_0100, /* D8500..D85FF */ + FriBidiPropertyBlockLevel1_0100, /* D8600..D86FF */ + FriBidiPropertyBlockLevel1_0100, /* D8700..D87FF */ + FriBidiPropertyBlockLevel1_0100, /* D8800..D88FF */ + FriBidiPropertyBlockLevel1_0100, /* D8900..D89FF */ + FriBidiPropertyBlockLevel1_0100, /* D8A00..D8AFF */ + FriBidiPropertyBlockLevel1_0100, /* D8B00..D8BFF */ + FriBidiPropertyBlockLevel1_0100, /* D8C00..D8CFF */ + FriBidiPropertyBlockLevel1_0100, /* D8D00..D8DFF */ + FriBidiPropertyBlockLevel1_0100, /* D8E00..D8EFF */ + FriBidiPropertyBlockLevel1_0100, /* D8F00..D8FFF */ + FriBidiPropertyBlockLevel1_0100, /* D9000..D90FF */ + FriBidiPropertyBlockLevel1_0100, /* D9100..D91FF */ + FriBidiPropertyBlockLevel1_0100, /* D9200..D92FF */ + FriBidiPropertyBlockLevel1_0100, /* D9300..D93FF */ + FriBidiPropertyBlockLevel1_0100, /* D9400..D94FF */ + FriBidiPropertyBlockLevel1_0100, /* D9500..D95FF */ + FriBidiPropertyBlockLevel1_0100, /* D9600..D96FF */ + FriBidiPropertyBlockLevel1_0100, /* D9700..D97FF */ + FriBidiPropertyBlockLevel1_0100, /* D9800..D98FF */ + FriBidiPropertyBlockLevel1_0100, /* D9900..D99FF */ + FriBidiPropertyBlockLevel1_0100, /* D9A00..D9AFF */ + FriBidiPropertyBlockLevel1_0100, /* D9B00..D9BFF */ + FriBidiPropertyBlockLevel1_0100, /* D9C00..D9CFF */ + FriBidiPropertyBlockLevel1_0100, /* D9D00..D9DFF */ + FriBidiPropertyBlockLevel1_0100, /* D9E00..D9EFF */ + FriBidiPropertyBlockLevel1_0100, /* D9F00..D9FFF */ + FriBidiPropertyBlockLevel1_0100, /* DA000..DA0FF */ + FriBidiPropertyBlockLevel1_0100, /* DA100..DA1FF */ + FriBidiPropertyBlockLevel1_0100, /* DA200..DA2FF */ + FriBidiPropertyBlockLevel1_0100, /* DA300..DA3FF */ + FriBidiPropertyBlockLevel1_0100, /* DA400..DA4FF */ + FriBidiPropertyBlockLevel1_0100, /* DA500..DA5FF */ + FriBidiPropertyBlockLevel1_0100, /* DA600..DA6FF */ + FriBidiPropertyBlockLevel1_0100, /* DA700..DA7FF */ + FriBidiPropertyBlockLevel1_0100, /* DA800..DA8FF */ + FriBidiPropertyBlockLevel1_0100, /* DA900..DA9FF */ + FriBidiPropertyBlockLevel1_0100, /* DAA00..DAAFF */ + FriBidiPropertyBlockLevel1_0100, /* DAB00..DABFF */ + FriBidiPropertyBlockLevel1_0100, /* DAC00..DACFF */ + FriBidiPropertyBlockLevel1_0100, /* DAD00..DADFF */ + FriBidiPropertyBlockLevel1_0100, /* DAE00..DAEFF */ + FriBidiPropertyBlockLevel1_0100, /* DAF00..DAFFF */ + FriBidiPropertyBlockLevel1_0100, /* DB000..DB0FF */ + FriBidiPropertyBlockLevel1_0100, /* DB100..DB1FF */ + FriBidiPropertyBlockLevel1_0100, /* DB200..DB2FF */ + FriBidiPropertyBlockLevel1_0100, /* DB300..DB3FF */ + FriBidiPropertyBlockLevel1_0100, /* DB400..DB4FF */ + FriBidiPropertyBlockLevel1_0100, /* DB500..DB5FF */ + FriBidiPropertyBlockLevel1_0100, /* DB600..DB6FF */ + FriBidiPropertyBlockLevel1_0100, /* DB700..DB7FF */ + FriBidiPropertyBlockLevel1_0100, /* DB800..DB8FF */ + FriBidiPropertyBlockLevel1_0100, /* DB900..DB9FF */ + FriBidiPropertyBlockLevel1_0100, /* DBA00..DBAFF */ + FriBidiPropertyBlockLevel1_0100, /* DBB00..DBBFF */ + FriBidiPropertyBlockLevel1_0100, /* DBC00..DBCFF */ + FriBidiPropertyBlockLevel1_0100, /* DBD00..DBDFF */ + FriBidiPropertyBlockLevel1_0100, /* DBE00..DBEFF */ + FriBidiPropertyBlockLevel1_0100, /* DBF00..DBFFF */ + FriBidiPropertyBlockLevel1_0100, /* DC000..DC0FF */ + FriBidiPropertyBlockLevel1_0100, /* DC100..DC1FF */ + FriBidiPropertyBlockLevel1_0100, /* DC200..DC2FF */ + FriBidiPropertyBlockLevel1_0100, /* DC300..DC3FF */ + FriBidiPropertyBlockLevel1_0100, /* DC400..DC4FF */ + FriBidiPropertyBlockLevel1_0100, /* DC500..DC5FF */ + FriBidiPropertyBlockLevel1_0100, /* DC600..DC6FF */ + FriBidiPropertyBlockLevel1_0100, /* DC700..DC7FF */ + FriBidiPropertyBlockLevel1_0100, /* DC800..DC8FF */ + FriBidiPropertyBlockLevel1_0100, /* DC900..DC9FF */ + FriBidiPropertyBlockLevel1_0100, /* DCA00..DCAFF */ + FriBidiPropertyBlockLevel1_0100, /* DCB00..DCBFF */ + FriBidiPropertyBlockLevel1_0100, /* DCC00..DCCFF */ + FriBidiPropertyBlockLevel1_0100, /* DCD00..DCDFF */ + FriBidiPropertyBlockLevel1_0100, /* DCE00..DCEFF */ + FriBidiPropertyBlockLevel1_0100, /* DCF00..DCFFF */ + FriBidiPropertyBlockLevel1_0100, /* DD000..DD0FF */ + FriBidiPropertyBlockLevel1_0100, /* DD100..DD1FF */ + FriBidiPropertyBlockLevel1_0100, /* DD200..DD2FF */ + FriBidiPropertyBlockLevel1_0100, /* DD300..DD3FF */ + FriBidiPropertyBlockLevel1_0100, /* DD400..DD4FF */ + FriBidiPropertyBlockLevel1_0100, /* DD500..DD5FF */ + FriBidiPropertyBlockLevel1_0100, /* DD600..DD6FF */ + FriBidiPropertyBlockLevel1_0100, /* DD700..DD7FF */ + FriBidiPropertyBlockLevel1_0100, /* DD800..DD8FF */ + FriBidiPropertyBlockLevel1_0100, /* DD900..DD9FF */ + FriBidiPropertyBlockLevel1_0100, /* DDA00..DDAFF */ + FriBidiPropertyBlockLevel1_0100, /* DDB00..DDBFF */ + FriBidiPropertyBlockLevel1_0100, /* DDC00..DDCFF */ + FriBidiPropertyBlockLevel1_0100, /* DDD00..DDDFF */ + FriBidiPropertyBlockLevel1_0100, /* DDE00..DDEFF */ + FriBidiPropertyBlockLevel1_0100, /* DDF00..DDFFF */ + FriBidiPropertyBlockLevel1_0100, /* DE000..DE0FF */ + FriBidiPropertyBlockLevel1_0100, /* DE100..DE1FF */ + FriBidiPropertyBlockLevel1_0100, /* DE200..DE2FF */ + FriBidiPropertyBlockLevel1_0100, /* DE300..DE3FF */ + FriBidiPropertyBlockLevel1_0100, /* DE400..DE4FF */ + FriBidiPropertyBlockLevel1_0100, /* DE500..DE5FF */ + FriBidiPropertyBlockLevel1_0100, /* DE600..DE6FF */ + FriBidiPropertyBlockLevel1_0100, /* DE700..DE7FF */ + FriBidiPropertyBlockLevel1_0100, /* DE800..DE8FF */ + FriBidiPropertyBlockLevel1_0100, /* DE900..DE9FF */ + FriBidiPropertyBlockLevel1_0100, /* DEA00..DEAFF */ + FriBidiPropertyBlockLevel1_0100, /* DEB00..DEBFF */ + FriBidiPropertyBlockLevel1_0100, /* DEC00..DECFF */ + FriBidiPropertyBlockLevel1_0100, /* DED00..DEDFF */ + FriBidiPropertyBlockLevel1_0100, /* DEE00..DEEFF */ + FriBidiPropertyBlockLevel1_0100, /* DEF00..DEFFF */ + FriBidiPropertyBlockLevel1_0100, /* DF000..DF0FF */ + FriBidiPropertyBlockLevel1_0100, /* DF100..DF1FF */ + FriBidiPropertyBlockLevel1_0100, /* DF200..DF2FF */ + FriBidiPropertyBlockLevel1_0100, /* DF300..DF3FF */ + FriBidiPropertyBlockLevel1_0100, /* DF400..DF4FF */ + FriBidiPropertyBlockLevel1_0100, /* DF500..DF5FF */ + FriBidiPropertyBlockLevel1_0100, /* DF600..DF6FF */ + FriBidiPropertyBlockLevel1_0100, /* DF700..DF7FF */ + FriBidiPropertyBlockLevel1_0100, /* DF800..DF8FF */ + FriBidiPropertyBlockLevel1_0100, /* DF900..DF9FF */ + FriBidiPropertyBlockLevel1_0100, /* DFA00..DFAFF */ + FriBidiPropertyBlockLevel1_0100, /* DFB00..DFBFF */ + FriBidiPropertyBlockLevel1_0100, /* DFC00..DFCFF */ + FriBidiPropertyBlockLevel1_0100, /* DFD00..DFDFF */ + FriBidiPropertyBlockLevel1_0100, /* DFE00..DFEFF */ + FriBidiPropertyBlockLevel1_0100, /* DFF00..DFFFF */ + FriBidiPropertyBlockLevel1_E0000, /* E0000..E00FF */ + FriBidiPropertyBlockLevel1_0100, /* E0100..E01FF */ + FriBidiPropertyBlockLevel1_0100, /* E0200..E02FF */ + FriBidiPropertyBlockLevel1_0100, /* E0300..E03FF */ + FriBidiPropertyBlockLevel1_0100, /* E0400..E04FF */ + FriBidiPropertyBlockLevel1_0100, /* E0500..E05FF */ + FriBidiPropertyBlockLevel1_0100, /* E0600..E06FF */ + FriBidiPropertyBlockLevel1_0100, /* E0700..E07FF */ + FriBidiPropertyBlockLevel1_0100, /* E0800..E08FF */ + FriBidiPropertyBlockLevel1_0100, /* E0900..E09FF */ + FriBidiPropertyBlockLevel1_0100, /* E0A00..E0AFF */ + FriBidiPropertyBlockLevel1_0100, /* E0B00..E0BFF */ + FriBidiPropertyBlockLevel1_0100, /* E0C00..E0CFF */ + FriBidiPropertyBlockLevel1_0100, /* E0D00..E0DFF */ + FriBidiPropertyBlockLevel1_0100, /* E0E00..E0EFF */ + FriBidiPropertyBlockLevel1_0100, /* E0F00..E0FFF */ + FriBidiPropertyBlockLevel1_0100, /* E1000..E10FF */ + FriBidiPropertyBlockLevel1_0100, /* E1100..E11FF */ + FriBidiPropertyBlockLevel1_0100, /* E1200..E12FF */ + FriBidiPropertyBlockLevel1_0100, /* E1300..E13FF */ + FriBidiPropertyBlockLevel1_0100, /* E1400..E14FF */ + FriBidiPropertyBlockLevel1_0100, /* E1500..E15FF */ + FriBidiPropertyBlockLevel1_0100, /* E1600..E16FF */ + FriBidiPropertyBlockLevel1_0100, /* E1700..E17FF */ + FriBidiPropertyBlockLevel1_0100, /* E1800..E18FF */ + FriBidiPropertyBlockLevel1_0100, /* E1900..E19FF */ + FriBidiPropertyBlockLevel1_0100, /* E1A00..E1AFF */ + FriBidiPropertyBlockLevel1_0100, /* E1B00..E1BFF */ + FriBidiPropertyBlockLevel1_0100, /* E1C00..E1CFF */ + FriBidiPropertyBlockLevel1_0100, /* E1D00..E1DFF */ + FriBidiPropertyBlockLevel1_0100, /* E1E00..E1EFF */ + FriBidiPropertyBlockLevel1_0100, /* E1F00..E1FFF */ + FriBidiPropertyBlockLevel1_0100, /* E2000..E20FF */ + FriBidiPropertyBlockLevel1_0100, /* E2100..E21FF */ + FriBidiPropertyBlockLevel1_0100, /* E2200..E22FF */ + FriBidiPropertyBlockLevel1_0100, /* E2300..E23FF */ + FriBidiPropertyBlockLevel1_0100, /* E2400..E24FF */ + FriBidiPropertyBlockLevel1_0100, /* E2500..E25FF */ + FriBidiPropertyBlockLevel1_0100, /* E2600..E26FF */ + FriBidiPropertyBlockLevel1_0100, /* E2700..E27FF */ + FriBidiPropertyBlockLevel1_0100, /* E2800..E28FF */ + FriBidiPropertyBlockLevel1_0100, /* E2900..E29FF */ + FriBidiPropertyBlockLevel1_0100, /* E2A00..E2AFF */ + FriBidiPropertyBlockLevel1_0100, /* E2B00..E2BFF */ + FriBidiPropertyBlockLevel1_0100, /* E2C00..E2CFF */ + FriBidiPropertyBlockLevel1_0100, /* E2D00..E2DFF */ + FriBidiPropertyBlockLevel1_0100, /* E2E00..E2EFF */ + FriBidiPropertyBlockLevel1_0100, /* E2F00..E2FFF */ + FriBidiPropertyBlockLevel1_0100, /* E3000..E30FF */ + FriBidiPropertyBlockLevel1_0100, /* E3100..E31FF */ + FriBidiPropertyBlockLevel1_0100, /* E3200..E32FF */ + FriBidiPropertyBlockLevel1_0100, /* E3300..E33FF */ + FriBidiPropertyBlockLevel1_0100, /* E3400..E34FF */ + FriBidiPropertyBlockLevel1_0100, /* E3500..E35FF */ + FriBidiPropertyBlockLevel1_0100, /* E3600..E36FF */ + FriBidiPropertyBlockLevel1_0100, /* E3700..E37FF */ + FriBidiPropertyBlockLevel1_0100, /* E3800..E38FF */ + FriBidiPropertyBlockLevel1_0100, /* E3900..E39FF */ + FriBidiPropertyBlockLevel1_0100, /* E3A00..E3AFF */ + FriBidiPropertyBlockLevel1_0100, /* E3B00..E3BFF */ + FriBidiPropertyBlockLevel1_0100, /* E3C00..E3CFF */ + FriBidiPropertyBlockLevel1_0100, /* E3D00..E3DFF */ + FriBidiPropertyBlockLevel1_0100, /* E3E00..E3EFF */ + FriBidiPropertyBlockLevel1_0100, /* E3F00..E3FFF */ + FriBidiPropertyBlockLevel1_0100, /* E4000..E40FF */ + FriBidiPropertyBlockLevel1_0100, /* E4100..E41FF */ + FriBidiPropertyBlockLevel1_0100, /* E4200..E42FF */ + FriBidiPropertyBlockLevel1_0100, /* E4300..E43FF */ + FriBidiPropertyBlockLevel1_0100, /* E4400..E44FF */ + FriBidiPropertyBlockLevel1_0100, /* E4500..E45FF */ + FriBidiPropertyBlockLevel1_0100, /* E4600..E46FF */ + FriBidiPropertyBlockLevel1_0100, /* E4700..E47FF */ + FriBidiPropertyBlockLevel1_0100, /* E4800..E48FF */ + FriBidiPropertyBlockLevel1_0100, /* E4900..E49FF */ + FriBidiPropertyBlockLevel1_0100, /* E4A00..E4AFF */ + FriBidiPropertyBlockLevel1_0100, /* E4B00..E4BFF */ + FriBidiPropertyBlockLevel1_0100, /* E4C00..E4CFF */ + FriBidiPropertyBlockLevel1_0100, /* E4D00..E4DFF */ + FriBidiPropertyBlockLevel1_0100, /* E4E00..E4EFF */ + FriBidiPropertyBlockLevel1_0100, /* E4F00..E4FFF */ + FriBidiPropertyBlockLevel1_0100, /* E5000..E50FF */ + FriBidiPropertyBlockLevel1_0100, /* E5100..E51FF */ + FriBidiPropertyBlockLevel1_0100, /* E5200..E52FF */ + FriBidiPropertyBlockLevel1_0100, /* E5300..E53FF */ + FriBidiPropertyBlockLevel1_0100, /* E5400..E54FF */ + FriBidiPropertyBlockLevel1_0100, /* E5500..E55FF */ + FriBidiPropertyBlockLevel1_0100, /* E5600..E56FF */ + FriBidiPropertyBlockLevel1_0100, /* E5700..E57FF */ + FriBidiPropertyBlockLevel1_0100, /* E5800..E58FF */ + FriBidiPropertyBlockLevel1_0100, /* E5900..E59FF */ + FriBidiPropertyBlockLevel1_0100, /* E5A00..E5AFF */ + FriBidiPropertyBlockLevel1_0100, /* E5B00..E5BFF */ + FriBidiPropertyBlockLevel1_0100, /* E5C00..E5CFF */ + FriBidiPropertyBlockLevel1_0100, /* E5D00..E5DFF */ + FriBidiPropertyBlockLevel1_0100, /* E5E00..E5EFF */ + FriBidiPropertyBlockLevel1_0100, /* E5F00..E5FFF */ + FriBidiPropertyBlockLevel1_0100, /* E6000..E60FF */ + FriBidiPropertyBlockLevel1_0100, /* E6100..E61FF */ + FriBidiPropertyBlockLevel1_0100, /* E6200..E62FF */ + FriBidiPropertyBlockLevel1_0100, /* E6300..E63FF */ + FriBidiPropertyBlockLevel1_0100, /* E6400..E64FF */ + FriBidiPropertyBlockLevel1_0100, /* E6500..E65FF */ + FriBidiPropertyBlockLevel1_0100, /* E6600..E66FF */ + FriBidiPropertyBlockLevel1_0100, /* E6700..E67FF */ + FriBidiPropertyBlockLevel1_0100, /* E6800..E68FF */ + FriBidiPropertyBlockLevel1_0100, /* E6900..E69FF */ + FriBidiPropertyBlockLevel1_0100, /* E6A00..E6AFF */ + FriBidiPropertyBlockLevel1_0100, /* E6B00..E6BFF */ + FriBidiPropertyBlockLevel1_0100, /* E6C00..E6CFF */ + FriBidiPropertyBlockLevel1_0100, /* E6D00..E6DFF */ + FriBidiPropertyBlockLevel1_0100, /* E6E00..E6EFF */ + FriBidiPropertyBlockLevel1_0100, /* E6F00..E6FFF */ + FriBidiPropertyBlockLevel1_0100, /* E7000..E70FF */ + FriBidiPropertyBlockLevel1_0100, /* E7100..E71FF */ + FriBidiPropertyBlockLevel1_0100, /* E7200..E72FF */ + FriBidiPropertyBlockLevel1_0100, /* E7300..E73FF */ + FriBidiPropertyBlockLevel1_0100, /* E7400..E74FF */ + FriBidiPropertyBlockLevel1_0100, /* E7500..E75FF */ + FriBidiPropertyBlockLevel1_0100, /* E7600..E76FF */ + FriBidiPropertyBlockLevel1_0100, /* E7700..E77FF */ + FriBidiPropertyBlockLevel1_0100, /* E7800..E78FF */ + FriBidiPropertyBlockLevel1_0100, /* E7900..E79FF */ + FriBidiPropertyBlockLevel1_0100, /* E7A00..E7AFF */ + FriBidiPropertyBlockLevel1_0100, /* E7B00..E7BFF */ + FriBidiPropertyBlockLevel1_0100, /* E7C00..E7CFF */ + FriBidiPropertyBlockLevel1_0100, /* E7D00..E7DFF */ + FriBidiPropertyBlockLevel1_0100, /* E7E00..E7EFF */ + FriBidiPropertyBlockLevel1_0100, /* E7F00..E7FFF */ + FriBidiPropertyBlockLevel1_0100, /* E8000..E80FF */ + FriBidiPropertyBlockLevel1_0100, /* E8100..E81FF */ + FriBidiPropertyBlockLevel1_0100, /* E8200..E82FF */ + FriBidiPropertyBlockLevel1_0100, /* E8300..E83FF */ + FriBidiPropertyBlockLevel1_0100, /* E8400..E84FF */ + FriBidiPropertyBlockLevel1_0100, /* E8500..E85FF */ + FriBidiPropertyBlockLevel1_0100, /* E8600..E86FF */ + FriBidiPropertyBlockLevel1_0100, /* E8700..E87FF */ + FriBidiPropertyBlockLevel1_0100, /* E8800..E88FF */ + FriBidiPropertyBlockLevel1_0100, /* E8900..E89FF */ + FriBidiPropertyBlockLevel1_0100, /* E8A00..E8AFF */ + FriBidiPropertyBlockLevel1_0100, /* E8B00..E8BFF */ + FriBidiPropertyBlockLevel1_0100, /* E8C00..E8CFF */ + FriBidiPropertyBlockLevel1_0100, /* E8D00..E8DFF */ + FriBidiPropertyBlockLevel1_0100, /* E8E00..E8EFF */ + FriBidiPropertyBlockLevel1_0100, /* E8F00..E8FFF */ + FriBidiPropertyBlockLevel1_0100, /* E9000..E90FF */ + FriBidiPropertyBlockLevel1_0100, /* E9100..E91FF */ + FriBidiPropertyBlockLevel1_0100, /* E9200..E92FF */ + FriBidiPropertyBlockLevel1_0100, /* E9300..E93FF */ + FriBidiPropertyBlockLevel1_0100, /* E9400..E94FF */ + FriBidiPropertyBlockLevel1_0100, /* E9500..E95FF */ + FriBidiPropertyBlockLevel1_0100, /* E9600..E96FF */ + FriBidiPropertyBlockLevel1_0100, /* E9700..E97FF */ + FriBidiPropertyBlockLevel1_0100, /* E9800..E98FF */ + FriBidiPropertyBlockLevel1_0100, /* E9900..E99FF */ + FriBidiPropertyBlockLevel1_0100, /* E9A00..E9AFF */ + FriBidiPropertyBlockLevel1_0100, /* E9B00..E9BFF */ + FriBidiPropertyBlockLevel1_0100, /* E9C00..E9CFF */ + FriBidiPropertyBlockLevel1_0100, /* E9D00..E9DFF */ + FriBidiPropertyBlockLevel1_0100, /* E9E00..E9EFF */ + FriBidiPropertyBlockLevel1_0100, /* E9F00..E9FFF */ + FriBidiPropertyBlockLevel1_0100, /* EA000..EA0FF */ + FriBidiPropertyBlockLevel1_0100, /* EA100..EA1FF */ + FriBidiPropertyBlockLevel1_0100, /* EA200..EA2FF */ + FriBidiPropertyBlockLevel1_0100, /* EA300..EA3FF */ + FriBidiPropertyBlockLevel1_0100, /* EA400..EA4FF */ + FriBidiPropertyBlockLevel1_0100, /* EA500..EA5FF */ + FriBidiPropertyBlockLevel1_0100, /* EA600..EA6FF */ + FriBidiPropertyBlockLevel1_0100, /* EA700..EA7FF */ + FriBidiPropertyBlockLevel1_0100, /* EA800..EA8FF */ + FriBidiPropertyBlockLevel1_0100, /* EA900..EA9FF */ + FriBidiPropertyBlockLevel1_0100, /* EAA00..EAAFF */ + FriBidiPropertyBlockLevel1_0100, /* EAB00..EABFF */ + FriBidiPropertyBlockLevel1_0100, /* EAC00..EACFF */ + FriBidiPropertyBlockLevel1_0100, /* EAD00..EADFF */ + FriBidiPropertyBlockLevel1_0100, /* EAE00..EAEFF */ + FriBidiPropertyBlockLevel1_0100, /* EAF00..EAFFF */ + FriBidiPropertyBlockLevel1_0100, /* EB000..EB0FF */ + FriBidiPropertyBlockLevel1_0100, /* EB100..EB1FF */ + FriBidiPropertyBlockLevel1_0100, /* EB200..EB2FF */ + FriBidiPropertyBlockLevel1_0100, /* EB300..EB3FF */ + FriBidiPropertyBlockLevel1_0100, /* EB400..EB4FF */ + FriBidiPropertyBlockLevel1_0100, /* EB500..EB5FF */ + FriBidiPropertyBlockLevel1_0100, /* EB600..EB6FF */ + FriBidiPropertyBlockLevel1_0100, /* EB700..EB7FF */ + FriBidiPropertyBlockLevel1_0100, /* EB800..EB8FF */ + FriBidiPropertyBlockLevel1_0100, /* EB900..EB9FF */ + FriBidiPropertyBlockLevel1_0100, /* EBA00..EBAFF */ + FriBidiPropertyBlockLevel1_0100, /* EBB00..EBBFF */ + FriBidiPropertyBlockLevel1_0100, /* EBC00..EBCFF */ + FriBidiPropertyBlockLevel1_0100, /* EBD00..EBDFF */ + FriBidiPropertyBlockLevel1_0100, /* EBE00..EBEFF */ + FriBidiPropertyBlockLevel1_0100, /* EBF00..EBFFF */ + FriBidiPropertyBlockLevel1_0100, /* EC000..EC0FF */ + FriBidiPropertyBlockLevel1_0100, /* EC100..EC1FF */ + FriBidiPropertyBlockLevel1_0100, /* EC200..EC2FF */ + FriBidiPropertyBlockLevel1_0100, /* EC300..EC3FF */ + FriBidiPropertyBlockLevel1_0100, /* EC400..EC4FF */ + FriBidiPropertyBlockLevel1_0100, /* EC500..EC5FF */ + FriBidiPropertyBlockLevel1_0100, /* EC600..EC6FF */ + FriBidiPropertyBlockLevel1_0100, /* EC700..EC7FF */ + FriBidiPropertyBlockLevel1_0100, /* EC800..EC8FF */ + FriBidiPropertyBlockLevel1_0100, /* EC900..EC9FF */ + FriBidiPropertyBlockLevel1_0100, /* ECA00..ECAFF */ + FriBidiPropertyBlockLevel1_0100, /* ECB00..ECBFF */ + FriBidiPropertyBlockLevel1_0100, /* ECC00..ECCFF */ + FriBidiPropertyBlockLevel1_0100, /* ECD00..ECDFF */ + FriBidiPropertyBlockLevel1_0100, /* ECE00..ECEFF */ + FriBidiPropertyBlockLevel1_0100, /* ECF00..ECFFF */ + FriBidiPropertyBlockLevel1_0100, /* ED000..ED0FF */ + FriBidiPropertyBlockLevel1_0100, /* ED100..ED1FF */ + FriBidiPropertyBlockLevel1_0100, /* ED200..ED2FF */ + FriBidiPropertyBlockLevel1_0100, /* ED300..ED3FF */ + FriBidiPropertyBlockLevel1_0100, /* ED400..ED4FF */ + FriBidiPropertyBlockLevel1_0100, /* ED500..ED5FF */ + FriBidiPropertyBlockLevel1_0100, /* ED600..ED6FF */ + FriBidiPropertyBlockLevel1_0100, /* ED700..ED7FF */ + FriBidiPropertyBlockLevel1_0100, /* ED800..ED8FF */ + FriBidiPropertyBlockLevel1_0100, /* ED900..ED9FF */ + FriBidiPropertyBlockLevel1_0100, /* EDA00..EDAFF */ + FriBidiPropertyBlockLevel1_0100, /* EDB00..EDBFF */ + FriBidiPropertyBlockLevel1_0100, /* EDC00..EDCFF */ + FriBidiPropertyBlockLevel1_0100, /* EDD00..EDDFF */ + FriBidiPropertyBlockLevel1_0100, /* EDE00..EDEFF */ + FriBidiPropertyBlockLevel1_0100, /* EDF00..EDFFF */ + FriBidiPropertyBlockLevel1_0100, /* EE000..EE0FF */ + FriBidiPropertyBlockLevel1_0100, /* EE100..EE1FF */ + FriBidiPropertyBlockLevel1_0100, /* EE200..EE2FF */ + FriBidiPropertyBlockLevel1_0100, /* EE300..EE3FF */ + FriBidiPropertyBlockLevel1_0100, /* EE400..EE4FF */ + FriBidiPropertyBlockLevel1_0100, /* EE500..EE5FF */ + FriBidiPropertyBlockLevel1_0100, /* EE600..EE6FF */ + FriBidiPropertyBlockLevel1_0100, /* EE700..EE7FF */ + FriBidiPropertyBlockLevel1_0100, /* EE800..EE8FF */ + FriBidiPropertyBlockLevel1_0100, /* EE900..EE9FF */ + FriBidiPropertyBlockLevel1_0100, /* EEA00..EEAFF */ + FriBidiPropertyBlockLevel1_0100, /* EEB00..EEBFF */ + FriBidiPropertyBlockLevel1_0100, /* EEC00..EECFF */ + FriBidiPropertyBlockLevel1_0100, /* EED00..EEDFF */ + FriBidiPropertyBlockLevel1_0100, /* EEE00..EEEFF */ + FriBidiPropertyBlockLevel1_0100, /* EEF00..EEFFF */ + FriBidiPropertyBlockLevel1_0100, /* EF000..EF0FF */ + FriBidiPropertyBlockLevel1_0100, /* EF100..EF1FF */ + FriBidiPropertyBlockLevel1_0100, /* EF200..EF2FF */ + FriBidiPropertyBlockLevel1_0100, /* EF300..EF3FF */ + FriBidiPropertyBlockLevel1_0100, /* EF400..EF4FF */ + FriBidiPropertyBlockLevel1_0100, /* EF500..EF5FF */ + FriBidiPropertyBlockLevel1_0100, /* EF600..EF6FF */ + FriBidiPropertyBlockLevel1_0100, /* EF700..EF7FF */ + FriBidiPropertyBlockLevel1_0100, /* EF800..EF8FF */ + FriBidiPropertyBlockLevel1_0100, /* EF900..EF9FF */ + FriBidiPropertyBlockLevel1_0100, /* EFA00..EFAFF */ + FriBidiPropertyBlockLevel1_0100, /* EFB00..EFBFF */ + FriBidiPropertyBlockLevel1_0100, /* EFC00..EFCFF */ + FriBidiPropertyBlockLevel1_0100, /* EFD00..EFDFF */ + FriBidiPropertyBlockLevel1_0100, /* EFE00..EFEFF */ + FriBidiPropertyBlockLevel1_0100, /* EFF00..EFFFF */ + FriBidiPropertyBlockLevel1_0100, /* F0000..F00FF */ + FriBidiPropertyBlockLevel1_0100, /* F0100..F01FF */ + FriBidiPropertyBlockLevel1_0100, /* F0200..F02FF */ + FriBidiPropertyBlockLevel1_0100, /* F0300..F03FF */ + FriBidiPropertyBlockLevel1_0100, /* F0400..F04FF */ + FriBidiPropertyBlockLevel1_0100, /* F0500..F05FF */ + FriBidiPropertyBlockLevel1_0100, /* F0600..F06FF */ + FriBidiPropertyBlockLevel1_0100, /* F0700..F07FF */ + FriBidiPropertyBlockLevel1_0100, /* F0800..F08FF */ + FriBidiPropertyBlockLevel1_0100, /* F0900..F09FF */ + FriBidiPropertyBlockLevel1_0100, /* F0A00..F0AFF */ + FriBidiPropertyBlockLevel1_0100, /* F0B00..F0BFF */ + FriBidiPropertyBlockLevel1_0100, /* F0C00..F0CFF */ + FriBidiPropertyBlockLevel1_0100, /* F0D00..F0DFF */ + FriBidiPropertyBlockLevel1_0100, /* F0E00..F0EFF */ + FriBidiPropertyBlockLevel1_0100, /* F0F00..F0FFF */ + FriBidiPropertyBlockLevel1_0100, /* F1000..F10FF */ + FriBidiPropertyBlockLevel1_0100, /* F1100..F11FF */ + FriBidiPropertyBlockLevel1_0100, /* F1200..F12FF */ + FriBidiPropertyBlockLevel1_0100, /* F1300..F13FF */ + FriBidiPropertyBlockLevel1_0100, /* F1400..F14FF */ + FriBidiPropertyBlockLevel1_0100, /* F1500..F15FF */ + FriBidiPropertyBlockLevel1_0100, /* F1600..F16FF */ + FriBidiPropertyBlockLevel1_0100, /* F1700..F17FF */ + FriBidiPropertyBlockLevel1_0100, /* F1800..F18FF */ + FriBidiPropertyBlockLevel1_0100, /* F1900..F19FF */ + FriBidiPropertyBlockLevel1_0100, /* F1A00..F1AFF */ + FriBidiPropertyBlockLevel1_0100, /* F1B00..F1BFF */ + FriBidiPropertyBlockLevel1_0100, /* F1C00..F1CFF */ + FriBidiPropertyBlockLevel1_0100, /* F1D00..F1DFF */ + FriBidiPropertyBlockLevel1_0100, /* F1E00..F1EFF */ + FriBidiPropertyBlockLevel1_0100, /* F1F00..F1FFF */ + FriBidiPropertyBlockLevel1_0100, /* F2000..F20FF */ + FriBidiPropertyBlockLevel1_0100, /* F2100..F21FF */ + FriBidiPropertyBlockLevel1_0100, /* F2200..F22FF */ + FriBidiPropertyBlockLevel1_0100, /* F2300..F23FF */ + FriBidiPropertyBlockLevel1_0100, /* F2400..F24FF */ + FriBidiPropertyBlockLevel1_0100, /* F2500..F25FF */ + FriBidiPropertyBlockLevel1_0100, /* F2600..F26FF */ + FriBidiPropertyBlockLevel1_0100, /* F2700..F27FF */ + FriBidiPropertyBlockLevel1_0100, /* F2800..F28FF */ + FriBidiPropertyBlockLevel1_0100, /* F2900..F29FF */ + FriBidiPropertyBlockLevel1_0100, /* F2A00..F2AFF */ + FriBidiPropertyBlockLevel1_0100, /* F2B00..F2BFF */ + FriBidiPropertyBlockLevel1_0100, /* F2C00..F2CFF */ + FriBidiPropertyBlockLevel1_0100, /* F2D00..F2DFF */ + FriBidiPropertyBlockLevel1_0100, /* F2E00..F2EFF */ + FriBidiPropertyBlockLevel1_0100, /* F2F00..F2FFF */ + FriBidiPropertyBlockLevel1_0100, /* F3000..F30FF */ + FriBidiPropertyBlockLevel1_0100, /* F3100..F31FF */ + FriBidiPropertyBlockLevel1_0100, /* F3200..F32FF */ + FriBidiPropertyBlockLevel1_0100, /* F3300..F33FF */ + FriBidiPropertyBlockLevel1_0100, /* F3400..F34FF */ + FriBidiPropertyBlockLevel1_0100, /* F3500..F35FF */ + FriBidiPropertyBlockLevel1_0100, /* F3600..F36FF */ + FriBidiPropertyBlockLevel1_0100, /* F3700..F37FF */ + FriBidiPropertyBlockLevel1_0100, /* F3800..F38FF */ + FriBidiPropertyBlockLevel1_0100, /* F3900..F39FF */ + FriBidiPropertyBlockLevel1_0100, /* F3A00..F3AFF */ + FriBidiPropertyBlockLevel1_0100, /* F3B00..F3BFF */ + FriBidiPropertyBlockLevel1_0100, /* F3C00..F3CFF */ + FriBidiPropertyBlockLevel1_0100, /* F3D00..F3DFF */ + FriBidiPropertyBlockLevel1_0100, /* F3E00..F3EFF */ + FriBidiPropertyBlockLevel1_0100, /* F3F00..F3FFF */ + FriBidiPropertyBlockLevel1_0100, /* F4000..F40FF */ + FriBidiPropertyBlockLevel1_0100, /* F4100..F41FF */ + FriBidiPropertyBlockLevel1_0100, /* F4200..F42FF */ + FriBidiPropertyBlockLevel1_0100, /* F4300..F43FF */ + FriBidiPropertyBlockLevel1_0100, /* F4400..F44FF */ + FriBidiPropertyBlockLevel1_0100, /* F4500..F45FF */ + FriBidiPropertyBlockLevel1_0100, /* F4600..F46FF */ + FriBidiPropertyBlockLevel1_0100, /* F4700..F47FF */ + FriBidiPropertyBlockLevel1_0100, /* F4800..F48FF */ + FriBidiPropertyBlockLevel1_0100, /* F4900..F49FF */ + FriBidiPropertyBlockLevel1_0100, /* F4A00..F4AFF */ + FriBidiPropertyBlockLevel1_0100, /* F4B00..F4BFF */ + FriBidiPropertyBlockLevel1_0100, /* F4C00..F4CFF */ + FriBidiPropertyBlockLevel1_0100, /* F4D00..F4DFF */ + FriBidiPropertyBlockLevel1_0100, /* F4E00..F4EFF */ + FriBidiPropertyBlockLevel1_0100, /* F4F00..F4FFF */ + FriBidiPropertyBlockLevel1_0100, /* F5000..F50FF */ + FriBidiPropertyBlockLevel1_0100, /* F5100..F51FF */ + FriBidiPropertyBlockLevel1_0100, /* F5200..F52FF */ + FriBidiPropertyBlockLevel1_0100, /* F5300..F53FF */ + FriBidiPropertyBlockLevel1_0100, /* F5400..F54FF */ + FriBidiPropertyBlockLevel1_0100, /* F5500..F55FF */ + FriBidiPropertyBlockLevel1_0100, /* F5600..F56FF */ + FriBidiPropertyBlockLevel1_0100, /* F5700..F57FF */ + FriBidiPropertyBlockLevel1_0100, /* F5800..F58FF */ + FriBidiPropertyBlockLevel1_0100, /* F5900..F59FF */ + FriBidiPropertyBlockLevel1_0100, /* F5A00..F5AFF */ + FriBidiPropertyBlockLevel1_0100, /* F5B00..F5BFF */ + FriBidiPropertyBlockLevel1_0100, /* F5C00..F5CFF */ + FriBidiPropertyBlockLevel1_0100, /* F5D00..F5DFF */ + FriBidiPropertyBlockLevel1_0100, /* F5E00..F5EFF */ + FriBidiPropertyBlockLevel1_0100, /* F5F00..F5FFF */ + FriBidiPropertyBlockLevel1_0100, /* F6000..F60FF */ + FriBidiPropertyBlockLevel1_0100, /* F6100..F61FF */ + FriBidiPropertyBlockLevel1_0100, /* F6200..F62FF */ + FriBidiPropertyBlockLevel1_0100, /* F6300..F63FF */ + FriBidiPropertyBlockLevel1_0100, /* F6400..F64FF */ + FriBidiPropertyBlockLevel1_0100, /* F6500..F65FF */ + FriBidiPropertyBlockLevel1_0100, /* F6600..F66FF */ + FriBidiPropertyBlockLevel1_0100, /* F6700..F67FF */ + FriBidiPropertyBlockLevel1_0100, /* F6800..F68FF */ + FriBidiPropertyBlockLevel1_0100, /* F6900..F69FF */ + FriBidiPropertyBlockLevel1_0100, /* F6A00..F6AFF */ + FriBidiPropertyBlockLevel1_0100, /* F6B00..F6BFF */ + FriBidiPropertyBlockLevel1_0100, /* F6C00..F6CFF */ + FriBidiPropertyBlockLevel1_0100, /* F6D00..F6DFF */ + FriBidiPropertyBlockLevel1_0100, /* F6E00..F6EFF */ + FriBidiPropertyBlockLevel1_0100, /* F6F00..F6FFF */ + FriBidiPropertyBlockLevel1_0100, /* F7000..F70FF */ + FriBidiPropertyBlockLevel1_0100, /* F7100..F71FF */ + FriBidiPropertyBlockLevel1_0100, /* F7200..F72FF */ + FriBidiPropertyBlockLevel1_0100, /* F7300..F73FF */ + FriBidiPropertyBlockLevel1_0100, /* F7400..F74FF */ + FriBidiPropertyBlockLevel1_0100, /* F7500..F75FF */ + FriBidiPropertyBlockLevel1_0100, /* F7600..F76FF */ + FriBidiPropertyBlockLevel1_0100, /* F7700..F77FF */ + FriBidiPropertyBlockLevel1_0100, /* F7800..F78FF */ + FriBidiPropertyBlockLevel1_0100, /* F7900..F79FF */ + FriBidiPropertyBlockLevel1_0100, /* F7A00..F7AFF */ + FriBidiPropertyBlockLevel1_0100, /* F7B00..F7BFF */ + FriBidiPropertyBlockLevel1_0100, /* F7C00..F7CFF */ + FriBidiPropertyBlockLevel1_0100, /* F7D00..F7DFF */ + FriBidiPropertyBlockLevel1_0100, /* F7E00..F7EFF */ + FriBidiPropertyBlockLevel1_0100, /* F7F00..F7FFF */ + FriBidiPropertyBlockLevel1_0100, /* F8000..F80FF */ + FriBidiPropertyBlockLevel1_0100, /* F8100..F81FF */ + FriBidiPropertyBlockLevel1_0100, /* F8200..F82FF */ + FriBidiPropertyBlockLevel1_0100, /* F8300..F83FF */ + FriBidiPropertyBlockLevel1_0100, /* F8400..F84FF */ + FriBidiPropertyBlockLevel1_0100, /* F8500..F85FF */ + FriBidiPropertyBlockLevel1_0100, /* F8600..F86FF */ + FriBidiPropertyBlockLevel1_0100, /* F8700..F87FF */ + FriBidiPropertyBlockLevel1_0100, /* F8800..F88FF */ + FriBidiPropertyBlockLevel1_0100, /* F8900..F89FF */ + FriBidiPropertyBlockLevel1_0100, /* F8A00..F8AFF */ + FriBidiPropertyBlockLevel1_0100, /* F8B00..F8BFF */ + FriBidiPropertyBlockLevel1_0100, /* F8C00..F8CFF */ + FriBidiPropertyBlockLevel1_0100, /* F8D00..F8DFF */ + FriBidiPropertyBlockLevel1_0100, /* F8E00..F8EFF */ + FriBidiPropertyBlockLevel1_0100, /* F8F00..F8FFF */ + FriBidiPropertyBlockLevel1_0100, /* F9000..F90FF */ + FriBidiPropertyBlockLevel1_0100, /* F9100..F91FF */ + FriBidiPropertyBlockLevel1_0100, /* F9200..F92FF */ + FriBidiPropertyBlockLevel1_0100, /* F9300..F93FF */ + FriBidiPropertyBlockLevel1_0100, /* F9400..F94FF */ + FriBidiPropertyBlockLevel1_0100, /* F9500..F95FF */ + FriBidiPropertyBlockLevel1_0100, /* F9600..F96FF */ + FriBidiPropertyBlockLevel1_0100, /* F9700..F97FF */ + FriBidiPropertyBlockLevel1_0100, /* F9800..F98FF */ + FriBidiPropertyBlockLevel1_0100, /* F9900..F99FF */ + FriBidiPropertyBlockLevel1_0100, /* F9A00..F9AFF */ + FriBidiPropertyBlockLevel1_0100, /* F9B00..F9BFF */ + FriBidiPropertyBlockLevel1_0100, /* F9C00..F9CFF */ + FriBidiPropertyBlockLevel1_0100, /* F9D00..F9DFF */ + FriBidiPropertyBlockLevel1_0100, /* F9E00..F9EFF */ + FriBidiPropertyBlockLevel1_0100, /* F9F00..F9FFF */ + FriBidiPropertyBlockLevel1_0100, /* FA000..FA0FF */ + FriBidiPropertyBlockLevel1_0100, /* FA100..FA1FF */ + FriBidiPropertyBlockLevel1_0100, /* FA200..FA2FF */ + FriBidiPropertyBlockLevel1_0100, /* FA300..FA3FF */ + FriBidiPropertyBlockLevel1_0100, /* FA400..FA4FF */ + FriBidiPropertyBlockLevel1_0100, /* FA500..FA5FF */ + FriBidiPropertyBlockLevel1_0100, /* FA600..FA6FF */ + FriBidiPropertyBlockLevel1_0100, /* FA700..FA7FF */ + FriBidiPropertyBlockLevel1_0100, /* FA800..FA8FF */ + FriBidiPropertyBlockLevel1_0100, /* FA900..FA9FF */ + FriBidiPropertyBlockLevel1_0100, /* FAA00..FAAFF */ + FriBidiPropertyBlockLevel1_0100, /* FAB00..FABFF */ + FriBidiPropertyBlockLevel1_0100, /* FAC00..FACFF */ + FriBidiPropertyBlockLevel1_0100, /* FAD00..FADFF */ + FriBidiPropertyBlockLevel1_0100, /* FAE00..FAEFF */ + FriBidiPropertyBlockLevel1_0100, /* FAF00..FAFFF */ + FriBidiPropertyBlockLevel1_0100, /* FB000..FB0FF */ + FriBidiPropertyBlockLevel1_0100, /* FB100..FB1FF */ + FriBidiPropertyBlockLevel1_0100, /* FB200..FB2FF */ + FriBidiPropertyBlockLevel1_0100, /* FB300..FB3FF */ + FriBidiPropertyBlockLevel1_0100, /* FB400..FB4FF */ + FriBidiPropertyBlockLevel1_0100, /* FB500..FB5FF */ + FriBidiPropertyBlockLevel1_0100, /* FB600..FB6FF */ + FriBidiPropertyBlockLevel1_0100, /* FB700..FB7FF */ + FriBidiPropertyBlockLevel1_0100, /* FB800..FB8FF */ + FriBidiPropertyBlockLevel1_0100, /* FB900..FB9FF */ + FriBidiPropertyBlockLevel1_0100, /* FBA00..FBAFF */ + FriBidiPropertyBlockLevel1_0100, /* FBB00..FBBFF */ + FriBidiPropertyBlockLevel1_0100, /* FBC00..FBCFF */ + FriBidiPropertyBlockLevel1_0100, /* FBD00..FBDFF */ + FriBidiPropertyBlockLevel1_0100, /* FBE00..FBEFF */ + FriBidiPropertyBlockLevel1_0100, /* FBF00..FBFFF */ + FriBidiPropertyBlockLevel1_0100, /* FC000..FC0FF */ + FriBidiPropertyBlockLevel1_0100, /* FC100..FC1FF */ + FriBidiPropertyBlockLevel1_0100, /* FC200..FC2FF */ + FriBidiPropertyBlockLevel1_0100, /* FC300..FC3FF */ + FriBidiPropertyBlockLevel1_0100, /* FC400..FC4FF */ + FriBidiPropertyBlockLevel1_0100, /* FC500..FC5FF */ + FriBidiPropertyBlockLevel1_0100, /* FC600..FC6FF */ + FriBidiPropertyBlockLevel1_0100, /* FC700..FC7FF */ + FriBidiPropertyBlockLevel1_0100, /* FC800..FC8FF */ + FriBidiPropertyBlockLevel1_0100, /* FC900..FC9FF */ + FriBidiPropertyBlockLevel1_0100, /* FCA00..FCAFF */ + FriBidiPropertyBlockLevel1_0100, /* FCB00..FCBFF */ + FriBidiPropertyBlockLevel1_0100, /* FCC00..FCCFF */ + FriBidiPropertyBlockLevel1_0100, /* FCD00..FCDFF */ + FriBidiPropertyBlockLevel1_0100, /* FCE00..FCEFF */ + FriBidiPropertyBlockLevel1_0100, /* FCF00..FCFFF */ + FriBidiPropertyBlockLevel1_0100, /* FD000..FD0FF */ + FriBidiPropertyBlockLevel1_0100, /* FD100..FD1FF */ + FriBidiPropertyBlockLevel1_0100, /* FD200..FD2FF */ + FriBidiPropertyBlockLevel1_0100, /* FD300..FD3FF */ + FriBidiPropertyBlockLevel1_0100, /* FD400..FD4FF */ + FriBidiPropertyBlockLevel1_0100, /* FD500..FD5FF */ + FriBidiPropertyBlockLevel1_0100, /* FD600..FD6FF */ + FriBidiPropertyBlockLevel1_0100, /* FD700..FD7FF */ + FriBidiPropertyBlockLevel1_0100, /* FD800..FD8FF */ + FriBidiPropertyBlockLevel1_0100, /* FD900..FD9FF */ + FriBidiPropertyBlockLevel1_0100, /* FDA00..FDAFF */ + FriBidiPropertyBlockLevel1_0100, /* FDB00..FDBFF */ + FriBidiPropertyBlockLevel1_0100, /* FDC00..FDCFF */ + FriBidiPropertyBlockLevel1_0100, /* FDD00..FDDFF */ + FriBidiPropertyBlockLevel1_0100, /* FDE00..FDEFF */ + FriBidiPropertyBlockLevel1_0100, /* FDF00..FDFFF */ + FriBidiPropertyBlockLevel1_0100, /* FE000..FE0FF */ + FriBidiPropertyBlockLevel1_0100, /* FE100..FE1FF */ + FriBidiPropertyBlockLevel1_0100, /* FE200..FE2FF */ + FriBidiPropertyBlockLevel1_0100, /* FE300..FE3FF */ + FriBidiPropertyBlockLevel1_0100, /* FE400..FE4FF */ + FriBidiPropertyBlockLevel1_0100, /* FE500..FE5FF */ + FriBidiPropertyBlockLevel1_0100, /* FE600..FE6FF */ + FriBidiPropertyBlockLevel1_0100, /* FE700..FE7FF */ + FriBidiPropertyBlockLevel1_0100, /* FE800..FE8FF */ + FriBidiPropertyBlockLevel1_0100, /* FE900..FE9FF */ + FriBidiPropertyBlockLevel1_0100, /* FEA00..FEAFF */ + FriBidiPropertyBlockLevel1_0100, /* FEB00..FEBFF */ + FriBidiPropertyBlockLevel1_0100, /* FEC00..FECFF */ + FriBidiPropertyBlockLevel1_0100, /* FED00..FEDFF */ + FriBidiPropertyBlockLevel1_0100, /* FEE00..FEEFF */ + FriBidiPropertyBlockLevel1_0100, /* FEF00..FEFFF */ + FriBidiPropertyBlockLevel1_0100, /* FF000..FF0FF */ + FriBidiPropertyBlockLevel1_0100, /* FF100..FF1FF */ + FriBidiPropertyBlockLevel1_0100, /* FF200..FF2FF */ + FriBidiPropertyBlockLevel1_0100, /* FF300..FF3FF */ + FriBidiPropertyBlockLevel1_0100, /* FF400..FF4FF */ + FriBidiPropertyBlockLevel1_0100, /* FF500..FF5FF */ + FriBidiPropertyBlockLevel1_0100, /* FF600..FF6FF */ + FriBidiPropertyBlockLevel1_0100, /* FF700..FF7FF */ + FriBidiPropertyBlockLevel1_0100, /* FF800..FF8FF */ + FriBidiPropertyBlockLevel1_0100, /* FF900..FF9FF */ + FriBidiPropertyBlockLevel1_0100, /* FFA00..FFAFF */ + FriBidiPropertyBlockLevel1_0100, /* FFB00..FFBFF */ + FriBidiPropertyBlockLevel1_0100, /* FFC00..FFCFF */ + FriBidiPropertyBlockLevel1_0100, /* FFD00..FFDFF */ + FriBidiPropertyBlockLevel1_0100, /* FFE00..FFEFF */ + FriBidiPropertyBlockLevel1_0100, /* FFF00..FFFFF */ + FriBidiPropertyBlockLevel1_0100, /* 100000..1000FF */ + FriBidiPropertyBlockLevel1_0100, /* 100100..1001FF */ + FriBidiPropertyBlockLevel1_0100, /* 100200..1002FF */ + FriBidiPropertyBlockLevel1_0100, /* 100300..1003FF */ + FriBidiPropertyBlockLevel1_0100, /* 100400..1004FF */ + FriBidiPropertyBlockLevel1_0100, /* 100500..1005FF */ + FriBidiPropertyBlockLevel1_0100, /* 100600..1006FF */ + FriBidiPropertyBlockLevel1_0100, /* 100700..1007FF */ + FriBidiPropertyBlockLevel1_0100, /* 100800..1008FF */ + FriBidiPropertyBlockLevel1_0100, /* 100900..1009FF */ + FriBidiPropertyBlockLevel1_0100, /* 100A00..100AFF */ + FriBidiPropertyBlockLevel1_0100, /* 100B00..100BFF */ + FriBidiPropertyBlockLevel1_0100, /* 100C00..100CFF */ + FriBidiPropertyBlockLevel1_0100, /* 100D00..100DFF */ + FriBidiPropertyBlockLevel1_0100, /* 100E00..100EFF */ + FriBidiPropertyBlockLevel1_0100, /* 100F00..100FFF */ + FriBidiPropertyBlockLevel1_0100, /* 101000..1010FF */ + FriBidiPropertyBlockLevel1_0100, /* 101100..1011FF */ + FriBidiPropertyBlockLevel1_0100, /* 101200..1012FF */ + FriBidiPropertyBlockLevel1_0100, /* 101300..1013FF */ + FriBidiPropertyBlockLevel1_0100, /* 101400..1014FF */ + FriBidiPropertyBlockLevel1_0100, /* 101500..1015FF */ + FriBidiPropertyBlockLevel1_0100, /* 101600..1016FF */ + FriBidiPropertyBlockLevel1_0100, /* 101700..1017FF */ + FriBidiPropertyBlockLevel1_0100, /* 101800..1018FF */ + FriBidiPropertyBlockLevel1_0100, /* 101900..1019FF */ + FriBidiPropertyBlockLevel1_0100, /* 101A00..101AFF */ + FriBidiPropertyBlockLevel1_0100, /* 101B00..101BFF */ + FriBidiPropertyBlockLevel1_0100, /* 101C00..101CFF */ + FriBidiPropertyBlockLevel1_0100, /* 101D00..101DFF */ + FriBidiPropertyBlockLevel1_0100, /* 101E00..101EFF */ + FriBidiPropertyBlockLevel1_0100, /* 101F00..101FFF */ + FriBidiPropertyBlockLevel1_0100, /* 102000..1020FF */ + FriBidiPropertyBlockLevel1_0100, /* 102100..1021FF */ + FriBidiPropertyBlockLevel1_0100, /* 102200..1022FF */ + FriBidiPropertyBlockLevel1_0100, /* 102300..1023FF */ + FriBidiPropertyBlockLevel1_0100, /* 102400..1024FF */ + FriBidiPropertyBlockLevel1_0100, /* 102500..1025FF */ + FriBidiPropertyBlockLevel1_0100, /* 102600..1026FF */ + FriBidiPropertyBlockLevel1_0100, /* 102700..1027FF */ + FriBidiPropertyBlockLevel1_0100, /* 102800..1028FF */ + FriBidiPropertyBlockLevel1_0100, /* 102900..1029FF */ + FriBidiPropertyBlockLevel1_0100, /* 102A00..102AFF */ + FriBidiPropertyBlockLevel1_0100, /* 102B00..102BFF */ + FriBidiPropertyBlockLevel1_0100, /* 102C00..102CFF */ + FriBidiPropertyBlockLevel1_0100, /* 102D00..102DFF */ + FriBidiPropertyBlockLevel1_0100, /* 102E00..102EFF */ + FriBidiPropertyBlockLevel1_0100, /* 102F00..102FFF */ + FriBidiPropertyBlockLevel1_0100, /* 103000..1030FF */ + FriBidiPropertyBlockLevel1_0100, /* 103100..1031FF */ + FriBidiPropertyBlockLevel1_0100, /* 103200..1032FF */ + FriBidiPropertyBlockLevel1_0100, /* 103300..1033FF */ + FriBidiPropertyBlockLevel1_0100, /* 103400..1034FF */ + FriBidiPropertyBlockLevel1_0100, /* 103500..1035FF */ + FriBidiPropertyBlockLevel1_0100, /* 103600..1036FF */ + FriBidiPropertyBlockLevel1_0100, /* 103700..1037FF */ + FriBidiPropertyBlockLevel1_0100, /* 103800..1038FF */ + FriBidiPropertyBlockLevel1_0100, /* 103900..1039FF */ + FriBidiPropertyBlockLevel1_0100, /* 103A00..103AFF */ + FriBidiPropertyBlockLevel1_0100, /* 103B00..103BFF */ + FriBidiPropertyBlockLevel1_0100, /* 103C00..103CFF */ + FriBidiPropertyBlockLevel1_0100, /* 103D00..103DFF */ + FriBidiPropertyBlockLevel1_0100, /* 103E00..103EFF */ + FriBidiPropertyBlockLevel1_0100, /* 103F00..103FFF */ + FriBidiPropertyBlockLevel1_0100, /* 104000..1040FF */ + FriBidiPropertyBlockLevel1_0100, /* 104100..1041FF */ + FriBidiPropertyBlockLevel1_0100, /* 104200..1042FF */ + FriBidiPropertyBlockLevel1_0100, /* 104300..1043FF */ + FriBidiPropertyBlockLevel1_0100, /* 104400..1044FF */ + FriBidiPropertyBlockLevel1_0100, /* 104500..1045FF */ + FriBidiPropertyBlockLevel1_0100, /* 104600..1046FF */ + FriBidiPropertyBlockLevel1_0100, /* 104700..1047FF */ + FriBidiPropertyBlockLevel1_0100, /* 104800..1048FF */ + FriBidiPropertyBlockLevel1_0100, /* 104900..1049FF */ + FriBidiPropertyBlockLevel1_0100, /* 104A00..104AFF */ + FriBidiPropertyBlockLevel1_0100, /* 104B00..104BFF */ + FriBidiPropertyBlockLevel1_0100, /* 104C00..104CFF */ + FriBidiPropertyBlockLevel1_0100, /* 104D00..104DFF */ + FriBidiPropertyBlockLevel1_0100, /* 104E00..104EFF */ + FriBidiPropertyBlockLevel1_0100, /* 104F00..104FFF */ + FriBidiPropertyBlockLevel1_0100, /* 105000..1050FF */ + FriBidiPropertyBlockLevel1_0100, /* 105100..1051FF */ + FriBidiPropertyBlockLevel1_0100, /* 105200..1052FF */ + FriBidiPropertyBlockLevel1_0100, /* 105300..1053FF */ + FriBidiPropertyBlockLevel1_0100, /* 105400..1054FF */ + FriBidiPropertyBlockLevel1_0100, /* 105500..1055FF */ + FriBidiPropertyBlockLevel1_0100, /* 105600..1056FF */ + FriBidiPropertyBlockLevel1_0100, /* 105700..1057FF */ + FriBidiPropertyBlockLevel1_0100, /* 105800..1058FF */ + FriBidiPropertyBlockLevel1_0100, /* 105900..1059FF */ + FriBidiPropertyBlockLevel1_0100, /* 105A00..105AFF */ + FriBidiPropertyBlockLevel1_0100, /* 105B00..105BFF */ + FriBidiPropertyBlockLevel1_0100, /* 105C00..105CFF */ + FriBidiPropertyBlockLevel1_0100, /* 105D00..105DFF */ + FriBidiPropertyBlockLevel1_0100, /* 105E00..105EFF */ + FriBidiPropertyBlockLevel1_0100, /* 105F00..105FFF */ + FriBidiPropertyBlockLevel1_0100, /* 106000..1060FF */ + FriBidiPropertyBlockLevel1_0100, /* 106100..1061FF */ + FriBidiPropertyBlockLevel1_0100, /* 106200..1062FF */ + FriBidiPropertyBlockLevel1_0100, /* 106300..1063FF */ + FriBidiPropertyBlockLevel1_0100, /* 106400..1064FF */ + FriBidiPropertyBlockLevel1_0100, /* 106500..1065FF */ + FriBidiPropertyBlockLevel1_0100, /* 106600..1066FF */ + FriBidiPropertyBlockLevel1_0100, /* 106700..1067FF */ + FriBidiPropertyBlockLevel1_0100, /* 106800..1068FF */ + FriBidiPropertyBlockLevel1_0100, /* 106900..1069FF */ + FriBidiPropertyBlockLevel1_0100, /* 106A00..106AFF */ + FriBidiPropertyBlockLevel1_0100, /* 106B00..106BFF */ + FriBidiPropertyBlockLevel1_0100, /* 106C00..106CFF */ + FriBidiPropertyBlockLevel1_0100, /* 106D00..106DFF */ + FriBidiPropertyBlockLevel1_0100, /* 106E00..106EFF */ + FriBidiPropertyBlockLevel1_0100, /* 106F00..106FFF */ + FriBidiPropertyBlockLevel1_0100, /* 107000..1070FF */ + FriBidiPropertyBlockLevel1_0100, /* 107100..1071FF */ + FriBidiPropertyBlockLevel1_0100, /* 107200..1072FF */ + FriBidiPropertyBlockLevel1_0100, /* 107300..1073FF */ + FriBidiPropertyBlockLevel1_0100, /* 107400..1074FF */ + FriBidiPropertyBlockLevel1_0100, /* 107500..1075FF */ + FriBidiPropertyBlockLevel1_0100, /* 107600..1076FF */ + FriBidiPropertyBlockLevel1_0100, /* 107700..1077FF */ + FriBidiPropertyBlockLevel1_0100, /* 107800..1078FF */ + FriBidiPropertyBlockLevel1_0100, /* 107900..1079FF */ + FriBidiPropertyBlockLevel1_0100, /* 107A00..107AFF */ + FriBidiPropertyBlockLevel1_0100, /* 107B00..107BFF */ + FriBidiPropertyBlockLevel1_0100, /* 107C00..107CFF */ + FriBidiPropertyBlockLevel1_0100, /* 107D00..107DFF */ + FriBidiPropertyBlockLevel1_0100, /* 107E00..107EFF */ + FriBidiPropertyBlockLevel1_0100, /* 107F00..107FFF */ + FriBidiPropertyBlockLevel1_0100, /* 108000..1080FF */ + FriBidiPropertyBlockLevel1_0100, /* 108100..1081FF */ + FriBidiPropertyBlockLevel1_0100, /* 108200..1082FF */ + FriBidiPropertyBlockLevel1_0100, /* 108300..1083FF */ + FriBidiPropertyBlockLevel1_0100, /* 108400..1084FF */ + FriBidiPropertyBlockLevel1_0100, /* 108500..1085FF */ + FriBidiPropertyBlockLevel1_0100, /* 108600..1086FF */ + FriBidiPropertyBlockLevel1_0100, /* 108700..1087FF */ + FriBidiPropertyBlockLevel1_0100, /* 108800..1088FF */ + FriBidiPropertyBlockLevel1_0100, /* 108900..1089FF */ + FriBidiPropertyBlockLevel1_0100, /* 108A00..108AFF */ + FriBidiPropertyBlockLevel1_0100, /* 108B00..108BFF */ + FriBidiPropertyBlockLevel1_0100, /* 108C00..108CFF */ + FriBidiPropertyBlockLevel1_0100, /* 108D00..108DFF */ + FriBidiPropertyBlockLevel1_0100, /* 108E00..108EFF */ + FriBidiPropertyBlockLevel1_0100, /* 108F00..108FFF */ + FriBidiPropertyBlockLevel1_0100, /* 109000..1090FF */ + FriBidiPropertyBlockLevel1_0100, /* 109100..1091FF */ + FriBidiPropertyBlockLevel1_0100, /* 109200..1092FF */ + FriBidiPropertyBlockLevel1_0100, /* 109300..1093FF */ + FriBidiPropertyBlockLevel1_0100, /* 109400..1094FF */ + FriBidiPropertyBlockLevel1_0100, /* 109500..1095FF */ + FriBidiPropertyBlockLevel1_0100, /* 109600..1096FF */ + FriBidiPropertyBlockLevel1_0100, /* 109700..1097FF */ + FriBidiPropertyBlockLevel1_0100, /* 109800..1098FF */ + FriBidiPropertyBlockLevel1_0100, /* 109900..1099FF */ + FriBidiPropertyBlockLevel1_0100, /* 109A00..109AFF */ + FriBidiPropertyBlockLevel1_0100, /* 109B00..109BFF */ + FriBidiPropertyBlockLevel1_0100, /* 109C00..109CFF */ + FriBidiPropertyBlockLevel1_0100, /* 109D00..109DFF */ + FriBidiPropertyBlockLevel1_0100, /* 109E00..109EFF */ + FriBidiPropertyBlockLevel1_0100, /* 109F00..109FFF */ + FriBidiPropertyBlockLevel1_0100, /* 10A000..10A0FF */ + FriBidiPropertyBlockLevel1_0100, /* 10A100..10A1FF */ + FriBidiPropertyBlockLevel1_0100, /* 10A200..10A2FF */ + FriBidiPropertyBlockLevel1_0100, /* 10A300..10A3FF */ + FriBidiPropertyBlockLevel1_0100, /* 10A400..10A4FF */ + FriBidiPropertyBlockLevel1_0100, /* 10A500..10A5FF */ + FriBidiPropertyBlockLevel1_0100, /* 10A600..10A6FF */ + FriBidiPropertyBlockLevel1_0100, /* 10A700..10A7FF */ + FriBidiPropertyBlockLevel1_0100, /* 10A800..10A8FF */ + FriBidiPropertyBlockLevel1_0100, /* 10A900..10A9FF */ + FriBidiPropertyBlockLevel1_0100, /* 10AA00..10AAFF */ + FriBidiPropertyBlockLevel1_0100, /* 10AB00..10ABFF */ + FriBidiPropertyBlockLevel1_0100, /* 10AC00..10ACFF */ + FriBidiPropertyBlockLevel1_0100, /* 10AD00..10ADFF */ + FriBidiPropertyBlockLevel1_0100, /* 10AE00..10AEFF */ + FriBidiPropertyBlockLevel1_0100, /* 10AF00..10AFFF */ + FriBidiPropertyBlockLevel1_0100, /* 10B000..10B0FF */ + FriBidiPropertyBlockLevel1_0100, /* 10B100..10B1FF */ + FriBidiPropertyBlockLevel1_0100, /* 10B200..10B2FF */ + FriBidiPropertyBlockLevel1_0100, /* 10B300..10B3FF */ + FriBidiPropertyBlockLevel1_0100, /* 10B400..10B4FF */ + FriBidiPropertyBlockLevel1_0100, /* 10B500..10B5FF */ + FriBidiPropertyBlockLevel1_0100, /* 10B600..10B6FF */ + FriBidiPropertyBlockLevel1_0100, /* 10B700..10B7FF */ + FriBidiPropertyBlockLevel1_0100, /* 10B800..10B8FF */ + FriBidiPropertyBlockLevel1_0100, /* 10B900..10B9FF */ + FriBidiPropertyBlockLevel1_0100, /* 10BA00..10BAFF */ + FriBidiPropertyBlockLevel1_0100, /* 10BB00..10BBFF */ + FriBidiPropertyBlockLevel1_0100, /* 10BC00..10BCFF */ + FriBidiPropertyBlockLevel1_0100, /* 10BD00..10BDFF */ + FriBidiPropertyBlockLevel1_0100, /* 10BE00..10BEFF */ + FriBidiPropertyBlockLevel1_0100, /* 10BF00..10BFFF */ + FriBidiPropertyBlockLevel1_0100, /* 10C000..10C0FF */ + FriBidiPropertyBlockLevel1_0100, /* 10C100..10C1FF */ + FriBidiPropertyBlockLevel1_0100, /* 10C200..10C2FF */ + FriBidiPropertyBlockLevel1_0100, /* 10C300..10C3FF */ + FriBidiPropertyBlockLevel1_0100, /* 10C400..10C4FF */ + FriBidiPropertyBlockLevel1_0100, /* 10C500..10C5FF */ + FriBidiPropertyBlockLevel1_0100, /* 10C600..10C6FF */ + FriBidiPropertyBlockLevel1_0100, /* 10C700..10C7FF */ + FriBidiPropertyBlockLevel1_0100, /* 10C800..10C8FF */ + FriBidiPropertyBlockLevel1_0100, /* 10C900..10C9FF */ + FriBidiPropertyBlockLevel1_0100, /* 10CA00..10CAFF */ + FriBidiPropertyBlockLevel1_0100, /* 10CB00..10CBFF */ + FriBidiPropertyBlockLevel1_0100, /* 10CC00..10CCFF */ + FriBidiPropertyBlockLevel1_0100, /* 10CD00..10CDFF */ + FriBidiPropertyBlockLevel1_0100, /* 10CE00..10CEFF */ + FriBidiPropertyBlockLevel1_0100, /* 10CF00..10CFFF */ + FriBidiPropertyBlockLevel1_0100, /* 10D000..10D0FF */ + FriBidiPropertyBlockLevel1_0100, /* 10D100..10D1FF */ + FriBidiPropertyBlockLevel1_0100, /* 10D200..10D2FF */ + FriBidiPropertyBlockLevel1_0100, /* 10D300..10D3FF */ + FriBidiPropertyBlockLevel1_0100, /* 10D400..10D4FF */ + FriBidiPropertyBlockLevel1_0100, /* 10D500..10D5FF */ + FriBidiPropertyBlockLevel1_0100, /* 10D600..10D6FF */ + FriBidiPropertyBlockLevel1_0100, /* 10D700..10D7FF */ + FriBidiPropertyBlockLevel1_0100, /* 10D800..10D8FF */ + FriBidiPropertyBlockLevel1_0100, /* 10D900..10D9FF */ + FriBidiPropertyBlockLevel1_0100, /* 10DA00..10DAFF */ + FriBidiPropertyBlockLevel1_0100, /* 10DB00..10DBFF */ + FriBidiPropertyBlockLevel1_0100, /* 10DC00..10DCFF */ + FriBidiPropertyBlockLevel1_0100, /* 10DD00..10DDFF */ + FriBidiPropertyBlockLevel1_0100, /* 10DE00..10DEFF */ + FriBidiPropertyBlockLevel1_0100, /* 10DF00..10DFFF */ + FriBidiPropertyBlockLevel1_0100, /* 10E000..10E0FF */ + FriBidiPropertyBlockLevel1_0100, /* 10E100..10E1FF */ + FriBidiPropertyBlockLevel1_0100, /* 10E200..10E2FF */ + FriBidiPropertyBlockLevel1_0100, /* 10E300..10E3FF */ + FriBidiPropertyBlockLevel1_0100, /* 10E400..10E4FF */ + FriBidiPropertyBlockLevel1_0100, /* 10E500..10E5FF */ + FriBidiPropertyBlockLevel1_0100, /* 10E600..10E6FF */ + FriBidiPropertyBlockLevel1_0100, /* 10E700..10E7FF */ + FriBidiPropertyBlockLevel1_0100, /* 10E800..10E8FF */ + FriBidiPropertyBlockLevel1_0100, /* 10E900..10E9FF */ + FriBidiPropertyBlockLevel1_0100, /* 10EA00..10EAFF */ + FriBidiPropertyBlockLevel1_0100, /* 10EB00..10EBFF */ + FriBidiPropertyBlockLevel1_0100, /* 10EC00..10ECFF */ + FriBidiPropertyBlockLevel1_0100, /* 10ED00..10EDFF */ + FriBidiPropertyBlockLevel1_0100, /* 10EE00..10EEFF */ + FriBidiPropertyBlockLevel1_0100, /* 10EF00..10EFFF */ + FriBidiPropertyBlockLevel1_0100, /* 10F000..10F0FF */ + FriBidiPropertyBlockLevel1_0100, /* 10F100..10F1FF */ + FriBidiPropertyBlockLevel1_0100, /* 10F200..10F2FF */ + FriBidiPropertyBlockLevel1_0100, /* 10F300..10F3FF */ + FriBidiPropertyBlockLevel1_0100, /* 10F400..10F4FF */ + FriBidiPropertyBlockLevel1_0100, /* 10F500..10F5FF */ + FriBidiPropertyBlockLevel1_0100, /* 10F600..10F6FF */ + FriBidiPropertyBlockLevel1_0100, /* 10F700..10F7FF */ + FriBidiPropertyBlockLevel1_0100, /* 10F800..10F8FF */ + FriBidiPropertyBlockLevel1_0100, /* 10F900..10F9FF */ + FriBidiPropertyBlockLevel1_0100, /* 10FA00..10FAFF */ + FriBidiPropertyBlockLevel1_0100, /* 10FB00..10FBFF */ + FriBidiPropertyBlockLevel1_0100, /* 10FC00..10FCFF */ + FriBidiPropertyBlockLevel1_0100, /* 10FD00..10FDFF */ + FriBidiPropertyBlockLevel1_0100, /* 10FE00..10FEFF */ + FriBidiPropertyBlockLevel1_0100, /* 10FF00..10FFFF */ +}; + +/* *INDENT-ON* */ + +#define FRIBIDI_GET_TYPE(x) \ + FriBidiPropertyBlockLevel1[(x)%256 + \ + FriBidiPropertyBlockLevel0[(x)/256]] + +#undef WS +#undef SS +#undef RLO +#undef RLE +#undef PDF +#undef NSM +#undef LRO +#undef LRE +#undef ET +#undef ES +#undef EN +#undef CS +#undef BS +#undef AN +#undef BN +#undef ON +#undef AL +#undef RTL +#undef LTR + +static FriBidiCharType +get_bidi_type ( + /* input */ + FriBidiChar uch +) +{ + if (uch < 0x110000) + return fribidi_prop_to_type_[(unsigned char) FRIBIDI_GET_TYPE (uch)]; + else + return FRIBIDI_TYPE_LTR; + /* Non-Unicode chars */ +} + + +#endif /* FRIBIDI_TAB_CHAR_TYPE_2_I */ diff --git a/lib/bidi-types-list.h b/lib/bidi-types-list.h new file mode 100644 index 0000000..7c08d27 --- /dev/null +++ b/lib/bidi-types-list.h @@ -0,0 +1,69 @@ +#if !__C2MAN__ +/* FriBidi + * bidi-types-list.h - list of bidi types + * + * $Id: bidi-types-list.h,v 1.1 2004-04-25 18:47:57 behdad Exp $ + * $Author: behdad $ + * $Date: 2004-04-25 18:47:57 $ + * $Revision: 1.1 $ + * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/lib/Attic/bidi-types-list.h,v $ + * + * Author: + * Behdad Esfahbod, 2001, 2002, 2004 + * + * Copyright (C) 2004 Sharif FarsiWeb, Inc. + * Copyright (C) 2001,2002 Behdad Esfahbod + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library, in a file named COPYING; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA + * + * For licensing issues, contact <license@farsiweb.info>. + */ +/* *INDENT-OFF* */ +#endif /* !__C2MAN__ */ + +/* Bidi types from the standard. */ +_FRIBIDI_ADD_TYPE (LTR, 'L') /* Left-To-Right letter */ +_FRIBIDI_ADD_TYPE (RTL, 'R') /* Right-To-Left letter */ +_FRIBIDI_ADD_TYPE (AL, 'A') /* Arabic Letter */ +_FRIBIDI_ADD_TYPE (EN, '1') /* European Numeral */ +_FRIBIDI_ADD_TYPE (AN, '9') /* Arabic Numeral */ +_FRIBIDI_ADD_TYPE (ES, 'w') /* European number Separator */ +_FRIBIDI_ADD_TYPE (ET, 'w') /* European number Terminator */ +_FRIBIDI_ADD_TYPE (CS, 'w') /* Common Separator */ +_FRIBIDI_ADD_TYPE (NSM, '`') /* Non Spacing Mark */ +_FRIBIDI_ADD_TYPE (BN, 'b') /* Boundary Neutral */ +_FRIBIDI_ADD_TYPE (BS, 'B') /* Block Separator */ +_FRIBIDI_ADD_TYPE (SS, 'S') /* Segment Separator */ +_FRIBIDI_ADD_TYPE (WS, '_') /* White-Space */ +_FRIBIDI_ADD_TYPE (ON, 'n') /* Other Neutral */ +_FRIBIDI_ADD_TYPE (LRE, '+') /* Left-to-Right Embedding */ +_FRIBIDI_ADD_TYPE (RLE, '+') /* Right-to-Left Embedding */ +_FRIBIDI_ADD_TYPE (LRO, '+') /* Left-to-Right Override */ +_FRIBIDI_ADD_TYPE (RLO, '+') /* Right-to-Left Override */ +_FRIBIDI_ADD_TYPE (PDF, '-') /* Pop Directional Flag */ + +/* The following two types are not official Unicode bidi types, but used for + * paragraph direction handling only. */ +_FRIBIDI_ADD_TYPE (WL, 'l') /* Weak Left to right */ +_FRIBIDI_ADD_TYPE (WR, 'r') /* Weak Right to left */ + +/* The following two types are used internally only. */ +_FRIBIDI_ADD_TYPE (SOT, '^') /* Start Of Text */ +_FRIBIDI_ADD_TYPE (EOT, '$') /* End Of Text */ + +#if !__C2MAN__ +/* *INDENT-ON* */ +#endif /* !__C2MAN__ */ diff --git a/lib/bidi-types.h b/lib/bidi-types.h new file mode 100644 index 0000000..b9b571b --- /dev/null +++ b/lib/bidi-types.h @@ -0,0 +1,78 @@ +/* FriBidi + * bidi-types.h - define internal bidi types + * + * $Id: bidi-types.h,v 1.1 2004-04-25 18:47:57 behdad Exp $ + * $Author: behdad $ + * $Date: 2004-04-25 18:47:57 $ + * $Revision: 1.1 $ + * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/lib/bidi-types.h,v $ + * + * Author: + * Behdad Esfahbod, 2001, 2002, 2004 + * + * Copyright (C) 2004 Sharif FarsiWeb, Inc. + * Copyright (C) 2001,2002 Behdad Esfahbod + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library, in a file named COPYING; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA + * + * For licensing issues, contact <license@farsiweb.info>. + */ +#ifndef _BIDI_TYPES_H +#define _BIDI_TYPES_H + +#include <fribidi-common.h> + +#include <fribidi-types.h> +#include <fribidi-bidi-types.h> + +#include "common.h" + +#include <fribidi-begindecls.h> + +/* + * Define character types that char_type_tables use. + * define them to be 0, 1, 2, ... and then in fribidi_get_type.c map them + * to FriBidiCharTypes. + */ +typedef char FriBidiPropCharType; + +enum FriBidiPropEnum +{ +# define _FRIBIDI_ADD_TYPE(TYPE,SYMBOL) FRIBIDI_PROP_TYPE_##TYPE, +# include "bidi-types-list.h" +# undef _FRIBIDI_ADD_TYPE + _FRIBIDI_PROP_TYPES_COUNT +}; + +#define fribidi_prop_to_type_ FRIBIDI_NAMESPACE(prop_to_type_) +/* Maps fribidi_prop_types to fribidi_types */ +extern const FriBidiCharType fribidi_prop_to_type_[]; + +#if DEBUG + +#define fribidi_char_from_bidi_type FRIBIDI_NAMESPACE(char_from_bidi_type) +FRIBIDI_ENTRY char fribidi_char_from_bidi_type ( + FriBidiCharType t /* input bidi type */ +); + +#endif /* DEBUG */ + +#include <fribidi-enddecls.h> + +#endif /* !_BIDI_TYPES_H */ +/* Editor directions: + * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent + */ diff --git a/lib/common.h b/lib/common.h new file mode 100644 index 0000000..737a1ae --- /dev/null +++ b/lib/common.h @@ -0,0 +1,110 @@ +/* FriBidi + * common.h - common include for library sources + * + * $Id: common.h,v 1.1 2004-04-25 18:47:57 behdad Exp $ + * $Author: behdad $ + * $Date: 2004-04-25 18:47:57 $ + * $Revision: 1.1 $ + * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/lib/common.h,v $ + * + * Author: + * Behdad Esfahbod, 2004 + * + * Copyright (C) 2004 Sharif FarsiWeb, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library, in a file named COPYING; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA + * + * For licensing issues, contact <license@farsiweb.info>. + */ +#ifndef _COMMON_H +#define _COMMON_H + +#if HAVE_CONFIG_H +# include <config.h> +#endif + +#include <fribidi-common.h> + +#if WIN32 +# define FRIBIDI_ENTRY __declspec(dllexport) +#endif /* WIN32 */ + +#ifndef FALSE +# define FALSE (0==1) +#endif /* !FRIBIDI_FALSE */ + +#ifndef TRUE +# define TRUE (!FALSE) +#endif /* !TRUE */ + +#ifndef NULL +# define NULL (void *) 0 +#endif /* !NULL */ + +#if FRIBIDI_USE_GLIB +# ifndef SIZEOF_LONG +# define SIZEOF_LONG GLIB_SIZEOF_LONG +# endif /* !SIZEOF_LONG */ +# ifndef SIZEOF_VOID_P +# define SIZEOF_VOID_P GLIB_SIZEOF_VOID_P +# endif /* !SIZEOF_VOID_P */ +# if !__C2MAN__ +# include <glib/gmem.h> +# endif /* !__C2MAN__ */ +# ifndef fribidi_malloc +# define fribidi_malloc g_malloc +# define fribidi_free g_free +# endif /* !fribidi_malloc */ +#endif /* FRIBIDI_USE_GLIB */ + +/* fribidi_malloc and fribidi_free should be used instead of malloc and free. + * No need to include any headers. */ +#ifndef fribidi_malloc +# if HAVE_STDLIB_H +# if !__C2MAN__ +# include <stdlib.h> +# endif /* __C2MAN__ */ +# define fribidi_malloc malloc +# else /* !HAVE_STDLIB_H */ +# define fribidi_malloc (void *) malloc +# endif /* !HAVE_STDLIB_H */ +# define fribidi_free free +#endif /* !fribidi_malloc */ + +/* FRIBIDI_CHUNK_SIZE is the number of bytes in each chunk of memory being + * allocated for data structure pools. */ +#ifndef FRIBIDI_CHUNK_SIZE +# define FRIBIDI_CHUNK_SIZE 4096 +#else /* FRIBIDI_CHUNK_SIZE */ +# if FRIBIDI_CHUNK_SIZE < 256 +# error FRIBIDI_CHUNK_SIZE now should define the size of a chunk in bytes. +# endif /* FRIBIDI_CHUNK_SIZE < 256 */ +#endif /* FRIBIDI_CHUNK_SIZE */ + +/* FRIBIDI_BEGIN_STMT should be used at the beginning of your macro + * definitions that are to behave like simple statements. Use + * FRIBIDI_END_STMT at the end of the macro after the semicolon or brace */ +#ifndef FRIBIDI_BEGIN_STMT +# define FRIBIDI_BEGIN_STMT do { +# define FRIBIDI_END_STMT } while (0) +#endif /* !FRIBIDI_BEGIN_STMT */ + +#include "debug.h" + +#endif /* !_COMMON_H */ +/* Editor directions: + * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent + */ diff --git a/lib/debug.h b/lib/debug.h new file mode 100644 index 0000000..1ff6d87 --- /dev/null +++ b/lib/debug.h @@ -0,0 +1,87 @@ +/* FriBidi + * debug.h - debug-only interfaces + * + * $Id: debug.h,v 1.1 2004-04-25 18:47:57 behdad Exp $ + * $Author: behdad $ + * $Date: 2004-04-25 18:47:57 $ + * $Revision: 1.1 $ + * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/lib/debug.h,v $ + * + * Author: + * Behdad Esfahbod, 2001, 2002, 2004 + * + * Copyright (C) 2004 Sharif FarsiWeb, Inc. + * Copyright (C) 2001,2002 Behdad Esfahbod + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library, in a file named COPYING; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA + * + * For licensing issues, contact <license@farsiweb.info>. + */ +#ifndef _DEBUG_H +#define _DEBUG_H + +#include <fribidi-common.h> + +#include <fribidi-types.h> + +#include "common.h" + +#include <fribidi-begindecls.h> + +#if DEBUG + +#ifndef FRIBIDI_FPRINTF +# if !__C2MAN__ +# include <stdio.h> +# endif /* !__C2MAN__ */ +# define FRIBIDI_FPRINTF fprintf +# define FRIBIDI_STDERR_ stderr, +#endif /* !FRIBIDI_FPRINTF */ + +#define MSG(s) FRIBIDI_BEGIN_STMT \ + FRIBIDI_FPRINTF(FRIBIDI_STDERR_ s); \ + FRIBIDI_END_STMT + +#define MSG2(s, t) FRIBIDI_BEGIN_STMT \ + FRIBIDI_FPRINTF(FRIBIDI_STDERR_ s, t); \ + FRIBIDI_END_STMT + +#define MSG5(s, t, u, v, w) FRIBIDI_BEGIN_STMT \ + FRIBIDI_FPRINTF(FRIBIDI_STDERR_ s, t, u, v, w); \ + FRIBIDI_END_STMT + +#ifndef DBG +# define DBG(s) FRIBIDI_BEGIN_STMT \ + if (fribidi_debug_status()) MSG(FRIBIDI ": " s "\n"); \ + FRIBIDI_END_STMT +# define DBG2(s, t) FRIBIDI_BEGIN_STMT \ + if (fribidi_debug_status()) MSG2(FRIBIDI ": " s "\n", t); \ + FRIBIDI_END_STMT +#endif /* !DBG */ + +#else /* !DEBUG */ + +#define DBG(s) /* empty */ +#define DBG2(s, t) /* empty */ + +#endif /* !DEBUG */ + +#include <fribidi-enddecls.h> + +#endif /* !_DEBUG_H */ +/* Editor directions: + * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent + */ diff --git a/lib/fribidi-begindecls.h b/lib/fribidi-begindecls.h new file mode 100644 index 0000000..00f0ec9 --- /dev/null +++ b/lib/fribidi-begindecls.h @@ -0,0 +1 @@ +FRIBIDI_BEGIN_DECLS diff --git a/lib/fribidi-bidi-type.c b/lib/fribidi-bidi-type.c new file mode 100644 index 0000000..9f1b547 --- /dev/null +++ b/lib/fribidi-bidi-type.c @@ -0,0 +1,79 @@ +/* FriBidi + * fribidi-char-type.c - get character bidi type + * + * $Id: fribidi-bidi-type.c,v 1.1 2004-04-25 18:47:57 behdad Exp $ + * $Author: behdad $ + * $Date: 2004-04-25 18:47:57 $ + * $Revision: 1.1 $ + * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/lib/Attic/fribidi-bidi-type.c,v $ + * + * Authors: + * Behdad Esfahbod, 2001, 2002, 2004 + * + * Copyright (C) 2004 Sharif FarsiWeb, Inc + * Copyright (C) 2001,2002 Behdad Esfahbod + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library, in a file named COPYING; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA + * + * For licensing issues, contact <license@farsiweb.info>. + */ + +#include <fribidi-bidi-type.h> + +#include "bidi-types.h" +#include "bidi-type-table.i" + +#include "common.h" + +FRIBIDI_ENTRY FriBidiCharType +fribidi_get_bidi_type ( + /* input */ + FriBidiChar ch +) +{ + return get_bidi_type (ch); +} + +/* The following is only defined for binary compatibility */ +#define fribidi_get_type_internal FRIBIDI_NAMESPACE(get_type_internal) +FRIBIDI_ENTRY FriBidiCharType +fribidi_get_type_internal ( + /* input */ + FriBidiChar ch +) +{ + return get_bidi_type (ch); +} + +FRIBIDI_ENTRY void +fribidi_get_bidi_types ( + /* input */ + const FriBidiChar *str, + FriBidiStrIndex len, + /* output */ + FriBidiCharType *type +) +{ + for (; len; len--) + *type++ = fribidi_get_bidi_type (*str++); +} + +/* Map fribidi_prop_types to fribidi_types. */ +const FriBidiCharType fribidi_prop_to_type_[] = { +# define _FRIBIDI_ADD_TYPE(TYPE,SYMBOL) FRIBIDI_TYPE_##TYPE, +# include "bidi-types-list.h" +# undef _FRIBIDI_ADD_TYPE +}; diff --git a/lib/fribidi-bidi-type.h b/lib/fribidi-bidi-type.h new file mode 100644 index 0000000..6a0f20b --- /dev/null +++ b/lib/fribidi-bidi-type.h @@ -0,0 +1,74 @@ +/* FriBidi + * fribidi-bidi-type.h - get character bidi type + * + * $Id: fribidi-bidi-type.h,v 1.1 2004-04-25 18:47:57 behdad Exp $ + * $Author: behdad $ + * $Date: 2004-04-25 18:47:57 $ + * $Revision: 1.1 $ + * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/lib/Attic/fribidi-bidi-type.h,v $ + * + * Author: + * Behdad Esfahbod, 2001, 2002, 2004 + * + * Copyright (C) 2004 Sharif FarsiWeb, Inc + * Copyright (C) 2001,2002 Behdad Esfahbod + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library, in a file named COPYING; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA + * + * For licensing issues, contact <license@farsiweb.info>. + */ +#ifndef _FRIBIDI_BIDI_TYPE_H +#define _FRIBIDI_BIDI_TYPE_H + +#include "fribidi-common.h" + +#include "fribidi-types.h" +#include "fribidi-bidi-types.h" + +#include "fribidi-begindecls.h" + +/* fribidi_get_type is the old name of fribidi_get_bidi_type */ +#define fribidi_get_type fribidi_get_bidi_type + +#define fribidi_get_bidi_type FRIBIDI_NAMESPACE(get_bidi_type) +/* fribidi_get_bidi_type - get character bidi type + * + * This function returns the bidi type of a character. + */ +FRIBIDI_ENTRY FriBidiCharType fribidi_get_bidi_type ( + FriBidiChar ch /* input character */ +); + +/* fribidi_get_types is the old name of fribidi_get_bidi_types */ +#define fribidi_get_types fribidi_get_bidi_types + +#define fribidi_get_bidi_types FRIBIDI_NAMESPACE(get_bidi_types) +/* fribidi_get_bidi_types - get bidi types for an string of characters + * + * This function finds the bidi types of an string of characters. + */ +FRIBIDI_ENTRY void fribidi_get_bidi_types ( + const FriBidiChar *str, /* input string */ + FriBidiStrIndex len, /* input string length */ + FriBidiCharType *type /* output bidi types */ +); + +#include "fribidi-enddecls.h" + +#endif /* !_FRIBIDI_BIDI_TYPE_H */ +/* Editor directions: + * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent + */ diff --git a/lib/fribidi-bidi-types.c b/lib/fribidi-bidi-types.c new file mode 100644 index 0000000..1c3788d --- /dev/null +++ b/lib/fribidi-bidi-types.c @@ -0,0 +1,76 @@ +/* FriBidi + * fribidi-bidi-types.c - character bidi types + * + * $Id: fribidi-bidi-types.c,v 1.1 2004-04-25 18:47:57 behdad Exp $ + * $Author: behdad $ + * $Date: 2004-04-25 18:47:57 $ + * $Revision: 1.1 $ + * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/lib/fribidi-bidi-types.c,v $ + * + * Authors: + * Behdad Esfahbod, 2001, 2002, 2004 + * + * Copyright (C) 2004 Sharif FarsiWeb, Inc. + * Copyright (C) 2001,2002 Behdad Esfahbod + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library, in a file named COPYING; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA + * + * For licensing issues, contact <license@farsiweb.info>. + */ + +#include <fribidi-bidi-types.h> + +#include "common.h" + +#ifdef DEBUG + +FRIBIDI_ENTRY char +fribidi_char_from_bidi_type ( + /* input */ + FriBidiCharType t +) +{ + switch (t) + { +# define _FRIBIDI_ADD_TYPE(TYPE,SYMBOL) case FRIBIDI_TYPE_##TYPE: return SYMBOL; +# include "bidi-types-list.h" +# undef _FRIBIDI_ADD_TYPE + default: + return '?'; + } +} + +#endif + +FRIBIDI_ENTRY const char * +fribidi_bidi_type_name ( + /* input */ + FriBidiCharType t +) +{ + switch (t) + { +# define _FRIBIDI_ADD_TYPE(TYPE,SYMBOL) case FRIBIDI_TYPE_##TYPE: return #TYPE; +# include "bidi-types-list.h" +# undef _FRIBIDI_ADD_TYPE + default: + return "?"; + } +} + +/* Editor directions: + * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent + */ diff --git a/lib/fribidi-bidi-types.h b/lib/fribidi-bidi-types.h new file mode 100644 index 0000000..778ef81 --- /dev/null +++ b/lib/fribidi-bidi-types.h @@ -0,0 +1,278 @@ +/* FriBidi + * fribidi-bidi-types.h - character bidi types + * + * $Id: fribidi-bidi-types.h,v 1.1 2004-04-25 18:47:57 behdad Exp $ + * $Author: behdad $ + * $Date: 2004-04-25 18:47:57 $ + * $Revision: 1.1 $ + * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/lib/fribidi-bidi-types.h,v $ + * + * Author: + * Behdad Esfahbod, 2001, 2002, 2004 + * + * Copyright (C) 2004 Sharif FarsiWeb, Inc. + * Copyright (C) 2001,2002 Behdad Esfahbod + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library, in a file named COPYING; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA + * + * For licensing issues, contact <license@farsiweb.info>. + */ +#ifndef _FRIBIDI_BIDI_TYPES_H +#define _FRIBIDI_BIDI_TYPES_H + +#include "fribidi-common.h" + +#include "fribidi-types.h" + +#include "fribidi-begindecls.h" + +typedef signed char FriBidiLevel; + +typedef fribidi_uint32 FriBidiMaskType; +typedef FriBidiMaskType FriBidiCharType; + +/* + * Define some bit masks, that character types are based on, each one has + * only one bit on. + */ + +/* Do not use enum, because 16bit processors do not allow 32bit enum values. */ + +#define FRIBIDI_MASK_RTL 0x00000001L /* Is right to left */ +#define FRIBIDI_MASK_ARABIC 0x00000002L /* Is arabic */ + +/* Each char can be only one of the three following. */ +#define FRIBIDI_MASK_STRONG 0x00000010L /* Is strong */ +#define FRIBIDI_MASK_WEAK 0x00000020L /* Is weak */ +#define FRIBIDI_MASK_NEUTRAL 0x00000040L /* Is neutral */ +#define FRIBIDI_MASK_SENTINEL 0x00000080L /* Is sentinel: SOT, EOT */ +/* Sentinels are not valid chars, just identify the start and end of strings. */ + +/* Each char can be only one of the five following. */ +#define FRIBIDI_MASK_LETTER 0x00000100L /* Is letter: L, R, AL */ +#define FRIBIDI_MASK_NUMBER 0x00000200L /* Is number: EN, AN */ +#define FRIBIDI_MASK_NUMSEPTER 0x00000400L /* Is number separator or terminator: ES, ET, CS */ +#define FRIBIDI_MASK_SPACE 0x00000800L /* Is space: BN, BS, SS, WS */ +#define FRIBIDI_MASK_EXPLICIT 0x00001000L /* Is expilict mark: LRE, RLE, LRO, RLO, PDF */ + +/* Can be on only if FRIBIDI_MASK_SPACE is also on. */ +#define FRIBIDI_MASK_SEPARATOR 0x00002000L /* Is test separator: BS, SS */ +/* Can be on only if FRIBIDI_MASK_EXPLICIT is also on. */ +#define FRIBIDI_MASK_OVERRIDE 0x00004000L /* Is explicit override: LRO, RLO */ + +/* The following must be to make types pairwise different, some of them can + be removed but are here because of efficiency (make queries faster). */ + +#define FRIBIDI_MASK_ES 0x00010000L +#define FRIBIDI_MASK_ET 0x00020000L +#define FRIBIDI_MASK_CS 0x00040000L + +#define FRIBIDI_MASK_NSM 0x00080000L +#define FRIBIDI_MASK_BN 0x00100000L + +#define FRIBIDI_MASK_BS 0x00200000L +#define FRIBIDI_MASK_SS 0x00400000L +#define FRIBIDI_MASK_WS 0x00800000L + +/* We reserve the sign bit for user's private use: we will never use it, + then negative character types will be never assigned. */ + + +/* + * Define values for FriBidiCharType + */ + +/* Strong left to right */ +#define FRIBIDI_TYPE_LTR ( FRIBIDI_MASK_STRONG + FRIBIDI_MASK_LETTER ) +/* Right to left characters */ +#define FRIBIDI_TYPE_RTL ( FRIBIDI_MASK_STRONG + FRIBIDI_MASK_LETTER \ + + FRIBIDI_MASK_RTL) +/* Arabic characters */ +#define FRIBIDI_TYPE_AL ( FRIBIDI_MASK_STRONG + FRIBIDI_MASK_LETTER \ + + FRIBIDI_MASK_RTL + FRIBIDI_MASK_ARABIC ) +/* Left-To-Right embedding */ +#define FRIBIDI_TYPE_LRE (FRIBIDI_MASK_STRONG + FRIBIDI_MASK_EXPLICIT) +/* Right-To-Left embedding */ +#define FRIBIDI_TYPE_RLE ( FRIBIDI_MASK_STRONG + FRIBIDI_MASK_EXPLICIT \ + + FRIBIDI_MASK_RTL ) +/* Left-To-Right override */ +#define FRIBIDI_TYPE_LRO ( FRIBIDI_MASK_STRONG + FRIBIDI_MASK_EXPLICIT \ + + FRIBIDI_MASK_OVERRIDE ) +/* Right-To-Left override */ +#define FRIBIDI_TYPE_RLO ( FRIBIDI_MASK_STRONG + FRIBIDI_MASK_EXPLICIT \ + + FRIBIDI_MASK_RTL + FRIBIDI_MASK_OVERRIDE ) + +/* Pop directional override */ +#define FRIBIDI_TYPE_PDF ( FRIBIDI_MASK_WEAK + FRIBIDI_MASK_EXPLICIT ) +/* European digit */ +#define FRIBIDI_TYPE_EN ( FRIBIDI_MASK_WEAK + FRIBIDI_MASK_NUMBER ) +/* Arabic digit */ +#define FRIBIDI_TYPE_AN ( FRIBIDI_MASK_WEAK + FRIBIDI_MASK_NUMBER \ + + FRIBIDI_MASK_ARABIC ) +/* European number separator */ +#define FRIBIDI_TYPE_ES ( FRIBIDI_MASK_WEAK + FRIBIDI_MASK_NUMSEPTER \ + + FRIBIDI_MASK_ES ) +/* European number terminator */ +#define FRIBIDI_TYPE_ET ( FRIBIDI_MASK_WEAK + FRIBIDI_MASK_NUMSEPTER \ + + FRIBIDI_MASK_ET ) +/* Common Separator */ +#define FRIBIDI_TYPE_CS ( FRIBIDI_MASK_WEAK + FRIBIDI_MASK_NUMSEPTER \ + + FRIBIDI_MASK_CS ) +/* Non spacing mark */ +#define FRIBIDI_TYPE_NSM ( FRIBIDI_MASK_WEAK + FRIBIDI_MASK_NSM ) +/* Boundary neutral */ +#define FRIBIDI_TYPE_BN ( FRIBIDI_MASK_WEAK + FRIBIDI_MASK_SPACE \ + + FRIBIDI_MASK_BN ) + +/* Block separator */ +#define FRIBIDI_TYPE_BS ( FRIBIDI_MASK_NEUTRAL + FRIBIDI_MASK_SPACE \ + + FRIBIDI_MASK_SEPARATOR + FRIBIDI_MASK_BS ) +/* Segment separator */ +#define FRIBIDI_TYPE_SS ( FRIBIDI_MASK_NEUTRAL + FRIBIDI_MASK_SPACE \ + + FRIBIDI_MASK_SEPARATOR + FRIBIDI_MASK_SS ) +/* Whitespace */ +#define FRIBIDI_TYPE_WS ( FRIBIDI_MASK_NEUTRAL + FRIBIDI_MASK_SPACE \ + + FRIBIDI_MASK_WS ) +/* Other Neutral */ +#define FRIBIDI_TYPE_ON ( FRIBIDI_MASK_NEUTRAL ) + +/* The following are used to identify the paragraph direction, + types L, R, N are not used internally anymore, and recommended to use + LTR, RTL and ON instead, didn't removed because of compatability. */ +#define FRIBIDI_TYPE_L ( FRIBIDI_TYPE_LTR ) +#define FRIBIDI_TYPE_R ( FRIBIDI_TYPE_RTL ) +#define FRIBIDI_TYPE_N ( FRIBIDI_TYPE_ON ) +/* Weak left to right */ +#define FRIBIDI_TYPE_WL ( FRIBIDI_MASK_WEAK ) +/* Weak right to left */ +#define FRIBIDI_TYPE_WR ( FRIBIDI_MASK_WEAK + FRIBIDI_MASK_RTL ) + +/* The following are only used internally */ + +/* Start of text */ +#define FRIBIDI_TYPE_SOT ( FRIBIDI_MASK_SENTINEL ) +/* End of text */ +#define FRIBIDI_TYPE_EOT ( FRIBIDI_MASK_SENTINEL + FRIBIDI_MASK_RTL ) + +/* + * End of define values for FriBidiCharType + */ + + +/* + * Defining macros for needed queries, It is fully dependent on the + * implementation of FriBidiCharType. + */ + + +/* Is private-use value? */ +#define FRIBIDI_TYPE_PRIVATE(p) ((p) < 0) + +/* Return the direction of the level number, FRIBIDI_TYPE_LTR for even and + FRIBIDI_TYPE_RTL for odds. */ +#define FRIBIDI_LEVEL_TO_DIR(lev) (FRIBIDI_TYPE_LTR | (lev & 1)) + +/* Return the minimum level of the direction, 0 for FRIBIDI_TYPE_LTR and + 1 for FRIBIDI_TYPE_RTL and FRIBIDI_TYPE_AL. */ +#define FRIBIDI_DIR_TO_LEVEL(dir) ((FriBidiLevel)(dir & 1)) + +/* Is right to left? */ +#define FRIBIDI_IS_RTL(p) ((p) & FRIBIDI_MASK_RTL) +/* Is arabic? */ +#define FRIBIDI_IS_ARABIC(p) ((p) & FRIBIDI_MASK_ARABIC) + +/* Is strong? */ +#define FRIBIDI_IS_STRONG(p) ((p) & FRIBIDI_MASK_STRONG) +/* Is weak? */ +#define FRIBIDI_IS_WEAK(p) ((p) & FRIBIDI_MASK_WEAK) +/* Is neutral? */ +#define FRIBIDI_IS_NEUTRAL(p) ((p) & FRIBIDI_MASK_NEUTRAL) +/* Is sentinel? */ +#define FRIBIDI_IS_SENTINEL(p) ((p) & FRIBIDI_MASK_SENTINEL) + +/* Is letter: L, R, AL? */ +#define FRIBIDI_IS_LETTER(p) ((p) & FRIBIDI_MASK_LETTER) +/* Is number: EN, AN? */ +#define FRIBIDI_IS_NUMBER(p) ((p) & FRIBIDI_MASK_NUMBER) +/* Is number separator or terminator: ES, ET, CS? */ +#define FRIBIDI_IS_NUMBER_SEPARATOR_OR_TERMINATOR(p) \ + ((p) & FRIBIDI_MASK_NUMSEPTER) +/* Is space: BN, BS, SS, WS? */ +#define FRIBIDI_IS_SPACE(p) ((p) & FRIBIDI_MASK_SPACE) +/* Is explicit mark: LRE, RLE, LRO, RLO, PDF? */ +#define FRIBIDI_IS_EXPLICIT(p) ((p) & FRIBIDI_MASK_EXPLICIT) + +/* Is test separator: BS, SS? */ +#define FRIBIDI_IS_SEPARATOR(p) ((p) & FRIBIDI_MASK_SEPARATOR) + +/* Is explicit override: LRO, RLO? */ +#define FRIBIDI_IS_OVERRIDE(p) ((p) & FRIBIDI_MASK_OVERRIDE) + +/* Some more: */ + +/* Is left to right letter: LTR? */ +#define FRIBIDI_IS_LTR_LETTER(p) \ + ((p) & (FRIBIDI_MASK_LETTER | FRIBIDI_MASK_RTL) == FRIBIDI_MASK_LETTER) + +/* Is right to left letter: RTL, AL? */ +#define FRIBIDI_IS_RTL_LETTER(p) \ + ((p) & (FRIBIDI_MASK_LETTER | FRIBIDI_MASK_RTL) \ + == (FRIBIDI_MASK_LETTER | FRIBIDI_MASK_RTL)) + +/* Is ES or CS: ES, CS? */ +#define FRIBIDI_IS_ES_OR_CS(p) \ + ((p) & (FRIBIDI_MASK_ES | FRIBIDI_MASK_CS)) + +/* Is explicit or BN: LRE, RLE, LRO, RLO, PDF, BN? */ +#define FRIBIDI_IS_EXPLICIT_OR_BN(p) \ + ((p) & (FRIBIDI_MASK_EXPLICIT | FRIBIDI_MASK_BN)) + +/* Is explicit or separator or BN or WS: LRE, RLE, LRO, RLO, PDF, BS, SS, BN, WS? */ +#define FRIBIDI_IS_EXPLICIT_OR_SEPARATOR_OR_BN_OR_WS(p) \ + ((p) & (FRIBIDI_MASK_EXPLICIT | FRIBIDI_MASK_SEPARATOR \ + | FRIBIDI_MASK_BN | FRIBIDI_MASK_WS)) + +/* Define some conversions. */ + +/* Change numbers: EN, AN to RTL. */ +#define FRIBIDI_CHANGE_NUMBER_TO_RTL(p) \ + (FRIBIDI_IS_NUMBER(p) ? FRIBIDI_TYPE_RTL : (p)) + +/* Override status of an explicit mark: LRO->LTR, RLO->RTL, otherwise->ON. */ +#define FRIBIDI_EXPLICIT_TO_OVERRIDE_DIR(p) \ + (FRIBIDI_IS_OVERRIDE(p) ? FRIBIDI_LEVEL_TO_DIR(FRIBIDI_DIR_TO_LEVEL(p)) \ + : FRIBIDI_TYPE_ON) + + +/* fribidi_type_name is the old name of fribidi_bidi_type_name */ +#define fribidi_type_name fribidi_bidi_type_name + +#define fribidi_bidi_type_name FRIBIDI_NAMESPACE(bidi_type_name) +/* fribidi_bidi_type_name - get bidi type name + * + * This function returns the bidi type name of a character type. The + * returned string is a static string and should not be freed. + */ +FRIBIDI_ENTRY const char *fribidi_bidi_type_name ( + FriBidiCharType t /* input bidi type */ +); + +#include "fribidi-enddecls.h" + +#endif /* !_FRIBIDI_BIDI_TYPES_H */ +/* Editor directions: + * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent + */ diff --git a/lib/fribidi-bidi.c b/lib/fribidi-bidi.c new file mode 100644 index 0000000..5a9cfcf --- /dev/null +++ b/lib/fribidi-bidi.c @@ -0,0 +1,1424 @@ +/* FriBidi + * fribidi-bidi.c - bidirectional algorithm + * + * $Id: fribidi-bidi.c,v 1.1 2004-04-25 18:47:57 behdad Exp $ + * $Author: behdad $ + * $Date: 2004-04-25 18:47:57 $ + * $Revision: 1.1 $ + * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/lib/fribidi-bidi.c,v $ + * + * Authors: + * Behdad Esfahbod, 2001, 2002, 2004 + * Dov Grobgeld, 1999, 2000 + * + * Copyright (C) 2004 Sharif FarsiWeb, Inc + * Copyright (C) 2001,2002 Behdad Esfahbod + * Copyright (C) 1999,2000 Dov Grobgeld + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library, in a file named COPYING; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA + * + * For licensing issues, contact <license@farsiweb.info>. + */ + +#include <fribidi-bidi.h> +#include <fribidi-bidi-type.h> +#include <fribidi-mirroring.h> +#include <fribidi-unicode.h> +#include <fribidi-env.h> + +#include "mem.h" + +#include "common.h" + +#undef MAX +#define MAX(a,b) ((a) > (b) ? (a) : (b)) + +/*====================================================================== + * Typedef for the run-length list. + *----------------------------------------------------------------------*/ +typedef struct _TypeLink TypeLink; + +struct _TypeLink +{ + TypeLink *prev; + TypeLink *next; + + FriBidiCharType type; + FriBidiStrIndex pos, len; + FriBidiLevel level; +}; + +#define FRIBIDI_LEVEL_REMOVED -3 +#define FRIBIDI_LEVEL_START -2 +#define FRIBIDI_LEVEL_END -1 + +typedef struct +{ + FriBidiCharType override; /* only LTR, RTL and ON are valid */ + FriBidiLevel level; +} +LevelInfo; + +static void +bidi_string_reverse ( + FriBidiChar *str, + FriBidiStrIndex len +) +{ + FriBidiStrIndex i; + for (i = 0; i < len / 2; i++) + { + FriBidiChar tmp = str[i]; + str[i] = str[len - 1 - i]; + str[len - 1 - i] = tmp; + } +} + +static void +index_array_reverse ( + FriBidiStrIndex *arr, + FriBidiStrIndex len +) +{ + FriBidiStrIndex i; + for (i = 0; i < len / 2; i++) + { + FriBidiStrIndex tmp = arr[i]; + arr[i] = arr[len - 1 - i]; + arr[len - 1 - i] = tmp; + } +} + +#ifndef USE_SIMPLE_MALLOC +static TypeLink *free_type_links = NULL; +#endif /* !USE_SIMPLE_MALLOC */ + +static TypeLink * +new_type_link ( + void +) +{ + TypeLink *link; + +#if USE_SIMPLE_MALLOC + link = fribidi_malloc (sizeof (TypeLink)); +#else /* !USE_SIMPLE_MALLOC */ + if (free_type_links) + { + link = free_type_links; + free_type_links = free_type_links->next; + } + else + { + static FriBidiMemChunk *mem_chunk = NULL; + + if (!mem_chunk) + mem_chunk = fribidi_chunk_new_for_type (TypeLink + ); + + link = fribidi_chunk_new (TypeLink, + mem_chunk + ); + } +#endif /* !USE_SIMPLE_MALLOC */ + + link->len = 0; + link->pos = 0; + link->level = 0; + link->next = NULL; + link->prev = NULL; + return link; +} + +static void +free_type_link ( + TypeLink *link +) +{ +#if USE_SIMPLE_MALLOC + fribidi_free (link); +#else /* !USE_SIMPLE_MALLOC */ + link->next = free_type_links; + free_type_links = link; +#endif /* !USE_SIMPLE_MALLOC */ +} + +#define FRIBIDI_ADD_TYPE_LINK(p,q) \ + FRIBIDI_BEGIN_STMT \ + (p)->len = (q)->pos - (p)->pos; \ + (p)->next = (q); \ + (q)->prev = (p); \ + (p) = (q); \ + FRIBIDI_END_STMT + +static TypeLink * +run_length_encode_types ( + FriBidiCharType *char_type, + FriBidiStrIndex type_len +) +{ + TypeLink *list, *last, *link; + + FriBidiStrIndex i; + + /* Add the starting link */ + list = new_type_link (); + list->type = FRIBIDI_TYPE_SOT; + list->level = FRIBIDI_LEVEL_START; + last = list; + + /* Sweep over the string_type s */ + for (i = 0; i < type_len; i++) + if (char_type[i] != last->type) + { + link = new_type_link (); + link->type = char_type[i]; + link->pos = i; + FRIBIDI_ADD_TYPE_LINK (last, link); + } + + /* Add the ending link */ + link = new_type_link (); + link->type = FRIBIDI_TYPE_EOT; + link->level = FRIBIDI_LEVEL_END; + link->pos = type_len; + FRIBIDI_ADD_TYPE_LINK (last, link); + + return list; +} + +/* explicits_list is a list like type_rl_list, that holds the explicit + codes that are removed from rl_list, to reinsert them later by calling + the override_list. +*/ +static void +init_list ( + TypeLink **start, + TypeLink **end +) +{ + TypeLink *list; + TypeLink *link; + + /* Add the starting link */ + list = new_type_link (); + list->type = FRIBIDI_TYPE_SOT; + list->level = FRIBIDI_LEVEL_START; + list->len = 0; + list->pos = 0; + + /* Add the ending link */ + link = new_type_link (); + link->type = FRIBIDI_TYPE_EOT; + link->level = FRIBIDI_LEVEL_END; + link->len = 0; + link->pos = 0; + list->next = link; + link->prev = list; + + *start = list; + *end = link; +} + +/* move an element before another element in a list, the list must have a + previous element, used to update explicits_list. + assuming that p have both prev and next or none of them, also update + the list that p is currently in, if any. +*/ +static void +move_element_before ( + TypeLink *p, + TypeLink *list +) +{ + if (p->prev) + { + p->prev->next = p->next; + p->next->prev = p->prev; + } + p->prev = list->prev; + list->prev->next = p; + p->next = list; + list->prev = p; +} + +/* override the rl_list 'base', with the elements in the list 'over', to + reinsert the previously-removed explicit codes (at X9) from + 'explicits_list' back into 'type_rl_list'. This is used at the end of I2 + to restore the explicit marks, and also to reset the character types of + characters at L1. + + it is assumed that the 'pos' of the first element in 'base' list is not + more than the 'pos' of the first element of the 'over' list, and the + 'pos' of the last element of the 'base' list is not less than the 'pos' + of the last element of the 'over' list. these two conditions are always + satisfied for the two usages mentioned above. + + TBD: use some explanatory names instead of p, q, ... +*/ +static void +override_list ( + TypeLink *base, + TypeLink *over +) +{ + TypeLink *p = base, *q, *r, *s, *t; + FriBidiStrIndex pos = 0, pos2; + + if (!over) + return; + q = over; + while (q) + { + if (!q->len || q->pos < pos) + { + t = q; + q = q->next; + free_type_link (t); + continue; + } + pos = q->pos; + while (p->next && p->next->pos <= pos) + p = p->next; + /* now p is the element that q must be inserted 'in'. */ + pos2 = pos + q->len; + r = p; + while (r->next && r->next->pos < pos2) + r = r->next; + /* now r is the last element that q affects. */ + if (p == r) + { + /* split p into at most 3 interval, and insert q in the place of + the second interval, set r to be the third part. */ + /* third part needed? */ + if (p->next && p->next->pos == pos2) + r = r->next; + else + { + r = new_type_link (); + *r = *p; + if (r->next) + { + r->next->prev = r; + r->len = r->next->pos - pos2; + } + else + r->len -= pos - p->pos; + r->pos = pos2; + } + /* first part needed? */ + if (p->prev && p->pos == pos) + { + t = p; + p = p->prev; + free_type_link (t); + } + else + p->len = pos - p->pos; + } + else + { + /* cut the end of p. */ + p->len = pos - p->pos; + /* if all of p is cut, remove it. */ + if (!p->len && p->prev) + p = p->prev; + + /* cut the begining of r. */ + r->pos = pos2; + if (r->next) + r->len = r->next->pos - pos2; + /* if all of r is cut, remove it. */ + if (!r->len && r->next) + r = r->next; + + /* remove the elements between p and r. */ + for (s = p->next; s != r;) + { + t = s; + s = s->next; + free_type_link (t); + } + } + /* before updating the next and prev links to point to the inserted q, + we must remember the next element of q in the 'over' list. + */ + t = q; + q = q->next; + p->next = t; + t->prev = p; + t->next = r; + r->prev = t; + } +} + +/* Some convenience macros */ +#define RL_TYPE(list) ((list)->type) +#define RL_LEN(list) ((list)->len) +#define RL_POS(list) ((list)->pos) +#define RL_LEVEL(list) ((list)->level) + +static TypeLink * +merge_with_prev ( + TypeLink *second +) +{ + TypeLink *first = second->prev; + first->next = second->next; + first->next->prev = first; + RL_LEN (first) += RL_LEN (second); + free_type_link (second); + return first; +} + +static void +compact_list ( + TypeLink *list +) +{ + if (list->next) + for (list = list->next; list; list = list->next) + if (RL_TYPE (list->prev) == RL_TYPE (list) + && RL_LEVEL (list->prev) == RL_LEVEL (list)) + list = merge_with_prev (list); +} + +static void +compact_neutrals ( + TypeLink *list +) +{ + if (list->next) + { + for (list = list->next; list; list = list->next) + { + if (RL_LEVEL (list->prev) == RL_LEVEL (list) + && + ((RL_TYPE + (list->prev) == RL_TYPE (list) + || (FRIBIDI_IS_NEUTRAL (RL_TYPE (list->prev)) + && FRIBIDI_IS_NEUTRAL (RL_TYPE (list)))))) + list = merge_with_prev (list); + } + } +} + +/*========================================================================= + * define macros for push and pop the status in to / out of the stack + *-------------------------------------------------------------------------*/ + +/* There's some little points in pushing and poping into the status stack: + 1. when the embedding level is not valid (more than FRIBIDI_BIDI_MAX_EXPLICIT_LEVEL=61), + you must reject it, and not to push into the stack, but when you see a + PDF, you must find the matching code, and if it was pushed in the stack, + pop it, it means you must pop if and only if you have pushed the + matching code, the over_pushed var counts the number of rejected codes yet. + 2. there's a more confusing point too, when the embedding level is exactly + FRIBIDI_BIDI_MAX_EXPLICIT_LEVEL-1=60, an LRO or LRE must be rejected because the new + level would be FRIBIDI_BIDI_MAX_EXPLICIT_LEVEL+1=62, that is invalid, but an RLO or RLE + must be accepted because the new level is FRIBIDI_BIDI_MAX_EXPLICIT_LEVEL=61, that is + valid, so the rejected codes may be not continuous in the logical order, + in fact there is at most two continuous intervals of codes, with a RLO or + RLE between them. To support this case, the first_interval var counts the + number of rejected codes in the first interval, when it is 0, means that + there is only one interval yet. +*/ + +/* a. If this new level would be valid, then this embedding code is valid. + Remember (push) the current embedding level and override status. + Reset current level to this new level, and reset the override status to + new_override. + b. If the new level would not be valid, then this code is invalid. Don't + change the current level or override status. +*/ +#define PUSH_STATUS \ + FRIBIDI_BEGIN_STMT \ + if (new_level <= FRIBIDI_BIDI_MAX_EXPLICIT_LEVEL) \ + { \ + if (level == FRIBIDI_BIDI_MAX_EXPLICIT_LEVEL - 1) \ + first_interval = over_pushed; \ + status_stack[stack_size].level = level; \ + status_stack[stack_size].override = override; \ + stack_size++; \ + level = new_level; \ + override = new_override; \ + } else \ + over_pushed++; \ + FRIBIDI_END_STMT + +/* If there was a valid matching code, restore (pop) the last remembered + (pushed) embedding level and directional override. +*/ +#define POP_STATUS \ + FRIBIDI_BEGIN_STMT \ + if (over_pushed || stack_size) \ + { \ + if (over_pushed > first_interval) \ + over_pushed--; \ + else \ + { \ + if (over_pushed == first_interval) \ + first_interval = 0; \ + stack_size--; \ + level = status_stack[stack_size].level; \ + override = status_stack[stack_size].override; \ + } \ + } \ + FRIBIDI_END_STMT + +/*========================================================================== + * There was no support for sor and eor in the absence of Explicit Embedding + * Levels, so define macros, to support them, with as less change as needed. + *--------------------------------------------------------------------------*/ + +/* Return the type of previous char or the sor, if already at the start of + a run level. */ +#define PREV_TYPE_OR_SOR(pp) \ + ( \ + RL_LEVEL(pp->prev) == RL_LEVEL(pp) ? \ + RL_TYPE(pp->prev) : \ + FRIBIDI_LEVEL_TO_DIR(MAX(RL_LEVEL(pp->prev), RL_LEVEL(pp))) \ + ) + +/* Return the type of next char or the eor, if already at the end of + a run level. */ +#define NEXT_TYPE_OR_EOR(pp) \ + ( \ + !pp->next ? \ + FRIBIDI_LEVEL_TO_DIR(RL_LEVEL(pp)) : \ + (RL_LEVEL(pp->next) == RL_LEVEL(pp) ? \ + RL_TYPE(pp->next) : \ + FRIBIDI_LEVEL_TO_DIR(MAX(RL_LEVEL(pp->next), RL_LEVEL(pp))) \ + ) \ + ) + + +/* Return the embedding direction of a link. */ +#define FRIBIDI_EMBEDDING_DIRECTION(list) \ + FRIBIDI_LEVEL_TO_DIR(RL_LEVEL(list)) + +#if DEBUG +/*====================================================================== + * For debugging, define some functions for printing the types and the + * levels. + *----------------------------------------------------------------------*/ + +static char char_from_level_array[] = { + '!', /* FRIBIDI_LEVEL_REMOVED, internal error, this level shouldn't be seen. */ + '^', /* FRIBIDI_LEVEL_START, indicating start of string. */ + '$', /* FRIBIDI_LEVEL_END, indicating end of string. */ + /* 0-9,a-z,A-Z are the the only valid levels before resolving implicits. + after that the level @ may be appear too. */ + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', + 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', + 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', + 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', + 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', + 'Y', 'Z', + + '@', /* only must appear after resolving implicits. */ + '*', '*', '*' /* overflows, this levels and higher levels show a bug!. */ +}; + +#define fribidi_char_from_level(level) char_from_level_array[(level) + 3] + +static void +print_types_re ( + TypeLink *pp +) +{ + MSG (" Run types : "); + while (pp) + { + MSG5 ("%d:l%d(%s)[%d] ", + pp->pos, pp->len, fribidi_type_name (pp->type), pp->level); + pp = pp->next; + } + MSG ("\n"); +} + +static void +print_resolved_levels ( + TypeLink *pp +) +{ + MSG (" Res. levels: "); + while (pp) + { + FriBidiStrIndex i; + for (i = RL_LEN (pp); i; i--) + MSG2 ("%c", fribidi_char_from_level (RL_LEVEL (pp))); + pp = pp->next; + } + MSG ("\n"); +} + +static void +print_resolved_types ( + TypeLink *pp +) +{ + MSG (" Res. types : "); + while (pp) + { + FriBidiStrIndex i; + for (i = RL_LEN (pp); i; i--) + MSG2 ("%c", fribidi_char_from_bidi_type (pp->type)); + pp = pp->next; + } + MSG ("\n"); +} + +static void +print_bidi_string ( + /* input */ + const FriBidiChar *str, + FriBidiStrIndex len +) +{ + MSG (" Org. types : "); + for (; len; len--) + MSG2 ("%c", fribidi_char_from_bidi_type (fribidi_get_bidi_type (*str++))); + MSG ("\n"); +} +#endif /* DEBUG */ + +/*====================================================================== + * This function should follow the Unicode specification closely! + *----------------------------------------------------------------------*/ +static void +fribidi_analyse_string ( + /* input */ + const FriBidiChar *str, + FriBidiStrIndex len, + /* input and output */ + FriBidiCharType *pbase_dir, + /* output */ + TypeLink **ptype_rl_list, + FriBidiLevel *pmax_level +) +{ + FriBidiLevel base_level, max_level; + FriBidiCharType base_dir; + FriBidiStrIndex i; + TypeLink *type_rl_list, *explicits_list, *explicits_list_end, *pp; + + DBG ("Entering fribidi_analyse_string"); + + /* Determinate character types */ + DBG (" Determine character types"); + { + FriBidiCharType *char_type = + (FriBidiCharType *) fribidi_malloc (len * sizeof (FriBidiCharType)); + for (i = 0; i < len; i++) + char_type[i] = fribidi_get_type (str[i]); + + /* Run length encode the character types */ + type_rl_list = run_length_encode_types (char_type, len); + fribidi_free (char_type); + } + DBG (" Determine character types, Done"); + + init_list (&explicits_list, &explicits_list_end); + + /* Find base level */ + DBG (" Finding the base level"); + if (FRIBIDI_IS_STRONG (*pbase_dir)) + base_level = FRIBIDI_DIR_TO_LEVEL (*pbase_dir); + /* P2. P3. Search for first strong character and use its direction as + base direction */ + else + { + /* If no strong base_dir was found, resort to the weak direction + that was passed on input. */ + base_level = FRIBIDI_DIR_TO_LEVEL (*pbase_dir); + base_dir = FRIBIDI_TYPE_ON; + for (pp = type_rl_list; pp; pp = pp->next) + if (FRIBIDI_IS_LETTER (RL_TYPE (pp))) + { + base_level = FRIBIDI_DIR_TO_LEVEL (RL_TYPE (pp)); + base_dir = FRIBIDI_LEVEL_TO_DIR (base_level); + break; + } + } + base_dir = FRIBIDI_LEVEL_TO_DIR (base_level); + DBG2 (" Base level : %c", fribidi_char_from_level (base_level)); + DBG2 (" Base dir : %c", fribidi_char_from_bidi_type (base_dir)); + DBG (" Finding the base level, Done"); + +# if DEBUG + if (fribidi_debug_status ()) + { + print_types_re (type_rl_list); + } +# endif /* DEBUG */ + + /* Explicit Levels and Directions */ + DBG ("Explicit Levels and Directions"); + { + /* X1. Begin by setting the current embedding level to the paragraph + embedding level. Set the directional override status to neutral. + Process each character iteratively, applying rules X2 through X9. + Only embedding levels from 0 to 61 are valid in this phase. */ + FriBidiLevel level, new_level; + FriBidiCharType override, new_override; + FriBidiStrIndex i; + int stack_size, over_pushed, first_interval; + LevelInfo *status_stack; + TypeLink temp_link; + + level = base_level; + override = FRIBIDI_TYPE_ON; + /* stack */ + stack_size = 0; + over_pushed = 0; + first_interval = 0; + status_stack = + (LevelInfo *) fribidi_malloc (sizeof (LevelInfo) * + FRIBIDI_BIDI_MAX_RESOLVED_LEVELS); + + for (pp = type_rl_list->next; pp->next; pp = pp->next) + { + FriBidiCharType this_type = RL_TYPE (pp); + if (FRIBIDI_IS_EXPLICIT_OR_BN (this_type)) + { + if (FRIBIDI_IS_STRONG (this_type)) + { /* LRE, RLE, LRO, RLO */ + /* 1. Explicit Embeddings */ + /* X2. With each RLE, compute the least greater odd embedding level. */ + /* X3. With each LRE, compute the least greater even embedding level. */ + /* 2. Explicit Overrides */ + /* X4. With each RLO, compute the least greater odd embedding level. */ + /* X5. With each LRO, compute the least greater even embedding level. */ + new_override = FRIBIDI_EXPLICIT_TO_OVERRIDE_DIR (this_type); + for (i = RL_LEN (pp); i; i--) + { + new_level = + ((level + FRIBIDI_DIR_TO_LEVEL (this_type) + 2) & ~1) - + FRIBIDI_DIR_TO_LEVEL (this_type); + PUSH_STATUS; + } + } + else if (this_type == FRIBIDI_TYPE_PDF) + { + /* 3. Terminating Embeddings and overrides */ + /* X7. With each PDF, determine the matching embedding or + override code. */ + for (i = RL_LEN (pp); i; i--) + POP_STATUS; + } + /* X9. Remove all RLE, LRE, RLO, LRO, PDF, and BN codes. */ + /* Remove element and add it to explicits_list */ + temp_link.next = pp->next; + pp->level = FRIBIDI_LEVEL_REMOVED; + move_element_before (pp, explicits_list_end); + pp = &temp_link; + } + else + { + /* X6. For all typed besides RLE, LRE, RLO, LRO, and PDF: + a. Set the level of the current character to the current + embedding level. + b. Whenever the directional override status is not neutral, + reset the current character type to the directional override + status. */ + RL_LEVEL (pp) = level; + if (!FRIBIDI_IS_NEUTRAL (override)) + RL_TYPE (pp) = override; + } + /* X8. All explicit directional embeddings and overrides are + completely terminated at the end of each paragraph. Paragraph + separators are not included in the embedding. */ + /* This function is running on a single paragraph, so we can do + X8 after all the input is processed. */ + } + + /* Implementing X8. It has no effect on a single paragraph! */ + level = base_level; + override = FRIBIDI_TYPE_ON; + stack_size = 0; + over_pushed = 0; + + fribidi_free (status_stack); + } + /* X10. The remaining rules are applied to each run of characters at the + same level. For each run, determine the start-of-level-run (sor) and + end-of-level-run (eor) type, either L or R. This depends on the + higher of the two levels on either side of the boundary (at the start + or end of the paragraph, the level of the 'other' run is the base + embedding level). If the higher level is odd, the type is R, otherwise + it is L. */ + /* Resolving Implicit Levels can be done out of X10 loop, so only change + of Resolving Weak Types and Resolving Neutral Types is needed. */ + + compact_list (type_rl_list); + +# if DEBUG + if (fribidi_debug_status ()) + { + print_types_re (type_rl_list); + print_bidi_string (str, len); + print_resolved_levels (type_rl_list); + print_resolved_types (type_rl_list); + } +# endif /* DEBUG */ + + /* 4. Resolving weak types */ + DBG ("Resolving weak types"); + { + FriBidiCharType last_strong, prev_type_org; + fribidi_boolean w4; + + last_strong = base_dir; + + for (pp = type_rl_list->next; pp->next; pp = pp->next) + { + FriBidiCharType prev_type, this_type, next_type; + + prev_type = PREV_TYPE_OR_SOR (pp); + this_type = RL_TYPE (pp); + next_type = NEXT_TYPE_OR_EOR (pp); + + if (FRIBIDI_IS_STRONG (prev_type)) + last_strong = prev_type; + + /* W1. NSM + Examine each non-spacing mark (NSM) in the level run, and change the + type of the NSM to the type of the previous character. If the NSM + is at the start of the level run, it will get the type of sor. */ + /* Implementation note: it is important that if the previous character + is not sor, then we should merge this run with the previous, + because of rules like W5, that we assume all of a sequence of + adjacent ETs are in one TypeLink. */ + if (this_type == FRIBIDI_TYPE_NSM) + { + if (RL_LEVEL (pp->prev) == RL_LEVEL (pp)) + pp = merge_with_prev (pp); + else + RL_TYPE (pp) = prev_type; + continue; /* As we know the next condition cannot be true. */ + } + + /* W2: European numbers. */ + if (this_type == FRIBIDI_TYPE_EN && last_strong == FRIBIDI_TYPE_AL) + { + RL_TYPE (pp) = FRIBIDI_TYPE_AN; + + /* Resolving dependency of loops for rules W1 and W2, so we + can merge them in one loop. */ + if (next_type == FRIBIDI_TYPE_NSM) + RL_TYPE (pp->next) = FRIBIDI_TYPE_AN; + } + } + + + last_strong = base_dir; + /* Resolving dependency of loops for rules W4 and W5, W5 may + want to prevent W4 to take effect in the next turn, do this + through "w4". */ + w4 = TRUE; + /* Resolving dependency of loops for rules W4 and W5 with W7, + W7 may change an EN to L but it sets the prev_type_org if needed, + so W4 and W5 in next turn can still do their works. */ + prev_type_org = FRIBIDI_TYPE_ON; + + for (pp = type_rl_list->next; pp->next; pp = pp->next) + { + FriBidiCharType prev_type, this_type, next_type; + + prev_type = PREV_TYPE_OR_SOR (pp); + this_type = RL_TYPE (pp); + next_type = NEXT_TYPE_OR_EOR (pp); + + if (FRIBIDI_IS_STRONG (prev_type)) + last_strong = prev_type; + + /* W3: Change ALs to R. */ + if (this_type == FRIBIDI_TYPE_AL) + { + RL_TYPE (pp) = FRIBIDI_TYPE_RTL; + w4 = TRUE; + prev_type_org = FRIBIDI_TYPE_ON; + continue; + } + + /* W4. A single european separator changes to a european number. + A single common separator between two numbers of the same type + changes to that type. */ + if (w4 + && RL_LEN (pp) == 1 && FRIBIDI_IS_ES_OR_CS (this_type) + && FRIBIDI_IS_NUMBER (prev_type_org) && prev_type_org == next_type + && (prev_type_org == FRIBIDI_TYPE_EN + || this_type == FRIBIDI_TYPE_CS)) + { + RL_TYPE (pp) = prev_type; + this_type = RL_TYPE (pp); + } + w4 = TRUE; + + /* W5. A sequence of European terminators adjacent to European + numbers changes to All European numbers. */ + if (this_type == FRIBIDI_TYPE_ET + && (prev_type_org == FRIBIDI_TYPE_EN + || next_type == FRIBIDI_TYPE_EN)) + { + RL_TYPE (pp) = FRIBIDI_TYPE_EN; + w4 = FALSE; + this_type = RL_TYPE (pp); + } + + /* W6. Otherwise change separators and terminators to other neutral. */ + if (FRIBIDI_IS_NUMBER_SEPARATOR_OR_TERMINATOR (this_type)) + RL_TYPE (pp) = FRIBIDI_TYPE_ON; + + /* W7. Change european numbers to L. */ + if (this_type == FRIBIDI_TYPE_EN && last_strong == FRIBIDI_TYPE_LTR) + { + RL_TYPE (pp) = FRIBIDI_TYPE_LTR; + prev_type_org = (RL_LEVEL (pp) == RL_LEVEL (pp->next) ? + FRIBIDI_TYPE_EN : FRIBIDI_TYPE_ON); + } + else + prev_type_org = PREV_TYPE_OR_SOR (pp->next); + } + } + + compact_neutrals (type_rl_list); + +# if DEBUG + if (fribidi_debug_status ()) + { + print_resolved_levels (type_rl_list); + print_resolved_types (type_rl_list); + } +# endif /* DEBUG */ + + /* 5. Resolving Neutral Types */ + DBG ("Resolving neutral types"); + { + /* N1. and N2. + For each neutral, resolve it. */ + for (pp = type_rl_list->next; pp->next; pp = pp->next) + { + FriBidiCharType prev_type, this_type, next_type; + + /* "European and arabic numbers are treated as though they were R" + FRIBIDI_CHANGE_NUMBER_TO_RTL does this. */ + this_type = FRIBIDI_CHANGE_NUMBER_TO_RTL (RL_TYPE (pp)); + prev_type = FRIBIDI_CHANGE_NUMBER_TO_RTL (PREV_TYPE_OR_SOR (pp)); + next_type = FRIBIDI_CHANGE_NUMBER_TO_RTL (NEXT_TYPE_OR_EOR (pp)); + + if (FRIBIDI_IS_NEUTRAL (this_type)) + RL_TYPE (pp) = (prev_type == next_type) ? + /* N1. */ prev_type : + /* N2. */ FRIBIDI_EMBEDDING_DIRECTION (pp); + } + } + + compact_list (type_rl_list); + +# if DEBUG + if (fribidi_debug_status ()) + { + print_resolved_levels (type_rl_list); + print_resolved_types (type_rl_list); + } +# endif /* DEBUG */ + + /* 6. Resolving implicit levels */ + DBG ("Resolving implicit levels"); + { + max_level = base_level; + + for (pp = type_rl_list->next; pp->next; pp = pp->next) + { + FriBidiCharType this_type; + int level; + + this_type = RL_TYPE (pp); + level = RL_LEVEL (pp); + + /* I1. Even */ + /* I2. Odd */ + if (FRIBIDI_IS_NUMBER (this_type)) + RL_LEVEL (pp) = (level + 2) & ~1; + else + RL_LEVEL (pp) = (level ^ FRIBIDI_DIR_TO_LEVEL (this_type)) + + (level & 1); + + if (RL_LEVEL (pp) > max_level) + max_level = RL_LEVEL (pp); + } + } + + compact_list (type_rl_list); + +# if DEBUG + if (fribidi_debug_status ()) + { + print_bidi_string (str, len); + print_resolved_levels (type_rl_list); + print_resolved_types (type_rl_list); + } +# endif /* DEBUG */ + +/* Reinsert the explicit codes & bn's that already removed, from the + explicits_list to type_rl_list. */ + DBG ("Reinserting explicit codes"); + { + TypeLink *p; + + override_list (type_rl_list, explicits_list); + p = type_rl_list->next; + if (p->level < 0) + p->level = base_level; + for (; p->next; p = p->next) + if (p->level < 0) + p->level = p->prev->level; + } + +# if DEBUG + if (fribidi_debug_status ()) + { + print_types_re (type_rl_list); + print_resolved_levels (type_rl_list); + print_resolved_types (type_rl_list); + } +# endif /* DEBUG */ + + DBG ("Reset the embedding levels"); + { + int j, k, state, pos; + TypeLink *p, *q, *list, *list_end; + + /* L1. Reset the embedding levels of some chars. */ + init_list (&list, &list_end); + q = list_end; + state = 1; + pos = len - 1; + for (j = len - 1; j >= -1; j--) + { + /* if state is on at the very first of string, do this too. */ + if (j >= 0) + k = fribidi_get_type (str[j]); + else + k = FRIBIDI_TYPE_ON; + if (!state && FRIBIDI_IS_SEPARATOR (k)) + { + state = 1; + pos = j; + } + else if (state && !FRIBIDI_IS_EXPLICIT_OR_SEPARATOR_OR_BN_OR_WS (k)) + { + state = 0; + p = new_type_link (); + p->prev = p->next = NULL; + p->pos = j + 1; + p->len = pos - j; + p->type = base_dir; + p->level = base_level; + move_element_before (p, q); + q = p; + } + } + override_list (type_rl_list, list); + } + +# if DEBUG + if (fribidi_debug_status ()) + { + print_types_re (type_rl_list); + print_resolved_levels (type_rl_list); + print_resolved_types (type_rl_list); + } +# endif /* DEBUG */ + + *ptype_rl_list = type_rl_list; + *pmax_level = max_level; + *pbase_dir = base_dir; + + DBG ("Leaving fribidi_analyse_string"); + return; +} + +/*====================================================================== + * Frees up the rl_list, must be called after each call to + * fribidi_analyse_string(), after the list is not needed anymore. + *----------------------------------------------------------------------*/ +static void +free_rl_list ( + TypeLink *type_rl_list +) +{ + + TypeLink *pp; + + DBG ("Entering free_rl_list"); + + if (!type_rl_list) + { + DBG ("Leaving free_rl_list"); + return; + } + +#if USE_SIMPLE_MALLOC + pp = type_rl_list; + while (pp) + { + TypeLink *p; + + p = pp; + pp = pp->next; + free_type_link (p); + }; +#else /* !USE_SIMPLE_MALLOC */ + for (pp = type_rl_list->next; pp->next; pp = pp->next) + /* Nothing */ ; + pp->next = free_type_links; + free_type_links = type_rl_list; + type_rl_list = NULL; +#endif /* !USE_SIMPLE_MALLOC */ + + DBG ("Leaving free_rl_list"); + return; +} + +/*====================================================================== + * Here starts the exposed front end functions. + *----------------------------------------------------------------------*/ + +/*====================================================================== + * fribidi_remove_bidi_marks() removes bidirectional marks, and returns + * the new length, updates each of other inputs if not NULL. + *----------------------------------------------------------------------*/ +FRIBIDI_ENTRY FriBidiStrIndex +fribidi_remove_bidi_marks ( + FriBidiChar *str, + FriBidiStrIndex length, + FriBidiStrIndex *position_to_this_list, + FriBidiStrIndex *position_from_this_list, + FriBidiLevel *embedding_level_list +) +{ + FriBidiStrIndex i, j; + fribidi_boolean private_from_this = FALSE; + + DBG ("Entering fribidi_remove_bidi_marks"); + + /* If to_this is to not null, we must have from_this as well. If it is + not given by the caller, we have to make a private instance of it. */ + if (position_to_this_list && !position_from_this_list) + { + private_from_this = TRUE; + position_from_this_list = + (FriBidiStrIndex *) fribidi_malloc (sizeof (FriBidiStrIndex) * + length); + } + + j = 0; + for (i = 0; i < length; i++) + if (!FRIBIDI_IS_EXPLICIT (fribidi_get_type (str[i])) + && str[i] != FRIBIDI_CHAR_LRM && str[i] != FRIBIDI_CHAR_RLM) + { + str[j] = str[i]; + if (embedding_level_list) + embedding_level_list[j] = embedding_level_list[i]; + if (position_from_this_list) + position_from_this_list[j] = position_from_this_list[i]; + j++; + } + + /* Convert the from_this list to to_this */ + if (position_to_this_list) + { + DBG (" Converting from_this list to to_this"); + for (i = 0; i < length; i++) + position_to_this_list[i] = -1; + for (i = 0; i < length; i++) + position_to_this_list[position_from_this_list[i]] = i; + DBG (" Converting from_this list to to_this, Done"); + } + + if (private_from_this) + fribidi_free (position_from_this_list); + + DBG ("Leaving fribidi_remove_bidi_marks"); + return j; +} + + +/*====================================================================== + * fribidi_log2vis() calls the function_analyse_string() and then + * does reordering and fills in the output strings. + *----------------------------------------------------------------------*/ +FRIBIDI_ENTRY fribidi_boolean +fribidi_log2vis ( + /* input */ + const FriBidiChar *str, + FriBidiStrIndex len, + /* input and output */ + FriBidiCharType *pbase_dir, + /* output */ + FriBidiChar *visual_str, + FriBidiStrIndex *position_L_to_V_list, + FriBidiStrIndex *position_V_to_L_list, + FriBidiLevel *embedding_level_list +) +{ + TypeLink *type_rl_list, *pp = NULL; + FriBidiLevel max_level; + fribidi_boolean private_V_to_L = FALSE; + + DBG ("Entering fribidi_log2vis()\n"); + + if (len == 0) + { + DBG ("Leaving fribidi_log2vis()\n"); + return TRUE; + } + + /* If l2v is to be calculated we must have v2l as well. If it is not + given by the caller, we have to make a private instance of it. */ + if (position_L_to_V_list && !position_V_to_L_list) + { + private_V_to_L = TRUE; + position_V_to_L_list = + (FriBidiStrIndex *) fribidi_malloc (sizeof (FriBidiStrIndex) * len); + } + + if (len > FRIBIDI_MAX_STRING_LENGTH && position_V_to_L_list) + { +# if DEBUG + MSG2 (FRIBIDI ": cannot handle strings > %ld characters\n", + (long) FRIBIDI_MAX_STRING_LENGTH); +# endif /* DEBUG */ + return FALSE; + } + fribidi_analyse_string (str, len, pbase_dir, + /* output */ + &type_rl_list, &max_level); + + /* 7. Reordering resolved levels */ + DBG ("Reordering resolved levels\n"); + { + FriBidiLevel level_idx; + FriBidiStrIndex i; + + /* Set up the ordering array to sorted order */ + if (position_V_to_L_list) + { + DBG (" Initialize position_V_to_L_list\n"); + for (i = 0; i < len; i++) + position_V_to_L_list[i] = i; + DBG (" Initialize position_V_to_L_list, Done\n"); + } + /* Copy the logical string to the visual */ + if (visual_str) + { + DBG (" Initialize visual_str\n"); + for (i = 0; i < len; i++) + visual_str[i] = str[i]; + visual_str[len] = 0; + DBG (" Initialize visual_str, Done\n"); + } + + /* Assign the embedding level array */ + if (embedding_level_list) + { + DBG (" Fill the embedding levels array\n"); + for (pp = type_rl_list->next; pp->next; pp = pp->next) + { + FriBidiStrIndex i, pos, len; + FriBidiLevel level; + + pos = pp->pos; + len = pp->len; + level = pp->level; + for (i = 0; i < len; i++) + embedding_level_list[pos + i] = level; + } + DBG (" Fill the embedding levels array, Done\n"); + } + + /* Reorder both the outstring and the order array */ + if (visual_str || position_V_to_L_list) + { + if (fribidi_mirroring_status () && visual_str) + { + /* L4. Mirror all characters that are in odd levels and have mirrors. */ + DBG (" Mirroring\n"); + for (pp = type_rl_list->next; pp->next; pp = pp->next) + { + if (pp->level & 1) + { + FriBidiStrIndex i; + for (i = RL_POS (pp); i < RL_POS (pp) + RL_LEN (pp); i++) + { + FriBidiChar mirrored_ch; + if (fribidi_get_mirror_char + (visual_str[i], &mirrored_ch)) + visual_str[i] = mirrored_ch; + } + } + } + DBG (" Mirroring, Done\n"); + } + + if (fribidi_reorder_nsm_status ()) + { + /* L3. Reorder NSMs. */ + DBG (" Reordering NSM sequences\n"); + /* We apply this rule before L2, so go backward in odd levels. */ + for (pp = type_rl_list->next; pp->next; pp = pp->next) + { + if (pp->level & 1) + { + FriBidiStrIndex i, seq_end = 0; + fribidi_boolean is_nsm_seq; + + is_nsm_seq = FALSE; + for (i = RL_POS (pp) + RL_LEN (pp) - 1; i >= RL_POS (pp); + i--) + { + FriBidiCharType this_type; + + this_type = fribidi_get_type (str[i]); + if (is_nsm_seq && this_type != FRIBIDI_TYPE_NSM) + { + if (visual_str) + { + bidi_string_reverse (visual_str + i, + seq_end - i + 1); + } + if (position_V_to_L_list) + { + index_array_reverse (position_V_to_L_list + i, + seq_end - i + 1); + } + is_nsm_seq = 0; + } + else if (!is_nsm_seq && this_type == FRIBIDI_TYPE_NSM) + { + seq_end = i; + is_nsm_seq = 1; + } + } + if (is_nsm_seq) + { + DBG + ("Warning: NSMs at the beggining of run level.\n"); + } + } + } + DBG (" Reordering NSM sequences, Done\n"); + } + + /* L2. Reorder. */ + DBG (" Reordering\n"); + for (level_idx = max_level; level_idx > 0; level_idx--) + { + for (pp = type_rl_list->next; pp->next; pp = pp->next) + { + if (RL_LEVEL (pp) >= level_idx) + { + /* Find all stretches that are >= level_idx */ + FriBidiStrIndex len = RL_LEN (pp), pos = RL_POS (pp); + TypeLink *pp1 = pp->next; + while (pp1->next && RL_LEVEL (pp1) >= level_idx) + { + len += RL_LEN (pp1); + pp1 = pp1->next; + } + pp = pp1->prev; + if (visual_str) + bidi_string_reverse (visual_str + pos, len); + if (position_V_to_L_list) + index_array_reverse (position_V_to_L_list + pos, len); + } + } + } + DBG (" Reordering, Done\n"); + } + + /* Convert the v2l list to l2v */ + if (position_L_to_V_list) + { + DBG (" Converting v2l list to l2v\n"); + for (i = 0; i < len; i++) + position_L_to_V_list[position_V_to_L_list[i]] = i; + DBG (" Converting v2l list to l2v, Done\n"); + } + } + DBG ("Reordering resolved levels, Done\n"); + + if (private_V_to_L) + fribidi_free (position_V_to_L_list); + + free_rl_list (type_rl_list); + + DBG ("Leaving fribidi_log2vis()\n"); + return TRUE; + +} + +/*====================================================================== + * fribidi_log2vis_get_embedding_levels() is used in order to just get + * the embedding levels. + *----------------------------------------------------------------------*/ +FRIBIDI_ENTRY fribidi_boolean +fribidi_log2vis_get_embedding_levels ( + /* input */ + const FriBidiChar *str, + FriBidiStrIndex len, + /* input and output */ + FriBidiCharType *pbase_dir, + /* output */ + FriBidiLevel *embedding_level_list +) +{ + TypeLink *type_rl_list, *pp; + FriBidiLevel max_level; + + DBG ("Entering fribidi_log2vis_get_embedding_levels()\n"); + + if (len == 0) + { + DBG ("Leaving fribidi_log2vis_get_embedding_levels()\n"); + return TRUE; + } + + fribidi_analyse_string (str, len, pbase_dir, + /* output */ + &type_rl_list, &max_level); + + for (pp = type_rl_list->next; pp->next; pp = pp->next) + { + FriBidiStrIndex i, pos = RL_POS (pp), len = RL_LEN (pp); + FriBidiLevel level = RL_LEVEL (pp); + for (i = 0; i < len; i++) + embedding_level_list[pos + i] = level; + } + + free_rl_list (type_rl_list); + + DBG ("Leaving fribidi_log2vis_get_embedding_levels()\n"); + return TRUE; +} + +/* Editor directions: + * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent + */ diff --git a/lib/fribidi-bidi.h b/lib/fribidi-bidi.h new file mode 100644 index 0000000..abbc59e --- /dev/null +++ b/lib/fribidi-bidi.h @@ -0,0 +1,112 @@ +/* FriBidi + * fribidi-bidi.h - bidirectional algorithm + * + * $Id: fribidi-bidi.h,v 1.1 2004-04-25 18:47:57 behdad Exp $ + * $Author: behdad $ + * $Date: 2004-04-25 18:47:57 $ + * $Revision: 1.1 $ + * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/lib/fribidi-bidi.h,v $ + * + * Authors: + * Behdad Esfahbod, 2001, 2002, 2004 + * Dov Grobgeld, 1999, 2000 + * + * Copyright (C) 2004 Sharif FarsiWeb, Inc + * Copyright (C) 2001,2002 Behdad Esfahbod + * Copyright (C) 1999,2000 Dov Grobgeld + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library, in a file named COPYING; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA + * + * For licensing issues, contact <license@farsiweb.info>. + */ +#ifndef _FRIBIDI_BIDI_H +#define _FRIBIDI_BIDI_H + +#include "fribidi-common.h" + +#include "fribidi-types.h" +#include "fribidi-bidi-types.h" + +#include "fribidi-begindecls.h" + +#define fribidi_log2vis FRIBIDI_NAMESPACE(log2vis) +/* fribidi_log2vis - get visual string + * + * This function converts the logical input string to the visual output + * strings as specified by the Unicode Bidirectional Algorithm. As a side + * effect it also generates mapping lists between the two strings, and the + * list of embedding levels as defined by the algorithm. If any of the the + * lists are passed as NULL, the list is ignored and not filled. + * + * Returns: Non-zero if it was successful, or zero if any error occured. + */ +FRIBIDI_ENTRY fribidi_boolean fribidi_log2vis ( + const FriBidiChar *str, /* input logical string */ + FriBidiStrIndex len, /* input string length */ + FriBidiCharType *pbase_dir, /* requested and resolved paragraph + * base direction */ + FriBidiChar *visual_str, /* output visual string */ + FriBidiStrIndex *position_L_to_V_list, /* output mapping from logical to + * visual string positions */ + FriBidiStrIndex *position_V_to_L_list, /* output mapping from visual string + * back to the logical string + * positions */ + FriBidiLevel *embedding_level_list /* output list of embedding levels */ +); + +#define fribidi_log2vis_get_embedding_levels FRIBIDI_NAMESPACE(log2vis_get_embedding_levels) +/* fribidi_log2vis_get_embedding_levels - get bidi embedding levels + * + * This function finds the bidi embedding levels of a single paragraph, + * as defined by the Unicode Bidirectional Algorithm. + * + * Returns: Non-zero if it was successful, or zero if any error occured. + */ +FRIBIDI_ENTRY fribidi_boolean fribidi_log2vis_get_embedding_levels ( + const FriBidiChar *str, /* input logical string */ + FriBidiStrIndex len, /* input string length */ + FriBidiCharType *pbase_dir, /* requested and resolved paragraph + * base direction */ + FriBidiLevel *embedding_level_list /* output list of embedding levels */ +); + +#define fribidi_remove_bidi_marks FRIBIDI_NAMESPACE(remove_bidi_marks) +/* fribidi_remove_bidi_marks - remove bidi marks out an string + * + * This function removes the bidi marks out of an string and the + * accompanying lists. If any of the input lists are NULL, the list is + * skipped. + * + * Bugs: It is not clear that if the input string is a logical, or visual + * string. It is know to have problems handling position lists. In short, + * it should be avoided. + * + * Returns: New length of the string. + */ +FRIBIDI_ENTRY FriBidiStrIndex fribidi_remove_bidi_marks ( + FriBidiChar *str, + FriBidiStrIndex length, + FriBidiStrIndex *position_to_this_list, + FriBidiStrIndex *position_from_this_list, + FriBidiLevel *embedding_level_list +); + +#include "fribidi-enddecls.h" + +#endif /* !_FRIBIDI_BIDI_H */ +/* Editor directions: + * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent + */ diff --git a/lib/fribidi-common.h b/lib/fribidi-common.h new file mode 100644 index 0000000..0a71af5 --- /dev/null +++ b/lib/fribidi-common.h @@ -0,0 +1,83 @@ +/* FriBidi + * fribidi-common.h - common include for library headers + * + * $Id: fribidi-common.h,v 1.1 2004-04-25 18:47:57 behdad Exp $ + * $Author: behdad $ + * $Date: 2004-04-25 18:47:57 $ + * $Revision: 1.1 $ + * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/lib/fribidi-common.h,v $ + * + * Author: + * Behdad Esfahbod, 2004 + * + * Copyright (C) 2004 Sharif FarsiWeb, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library, in a file named COPYING; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA + * + * For licensing issues, contact <license@farsiweb.info>. + */ +#ifndef _FRIBIDI_COMMON_H +#define _FRIBIDI_COMMON_H + +#if !DONT_HAVE_FRIBIDI_CONFIG_H +# include "fribidi-config.h" +#else /* DONT_HAVE_FRIBIDI_CONFIG_H */ +# define FRIBIDI "fribidi" +# define FRIBIDI_NAME "fribidi" +# define FRIBIDI_VERSION "unknown" +# define FRIBIDI_INTERFACE_VERSION_STRING "unknown" +#endif /* DONT_HAVE_FRIBIDI_CONFIG_H */ + +#if HAVE_FRIBIDI_CUSTOM_H +# include <fribidi-custom.h> +#endif /* HAVE_FRIBIDI_CUSTOM_H */ + +/* FRIBIDI_NAMESPACE is a macro used to name library symbols. */ +#ifndef FRIBIDI_NAMESPACE +# define FRIBIDI_NAMESPACE(SYMBOL) fribidi_##SYMBOL +#endif /* !FRIBIDI_NAMESPACE */ + +/* FRIBIDI_ENTRY is a macro used to declare library entry points. */ +#ifndef FRIBIDI_ENTRY +# ifdef WIN32 +# define FRIBIDI_ENTRY __declspec(dllimport) +# else /* !WIN32 */ +# define FRIBIDI_ENTRY /* empty */ +# endif /* !WIN32 */ +#endif /* !FRIBIDI_ENTRY */ + +/* FRIBIDI_BEGIN_DECLS should be used at the beginning of your declarations, + * so that C++ compilers don't mangle their names. Use FRIBIDI_END_DECLS at + * the end of C declarations. */ +#ifndef FRIBIDI_BEGIN_DECLS +# ifdef __cplusplus +# define FRIBIDI_BEGIN_DECLS extern "C" { +# define FRIBIDI_END_DECLS } +# else /* !__cplusplus */ +# define FRIBIDI_BEGIN_DECLS /* empty */ +# define FRIBIDI_END_DECLS /* empty */ +# endif /* !__cplusplus */ +#endif /* !FRIBIDI_BEGIN_DECLS */ + + +#define fribidi_version_info FRIBIDI_NAMESPACE(version_info) +/* An string containing the version information of the library. */ +extern const char *fribidi_version_info; + +#endif /* !_FRIBIDI_COMMON_H */ +/* Editor directions: + * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent + */ diff --git a/lib/fribidi-config.h.in b/lib/fribidi-config.h.in new file mode 100644 index 0000000..2d98aaa --- /dev/null +++ b/lib/fribidi-config.h.in @@ -0,0 +1,22 @@ +#ifndef FRIBIDI_CONFIG_H +#define FRIBIDI_CONFIG_H +/* @configure_input@ */ + +#define FRIBIDI "@PACKAGE@" +#define FRIBIDI_NAME "@PACKAGE_NAME@" +#define FRIBIDI_BUGREPORT "@PACKAGE_BUGREPORT@" + +#define FRIBIDI_VERSION "@FRIBIDI_VERSION@" +#define FRIBIDI_MAJOR_VERSION @FRIBIDI_MAJOR_VERSION@ +#define FRIBIDI_MINOR_VERSION @FRIBIDI_MINOR_VERSION@ +#define FRIBIDI_MICRO_VERSION @FRIBIDI_MICRO_VERSION@ +#define FRIBIDI_INTERFACE_VERSION @FRIBIDI_INTERFACE_VERSION@ +#define FRIBIDI_INTERFACE_VERSION_STRING "@FRIBIDI_INTERFACE_VERSION@" + +/* Define to 1 if you want charset conversion codes in the library */ +#define FRIBIDI_CHARSETS @FRIBIDI_CHARSETS@ + +/* Define to 1 if you want to use glib */ +#define FRIBIDI_USE_GLIB @FRIBIDI_USE_GLIB@ + +#endif /* FRIBIDI_CONFIG_H */ diff --git a/lib/fribidi-enddecls.h b/lib/fribidi-enddecls.h new file mode 100644 index 0000000..7c35e15 --- /dev/null +++ b/lib/fribidi-enddecls.h @@ -0,0 +1 @@ +FRIBIDI_END_DECLS diff --git a/lib/fribidi-env.c b/lib/fribidi-env.c new file mode 100644 index 0000000..0a98304 --- /dev/null +++ b/lib/fribidi-env.c @@ -0,0 +1,107 @@ +/* FriBidi + * fribidi-mirroring.c - get mirrored character + * + * $Id: fribidi-env.c,v 1.1 2004-04-25 18:47:57 behdad Exp $ + * $Author: behdad $ + * $Date: 2004-04-25 18:47:57 $ + * $Revision: 1.1 $ + * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/lib/Attic/fribidi-env.c,v $ + * + * Authors: + * Behdad Esfahbod, 2001, 2002, 2004 + * Dov Grobgeld, 1999, 2000 + * + * Copyright (C) 2004 Sharif FarsiWeb, Inc + * Copyright (C) 2001,2002 Behdad Esfahbod + * Copyright (C) 1999,2000 Dov Grobgeld + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library, in a file named COPYING; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA + * + * For licensing issues, contact <license@farsiweb.info>. + */ + +#include <fribidi-env.h> + +#include "common.h" + +#if DEBUG +static fribidi_boolean flag_debug = FALSE; +#endif + +FRIBIDI_ENTRY fribidi_boolean +fribidi_debug_status ( + void +) +{ +#if DEBUG + return flag_debug; +#else + return 0; +#endif +} + +FRIBIDI_ENTRY fribidi_boolean +fribidi_set_debug ( + fribidi_boolean state +) +{ +#if DEBUG + return flag_debug = state; +#else + return 0; +#endif +} + +static fribidi_boolean flag_mirroring = TRUE; + +FRIBIDI_ENTRY fribidi_boolean +fribidi_set_mirroring ( + fribidi_boolean state +) +{ + return flag_mirroring = state; +} + +FRIBIDI_ENTRY fribidi_boolean +fribidi_mirroring_status ( + void +) +{ + return flag_mirroring; +} + +static fribidi_boolean flag_reorder_nsm = FALSE; + +FRIBIDI_ENTRY fribidi_boolean +fribidi_set_reorder_nsm ( + fribidi_boolean state +) +{ + return flag_reorder_nsm = state; +} + +fribidi_boolean +fribidi_reorder_nsm_status ( + void +) +{ + return flag_reorder_nsm; +} + + +/* Editor directions: + * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent + */ diff --git a/lib/fribidi-env.h b/lib/fribidi-env.h new file mode 100644 index 0000000..95722e3 --- /dev/null +++ b/lib/fribidi-env.h @@ -0,0 +1,125 @@ +/* FriBidi + * fribidi-env.h - state manipulation routines + * + * $Id: fribidi-env.h,v 1.1 2004-04-25 18:47:57 behdad Exp $ + * $Author: behdad $ + * $Date: 2004-04-25 18:47:57 $ + * $Revision: 1.1 $ + * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/lib/Attic/fribidi-env.h,v $ + * + * Author: + * Behdad Esfahbod, 2001, 2002, 2004 + * Dov Grobgeld, 1999, 2000 + * + * Copyright (C) 2004 Sharif FarsiWeb, Inc + * Copyright (C) 2001,2002 Behdad Esfahbod + * Copyright (C) 1999,2000 Dov Grobgeld + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library, in a file named COPYING; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA + * + * For licensing issues, contact <license@farsiweb.info>. + */ +#ifndef _FRIBIDI_ENV_H +#define _FRIBIDI_ENV_H + +#include "fribidi-common.h" + +#include "fribidi-types.h" + +#include "fribidi-begindecls.h" + + +#define fribidi_debug_status FRIBIDI_NAMESPACE(debug_status) +/* fribidi_debug_status - get current debugging output status */ +FRIBIDI_ENTRY fribidi_boolean fribidi_debug_status ( + void +); + +#define fribidi_set_debug FRIBIDI_NAMESPACE(set_debug) +/* fribidi_set_debug - set debugging output on or off + * + * This function is used to turn debugging output on or off. To + * turn it on, the library should have been compiled with debugging + * enabled, or it will fail. The debugging output goes to the standard + * error output. + * + * This flag is off by default. + * + * Returns: the new debugging output status. + */ +FRIBIDI_ENTRY fribidi_boolean fribidi_set_debug ( + fribidi_boolean state /* new state to set */ +); + + +#define fribidi_mirroring_status FRIBIDI_NAMESPACE(mirroring_status) +/* fribidi_mirroring_status - get current mirroring status */ +FRIBIDI_ENTRY fribidi_boolean fribidi_mirroring_status ( + void +); + +#define fribidi_set_mirroring FRIBIDI_NAMESPACE(set_mirroring) +/* fribidi_set_mirroring - set mirroring on or off + * + * This function is used to turn character mirroring on or off. + * Character mirroring is the act of replacing a mirrorable glyph + * (character), eg. left paranthesis, with the matching glyph, + * eg. right paranthesis, in a right-to-left resolved context. + * If your rendering engine does mirroring itself, you may want to + * turn it off here. + * + * This flag is on by default. + * + * Returns: the new mirroring status. + */ +FRIBIDI_ENTRY fribidi_boolean fribidi_set_mirroring ( + fribidi_boolean state /* new state to set */ +); + + +#define fribidi_reorder_nsm_status FRIBIDI_NAMESPACE(reorder_nsm_status) +/* fribidi_reorder_nsm_status - get current marks reordering status */ +FRIBIDI_ENTRY fribidi_boolean fribidi_reorder_nsm_status ( + void +); + +#define fribidi_set_reorder_nsm FRIBIDI_NAMESPACE(set_reorder_nsm) +/* fribidi_set_reorder_nsm - set marks reordering on or off + * + * This function is used to turn non-spacing marks reordering on or + * off. Reordering non-spacing marks is the act of placing non-spacing + * marks (bidi class NSM) after their base character in a right-to-left + * resolved context. If your rendering engine expects non-spacing marks + * always after the base character in the memory representation of the + * visual string, you need this option on. An example of where people + * may need it off is when rendering in the console when non-spacing + * marks cannot be applied on top of the base character. + * + * This flag is on by default. + * + * Returns: the new marks reordering status. + */ +FRIBIDI_ENTRY fribidi_boolean fribidi_set_reorder_nsm ( + fribidi_boolean state /* new state to set */ +); + + +#include "fribidi-enddecls.h" + +#endif /* !_FRIBIDI_ENV_H */ +/* Editor directions: + * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent + */ diff --git a/lib/fribidi-mem.c b/lib/fribidi-mem.c new file mode 100644 index 0000000..49dd08b --- /dev/null +++ b/lib/fribidi-mem.c @@ -0,0 +1,94 @@ +/* FriBidi + * mem.h - memory manipulation routines + * + * $Id: fribidi-mem.c,v 1.1 2004-04-25 18:47:57 behdad Exp $ + * $Author: behdad $ + * $Date: 2004-04-25 18:47:57 $ + * $Revision: 1.1 $ + * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/lib/fribidi-mem.c,v $ + * + * Authors: + * Behdad Esfahbod, 2001, 2002, 2004 + * + * Copyright (C) 2004 Sharif FarsiWeb, Inc + * Copyright (C) 2001,2002 Behdad Esfahbod + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library, in a file named COPYING; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA + * + * For licensing issues, contact <license@farsiweb.info>. + */ + +#include "mem.h" + +#include "common.h" + +#ifndef FRIBIDI_USE_GLIB + +struct _FriBidiMemChunk +{ + int atom_size; + int area_size; + int empty_size; + void *chunk; +}; + +FriBidiMemChunk * +fribidi_mem_chunk_new ( + /* input */ + const char *name, + int atom_size, + unsigned long area_size, + int alloc_type +) +{ + FriBidiMemChunk *m = + (FriBidiMemChunk *) fribidi_malloc (sizeof (FriBidiMemChunk)); + + m->atom_size = atom_size; + m->area_size = area_size; + m->empty_size = 0; + m->chunk = NULL; + + return m; +} + +void * +fribidi_mem_chunk_alloc ( + /* input */ + FriBidiMemChunk *mem_chunk +) +{ + void *m; + + if (mem_chunk->empty_size < mem_chunk->atom_size) + { + mem_chunk->chunk = fribidi_malloc (mem_chunk->area_size); + mem_chunk->empty_size = mem_chunk->area_size; + } + + m = mem_chunk->chunk; + mem_chunk->chunk = (void *) + ((char *) mem_chunk->chunk + mem_chunk->atom_size); + mem_chunk->empty_size -= mem_chunk->atom_size; + + return m; +} + +#endif /* !FRIBIDI_USE_GLIB */ + +/* Editor directions: + * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent + */ diff --git a/lib/fribidi-mirroring.c b/lib/fribidi-mirroring.c new file mode 100644 index 0000000..85df4db --- /dev/null +++ b/lib/fribidi-mirroring.c @@ -0,0 +1,90 @@ +/* FriBidi + * fribidi-mirroring.c - get mirrored character + * + * $Id: fribidi-mirroring.c,v 1.1 2004-04-25 18:47:57 behdad Exp $ + * $Author: behdad $ + * $Date: 2004-04-25 18:47:57 $ + * $Revision: 1.1 $ + * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/lib/fribidi-mirroring.c,v $ + * + * Authors: + * Behdad Esfahbod, 2001, 2002, 2004 + * Dov Grobgeld, 1999, 2000 + * + * Copyright (C) 2004 Sharif FarsiWeb, Inc + * Copyright (C) 2001,2002 Behdad Esfahbod + * Copyright (C) 1999,2000 Dov Grobgeld + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library, in a file named COPYING; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA + * + * For licensing issues, contact <license@farsiweb.info>. + */ + +#include <fribidi-mirroring.h> + +#include "mirroring-table.i" + +#include "common.h" + +FRIBIDI_ENTRY fribidi_boolean +fribidi_get_mirror_char ( + /* input */ + FriBidiChar ch, + /* output */ + FriBidiChar *mirrored_ch +) +{ + int pos, step; + fribidi_boolean found; + + pos = step = (nFriBidiMirroredChars / 2) + 1; + + while (step > 1) + { + FriBidiChar cmp_ch = FriBidiMirroredChars[pos].ch; + step = (step + 1) / 2; + + if (cmp_ch < ch) + { + pos += step; + if (pos > nFriBidiMirroredChars - 1) + pos = nFriBidiMirroredChars - 1; + } + else if (cmp_ch > ch) + { + pos -= step; + if (pos < 0) + pos = 0; + } + else + break; + } + found = FriBidiMirroredChars[pos].ch == ch; + if (mirrored_ch) + *mirrored_ch = found ? FriBidiMirroredChars[pos].mirrored_ch : ch; + + return found; +} + +/* Editor directions: + * Local Variables: + * mode:c + * c-basic-offset: 2 + * indent-tabs-mode:t + * tab-width: 8 + * End: + * vim: textwidth=78: autoindent: cindent: shiftwidth=2: tabstop=8 + */ diff --git a/lib/fribidi-mirroring.h b/lib/fribidi-mirroring.h new file mode 100644 index 0000000..51bde94 --- /dev/null +++ b/lib/fribidi-mirroring.h @@ -0,0 +1,67 @@ +/* FriBidi + * fribidi-mirroring.h - get mirrored character + * + * $Id: fribidi-mirroring.h,v 1.1 2004-04-25 18:47:57 behdad Exp $ + * $Author: behdad $ + * $Date: 2004-04-25 18:47:57 $ + * $Revision: 1.1 $ + * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/lib/fribidi-mirroring.h,v $ + * + * Author: + * Behdad Esfahbod, 2001, 2002, 2004 + * + * Copyright (C) 2004 Sharif FarsiWeb, Inc + * Copyright (C) 2001,2002 Behdad Esfahbod + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library, in a file named COPYING; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA + * + * For licensing issues, contact <license@farsiweb.info>. + */ +#ifndef _FRIBIDI_MIRRORING_H +#define _FRIBIDI_MIRRORING_H + +#include "fribidi-common.h" + +#include "fribidi-types.h" + +#include "fribidi-begindecls.h" + +#define fribidi_get_mirror_char FRIBIDI_NAMESPACE(get_mirror_char) +/* fribidi_get_mirror_char - get mirrored character + * + * This function finds the mirrored of a character. If input character is a + * mirroring character, the matching mirrored character is put in the output, + * otherwise the input character itself is put. + * + * Returns: if the character has a mirror or not. + */ +FRIBIDI_ENTRY fribidi_boolean fribidi_get_mirror_char ( + FriBidiChar ch, /* input character */ + FriBidiChar *mirrored_ch /* output mirrored character */ +); + +#include "fribidi-enddecls.h" + +#endif /* !_FRIBIDI_MIRRORING_H */ +/* Editor directions: + * Local Variables: + * mode:c + * c-basic-offset: 2 + * indent-tabs-mode:t + * tab-width: 8 + * End: + * vim: textwidth=78: autoindent: cindent: shiftwidth=2: tabstop=8 + */ diff --git a/lib/fribidi-types.h b/lib/fribidi-types.h new file mode 100644 index 0000000..aad8320 --- /dev/null +++ b/lib/fribidi-types.h @@ -0,0 +1,143 @@ +/* FriBidi + * fribidi-types.h - define data types for the rest of the library + * + * $Id: fribidi-types.h,v 1.1 2004-04-25 18:47:57 behdad Exp $ + * $Author: behdad $ + * $Date: 2004-04-25 18:47:57 $ + * $Revision: 1.1 $ + * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/lib/fribidi-types.h,v $ + * + * Author: + * Behdad Esfahbod, 2001, 2002, 2004 + * + * Copyright (C) 2004 Sharif FarsiWeb, Inc. + * Copyright (C) 2001,2002 Behdad Esfahbod + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library, in a file named COPYING; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA + * + * For licensing issues, contact <license@farsiweb.info>. + */ +#ifndef _FRIBIDI_TYPES_H +#define _FRIBIDI_TYPES_H + +#include "fribidi-common.h" + +#include "fribidi-begindecls.h" + + +#if !FRIBIDI_USE_GLIB +# if HAVE_INTTYPES_H +# if !__C2MAN__ +# include <inttypes.h> +# endif /* !__C2MAN__ */ +# define FRIBIDI_UINT8_LOCAL uint8_t +# define FRIBIDI_UINT16_LOCAL uint16_t +# define FRIBIDI_UINT32_LOCAL uint32_t +# else /* !HAVE_INTTYPES_H */ +# if HAVE_STDINT_H +# if !__C2MAN__ +# include <stdint.h> +# endif /* !__C2MAN__ */ +# define FRIBIDI_UINT8_LOCAL uint8_t +# define FRIBIDI_UINT16_LOCAL uint16_t +# define FRIBIDI_UINT32_LOCAL uint32_t +# else /* !HAVE_STDINT_H */ +# define FRIBIDI_UINT8_LOCAL unsigned char +# if SIZEOF_SHORT >= 2 +# define FRIBIDI_UINT16_LOCAL unsigned short +# else /* SIZEOF_SHORT < 2 */ +# define FRIBIDI_UINT16_LOCAL unsigned int +# endif /* SIZEOF_SHORT < 2 */ +# if SIZEOF_INT >= 4 +# define FRIBIDI_UINT32_LOCAL unsigned int +# else /* SIZEOF_INT < 4 */ +# define FRIBIDI_UINT32_LOCAL unsigned long +# endif /* SIZEOF_INT < 4 */ +# endif /* !HAVE_STDINT_H */ +# endif /* !HAVE_INTTYPES_H */ +# if HAVE_STDBOOL_H +# define FRIBIDI_BOOLEAN_LOCAL bool +# else /* !HAVE_STDBOOL_H */ +# define FRIBIDI_BOOLEAN_LOCAL int +# endif /* !HAVE_STDBOOL_H */ +# if SIZEOF_WCHAR_T >= 4 +# if !__C2MAN__ +# if STDC_HEADERS +# include <stdlib.h> +# include <stddef.h> +# else /* !STDC_HEADERS */ +# if HAVE_STDLIB_H +# include <stdlib.h> +# endif /* !HAVE_STDLIB_H */ +# endif /* !STDC_HEADERS */ +# endif /* !__C2MAN__ */ +# define FRIBIDI_UNICHAR_LOCAL wchar_t +# else /* SIZEOF_WCHAR_T < 4 */ +# define FRIBIDI_UNICHAR_LOCAL fribidi_uint32 +# endif /* SIZEOF_WCHAR_T < 4 */ +#else /* FRIBIDI_USE_GLIB */ +# if !__C2MAN__ +# include <glib/gtypes.h> +# include <glib/gunicode.h> +# endif /* !__C2MAN__ */ +# define FRIBIDI_UINT8_LOCAL guint8 +# define FRIBIDI_UINT16_LOCAL guint16 +# define FRIBIDI_UINT32_LOCAL guint32 +# define FRIBIDI_BOOLEAN_LOCAL gboolean +# define FRIBIDI_UNICHAR_LOCAL gunichar +#endif /* FRIBIDI_USE_GLIB */ + +#ifndef FRIBIDI_UINT8 +# define FRIBIDI_UINT8 FRIBIDI_UINT8_LOCAL +#endif /* !FRIBIDI_UINT8 */ +#ifndef FRIBIDI_UINT16 +# define FRIBIDI_UINT16 FRIBIDI_UINT16_LOCAL +#endif /* !FRIBIDI_UINT16 */ +#ifndef FRIBIDI_UINT32 +# define FRIBIDI_UINT32 FRIBIDI_UINT32_LOCAL +#endif /* !FRIBIDI_UINT32 */ +#ifndef FRIBIDI_BOOLEAN +# define FRIBIDI_BOOLEAN FRIBIDI_BOOLEAN_LOCAL +#endif /* !FRIBIDI_BOOLEAN */ +#ifndef FRIBIDI_UNICHAR +# define FRIBIDI_UNICHAR FRIBIDI_UNICHAR_LOCAL +#endif /* !FRIBIDI_UNICHAR */ +#ifndef FRIBIDI_STR_INDEX +# define FRIBIDI_STR_INDEX int +#endif /* FRIBIDI_STR_INDEX */ + + +typedef FRIBIDI_UINT8 fribidi_uint8; +typedef FRIBIDI_UINT16 fribidi_uint16; +typedef FRIBIDI_UINT32 fribidi_uint32; +typedef FRIBIDI_BOOLEAN fribidi_boolean; + +typedef FRIBIDI_UNICHAR FriBidiChar; +typedef FRIBIDI_STR_INDEX FriBidiStrIndex; + + +#ifndef FRIBIDI_MAX_STRING_LENGTH +# define FRIBIDI_MAX_STRING_LENGTH (sizeof (FriBidiStrIndex) == 2 ? \ + 0x7FFE : (sizeof (FriBidiStrIndex) == 1 ? \ + 0x7E : 0x8FFFFFFEL)) +#endif + +#include "fribidi-enddecls.h" + +#endif /* !_FRIBIDI_TYPES_H */ +/* Editor directions: + * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent + */ diff --git a/lib/fribidi-unicode-version.h b/lib/fribidi-unicode-version.h new file mode 100644 index 0000000..9e8ab1a --- /dev/null +++ b/lib/fribidi-unicode-version.h @@ -0,0 +1,4 @@ +#define FRIBIDI_UNICODE_VERSION "4.0.1" +#define FRIBIDI_UNICODE_MAJOR_VERSION 4 +#define FRIBIDI_UNICODE_MINOR_VERSION 0 +#define FRIBIDI_UNICODE_MICRO_VERSION 1 diff --git a/lib/fribidi-unicode.h b/lib/fribidi-unicode.h new file mode 100644 index 0000000..18156b9 --- /dev/null +++ b/lib/fribidi-unicode.h @@ -0,0 +1,101 @@ +/* FriBidi + * fribidi-unicode.h - general Unicode definitions + * + * $Id: fribidi-unicode.h,v 1.1 2004-04-25 18:47:57 behdad Exp $ + * $Author: behdad $ + * $Date: 2004-04-25 18:47:57 $ + * $Revision: 1.1 $ + * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/lib/fribidi-unicode.h,v $ + * + * Author: + * Behdad Esfahbod, 2001, 2002, 2004 + * + * Copyright (C) 2004 Sharif FarsiWeb, Inc + * Copyright (C) 2001,2002 Behdad Esfahbod + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library, in a file named COPYING; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA + * + * For licensing issues, contact <license@farsiweb.info>. + */ +#ifndef _FRIBIDI_UNICODE_H +#define _FRIBIDI_UNICODE_H + +#include "fribidi-common.h" + +#include "fribidi-types.h" + +#include "fribidi-begindecls.h" + +/* We do not support surrogates yet */ +#define FRIBIDI_UNICODE_CHARS (sizeof(FriBidiChar) >= 4 ? 0x110000 : 0xFFFE) +/* Unicode version - FRIBIDI_UNICODE_VERSION */ +#if !DONT_HAVE_FRIBIDI_UNICODE_VERSION_H +# include "fribidi-unicode-version.h" +#else /* DONT_HAVE_FRIBIDI_UNICODE_VERSION_H */ +# define FRIBIDI_UNICODE_VERSION "unknown" +#endif /* DONT_HAVE_FRIBIDI_UNICODE_VERSION_H */ + +/* The maximum embedding level value assigned by explicit marks */ +#define FRIBIDI_BIDI_MAX_EXPLICIT_LEVEL 61 +/* The maximum *number* of different resolved embedding levels: 0-62 */ +#define FRIBIDI_BIDI_MAX_RESOLVED_LEVELS 63 + +/* Bidirectional marks */ +#define FRIBIDI_CHAR_LRM 0x200E +#define FRIBIDI_CHAR_RLM 0x200F +#define FRIBIDI_CHAR_LRE 0x202A +#define FRIBIDI_CHAR_RLE 0x202B +#define FRIBIDI_CHAR_PDF 0x202C +#define FRIBIDI_CHAR_LRO 0x202D +#define FRIBIDI_CHAR_RLO 0x202E + +/* Line and Paragraph Separators */ +#define FRIBIDI_CHAR_LS 0x2028 +#define FRIBIDI_CHAR_PS 0x2029 + +/* Arabic Joining marks */ +#define FRIBIDI_CHAR_ZWNJ 0x200C +#define FRIBIDI_CHAR_ZWJ 0x200D + +/* Hebrew and Arabic */ +#define FRIBIDI_CHAR_HEBREW_ALEF 0x05D0 +#define FRIBIDI_CHAR_ARABIC_ALEF 0x0627 +#define FRIBIDI_CHAR_ARABIC_ZERO 0x0660 +#define FRIBIDI_CHAR_PERSIAN_ZERO 0x06F0 + +/* These are here just for compatibility. */ +#define UNI_MAX_BIDI_LEVEL FRIBIDI_BIDI_MAX_EXPLICIT_LEVEL +#define UNI_LRM FRIBIDI_CHAR_LRM +#define UNI_RLM FRIBIDI_CHAR_RLM +#define UNI_LRE FRIBIDI_CHAR_LRE +#define UNI_RLE FRIBIDI_CHAR_RLE +#define UNI_LRO FRIBIDI_CHAR_LRO +#define UNI_RLO FRIBIDI_CHAR_RLO +#define UNI_LS FRIBIDI_CHAR_LS +#define UNI_PS FRIBIDI_CHAR_PS +#define UNI_ZWNJ FRIBIDI_CHAR_ZWNJ +#define UNI_ZWJ FRIBIDI_CHAR_ZWJ +#define UNI_HEBREW_ALEF FRIBIDI_CHAR_HEBREW_ALEF +#define UNI_ARABIC_ALEF FRIBIDI_CHAR_ARABIC_ALEF +#define UNI_ARABIC_ZERO FRIBIDI_CHAR_ARABIC_ZERO +#define UNI_FARSI_ZERO FRIBIDI_CHAR_PERSIAN_ZERO + +#include "fribidi-enddecls.h" + +#endif /* !_FRIBIDI_UNICODE_H */ +/* Editor directions: + * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent + */ diff --git a/lib/fribidi.c b/lib/fribidi.c new file mode 100644 index 0000000..8197137 --- /dev/null +++ b/lib/fribidi.c @@ -0,0 +1,68 @@ +/* FriBidi + * fribidi.c - Unicode bidirectional and Arabic joining algorithms + * + * $Id: fribidi.c,v 1.1 2004-04-25 18:47:57 behdad Exp $ + * $Author: behdad $ + * $Date: 2004-04-25 18:47:57 $ + * $Revision: 1.1 $ + * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/lib/fribidi.c,v $ + * + * Authors: + * Behdad Esfahbod, 2001, 2002, 2004 + * Dov Grobgeld, 1999, 2000 + * + * Copyright (C) 2004 Sharif FarsiWeb, Inc + * Copyright (C) 2001,2002 Behdad Esfahbod + * Copyright (C) 1999,2000 Dov Grobgeld + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library, in a file named COPYING; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA + * + * For licensing issues, contact <license@farsiweb.info>. + */ + +#include <fribidi.h> + +#include "common.h" + +const char *fribidi_version_info = + "(" FRIBIDI_NAME ") " FRIBIDI_VERSION "\n" + "Interface version " FRIBIDI_INTERFACE_VERSION_STRING ",\n" + "Unicode version " FRIBIDI_UNICODE_VERSION ",\n" "Configure options" +#if DEBUG + " --enable-debug" +#endif /* DEBUG */ +#if USE_SIMPLE_MALLOC + " --enable-malloc" +#endif /* USE_SIMPLE_MALLOC */ +#if !FRIBIDI_CHARSETS + " --disable-charsets" +#endif /* !FRIBIDI_CHARSETS */ +#if FRIBIDI_USE_GLIB + " --with-glib" +#else /* !FRIBIDI_USE_GLIB */ + " --without-glib" +#endif /* !FRIBIDI_USE_GLIB */ + ".\n\n" + "Copyright (C) 2004 Sharif FarsiWeb, Inc.\n" + FRIBIDI_NAME " comes with ABSOLUTELY NO WARRANTY.\n" + "You may redistribute copies of " FRIBIDI_NAME " under the terms of\n" + "the GNU Lesser General Public License.\n" + "For more information about these matters, see the file named COPYING.\n" + "Written by Behdad Esfahbod.\n"; + +/* Editor directions: + * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent + */ diff --git a/lib/fribidi.h b/lib/fribidi.h new file mode 100644 index 0000000..cbc3a23 --- /dev/null +++ b/lib/fribidi.h @@ -0,0 +1,48 @@ +/* FriBidi + * fribidi.h - Unicode bidirectional and Arabic joining algorithms + * + * $Id: fribidi.h,v 1.1 2004-04-25 18:47:57 behdad Exp $ + * $Author: behdad $ + * $Date: 2004-04-25 18:47:57 $ + * $Revision: 1.1 $ + * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/lib/fribidi.h,v $ + * + * Author: + * Behdad Esfahbod, 2004 + * + * Copyright (C) 2004 Sharif FarsiWeb, Inc + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library, in a file named COPYING; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA + * + * For licensing issues, contact <license@farsiweb.info>. + */ +#ifndef _FRIBIDI_H +#define _FRIBIDI_H + +#include "fribidi-bidi.h" +#include "fribidi-bidi-type.h" +#include "fribidi-env.h" +#include "fribidi-mirroring.h" +#include "fribidi-types.h" +#include "fribidi-unicode.h" +#if FRIBIDI_CHARSETS +# include "fribidi-char-sets.h" +#endif /* FRIBIDI_CHARSETS */ + +#endif /* !_FRIBIDI_H */ +/* Editor directions: + * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent + */ diff --git a/lib/mem.h b/lib/mem.h new file mode 100644 index 0000000..80a5a2d --- /dev/null +++ b/lib/mem.h @@ -0,0 +1,90 @@ +/* FriBidi + * mem.h - memory manipulation routines + * + * $Id: mem.h,v 1.1 2004-04-25 18:47:57 behdad Exp $ + * $Author: behdad $ + * $Date: 2004-04-25 18:47:57 $ + * $Revision: 1.1 $ + * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/lib/mem.h,v $ + * + * Author: + * Behdad Esfahbod, 2001, 2002, 2004 + * + * Copyright (C) 2004 Sharif FarsiWeb, Inc + * Copyright (C) 2001,2002 Behdad Esfahbod + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library, in a file named COPYING; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA + * + * For licensing issues, contact <license@farsiweb.info>. + */ +#ifndef _MEM_H +#define _MEM_H + +#include <fribidi-common.h> + +#include <fribidi-types.h> + +#include "common.h" + +#include <fribidi-begindecls.h> + +#if !FRIBIDI_USE_GLIB + +typedef struct _FriBidiMemChunk FriBidiMemChunk; + +#define FRIBIDI_ALLOC_ONLY 1 + +#define fribidi_mem_chunk_new FRIBIDI_NAMESPACE(mem_chunk_new) +FriBidiMemChunk *fribidi_mem_chunk_new ( + const char *name, + int atom_size, + unsigned long area_size, + int alloc_type +); + +#define fribidi_mem_chunk_alloc FRIBIDI_NAMESPACE(mem_chunk_alloc) +void *fribidi_mem_chunk_alloc ( + FriBidiMemChunk *mem_chunk +); + +#else /* FRIBIDI_USE_GLIB */ + +#if !__C2MAN__ +# include <glib/gmem.h> +#endif /* !__C2MAN__ */ + +#define FriBidiMemChunk GMemChunk +#define FRIBIDI_ALLOC_ONLY G_ALLOC_ONLY +#define fribidi_mem_chunk_new g_mem_chunk_new +#define fribidi_mem_chunk_alloc g_mem_chunk_alloc + +#endif /* FRIBIDI_USE_GLIB */ + +#define fribidi_chunk_new(type, chunk) ( \ + (type *) fribidi_mem_chunk_alloc (chunk) \ + ) + +#define fribidi_chunk_new_for_type(type) ( \ + fribidi_mem_chunk_new(FRIBIDI, sizeof (type), \ + FRIBIDI_CHUNK_SIZE, FRIBIDI_ALLOC_ONLY) \ + ) + +#include <fribidi-enddecls.h> + +#endif /* !_MEM_H */ +/* Editor directions: + * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent + */ diff --git a/lib/mirroring-table.i b/lib/mirroring-table.i new file mode 100644 index 0000000..6e47900 --- /dev/null +++ b/lib/mirroring-table.i @@ -0,0 +1,358 @@ +/* + This file was automatically created from BidiMirroring.txt, version 3.2.0 + by fribidi_create_mirroring +*/ + +#ifndef FRIBIDI_TAB_MIRRORING_I +#define FRIBIDI_TAB_MIRRORING_I + +#include <fribidi-types.h> + +/* + Mirrored characters include all the characters in the Unicode list + that have been declared as being mirrored and that have a mirrored + equivalent. + + There are lots of characters that are designed as being mirrored + but do not have any mirrored glyph, e.g. the sign for there exist. + Are these used in Arabic? That is are all the mathematical signs + that are assigned to be mirrorable actually mirrored in Arabic? + If that is the case, we'll change the below code to include also + characters that mirror to themself. It will then be the responsibility + of the display engine to actually mirror these. +*/ + +/* *INDENT-OFF* */ + +static const struct +{ + FriBidiChar ch, mirrored_ch; +} +FriBidiMirroredChars[] = +{ + {0x0028, 0x0029}, + {0x0029, 0x0028}, + {0x003C, 0x003E}, + {0x003E, 0x003C}, + {0x005B, 0x005D}, + {0x005D, 0x005B}, + {0x007B, 0x007D}, + {0x007D, 0x007B}, + {0x00AB, 0x00BB}, + {0x00BB, 0x00AB}, + {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}, + {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}, + {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, 0x2A2D}, + {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}, + {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}, + {0xFF08, 0xFF09}, + {0xFF09, 0xFF08}, + {0xFF1C, 0xFF1E}, + {0xFF1E, 0xFF1C}, + {0xFF3B, 0xFF3D}, + {0xFF3D, 0xFF3B}, + {0xFF5B, 0xFF5D}, + {0xFF5D, 0xFF5B}, + {0xFF5F, 0xFF60}, + {0xFF60, 0xFF5F}, + {0xFF62, 0xFF63}, + {0xFF63, 0xFF62}, +} ; + +/* *INDENT-ON* */ + +static const int nFriBidiMirroredChars = 318; + + +#endif /* FRIBIDI_TAB_MIRRORING_I */ diff --git a/test/Makefile.am b/test/Makefile.am new file mode 100644 index 0000000..565a5b2 --- /dev/null +++ b/test/Makefile.am @@ -0,0 +1,33 @@ + +TESTS = run.tests + +check_SCRIPTS = run.tests + +TEST_DATAS = \ + test_CapRTL_explicit.input \ + test_CapRTL_explicit.reference \ + test_CapRTL_implicit.input \ + test_CapRTL_implicit.reference \ + test_ISO8859-8_hebrew.input \ + test_ISO8859-8_hebrew.reference \ + test_UTF-8_persian.input \ + test_UTF-8_persian.reference + +EXTRA_DIST = \ + $(TESTS) \ + $(TEST_DATAS) + +test_%.reference: test_%.input + testcase="$@" && \ + charset="`echo "$@" | $(SED) 's/_[^_]*$$//;s/.*_//'`" && \ + "$(top_builddir)"/src/fribidi --test --charset "$$charset" "$<" > "$@" || \ + ($(RM) "$@"; false) + +test.reference: + for testcase in "$(srcdir)"/test_*.input; do \ + test="`echo "$$testcase" \ + | $(SED) 's/\.input$$/.reference/i; s|.*/||;'`" && \ + $(MAKE) "tests/$$test" || \ + exit 1; \ + done + diff --git a/test/run.tests b/test/run.tests new file mode 100755 index 0000000..c8bd759 --- /dev/null +++ b/test/run.tests @@ -0,0 +1,74 @@ +#!/bin/bash +# run.tests - Check that the algorithm does what it is supposed to +# Copyright (C) 1999,2000 Dov Grobgeld, and +# Copyright (C) 2001,2002 Behdad Esfahbod. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this library, in a file named COPYING; if not, write to the +# Free Software Foundation, Inc., 59 Temple Place, Suite 330, +# Boston, MA 02111-1307, USA +# +# For licensing issues, contact <dov@imagic.weizmann.ac.il> and +# <fwpg@sharif.edu>. + +if test -z "$top_builddir"; then + top_builddir=.. +fi + +if test -z "$srcdir"; then + srcdir=. +fi + +test "${VERBOSE+set}" != "set" && VERBOSE=yes + +# See how redirections should work. +if test -z "$VERBOSE"; then + exec > /dev/null 2>&1 +fi + +if ! test -f "$top_builddir/bin/fribidi"; then + echo "run.tests: you must make fribidi first" + exit 1 +fi + +TEST () { + testcase="$1" + test="${testcase##*/}" + test="${test%.input}" + charset="${testcase#*_}" + charset="${charset%%_*}" + echo -n "=== $test === " + if ! "$top_builddir/bin/fribidi" --charset "$charset" </dev/null >/dev/null 2>&1; then + echo " [Character set not supported]" + return 0 + fi + "$top_builddir/bin/fribidi" --test --charset "$charset" "$testcase" > "$test.output" + + reference="${testcase%.input}.reference"; + test -f "$reference" || reference="tests/${reference##*/}" + if diff -U 0 "$test.output" "$reference"; then + rm "$test.output" + echo " [Passed]" + return 0 + else + echo " [Failed]" + return 1 + fi +} + +retval=0 +for testcase in "$srcdir"/test_*.input; do + TEST "$testcase" || retval=1 +done + +exit $retval diff --git a/test/test_CapRTL_explicit.input b/test/test_CapRTL_explicit.input new file mode 100644 index 0000000..1cbfac2 --- /dev/null +++ b/test/test_CapRTL_explicit.input @@ -0,0 +1,13 @@ +this is _LJUST_o +a _lsimple _RteST_o th_oat +HAS A _LPDF missing +AnD hOw_L AbOuT, 123,987 tHiS_o +a GOOD - _L_oTEST. +here_L is_o_o_o _R a good one_o +And _r 123,987_LTHE_R next_o oNE: +_R_r and the last _LONE_o IS +THE _rbest _lONE and +A REAL BIG_l_o BUG! +a _L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_Rbug +AN ARABIC _l_o 123-456 NICE ONE! +AN ARABIC _l _o 123-456 PAIR diff --git a/test/test_CapRTL_explicit.reference b/test/test_CapRTL_explicit.reference new file mode 100644 index 0000000..37fb904 --- /dev/null +++ b/test/test_CapRTL_explicit.reference @@ -0,0 +1,13 @@ +this is _LJUST_o => this is JUST +a _lsimple _RteST_o th_oat => a simple TSet that +HAS A _LPDF missing => PDF missing A SAH +AnD hOw_L AbOuT, 123,987 tHiS_o => w AbOuT, 123,987 tHiSOh DnA +a GOOD - _L_oTEST. => a TSET - DOOG. +here_L is_o_o_o _R a good one_o => here is eno doog a +And _r 123,987_LTHE_R next_o oNE: => 987THEtxen oNE:,123 ndA +_R_r and the last _LONE_o IS => SI and the last ONE +THE _rbest _lONE and => best ENO and EHT +A REAL BIG_l_o BUG! => !GUB GIB LAER A +a _L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_Rbug => a gub +AN ARABIC _l_o 123-456 NICE ONE! => !ENO ECIN 456-123 CIBARA NA +AN ARABIC _l _o 123-456 PAIR => RIAP 123-456 CIBARA NA diff --git a/test/test_CapRTL_implicit.input b/test/test_CapRTL_implicit.input new file mode 100644 index 0000000..cd5fadf --- /dev/null +++ b/test/test_CapRTL_implicit.input @@ -0,0 +1,26 @@ +car is THE CAR in arabic +CAR IS the car IN ENGLISH +he said "IT IS 123, 456, OK" +he said "IT IS (123, 456), OK" +he said "IT IS 123,456, OK" +he said "IT IS (123,456), OK" +HE SAID "it is 123, 456, ok" +he said "IT IS 789, 678, OK" +he said "IT IS (789, 678), OK" +he said "IT IS 789,678, OK" +he said "IT IS (789,678), OK" +HE SAID "it is 789, 678, ok" +<H123>shalom</H123> +<h123>SALAAM</h123> +HE SAID "it is a car!" AND RAN +HE SAID "it is a car!_>" AND RAN +-2 CELSIUS IS COLD +SOLVE 1*5 1-5 1/5 1+5 +THE RANGE IS 2.5..5 +IOU $10 +CHANGE -10% +-10% CHANGE +A TEST FOR WEAK TYPES: 123+,456 +ANOTHER FOR WEAK TYPES: A123,456 +MORE WEAK TYPES: hooloo123,456 +and TEST|L1 ||too diff --git a/test/test_CapRTL_implicit.reference b/test/test_CapRTL_implicit.reference new file mode 100644 index 0000000..6ef244a --- /dev/null +++ b/test/test_CapRTL_implicit.reference @@ -0,0 +1,26 @@ +car is THE CAR in arabic => car is RAC EHT in arabic +CAR IS the car IN ENGLISH => HSILGNE NI the car SI RAC +he said "IT IS 123, 456, OK" => he said "KO ,456 ,123 SI TI" +he said "IT IS (123, 456), OK" => he said "KO ,(456 ,123) SI TI" +he said "IT IS 123,456, OK" => he said "KO ,123,456 SI TI" +he said "IT IS (123,456), OK" => he said "KO ,(123,456) SI TI" +HE SAID "it is 123, 456, ok" => "ok ,it is 123, 456" DIAS EH +he said "IT IS 789, 678, OK" => he said "KO ,678 ,789 SI TI" +he said "IT IS (789, 678), OK" => he said "KO ,(678 ,789) SI TI" +he said "IT IS 789,678, OK" => he said "KO ,789,678 SI TI" +he said "IT IS (789,678), OK" => he said "KO ,(789,678) SI TI" +HE SAID "it is 789, 678, ok" => "ok ,678 ,789 it is" DIAS EH +<H123>shalom</H123> => <123H/>shalom<123H> +<h123>SALAAM</h123> => <h123>MAALAS</h123> +HE SAID "it is a car!" AND RAN => NAR DNA "!it is a car" DIAS EH +HE SAID "it is a car!_>" AND RAN => NAR DNA "it is a car!" DIAS EH +-2 CELSIUS IS COLD => DLOC SI SUISLEC 2- +SOLVE 1*5 1-5 1/5 1+5 => 5+1 5/1 5-1 5*1 EVLOS +THE RANGE IS 2.5..5 => 5..2.5 SI EGNAR EHT +IOU $10 => $10 UOI +CHANGE -10% => %10- EGNAHC +-10% CHANGE => EGNAHC %10- +A TEST FOR WEAK TYPES: 123+,456 => 456,123+ :SEPYT KAEW ROF TSET A +ANOTHER FOR WEAK TYPES: A123,456 => 123,456A :SEPYT KAEW ROF REHTONA +MORE WEAK TYPES: hooloo123,456 => hooloo123,456 :SEPYT KAEW EROM +and TEST|L1 ||too => and TSET|1L ||too diff --git a/test/test_ISO8859-8_hebrew.input b/test/test_ISO8859-8_hebrew.input new file mode 100644 index 0000000..b93617a --- /dev/null +++ b/test/test_ISO8859-8_hebrew.input @@ -0,0 +1,17 @@ + abc +abc +abc cde +he said: " !" +he said: " !" +() abc +abc () + #@$ +<h1></h1> + 23 abc + ~~~23%%% abc + abc ~~~23%%% abc + abc@23@cde + abc 23 cde + abc 23 abc +<>Shalom</> +a 2 diff --git a/test/test_ISO8859-8_hebrew.reference b/test/test_ISO8859-8_hebrew.reference new file mode 100644 index 0000000..0579b87 --- /dev/null +++ b/test/test_ISO8859-8_hebrew.reference @@ -0,0 +1,17 @@ + abc => abc +abc => abc +abc cde => abc cde +he said: " !" => he said: " !" +he said: " !" => he said: "! " +() abc => abc () +abc () => abc () + #@$ => $@# +<h1></h1> => <h1></h1> + 23 abc => abc 23 + ~~~23%%% abc => abc 23%%%~~~ + abc ~~~23%%% abc => abc abc ~~~23%%% + abc@23@cde => abc@23@cde + abc 23 cde => abc 23 cde + abc 23 abc => abc abc 23 +<>Shalom</> => </>Shalom<> +a 2 => a 2 diff --git a/test/test_UTF-8_persian.input b/test/test_UTF-8_persian.input new file mode 100644 index 0000000..194126c --- /dev/null +++ b/test/test_UTF-8_persian.input @@ -0,0 +1,14 @@ +الا يا ايها الساقی ادر کاسا و ناولها +که عشق آسان نمود اول ولی افتاد مشکلها +به بوی نافهای کاخر صبا زان طره بگشايد +ز تاب جعد مشکينش چه خون افتاد در دلها +مرا در منزل جانان چه امن عيش چون هر دم +جرس فرياد میدارد که بربنديد محملها +به می سجاده رنگين کن گرت پير مغان گويد +که سالک بیخبر نبود ز راه و رسم منزلها +شب تاريک و بيم موج و گردابی چنين هايل +کجا دانند حال ما سبکباران ساحلها +همه کارم ز خود کامی به بدنامی کشيد آخر +نهان کی ماند آن رازی کز او سازند محفلها +حضوری گر همیخواهی از او غايب مشو حافظ +متی ما تلق من تهوی دع الدنيا و اهملها diff --git a/test/test_UTF-8_persian.reference b/test/test_UTF-8_persian.reference new file mode 100644 index 0000000..cd45ac2 --- /dev/null +++ b/test/test_UTF-8_persian.reference @@ -0,0 +1,14 @@ +الا يا ايها الساقی ادر کاسا و ناولها => اهلوان و اساک ردا یقاسلا اهيا اي الا +که عشق آسان نمود اول ولی افتاد مشکلها => اهلکشم داتفا یلو لوا دومن ناسآ قشع هک +به بوی نافهای کاخر صبا زان طره بگشايد => دياشگب هرط ناز ابص رخاک یاهفان یوب هب +ز تاب جعد مشکينش چه خون افتاد در دلها => اهلد رد داتفا نوخ هچ شنيکشم دعج بات ز +مرا در منزل جانان چه امن عيش چون هر دم => مد ره نوچ شيع نما هچ ناناج لزنم رد ارم +جرس فرياد میدارد که بربنديد محملها => اهلمحم ديدنبرب هک درادیم دايرف سرج +به می سجاده رنگين کن گرت پير مغان گويد => ديوگ ناغم ريپ ترگ نک نيگنر هداجس یم هب +که سالک بیخبر نبود ز راه و رسم منزلها => اهلزنم مسر و هار ز دوبن ربخیب کلاس هک +شب تاريک و بيم موج و گردابی چنين هايل => لياه نينچ یبادرگ و جوم ميب و کيرات بش +کجا دانند حال ما سبکباران ساحلها => اهلحاس نارابکبس ام لاح دنناد اجک +همه کارم ز خود کامی به بدنامی کشيد آخر => رخآ ديشک یماندب هب یماک دوخ ز مراک همه +نهان کی ماند آن رازی کز او سازند محفلها => اهلفحم دنزاس وا زک یزار نآ دنام یک ناهن +حضوری گر همیخواهی از او غايب مشو حافظ => ظفاح وشم بياغ وا زا یهاوخیمه رگ یروضح +متی ما تلق من تهوی دع الدنيا و اهملها => اهلمها و ايندلا عد یوهت نم قلت ام یتم diff --git a/test/test_UTF-8_reordernsm.input b/test/test_UTF-8_reordernsm.input new file mode 100644 index 0000000..58653a6 --- /dev/null +++ b/test/test_UTF-8_reordernsm.input @@ -0,0 +1,7 @@ +بِسْمِ ٱللّٰهِ ٱلرَّحْمٰنِ ٱلرَّحِيمِ +اَلْحَمْدُ لِلّٰهِ رَبِّ الْعَالَمِينَ +اَلرَّحْمٰنِ الرَّحِيمِ +مَالِكِ يَوْمِ الدِّينِ +اِيَّاكَ نَعْبُدُ وَ اِيَّاكَ نَسْتَعِينُ +اِهْدِنَا الصِّرَاطَ الْمُسْتَقِيمَ +صِرَاطَ الَّذِينَ اَنْعَمْتَ عَلَيهِمْ غَيْرِ الْمَغْضُوبِ عَلَيْهِم وَ لَا الضَّٓالِّينَ diff --git a/test/test_UTF-8_reordernsm.reference b/test/test_UTF-8_reordernsm.reference new file mode 100644 index 0000000..60e3f51 --- /dev/null +++ b/test/test_UTF-8_reordernsm.reference @@ -0,0 +1,7 @@ +بِسْمِ ٱللّٰهِ ٱلرَّحْمٰنِ ٱلرَّحِيمِ => مِيحِرَّلٱ نِمٰحْرَّلٱ هِلّٰلٱ مِسْبِ +اَلْحَمْدُ لِلّٰهِ رَبِّ الْعَالَمِينَ => نَيمِلَاعَلْا بِّرَ هِلّٰلِ دُمْحَلْاَ +اَلرَّحْمٰنِ الرَّحِيمِ => مِيحِرَّلا نِمٰحْرَّلاَ +مَالِكِ يَوْمِ الدِّينِ => نِيدِّلا مِوْيَ كِلِامَ +اِيَّاكَ نَعْبُدُ وَ اِيَّاكَ نَسْتَعِينُ => نُيعِتَسْنَ كَايَّاِ وَ دُبُعْنَ كَايَّاِ +اِهْدِنَا الصِّرَاطَ الْمُسْتَقِيمَ => مَيقِتَسْمُلْا طَارَصِّلا انَدِهْاِ +صِرَاطَ الَّذِينَ اَنْعَمْتَ عَلَيهِمْ غَيْرِ الْمَغْضُوبِ عَلَيْهِم وَ لَا الضَّٓالِّينَ => نَيلِّاضَّٓلا الَ وَ مهِيْلَعَ بِوضُغْمَلْا رِيْغَ مْهِيلَعَ تَمْعَنْاَ نَيذِلَّا طَارَصِ |