aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorno-author <no-author@gcc.gnu.org>1999-08-01 23:56:13 +0000
committerno-author <no-author@gcc.gnu.org>1999-08-01 23:56:13 +0000
commit6ab3f0c5aabfd43c88405611d37dd7a9d40a7403 (patch)
tree89fe20f516fc8e0831e122577276e3ba91622b7c
parent25fb9bb53dbc1881bb487bbd14da7197aa4d6c7f (diff)
This commit was manufactured by cvs2svn to create taglibgcj-2_95-release
'libgcj-2_95-release'. git-svn-id: https://gcc.gnu.org/svn/gcc/tags/libgcj-2_95-release@28380 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--boehm-gc/BCC_MAKEFILE82
-rw-r--r--boehm-gc/ChangeLog379
-rw-r--r--boehm-gc/EMX_MAKEFILE141
-rw-r--r--boehm-gc/MacOS.c137
-rw-r--r--boehm-gc/MacProjects.sit.hqx886
-rw-r--r--boehm-gc/Mac_files/MacOS_Test_config.h91
-rw-r--r--boehm-gc/Mac_files/MacOS_config.h89
-rw-r--r--boehm-gc/Mac_files/dataend.c9
-rw-r--r--boehm-gc/Mac_files/datastart.c9
-rw-r--r--boehm-gc/Makefile.DLLs107
-rw-r--r--boehm-gc/Makefile.am138
-rw-r--r--boehm-gc/Makefile.dj296
-rw-r--r--boehm-gc/Makefile.in518
-rw-r--r--boehm-gc/Makefile.orig400
-rw-r--r--boehm-gc/NT_MAKEFILE59
-rw-r--r--boehm-gc/OS2_MAKEFILE45
-rw-r--r--boehm-gc/PCR-Makefile68
-rw-r--r--boehm-gc/README1389
-rw-r--r--boehm-gc/README.Mac385
-rw-r--r--boehm-gc/README.OS26
-rw-r--r--boehm-gc/README.QUICK41
-rw-r--r--boehm-gc/README.alpha15
-rw-r--r--boehm-gc/README.amiga133
-rw-r--r--boehm-gc/README.debugging58
-rw-r--r--boehm-gc/README.dj12
-rw-r--r--boehm-gc/README.hp9
-rw-r--r--boehm-gc/README.linux39
-rw-r--r--boehm-gc/README.rs60006
-rw-r--r--boehm-gc/README.sgi37
-rw-r--r--boehm-gc/README.solaris265
-rw-r--r--boehm-gc/README.uts2
-rw-r--r--boehm-gc/README.win32163
-rw-r--r--boehm-gc/SCoptions.amiga16
-rw-r--r--boehm-gc/SMakefile.amiga48
-rw-r--r--boehm-gc/WCC_MAKEFILE123
-rw-r--r--boehm-gc/acinclude.m4153
-rw-r--r--boehm-gc/aclocal.m4895
-rw-r--r--boehm-gc/add_gc_prefix.c14
-rw-r--r--boehm-gc/allchblk.c408
-rw-r--r--boehm-gc/alloc.c853
-rw-r--r--boehm-gc/alpha_mach_dep.s59
-rw-r--r--boehm-gc/barrett_diagram106
-rw-r--r--boehm-gc/blacklst.c286
-rwxr-xr-xboehm-gc/callprocs4
-rw-r--r--boehm-gc/checksums.c201
-rw-r--r--boehm-gc/config.h1009
-rwxr-xr-xboehm-gc/configure3211
-rw-r--r--boehm-gc/configure.host43
-rw-r--r--boehm-gc/configure.in232
-rw-r--r--boehm-gc/cord/README31
-rw-r--r--boehm-gc/cord/SCOPTIONS.amiga14
-rw-r--r--boehm-gc/cord/SMakefile.amiga20
-rw-r--r--boehm-gc/cord/cord.h327
-rw-r--r--boehm-gc/cord/cordbscs.c916
-rw-r--r--boehm-gc/cord/cordprnt.c389
-rw-r--r--boehm-gc/cord/cordtest.c228
-rw-r--r--boehm-gc/cord/cordxtra.c621
-rw-r--r--boehm-gc/cord/de.c604
-rw-r--r--boehm-gc/cord/de_cmds.h33
-rw-r--r--boehm-gc/cord/de_win.ICObin0 -> 766 bytes
-rw-r--r--boehm-gc/cord/de_win.RC78
-rw-r--r--boehm-gc/cord/de_win.c365
-rw-r--r--boehm-gc/cord/de_win.h103
-rw-r--r--boehm-gc/cord/ec.h70
-rw-r--r--boehm-gc/cord/gc.h698
-rw-r--r--boehm-gc/cord/private/cord_pos.h118
-rw-r--r--boehm-gc/dbg_mlc.c693
-rw-r--r--boehm-gc/dyn_load.c797
-rw-r--r--boehm-gc/finalize.c734
-rw-r--r--boehm-gc/gc.h711
-rw-r--r--boehm-gc/gc.mak2087
-rw-r--r--boehm-gc/gc.man80
-rw-r--r--boehm-gc/gc_alloc.h380
-rw-r--r--boehm-gc/gc_cpp.cc46
-rw-r--r--boehm-gc/gc_cpp.h287
-rw-r--r--boehm-gc/gc_hdrs.h133
-rw-r--r--boehm-gc/gc_mark.h267
-rw-r--r--boehm-gc/gc_priv.h1591
-rw-r--r--boehm-gc/gc_private.h1
-rw-r--r--boehm-gc/gc_typed.h91
-rw-r--r--boehm-gc/gc_watcom.asm51
-rw-r--r--boehm-gc/gcc_support.c516
-rw-r--r--boehm-gc/headers.c296
-rw-r--r--boehm-gc/if_mach.c25
-rw-r--r--boehm-gc/if_not_there.c26
-rw-r--r--boehm-gc/include/cord.h327
-rw-r--r--boehm-gc/include/ec.h70
-rw-r--r--boehm-gc/include/gc.h698
-rw-r--r--boehm-gc/include/gc_alloc.h380
-rw-r--r--boehm-gc/include/gc_cpp.h287
-rw-r--r--boehm-gc/include/gc_inl.h103
-rw-r--r--boehm-gc/include/gc_inline.h1
-rw-r--r--boehm-gc/include/gc_typed.h91
-rw-r--r--boehm-gc/include/private/config.h965
-rw-r--r--boehm-gc/include/private/cord_pos.h118
-rw-r--r--boehm-gc/include/private/gc_hdrs.h133
-rw-r--r--boehm-gc/include/private/gc_priv.h1561
-rw-r--r--boehm-gc/include/weakpointer.h221
-rw-r--r--boehm-gc/irix_threads.c640
-rw-r--r--boehm-gc/linux_threads.c647
-rw-r--r--boehm-gc/mach_dep.c411
-rw-r--r--boehm-gc/makefile.depend0
-rw-r--r--boehm-gc/malloc.c426
-rw-r--r--boehm-gc/mallocx.c367
-rw-r--r--boehm-gc/mark.c1095
-rw-r--r--boehm-gc/mark_rts.c461
-rw-r--r--boehm-gc/mips_sgi_mach_dep.s41
-rw-r--r--boehm-gc/mips_ultrix_mach_dep.s26
-rw-r--r--boehm-gc/misc.c837
-rw-r--r--boehm-gc/new_hblk.c244
-rw-r--r--boehm-gc/obj_map.c142
-rw-r--r--boehm-gc/os_dep.c2320
-rw-r--r--boehm-gc/pc_excludes15
-rw-r--r--boehm-gc/pcr_interface.c173
-rw-r--r--boehm-gc/ptr_chck.c326
-rw-r--r--boehm-gc/quick_threads.c55
-rw-r--r--boehm-gc/real_malloc.c36
-rw-r--r--boehm-gc/reclaim.c723
-rw-r--r--boehm-gc/rs6000_mach_dep.s105
-rw-r--r--boehm-gc/setjmp_t.c115
-rw-r--r--boehm-gc/solaris_pthreads.c171
-rw-r--r--boehm-gc/solaris_threads.c925
-rw-r--r--boehm-gc/solaris_threads.h34
-rw-r--r--boehm-gc/sparc_mach_dep.s38
-rw-r--r--boehm-gc/sparc_sunos4_mach_dep.s38
-rw-r--r--boehm-gc/stubborn.c317
-rw-r--r--boehm-gc/test.c1152
-rw-r--r--boehm-gc/test_cpp.cc265
-rw-r--r--boehm-gc/threadlibs.c14
-rw-r--r--boehm-gc/typd_mlc.c814
-rw-r--r--boehm-gc/version.h11
-rw-r--r--boehm-gc/weakpointer.h221
-rw-r--r--boehm-gc/win32_threads.c168
-rw-r--r--libjava/ChangeLog942
-rw-r--r--libjava/Makefile.am279
-rw-r--r--libjava/Makefile.in534
-rw-r--r--libjava/NEWS3
-rw-r--r--libjava/THANKS16
-rw-r--r--libjava/acconfig.h8
-rw-r--r--libjava/acinclude.m44
-rw-r--r--libjava/aclocal.m4608
-rw-r--r--libjava/classes.pl6
-rwxr-xr-xlibjava/configure2062
-rw-r--r--libjava/configure.in274
-rw-r--r--libjava/doc/cni.sgml92
-rw-r--r--libjava/gnu/gcj/RawData.java16
-rw-r--r--libjava/gnu/gcj/convert/BytesToUnicode.java2
-rw-r--r--libjava/gnu/gcj/convert/Input_8859_1.java6
-rw-r--r--libjava/gnu/gcj/convert/Input_EUCJIS.java6
-rw-r--r--libjava/gnu/gcj/convert/Input_JavaSrc.java89
-rw-r--r--libjava/gnu/gcj/convert/Input_SJIS.java24
-rw-r--r--libjava/gnu/gcj/convert/Input_UTF8.java10
-rw-r--r--libjava/gnu/gcj/convert/JIS0201.h159
-rw-r--r--libjava/gnu/gcj/convert/JIS0208.h13760
-rw-r--r--libjava/gnu/gcj/convert/JIS0212.h12136
-rw-r--r--libjava/gnu/gcj/convert/Output_8859_1.java22
-rw-r--r--libjava/gnu/gcj/convert/Output_EUCJIS.java27
-rw-r--r--libjava/gnu/gcj/convert/Output_JavaSrc.java6
-rw-r--r--libjava/gnu/gcj/convert/Output_SJIS.java26
-rw-r--r--libjava/gnu/gcj/convert/Output_UTF8.java8
-rw-r--r--libjava/gnu/gcj/convert/UnicodeToBytes.java23
-rw-r--r--libjava/gnu/gcj/convert/Unicode_to_JIS.cc23139
-rw-r--r--libjava/gnu/gcj/convert/gen-from-JIS.c37
-rw-r--r--libjava/gnu/gcj/convert/make-trie.c176
-rw-r--r--libjava/gnu/gcj/convert/natInput_EUCJIS.cc2
-rw-r--r--libjava/gnu/gcj/convert/natInput_SJIS.cc76
-rw-r--r--libjava/gnu/gcj/convert/natOutput_EUCJIS.cc102
-rw-r--r--libjava/gnu/gcj/convert/natOutput_SJIS.cc72
-rw-r--r--libjava/gnu/gcj/protocol/file/Connection.java169
-rw-r--r--libjava/gnu/gcj/protocol/file/Handler.java49
-rw-r--r--libjava/gnu/gcj/protocol/http/Connection.java5
-rw-r--r--libjava/gnu/gcj/text/LocaleData_en.java8
-rw-r--r--libjava/gnu/gcj/util/EnumerationChain.java52
-rw-r--r--libjava/include/config.h.in26
-rw-r--r--libjava/include/default-signal.h21
-rw-r--r--libjava/include/i386-signal.h148
-rw-r--r--libjava/include/javaprims.h17
-rw-r--r--libjava/include/jni.h10
-rw-r--r--libjava/include/sparc-signal.h64
-rw-r--r--libjava/include/stamp-h.in0
-rw-r--r--libjava/java/awt/AWTEvent.java25
-rw-r--r--libjava/java/awt/BorderLayout.java46
-rw-r--r--libjava/java/awt/Component.java98
-rw-r--r--libjava/java/awt/Container.java59
-rw-r--r--libjava/java/awt/Dimension.java78
-rw-r--r--libjava/java/awt/Event.java26
-rw-r--r--libjava/java/awt/Font.java15
-rw-r--r--libjava/java/awt/Frame.java55
-rw-r--r--libjava/java/awt/LayoutManager.java20
-rw-r--r--libjava/java/awt/LayoutManager2.java20
-rw-r--r--libjava/java/awt/Menu.java33
-rw-r--r--libjava/java/awt/MenuBar.java44
-rw-r--r--libjava/java/awt/MenuComponent.java15
-rw-r--r--libjava/java/awt/MenuContainer.java27
-rw-r--r--libjava/java/awt/MenuItem.java25
-rw-r--r--libjava/java/awt/Point.java65
-rw-r--r--libjava/java/awt/Rectangle.java35
-rw-r--r--libjava/java/awt/Shape.java23
-rw-r--r--libjava/java/awt/TextArea.java49
-rw-r--r--libjava/java/awt/TextComponent.java38
-rw-r--r--libjava/java/awt/Toolkit.java29
-rw-r--r--libjava/java/awt/Window.java29
-rw-r--r--libjava/java/awt/event/ActionEvent.java35
-rw-r--r--libjava/java/awt/event/ActionListener.java21
-rw-r--r--libjava/java/awt/event/ComponentEvent.java20
-rw-r--r--libjava/java/awt/event/InputEvent.java22
-rw-r--r--libjava/java/awt/event/KeyEvent.java38
-rw-r--r--libjava/java/awt/event/KeyListener.java23
-rw-r--r--libjava/java/awt/event/TextEvent.java20
-rw-r--r--libjava/java/awt/event/TextListener.java22
-rw-r--r--libjava/java/awt/event/WindowAdapter.java27
-rw-r--r--libjava/java/awt/event/WindowEvent.java19
-rw-r--r--libjava/java/awt/event/WindowListener.java27
-rw-r--r--libjava/java/awt/geom/Dimension2D.java36
-rw-r--r--libjava/java/awt/geom/Point2D.java69
-rw-r--r--libjava/java/awt/natToolkit.cc27
-rw-r--r--libjava/java/awt/peer/ComponentPeer.java23
-rw-r--r--libjava/java/awt/peer/ContainerPeer.java15
-rw-r--r--libjava/java/awt/peer/FramePeer.java16
-rw-r--r--libjava/java/awt/peer/WindowPeer.java15
-rw-r--r--libjava/java/io/DataInputStream.java66
-rw-r--r--libjava/java/io/File.java12
-rw-r--r--libjava/java/io/FileDescriptor.java4
-rw-r--r--libjava/java/io/FileInputStream.java4
-rw-r--r--libjava/java/io/FilterOutputStream.java5
-rw-r--r--libjava/java/io/FilterWriter.java1
-rw-r--r--libjava/java/io/InputStreamReader.java13
-rw-r--r--libjava/java/io/OutputStreamWriter.java13
-rw-r--r--libjava/java/io/PrintStream.java157
-rw-r--r--libjava/java/io/RandomAccessFile.java8
-rw-r--r--libjava/java/io/SequenceInputStream.java2
-rw-r--r--libjava/java/lang/EcosProcess.java59
-rw-r--r--libjava/java/lang/Integer.java25
-rw-r--r--libjava/java/lang/Long.java25
-rw-r--r--libjava/java/lang/PosixProcess.java74
-rw-r--r--libjava/java/lang/Runtime.java33
-rw-r--r--libjava/java/lang/String.java22
-rw-r--r--libjava/java/lang/StringBuffer.java8
-rw-r--r--libjava/java/lang/dtoa.c909
-rw-r--r--libjava/java/lang/e_acos.c118
-rw-r--r--libjava/java/lang/e_asin.c122
-rw-r--r--libjava/java/lang/e_atan2.c144
-rw-r--r--libjava/java/lang/e_exp.c185
-rw-r--r--libjava/java/lang/e_fmod.c149
-rw-r--r--libjava/java/lang/e_log.c169
-rw-r--r--libjava/java/lang/e_pow.c329
-rw-r--r--libjava/java/lang/e_rem_pio2.c220
-rw-r--r--libjava/java/lang/e_remainder.c87
-rw-r--r--libjava/java/lang/e_sqrt.c484
-rw-r--r--libjava/java/lang/fdlibm.h356
-rw-r--r--libjava/java/lang/ieeefp.h4
-rw-r--r--libjava/java/lang/k_cos.c103
-rw-r--r--libjava/java/lang/k_rem_pio2.c357
-rw-r--r--libjava/java/lang/k_sin.c85
-rw-r--r--libjava/java/lang/k_tan.c140
-rw-r--r--libjava/java/lang/mprec.h458
-rw-r--r--libjava/java/lang/natCharacter.cc21
-rw-r--r--libjava/java/lang/natDouble.cc7
-rw-r--r--libjava/java/lang/natEcosProcess.cc25
-rw-r--r--libjava/java/lang/natFloat.cc6
-rw-r--r--libjava/java/lang/natObject.cc3
-rw-r--r--libjava/java/lang/natPosixProcess.cc208
-rw-r--r--libjava/java/lang/natRuntime.cc55
-rw-r--r--libjava/java/lang/natString.cc77
-rw-r--r--libjava/java/lang/natSystem.cc120
-rw-r--r--libjava/java/lang/s_atan.c191
-rw-r--r--libjava/java/lang/s_ceil.c87
-rw-r--r--libjava/java/lang/s_copysign.c84
-rw-r--r--libjava/java/lang/s_cos.c87
-rw-r--r--libjava/java/lang/s_fabs.c78
-rw-r--r--libjava/java/lang/s_floor.c147
-rw-r--r--libjava/java/lang/s_rint.c93
-rw-r--r--libjava/java/lang/s_scalbn.c110
-rw-r--r--libjava/java/lang/s_sin.c140
-rw-r--r--libjava/java/lang/s_tan.c122
-rw-r--r--libjava/java/lang/sf_rint.c85
-rw-r--r--libjava/java/net/DatagramPacket.java175
-rw-r--r--libjava/java/net/DatagramSocket.java192
-rw-r--r--libjava/java/net/DatagramSocketImpl.java62
-rw-r--r--libjava/java/net/InetAddress.java5
-rw-r--r--libjava/java/net/MulticastSocket.java134
-rw-r--r--libjava/java/net/PlainDatagramSocketImpl.java99
-rw-r--r--libjava/java/net/PlainSocketImpl.java37
-rw-r--r--libjava/java/net/ServerSocket.java29
-rw-r--r--libjava/java/net/Socket.java96
-rw-r--r--libjava/java/net/SocketImpl.java12
-rw-r--r--libjava/java/net/SocketOptions.java40
-rw-r--r--libjava/java/net/URL.java28
-rw-r--r--libjava/java/net/URLDecoder.java48
-rw-r--r--libjava/java/net/URLEncoder.java71
-rw-r--r--libjava/java/net/URLStreamHandler.java105
-rw-r--r--libjava/java/net/natInetAddress.cc61
-rw-r--r--libjava/java/net/natPlainDatagramSocketImpl.cc497
-rw-r--r--libjava/java/net/natPlainSocketImpl.cc280
-rw-r--r--libjava/java/security/MessageDigest.java64
-rw-r--r--libjava/java/security/NoSuchAlgorithmException.java22
-rw-r--r--libjava/java/text/ChoiceFormat.java2
-rw-r--r--libjava/java/text/CollationElementIterator.java79
-rw-r--r--libjava/java/text/CollationKey.java104
-rw-r--r--libjava/java/text/Collator.java130
-rw-r--r--libjava/java/text/DateFormat.java31
-rw-r--r--libjava/java/text/DecimalFormat.java59
-rw-r--r--libjava/java/text/RuleBasedCollator.java366
-rw-r--r--libjava/java/text/natCollator.cc74
-rw-r--r--libjava/java/util/Calendar.java3
-rw-r--r--libjava/java/util/GregorianCalendar.java9
-rw-r--r--libjava/java/util/Locale.java29
-rw-r--r--libjava/java/util/Properties.java24
-rw-r--r--libjava/java/util/PropertyResourceBundle.java47
-rw-r--r--libjava/java/util/ResourceBundle.java104
-rw-r--r--libjava/java/util/natGregorianCalendar.cc2
-rw-r--r--libjava/java/util/zip/CheckedInputStream.java80
-rw-r--r--libjava/java/util/zip/CheckedOutputStream.java54
-rw-r--r--libjava/java/util/zip/DataFormatException.java33
-rw-r--r--libjava/java/util/zip/Deflater.java116
-rw-r--r--libjava/java/util/zip/DeflaterOutputStream.java65
-rw-r--r--libjava/java/util/zip/GZIPInputStream.java154
-rw-r--r--libjava/java/util/zip/GZIPOutputStream.java93
-rw-r--r--libjava/java/util/zip/Inflater.java98
-rw-r--r--libjava/java/util/zip/InflaterInputStream.java109
-rw-r--r--libjava/java/util/zip/ZipConstants.java7
-rw-r--r--libjava/java/util/zip/ZipEntry.java78
-rw-r--r--libjava/java/util/zip/ZipFile.java123
-rw-r--r--libjava/java/util/zip/ZipInputStream.java223
-rw-r--r--libjava/java/util/zip/ZipOutputStream.java258
-rw-r--r--libjava/java/util/zip/natDeflater.cc214
-rw-r--r--libjava/java/util/zip/natInflater.cc205
-rw-r--r--libjava/libgcj.spec.in7
-rw-r--r--libjava/libtool-version6
-rw-r--r--libjava/mauve-libgcj40
-rw-r--r--libjava/posix-threads.cc11
-rw-r--r--libjava/prims.cc64
-rw-r--r--libjava/testsuite/ChangeLog113
-rw-r--r--libjava/testsuite/Makefile.in15
-rw-r--r--libjava/testsuite/lib/libjava.exp289
-rw-r--r--libjava/testsuite/libjava.compile/Case.xfail1
-rw-r--r--libjava/testsuite/libjava.compile/OperatorBenchmark.java886
-rw-r--r--libjava/testsuite/libjava.compile/Where.xfail1
-rw-r--r--libjava/testsuite/libjava.compile/plusplus.java10
-rw-r--r--libjava/testsuite/libjava.compile/test.exp15
-rw-r--r--libjava/testsuite/libjava.lang/Array_1.xfail1
-rw-r--r--libjava/testsuite/libjava.lang/Divide_1.java105
-rw-r--r--libjava/testsuite/libjava.lang/Divide_1.out11
-rw-r--r--libjava/testsuite/libjava.lang/Final.java20
-rw-r--r--libjava/testsuite/libjava.lang/Final.out1
-rw-r--r--libjava/testsuite/libjava.lang/Final.xfail1
-rw-r--r--libjava/testsuite/libjava.lang/Finalize_1.java28
-rw-r--r--libjava/testsuite/libjava.lang/Finalize_1.out1
-rw-r--r--libjava/testsuite/libjava.lang/Invoke_2.java20
-rw-r--r--libjava/testsuite/libjava.lang/Invoke_2.out1
-rw-r--r--libjava/testsuite/libjava.lang/Invoke_2.xfail1
-rw-r--r--libjava/testsuite/libjava.lang/Shazam.java18
-rw-r--r--libjava/testsuite/libjava.lang/Shazam.out2
-rw-r--r--libjava/testsuite/libjava.lang/Shazam.xfail1
-rw-r--r--libjava/testsuite/libjava.lang/Thread_1.java185
-rw-r--r--libjava/testsuite/libjava.lang/Thread_1.out10
-rw-r--r--libjava/testsuite/libjava.lang/Throw_1.xfail1
-rw-r--r--libjava/testsuite/libjava.lang/test.exp35
-rw-r--r--libjava/testsuite/libjava.mauve/mauve.exp38
-rw-r--r--zlib/ChangeLog471
-rw-r--r--zlib/ChangeLog.gcj35
-rw-r--r--zlib/FAQ72
-rw-r--r--zlib/INDEX86
-rw-r--r--zlib/Make_vms.com115
-rw-r--r--zlib/Makefile.am97
-rw-r--r--zlib/Makefile.in452
-rw-r--r--zlib/Makefile.riscos151
-rw-r--r--zlib/README148
-rw-r--r--zlib/acinclude.m437
-rw-r--r--zlib/aclocal.m4779
-rw-r--r--zlib/adler32.c48
-rw-r--r--zlib/algorithm.txt213
-rw-r--r--zlib/amiga/Makefile.pup66
-rw-r--r--zlib/amiga/Makefile.sas64
-rw-r--r--zlib/compress.c68
-rwxr-xr-xzlib/configure3032
-rw-r--r--zlib/configure.in103
-rw-r--r--zlib/contrib/README.contrib34
-rw-r--r--zlib/contrib/asm386/gvmat32.asm559
-rw-r--r--zlib/contrib/asm386/gvmat32c.c200
-rw-r--r--zlib/contrib/asm386/mkgvmt32.bat1
-rw-r--r--zlib/contrib/asm386/zlibvc.def74
-rw-r--r--zlib/contrib/asm386/zlibvc.dsp651
-rw-r--r--zlib/contrib/asm386/zlibvc.dsw41
-rw-r--r--zlib/contrib/asm586/README.58643
-rw-r--r--zlib/contrib/asm586/match.S354
-rw-r--r--zlib/contrib/asm686/README.68634
-rw-r--r--zlib/contrib/asm686/match.S327
-rw-r--r--zlib/contrib/delphi/zlib.mak36
-rw-r--r--zlib/contrib/delphi/zlibdef.pas169
-rw-r--r--zlib/contrib/delphi2/d_zlib.bpr224
-rw-r--r--zlib/contrib/delphi2/d_zlib.cpp17
-rw-r--r--zlib/contrib/delphi2/readme.txt17
-rw-r--r--zlib/contrib/delphi2/zlib.bpg26
-rw-r--r--zlib/contrib/delphi2/zlib.bpr225
-rw-r--r--zlib/contrib/delphi2/zlib.cpp22
-rw-r--r--zlib/contrib/delphi2/zlib.pas534
-rw-r--r--zlib/contrib/delphi2/zlib32.bpr174
-rw-r--r--zlib/contrib/delphi2/zlib32.cpp42
-rw-r--r--zlib/contrib/iostream/test.cpp24
-rw-r--r--zlib/contrib/iostream/zfstream.cpp329
-rw-r--r--zlib/contrib/iostream/zfstream.h142
-rw-r--r--zlib/contrib/iostream2/zstream.h307
-rw-r--r--zlib/contrib/iostream2/zstream_test.cpp25
-rw-r--r--zlib/contrib/minizip/ChangeLogUnzip38
-rw-r--r--zlib/contrib/minizip/Makefile25
-rw-r--r--zlib/contrib/minizip/miniunz.c508
-rw-r--r--zlib/contrib/minizip/minizip.c302
-rw-r--r--zlib/contrib/minizip/readme.txt37
-rw-r--r--zlib/contrib/minizip/unzip.c1294
-rw-r--r--zlib/contrib/minizip/unzip.def15
-rw-r--r--zlib/contrib/minizip/unzip.h275
-rw-r--r--zlib/contrib/minizip/zip.c718
-rw-r--r--zlib/contrib/minizip/zip.def5
-rw-r--r--zlib/contrib/minizip/zip.h150
-rw-r--r--zlib/contrib/minizip/zlibvc.def74
-rw-r--r--zlib/contrib/minizip/zlibvc.dsp651
-rw-r--r--zlib/contrib/minizip/zlibvc.dsw41
-rw-r--r--zlib/contrib/untgz/Makefile14
-rw-r--r--zlib/contrib/untgz/makefile.w3263
-rw-r--r--zlib/contrib/untgz/untgz.c522
-rw-r--r--zlib/contrib/visual-basic.txt69
-rw-r--r--zlib/crc32.c162
-rw-r--r--zlib/deflate.c1350
-rw-r--r--zlib/deflate.h318
-rw-r--r--zlib/descrip.mms48
-rw-r--r--zlib/example.c556
-rw-r--r--zlib/gzio.c875
-rw-r--r--zlib/infblock.c398
-rw-r--r--zlib/infblock.h39
-rw-r--r--zlib/infcodes.c257
-rw-r--r--zlib/infcodes.h27
-rw-r--r--zlib/inffast.c170
-rw-r--r--zlib/inffast.h17
-rw-r--r--zlib/inffixed.h151
-rw-r--r--zlib/inflate.c366
-rw-r--r--zlib/inftrees.c455
-rw-r--r--zlib/inftrees.h58
-rw-r--r--zlib/infutil.c87
-rw-r--r--zlib/infutil.h98
-rw-r--r--zlib/maketree.c85
-rw-r--r--zlib/minigzip.c320
-rw-r--r--zlib/msdos/Makefile.b32104
-rw-r--r--zlib/msdos/Makefile.bor125
-rw-r--r--zlib/msdos/Makefile.dj2100
-rw-r--r--zlib/msdos/Makefile.emx69
-rw-r--r--zlib/msdos/Makefile.msc121
-rw-r--r--zlib/msdos/Makefile.tc108
-rw-r--r--zlib/msdos/Makefile.w3297
-rw-r--r--zlib/msdos/Makefile.wat103
-rw-r--r--zlib/msdos/zlib.def60
-rw-r--r--zlib/msdos/zlib.rc32
-rw-r--r--zlib/nt/Makefile.emx138
-rw-r--r--zlib/nt/Makefile.gcc87
-rw-r--r--zlib/nt/Makefile.nt88
-rw-r--r--zlib/nt/zlib.dnt47
-rw-r--r--zlib/os2/Makefile.os2136
-rw-r--r--zlib/os2/zlib.def51
-rw-r--r--zlib/trees.c1214
-rw-r--r--zlib/trees.h128
-rw-r--r--zlib/uncompr.c58
-rw-r--r--zlib/zconf.h279
-rw-r--r--zlib/zlib.3107
-rw-r--r--zlib/zlib.h893
-rw-r--r--zlib/zutil.c225
-rw-r--r--zlib/zutil.h220
466 files changed, 122032 insertions, 19408 deletions
diff --git a/boehm-gc/BCC_MAKEFILE b/boehm-gc/BCC_MAKEFILE
new file mode 100644
index 00000000000..c65a73e2eb8
--- /dev/null
+++ b/boehm-gc/BCC_MAKEFILE
@@ -0,0 +1,82 @@
+# Makefile for Borland C++ 4.5 on NT
+# For Borland 5.0, replace bc45 by bc5.
+# If you have the Borland assembler, remove "-DUSE_GENERIC"
+#
+bc= c:\bc45
+bcbin= $(bc)\bin
+bclib= $(bc)\lib
+bcinclude= $(bc)\include
+
+cc= $(bcbin)\bcc32
+rc= $(bcbin)\brc32
+lib= $(bcbin)\tlib
+link= $(bcbin)\tlink32
+cflags= -R -v -vi -H -H=gc.csm -I$(bcinclude);cord -L$(bclib) \
+ -w-pro -w-aus -w-par -w-ccc -w-rch -a4 -D__STDC__=0
+#defines= -DSILENT
+defines= -DSMALL_CONFIG -DSILENT -DALL_INTERIOR_POINTERS -DUSE_GENERIC
+
+.c.obj:
+ $(cc) @&&|
+ $(cdebug) $(cflags) $(cvars) $(defines) -o$* -c $*.c
+|
+
+.cpp.obj:
+ $(cc) @&&|
+ $(cdebug) $(cflags) $(cvars) $(defines) -o$* -c $*.cpp
+|
+
+.rc.res:
+ $(rc) -i$(bcinclude) -r -fo$* $*.rc
+
+XXXOBJS= XXXalloc.obj XXXreclaim.obj XXXallchblk.obj XXXmisc.obj \
+ XXXmach_dep.obj XXXos_dep.obj XXXmark_rts.obj XXXheaders.obj XXXmark.obj \
+ XXXobj_map.obj XXXblacklst.obj XXXfinalize.obj XXXnew_hblk.obj \
+ XXXdbg_mlc.obj XXXmalloc.obj XXXstubborn.obj XXXdyn_load.obj \
+ XXXtypd_mlc.obj XXXptr_chck.obj XXXgc_cpp.obj XXXmallocx.obj
+
+OBJS= $(XXXOBJS:XXX=)
+
+all: gctest.exe cord\de.exe test_cpp.exe
+
+$(OBJS) test.obj: gc_priv.h gc_hdrs.h gc.h config.h MAKEFILE
+
+gc.lib: $(OBJS)
+ -del gc.lib
+ tlib $* @&&|
+ $(XXXOBJS:XXX=+)
+|
+
+gctest.exe: test.obj gc.lib
+ $(cc) @&&|
+ $(cflags) -W -e$* test.obj gc.lib
+|
+
+cord\de.obj cord\de_win.obj: cord\cord.h cord\private\cord_pos.h cord\de_win.h \
+ cord\de_cmds.h
+
+cord\de.exe: cord\cordbscs.obj cord\cordxtra.obj cord\de.obj cord\de_win.obj \
+ cord\de_win.res gc.lib
+ $(cc) @&&|
+ $(cflags) -W -e$* cord\cordbscs.obj cord\cordxtra.obj \
+ cord\de.obj cord\de_win.obj gc.lib
+|
+ $(rc) cord\de_win.res cord\de.exe
+
+gc_cpp.obj: gc_cpp.h gc.h
+
+gc_cpp.cpp: gc_cpp.cc
+ copy gc_cpp.cc gc_cpp.cpp
+
+test_cpp.cpp: test_cpp.cc
+ copy test_cpp.cc test_cpp.cpp
+
+test_cpp.exe: test_cpp.obj gc_cpp.h gc.h gc.lib
+ $(cc) @&&|
+ $(cflags) -W -e$* test_cpp.obj gc.lib
+|
+
+scratch:
+ -del *.obj *.res *.exe *.csm cord\*.obj cord\*.res cord\*.exe cord\*.csm
+
+
diff --git a/boehm-gc/ChangeLog b/boehm-gc/ChangeLog
new file mode 100644
index 00000000000..2ccca07f5fa
--- /dev/null
+++ b/boehm-gc/ChangeLog
@@ -0,0 +1,379 @@
+1999-07-31 Alexandre Oliva <oliva@dcc.unicamp.br>
+
+ * mips_sgi_mach_dep.s: Enable PIC option.
+
+1999-07-19 Alexandre Oliva <oliva@dcc.unicamp.br>
+
+ * config.h: Updates for GNU/Linux/sparc. Use HEURISTIC2 on
+ Solaris7/sparc, since HEURISTIC1 does not work.
+ * os_dep.c: Updates for GNU/Linux/sparc.
+ * misc.c (GC_init_inner): Likewise.
+ From gc-boehm 4.14.
+
+1999-07-19 Tom Tromey <tromey@cygnus.com>
+
+ * config.h (MPROTECT_VDB): Don't define on Linux.
+
+1999-07-19 Alexandre Oliva <oliva@dcc.unicamp.br>
+
+ * Makefile.am (.s.lo): Avoid `#line' directives.
+ * Makefile.in: Rebuilt.
+
+1999-07-19 Alexandre Oliva <oliva@dcc.unicamp.br>
+
+ * Makefile.am (*-recursive, *-am, *-multi): Automake does not
+ generate *-recursive for this Makefile, use *-am instead.
+ * Makefile.in: Rebuilt.
+
+1999-06-30 Alexandre Oliva <oliva@dcc.unicamp.br>
+
+ * Makefile.am (.s.lo): Renamed from `.s.o'.
+ * Makefile.in: Rebuilt.
+
+1999-06-21 Tom Tromey <tromey@cygnus.com>
+
+ Alpha patch from Jeff Sturm:
+ * os_dep.c (GC_init_linuxalpha): New function.
+ * misc.c: Initialize for alpha linux.
+ * gc_priv.h (GC_test_and_set): Define for alpha.
+ * config.h: Don't assume __data_start on alpha.
+
+ * Makefile.in: Rebuilt.
+ * Makefile.am (libgcjgc_la_LDFLAGS): Use -version-info, not
+ -release.
+
+ * Makefile.in: Rebuilt.
+ * Makefile.am (toolexeclibdir): Define as libdir when
+ appropriate.
+ * configure: Rebuilt.
+ * configure.in (USE_LIBDIR): New conditional.
+
+ * configure: Rebuilt.
+ * configure.in: Recognize all forms of alpha.
+
+1999-06-17 Anthony Green <green@cygnus.com>
+
+ * mach_dep.c (GC_push_regs): FreeBSD-elf support (from
+ Carlo Dapor <carlo@vis.ethz.ch>).
+
+1999-05-05 Gilles Zunino <Gilles.Zunino@hei.fr>
+
+ * configure.in: Switch from irix threads to posix threads
+ Defined IRIX_THREADS. Put mips_sgi_mach_dep.lo into machdep
+ for mips architecture.
+ * configure: Regenerate.
+
+1999-04-30 Tom Tromey <tromey@cygnus.com>
+
+ * linux_threads.c: Don't reference __pthread_initial_thread_bos.
+
+1999-04-26 Tom Tromey <tromey@cygnus.com>
+
+ * dyn_load.c (GC_FirstDLOpenedLinkMap): Declare _DYNAMIC as
+ `weak'.
+
+1999-04-23 Tom Tromey <tromey@cygnus.com>
+
+ * Makefile.in, configure: Rebuilt.
+ * Makefile.am (EXTRA_LIBRARIES): Mention libgcjgc.la.
+ (libgcjgc_la_SOURCES): Renamed.
+ (libgcjgc_la_LIBADD): Likewise.
+ (libgcjgc_la_DEPENDENCIES): Likewise.
+ (EXTRA_libgcjgc_la_SOURCES): Likewise.
+ (gctest_LDADD): Use libgcjgc.la.
+ (all_objs): Mention libgcj_la_OBJECTS.
+ (EXTRA_LTLIBRARIES): Renamed.
+ (toollib_LTLIBRARIES): Likewise.
+ (libgcjgc_la_LDFLAGS): New macro
+ (toolexecdir): Renamed.
+ (toolexeclibdir): Likewise.
+ (toolexeclib_LTLIBRARIES): Likewise.
+ (LTCOMPILE): Renamed; added libtool invocation.
+ (LINK): Added libtool invocation.
+ (.s.o): use LTCOMPILE.
+ * configure.in: Call AM_PROG_LIBTOOL.
+ (target_all): Set to libgcjgc.la.
+ Mention `.lo' forms of object files.
+
+1999-04-21 Tom Tromey <tromey@cygnus.com>
+
+ * misc.c (GC_init_inner): If QUICK_THREADS defined, compute
+ GC_stackbottom.
+
+ * os_dep.c: glibc 2.1 requires asm/sigcontext.h, not
+ sigcontext.h. From Matthias Klose <doko@itso.de>.
+
+1999-04-16 Tom Tromey <tromey@cygnus.com>
+
+ * config.h (__start): Declare as `int' in alpha/OSF1 case. From
+ David Pettersson <dapet@mai.liu.se>
+
+1999-04-14 Tom Tromey <tromey@cygnus.com>
+
+ * configure: Rebuilt.
+ * configure.in: Don't use sparc_mach_dep.o for Solaris. Reverts
+ incorrect patch of 199-04-09.
+
+ * configure: Rebuilt.
+ * configure.in: Added support for alpha.
+ From David Pettersson <dapet@mai.liu.se>.
+
+1999-04-13 Tom Tromey <tromey@cygnus.com>
+
+ * Makefile.in: Rebuilt.
+ * Makefile.am (libgcjgc_a_SOURCES): Added solaris-threads.c and
+ solaris-threads.h.
+
+1999-04-09 Tom Tromey <tromey@cygnus.com>
+
+ * configure: Rebuilt.
+ * configure.in: Use sparc_mach_dep.s when building on Solaris.
+
+1999-02-23 Tom Tromey <tromey@cygnus.com>
+
+ * configure: Rebuilt.
+ * configure.in: For Linux, define _REENTRANT. For Solaris, define
+ SOLARIS_THREADS and _SOLARIS_PTHREADS.
+
+1999-02-18 Tom Tromey <tromey@cygnus.com>
+
+ * quick_threads.c (GC_push_all_stacks): Change order of arguments
+ to GC_push_all_stacks depending on STACK_GROWS_DOWN define. Check
+ for case where LO is NULL.
+
+1999-02-10 Tom Tromey <tromey@cygnus.com>
+
+ * aclocal.m4, configure, Makefile.in: Rebuilt.
+ * acinclude.m4: Updated to be used with automake 1.4.
+ * configure.in: Renamed libgc to libgcjgc. Updated to be used
+ with automake 1.4.
+ * Makefile.am (EXTRA_LIBRARIES): Renamed libgc to libgcjgc.
+ (libgcjgc_a_SOURCES): Likewise.
+ (libgcjgc_a_LIBADD): Likewise.
+ (libgcjgc_a_DEPENDENCIES): Likewise.
+ (EXTRA_libgcjgc_a_SOURCES): Likewise.
+ (gctest_LDADD): Likewise.
+ (all_objs): Likewise.
+
+1999-01-08 Tom Tromey <tromey@cygnus.com>
+
+ * configure: Rebuilt.
+ * configure.in: Define LINUX_THREADS if using POSIX threads on
+ Linux.
+
+ * gc_priv.h (GC_test_and_set): Put return type into definition.
+
+1998-11-24 Andrew Haley <aph@viagra.cygnus.co.uk>
+
+ * Makefile.am: add support for eCos. In particular, add C++
+ support for compiling the file ecos.cc.
+ * ecos.cc: new file.
+ * acinclude.m4: add C++ support.
+ * aclocal.m4: likewise
+ * config.h: add eCos support.
+ * configure: likewise
+ * configure.in: likewise
+ * misc.c (GC_write): add eCos support.
+ * os_dep.c (tiny_sbrk): add eCos support.
+
+Thu Dec 10 18:24:34 1998 Warren Levy <warrenl@cygnus.com>
+
+ * misc.c (GC_init_inner): Moved STACKBASE code to os_dep.c.
+ * os_dep.c (GC_get_stack_base): Moved STACKBASE code from misc.c.
+
+1998-11-23 Tom Tromey <tromey@cygnus.com>
+
+ * configure.host (boehm_gc_cflags): Don't add `-O2'.
+
+1998-11-20 Andrew Haley <aph@viagra.cygnus.co.uk>
+
+ * Makefile.am, Makefile.in, configure.host: tx39 build option
+ "-G 0" added.
+
+1998-11-17 Tom Tromey <tromey@cygnus.com>
+
+ * configure: Rebuilt.
+ * configure.in: Switch on host, not target.
+
+1998-11-16 Tom Tromey <tromey@cygnus.com>
+
+ * gc_priv.h (GC_debug_object_start): Declare.
+ * mark.c (GC_mark_from_mark_stack): Call GC_debug_object_start.
+ * gc.h (GC_debug_register_finalizer_no_order,
+ GC_register_finalizer_no_order): Declare.
+ (GC_REGISTER_FINALIZER_NO_ORDER): New macro.
+ * dbg_mlc.c (GC_debug_register_finalizer_no_order): New function.
+ (GC_debug_generic_malloc): Likewise.
+ (GC_debug_object_start): new function.
+
+1998-11-11 Tom Tromey <tromey@cygnus.com>
+
+ * configure: Rebuilt.
+ * configure.in: Recognize --enable-java-gc, not --enable-gc.
+
+Tue Nov 3 18:01:12 1998 Tom Tromey <tromey@sanguine.cygnus.com>
+
+ * dyn_load.c: Handle QUICK_THREADS case.
+
+1998-10-21 Tom Tromey <tromey@cygnus.com>
+
+ * configure: Rebuilt.
+ * configure.in: Put cpp defines here, not in config.h. Recognize
+ --enable-threads. Set INCLUDES. Create boehm-cflags file. Don't
+ define PACKAGE or VERSION.
+ * config.h (SILENT, NO_SIGNALS, NO_DEBUGGING, JAVA_FINALIZATION):
+ Don't define.
+
+ * os_dep.c (GC_default_push_other_roots): Define when
+ QUICK_THREADS defined.
+ * misc.c: Added QUICK_THREADS case.
+ * gc_priv.h: Added QUICK_THREADS case to define LOCK and UNLOCK.
+ * config.h (THREADS): Define if QUICK_THREADS defined.
+ * Makefile.in: Rebuilt.
+ * Makefile.am (libgc_a_SOURCES): Added linux_threads.c,
+ quick_threads.c.
+ * quick_threads.c: New file.
+
+1998-10-20 Tom Tromey <tromey@cygnus.com>
+
+ * aclocal.m4, configure: Rebuilt.
+ * acinclude.m4: Don't subst machine_dir or sys_dir.
+ * configure.host: Removed unused code.
+
+Sun Oct 11 08:18:02 1998 Anthony Green <green@cygnus.com>
+
+ * configure: Rebuilt.
+ * configure.in: Fix typo in previous patch.
+
+Sun Oct 11 08:06:11 1998 Anthony Green <green@cygnus.com>
+
+ * Makefile.in, aclocal.m4, configure: Rebuilt.
+ * Makefile.am, acinclude.m4, configure.in: Add multilib support.
+ * configure.host: Created.
+
+Tue Sep 1 10:58:15 1998 Tom Tromey <tromey@cygnus.com>
+
+ * Makefile.in: Rebuilt.
+ * Makefile.am (lib_LIBRARIES): Use target_all.
+ (EXTRA_LIBRARIES): New macro.
+ * configure: Rebuilt.
+ * configure.in: Recognize --enable-gc.
+
+Thu Aug 13 10:52:45 1998 Tom Tromey <tromey@cygnus.com>
+
+ * Makefile.in: Rebuilt.
+ * Makefile.am (COMPILE): Define.
+ (LINK): Likewise.
+ (.s.o): Use MY_CFLAGS.
+ * configure: Rebuilt.
+ * configure.in (MY_CFLAGS): Define and subst.
+
+Wed Aug 12 11:41:43 1998 Tom Tromey <tromey@cygnus.com>
+
+ * configure: Rebuilt.
+ * configure.in: Added --with-cross-host argument. Use
+ $with_cross_host to determine when cross-compiling.
+
+ * config.h (SMALL_CONFIG): Don't define.
+ * configure: Rebuilt.
+ * configure.in: Define SMALL_CONFIG when cross-compiling.
+
+Tue Aug 11 11:41:25 1998 Tom Tromey <tromey@cygnus.com>
+
+ * solaris_pthreads.c, misc.c, gc_priv.h, config.h, alloc.c,
+ allchblk.c: Merged with 4.13a2 while preserving local changes.
+
+ * Makefile.orig: Updated from Makefile in 4.13a2.
+
+ * configure: Rebuilt.
+ * configure.in: Updated version number to 4.13a2. On Solaris,
+ don't build with -O when using gcc.
+
+ Merged in version 4.13alpha2:
+ * config.h (USE_MMAP): Re-enable on Solaris.
+ * solaris_pthreads.c: Removed RCS Id line.
+ * alpha_mach_dep.s: Removed RCS Id line.
+
+Wed Jul 22 15:38:12 1998 Tom Tromey <tromey@cygnus.com>
+
+ * config.h (USE_MMAP): Don't define for Solaris.
+
+Wed Jun 10 12:51:41 1998 Tom Tromey <tromey@cygnus.com>
+
+ * Makefile.in: Rebuilt.
+ * Makefile.am (libgc_a_SOURCES): Removed setjmp_t.c.
+
+ * Makefile.in: Rebuilt.
+ * Makefile.am (libgc_a_SOURCES): Removed add_gc_prefix.c.
+
+Thu May 14 15:32:58 1998 Tom Tromey <tromey@cygnus.com>
+
+ * Makefile.in: Rebuilt.
+ * Makefile.am ($(all_objs)): Depend on config.h.
+
+ * config.h: [MIPS] If DATASTART_IS_ETEXT defined then define
+ DATASTART as &_etext.
+ * misc.c (GC_init_inner): If STACKBASE defined, then use it.
+ * configure: Rebuilt.
+ * configure.in: Define STACKBASE and DATASTART_IS_ETEXT for the
+ tx39.
+
+Tue May 12 13:15:45 1998 Tom Tromey <tromey@cygnus.com>
+
+ * alloc.c: Don't call GET_TIME if NO_CLOCK defined.
+ (GC_maybe_gc): Likewise.
+ * os_dep.c: If NO_SIGSET defined, then have empty
+ GC_disable_signals and GC_enable_signals.
+ * configure: Rebuilt.
+ * configure.in: Added --with-target-subdir option. If
+ cross-compiling, define NO_SIGSET and NO_CLOCK.
+
+Wed May 6 16:40:28 1998 Tom Tromey <tromey@cygnus.com>
+
+ * Makefile.in: Rebuilt.
+ * Makefile.am (.s.o): Directly use CC -x assembler-with-cpp.
+ (AS): Removed.
+ * aclocal.m4, configure: Rebuilt.
+ * acinclude.m4: New file.
+ * configure.in: Don't run AM_EXEEXT. Use LIB_AC_PROG_CC.
+
+Thu Apr 30 14:51:12 1998 Tom Tromey <tromey@cygnus.com>
+
+ * configure: Rebuilt.
+ * configure.in: Link boehm-config.h to config.h.
+ * Makefile.in: Rebuilt.
+ * Makefile.am (INCLUDES): Removed.
+ * config.h (SILENT, SMALL_CONFIG, NO_SIGNALS, NO_DEBUGGING,
+ JAVA_FINALIZATION): Define
+
+Wed Apr 29 11:03:14 1998 Tom Tromey <tromey@cygnus.com>
+
+ * Many files: Use GC_bool, not bool.
+ * gc_priv.h: Define GC_bool, not bool.
+
+ * misc.c (GC_dont_gc): Define as int.
+ (GC_quiet): Likewise.
+ * gc_priv.h (GC_never_stop_func): Declare as returning bool.
+ * alloc.c (GC_dont_expand): Define as int.
+ * gc_priv.h: For gcc, define bool as char.
+
+Tue Apr 28 22:44:16 1998 Tom Tromey <tromey@cygnus.com>
+
+ * Makefile.in: Rebuilt.
+ * Makefile.am (check_PROGRAMS): New macro.
+ (gctest_SOURCES): Likewise.
+ (gctest_LDADD): Likewise.
+
+Mon Apr 27 23:53:24 1998 Tom Tromey <tromey@cygnus.com>
+
+ * Makefile.in: Rebuilt.
+ * Makefile.am (libgc_a_SOURCES): Added dyn_load.c.
+ * configure: Rebuilt.
+ * configure.in: Define SUNOS53_SHARED_LIB on Solaris 2.3.
+
+Wed Apr 15 11:40:56 1998 Tom Tromey <tromey@sanguine.cygnus.com>
+
+ * Makefile.am, Makefile.in, configure.in, configure, aclocal.m4:
+ New files.
+ * Makefile.orig: Renamed from Makefile.
+
diff --git a/boehm-gc/EMX_MAKEFILE b/boehm-gc/EMX_MAKEFILE
new file mode 100644
index 00000000000..1ade12adc5c
--- /dev/null
+++ b/boehm-gc/EMX_MAKEFILE
@@ -0,0 +1,141 @@
+#
+# OS/2 specific Makefile for the EMX environment
+#
+# You need GNU Make 3.71, gcc 2.5.7, emx 0.8h and GNU fileutils 3.9
+# or similar tools. C++ interface and de.exe weren't tested.
+#
+# Rename this file "Makefile".
+#
+
+# Primary targets:
+# gc.a - builds basic library
+# c++ - adds C++ interface to library and include directory
+# cords - adds cords (heavyweight strings) to library and include directory
+# test - prints porting information, then builds basic version of gc.a, and runs
+# some tests of collector and cords. Does not add cords or c++ interface to gc.a
+# cord/de.exe - builds dumb editor based on cords.
+CC= gcc
+CXX=g++
+# Needed only for "make c++", which adds the c++ interface
+
+CFLAGS= -O -DALL_INTERIOR_POINTERS -DSILENT
+# Setjmp_test may yield overly optimistic results when compiled
+# without optimization.
+# -DSILENT disables statistics printing, and improves performance.
+# -DCHECKSUMS reports on erroneously clear dirty bits, and unexpectedly
+# altered stubborn objects, at substantial performance cost.
+# -DFIND_LEAK causes the collector to assume that all inaccessible
+# objects should have been explicitly deallocated, and reports exceptions
+# -DSOLARIS_THREADS enables support for Solaris (thr_) threads.
+# (Clients should also define SOLARIS_THREADS and then include
+# gc.h before performing thr_ or GC_ operations.)
+# -DALL_INTERIOR_POINTERS allows all pointers to the interior
+# of objects to be recognized. (See gc_private.h for consequences.)
+# -DSMALL_CONFIG tries to tune the collector for small heap sizes,
+# usually causing it to use less space in such situations.
+# Incremental collection no longer works in this case.
+# -DDONT_ADD_BYTE_AT_END is meaningful only with
+# -DALL_INTERIOR_POINTERS. Normally -DALL_INTERIOR_POINTERS
+# causes all objects to be padded so that pointers just past the end of
+# an object can be recognized. This can be expensive. (The padding
+# is normally more than one byte due to alignment constraints.)
+# -DDONT_ADD_BYTE_AT_END disables the padding.
+
+AR= ar
+RANLIB= ar s
+
+# Redefining srcdir allows object code for the nonPCR version of the collector
+# to be generated in different directories
+srcdir = .
+VPATH = $(srcdir)
+
+OBJS= alloc.o reclaim.o allchblk.o misc.o mach_dep.o os_dep.o mark_rts.o headers.o mark.o obj_map.o blacklst.o finalize.o new_hblk.o dyn_load.o dbg_mlc.o malloc.o stubborn.o checksums.o typd_mlc.o ptr_chck.o mallocx.o
+
+CORD_OBJS= cord/cordbscs.o cord/cordxtra.o cord/cordprnt.o
+
+CORD_INCLUDE_FILES= $(srcdir)/gc.h $(srcdir)/cord/cord.h $(srcdir)/cord/ec.h \
+ $(srcdir)/cord/cord_pos.h
+
+# Libraries needed for curses applications. Only needed for de.
+CURSES= -lcurses -ltermlib
+
+# The following is irrelevant on most systems. But a few
+# versions of make otherwise fork the shell specified in
+# the SHELL environment variable.
+SHELL= bash
+
+SPECIALCFLAGS =
+# Alternative flags to the C compiler for mach_dep.c.
+# Mach_dep.c often doesn't like optimization, and it's
+# not time-critical anyway.
+
+all: gc.a gctest.exe
+
+$(OBJS) test.o: $(srcdir)/gc_priv.h $(srcdir)/gc_hdrs.h $(srcdir)/gc.h \
+ $(srcdir)/config.h $(srcdir)/gc_typed.h
+# The dependency on Makefile is needed. Changing
+# options such as -DSILENT affects the size of GC_arrays,
+# invalidating all .o files that rely on gc_priv.h
+
+mark.o typd_mlc.o finalize.o: $(srcdir)/gc_mark.h
+
+gc.a: $(OBJS)
+ $(AR) ru gc.a $(OBJS)
+ $(RANLIB) gc.a
+
+cords: $(CORD_OBJS) cord/cordtest.exe
+ $(AR) ru gc.a $(CORD_OBJS)
+ $(RANLIB) gc.a
+ cp $(srcdir)/cord/cord.h include/cord.h
+ cp $(srcdir)/cord/ec.h include/ec.h
+ cp $(srcdir)/cord/cord_pos.h include/cord_pos.h
+
+gc_cpp.o: $(srcdir)/gc_cpp.cc $(srcdir)/gc_cpp.h
+ $(CXX) -c -O $(srcdir)/gc_cpp.cc
+
+c++: gc_cpp.o $(srcdir)/gc_cpp.h
+ $(AR) ru gc.a gc_cpp.o
+ $(RANLIB) gc.a
+ cp $(srcdir)/gc_cpp.h include/gc_cpp.h
+
+mach_dep.o: $(srcdir)/mach_dep.c
+ $(CC) -o mach_dep.o -c $(SPECIALCFLAGS) $(srcdir)/mach_dep.c
+
+mark_rts.o: $(srcdir)/mark_rts.c
+ $(CC) -o mark_rts.o -c $(CFLAGS) $(srcdir)/mark_rts.c
+
+cord/cordbscs.o: $(srcdir)/cord/cordbscs.c $(CORD_INCLUDE_FILES)
+ $(CC) $(CFLAGS) -c $(srcdir)/cord/cordbscs.c -o cord/cordbscs.o
+
+cord/cordxtra.o: $(srcdir)/cord/cordxtra.c $(CORD_INCLUDE_FILES)
+ $(CC) $(CFLAGS) -c $(srcdir)/cord/cordxtra.c -o cord/cordxtra.o
+
+cord/cordprnt.o: $(srcdir)/cord/cordprnt.c $(CORD_INCLUDE_FILES)
+ $(CC) $(CFLAGS) -c $(srcdir)/cord/cordprnt.c -o cord/cordprnt.o
+
+cord/cordtest.exe: $(srcdir)/cord/cordtest.c $(CORD_OBJS) gc.a
+ $(CC) $(CFLAGS) -o cord/cordtest.exe $(srcdir)/cord/cordtest.c $(CORD_OBJS) gc.a
+
+cord/de.exe: $(srcdir)/cord/de.c $(srcdir)/cord/cordbscs.o $(srcdir)/cord/cordxtra.o gc.a
+ $(CC) $(CFLAGS) -o cord/de.exe $(srcdir)/cord/de.c $(srcdir)/cord/cordbscs.o $(srcdir)/cord/cordxtra.o gc.a $(CURSES)
+
+clean:
+ rm -f gc.a test.o gctest.exe output-local output-diff $(OBJS) \
+ setjmp_test mon.out gmon.out a.out core \
+ $(CORD_OBJS) cord/cordtest.exe cord/de.exe
+ -rm -f *~
+
+gctest.exe: test.o gc.a
+ $(CC) $(CFLAGS) -o gctest.exe test.o gc.a
+
+# If an optimized setjmp_test generates a segmentation fault,
+# odds are your compiler is broken. Gctest may still work.
+# Try compiling setjmp_t.c unoptimized.
+setjmp_test.exe: $(srcdir)/setjmp_t.c $(srcdir)/gc.h
+ $(CC) $(CFLAGS) -o setjmp_test.exe $(srcdir)/setjmp_t.c
+
+test: setjmp_test.exe gctest.exe
+ ./setjmp_test
+ ./gctest
+ make cord/cordtest.exe
+ cord/cordtest
diff --git a/boehm-gc/MacOS.c b/boehm-gc/MacOS.c
new file mode 100644
index 00000000000..420ea500e3e
--- /dev/null
+++ b/boehm-gc/MacOS.c
@@ -0,0 +1,137 @@
+/*
+ MacOS.c
+
+ Some routines for the Macintosh OS port of the Hans-J. Boehm, Alan J. Demers
+ garbage collector.
+
+ <Revision History>
+
+ 11/22/94 pcb StripAddress the temporary memory handle for 24-bit mode.
+ 11/30/94 pcb Tracking all memory usage so we can deallocate it all at once.
+ 02/10/96 pcb Added routine to perform a final collection when
+unloading shared library.
+
+ by Patrick C. Beard.
+ */
+/* Boehm, February 15, 1996 2:55 pm PST */
+
+#include <Resources.h>
+#include <Memory.h>
+#include <LowMem.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "gc.h"
+#include "gc_priv.h"
+
+// use 'CODE' resource 0 to get exact location of the beginning of global space.
+
+typedef struct {
+ unsigned long aboveA5;
+ unsigned long belowA5;
+ unsigned long JTSize;
+ unsigned long JTOffset;
+} *CodeZeroPtr, **CodeZeroHandle;
+
+void* GC_MacGetDataStart()
+{
+ CodeZeroHandle code0 = (CodeZeroHandle)GetResource('CODE', 0);
+ if (code0) {
+ long belowA5Size = (**code0).belowA5;
+ ReleaseResource((Handle)code0);
+ return (LMGetCurrentA5() - belowA5Size);
+ }
+ fprintf(stderr, "Couldn't load the jump table.");
+ exit(-1);
+ return 0;
+}
+
+/* track the use of temporary memory so it can be freed all at once. */
+
+typedef struct TemporaryMemoryBlock TemporaryMemoryBlock, **TemporaryMemoryHandle;
+
+struct TemporaryMemoryBlock {
+ TemporaryMemoryHandle nextBlock;
+ char data[];
+};
+
+static TemporaryMemoryHandle theTemporaryMemory = NULL;
+static Boolean firstTime = true;
+
+void GC_MacFreeTemporaryMemory(void);
+
+Ptr GC_MacTemporaryNewPtr(size_t size, Boolean clearMemory)
+{
+ static Boolean firstTime = true;
+ OSErr result;
+ TemporaryMemoryHandle tempMemBlock;
+ Ptr tempPtr = nil;
+
+ tempMemBlock = (TemporaryMemoryHandle)TempNewHandle(size + sizeof(TemporaryMemoryBlock), &result);
+ if (tempMemBlock && result == noErr) {
+ HLockHi((Handle)tempMemBlock);
+ tempPtr = (**tempMemBlock).data;
+ if (clearMemory) memset(tempPtr, 0, size);
+ tempPtr = StripAddress(tempPtr);
+
+ // keep track of the allocated blocks.
+ (**tempMemBlock).nextBlock = theTemporaryMemory;
+ theTemporaryMemory = tempMemBlock;
+ }
+
+# if !defined(SHARED_LIBRARY_BUILD)
+ // install an exit routine to clean up the memory used at the end.
+ if (firstTime) {
+ atexit(&GC_MacFreeTemporaryMemory);
+ firstTime = false;
+ }
+# endif
+
+ return tempPtr;
+}
+
+extern word GC_fo_entries;
+
+static void perform_final_collection()
+{
+ unsigned i;
+ word last_fo_entries = 0;
+
+ /* adjust the stack bottom, because CFM calls us from another stack
+ location. */
+ GC_stackbottom = (ptr_t)&i;
+
+ /* try to collect and finalize everything in sight */
+ for (i = 0; i < 2 || GC_fo_entries < last_fo_entries; i++) {
+ last_fo_entries = GC_fo_entries;
+ GC_gcollect();
+ }
+}
+
+
+void GC_MacFreeTemporaryMemory()
+{
+# if defined(SHARED_LIBRARY_BUILD)
+ /* if possible, collect all memory, and invoke all finalizers. */
+ perform_final_collection();
+# endif
+
+ if (theTemporaryMemory != NULL) {
+ long totalMemoryUsed = 0;
+ TemporaryMemoryHandle tempMemBlock = theTemporaryMemory;
+ while (tempMemBlock != NULL) {
+ TemporaryMemoryHandle nextBlock = (**tempMemBlock).nextBlock;
+ totalMemoryUsed += GetHandleSize((Handle)tempMemBlock);
+ DisposeHandle((Handle)tempMemBlock);
+ tempMemBlock = nextBlock;
+ }
+ theTemporaryMemory = NULL;
+
+# if !defined(SILENT) && !defined(SHARED_LIBRARY_BUILD)
+ fprintf(stdout, "[total memory used: %ld bytes.]\n",
+ totalMemoryUsed);
+ fprintf(stdout, "[total collections: %ld.]\n", GC_gc_no);
+# endif
+ }
+}
diff --git a/boehm-gc/MacProjects.sit.hqx b/boehm-gc/MacProjects.sit.hqx
new file mode 100644
index 00000000000..99dff88b4cf
--- /dev/null
+++ b/boehm-gc/MacProjects.sit.hqx
@@ -0,0 +1,886 @@
+(This file must be converted with BinHex 4.0)
+
+:$deKBe"bEfTPBh4c,R0TG!"6594%8dP8)3#3"&)e!!!"4UiT8dP8)3!(!!"50A*
+
+-BA8#ZJ#3!aB"#3d0#'GM,MBi5bkjBf038%-ZZ3#3%)Zi!*!8"@`!N!6rN!4069"
+
+568e$3`%!UbqAD+X`19S!!!Ba!!!,*J!!!F%!!!-PfTmj1`#3"PET)d31)LTH6H4
+
+#*AqG5b5HI*)QjY$IIb00%ReTJSi6rG$jG(bZ,"Rc,9Umf[IRj)6FZ-j`GfGR)#!
+
+m-#qLqB#cj'G%46qffB3q8AppLXKc+P&*il4FMJMq3N32r[U,(PlSNdrQm-J(4!p
+
+jK)NHmKJSHY!,&chS$4)pk%8mL3I)B0'$AU6S3'q)k%%[5[5J&ffa#68)0ZM&#T!
+
+!*fHC-2dFZ3i83[Vr[4Xh'+DNQrm'J)rrpqe%ST`,FeVi6b,*qHH")4eQc28NFMN
+
+ZT*m,L"Y%-`pdAk6RLHDaeVV0a,,@P(4UUK66rUM'8bf91llS("lTh81)MBQ+4*q
+
+rfHENEhD)Ke#3!09'M%bL[P1+G88fa$3e)5Gpf0kARpBf*6eIH*0`ZBHR%ii"PbN
+
++D&*)688M)Sm$Bm[cCdDjh2YIjmAc`(TVpi*Vka((A*&Yl@'LTSH1M*AMP#,2[A$
+
+(FHA@S"dL4dER#3b!EfBYem(C9P5iGH"a-bb-AL(F"bb-AL,F6)%a9pJUL,(hf%B
+
+TeQb["X5ib4DQXV!-fa6&mZf&3,(C&UDd-((SpeMBEIB`8Zc,BcZR3A5'X+jYj$'
+
+6)6HVV+R[!`#3!`X!(E@*MFQ%R4d"))`m[3JM[c)bBS54Tj'M(AP+MK&f%VD5SdG
+
+SANFB@3Rqc$Am83(+)`"G(D%A'9!bBQ6!b)b4Sq3SH8D1NDGNX$)bBi54!51--$*
+
+Kj0L!M"KKK"dC--,)-h+-6#KKC-$)-F)NamL!!Z06#X!!b&%bBUHp8RcN'%%6!b,
+
+i!!kV"`"DLHFaK*!!"Ym4K,,2i2X4c[,`c5!GIPf!ZcNi'8'VfJFpSfdpq+CY$8j
+
+-V'f-DZr2[36#1(ael5hmfT@1cSU66D5pqDSA89pdTP-`Z[jj6T&!PmZBFZjal"&
+
+5iG6#blE$+&kLh#QZ118&(0T1J(hZ,9)5MJ9ic*qPI!ac'RJ96QMZjSbkMq()Ui6
+
+B+f,,#'N1icbM4N"aaBr1`3Z9U'8RY'XAiVXFKp#&k2D5Be%VCdh4%,+2QS'b"Q2
+
+%0PNT4rE#%kTUFqYDM56bVjfe!p8MqmL)1VmjVkJY`U[*$&*L3AMSpB@LCQ*U&l%
+
+T+3890rL,V9klFN*4@f0UTf8Z&&afN!"4GC6G8p3fN9$4+4[-@DAeK%lej"@eAAL
+
+eU@&4[Tm28%mqqUkS(F+VDa#lB&'rlRAllRP&l460Qc,)MHR$jMh@$8Y4Xc'e`cd
+
+ZE2AUUiH+fK96feb$epq&'RAQeLG&lCDjmP+"Kr8k9#qp'eI8RPf[6R$dS+$UcqI
+
+ELYSV[*ETFL&j[@lr803qd9I2A#bi4Vei3*d[+@Urk*!!&abe0HTVm%44"i4A6JN
+
+c(2I!kjRl6a9e813DK"A6p(LjRZZGaGH+1L5SiBT[(6ekd2*ILMSXU(l)#m3QMDB
+
+V+QTG!r*NG#RQai#DNh4,l0&!Ie`dYi98Y1%1A$5hKP4,`d9cHdKP'LkD@q4hYC*
+
+%dfdLeCCNN@i9UIBNLh5l5(8N68qhM&4R`d9cfdKP'bkD@dHU+qe&XRfNZSqc10j
+
+#8Me*&ZNfNZT0hSYd+dP&ri-FGM6G6P,p5D,rPNT0`dQLk5+6'NLb5"HDe'$L)Pe
+
+X8N2bj-Z'$r$6-$NZjLGC)1lB-"jQSff@[ak%LJ[rI#%p2ddAGREN(@"V+,S6CI!
+
+I!!!0$3KRBbj38%-ZZ@0M8&"$,VN!N"#$BJ#3%4B!!!d'!*!%rj!%68e38Ne33d-
+
+"!+X[PfqV-$P*!!!'-3!!&UB!!!(&!!!&C80(jji!N!BMM#0%$L)UANhN3L9rV@9
+
+B`f#c2p$XpAVVCc-[`k20Y5bJ+CTHPScj`Z'!lmr*#EPaRH(ZcR!J!!rqMKG"q)#
+
+cj'G%46qffB3q8Aqp4R6FA83PM6`KUjaYD&IlZ@jDrY"pk[b&AZrdH*kFbb9PM*S
+
+`4Kh$c8Lf0bVe+Y`Q$amM6mc%*C1(jF&1bFSdGIlLpc*04b#X&D8[&6R%+-#6HhJ
+
+kX"#A+Bp6%6RGkB&kM%'jh$ZLmam[1Irq,r82rGM"5H4bh1ZB+b"Z%&-pD)5CL9(
+
+AP(4UUK6$!(lkH+UPFXFARF-MIHHMXf!5Nd%SZYRQj'pfL)G3N!$94X#(q25G8U`
+
+VXL'QU3Njk8[phV2@0Q92J#d6rA2N1["[!%c(M4X-8p,0IcYJf2lRBmD2c)*RQEF
+
+68m'9jqq*MjHTji&GqDp$kh501r9fqVPJe4iQDRS)L!)ELqiX08i#@40jpP1+F@p
+
+iC&))L)Qq4Bk-cK-i*h`cDlN1cMBUbZA3+beKhX*-&UD`X%ME%F91fHB3BaCC''Y
+
+KNba-C@(,"-40Yl"l,#c8`YCDf%#"XGD%F4m3'*i'k"iah[Ddam+k"Xd3eV@02'B
+
+bj'D90I9p!!!-q)[jAU2HhQ[NiCQC&f(Ne`JR!hlN1''4Sjc`)hcL5IK+f(@8(q&
+
+(1&Nj2XreTBI[M!0dGB4'MK01#CFF2c,JK"*1MNZ1(q&(11@5ii5EKimF*ja``Np
+
+#bA(#bBL6BpQ6jq5imT-m2mQ!dq2N'H&2RT2M%Nii'6$J,PF!#N#jGS3IS9Uba%G
+
+'A-)*8[#%!j-9'#r3@EpUPQ9+NL6$ldj*kVS6INIK@`*q'q$hGRJCPb,`pUJm(fQ
+
+3!#mGrdQqe$Nm22hkJ2cerNp"i3$m4Z62S5YA40V([V`MbHF@)QPT2IN@3@$ceHm
+
+I&dT3GqF9K,'&&8[6LKMTbQ6@-*%bJE#4RM,b'FA*'VC5`0BBdTa"@aNXM#)mU'"
+
+N@d@XSIKMMiMh#RbbLSjLT49GG9"F84)Q8QfN&![N1hK"A'V5F,,dJIF@+`iNJEb
+
+H-(5Nar84j!"*Q54MH+j&08dYQc,(ipT9I+aFqIQc-XP313&803UUPPD4*+UAIlj
+
+$U+jMAP1QUSfEYV2Qp4HKfZ#TYQTCT)hEaCbp+ZXH0"m5USfHDV1HbL4cCT@41rr
+
+5+d+eL4&+'hR90)iLRp$LYcm)e5McQN@UMR#&$kKqr%eHU-DBejbUCC-k+P4N5r%
+
+Iha+Uc5aj)kVfm*'ej*8Dali5ULfHDLah-l$Zfer1#G9@6l8TTf*r,RKTZ2#Q8'h
+
+MA2&i%MYq(0aCicHKfPlfDYLeJ3*FFEG3l@"HmfJbqFrdHU&IU+jRHE95BmQFkJF
+
+29)qp)93hX!aCGLfYP0!jSEU4HF9)-e8M9rADGfC4U(BbVVC66+8XR2Hj2RAmGk'
+
+kLDNk8`@p0[6F"hrG,e3h`kmm(BhDMQjBm@`ejDH1pG)YbUXYM'Y'5aD`-H(VPZ)
+
+,*i6A,Nqe)D1Y'5@UV@HM3VAE)a3$3MT+9jAGa)HI#%*E@9ie+jmf-PA9dY#66`Z
+
+[fkMA!l&$eZ3)bP996crcal6`ZRdT$9NG0S#+V([`rRZ&eae,A%dMGB2V4H%9YPL
+
+LfZ3B194,NC[ik!QKZSYlaE"deVc1$3[9(XVeFJIG0T,9**@'AVXJZ2Db$%'!,$a
+
+e+d2+8SES`Z&RD1(C`m,VlM*Aj)cP#M@ZlJI#Djp(U28`fl)VL9dKY+IXeFM!HRJ
+
+MVc0#YCpj6@!,M0VrHYh,CMQN!FBjl1ZVEPhjaCK)``"6,6JiU@@ekMjdmEEPI@M
+
+3DpXKj3pi+f`LFFpIUPrF058)N4X)f4ZQ*P5c1[&!pGhC4i@Ue2BCE"bRL&haLRk
+
+Thb#ZUK&ZK-Kc9k4Z-[QKhdaf&1KhN!#*#IdZ-XfJhdPQ)I6l#![SYjD'HXp$hdA
+
+f$1LhNlN-r4DbV8$I8iS[RSEqj#URqY@$9b3dJG1XG))%khUHJMX,Vh896Z%"I%B
+
+PFK1MejpP2[@,$LpbTe[Q%h#[hhai0BBHF+r-MrTeL9G6k!!IKHa1rmf2qMf,9c6
+
+d)%I[5Hq$1hVVq60(`H@-9fb&cfkb$BBDc1-Ck@@#jrVH%0cXH$@cIK[C#F&2Q9X
+
+[qpl(HTpEQ9F`KqVA3&iYS3Pl6#ARpIXMVpCP6[+ma`PkbJPkbJPkbJPkbJPkbJP
+
+kbJPkbJPkbJPk1MHKTlbJTlbJpqGlF2RNe4CD`1XDTfUZEYjDHE@[F0T$,KbK"Vc
+
+mA!9AAPiGS3Qjm[HQi+l-LraVj'p1i3&mcNKce1@eZ4pFX(PY@1(66rD18)Im"eF
+
+YAJ1K#AYcK92peXpVBfM#AZAIKi*r&r$U$"h)dkhp2[JI!kp0S3GjhdZZV))A!43
+
+jH4kk(TLQKF4pTXhHI!ITRb%hcX3KfeN#**1EI54a"'@Z8(9Dm%D@b"Y#qhm!N!-
+
+0!!PRBfaTBLda,VPM8&"$,VN!N"#ah3#3%!9X!!!I``#3"2q3"&"56dT,38K-!3#
+
+TY1))Uc!eD!!!@F-!N!B563#3"2$I!*!)22J1`2KbNQaPEr+hGEX``Jk!Vpa0&eT
+
+RDl*eSGZ&%EEAc@iGG+hAYBDRapHZd6ETQH'lV2AbpMVJ4lN,ck0G4lMb)fcKAQi
+
+*AeLhm1)VRfPGM,"Zi8pBG1%a3VYZi@m,@rM#2'iAfhjHacE,K"[bJGYB,ZcNP&#
+
+"$cqJ[fRG`SmXR'aMC-H6r-)AXTaNHE+Fj"HkN!"0"R[G!H4jITB&`!(!dKX"PZ#
+
+Z+PX+S(dCS&YGZI3,cN3L+P4H)V5R@D3p,54$JD"3'!j')mhRcl%mUJ)9e2PVUaF
+
+j[6lNX)ll!4,jajb6UrZK!hSTX[caD`$ZIHl,pdeVm&EaLeKG-YjQB6AKT)84pF,
+
+kB$+55%ID`b-4QF0T19ckfSl,d['15$X-4cTr0"2!dIR5%1j[S4JQa0,J4lT!pkc
+
+"EjcQ2ZmmNDF36,1DH)X!8($N3ihbR+mcX1GC!E!0fi)+ra)rCUL`#HU&V9)ke`6
+
+IhTB!b&RK%B!&4fA8Ecr8+8IBcr)4Z8L+$bmVaA0$-Lr)$3+SMf0Xkh!%1L(hiM$
+
+H56i!P'Q(V3ZXrmCRE,f[6f'0N!"Z$E6%fl(AqCL20Ka-#kRdjh`qA&CRACe[!5i
+
++PSiKjh)6PJM4H$#5%&U%HF#GqF0F$MM6fH)T68dFSQ!hQ*["e3hGME'TS#e`Fmq
+
+Sl`'0qRTZMfEcM@b8M`(hV,a,kqB4N8iZ[4Sh5b!9ddQpT9YP#5UK!NX`BDbr,"E
+
+!TME)X#08Bm,*$)fP2Ci@G1bTGUbETe@@q%4QL60h[2d5)BQGX-U5,*6)q)99'NX
+
+bP3a1pJZTH#BC&"!P%4'5XP`!Fm82LidDE@#h&eejC#m'cSQd"k1C&S(CD`*"Va"
+
+S%C+TmmkE6aJ*6S3kTd8)4GS&PNjQ"#DY1419T&!JQT+cV-0*5@'9$$5+K-58Y"%
+
+N8Ea'&)q3!*!!UeBZ'qd'!&14D",LQVJ'$qTI1DUU3$%0cAD!e9HMkl`KaGAASBj
+
+TJ#pMhSb5Rq0c+LJ3l3LJkD2dcrJM2Q%3Kh&mZL-JR(&m+L$L-)j29b,%B4br8)j
+
+X!Y$j4ZUh`)[eI!A!R(d!4AHG`LH[d[f@re6*b2mAI`)H5F0aI+2XYq2iC)+N`6M
+
+qC$b5"Z2ij,N%KHI*24K!$k@Plm*Hm'Rd8-bci0h@*rK6m%JDM[-[aZ1Nhq+IKNH
+
+UJA&mE-V&'KM(2a129!2Mq2,5(2qIrSHmNfTSR2rTH+3D'XHRfL81irM8FE,Ep4r
+
+eTUeM[5Ra8bilkJJ6f!)lF0e(0'p*Cke+2Nq9ccEjh#UIZq6c&[RmM(3ZV*!!cL0
+
+k&5l"Jp4$Ilc)-m$9BDMqeV0m$l6LhM(EAX9A,10lG,aR)2GNb6Sm29&b0@CfmMd
+
+&Mr!pHLh'hX&p"qiPVV#h)jIcaN(YAHVY!-im,lH&lp&Fc$pX!KD$+,qKqbMQh",
+
+@BjDAX[M-KFF0&bH!le%r'GC@E`LVXP9mKXdeG)3QcED[U18Vq4jY2c-fD8XFl$a
+
+Jb0pEdXPRCYXVR!e1c(f%qF`GKAUQcPT3T6E-YjCF2GYHhq#[aqa0'*p@XJl4r*8
+
+qM(Fa(e1(MAb2DUZDVTq-SD2mJ+kFAj*ldAQmX-KFQf"C5i,E1fA&P2jHj`!8*c4
+
+Cbq,eU+LUqmriLrQ-H$8"RJ(GXC,YKXYCKk(M!EcN!3MV-HG3b@DB@MEAd"P5,9[
+
+2CjDYplkH1ckr$1D5aNf'jH[,p0ehXaPCKe@(eI0#11SC',UQT)X9K3qD(G8hK#c
+
+C@GQUfADhU*AQPE#2X"A&i-9KaAUdDe$"bpQU)@mfJNfL,U61YQ4RBFiKFac+[hC
+
+Y@49Fi(Ye4UjKII9Fl[b`UM[(Ca+6ZhF[@mq`0Seer)R3*#Y$$IcK`pPc%EI6FKZ
+
+I`IV"'%bLZK'Mdl!5jqQ+3J!feU'k*f(FZf(EGY@@N!!CGAmMqd9@CrDD68d'jf(
+
+3TlQV6AYhAEJlGh4$epjV3bSqBiDXKA!BPjeTVUYp1pI,DPfESAK1"2eSD[B-elh
+
+H#"KCEIFl0K-Um0E-CFr[,$HC6Hhc`fDr-eb-HmN5*`iSE-8)!#TL+mfKpUV"jrc
+
+$X6fMXIlRYZ5'5$I94YXX-&C(`""L$Dkf)VmVe*%)GZr'mh(#3i3EqlYKNKblRf*
+
+'9fi`h"aV43`ejERI0DPfA"MDB``XX)HHa#bYS3h1c!hCcPlQ0+mDh0Yr`mEU8Hk
+
+YrAmUXCIMj8SFBkA%6iNVCjRI%C(IMj&E3@l3G[C&a#hGId-rBQbXrT)c0e6q'2p
+
+eC)89`[fJmPd62,qrh"5fBCA-$%rb1d1R5hbj`ddQ1G,60%Q1l'T#EqB1)110@)h
+
+%i!95M+ekEiM0HfqSHM1k9UQY&%V$jTQPB&VZFVm*4FmG"[Acbff$#qbZ,a3IKUr
+
+B"VZ2A1J-[B%elK$paa&k8Z63JaakNVNdL$c1fP%+A`QGIJ'bm6iH0ZklkX(0S"E
+
+8jP*3Mb,[3pbE@&fLD'2RS@ZY1`pG"kj1X1j#2R9*X*QX*TAMbYcVef*YX2)T6FA
+
+Q@D$Hf'AE5@VBGSP+2*elSqN#9T4Gc"`I)"SMr!P3K8hPL)Se--@E+!*#j8qBAdA
+
+F)f`H'*JMT!TSH@V*`'V2IZI1K@DpeEljYRXA2YJ9eU,IcfjLaVQJjXS%LTUELM'
+
+UNU1Q*M@HTVX(FV[-AA`QqadqFr3i9[JU81PlSB$r%d$A3iqhZfXV+KG!GjBeeU(
+
+[-cfI+9deX0(XqqDqeeCrEqGcqm6iUPf$i$#AQd`B@p0rSjJ6NR2d'hX'fX5-"MQ
+
+MU,pRS%(-F-NCDZeUk[$*BA*h$2XG9RaZHj-D6bq3!1YJC6AD61@QEFZ@lXi09,[
+
+#3r`40LMRE"V0'C!!FecYKJh1Q(D[`hN%90BLbX@@Y!c8C8j3QmY!ApD)[GhVGTJ
+
+**CcApF6MTA!ZjkemqUrh9AKG,PI[cVeVI+q#h6`$QIm$kKcXmZ"@c&ph+[pbaRf
+
++-2[6I1-)JqV1YQR9UpZ-&Cd9Uc'6i5P6JCdV6"8c-TKV%$1eQ*@af2(L22GJCe"
+
+VaTDFcfaEffcXh1Pef-$Pm$Vic)0VQmqbL$(+mRVQJpGcr8kVcZZakIJ-9F5"VJ2
+
+A)XVacTfpDfd&ZhSY"9l2XleH6rpD3Epa6E1D10FlQJjH!G34SPGS&qM3*fC3Pe2
+
+L`2L%lVY,CV!*T39qcpXH[fHHVQRU'%UAhk2&Qk`VKaD[,i2ZHk`cX2[6K&iQRrQ
+
+lbPXmS@QX)1Y!&RH`da"Y"8BfPYDc4GPC#3lV4AhlG+E(2&HTGaMM!VD)&65CaPL
+
+Dr4lQB&J09`k9kE(,mhf[0f[T[[2#[mfpH2-6*6k4bk,U5Z`kcd%Ia$UcfEZ2Z!G
+
+1&'%PEF2B1aKl$'0hBH`R',X1BjX`pP1-h6AD-aHa8TJD0Z"T@[KdIJ$5L*0!R+1
+
+)NmCi#mDEj(J5i`fS4KaV[49[Y[ASjjGJCfSIkdaR)f+)e-#cLpMMH4iTJQFE+B$
+
+RFiN4RXfXNFpBZGXAc[3QM,G2Yh*CMh@3!(q8lFE6#ID-P'YZ"AefKT9M99N2Re%
+
+Z5UJ[cKd0UjR$Y@%N5eQr[bVdDANH1X3[2[#XjcJ0%Se1!jKa'U#f[M%BE`p&`TC
+
+@-mfEF*1J""c`J'Sc4b0!`0Q1cH9X!e(3aCl!)H`k4qIhpfYS1)*',+EMMLJR'JM
+
+*XAVRp4,L3*6EFHJLENI+bThcfZ@BBX$BV8U1Sr-@+@iljX&F'M+D6*J-'5#(%1k
+
+[1&EhlT'("@L3!%(&RA-a6V0,2#9X9%3D8*&8fT'k`V(k5V),NCZX$kh*MY@GDYV
+
+4Y-8%c[bAlh!l-U6&69c*e@N4Mj-C)C2d+XbiMLZjUSJ3--Aq8HQ-$[R0RcMaPa8
+
+e&lLqlpUj[TGS[iMVqri'VZr9AUl[KhZi[J-YA0r"GUl[d&eFhq'YA0rr0h*pEml
+
+RqYlHa2Ap"212)[Ba!pGh2-6e$Gc+p3dqbr80[FMe`hbZAjA&I4IA2aN0'##DQ-I
+
+F0B%8$M1bX*!!6V&dUi!$KD&N2-DNDAZFBic&F2BrKF2r6-!j%"D+4)8c'q,aD,f
+
+3!-3j51B9SJP@RdlLA(j+(8X++A@L25E3BD9ki@,HV9l@i1F0$6KDbP$RC(bL'2*
+
+%ikP8)(QCZL15MXe30%"dDAVbI)DMURqBCV&i5b4dfDrbrk!LN!!@@#SGL#9B+*j
+
+N3JH#Y3HLV#@5r"fhhq@IS5Jp9LM&BLQF6+PSMTk2cbS%9c)KQ@5a90K#Sf4N5PN
+
+S5M[3da4hiQK)k+XiA(ND$YpSYSe-m)LIZ,6N5rL%!p$M"e)Z2G@JJJ8FXU,((EM
+
+pQ)@$C4*&(*ZN6`SqKSGP)q02Q+F@[iqA@RaFJFBHbCM4qfMF%h!%89`D('LN6e`
+
+k'KDkIh4i5)XM8r4*4)JcM9hKZ+)%Kcj2Rl4%aj+pAcSALTmN,qQmF&6[3Z`$k*0
+
+%H%M18RJEF-b22R&0qM&+6,@P[&-a!BIik*1U!BGKe64B611lY)`iBNHI9"S+Ab9
+
+l)JjKd5HT3V25,H+!P%`9Z`rkT%9kNCS1THY!pHQ6Q&%@$8)T99L%Sfhd5H*hI$J
+
+64C28Y,C`Djl#m$6b!XGfTmrR*X8$d@L`Y6QkdK+%4i(E8[b59GP&,"cqQPC3ih4
+
+MlA''N6k&X1iVfl4IfC%6%hNG3kaD8[4Nmd+LGcpXR+[Xb-XNFZZYEkLS`Q4G+Yd
+
+5L413!'S-T`$1NR'U9P55`+R)+U%aM8!K9-"b-+[Xk$GR5FTkh)hN*rJB5@-L'EP
+
+%j(6IK+GdbSlH-e9"XT!!TkM$335*3-%BFqd`miD+#P4)M`VKJ,5STAS-5DFJ,A9
+
+lRF6mdQ"V)#Q+K-c,[YUNl&M9XNEZ@PkXmY(k8'eCj+P3G[5T%69*)e+cY5@CqV"
+
+#$%SP0969B)9`fR3N*L#-jAfF#50kqURL8%pU-)M3+FmipZBILqkTH!E9YJip)aj
+
+%`mKhi"GMeDhkeqSZq1IU*VIi[,SeRcM3"dM$M['C$j!!BhcZ!m11mCN2&2k,$aK
+
+qi32[Hr5%Rh[d,hX-I&T(k6&F2UIBBc4(!m'9d93k(d+2NBr*-djj`D*SpBJAZ,f
+
+9j!86F'3iZ$+9LDAqShqJf[jh,cLPbr2V[SPKZ8BUA*j'UT'@jR"M,2UIAFerUC*
+
+hbU&Hqqk24KaUB492qKV`$C4!&+Z"V#$rQ"GJ24rmKPrCa6X4KAZ0c$d@5+lmTal
+
+hVejS(qNI[*91V#iSP&p#b,2@2paR1A6E52mJe6FBBMJ1dGJL*2+9p3qIhj!![Bp
+
+M('C8fB"h)XK)5,I&%TpfThIZ`BHa&(9Vm2+9kL#QA,kQIZdYiIaLYrARRVV2f2q
+
+YNG[k'UGr%8DeBN-EK0EmEAlarTd(p5,rIHIa&j&hIpETLXk#R@jbC@-b,9jkj$[
+
+SG20dc3jaep#MG,*Rm*9,kClGd#jFfLM2Qq@TmibVrRcNcU2@95h1CX5Efl"&%5r
+
+8mURGV@U5ZdHGS,k4EYRemG4[EPCrFjZ4PqYQYFV$Li`LB4cI%5Ak4CIabTc4cV5
+
+Z`5pfTSPdXM(B'Xb,d*RQlCVl-6rbfNK(iUpddhemB9))4J14@"k%hM42efh'efl
+
+%*i192U1qBE',qSa81Y2F(%qfjbIV-mbRlM2Dk!QiiGN-X@CeBXhQjHJG2R%#l)P
+
+%*m$r!"'46R)DGS+2k[XNTp(qiGGq@r81$FI)IYZ`[)lZM!cTba)YbQKh2VHq(T'
+
+iYATPahXMf583L9i#-b!5'SA3JP$LMk5FV"eL5P&e,)!2AM(fqq[&rAqqJEX3ZJ0
+
+4GUAcq1#I[$MlrpXrj3jb$ZiY+2BkkdRM@qKR3r"mcb,mia%m2lM89dZ[Vqh!-,f
+
+QqNbpVjjZ29qJCq04M`2d!b+N'UT5MqGLqX832%q[Aej$mA2Gr%)2D,J,T!VQVUK
+
+`%6jhAB9V+HAI4,rjJHFl+Pb,m4eQEZZ5@KrPp5aF@N9GqC2+ql1S&YkPdTmG6Gr
+
+!qEV`09U+&4c&223NLQNk-DpALZNdR1mDqVXNM'QAB`crlBKL%mp(M*G"*FCZ`&J
+
+DZ&cZG*Ki-f,J@mmLMhX`*R29E-FB[Qe,XDNr4DlPFZc[1GrDKlkqQYkKeBBaYUl
+
+YEqK(@E3aM+N[HKM14ThU%2X*Hb(-`McNHXhpB"3j2BDaPJB6I!Ne%&qEaD`r`V`
+
+YU-G"k"3ar)MaKKaEKl'$NQC6hd1-Lq4B$Q0G-XB+e-BRajCJ,+'*V3bd4NrqAp,
+
+B[bJT[kddmXG*R(e#AIa5)9RRT[cr!`!!$3!*Cf0XD@)Y-LkjBe"33bkj!*!3qL)
+
+!N"!0"J!!,h3!N!6rN!438Np+5d&)6!%!UE6L#+X`0A!!!#*k!*!'$d%!N!43[J#
+
+3#1j"$F$iCXbcEQ9ffFS2dS@*jbZl63NYVcACZY$0##1XPDZ$V[@ke[$dmVQ6K5h
+
+FYGEmE+(Rmc@246PGf0D9hF)@VNAi`VhS`KGM(GQA+lmmdfiI)f`c`Tq`63P23V[
+
+Y`VEH`KHqX)9f(@(E*!Zrf-)@IZi)AhKXi3[E,M3j*432"&!HrHaD@&$M#f(,qq3
+
+@XL1hN!$"3Rk6AcKCb%+1%di@J&@""TeG+a&(42abSQ*m9@@VL(4[%29TUPEGj%S
+
+NfN09'd1a&"q0T8,*F(-`0#85E)pZZ-eZrEB+Z[80G6A,A6ir2'5jYd$i*mlPdrI
+
+-@8-1XA6I6r6dUG[h&cAjUSAPI(dbhQEPDb0*+mqX6fN-*U1*9$3@'8GN$c0%(%0
+
+GelfTH&Fd4Q0)jLrR%MNc2aM&pcf8d``Y,Ak!B(cHb*GQH1E2Phb'JLQq0Yi5)P*
+
+IZ&DMccNrDX`mDiN1BLbSE&MC!)B+3p!!(FM4Z3"pmf##5,64Fd39&fA9Eck6N4(
+
+q-Kr+TK`qGQ`-&dGPAb51%'Q'J"dB3bK$iZYMHPIm%$'QJ`j8f2l6cq5j@TmTYD&
+
+8Dh0,2)CCjkGqG*&J+Y5CqU@IDmIQUUrh9q!`X*4GG$59b(1#DBYLrXT3Hc`B6B4
+
+D3NZ)Zr'(SNLFq4ETPX+0#01J@-c9Mci&E"ETe"lZK'B2D682F5pVpcl#6cM0`cF
+
+VIh2RdI%LA6N'$6l@jXi1I@kfp+LX3395@i-*Bq1p(FdBDS-m*N)0#&FB@QXXRJV
+
+TqHr&d$F[UDca!YiDjchaf-C3%T1`bTUFNM26%1V@@T1GbH#dKP"R2*d-KU#5L)D
+
+5FVQ)&NXr0"XEY)Prh,6j`NN!Fk+aB(Zk*F3lDTZ$[P"c5bMC1Arq8UD4i#5T15f
+
+KF$3@iP2*G)M2RB8&#LRFh0iTXfaMT'5S@aDD8))aK6DZ*"9[2BV(P+51c4hG,L+
+
+c53S*k44Xa8Acmd49U9R$Xk-p6,4P'e,Rh4bZH3"e6"(G$Pjab5Ikh&MNk*3JKBH
+
+am`[rd,p4KJ)IdrpGAkQ!SYrdArSB+K6p(4q-kaYR%DeiK@MHTTrT+airpFpf(!c
+
+C6D6hMrH[fSGq[SpSi@NLdj2ApC8!q05rrM0pH5A%p,FGr*AqP!RpYPrTjl,kIr)
+
+Mrc0p)kiXJcl9Cb(1%'6hP`BRQ0MP'EU4U`lF@CCrSLp0(%#3!"HAp98B52*lSGq
+
+&ZrfkrM3CD5@kEp'%2R+m!*ldPFM#f(9p0R-`C#rdT5&)cLr`#Kk#rMULrlIXZ[j
+
+d'6P$Y0N+!(Y!54rDdc&h'$"brDYqB3l4$[hhr$0$4PE$2eXNb2ieb2fErJLM)1T
+
+RZCa*(rQIH68r2Xk[*I+#iKreEj!!r52r-kc1XRmYjSpI3ai@B(RaKIqI,BSqG$#
+
+E'MkH69X[ckB'iJEe$Qi`RhhAFB-&cq&lKKZFKRc"-D9m50)#'Z6Fp%2+jFLffS0
+
+N5Tj%4@C5"GI&cC(ZFcD,h$e838lFZmM*m-eX'F$dP%A,,mqff[SF8$&N-KPiM91
+
+9NF2XSa0J@f1fH(J8"hGPCVYkTSRLJ,V55r6R486P'%J,"U5PdFrVi(p*UM20Z#1
+
+AjGIGE[0r"EdLeqdcjp[mNSplX,Y)hCYJ5aj0I@@G*jb-Gm65lHf-'iiR1d+aG!I
+
+M4Q-YACfKpTEfZ,40CpQLY-XkZ5B+lNFp6BS(cVppFXHLm)JE3biI%jRZ4TD29iR
+
+SY!R1P$QEBbjeBD*lqi'1GccMbIje'bEC1H@a56dI1a@*I@9pEqBF-qYcdaaAM`b
+
+5FjP9B(QLVT*e4Aa$'kXN*T*FX[j[jrbLXcJ8Me@X&Eh%AL-JTT!!Gd4B3#S&rjI
+
+6(0UBDSje*M'BT4+G-9BhC9*@-5jcH$[1@!XpJKl'$ZGDCHXmRb03ICB4reapCC!
+
+!(Mqj("6&rGSNfp+B@FQGKfZV'cfXb6ZLR8&V%2h"l5[mJ8hjJPR%eT0&kPUA"r-
+
+MPcHq*D-)FI[,GTp4[[$$5jiqJ&BGP+G#UkjaI6!H#dFM9NbNa28pDebXI1(,,(N
+
+ED'bUV!CChjPULFDCN!"U8NG00mXke@ZV@1Ge4VY$ke-3#PpeT"PAmJT`"+9)V,N
+
+pTl6IHLkVI,'RZ6PAIkpR2HXM[+GCRdK'0dVZpqGr6kpmXC'CT5KCd3'NL33K%LA
+
+eT(2pQ21Q5[3dR+GDX116UUkC9$)S5UXm2KGcINq`Y6NTP421bhiMS(ba5j&Vj+N
+
+6f#aTQ1JNeElPhNVPLj`GVbDV%DYQDdZbmeS[j5Xpee4GLelLG+PS4`JbeUXka[&
+
+k0V$H4$f6H2FMHFHjNP0bI"Sd(Fh4'2DERk5`R-%10TmaEFjrI`$I68b$mrG)kq6
+
+aHBBP*&LlQC0%8Xl9HQQfr9b!L@&XcMHPT*eJ*QI3,1Ibj`$iNqZ&q@YbPJ1Ha&!
+
+Tc3P+,rc(E-IjIaGE%9QEH@4l"'92bccba&FiN!#)&l6[jHikPAbI*GrYmVe9[[I
+
+)phhbr86Z2U8bGeIk!)'b%TGV)mAiNDCMGeGHc9GI%IUT&GqZ"BjUSA+ed+mA[-2
+
+LXC)(FAZaC"ZB'D&IrCc3Ep!"HarI&r!YF8GmAD,SLj2'YmVA4CaPLEK2k0IH*6a
+
+V*Vk$fS9GI4I"H5aL!-[(@%*ka9$HA3N5qMA()VUDA4&9YPT)mi[cZX*6&cM@eJP
+
+93VpZN!!h"R3P6RiqmI$[+mN)k3@15PH6#pcRH,qPD`T@&9NVUY3'[UeNf`)(%Um
+
+4l0h!LdSHK&T$P4pi$qrR04'Md+mkS'(0E3aI&)EejF*+mAAAd"56T5l"Ckd*lZ6
+
+dYG-("ec$9*M3CUehlN4&9Aer+0`PT+AR#H3GeRp3FMK[%pq9er8Y223JLKM!HEY
+
+N,mdU@jbA#DY@la65UhIkhK'(PTE4BPEM30kDR@@'[UIiiUc6TNIh["CTp`k2hPr
+
+5`jXLjbc1QSI$eZbmE28#KdHUPIB[)RkQV95-AKqV@,pZ+bUiLHmHp@@M''(eB8f
+
+f*6X2R,FYF5Vrc4ePeE6)rfDaf,5cCM&h@d69*`VTa,5qikYhmZK0Ble`+6c9aU-
+
+'$C(cf9ZKQl&q68LMIi$490Bh%PU%6PbL0f'aB1Hl9(X5aT1l$Kj@l3YE82GhXer
+
+JkbdqLcQ3!1Fk6iB8YmemmZL+iq,&A6dRGi493YT#@5[6iERXA%YphBr&!El1[CF
+
++&dD44l1b0lLIpNA*b0Ie[@mhS`,[c9hpkT&bXm8F@aUa0,JLKIL@V(3KLJm!)8*
+
+&l+8LDUmD1G8`KVdmJ3fHfLH1XVUTHZhcb&J6TE``hq4Z-c@i`ef*B0pah)HB(K3
+
+H'HbMU6,f$BBChH*)C%0(+c3dM1IjL9Re`SV`bmEQ#NIi'&Lk[$Dk84behl,DCHN
+
+H16RiF'r0K2I@`Gr,ZCIaFJ8(9XVm+EKbPreGN!$mr6@mUF84qbhVQ,I8i-1$d1L
+
+YqD*,(#erAVJEVY!Kh&Y92c(6UfI+c4%lZQ4ZC'U$+c`cjjFl(c$,5(pJUS`F$5#
+
+EZE0`h)YZC!jHBaAMZcmFjCGm1&U$M9+Ne&j+T4(,h&)bVh&lrSC-Tmk6jY8epT%
+
++KrZQ`[0dKhfNlm)+9rKGp,K6bKpRq*MNS4mHqT0LLL3I0lp35RH%Cbk#'pph)mE
+
+6[h0S,fP#'NXTD5D86d2hbhap`Y5EHAZ(lFME$j!!1d1fSr"6Rb5lf@C@BB2jcJl
+
+d"Pmq29"SQ8HDhKll%9B0qe'T%Lq*l`B@mDEXREcc)d9M9,K%USLj(+VSJHQqK)Q
+
+BUR$*mLCd,r",+)phKPA01S'YCFRQb(lRkmXX"TYMlpHHARDS*k*$hLm)m'`$`C@
+
+&''S*&!*9bDJjS-&YYQGB2'VT%G,Cl`MTLd2Sm'j5'3C),I`f)I@3!2%1,)HU+UJ
+
+[bkq[4qlc"L&GfMhFDr(rrZQrf[,p)kG15hMhd4&b@XV0CQ"E"aq41''CBqMY(fk
+
+6'%db`c6B2p`N-G`b3k2E`LC4PM$L%f0jKiiA$`FdZ,h'8JHGYGjZ,MFIA,hUZ$K
+
+Fiik-#KIi%CQcHi)c,(2FXEaGVJlG5DIV!UPX*XE&5&T'QM)AD5aPC#KEMpRZ(3F
+
+@d#@FcrhLGd[T9XjApG)IRkldZGhZJ5-RYrVI*)HP'-lr3A8KTMck#[J2AZG[`VV
+
+Jha3@r)a[((G3NfNVUYR5CUc-9'i"NmFYABR*P@C*M$5iH4*6"eEDLVfl+"l+"(8
+
+@M14#qZ$f$FE-%Cr66QkRcbQN$fhIF,09`KM,jee+2Zp$4fakRpHZ&p+X)mlfR0d
+
+"PD(-NB(YG[A4!D[DjheP`1FGh"ibp'lGS''H'jf"FrF4Q`L4&ES+2A+LQ%dj*8l
+
+JqAe2P46cqDAU"Zq2[3hH*IV!V%Q9RJD[$Y[IcD0hlLbM[MffBNarf[!E,'IqV1S
+
+aElL)9fHGF2%%2`0UDi(dPMEbbl2c%Kck4I2iE0i!RV[80kDaL&r1U`2Q5CH@"Lr
+
+[j0%0QdI,$*Mbr0mIb&Vl[VlL6mAA(hfaa#pj@9j6KDPc$R)3I@Chp&h`$&mbSC-
+
+1!RXIf22!RJ6fYm!H!,BEf0m"Hh*LCMEaT63VNSGE8@5Q-%`Tk#5JFa%k+H!Y`!-
+
+bRJ6HK'V%dHZYf,SBN!$R'c'C1LBRd`93$,0Ui1jQlR&I`LU#Zje9!2GEQ52F,Ia
+
+k)@hM(PmfejF`2MlEaQ@pYK(Kfraah#la*h*F5bXCXX8fMUr1HS@dXLKKFl&i-D,
+
+KRHjGikbVar'Y9la$l2RB6pmR,LdS'+0CVLaC,H`"dT@r%Z!F2cScr3P3LVMhU0$
+
+RDQ6lXmIBIJ6h2FZaT-(pd#Tr(GX$[`!BEfIS4+1rNEepHBe0*1LCXfaR!QFkYKh
+
+"[C!!E89`RpfiTTEKYhU%C9l5FSYb1eVZ[NShdqFHU(5[B[`[Xmd%lNp8ZZr%``V
+
+Z`-Sk2q2e,eY9c6DeamCH2MPq""hf),AJ0Z`'mAk4BHU,`2"fN@(D$$6B3eKJHLe
+
+ijh+BEJhfCmrNX"X@BR0iMP35pJI3b"!RLM2TKUm#`jj4mR%B@%X1Qrhh`&k8X3q
+
+"I82'4(M5h,f&[F[64H#l[1e2f"XKA3FdhPMh,0f#,XX(PR*-SARJ23cXC6*+rTj
+
+($GBeQHQ,U+Ad,JkXA`G[(hJpP*%d'S#PC1a"B'rNDPDX"RC'a[6!hT)eeX&I3XE
+
+f-%rDMYpUEQfrmLafmJQYmYTfr+%XjmL[Mpm65YCl'2rr!!d!#'GMG'9cG#kjZ@0
+
+38%-ZZ3#3%%0D!*!3(m-!!%+&!*!%rj!%8&*25NY"5%`"!+QdiJLV-$9B!!"5l3#
+
+3"K+K!*!%$I3!N!Me"!i!pCQCc1abX2*Ef-,&mj8EA@KjV4fRQfkf--,fZP@[Eld
+
+Z$dq2VmN'A5Bp-hbAY9lHAJFXfQdl+AG,Z2)ME*&GEJRrA-libQIDl@-,fic`*fc
+
+6K5HKhAEKE`YIq-)mEQiRK(pXXmb@iapGq-+kKCfFELT3q1c,IZ&ZXPf1@pl#b%)
+
+ffjdZC,)F@FK#&m,)B+r,!D4[CPq-FBbaqZ@-eH&@A,@%-I9,M(@V+THFE3i'I@,
+
+PFV%p`R[E)f,)lA5*'SmV)SBMaKm`"H(DkkSAQQdeb1%*lP8%I"Kcj(3rX&H6m0M
+
+IZTkaqjrj`UCT$PZ9X*!!V`m&fSamV5GNj#ReR!CAb"Z-H0XpDBqF`ePa(%eGaiT
+
+)S-2EcP+HcTr1B+bXmm9Kh'q$6Mf`X[$"KF4R$RhYV2*CXk3m49H%V`fdL)`T"cl
+
+J+-2j13Fpcq@-E8&E8'&IE%H%!Ne3,pZF#1HDf2Hf""Q,&l1('*Yr8%EphJ1GXSF
+
+r%JrNr)3rGBV*(aq@mf,a)FC8Kq$ER2+`6KCr)B9h0"r'+0,%0Xm[rQdqSqFB2cQ
+
+eBU69f4*S4krcbhc8LClZG$iIR'*cIAh0I"abUXM3iXkAEq$(ilQ,49r!j3f+,H)
+
+maNhp56c112ejNK@"P6JkPXIB&fjK8aKcR!drZX6iG+jqq&li[TdQiqM4U(!CR@&
+
+rGU+(,&FBA8QAdZJ+kKT@q*eSAPdm1Mm9!Sj'C"RE!a%aQhqm(IAaK-)B'-FE!ha
+
+jS(fj'%,(Uc#'FK,*f-@9@FC3113DEaI$J@M)*3)Pk"9$i'!+Qm`pccf[0,(*#J2
+
+h%ZcNS8*JE#k(6ij38,[0q$[cVaRB"FIjhRDA,pSLmUCDTmXQ1P[%8(M@V%X))mK
+
+*81HhL'j[ZmK(3P'46jb,ab@$h%jI@)iU6J@&a*8bd!J5%NZ'TC%NDKY",5%K9lA
+
+%%1kQ%f8Z9IE(4kQ5X*9Mq!UPK%dirih2+53-k[E(m!QELQ!-Rl#ccq$6B)6Z-I`
+
+FQ(52iC0Hd6f'2a&QlKPm`YDG`5GX%V)aI-*'%r+rq)3prJ`qB9260)C2f"21i"-
+
+feI!B2QRI@@I`#A[5'Ic*-1NH`dIV+GeMrFY8Q(52j8mG(mdXar#TGUKe(X1R`pq
+
+T1G'EYSlfTT4IFZ446jL-RfpLA2G!eYX*@kf3!1dTXPdLfkfbh5AE'fAlbB5G8j'
+
+`4rJkCZFXKT(SUhpj-0jKc0+KVIl1dd)2DmAG-GY8*93X&AUb"HYJr,'#0E!H,EJ
+
+1NCe#Mr)KS8HMKZmGh)rJ,V"iE"haZ#h!9,BPYJl''HE&0`Sp@9F+$qSClfFqB9h
+
+h3F6FlY%JbNC43[653pSVJdcS86hQ89H[mbKL98+8Rk[YF1I00PeH*e3+2HTqAYH
+
+N,LMMCc%HqGX+1SASE&1&f@&'l%0mMD%M4m1VBND`e)EiiS,VCTXD(2B'40m'rl5
+
+#08#c9pE!hmAAm#U26ZK4E&E48%VR2LJ-CTF+Lq-[Q!rPj"[UJRc-'14f6EKm3Rq
+
+[HC!!63aQaBb,eS*44IHY`T9#9"TN-1YJpRX&fl4AmahDMZpMp-1B4i1Br38Ef*5
+
+LZGT1Yf,T@L'kG+hYpILK5iVBA1+i5A[CfL*0plhmp&KCF6DUCir(CadF[VkJLmr
+
+hl$189GrN0XCQaUTQQmSPVV*HpY33GT)apN++X4le+M"i0Epbf"EcSZR0GUYL,E'
+
+CL0P[#,$5,pp39-AQe,`b2HjB@cfAZmLMk)i,dH$ilTe,er+S69fpF0LG9mb$!l[
+
+R31a#i(BDla#LU"ri@"l9MH5GKNUFPjh[CUb%le$F&p6Y@VGPQf+Mf`$HhiaG`0F
+
+EE!CpNpCmJ'NLh(AkA6XZh4NrZ+jVe`eZK4!eX*L4F(JZ0X03ArHcH#pICpR!*Pl
+
+XK4j0L8ffh'rc-KeIere1L4i-[$eMkE2E5r8'IIXP(S2Gl*Q)Zf#a'@X,Qq&K$)b
+
+8&-E"[@,S'A[+pp5)VrqCMI&KiNfa[Q3Qde9lQGE01baYqAD,Zb2SkYi*qa$K!H(
+
+QrQk@*rZq5ckG*6lNDIDh!N0&FHA[kK@2A1Tq5ZHFEh)rKLLeYSe0M3qAR,I8E&J
+
+jY+[rT[A9)lQhp[p4)R[CAjVd`eG)q5Ap59[1Ed$+lfq3!*Xb2P4bhK@8@k6rTRj
+
+JV+rq[$NqA2U`m"9NK3VKAUem9mqHIDj8lbP"PFc`j0R0lNQ*I,N$6AVCdp18*hY
+
+f0%'EZEh)H$fUN6,B3ica+pmIjZHp2ebp!DT9@&,)#Mf''B9-IjQPr#f@rm`"TRV
+
+fXT+Kq5E,f4-2X#q@$(82A'Tf[iND,j2dTmcpQ*4$$h,S#F8M6-VMR%F+f4IGNqB
+
+J'pZ22,VGhpLkJDP%PD'3!+P'N!"h!rF@[MkB[ljcr`h&frIIb#bGV(J(mUN2X4*
+
+pX9j4GNhmp4Y3'hcTK+D*KTP-YEkVC$Za8E*$BZ+*q*Y0FrMmf#+ql$LLcLXFCJU
+
+2[K5SU)%*YQ!q)e6KX1%9i!l`mjL@,h-VR'U"@M4@E)Vpm1i&"NfaDF-GpbrBfZ9
+
+43qpR0r'kZ8c&&BRN0640K&FKHr90+PMRPJr'GaLkK'MXKd,di#&8q%UQd23bTI"
+
+9"Y@$aT[+kbSUjl2Z'0pB$phR08+dF1AJHN20YhDrGZhcfjrC,IPAlKKLCBC5[4k
+
+q9Idh5c&Z18Dc[QH`6BT`b"(jr6f$$LR#)NHSe0H#a(a5Q2KG+Ee$aFHh0DPJl5(
+
+93@8ePZK,p9Z@,YNC(kbfH)D&!Aj)MVPY*'C3MV'dDpHCrHTGCHB"TLM1TeLdU%9
+
+-9@4Q+N-4da3eSVGlhF4QX!,1CRRd4iAX3Xj@qF4Il+k`@5b@hZfl9Y@m`Nb'kFM
+
+m(e%[4TI(rJ6aDdl'AmecRb,-rM4HPmkJZV0Y@[@eEEU+cSTV%FR$LPDJFf96T)J
+
+SBV95T"T4851Qcr(ieNkAfS!@ABKZ@GfXkpaZ+bYKPM*EQ4$GZVVj(+2NSbLEp4*
+
+QXhjcHh'fc9U5,85T)[CflEd"+)FkYrHZ,P(Zk$8UEGDRHfh@rY@LC[fUCKAPh&$
+
+@Y1rVM$T#D)9kIMCdBMTe139Pm1GfheX`RFmY90UY2l2DVI1bQkD-SR6CVHVV',Y
+
+QH0(D)YCpAr&dG(pClTG)CrkkmRDVHaU[M*8KLl[iXi"f16cV#a[iKE'C33leSVV
+
+cA&k$1%ZK,B8aKer)+j[dSeNDl&DqM%FeA$0FT%'A9r0mEmcBIIHPIa9riGZ2&Y4
+
+)Z5bXVN6AH6jd%(9@BZSH+"mmR)p+fJ,I1r!p$0mpm2dGI$I#GaYmI`rI25-pFcj
+
+Ib+CiY,#QH5B*Jb`#R#"`$J)R!Rm,r%fb2`5r!f`%81ZYQ*CVS1I,dCQD4M[6f8"
+
+d%aZ`,C3pl(R%#1`5BJ$fKC34E!2I+%5,Z6XAc,!&GAHH@mc&V-9$`JriRE!1mdm
+
+QBJfY6"1EAXca96'V%%d15UJ[MKrdU2JbblTde+I(r2fRV)GU*0F[GKFZ'6FZ&@C
+
+!@&e$S`1V*BfZ3,[Ekc'f'QM#1TGaI6mfFAd[dRd&lTYa2mhe[DcQqPkGarAYVFD
+
+pRq[EGj!!kh[Gb2@pdFVerHebVZqYjlLqJ6bZladIehI`(Ul[(a4Fhf(J[@rMqRk
+
+qJHZ,jh2ph!,FAqIkPGrNqY@YA,rQDG`$A2piD5R$)dE#I+49a0+%1a6`miQp3Qa
+
+bq2hBFJaMcC%A-H[Lh9kI1084#2JDa"!f3ALEk![b$C%30K$$+Rp)$+Z#lAk4M'@
+
+U"BZ%FY95Keh3%Y-m5!m&aNNZUbm3$MY$+e3GhSKrHRQY-ib9%UaRb2XM&r&Bb[Q
+
+$#1m2Y(MG+riPr[FUR"'4$dHFrL$[$S4iX30Jl8iIhq)0r5khhm926M)p@LJ6T9)
+
+i'P,4l,[)jI1kP[&L+-6l`aiMMHaaP!k@(kR(!$5jIF64)2HV9c"fkm2Bb8M[NA,
+
+5*ahe$KKB9T9'TSPBKI4**`H4UR2Kk*+M&9J[`FHC*Q&NUD#pVUA83F[45Jadk'0
+
+F3Yf1$dpTM65,Hfl&AGM3!#1U'a&eQabGKF82I&eA%c-D$%HjjT%"U4TMFAb*[&A
+
+h)@)HETXFRBf&$h`V0NVHj1U3!,`K#cY(qL511H*j`3MI14L%iN0H')LU%pY@kEb
+
+e@+I!ap@!&jDr$K6[395bNR+a,%&ISM6!LST@Uj*V5MUX3Y#A)"$4+kM@NKY`il$
+
+S30pF$R`T#q@S*(BHeKMSieHp#Flf)`,0AQTaDcb@&2)PHQQ)5fb5Xdb1cXF+!Vj
+
+N8DB2,Ic5f4Kjid'T!M!XRlE0,$48%8&NcjVeLhiPLG[pfVbedR#BF'qX0CFl+(-
+
+SP#2N$)DCki1*FLTMEYAMF%qMfLlECUkT+5IZR$kIUlACYmcS)YhC12(&iZ3YB9'
+
+@5Q5*+ZHdkID)X$BCAmp+hXKTKT6AHm#U3r4C*hSQB(BrU*ZE[*&EJ[hH"NF&f1H
+
+b`j%@Ei"`&+-i5TRYhSDUbbZ*lE"hTGJB!9#%@0JA5pj3Yh-5l&V,'fQFRq0a03C
+
+$hZ956TYb(mp1hP#k+8NN)bQBbZ-#L*FT4c0ATc*h9&5!)3dB`XSCTF08SdMC5D3
+
+Pj6BcCAk9Up8CNNK#jN9IDNVH8!QCSr)k39+0G(N`aFD&eSVN$99-XdNF%CZY,D(
+
+`"a@L69D5SkS@&F+T)ekr#"MM-CcF0*pfUMM`5Hd-*A450pjlk`mPT8VU"Y9h0R3
+
+Mi#,4b)#J'D-9V[Mh#PIqZX**-8jAH0BrUp"aT*4UR0)#8Sh6@T!!8Se6@T!!maX
+
+Yd(kN"FGd1[HIG2TA[3DH,8Mf'TBDXp4V02ZFVQ8q2,U3!#'KemM%T"XRp@#KVcU
+
+Y"q@f5Y+$A#aMZCD&Srj`4S3qiL3hckljPY445pa8@+b09#FYcCj'[bpc@BGcr'Q
+
+!%69iq@)m[C*8URU(RG4!'ib%'PfYVS`*8j,-6"h[aReIXbG[D8k5c,e@cYh[$#h
+
+lT)pilFFr65[(JLU"+N',p`QF2Y40KM[Pq2-plHN1e&CT4R@a((P61@0C"rU4'Q`
+
+blVmMh8FNDTaTr9MRD@`4JjR-qSM6-pGM1,T84T8160L3!*%BDI-(2jh'hIh8YR5
+
+r8BZ42Y@"2cR5GhfQ,m$+0,B(FZ(*qFCchdR[JG5Dl3[K98[0EFBhc6Jf!k'Hj$p
+
+R)(rUIIG)ebZT#lVHd,,'8%3DJQ5UfdlEP"@LKiU5A8P9!ff@U2hH-(@biF`FQ[(
+
+KV+6++NJeiI9JS(a#A@K@FPTGe,p@Pj4QR&)AdSc6kT,5M&2U3T15dqU5QT4mULl
+
+T5FPrl#eaeipXJ`L95k4YN!"fmDV'M(FlXp`hrMJpBDZc9%XlCB(Q0M6#dJJhdpT
+
+%2bZdFd30'KTT[d-6#2rA22prCQFCZHEjar[pNj2C69PYp)K@DM)V+8'fT!3C%RU
+
+0$!Sc%%F&0K8NII&jQb@NScQPp1@%DKc0DD4,rDbV-ccd@PV(lCAPY$H4%a*G2UI
+
+ARl'MdM)(c3+5MpDF8)f1Rr4*kNc)faB*9I4DMcVDlZfJPej1UXfAEck8RMde1"C
+
+Ci0@')p(QjN#S(A*Mr%a[J*8"E)T3G!%pL5YhHBl+"RVj4bhpa)5,Y@G#d)*M[FH
+
+rp@3IGap(N9*kF+TlbrUSQrlA5IIaD[aidXeYj&CVNMH83&CM+!&9RaC+%&Q"[`%
+
+!PM5C'9(,)ph(*fUTr9!YMqT9DV2iP&iGfErj4+r'r8D[mMkHFibb02iMPNjf1PA
+
+[d("$VLh(CI8d(p1LX&VN*cJbP(8k[pfF2kE#ZPqTX(51-%LC%ZXU[a22)[*i8[E
+
+rZJ[cIcUGL4G#pHMBk,e2kCF0VX,2PP#E5Iik[#T1$qmHrqXJc[6'Fa2`XLUETTM
+
+$*YV-$D3cYp12%m#qEb(qhJ$feL8eGE5PqJMF0!YqXU&'QZAY39+9b(8[r8`"-MX
+
+Ah$6![T!!ITF!pTb'bfV*EbNA&PMaKL[H#UA+i@kTX"!qGeH&C3R&EkCI&X"$k6d
+
+9PN9@f#m[VUY"R%+aB%N90%@4PhahPUZj([c3IkY-$A%eUr''+[Q8"m(LQS3[kcE
+
+1G+!PiF[1j8b6mBiYqG4I![EZK'rFji"Ab"55leDmdYV+9*,[$[MHa&2kj,XIH(K
+
+90KkIa-Ep'I$!Tj5(&h&2b4cN`,G2pSf$$kqZ5Vi*m(hh+pHLCV(B#pqMEAp*2`L
+
+K$S-ce482X[1!F4&mDd`jE#EL`-(e-DD6q,X(FCd12IXm1+#IdU#-2SFi1q)HB*d
+
+54KI`ANVie'C`8jVJFZTNa%85A%ip'ebqP1"bkZr$jj-acJ0'8-Di!,i@'@-Q-2E
+
+*q68KTiMXZ`ja[9RqCFj@hp%rG"RpQjINMlqNrpQ&-qA@"ki53rAP&2rr!!!0$3p
+
+YGbpRBh4PFh3Z0MK,,VN!N""453#3%#pd!!"+8`#3"2q3"%e08&*0680$!3#V,jH
+
+ZUc!jB!!!"M%!!"R%!!!"V3!!"E(*MaZS!*!'[VXM4!iL+Pj0j%)PIdhl9fbRBC!
+
+!DR1(JAFp3hUJ2KNcZ@(k&LeHlIYc*cMM1X2GRCf"!*`N(81C&iAQNTm4&Ifii1"
+
+EpGII4h6#PiP+'R-jb[e$&IeM12rA3hh-XBk+D2XK9#@U!P9e!@eRU22XRT!!%ar
+
+%6jaP3[FjFKhiIjQ@hidE$&25cAm$`-IrIXai*1U*jZd88q%pXX1%F$M`RNJbAQS
+
+ih%%N0J*@A""6p[pE#%1,cL9X%K8j[Z%i38$F)*'R%8!QpTQQT&06TCMf4amme9+
+
+jii[1iC(HE43E%aa#QlrCjZ4[GSL(8*!!e8D-E"#r6LR@&GN3aF6F'028K*cdTGk
+
+aT$fkUhhK6F,P(Tj11!CFTLJ+QQSXDINp,M$RL-+Cm9q6j"VK+Hr'rhrjXB16b1@
+
+iec&AC&Z,)bAP)A[QZNkT`brFF9bj0@L(b*(4H3)$i*YCbh9`YK90aj%$0a!Gm&!
+
+,de[B3!XlC'%$"-Eme,D0'(Z229-8DlB`9Q$FC!Y6@9L'KA%@PQm[")V0YM#PKBP
+
+$[mI#m!L#i#MfjAH50i4eE512Q3bj@@90I4m!N!--!'XcXfpJlh2Ij$4lRaZHF-P
+
+a`Tr-D)4&@%FjIAiV9hi5rZ3i@3NqRhV5`hI'm8m[3MNjENHi%AjN`!NMR"`rbB$
+
+bTrc)FA,m$%r*F51Fm*03FTa`FTa`-Q#%%hlN'4R`Pa`RA(+FF+mMamRa)mq2m$2
+
+#bB!#GjN8B'@Y6-+0iUpN*rl)-F)*2m)*8[#%!j-9H"9SN!!()1QkKK#+`Hm@K$S
+
+HJ&m,rN[#E`hmIJLEJ,q0bk)PQTCS@&q4J@q@4d"9U,FU)md-(0Yrf-'kLSC3Ech
+
+QTZ6PDfM!,6kXTJh48"8c3%-B$Af2ZR8CG9Ip2$-35k-p#&9[4Zd)$4`EE%%G46!
+
+,R0"9-23T99CN34j4,-#2%@HJ4P(6T'aDQa#N[iMDX5G2a3J5j8hqU`G8AI)J-HU
+
+[2pc+8DXTel3Q5K1DDDe`rC'MeMLS#5QV5"2QC-jFKV@(Y,XiDUf$'TI6Q941+fY
+
+NIrEXmabeMLSdTZC&6Ae8m48krm8h(,@HFXdUSU`BRMk!q[lRHBlD3,RQ4#QENT@
+
+#"cXRI2X+4ie6jif)dMfM+mkEUadrc9%E(G5'h+TKlGFqRHHS#3He,LFDrPe`h($
+
+QCBlDa(3e*P+'jG["RP9riDM0,PI9V"`8d09SikJYP'YH1C5kHVfHlZ'SDkKIpI4
+
+i+LIkaJ28)bpbe,88e9!N694cCG6ZNqFjkMUUN!"T6DE6ZT(h&AViKGmikRVU"NX
+
+TAdR(H9q1FY4@bY@D,XL9SfF2rY6286HiPp,*+'9G,aJIFG50p#Uce14Gj3Y'd81
+
+Ek"h5cFV&)blrQ+1f8B8b8UTJU&0#eN-9cVh+8GXGe*U-j!-kU)P6p4b9*UB'dj*
+
+PCDb-E#IIrF$K4qBkCkfIRK)eFi@ZrFEXr4ae-h@$T1I(e%`C&K,!AUi3T&L#1U`
+
+I'P&bCG3h(rRp#Fje+d8&50fBrKHeFp&j@4Q5M3GV$pea1eGSfk+(0$9pa80R1GF
+
+ZCkfce*a5FDbGI1mKMRSpifUSq482fFRj!BlD6Id+#UPkaDr(MfcMU0YGVSSeRLY
+
+8Z0V[F05H43q4)19lk0aM"lL(GMKViS"LkT1'T(MH+rPeTkZ3!*U"!([&H8FjkLl
+
++0@RS306mKfX[64ZJ+`31D"5@fGUaCaUiVRd8Y@!C+5NVP42Ef6h&a0E[S,D5e*Z
+
+k$e*4k[,4R"1qUq@S0cKV-k$Hk86c@fiEqT2V*rYSlLHcfePEppip1YM9Hl2Del9
+
+2!&`"@TQ,U#F1&[Z''jdelZ4b1(ZHmdimH"0(45eR)(&!*q9f)f6q6PCX0VTUBad
+
+IAd$pf!@`[ik1Br'KUlR)+fakrN"cHF(H36)2h%jb&H(+NrX0&jMF9VMIj$*$&L)
+
+T"p)0cLf`Yq1%"AXR6JQ`Yq'FKMf0GB,GdbRXPYLiZ+lq4#IBL8k`%jeJ*cV"6R5
+
+#RHJ%1p%*GU)6l%3Rf)P1h%qc#+[@Y15RS-eL8qhT&"fJcd&k4dVkK,dC'pb'AVi
+
+MRZjKXmB'HccD3(IrcJ8G(KYmfk)&p1R"5Hkrqa'fKQc`$Bdfm0&Ek'dF5*Cm&25
+
+6E"T+qQc(16M5i"iI4FpKHCCb3p#-XSR6I3[1YF$(e@dVrAm(hAhGA,f#1a4fVQ`
+
+D)a0bM1IcX19PNiJXd-QrQrjp$rTP0Nh4$ljDEE6C0*GdfSPEQNJ$[AaI"9dkQjE
+
+)"&rjZ5PSlpQXL6c)65I42'&jkHi((6HE659pGY(F%GhJrk#CBp-AQC!!QcfG`RF
+
+BE0C'2GbTm18(Qh@4"hI+cbI"'a-fkb-2I05,Qq*VI86`ZS90Dq6"IEUNPpZrZ6d
+
+IkmP@hp@`f9$5UmK,"LjZ2dGjKIdd'pTRSrf,Re6[[[HdcbYXX0R3aK[KcVI)#mr
+
+A-dm"R8jJFcLjAc2T0r!1Xr%Ph(NRKdhm"Y1PM9qd9#9(PFc#![X)[SNKr!e@jAm
+
+!N!-0$3pYGbpRBh4PFh3Z8&"$,VN!N"!4c!#3%%+&!*!)rj!%68e38Ne33d-"!+X
+
+[PkkV-$P&!!!'-3!!'Z!!!!'T!!!&bE5F%03!N!B"fL0%$L)UANhN3L9r6IYAE+G
+
+KN!"UFiH"Gce$HU!q'61jBIV#iB$[cjhJM1X-GhH'!`%ib6Q'-Lm+c58r)bVkFF(
+
+"YqU[[irS4$#9MENFjIkKL[iaR2rVS6lQ@%G&Y2d3UK*9JDUkJ,Bce(Pf6fJm&6R
+
+b2Z8HRJiXa'A+ir""h#2TreqK*11PKX-G4'@dI[MrP@fl(cXiL9b1Haec4BbeKmP
+
+aeJj"iNA$iL1d#Y1J+HR89#QQrG%86l98l[LLFhLNlhad)NaL2JK&0pZFr-d1m4!
+
++XYS)fcSm[diTeKAC%-A8h"M6e)5Fp+AHXD3p1ZNm1FY%rabj$[`E!$0bi`E$P26
+
+rG@!p"$aQr-JXH*CjLX,-Um9UPGj1-5VH)fY@`*(4VHaDSf,&r6CPrlq&--R1K6X
+
+*#r!9a`Q#"HZ@0$hdcLR&Z$Fm-LN%a%6I)NG'j`NF&EkCY9`(CaX9iFL4(fpK!IC
+
+B8#c-*P,XP1dG-@D4KE%@0XR#9"C'PcdhhF,ZXE"3#eYVB3-&a[CDHNU"FB-@YXI
+
+#PPJD!bcX5f0T(aH0)DaV'hR-C-M0+Q[Uq``!Da0l'f3fmMSr"jhCCQZ%N3NRNdf
+
+14LJRP"rPR[a@3Sqr%8D1NjAJmk5Hp2#G-Ic6Le"1MJm)Pachb(2###I(6c*J%8k
+
+j%8k1RiHRj,J46[K*+$P11$P11"P3`JNrmS`-q)!-Z'6!D6eKj2L4C`f-F$+J`(8
+
+Q"D$m9QE4e,T1r"&qK,q%%k6J#3FQ+c!qS%%HJ+LU#N)S",rE%'S`i2Fjq"D$ha,
+
+iI4qf+2P[K53BJQi)Q['&0I#IjBQL)Y4CP"42pjcUHm,'ZSf'8'HBF--Ck@qdLS0
+
+b3K-d'HXH'L*+S#ZS9C93Dp(hThY##E32SH*'Y!@KRP2p0@MV!TJ"6QM*DZUi,'%
+
+T+JeJ!r"$PM03TD!SBLUKM%E&Qd60d0-c)3Z*mVDqK3&9&I13!!6eTfr[iUM&P'Y
+
+#%F4446G@Z(l(88YXe)LB`Z+S2TE@Pf(0!mTp(,A84Uf3!",*H&STD'4qmZcc(,@
+
+-+M3XC`4&IJbl#Phql%Z1'UCF8eL3!,#@e`G3hrdd`e(,+GHd)+EL%XlQBDHLAlh
+
+-85ZSm`B%mB'K&HG0PBjFj+L90QTjHXf`jUXI6h28L)eDPKBdpblBE[Mm*BjDaA6
+
+94Z1DiGV"R*4rj+M9$PGCAcdSS+ZfQD2@8+iCI$4qqhSpdmj4DkPIeF4)2#fiaJ2
+
+8Bbpbe(889F1L)XMT!QVVKFXFYBiUT"YMLB5UC9b&(RhKCikkRVV"`)8VDEQKZf-
+
+V4kfRA)f*V,4kp-cqUedFGB0c+Hf-8Y$eQ[B"4pe)Vc*,6IQVI%eEm0!QHSG8IIA
+
+L@5lrN!#MEUCQhhrr8(p,Ec3@kie#4,V"pIbK)a`9-T!!GBlk-`E@KJ84,f%LG'i
+
+f[T!!!'KLUKNie$XiPM(N0&lQH[KU'dGYS"j+L['X*Sp(8hPGSl0R1'UMM9U5&&e
+
+!'c8b%qDSN!"L,3rTKL6Ki3+b'A[l2CZI0G[Y06`a,LMk#PhcpFQ(1'S6pDZSCSE
+
+PC!&fUR[r&Uj3-eASS(Td!+F,U1H1r2)8jpT#83&5e5EZS1kBGej+JZb9Kc82h(-
+
+h9kKehN1+R,MPS8ZFDjZpPPPABF@aCZbG`abeRA(9j-b+KmcBG!p(lD"q"B9NGG@
+
+[CimeFp5G$PGXM+5cUec0YcMUVRN2@9(2pG$Xii2F3jhf'KR%ZMUQL6M[[CaIGcX
+
++b8Q)f,HFGj+MGP'Z-8d&S[SrA2I32!5k3L5#cQ1CV4NkAXjer4pehS"JT*BMJmh
+
+eq+jHMVUAFXdD@Pa-LB8NHQRI3K)PI3p-0D6jHqhb!-,0lkJIrAq#kpTYIkZh1S$
+
+iJj!!%H0,"hSUqR8TjiTU6d$LH!3qd"l'QVp5(*Z0MQj%N5IR8$IK#2YVk#b4%AU
+
+KAhRjVG*[D*cA0T*HB1mJp`hf9R+*B@mR9a,f0R*MBGp1mJVX655"`0j)XK,X1mL
+
+pKlf"*+irG2*l,$B1E[#"6T2S$,#X@[56ejba+FlV&"bJcm2dMZ6dm6Xk0U4jAES
+
+MHGhp&Sp0DH#"lZkGmrT#0Q@"!rVX)TRXhr[K0j4X`S%(2RS$[3RXDKCpj(@KE-T
+
+cqZ`NL6E3i"kI4160319LE["D@$B9G'mQ#4Ai1,Ued1qGG(GeFr6blT!!hqqbU3a
+
+-b$&jRrZ0-TY)B)&1lYedll[ACE1T#Rl`e9TlcUBkTp0ZdVF%-H4Z[lGR8a1Bi#X
+
+h0hN["GM8"KlNTJYSfQ*jrHjlI6UE66PpZQMZ#'l`[pH@XGNEQ*!!Qr-kq@mqf+`
+
+,HVK6rLX60R@""hI+c5IHHaBfk`-2I,5(G,jrpK(H5aSfpB%(pqQkANlrj[4mV#G
+
+EHm2$CN01V`9H%R"aqMR+bhpj`iDqe%&p8bAIR!qTj%[4$kpFY(MK'lcmYcPXk&Z
+
+H1lcmlTi0lIT[mPVbJIFUL!elGjRM4BM8c8"+#$@"@kr%qK5GrJGH8d5JeDSp%6Z
+
+S`aY94TZmpLQ+$H(Nh"cl%r`RK-KrL#Vr!3#3!aq$!!!"!*!$!43!N!-8!*!$-Tr
+
+lRLe!rr#`!,K[$#eZd!6rm2rdd"lm`FAKdkSV8FY+$deKBe"bEfTPBh4c,R0TG!)
+
+!N!06594%8dP8)3#3"P0*9%46593K!*!BUc!jI3!!8M8!!!&'"1"2l'mDG@6JrHc
+
+K@5U#NI*HN@GK!Z"2kQ`FG&2UN!"S!!,L@5[48(adA`CdC!EJ6qj[8hJS!!EJEHl
+
+LEe5!)D$!FJC1ANl!*IrX51FI-#D`jL63G!*&0K!+1Li!&Ri!)VX-S"lbUKQJ(Z`
+
+3!+SDI!$!#3ZT8,aIE!!!Q$!'8!6"aG!!N!-3!#X!"3%B!J#3"`-!N!-"!*!$!43
+
+!N!-8!*!$-J$j(l!@#J#3!a`!-J!!8f9dC`#3!`S!!2rr!*!&q@G%'@B:
+
diff --git a/boehm-gc/Mac_files/MacOS_Test_config.h b/boehm-gc/Mac_files/MacOS_Test_config.h
new file mode 100644
index 00000000000..c95f4bb2f3e
--- /dev/null
+++ b/boehm-gc/Mac_files/MacOS_Test_config.h
@@ -0,0 +1,91 @@
+/*
+ MacOS_Test_config.h
+
+ Configuration flags for Macintosh development systems.
+
+ Test version.
+
+ <Revision History>
+
+ 11/16/95 pcb Updated compilation flags to reflect latest 4.6 Makefile.
+
+ by Patrick C. Beard.
+ */
+/* Boehm, November 17, 1995 12:05 pm PST */
+
+#ifdef __MWERKS__
+
+// for CodeWarrior Pro with Metrowerks Standard Library (MSL).
+// #define MSL_USE_PRECOMPILED_HEADERS 0
+#include <ansi_prefix.mac.h>
+#ifndef __STDC__
+#define __STDC__ 0
+#endif
+
+#endif
+
+// these are defined again in gc_priv.h.
+#undef TRUE
+#undef FALSE
+
+#define ALL_INTERIOR_POINTERS // follows interior pointers.
+//#define SILENT // want collection messages.
+//#define DONT_ADD_BYTE_AT_END // no padding.
+//#define SMALL_CONFIG // whether to a smaller heap.
+#define NO_SIGNALS // signals aren't real on the Macintosh.
+#define USE_TEMPORARY_MEMORY // use Macintosh temporary memory.
+
+// CFLAGS= -O -DNO_SIGNALS -DALL_INTERIOR_POINTERS -DSILENT
+//
+//LIBGC_CFLAGS= -O -DNO_SIGNALS -DSILENT \
+// -DREDIRECT_MALLOC=GC_malloc_uncollectable \
+// -DDONT_ADD_BYTE_AT_END -DALL_INTERIOR_POINTERS
+// Flags for building libgc.a -- the last two are required.
+//
+// Setjmp_test may yield overly optimistic results when compiled
+// without optimization.
+// -DSILENT disables statistics printing, and improves performance.
+// -DCHECKSUMS reports on erroneously clear dirty bits, and unexpectedly
+// altered stubborn objects, at substantial performance cost.
+// Use only for incremental collector debugging.
+// -DFIND_LEAK causes the collector to assume that all inaccessible
+// objects should have been explicitly deallocated, and reports exceptions.
+// Finalization and the test program are not usable in this mode.
+// -DSOLARIS_THREADS enables support for Solaris (thr_) threads.
+// (Clients should also define SOLARIS_THREADS and then include
+// gc.h before performing thr_ or GC_ operations.)
+// This is broken on nonSPARC machines.
+// -DALL_INTERIOR_POINTERS allows all pointers to the interior
+// of objects to be recognized. (See gc_priv.h for consequences.)
+// -DSMALL_CONFIG tries to tune the collector for small heap sizes,
+// usually causing it to use less space in such situations.
+// Incremental collection no longer works in this case.
+// -DLARGE_CONFIG tunes the collector for unusually large heaps.
+// Necessary for heaps larger than about 500 MB on most machines.
+// Recommended for heaps larger than about 64 MB.
+// -DDONT_ADD_BYTE_AT_END is meaningful only with
+// -DALL_INTERIOR_POINTERS. Normally -DALL_INTERIOR_POINTERS
+// causes all objects to be padded so that pointers just past the end of
+// an object can be recognized. This can be expensive. (The padding
+// is normally more than one byte due to alignment constraints.)
+// -DDONT_ADD_BYTE_AT_END disables the padding.
+// -DNO_SIGNALS does not disable signals during critical parts of
+// the GC process. This is no less correct than many malloc
+// implementations, and it sometimes has a significant performance
+// impact. However, it is dangerous for many not-quite-ANSI C
+// programs that call things like printf in asynchronous signal handlers.
+// -DOPERATOR_NEW_ARRAY declares that the C++ compiler supports the
+// new syntax "operator new[]" for allocating and deleting arrays.
+// See gc_cpp.h for details. No effect on the C part of the collector.
+// This is defined implicitly in a few environments.
+// -DREDIRECT_MALLOC=X causes malloc, realloc, and free to be defined
+// as aliases for X, GC_realloc, and GC_free, respectively.
+// Calloc is redefined in terms of the new malloc. X should
+// be either GC_malloc or GC_malloc_uncollectable.
+// The former is occasionally useful for working around leaks in code
+// you don't want to (or can't) look at. It may not work for
+// existing code, but it often does. Neither works on all platforms,
+// since some ports use malloc or calloc to obtain system memory.
+// (Probably works for UNIX, and win32.)
+// -DNO_DEBUG removes GC_dump and the debugging routines it calls.
+// Reduces code size slightly at the expense of debuggability.
diff --git a/boehm-gc/Mac_files/MacOS_config.h b/boehm-gc/Mac_files/MacOS_config.h
new file mode 100644
index 00000000000..93c3c97a955
--- /dev/null
+++ b/boehm-gc/Mac_files/MacOS_config.h
@@ -0,0 +1,89 @@
+/*
+ MacOS_config.h
+
+ Configuration flags for Macintosh development systems.
+
+ <Revision History>
+
+ 11/16/95 pcb Updated compilation flags to reflect latest 4.6 Makefile.
+
+ by Patrick C. Beard.
+ */
+/* Boehm, November 17, 1995 12:10 pm PST */
+
+#ifdef __MWERKS__
+
+// for CodeWarrior Pro with Metrowerks Standard Library (MSL).
+// #define MSL_USE_PRECOMPILED_HEADERS 0
+#include <ansi_prefix.mac.h>
+#ifndef __STDC__
+#define __STDC__ 0
+#endif
+
+#endif /* __MWERKS__ */
+
+// these are defined again in gc_priv.h.
+#undef TRUE
+#undef FALSE
+
+#define ALL_INTERIOR_POINTERS // follows interior pointers.
+#define SILENT // no collection messages.
+//#define DONT_ADD_BYTE_AT_END // no padding.
+//#define SMALL_CONFIG // whether to use a smaller heap.
+#define NO_SIGNALS // signals aren't real on the Macintosh.
+#define USE_TEMPORARY_MEMORY // use Macintosh temporary memory.
+
+// CFLAGS= -O -DNO_SIGNALS -DSILENT -DALL_INTERIOR_POINTERS
+//
+//LIBGC_CFLAGS= -O -DNO_SIGNALS -DSILENT \
+// -DREDIRECT_MALLOC=GC_malloc_uncollectable \
+// -DDONT_ADD_BYTE_AT_END -DALL_INTERIOR_POINTERS
+// Flags for building libgc.a -- the last two are required.
+//
+// Setjmp_test may yield overly optimistic results when compiled
+// without optimization.
+// -DSILENT disables statistics printing, and improves performance.
+// -DCHECKSUMS reports on erroneously clear dirty bits, and unexpectedly
+// altered stubborn objects, at substantial performance cost.
+// Use only for incremental collector debugging.
+// -DFIND_LEAK causes the collector to assume that all inaccessible
+// objects should have been explicitly deallocated, and reports exceptions.
+// Finalization and the test program are not usable in this mode.
+// -DSOLARIS_THREADS enables support for Solaris (thr_) threads.
+// (Clients should also define SOLARIS_THREADS and then include
+// gc.h before performing thr_ or GC_ operations.)
+// This is broken on nonSPARC machines.
+// -DALL_INTERIOR_POINTERS allows all pointers to the interior
+// of objects to be recognized. (See gc_priv.h for consequences.)
+// -DSMALL_CONFIG tries to tune the collector for small heap sizes,
+// usually causing it to use less space in such situations.
+// Incremental collection no longer works in this case.
+// -DLARGE_CONFIG tunes the collector for unusually large heaps.
+// Necessary for heaps larger than about 500 MB on most machines.
+// Recommended for heaps larger than about 64 MB.
+// -DDONT_ADD_BYTE_AT_END is meaningful only with
+// -DALL_INTERIOR_POINTERS. Normally -DALL_INTERIOR_POINTERS
+// causes all objects to be padded so that pointers just past the end of
+// an object can be recognized. This can be expensive. (The padding
+// is normally more than one byte due to alignment constraints.)
+// -DDONT_ADD_BYTE_AT_END disables the padding.
+// -DNO_SIGNALS does not disable signals during critical parts of
+// the GC process. This is no less correct than many malloc
+// implementations, and it sometimes has a significant performance
+// impact. However, it is dangerous for many not-quite-ANSI C
+// programs that call things like printf in asynchronous signal handlers.
+// -DOPERATOR_NEW_ARRAY declares that the C++ compiler supports the
+// new syntax "operator new[]" for allocating and deleting arrays.
+// See gc_cpp.h for details. No effect on the C part of the collector.
+// This is defined implicitly in a few environments.
+// -DREDIRECT_MALLOC=X causes malloc, realloc, and free to be defined
+// as aliases for X, GC_realloc, and GC_free, respectively.
+// Calloc is redefined in terms of the new malloc. X should
+// be either GC_malloc or GC_malloc_uncollectable.
+// The former is occasionally useful for working around leaks in code
+// you don't want to (or can't) look at. It may not work for
+// existing code, but it often does. Neither works on all platforms,
+// since some ports use malloc or calloc to obtain system memory.
+// (Probably works for UNIX, and win32.)
+// -DNO_DEBUG removes GC_dump and the debugging routines it calls.
+// Reduces code size slightly at the expense of debuggability. \ No newline at end of file
diff --git a/boehm-gc/Mac_files/dataend.c b/boehm-gc/Mac_files/dataend.c
new file mode 100644
index 00000000000..a3e3fe8446f
--- /dev/null
+++ b/boehm-gc/Mac_files/dataend.c
@@ -0,0 +1,9 @@
+/*
+ dataend.c
+
+ A hack to get the extent of global data for the Macintosh.
+
+ by Patrick C. Beard.
+ */
+
+long __dataend;
diff --git a/boehm-gc/Mac_files/datastart.c b/boehm-gc/Mac_files/datastart.c
new file mode 100644
index 00000000000..a9e0dd59410
--- /dev/null
+++ b/boehm-gc/Mac_files/datastart.c
@@ -0,0 +1,9 @@
+/*
+ datastart.c
+
+ A hack to get the extent of global data for the Macintosh.
+
+ by Patrick C. Beard.
+ */
+
+long __datastart;
diff --git a/boehm-gc/Makefile.DLLs b/boehm-gc/Makefile.DLLs
new file mode 100644
index 00000000000..011f49d3bcf
--- /dev/null
+++ b/boehm-gc/Makefile.DLLs
@@ -0,0 +1,107 @@
+#-----------------------------------------------------------------------------#
+
+# Makefile.DLLs, version 0.4.
+
+# Contributed by Fergus Henderson.
+
+# This Makefile contains rules for creating DLLs on Windows using gnu-win32.
+
+#-----------------------------------------------------------------------------#
+
+# This rule creates a `.def' file, which lists the symbols that are exported
+# from the DLL. We use `nm' to get a list of all the exported text (`T')
+# symbols and data symbols -- including uninitialized data (`B'),
+# initialized data (`D'), read-only data (`R'), and common blocks (`C').
+%.def: %.a
+ echo EXPORTS > $@
+ nm $< | grep '^........ [BCDRT] _' | sed 's/[^_]*_//' >> $@
+
+# We need to use macros to access global data:
+# the user of the DLL must refer to `foo' as `(*__imp_foo)'.
+# This rule creates a `_globals.h' file, which contains macros
+# for doing this.
+
+SYM_PREFIX = $(firstword $(SYM_PREFIX-$*) $*)
+DLL_MACRO = $(SYM_PREFIX)_USE_DLL
+IMP_MACRO = $(SYM_PREFIX)_IMP
+GLOBAL_MACRO = $(SYM_PREFIX)_GLOBAL
+
+%_globals.h: %.a
+ echo "/* automatically generated by Makefile.DLLs */" > $@
+ echo "#if defined(__GNUC__) && defined(_WIN32) \\" >> $@
+ echo " && defined($(DLL_MACRO))" >> $@
+ echo "# define $(IMP_MACRO)(name) __imp_##name" >> $@
+ echo "# define $(GLOBAL_MACRO)(name) (*$(IMP_MACRO)(name))" >> $@
+ echo "#else" >> $@
+ echo "# define $(GLOBAL_MACRO)(name) name" >> $@
+ echo "#endif" >> $@
+ echo "" >> $@
+ for sym in `nm $< | grep '^........ [BCDR] _' | sed 's/[^_]*_//'`; do \
+ echo "#define $$sym $(GLOBAL_MACRO)($$sym)" >> $@; \
+ done
+
+# This rule creates the export object file (`foo.exp') which contains the
+# jump table array; this export object file becomes part of the DLL.
+# This rule also creates the import library (`foo_dll.a') which contains small
+# stubs for all the functions exported by the DLL which jump to them via the
+# jump table. Executables that will use the DLL must be linked against this
+# stub library.
+%.exp %_dll.a : %.def
+ dlltool $(DLLTOOLFLAGS) $(DLLTOOLFLAGS-$*) \
+ --def $< \
+ --dllname $*.dll \
+ --output-exp $*.exp \
+ --output-lib $*_dll.a
+
+# The `sed' commands below are to convert DOS-style `C:\foo\bar'
+# pathnames into Unix-style `//c/foo/bar' pathnames.
+CYGWIN32_LIBS = $(shell echo \
+ -L`dirname \`gcc -print-file-name=libgcc.a | \
+ sed -e 's@^\\\\([A-Za-z]\\\\):@//\\\\1@g' -e 's@\\\\\\\\@/@g' \` ` \
+ -L`dirname \`gcc -print-file-name=libcygwin.a | \
+ sed -e 's@^\\\\([A-Za-z]\\\\):@//\\\\1@g' -e 's@\\\\\\\\@/@g' \` ` \
+ -L`dirname \`gcc -print-file-name=libkernel32.a | \
+ sed -e 's@^\\\\([A-Za-z]\\\\):@//\\\\1@g' -e 's@\\\\\\\\@/@g' \` ` \
+ -lgcc -lcygwin -lkernel32 -lgcc)
+
+RELOCATABLE=yes
+
+ifeq "$(strip $(RELOCATABLE))" "yes"
+
+# to create relocatable DLLs, we need to do two passes
+%.dll: %.exp %.a dll_fixup.o dll_init.o
+ $(LD) $(LDFLAGS) $(LDFLAGS-$*) --dll -o $*.base \
+ -e _dll_entry@12 dll_init.o \
+ dll_fixup.o $*.exp $*.a \
+ $(LDLIBS) $(LDLIBS-$*) \
+ $(CYGWIN32_LIBS)
+ $(LD) $(LDFLAGS) $(LDFLAGS-$*) --dll --base-file $*.base -o $@ \
+ -e _dll_entry@12 dll_init.o \
+ dll_fixup.o $*.exp $*.a \
+ $(LDLIBS) $(LDLIBS-$*) \
+ $(CYGWIN32_LIBS)
+ rm -f $*.base
+else
+
+%.dll: %.exp %.a dll_fixup.o dll_init.o
+ $(LD) $(LDFLAGS) $(LDFLAGS-$*) --dll -o $@ \
+ -e _dll_entry@12 dll_init.o \
+ dll_fixup.o $*.exp $*.a \
+ $(LDLIBS) $(LDLIBS-$*) \
+ $(CYGWIN32_LIBS)
+
+endif
+
+# This black magic piece of assembler needs to be linked in in order to
+# properly terminate the list of imported DLLs.
+dll_fixup.s:
+ echo '.section .idata$$3' > dll_fixup.s
+ echo '.long 0,0,0,0, 0,0,0,0' >> dll_fixup.s
+
+# This bit is necessary to provide an initialization function for the DLL.
+dll_init.c:
+ echo '__attribute__((stdcall))' > dll_init.c
+ echo 'int dll_entry(int handle, int reason, void *ptr)' >> dll_init.c
+ echo '{return 1; }' >> dll_init.c
+
+dont_throw_away: dll_fixup.o dll_init.o
diff --git a/boehm-gc/Makefile.am b/boehm-gc/Makefile.am
new file mode 100644
index 00000000000..cb383d55913
--- /dev/null
+++ b/boehm-gc/Makefile.am
@@ -0,0 +1,138 @@
+## Process this file with automake to produce Makefile.in.
+
+## FIXME: `make dist' in this directory will not currently work. Many
+## files that should be in the distribution are not mentioned in this
+## Makefile.am.
+
+AUTOMAKE_OPTIONS = cygnus
+
+# Multilib support variables.
+MULTISRCTOP =
+MULTIBUILDTOP =
+MULTIDIRS =
+MULTISUBDIR =
+MULTIDO = true
+MULTICLEAN = true
+
+## Install a library built with a cross compiler in tooldir, not
+## libdir.
+if USE_LIBDIR
+toolexeclibdir = $(libdir)
+else
+toolexecdir = $(exec_prefix)/$(target_alias)
+toolexeclibdir = $(toolexecdir)/lib$(MULTISUBDIR)
+endif
+
+toolexeclib_LTLIBRARIES = $(target_all)
+EXTRA_LTLIBRARIES = libgcjgc.la
+libgcjgc_la_SOURCES = allchblk.c alloc.c blacklst.c checksums.c \
+config.h dbg_mlc.c dyn_load.c finalize.c gc.h gc_alloc.h gc_cpp.h \
+gc_hdrs.h gc_mark.h gc_priv.h gc_private.h gc_typed.h headers.c \
+irix_threads.c linux_threads.c malloc.c mallocx.c mark.c mark_rts.c \
+misc.c new_hblk.c obj_map.c os_dep.c pcr_interface.c ptr_chck.c \
+quick_threads.c real_malloc.c reclaim.c solaris_pthreads.c \
+solaris_threads.c solaris_threads.h stubborn.c typd_mlc.c version.h \
+weakpointer.h
+libgcjgc_la_LIBADD = @addobjs@
+libgcjgc_la_DEPENDENCIES = @addobjs@
+libgcjgc_la_LDFLAGS = -version-info 0:0:0 -rpath $(toolexeclibdir)
+
+EXTRA_libgcjgc_la_SOURCES = alpha_mach_dep.s mips_sgi_mach_dep.s \
+mips_ultrix_mach_dep.s rs6000_mach_dep.s sparc_mach_dep.s \
+sparc_sunos4_mach_dep.s mach_dep.c ecos.cc
+
+AM_CXXFLAGS = @BOEHM_GC_CFLAGS@
+AM_CFLAGS = @BOEHM_GC_CFLAGS@
+
+check_PROGRAMS = gctest
+gctest_SOURCES = test.c
+gctest_LDADD = ./libgcjgc.la
+
+
+## FIXME: relies on internal code generated by automake.
+all_objs = @addobjs@ $(libgcjgc_la_OBJECTS)
+$(all_objs) : config.h gc_priv.h gc_hdrs.h gc.h gc_mark.h
+
+## FIXME: we shouldn't have to do this, but automake forces us to.
+.s.lo:
+## We use -Wp,-P to strip #line directives. Irix `as' chokes on
+## these.
+ $(LTCOMPILE) -Wp,-P -x assembler-with-cpp -c $<
+
+## We have our own definition of LTCOMPILE because we want to use our
+## CFLAGS, not those passed in from the top level make.
+LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(MY_CFLAGS) $(BOEHM_GC_CFLAGS)
+LINK = $(LIBTOOL) --mode=link $(CC) $(AM_CFLAGS) $(MY_CFLAGS) $(LDFLAGS) -o $@
+
+AM_CFLAGS = @BOEHM_GC_CFLAGS@
+
+# Work around what appears to be a GNU make bug handling MAKEFLAGS
+# values defined in terms of make variables, as is the case for CC and
+# friends when we are called from the top level Makefile.
+AM_MAKEFLAGS = \
+ "AR_FLAGS=$(AR_FLAGS)" \
+ "CC_FOR_BUILD=$(CC_FOR_BUILD)" \
+ "CFLAGS=$(CFLAGS)" \
+ "CXXFLAGS=$(CXXFLAGS)" \
+ "CFLAGS_FOR_BUILD=$(CFLAGS_FOR_BUILD)" \
+ "CFLAGS_FOR_TARGET=$(CFLAGS_FOR_TARGET)" \
+ "INSTALL=$(INSTALL)" \
+ "INSTALL_DATA=$(INSTALL_DATA)" \
+ "INSTALL_PROGRAM=$(INSTALL_PROGRAM)" \
+ "INSTALL_SCRIPT=$(INSTALL_SCRIPT)" \
+ "LDFLAGS=$(LDFLAGS)" \
+ "LIBCFLAGS=$(LIBCFLAGS)" \
+ "LIBCFLAGS_FOR_TARGET=$(LIBCFLAGS_FOR_TARGET)" \
+ "MAKE=$(MAKE)" \
+ "MAKEINFO=$(MAKEINFO) $(MAKEINFOFLAGS)" \
+ "PICFLAG=$(PICFLAG)" \
+ "PICFLAG_FOR_TARGET=$(PICFLAG_FOR_TARGET)" \
+ "SHELL=$(SHELL)" \
+ "EXPECT=$(EXPECT)" \
+ "RUNTEST=$(RUNTEST)" \
+ "RUNTESTFLAGS=$(RUNTESTFLAGS)" \
+ "exec_prefix=$(exec_prefix)" \
+ "infodir=$(infodir)" \
+ "libdir=$(libdir)" \
+ "prefix=$(prefix)" \
+ "tooldir=$(tooldir)" \
+ "AR=$(AR)" \
+ "AS=$(AS)" \
+ "CC=$(CC)" \
+ "CXX=$(CXX)" \
+ "LD=$(LD)" \
+ "LIBCFLAGS=$(LIBCFLAGS)" \
+ "NM=$(NM)" \
+ "PICFLAG=$(PICFLAG)" \
+ "RANLIB=$(RANLIB)" \
+ "DESTDIR=$(DESTDIR)"
+
+CONFIG_STATUS_DEPENDENCIES = $(boehm_gc_basedir)/configure.host
+
+# Multilib support.
+.PHONY: all-multi mostlyclean-multi clean-multi distclean-multi \
+ maintainer-clean-multi
+
+all-am: all-multi
+install-am: install-multi
+mostlyclean-am: mostlyclean-multi
+clean-am: clean-multi
+distclean-am: distclean-multi
+maintainer-clean-am: maintainer-clean-multi
+
+all-multi:
+ $(MULTIDO) $(AM_MAKEFLAGS) DO=all multi-do
+install-multi:
+ $(MULTIDO) $(AM_MAKEFLAGS) DO=install multi-do
+mostlyclean-multi:
+ $(MULTICLEAN) $(AM_MAKEFLAGS) DO=mostlyclean multi-clean
+clean-multi:
+ $(MULTICLEAN) $(AM_MAKEFLAGS) DO=clean multi-clean
+distclean-multi:
+ $(MULTICLEAN) $(AM_MAKEFLAGS) DO=distclean multi-clean
+maintainer-clean-multi:
+ $(MULTICLEAN) $(AM_MAKEFLAGS) DO=maintainer-clean multi-clean
+
+MAKEOVERRIDES=
diff --git a/boehm-gc/Makefile.dj b/boehm-gc/Makefile.dj
new file mode 100644
index 00000000000..979ac6f33e7
--- /dev/null
+++ b/boehm-gc/Makefile.dj
@@ -0,0 +1,296 @@
+# Primary targets:
+# gc.a - builds basic library
+# libgc.a - builds library for use with g++ "-fgc-keyword" extension
+# c++ - adds C++ interface to library
+# cords - adds cords (heavyweight strings) to library
+# test - prints porting information, then builds basic version of gc.a,
+# and runs some tests of collector and cords. Does not add cords or
+# c++ interface to gc.a
+# cord/de$(EXE_SUFFIX) - builds dumb editor based on cords.
+CC=gcc
+CXX=gcc -x c++
+CXXLD=gxx
+RM=rm -f
+MV=mv
+EXE_SUFFIX=.exe
+RANLIB=ranlib
+
+CFLAGS= -O -DNO_SIGNALS -DALL_INTERIOR_POINTERS -DSILENT -DATOMIC_UNCOLLECTABLE
+
+# Setjmp_test may yield overly optimistic results when compiled
+# without optimization.
+# -DSILENT disables statistics printing, and improves performance.
+# -DCHECKSUMS reports on erroneously clear dirty bits, and unexpectedly
+# altered stubborn objects, at substantial performance cost.
+# Use only for incremental collector debugging.
+# -DFIND_LEAK causes the collector to assume that all inaccessible
+# objects should have been explicitly deallocated, and reports exceptions.
+# Finalization and the test program are not usable in this mode.
+# -DSOLARIS_THREADS enables support for Solaris (thr_) threads.
+# (Clients should also define SOLARIS_THREADS and then include
+# gc.h before performing thr_ or dl* or GC_ operations.)
+# This is broken on nonSPARC machines.
+# -DIRIX_THREADS enables support for Irix pthreads. See README.irix.
+# -DALL_INTERIOR_POINTERS allows all pointers to the interior
+# of objects to be recognized. (See gc_priv.h for consequences.)
+# -DSMALL_CONFIG tries to tune the collector for small heap sizes,
+# usually causing it to use less space in such situations.
+# Incremental collection no longer works in this case.
+# -DLARGE_CONFIG tunes the collector for unusually large heaps.
+# Necessary for heaps larger than about 500 MB on most machines.
+# Recommended for heaps larger than about 64 MB.
+# -DDONT_ADD_BYTE_AT_END is meaningful only with
+# -DALL_INTERIOR_POINTERS. Normally -DALL_INTERIOR_POINTERS
+# causes all objects to be padded so that pointers just past the end of
+# an object can be recognized. This can be expensive. (The padding
+# is normally more than one byte due to alignment constraints.)
+# -DDONT_ADD_BYTE_AT_END disables the padding.
+# -DNO_SIGNALS does not disable signals during critical parts of
+# the GC process. This is no less correct than many malloc
+# implementations, and it sometimes has a significant performance
+# impact. However, it is dangerous for many not-quite-ANSI C
+# programs that call things like printf in asynchronous signal handlers.
+# -DNO_EXECUTE_PERMISSION may cause some or all of the heap to not
+# have execute permission, i.e. it may be impossible to execute
+# code from the heap. Currently this only affects the incremental
+# collector on UNIX machines. It may greatly improve its performance,
+# since this may avoid some expensive cache synchronization.
+# -DOPERATOR_NEW_ARRAY declares that the C++ compiler supports the
+# new syntax "operator new[]" for allocating and deleting arrays.
+# See gc_cpp.h for details. No effect on the C part of the collector.
+# This is defined implicitly in a few environments.
+# -DREDIRECT_MALLOC=X causes malloc, realloc, and free to be defined
+# as aliases for X, GC_realloc, and GC_free, respectively.
+# Calloc is redefined in terms of the new malloc. X should
+# be either GC_malloc or GC_malloc_uncollectable.
+# The former is occasionally useful for working around leaks in code
+# you don't want to (or can't) look at. It may not work for
+# existing code, but it often does. Neither works on all platforms,
+# since some ports use malloc or calloc to obtain system memory.
+# (Probably works for UNIX, and win32.)
+# -DIGNORE_FREE turns calls to free into a noop. Only useful with
+# -DREDIRECT_MALLOC.
+# -DNO_DEBUGGING removes GC_dump and the debugging routines it calls.
+# Reduces code size slightly at the expense of debuggability.
+# -DJAVA_FINALIZATION makes it somewhat safer to finalize objects out of
+# order by specifying a nonstandard finalization mark procedure (see
+# finalize.c). Objects reachable from finalizable objects will be marked
+# in a sepearte postpass, and hence their memory won't be reclaimed.
+# Not recommended unless you are implementing a language that specifies
+# these semantics.
+# -DATOMIC_UNCOLLECTABLE includes code for GC_malloc_atomic_uncollectable.
+# This is useful if either the vendor malloc implementation is poor,
+# or if REDIRECT_MALLOC is used.
+
+LIBGC_CFLAGS= -O -DNO_SIGNALS -DSILENT \
+ -DREDIRECT_MALLOC=GC_malloc_uncollectable \
+ -DDONT_ADD_BYTE_AT_END -DALL_INTERIOR_POINTERS
+# Flags for building libgc.a -- the last two are required.
+
+CXXFLAGS= $(CFLAGS) -DOPERATOR_NEW_ARRAY
+AR= ar
+RANLIB= ranlib
+
+
+# Redefining srcdir allows object code for the nonPCR version of the collector
+# to be generated in different directories. In this case, the destination directory
+# should contain a copy of the original include directory.
+srcdir = .
+VPATH = $(srcdir)
+
+OBJS= alloc.o reclaim.o allchblk.o misc.o mach_dep.o os_dep.o mark_rts.o headers.o mark.o obj_map.o blacklst.o finalize.o new_hblk.o dbg_mlc.o malloc.o stubborn.o checksums.o solaris_threads.o irix_threads.o typd_mlc.o ptr_chck.o mallocx.o
+
+CSRCS= reclaim.c allchblk.c misc.c alloc.c mach_dep.c os_dep.c mark_rts.c headers.c mark.c obj_map.c pcr_interface.c blacklst.c finalize.c new_hblk.c real_malloc.c dyn_load.c dbg_mlc.c malloc.c stubborn.c checksums.c solaris_threads.c irix_threads.c typd_mlc.c ptr_chck.c mallocx.c
+
+CORD_SRCS= cord/cordbscs.c cord/cordxtra.c cord/cordprnt.c cord/de.c cord/cordtest.c cord/cord.h cord/ec.h cord/private/cord_pos.h cord/de_win.c cord/de_win.h cord/de_cmds.h cord/de_win.ICO cord/de_win.RC cord/SCOPTIONS.amiga cord/SMakefile.amiga
+
+CORD_OBJS= cord/cordbscs.o cord/cordxtra.o cord/cordprnt.o
+
+SRCS= $(CSRCS) mips_sgi_mach_dep.s rs6000_mach_dep.s alpha_mach_dep.s \
+ sparc_mach_dep.s gc.h gc_typed.h gc_hdrs.h gc_priv.h gc_private.h \
+ config.h gc_mark.h include/gc_inl.h include/gc_inline.h gc.man \
+ threadlibs.c if_mach.c if_not_there.c gc_cpp.cc gc_cpp.h weakpointer.h \
+ gcc_support.c mips_ultrix_mach_dep.s include/gc_alloc.h gc_alloc.h \
+ $(CORD_SRCS)
+
+OTHER_FILES= Makefile PCR-Makefile OS2_MAKEFILE NT_MAKEFILE BCC_MAKEFILE \
+ README test.c test_cpp.cc setjmp_t.c SMakefile.amiga \
+ SCoptions.amiga README.amiga README.win32 cord/README \
+ cord/gc.h include/gc.h include/gc_typed.h include/cord.h \
+ include/ec.h include/private/cord_pos.h include/private/config.h \
+ include/private/gc_hdrs.h include/private/gc_priv.h \
+ include/gc_cpp.h README.rs6000 \
+ include/weakpointer.h README.QUICK callprocs pc_excludes \
+ barrett_diagram README.OS2 README.Mac MacProjects.sit.hqx \
+ MacOS.c EMX_MAKEFILE makefile.depend README.debugging \
+ include/gc_cpp.h Mac_files/datastart.c Mac_files/dataend.c \
+ Mac_files/MacOS_config.h Mac_files/MacOS_Test_config.h \
+ add_gc_prefix.c README.solaris2 README.sgi README.hp README.uts \
+ win32_threads.c NT_THREADS_MAKEFILE gc.mak README.dj Makefile.dj
+
+CORD_INCLUDE_FILES= $(srcdir)/gc.h $(srcdir)/cord/cord.h $(srcdir)/cord/ec.h \
+ $(srcdir)/cord/private/cord_pos.h
+
+UTILS= if_mach$(EXE_SUFFIX) if_not_there$(EXE_SUFFIX) threadlibs$(EXE_SUFFIX)
+
+# Libraries needed for curses applications. Only needed for de.
+CURSES= -lcurses -ltermlib
+
+# The following is irrelevant on most systems. But a few
+# versions of make otherwise fork the shell specified in
+# the SHELL environment variable.
+SHELL= /bin/sh
+
+SPECIALCFLAGS =
+# Alternative flags to the C compiler for mach_dep.c.
+# Mach_dep.c often doesn't like optimization, and it's
+# not time-critical anyway.
+# Set SPECIALCFLAGS to -q nodirect_code on Encore.
+
+all: gc.a gctest$(EXE_SUFFIX)
+
+pcr: PCR-Makefile gc_private.h gc_hdrs.h gc.h config.h mach_dep.o $(SRCS)
+ make -f PCR-Makefile depend
+ make -f PCR-Makefile
+
+$(OBJS) test.o dyn_load.o dyn_load_sunos53.o: $(srcdir)/gc_priv.h $(srcdir)/gc_hdrs.h $(srcdir)/gc.h \
+ $(srcdir)/config.h $(srcdir)/gc_typed.h Makefile
+# The dependency on Makefile is needed. Changing
+# options such as -DSILENT affects the size of GC_arrays,
+# invalidating all .o files that rely on gc_priv.h
+
+mark.o typd_mlc.o finalize.o: $(srcdir)/gc_mark.h
+
+base_lib gc.a: $(OBJS) dyn_load.o $(UTILS)
+ echo > base_lib
+ $(RM) on_sparc_sunos5
+ ./if_mach SPARC SUNOS5 touch on_sparc_sunos5
+ ./if_mach SPARC SUNOS5 $(AR) rus gc.a $(OBJS) dyn_load.o
+ ./if_not_there on_sparc_sunos5 $(AR) ru gc.a $(OBJS) dyn_load.o
+ -./if_not_there on_sparc_sunos5 $(RANLIB) gc.a
+# ignore ranlib failure; that usually means it doesn't exist, and isn't needed
+
+libgc.a:
+ make CFLAGS="$(LIBGC_CFLAGS)" clean gc.a gcc_support.o
+ $(MV) gc.a libgc.a
+ -$(RM) on_sparc_sunos5
+ ./if_mach SPARC SUNOS5 touch on_sparc_sunos5
+ ./if_mach SPARC SUNOS5 $(AR) rus libgc.a gcc_support.o
+ ./if_not_there on_sparc_sunos5 $(AR) ru libgc.a gcc_support.o
+ -./if_not_there on_sparc_sunos5 $(RANLIB) libgc.a
+
+cords: $(CORD_OBJS) cord/cordtest$(EXE_SUFFIX) $(UTILS)
+ -$(RM) on_sparc_sunos5
+ ./if_mach SPARC SUNOS5 touch on_sparc_sunos5
+ ./if_mach SPARC SUNOS5 $(AR) rus gc.a $(CORD_OBJS)
+ ./if_not_there on_sparc_sunos5 $(AR) ru gc.a $(CORD_OBJS)
+ -./if_not_there on_sparc_sunos5 $(RANLIB) gc.a
+
+gc_cpp.o: $(srcdir)/gc_cpp.cc $(srcdir)/gc_cpp.h $(srcdir)/gc.h Makefile
+ $(CXX) -c $(CXXFLAGS) $(srcdir)/gc_cpp.cc
+
+test_cpp: $(srcdir)/test_cpp.cc $(srcdir)/gc_cpp.h gc_cpp.o $(srcdir)/gc.h \
+base_lib $(UTILS)
+ -$(RM) test_cpp test_cpp$(EXE_SUFFIX)
+ ./if_mach HP_PA "" $(CXX) $(CXXFLAGS) -o test_cpp $(srcdir)/test_cpp.cc gc_cpp.o gc.a -ldld
+ ./if_not_there test_cpp$(EXE_SUFFIX) $(CXXLD) $(CXXFLAGS) -o test_cpp $(srcdir)/test_cpp.cc gc_cpp.o gc.a
+ $(RM) test_cpp
+
+c++: gc_cpp.o $(srcdir)/gc_cpp.h test_cpp
+ -$(RM) on_sparc_sunos5
+ $(AR) ru gc.a gc_cpp.o
+ $(RANLIB) gc.a
+ ./test_cpp$(EXE_SUFFIX) 1
+ echo > c++
+
+dyn_load_sunos53.o: dyn_load.c
+ $(CC) $(CFLAGS) -DSUNOS53_SHARED_LIB -c $(srcdir)/dyn_load.c -o $@
+
+mach_dep.o: $(srcdir)/mach_dep.c
+ -$(RM) mach_dep.o
+ $(CC) -c $(SPECIALCFLAGS) $(srcdir)/mach_dep.c
+
+mark_rts.o: $(srcdir)/mark_rts.c
+ -$(RM) mark_rts.o
+ $(CC) -c $(CFLAGS) $(srcdir)/mark_rts.c
+
+cord/cordbscs.o: $(srcdir)/cord/cordbscs.c $(CORD_INCLUDE_FILES)
+ $(CC) $(CFLAGS) -c $(srcdir)/cord/cordbscs.c
+ $(MV) cordbscs.o cord/cordbscs.o
+# not all compilers understand -o filename
+
+cord/cordxtra.o: $(srcdir)/cord/cordxtra.c $(CORD_INCLUDE_FILES)
+ $(CC) $(CFLAGS) -c $(srcdir)/cord/cordxtra.c
+ $(MV) cordxtra.o cord/cordxtra.o
+
+cord/cordprnt.o: $(srcdir)/cord/cordprnt.c $(CORD_INCLUDE_FILES)
+ $(CC) $(CFLAGS) -c $(srcdir)/cord/cordprnt.c
+ $(MV) cordprnt.o cord/cordprnt.o
+
+cord/cordtest$(EXE_SUFFIX): $(srcdir)/cord/cordtest.c $(CORD_OBJS) gc.a $(UTILS)
+ -$(RM) cord/cordtest$(EXE_SUFFIX)
+ $(CC) $(CFLAGS) -o cordtest $(srcdir)/cord/cordtest.c\
+ $(CORD_OBJS) gc.a
+ ./if_not_there cord/cordtest$(EXE_SUFFIX) \
+ $(MV) cordtest$(EXE_SUFFIX) cord/cordtest$(EXE_SUFFIX)
+
+cord/de$(EXE_SUFFIX): $(srcdir)/cord/de.c cord/cordbscs.o cord/cordxtra.o gc.a
+ -$(RM) cord/de$(EXE_SUFFIX)
+ ./if_mach SPARC DRSNX $(CC) $(CFLAGS) -o cord/de $(srcdir)/cord/de.c\
+cord/cordbscs.o cord/cordxtra.o gc.a $(CURSES) -lucb
+ ./if_mach HP_PA "" $(CC) $(CFLAGS) -o cord/de $(srcdir)/cord/de.c\
+cord/cordbscs.o cord/cordxtra.o gc.a $(CURSES) -ldld
+ ./if_mach RS6000 "" $(CC) $(CFLAGS) -o cord/de $(srcdir)/cord/de.c\
+cord/cordbscs.o cord/cordxtra.o gc.a -lcurses
+ ./if_mach I386 LINUX $(CC) $(CFLAGS) -o cord/de $(srcdir)/cord/de.c\
+cord/cordbscs.o cord/cordxtra.o gc.a -lcurses
+ ./if_not_there cord/de $(CC) $(CFLAGS) -o cord/de $(srcdir)/cord/de.c\
+cord/cordbscs.o cord/cordxtra.o gc.a $(CURSES)
+ ./if_not_there cord/de$(EXE_SUFFIX) \
+ $(MV) de$(EXE_SUFFIX) cord/de$(EXE_SUFFIX)
+
+if_mach$(EXE_SUFFIX): $(srcdir)/if_mach.c $(srcdir)/config.h
+ $(CC) $(CFLAGS) -o if_mach $(srcdir)/if_mach.c
+ -$(RM) if_mach
+
+threadlibs$(EXE_SUFFIX): $(srcdir)/threadlibs.c $(srcdir)/config.h Makefile
+ $(CC) $(CFLAGS) -o threadlibs $(srcdir)/threadlibs.c
+ -$(RM) threadlibs
+
+if_not_there$(EXE_SUFFIX): $(srcdir)/if_not_there.c
+ $(CC) $(CFLAGS) -o if_not_there $(srcdir)/if_not_there.c
+ -$(RM) if_not_there
+
+clean:
+ -$(RM) gc.a *.o
+ -$(RM) *.o
+ -$(RM) gctest gctest_dyn_link test_cpp \
+ setjmp_test mon.out gmon.out a.out core if_not_there if_mach \
+ $(CORD_OBJS) cordtest cord/cordtest de cord/de
+ -$(RM) gctest$(EXE_SUFFIX) gctest_dyn_link$(EXE_SUFFIX) test_cpp$(EXE_SUFFIX) \
+ setjmp_test$(EXE_SUFFIX) if_not_there$(EXE_SUFFIX) if_mach$(EXE_SUFFIX) \
+ cord/cordtest$(EXE_SUFFIX)
+ -$(RM) *~
+
+gctest$(EXE_SUFFIX): test.o gc.a
+ -$(RM) gctest$(EXE_SUFFIX)
+ $(CC) $(CFLAGS) -o gctest test.o gc.a
+ $(RM) gctest
+
+# If an optimized setjmp_test generates a segmentation fault,
+# odds are your compiler is broken. Gctest may still work.
+# Try compiling setjmp_t.c unoptimized.
+setjmp_test$(EXE_SUFFIX): $(srcdir)/setjmp_t.c $(srcdir)/gc.h \
+ if_mach$(EXE_SUFFIX) if_not_there$(EXE_SUFFIX)
+ -$(RM) setjmp_test$(EXE_SUFFIX)
+ $(CC) $(CFLAGS) -o setjmp_test $(srcdir)/setjmp_t.c
+ $(RM) setjmp_test
+
+test: KandRtest cord/cordtest$(EXE_SUFFIX)
+ ./cord/cordtest$(EXE_SUFFIX)
+
+# Those tests that work even with a K&R C compiler:
+KandRtest: setjmp_test$(EXE_SUFFIX) gctest$(EXE_SUFFIX)
+ ./setjmp_test$(EXE_SUFFIX)
+ ./gctest$(EXE_SUFFIX)
+
diff --git a/boehm-gc/Makefile.in b/boehm-gc/Makefile.in
new file mode 100644
index 00000000000..70ecbc45d96
--- /dev/null
+++ b/boehm-gc/Makefile.in
@@ -0,0 +1,518 @@
+# Makefile.in generated automatically by automake 1.4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = .
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_alias = @build_alias@
+build_triplet = @build@
+host_alias = @host_alias@
+host_triplet = @host@
+target_alias = @target_alias@
+target_triplet = @target@
+AR = @AR@
+AS = @AS@
+BOEHM_GC_CFLAGS = @BOEHM_GC_CFLAGS@
+CC = @CC@
+CPP = @CPP@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXINCLUDES = @CXXINCLUDES@
+DLLTOOL = @DLLTOOL@
+EXEEXT = @EXEEXT@
+INCLUDES = @INCLUDES@
+LD = @LD@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MY_CFLAGS = @MY_CFLAGS@
+NM = @NM@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+USE_SYMBOL_UNDERSCORE = @USE_SYMBOL_UNDERSCORE@
+VERSION = @VERSION@
+addobjs = @addobjs@
+boehm_gc_basedir = @boehm_gc_basedir@
+target_all = @target_all@
+
+AUTOMAKE_OPTIONS = cygnus
+
+# Multilib support variables.
+MULTISRCTOP =
+MULTIBUILDTOP =
+MULTIDIRS =
+MULTISUBDIR =
+MULTIDO = true
+MULTICLEAN = true
+@USE_LIBDIR_TRUE@toolexeclibdir = \
+@USE_LIBDIR_TRUE@$(libdir)
+@USE_LIBDIR_FALSE@toolexeclibdir = \
+@USE_LIBDIR_FALSE@$(toolexecdir)/lib$(MULTISUBDIR)
+@USE_LIBDIR_FALSE@toolexecdir = \
+@USE_LIBDIR_FALSE@$(exec_prefix)/$(target_alias)
+
+toolexeclib_LTLIBRARIES = $(target_all)
+EXTRA_LTLIBRARIES = libgcjgc.la
+libgcjgc_la_SOURCES = allchblk.c alloc.c blacklst.c checksums.c \
+config.h dbg_mlc.c dyn_load.c finalize.c gc.h gc_alloc.h gc_cpp.h \
+gc_hdrs.h gc_mark.h gc_priv.h gc_private.h gc_typed.h headers.c \
+irix_threads.c linux_threads.c malloc.c mallocx.c mark.c mark_rts.c \
+misc.c new_hblk.c obj_map.c os_dep.c pcr_interface.c ptr_chck.c \
+quick_threads.c real_malloc.c reclaim.c solaris_pthreads.c \
+solaris_threads.c solaris_threads.h stubborn.c typd_mlc.c version.h \
+weakpointer.h
+
+libgcjgc_la_LIBADD = @addobjs@
+libgcjgc_la_DEPENDENCIES = @addobjs@
+libgcjgc_la_LDFLAGS = -version-info 0:0:0 -rpath $(toolexeclibdir)
+
+EXTRA_libgcjgc_la_SOURCES = alpha_mach_dep.s mips_sgi_mach_dep.s \
+mips_ultrix_mach_dep.s rs6000_mach_dep.s sparc_mach_dep.s \
+sparc_sunos4_mach_dep.s mach_dep.c ecos.cc
+
+
+AM_CXXFLAGS = @BOEHM_GC_CFLAGS@
+
+AM_CFLAGS = @BOEHM_GC_CFLAGS@
+
+check_PROGRAMS = gctest
+gctest_SOURCES = test.c
+gctest_LDADD = ./libgcjgc.la
+
+all_objs = @addobjs@ $(libgcjgc_la_OBJECTS)
+
+LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(MY_CFLAGS) $(BOEHM_GC_CFLAGS)
+
+LINK = $(LIBTOOL) --mode=link $(CC) $(AM_CFLAGS) $(MY_CFLAGS) $(LDFLAGS) -o $@
+
+# Work around what appears to be a GNU make bug handling MAKEFLAGS
+# values defined in terms of make variables, as is the case for CC and
+# friends when we are called from the top level Makefile.
+AM_MAKEFLAGS = \
+ "AR_FLAGS=$(AR_FLAGS)" \
+ "CC_FOR_BUILD=$(CC_FOR_BUILD)" \
+ "CFLAGS=$(CFLAGS)" \
+ "CXXFLAGS=$(CXXFLAGS)" \
+ "CFLAGS_FOR_BUILD=$(CFLAGS_FOR_BUILD)" \
+ "CFLAGS_FOR_TARGET=$(CFLAGS_FOR_TARGET)" \
+ "INSTALL=$(INSTALL)" \
+ "INSTALL_DATA=$(INSTALL_DATA)" \
+ "INSTALL_PROGRAM=$(INSTALL_PROGRAM)" \
+ "INSTALL_SCRIPT=$(INSTALL_SCRIPT)" \
+ "LDFLAGS=$(LDFLAGS)" \
+ "LIBCFLAGS=$(LIBCFLAGS)" \
+ "LIBCFLAGS_FOR_TARGET=$(LIBCFLAGS_FOR_TARGET)" \
+ "MAKE=$(MAKE)" \
+ "MAKEINFO=$(MAKEINFO) $(MAKEINFOFLAGS)" \
+ "PICFLAG=$(PICFLAG)" \
+ "PICFLAG_FOR_TARGET=$(PICFLAG_FOR_TARGET)" \
+ "SHELL=$(SHELL)" \
+ "EXPECT=$(EXPECT)" \
+ "RUNTEST=$(RUNTEST)" \
+ "RUNTESTFLAGS=$(RUNTESTFLAGS)" \
+ "exec_prefix=$(exec_prefix)" \
+ "infodir=$(infodir)" \
+ "libdir=$(libdir)" \
+ "prefix=$(prefix)" \
+ "tooldir=$(tooldir)" \
+ "AR=$(AR)" \
+ "AS=$(AS)" \
+ "CC=$(CC)" \
+ "CXX=$(CXX)" \
+ "LD=$(LD)" \
+ "LIBCFLAGS=$(LIBCFLAGS)" \
+ "NM=$(NM)" \
+ "PICFLAG=$(PICFLAG)" \
+ "RANLIB=$(RANLIB)" \
+ "DESTDIR=$(DESTDIR)"
+
+
+CONFIG_STATUS_DEPENDENCIES = $(boehm_gc_basedir)/configure.host
+
+MAKEOVERRIDES =
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+mkinstalldirs = $(SHELL) $(top_srcdir)/../mkinstalldirs
+CONFIG_CLEAN_FILES =
+LTLIBRARIES = $(toolexeclib_LTLIBRARIES)
+
+
+DEFS = @DEFS@ -I. -I$(srcdir)
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+libgcjgc_la_OBJECTS = allchblk.lo alloc.lo blacklst.lo checksums.lo \
+dbg_mlc.lo dyn_load.lo finalize.lo headers.lo irix_threads.lo \
+linux_threads.lo malloc.lo mallocx.lo mark.lo mark_rts.lo misc.lo \
+new_hblk.lo obj_map.lo os_dep.lo pcr_interface.lo ptr_chck.lo \
+quick_threads.lo real_malloc.lo reclaim.lo solaris_pthreads.lo \
+solaris_threads.lo stubborn.lo typd_mlc.lo
+check_PROGRAMS = gctest$(EXEEXT)
+gctest_OBJECTS = test.o
+gctest_DEPENDENCIES = ./libgcjgc.la
+gctest_LDFLAGS =
+CXXFLAGS = @CXXFLAGS@
+CXXCOMPILE = $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --mode=compile $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(LDFLAGS) -o $@
+CFLAGS = @CFLAGS@
+COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+DIST_COMMON = README ChangeLog Makefile.am Makefile.in acinclude.m4 \
+aclocal.m4 configure configure.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = tar
+GZIP_ENV = --best
+SOURCES = $(libgcjgc_la_SOURCES) $(EXTRA_libgcjgc_la_SOURCES) $(gctest_SOURCES)
+OBJECTS = $(libgcjgc_la_OBJECTS) $(gctest_OBJECTS)
+
+all: all-redirect
+.SUFFIXES:
+.SUFFIXES: .S .c .cc .lo .o .s
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+ cd $(top_srcdir) && $(AUTOMAKE) --cygnus Makefile
+
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ cd $(top_builddir) \
+ && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ configure.in acinclude.m4
+ cd $(srcdir) && $(ACLOCAL)
+
+config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ $(SHELL) ./config.status --recheck
+$(srcdir)/configure: @MAINTAINER_MODE_TRUE@$(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES)
+ cd $(srcdir) && $(AUTOCONF)
+
+mostlyclean-toolexeclibLTLIBRARIES:
+
+clean-toolexeclibLTLIBRARIES:
+ -test -z "$(toolexeclib_LTLIBRARIES)" || rm -f $(toolexeclib_LTLIBRARIES)
+
+distclean-toolexeclibLTLIBRARIES:
+
+maintainer-clean-toolexeclibLTLIBRARIES:
+
+install-toolexeclibLTLIBRARIES: $(toolexeclib_LTLIBRARIES)
+ @$(NORMAL_INSTALL)
+ $(mkinstalldirs) $(DESTDIR)$(toolexeclibdir)
+ @list='$(toolexeclib_LTLIBRARIES)'; for p in $$list; do \
+ if test -f $$p; then \
+ echo "$(LIBTOOL) --mode=install $(INSTALL) $$p $(DESTDIR)$(toolexeclibdir)/$$p"; \
+ $(LIBTOOL) --mode=install $(INSTALL) $$p $(DESTDIR)$(toolexeclibdir)/$$p; \
+ else :; fi; \
+ done
+
+uninstall-toolexeclibLTLIBRARIES:
+ @$(NORMAL_UNINSTALL)
+ list='$(toolexeclib_LTLIBRARIES)'; for p in $$list; do \
+ $(LIBTOOL) --mode=uninstall rm -f $(DESTDIR)$(toolexeclibdir)/$$p; \
+ done
+
+.c.o:
+ $(COMPILE) -c $<
+
+.s.o:
+ $(COMPILE) -c $<
+
+.S.o:
+ $(COMPILE) -c $<
+
+mostlyclean-compile:
+ -rm -f *.o core *.core
+
+clean-compile:
+
+distclean-compile:
+ -rm -f *.tab.c
+
+maintainer-clean-compile:
+
+.c.lo:
+ $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+
+.S.lo:
+ $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+
+maintainer-clean-libtool:
+
+libgcjgc.la: $(libgcjgc_la_OBJECTS) $(libgcjgc_la_DEPENDENCIES)
+ $(LINK) $(libgcjgc_la_LDFLAGS) $(libgcjgc_la_OBJECTS) $(libgcjgc_la_LIBADD) $(LIBS)
+
+mostlyclean-checkPROGRAMS:
+
+clean-checkPROGRAMS:
+ -test -z "$(check_PROGRAMS)" || rm -f $(check_PROGRAMS)
+
+distclean-checkPROGRAMS:
+
+maintainer-clean-checkPROGRAMS:
+
+gctest$(EXEEXT): $(gctest_OBJECTS) $(gctest_DEPENDENCIES)
+ @rm -f gctest$(EXEEXT)
+ $(LINK) $(gctest_LDFLAGS) $(gctest_OBJECTS) $(gctest_LDADD) $(LIBS)
+.cc.o:
+ $(CXXCOMPILE) -c $<
+.cc.lo:
+ $(LTCXXCOMPILE) -c $<
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ here=`pwd` && cd $(srcdir) \
+ && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+ || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+ -rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+
+# This target untars the dist file and tries a VPATH configuration. Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+ -rm -rf $(distdir)
+ GZIP=$(GZIP_ENV) $(TAR) zxf $(distdir).tar.gz
+ mkdir $(distdir)/=build
+ mkdir $(distdir)/=inst
+ dc_install_base=`cd $(distdir)/=inst && pwd`; \
+ cd $(distdir)/=build \
+ && ../configure --srcdir=.. --prefix=$$dc_install_base \
+ && $(MAKE) $(AM_MAKEFLAGS) \
+ && $(MAKE) $(AM_MAKEFLAGS) dvi \
+ && $(MAKE) $(AM_MAKEFLAGS) check \
+ && $(MAKE) $(AM_MAKEFLAGS) install \
+ && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+ && $(MAKE) $(AM_MAKEFLAGS) dist
+ -rm -rf $(distdir)
+ @banner="$(distdir).tar.gz is ready for distribution"; \
+ dashes=`echo "$$banner" | sed s/./=/g`; \
+ echo "$$dashes"; \
+ echo "$$banner"; \
+ echo "$$dashes"
+dist: distdir
+ -chmod -R a+r $(distdir)
+ GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir)
+ -rm -rf $(distdir)
+dist-all: distdir
+ -chmod -R a+r $(distdir)
+ GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir)
+ -rm -rf $(distdir)
+distdir: $(DISTFILES)
+ -rm -rf $(distdir)
+ mkdir $(distdir)
+ -chmod 777 $(distdir)
+ @for file in $(DISTFILES); do \
+ if test -f $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ cp -pr $$/$$file $(distdir)/$$file; \
+ else \
+ test -f $(distdir)/$$file \
+ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+ || cp -p $$d/$$file $(distdir)/$$file || :; \
+ fi; \
+ done
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: $(check_PROGRAMS)
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-info-am:
+install-info: install-info-am
+install-exec-am: install-toolexeclibLTLIBRARIES
+install-exec: install-exec-am
+
+install-data-am:
+install-data: install-data-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am: uninstall-toolexeclibLTLIBRARIES
+uninstall: uninstall-am
+all-am: Makefile $(LTLIBRARIES)
+all-redirect: all-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+ $(mkinstalldirs) $(DESTDIR)$(toolexeclibdir)
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES)
+ -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am: mostlyclean-toolexeclibLTLIBRARIES mostlyclean-compile \
+ mostlyclean-libtool mostlyclean-checkPROGRAMS \
+ mostlyclean-tags mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am: clean-toolexeclibLTLIBRARIES clean-compile clean-libtool \
+ clean-checkPROGRAMS clean-tags clean-generic \
+ mostlyclean-am
+
+clean: clean-am
+
+distclean-am: distclean-toolexeclibLTLIBRARIES distclean-compile \
+ distclean-libtool distclean-checkPROGRAMS \
+ distclean-tags distclean-generic clean-am
+ -rm -f libtool
+
+distclean: distclean-am
+ -rm -f config.status
+
+maintainer-clean-am: maintainer-clean-toolexeclibLTLIBRARIES \
+ maintainer-clean-compile maintainer-clean-libtool \
+ maintainer-clean-checkPROGRAMS maintainer-clean-tags \
+ maintainer-clean-generic distclean-am
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+ -rm -f config.status
+
+.PHONY: mostlyclean-toolexeclibLTLIBRARIES \
+distclean-toolexeclibLTLIBRARIES clean-toolexeclibLTLIBRARIES \
+maintainer-clean-toolexeclibLTLIBRARIES \
+uninstall-toolexeclibLTLIBRARIES install-toolexeclibLTLIBRARIES \
+mostlyclean-compile distclean-compile clean-compile \
+maintainer-clean-compile mostlyclean-libtool distclean-libtool \
+clean-libtool maintainer-clean-libtool mostlyclean-checkPROGRAMS \
+distclean-checkPROGRAMS clean-checkPROGRAMS \
+maintainer-clean-checkPROGRAMS tags mostlyclean-tags distclean-tags \
+clean-tags maintainer-clean-tags distdir info-am info dvi-am dvi check \
+check-am installcheck-am installcheck install-info-am install-info \
+install-exec-am install-exec install-data-am install-data install-am \
+install uninstall-am uninstall all-redirect all-am all installdirs \
+mostlyclean-generic distclean-generic clean-generic \
+maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+
+$(all_objs) : config.h gc_priv.h gc_hdrs.h gc.h gc_mark.h
+
+.s.lo:
+ $(LTCOMPILE) -Wp,-P -x assembler-with-cpp -c $<
+
+# Multilib support.
+.PHONY: all-multi mostlyclean-multi clean-multi distclean-multi \
+ maintainer-clean-multi
+
+all-am: all-multi
+install-am: install-multi
+mostlyclean-am: mostlyclean-multi
+clean-am: clean-multi
+distclean-am: distclean-multi
+maintainer-clean-am: maintainer-clean-multi
+
+all-multi:
+ $(MULTIDO) $(AM_MAKEFLAGS) DO=all multi-do
+install-multi:
+ $(MULTIDO) $(AM_MAKEFLAGS) DO=install multi-do
+mostlyclean-multi:
+ $(MULTICLEAN) $(AM_MAKEFLAGS) DO=mostlyclean multi-clean
+clean-multi:
+ $(MULTICLEAN) $(AM_MAKEFLAGS) DO=clean multi-clean
+distclean-multi:
+ $(MULTICLEAN) $(AM_MAKEFLAGS) DO=distclean multi-clean
+maintainer-clean-multi:
+ $(MULTICLEAN) $(AM_MAKEFLAGS) DO=maintainer-clean multi-clean
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/boehm-gc/Makefile.orig b/boehm-gc/Makefile.orig
new file mode 100644
index 00000000000..056df2f66f7
--- /dev/null
+++ b/boehm-gc/Makefile.orig
@@ -0,0 +1,400 @@
+# Primary targets:
+# gc.a - builds basic library
+# libgc.a - builds library for use with g++ "-fgc-keyword" extension
+# c++ - adds C++ interface to library
+# cords - adds cords (heavyweight strings) to library
+# test - prints porting information, then builds basic version of gc.a,
+# and runs some tests of collector and cords. Does not add cords or
+# c++ interface to gc.a
+# cord/de - builds dumb editor based on cords.
+ABI_FLAG=
+CC=cc $(ABI_FLAG)
+CXX=CC $(ABI_FLAG)
+AS=as $(ABI_FLAG)
+# The above doesn't work with gas, which doesn't run cpp.
+# Define AS as `gcc -c -x assembler-with-cpp' instead.
+# Under Irix 6, you will have to specify the ABI for as if you specify
+# it for the C compiler.
+
+CFLAGS= -O -DATOMIC_UNCOLLECTABLE -DNO_SIGNALS -DALL_INTERIOR_POINTERS -DNO_EXECUTE_PERMISSION -DSILENT
+
+# Setjmp_test may yield overly optimistic results when compiled
+# without optimization.
+# -DSILENT disables statistics printing, and improves performance.
+# -DCHECKSUMS reports on erroneously clear dirty bits, and unexpectedly
+# altered stubborn objects, at substantial performance cost.
+# Use only for incremental collector debugging.
+# -DFIND_LEAK causes the collector to assume that all inaccessible
+# objects should have been explicitly deallocated, and reports exceptions.
+# Finalization and the test program are not usable in this mode.
+# -DSOLARIS_THREADS enables support for Solaris (thr_) threads.
+# (Clients should also define SOLARIS_THREADS and then include
+# gc.h before performing thr_ or dl* or GC_ operations.)
+# Must also define -D_REENTRANT
+# -D_SOLARIS_PTHREADS enables support for Solaris pthreads.
+# Define SOLARIS_THREADS as well.
+# -DIRIX_THREADS enables support for Irix pthreads. See README.irix.
+# -DALL_INTERIOR_POINTERS allows all pointers to the interior
+# of objects to be recognized. (See gc_priv.h for consequences.)
+# -DSMALL_CONFIG tries to tune the collector for small heap sizes,
+# usually causing it to use less space in such situations.
+# Incremental collection no longer works in this case.
+# -DLARGE_CONFIG tunes the collector for unusually large heaps.
+# Necessary for heaps larger than about 500 MB on most machines.
+# Recommended for heaps larger than about 64 MB.
+# -DDONT_ADD_BYTE_AT_END is meaningful only with
+# -DALL_INTERIOR_POINTERS. Normally -DALL_INTERIOR_POINTERS
+# causes all objects to be padded so that pointers just past the end of
+# an object can be recognized. This can be expensive. (The padding
+# is normally more than one byte due to alignment constraints.)
+# -DDONT_ADD_BYTE_AT_END disables the padding.
+# -DNO_SIGNALS does not disable signals during critical parts of
+# the GC process. This is no less correct than many malloc
+# implementations, and it sometimes has a significant performance
+# impact. However, it is dangerous for many not-quite-ANSI C
+# programs that call things like printf in asynchronous signal handlers.
+# -DNO_EXECUTE_PERMISSION may cause some or all of the heap to not
+# have execute permission, i.e. it may be impossible to execute
+# code from the heap. Currently this only affects the incremental
+# collector on UNIX machines. It may greatly improve its performance,
+# since this may avoid some expensive cache synchronization.
+# -DOPERATOR_NEW_ARRAY declares that the C++ compiler supports the
+# new syntax "operator new[]" for allocating and deleting arrays.
+# See gc_cpp.h for details. No effect on the C part of the collector.
+# This is defined implicitly in a few environments.
+# -DREDIRECT_MALLOC=X causes malloc, realloc, and free to be defined
+# as aliases for X, GC_realloc, and GC_free, respectively.
+# Calloc is redefined in terms of the new malloc. X should
+# be either GC_malloc or GC_malloc_uncollectable.
+# The former is occasionally useful for working around leaks in code
+# you don't want to (or can't) look at. It may not work for
+# existing code, but it often does. Neither works on all platforms,
+# since some ports use malloc or calloc to obtain system memory.
+# (Probably works for UNIX, and win32.)
+# -DIGNORE_FREE turns calls to free into a noop. Only useful with
+# -DREDIRECT_MALLOC.
+# -DNO_DEBUGGING removes GC_dump and the debugging routines it calls.
+# Reduces code size slightly at the expense of debuggability.
+# -DJAVA_FINALIZATION makes it somewhat safer to finalize objects out of
+# order by specifying a nonstandard finalization mark procedure (see
+# finalize.c). Objects reachable from finalizable objects will be marked
+# in a sepearte postpass, and hence their memory won't be reclaimed.
+# Not recommended unless you are implementing a language that specifies
+# these semantics.
+# -DFINALIZE_ON_DEMAND causes finalizers to be run only in response
+# to explicit GC_invoke_finalizers() calls.
+# -DATOMIC_UNCOLLECTABLE includes code for GC_malloc_atomic_uncollectable.
+# This is useful if either the vendor malloc implementation is poor,
+# or if REDIRECT_MALLOC is used.
+# -DHBLKSIZE=ddd, where ddd is a power of 2 between 512 and 16384, explicitly
+# sets the heap block size. Each heap block is devoted to a single size and
+# kind of object. For the incremental collector it makes sense to match
+# the most likely page size. Otherwise large values result in more
+# fragmentation, but generally better performance for large heaps.
+# -DUSE_MMAP use MMAP instead of sbrk to get new memory.
+# Works for Solaris and Irix.
+# -DMMAP_STACKS (for Solaris threads) Use mmap from /dev/zero rather than
+# GC_scratch_alloc() to get stack memory.
+# -DPRINT_BLACK_LIST Whenever a black list entry is added, i.e. whenever
+# the garbage collector detects a value that looks almost, but not quite,
+# like a pointer, print both the address containing the value, and the
+# value of the near-bogus-pointer. Can be used to identifiy regions of
+# memory that are likely to contribute misidentified pointers.
+# -DOLD_BLOCK_ALLOC Use the old, possibly faster, large block
+# allocation strategy. The new strategy tries harder to minimize
+# fragmentation, sometimes at the expense of spending more time in the
+# large block allocator and/or collecting more frequently.
+#
+
+
+
+LIBGC_CFLAGS= -O -DNO_SIGNALS -DSILENT \
+ -DREDIRECT_MALLOC=GC_malloc_uncollectable \
+ -DDONT_ADD_BYTE_AT_END -DALL_INTERIOR_POINTERS
+# Flags for building libgc.a -- the last two are required.
+
+CXXFLAGS= $(CFLAGS)
+AR= ar
+RANLIB= ranlib
+
+
+# Redefining srcdir allows object code for the nonPCR version of the collector
+# to be generated in different directories. In this case, the destination directory
+# should contain a copy of the original include directory.
+srcdir = .
+VPATH = $(srcdir)
+
+OBJS= alloc.o reclaim.o allchblk.o misc.o mach_dep.o os_dep.o mark_rts.o headers.o mark.o obj_map.o blacklst.o finalize.o new_hblk.o dbg_mlc.o malloc.o stubborn.o checksums.o solaris_threads.o irix_threads.o linux_threads.o typd_mlc.o ptr_chck.o mallocx.o solaris_pthreads.o
+
+CSRCS= reclaim.c allchblk.c misc.c alloc.c mach_dep.c os_dep.c mark_rts.c headers.c mark.c obj_map.c pcr_interface.c blacklst.c finalize.c new_hblk.c real_malloc.c dyn_load.c dbg_mlc.c malloc.c stubborn.c checksums.c solaris_threads.c irix_threads.c linux_threads.c typd_mlc.c ptr_chck.c mallocx.c solaris_pthreads.c
+
+CORD_SRCS= cord/cordbscs.c cord/cordxtra.c cord/cordprnt.c cord/de.c cord/cordtest.c cord/cord.h cord/ec.h cord/private/cord_pos.h cord/de_win.c cord/de_win.h cord/de_cmds.h cord/de_win.ICO cord/de_win.RC cord/SCOPTIONS.amiga cord/SMakefile.amiga
+
+CORD_OBJS= cord/cordbscs.o cord/cordxtra.o cord/cordprnt.o
+
+SRCS= $(CSRCS) mips_sgi_mach_dep.s rs6000_mach_dep.s alpha_mach_dep.s \
+ sparc_mach_dep.s gc.h gc_typed.h gc_hdrs.h gc_priv.h gc_private.h \
+ config.h gc_mark.h include/gc_inl.h include/gc_inline.h gc.man \
+ threadlibs.c if_mach.c if_not_there.c gc_cpp.cc gc_cpp.h weakpointer.h \
+ gcc_support.c mips_ultrix_mach_dep.s include/gc_alloc.h gc_alloc.h \
+ sparc_sunos4_mach_dep.s solaris_threads.h $(CORD_SRCS)
+
+OTHER_FILES= Makefile PCR-Makefile OS2_MAKEFILE NT_MAKEFILE BCC_MAKEFILE \
+ README test.c test_cpp.cc setjmp_t.c SMakefile.amiga \
+ SCoptions.amiga README.amiga README.win32 cord/README \
+ cord/gc.h include/gc.h include/gc_typed.h include/cord.h \
+ include/ec.h include/private/cord_pos.h include/private/config.h \
+ include/private/gc_hdrs.h include/private/gc_priv.h \
+ include/gc_cpp.h README.rs6000 \
+ include/weakpointer.h README.QUICK callprocs pc_excludes \
+ barrett_diagram README.OS2 README.Mac MacProjects.sit.hqx \
+ MacOS.c EMX_MAKEFILE makefile.depend README.debugging \
+ include/gc_cpp.h Mac_files/datastart.c Mac_files/dataend.c \
+ Mac_files/MacOS_config.h Mac_files/MacOS_Test_config.h \
+ add_gc_prefix.c README.solaris2 README.sgi README.hp README.uts \
+ win32_threads.c NT_THREADS_MAKEFILE gc.mak README.dj Makefile.dj \
+ README.alpha README.linux version.h Makefile.DLLs gc_watcom.asm \
+ WCC_MAKEFILE
+
+CORD_INCLUDE_FILES= $(srcdir)/gc.h $(srcdir)/cord/cord.h $(srcdir)/cord/ec.h \
+ $(srcdir)/cord/private/cord_pos.h
+
+UTILS= if_mach if_not_there threadlibs
+
+# Libraries needed for curses applications. Only needed for de.
+CURSES= -lcurses -ltermlib
+
+# The following is irrelevant on most systems. But a few
+# versions of make otherwise fork the shell specified in
+# the SHELL environment variable.
+SHELL= /bin/sh
+
+SPECIALCFLAGS =
+# Alternative flags to the C compiler for mach_dep.c.
+# Mach_dep.c often doesn't like optimization, and it's
+# not time-critical anyway.
+# Set SPECIALCFLAGS to -q nodirect_code on Encore.
+
+all: gc.a gctest
+
+pcr: PCR-Makefile gc_private.h gc_hdrs.h gc.h config.h mach_dep.o $(SRCS)
+ make -f PCR-Makefile depend
+ make -f PCR-Makefile
+
+$(OBJS) test.o dyn_load.o dyn_load_sunos53.o: $(srcdir)/gc_priv.h $(srcdir)/gc_hdrs.h $(srcdir)/gc.h \
+ $(srcdir)/config.h $(srcdir)/gc_typed.h Makefile
+# The dependency on Makefile is needed. Changing
+# options such as -DSILENT affects the size of GC_arrays,
+# invalidating all .o files that rely on gc_priv.h
+
+mark.o typd_mlc.o finalize.o: $(srcdir)/gc_mark.h
+
+base_lib gc.a: $(OBJS) dyn_load.o $(UTILS)
+ echo > base_lib
+ rm -f on_sparc_sunos5
+ ./if_mach SPARC SUNOS5 touch on_sparc_sunos5
+ ./if_mach SPARC SUNOS5 $(AR) rus gc.a $(OBJS) dyn_load.o
+ ./if_not_there on_sparc_sunos5 $(AR) ru gc.a $(OBJS) dyn_load.o
+ ./if_not_there on_sparc_sunos5 $(RANLIB) gc.a || cat /dev/null
+# ignore ranlib failure; that usually means it doesn't exist, and isn't needed
+
+libgc.a:
+ make CFLAGS="$(LIBGC_CFLAGS)" clean gc.a gcc_support.o
+ mv gc.a libgc.a
+ rm -f on_sparc_sunos5
+ ./if_mach SPARC SUNOS5 touch on_sparc_sunos5
+ ./if_mach SPARC SUNOS5 $(AR) rus libgc.a gcc_support.o
+ ./if_not_there on_sparc_sunos5 $(AR) ru libgc.a gcc_support.o
+ ./if_not_there on_sparc_sunos5 $(RANLIB) libgc.a || cat /dev/null
+
+cords: $(CORD_OBJS) cord/cordtest $(UTILS)
+ rm -f on_sparc_sunos5
+ ./if_mach SPARC SUNOS5 touch on_sparc_sunos5
+ ./if_mach SPARC SUNOS5 $(AR) rus gc.a $(CORD_OBJS)
+ ./if_not_there on_sparc_sunos5 $(AR) ru gc.a $(CORD_OBJS)
+ ./if_not_there on_sparc_sunos5 $(RANLIB) gc.a || cat /dev/null
+
+gc_cpp.o: $(srcdir)/gc_cpp.cc $(srcdir)/gc_cpp.h $(srcdir)/gc.h Makefile
+ $(CXX) -c $(CXXFLAGS) $(srcdir)/gc_cpp.cc
+
+test_cpp: $(srcdir)/test_cpp.cc $(srcdir)/gc_cpp.h gc_cpp.o $(srcdir)/gc.h \
+base_lib $(UTILS)
+ rm -f test_cpp
+ ./if_mach HP_PA "" $(CXX) $(CXXFLAGS) -o test_cpp $(srcdir)/test_cpp.cc gc_cpp.o gc.a -ldld
+ ./if_not_there test_cpp $(CXX) $(CXXFLAGS) -o test_cpp $(srcdir)/test_cpp.cc gc_cpp.o gc.a `./threadlibs`
+
+c++: gc_cpp.o $(srcdir)/gc_cpp.h test_cpp
+ rm -f on_sparc_sunos5
+ ./if_mach SPARC SUNOS5 touch on_sparc_sunos5
+ ./if_mach SPARC SUNOS5 $(AR) rus gc.a gc_cpp.o
+ ./if_not_there on_sparc_sunos5 $(AR) ru gc.a gc_cpp.o
+ ./if_not_there on_sparc_sunos5 $(RANLIB) gc.a || cat /dev/null
+ ./test_cpp 1
+ echo > c++
+
+dyn_load_sunos53.o: dyn_load.c
+ $(CC) $(CFLAGS) -DSUNOS53_SHARED_LIB -c $(srcdir)/dyn_load.c -o $@
+
+# SunOS5 shared library version of the collector
+libgc.so: $(OBJS) dyn_load_sunos53.o
+ $(CC) -G -o libgc.so $(OBJS) dyn_load_sunos53.o -ldl
+
+# Alpha/OSF shared library version of the collector
+libalphagc.so: $(OBJS)
+ ld -shared -o libalphagc.so $(OBJS) dyn_load.o -lc
+ ln libalphagc.so libgc.so
+
+# IRIX shared library version of the collector
+libirixgc.so: $(OBJS) dyn_load.o
+ ld -shared $(ABI_FLAG) -o libirixgc.so $(OBJS) dyn_load.o -lc
+ ln libirixgc.so libgc.so
+
+mach_dep.o: $(srcdir)/mach_dep.c $(srcdir)/mips_sgi_mach_dep.s $(srcdir)/mips_ultrix_mach_dep.s $(srcdir)/rs6000_mach_dep.s $(UTILS)
+ rm -f mach_dep.o
+ ./if_mach MIPS IRIX5 $(AS) -o mach_dep.o $(srcdir)/mips_sgi_mach_dep.s
+ ./if_mach MIPS RISCOS $(AS) -o mach_dep.o $(srcdir)/mips_ultrix_mach_dep.s
+ ./if_mach MIPS ULTRIX $(AS) -o mach_dep.o $(srcdir)/mips_ultrix_mach_dep.s
+ ./if_mach RS6000 "" $(AS) -o mach_dep.o $(srcdir)/rs6000_mach_dep.s
+ ./if_mach ALPHA "" $(AS) -o mach_dep.o $(srcdir)/alpha_mach_dep.s
+ ./if_mach SPARC SUNOS5 $(AS) -o mach_dep.o $(srcdir)/sparc_mach_dep.s
+ ./if_mach SPARC SUNOS4 $(AS) -o mach_dep.o $(srcdir)/sparc_sunos4_mach_dep.s
+ ./if_not_there mach_dep.o $(CC) -c $(SPECIALCFLAGS) $(srcdir)/mach_dep.c
+
+mark_rts.o: $(srcdir)/mark_rts.c if_mach if_not_there $(UTILS)
+ rm -f mark_rts.o
+ -./if_mach ALPHA OSF1 $(CC) -c $(CFLAGS) -Wo,-notail $(srcdir)/mark_rts.c
+ ./if_not_there mark_rts.o $(CC) -c $(CFLAGS) $(srcdir)/mark_rts.c
+# Work-around for DEC optimizer tail recursion elimination bug.
+# The ALPHA-specific line should be removed if gcc is used.
+
+alloc.o: version.h
+
+cord/cordbscs.o: $(srcdir)/cord/cordbscs.c $(CORD_INCLUDE_FILES)
+ $(CC) $(CFLAGS) -c $(srcdir)/cord/cordbscs.c
+ mv cordbscs.o cord/cordbscs.o
+# not all compilers understand -o filename
+
+cord/cordxtra.o: $(srcdir)/cord/cordxtra.c $(CORD_INCLUDE_FILES)
+ $(CC) $(CFLAGS) -c $(srcdir)/cord/cordxtra.c
+ mv cordxtra.o cord/cordxtra.o
+
+cord/cordprnt.o: $(srcdir)/cord/cordprnt.c $(CORD_INCLUDE_FILES)
+ $(CC) $(CFLAGS) -c $(srcdir)/cord/cordprnt.c
+ mv cordprnt.o cord/cordprnt.o
+
+cord/cordtest: $(srcdir)/cord/cordtest.c $(CORD_OBJS) gc.a $(UTILS)
+ rm -f cord/cordtest
+ ./if_mach SPARC DRSNX $(CC) $(CFLAGS) -o cord/cordtest $(srcdir)/cord/cordtest.c $(CORD_OBJS) gc.a -lucb
+ ./if_mach HP_PA "" $(CC) $(CFLAGS) -o cord/cordtest $(srcdir)/cord/cordtest.c $(CORD_OBJS) gc.a -ldld
+ ./if_not_there cord/cordtest $(CC) $(CFLAGS) -o cord/cordtest $(srcdir)/cord/cordtest.c $(CORD_OBJS) gc.a `./threadlibs`
+
+cord/de: $(srcdir)/cord/de.c cord/cordbscs.o cord/cordxtra.o gc.a $(UTILS)
+ rm -f cord/de
+ ./if_mach SPARC DRSNX $(CC) $(CFLAGS) -o cord/de $(srcdir)/cord/de.c cord/cordbscs.o cord/cordxtra.o gc.a $(CURSES) -lucb
+ ./if_mach HP_PA "" $(CC) $(CFLAGS) -o cord/de $(srcdir)/cord/de.c cord/cordbscs.o cord/cordxtra.o gc.a $(CURSES) -ldld
+ ./if_mach RS6000 "" $(CC) $(CFLAGS) -o cord/de $(srcdir)/cord/de.c cord/cordbscs.o cord/cordxtra.o gc.a -lcurses
+ ./if_mach I386 LINUX $(CC) $(CFLAGS) -o cord/de $(srcdir)/cord/de.c cord/cordbscs.o cord/cordxtra.o gc.a -lcurses
+ ./if_mach ALPHA LINUX $(CC) $(CFLAGS) -o cord/de $(srcdir)/cord/de.c cord/cordbscs.o cord/cordxtra.o gc.a -lcurses
+ ./if_not_there cord/de $(CC) $(CFLAGS) -o cord/de $(srcdir)/cord/de.c cord/cordbscs.o cord/cordxtra.o gc.a $(CURSES) `./threadlibs`
+
+if_mach: $(srcdir)/if_mach.c $(srcdir)/config.h
+ $(CC) $(CFLAGS) -o if_mach $(srcdir)/if_mach.c
+
+threadlibs: $(srcdir)/threadlibs.c $(srcdir)/config.h Makefile
+ $(CC) $(CFLAGS) -o threadlibs $(srcdir)/threadlibs.c
+
+if_not_there: $(srcdir)/if_not_there.c
+ $(CC) $(CFLAGS) -o if_not_there $(srcdir)/if_not_there.c
+
+clean:
+ rm -f gc.a *.o gctest gctest_dyn_link test_cpp \
+ setjmp_test mon.out gmon.out a.out core if_not_there if_mach \
+ threadlibs $(CORD_OBJS) cord/cordtest cord/de
+ -rm -f *~
+
+gctest: test.o gc.a if_mach if_not_there
+ rm -f gctest
+ ./if_mach SPARC DRSNX $(CC) $(CFLAGS) -o gctest test.o gc.a -lucb
+ ./if_mach HP_PA "" $(CC) $(CFLAGS) -o gctest test.o gc.a -ldld
+ ./if_not_there gctest $(CC) $(CFLAGS) -o gctest test.o gc.a `./threadlibs`
+
+# If an optimized setjmp_test generates a segmentation fault,
+# odds are your compiler is broken. Gctest may still work.
+# Try compiling setjmp_t.c unoptimized.
+setjmp_test: $(srcdir)/setjmp_t.c $(srcdir)/gc.h if_mach if_not_there
+ $(CC) $(CFLAGS) -o setjmp_test $(srcdir)/setjmp_t.c
+
+test: KandRtest cord/cordtest
+ cord/cordtest
+
+# Those tests that work even with a K&R C compiler:
+KandRtest: setjmp_test gctest
+ ./setjmp_test
+ ./gctest
+
+add_gc_prefix: add_gc_prefix.c
+ $(CC) -o add_gc_prefix $(srcdir)/add_gc_prefix.c
+
+gc.tar: $(SRCS) $(OTHER_FILES) add_gc_prefix
+ ./add_gc_prefix $(SRCS) $(OTHER_FILES) > /tmp/gc.tar-files
+ (cd $(srcdir)/.. ; tar cvfh - `cat /tmp/gc.tar-files`) > gc.tar
+
+pc_gc.tar: $(SRCS) $(OTHER_FILES)
+ tar cvfX pc_gc.tar pc_excludes $(SRCS) $(OTHER_FILES)
+
+floppy: pc_gc.tar
+ -mmd a:/cord
+ -mmd a:/cord/private
+ -mmd a:/include
+ -mmd a:/include/private
+ mkdir /tmp/pc_gc
+ cat pc_gc.tar | (cd /tmp/pc_gc; tar xvf -)
+ -mcopy -tmn /tmp/pc_gc/* a:
+ -mcopy -tmn /tmp/pc_gc/cord/* a:/cord
+ -mcopy -mn /tmp/pc_gc/cord/de_win.ICO a:/cord
+ -mcopy -tmn /tmp/pc_gc/cord/private/* a:/cord/private
+ -mcopy -tmn /tmp/pc_gc/include/* a:/include
+ -mcopy -tmn /tmp/pc_gc/include/private/* a:/include/private
+ rm -r /tmp/pc_gc
+
+gc.tar.Z: gc.tar
+ compress gc.tar
+
+gc.tar.gz: gc.tar
+ gzip gc.tar
+
+lint: $(CSRCS) test.c
+ lint -DLINT $(CSRCS) test.c | egrep -v "possible pointer alignment problem|abort|exit|sbrk|mprotect|syscall"
+
+# BTL: added to test shared library version of collector.
+# Currently works only under SunOS5. Requires GC_INIT call from statically
+# loaded client code.
+ABSDIR = `pwd`
+gctest_dyn_link: test.o libgc.so
+ $(CC) -L$(ABSDIR) -R$(ABSDIR) -o gctest_dyn_link test.o -lgc -ldl -lthread
+
+gctest_irix_dyn_link: test.o libirixgc.so
+ $(CC) -L$(ABSDIR) -o gctest_irix_dyn_link test.o -lirixgc
+
+test_dll.o: test.c libgc_globals.h
+ $(CC) $(CFLAGS) -DGC_USE_DLL -c test.c -o test_dll.o
+
+test_dll: test_dll.o libgc_dll.a libgc.dll
+ $(CC) test_dll.o -L$(ABSDIR) -lgc_dll -o test_dll
+
+SYM_PREFIX-libgc=GC
+
+# Uncomment the following line to build a GNU win32 DLL
+# include Makefile.DLLs
+
+reserved_namespace: $(SRCS)
+ for file in $(SRCS) test.c test_cpp.cc; do \
+ sed s/GC_/_GC_/g < $$file > tmp; \
+ cp tmp $$file; \
+ done
+
+user_namespace: $(SRCS)
+ for file in $(SRCS) test.c test_cpp.cc; do \
+ sed s/_GC_/GC_/g < $$file > tmp; \
+ cp tmp $$file; \
+ done
diff --git a/boehm-gc/NT_MAKEFILE b/boehm-gc/NT_MAKEFILE
new file mode 100644
index 00000000000..52f6f4ae3a0
--- /dev/null
+++ b/boehm-gc/NT_MAKEFILE
@@ -0,0 +1,59 @@
+# Makefile for Windows NT. Assumes Microsoft compiler, and a single thread.
+# DLLs are included in the root set under NT, but not under win32S.
+# Use "nmake nodebug=1 all" for optimized versions of library, gctest and editor.
+
+CPU= i386
+!include <ntwin32.mak>
+
+OBJS= alloc.obj reclaim.obj allchblk.obj misc.obj mach_dep.obj os_dep.obj mark_rts.obj headers.obj mark.obj obj_map.obj blacklst.obj finalize.obj new_hblk.obj dbg_mlc.obj malloc.obj stubborn.obj dyn_load.obj typd_mlc.obj ptr_chck.obj gc_cpp.obj mallocx.obj
+
+all: gctest.exe cord\de.exe test_cpp.exe
+
+.c.obj:
+ $(cc) $(cdebug) $(cflags) $(cvars) -DSMALL_CONFIG -DSILENT -DALL_INTERIOR_POINTERS -D__STDC__ $*.c /Fo$*.obj
+
+.cpp.obj:
+ $(cc) $(cdebug) $(cflags) $(cvars) -DSMALL_CONFIG -DSILENT -DALL_INTERIOR_POINTERS $*.CPP /Fo$*.obj
+
+$(OBJS) test.obj: gc_priv.h gc_hdrs.h gc.h
+
+gc.lib: $(OBJS)
+ lib /MACHINE:i386 /out:gc.lib $(OBJS)
+# The original NT SDK used lib32 instead of lib
+
+gctest.exe: test.obj gc.lib
+# The following works for win32 debugging. For win32s debugging use debugtype:coff
+# and add mapsympe line.
+# This produces a "GUI" applications that opens no windows and writes to the log file
+# "gc.log". This is done to make the result runnable under win32s.
+ $(link) -debug:full -debugtype:cv $(guiflags) -stack:131072 -out:$*.exe test.obj $(guilibs) gc.lib
+# mapsympe -n -o gctest.sym gctest.exe
+
+cord\de_win.rbj: cord\de_win.res
+ cvtres -$(CPU) cord\de_win.res -o cord\de_win.rbj
+
+cord\de.obj cord\de_win.obj: cord\cord.h cord\private\cord_pos.h cord\de_win.h cord\de_cmds.h
+
+cord\de_win.res: cord\de_win.rc cord\de_win.h cord\de_cmds.h
+ $(rc) $(rcvars) -r -fo cord\de_win.res $(cvars) cord\de_win.rc
+
+# Cord/de is a real win32 gui application.
+cord\de.exe: cord\cordbscs.obj cord\cordxtra.obj cord\de.obj cord\de_win.obj cord\de_win.rbj gc.lib
+ $(link) -debug:full -debugtype:cv $(guiflags) -stack:16384 -out:cord\de.exe cord\cordbscs.obj cord\cordxtra.obj cord\de.obj cord\de_win.obj cord\de_win.rbj gc.lib $(guilibs)
+
+gc_cpp.obj: gc_cpp.h gc.h
+
+gc_cpp.cpp: gc_cpp.cc
+ copy gc_cpp.cc gc_cpp.cpp
+
+test_cpp.cpp: test_cpp.cc
+ copy test_cpp.cc test_cpp.cpp
+
+# This generates the C++ test executable. The executable expects
+# a single numeric argument, which is the number of iterations.
+# The output appears in the file "gc.log".
+test_cpp.exe: test_cpp.obj gc_cpp.h gc.h gc.lib
+ $(link) -debug:full -debugtype:cv $(guiflags) -stack:16384 -out:test_cpp.exe test_cpp.obj gc.lib $(guilibs)
+
+
+
diff --git a/boehm-gc/OS2_MAKEFILE b/boehm-gc/OS2_MAKEFILE
new file mode 100644
index 00000000000..7b816218206
--- /dev/null
+++ b/boehm-gc/OS2_MAKEFILE
@@ -0,0 +1,45 @@
+# Makefile for OS/2. Assumes IBM's compiler, static linking, and a single thread.
+# Adding dynamic linking support seems easy, but takes a little bit of work.
+# Adding thread support may be nontrivial, since we haven't yet figured out how to
+# look at another thread's registers.
+
+# Significantly revised for GC version 4.4 by Mark Boulter (Jan 1994).
+
+OBJS= alloc.obj reclaim.obj allchblk.obj misc.obj mach_dep.obj os_dep.obj mark_rts.obj headers.obj mark.obj obj_map.obj blacklst.obj finalize.obj new_hblk.obj dbg_mlc.obj malloc.obj stubborn.obj typd_mlc.obj ptr_chck.obj mallocx.obj
+
+CORDOBJS= cord\cordbscs.obj cord\cordxtra.obj cord\cordprnt.obj
+
+CC= icc
+CFLAGS= /O /Q /DSILENT /DSMALL_CONFIG /DALL_INTERIOR_POINTERS
+# Use /Ti instead of /O for debugging
+# Setjmp_test may yield overly optimistic results when compiled
+# without optimization.
+
+all: $(OBJS) gctest.exe cord\cordtest.exe
+
+$(OBJS) test.obj: gc_priv.h gc_hdrs.h gc.h
+
+## ERASE THE LIB FIRST - if it is already there then this command will fail
+## (make sure its there or erase will fail!)
+gc.lib: $(OBJS)
+ echo . > gc.lib
+ erase gc.lib
+ LIB gc.lib $(OBJS), gc.lst
+
+mach_dep.obj: mach_dep.c
+ $(CC) $(CFLAGS) /C mach_dep.c
+
+gctest.exe: test.obj gc.lib
+ $(CC) $(CFLAGS) /B"/STACK:524288" /Fegctest test.obj gc.lib
+
+cord\cordbscs.obj: cord\cordbscs.c cord\cord.h cord\private\cord_pos.h
+ $(CC) $(CFLAGS) /C /Focord\cordbscs cord\cordbscs.c
+
+cord\cordxtra.obj: cord\cordxtra.c cord\cord.h cord\private\cord_pos.h cord\ec.h
+ $(CC) $(CFLAGS) /C /Focord\cordxtra cord\cordxtra.c
+
+cord\cordprnt.obj: cord\cordprnt.c cord\cord.h cord\private\cord_pos.h cord\ec.h
+ $(CC) $(CFLAGS) /C /Focord\cordprnt cord\cordprnt.c
+
+cord\cordtest.exe: cord\cordtest.c cord\cord.h cord\private\cord_pos.h cord\ec.h $(CORDOBJS) gc.lib
+ $(CC) $(CFLAGS) /B"/STACK:65536" /Fecord\cordtest cord\cordtest.c gc.lib $(CORDOBJS)
diff --git a/boehm-gc/PCR-Makefile b/boehm-gc/PCR-Makefile
new file mode 100644
index 00000000000..7b80637fb29
--- /dev/null
+++ b/boehm-gc/PCR-Makefile
@@ -0,0 +1,68 @@
+#
+# Default target
+#
+
+default: gc.o
+
+include ../config/common.mk
+
+#
+# compilation flags, etc.
+#
+
+
+CPPFLAGS = $(INCLUDE) $(CONFIG_CPPFLAGS) \
+ -DPCR_NO_RENAME -DPCR_NO_HOSTDEP_ERR
+#CFLAGS = -DPCR -DSILENT $(CONFIG_CFLAGS)
+CFLAGS = -DPCR $(CONFIG_CFLAGS)
+SPECIALCFLAGS = # For code involving asm's
+
+ASPPFLAGS = $(INCLUDE) $(CONFIG_ASPPFLAGS) \
+ -DPCR_NO_RENAME -DPCR_NO_HOSTDEP_ERR -DASM
+
+ASFLAGS = $(CONFIG_ASFLAGS)
+
+LDRFLAGS = $(CONFIG_LDRFLAGS)
+
+LDFLAGS = $(CONFIG_LDFLAGS)
+
+#
+#
+#
+#
+# BEGIN PACKAGE-SPECIFIC PART
+#
+#
+#
+#
+
+# Fix to point to local pcr installation directory.
+PCRDIR= ..
+
+COBJ= alloc.o reclaim.o allchblk.o misc.o os_dep.o mark_rts.o headers.o mark.o obj_map.o pcr_interface.o blacklst.o finalize.o new_hblk.o real_malloc.o dyn_load.o dbg_mlc.o malloc.o stubborn.o checksums.o solaris_threads.o typd_mlc.o ptr_chck.o mallocx.o
+
+CSRC= reclaim.c allchblk.c misc.c alloc.c mach_dep.c os_dep.c mark_rts.c headers.c mark.c obj_map.c pcr_interface.c blacklst.c finalize.c new_hblk.c real_malloc.c dyn_load.c dbg_mlc.c malloc.c stubborn.c checksums.c solaris_threads.c typd_mlc.c ptr_chck.c mallocx.c
+
+SHELL= /bin/sh
+
+default: gc.o
+
+gc.o: $(COBJ) mach_dep.o
+ $(LDR) $(CONFIG_LDRFLAGS) -o gc.o $(COBJ) mach_dep.o
+
+
+mach_dep.o: mach_dep.c mips_mach_dep.s rs6000_mach_dep.s if_mach if_not_there
+ rm -f mach_dep.o
+ ./if_mach MIPS "" as -o mach_dep.o mips_mach_dep.s
+ ./if_mach RS6000 "" as -o mach_dep.o rs6000_mach_dep.s
+ ./if_mach ALPHA "" as -o mach_dep.o alpha_mach_dep.s
+ ./if_mach SPARC SUNOS5 as -o mach_dep.o sparc_mach_dep.s
+ ./if_not_there mach_dep.o $(CC) -c $(SPECIALCFLAGS) mach_dep.c
+
+if_mach: if_mach.c config.h
+ $(CC) $(CFLAGS) -o if_mach if_mach.c
+
+if_not_there: if_not_there.c
+ $(CC) $(CFLAGS) -o if_not_there if_not_there.c
+
+
diff --git a/boehm-gc/README b/boehm-gc/README
new file mode 100644
index 00000000000..98d8389dae9
--- /dev/null
+++ b/boehm-gc/README
@@ -0,0 +1,1389 @@
+Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+Copyright (c) 1991-1996 by Xerox Corporation. All rights reserved.
+Copyright (c) 1996-1998 by Silicon Graphics. All rights reserved.
+
+ [ This version of the collector modified by Cygnus Solutions.
+ See the file ChangeLog for details ]
+
+THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+
+Permission is hereby granted to use or copy this program
+for any purpose, provided the above notices are retained on all copies.
+Permission to modify the code and to distribute modified code is granted,
+provided the above notices are retained, and a notice that the code was
+modified is included with the above copyright notice.
+
+This is version 4.13alpha2 of a conservative garbage collector for C and C++.
+
+You might find a more recent version of this at
+
+http://reality.sgi.com/boehm/gc.html
+
+HISTORY -
+
+ Early versions of this collector were developed as a part of research
+projects supported in part by the National Science Foundation
+and the Defense Advance Research Projects Agency.
+Much of the code was rewritten by Hans-J. Boehm at Xerox PARC.
+The SPARC specific code was contributed by Mark Weiser
+(weiser@parc.xerox.com). The Encore Multimax modifications were supplied by
+Kevin Kenny (kenny@m.cs.uiuc.edu). The adaptation to the RT is largely due
+to Vernon Lee (scorpion@rice.edu), on machines made available by IBM.
+Much of the HP specific code and a number of good suggestions for improving the
+generic code are due to Walter Underwood (wunder@hp-ses.sde.hp.com).
+Robert Brazile (brazile@diamond.bbn.com) originally supplied the ULTRIX code.
+Al Dosser (dosser@src.dec.com) and Regis Cridlig (Regis.Cridlig@cl.cam.ac.uk)
+subsequently provided updates and information on variation between ULTRIX
+systems. Parag Patel (parag@netcom.com) supplied the A/UX code.
+Jesper Peterson(jep@mtiame.mtia.oz.au) and
+Michel Schinz supplied the Amiga port.
+Thomas Funke (thf@zelator.in-berlin.de(?)) and
+Brian D.Carlstrom (bdc@clark.lcs.mit.edu) supplied the NeXT ports.
+Douglas Steel (doug@wg.icl.co.uk) provided ICL DRS6000 code.
+Bill Janssen (janssen@parc.xerox.com) supplied the SunOS dynamic loader
+specific code. Manuel Serrano (serrano@cornas.inria.fr) supplied linux and
+Sony News specific code. Al Dosser provided Alpha/OSF/1 code. He and
+Dave Detlefs(detlefs@src.dec.com) also provided several generic bug fixes.
+Alistair G. Crooks(agc@uts.amdahl.com) supplied the NetBSD and 386BSD ports.
+Jeffrey Hsu (hsu@soda.berkeley.edu) provided the FreeBSD port.
+Brent Benson (brent@jade.ssd.csd.harris.com) ported the collector to
+a Motorola 88K processor running CX/UX (Harris NightHawk).
+Ari Huttunen (Ari.Huttunen@hut.fi) generalized the OS/2 port to
+nonIBM development environments (a nontrivial task).
+Patrick Beard (beard@cs.ucdavis.edu) provided the initial MacOS port.
+David Chase, then at Olivetti Research, suggested several improvements.
+Scott Schwartz (schwartz@groucho.cse.psu.edu) supplied some of the
+code to save and print call stacks for leak detection on a SPARC.
+Jesse Hull and John Ellis supplied the C++ interface code.
+Zhong Shao performed much of the experimentation that led to the
+current typed allocation facility. (His dynamic type inference code hasn't
+made it into the released version of the collector, yet.)
+(Blame for misinstallation of these modifications goes to the first author,
+however.)
+
+Credits for some more recent modifications are given in the modification
+history at the end of this file.
+
+ This is intended to be a general purpose, garbage collecting storage
+allocator. The algorithms used are described in:
+
+Boehm, H., and M. Weiser, "Garbage Collection in an Uncooperative Environment",
+Software Practice & Experience, September 1988, pp. 807-820.
+
+Boehm, H., A. Demers, and S. Shenker, "Mostly Parallel Garbage Collection",
+Proceedings of the ACM SIGPLAN '91 Conference on Programming Language Design
+and Implementation, SIGPLAN Notices 26, 6 (June 1991), pp. 157-164.
+
+Boehm, H., "Space Efficient Conservative Garbage Collection", Proceedings
+of the ACM SIGPLAN '91 Conference on Programming Language Design and
+Implementation, SIGPLAN Notices 28, 6 (June 1993), pp. 197-206.
+
+ Possible interactions between the collector and optimizing compilers are
+discussed in
+
+Boehm, H., and D. Chase, "A Proposal for GC-safe C Compilation",
+The Journal of C Language Translation 4, 2 (December 1992).
+
+and
+
+Boehm H., "Simple GC-safe Compilation", Proceedings
+of the ACM SIGPLAN '96 Conference on Programming Language Design and
+Implementation.
+
+(Both are also available from
+http://reality.sgi.com/employees/boehm_mti/papers/, among other places.)
+
+ Unlike the collector described in the second reference, this collector
+operates either with the mutator stopped during the entire collection
+(default) or incrementally during allocations. (The latter is supported
+on only a few machines.) It does not rely on threads, but is intended
+to be thread-safe.
+
+ Some of the ideas underlying the collector have previously been explored
+by others. (Doug McIlroy wrote a vaguely similar collector that is part of
+version 8 UNIX (tm).) However none of this work appears to have been widely
+disseminated.
+
+ Rudimentary tools for use of the collector as a leak detector are included, as
+is a fairly sophisticated string package "cord" that makes use of the collector.
+(See cord/README.)
+
+
+GENERAL DESCRIPTION
+
+ This is a garbage collecting storage allocator that is intended to be
+used as a plug-in replacement for C's malloc.
+
+ Since the collector does not require pointers to be tagged, it does not
+attempt to ensure that all inaccessible storage is reclaimed. However,
+in our experience, it is typically more successful at reclaiming unused
+memory than most C programs using explicit deallocation. Unlike manually
+introduced leaks, the amount of unreclaimed memory typically stays
+bounded.
+
+ In the following, an "object" is defined to be a region of memory allocated
+by the routines described below.
+
+ Any objects not intended to be collected must be pointed to either
+from other such accessible objects, or from the registers,
+stack, data, or statically allocated bss segments. Pointers from
+the stack or registers may point to anywhere inside an object.
+The same is true for heap pointers if the collector is compiled with
+ ALL_INTERIOR_POINTERS defined, as is now the default.
+
+Compiling without ALL_INTERIOR_POINTERS may reduce accidental retention
+of garbage objects, by requiring pointers from the heap to to the beginning
+of an object. But this no longer appears to be a significant
+issue for most programs.
+
+There are a number of routines which modify the pointer recognition
+algorithm. GC_register_displacement allows certain interior pointers
+to be recognized even if ALL_INTERIOR_POINTERS is nor defined.
+GC_malloc_ignore_off_page allows some pointers into the middle of large objects
+to be disregarded, greatly reducing the probablility of accidental
+retention of large objects. For most purposes it seems best to compile
+with ALL_INTERIOR_POINTERS and to use GC_malloc_ignore_off_page if
+you get collector warnings from allocations of very large objects.
+See README.debugging for details.
+
+ Note that pointers inside memory allocated by the standard "malloc" are not
+seen by the garbage collector. Thus objects pointed to only from such a
+region may be prematurely deallocated. It is thus suggested that the
+standard "malloc" be used only for memory regions, such as I/O buffers, that
+are guaranteed not to contain pointers to garbage collectable memory.
+Pointers in C language automatic, static, or register variables,
+are correctly recognized. (Note that GC_malloc_uncollectable has semantics
+similar to standard malloc, but allocates objects that are traced by the
+collector.)
+
+ The collector does not always know how to find pointers in data
+areas that are associated with dynamic libraries. This is easy to
+remedy IF you know how to find those data areas on your operating
+system (see GC_add_roots). Code for doing this under SunOS, IRIX 5.X and 6.X,
+HP/UX, Alpha OSF/1, Linux, and win32 is included and used by default. (See
+README.win32 for win32 details.) On other systems pointers from dynamic
+library data areas may not be considered by the collector.
+
+ Note that the garbage collector does not need to be informed of shared
+read-only data. However if the shared library mechanism can introduce
+discontiguous data areas that may contain pointers, then the collector does
+need to be informed.
+
+ Signal processing for most signals may be deferred during collection,
+and during uninterruptible parts of the allocation process. Unlike
+standard ANSI C mallocs, it can be safe to invoke malloc
+from a signal handler while another malloc is in progress, provided
+the original malloc is not restarted. (Empirically, many UNIX
+applications already assume this.) To obtain this level of signal
+safety, remove the definition of -DNO_SIGNALS in Makefile. This incurs
+a minor performance penalty, and hence is no longer the default.
+
+ The allocator/collector can also be configured for thread-safe operation.
+(Full signal safety can also be achieved, but only at the cost of two system
+calls per malloc, which is usually unacceptable.)
+
+INSTALLATION AND PORTABILITY
+
+ As distributed, the macro SILENT is defined in Makefile.
+In the event of problems, this can be removed to obtain a moderate
+amount of descriptive output for each collection.
+(The given statistics exhibit a few peculiarities.
+Things don't appear to add up for a variety of reasons, most notably
+fragmentation losses. These are probably much more significant for the
+contrived program "test.c" than for your application.)
+
+ Note that typing "make test" will automatically build the collector
+and then run setjmp_test and gctest. Setjmp_test will give you information
+about configuring the collector, which is useful primarily if you have
+a machine that's not already supported. Gctest is a somewhat superficial
+test of collector functionality. Failure is indicated by a core dump or
+a message to the effect that the collector is broken. Gctest takes about
+35 seconds to run on a SPARCstation 2. On a slower machine,
+expect it to take a while. It may use up to 8 MB of memory. (The
+multi-threaded version will use more.) "Make test" will also, as
+its last step, attempt to build and test the "cord" string library.
+This will fail without an ANSI C compiler.
+
+ The Makefile will generate a library gc.a which you should link against.
+Typing "make cords" will add the cord library to gc.a.
+Note that this requires an ANSI C compiler.
+
+ It is suggested that if you need to replace a piece of the collector
+(e.g. GC_mark_rts.c) you simply list your version ahead of gc.a on the
+ work.)
+ld command line, rather than replacing the one in gc.a. (This will
+generate numerous warnings under some versions of AIX, but it still
+works.)
+
+ All include files that need to be used by clients will be put in the
+include subdirectory. (Normally this is just gc.h. "Make cords" adds
+"cord.h" and "ec.h".)
+
+ The collector currently is designed to run essentially unmodified on
+machines that use a flat 32-bit or 64-bit address space.
+That includes the vast majority of Workstations and X86 (X >= 3) PCs.
+(The list here was deleted because it was getting too long and constantly
+out of date.)
+ It does NOT run under plain 16-bit DOS or Windows 3.X. There are however
+various packages (e.g. win32s, djgpp) that allow flat 32-bit address
+applications to run under those systemsif the have at least an 80386 processor,
+and several of those are compatible with the collector.
+
+ In a few cases (Amiga, OS/2, Win32, MacOS) a separate makefile
+or equivalent is supplied. Many of these have separate README.system
+files.
+
+ Dynamic libraries are completely supported only under SunOS
+(and even that support is not functional on the last Sun 3 release),
+IRIX 5&6, HP-PA, Win32 (not Win32S) and OSF/1 on DEC AXP machines.
+On other machines we recommend that you do one of the following:
+
+ 1) Add dynamic library support (and send us the code).
+ 2) Use static versions of the libraries.
+ 3) Arrange for dynamic libraries to use the standard malloc.
+ This is still dangerous if the library stores a pointer to a
+ garbage collected object. But nearly all standard interfaces
+ prohibit this, because they deal correctly with pointers
+ to stack allocated objects. (Strtok is an exception. Don't
+ use it.)
+
+ In all cases we assume that pointer alignment is consistent with that
+enforced by the standard C compilers. If you use a nonstandard compiler
+you may have to adjust the alignment parameters defined in gc_priv.h.
+
+ A port to a machine that is not byte addressed, or does not use 32 bit
+or 64 bit addresses will require a major effort. A port to plain MSDOS
+or win16 is hard.
+
+ For machines not already mentioned, or for nonstandard compilers, the
+following are likely to require change:
+
+1. The parameters in config.h.
+ The parameters that will usually require adjustment are
+ STACKBOTTOM, ALIGNMENT and DATASTART. Setjmp_test
+ prints its guesses of the first two.
+ DATASTART should be an expression for computing the
+ address of the beginning of the data segment. This can often be
+ &etext. But some memory management units require that there be
+ some unmapped space between the text and the data segment. Thus
+ it may be more complicated. On UNIX systems, this is rarely
+ documented. But the adb "$m" command may be helpful. (Note
+ that DATASTART will usually be a function of &etext. Thus a
+ single experiment is usually insufficient.)
+ STACKBOTTOM is used to initialize GC_stackbottom, which
+ should be a sufficient approximation to the coldest stack address.
+ On some machines, it is difficult to obtain such a value that is
+ valid across a variety of MMUs, OS releases, etc. A number of
+ alternatives exist for using the collector in spite of this. See the
+ discussion in config.h immediately preceding the various
+ definitions of STACKBOTTOM.
+
+2. mach_dep.c.
+ The most important routine here is one to mark from registers.
+ The distributed file includes a generic hack (based on setjmp) that
+ happens to work on many machines, and may work on yours. Try
+ compiling and running setjmp_t.c to see whether it has a chance of
+ working. (This is not correct C, so don't blame your compiler if it
+ doesn't work. Based on limited experience, register window machines
+ are likely to cause trouble. If your version of setjmp claims that
+ all accessible variables, including registers, have the value they
+ had at the time of the longjmp, it also will not work. Vanilla 4.2 BSD
+ on Vaxen makes such a claim. SunOS does not.)
+ If your compiler does not allow in-line assembly code, or if you prefer
+ not to use such a facility, mach_dep.c may be replaced by a .s file
+ (as we did for the MIPS machine and the PC/RT).
+ At this point enough architectures are supported by mach_dep.c
+ that you will rarely need to do more than adjust for assembler
+ syntax.
+
+3. os_dep.c (and gc_priv.h).
+ Several kinds of operating system dependent routines reside here.
+ Many are optional. Several are invoked only through corresponding
+ macros in gc_priv.h, which may also be redefined as appropriate.
+ The routine GC_register_data_segments is crucial. It registers static
+ data areas that must be traversed by the collector. (User calls to
+ GC_add_roots may sometimes be used for similar effect.)
+ Routines to obtain memory from the OS also reside here.
+ Alternatively this can be done entirely by the macro GET_MEM
+ defined in gc_priv.h. Routines to disable and reenable signals
+ also reside here if they are need by the macros DISABLE_SIGNALS
+ and ENABLE_SIGNALS defined in gc_priv.h.
+ In a multithreaded environment, the macros LOCK and UNLOCK
+ in gc_priv.h will need to be suitably redefined.
+ The incremental collector requires page dirty information, which
+ is acquired through routines defined in os_dep.c. Unless directed
+ otherwise by config.h, these are implemented as stubs that simply
+ treat all pages as dirty. (This of course makes the incremental
+ collector much less useful.)
+
+4. dyn_load.c
+ This provides a routine that allows the collector to scan data
+ segments associated with dynamic libraries. Often it is not
+ necessary to provide this routine unless user-written dynamic
+ libraries are used.
+
+ For a different version of UN*X or different machines using the
+Motorola 68000, Vax, SPARC, 80386, NS 32000, PC/RT, or MIPS architecture,
+it should frequently suffice to change definitions in config.h.
+
+
+THE C INTERFACE TO THE ALLOCATOR
+
+ The following routines are intended to be directly called by the user.
+Note that usually only GC_malloc is necessary. GC_clear_roots and GC_add_roots
+calls may be required if the collector has to trace from nonstandard places
+(e.g. from dynamic library data areas on a machine on which the
+collector doesn't already understand them.) On some machines, it may
+be desirable to set GC_stacktop to a good approximation of the stack base.
+(This enhances code portability on HP PA machines, since there is no
+good way for the collector to compute this value.) Client code may include
+"gc.h", which defines all of the following, plus many others.
+
+1) GC_malloc(nbytes)
+ - allocate an object of size nbytes. Unlike malloc, the object is
+ cleared before being returned to the user. Gc_malloc will
+ invoke the garbage collector when it determines this to be appropriate.
+ GC_malloc may return 0 if it is unable to acquire sufficient
+ space from the operating system. This is the most probable
+ consequence of running out of space. Other possible consequences
+ are that a function call will fail due to lack of stack space,
+ or that the collector will fail in other ways because it cannot
+ maintain its internal data structures, or that a crucial system
+ process will fail and take down the machine. Most of these
+ possibilities are independent of the malloc implementation.
+
+2) GC_malloc_atomic(nbytes)
+ - allocate an object of size nbytes that is guaranteed not to contain any
+ pointers. The returned object is not guaranteed to be cleared.
+ (Can always be replaced by GC_malloc, but results in faster collection
+ times. The collector will probably run faster if large character
+ arrays, etc. are allocated with GC_malloc_atomic than if they are
+ statically allocated.)
+
+3) GC_realloc(object, new_size)
+ - change the size of object to be new_size. Returns a pointer to the
+ new object, which may, or may not, be the same as the pointer to
+ the old object. The new object is taken to be atomic iff the old one
+ was. If the new object is composite and larger than the original object,
+ then the newly added bytes are cleared (we hope). This is very likely
+ to allocate a new object, unless MERGE_SIZES is defined in gc_priv.h.
+ Even then, it is likely to recycle the old object only if the object
+ is grown in small additive increments (which, we claim, is generally bad
+ coding practice.)
+
+4) GC_free(object)
+ - explicitly deallocate an object returned by GC_malloc or
+ GC_malloc_atomic. Not necessary, but can be used to minimize
+ collections if performance is critical. Probably a performance
+ loss for very small objects (<= 8 bytes).
+
+5) GC_expand_hp(bytes)
+ - Explicitly increase the heap size. (This is normally done automatically
+ if a garbage collection failed to GC_reclaim enough memory. Explicit
+ calls to GC_expand_hp may prevent unnecessarily frequent collections at
+ program startup.)
+
+6) GC_malloc_ignore_off_page(bytes)
+ - identical to GC_malloc, but the client promises to keep a pointer to
+ the somewhere within the first 256 bytes of the object while it is
+ live. (This pointer should nortmally be declared volatile to prevent
+ interference from compiler optimizations.) This is the recommended
+ way to allocate anything that is likely to be larger than 100Kbytes
+ or so. (GC_malloc may result in failure to reclaim such objects.)
+
+7) GC_set_warn_proc(proc)
+ - Can be used to redirect warnings from the collector. Such warnings
+ should be rare, and should not be ignored during code development.
+
+8) GC_enable_incremental()
+ - Enables generational and incremental collection. Useful for large
+ heaps on machines that provide access to page dirty information.
+ Some dirty bit implementations may interfere with debugging
+ (by catching address faults) and place restrictions on heap arguments
+ to system calls (since write faults inside a system call may not be
+ handled well).
+
+9) Several routines to allow for registration of finalization code.
+ User supplied finalization code may be invoked when an object becomes
+ unreachable. To call (*f)(obj, x) when obj becomes inaccessible, use
+ GC_register_finalizer(obj, f, x, 0, 0);
+ For more sophisticated uses, and for finalization ordering issues,
+ see gc.h.
+
+ The global variable GC_free_space_divisor may be adjusted up from its
+default value of 4 to use less space and more collection time, or down for
+the opposite effect. Setting it to 1 or 0 will effectively disable collections
+and cause all allocations to simply grow the heap.
+
+ The variable GC_non_gc_bytes, which is normally 0, may be changed to reflect
+the amount of memory allocated by the above routines that should not be
+considered as a candidate for collection. Careless use may, of course, result
+in excessive memory consumption.
+
+ Some additional tuning is possible through the parameters defined
+near the top of gc_priv.h.
+
+ If only GC_malloc is intended to be used, it might be appropriate to define:
+
+#define malloc(n) GC_malloc(n)
+#define calloc(m,n) GC_malloc((m)*(n))
+
+ For small pieces of VERY allocation intensive code, gc_inl.h
+includes some allocation macros that may be used in place of GC_malloc
+and friends.
+
+ All externally visible names in the garbage collector start with "GC_".
+To avoid name conflicts, client code should avoid this prefix, except when
+accessing garbage collector routines or variables.
+
+ There are provisions for allocation with explicit type information.
+This is rarely necessary. Details can be found in gc_typed.h.
+
+THE C++ INTERFACE TO THE ALLOCATOR:
+
+ The Ellis-Hull C++ interface to the collector is included in
+the collector distribution. If you intend to use this, type
+"make c++" after the initial build of the collector is complete.
+See gc_cpp.h for the definition of the interface. This interface
+tries to approximate the Ellis-Detlefs C++ garbage collection
+proposal without compiler changes.
+
+Cautions:
+1. Arrays allocated without new placement syntax are
+allocated as uncollectable objects. They are traced by the
+collector, but will not be reclaimed.
+
+2. Failure to use "make c++" in combination with (1) will
+result in arrays allocated using the default new operator.
+This is likely to result in disaster without linker warnings.
+
+3. If your compiler supports an overloaded new[] operator,
+then gc_cpp.cc and gc_cpp.h should be suitably modified.
+
+4. Many current C++ compilers have deficiencies that
+break some of the functionality. See the comments in gc_cpp.h
+for suggested workarounds.
+
+USE AS LEAK DETECTOR:
+
+ The collector may be used to track down leaks in C programs that are
+intended to run with malloc/free (e.g. code with extreme real-time or
+portability constraints). To do so define FIND_LEAK in Makefile
+This will cause the collector to invoke the report_leak
+routine defined near the top of reclaim.c whenever an inaccessible
+object is found that has not been explicitly freed. The collector will
+no longer reclaim inaccessible memory; in this form it is purely a
+debugging tool.
+ Productive use of this facility normally involves redefining report_leak
+to do something more intelligent. This typically requires annotating
+objects with additional information (e.g. creation time stack trace) that
+identifies their origin. Such code is typically not very portable, and is
+not included here, except on SPARC machines.
+ If all objects are allocated with GC_DEBUG_MALLOC (see next section),
+then the default version of report_leak will report the source file
+and line number at which the leaked object was allocated. This may
+sometimes be sufficient. (On SPARC/SUNOS4 machines, it will also report
+a cryptic stack trace. This can often be turned into a sympolic stack
+trace by invoking program "foo" with "callprocs foo". Callprocs is
+a short shell script that invokes adb to expand program counter values
+to symbolic addresses. It was largely supplied by Scott Schwartz.)
+ Note that the debugging facilities described in the next section can
+sometimes be slightly LESS effective in leak finding mode, since in
+leak finding mode, GC_debug_free actually results in reuse of the object.
+(Otherwise the object is simply marked invalid.) Also note that the test
+program is not designed to run meaningfully in FIND_LEAK mode.
+Use "make gc.a" to build the collector.
+
+DEBUGGING FACILITIES:
+
+ The routines GC_debug_malloc, GC_debug_malloc_atomic, GC_debug_realloc,
+and GC_debug_free provide an alternate interface to the collector, which
+provides some help with memory overwrite errors, and the like.
+Objects allocated in this way are annotated with additional
+information. Some of this information is checked during garbage
+collections, and detected inconsistencies are reported to stderr.
+
+ Simple cases of writing past the end of an allocated object should
+be caught if the object is explicitly deallocated, or if the
+collector is invoked while the object is live. The first deallocation
+of an object will clear the debugging info associated with an
+object, so accidentally repeated calls to GC_debug_free will report the
+deallocation of an object without debugging information. Out of
+memory errors will be reported to stderr, in addition to returning
+NIL.
+
+ GC_debug_malloc checking during garbage collection is enabled
+with the first call to GC_debug_malloc. This will result in some
+slowdown during collections. If frequent heap checks are desired,
+this can be achieved by explicitly invoking GC_gcollect, e.g. from
+the debugger.
+
+ GC_debug_malloc allocated objects should not be passed to GC_realloc
+or GC_free, and conversely. It is however acceptable to allocate only
+some objects with GC_debug_malloc, and to use GC_malloc for other objects,
+provided the two pools are kept distinct. In this case, there is a very
+low probablility that GC_malloc allocated objects may be misidentified as
+having been overwritten. This should happen with probability at most
+one in 2**32. This probability is zero if GC_debug_malloc is never called.
+
+ GC_debug_malloc, GC_malloc_atomic, and GC_debug_realloc take two
+additional trailing arguments, a string and an integer. These are not
+interpreted by the allocator. They are stored in the object (the string is
+not copied). If an error involving the object is detected, they are printed.
+
+ The macros GC_MALLOC, GC_MALLOC_ATOMIC, GC_REALLOC, GC_FREE, and
+GC_REGISTER_FINALIZER are also provided. These require the same arguments
+as the corresponding (nondebugging) routines. If gc.h is included
+with GC_DEBUG defined, they call the debugging versions of these
+functions, passing the current file name and line number as the two
+extra arguments, where appropriate. If gc.h is included without GC_DEBUG
+defined, then all these macros will instead be defined to their nondebugging
+equivalents. (GC_REGISTER_FINALIZER is necessary, since pointers to
+objects with debugging information are really pointers to a displacement
+of 16 bytes form the object beginning, and some translation is necessary
+when finalization routines are invoked. For details, about what's stored
+in the header, see the definition of the type oh in debug_malloc.c)
+
+INCREMENTAL/GENERATIONAL COLLECTION:
+
+The collector normally interrupts client code for the duration of
+a garbage collection mark phase. This may be unacceptable if interactive
+response is needed for programs with large heaps. The collector
+can also run in a "generational" mode, in which it usually attempts to
+collect only objects allocated since the last garbage collection.
+Furthermore, in this mode, garbage collections run mostly incrementally,
+with a small amount of work performed in response to each of a large number of
+GC_malloc requests.
+
+This mode is enabled by a call to GC_enable_incremental().
+
+Incremental and generational collection is effective in reducing
+pause times only if the collector has some way to tell which objects
+or pages have been recently modified. The collector uses two sources
+of information:
+
+1. Information provided by the VM system. This may be provided in
+one of several forms. Under Solaris 2.X (and potentially under other
+similar systems) information on dirty pages can be read from the
+/proc file system. Under other systems (currently SunOS4.X) it is
+possible to write-protect the heap, and catch the resulting faults.
+On these systems we require that system calls writing to the heap
+(other than read) be handled specially by client code.
+See os_dep.c for details.
+
+2. Information supplied by the programmer. We define "stubborn"
+objects to be objects that are rarely changed. Such an object
+can be allocated (and enabled for writing) with GC_malloc_stubborn.
+Once it has been initialized, the collector should be informed with
+a call to GC_end_stubborn_change. Subsequent writes that store
+pointers into the object must be preceded by a call to
+GC_change_stubborn.
+
+This mechanism performs best for objects that are written only for
+initialization, and such that only one stubborn object is writable
+at once. It is typically not worth using for short-lived
+objects. Stubborn objects are treated less efficiently than pointerfree
+(atomic) objects.
+
+A rough rule of thumb is that, in the absence of VM information, garbage
+collection pauses are proportional to the amount of pointerful storage
+plus the amount of modified "stubborn" storage that is reachable during
+the collection.
+
+Initial allocation of stubborn objects takes longer than allocation
+of other objects, since other data structures need to be maintained.
+
+We recommend against random use of stubborn objects in client
+code, since bugs caused by inappropriate writes to stubborn objects
+are likely to be very infrequently observed and hard to trace.
+However, their use may be appropriate in a few carefully written
+library routines that do not make the objects themselves available
+for writing by client code.
+
+
+BUGS:
+
+ Any memory that does not have a recognizable pointer to it will be
+reclaimed. Exclusive-or'ing forward and backward links in a list
+doesn't cut it.
+ Some C optimizers may lose the last undisguised pointer to a memory
+object as a consequence of clever optimizations. This has almost
+never been observed in practice. Send mail to boehm@mti.sgi.com
+for suggestions on how to fix your compiler.
+ This is not a real-time collector. In the standard configuration,
+percentage of time required for collection should be constant across
+heap sizes. But collection pauses will increase for larger heaps.
+(On SPARCstation 2s collection times will be on the order of 300 msecs
+per MB of accessible memory that needs to be scanned. Your mileage
+may vary.) The incremental/generational collection facility helps,
+but is portable only if "stubborn" allocation is used.
+ Please address bug reports to boehm@mti.sgi.com. If you are
+contemplating a major addition, you might also send mail to ask whether
+it's already been done (or whether we tried and discarded it).
+
+RECENT VERSIONS:
+
+ Version 1.3 and immediately preceding versions contained spurious
+assembly language assignments to TMP_SP. Only the assignment in the PC/RT
+code is necessary. On other machines, with certain compiler options,
+the assignments can lead to an unsaved register being overwritten.
+Known to cause problems under SunOS 3.5 WITHOUT the -O option. (With
+-O the compiler recognizes it as dead code. It probably shouldn't,
+but that's another story.)
+
+ Version 1.4 and earlier versions used compile time determined values
+for the stack base. This no longer works on Sun 3s, since Sun 3/80s use
+a different stack base. We now use a straightforward heuristic on all
+machines on which it is known to work (incl. Sun 3s) and compile-time
+determined values for the rest. There should really be library calls
+to determine such values.
+
+ Version 1.5 and earlier did not ensure 8 byte alignment for objects
+allocated on a sparc based machine.
+
+ Version 1.8 added ULTRIX support in gc_private.h.
+
+ Version 1.9 fixed a major bug in gc_realloc.
+
+ Version 2.0 introduced a consistent naming convention for collector
+routines and added support for registering dynamic library data segments
+in the standard mark_roots.c. Most of the data structures were revamped.
+The treatment of interior pointers was completely changed. Finalization
+was added. Support for locking was added. Object kinds were added.
+We added a black listing facility to avoid allocating at addresses known
+to occur as integers somewhere in the address space. Much of this
+was accomplished by adapting ideas and code from the PCR collector.
+The test program was changed and expanded.
+
+ Version 2.1 was the first stable version since 1.9, and added support
+for PPCR.
+
+ Version 2.2 added debugging allocation, and fixed various bugs. Among them:
+- GC_realloc could fail to extend the size of the object for certain large object sizes.
+- A blatant subscript range error in GC_printf, which unfortunately
+ wasn't exercised on machines with sufficient stack alignment constraints.
+- GC_register_displacement did the wrong thing if it was called after
+ any allocation had taken place.
+- The leak finding code would eventually break after 2048 byte
+ byte objects leaked.
+- interface.c didn't compile.
+- The heap size remained much too small for large stacks.
+- The stack clearing code behaved badly for large stacks, and perhaps
+ on HP/PA machines.
+
+ Version 2.3 added ALL_INTERIOR_POINTERS and fixed the following bugs:
+- Missing declaration of etext in the A/UX version.
+- Some PCR root-finding problems.
+- Blacklisting was not 100% effective, because the plausible future
+ heap bounds were being miscalculated.
+- GC_realloc didn't handle out-of-memory correctly.
+- GC_base could return a nonzero value for addresses inside free blocks.
+- test.c wasn't really thread safe, and could erroneously report failure
+ in a multithreaded environment. (The locking primitives need to be
+ replaced for other threads packages.)
+- GC_CONS was thoroughly broken.
+- On a SPARC with dynamic linking, signals stayed diabled while the
+ client code was running.
+ (Thanks to Manuel Serrano at INRIA for reporting the last two.)
+
+ Version 2.4 added GC_free_space_divisor as a tuning knob, added
+ support for OS/2 and linux, and fixed the following bugs:
+- On machines with unaligned pointers (e.g. Sun 3), every 128th word could
+ fail to be considered for marking.
+- Dynamic_load.c erroneously added 4 bytes to the length of the data and
+ bss sections of the dynamic library. This could result in a bad memory
+ reference if the actual length was a multiple of a page. (Observed on
+ Sun 3. Can probably also happen on a Sun 4.)
+ (Thanks to Robert Brazile for pointing out that the Sun 3 version
+ was broken. Dynamic library handling is still broken on Sun 3s
+ under 4.1.1U1, but apparently not 4.1.1. If you have such a machine,
+ use -Bstatic.)
+
+ Version 2.5 fixed the following bugs:
+- Removed an explicit call to exit(1)
+- Fixed calls to GC_printf and GC_err_printf, so the correct number of
+ arguments are always supplied. The OS/2 C compiler gets confused if
+ the number of actuals and the number of formals differ. (ANSI C
+ doesn't require this to work. The ANSI sanctioned way of doing things
+ causes too many compatibility problems.)
+
+ Version 3.0 added generational/incremental collection and stubborn
+ objects.
+
+ Version 3.1 added the following features:
+- A workaround for a SunOS 4.X SPARC C compiler
+ misfeature that caused problems when the collector was turned into
+ a dynamic library.
+- A fix for a bug in GC_base that could result in a memory fault.
+- A fix for a performance bug (and several other misfeatures) pointed
+ out by Dave Detlefs and Al Dosser.
+- Use of dirty bit information for static data under Solaris 2.X.
+- DEC Alpha/OSF1 support (thanks to Al Dosser).
+- Incremental collection on more platforms.
+- A more refined heap expansion policy. Less space usage by default.
+- Various minor enhancements to reduce space usage, and to reduce
+ the amount of memory scanned by the collector.
+- Uncollectable allocation without per object overhead.
+- More conscientious handling of out-of-memory conditions.
+- Fixed a bug in debugging stubborn allocation.
+- Fixed a bug that resulted in occasional erroneous reporting of smashed
+ objects with debugging allocation.
+- Fixed bogus leak reports of size 4096 blocks with FIND_LEAK.
+
+ Version 3.2 fixed a serious and not entirely repeatable bug in
+ the incremental collector. It appeared only when dirty bit info
+ on the roots was available, which is normally only under Solaris.
+ It also added GC_general_register_disappearing_link, and some
+ testing code. Interface.c disappeared.
+
+ Version 3.3 fixes several bugs and adds new ports:
+- PCR-specific bugs.
+- Missing locking in GC_free, redundant FASTUNLOCK
+ in GC_malloc_stubborn, and 2 bugs in
+ GC_unregister_disappearing_link.
+ All of the above were pointed out by Neil Sharman
+ (neil@cs.mu.oz.au).
+- Common symbols allocated by the SunOS4.X dynamic loader
+ were not included in the root set.
+- Bug in GC_finalize (reported by Brian Beuning and Al Dosser)
+- Merged Amiga port from Jesper Peterson (untested)
+- Merged NeXT port from Thomas Funke (significantly
+ modified and untested)
+
+ Version 3.4:
+- Fixed a performance bug in GC_realloc.
+- Updated the amiga port.
+- Added NetBSD and 386BSD ports.
+- Added cord library.
+- Added trivial performance enhancement for
+ ALL_INTERIOR_POINTERS. (Don't scan last word.)
+
+ Version 3.5
+- Minor collections now mark from roots only once, if that
+ doesn't cause an excessive pause.
+- The stack clearing heuristic was refined to prevent anomalies
+ with very heavily recursive programs and sparse stacks.
+- Fixed a bug that prevented mark stack growth in some cases.
+ GC_objects_are_marked should be set to TRUE after a call
+ to GC_push_roots and as part of GC_push_marked, since
+ both can now set mark bits. I think this is only a performance
+ bug, but I wouldn't bet on it. It's certainly very hard to argue
+ that the old version was correct.
+- Fixed an incremental collection bug that prevented it from
+ working at all when HBLKSIZE != getpagesize()
+- Changed dynamic_loading.c to include gc_priv.h before testing
+ DYNAMIC_LOADING. SunOS dynamic library scanning
+ must have been broken in 3.4.
+- Object size rounding now adapts to program behavior.
+- Added a workaround (provided by Manuel Serrano and
+ colleagues) to a long-standing SunOS 4.X (and 3.X?) ld bug
+ that I had incorrectly assumed to have been squished.
+ The collector was broken if the text segment size was within
+ 32 bytes of a multiple of 8K bytes, and if the beginning of
+ the data segment contained interesting roots. The workaround
+ assumes a demand-loadable executable. The original may have
+ have "worked" in some other cases.
+- Added dynamic library support under IRIX5.
+- Added support for EMX under OS/2 (thanks to Ari Huttunen).
+
+Version 3.6:
+- fixed a bug in the mark stack growth code that was introduced
+ in 3.4.
+- fixed Makefile to work around DEC AXP compiler tail recursion
+ bug.
+
+Version 3.7:
+- Added a workaround for an HP/UX compiler bug.
+- Fixed another stack clearing performance bug. Reworked
+ that code once more.
+
+Version 4.0:
+- Added support for Solaris threads (which was possible
+ only by reimplementing some fraction of Solaris threads,
+ since Sun doesn't currently make the thread debugging
+ interface available).
+- Added non-threads win32 and win32S support.
+- (Grudgingly, with suitable muttering of obscenities) renamed
+ files so that the collector distribution could live on a FAT
+ file system. Files that are guaranteed to be useless on
+ a PC still have long names. Gc_inline.h and gc_private.h
+ still exist, but now just include gc_inl.h and gc_priv.h.
+- Fixed a really obscure bug in finalization that could cause
+ undetected mark stack overflows. (I would be surprised if
+ any real code ever tickled this one.)
+- Changed finalization code to dynamically resize the hash
+ tables it maintains. (This probably does not matter for well-
+ -written code. It no doubt does for C++ code that overuses
+ destructors.)
+- Added typed allocation primitives. Rewrote the marker to
+ accommodate them with more reasonable efficiency. This
+ change should also speed up marking for GC_malloc allocated
+ objects a little. See gc_typed.h for new primitives.
+- Improved debugging facilities slightly. Allocation time
+ stack traces are now kept by default on SPARC/SUNOS4.
+ (Thanks to Scott Schwartz.)
+- Added better support for small heap applications.
+- Significantly extended cord package. Fixed a bug in the
+ implementation of lazily read files. Printf and friends now
+ have cord variants. Cord traversals are a bit faster.
+- Made ALL_INTERIOR_POINTERS recognition the default.
+- Fixed de so that it can run in constant space, independent
+ of file size. Added simple string searching to cords and de.
+- Added the Hull-Ellis C++ interface.
+- Added dynamic library support for OSF/1.
+ (Thanks to Al Dosser and Tim Bingham at DEC.)
+- Changed argument to GC_expand_hp to be expressed
+ in units of bytes instead of heap blocks. (Necessary
+ since the heap block size now varies depending on
+ configuration. The old version was never very clean.)
+- Added GC_get_heap_size(). The previous "equivalent"
+ was broken.
+- Restructured the Makefile a bit.
+
+Since version 4.0:
+- Changed finalization implementation to guarantee that
+ finalization procedures are called outside of the allocation
+ lock, making direct use of the interface a little less dangerous.
+ MAY BREAK EXISTING CLIENTS that assume finalizers
+ are protected by a lock. Since there seem to be few multithreaded
+ clients that use finalization, this is hopefully not much of
+ a problem.
+- Fixed a gross bug in CORD_prev.
+- Fixed a bug in blacklst.c that could result in unbounded
+ heap growth during startup on machines that do not clear
+ memory obtained from the OS (e.g. win32S).
+- Ported de editor to win32/win32S. (This is now the only
+ version with a mouse-sensitive UI.)
+- Added GC_malloc_ignore_off_page to allocate large arrays
+ in the presence of ALL_INTERIOR_POINTERS.
+- Changed GC_call_with_alloc_lock to not disable signals in
+ the single-threaded case.
+- Reduced retry count in GC_collect_or_expand for garbage
+ collecting when out of memory.
+- Made uncollectable allocations bypass black-listing, as they
+ should.
+- Fixed a bug in typed_test in test.c that could cause (legitimate)
+ GC crashes.
+- Fixed some potential synchronization problems in finalize.c
+- Fixed a real locking problem in typd_mlc.c.
+- Worked around an AIX 3.2 compiler feature that results in
+ out of bounds memory references.
+- Partially worked around an IRIX5.2 beta problem (which may
+ or may not persist to the final release).
+- Fixed a bug in the heap integrity checking code that could
+ result in explicitly deallocated objects being identified as
+ smashed. Fixed a bug in the dbg_mlc stack saving code
+ that caused old argument pointers to be considered live.
+- Fixed a bug in CORD_ncmp (and hence CORD_str).
+- Repaired the OS2 port, which had suffered from bit rot
+ in 4.0. Worked around what appears to be CSet/2 V1.0
+ optimizer bug.
+- Fixed a Makefile bug for target "c++".
+
+Since version 4.1:
+- Multiple bug fixes/workarounds in the Solaris threads version.
+ (It occasionally failed to locate some register contents for
+ marking. It also turns out that thr_suspend and friends are
+ unreliable in Solaris 2.3. Dirty bit reads appear
+ to be unreliable under some weird
+ circumstances. My stack marking code
+ contained a serious performance bug. The new code is
+ extremely defensive, and has not failed in several cpu
+ hours of testing. But no guarantees ...)
+- Added MacOS support (thanks to Patrick Beard.)
+- Fixed several syntactic bugs in gc_c++.h and friends. (These
+ didn't bother g++, but did bother most other compilers.)
+ Fixed gc_c++.h finalization interface. (It didn't.)
+- 64 bit alignment for allocated objects was not guaranteed in a
+ few cases in which it should have been.
+- Added GC_malloc_atomic_ignore_off_page.
+- Added GC_collect_a_little.
+- Added some prototypes to gc.h.
+- Some other minor bug fixes (notably in Makefile).
+- Fixed OS/2 / EMX port (thanks to Ari Huttunen).
+- Fixed AmigaDOS port. (thanks to Michel Schinz).
+- Fixed the DATASTART definition under Solaris. There
+ was a 1 in 16K chance of the collector missing the first
+ 64K of static data (and thus crashing).
+- Fixed some blatant anachronisms in the README file.
+- Fixed PCR-Makefile for upcoming PPCR release.
+
+Since version 4.2:
+- Fixed SPARC alignment problem with GC_DEBUG.
+- Fixed Solaris threads /proc workaround. The real
+ problem was an interaction with mprotect.
+- Incorporated fix from Patrick Beard for gc_c++.h (now gc_cpp.h).
+- Slightly improved allocator space utilization by
+ fixing the GC_size_map mechanism.
+- Integrated some Sony News and MIPS RISCos 4.51
+ patches. (Thanks to Nobuyuki Hikichi of
+ Software Research Associates, Inc. Japan)
+- Fixed HP_PA alignment problem. (Thanks to
+ xjam@cork.cs.berkeley.edu.)
+- Added GC_same_obj and friends. Changed GC_base
+ to return 0 for pointers past the end of large objects.
+ Improved GC_base performance with ALL_INTERIOR_POINTERS
+ on machines with a slow integer mod operation.
+ Added GC_PTR_ADD, GC_PTR_STORE, etc. to prepare
+ for preprocessor.
+- changed the default on most UNIX machines to be that
+ signals are not disabled during critical GC operations.
+ This is still ANSI-conforming, though somewhat dangerous
+ in the presence of signal handlers. But the performance
+ cost of the alternative is sometimes problematic.
+ Can be changed back with a minor Makefile edit.
+- renamed IS_STRING in gc.h, to CORD_IS_STRING, thus
+ following my own naming convention. Added the function
+ CORD_to_const_char_star.
+- Fixed a gross bug in GC_finalize. Symptom: occasional
+ address faults in that function. (Thanks to Anselm
+ Baird-Smith (Anselm.BairdSmith@inria.fr)
+- Added port to ICL DRS6000 running DRS/NX. Restructured
+ things a bit to factor out common code, and remove obsolete
+ code. Collector should now run under SUNOS5 with either
+ mprotect or /proc dirty bits. (Thanks to Douglas Steel
+ (doug@wg.icl.co.uk)).
+- More bug fixes and workarounds for Solaris 2.X. (These were
+ mostly related to putting the collector in a dynamic library,
+ which didn't really work before. Also SOLARIS_THREADS
+ didn't interact well with dl_open.) Thanks to btlewis@eng.sun.com.
+- Fixed a serious performance bug on the DEC Alpha. The text
+ segment was getting registered as part of the root set.
+ (Amazingly, the result was still fast enough that the bug
+ was not conspicuous.) The fix works on OSF/1, version 1.3.
+ Hopefully it also works on other versions of OSF/1 ...
+- Fixed a bug in GC_clear_roots.
+- Fixed a bug in GC_generic_malloc_words_small that broke
+ gc_inl.h. (Reported by Antoine de Maricourt. I broke it
+ in trying to tweak the Mac port.)
+- Fixed some problems with cord/de under Linux.
+- Fixed some cord problems, notably with CORD_riter4.
+- Added DG/UX port.
+ Thanks to Ben A. Mesander (ben@piglet.cr.usgs.gov)
+- Added finalization registration routines with weaker ordering
+ constraints. (This is necessary for C++ finalization with
+ multiple inheritance, since the compiler often adds self-cycles.)
+- Filled the holes in the SCO port. (Thanks to Michael Arnoldus
+ <chime@proinf.dk>.)
+- John Ellis' additions to the C++ support: From John:
+
+* I completely rewrote the documentation in the interface gc_c++.h
+(later renamed gc_cpp.h). I've tried to make it both clearer and more
+precise.
+
+* The definition of accessibility now ignores pointers from an
+finalizable object (an object with a clean-up function) to itself.
+This allows objects with virtual base classes to be finalizable by the
+collector. Compilers typically implement virtual base classes using
+pointers from an object to itself, which under the old definition of
+accessibility prevented objects with virtual base classes from ever
+being collected or finalized.
+
+* gc_cleanup now includes gc as a virtual base. This was enabled by
+the change in the definition of accessibility.
+
+* I added support for operator new[]. Since most (all?) compilers
+don't yet support operator new[], it is conditionalized on
+-DOPERATOR_NEW_ARRAY. The code is untested, but its trivial and looks
+correct.
+
+* The test program test_gc_c++ (later renamed test_cpp.cc)
+tries to test for the C++-specific functionality not tested by the
+other programs.
+- Added <unistd.h> include to misc.c. (Needed for ppcr.)
+- Added PowerMac port. (Thanks to Patrick Beard again.)
+- Fixed "srcdir"-related Makefile problems. Changed things so
+ that all externally visible include files always appear in the
+ include subdirectory of the source. Made gc.h directly
+ includable from C++ code. (These were at Per
+ Bothner's suggestion.)
+- Changed Intel code to also mark from ebp (Kevin Warne's
+ suggestion).
+- Renamed C++ related files so they could live in a FAT
+ file system. (Charles Fiterman's suggestion.)
+- Changed Windows NT Makefile to include C++ support in
+ gc.lib. Added C++ test as Makefile target.
+
+Since version 4.3:
+ - ASM_CLEAR_CODE was erroneously defined for HP
+ PA machines, resulting in a compile error.
+ - Fixed OS/2 Makefile to create a library. (Thanks to
+ Mark Boulter (mboulter@vnet.ibm.com)).
+ - Gc_cleanup objects didn't work if they were created on
+ the stack. Fixed.
+ - One copy of Gc_cpp.h in the distribution was out of
+ synch, and failed to document some known compiler
+ problems with explicit destructor invocation. Partially
+ fixed. There are probably other compilers on which
+ gc_cleanup is miscompiled.
+ - Fixed Makefile to pass C compiler flags to C++ compiler.
+ - Added Mac fixes.
+ - Fixed os_dep.c to work around what appears to be
+ a new and different VirtualQuery bug under newer
+ versions of win32S.
+ - GC_non_gc_bytes was not correctly maintained by
+ GC_free. Fixed. Thanks to James Clark (jjc@jclark.com).
+ - Added GC_set_max_heap_size.
+ - Changed allocation code to ignore blacklisting if it is preventing
+ use of a very large block of memory. This has the advantage
+ that naive code allocating very large objects is much more
+ likely to work. The downside is you might no
+ longer find out that such code should really use
+ GC_malloc_ignore_off_page.
+ - Changed GC_printf under win32 to close and reopen the file
+ between calls. FAT file systems otherwise make the log file
+ useless for debugging.
+ - Added GC_try_to_collect and GC_get_bytes_since_gc. These
+ allow starting an abortable collection during idle times.
+ This facility does not require special OS support. (Thanks to
+ Michael Spertus of Geodesic Systems for suggesting this. It was
+ actually an easy addition. Kumar Srikantan previously added a similar
+ facility to a now ancient version of the collector. At the time
+ this was much harder, and the result was less convincing.)
+ - Added some support for the Borland development environment. (Thanks
+ to John Ellis and Michael Spertus.)
+ - Removed a misfeature from checksums.c that caused unexpected
+ heap growth. (Thanks to Scott Schwartz.)
+ - Changed finalize.c to call WARN if it encounters a finalization cycle.
+ WARN is defined in gc_priv.h to write a message, usually to stdout.
+ In many environments, this may be inappropriate.
+ - Renamed NO_PARAMS in gc.h to GC_NO_PARAMS, thus adhering to my own
+ naming convention.
+ - Added GC_set_warn_proc to intercept warnings.
+ - Fixed Amiga port. (Thanks to Michel Schinz (schinz@alphanet.ch).)
+ - Fixed a bug in mark.c that could result in an access to unmapped
+ memory from GC_mark_from_mark_stack on machines with unaligned
+ pointers.
+ - Fixed a win32 specific performance bug that could result in scanning of
+ objects allocated with the system malloc.
+ - Added REDIRECT_MALLOC.
+
+Since version 4.4:
+ - Fixed many minor and one major README bugs. (Thanks to Franklin Chen
+ (chen@adi.com) for pointing out many of them.)
+ - Fixed ALPHA/OSF/1 dynamic library support. (Thanks to Jonathan Bachrach
+ (jonathan@harlequin.com)).
+ - Added incremental GC support (MPROTECT_VDB) for Linux (with some
+ help from Bruno Haible).
+ - Altered SPARC recognition tests in gc.h and config.h (mostly as
+ suggested by Fergus Henderson).
+ - Added basic incremental GC support for win32, as implemented by
+ Windows NT and Windows 95. GC_enable_incremental is a noop
+ under win32s, which doesn't implement enough of the VM interface.
+ - Added -DLARGE_CONFIG.
+ - Fixed GC_..._ignore_off_page to also function without
+ -DALL_INTERIOR_POINTERS.
+ - (Hopefully) fixed RS/6000 port. (Only the test was broken.)
+ - Fixed a performance bug in the nonincremental collector running
+ on machines supporting incremental collection with MPROTECT_VDB
+ (e.g. SunOS 4, DEC AXP). This turned into a correctness bug under
+ win32s with win32 incremental collection. (Not all memory protection
+ was disabled.)
+ - Fixed some ppcr related bit rot.
+ - Caused dynamic libraries to be unregistered before reregistering.
+ The old way turned out to be a performance bug on some machines.
+ - GC_root_size was not properly maintained under MSWIN32.
+ - Added -DNO_DEBUGGING and GC_dump.
+ - Fixed a couple of bugs arising with SOLARIS_THREADS +
+ REDIRECT_MALLOC.
+ - Added NetBSD/M68K port. (Thanks to Peter Seebach
+ <seebs@taniemarie.solon.com>.)
+ - Fixed a serious realloc bug. For certain object sizes, the collector
+ wouldn't scan the expanded part of the object. (Thanks to Clay Spence
+ (cds@peanut.sarnoff.com) for noticing the problem, and helping me to
+ track it down.)
+
+Since version 4.5:
+ - Added Linux ELF support. (Thanks to Arrigo Triulzi <arrigo@ic.ac.uk>.)
+ - GC_base crashed if it was called before any other GC_ routines.
+ This could happen if a gc_cleanup object was allocated outside the heap
+ before any heap allocation.
+ - The heap expansion heuristic was not stable if all objects had finalization
+ enabled. Fixed finalize.c to count memory in finalization queue and
+ avoid explicit deallocation. Changed alloc.c to also consider this count.
+ (This is still not recommended. It's expensive if nothing else.) Thanks
+ to John Ellis for pointing this out.
+ - GC_malloc_uncollectable(0) was broken. Thanks to Phong Vo for pointing
+ this out.
+ - The collector didn't compile under Linux 1.3.X. (Thanks to Fred Gilham for
+ pointing this out.) The current workaround is ugly, but expected to be
+ temporary.
+ - Fixed a formatting problem for SPARC stack traces.
+ - Fixed some '=='s in os_dep.c that should have been assignments.
+ Fortunately these were in code that should never be executed anyway.
+ (Thanks to Fergus Henderson.)
+ - Fixed the heap block allocator to only drop blacklisted blocks in small
+ chunks. Made BL_LIMIT self adjusting. (Both of these were in response
+ to heap growth observed by Paul Graham.)
+ - Fixed the Metrowerks/68K Mac code to also mark from a6. (Thanks
+ to Patrick Beard.)
+ - Significantly updated README.debugging.
+ - Fixed some problems with longjmps out of signal handlers, especially under
+ Solaris. Added a workaround for the fact that siglongjmp doesn't appear to
+ do the right thing with -lthread under Solaris.
+ - Added MSDOS/djgpp port. (Thanks to Mitch Harris (maharri@uiuc.edu).)
+ - Added "make reserved_namespace" and "make user_namespace". The
+ first renames ALL "GC_xxx" identifiers as "_GC_xxx". The second is the
+ inverse transformation. Note that doing this is guaranteed to break all
+ clients written for the other names.
+ - descriptor field for kind NORMAL in GC_obj_kinds with ADD_BYTE_AT_END
+ defined should be -ALIGNMENT not WORDS_TO_BYTES(-1). This is
+ a serious bug on machines with pointer alignment of less than a word.
+ - GC_ignore_self_finalize_mark_proc didn't handle pointers to very near the
+ end of the object correctly. Caused failures of the C++ test on a DEC Alpha
+ with g++.
+ - gc_inl.h still had problems. Partially fixed. Added warnings at the
+ beginning to hopefully specify the remaining dangers.
+ - Added DATAEND definition to config.h.
+ - Fixed some of the .h file organization. Fixed "make floppy".
+
+Since version 4.6:
+ - Fixed some compilation problems with -DCHECKSUMS (thanks to Ian Searle)
+ - Updated some Mac specific files to synchronize with Patrick Beard.
+ - Fixed a serious bug for machines with non-word-aligned pointers.
+ (Thanks to Patrick Beard for pointing out the problem. The collector
+ should fail almost any conceivable test immediately on such machines.)
+
+Since version 4.7:
+ - Changed a "comment" in a MacOS specific part of mach-dep.c that caused
+ gcc to fail on other platforms.
+
+Since version 4.8
+ - More README.debugging fixes.
+ - Objects ready for finalization, but not finalized in the same GC
+ cycle, could be prematurely collected. This occasionally happened
+ in test_cpp.
+ - Too little memory was obtained from the system for very large
+ objects. That could cause a heap explosion if these objects were
+ not contiguous (e.g. under PCR), and too much of them was blacklisted.
+ - Due to an improper initialization, the collector was too hesitant to
+ allocate blacklisted objects immediately after system startup.
+ - Moved GC_arrays from the data into the bss segment by not explicitly
+ initializing it to zero. This significantly
+ reduces the size of executables, and probably avoids some disk accesses
+ on program startup. It's conceivable that it might break a port that I
+ didn't test.
+ - Fixed EMX_MAKEFILE to reflect the gc_c++.h to gc_cpp.h renaming which
+ occurred a while ago.
+
+Since 4.9:
+ - Fixed a typo around a call to GC_collect_or_expand in alloc.c. It broke
+ handling of out of memory. (Thanks to Patrick Beard for noticing.)
+
+Since 4.10:
+ - Rationalized (hopefully) GC_try_to_collect in an incremental collection
+ environment. It appeared to not handle a call while a collection was in
+ progress, and was otherwise too conservative.
+ - Merged GC_reclaim_or_delete_all into GC_reclaim_all to get rid of some
+ code.
+ - Added Patrick Beard's Mac fixes, with substantial completely untested
+ modifications.
+ - Fixed the MPROTECT_VDB code to deal with large pages and imprecise
+ fault addresses (as on an UltraSPARC running Solaris 2.5). Note that this
+ was not a problem in the default configuration, which uses PROC_VDB.
+ - The DEC Alpha assembly code needed to restore $gp between calls.
+ Thanks to Fergus Henderson for tracking this down and supplying a
+ patch.
+ - The write command for "de" was completely broken for large files.
+ I used the easiest portable fix, which involved changing the semantics
+ so that f.new is written instead of overwriting f. That's safer anyway.
+ - Added README.solaris2 with a discussion of the possible problems of
+ mixing the collector's sbrk allocation with malloc/realloc.
+ - Changed the data segment starting address for SGI machines. The
+ old code failed under IRIX6.
+ - Required double word alignment for MIPS.
+ - Various minor fixes to remove warnings.
+ - Attempted to fix some Solaris threads problems reported by Zhiying Chen.
+ In particular, the collector could try to fork a thread with the
+ world stopped as part of GC_thr_init. It also failed to deal with
+ the case in which the original thread terminated before the whole
+ process did.
+ - Added -DNO_EXECUTE_PERMISSION. This has a major performance impact
+ on the incremental collector under Irix, and perhaps under other
+ operating systems.
+ - Added some code to support allocating the heap with mmap. This may
+ be preferable under some circumstances.
+ - Integrated dynamic library support for HP.
+ (Thanks to Knut Tvedten <knuttv@ifi.uio.no>.)
+ - Integrated James Clark's win32 threads support, and made a number
+ of changes to it, many of which were suggested by Pontus Rydin.
+ This is still not 100% solid.
+ - Integrated Alistair Crooks' support for UTS4 running on an Amdahl
+ 370-class machine.
+ - Fixed a serious bug in explicitly typed allocation. Objects requiring
+ large descriptors where handled in a way that usually resulted in
+ a segmentation fault in the marker. (Thanks to Jeremy Fitzhardinge
+ for helping to track this down.)
+ - Added partial support for GNU win32 development. (Thanks to Fergus
+ Henderson.)
+ - Added optional support for Java-style finalization semantics. (Thanks
+ to Patrick Bridges.) This is recommended only for Java implementations.
+ - GC_malloc_uncollectable faulted instead of returning 0 when out of
+ memory. (Thanks to dan@math.uiuc.edu for noticing.)
+ - Calls to GC_base before the collector was initialized failed on a
+ DEC Alpha. (Thanks to Matthew Flatt.)
+ - Added base pointer checking to GC_REGISTER_FINALIZER in debugging
+ mode, at the suggestion of Jeremy Fitzhardinge.
+ - GC_debug_realloc failed for uncollectable objects. (Thanks to
+ Jeremy Fitzhardinge.)
+ - Explicitly typed allocation could crash if it ran out of memory.
+ (Thanks to Jeremy Fitzhardinge.)
+ - Added minimal support for a DEC Alpha running Linux.
+ - Fixed a problem with allocation of objects whose size overflowed
+ ptrdiff_t. (This now fails unconditionally, as it should.)
+ - Added the beginning of Irix pthread support.
+ - Integrated Xiaokun Zhu's fixes for djgpp 2.01.
+ - Added SGI-style STL allocator support (gc_alloc.h).
+ - Fixed a serious bug in README.solaris2. Multithreaded programs must include
+ gc.h with SOLARIS_THREADS defined.
+ - Changed GC_free so it actually deallocates uncollectable objects.
+ (Thanks to Peter Chubb for pointing out the problem.)
+ - Added Linux ELF support for dynamic libararies. (Thanks again to
+ Patrick Bridges.)
+ - Changed the Borland cc configuration so that the assembler is not
+ required.
+ - Fixed a bug in the C++ test that caused it to fail in 64-bit
+ environments.
+
+Since 4.11:
+ - Fixed ElfW definition in dyn_load.c. (Thanks to Fergus Henderson.)
+ This prevented the dynamic library support from compiling on some
+ older ELF Linux systems.
+ - Fixed UTS4 port (which I apparently mangled during the integration)
+ (Thanks to again to Alistair Crooks.)
+ - "Make C++" failed on Suns with SC4.0, due to a problem with "bool".
+ Fixed in gc_priv.h.
+ - Added more pieces for GNU win32. (Thanks to Timothy N. Newsham.)
+ The current state of things should suffice for at least some
+ applications.
+ - Changed the out of memory retry count handling as suggested by
+ Kenjiro Taura. (This matters only if GC_max_retries > 0, which
+ is no longer the default.)
+ - If a /proc read failed repeatedly, GC_written_pages was not updated
+ correctly. (Thanks to Peter Chubb for diagnosing this.)
+ - Under unlikely circumstances, the allocator could infinite loop in
+ an out of memory situation. (Thanks again to Kenjiro Taura for
+ identifying the problem and supplying a fix.)
+ - Fixed a syntactic error in the DJGPP code. (Thanks to Fergus
+ Henderson for finding this by inspection.) Also fixed a test program
+ problem with DJGPP (Thanks to Peter Monks.)
+ - Atomic uncollectable objects were not treated correctly by the
+ incremental collector. This resulted in weird log statistics and
+ occasional performance problems. (Thanks to Peter Chubb for pointing
+ this out.)
+ - Fixed some problems resulting from compilers that dont define
+ __STDC__. In this case void * and char * were used inconsistently
+ in some cases. (Void * should not have been used at all. If
+ you have an ANSI superset compiler that does not define __STDC__,
+ please compile with -D__STDC__=0. Thanks to Manuel Serrano and others
+ for pointing out the problem.)
+ - Fixed a compilation problem on Irix with -n32 and -DIRIX_THREADS.
+ Also fixed some other IRIX_THREADS problems which may or may not have
+ had observable symptoms.
+ - Fixed an HP PA compilation problem in dyn_load.c. (Thanks to
+ Philippe Queinnec.)
+ - SEGV fault handlers sometimes did not get reset correctly. (Thanks
+ to David Pickens.)
+ - Added a fix for SOLARIS_THREADS on Intel. (Thanks again to David
+ Pickens.) This probably needs more work to become functional.
+ - Fixed struct sigcontext_struct in os_dep.c for compilation under
+ Linux 2.1.X. (Thanks to Fergus Henderson.)
+ - Changed the DJGPP STACKBOTTOM and DATASTART values to those suggested
+ by Kristian Kristensen. These may still not be right, but it is
+ it is likely to work more often than what was there before. They may
+ even be exactly right.
+ - Added a #include <string.h> to test_cpp.cc. This appears to help
+ with HP/UX and gcc. (Thanks to assar@sics.se.)
+ - Version 4.11 failed to run in incremental mode on recent 64-bit Irix
+ kernels. This was a problem related to page unaligned heap segments.
+ Changed the code to page align heap sections on all platforms.
+ (I had mistakenly identified this as a kernel problem earlier.
+ It was not.)
+ - Version 4.11 did not make allocated storage executable, except on
+ one or two platforms, due to a bug in a #if test. (Thanks to Dave
+ Grove for pointing this out.)
+ - Added sparc_sunos4_mach_dep.s to support Sun's compilers under SunOS4.
+ - Added GC_exclude_static_roots.
+ - Fixed the object size mapping algorithm. This shouldn't matter,
+ but the old code was ugly.
+ - Heap checking code could die if one of the allocated objects was
+ larger than its base address. (Unsigned underflow problem. Thanks
+ to Clay Spence for isolating the problem.)
+ - Added RS6000 (AIX) dynamic library support and fixed STACK_BOTTOM.
+ (Thanks to Fred Stearns.)
+ - Added Fergus Henderson's patches for improved robustness with large
+ heaps and lots of blacklisting.
+ - Added Peter Chubb's changes to support Solaris Pthreads, to support
+ MMAP allocation in Solaris, to allow Solaris to find dynamic libraries
+ through /proc, to add malloc_typed_ignore_off_page, and a few other
+ minor features and bug fixes.
+ - The Solaris 2 port should not use sbrk. I received confirmation from
+ Sun that the use of sbrk and malloc in the same program is not
+ supported. The collector now defines USE_MMAP by default on Solaris.
+ - Replaced the djgpp makefile with Gary Leavens' version.
+ - Fixed MSWIN32 detection test.
+ - Added Fergus Henderson's patches to allow putting the collector into
+ a DLL under GNU win32.
+ - Added Ivan V. Demakov's port to Watcom C on X86.
+ - Added Ian Piumarta's Linux/PowerPC port.
+ - On Brian Burton's suggestion added PointerFreeGC to the placement
+ options in gc_cpp.h. This is of course unsafe, and may be controversial.
+ On the other hand, it seems to be needed often enough that it's worth
+ adding as a standard facility.
+
+Since 4.12:
+ - Fixed a crucial bug in the Watcom port. There was a redundant decl
+ of GC_push_one in gc_priv.h.
+ - Added FINALIZE_ON_DEMAND.
+ - Fixed some pre-ANSI cc problems in test.c.
+ - Removed getpagesize() use for Solaris. It seems to be missing in one
+ or two versions.
+ - Fixed bool handling for SPARCCompiler version 4.2.
+ - Fixed some files in include that had gotten unlinked from the main
+ copy.
+ - Some RS/6000 fixes (missing casts). Thanks to Toralf Foerster.
+ - Fixed several problems in GC_debug_realloc, affecting mostly the
+ FIND_LEAK case.
+ - GC_exclude_static_roots contained a buggy unsigned comparison to
+ terminate a loop. (Thanks to Wilson Ho.)
+ - CORD_str failed if the substring occurred at the last possible position.
+ (Only affects cord users.)
+ - Fixed Linux code to deal with RedHat 5.0 and integrated Peter Bigot's
+ os_dep.c code for dealing with various Linux versions.
+ - Added workaround for Irix pthreads sigaction bug and possible signal
+ misdirection problems.
+Since alpha1:
+ - Changed RS6000 STACKBOTTOM.
+ - Integrated Patrick Beard's Mac changes.
+ - Alpha1 didn't compile on Irix m.n, m < 6.
+ - Replaced Makefile.dj with a new one from Gary Leavens.
+ - Added Andrew Stitcher's changes to support SCO OpenServer.
+ - Added PRINT_BLACK_LIST, to allow debugging of high densities of false
+ pointers.
+ - Added code to debug allocator to keep track of return address
+ in GC_malloc caller, thus giving a bit more context.
+ - Changed default behavior of large block allocator to more
+ aggressively avoid fragmentation. This is likely to slow down the
+ collector when it succeeds at reducing space cost.
+ - Integrated Fergus Henderson's CYGWIN32 changes. They are untested,
+ but needed for newer versions.
+ - USE_MMAP had some serious bugs. This caused the collector to fail
+ consistently on Solaris with -DSMALL_CONFIG.
+ - Added Linux threads support, thanks largely to Fergus Henderson.
+
+To do:
+ - I have a backlog of unintegrated contributed platform-specific changes.
+ - Very large root set sizes (> 16 MB or so) could cause the collector
+ to abort with an unexpected mark stack overflow. (Thanks again to
+ Peter Chubb.) NOT YET FIXED. Workaround is to increase the initial
+ size.
+ - The SGI version of the collector marks from mmapped pages, even
+ if they are not part of dynamic library static data areas. This
+ causes performance problems with some SGI libraries that use mmap
+ as a bitmap allocator. NOT YET FIXED. It may be possible to turn
+ off DYNAMIC_LOADING in the collector as a workaround. It may also
+ be possible to conditionally intercept mmap and use GC_exclude_static_roots.
+ The real fix is to walk rld data structures, which looks possible.
+ - Integrate MIT and DEC pthreads ports.
+
diff --git a/boehm-gc/README.Mac b/boehm-gc/README.Mac
new file mode 100644
index 00000000000..6d2fa74358d
--- /dev/null
+++ b/boehm-gc/README.Mac
@@ -0,0 +1,385 @@
+Patrick Beard's Notes for building GC v4.12 with CodeWarrior Pro 2:
+----------------------------------------------------------------------------
+The current build environment for the collector is CodeWarrior Pro 2.
+Projects for CodeWarrior Pro 2 (and for quite a few older versions)
+are distributed in the file Mac_projects.sit.hqx. The project file
+:Mac_projects:gc.prj builds static library versions of the collector.
+:Mac_projects:gctest.prj builds the GC test suite.
+
+Configuring the collector is still done by editing the files
+:Mac_files:MacOS_config.h and :Mac_files:MacOS_Test_config.h.
+
+Lars Farm's suggestions on building the collector:
+----------------------------------------------------------------------------
+Garbage Collection on MacOS - a manual 'MakeFile'
+-------------------------------------------------
+
+Project files and IDE's are great on the Macintosh, but they do have
+problems when used as distribution media. This note tries to provide
+porting instructions in pure TEXT form to avoid those problems. A manual
+'makefile' if you like.
+
+ GC version: 4.12a2
+ Codewarrior: CWPro1
+ date: 18 July 1997
+
+The notes may or may not apply to earlier or later versions of the
+GC/CWPro. Actually, they do apply to earlier versions of both except that
+until recently a project could only build one target so each target was a
+separate project. The notes will most likely apply to future versions too.
+Possibly with minor tweaks.
+
+This is just to record my experiences. These notes do not mean I now
+provide a supported port of the GC to MacOS. It works for me. If it works
+for you, great. If it doesn't, sorry, try again...;-) Still, if you find
+errors, please let me know.
+
+ mailto: lars.farm@ite.mh.se
+
+ address: Lars Farm
+ Krönvägen 33b
+ 856 44 Sundsvall
+ Sweden
+
+Porting to MacOS is a bit more complex than it first seems. Which MacOS?
+68K/PowerPC? Which compiler? Each supports both 68K and PowerPC and offer a
+large number of (unique to each environment) compiler settings. Each
+combination of compiler/68K/PPC/settings require a unique combination of
+standard libraries. And the IDE's does not select them for you. They don't
+even check that the library is built with compatible setting and this is
+the major source of problems when porting the GC (and otherwise too).
+
+You will have to make choices when you configure the GC. I've made some
+choices here, but there are other combinations of settings and #defines
+that work too.
+
+As for target settings the major obstacles may be:
+- 68K Processor: check "4-byte Ints".
+- PPC Processor: uncheck "Store Static Data in TOC".
+
+What you need to do:
+===================
+
+1) Build the GC as a library
+2) Test that the library works with 'test.c'.
+3) Test that the C++ interface 'gc_cpp.cc/h' works with 'test_cpp.cc'.
+
+1) The Libraries:
+=================
+I made one project with four targets (68K/PPC tempmem or appheap). One target
+will suffice if you're able to decide which one you want. I wasn't...
+
+Codewarrior allows a large number of compiler/linker settings. I used these:
+
+Settings shared by all targets:
+------------------------------
+o Access Paths:
+ - User Paths: the GC folder
+ - System Paths: {Compiler}:Metrowerks Standard Library:
+ {Compiler}:MacOS Support:Headers:
+ {Compiler}:MacOS Support:MacHeaders:
+o C/C++ language:
+ - inlining: normal
+ - direct to SOM: off
+ - enable/check: exceptions, RTTI, bool (and if you like pool strings)
+
+PowerPC target settings
+-----------------------
+o Target Settings:
+ - name of target
+ - MacOS PPC Linker
+o PPC Target
+ - name of library
+o C/C++ language
+ - prefix file as described below
+o PPC Processor
+ - Struct Alignment: PowerPC
+ - uncheck "Store Static Data in TOC" -- important!
+ I don't think the others matter, I use full optimization and its ok
+o PPC Linker
+ - Factory Settings (SYM file with full paths, faster linking, dead-strip
+ static init, Main: __start)
+
+
+68K target settings
+-------------------
+o Target Settings:
+ - name of target
+ - MacOS 68K Linker
+o 68K Target
+ - name of library
+ - A5 relative data
+o C/C++ language
+ - prefix file as described below
+o 68K Processor
+ - Code model: smart
+ - Struct alignment: 68K
+ - FP: SANE
+ - enable 4-Byte Ints -- important!
+ I don't think the others matter. I selected...
+ - enable: 68020
+ - enable: global register allocation
+o IR Optimizer
+ - enable: Optimize Space, Optimize Speed
+ I suppose the others would work too, but haven't tried...
+o 68K Linker
+ - Factory Settings (New Style MacsBug,SYM file with full paths,
+ A6 Frames, fast link, Merge compiler glue into segment 1,
+ dead-strip static init)
+
+Prefix Files to configure the GC sources
+----------------------------------------
+The Codewarrior equivalent of commandline compilers -DNAME=X is to use
+prefix-files. A TEXT file that is automatically #included before the first byte
+of every source file. I used these:
+
+---- ( cut here ) ---- gc_prefix_tempmem.h -- 68K and PPC -----
+ #include "gc_prefix_common.h"
+ #undef USE_TEMPORARY_MEMORY
+ #define USE_TEMPORARY_MEMORY
+---- ( cut here ) ---- gc_prefix_appmem.h -- 68K and PPC -----
+ #include "gc_prefix_common.h"
+ #undef USE_TEMPORARY_MEMORY
+// #define USE_TEMPORARY_MEMORY
+
+---- ( cut here ) ---- gc_prefix_common.h --------------------
+// gc_prefix_common.h
+// ------------------
+// Codewarrior prefix file to configure the GC libraries
+//
+// prefix files are the Codewarrior equivalent of the
+// command line option -Dname=x frequently seen in makefiles
+
+#if !__MWERKS__
+ #error only tried this with Codewarrior
+#endif
+
+#if macintosh
+ #define MSL_USE_PRECOMPILED_HEADERS 0
+ #include <ansi_prefix.mac.h>
+ #ifndef __STDC__
+ #define __STDC__ 0
+ #endif
+
+ // See list of #defines to configure the library in: 'MakeFile'
+ // see also README
+
+ #define SILENT // no collection messages. In case
+ // of trouble you might want this off
+ #define ALL_INTERIOR_POINTERS // follows interior pointers.
+//#define DONT_ADD_BYTE_AT_END // disables the padding if defined.
+//#define SMALL_CONFIG // whether to use a smaller heap.
+ #define NO_SIGNALS // signals aren't real on the Macintosh.
+ #define ATOMIC_UNCOLLECTABLE // GC_malloc_atomic_uncollectable()
+
+ // define either or none as per personal preference
+ // used in malloc.c
+ #define REDIRECT_MALLOC GC_malloc
+//#define REDIRECT_MALLOC GC_malloc_uncollectable
+ // if REDIRECT_MALLOC is #defined make sure that the GC library
+ // is listed before the ANSI/ISO libs in the Codewarrior
+ // 'Link order' panel
+//#define IGNORE_FREE
+
+ // mac specific configs
+//#define USE_TEMPORARY_MEMORY // use Macintosh temporary memory.
+//#define SHARED_LIBRARY_BUILD // build for use in a shared library.
+
+#else
+ // could build Win32 here too, or in the future
+ // Rhapsody PPC-mach, Rhapsody PPC-MacOS,
+ // Rhapsody Intel-mach, Rhapsody Intel-Win32,...
+ // ... ugh this will get messy ...
+#endif
+
+// make sure ints are at least 32-bit
+// ( could be set to 16-bit by compiler settings (68K) )
+
+struct gc_private_assert_intsize_{ char x[ sizeof(int)>=4 ? 1 : 0 ]; };
+
+#if __powerc
+ #if __option(toc_data)
+ #error turn off "store static data in TOC" when using GC
+ // ... or find a way to add TOC to the root set...(?)
+ #endif
+#endif
+---- ( cut here ) ---- end of gc_prefix_common.h -----------------
+
+Files to build the GC libraries:
+--------------------------------
+ allchblk.c
+ alloc.c
+ blacklst.c
+ checksums.c
+ dbg_mlc.c
+ finalize.c
+ headers.c
+ mach_dep.c
+ MacOS.c -- contains MacOS code
+ malloc.c
+ mallocx.c
+ mark.c
+ mark_rts.c
+ misc.c
+ new_hblk.c
+ obj_map.c
+ os_dep.c -- contains MacOS code
+ ptr_chck.c
+ reclaim.c
+ stubborn.c
+ typd_mlc.c
+ gc++.cc -- this is 'gc_cpp.cc' with less 'inline' and
+ -- throw std::bad_alloc when out of memory
+ -- gc_cpp.cc works just fine too
+
+2) Test that the library works with 'test.c'.
+=============================================
+
+The test app is just an ordinary ANSI-C console app. Make sure settings
+match the library you're testing.
+
+Files
+-----
+ test.c
+ the GC library to test -- link order before ANSI libs
+ suitable Mac+ANSI libraries
+
+prefix:
+------
+---- ( cut here ) ---- gc_prefix_testlib.h -- all libs -----
+#define MSL_USE_PRECOMPILED_HEADERS 0
+#include <ansi_prefix.mac.h>
+#undef NDEBUG
+
+#define ALL_INTERIOR_POINTERS /* for GC_priv.h */
+---- ( cut here ) ----
+
+3) Test that the C++ interface 'gc_cpp.cc/h' works with 'test_cpp.cc'.
+
+The test app is just an ordinary ANSI-C console app. Make sure settings match
+the library you're testing.
+
+Files
+-----
+ test_cpp.cc
+ the GC library to test -- link order before ANSI libs
+ suitable Mac+ANSI libraries
+
+prefix:
+------
+same as for test.c
+
+For convenience I used one test-project with several targets so that all
+test apps are build at once. Two for each library to test: test.c and
+gc_app.cc. When I was satisfied that the libraries were ok. I put the
+libraries + gc.h + the c++ interface-file in a folder that I then put into
+the MSL hierarchy so that I don't have to alter access-paths in projects
+that use the GC.
+
+After that, just add the proper GC library to your project and the GC is in
+action! malloc will call GC_malloc and free GC_free, new/delete too. You
+don't have to call free or delete. You may have to be a bit cautious about
+delete if you're freeing other resources than RAM. See gc_cpp.h. You can
+also keep coding as always with delete/free. That works too. If you want,
+"include <gc.h> and tweak it's use a bit.
+
+Symantec SPM
+============
+It has been a while since I tried the GC in SPM, but I think that the above
+instructions should be sufficient to guide you through in SPM too. SPM
+needs to know where the global data is. Use the files 'datastart.c' and
+'dataend.c'. Put 'datastart.c' at the top of your project and 'dataend.c'
+at the bottom of your project so that all data is surrounded. This is not
+needed in Codewarrior because it provides intrinsic variables
+__datastart__, __data_end__ that wraps all globals.
+
+Source Changes (GC 4.12a2)
+==========================
+Very few. Just one tiny in the GC, not strictly needed.
+- MacOS.c line 131 in routine GC_MacFreeTemporaryMemory()
+ change # if !defined(SHARED_LIBRARY_BUILD)
+ to # if !defined(SILENT) && !defined(SHARED_LIBRARY_BUILD)
+ To turn off a message when the application quits (actually, I faked
+ this change by #defining SHARED_LIBRARY_BUILD in a statically linked
+ library for more than a year without ill effects but perhaps this is
+ better).
+
+- test_cpp.cc
+ made the first lines of main() look like this:
+ ------------
+ int main( int argc, char* argv[] ) {
+ #endif
+ #if macintosh // MacOS
+ char* argv_[] = {"test_cpp","10"}; // doesn't
+ argv=argv_; // have a
+ argc = sizeof(argv_)/sizeof(argv_[0]); // commandline
+ #endif //
+
+ int i, iters, n;
+ # ifndef __GNUC__
+ alloc dummy_to_fool_the_compiler_into_doing_things_it_currently_cant_handle;
+ ------------
+
+- config.h
+ __MWERKS__ does not have to mean MACOS. You can use Codewarrior to
+ build a Win32 or BeOS library and soon a Rhapsody library. You may
+ have to change that #if...
+
+
+
+ It worked for me, hope it works for you.
+
+ Lars Farm
+ 18 July 1997
+----------------------------------------------------------------------------
+
+
+Patrick Beard's instructions (may be dated):
+
+v4.3 of the collector now runs under Symantec C++/THINK C v7.0.4, and
+Metrowerks C/C++ v4.5 both 68K and PowerPC. Project files are provided
+to build and test the collector under both development systems.
+
+Configuration
+-------------
+
+To configure the collector, under both development systems, a prefix file
+is used to set preprocessor directives. This file is called "MacOS_config.h".
+Also to test the collector, "MacOS_Test_config.h" is provided.
+
+Testing
+-------
+
+To test the collector (always a good idea), build one of the gctest projects,
+gctest.¹ (Symantec C++/THINK C), mw/gctest.68K.¹, or mw/gctest.PPC.¹. The
+test will ask you how many times to run; 1 should be sufficient.
+
+Building
+--------
+
+For your convenience project files for the major Macintosh development
+systems are provided.
+
+For Symantec C++/THINK C, you must build the two projects gclib-1.¹ and
+gclib-2.¹. It has to be split up because the collector has more than 32k
+of static data and no library can have more than this in the Symantec
+environment. (Future versions will probably fix this.)
+
+For Metrowerks C/C++ 4.5 you build gc.68K.¹/gc.PPC.¹ and the result will
+be a library called gc.68K.lib/gc.PPC.lib.
+
+Using
+-----
+
+Under Symantec C++/THINK C, you can just add the gclib-1.¹ and gclib-2.¹
+projects to your own project. Under Metrowerks, you add gc.68K.lib or
+gc.PPC.lib and two additional files. You add the files called datastart.c
+and dataend.c to your project, bracketing all files that use the collector.
+See mw/gctest.¹ for an example.
+
+Include the projects/libraries you built above into your own project,
+#include "gc.h", and call GC_malloc. You don't have to call GC_free.
+
+
+Patrick C. Beard
+January 4, 1995
diff --git a/boehm-gc/README.OS2 b/boehm-gc/README.OS2
new file mode 100644
index 00000000000..5345bbd0f65
--- /dev/null
+++ b/boehm-gc/README.OS2
@@ -0,0 +1,6 @@
+The code assumes static linking, and a single thread. The editor de has
+not been ported. The cord test program has. The supplied OS2_MAKEFILE
+assumes the IBM C Set/2 environment, but the code shouldn't.
+
+Since we haven't figured out hoe to do perform partial links or to build static
+libraries, clients currently need to link against a long list of executables.
diff --git a/boehm-gc/README.QUICK b/boehm-gc/README.QUICK
new file mode 100644
index 00000000000..3273c8ba4eb
--- /dev/null
+++ b/boehm-gc/README.QUICK
@@ -0,0 +1,41 @@
+Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+
+THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+
+Permission is hereby granted to use or copy this program
+for any purpose, provided the above notices are retained on all copies.
+Permission to modify the code and to distribute modified code is granted,
+provided the above notices are retained, and a notice that the code was
+modified is included with the above copyright notice.
+
+
+For more details and the names of other contributors, see the
+README file and gc.h. This file describes typical use of
+the collector on a machine that is already supported.
+
+INSTALLATION:
+Under UN*X, type "make test". Under OS/2 or Windows NT, copy the
+appropriate makefile to MAKEFILE, read it, and type "nmake test".
+Read the machine specific README if one exists. The only way to
+develop code with the collector for Windows 3.1 is to develop under
+Windows NT, and then to use win32S.
+
+If you wish to use the cord (structured string) library type
+"make cords". (This requires an ANSI C compiler. You may need
+to redefine CC in the Makefile.)
+
+If you wish to use the collector from C++, type
+"make c++". These add further files to gc.a and to the include
+subdirectory. See cord/cord.h and gc_c++.h.
+
+TYPICAL USE:
+Include "gc.h" from this directory. Link against the appropriate library
+("gc.a" under UN*X). Replace calls to malloc by calls to GC_MALLOC,
+and calls to realloc by calls to GC_REALLOC. If the object is known
+to never contain pointers, use GC_MALLOC_ATOMIC instead of
+GC_MALLOC.
+
+Define GC_DEBUG before including gc.h for additional checking.
+
diff --git a/boehm-gc/README.alpha b/boehm-gc/README.alpha
new file mode 100644
index 00000000000..b187fd5bc45
--- /dev/null
+++ b/boehm-gc/README.alpha
@@ -0,0 +1,15 @@
+Should work under OSF/1 and Linux. Currently no VMS or NT support, though
+the latter shouldn't be hard.
+
+Incremental gc not yet supported under Linux because signal handler
+for SIGSEGV can't get a hold of fault address. Dynamic library support
+is also missing from Linux/alpha, probably for no good reason.
+
+From Philippe Queinnec:
+
+System: DEC/Alpha OSF1 v3.2, vendor cc
+Problem: can't link if libgc has been compiled with "cc -std1".
+ It works if the library has been compiled with either gcc or "cc"
+ alone. The problem is because the variable "end" is not defined if
+ compiling in std1 mode (see man ld).
+Proposed fix: none. Don't use cc -std1 !
diff --git a/boehm-gc/README.amiga b/boehm-gc/README.amiga
new file mode 100644
index 00000000000..865642be4b4
--- /dev/null
+++ b/boehm-gc/README.amiga
@@ -0,0 +1,133 @@
+
+===========================================================================
+ Michel Schinz's notes
+===========================================================================
+WHO DID WHAT
+
+The original Amiga port was made by Jesper Peterson. I (Michel Schinz)
+modified it slightly to reflect the changes made in the new official
+distributions, and to take advantage of the new SAS/C 6.x features. I also
+created a makefile to compile the "cord" package (see the cord
+subdirectory).
+
+TECHNICAL NOTES
+
+In addition to Jesper's notes, I have the following to say:
+
+- Starting with version 4.3, gctest checks to see if the code segment is
+ added to the root set or not, and complains if it is. Previous versions
+ of this Amiga port added the code segment to the root set, so I tried to
+ fix that. The only problem is that, as far as I know, it is impossible to
+ know which segments are code segments and which are data segments (there
+ are indeed solutions to this problem, like scanning the program on disk
+ or patch the LoadSeg functions, but they are rather complicated). The
+ solution I have chosen (see os_dep.c) is to test whether the program
+ counter is in the segment we are about to add to the root set, and if it
+ is, to skip the segment. The problems are that this solution is rather
+ awkward and that it works only for one code segment. This means that if
+ your program has more than one code segment, all of them but one will be
+ added to the root set. This isn't a big problem in fact, since the
+ collector will continue to work correctly, but it may be slower.
+
+ Anyway, the code which decides whether to skip a segment or not can be
+ removed simply by not defining AMIGA_SKIP_SEG. But notice that if you do
+ so, gctest will complain (it will say that "GC_is_visible produced wrong
+ failure indication"). However, it may be useful if you happen to have
+ pointers stored in a code segment (you really shouldn't).
+
+ If anyone has a good solution to the problem of finding, when a program
+ is loaded in memory, whether a segment is a code or a data segment,
+ please let me know.
+
+PROBLEMS
+
+If you have any problem with this version, please contact me at
+schinz@alphanet.ch (but do *not* send long files, since we pay for
+every mail!).
+
+===========================================================================
+ Jesper Peterson's notes
+===========================================================================
+
+ADDITIONAL NOTES FOR AMIGA PORT
+
+These notes assume some familiarity with Amiga internals.
+
+WHY I PORTED TO THE AMIGA
+
+The sole reason why I made this port was as a first step in getting
+the Sather(*) language on the Amiga. A port of this language will
+be done as soon as the Sather 1.0 sources are made available to me.
+Given this motivation, the garbage collection (GC) port is rather
+minimal.
+
+(*) For information on Sather read the comp.lang.sather newsgroup.
+
+LIMITATIONS
+
+This port assumes that the startup code linked with target programs
+is that supplied with SAS/C versions 6.0 or later. This allows
+assumptions to be made about where to find the stack base pointer
+and data segments when programs are run from WorkBench, as opposed
+to running from the CLI. The compiler dependent code is all in the
+GC_get_stack_base() and GC_register_data_segments() functions, but
+may spread as I add Amiga specific features.
+
+Given that SAS/C was assumed, the port is set up to be built with
+"smake" using the "SMakefile". Compiler options in "SCoptions" can
+be set with "scopts" program. Both "smake" and "scopts" are part of
+the SAS/C commercial development system.
+
+In keeping with the porting philosophy outlined above, this port
+will not behave well with Amiga specific code. Especially not inter-
+process comms via messages, and setting up public structures like
+Intuition objects or anything else in the system lists. For the
+time being the use of this library is limited to single threaded
+ANSI/POSIX compliant or near-complient code. (ie. Stick to stdio
+for now). Given this limitation there is currently no mechanism for
+allocating "CHIP" or "PUBLIC" memory under the garbage collector.
+I'll add this after giving it considerable thought. The major
+problem is the entire physical address space may have to me scanned,
+since there is no telling who we may have passed memory to.
+
+If you allocate your own stack in client code, you will have to
+assign the pointer plus stack size to GC_stackbottom.
+
+The initial stack size of the target program can be compiled in by
+setting the __stack symbol (see SAS documentaion). It can be over-
+ridden from the CLI by running the AmigaDOS "stack" program, or from
+the WorkBench by setting the stack size in the tool types window.
+
+SAS/C COMPILER OPTIONS (SCoptions)
+
+You may wish to check the "CPU" code option is appropriate for your
+intended target system.
+
+Under no circumstances set the "StackExtend" code option in either
+compiling the library or *ANY* client code.
+
+All benign compiler warnings have been suppressed. These mainly
+involve lack of prototypes in the code, and dead assignments
+detected by the optimizer.
+
+THE GOOD NEWS
+
+The library as it stands is compatible with the GigaMem commercial
+virtual memory software, and probably similar PD software.
+
+The performance of "gctest" on an Amiga 2630 (68030 @ 25Mhz)
+compares favourably with an HP9000 with similar architecture (a 325
+with a 68030 I think).
+
+-----------------------------------------------------------------------
+
+The Amiga port has been brought to you by:
+
+Jesper Peterson.
+
+jep@mtiame.mtia.oz.au (preferred, but 1 week turnaround)
+jep@orca1.vic.design.telecom.au (that's orca<one>, 1 day turnaround)
+
+At least one of these addresses should be around for a while, even
+though I don't work for either of the companies involved.
+
diff --git a/boehm-gc/README.debugging b/boehm-gc/README.debugging
new file mode 100644
index 00000000000..80635c22301
--- /dev/null
+++ b/boehm-gc/README.debugging
@@ -0,0 +1,58 @@
+Debugging suggestions:
+
+****If you get a segmentation fault or bus error while debugging with a debugger:
+If the fault occurred in GC_find_limit, or with incremental collection enabled, this is probably normal. The collector installs handlers to take care of these. You will not see these unless you are using a debugger. Your debugger should allow you to continue. It's preferable to tell the debugger to ignore SIGBUS and SIGSEGV ("handle" in gdb, "ignore" in most versions of dbx) and set a breakpoint in abort. The collector will call abort if the signal had another cause, and there was not other handler previously installed. I recommend debugging without incremental collection if possible. (This applies directly to UNIX systems. Debugging with incremental collection under win32 is worse. See README.win32.)
+
+****If you get warning messages informing you that the collector needed to allocate blacklisted blocks:
+
+0) Ignore these warnings while you are using GC_DEBUG. Some of the routines mentioned below don't have debugging equivalents. (Alternatively, write the missing routines and send them to me.)
+
+1) Replace allocator calls that request large blocks with calls to GC_malloc_ignore_off_page or GC_malloc_atomic_ignore_off_page. You may want to set a breakpoint in GC_default_warn_proc to help you identify such calls. Make sure that a pointer to somewhere near the beginning of the resulting block is maintained in a (preferably volatile) variable as long as the block is needed.
+
+2) If the large blocks are allocated with realloc, I suggest instead allocating them with something like the following. Note that the realloc size increment should be fairly large (e.g. a factor of 3/2) for this to exhibit reasonable performance. But we all know we should do that anyway.
+
+void * big_realloc(void *p, size_t new_size)
+{
+ size_t old_size = GC_size(p);
+ void * result;
+
+ if (new_size <= 10000) return(GC_realloc(p, new_size));
+ if (new_size <= old_size) return(p);
+ result = GC_malloc_ignore_off_page(new_size);
+ if (result == 0) return(0);
+ memcpy(result,p,old_size);
+ GC_free(p);
+ return(result);
+}
+
+3) In the unlikely case that even relatively small object (<20KB) allocations are triggering these warnings, then your address space contains lots of "bogus pointers", i.e. values that appear to be pointers but aren't. Usually this can be solved by using GC_malloc_atomic or the routines in gc_typed.h to allocate large pointerfree regions of bitmaps, etc. Sometimes the problem can be solved with trivial changes of encoding in certain values. It is possible, though not pleasant, to identify the source of the bogus pointers by setting a breakpoint in GC_add_to_black_list_stack, and looking at the value of current_p in the GC_mark_from_mark_stack frame. Current_p contains the address of the bogus pointer.
+
+4) If you get only a fixed number of these warnings, you are probably only introducing a bounded leak by ignoring them. If the data structures being allocated are intended to be permanent, then it is also safe to ignore them. The warnings can be turned off by calling GC_set_warn_proc with a procedure that ignores these warnings (e.g. by doing absolutely nothing).
+
+
+****If the collector dies in GC_malloc while trying to remove a free list element:
+
+1) With > 99% probability, you wrote past the end of an allocated object. Try setting GC_DEBUG and using the debugging facilities in gc.h.
+
+
+****If the heap grows too much:
+
+1) Consider using GC_malloc_atomic for objects containing nonpointers. This is especially important for large arrays containg compressed data, pseudo-random numbers, and the like. (This isn't all that likely to solve your problem, but it's a useful and easy optimization anyway, and this is a good time to try it.) If you allocate large objects containg only one or two pointers at the beginning, either try the typed allocation primitives is gc.h, or separate out the pointerfree component.
+2) If you are using the collector in its default mode, with interior pointer recognition enabled, consider using GC_malloc_ignore_off_page to allocate large objects. (See gc.h and above for details. Large means > 100K in most environments.)
+3) GC_print_block_list() will print a list of all currently allocated heap blocks and what size objects they contain. GC_print_hblkfreelist() will print a list of free heap blocks, and whether they are blacklisted. GC_dump calls both of these, and also prints information about heap sections, and root segments.
+4) Write a tool that traces back references to the appropriate root. Send me the code. (I have code that does this for old PCR.)
+
+
+****If the collector appears to be losing objects:
+
+1) Replace all calls to GC_malloc_atomic and typed allocation by GC_malloc calls. If this fixes the problem, gradually reinsert your optimizations.
+2) You may also want to try the safe(r) pointer manipulation primitives in gc.h. But those are hard to use until the preprocessor becomes available.
+3) Try using the GC_DEBUG facilities. This is less likely to be successful here than if the collector crashes.
+[The rest of these are primarily for wizards. You shouldn't need them unless you're doing something really strange, or debugging a collector port.]
+4) Don't turn on incremental collection. If that fixes the problem, suspect a bug in the dirty bit implementation. Try compiling with -DCHECKSUMS to check for modified, but supposedly clean, pages.
+5) On a SPARC, in a single-threaded environment, GC_print_callers(GC_arrays._last_stack) prints a cryptic stack trace as of the time of the last collection. (You will need a debugger to decipher the result.) The question to ask then is "why should this object have been accessible at the time of the last collection? Where was a pointer to it stored?". This facility should be easy to add for some other collector ports (namely if it's easy to traverse stack frames), but will be hard for others.
+6) "print *GC_find_header(p)" in dbx or gdb will print the garbage collector block header information associated with the object p (e.g. object size, etc.)
+7) GC_is_marked(p) determines whether p is the base address of a marked object. Note that objects allocated since the last collection should not be marked, and that unmarked objects are reclaimed incrementally. It's usually most interesting to set a breakpoint in GC_finish_collection and then to determine how much of the damaged data structure is marked at that point.
+8) Look at the tracing facility in mark.c. (Ignore this suggestion unless you are very familiar with collector internals.)
+
+
diff --git a/boehm-gc/README.dj b/boehm-gc/README.dj
new file mode 100644
index 00000000000..613bc423cb1
--- /dev/null
+++ b/boehm-gc/README.dj
@@ -0,0 +1,12 @@
+[Original version supplied by Xiaokun Zhu <xiaokun@aero.gla.ac.uk>]
+[This version came mostly from Gary Leavens. ]
+
+Look first at Makefile.dj, and possibly change the definitions of
+RM and MV if you don't have rm and mv installed.
+Then use Makefile.dj to compile the garbage collector.
+For example, you can do:
+
+ make -f Makefile.dj test
+
+All the tests should work fine.
+
diff --git a/boehm-gc/README.hp b/boehm-gc/README.hp
new file mode 100644
index 00000000000..869aaea67c1
--- /dev/null
+++ b/boehm-gc/README.hp
@@ -0,0 +1,9 @@
+Dynamic loading support requires that executables be linked with -ldld.
+The alternative is to build the collector without defining DYNAMIC_LOADING
+in config.h and ensuring that all garbage collectable objects are
+accessible without considering statically allocated variables in dynamic
+libraries.
+
+The collector should compile with either plain cc or cc -Ae. CC -Aa
+fails to define _HPUX_SOURCE and thus will not configure the collector
+correctly.
diff --git a/boehm-gc/README.linux b/boehm-gc/README.linux
new file mode 100644
index 00000000000..ffe735bc182
--- /dev/null
+++ b/boehm-gc/README.linux
@@ -0,0 +1,39 @@
+See README.alpha for Linux on DEC AXP info. This file applies to
+Linux/Intel.
+
+Incremental GC is supported.
+
+Dynamic libraries are supported on an ELF system. A static executable
+should be linked with the gcc option "-Wl,-defsym,_DYNAMIC=0".
+
+The collector appears to work with Linux threads. We have seen
+intermittent hangs in sem_wait. So far we have been unable to reproduce
+these unless the process was being debugged or traced. Thus it's
+possible that the only real issue is that the debugger loses
+signals on rare occasions.
+
+The garbage collector uses SIGPWR and SIGXCPU if it is used with
+Linux threads. These should not be touched by the client program.
+
+To use threads, you need to abide by the following requirements:
+
+1) You need to use LinuxThreads (which are included in libc6).
+
+ The collector relies on some implementation details of the LinuxThreads
+ package. It is unlikely that this code will work on other
+ pthread implementations (in particular it will *not* work with
+ MIT pthreads).
+
+2) You must compile the collector with -DLINUX_THREADS and -D_REENTRANT
+ specified in the Makefile.
+
+3) Every file that makes thread calls should define LINUX_THREADS and
+ _REENTRANT and then include gc.h. Gc.h redefines some of the
+ pthread primitives as macros which also provide the collector with
+ information it requires.
+
+4) Currently dlopen() is probably not safe. The collector must traverse
+ the list of libraries maintained by the runtime loader. That can
+ probably be an inconsistent state when a thread calling the loader is
+ is stopped for GC. (It's possible that this is fixable in the
+ same way it is handled for SOLARIS_THREADS, with GC_dlopen.)
diff --git a/boehm-gc/README.rs6000 b/boehm-gc/README.rs6000
new file mode 100644
index 00000000000..0444ac4cce0
--- /dev/null
+++ b/boehm-gc/README.rs6000
@@ -0,0 +1,6 @@
+We have so far failed to find a good way to determine the stack base.
+It is highly recommended that GC_stackbottom be set explicitly on program
+startup. The supplied value sometimes causes failure under AIX 4.1, though
+it appears to work under 3.X. HEURISTIC2 seems to work under 4.1, but
+involves a substantial performance penalty, and will fail if there is
+no limit on stack size.
diff --git a/boehm-gc/README.sgi b/boehm-gc/README.sgi
new file mode 100644
index 00000000000..186e4977106
--- /dev/null
+++ b/boehm-gc/README.sgi
@@ -0,0 +1,37 @@
+Performance of the incremental collector can be greatly enhanced with
+-DNO_EXECUTE_PERMISSION.
+
+The collector should run with all of the -32, -n32 and -64 ABIs. Remember to
+define the AS macro in the Makefile to be "as -64", or "as -n32".
+
+If you use -DREDIRECT_MALLOC=GC_malloc with C++ code, your code should make
+at least one explicit call to malloc instead of new to ensure that the proper
+version of malloc is linked in.
+
+Sproc threads are not supported in this version, though there may exist other
+ports.
+
+Pthreads support is provided. This requires that:
+
+1) You compile the collector with -DIRIX_THREADS specified in the Makefile.
+
+2) You have the latest pthreads patches installed.
+
+(Though the collector makes only documented pthread calls,
+it relies on signal/threads interactions working just right in ways
+that are not required by the standard. It is unlikely that this code
+will run on other pthreads platforms. But please tell me if it does.)
+
+3) Every file that makes thread calls should define IRIX_THREADS and then
+include gc.h. Gc.h redefines some of the pthread primitives as macros which
+also provide the collector with information it requires.
+
+4) pthread_cond_wait and pthread_cond_timed_wait should be prepared for
+premature wakeups. (I believe the pthreads and realted standards require this
+anyway. Irix pthreads often terminate a wait if a signal arrives.
+The garbage collector uses signals to stop threads.)
+
+5) It is expensive to stop a thread waiting in IO at the time the request is
+initiated. Applications with many such threads may not exhibit acceptable
+performance with the collector. (Increasing the heap size may help.)
+
diff --git a/boehm-gc/README.solaris2 b/boehm-gc/README.solaris2
new file mode 100644
index 00000000000..9ef4648d04a
--- /dev/null
+++ b/boehm-gc/README.solaris2
@@ -0,0 +1,65 @@
+The collector supports both incremental collection and threads under
+Solaris 2. The incremental collector normally retrieves page dirty information
+through the appropriate /proc calls. But it can also be configured
+(by defining MPROTECT_VDB instead of PROC_VDB in config.h) to use mprotect
+and signals. This may result in shorter pause times, but it is no longer
+safe to issue arbitrary system calls that write to the heap.
+
+Under other UNIX versions,
+the collector normally obtains memory through sbrk. There is some reason
+to expect that this is not safe if the client program also calls the system
+malloc, or especially realloc. The sbrk man page strongly suggests this is
+not safe: "Many library routines use malloc() internally, so use brk()
+and sbrk() only when you know that malloc() definitely will not be used by
+any library routine." This doesn't make a lot of sense to me, since there
+seems to be no documentation as to which routines can transitively call malloc.
+Nonetheless, under Solaris2, the collector now (since 4.12) allocates
+memory using mmap by default. (It defines USE_MMAP in config.h.)
+You may want to reverse this decisions if you use -DREDIRECT_MALLOC=...
+
+
+SOLARIS THREADS:
+
+The collector must be compiled with -DSOLARIS_THREADS to be thread safe.
+It is also essential that gc.h be included in files that call thr_create,
+thr_join, thr_suspend, thr_continue, or dlopen. Gc.h macro defines
+these to also do GC bookkeeping, etc. Gc.h must be included with
+SOLARIS_THREADS defined, otherwise these replacements are not visible.
+A collector built in this way way only be used by programs that are
+linked with the threads library.
+
+If you are using the Pthreads interface, also define _SOLARIS_PTHREADS.
+
+In this mode, the collector contains various workarounds for older Solaris
+bugs. Mostly, these should not be noticeable unless you look at system
+call traces. However, it cannot protect a guard page at the end of
+a thread stack. If you know that you will only be running Solaris2.5
+or later, it should be possible to fix this by compiling the collector
+with -DSOLARIS23_MPROTECT_BUG_FIXED.
+
+Jeremy Fitzhardinge points out that there is a problem with the dlopen
+replacement, in that startup code in the library is run while the allocation
+lock is held. This appears to be difficult to fix, since the collector does
+look at data structures maintained by dlopen, and hence some locking is needed
+around the dlopen call. Defining USE_PROC_FOR_LIBRARIES will get address
+space layout information from /proc avoiding the dlopen lock. But this has
+other disadvanatages, e.g. mmapped files may be scanned.
+
+If solaris_threads are used on an X86 processor with malloc redirected to
+GC_malloc, it is necessary to call GC_thr_init explicitly before forking the
+first thread. (This avoids a deadlock arising from calling GC_thr_init
+with the allocation lock held.)
+
+It appears that there is a problem in using gc_cpp.h in conjunction with
+Solaris threads and Sun's C++ runtime. Apparently the overloaded new operator
+is invoked by some iostream initialization code before threads are correctly
+initialized. As a result, call to thr_self() in garbage collector
+initialization segfaults. Currently the only known workaround is to not
+invoke the garbage collector from a user defined global operator new, or to
+have it invoke the garbage-collector's allocators only after main has started.
+(Note that the latter requires a moderately expensive test in operator
+delete.)
+
+Hans-J. Boehm
+(The above contains my personal opinions, which are probably not shared
+by anyone else.)
diff --git a/boehm-gc/README.uts b/boehm-gc/README.uts
new file mode 100644
index 00000000000..6be49667d7b
--- /dev/null
+++ b/boehm-gc/README.uts
@@ -0,0 +1,2 @@
+Alistair Crooks supplied the port. He used Lexa C version 2.1.3 with
+-Xa to compile.
diff --git a/boehm-gc/README.win32 b/boehm-gc/README.win32
new file mode 100644
index 00000000000..76c4c6e3816
--- /dev/null
+++ b/boehm-gc/README.win32
@@ -0,0 +1,163 @@
+The collector has only been compiled under Windows NT, with the
+original Microsoft SDK, with Visual C++ 2.0 and later, with
+the GNU win32 environment, with Borland 4.5, and recently with
+Watcom C.
+
+It runs under both win32s and win32, but with different semantics.
+Under win32, all writable pages outside of the heaps and stack are
+scanned for roots. Thus the collector sees pointers in DLL data
+segments. Under win32s, only the main data segment is scanned.
+(The main data segment should always be scanned. Under some
+versions of win32s, other regions may also be scanned.)
+Thus all accessible objects should be accessible from local variables
+or variables in the main data segment. Alternatively, other data
+segments (e.g. in DLLs) may be registered with the collector by
+calling GC_init() and then GC_register_root_section(a), where
+a is the address of some variable inside the data segment. (Duplicate
+registrations are ignored, but not terribly quickly.)
+
+(There are two reasons for this. We didn't want to see many 16:16
+pointers. And the VirtualQuery call has different semantics under
+the two systems, and under different versions of win32s.)
+
+The collector test program "gctest" is linked as a GUI application,
+but does not open any windows. Its output appears in the file
+"gc.log". It may be started from the file manager. The hour glass
+cursor will appear as long as it's running.
+
+The cord test program has not been ported (but should port
+easily). A toy editor (cord/de.exe) based on cords (heavyweight
+strings represented as trees) has been ported and is included.
+It runs fine under either win32 or win32S. It serves as an example
+of a true Windows application, except that it was written by a
+nonexpert Windows programmer. (There are some peculiarities
+in the way files are displayed. The <cr> is displayed explicitly
+for standard DOS text files. As in the UNIX version, control
+characters are displayed explicitly, but in this case as red text.
+This may be suboptimal for some tastes and/or sets of default
+window colors.)
+
+For Microsoft development tools, rename NT_MAKEFILE as
+MAKEFILE. (Make sure that the CPU environment variable is defined
+to be i386.)
+
+For GNU-win32, use the regular makefile, possibly after uncommenting
+the line "include Makefile.DLLs". The latter should be necessary only
+if you want to package the collector as a DLL. The GNU-win32 port is
+believed to work only for b18, not b19, probably dues to linker changes
+in b19. This is probably fixable with a different definition of
+DATASTART and DATAEND in config.h.
+
+For Borland tools, use BCC_MAKEFILE. Note that
+Borland's compiler defaults to 1 byte alignment in structures (-a1),
+whereas Visual C++ appears to default to 8 byte alignment (/Zp8).
+The garbage collector in its default configuration EXPECTS AT
+LEAST 4 BYTE ALIGNMENT. Thus the BORLAND DEFAULT MUST
+BE OVERRIDDEN. (In my opinion, it should usually be anyway.
+I expect that -a1 introduces major performance penalties on a
+486 or Pentium.) Note that this changes structure layouts. (As a last
+resort, config.h can be changed to allow 1 byte alignment. But
+this has significant negative performance implications.)
+The Makefile is set up to assume Borland 4.5. If you have another
+version, change the line near the top. By default, it does not
+require the assembler. If you do have the assembler, I recommend
+removing the -DUSE_GENERIC.
+
+Incremental collection support was recently added. This is
+currently pretty simpleminded. Pages are protected. Protection
+faults are caught by a handler installed at the bottom of the handler
+stack. This is both slow and interacts poorly with a debugger.
+Whenever possible, I recommend adding a call to
+GC_enable_incremental at the last possible moment, after most
+debugging is complete. Unlike the UNIX versions, no system
+calls are wrapped by the collector itself. It may be necessary
+to wrap ReadFile calls that use a buffer in the heap, so that the
+call does not encounter a protection fault while it's running.
+(As usual, none of this is an issue unless GC_enable_incremental
+is called.)
+
+Note that incremental collection is disabled with -DSMALL_CONFIG,
+which is the default for win32. If you need incremental collection,
+undefine SMALL_CONFIG.
+
+Incremental collection is not supported under win32s, and it may not
+be possible to do so. However, win32 applications that attempt to use
+incremental collection should continue to run, since the
+collector detects if it's running under win32s and turns calls to
+GC_enable_incremental() into noops.
+
+James Clark has contributed the necessary code to support win32 threads.
+This code is known to exhibit some problems with incremental collection
+enabled. Use NT_THREADS_MAKEFILE (a.k.a gc.mak) instead of NT_MAKEFILE
+to build this version. Note that this requires some files whose names
+are more than 8 + 3 characters long. Thus you should unpack the tar file
+so that long file names are preserved. To build the garbage collector
+test with VC++ from the command line, use
+
+nmake /F ".\gc.mak" CFG="gctest - Win32 Release"
+
+This requires that the subdirectory gctest\Release exist.
+
+This version relies on the collector residing in a dll.
+
+This version currently supports incremental collection only if it is
+enabled before any additional threads are created.
+It is known to not be completely solid. At a minimum it can deadlock
+if a thread starts in the middle of an allocation. There may be
+other problems. If you need solid support for win32 threads, you
+check with Geodesic Systems. I haven't tried it, but they claim
+to support it.
+
+Hans
+
+Ivan V. Demakov's README for the Watcom port:
+
+[ He points out in a later message that there may be a problem compiling
+ under Windows-3.11 for Windows NT. ]
+
+Watcom C/C++ 10.5, 10.6, 11.0 tested.
+
+The collector runs on WIN32 and DOS4GW dos-extender with both
+stack and register based calling conventions (options -5r and -5s).
+Incremental collection not supported.
+
+OS/2 not tested, but should work (only some #ifdef's added for OS/2 port).
+
+cord not ported. Watcom C fails to compile it, from first attempt.
+Since I don't use it, I don't try to fix it.
+
+cpp_test succeeds, but not compiled automaticaly with WCC_MAKEFILE.
+
+
+My changes:
+
+ * config.h Added definitions for Watcom C/C++.
+ Undefined MPROTECT_VDB for Watcom C/C++ MSWIN32,
+ I don't have idea why it not work.
+
+ * gc.h Explicitly declared GC_noop. This prevents
+ program crash, compiled with -5r option.
+
+ * gc_priv.h Changed declaration for GC_push_one to make
+ compiler happy.
+ Added GC_dos4gw_get_mem declaration and
+ GET_MEM uses it in DOS4GW environment.
+
+ * os_dep.c Added __WATCOMC__ and DOS4GW #ifdef's.
+ Added GC_dos4gw_get_mem.
+
+ * mach_dep.c For Watcom used setjmp method of marking registers.
+
+ * WCC_MAKEFILE New file. Makefile for Watcom C/C++.
+
+ * gc_watcom.asm New file. Some functions for DOS4GW.
+ This functions may (probably) be done in C,
+ but I can't figure out how do this for all
+ possible options of compiler.
+
+ * README.watcom This file.
+
+
+ Ivan Demakov (email: dem@tgrad.nsk.su)
+
+
diff --git a/boehm-gc/SCoptions.amiga b/boehm-gc/SCoptions.amiga
new file mode 100644
index 00000000000..a61e0cb1f04
--- /dev/null
+++ b/boehm-gc/SCoptions.amiga
@@ -0,0 +1,16 @@
+CPU=68030
+NOSTACKCHECK
+OPTIMIZE
+VERBOSE
+MAPHUNK
+NOVERSION
+NOICONS
+OPTIMIZERTIME
+DEFINE SILENT
+DEFINE AMIGA_SKIP_SEG
+IGNORE=85
+IGNORE=154
+IGNORE=161
+IGNORE=100
+OPTIMIZERCOMPLEXITY=4
+OPTIMIZERDEPTH=3
diff --git a/boehm-gc/SMakefile.amiga b/boehm-gc/SMakefile.amiga
new file mode 100644
index 00000000000..b1aa340e538
--- /dev/null
+++ b/boehm-gc/SMakefile.amiga
@@ -0,0 +1,48 @@
+OBJS= alloc.o reclaim.o allchblk.o misc.o mach_dep.o os_dep.o mark_rts.o headers.o mark.o obj_map.o blacklst.o finalize.o new_hblk.o real_malloc.o dyn_load.o dbg_mlc.o malloc.o stubborn.o checksums.o typd_mlc.o ptr_chck.o
+
+INC= gc_private.h gc_hdrs.h gc.h config.h
+
+all: gctest setjmp_t
+
+alloc.o : alloc.c $(INC)
+reclaim.o : reclaim.c $(INC)
+allchblk.o : allchblk.c $(INC)
+misc.o : misc.c $(INC)
+os_dep.o : os_dep.c $(INC)
+mark_rts.o : mark_rts.c $(INC)
+headers.o : headers.c $(INC)
+mark.o : mark.c $(INC)
+obj_map.o : obj_map.c $(INC)
+blacklst.o : blacklst.c $(INC)
+finalize.o : finalize.c $(INC)
+ sc noopt finalize.c # There seems to be a bug in the optimizer (V6.51).
+ # gctest won't work if you remove this...
+new_hblk.o : new_hblk.c $(INC)
+real_malloc.o : real_malloc.c $(INC)
+dyn_load.o : dyn_load.c $(INC)
+dbg_mlc.o : dbg_mlc.c $(INC)
+malloc.o : malloc.c $(INC)
+mallocx.o : malloc.c $(INC)
+stubborn.o : stubborn.c $(INC)
+checksums.o : checksums.c $(INC)
+typd_mlc.o: typd_mlc.c $(INC)
+mach_dep.o : mach_dep.c $(INC)
+ptr_chck.o: ptr_chck.c $(INC)
+test.o : test.c $(INC)
+
+gc.lib: $(OBJS)
+ oml gc.lib r $(OBJS)
+
+clean:
+ delete gc.lib gctest setjmp_t \#?.o
+
+gctest: gc.lib test.o
+ slink LIB:c.o test.o to $@ lib gc.lib LIB:sc.lib LIB:scm.lib
+
+setjmp_t: setjmp_t.c gc.h
+ sc setjmp_t.c
+ slink LIB:c.o $@.o to $@ lib LIB:sc.lib
+
+test: setjmp_t gctest
+ setjmp_t
+ gctest
diff --git a/boehm-gc/WCC_MAKEFILE b/boehm-gc/WCC_MAKEFILE
new file mode 100644
index 00000000000..cc0ef136742
--- /dev/null
+++ b/boehm-gc/WCC_MAKEFILE
@@ -0,0 +1,123 @@
+# Makefile for Watcom C/C++ 10.5, 10.6, 11.0 on NT, OS2 and DOS4GW .
+# May work with Watcom 10.0 .
+#
+
+#
+# Uncoment one of line for cross compiling
+#SYSTEM=DOS4GW
+#SYSTEM=MSWIN32
+#SYSTEM=OS2
+
+!ifndef SYSTEM
+
+!ifdef __MSDOS__
+SYSTEM=DOS4GW
+!endif
+
+!ifdef __NT__
+SYSTEM=MSWIN32
+!endif
+
+!ifdef __OS2__
+SYSTEM=OS2
+!endif
+
+D_SYSTEM=
+
+!else
+
+D_SYSTEM=-D$(SYSTEM)
+
+!endif
+
+!define $(SYSTEM)
+
+
+CC=wcc386
+CXX=wpp386
+AS=wasm
+
+
+# Watcom before 11.0 not support option -oh
+# Remove it if you get error
+OPTIM=-oneatxh -s
+
+CALLING=-5s
+
+DEFS=-DALL_INTERIOR_POINTERS -DSILENT #-DSMALL_CONFIG #-DGC_DEBUG
+
+# ! -DUSE_GENERIC required !
+CFLAGS=$(OPTIM) -zp4 $(CALLING) -zc -DUSE_GENERIC $(D_SYSTEM) $(DEFS)
+CXXFLAGS= $(CFLAGS)
+ASFLAGS=$(CALLING)
+
+OBJS= alloc.obj reclaim.obj allchblk.obj misc.obj &
+ mach_dep.obj os_dep.obj mark_rts.obj headers.obj mark.obj &
+ obj_map.obj blacklst.obj finalize.obj new_hblk.obj &
+ dbg_mlc.obj malloc.obj stubborn.obj dyn_load.obj &
+ typd_mlc.obj ptr_chck.obj gc_cpp.obj mallocx.obj
+
+
+all: gc.lib gctest.exe
+
+# this file required for DOS4GW only
+gc_watcom.obj: gc_watcom.asm WCC_MAKEFILE
+ $(AS) $(ASFLAGS) gc_watcom.asm
+
+!ifdef DOS4GW
+gc.lib: $(OBJS) gc_watcom.obj
+ @%create $*.lb1
+ @for %i in ($(OBJS)) do @%append $*.lb1 +'%i'
+ @@%append $*.lb1 +'gc_watcom.obj'
+ *wlib -b -c -n -p=512 $@ @$*.lb1
+!else
+gc.lib: $(OBJS)
+ @%create $*.lb1
+ @for %i in ($(OBJS)) do @%append $*.lb1 +'%i'
+ *wlib -b -c -n -p=512 $@ @$*.lb1
+!endif
+
+
+test.obj: test.c
+ $(CC) $(CFLAGS) $*.c
+
+gctest.exe: test.obj gc.lib
+ %create $*.lnk
+!ifdef DOS4GW
+ @%append $*.lnk sys dos4g
+!endif
+!ifdef MSWIN32
+ @%append $*.lnk sys nt
+!endif
+!ifdef OS2
+ @%append $*.lnk sys os2v2
+!endif
+ @%append $*.lnk op case
+ @%append $*.lnk op stack=256K
+ @%append $*.lnk name $*
+ @%append $*.lnk file test.obj
+ @%append $*.lnk library gc.lib
+ *wlink @$*.lnk
+
+
+
+.c.obj: .AUTODEPEND
+ $(CC) $(CFLAGS) $*.c
+
+.cc.obj: .AUTODEPEND
+ $(CXX) $(CXXFLAGS) $*.cc
+
+.cpp.obj: .AUTODEPEND
+ $(CXX) $(CXXFLAGS) $*.cpp
+
+clean : .SYMBOLIC
+ @if exist *.obj del *.obj
+ @if exist *.map del *.map
+ @if exist *.lnk del *.lnk
+ @if exist *.lb1 del *.lb1
+ @if exist *.sym del *.sym
+ @if exist *.err del *.err
+ @if exist *.tmp del *.tmp
+ @if exist *.lst del *.lst
+ @if exist *.exe del *.exe
+ @if exist *.log del *.log
diff --git a/boehm-gc/acinclude.m4 b/boehm-gc/acinclude.m4
new file mode 100644
index 00000000000..55e649b3a24
--- /dev/null
+++ b/boehm-gc/acinclude.m4
@@ -0,0 +1,153 @@
+# FIXME: We temporarily define our own version of AC_PROG_CC. This is
+# copied from autoconf 2.12, but does not call AC_PROG_CC_WORKS. We
+# are probably using a cross compiler, which will not be able to fully
+# link an executable. This should really be fixed in autoconf
+# itself.
+
+AC_DEFUN(BOEHM_CONFIGURE,
+[
+dnl Default to --enable-multilib
+AC_ARG_ENABLE(multilib,
+[ --enable-multilib build many library versions (default)],
+[case "${enableval}" in
+ yes) multilib=yes ;;
+ no) multilib=no ;;
+ *) AC_MSG_ERROR(bad value ${enableval} for multilib option) ;;
+ esac], [multilib=yes])dnl
+
+dnl We may get other options which we don't document:
+dnl --with-target-subdir, --with-multisrctop, --with-multisubdir
+
+if test "[$]{srcdir}" = "."; then
+ if test "[$]{with_target_subdir}" != "."; then
+ boehm_gc_basedir="[$]{srcdir}/[$]{with_multisrctop}../$1"
+ else
+ boehm_gc_basedir="[$]{srcdir}/[$]{with_multisrctop}$1"
+ fi
+else
+ boehm_gc_basedir="[$]{srcdir}/$1"
+fi
+AC_SUBST(boehm_gc_basedir)
+
+AC_CANONICAL_HOST
+
+AM_INIT_AUTOMAKE(boehm-gc, 4.13a2, no-define)
+
+# FIXME: We temporarily define our own version of AC_PROG_CC. This is
+# copied from autoconf 2.12, but does not call AC_PROG_CC_WORKS. We
+# are probably using a cross compiler, which will not be able to fully
+# link an executable. This should really be fixed in autoconf
+# itself.
+
+AC_DEFUN(LIB_AC_PROG_CC,
+[AC_BEFORE([$0], [AC_PROG_CPP])dnl
+AC_CHECK_PROG(CC, gcc, gcc)
+if test -z "$CC"; then
+ AC_CHECK_PROG(CC, cc, cc, , , /usr/ucb/cc)
+ test -z "$CC" && AC_MSG_ERROR([no acceptable cc found in \$PATH])
+fi
+
+AC_PROG_CC_GNU
+
+if test $ac_cv_prog_gcc = yes; then
+ GCC=yes
+dnl Check whether -g works, even if CFLAGS is set, in case the package
+dnl plays around with CFLAGS (such as to build both debugging and
+dnl normal versions of a library), tasteless as that idea is.
+ ac_test_CFLAGS="${CFLAGS+set}"
+ ac_save_CFLAGS="$CFLAGS"
+ CFLAGS=
+ AC_PROG_CC_G
+ if test "$ac_test_CFLAGS" = set; then
+ CFLAGS="$ac_save_CFLAGS"
+ elif test $ac_cv_prog_cc_g = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-O2"
+ fi
+else
+ GCC=
+ test "${CFLAGS+set}" = set || CFLAGS="-g"
+fi
+])
+
+LIB_AC_PROG_CC
+
+# Likewise for AC_PROG_CXX.
+AC_DEFUN(LIB_AC_PROG_CXX,
+[AC_BEFORE([$0], [AC_PROG_CXXCPP])dnl
+AC_CHECK_PROGS(CXX, $CCC c++ g++ gcc CC cxx cc++, gcc)
+test -z "$CXX" && AC_MSG_ERROR([no acceptable c++ found in \$PATH])
+
+AC_PROG_CXX_GNU
+
+if test $ac_cv_prog_gxx = yes; then
+ GXX=yes
+dnl Check whether -g works, even if CXXFLAGS is set, in case the package
+dnl plays around with CXXFLAGS (such as to build both debugging and
+dnl normal versions of a library), tasteless as that idea is.
+ ac_test_CXXFLAGS="${CXXFLAGS+set}"
+ ac_save_CXXFLAGS="$CXXFLAGS"
+ CXXFLAGS=
+ AC_PROG_CXX_G
+ if test "$ac_test_CXXFLAGS" = set; then
+ CXXFLAGS="$ac_save_CXXFLAGS"
+ elif test $ac_cv_prog_cxx_g = yes; then
+ CXXFLAGS="-g -O2"
+ else
+ CXXFLAGS="-O2"
+ fi
+else
+ GXX=
+ test "${CXXFLAGS+set}" = set || CXXFLAGS="-g"
+fi
+])
+
+LIB_AC_PROG_CXX
+
+# AC_CHECK_TOOL does AC_REQUIRE (AC_CANONICAL_BUILD). If we don't
+# run it explicitly here, it will be run implicitly before
+# NEWLIB_CONFIGURE, which doesn't work because that means that it will
+# be run before AC_CANONICAL_HOST.
+AC_CANONICAL_BUILD
+
+AC_CHECK_TOOL(AS, as)
+AC_CHECK_TOOL(AR, ar)
+AC_CHECK_TOOL(RANLIB, ranlib, :)
+
+AC_PROG_INSTALL
+
+AM_MAINTAINER_MODE
+
+# We need AC_EXEEXT to keep automake happy in cygnus mode. However,
+# at least currently, we never actually build a program, so we never
+# need to use $(EXEEXT). Moreover, the test for EXEEXT normally
+# fails, because we are probably configuring with a cross compiler
+# which can't create executables. So we include AC_EXEEXT to keep
+# automake happy, but we don't execute it, since we don't care about
+# the result.
+if false; then
+ AC_EXEEXT
+fi
+
+. [$]{boehm_gc_basedir}/configure.host
+
+case [$]{boehm_gc_basedir} in
+/* | [A-Za-z]:[/\\]*) boehm_gc_flagbasedir=[$]{boehm_gc_basedir} ;;
+*) boehm_gc_flagbasedir='[$](top_builddir)/'[$]{boehm_gc_basedir} ;;
+esac
+
+boehm_gc_cflags="[$]{boehm_gc_cflags} -I"'[$](top_builddir)'"/$1/targ-include -I[$]{boehm_gc_flagbasedir}/libc/include"
+case "${host}" in
+ *-*-cygwin32*)
+ boehm_gc_cflags="[$]{boehm_gc_cflags} -I[$]{boehm_gc_flagbasedir}/../winsup/include"
+ ;;
+esac
+
+boehm_gc_cflags="[$]{boehm_gc_cflags} -fno-builtin"
+
+BOEHM_GC_CFLAGS=${boehm_gc_cflags}
+AC_SUBST(BOEHM_GC_CFLAGS)
+]))
+
+))))
diff --git a/boehm-gc/aclocal.m4 b/boehm-gc/aclocal.m4
new file mode 100644
index 00000000000..000a3260183
--- /dev/null
+++ b/boehm-gc/aclocal.m4
@@ -0,0 +1,895 @@
+dnl aclocal.m4 generated automatically by aclocal 1.4
+
+dnl Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl This program is distributed in the hope that it will be useful,
+dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+dnl PARTICULAR PURPOSE.
+
+# FIXME: We temporarily define our own version of AC_PROG_CC. This is
+# copied from autoconf 2.12, but does not call AC_PROG_CC_WORKS. We
+# are probably using a cross compiler, which will not be able to fully
+# link an executable. This should really be fixed in autoconf
+# itself.
+
+AC_DEFUN(BOEHM_CONFIGURE,
+[
+dnl Default to --enable-multilib
+AC_ARG_ENABLE(multilib,
+[ --enable-multilib build many library versions (default)],
+[case "${enableval}" in
+ yes) multilib=yes ;;
+ no) multilib=no ;;
+ *) AC_MSG_ERROR(bad value ${enableval} for multilib option) ;;
+ esac], [multilib=yes])dnl
+
+dnl We may get other options which we don't document:
+dnl --with-target-subdir, --with-multisrctop, --with-multisubdir
+
+if test "[$]{srcdir}" = "."; then
+ if test "[$]{with_target_subdir}" != "."; then
+ boehm_gc_basedir="[$]{srcdir}/[$]{with_multisrctop}../$1"
+ else
+ boehm_gc_basedir="[$]{srcdir}/[$]{with_multisrctop}$1"
+ fi
+else
+ boehm_gc_basedir="[$]{srcdir}/$1"
+fi
+AC_SUBST(boehm_gc_basedir)
+
+AC_CANONICAL_HOST
+
+AM_INIT_AUTOMAKE(boehm-gc, 4.13a2, no-define)
+
+# FIXME: We temporarily define our own version of AC_PROG_CC. This is
+# copied from autoconf 2.12, but does not call AC_PROG_CC_WORKS. We
+# are probably using a cross compiler, which will not be able to fully
+# link an executable. This should really be fixed in autoconf
+# itself.
+
+AC_DEFUN(LIB_AC_PROG_CC,
+[AC_BEFORE([$0], [AC_PROG_CPP])dnl
+AC_CHECK_PROG(CC, gcc, gcc)
+if test -z "$CC"; then
+ AC_CHECK_PROG(CC, cc, cc, , , /usr/ucb/cc)
+ test -z "$CC" && AC_MSG_ERROR([no acceptable cc found in \$PATH])
+fi
+
+AC_PROG_CC_GNU
+
+if test $ac_cv_prog_gcc = yes; then
+ GCC=yes
+dnl Check whether -g works, even if CFLAGS is set, in case the package
+dnl plays around with CFLAGS (such as to build both debugging and
+dnl normal versions of a library), tasteless as that idea is.
+ ac_test_CFLAGS="${CFLAGS+set}"
+ ac_save_CFLAGS="$CFLAGS"
+ CFLAGS=
+ AC_PROG_CC_G
+ if test "$ac_test_CFLAGS" = set; then
+ CFLAGS="$ac_save_CFLAGS"
+ elif test $ac_cv_prog_cc_g = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-O2"
+ fi
+else
+ GCC=
+ test "${CFLAGS+set}" = set || CFLAGS="-g"
+fi
+])
+
+LIB_AC_PROG_CC
+
+# Likewise for AC_PROG_CXX.
+AC_DEFUN(LIB_AC_PROG_CXX,
+[AC_BEFORE([$0], [AC_PROG_CXXCPP])dnl
+AC_CHECK_PROGS(CXX, $CCC c++ g++ gcc CC cxx cc++, gcc)
+test -z "$CXX" && AC_MSG_ERROR([no acceptable c++ found in \$PATH])
+
+AC_PROG_CXX_GNU
+
+if test $ac_cv_prog_gxx = yes; then
+ GXX=yes
+dnl Check whether -g works, even if CXXFLAGS is set, in case the package
+dnl plays around with CXXFLAGS (such as to build both debugging and
+dnl normal versions of a library), tasteless as that idea is.
+ ac_test_CXXFLAGS="${CXXFLAGS+set}"
+ ac_save_CXXFLAGS="$CXXFLAGS"
+ CXXFLAGS=
+ AC_PROG_CXX_G
+ if test "$ac_test_CXXFLAGS" = set; then
+ CXXFLAGS="$ac_save_CXXFLAGS"
+ elif test $ac_cv_prog_cxx_g = yes; then
+ CXXFLAGS="-g -O2"
+ else
+ CXXFLAGS="-O2"
+ fi
+else
+ GXX=
+ test "${CXXFLAGS+set}" = set || CXXFLAGS="-g"
+fi
+])
+
+LIB_AC_PROG_CXX
+
+# AC_CHECK_TOOL does AC_REQUIRE (AC_CANONICAL_BUILD). If we don't
+# run it explicitly here, it will be run implicitly before
+# NEWLIB_CONFIGURE, which doesn't work because that means that it will
+# be run before AC_CANONICAL_HOST.
+AC_CANONICAL_BUILD
+
+AC_CHECK_TOOL(AS, as)
+AC_CHECK_TOOL(AR, ar)
+AC_CHECK_TOOL(RANLIB, ranlib, :)
+
+AC_PROG_INSTALL
+
+AM_MAINTAINER_MODE
+
+# We need AC_EXEEXT to keep automake happy in cygnus mode. However,
+# at least currently, we never actually build a program, so we never
+# need to use $(EXEEXT). Moreover, the test for EXEEXT normally
+# fails, because we are probably configuring with a cross compiler
+# which can't create executables. So we include AC_EXEEXT to keep
+# automake happy, but we don't execute it, since we don't care about
+# the result.
+if false; then
+ AC_EXEEXT
+fi
+
+. [$]{boehm_gc_basedir}/configure.host
+
+case [$]{boehm_gc_basedir} in
+/* | [A-Za-z]:[/\\]*) boehm_gc_flagbasedir=[$]{boehm_gc_basedir} ;;
+*) boehm_gc_flagbasedir='[$](top_builddir)/'[$]{boehm_gc_basedir} ;;
+esac
+
+boehm_gc_cflags="[$]{boehm_gc_cflags} -I"'[$](top_builddir)'"/$1/targ-include -I[$]{boehm_gc_flagbasedir}/libc/include"
+case "${host}" in
+ *-*-cygwin32*)
+ boehm_gc_cflags="[$]{boehm_gc_cflags} -I[$]{boehm_gc_flagbasedir}/../winsup/include"
+ ;;
+esac
+
+boehm_gc_cflags="[$]{boehm_gc_cflags} -fno-builtin"
+
+BOEHM_GC_CFLAGS=${boehm_gc_cflags}
+AC_SUBST(BOEHM_GC_CFLAGS)
+]))
+
+))))
+
+# Do all the work for Automake. This macro actually does too much --
+# some checks are only needed if your package does certain things.
+# But this isn't really a big deal.
+
+# serial 1
+
+dnl Usage:
+dnl AM_INIT_AUTOMAKE(package,version, [no-define])
+
+AC_DEFUN(AM_INIT_AUTOMAKE,
+[AC_REQUIRE([AC_PROG_INSTALL])
+PACKAGE=[$1]
+AC_SUBST(PACKAGE)
+VERSION=[$2]
+AC_SUBST(VERSION)
+dnl test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then
+ AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+fi
+ifelse([$3],,
+AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package]))
+AC_REQUIRE([AM_SANITY_CHECK])
+AC_REQUIRE([AC_ARG_PROGRAM])
+dnl FIXME This is truly gross.
+missing_dir=`cd $ac_aux_dir && pwd`
+AM_MISSING_PROG(ACLOCAL, aclocal, $missing_dir)
+AM_MISSING_PROG(AUTOCONF, autoconf, $missing_dir)
+AM_MISSING_PROG(AUTOMAKE, automake, $missing_dir)
+AM_MISSING_PROG(AUTOHEADER, autoheader, $missing_dir)
+AM_MISSING_PROG(MAKEINFO, makeinfo, $missing_dir)
+AC_REQUIRE([AC_PROG_MAKE_SET])])
+
+#
+# Check to make sure that the build environment is sane.
+#
+
+AC_DEFUN(AM_SANITY_CHECK,
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftestfile
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null`
+ if test "[$]*" = "X"; then
+ # -L didn't work.
+ set X `ls -t $srcdir/configure conftestfile`
+ fi
+ if test "[$]*" != "X $srcdir/configure conftestfile" \
+ && test "[$]*" != "X conftestfile $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken
+alias in your environment])
+ fi
+
+ test "[$]2" = conftestfile
+ )
+then
+ # Ok.
+ :
+else
+ AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+rm -f conftest*
+AC_MSG_RESULT(yes)])
+
+dnl AM_MISSING_PROG(NAME, PROGRAM, DIRECTORY)
+dnl The program must properly implement --version.
+AC_DEFUN(AM_MISSING_PROG,
+[AC_MSG_CHECKING(for working $2)
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf. Sigh.
+if ($2 --version) < /dev/null > /dev/null 2>&1; then
+ $1=$2
+ AC_MSG_RESULT(found)
+else
+ $1="$3/missing $2"
+ AC_MSG_RESULT(missing)
+fi
+AC_SUBST($1)])
+
+# Add --enable-maintainer-mode option to configure.
+# From Jim Meyering
+
+# serial 1
+
+AC_DEFUN(AM_MAINTAINER_MODE,
+[AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
+ dnl maintainer-mode is disabled by default
+ AC_ARG_ENABLE(maintainer-mode,
+[ --enable-maintainer-mode enable make rules and dependencies not useful
+ (and sometimes confusing) to the casual installer],
+ USE_MAINTAINER_MODE=$enableval,
+ USE_MAINTAINER_MODE=no)
+ AC_MSG_RESULT($USE_MAINTAINER_MODE)
+ AM_CONDITIONAL(MAINTAINER_MODE, test $USE_MAINTAINER_MODE = yes)
+ MAINT=$MAINTAINER_MODE_TRUE
+ AC_SUBST(MAINT)dnl
+]
+)
+
+# Define a conditional.
+
+AC_DEFUN(AM_CONDITIONAL,
+[AC_SUBST($1_TRUE)
+AC_SUBST($1_FALSE)
+if $2; then
+ $1_TRUE=
+ $1_FALSE='#'
+else
+ $1_TRUE='#'
+ $1_FALSE=
+fi])
+
+
+# serial 35 AC_PROG_LIBTOOL
+AC_DEFUN(AC_PROG_LIBTOOL,
+[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl
+
+# Save cache, so that ltconfig can load it
+AC_CACHE_SAVE
+
+# Actually configure libtool. ac_aux_dir is where install-sh is found.
+CC="$CC" CFLAGS="$CFLAGS" CPPFLAGS="$CPPFLAGS" \
+LD="$LD" NM="$NM" RANLIB="$RANLIB" LN_S="$LN_S" \
+DLLTOOL="$DLLTOOL" AS="$AS" \
+${CONFIG_SHELL-/bin/sh} $ac_aux_dir/ltconfig --no-reexec \
+$libtool_flags --no-verify $ac_aux_dir/ltmain.sh $host \
+|| AC_MSG_ERROR([libtool configure failed])
+
+# Reload cache, that may have been modified by ltconfig
+AC_CACHE_LOAD
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ac_aux_dir/ltconfig $ac_aux_dir/ltmain.sh"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+AC_SUBST(LIBTOOL)dnl
+
+# Redirect the config.log output again, so that the ltconfig log is not
+# clobbered by the next message.
+exec 5>>./config.log
+])
+
+AC_DEFUN(AC_LIBTOOL_SETUP,
+[AC_PREREQ(2.13)dnl
+AC_REQUIRE([AC_ENABLE_SHARED])dnl
+AC_REQUIRE([AC_ENABLE_STATIC])dnl
+AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+AC_REQUIRE([AC_PROG_RANLIB])dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_PROG_LD])dnl
+AC_REQUIRE([AC_PROG_NM])dnl
+AC_REQUIRE([AC_SYS_NM_PARSE])dnl
+AC_REQUIRE([AC_SYS_SYMBOL_UNDERSCORE])dnl
+AC_REQUIRE([AC_PROG_LN_S])dnl
+dnl
+
+# Check for any special flags to pass to ltconfig.
+libtool_flags="--cache-file=$cache_file"
+test "$enable_shared" = no && libtool_flags="$libtool_flags --disable-shared"
+test "$enable_static" = no && libtool_flags="$libtool_flags --disable-static"
+test "$enable_fast_install" = no && libtool_flags="$libtool_flags --disable-fast-install"
+test "$lt_dlopen" = yes && libtool_flags="$libtool_flags --enable-dlopen"
+test "$silent" = yes && libtool_flags="$libtool_flags --silent"
+test "$ac_cv_prog_gcc" = yes && libtool_flags="$libtool_flags --with-gcc"
+test "$ac_cv_prog_gnu_ld" = yes && libtool_flags="$libtool_flags --with-gnu-ld"
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case "$host" in
+*-*-irix6*)
+ # Find out which ABI we are using.
+ echo '[#]line __oline__ "configure"' > conftest.$ac_ext
+ if AC_TRY_EVAL(ac_compile); then
+ case "`/usr/bin/file conftest.o`" in
+ *32-bit*)
+ LD="${LD-ld} -32"
+ ;;
+ *N32*)
+ LD="${LD-ld} -n32"
+ ;;
+ *64-bit*)
+ LD="${LD-ld} -64"
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+
+*-*-sco3.2v5*)
+ # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+ SAVE_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -belf"
+ AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
+ [AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])])
+ if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+ # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+ CFLAGS="$SAVE_CFLAGS"
+ fi
+ ;;
+
+*-*-cygwin*)
+ AC_SYS_LIBTOOL_CYGWIN
+ ;;
+
+esac
+
+# enable the --disable-libtool-lock switch
+
+AC_ARG_ENABLE(libtool-lock,
+[ --disable-libtool-lock force libtool not to do file locking],
+need_locks=$enableval,
+need_locks=yes)
+
+if test x"$need_locks" = xno; then
+ libtool_flags="$libtool_flags --disable-lock"
+fi
+])
+
+# AC_LIBTOOL_DLOPEN - check for dlopen support
+AC_DEFUN(AC_LIBTOOL_DLOPEN, [lt_dlopen=yes])
+
+# AC_ENABLE_SHARED - implement the --enable-shared flag
+# Usage: AC_ENABLE_SHARED[(DEFAULT)]
+# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to
+# `yes'.
+AC_DEFUN(AC_ENABLE_SHARED,
+[define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl
+AC_ARG_ENABLE(shared,
+changequote(<<, >>)dnl
+<< --enable-shared[=PKGS] build shared libraries [default=>>AC_ENABLE_SHARED_DEFAULT],
+changequote([, ])dnl
+[p=${PACKAGE-default}
+case "$enableval" in
+yes) enable_shared=yes ;;
+no) enable_shared=no ;;
+*)
+ enable_shared=no
+ # Look at the argument we got. We use all the common list separators.
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
+ for pkg in $enableval; do
+ if test "X$pkg" = "X$p"; then
+ enable_shared=yes
+ fi
+ done
+ IFS="$ac_save_ifs"
+ ;;
+esac],
+enable_shared=AC_ENABLE_SHARED_DEFAULT)dnl
+])
+
+# AC_DISABLE_SHARED - set the default shared flag to --disable-shared
+AC_DEFUN(AC_DISABLE_SHARED,
+[AC_ENABLE_SHARED(no)])
+
+# AC_ENABLE_STATIC - implement the --enable-static flag
+# Usage: AC_ENABLE_STATIC[(DEFAULT)]
+# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to
+# `yes'.
+AC_DEFUN(AC_ENABLE_STATIC,
+[define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl
+AC_ARG_ENABLE(static,
+changequote(<<, >>)dnl
+<< --enable-static[=PKGS] build static libraries [default=>>AC_ENABLE_STATIC_DEFAULT],
+changequote([, ])dnl
+[p=${PACKAGE-default}
+case "$enableval" in
+yes) enable_static=yes ;;
+no) enable_static=no ;;
+*)
+ enable_static=no
+ # Look at the argument we got. We use all the common list separators.
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
+ for pkg in $enableval; do
+ if test "X$pkg" = "X$p"; then
+ enable_static=yes
+ fi
+ done
+ IFS="$ac_save_ifs"
+ ;;
+esac],
+enable_static=AC_ENABLE_STATIC_DEFAULT)dnl
+])
+
+# AC_DISABLE_STATIC - set the default static flag to --disable-static
+AC_DEFUN(AC_DISABLE_STATIC,
+[AC_ENABLE_STATIC(no)])
+
+
+# AC_ENABLE_FAST_INSTALL - implement the --enable-fast-install flag
+# Usage: AC_ENABLE_FAST_INSTALL[(DEFAULT)]
+# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to
+# `yes'.
+AC_DEFUN(AC_ENABLE_FAST_INSTALL,
+[define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl
+AC_ARG_ENABLE(fast-install,
+changequote(<<, >>)dnl
+<< --enable-fast-install[=PKGS] optimize for fast installation [default=>>AC_ENABLE_FAST_INSTALL_DEFAULT],
+changequote([, ])dnl
+[p=${PACKAGE-default}
+case "$enableval" in
+yes) enable_fast_install=yes ;;
+no) enable_fast_install=no ;;
+*)
+ enable_fast_install=no
+ # Look at the argument we got. We use all the common list separators.
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
+ for pkg in $enableval; do
+ if test "X$pkg" = "X$p"; then
+ enable_fast_install=yes
+ fi
+ done
+ IFS="$ac_save_ifs"
+ ;;
+esac],
+enable_fast_install=AC_ENABLE_FAST_INSTALL_DEFAULT)dnl
+])
+
+# AC_ENABLE_FAST_INSTALL - set the default to --disable-fast-install
+AC_DEFUN(AC_DISABLE_FAST_INSTALL,
+[AC_ENABLE_FAST_INSTALL(no)])
+
+
+# AC_PROG_LD - find the path to the GNU or non-GNU linker
+AC_DEFUN(AC_PROG_LD,
+[AC_ARG_WITH(gnu-ld,
+[ --with-gnu-ld assume the C compiler uses GNU ld [default=no]],
+test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no)
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+ac_prog=ld
+if test "$ac_cv_prog_gcc" = yes; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ AC_MSG_CHECKING([for ld used by GCC])
+ ac_prog=`($CC -print-prog-name=ld) 2>&5`
+ case "$ac_prog" in
+ # Accept absolute paths.
+changequote(,)dnl
+ /* | [A-Za-z]:[\\/]*)
+ re_direlt='/[^/][^/]*/\.\./'
+changequote([,])dnl
+ # Canonicalize the path of ld
+ ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'`
+ while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
+ ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
+ done
+ test -z "$LD" && LD="$ac_prog"
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ac_prog=ld
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+elif test "$with_gnu_ld" = yes; then
+ AC_MSG_CHECKING([for GNU ld])
+else
+ AC_MSG_CHECKING([for non-GNU ld])
+fi
+AC_CACHE_VAL(ac_cv_path_LD,
+[if test -z "$LD"; then
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog"; then
+ ac_cv_path_LD="$ac_dir/$ac_prog"
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some GNU ld's only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ if "$ac_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then
+ test "$with_gnu_ld" != no && break
+ else
+ test "$with_gnu_ld" != yes && break
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+else
+ ac_cv_path_LD="$LD" # Let the user override the test with a path.
+fi])
+LD="$ac_cv_path_LD"
+if test -n "$LD"; then
+ AC_MSG_RESULT($LD)
+else
+ AC_MSG_RESULT(no)
+fi
+test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
+AC_SUBST(LD)
+AC_PROG_LD_GNU
+])
+
+AC_DEFUN(AC_PROG_LD_GNU,
+[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], ac_cv_prog_gnu_ld,
+[# I'd rather use --version here, but apparently some GNU ld's only accept -v.
+if $LD -v 2>&1 </dev/null | egrep '(GNU|with BFD)' 1>&5; then
+ ac_cv_prog_gnu_ld=yes
+else
+ ac_cv_prog_gnu_ld=no
+fi])
+])
+
+# AC_PROG_NM - find the path to a BSD-compatible name lister
+AC_DEFUN(AC_PROG_NM,
+[AC_MSG_CHECKING([for BSD-compatible nm])
+AC_CACHE_VAL(ac_cv_path_NM,
+[if test -n "$NM"; then
+ # Let the user override the test.
+ ac_cv_path_NM="$NM"
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/nm; then
+ # Check to see if the nm accepts a BSD-compat flag.
+ # Adding the `sed 1q' prevents false positives on HP-UX, which says:
+ # nm: unknown option "B" ignored
+ if ($ac_dir/nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
+ ac_cv_path_NM="$ac_dir/nm -B"
+ break
+ elif ($ac_dir/nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
+ ac_cv_path_NM="$ac_dir/nm -p"
+ break
+ else
+ ac_cv_path_NM=${ac_cv_path_NM="$ac_dir/nm"} # keep the first match, but
+ continue # so that we can try to find one that supports BSD flags
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_NM" && ac_cv_path_NM=nm
+fi])
+NM="$ac_cv_path_NM"
+AC_MSG_RESULT([$NM])
+AC_SUBST(NM)
+])
+
+# AC_SYS_NM_PARSE - Check for command to grab the raw symbol name followed
+# by C symbol name from nm.
+AC_DEFUN(AC_SYS_NM_PARSE,
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_PROG_NM])dnl
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+AC_MSG_CHECKING([command to parse $NM output])
+AC_CACHE_VAL(ac_cv_sys_global_symbol_pipe,
+[# These are sane defaults that work on at least a few old systems.
+# {They come from Ultrix. What could be older than Ultrix?!! ;)}
+
+changequote(,)dnl
+# Character class describing NM global symbol codes.
+ac_symcode='[BCDEGRST]'
+
+# Regexp to match symbols that can be accessed directly from C.
+ac_sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
+
+# Transform the above into a raw symbol and a C symbol.
+ac_symxfrm='\1 \2\3 \3'
+
+# Transform an extracted symbol line into a proper C declaration
+ac_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern char \1;/p'"
+
+# Define system-specific variables.
+case "$host_os" in
+aix*)
+ ac_symcode='[BCDT]'
+ ;;
+cygwin* | mingw*)
+ ac_symcode='[ABCDGISTW]'
+ ;;
+hpux*)
+ ac_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern char \1();/p' -e 's/^. .* \(.*\)$/extern char \1;/p'"
+ ;;
+irix*)
+ ac_symcode='[BCDEGRST]'
+ ;;
+solaris*)
+ ac_symcode='[BDT]'
+ ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+if $NM -V 2>&1 | egrep '(GNU|with BFD)' > /dev/null; then
+ ac_symcode='[ABCDGISTW]'
+fi
+changequote([,])dnl
+
+# Try without a prefix undercore, then with it.
+for ac_symprfx in "" "_"; do
+
+ ac_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($ac_symcode\)[ ][ ]*\($ac_symprfx\)$ac_sympat$/$ac_symxfrm/p'"
+
+ # Check to see that the pipe works correctly.
+ ac_pipe_works=no
+ rm -f conftest.$ac_ext
+ cat > conftest.$ac_ext <<EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func;return 0;}
+EOF
+
+ if AC_TRY_EVAL(ac_compile); then
+ # Now try to grab the symbols.
+ ac_nlist=conftest.nm
+
+ if AC_TRY_EVAL(NM conftest.$ac_objext \| $ac_cv_sys_global_symbol_pipe \> $ac_nlist) && test -s "$ac_nlist"; then
+
+ # Try sorting and uniquifying the output.
+ if sort "$ac_nlist" | uniq > "$ac_nlist"T; then
+ mv -f "$ac_nlist"T "$ac_nlist"
+ else
+ rm -f "$ac_nlist"T
+ fi
+
+ # Make sure that we snagged all the symbols we need.
+ if egrep ' nm_test_var$' "$ac_nlist" >/dev/null; then
+ if egrep ' nm_test_func$' "$ac_nlist" >/dev/null; then
+ cat <<EOF > conftest.c
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+EOF
+ # Now generate the symbol file.
+ eval "$ac_global_symbol_to_cdecl"' < "$ac_nlist" >> conftest.c'
+
+ cat <<EOF >> conftest.c
+#if defined (__STDC__) && __STDC__
+# define lt_ptr_t void *
+#else
+# define lt_ptr_t char *
+# define const
+#endif
+
+/* The mapping between symbol names and symbols. */
+const struct {
+ const char *name;
+ lt_ptr_t address;
+}
+changequote(,)dnl
+lt_preloaded_symbols[] =
+changequote([,])dnl
+{
+EOF
+ sed 's/^. \(.*\) \(.*\)$/ {"\2", (lt_ptr_t) \&\2},/' < "$ac_nlist" >> conftest.c
+ cat <<\EOF >> conftest.c
+ {0, (lt_ptr_t) 0}
+};
+
+#ifdef __cplusplus
+}
+#endif
+EOF
+ # Now try linking the two files.
+ mv conftest.$ac_objext conftestm.$ac_objext
+ ac_save_LIBS="$LIBS"
+ ac_save_CFLAGS="$CFLAGS"
+ LIBS="conftestm.$ac_objext"
+ CFLAGS="$CFLAGS$no_builtin_flag"
+ if AC_TRY_EVAL(ac_link) && test -s conftest; then
+ ac_pipe_works=yes
+ else
+ echo "configure: failed program was:" >&AC_FD_CC
+ cat conftest.c >&AC_FD_CC
+ fi
+ LIBS="$ac_save_LIBS"
+ CFLAGS="$ac_save_CFLAGS"
+ else
+ echo "cannot find nm_test_func in $ac_nlist" >&AC_FD_CC
+ fi
+ else
+ echo "cannot find nm_test_var in $ac_nlist" >&AC_FD_CC
+ fi
+ else
+ echo "cannot run $ac_cv_sys_global_symbol_pipe" >&AC_FD_CC
+ fi
+ else
+ echo "$progname: failed program was:" >&AC_FD_CC
+ cat conftest.c >&AC_FD_CC
+ fi
+ rm -rf conftest*
+
+ # Do not use the global_symbol_pipe unless it works.
+ if test "$ac_pipe_works" = yes; then
+ if test x"$ac_symprfx" = x"_"; then
+ ac_cv_sys_symbol_underscore=yes
+ else
+ ac_cv_sys_symbol_underscore=no
+ fi
+ break
+ else
+ ac_cv_sys_global_symbol_pipe=
+ fi
+done
+])
+
+ac_result=yes
+if test -z "$ac_cv_sys_global_symbol_pipe"; then
+ ac_result=no
+fi
+AC_MSG_RESULT($ac_result)
+])
+
+# AC_SYS_LIBTOOL_CYGWIN - find tools needed on cygwin
+AC_DEFUN(AC_SYS_LIBTOOL_CYGWIN,
+[AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+AC_CHECK_TOOL(AS, as, false)
+])
+
+# AC_SYS_SYMBOL_UNDERSCORE - does the compiler prefix global symbols
+# with an underscore?
+AC_DEFUN(AC_SYS_SYMBOL_UNDERSCORE,
+[AC_REQUIRE([AC_PROG_NM])dnl
+AC_REQUIRE([AC_SYS_NM_PARSE])dnl
+AC_MSG_CHECKING([for _ prefix in compiled symbols])
+AC_CACHE_VAL(ac_cv_sys_symbol_underscore,
+[ac_cv_sys_symbol_underscore=no
+cat > conftest.$ac_ext <<EOF
+void nm_test_func(){}
+int main(){nm_test_func;return 0;}
+EOF
+if AC_TRY_EVAL(ac_compile); then
+ # Now try to grab the symbols.
+ ac_nlist=conftest.nm
+ if AC_TRY_EVAL(NM conftest.$ac_objext \| $ac_cv_sys_global_symbol_pipe \> $ac_nlist) && test -s "$ac_nlist"; then
+ # See whether the symbols have a leading underscore.
+ if egrep '^. _nm_test_func' "$ac_nlist" >/dev/null; then
+ ac_cv_sys_symbol_underscore=yes
+ else
+ if egrep '^. nm_test_func ' "$ac_nlist" >/dev/null; then
+ :
+ else
+ echo "configure: cannot find nm_test_func in $ac_nlist" >&AC_FD_CC
+ fi
+ fi
+ else
+ echo "configure: cannot run $ac_cv_sys_global_symbol_pipe" >&AC_FD_CC
+ fi
+else
+ echo "configure: failed program was:" >&AC_FD_CC
+ cat conftest.c >&AC_FD_CC
+fi
+rm -rf conftest*
+])
+AC_MSG_RESULT($ac_cv_sys_symbol_underscore)
+USE_SYMBOL_UNDERSCORE=${ac_cv_sys_symbol_underscore=no}
+AC_SUBST(USE_SYMBOL_UNDERSCORE)dnl
+])
+
+# AC_CHECK_LIBM - check for math library
+AC_DEFUN(AC_CHECK_LIBM, [
+AC_CHECK_LIB(mw, _mwvalidcheckl)
+AC_CHECK_LIB(m, cos)
+])
+
+# AC_LIBLTDL_CONVENIENCE[(dir)] - sets LIBLTDL to the link flags for
+# the libltdl convenience library, adds --enable-ltdl-convenience to
+# the configure arguments. Note that LIBLTDL is not AC_SUBSTed, nor
+# is AC_CONFIG_SUBDIRS called. If DIR is not provided, it is assumed
+# to be `${top_builddir}/libltdl'. Make sure you start DIR with
+# '${top_builddir}/' (note the single quotes!) if your package is not
+# flat, and, if you're not using automake, define top_builddir as
+# appropriate in the Makefiles.
+AC_DEFUN(AC_LIBLTDL_CONVENIENCE, [
+ case "$enable_ltdl_convenience" in
+ no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;;
+ "") enable_ltdl_convenience=yes
+ ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;;
+ esac
+ LIBLTDL=ifelse($#,1,$1,['${top_builddir}/libltdl'])/libltdlc.la
+])
+
+# AC_LIBLTDL_INSTALLABLE[(dir)] - sets LIBLTDL to the link flags for
+# the libltdl installable library, and adds --enable-ltdl-install to
+# the configure arguments. Note that LIBLTDL is not AC_SUBSTed, nor
+# is AC_CONFIG_SUBDIRS called. If DIR is not provided, it is assumed
+# to be `${top_builddir}/libltdl'. Make sure you start DIR with
+# '${top_builddir}/' (note the single quotes!) if your package is not
+# flat, and, if you're not using automake, define top_builddir as
+# appropriate in the Makefiles.
+# In the future, this macro may have to be called after AC_PROG_LIBTOOL.
+AC_DEFUN(AC_LIBLTDL_INSTALLABLE, [
+ AC_CHECK_LIB(ltdl, main, LIBLTDL="-lltdl", [
+ case "$enable_ltdl_install" in
+ no) AC_MSG_WARN([libltdl not installed, but installation disabled]) ;;
+ "") enable_ltdl_install=yes
+ ac_configure_args="$ac_configure_args --enable-ltdl-install" ;;
+ esac
+ ])
+ if test x"$enable_ltdl_install" != x"no"; then
+ LIBLTDL=ifelse($#,1,$1,['${top_builddir}/libltdl'])/libltdl.la
+ fi
+])
+
+dnl old names
+AC_DEFUN(AM_PROG_LIBTOOL, [indir([AC_PROG_LIBTOOL])])dnl
+AC_DEFUN(AM_ENABLE_SHARED, [indir([AC_ENABLE_SHARED], $@)])dnl
+AC_DEFUN(AM_ENABLE_STATIC, [indir([AC_ENABLE_STATIC], $@)])dnl
+AC_DEFUN(AM_DISABLE_SHARED, [indir([AC_DISABLE_SHARED], $@)])dnl
+AC_DEFUN(AM_DISABLE_STATIC, [indir([AC_DISABLE_STATIC], $@)])dnl
+AC_DEFUN(AM_PROG_LD, [indir([AC_PROG_LD])])dnl
+AC_DEFUN(AM_PROG_NM, [indir([AC_PROG_NM])])dnl
+AC_DEFUN(AM_SYS_NM_PARSE, [indir([AC_SYS_NM_PARSE])])dnl
+AC_DEFUN(AM_SYS_SYMBOL_UNDERSCORE, [indir([AC_SYS_SYMBOL_UNDERSCORE])])dnl
+AC_DEFUN(AM_SYS_LIBTOOL_CYGWIN, [indir([AC_SYS_LIBTOOL_CYGWIN])])dnl
+
diff --git a/boehm-gc/add_gc_prefix.c b/boehm-gc/add_gc_prefix.c
new file mode 100644
index 00000000000..0d1ab6d4d36
--- /dev/null
+++ b/boehm-gc/add_gc_prefix.c
@@ -0,0 +1,14 @@
+# include <stdio.h>
+
+int main(argc, argv, envp)
+int argc;
+char ** argv;
+char ** envp;
+{
+ int i;
+
+ for (i = 1; i < argc; i++) {
+ printf("gc/%s ", argv[i]);
+ }
+ return(0);
+}
diff --git a/boehm-gc/allchblk.c b/boehm-gc/allchblk.c
new file mode 100644
index 00000000000..7a5a3a1c3ab
--- /dev/null
+++ b/boehm-gc/allchblk.c
@@ -0,0 +1,408 @@
+/*
+ * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1998 by Silicon Graphics. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+/* Boehm, August 9, 1995 5:08 pm PDT */
+
+#define DEBUG
+#undef DEBUG
+#include <stdio.h>
+#include "gc_priv.h"
+
+
+/*
+ * allocate/free routines for heap blocks
+ * Note that everything called from outside the garbage collector
+ * should be prepared to abort at any point as the result of a signal.
+ */
+
+/*
+ * Free heap blocks are kept on a list sorted by address.
+ * The hb_hdr.hbh_sz field of a free heap block contains the length
+ * (in bytes) of the entire block.
+ * Neighbors are coalesced.
+ */
+
+# define MAX_BLACK_LIST_ALLOC (2*HBLKSIZE)
+ /* largest block we will allocate starting on a black */
+ /* listed block. Must be >= HBLKSIZE. */
+
+struct hblk * GC_hblkfreelist = 0;
+
+struct hblk *GC_savhbp = (struct hblk *)0; /* heap block preceding next */
+ /* block to be examined by */
+ /* GC_allochblk. */
+
+# if !defined(NO_DEBUGGING)
+void GC_print_hblkfreelist()
+{
+ struct hblk * h = GC_hblkfreelist;
+ word total_free = 0;
+ hdr * hhdr = HDR(h);
+ word sz;
+
+ while (h != 0) {
+ sz = hhdr -> hb_sz;
+ GC_printf2("0x%lx size %lu ", (unsigned long)h, (unsigned long)sz);
+ total_free += sz;
+ if (GC_is_black_listed(h, HBLKSIZE) != 0) {
+ GC_printf0("start black listed\n");
+ } else if (GC_is_black_listed(h, hhdr -> hb_sz) != 0) {
+ GC_printf0("partially black listed\n");
+ } else {
+ GC_printf0("not black listed\n");
+ }
+ h = hhdr -> hb_next;
+ hhdr = HDR(h);
+ }
+ GC_printf1("Total of %lu bytes on free list\n", (unsigned long)total_free);
+}
+
+# endif /* NO_DEBUGGING */
+
+/* Initialize hdr for a block containing the indicated size and */
+/* kind of objects. */
+/* Return FALSE on failure. */
+static GC_bool setup_header(hhdr, sz, kind, flags)
+register hdr * hhdr;
+word sz; /* object size in words */
+int kind;
+unsigned char flags;
+{
+ register word descr;
+
+ /* Add description of valid object pointers */
+ if (!GC_add_map_entry(sz)) return(FALSE);
+ hhdr -> hb_map = GC_obj_map[sz > MAXOBJSZ? 0 : sz];
+
+ /* Set size, kind and mark proc fields */
+ hhdr -> hb_sz = sz;
+ hhdr -> hb_obj_kind = kind;
+ hhdr -> hb_flags = flags;
+ descr = GC_obj_kinds[kind].ok_descriptor;
+ if (GC_obj_kinds[kind].ok_relocate_descr) descr += WORDS_TO_BYTES(sz);
+ hhdr -> hb_descr = descr;
+
+ /* Clear mark bits */
+ GC_clear_hdr_marks(hhdr);
+
+ hhdr -> hb_last_reclaimed = (unsigned short)GC_gc_no;
+ return(TRUE);
+}
+
+#ifdef EXACT_FIRST
+# define LAST_TRIP 2
+#else
+# define LAST_TRIP 1
+#endif
+
+/*
+ * Allocate (and return pointer to) a heap block
+ * for objects of size sz words.
+ *
+ * NOTE: We set obj_map field in header correctly.
+ * Caller is resposnsible for building an object freelist in block.
+ *
+ * We clear the block if it is destined for large objects, and if
+ * kind requires that newly allocated objects be cleared.
+ */
+struct hblk *
+GC_allochblk(sz, kind, flags)
+word sz;
+int kind;
+unsigned char flags; /* IGNORE_OFF_PAGE or 0 */
+{
+ register struct hblk *thishbp;
+ register hdr * thishdr; /* Header corr. to thishbp */
+ register struct hblk *hbp;
+ register hdr * hhdr; /* Header corr. to hbp */
+ struct hblk *prevhbp;
+ register hdr * phdr; /* Header corr. to prevhbp */
+ signed_word size_needed; /* number of bytes in requested objects */
+ signed_word size_avail; /* bytes available in this block */
+ int trip_count = 0;
+
+ size_needed = HBLKSIZE * OBJ_SZ_TO_BLOCKS(sz);
+
+ /* search for a big enough block in free list */
+ hbp = GC_savhbp;
+ hhdr = HDR(hbp);
+ for(;;) {
+
+ prevhbp = hbp;
+ phdr = hhdr;
+ hbp = (prevhbp == 0? GC_hblkfreelist : phdr->hb_next);
+ hhdr = HDR(hbp);
+
+ if( prevhbp == GC_savhbp) {
+ if (trip_count == LAST_TRIP) return(0);
+ ++trip_count;
+ }
+
+ if( hbp == 0 ) continue;
+
+ size_avail = hhdr->hb_sz;
+# ifdef EXACT_FIRST
+ if (trip_count <= 1 && size_avail != size_needed) continue;
+# endif
+ if (size_avail < size_needed) continue;
+# ifdef PRESERVE_LAST
+ if (size_avail != size_needed
+ && !GC_incremental
+ && GC_in_last_heap_sect(hbp) && GC_should_collect()) {
+ continue;
+ }
+# endif
+ /* If the next heap block is obviously better, go on. */
+ /* This prevents us from disassembling a single large block */
+ /* to get tiny blocks. */
+ {
+ signed_word next_size;
+
+ thishbp = hhdr -> hb_next;
+ if (thishbp == 0) thishbp = GC_hblkfreelist;
+ thishdr = HDR(thishbp);
+ next_size = (signed_word)(thishdr -> hb_sz);
+ if (next_size < size_avail
+ && next_size >= size_needed
+ && !GC_is_black_listed(thishbp, (word)size_needed)) {
+ continue;
+ }
+ }
+ if ( !IS_UNCOLLECTABLE(kind) &&
+ (kind != PTRFREE || size_needed > MAX_BLACK_LIST_ALLOC)) {
+ struct hblk * lasthbp = hbp;
+ ptr_t search_end = (ptr_t)hbp + size_avail - size_needed;
+ signed_word orig_avail = size_avail;
+ signed_word eff_size_needed = ((flags & IGNORE_OFF_PAGE)?
+ HBLKSIZE
+ : size_needed);
+
+
+ while ((ptr_t)lasthbp <= search_end
+ && (thishbp = GC_is_black_listed(lasthbp,
+ (word)eff_size_needed))) {
+ lasthbp = thishbp;
+ }
+ size_avail -= (ptr_t)lasthbp - (ptr_t)hbp;
+ thishbp = lasthbp;
+ if (size_avail >= size_needed) {
+ if (thishbp != hbp && GC_install_header(thishbp)) {
+ /* Split the block at thishbp */
+ thishdr = HDR(thishbp);
+ /* GC_invalidate_map not needed, since we will */
+ /* allocate this block. */
+ thishdr -> hb_next = hhdr -> hb_next;
+ thishdr -> hb_sz = size_avail;
+ hhdr -> hb_sz = (ptr_t)thishbp - (ptr_t)hbp;
+ hhdr -> hb_next = thishbp;
+ /* Advance to thishbp */
+ prevhbp = hbp;
+ phdr = hhdr;
+ hbp = thishbp;
+ hhdr = thishdr;
+ }
+ } else if (size_needed > (signed_word)BL_LIMIT
+ && orig_avail - size_needed
+ > (signed_word)BL_LIMIT) {
+ /* Punt, since anything else risks unreasonable heap growth. */
+ WARN("Needed to allocate blacklisted block at 0x%lx\n",
+ (word)hbp);
+ thishbp = hbp;
+ size_avail = orig_avail;
+ } else if (size_avail == 0
+ && size_needed == HBLKSIZE
+ && prevhbp != 0) {
+# ifndef FIND_LEAK
+ static unsigned count = 0;
+
+ /* The block is completely blacklisted. We need */
+ /* to drop some such blocks, since otherwise we spend */
+ /* all our time traversing them if pointerfree */
+ /* blocks are unpopular. */
+ /* A dropped block will be reconsidered at next GC. */
+ if ((++count & 3) == 0) {
+ /* Allocate and drop the block in small chunks, to */
+ /* maximize the chance that we will recover some */
+ /* later. */
+ struct hblk * limit = hbp + (hhdr->hb_sz/HBLKSIZE);
+ struct hblk * h;
+
+ GC_words_wasted += hhdr->hb_sz;
+ phdr -> hb_next = hhdr -> hb_next;
+ for (h = hbp; h < limit; h++) {
+ if (h == hbp || GC_install_header(h)) {
+ hhdr = HDR(h);
+ (void) setup_header(
+ hhdr,
+ BYTES_TO_WORDS(HBLKSIZE - HDR_BYTES),
+ PTRFREE, 0); /* Cant fail */
+ if (GC_debugging_started) {
+ BZERO(hbp + HDR_BYTES, HBLKSIZE - HDR_BYTES);
+ }
+ }
+ }
+ /* Restore hbp to point at free block */
+ if (GC_savhbp == hbp) GC_savhbp = prevhbp;
+ hbp = prevhbp;
+ hhdr = phdr;
+ if (hbp == GC_savhbp) --trip_count;
+ }
+# endif
+ }
+ }
+ if( size_avail >= size_needed ) {
+ /* found a big enough block */
+ /* let thishbp --> the block */
+ /* set prevhbp, hbp to bracket it */
+ thishbp = hbp;
+ thishdr = hhdr;
+ if( size_avail == size_needed ) {
+ hbp = hhdr->hb_next;
+ hhdr = HDR(hbp);
+ } else {
+ hbp = (struct hblk *)
+ (((word)thishbp) + size_needed);
+ if (!GC_install_header(hbp)) {
+ hbp = thishbp;
+ continue;
+ }
+ hhdr = HDR(hbp);
+ GC_invalidate_map(hhdr);
+ hhdr->hb_next = thishdr->hb_next;
+ hhdr->hb_sz = size_avail - size_needed;
+ }
+ /* remove *thishbp from hblk freelist */
+ if( prevhbp == 0 ) {
+ GC_hblkfreelist = hbp;
+ } else {
+ phdr->hb_next = hbp;
+ }
+ /* save current list search position */
+ GC_savhbp = hbp;
+ break;
+ }
+ }
+
+ /* Notify virtual dirty bit implementation that we are about to write. */
+ GC_write_hint(thishbp);
+
+ /* Add it to map of valid blocks */
+ if (!GC_install_counts(thishbp, (word)size_needed)) return(0);
+ /* This leaks memory under very rare conditions. */
+
+ /* Set up header */
+ if (!setup_header(thishdr, sz, kind, flags)) {
+ GC_remove_counts(thishbp, (word)size_needed);
+ return(0); /* ditto */
+ }
+
+ /* Clear block if necessary */
+ if (GC_debugging_started
+ || sz > MAXOBJSZ && GC_obj_kinds[kind].ok_init) {
+ BZERO(thishbp + HDR_BYTES, size_needed - HDR_BYTES);
+ }
+
+ /* We just successfully allocated a block. Restart count of */
+ /* consecutive failures. */
+ {
+ extern unsigned GC_fail_count;
+
+ GC_fail_count = 0;
+ }
+
+ return( thishbp );
+}
+
+struct hblk * GC_freehblk_ptr = 0; /* Search position hint for GC_freehblk */
+
+/*
+ * Free a heap block.
+ *
+ * Coalesce the block with its neighbors if possible.
+ *
+ * All mark words are assumed to be cleared.
+ */
+void
+GC_freehblk(p)
+register struct hblk *p;
+{
+register hdr *phdr; /* Header corresponding to p */
+register struct hblk *hbp, *prevhbp;
+register hdr *hhdr, *prevhdr;
+register signed_word size;
+
+ /* GC_savhbp may become invalid due to coalescing. Clear it. */
+ GC_savhbp = (struct hblk *)0;
+
+ phdr = HDR(p);
+ size = phdr->hb_sz;
+ size = HBLKSIZE * OBJ_SZ_TO_BLOCKS(size);
+ GC_remove_counts(p, (word)size);
+ phdr->hb_sz = size;
+ GC_invalidate_map(phdr);
+ prevhbp = 0;
+
+ /* The following optimization was suggested by David Detlefs. */
+ /* Note that the header cannot be NIL, since there cannot be an */
+ /* intervening call to GC_freehblk without resetting */
+ /* GC_freehblk_ptr. */
+ if (GC_freehblk_ptr != 0 &&
+ HDR(GC_freehblk_ptr)->hb_map == GC_invalid_map &&
+ (ptr_t)GC_freehblk_ptr < (ptr_t)p) {
+ hbp = GC_freehblk_ptr;
+ } else {
+ hbp = GC_hblkfreelist;
+ };
+ hhdr = HDR(hbp);
+
+ while( (hbp != 0) && (hbp < p) ) {
+ prevhbp = hbp;
+ prevhdr = hhdr;
+ hbp = hhdr->hb_next;
+ hhdr = HDR(hbp);
+ }
+ GC_freehblk_ptr = prevhbp;
+
+ /* Check for duplicate deallocation in the easy case */
+ if (hbp != 0 && (ptr_t)p + size > (ptr_t)hbp
+ || prevhbp != 0 && (ptr_t)prevhbp + prevhdr->hb_sz > (ptr_t)p) {
+ GC_printf1("Duplicate large block deallocation of 0x%lx\n",
+ (unsigned long) p);
+ GC_printf2("Surrounding free blocks are 0x%lx and 0x%lx\n",
+ (unsigned long) prevhbp, (unsigned long) hbp);
+ }
+
+ /* Coalesce with successor, if possible */
+ if( (((word)p)+size) == ((word)hbp) ) {
+ phdr->hb_next = hhdr->hb_next;
+ phdr->hb_sz += hhdr->hb_sz;
+ GC_remove_header(hbp);
+ } else {
+ phdr->hb_next = hbp;
+ }
+
+
+ if( prevhbp == 0 ) {
+ GC_hblkfreelist = p;
+ } else if( (((word)prevhbp) + prevhdr->hb_sz)
+ == ((word)p) ) {
+ /* Coalesce with predecessor */
+ prevhdr->hb_next = phdr->hb_next;
+ prevhdr->hb_sz += phdr->hb_sz;
+ GC_remove_header(p);
+ } else {
+ prevhdr->hb_next = p;
+ }
+}
+
diff --git a/boehm-gc/alloc.c b/boehm-gc/alloc.c
new file mode 100644
index 00000000000..c9d145e0369
--- /dev/null
+++ b/boehm-gc/alloc.c
@@ -0,0 +1,853 @@
+/*
+ * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+/* Boehm, February 16, 1996 2:26 pm PST */
+
+
+# include "gc_priv.h"
+
+# include <stdio.h>
+# ifndef MACOS
+# include <signal.h>
+# include <sys/types.h>
+# endif
+
+/*
+ * Separate free lists are maintained for different sized objects
+ * up to MAXOBJSZ.
+ * The call GC_allocobj(i,k) ensures that the freelist for
+ * kind k objects of size i points to a non-empty
+ * free list. It returns a pointer to the first entry on the free list.
+ * In a single-threaded world, GC_allocobj may be called to allocate
+ * an object of (small) size i as follows:
+ *
+ * opp = &(GC_objfreelist[i]);
+ * if (*opp == 0) GC_allocobj(i, NORMAL);
+ * ptr = *opp;
+ * *opp = obj_link(ptr);
+ *
+ * Note that this is very fast if the free list is non-empty; it should
+ * only involve the execution of 4 or 5 simple instructions.
+ * All composite objects on freelists are cleared, except for
+ * their first word.
+ */
+
+/*
+ * The allocator uses GC_allochblk to allocate large chunks of objects.
+ * These chunks all start on addresses which are multiples of
+ * HBLKSZ. Each allocated chunk has an associated header,
+ * which can be located quickly based on the address of the chunk.
+ * (See headers.c for details.)
+ * This makes it possible to check quickly whether an
+ * arbitrary address corresponds to an object administered by the
+ * allocator.
+ */
+
+word GC_non_gc_bytes = 0; /* Number of bytes not intended to be collected */
+
+word GC_gc_no = 0;
+
+int GC_incremental = 0; /* By default, stop the world. */
+
+int GC_full_freq = 4; /* Every 5th collection is a full */
+ /* collection. */
+
+char * GC_copyright[] =
+{"Copyright 1988,1989 Hans-J. Boehm and Alan J. Demers ",
+"Copyright (c) 1991-1995 by Xerox Corporation. All rights reserved. ",
+"Copyright (c) 1996-1997 by Silicon Graphics. All rights reserved. ",
+"THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY",
+" EXPRESSED OR IMPLIED. ANY USE IS AT YOUR OWN RISK.",
+"See source code for details." };
+
+# include "version.h"
+
+/* some more variables */
+
+extern signed_word GC_mem_found; /* Number of reclaimed longwords */
+ /* after garbage collection */
+
+GC_bool GC_dont_expand = 0;
+
+word GC_free_space_divisor = 4;
+
+extern GC_bool GC_collection_in_progress();
+
+int GC_never_stop_func GC_PROTO((void)) { return(0); }
+
+CLOCK_TYPE GC_start_time;
+
+int GC_timeout_stop_func GC_PROTO((void))
+{
+ CLOCK_TYPE current_time;
+ static unsigned count = 0;
+ unsigned long time_diff;
+
+ if ((count++ & 3) != 0) return(0);
+#ifndef NO_CLOCK
+ GET_TIME(current_time);
+ time_diff = MS_TIME_DIFF(current_time,GC_start_time);
+ if (time_diff >= TIME_LIMIT) {
+# ifdef PRINTSTATS
+ GC_printf0("Abandoning stopped marking after ");
+ GC_printf1("%lu msecs\n", (unsigned long)time_diff);
+# endif
+ return(1);
+ }
+#endif
+ return(0);
+}
+
+/* Return the minimum number of words that must be allocated between */
+/* collections to amortize the collection cost. */
+static word min_words_allocd()
+{
+# ifdef THREADS
+ /* We punt, for now. */
+ register signed_word stack_size = 10000;
+# else
+ int dummy;
+ register signed_word stack_size = (ptr_t)(&dummy) - GC_stackbottom;
+# endif
+ register word total_root_size; /* includes double stack size, */
+ /* since the stack is expensive */
+ /* to scan. */
+
+ if (stack_size < 0) stack_size = -stack_size;
+ total_root_size = 2 * stack_size + GC_root_size;
+ if (GC_incremental) {
+ return(BYTES_TO_WORDS(GC_heapsize + total_root_size)
+ / (2 * GC_free_space_divisor));
+ } else {
+ return(BYTES_TO_WORDS(GC_heapsize + total_root_size)
+ / GC_free_space_divisor);
+ }
+}
+
+/* Return the number of words allocated, adjusted for explicit storage */
+/* management, etc.. This number is used in deciding when to trigger */
+/* collections. */
+word GC_adj_words_allocd()
+{
+ register signed_word result;
+ register signed_word expl_managed =
+ BYTES_TO_WORDS((long)GC_non_gc_bytes
+ - (long)GC_non_gc_bytes_at_gc);
+
+ /* Don't count what was explicitly freed, or newly allocated for */
+ /* explicit management. Note that deallocating an explicitly */
+ /* managed object should not alter result, assuming the client */
+ /* is playing by the rules. */
+ result = (signed_word)GC_words_allocd
+ - (signed_word)GC_mem_freed - expl_managed;
+ if (result > (signed_word)GC_words_allocd) {
+ result = GC_words_allocd;
+ /* probably client bug or unfortunate scheduling */
+ }
+ result += GC_words_finalized;
+ /* We count objects enqueued for finalization as though they */
+ /* had been reallocated this round. Finalization is user */
+ /* visible progress. And if we don't count this, we have */
+ /* stability problems for programs that finalize all objects. */
+ result += GC_words_wasted;
+ /* This doesn't reflect useful work. But if there is lots of */
+ /* new fragmentation, the same is probably true of the heap, */
+ /* and the collection will be correspondingly cheaper. */
+ if (result < (signed_word)(GC_words_allocd >> 3)) {
+ /* Always count at least 1/8 of the allocations. We don't want */
+ /* to collect too infrequently, since that would inhibit */
+ /* coalescing of free storage blocks. */
+ /* This also makes us partially robust against client bugs. */
+ return(GC_words_allocd >> 3);
+ } else {
+ return(result);
+ }
+}
+
+
+/* Clear up a few frames worth of garbage left at the top of the stack. */
+/* This is used to prevent us from accidentally treating garbade left */
+/* on the stack by other parts of the collector as roots. This */
+/* differs from the code in misc.c, which actually tries to keep the */
+/* stack clear of long-lived, client-generated garbage. */
+void GC_clear_a_few_frames()
+{
+# define NWORDS 64
+ word frames[NWORDS];
+ register int i;
+
+ for (i = 0; i < NWORDS; i++) frames[i] = 0;
+}
+
+/* Have we allocated enough to amortize a collection? */
+GC_bool GC_should_collect()
+{
+ return(GC_adj_words_allocd() >= min_words_allocd());
+}
+
+void GC_notify_full_gc()
+{
+ if (GC_start_call_back != (void (*)())0) {
+ (*GC_start_call_back)();
+ }
+}
+
+/*
+ * Initiate a garbage collection if appropriate.
+ * Choose judiciously
+ * between partial, full, and stop-world collections.
+ * Assumes lock held, signals disabled.
+ */
+void GC_maybe_gc()
+{
+ static int n_partial_gcs = 0;
+ if (GC_should_collect()) {
+ if (!GC_incremental) {
+ GC_notify_full_gc();
+ GC_gcollect_inner();
+ n_partial_gcs = 0;
+ return;
+ } else if (n_partial_gcs >= GC_full_freq) {
+# ifdef PRINTSTATS
+ GC_printf2(
+ "***>Full mark for collection %lu after %ld allocd bytes\n",
+ (unsigned long) GC_gc_no+1,
+ (long)WORDS_TO_BYTES(GC_words_allocd));
+# endif
+ GC_promote_black_lists();
+ (void)GC_reclaim_all((GC_stop_func)0, TRUE);
+ GC_clear_marks();
+ n_partial_gcs = 0;
+ GC_notify_full_gc();
+ } else {
+ n_partial_gcs++;
+ }
+ /* We try to mark with the world stopped. */
+ /* If we run out of time, this turns into */
+ /* incremental marking. */
+#ifndef NO_CLOCK
+ GET_TIME(GC_start_time);
+#endif
+ if (GC_stopped_mark(GC_timeout_stop_func)) {
+# ifdef SAVE_CALL_CHAIN
+ GC_save_callers(GC_last_stack);
+# endif
+ GC_finish_collection();
+ }
+ }
+}
+
+
+/*
+ * Stop the world garbage collection. Assumes lock held, signals disabled.
+ * If stop_func is not GC_never_stop_func, then abort if stop_func returns TRUE.
+ */
+GC_bool GC_try_to_collect_inner(stop_func)
+GC_stop_func stop_func;
+{
+ if (GC_collection_in_progress()) {
+# ifdef PRINTSTATS
+ GC_printf0(
+ "GC_try_to_collect_inner: finishing collection in progress\n");
+# endif /* PRINTSTATS */
+ /* Just finish collection already in progress. */
+ while(GC_collection_in_progress()) {
+ if (stop_func()) return(FALSE);
+ GC_collect_a_little_inner(1);
+ }
+ }
+# ifdef PRINTSTATS
+ GC_printf2(
+ "Initiating full world-stop collection %lu after %ld allocd bytes\n",
+ (unsigned long) GC_gc_no+1,
+ (long)WORDS_TO_BYTES(GC_words_allocd));
+# endif
+ GC_promote_black_lists();
+ /* Make sure all blocks have been reclaimed, so sweep routines */
+ /* don't see cleared mark bits. */
+ /* If we're guaranteed to finish, then this is unnecessary. */
+ if (stop_func != GC_never_stop_func
+ && !GC_reclaim_all(stop_func, FALSE)) {
+ /* Aborted. So far everything is still consistent. */
+ return(FALSE);
+ }
+ GC_invalidate_mark_state(); /* Flush mark stack. */
+ GC_clear_marks();
+# ifdef SAVE_CALL_CHAIN
+ GC_save_callers(GC_last_stack);
+# endif
+ if (!GC_stopped_mark(stop_func)) {
+ if (!GC_incremental) {
+ /* We're partially done and have no way to complete or use */
+ /* current work. Reestablish invariants as cheaply as */
+ /* possible. */
+ GC_invalidate_mark_state();
+ GC_unpromote_black_lists();
+ } /* else we claim the world is already still consistent. We'll */
+ /* finish incrementally. */
+ return(FALSE);
+ }
+ GC_finish_collection();
+ return(TRUE);
+}
+
+
+
+/*
+ * Perform n units of garbage collection work. A unit is intended to touch
+ * roughly a GC_RATE pages. Every once in a while, we do more than that.
+ */
+# define GC_RATE 8
+
+int GC_deficit = 0; /* The number of extra calls to GC_mark_some */
+ /* that we have made. */
+ /* Negative values are equivalent to 0. */
+
+void GC_collect_a_little_inner(n)
+int n;
+{
+ register int i;
+
+ if (GC_collection_in_progress()) {
+ for (i = GC_deficit; i < GC_RATE*n; i++) {
+ if (GC_mark_some()) {
+ /* Need to finish a collection */
+# ifdef SAVE_CALL_CHAIN
+ GC_save_callers(GC_last_stack);
+# endif
+ (void) GC_stopped_mark(GC_never_stop_func);
+ GC_finish_collection();
+ break;
+ }
+ }
+ if (GC_deficit > 0) GC_deficit -= GC_RATE*n;
+ } else {
+ GC_maybe_gc();
+ }
+}
+
+int GC_collect_a_little GC_PROTO(())
+{
+ int result;
+ DCL_LOCK_STATE;
+
+ DISABLE_SIGNALS();
+ LOCK();
+ GC_collect_a_little_inner(1);
+ result = (int)GC_collection_in_progress();
+ UNLOCK();
+ ENABLE_SIGNALS();
+ return(result);
+}
+
+/*
+ * Assumes lock is held, signals are disabled.
+ * We stop the world.
+ * If final is TRUE, then we finish the collection, no matter how long
+ * it takes.
+ * Otherwise we may fail and return FALSE if this takes too long.
+ * Increment GC_gc_no if we succeed.
+ */
+GC_bool GC_stopped_mark(stop_func)
+GC_stop_func stop_func;
+{
+ register int i;
+# ifdef PRINTSTATS
+ CLOCK_TYPE start_time, current_time;
+# endif
+
+ STOP_WORLD();
+# ifdef PRINTSTATS
+ GET_TIME(start_time);
+ GC_printf1("--> Marking for collection %lu ",
+ (unsigned long) GC_gc_no + 1);
+ GC_printf2("after %lu allocd bytes + %lu wasted bytes\n",
+ (unsigned long) WORDS_TO_BYTES(GC_words_allocd),
+ (unsigned long) WORDS_TO_BYTES(GC_words_wasted));
+# endif
+
+ /* Mark from all roots. */
+ /* Minimize junk left in my registers and on the stack */
+ GC_clear_a_few_frames();
+ GC_noop(0,0,0,0,0,0);
+ GC_initiate_gc();
+ for(i = 0;;i++) {
+ if ((*stop_func)()) {
+# ifdef PRINTSTATS
+ GC_printf0("Abandoned stopped marking after ");
+ GC_printf1("%lu iterations\n",
+ (unsigned long)i);
+# endif
+ GC_deficit = i; /* Give the mutator a chance. */
+ START_WORLD();
+ return(FALSE);
+ }
+ if (GC_mark_some()) break;
+ }
+
+ GC_gc_no++;
+# ifdef PRINTSTATS
+ GC_printf2("Collection %lu reclaimed %ld bytes",
+ (unsigned long) GC_gc_no - 1,
+ (long)WORDS_TO_BYTES(GC_mem_found));
+ GC_printf1(" ---> heapsize = %lu bytes\n",
+ (unsigned long) GC_heapsize);
+ /* Printf arguments may be pushed in funny places. Clear the */
+ /* space. */
+ GC_printf0("");
+# endif
+
+ /* Check all debugged objects for consistency */
+ if (GC_debugging_started) {
+ (*GC_check_heap)();
+ }
+
+# ifdef PRINTTIMES
+ GET_TIME(current_time);
+ GC_printf1("World-stopped marking took %lu msecs\n",
+ MS_TIME_DIFF(current_time,start_time));
+# endif
+ START_WORLD();
+ return(TRUE);
+}
+
+
+/* Finish up a collection. Assumes lock is held, signals are disabled, */
+/* but the world is otherwise running. */
+void GC_finish_collection()
+{
+# ifdef PRINTTIMES
+ CLOCK_TYPE start_time;
+ CLOCK_TYPE finalize_time;
+ CLOCK_TYPE done_time;
+
+ GET_TIME(start_time);
+ finalize_time = start_time;
+# endif
+
+# ifdef GATHERSTATS
+ GC_mem_found = 0;
+# endif
+# ifdef FIND_LEAK
+ /* Mark all objects on the free list. All objects should be */
+ /* marked when we're done. */
+ {
+ register word size; /* current object size */
+ register ptr_t p; /* pointer to current object */
+ register struct hblk * h; /* pointer to block containing *p */
+ register hdr * hhdr;
+ register int word_no; /* "index" of *p in *q */
+ int kind;
+
+ for (kind = 0; kind < GC_n_kinds; kind++) {
+ for (size = 1; size <= MAXOBJSZ; size++) {
+ for (p= GC_obj_kinds[kind].ok_freelist[size];
+ p != 0; p=obj_link(p)){
+ h = HBLKPTR(p);
+ hhdr = HDR(h);
+ word_no = (((word *)p) - ((word *)h));
+ set_mark_bit_from_hdr(hhdr, word_no);
+ }
+ }
+ }
+ }
+ /* Check that everything is marked */
+ GC_start_reclaim(TRUE);
+# else
+
+ GC_finalize();
+# ifdef STUBBORN_ALLOC
+ GC_clean_changing_list();
+# endif
+
+# ifdef PRINTTIMES
+ GET_TIME(finalize_time);
+# endif
+
+ /* Clear free list mark bits, in case they got accidentally marked */
+ /* Note: HBLKPTR(p) == pointer to head of block containing *p */
+ /* Also subtract memory remaining from GC_mem_found count. */
+ /* Note that composite objects on free list are cleared. */
+ /* Thus accidentally marking a free list is not a problem; only */
+ /* objects on the list itself will be marked, and that's fixed here. */
+ {
+ register word size; /* current object size */
+ register ptr_t p; /* pointer to current object */
+ register struct hblk * h; /* pointer to block containing *p */
+ register hdr * hhdr;
+ register int word_no; /* "index" of *p in *q */
+ int kind;
+
+ for (kind = 0; kind < GC_n_kinds; kind++) {
+ for (size = 1; size <= MAXOBJSZ; size++) {
+ for (p= GC_obj_kinds[kind].ok_freelist[size];
+ p != 0; p=obj_link(p)){
+ h = HBLKPTR(p);
+ hhdr = HDR(h);
+ word_no = (((word *)p) - ((word *)h));
+ clear_mark_bit_from_hdr(hhdr, word_no);
+# ifdef GATHERSTATS
+ GC_mem_found -= size;
+# endif
+ }
+ }
+ }
+ }
+
+
+# ifdef PRINTSTATS
+ GC_printf1("Bytes recovered before sweep - f.l. count = %ld\n",
+ (long)WORDS_TO_BYTES(GC_mem_found));
+# endif
+
+ /* Reconstruct free lists to contain everything not marked */
+ GC_start_reclaim(FALSE);
+
+# endif /* !FIND_LEAK */
+
+# ifdef PRINTSTATS
+ GC_printf2(
+ "Immediately reclaimed %ld bytes in heap of size %lu bytes\n",
+ (long)WORDS_TO_BYTES(GC_mem_found),
+ (unsigned long)GC_heapsize);
+ GC_printf2("%lu (atomic) + %lu (composite) collectable bytes in use\n",
+ (unsigned long)WORDS_TO_BYTES(GC_atomic_in_use),
+ (unsigned long)WORDS_TO_BYTES(GC_composite_in_use));
+# endif
+
+ /* Reset or increment counters for next cycle */
+ GC_words_allocd_before_gc += GC_words_allocd;
+ GC_non_gc_bytes_at_gc = GC_non_gc_bytes;
+ GC_words_allocd = 0;
+ GC_words_wasted = 0;
+ GC_mem_freed = 0;
+
+# ifdef PRINTTIMES
+ GET_TIME(done_time);
+ GC_printf2("Finalize + initiate sweep took %lu + %lu msecs\n",
+ MS_TIME_DIFF(finalize_time,start_time),
+ MS_TIME_DIFF(done_time,finalize_time));
+# endif
+}
+
+/* Externally callable routine to invoke full, stop-world collection */
+# if defined(__STDC__) || defined(__cplusplus)
+ int GC_try_to_collect(GC_stop_func stop_func)
+# else
+ int GC_try_to_collect(stop_func)
+ GC_stop_func stop_func;
+# endif
+{
+ int result;
+ DCL_LOCK_STATE;
+
+ GC_INVOKE_FINALIZERS();
+ DISABLE_SIGNALS();
+ LOCK();
+ ENTER_GC();
+ if (!GC_is_initialized) GC_init_inner();
+ /* Minimize junk left in my registers */
+ GC_noop(0,0,0,0,0,0);
+ result = (int)GC_try_to_collect_inner(stop_func);
+ EXIT_GC();
+ UNLOCK();
+ ENABLE_SIGNALS();
+ if(result) GC_INVOKE_FINALIZERS();
+ return(result);
+}
+
+void GC_gcollect GC_PROTO(())
+{
+ GC_notify_full_gc();
+ (void)GC_try_to_collect(GC_never_stop_func);
+}
+
+word GC_n_heap_sects = 0; /* Number of sections currently in heap. */
+
+/*
+ * Use the chunk of memory starting at p of syze bytes as part of the heap.
+ * Assumes p is HBLKSIZE aligned, and bytes is a multiple of HBLKSIZE.
+ */
+void GC_add_to_heap(p, bytes)
+struct hblk *p;
+word bytes;
+{
+ word words;
+
+ if (GC_n_heap_sects >= MAX_HEAP_SECTS) {
+ ABORT("Too many heap sections: Increase MAXHINCR or MAX_HEAP_SECTS");
+ }
+ if (!GC_install_header(p)) {
+ /* This is extremely unlikely. Can't add it. This will */
+ /* almost certainly result in a 0 return from the allocator, */
+ /* which is entirely appropriate. */
+ return;
+ }
+ GC_heap_sects[GC_n_heap_sects].hs_start = (ptr_t)p;
+ GC_heap_sects[GC_n_heap_sects].hs_bytes = bytes;
+ GC_n_heap_sects++;
+ words = BYTES_TO_WORDS(bytes - HDR_BYTES);
+ HDR(p) -> hb_sz = words;
+ GC_freehblk(p);
+ GC_heapsize += bytes;
+ if ((ptr_t)p <= GC_least_plausible_heap_addr
+ || GC_least_plausible_heap_addr == 0) {
+ GC_least_plausible_heap_addr = (ptr_t)p - sizeof(word);
+ /* Making it a little smaller than necessary prevents */
+ /* us from getting a false hit from the variable */
+ /* itself. There's some unintentional reflection */
+ /* here. */
+ }
+ if ((ptr_t)p + bytes >= GC_greatest_plausible_heap_addr) {
+ GC_greatest_plausible_heap_addr = (ptr_t)p + bytes;
+ }
+}
+
+#ifdef PRESERVE_LAST
+GC_bool GC_in_last_heap_sect(p)
+ptr_t p;
+{
+ struct HeapSect * last_heap_sect = &(GC_heap_sects[GC_n_heap_sects-1]);
+ ptr_t start = last_heap_sect -> hs_start;
+ ptr_t end;
+
+ if (p < start) return FALSE;
+ end = start + last_heap_sect -> hs_bytes;
+ if (p >= end) return FALSE;
+ return TRUE;
+}
+#endif
+
+# if !defined(NO_DEBUGGING)
+void GC_print_heap_sects()
+{
+ register unsigned i;
+
+ GC_printf1("Total heap size: %lu\n", (unsigned long) GC_heapsize);
+ for (i = 0; i < GC_n_heap_sects; i++) {
+ unsigned long start = (unsigned long) GC_heap_sects[i].hs_start;
+ unsigned long len = (unsigned long) GC_heap_sects[i].hs_bytes;
+ struct hblk *h;
+ unsigned nbl = 0;
+
+ GC_printf3("Section %ld from 0x%lx to 0x%lx ", (unsigned long)i,
+ start, (unsigned long)(start + len));
+ for (h = (struct hblk *)start; h < (struct hblk *)(start + len); h++) {
+ if (GC_is_black_listed(h, HBLKSIZE)) nbl++;
+ }
+ GC_printf2("%lu/%lu blacklisted\n", (unsigned long)nbl,
+ (unsigned long)(len/HBLKSIZE));
+ }
+}
+# endif
+
+ptr_t GC_least_plausible_heap_addr = (ptr_t)ONES;
+ptr_t GC_greatest_plausible_heap_addr = 0;
+
+ptr_t GC_max(x,y)
+ptr_t x, y;
+{
+ return(x > y? x : y);
+}
+
+ptr_t GC_min(x,y)
+ptr_t x, y;
+{
+ return(x < y? x : y);
+}
+
+# if defined(__STDC__) || defined(__cplusplus)
+ void GC_set_max_heap_size(GC_word n)
+# else
+ void GC_set_max_heap_size(n)
+ GC_word n;
+# endif
+{
+ GC_max_heapsize = n;
+}
+
+GC_word GC_max_retries = 0;
+
+/*
+ * this explicitly increases the size of the heap. It is used
+ * internally, but may also be invoked from GC_expand_hp by the user.
+ * The argument is in units of HBLKSIZE.
+ * Tiny values of n are rounded up.
+ * Returns FALSE on failure.
+ */
+GC_bool GC_expand_hp_inner(n)
+word n;
+{
+ word bytes;
+ struct hblk * space;
+ word expansion_slop; /* Number of bytes by which we expect the */
+ /* heap to expand soon. */
+
+ if (n < MINHINCR) n = MINHINCR;
+ bytes = n * HBLKSIZE;
+ /* Make sure bytes is a multiple of GC_page_size */
+ {
+ word mask = GC_page_size - 1;
+ bytes += mask;
+ bytes &= ~mask;
+ }
+
+ if (GC_max_heapsize != 0 && GC_heapsize + bytes > GC_max_heapsize) {
+ /* Exceeded self-imposed limit */
+ return(FALSE);
+ }
+ space = GET_MEM(bytes);
+ if( space == 0 ) {
+ return(FALSE);
+ }
+# ifdef PRINTSTATS
+ GC_printf2("Increasing heap size by %lu after %lu allocated bytes\n",
+ (unsigned long)bytes,
+ (unsigned long)WORDS_TO_BYTES(GC_words_allocd));
+# ifdef UNDEFINED
+ GC_printf1("Root size = %lu\n", GC_root_size);
+ GC_print_block_list(); GC_print_hblkfreelist();
+ GC_printf0("\n");
+# endif
+# endif
+ expansion_slop = 8 * WORDS_TO_BYTES(min_words_allocd());
+ if (5 * HBLKSIZE * MAXHINCR > expansion_slop) {
+ expansion_slop = 5 * HBLKSIZE * MAXHINCR;
+ }
+ if (GC_last_heap_addr == 0 && !((word)space & SIGNB)
+ || GC_last_heap_addr != 0 && GC_last_heap_addr < (ptr_t)space) {
+ /* Assume the heap is growing up */
+ GC_greatest_plausible_heap_addr =
+ GC_max(GC_greatest_plausible_heap_addr,
+ (ptr_t)space + bytes + expansion_slop);
+ } else {
+ /* Heap is growing down */
+ GC_least_plausible_heap_addr =
+ GC_min(GC_least_plausible_heap_addr,
+ (ptr_t)space - expansion_slop);
+ }
+ GC_prev_heap_addr = GC_last_heap_addr;
+ GC_last_heap_addr = (ptr_t)space;
+ GC_add_to_heap(space, bytes);
+ return(TRUE);
+}
+
+/* Really returns a bool, but it's externally visible, so that's clumsy. */
+/* Arguments is in bytes. */
+# if defined(__STDC__) || defined(__cplusplus)
+ int GC_expand_hp(size_t bytes)
+# else
+ int GC_expand_hp(bytes)
+ size_t bytes;
+# endif
+{
+ int result;
+ DCL_LOCK_STATE;
+
+ DISABLE_SIGNALS();
+ LOCK();
+ if (!GC_is_initialized) GC_init_inner();
+ result = (int)GC_expand_hp_inner(divHBLKSZ((word)bytes));
+ UNLOCK();
+ ENABLE_SIGNALS();
+ return(result);
+}
+
+unsigned GC_fail_count = 0;
+ /* How many consecutive GC/expansion failures? */
+ /* Reset by GC_allochblk. */
+
+GC_bool GC_collect_or_expand(needed_blocks, ignore_off_page)
+word needed_blocks;
+GC_bool ignore_off_page;
+{
+
+ if (!GC_incremental && !GC_dont_gc && GC_should_collect()) {
+ GC_notify_full_gc();
+ GC_gcollect_inner();
+ } else {
+ word blocks_to_get = GC_heapsize/(HBLKSIZE*GC_free_space_divisor)
+ + needed_blocks;
+
+ if (blocks_to_get > MAXHINCR) {
+ word slop;
+
+ if (ignore_off_page) {
+ slop = 4;
+ } else {
+ slop = 2*divHBLKSZ(BL_LIMIT);
+ if (slop > needed_blocks) slop = needed_blocks;
+ }
+ if (needed_blocks + slop > MAXHINCR) {
+ blocks_to_get = needed_blocks + slop;
+ } else {
+ blocks_to_get = MAXHINCR;
+ }
+ }
+ if (!GC_expand_hp_inner(blocks_to_get)
+ && !GC_expand_hp_inner(needed_blocks)) {
+ if (GC_fail_count++ < GC_max_retries) {
+ WARN("Out of Memory! Trying to continue ...\n", 0);
+ GC_notify_full_gc();
+ GC_gcollect_inner();
+ } else {
+ WARN("Out of Memory! Returning NIL!\n", 0);
+ return(FALSE);
+ }
+ } else if (GC_fail_count) {
+# ifdef PRINTSTATS
+ GC_printf0("Memory available again ...\n");
+# endif
+ }
+ }
+ return(TRUE);
+}
+
+/*
+ * Make sure the object free list for sz is not empty.
+ * Return a pointer to the first object on the free list.
+ * The object MUST BE REMOVED FROM THE FREE LIST BY THE CALLER.
+ * Assumes we hold the allocator lock and signals are disabled.
+ *
+ */
+ptr_t GC_allocobj(sz, kind)
+word sz;
+int kind;
+{
+ register ptr_t * flh = &(GC_obj_kinds[kind].ok_freelist[sz]);
+
+ if (sz == 0) return(0);
+
+ while (*flh == 0) {
+ ENTER_GC();
+ /* Do our share of marking work */
+ if(GC_incremental && !GC_dont_gc) GC_collect_a_little_inner(1);
+ /* Sweep blocks for objects of this size */
+ GC_continue_reclaim(sz, kind);
+ EXIT_GC();
+ if (*flh == 0) {
+ GC_new_hblk(sz, kind);
+ }
+ if (*flh == 0) {
+ ENTER_GC();
+ if (!GC_collect_or_expand((word)1,FALSE)) {
+ EXIT_GC();
+ return(0);
+ }
+ EXIT_GC();
+ }
+ }
+
+ return(*flh);
+}
diff --git a/boehm-gc/alpha_mach_dep.s b/boehm-gc/alpha_mach_dep.s
new file mode 100644
index 00000000000..eed3998914a
--- /dev/null
+++ b/boehm-gc/alpha_mach_dep.s
@@ -0,0 +1,59 @@
+
+# define call_push(x) \
+ lda $16, 0(x); /* copy x to first argument register */ \
+ jsr $26, GC_push_one; /* call GC_push_one, ret addr in $26 */ \
+ ldgp $gp, 0($26) /* restore $gp register from $ra */
+
+ .text
+ .align 4
+ .globl GC_push_regs
+ .ent GC_push_regs 2
+GC_push_regs:
+ ldgp $gp, 0($27) # set gp from the procedure value reg
+ lda $sp, -32($sp) # make stack frame
+ stq $26, 8($sp) # save return address
+ .mask 0x04000000, -8
+ .frame $sp, 16, $26, 0
+
+ # call_push($0) # expression eval and int func result
+
+ # call_push($1) # temp regs - not preserved cross calls
+ # call_push($2)
+ # call_push($3)
+ # call_push($4)
+ # call_push($5)
+ # call_push($6)
+ # call_push($7)
+ # call_push($8)
+
+ call_push($9) # Saved regs
+ call_push($10)
+ call_push($11)
+ call_push($12)
+ call_push($13)
+ call_push($14)
+
+ call_push($15) # frame ptr or saved reg
+
+ # call_push($16) # argument regs - not preserved cross calls
+ # call_push($17)
+ # call_push($18)
+ # call_push($19)
+ # call_push($20)
+ # call_push($21)
+
+ # call_push($22) # temp regs - not preserved cross calls
+ # call_push($23)
+ # call_push($24)
+ # call_push($25)
+
+ # call_push($26) # return address - expression eval
+ # call_push($27) # procedure value or temporary reg
+ # call_push($28) # assembler temp - not presrved
+ call_push($29) # Global Pointer
+ # call_push($30) # Stack Pointer
+
+ ldq $26, 8($sp) # restore return address
+ lda $sp, 32($sp) # pop stack frame
+ ret $31, ($26), 1 # return ($31 == hardwired zero)
+ .end GC_push_regs
diff --git a/boehm-gc/barrett_diagram b/boehm-gc/barrett_diagram
new file mode 100644
index 00000000000..27e80dc15cd
--- /dev/null
+++ b/boehm-gc/barrett_diagram
@@ -0,0 +1,106 @@
+This is an ASCII diagram of the data structure used to check pointer
+validity. It was provided by Dave Barrett <barrett@asgard.cs.colorado.edu>,
+and should be of use to others attempting to understand the code.
+The data structure in GC4.X is essentially the same. -HB
+
+
+
+
+ Data Structure used by GC_base in gc3.7:
+ 21-Apr-94
+
+
+
+
+ 63 LOG_TOP_SZ[11] LOG_BOTTOM_SZ[10] LOG_HBLKSIZE[13]
+ +------------------+----------------+------------------+------------------+
+ p:| | TL_HASH(hi) | | HBLKDISPL(p) |
+ +------------------+----------------+------------------+------------------+
+ \-----------------------HBLKPTR(p)-------------------/
+ \------------hi-------------------/
+ \______ ________/ \________ _______/ \________ _______/
+ V V V
+ | | |
+ GC_top_index[] | | |
+ --- +--------------+ | | |
+ ^ | | | | |
+ | | | | | |
+ TOP +--------------+<--+ | |
+ _SZ +-<| [] | * | |
+(items)| +--------------+ if 0 < bi< HBLKSIZE | |
+ | | | | then large object | |
+ | | | | starts at the bi'th | |
+ v | | | HBLK before p. | i |
+ --- | +--------------+ | (word- |
+ v | aligned) |
+ bi= |GET_BI(p){->hash_link}->key==hi | |
+ v | |
+ | (bottom_index) \ scratch_alloc'd | |
+ | ( struct bi ) / by get_index() | |
+ --- +->+--------------+ | |
+ ^ | | | |
+ ^ | | | |
+ BOTTOM | | ha=GET_HDR_ADDR(p) | |
+_SZ(items)+--------------+<----------------------+ +-------+
+ | +--<| index[] | |
+ | | +--------------+ GC_obj_map: v
+ | | | | from / +-+-+-----+-+-+-+-+ ---
+ v | | | GC_add < 0| | | | | | | | ^
+ --- | +--------------+ _map_entry \ +-+-+-----+-+-+-+-+ |
+ | | asc_link | +-+-+-----+-+-+-+-+ MAXOBJSZ
+ | +--------------+ +-->| | | j | | | | | +1
+ | | key | | +-+-+-----+-+-+-+-+ |
+ | +--------------+ | +-+-+-----+-+-+-+-+ |
+ | | hash_link | | | | | | | | | | v
+ | +--------------+ | +-+-+-----+-+-+-+-+ ---
+ | | |<--MAX_OFFSET--->|
+ | | (bytes)
+HDR(p)| GC_find_header(p) | |<--MAP_ENTRIES-->|
+ | \ from | =HBLKSIZE/WORDSZ
+ | (hdr) (struct hblkhdr) / alloc_hdr() | (1024 on Alpha)
+ +-->+----------------------+ | (8/16 bits each)
+GET_HDR(p)| word hb_sz (words) | |
+ +----------------------+ |
+ | struct hblk *hb_next | |
+ +----------------------+ |
+ |mark_proc hb_mark_proc| |
+ +----------------------+ |
+ | char * hb_map |>-------------+
+ +----------------------+
+ | ushort hb_obj_kind |
+ +----------------------+
+ | hb_last_reclaimed |
+ --- +----------------------+
+ ^ | |
+ MARK_BITS| hb_marks[] | *if hdr is free, hb_sz + DISCARD_WORDS
+_SZ(words)| | is the size of a heap chunk (struct hblk)
+ v | | of at least MININCR*HBLKSIZE bytes (below),
+ --- +----------------------+ otherwise, size of each object in chunk.
+
+Dynamic data structures above are interleaved throughout the heap in blocks of
+size MININCR * HBLKSIZE bytes as done by gc_scratch_alloc which cannot be
+freed; free lists are used (e.g. alloc_hdr). HBLKs's below are collected.
+
+ (struct hblk)
+ --- +----------------------+ < HBLKSIZE --- --- DISCARD_
+ ^ |garbage[DISCARD_WORDS]| aligned ^ ^ HDR_BYTES WORDS
+ | | | | v (bytes) (words)
+ | +-----hb_body----------+ < WORDSZ | --- ---
+ | | | aligned | ^ ^
+ | | Object 0 | | hb_sz |
+ | | | i |(word- (words)|
+ | | | (bytes)|aligned) v |
+ | + - - - - - - - - - - -+ --- | --- |
+ | | | ^ | ^ |
+ n * | | j (words) | hb_sz BODY_SZ
+ HBLKSIZE | Object 1 | v v | (words)
+ (bytes) | |--------------- v MAX_OFFSET
+ | + - - - - - - - - - - -+ --- (bytes)
+ | | | !All_INTERIOR_PTRS ^ |
+ | | | sets j only for hb_sz |
+ | | Object N | valid object offsets. | |
+ v | | All objects WORDSZ v v
+ --- +----------------------+ aligned. --- ---
+
+DISCARD_WORDS is normally zero. Indeed the collector has not been tested
+with another value in ages.
diff --git a/boehm-gc/blacklst.c b/boehm-gc/blacklst.c
new file mode 100644
index 00000000000..44455e5ba47
--- /dev/null
+++ b/boehm-gc/blacklst.c
@@ -0,0 +1,286 @@
+/*
+ * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+/* Boehm, August 9, 1995 6:09 pm PDT */
+# include "gc_priv.h"
+
+/*
+ * We maintain several hash tables of hblks that have had false hits.
+ * Each contains one bit per hash bucket; If any page in the bucket
+ * has had a false hit, we assume that all of them have.
+ * See the definition of page_hash_table in gc_private.h.
+ * False hits from the stack(s) are much more dangerous than false hits
+ * from elsewhere, since the former can pin a large object that spans the
+ * block, eventhough it does not start on the dangerous block.
+ */
+
+/*
+ * Externally callable routines are:
+
+ * GC_add_to_black_list_normal
+ * GC_add_to_black_list_stack
+ * GC_promote_black_lists
+ * GC_is_black_listed
+ *
+ * All require that the allocator lock is held.
+ */
+
+/* Pointers to individual tables. We replace one table by another by */
+/* switching these pointers. */
+word * GC_old_normal_bl;
+ /* Nonstack false references seen at last full */
+ /* collection. */
+word * GC_incomplete_normal_bl;
+ /* Nonstack false references seen since last */
+ /* full collection. */
+word * GC_old_stack_bl;
+word * GC_incomplete_stack_bl;
+
+word GC_total_stack_black_listed;
+
+word GC_black_list_spacing = MINHINCR*HBLKSIZE; /* Initial rough guess */
+
+void GC_clear_bl();
+
+void GC_default_print_heap_obj_proc(p)
+ptr_t p;
+{
+ ptr_t base = GC_base(p);
+
+ GC_err_printf2("start: 0x%lx, appr. length: %ld", base, GC_size(base));
+}
+
+void (*GC_print_heap_obj)(/* char * s, ptr_t p */) =
+ GC_default_print_heap_obj_proc;
+
+void GC_print_source_ptr(ptr_t p)
+{
+ ptr_t base = GC_base(p);
+ if (0 == base) {
+ GC_err_printf0("in root set");
+ } else {
+ GC_err_printf0("in object at ");
+ (*GC_print_heap_obj)(base);
+ }
+}
+
+void GC_bl_init()
+{
+# ifndef ALL_INTERIOR_POINTERS
+ GC_old_normal_bl = (word *)
+ GC_scratch_alloc((word)(sizeof (page_hash_table)));
+ GC_incomplete_normal_bl = (word *)GC_scratch_alloc
+ ((word)(sizeof(page_hash_table)));
+ if (GC_old_normal_bl == 0 || GC_incomplete_normal_bl == 0) {
+ GC_err_printf0("Insufficient memory for black list\n");
+ EXIT();
+ }
+ GC_clear_bl(GC_old_normal_bl);
+ GC_clear_bl(GC_incomplete_normal_bl);
+# endif
+ GC_old_stack_bl = (word *)GC_scratch_alloc((word)(sizeof(page_hash_table)));
+ GC_incomplete_stack_bl = (word *)GC_scratch_alloc
+ ((word)(sizeof(page_hash_table)));
+ if (GC_old_stack_bl == 0 || GC_incomplete_stack_bl == 0) {
+ GC_err_printf0("Insufficient memory for black list\n");
+ EXIT();
+ }
+ GC_clear_bl(GC_old_stack_bl);
+ GC_clear_bl(GC_incomplete_stack_bl);
+}
+
+void GC_clear_bl(doomed)
+word *doomed;
+{
+ BZERO(doomed, sizeof(page_hash_table));
+}
+
+void GC_copy_bl(old, new)
+word *new, *old;
+{
+ BCOPY(old, new, sizeof(page_hash_table));
+}
+
+static word total_stack_black_listed();
+
+/* Signal the completion of a collection. Turn the incomplete black */
+/* lists into new black lists, etc. */
+void GC_promote_black_lists()
+{
+ word * very_old_normal_bl = GC_old_normal_bl;
+ word * very_old_stack_bl = GC_old_stack_bl;
+
+ GC_old_normal_bl = GC_incomplete_normal_bl;
+ GC_old_stack_bl = GC_incomplete_stack_bl;
+# ifndef ALL_INTERIOR_POINTERS
+ GC_clear_bl(very_old_normal_bl);
+# endif
+ GC_clear_bl(very_old_stack_bl);
+ GC_incomplete_normal_bl = very_old_normal_bl;
+ GC_incomplete_stack_bl = very_old_stack_bl;
+ GC_total_stack_black_listed = total_stack_black_listed();
+# ifdef PRINTSTATS
+ GC_printf1("%ld bytes in heap blacklisted for interior pointers\n",
+ (unsigned long)GC_total_stack_black_listed);
+# endif
+ if (GC_total_stack_black_listed != 0) {
+ GC_black_list_spacing =
+ HBLKSIZE*(GC_heapsize/GC_total_stack_black_listed);
+ }
+ if (GC_black_list_spacing < 3 * HBLKSIZE) {
+ GC_black_list_spacing = 3 * HBLKSIZE;
+ }
+}
+
+void GC_unpromote_black_lists()
+{
+# ifndef ALL_INTERIOR_POINTERS
+ GC_copy_bl(GC_old_normal_bl, GC_incomplete_normal_bl);
+# endif
+ GC_copy_bl(GC_old_stack_bl, GC_incomplete_stack_bl);
+}
+
+# ifndef ALL_INTERIOR_POINTERS
+/* P is not a valid pointer reference, but it falls inside */
+/* the plausible heap bounds. */
+/* Add it to the normal incomplete black list if appropriate. */
+#ifdef PRINT_BLACK_LIST
+ void GC_add_to_black_list_normal(p, source)
+ ptr_t source;
+#else
+ void GC_add_to_black_list_normal(p)
+#endif
+word p;
+{
+ if (!(GC_modws_valid_offsets[p & (sizeof(word)-1)])) return;
+ {
+ register int index = PHT_HASH(p);
+
+ if (HDR(p) == 0 || get_pht_entry_from_index(GC_old_normal_bl, index)) {
+# ifdef PRINT_BLACK_LIST
+ if (!get_pht_entry_from_index(GC_incomplete_normal_bl, index)) {
+ GC_err_printf2(
+ "Black listing (normal) 0x%lx referenced from 0x%lx ",
+ (unsigned long) p, (unsigned long) source);
+ GC_print_source_ptr(source);
+ GC_err_puts("\n");
+ }
+# endif
+ set_pht_entry_from_index(GC_incomplete_normal_bl, index);
+ } /* else this is probably just an interior pointer to an allocated */
+ /* object, and isn't worth black listing. */
+ }
+}
+# endif
+
+/* And the same for false pointers from the stack. */
+#ifdef PRINT_BLACK_LIST
+ void GC_add_to_black_list_stack(p, source)
+ ptr_t source;
+#else
+ void GC_add_to_black_list_stack(p)
+#endif
+word p;
+{
+ register int index = PHT_HASH(p);
+
+ if (HDR(p) == 0 || get_pht_entry_from_index(GC_old_stack_bl, index)) {
+# ifdef PRINT_BLACK_LIST
+ if (!get_pht_entry_from_index(GC_incomplete_stack_bl, index)) {
+ GC_err_printf2(
+ "Black listing (stack) 0x%lx referenced from 0x%lx ",
+ (unsigned long)p, (unsigned long)source);
+ GC_print_source_ptr(source);
+ GC_err_puts("\n");
+ }
+# endif
+ set_pht_entry_from_index(GC_incomplete_stack_bl, index);
+ }
+}
+
+/*
+ * Is the block starting at h of size len bytes black listed? If so,
+ * return the address of the next plausible r such that (r, len) might not
+ * be black listed. (R may not actually be in the heap. We guarantee only
+ * that every smaller value of r after h is also black listed.)
+ * If (h,len) is not black listed, return 0.
+ * Knows about the structure of the black list hash tables.
+ */
+struct hblk * GC_is_black_listed(h, len)
+struct hblk * h;
+word len;
+{
+ register int index = PHT_HASH((word)h);
+ register word i;
+ word nblocks = divHBLKSZ(len);
+
+# ifndef ALL_INTERIOR_POINTERS
+ if (get_pht_entry_from_index(GC_old_normal_bl, index)
+ || get_pht_entry_from_index(GC_incomplete_normal_bl, index)) {
+ return(h+1);
+ }
+# endif
+
+ for (i = 0; ; ) {
+ if (GC_old_stack_bl[divWORDSZ(index)] == 0
+ && GC_incomplete_stack_bl[divWORDSZ(index)] == 0) {
+ /* An easy case */
+ i += WORDSZ - modWORDSZ(index);
+ } else {
+ if (get_pht_entry_from_index(GC_old_stack_bl, index)
+ || get_pht_entry_from_index(GC_incomplete_stack_bl, index)) {
+ return(h+i+1);
+ }
+ i++;
+ }
+ if (i >= nblocks) break;
+ index = PHT_HASH((word)(h+i));
+ }
+ return(0);
+}
+
+
+/* Return the number of blacklisted blocks in a given range. */
+/* Used only for statistical purposes. */
+/* Looks only at the GC_incomplete_stack_bl. */
+word GC_number_stack_black_listed(start, endp1)
+struct hblk *start, *endp1;
+{
+ register struct hblk * h;
+ word result = 0;
+
+ for (h = start; h < endp1; h++) {
+ register int index = PHT_HASH((word)h);
+
+ if (get_pht_entry_from_index(GC_old_stack_bl, index)) result++;
+ }
+ return(result);
+}
+
+
+/* Return the total number of (stack) black-listed bytes. */
+static word total_stack_black_listed()
+{
+ register unsigned i;
+ word total = 0;
+
+ for (i = 0; i < GC_n_heap_sects; i++) {
+ struct hblk * start = (struct hblk *) GC_heap_sects[i].hs_start;
+ word len = (word) GC_heap_sects[i].hs_bytes;
+ struct hblk * endp1 = start + len/HBLKSIZE;
+
+ total += GC_number_stack_black_listed(start, endp1);
+ }
+ return(total * HBLKSIZE);
+}
+
diff --git a/boehm-gc/callprocs b/boehm-gc/callprocs
new file mode 100755
index 00000000000..a8793f0b728
--- /dev/null
+++ b/boehm-gc/callprocs
@@ -0,0 +1,4 @@
+#!/bin/sh
+GC_DEBUG=1
+export GC_DEBUG
+$* 2>&1 | awk '{print "0x3e=c\""$0"\""};/^\t##PC##=/ {if ($2 != 0) {print $2"?i"}}' | adb $1 | sed "s/^ >/>/"
diff --git a/boehm-gc/checksums.c b/boehm-gc/checksums.c
new file mode 100644
index 00000000000..212655f4cd4
--- /dev/null
+++ b/boehm-gc/checksums.c
@@ -0,0 +1,201 @@
+/*
+ * Copyright (c) 1992-1994 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+/* Boehm, March 29, 1995 12:51 pm PST */
+# ifdef CHECKSUMS
+
+# include "gc_priv.h"
+
+/* This is debugging code intended to verify the results of dirty bit */
+/* computations. Works only in a single threaded environment. */
+/* We assume that stubborn objects are changed only when they are */
+/* enabled for writing. (Certain kinds of writing are actually */
+/* safe under other conditions.) */
+# define NSUMS 2000
+
+# define OFFSET 0x10000
+
+typedef struct {
+ GC_bool new_valid;
+ word old_sum;
+ word new_sum;
+ struct hblk * block; /* Block to which this refers + OFFSET */
+ /* to hide it from colector. */
+} page_entry;
+
+page_entry GC_sums [NSUMS];
+
+word GC_checksum(h)
+struct hblk *h;
+{
+ register word *p = (word *)h;
+ register word *lim = (word *)(h+1);
+ register word result = 0;
+
+ while (p < lim) {
+ result += *p++;
+ }
+ return(result | 0x80000000 /* doesn't look like pointer */);
+}
+
+# ifdef STUBBORN_ALLOC
+/* Check whether a stubborn object from the given block appears on */
+/* the appropriate free list. */
+GC_bool GC_on_free_list(h)
+struct hblk *h;
+{
+ register hdr * hhdr = HDR(h);
+ register int sz = hhdr -> hb_sz;
+ ptr_t p;
+
+ if (sz > MAXOBJSZ) return(FALSE);
+ for (p = GC_sobjfreelist[sz]; p != 0; p = obj_link(p)) {
+ if (HBLKPTR(p) == h) return(TRUE);
+ }
+ return(FALSE);
+}
+# endif
+
+int GC_n_dirty_errors;
+int GC_n_changed_errors;
+int GC_n_clean;
+int GC_n_dirty;
+
+void GC_update_check_page(h, index)
+struct hblk *h;
+int index;
+{
+ page_entry *pe = GC_sums + index;
+ register hdr * hhdr = HDR(h);
+
+ if (pe -> block != 0 && pe -> block != h + OFFSET) ABORT("goofed");
+ pe -> old_sum = pe -> new_sum;
+ pe -> new_sum = GC_checksum(h);
+# ifndef MSWIN32
+ if (pe -> new_sum != 0 && !GC_page_was_ever_dirty(h)) {
+ GC_printf1("GC_page_was_ever_dirty(0x%lx) is wrong\n",
+ (unsigned long)h);
+ }
+# endif
+ if (GC_page_was_dirty(h)) {
+ GC_n_dirty++;
+ } else {
+ GC_n_clean++;
+ }
+ if (pe -> new_valid && pe -> old_sum != pe -> new_sum) {
+ if (!GC_page_was_dirty(h) || !GC_page_was_ever_dirty(h)) {
+ /* Set breakpoint here */GC_n_dirty_errors++;
+ }
+# ifdef STUBBORN_ALLOC
+ if (!IS_FORWARDING_ADDR_OR_NIL(hhdr)
+ && hhdr -> hb_map != GC_invalid_map
+ && hhdr -> hb_obj_kind == STUBBORN
+ && !GC_page_was_changed(h)
+ && !GC_on_free_list(h)) {
+ /* if GC_on_free_list(h) then reclaim may have touched it */
+ /* without any allocations taking place. */
+ /* Set breakpoint here */GC_n_changed_errors++;
+ }
+# endif
+ }
+ pe -> new_valid = TRUE;
+ pe -> block = h + OFFSET;
+}
+
+word GC_bytes_in_used_blocks;
+
+void GC_add_block(h, dummy)
+struct hblk *h;
+word dummy;
+{
+ register hdr * hhdr = HDR(h);
+ register bytes = WORDS_TO_BYTES(hhdr -> hb_sz);
+
+ bytes += HDR_BYTES + HBLKSIZE-1;
+ bytes &= ~(HBLKSIZE-1);
+ GC_bytes_in_used_blocks += bytes;
+}
+
+void GC_check_blocks()
+{
+ word bytes_in_free_blocks = 0;
+ struct hblk * h = GC_hblkfreelist;
+ hdr * hhdr = HDR(h);
+ word sz;
+
+ GC_bytes_in_used_blocks = 0;
+ GC_apply_to_all_blocks(GC_add_block, (word)0);
+ while (h != 0) {
+ sz = hhdr -> hb_sz;
+ bytes_in_free_blocks += sz;
+ h = hhdr -> hb_next;
+ hhdr = HDR(h);
+ }
+ GC_printf2("GC_bytes_in_used_blocks = %ld, bytes_in_free_blocks = %ld ",
+ GC_bytes_in_used_blocks, bytes_in_free_blocks);
+ GC_printf1("GC_heapsize = %ld\n", GC_heapsize);
+ if (GC_bytes_in_used_blocks + bytes_in_free_blocks != GC_heapsize) {
+ GC_printf0("LOST SOME BLOCKS!!\n");
+ }
+}
+
+/* Should be called immediately after GC_read_dirty and GC_read_changed. */
+void GC_check_dirty()
+{
+ register int index;
+ register unsigned i;
+ register struct hblk *h;
+ register ptr_t start;
+
+ GC_check_blocks();
+
+ GC_n_dirty_errors = 0;
+ GC_n_changed_errors = 0;
+ GC_n_clean = 0;
+ GC_n_dirty = 0;
+
+ index = 0;
+ for (i = 0; i < GC_n_heap_sects; i++) {
+ start = GC_heap_sects[i].hs_start;
+ for (h = (struct hblk *)start;
+ h < (struct hblk *)(start + GC_heap_sects[i].hs_bytes);
+ h++) {
+ GC_update_check_page(h, index);
+ index++;
+ if (index >= NSUMS) goto out;
+ }
+ }
+out:
+ GC_printf2("Checked %lu clean and %lu dirty pages\n",
+ (unsigned long) GC_n_clean, (unsigned long) GC_n_dirty);
+ if (GC_n_dirty_errors > 0) {
+ GC_printf1("Found %lu dirty bit errors\n",
+ (unsigned long)GC_n_dirty_errors);
+ }
+ if (GC_n_changed_errors > 0) {
+ GC_printf1("Found %lu changed bit errors\n",
+ (unsigned long)GC_n_changed_errors);
+ GC_printf0("These may be benign (provoked by nonpointer changes)\n");
+# ifdef THREADS
+ GC_printf0(
+ "Also expect 1 per thread currently allocating a stubborn obj.\n");
+# endif
+ }
+}
+
+# else
+
+extern int GC_quiet;
+ /* ANSI C doesn't allow translation units to be empty. */
+ /* So we guarantee this one is nonempty. */
+
+# endif /* CHECKSUMS */
diff --git a/boehm-gc/config.h b/boehm-gc/config.h
new file mode 100644
index 00000000000..91337162930
--- /dev/null
+++ b/boehm-gc/config.h
@@ -0,0 +1,1009 @@
+/*
+ * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996 by Silicon Graphics. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+#ifndef CONFIG_H
+
+# define CONFIG_H
+
+/* Machine dependent parameters. Some tuning parameters can be found */
+/* near the top of gc_private.h. */
+
+/* Machine specific parts contributed by various people. See README file. */
+
+/* Determine the machine type: */
+# if defined(sun) && defined(mc68000)
+# define M68K
+# define SUNOS4
+# define mach_type_known
+# endif
+# if defined(hp9000s300)
+# define M68K
+# define HP
+# define mach_type_known
+# endif
+# if defined(__NetBSD__) && defined(m68k)
+# define M68K
+# define NETBSD
+# define mach_type_known
+# endif
+# if defined(vax)
+# define VAX
+# ifdef ultrix
+# define ULTRIX
+# else
+# define BSD
+# endif
+# define mach_type_known
+# endif
+# if defined(mips) || defined(__mips)
+# define MIPS
+# if defined(ultrix) || defined(__ultrix) || defined(__NetBSD__)
+# define ULTRIX
+# else
+# if defined(_SYSTYPE_SVR4) || defined(SYSTYPE_SVR4) || defined(__SYSTYPE_SVR4__)
+# define IRIX5 /* or IRIX 6.X */
+# else
+# define RISCOS /* or IRIX 4.X */
+# endif
+# endif
+# define mach_type_known
+# endif
+# if defined(sequent) && defined(i386)
+# define I386
+# define SEQUENT
+# define mach_type_known
+# endif
+# if defined(sun) && defined(i386)
+# define I386
+# define SUNOS5
+# define mach_type_known
+# endif
+# if (defined(__OS2__) || defined(__EMX__)) && defined(__32BIT__)
+# define I386
+# define OS2
+# define mach_type_known
+# endif
+# if defined(ibm032)
+# define RT
+# define mach_type_known
+# endif
+# if defined(sun) && (defined(sparc) || defined(__sparc))
+# define SPARC
+ /* Test for SunOS 5.x */
+# include <errno.h>
+# ifdef ECHRNG
+# define SUNOS5
+# else
+# define SUNOS4
+# endif
+# define mach_type_known
+# endif
+# if defined(sparc) && defined(unix) && !defined(sun)
+# define SPARC
+# define DRSNX
+# define mach_type_known
+# endif
+# if defined(_IBMR2)
+# define RS6000
+# define mach_type_known
+# endif
+# if defined(_M_XENIX) && defined(_M_SYSV) && defined(_M_I386)
+ /* The above test may need refinement */
+# define I386
+# if defined(_SCO_ELF)
+# define SCO_ELF
+# else
+# define SCO
+# endif
+# define mach_type_known
+# endif
+# if defined(_AUX_SOURCE)
+# define M68K
+# define SYSV
+# define mach_type_known
+# endif
+# if defined(_PA_RISC1_0) || defined(_PA_RISC1_1)
+# define HP_PA
+# define mach_type_known
+# endif
+# if defined(linux) && defined(i386)
+# define I386
+# define LINUX
+# define mach_type_known
+# endif
+# if defined(linux) && defined(powerpc)
+# define POWERPC
+# define LINUX
+# define mach_type_known
+# endif
+# if (defined(linux) || defined(__linux__)) && \
+ (defined(sparc) || defined(__sparc__))
+# define SPARC
+# define LINUX
+# define mach_type_known
+# endif
+# if defined(__alpha) || defined(__alpha__)
+# define ALPHA
+# if defined(linux) || defined(__linux__)
+# define LINUX
+# else
+# define OSF1 /* a.k.a Digital Unix */
+# endif
+# define mach_type_known
+# endif
+# if defined(_AMIGA)
+# define M68K
+# define AMIGA
+# define mach_type_known
+# endif
+# if defined(THINK_C) || defined(__MWERKS__) && !defined(__powerc)
+# define M68K
+# define MACOS
+# define mach_type_known
+# endif
+# if defined(__MWERKS__) && defined(__powerc)
+# define POWERPC
+# define MACOS
+# define mach_type_known
+# endif
+# if defined(NeXT) && defined(mc68000)
+# define M68K
+# define NEXT
+# define mach_type_known
+# endif
+# if defined(NeXT) && defined(i386)
+# define I386
+# define NEXT
+# define mach_type_known
+# endif
+# if defined(__FreeBSD__) && defined(i386)
+# define I386
+# define FREEBSD
+# define mach_type_known
+# endif
+# if defined(__NetBSD__) && defined(i386)
+# define I386
+# define NETBSD
+# define mach_type_known
+# endif
+# if defined(bsdi) && defined(i386)
+# define I386
+# define BSDI
+# define mach_type_known
+# endif
+# if !defined(mach_type_known) && defined(__386BSD__)
+# define I386
+# define THREE86BSD
+# define mach_type_known
+# endif
+# if defined(_CX_UX) && defined(_M88K)
+# define M88K
+# define CX_UX
+# define mach_type_known
+# endif
+# if defined(DGUX)
+# define M88K
+ /* DGUX defined */
+# define mach_type_known
+# endif
+# if (defined(_MSDOS) || defined(_MSC_VER)) && (_M_IX86 >= 300)
+# define I386
+# define MSWIN32 /* or Win32s */
+# define mach_type_known
+# endif
+# if defined(__DJGPP__)
+# define I386
+# ifndef DJGPP
+# define DJGPP /* MSDOS running the DJGPP port of GCC */
+# endif
+# define mach_type_known
+# endif
+# if defined(__CYGWIN32__)
+# define I386
+# define CYGWIN32
+# define mach_type_known
+# endif
+# if defined(__BORLANDC__)
+# define I386
+# define MSWIN32
+# define mach_type_known
+# endif
+# if defined(_UTS) && !defined(mach_type_known)
+# define S370
+# define UTS4
+# define mach_type_known
+# endif
+/* Ivan Demakov */
+# if defined(__WATCOMC__) && defined(__386__)
+# define I386
+# if !defined(OS2) && !defined(MSWIN32) && !defined(DOS4GW)
+# if defined(__OS2__)
+# define OS2
+# else
+# if defined(__WINDOWS_386__) || defined(__NT__)
+# define MSWIN32
+# else
+# define DOS4GW
+# endif
+# endif
+# endif
+# define mach_type_known
+# endif
+
+/* Feel free to add more clauses here */
+
+/* Or manually define the machine type here. A machine type is */
+/* characterized by the architecture. Some */
+/* machine types are further subdivided by OS. */
+/* the macros ULTRIX, RISCOS, and BSD to distinguish. */
+/* Note that SGI IRIX is treated identically to RISCOS. */
+/* SYSV on an M68K actually means A/UX. */
+/* The distinction in these cases is usually the stack starting address */
+# ifndef mach_type_known
+ --> unknown machine type
+# endif
+ /* Mapping is: M68K ==> Motorola 680X0 */
+ /* (SUNOS4,HP,NEXT, and SYSV (A/UX), */
+ /* MACOS and AMIGA variants) */
+ /* I386 ==> Intel 386 */
+ /* (SEQUENT, OS2, SCO, LINUX, NETBSD, */
+ /* FREEBSD, THREE86BSD, MSWIN32, */
+ /* BSDI, SUNOS5, NEXT variants) */
+ /* NS32K ==> Encore Multimax */
+ /* MIPS ==> R2000 or R3000 */
+ /* (RISCOS, ULTRIX variants) */
+ /* VAX ==> DEC VAX */
+ /* (BSD, ULTRIX variants) */
+ /* RS6000 ==> IBM RS/6000 AIX3.X */
+ /* RT ==> IBM PC/RT */
+ /* HP_PA ==> HP9000/700 & /800 */
+ /* HP/UX */
+ /* SPARC ==> SPARC under SunOS */
+ /* (SUNOS4, SUNOS5, */
+ /* DRSNX variants) */
+ /* ALPHA ==> DEC Alpha */
+ /* (OSF1 and LINUX variants) */
+ /* M88K ==> Motorola 88XX0 */
+ /* (CX_UX and DGUX) */
+ /* S370 ==> 370-like machine */
+ /* running Amdahl UTS4 */
+
+
+/*
+ * For each architecture and OS, the following need to be defined:
+ *
+ * CPP_WORD_SZ is a simple integer constant representing the word size.
+ * in bits. We assume byte addressibility, where a byte has 8 bits.
+ * We also assume CPP_WORD_SZ is either 32 or 64.
+ * (We care about the length of pointers, not hardware
+ * bus widths. Thus a 64 bit processor with a C compiler that uses
+ * 32 bit pointers should use CPP_WORD_SZ of 32, not 64. Default is 32.)
+ *
+ * MACH_TYPE is a string representation of the machine type.
+ * OS_TYPE is analogous for the OS.
+ *
+ * ALIGNMENT is the largest N, such that
+ * all pointer are guaranteed to be aligned on N byte boundaries.
+ * defining it to be 1 will always work, but perform poorly.
+ *
+ * DATASTART is the beginning of the data segment.
+ * On UNIX systems, the collector will scan the area between DATASTART
+ * and DATAEND for root pointers.
+ *
+ * DATAEND, if not &end.
+ *
+ * ALIGN_DOUBLE of GC_malloc should return blocks aligned to twice
+ * the pointer size.
+ *
+ * STACKBOTTOM is the cool end of the stack, which is usually the
+ * highest address in the stack.
+ * Under PCR or OS/2, we have other ways of finding thread stacks.
+ * For each machine, the following should:
+ * 1) define STACK_GROWS_UP if the stack grows toward higher addresses, and
+ * 2) define exactly one of
+ * STACKBOTTOM (should be defined to be an expression)
+ * HEURISTIC1
+ * HEURISTIC2
+ * If either of the last two macros are defined, then STACKBOTTOM is computed
+ * during collector startup using one of the following two heuristics:
+ * HEURISTIC1: Take an address inside GC_init's frame, and round it up to
+ * the next multiple of STACK_GRAN.
+ * HEURISTIC2: Take an address inside GC_init's frame, increment it repeatedly
+ * in small steps (decrement if STACK_GROWS_UP), and read the value
+ * at each location. Remember the value when the first
+ * Segmentation violation or Bus error is signalled. Round that
+ * to the nearest plausible page boundary, and use that instead
+ * of STACKBOTTOM.
+ *
+ * If no expression for STACKBOTTOM can be found, and neither of the above
+ * heuristics are usable, the collector can still be used with all of the above
+ * undefined, provided one of the following is done:
+ * 1) GC_mark_roots can be changed to somehow mark from the correct stack(s)
+ * without reference to STACKBOTTOM. This is appropriate for use in
+ * conjunction with thread packages, since there will be multiple stacks.
+ * (Allocating thread stacks in the heap, and treating them as ordinary
+ * heap data objects is also possible as a last resort. However, this is
+ * likely to introduce significant amounts of excess storage retention
+ * unless the dead parts of the thread stacks are periodically cleared.)
+ * 2) Client code may set GC_stackbottom before calling any GC_ routines.
+ * If the author of the client code controls the main program, this is
+ * easily accomplished by introducing a new main program, setting
+ * GC_stackbottom to the address of a local variable, and then calling
+ * the original main program. The new main program would read something
+ * like:
+ *
+ * # include "gc_private.h"
+ *
+ * main(argc, argv, envp)
+ * int argc;
+ * char **argv, **envp;
+ * {
+ * int dummy;
+ *
+ * GC_stackbottom = (ptr_t)(&dummy);
+ * return(real_main(argc, argv, envp));
+ * }
+ *
+ *
+ * Each architecture may also define the style of virtual dirty bit
+ * implementation to be used:
+ * MPROTECT_VDB: Write protect the heap and catch faults.
+ * PROC_VDB: Use the SVR4 /proc primitives to read dirty bits.
+ *
+ * An architecture may define DYNAMIC_LOADING if dynamic_load.c
+ * defined GC_register_dynamic_libraries() for the architecture.
+ */
+
+
+# define STACK_GRAN 0x1000000
+# ifdef M68K
+# define MACH_TYPE "M68K"
+# define ALIGNMENT 2
+# ifdef NETBSD
+# define OS_TYPE "NETBSD"
+# define HEURISTIC2
+ extern char etext;
+# define DATASTART ((ptr_t)(&etext))
+# endif
+# ifdef SUNOS4
+# define OS_TYPE "SUNOS4"
+ extern char etext;
+# define DATASTART ((ptr_t)((((word) (&etext)) + 0x1ffff) & ~0x1ffff))
+# define HEURISTIC1 /* differs */
+# define DYNAMIC_LOADING
+# endif
+# ifdef HP
+# define OS_TYPE "HP"
+ extern char etext;
+# define DATASTART ((ptr_t)((((word) (&etext)) + 0xfff) & ~0xfff))
+# define STACKBOTTOM ((ptr_t) 0xffeffffc)
+ /* empirically determined. seems to work. */
+# include <unistd.h>
+# define GETPAGESIZE() sysconf(_SC_PAGE_SIZE)
+# endif
+# ifdef SYSV
+# define OS_TYPE "SYSV"
+ extern etext;
+# define DATASTART ((ptr_t)((((word) (&etext)) + 0x3fffff) \
+ & ~0x3fffff) \
+ +((word)&etext & 0x1fff))
+ /* This only works for shared-text binaries with magic number 0413.
+ The other sorts of SysV binaries put the data at the end of the text,
+ in which case the default of &etext would work. Unfortunately,
+ handling both would require having the magic-number available.
+ -- Parag
+ */
+# define STACKBOTTOM ((ptr_t)0xFFFFFFFE)
+ /* The stack starts at the top of memory, but */
+ /* 0x0 cannot be used as setjump_test complains */
+ /* that the stack direction is incorrect. Two */
+ /* bytes down from 0x0 should be safe enough. */
+ /* --Parag */
+# include <sys/mmu.h>
+# define GETPAGESIZE() PAGESIZE /* Is this still right? */
+# endif
+# ifdef AMIGA
+# define OS_TYPE "AMIGA"
+ /* STACKBOTTOM and DATASTART handled specially */
+ /* in os_dep.c */
+# define DATAEND /* not needed */
+# define GETPAGESIZE() 4096
+# endif
+# ifdef MACOS
+# ifndef __LOWMEM__
+# include <LowMem.h>
+# endif
+# define OS_TYPE "MACOS"
+ /* see os_dep.c for details of global data segments. */
+# define STACKBOTTOM ((ptr_t) LMGetCurStackBase())
+# define DATAEND /* not needed */
+# define GETPAGESIZE() 4096
+# endif
+# ifdef NEXT
+# define OS_TYPE "NEXT"
+# define DATASTART ((ptr_t) get_etext())
+# define STACKBOTTOM ((ptr_t) 0x4000000)
+# define DATAEND /* not needed */
+# endif
+# endif
+
+# ifdef POWERPC
+# define MACH_TYPE "POWERPC"
+# define ALIGNMENT 2
+# ifdef MACOS
+# ifndef __LOWMEM__
+# include <LowMem.h>
+# endif
+# define OS_TYPE "MACOS"
+ /* see os_dep.c for details of global data segments. */
+# define STACKBOTTOM ((ptr_t) LMGetCurStackBase())
+# define DATAEND /* not needed */
+# endif
+# ifdef LINUX
+# define OS_TYPE "LINUX"
+# define STACKBOTTOM ((ptr_t)0x80000000)
+# define DATASTART GC_data_start
+ extern int _end;
+# define DATAEND (&_end)
+# endif
+# endif
+
+# ifdef VAX
+# define MACH_TYPE "VAX"
+# define ALIGNMENT 4 /* Pointers are longword aligned by 4.2 C compiler */
+ extern char etext;
+# define DATASTART ((ptr_t)(&etext))
+# ifdef BSD
+# define OS_TYPE "BSD"
+# define HEURISTIC1
+ /* HEURISTIC2 may be OK, but it's hard to test. */
+# endif
+# ifdef ULTRIX
+# define OS_TYPE "ULTRIX"
+# define STACKBOTTOM ((ptr_t) 0x7fffc800)
+# endif
+# endif
+
+# ifdef RT
+# define MACH_TYPE "RT"
+# define ALIGNMENT 4
+# define DATASTART ((ptr_t) 0x10000000)
+# define STACKBOTTOM ((ptr_t) 0x1fffd800)
+# endif
+
+# ifdef SPARC
+# define MACH_TYPE "SPARC"
+# define ALIGNMENT 4 /* Required by hardware */
+# define ALIGN_DOUBLE
+ extern int etext;
+# ifdef SUNOS5
+# define OS_TYPE "SUNOS5"
+ extern int _etext;
+ extern int _end;
+ extern char * GC_SysVGetDataStart();
+# define DATASTART (ptr_t)GC_SysVGetDataStart(0x10000, &_etext)
+# define DATAEND (&_end)
+# ifndef USE_MMAP
+# define USE_MMAP
+# endif
+# ifdef USE_MMAP
+# define HEAP_START (ptr_t)0x40000000
+# else
+# define HEAP_START DATAEND
+# endif
+# define PROC_VDB
+/* HEURISTIC1 reportedly no longer works under 2.7. Thus we */
+/* switched to HEURISTIC2, eventhough it creates some debugging */
+/* issues. */
+# define HEURISTIC2
+# include <unistd.h>
+# define GETPAGESIZE() sysconf(_SC_PAGESIZE)
+ /* getpagesize() appeared to be missing from at least one */
+ /* Solaris 5.4 installation. Weird. */
+# endif
+# ifdef SUNOS4
+# define OS_TYPE "SUNOS4"
+ /* [If you have a weak stomach, don't read this.] */
+ /* We would like to use: */
+/* # define DATASTART ((ptr_t)((((word) (&etext)) + 0x1fff) & ~0x1fff)) */
+ /* This fails occasionally, due to an ancient, but very */
+ /* persistent ld bug. &etext is set 32 bytes too high. */
+ /* We instead read the text segment size from the a.out */
+ /* header, which happens to be mapped into our address space */
+ /* at the start of the text segment. The detective work here */
+ /* was done by Robert Ehrlich, Manuel Serrano, and Bernard */
+ /* Serpette of INRIA. */
+ /* This assumes ZMAGIC, i.e. demand-loadable executables. */
+# define TEXTSTART 0x2000
+# define DATASTART ((ptr_t)(*(int *)(TEXTSTART+0x4)+TEXTSTART))
+# define MPROTECT_VDB
+# define HEURISTIC1
+# endif
+# ifdef DRSNX
+# define CPP_WORDSZ 32
+# define OS_TYPE "DRSNX"
+ extern char * GC_SysVGetDataStart();
+ extern int etext;
+# define DATASTART (ptr_t)GC_SysVGetDataStart(0x10000, &etext)
+# define MPROTECT_VDB
+# define STACKBOTTOM ((ptr_t) 0xdfff0000)
+# endif
+# define DYNAMIC_LOADING
+# ifdef LINUX
+# define OS_TYPE "LINUX"
+# ifdef __ELF__
+# define DATASTART GC_data_start
+# else
+ Linux Sparc non elf ?
+# endif
+ extern int _end;
+# define DATAEND (&_end)
+# define SVR4
+# define STACKBOTTOM ((ptr_t) 0xf0000000)
+# endif
+# endif
+
+# ifdef I386
+# define MACH_TYPE "I386"
+# define ALIGNMENT 4 /* Appears to hold for all "32 bit" compilers */
+ /* except Borland. The -a4 option fixes */
+ /* Borland. */
+ /* Ivan Demakov: For Watcom the option is -zp4. */
+# ifndef SMALL_CONFIG
+# define ALIGN_DOUBLE /* Not strictly necessary, but may give speed */
+ /* improvement on Pentiums. */
+# endif
+# ifdef SEQUENT
+# define OS_TYPE "SEQUENT"
+ extern int etext;
+# define DATASTART ((ptr_t)((((word) (&etext)) + 0xfff) & ~0xfff))
+# define STACKBOTTOM ((ptr_t) 0x3ffff000)
+# endif
+# ifdef SUNOS5
+# define OS_TYPE "SUNOS5"
+ extern int etext, _start;
+ extern char * GC_SysVGetDataStart();
+# define DATASTART GC_SysVGetDataStart(0x1000, &etext)
+# define STACKBOTTOM ((ptr_t)(&_start))
+/** At least in Solaris 2.5, PROC_VDB gives wrong values for dirty bits. */
+/*# define PROC_VDB*/
+# define DYNAMIC_LOADING
+# ifndef USE_MMAP
+# define USE_MMAP
+# endif
+# ifdef USE_MMAP
+# define HEAP_START (ptr_t)0x40000000
+# else
+# define HEAP_START DATAEND
+# endif
+# endif
+# ifdef SCO
+# define OS_TYPE "SCO"
+ extern int etext;
+# define DATASTART ((ptr_t)((((word) (&etext)) + 0x3fffff) \
+ & ~0x3fffff) \
+ +((word)&etext & 0xfff))
+# define STACKBOTTOM ((ptr_t) 0x7ffffffc)
+# endif
+# ifdef SCO_ELF
+# define OS_TYPE "SCO_ELF"
+ extern int etext;
+# define DATASTART ((ptr_t)(&etext))
+# define STACKBOTTOM ((ptr_t) 0x08048000)
+# define DYNAMIC_LOADING
+# define ELF_CLASS ELFCLASS32
+# endif
+# ifdef LINUX
+# define OS_TYPE "LINUX"
+# define STACKBOTTOM ((ptr_t)0xc0000000)
+ /* Appears to be 0xe0000000 for at least one 2.1.91 kernel. */
+ /* Probably needs to be more flexible, but I don't yet */
+ /* fully understand how flexible. */
+
+ /* Linux threads don't interact well with the read() wrapper.
+ Not defining MPROTECT_VDB fixes this. */
+ /* # define MPROTECT_VDB*/
+# ifdef __ELF__
+# define DYNAMIC_LOADING
+# ifdef UNDEFINED /* includes ro data */
+ extern int _etext;
+# define DATASTART ((ptr_t)((((word) (&_etext)) + 0xfff) & ~0xfff))
+# endif
+# include <linux/version.h>
+# include <features.h>
+# if LINUX_VERSION_CODE >= 0x20000 && defined(__GLIBC__) && __GLIBC__ >= 2
+ extern int __data_start;
+# define DATASTART ((ptr_t)(&__data_start))
+# else
+ extern char **__environ;
+# define DATASTART ((ptr_t)(&__environ))
+ /* hideous kludge: __environ is the first */
+ /* word in crt0.o, and delimits the start */
+ /* of the data segment, no matter which */
+ /* ld options were passed through. */
+ /* We could use _etext instead, but that */
+ /* would include .rodata, which may */
+ /* contain large read-only data tables */
+ /* that we'd rather not scan. */
+# endif
+ extern int _end;
+# define DATAEND (&_end)
+# else
+ extern int etext;
+# define DATASTART ((ptr_t)((((word) (&etext)) + 0xfff) & ~0xfff))
+# endif
+# endif
+# ifdef CYGWIN32
+ extern int _data_start__;
+ extern int _data_end__;
+ extern int _bss_start__;
+ extern int _bss_end__;
+ /* For binutils 2.9.1, we have */
+ /* DATASTART = _data_start__ */
+ /* DATAEND = _bss_end__ */
+ /* whereas for some earlier versions it was */
+ /* DATASTART = _bss_start__ */
+ /* DATAEND = _data_end__ */
+ /* To get it right for both, we take the */
+ /* minumum/maximum of the two. */
+# define MAX(x,y) ((x) > (y) ? (x) : (y))
+# define MIN(x,y) ((x) < (y) ? (x) : (y))
+# define DATASTART ((ptr_t) MIN(_data_start__, _bss_start__))
+# define DATAEND ((ptr_t) MAX(_data_end__, _bss_end__))
+# undef STACK_GRAN
+# define STACK_GRAN 0x10000
+# define HEURISTIC1
+# endif
+# ifdef OS2
+# define OS_TYPE "OS2"
+ /* STACKBOTTOM and DATASTART are handled specially in */
+ /* os_dep.c. OS2 actually has the right */
+ /* system call! */
+# define DATAEND /* not needed */
+# endif
+# ifdef MSWIN32
+# define OS_TYPE "MSWIN32"
+ /* STACKBOTTOM and DATASTART are handled specially in */
+ /* os_dep.c. */
+# ifndef __WATCOMC__
+# define MPROTECT_VDB
+# endif
+# define DATAEND /* not needed */
+# endif
+# ifdef DJGPP
+# define OS_TYPE "DJGPP"
+# include "stubinfo.h"
+ extern int etext;
+ extern int _stklen;
+# define DATASTART ((ptr_t)((((word) (&etext)) + 0x1ff) & ~0x1ff))
+# define STACKBOTTOM ((ptr_t)((word) _stubinfo + _stubinfo->size \
+ + _stklen))
+ /* This may not be right. */
+# endif
+# ifdef FREEBSD
+# define OS_TYPE "FREEBSD"
+# define MPROTECT_VDB
+# endif
+# ifdef NETBSD
+# define OS_TYPE "NETBSD"
+# endif
+# ifdef THREE86BSD
+# define OS_TYPE "THREE86BSD"
+# endif
+# ifdef BSDI
+# define OS_TYPE "BSDI"
+# endif
+# if defined(FREEBSD) || defined(NETBSD) \
+ || defined(THREE86BSD) || defined(BSDI)
+# define HEURISTIC2
+ extern char etext;
+# define DATASTART ((ptr_t)(&etext))
+# endif
+# ifdef NEXT
+# define OS_TYPE "NEXT"
+# define DATASTART ((ptr_t) get_etext())
+# define STACKBOTTOM ((ptr_t)0xc0000000)
+# define DATAEND /* not needed */
+# endif
+# ifdef DOS4GW
+# define OS_TYPE "DOS4GW"
+ /* Get_DATASTART, Get_DATAEND, Get_STACKBOTTOM
+ * Defined in gc-watcom.asm
+ */
+ extern char* Get_DATASTART (void);
+ extern char* Get_DATAEND (void);
+ extern char* Get_STACKBOTTOM (void);
+# pragma aux Get_DATASTART "*" value [eax];
+# pragma aux Get_DATAEND "*" value [eax];
+# pragma aux Get_STACKBOTTOM "*" value [eax];
+# define DATASTART ((ptr_t) Get_DATASTART())
+# define STACKBOTTOM ((ptr_t) Get_STACKBOTTOM())
+# define DATAEND ((ptr_t) Get_DATAEND())
+# endif
+# endif
+
+# ifdef NS32K
+# define MACH_TYPE "NS32K"
+# define ALIGNMENT 4
+ extern char **environ;
+# define DATASTART ((ptr_t)(&environ))
+ /* hideous kludge: environ is the first */
+ /* word in crt0.o, and delimits the start */
+ /* of the data segment, no matter which */
+ /* ld options were passed through. */
+# define STACKBOTTOM ((ptr_t) 0xfffff000) /* for Encore */
+# endif
+
+# ifdef MIPS
+# ifndef ECOS
+# define MACH_TYPE "MIPS"
+ /* CYGNUS LOCAL: respect predefined DATASTART_IS_ETEXT. */
+# ifdef DATASTART_IS_ETEXT
+ extern int _etext;
+# define DATASTART ((ptr_t)(&_etext))
+# else
+# ifndef IRIX5
+# define DATASTART (ptr_t)0x10000000
+ /* Could probably be slightly higher since */
+ /* startup code allocates lots of stuff. */
+# else
+ extern int _fdata;
+# define DATASTART ((ptr_t)(&_fdata))
+# ifdef USE_MMAP
+# define HEAP_START (ptr_t)0x30000000
+# else
+# define HEAP_START DATASTART
+# endif
+ /* Lowest plausible heap address. */
+ /* In the MMAP case, we map there. */
+ /* In either case it is used to identify */
+ /* heap sections so they're not */
+ /* considered as roots. */
+# endif /* IRIX5 */
+# endif /* DATASTART_IS_ETEXT */
+# define HEURISTIC2
+/* # define STACKBOTTOM ((ptr_t)0x7fff8000) sometimes also works. */
+# ifdef ULTRIX
+# define OS_TYPE "ULTRIX"
+# define ALIGNMENT 4
+# endif
+# ifdef RISCOS
+# define OS_TYPE "RISCOS"
+# define ALIGNMENT 4 /* Required by hardware */
+# endif
+# ifdef IRIX5
+# define OS_TYPE "IRIX5"
+# define MPROTECT_VDB
+# ifdef _MIPS_SZPTR
+# define CPP_WORDSZ _MIPS_SZPTR
+# define ALIGNMENT (_MIPS_SZPTR/8)
+# if CPP_WORDSZ != 64
+# define ALIGN_DOUBLE
+# endif
+# else
+# define ALIGNMENT 4
+# define ALIGN_DOUBLE
+# endif
+# define DYNAMIC_LOADING
+# endif
+# endif /* ECOS */
+# ifdef ECOS
+ extern char __ram_data_start;
+ extern char __ram_data_end;
+# define MACH_TYPE "MIPS"
+# define DATASTART (ptr_t)(&__ram_data_start)
+# define DATAEND (ptr_t)(&__ram_data_end)
+
+# define HEURISTIC2
+# define ALIGNMENT 4
+# define ALIGN_DOUBLE
+# endif /* ECOS */
+# endif
+
+# ifdef RS6000
+# define MACH_TYPE "RS6000"
+# define ALIGNMENT 4
+# define DATASTART ((ptr_t)0x20000000)
+ extern int errno;
+# define STACKBOTTOM ((ptr_t)((ulong)&errno))
+# define DYNAMIC_LOADING
+ /* For really old versions of AIX, this may have to be removed. */
+# endif
+
+# ifdef HP_PA
+# define MACH_TYPE "HP_PA"
+# define ALIGNMENT 4
+# define ALIGN_DOUBLE
+ extern int __data_start;
+# define DATASTART ((ptr_t)(&__data_start))
+# if 0
+ /* The following appears to work for 7xx systems running HP/UX */
+ /* 9.xx Furthermore, it might result in much faster */
+ /* collections than HEURISTIC2, which may involve scanning */
+ /* segments that directly precede the stack. It is not the */
+ /* default, since it may not work on older machine/OS */
+ /* combinations. (Thanks to Raymond X.T. Nijssen for uncovering */
+ /* this.) */
+# define STACKBOTTOM ((ptr_t) 0x7b033000) /* from /etc/conf/h/param.h */
+# else
+# define HEURISTIC2
+# endif
+# define STACK_GROWS_UP
+# define DYNAMIC_LOADING
+# include <unistd.h>
+# define GETPAGESIZE() sysconf(_SC_PAGE_SIZE)
+ /* They misspelled the Posix macro? */
+# endif
+
+# ifdef ALPHA
+# define MACH_TYPE "ALPHA"
+# define ALIGNMENT 8
+# ifdef OSF1
+# define OS_TYPE "OSF1"
+# define DATASTART ((ptr_t) 0x140000000)
+# define HEURISTIC2
+ /* Normally HEURISTIC2 is too conervative, since */
+ /* the text segment immediately follows the stack. */
+ /* Hence we give an upper pound. */
+ extern int __start;
+# define HEURISTIC2_LIMIT ((ptr_t)((word)(&__start) & ~(getpagesize()-1)))
+# define CPP_WORDSZ 64
+# define MPROTECT_VDB
+# define DYNAMIC_LOADING
+# endif
+# ifdef LINUX
+# define OS_TYPE "LINUX"
+# define CPP_WORDSZ 64
+# define STACKBOTTOM ((ptr_t) 0x120000000)
+# ifdef __ELF__
+# define DATASTART GC_data_start
+# define USE_PROC
+# define DYNAMIC_LOADING
+# else
+# define DATASTART ((ptr_t) 0x140000000)
+# endif
+ extern int _end;
+# define DATAEND (&_end)
+ /* As of 1.3.90, I couldn't find a way to retrieve the correct */
+ /* fault address from a signal handler. */
+ /* Hence MPROTECT_VDB is broken. */
+# endif
+# endif
+
+# ifdef M88K
+# define MACH_TYPE "M88K"
+# define ALIGNMENT 4
+# define ALIGN_DOUBLE
+ extern int etext;
+# ifdef CX_UX
+# define OS_TYPE "CX_UX"
+# define DATASTART ((((word)&etext + 0x3fffff) & ~0x3fffff) + 0x10000)
+# endif
+# ifdef DGUX
+# define OS_TYPE "DGUX"
+ extern char * GC_SysVGetDataStart();
+# define DATASTART (ptr_t)GC_SysVGetDataStart(0x10000, &etext)
+# endif
+# define STACKBOTTOM ((char*)0xf0000000) /* determined empirically */
+# endif
+
+# ifdef S370
+# define MACH_TYPE "S370"
+# define OS_TYPE "UTS4"
+# define ALIGNMENT 4 /* Required by hardware */
+ extern int etext;
+ extern int _etext;
+ extern int _end;
+ extern char * GC_SysVGetDataStart();
+# define DATASTART (ptr_t)GC_SysVGetDataStart(0x10000, &_etext)
+# define DATAEND (&_end)
+# define HEURISTIC2
+# endif
+
+# ifndef STACK_GROWS_UP
+# define STACK_GROWS_DOWN
+# endif
+
+# ifndef CPP_WORDSZ
+# define CPP_WORDSZ 32
+# endif
+
+# ifndef OS_TYPE
+# define OS_TYPE ""
+# endif
+
+# ifndef DATAEND
+ extern int end;
+# define DATAEND (&end)
+# endif
+
+# if defined(SVR4) && !defined(GETPAGESIZE)
+# include <unistd.h>
+# define GETPAGESIZE() sysconf(_SC_PAGESIZE)
+# endif
+
+# ifndef GETPAGESIZE
+# if defined(SUNOS5) || defined(IRIX5)
+# include <unistd.h>
+# endif
+# define GETPAGESIZE() getpagesize()
+# endif
+
+# if defined(SUNOS5) || defined(DRSNX) || defined(UTS4)
+ /* OS has SVR4 generic features. Probably others also qualify. */
+# define SVR4
+# endif
+
+# if defined(SUNOS5) || defined(DRSNX)
+ /* OS has SUNOS5 style semi-undocumented interface to dynamic */
+ /* loader. */
+# define SUNOS5DL
+ /* OS has SUNOS5 style signal handlers. */
+# define SUNOS5SIGS
+# endif
+
+# if CPP_WORDSZ != 32 && CPP_WORDSZ != 64
+ -> bad word size
+# endif
+
+# ifdef PCR
+# undef DYNAMIC_LOADING
+# undef STACKBOTTOM
+# undef HEURISTIC1
+# undef HEURISTIC2
+# undef PROC_VDB
+# undef MPROTECT_VDB
+# define PCR_VDB
+# endif
+
+# ifdef SRC_M3
+/* Postponed for now. */
+# undef PROC_VDB
+# undef MPROTECT_VDB
+# endif
+
+# ifdef SMALL_CONFIG
+/* Presumably not worth the space it takes. */
+# undef PROC_VDB
+# undef MPROTECT_VDB
+# endif
+
+# if !defined(PCR_VDB) && !defined(PROC_VDB) && !defined(MPROTECT_VDB)
+# define DEFAULT_VDB
+# endif
+
+# if defined(IRIX_THREADS) && !defined(IRIX5)
+--> inconsistent configuration
+# endif
+# if defined(LINUX_THREADS) && !defined(LINUX)
+--> inconsistent configuration
+# endif
+# if defined(SOLARIS_THREADS) && !defined(SUNOS5)
+--> inconsistent configuration
+# endif
+# if defined(PCR) || defined(SRC_M3) || \
+ defined(SOLARIS_THREADS) || defined(WIN32_THREADS) || \
+ defined(IRIX_THREADS) || defined(LINUX_THREADS) || \
+ defined(QUICK_THREADS)
+# define THREADS
+# endif
+
+# if defined(SPARC) && !defined(LINUX)
+# define SAVE_CALL_CHAIN
+# define ASM_CLEAR_CODE /* Stack clearing is crucial, and we */
+ /* include assembly code to do it well. */
+# endif
+
+# endif
diff --git a/boehm-gc/configure b/boehm-gc/configure
new file mode 100755
index 00000000000..e75e17b3462
--- /dev/null
+++ b/boehm-gc/configure
@@ -0,0 +1,3211 @@
+#! /bin/sh
+
+# Guess values for system-dependent variables and create Makefiles.
+# Generated automatically using autoconf version 2.13
+# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+
+# Defaults:
+ac_help=
+ac_default_prefix=/usr/local
+# Any additions from configure.in:
+ac_help="$ac_help
+ --enable-multilib build many library versions (default)"
+ac_help="$ac_help
+ --enable-maintainer-mode enable make rules and dependencies not useful
+ (and sometimes confusing) to the casual installer"
+ac_help="$ac_help
+ --enable-shared[=PKGS] build shared libraries [default=yes]"
+ac_help="$ac_help
+ --enable-static[=PKGS] build static libraries [default=yes]"
+ac_help="$ac_help
+ --enable-fast-install[=PKGS] optimize for fast installation [default=yes]"
+ac_help="$ac_help
+ --with-gnu-ld assume the C compiler uses GNU ld [default=no]"
+ac_help="$ac_help
+ --disable-libtool-lock force libtool not to do file locking"
+ac_help="$ac_help
+ --with-target-subdir=SUBDIR Configuring with a cross compiler"
+ac_help="$ac_help
+ --with-cross-host=HOST Configuring with a cross compiler"
+ac_help="$ac_help
+ --enable-maintainer-mode enable make rules and dependencies not useful
+ (and sometimes confusing) to the casual installer"
+ac_help="$ac_help
+ --enable-threads=TYPE choose threading package"
+ac_help="$ac_help
+ --enable-java-gc=TYPE choose garbage collector [boehm]"
+ac_help="$ac_help
+ --with-ecos Enable runtime eCos target support."
+
+# Initialize some variables set by options.
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+build=NONE
+cache_file=./config.cache
+exec_prefix=NONE
+host=NONE
+no_create=
+nonopt=NONE
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+target=NONE
+verbose=
+x_includes=NONE
+x_libraries=NONE
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+# Initialize some other variables.
+subdirs=
+MFLAGS= MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+# Maximum number of lines to put in a shell here document.
+ac_max_here_lines=12
+
+ac_prev=
+for ac_option
+do
+
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval "$ac_prev=\$ac_option"
+ ac_prev=
+ continue
+ fi
+
+ case "$ac_option" in
+ -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+ *) ac_optarg= ;;
+ esac
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case "$ac_option" in
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir="$ac_optarg" ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build="$ac_optarg" ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file="$ac_optarg" ;;
+
+ -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+ | --da=*)
+ datadir="$ac_optarg" ;;
+
+ -disable-* | --disable-*)
+ ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
+ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+ fi
+ ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+ eval "enable_${ac_feature}=no" ;;
+
+ -enable-* | --enable-*)
+ ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
+ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+ fi
+ ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+ case "$ac_option" in
+ *=*) ;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "enable_${ac_feature}='$ac_optarg'" ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix="$ac_optarg" ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he)
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat << EOF
+Usage: configure [options] [host]
+Options: [defaults in brackets after descriptions]
+Configuration:
+ --cache-file=FILE cache test results in FILE
+ --help print this message
+ --no-create do not create output files
+ --quiet, --silent do not print \`checking...' messages
+ --version print the version of autoconf that created configure
+Directory and file names:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [same as prefix]
+ --bindir=DIR user executables in DIR [EPREFIX/bin]
+ --sbindir=DIR system admin executables in DIR [EPREFIX/sbin]
+ --libexecdir=DIR program executables in DIR [EPREFIX/libexec]
+ --datadir=DIR read-only architecture-independent data in DIR
+ [PREFIX/share]
+ --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data in DIR
+ [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var]
+ --libdir=DIR object code libraries in DIR [EPREFIX/lib]
+ --includedir=DIR C header files in DIR [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include]
+ --infodir=DIR info documentation in DIR [PREFIX/info]
+ --mandir=DIR man documentation in DIR [PREFIX/man]
+ --srcdir=DIR find the sources in DIR [configure dir or ..]
+ --program-prefix=PREFIX prepend PREFIX to installed program names
+ --program-suffix=SUFFIX append SUFFIX to installed program names
+ --program-transform-name=PROGRAM
+ run sed PROGRAM on installed program names
+EOF
+ cat << EOF
+Host type:
+ --build=BUILD configure for building on BUILD [BUILD=HOST]
+ --host=HOST configure for HOST [guessed]
+ --target=TARGET configure for TARGET [TARGET=HOST]
+Features and packages:
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --x-includes=DIR X include files are in DIR
+ --x-libraries=DIR X library files are in DIR
+EOF
+ if test -n "$ac_help"; then
+ echo "--enable and --with options recognized:$ac_help"
+ fi
+ exit 0 ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host="$ac_optarg" ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir="$ac_optarg" ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir="$ac_optarg" ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir="$ac_optarg" ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir="$ac_optarg" ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst \
+ | --locals | --local | --loca | --loc | --lo)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+ localstatedir="$ac_optarg" ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir="$ac_optarg" ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir="$ac_optarg" ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix="$ac_optarg" ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix="$ac_optarg" ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix="$ac_optarg" ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name="$ac_optarg" ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir="$ac_optarg" ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir="$ac_optarg" ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site="$ac_optarg" ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir="$ac_optarg" ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir="$ac_optarg" ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target="$ac_optarg" ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers)
+ echo "configure generated by autoconf version 2.13"
+ exit 0 ;;
+
+ -with-* | --with-*)
+ ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
+ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+ fi
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ case "$ac_option" in
+ *=*) ;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "with_${ac_package}='$ac_optarg'" ;;
+
+ -without-* | --without-*)
+ ac_package=`echo $ac_option|sed -e 's/-*without-//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
+ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+ fi
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ eval "with_${ac_package}=no" ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes="$ac_optarg" ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries="$ac_optarg" ;;
+
+ -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
+ ;;
+
+ *)
+ if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
+ echo "configure: warning: $ac_option: invalid host type" 1>&2
+ fi
+ if test "x$nonopt" != xNONE; then
+ { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
+ fi
+ nonopt="$ac_option"
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
+fi
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+# File descriptor usage:
+# 0 standard input
+# 1 file creation
+# 2 errors and warnings
+# 3 some systems may open it to /dev/tty
+# 4 used on the Kubota Titan
+# 6 checking for... messages and results
+# 5 compiler messages saved in config.log
+if test "$silent" = yes; then
+ exec 6>/dev/null
+else
+ exec 6>&1
+fi
+exec 5>./config.log
+
+echo "\
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+" 1>&5
+
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Also quote any args containing shell metacharacters.
+ac_configure_args=
+for ac_arg
+do
+ case "$ac_arg" in
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c) ;;
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
+ ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+ *) ac_configure_args="$ac_configure_args $ac_arg" ;;
+ esac
+done
+
+# NLS nuisances.
+# Only set these to C if already set. These must not be set unconditionally
+# because not all systems understand e.g. LANG=C (notably SCO).
+# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
+# Non-C LC_CTYPE values break the ctype check.
+if test "${LANG+set}" = set; then LANG=C; export LANG; fi
+if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
+if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
+if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo > confdefs.h
+
+# A filename unique to this package, relative to the directory that
+# configure is in, which we can look for to find out if srcdir is correct.
+ac_unique_file=gc_mark.h
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then its parent.
+ ac_prog=$0
+ ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
+ test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
+ srcdir=$ac_confdir
+ if test ! -r $srcdir/$ac_unique_file; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+ if test "$ac_srcdir_defaulted" = yes; then
+ { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
+ else
+ { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
+ fi
+fi
+srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
+
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+ if test "x$prefix" != xNONE; then
+ CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+ else
+ CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+ fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+ if test -r "$ac_site_file"; then
+ echo "loading site script $ac_site_file"
+ . "$ac_site_file"
+ fi
+done
+
+if test -r "$cache_file"; then
+ echo "loading cache $cache_file"
+ . $cache_file
+else
+ echo "creating cache $cache_file"
+ > $cache_file
+fi
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+ac_exeext=
+ac_objext=o
+if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
+ # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
+ if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
+ ac_n= ac_c='
+' ac_t=' '
+ else
+ ac_n=-n ac_c= ac_t=
+ fi
+else
+ ac_n= ac_c='\c' ac_t=
+fi
+
+
+
+ac_aux_dir=
+for ac_dir in .. $srcdir/..; do
+ if test -f $ac_dir/install-sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install-sh -c"
+ break
+ elif test -f $ac_dir/install.sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install.sh -c"
+ break
+ fi
+done
+if test -z "$ac_aux_dir"; then
+ { echo "configure: error: can not find install-sh or install.sh in .. $srcdir/.." 1>&2; exit 1; }
+fi
+ac_config_guess=$ac_aux_dir/config.guess
+ac_config_sub=$ac_aux_dir/config.sub
+ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
+
+
+
+# Do some error checking and defaulting for the host and target type.
+# The inputs are:
+# configure --host=HOST --target=TARGET --build=BUILD NONOPT
+#
+# The rules are:
+# 1. You are not allowed to specify --host, --target, and nonopt at the
+# same time.
+# 2. Host defaults to nonopt.
+# 3. If nonopt is not specified, then host defaults to the current host,
+# as determined by config.guess.
+# 4. Target and build default to nonopt.
+# 5. If nonopt is not specified, then target and build default to host.
+
+# The aliases save the names the user supplied, while $host etc.
+# will get canonicalized.
+case $host---$target---$nonopt in
+NONE---*---* | *---NONE---* | *---*---NONE) ;;
+*) { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } ;;
+esac
+
+
+# Make sure we can run config.sub.
+if ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then :
+else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking host system type""... $ac_c" 1>&6
+echo "configure:602: checking host system type" >&5
+
+host_alias=$host
+case "$host_alias" in
+NONE)
+ case $nonopt in
+ NONE)
+ if host_alias=`${CONFIG_SHELL-/bin/sh} $ac_config_guess`; then :
+ else { echo "configure: error: can not guess host type; you must specify one" 1>&2; exit 1; }
+ fi ;;
+ *) host_alias=$nonopt ;;
+ esac ;;
+esac
+
+host=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $host_alias`
+host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$host" 1>&6
+
+echo $ac_n "checking target system type""... $ac_c" 1>&6
+echo "configure:623: checking target system type" >&5
+
+target_alias=$target
+case "$target_alias" in
+NONE)
+ case $nonopt in
+ NONE) target_alias=$host_alias ;;
+ *) target_alias=$nonopt ;;
+ esac ;;
+esac
+
+target=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $target_alias`
+target_cpu=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+target_vendor=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+target_os=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$target" 1>&6
+
+echo $ac_n "checking build system type""... $ac_c" 1>&6
+echo "configure:641: checking build system type" >&5
+
+build_alias=$build
+case "$build_alias" in
+NONE)
+ case $nonopt in
+ NONE) build_alias=$host_alias ;;
+ *) build_alias=$nonopt ;;
+ esac ;;
+esac
+
+build=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $build_alias`
+build_cpu=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+build_vendor=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+build_os=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$build" 1>&6
+
+test "$host_alias" != "$target_alias" &&
+ test "$program_prefix$program_suffix$program_transform_name" = \
+ NONENONEs,x,x, &&
+ program_prefix=${target_alias}-
+
+
+# Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# ./install, which can be erroneously created by make from ./install.sh.
+echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
+echo "configure:676: checking for a BSD compatible install" >&5
+if test -z "$INSTALL"; then
+if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":"
+ for ac_dir in $PATH; do
+ # Account for people who put trailing slashes in PATH elements.
+ case "$ac_dir/" in
+ /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ if test -f $ac_dir/$ac_prog; then
+ if test $ac_prog = install &&
+ grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ else
+ ac_cv_path_install="$ac_dir/$ac_prog -c"
+ break 2
+ fi
+ fi
+ done
+ ;;
+ esac
+ done
+ IFS="$ac_save_IFS"
+
+fi
+ if test "${ac_cv_path_install+set}" = set; then
+ INSTALL="$ac_cv_path_install"
+ else
+ # As a last resort, use the slow shell script. We don't cache a
+ # path for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the path is relative.
+ INSTALL="$ac_install_sh"
+ fi
+fi
+echo "$ac_t""$INSTALL" 1>&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6
+echo "configure:729: checking whether build environment is sane" >&5
+# Just in case
+sleep 1
+echo timestamp > conftestfile
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null`
+ if test "$*" = "X"; then
+ # -L didn't work.
+ set X `ls -t $srcdir/configure conftestfile`
+ fi
+ if test "$*" != "X $srcdir/configure conftestfile" \
+ && test "$*" != "X conftestfile $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ { echo "configure: error: ls -t appears to fail. Make sure there is not a broken
+alias in your environment" 1>&2; exit 1; }
+ fi
+
+ test "$2" = conftestfile
+ )
+then
+ # Ok.
+ :
+else
+ { echo "configure: error: newly created file is older than distributed files!
+Check your system clock" 1>&2; exit 1; }
+fi
+rm -f conftest*
+echo "$ac_t""yes" 1>&6
+if test "$program_transform_name" = s,x,x,; then
+ program_transform_name=
+else
+ # Double any \ or $. echo might interpret backslashes.
+ cat <<\EOF_SED > conftestsed
+s,\\,\\\\,g; s,\$,$$,g
+EOF_SED
+ program_transform_name="`echo $program_transform_name|sed -f conftestsed`"
+ rm -f conftestsed
+fi
+test "$program_prefix" != NONE &&
+ program_transform_name="s,^,${program_prefix},; $program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+ program_transform_name="s,\$\$,${program_suffix},; $program_transform_name"
+
+# sed with no file args requires a program.
+test "$program_transform_name" = "" && program_transform_name="s,x,x,"
+
+echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
+echo "configure:786: checking whether ${MAKE-make} sets \${MAKE}" >&5
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftestmake <<\EOF
+all:
+ @echo 'ac_maketemp="${MAKE}"'
+EOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+ eval ac_cv_prog_make_${ac_make}_set=yes
+else
+ eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftestmake
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ SET_MAKE=
+else
+ echo "$ac_t""no" 1>&6
+ SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+if test $host != $build; then
+ ac_tool_prefix=${host_alias}-
+else
+ ac_tool_prefix=
+fi
+
+echo $ac_n "checking for Cygwin environment""... $ac_c" 1>&6
+echo "configure:819: checking for Cygwin environment" >&5
+if eval "test \"`echo '$''{'ac_cv_cygwin'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 824 "configure"
+#include "confdefs.h"
+
+int main() {
+
+#ifndef __CYGWIN__
+#define __CYGWIN__ __CYGWIN32__
+#endif
+return __CYGWIN__;
+; return 0; }
+EOF
+if { (eval echo configure:835: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_cygwin=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ ac_cv_cygwin=no
+fi
+rm -f conftest*
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_cygwin" 1>&6
+CYGWIN=
+test "$ac_cv_cygwin" = yes && CYGWIN=yes
+echo $ac_n "checking for mingw32 environment""... $ac_c" 1>&6
+echo "configure:852: checking for mingw32 environment" >&5
+if eval "test \"`echo '$''{'ac_cv_mingw32'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 857 "configure"
+#include "confdefs.h"
+
+int main() {
+return __MINGW32__;
+; return 0; }
+EOF
+if { (eval echo configure:864: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_mingw32=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ ac_cv_mingw32=no
+fi
+rm -f conftest*
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_mingw32" 1>&6
+MINGW32=
+test "$ac_cv_mingw32" = yes && MINGW32=yes
+
+# Check whether --enable-multilib or --disable-multilib was given.
+if test "${enable_multilib+set}" = set; then
+ enableval="$enable_multilib"
+ case "${enableval}" in
+ yes) multilib=yes ;;
+ no) multilib=no ;;
+ *) { echo "configure: error: bad value ${enableval} for multilib option" 1>&2; exit 1; } ;;
+ esac
+else
+ multilib=yes
+fi
+
+
+if test "${srcdir}" = "."; then
+ if test "${with_target_subdir}" != "."; then
+ boehm_gc_basedir="${srcdir}/${with_multisrctop}../."
+ else
+ boehm_gc_basedir="${srcdir}/${with_multisrctop}."
+ fi
+else
+ boehm_gc_basedir="${srcdir}/."
+fi
+
+
+
+# Make sure we can run config.sub.
+if ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then :
+else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking host system type""... $ac_c" 1>&6
+echo "configure:912: checking host system type" >&5
+
+host_alias=$host
+case "$host_alias" in
+NONE)
+ case $nonopt in
+ NONE)
+ if host_alias=`${CONFIG_SHELL-/bin/sh} $ac_config_guess`; then :
+ else { echo "configure: error: can not guess host type; you must specify one" 1>&2; exit 1; }
+ fi ;;
+ *) host_alias=$nonopt ;;
+ esac ;;
+esac
+
+host=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $host_alias`
+host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$host" 1>&6
+
+
+
+PACKAGE=boehm-gc
+
+VERSION=4.13a2
+
+if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then
+ { echo "configure: error: source directory already configured; run "make distclean" there first" 1>&2; exit 1; }
+fi
+
+
+
+missing_dir=`cd $ac_aux_dir && pwd`
+echo $ac_n "checking for working aclocal""... $ac_c" 1>&6
+echo "configure:946: checking for working aclocal" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf. Sigh.
+if (aclocal --version) < /dev/null > /dev/null 2>&1; then
+ ACLOCAL=aclocal
+ echo "$ac_t""found" 1>&6
+else
+ ACLOCAL="$missing_dir/missing aclocal"
+ echo "$ac_t""missing" 1>&6
+fi
+
+echo $ac_n "checking for working autoconf""... $ac_c" 1>&6
+echo "configure:959: checking for working autoconf" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf. Sigh.
+if (autoconf --version) < /dev/null > /dev/null 2>&1; then
+ AUTOCONF=autoconf
+ echo "$ac_t""found" 1>&6
+else
+ AUTOCONF="$missing_dir/missing autoconf"
+ echo "$ac_t""missing" 1>&6
+fi
+
+echo $ac_n "checking for working automake""... $ac_c" 1>&6
+echo "configure:972: checking for working automake" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf. Sigh.
+if (automake --version) < /dev/null > /dev/null 2>&1; then
+ AUTOMAKE=automake
+ echo "$ac_t""found" 1>&6
+else
+ AUTOMAKE="$missing_dir/missing automake"
+ echo "$ac_t""missing" 1>&6
+fi
+
+echo $ac_n "checking for working autoheader""... $ac_c" 1>&6
+echo "configure:985: checking for working autoheader" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf. Sigh.
+if (autoheader --version) < /dev/null > /dev/null 2>&1; then
+ AUTOHEADER=autoheader
+ echo "$ac_t""found" 1>&6
+else
+ AUTOHEADER="$missing_dir/missing autoheader"
+ echo "$ac_t""missing" 1>&6
+fi
+
+echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6
+echo "configure:998: checking for working makeinfo" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf. Sigh.
+if (makeinfo --version) < /dev/null > /dev/null 2>&1; then
+ MAKEINFO=makeinfo
+ echo "$ac_t""found" 1>&6
+else
+ MAKEINFO="$missing_dir/missing makeinfo"
+ echo "$ac_t""missing" 1>&6
+fi
+
+
+
+# FIXME: We temporarily define our own version of AC_PROG_CC. This is
+# copied from autoconf 2.12, but does not call AC_PROG_CC_WORKS. We
+# are probably using a cross compiler, which will not be able to fully
+# link an executable. This should really be fixed in autoconf
+# itself.
+
+
+
+# Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1023: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_CC="gcc"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1053: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_prog_rejected=no
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# -gt 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ set dummy "$ac_dir/$ac_word" "$@"
+ shift
+ ac_cv_prog_CC="$@"
+ fi
+fi
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
+echo "configure:1102: checking whether we are using GNU C" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.c <<EOF
+#ifdef __GNUC__
+ yes;
+#endif
+EOF
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1111: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+ ac_cv_prog_gcc=yes
+else
+ ac_cv_prog_gcc=no
+fi
+fi
+
+echo "$ac_t""$ac_cv_prog_gcc" 1>&6
+
+if test $ac_cv_prog_gcc = yes; then
+ GCC=yes
+ ac_test_CFLAGS="${CFLAGS+set}"
+ ac_save_CFLAGS="$CFLAGS"
+ CFLAGS=
+ echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
+echo "configure:1126: checking whether ${CC-cc} accepts -g" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ echo 'void f(){}' > conftest.c
+if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
+ ac_cv_prog_cc_g=yes
+else
+ ac_cv_prog_cc_g=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$ac_cv_prog_cc_g" 1>&6
+ if test "$ac_test_CFLAGS" = set; then
+ CFLAGS="$ac_save_CFLAGS"
+ elif test $ac_cv_prog_cc_g = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-O2"
+ fi
+else
+ GCC=
+ test "${CFLAGS+set}" = set || CFLAGS="-g"
+fi
+
+
+# Likewise for AC_PROG_CXX.
+
+
+for ac_prog in $CCC c++ g++ gcc CC cxx cc++
+do
+# Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1162: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CXX'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CXX"; then
+ ac_cv_prog_CXX="$CXX" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_CXX="$ac_prog"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+CXX="$ac_cv_prog_CXX"
+if test -n "$CXX"; then
+ echo "$ac_t""$CXX" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+test -n "$CXX" && break
+done
+test -n "$CXX" || CXX="gcc"
+
+test -z "$CXX" && { echo "configure: error: no acceptable c++ found in \$PATH" 1>&2; exit 1; }
+
+echo $ac_n "checking whether we are using GNU C++""... $ac_c" 1>&6
+echo "configure:1195: checking whether we are using GNU C++" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_gxx'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.C <<EOF
+#ifdef __GNUC__
+ yes;
+#endif
+EOF
+if { ac_try='${CXX-g++} -E conftest.C'; { (eval echo configure:1204: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+ ac_cv_prog_gxx=yes
+else
+ ac_cv_prog_gxx=no
+fi
+fi
+
+echo "$ac_t""$ac_cv_prog_gxx" 1>&6
+
+if test $ac_cv_prog_gxx = yes; then
+ GXX=yes
+ ac_test_CXXFLAGS="${CXXFLAGS+set}"
+ ac_save_CXXFLAGS="$CXXFLAGS"
+ CXXFLAGS=
+ echo $ac_n "checking whether ${CXX-g++} accepts -g""... $ac_c" 1>&6
+echo "configure:1219: checking whether ${CXX-g++} accepts -g" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_cxx_g'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ echo 'void f(){}' > conftest.cc
+if test -z "`${CXX-g++} -g -c conftest.cc 2>&1`"; then
+ ac_cv_prog_cxx_g=yes
+else
+ ac_cv_prog_cxx_g=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$ac_cv_prog_cxx_g" 1>&6
+ if test "$ac_test_CXXFLAGS" = set; then
+ CXXFLAGS="$ac_save_CXXFLAGS"
+ elif test $ac_cv_prog_cxx_g = yes; then
+ CXXFLAGS="-g -O2"
+ else
+ CXXFLAGS="-O2"
+ fi
+else
+ GXX=
+ test "${CXXFLAGS+set}" = set || CXXFLAGS="-g"
+fi
+
+
+# AC_CHECK_TOOL does AC_REQUIRE (AC_CANONICAL_BUILD). If we don't
+# run it explicitly here, it will be run implicitly before
+# NEWLIB_CONFIGURE, which doesn't work because that means that it will
+# be run before AC_CANONICAL_HOST.
+echo $ac_n "checking build system type""... $ac_c" 1>&6
+echo "configure:1252: checking build system type" >&5
+
+build_alias=$build
+case "$build_alias" in
+NONE)
+ case $nonopt in
+ NONE) build_alias=$host_alias ;;
+ *) build_alias=$nonopt ;;
+ esac ;;
+esac
+
+build=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $build_alias`
+build_cpu=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+build_vendor=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+build_os=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$build" 1>&6
+
+
+# Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args.
+set dummy ${ac_tool_prefix}as; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1273: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_AS'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$AS"; then
+ ac_cv_prog_AS="$AS" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_AS="${ac_tool_prefix}as"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_prog_AS" && ac_cv_prog_AS="as"
+fi
+fi
+AS="$ac_cv_prog_AS"
+if test -n "$AS"; then
+ echo "$ac_t""$AS" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+
+# Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ar; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1305: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$AR"; then
+ ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_AR="${ac_tool_prefix}ar"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_prog_AR" && ac_cv_prog_AR="ar"
+fi
+fi
+AR="$ac_cv_prog_AR"
+if test -n "$AR"; then
+ echo "$ac_t""$AR" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+
+# Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1337: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$RANLIB"; then
+ ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+RANLIB="$ac_cv_prog_RANLIB"
+if test -n "$RANLIB"; then
+ echo "$ac_t""$RANLIB" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+if test -z "$ac_cv_prog_RANLIB"; then
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1369: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$RANLIB"; then
+ ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_RANLIB="ranlib"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":"
+fi
+fi
+RANLIB="$ac_cv_prog_RANLIB"
+if test -n "$RANLIB"; then
+ echo "$ac_t""$RANLIB" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+else
+ RANLIB=":"
+fi
+fi
+
+
+# Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# ./install, which can be erroneously created by make from ./install.sh.
+echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
+echo "configure:1414: checking for a BSD compatible install" >&5
+if test -z "$INSTALL"; then
+if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":"
+ for ac_dir in $PATH; do
+ # Account for people who put trailing slashes in PATH elements.
+ case "$ac_dir/" in
+ /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ if test -f $ac_dir/$ac_prog; then
+ if test $ac_prog = install &&
+ grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ else
+ ac_cv_path_install="$ac_dir/$ac_prog -c"
+ break 2
+ fi
+ fi
+ done
+ ;;
+ esac
+ done
+ IFS="$ac_save_IFS"
+
+fi
+ if test "${ac_cv_path_install+set}" = set; then
+ INSTALL="$ac_cv_path_install"
+ else
+ # As a last resort, use the slow shell script. We don't cache a
+ # path for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the path is relative.
+ INSTALL="$ac_install_sh"
+ fi
+fi
+echo "$ac_t""$INSTALL" 1>&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+
+echo $ac_n "checking whether to enable maintainer-specific portions of Makefiles""... $ac_c" 1>&6
+echo "configure:1468: checking whether to enable maintainer-specific portions of Makefiles" >&5
+ # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given.
+if test "${enable_maintainer_mode+set}" = set; then
+ enableval="$enable_maintainer_mode"
+ USE_MAINTAINER_MODE=$enableval
+else
+ USE_MAINTAINER_MODE=no
+fi
+
+ echo "$ac_t""$USE_MAINTAINER_MODE" 1>&6
+
+
+if test $USE_MAINTAINER_MODE = yes; then
+ MAINTAINER_MODE_TRUE=
+ MAINTAINER_MODE_FALSE='#'
+else
+ MAINTAINER_MODE_TRUE='#'
+ MAINTAINER_MODE_FALSE=
+fi
+ MAINT=$MAINTAINER_MODE_TRUE
+
+
+
+# We need AC_EXEEXT to keep automake happy in cygnus mode. However,
+# at least currently, we never actually build a program, so we never
+# need to use $(EXEEXT). Moreover, the test for EXEEXT normally
+# fails, because we are probably configuring with a cross compiler
+# which can't create executables. So we include AC_EXEEXT to keep
+# automake happy, but we don't execute it, since we don't care about
+# the result.
+if false; then
+
+
+echo $ac_n "checking for executable suffix""... $ac_c" 1>&6
+echo "configure:1502: checking for executable suffix" >&5
+if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test "$CYGWIN" = yes || test "$MINGW32" = yes; then
+ ac_cv_exeext=.exe
+else
+ rm -f conftest*
+ echo 'int main () { return 0; }' > conftest.$ac_ext
+ ac_cv_exeext=
+ if { (eval echo configure:1512: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
+ for file in conftest.*; do
+ case $file in
+ *.c | *.o | *.obj | *.ilk | *.pdb) ;;
+ *) ac_cv_exeext=`echo $file | sed -e s/conftest//` ;;
+ esac
+ done
+ else
+ { echo "configure: error: installation or configuration problem: compiler cannot create executables." 1>&2; exit 1; }
+ fi
+ rm -f conftest*
+ test x"${ac_cv_exeext}" = x && ac_cv_exeext=no
+fi
+fi
+
+EXEEXT=""
+test x"${ac_cv_exeext}" != xno && EXEEXT=${ac_cv_exeext}
+echo "$ac_t""${ac_cv_exeext}" 1>&6
+ac_exeext=$EXEEXT
+
+fi
+
+. ${boehm_gc_basedir}/configure.host
+
+case ${boehm_gc_basedir} in
+/* | A-Za-z:/\\*) boehm_gc_flagbasedir=${boehm_gc_basedir} ;;
+*) boehm_gc_flagbasedir='$(top_builddir)/'${boehm_gc_basedir} ;;
+esac
+
+boehm_gc_cflags="${boehm_gc_cflags} -I"'$(top_builddir)'"/./targ-include -I${boehm_gc_flagbasedir}/libc/include"
+case "${host}" in
+ *-*-cygwin32*)
+ boehm_gc_cflags="${boehm_gc_cflags} -I${boehm_gc_flagbasedir}/../winsup/include"
+ ;;
+esac
+
+boehm_gc_cflags="${boehm_gc_cflags} -fno-builtin"
+
+BOEHM_GC_CFLAGS=${boehm_gc_cflags}
+
+
+
+# Check whether --enable-shared or --disable-shared was given.
+if test "${enable_shared+set}" = set; then
+ enableval="$enable_shared"
+ p=${PACKAGE-default}
+case "$enableval" in
+yes) enable_shared=yes ;;
+no) enable_shared=no ;;
+*)
+ enable_shared=no
+ # Look at the argument we got. We use all the common list separators.
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
+ for pkg in $enableval; do
+ if test "X$pkg" = "X$p"; then
+ enable_shared=yes
+ fi
+ done
+ IFS="$ac_save_ifs"
+ ;;
+esac
+else
+ enable_shared=yes
+fi
+
+# Check whether --enable-static or --disable-static was given.
+if test "${enable_static+set}" = set; then
+ enableval="$enable_static"
+ p=${PACKAGE-default}
+case "$enableval" in
+yes) enable_static=yes ;;
+no) enable_static=no ;;
+*)
+ enable_static=no
+ # Look at the argument we got. We use all the common list separators.
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
+ for pkg in $enableval; do
+ if test "X$pkg" = "X$p"; then
+ enable_static=yes
+ fi
+ done
+ IFS="$ac_save_ifs"
+ ;;
+esac
+else
+ enable_static=yes
+fi
+
+# Check whether --enable-fast-install or --disable-fast-install was given.
+if test "${enable_fast_install+set}" = set; then
+ enableval="$enable_fast_install"
+ p=${PACKAGE-default}
+case "$enableval" in
+yes) enable_fast_install=yes ;;
+no) enable_fast_install=no ;;
+*)
+ enable_fast_install=no
+ # Look at the argument we got. We use all the common list separators.
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
+ for pkg in $enableval; do
+ if test "X$pkg" = "X$p"; then
+ enable_fast_install=yes
+ fi
+ done
+ IFS="$ac_save_ifs"
+ ;;
+esac
+else
+ enable_fast_install=yes
+fi
+
+# Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1626: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$RANLIB"; then
+ ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_RANLIB="ranlib"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":"
+fi
+fi
+RANLIB="$ac_cv_prog_RANLIB"
+if test -n "$RANLIB"; then
+ echo "$ac_t""$RANLIB" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+# Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1656: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_CC="gcc"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1686: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_prog_rejected=no
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# -gt 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ set dummy "$ac_dir/$ac_word" "$@"
+ shift
+ ac_cv_prog_CC="$@"
+ fi
+fi
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ if test -z "$CC"; then
+ case "`uname -s`" in
+ *win32* | *WIN32*)
+ # Extract the first word of "cl", so it can be a program name with args.
+set dummy cl; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1737: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_CC="cl"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+ ;;
+ esac
+ fi
+ test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
+echo "configure:1769: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+cat > conftest.$ac_ext << EOF
+
+#line 1780 "configure"
+#include "confdefs.h"
+
+main(){return(0);}
+EOF
+if { (eval echo configure:1785: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ ac_cv_prog_cc_works=yes
+ # If we can't run a trivial program, we are probably using a cross compiler.
+ if (./conftest; exit) 2>/dev/null; then
+ ac_cv_prog_cc_cross=no
+ else
+ ac_cv_prog_cc_cross=yes
+ fi
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ ac_cv_prog_cc_works=no
+fi
+rm -fr conftest*
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo "$ac_t""$ac_cv_prog_cc_works" 1>&6
+if test $ac_cv_prog_cc_works = no; then
+ { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
+fi
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
+echo "configure:1811: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
+echo "configure:1816: checking whether we are using GNU C" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.c <<EOF
+#ifdef __GNUC__
+ yes;
+#endif
+EOF
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1825: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+ ac_cv_prog_gcc=yes
+else
+ ac_cv_prog_gcc=no
+fi
+fi
+
+echo "$ac_t""$ac_cv_prog_gcc" 1>&6
+
+if test $ac_cv_prog_gcc = yes; then
+ GCC=yes
+else
+ GCC=
+fi
+
+ac_test_CFLAGS="${CFLAGS+set}"
+ac_save_CFLAGS="$CFLAGS"
+CFLAGS=
+echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
+echo "configure:1844: checking whether ${CC-cc} accepts -g" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ echo 'void f(){}' > conftest.c
+if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
+ ac_cv_prog_cc_g=yes
+else
+ ac_cv_prog_cc_g=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$ac_cv_prog_cc_g" 1>&6
+if test "$ac_test_CFLAGS" = set; then
+ CFLAGS="$ac_save_CFLAGS"
+elif test $ac_cv_prog_cc_g = yes; then
+ if test "$GCC" = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-g"
+ fi
+else
+ if test "$GCC" = yes; then
+ CFLAGS="-O2"
+ else
+ CFLAGS=
+ fi
+fi
+
+# Check whether --with-gnu-ld or --without-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then
+ withval="$with_gnu_ld"
+ test "$withval" = no || with_gnu_ld=yes
+else
+ with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test "$ac_cv_prog_gcc" = yes; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ echo $ac_n "checking for ld used by GCC""... $ac_c" 1>&6
+echo "configure:1887: checking for ld used by GCC" >&5
+ ac_prog=`($CC -print-prog-name=ld) 2>&5`
+ case "$ac_prog" in
+ # Accept absolute paths.
+ /* | [A-Za-z]:[\\/]*)
+ re_direlt='/[^/][^/]*/\.\./'
+ # Canonicalize the path of ld
+ ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'`
+ while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
+ ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
+ done
+ test -z "$LD" && LD="$ac_prog"
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ac_prog=ld
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+elif test "$with_gnu_ld" = yes; then
+ echo $ac_n "checking for GNU ld""... $ac_c" 1>&6
+echo "configure:1911: checking for GNU ld" >&5
+else
+ echo $ac_n "checking for non-GNU ld""... $ac_c" 1>&6
+echo "configure:1914: checking for non-GNU ld" >&5
+fi
+if eval "test \"`echo '$''{'ac_cv_path_LD'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -z "$LD"; then
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog"; then
+ ac_cv_path_LD="$ac_dir/$ac_prog"
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some GNU ld's only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ if "$ac_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then
+ test "$with_gnu_ld" != no && break
+ else
+ test "$with_gnu_ld" != yes && break
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+else
+ ac_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$ac_cv_path_LD"
+if test -n "$LD"; then
+ echo "$ac_t""$LD" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+test -z "$LD" && { echo "configure: error: no acceptable ld found in \$PATH" 1>&2; exit 1; }
+
+echo $ac_n "checking if the linker ($LD) is GNU ld""... $ac_c" 1>&6
+echo "configure:1950: checking if the linker ($LD) is GNU ld" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_gnu_ld'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ # I'd rather use --version here, but apparently some GNU ld's only accept -v.
+if $LD -v 2>&1 </dev/null | egrep '(GNU|with BFD)' 1>&5; then
+ ac_cv_prog_gnu_ld=yes
+else
+ ac_cv_prog_gnu_ld=no
+fi
+fi
+
+echo "$ac_t""$ac_cv_prog_gnu_ld" 1>&6
+
+
+echo $ac_n "checking for BSD-compatible nm""... $ac_c" 1>&6
+echo "configure:1966: checking for BSD-compatible nm" >&5
+if eval "test \"`echo '$''{'ac_cv_path_NM'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$NM"; then
+ # Let the user override the test.
+ ac_cv_path_NM="$NM"
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/nm; then
+ # Check to see if the nm accepts a BSD-compat flag.
+ # Adding the `sed 1q' prevents false positives on HP-UX, which says:
+ # nm: unknown option "B" ignored
+ if ($ac_dir/nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
+ ac_cv_path_NM="$ac_dir/nm -B"
+ break
+ elif ($ac_dir/nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
+ ac_cv_path_NM="$ac_dir/nm -p"
+ break
+ else
+ ac_cv_path_NM=${ac_cv_path_NM="$ac_dir/nm"} # keep the first match, but
+ continue # so that we can try to find one that supports BSD flags
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_NM" && ac_cv_path_NM=nm
+fi
+fi
+
+NM="$ac_cv_path_NM"
+echo "$ac_t""$NM" 1>&6
+
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+echo $ac_n "checking command to parse $NM output""... $ac_c" 1>&6
+echo "configure:2004: checking command to parse $NM output" >&5
+if eval "test \"`echo '$''{'ac_cv_sys_global_symbol_pipe'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ # These are sane defaults that work on at least a few old systems.
+# {They come from Ultrix. What could be older than Ultrix?!! ;)}
+
+# Character class describing NM global symbol codes.
+ac_symcode='[BCDEGRST]'
+
+# Regexp to match symbols that can be accessed directly from C.
+ac_sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
+
+# Transform the above into a raw symbol and a C symbol.
+ac_symxfrm='\1 \2\3 \3'
+
+# Transform an extracted symbol line into a proper C declaration
+ac_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern char \1;/p'"
+
+# Define system-specific variables.
+case "$host_os" in
+aix*)
+ ac_symcode='[BCDT]'
+ ;;
+cygwin* | mingw*)
+ ac_symcode='[ABCDGISTW]'
+ ;;
+hpux*)
+ ac_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern char \1();/p' -e 's/^. .* \(.*\)$/extern char \1;/p'"
+ ;;
+irix*)
+ ac_symcode='[BCDEGRST]'
+ ;;
+solaris*)
+ ac_symcode='[BDT]'
+ ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+if $NM -V 2>&1 | egrep '(GNU|with BFD)' > /dev/null; then
+ ac_symcode='[ABCDGISTW]'
+fi
+
+# Try without a prefix undercore, then with it.
+for ac_symprfx in "" "_"; do
+
+ ac_cv_sys_global_symbol_pipe="sed -n -e 's/^.* \($ac_symcode\) *\($ac_symprfx\)$ac_sympat$/$ac_symxfrm/p'"
+
+ # Check to see that the pipe works correctly.
+ ac_pipe_works=no
+ rm -f conftest.$ac_ext
+ cat > conftest.$ac_ext <<EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func;return 0;}
+EOF
+
+ if { (eval echo configure:2067: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ # Now try to grab the symbols.
+ ac_nlist=conftest.nm
+
+ if { (eval echo configure:2071: \"$NM conftest.$ac_objext \| $ac_cv_sys_global_symbol_pipe \> $ac_nlist\") 1>&5; (eval $NM conftest.$ac_objext \| $ac_cv_sys_global_symbol_pipe \> $ac_nlist) 2>&5; } && test -s "$ac_nlist"; then
+
+ # Try sorting and uniquifying the output.
+ if sort "$ac_nlist" | uniq > "$ac_nlist"T; then
+ mv -f "$ac_nlist"T "$ac_nlist"
+ else
+ rm -f "$ac_nlist"T
+ fi
+
+ # Make sure that we snagged all the symbols we need.
+ if egrep ' nm_test_var$' "$ac_nlist" >/dev/null; then
+ if egrep ' nm_test_func$' "$ac_nlist" >/dev/null; then
+ cat <<EOF > conftest.c
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+EOF
+ # Now generate the symbol file.
+ eval "$ac_global_symbol_to_cdecl"' < "$ac_nlist" >> conftest.c'
+
+ cat <<EOF >> conftest.c
+#if defined (__STDC__) && __STDC__
+# define lt_ptr_t void *
+#else
+# define lt_ptr_t char *
+# define const
+#endif
+
+/* The mapping between symbol names and symbols. */
+const struct {
+ const char *name;
+ lt_ptr_t address;
+}
+lt_preloaded_symbols[] =
+{
+EOF
+ sed 's/^. \(.*\) \(.*\)$/ {"\2", (lt_ptr_t) \&\2},/' < "$ac_nlist" >> conftest.c
+ cat <<\EOF >> conftest.c
+ {0, (lt_ptr_t) 0}
+};
+
+#ifdef __cplusplus
+}
+#endif
+EOF
+ # Now try linking the two files.
+ mv conftest.$ac_objext conftestm.$ac_objext
+ ac_save_LIBS="$LIBS"
+ ac_save_CFLAGS="$CFLAGS"
+ LIBS="conftestm.$ac_objext"
+ CFLAGS="$CFLAGS$no_builtin_flag"
+ if { (eval echo configure:2123: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ ac_pipe_works=yes
+ else
+ echo "configure: failed program was:" >&5
+ cat conftest.c >&5
+ fi
+ LIBS="$ac_save_LIBS"
+ CFLAGS="$ac_save_CFLAGS"
+ else
+ echo "cannot find nm_test_func in $ac_nlist" >&5
+ fi
+ else
+ echo "cannot find nm_test_var in $ac_nlist" >&5
+ fi
+ else
+ echo "cannot run $ac_cv_sys_global_symbol_pipe" >&5
+ fi
+ else
+ echo "$progname: failed program was:" >&5
+ cat conftest.c >&5
+ fi
+ rm -rf conftest*
+
+ # Do not use the global_symbol_pipe unless it works.
+ if test "$ac_pipe_works" = yes; then
+ if test x"$ac_symprfx" = x"_"; then
+ ac_cv_sys_symbol_underscore=yes
+ else
+ ac_cv_sys_symbol_underscore=no
+ fi
+ break
+ else
+ ac_cv_sys_global_symbol_pipe=
+ fi
+done
+
+fi
+
+
+ac_result=yes
+if test -z "$ac_cv_sys_global_symbol_pipe"; then
+ ac_result=no
+fi
+echo "$ac_t""$ac_result" 1>&6
+
+echo $ac_n "checking for _ prefix in compiled symbols""... $ac_c" 1>&6
+echo "configure:2169: checking for _ prefix in compiled symbols" >&5
+if eval "test \"`echo '$''{'ac_cv_sys_symbol_underscore'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_cv_sys_symbol_underscore=no
+cat > conftest.$ac_ext <<EOF
+void nm_test_func(){}
+int main(){nm_test_func;return 0;}
+EOF
+if { (eval echo configure:2178: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ # Now try to grab the symbols.
+ ac_nlist=conftest.nm
+ if { (eval echo configure:2181: \"$NM conftest.$ac_objext \| $ac_cv_sys_global_symbol_pipe \> $ac_nlist\") 1>&5; (eval $NM conftest.$ac_objext \| $ac_cv_sys_global_symbol_pipe \> $ac_nlist) 2>&5; } && test -s "$ac_nlist"; then
+ # See whether the symbols have a leading underscore.
+ if egrep '^. _nm_test_func' "$ac_nlist" >/dev/null; then
+ ac_cv_sys_symbol_underscore=yes
+ else
+ if egrep '^. nm_test_func ' "$ac_nlist" >/dev/null; then
+ :
+ else
+ echo "configure: cannot find nm_test_func in $ac_nlist" >&5
+ fi
+ fi
+ else
+ echo "configure: cannot run $ac_cv_sys_global_symbol_pipe" >&5
+ fi
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.c >&5
+fi
+rm -rf conftest*
+
+fi
+
+echo "$ac_t""$ac_cv_sys_symbol_underscore" 1>&6
+USE_SYMBOL_UNDERSCORE=${ac_cv_sys_symbol_underscore=no}
+
+echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6
+echo "configure:2207: checking whether ln -s works" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ rm -f conftestdata
+if ln -s X conftestdata 2>/dev/null
+then
+ rm -f conftestdata
+ ac_cv_prog_LN_S="ln -s"
+else
+ ac_cv_prog_LN_S=ln
+fi
+fi
+LN_S="$ac_cv_prog_LN_S"
+if test "$ac_cv_prog_LN_S" = "ln -s"; then
+ echo "$ac_t""yes" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+# Check for any special flags to pass to ltconfig.
+libtool_flags="--cache-file=$cache_file"
+test "$enable_shared" = no && libtool_flags="$libtool_flags --disable-shared"
+test "$enable_static" = no && libtool_flags="$libtool_flags --disable-static"
+test "$enable_fast_install" = no && libtool_flags="$libtool_flags --disable-fast-install"
+test "$lt_dlopen" = yes && libtool_flags="$libtool_flags --enable-dlopen"
+test "$silent" = yes && libtool_flags="$libtool_flags --silent"
+test "$ac_cv_prog_gcc" = yes && libtool_flags="$libtool_flags --with-gcc"
+test "$ac_cv_prog_gnu_ld" = yes && libtool_flags="$libtool_flags --with-gnu-ld"
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case "$host" in
+*-*-irix6*)
+ # Find out which ABI we are using.
+ echo '#line 2243 "configure"' > conftest.$ac_ext
+ if { (eval echo configure:2244: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ case "`/usr/bin/file conftest.o`" in
+ *32-bit*)
+ LD="${LD-ld} -32"
+ ;;
+ *N32*)
+ LD="${LD-ld} -n32"
+ ;;
+ *64-bit*)
+ LD="${LD-ld} -64"
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+
+*-*-sco3.2v5*)
+ # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+ SAVE_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -belf"
+ echo $ac_n "checking whether the C compiler needs -belf""... $ac_c" 1>&6
+echo "configure:2265: checking whether the C compiler needs -belf" >&5
+if eval "test \"`echo '$''{'lt_cv_cc_needs_belf'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2270 "configure"
+#include "confdefs.h"
+
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:2277: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ lt_cv_cc_needs_belf=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ lt_cv_cc_needs_belf=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$lt_cv_cc_needs_belf" 1>&6
+ if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+ # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+ CFLAGS="$SAVE_CFLAGS"
+ fi
+ ;;
+
+*-*-cygwin*)
+ # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dlltool; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:2300: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_DLLTOOL'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$DLLTOOL"; then
+ ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+DLLTOOL="$ac_cv_prog_DLLTOOL"
+if test -n "$DLLTOOL"; then
+ echo "$ac_t""$DLLTOOL" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+if test -z "$ac_cv_prog_DLLTOOL"; then
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "dlltool", so it can be a program name with args.
+set dummy dlltool; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:2332: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_DLLTOOL'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$DLLTOOL"; then
+ ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_DLLTOOL="dlltool"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_prog_DLLTOOL" && ac_cv_prog_DLLTOOL="false"
+fi
+fi
+DLLTOOL="$ac_cv_prog_DLLTOOL"
+if test -n "$DLLTOOL"; then
+ echo "$ac_t""$DLLTOOL" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+else
+ DLLTOOL="false"
+fi
+fi
+
+# Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args.
+set dummy ${ac_tool_prefix}as; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:2367: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_AS'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$AS"; then
+ ac_cv_prog_AS="$AS" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_AS="${ac_tool_prefix}as"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+AS="$ac_cv_prog_AS"
+if test -n "$AS"; then
+ echo "$ac_t""$AS" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+if test -z "$ac_cv_prog_AS"; then
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "as", so it can be a program name with args.
+set dummy as; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:2399: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_AS'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$AS"; then
+ ac_cv_prog_AS="$AS" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_AS="as"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_prog_AS" && ac_cv_prog_AS="false"
+fi
+fi
+AS="$ac_cv_prog_AS"
+if test -n "$AS"; then
+ echo "$ac_t""$AS" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+else
+ AS="false"
+fi
+fi
+
+
+ ;;
+
+esac
+
+# enable the --disable-libtool-lock switch
+
+# Check whether --enable-libtool-lock or --disable-libtool-lock was given.
+if test "${enable_libtool_lock+set}" = set; then
+ enableval="$enable_libtool_lock"
+ need_locks=$enableval
+else
+ need_locks=yes
+fi
+
+
+if test x"$need_locks" = xno; then
+ libtool_flags="$libtool_flags --disable-lock"
+fi
+
+
+# Save cache, so that ltconfig can load it
+cat > confcache <<\EOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs. It is not useful on other systems.
+# If it contains results you don't want to keep, you may remove or edit it.
+#
+# By default, configure uses ./config.cache as the cache file,
+# creating it if it does not exist already. You can give configure
+# the --cache-file=FILE option to use a different cache file; that is
+# what configure does when it calls configure scripts in
+# subdirectories, so they share the cache.
+# Giving --cache-file=/dev/null disables caching, for debugging configure.
+# config.status only pays attention to the cache file if you give it the
+# --recheck option to rerun configure.
+#
+EOF
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(set) 2>&1 |
+ case `(ac_space=' '; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ # `set' does not quote correctly, so add quotes (double-quote substitution
+ # turns \\\\ into \\, and sed turns \\ into \).
+ sed -n \
+ -e "s/'/'\\\\''/g" \
+ -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
+ ;;
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
+ ;;
+ esac >> confcache
+if cmp -s $cache_file confcache; then
+ :
+else
+ if test -w $cache_file; then
+ echo "updating cache $cache_file"
+ cat confcache > $cache_file
+ else
+ echo "not updating unwritable cache $cache_file"
+ fi
+fi
+rm -f confcache
+
+
+# Actually configure libtool. ac_aux_dir is where install-sh is found.
+CC="$CC" CFLAGS="$CFLAGS" CPPFLAGS="$CPPFLAGS" \
+LD="$LD" NM="$NM" RANLIB="$RANLIB" LN_S="$LN_S" \
+DLLTOOL="$DLLTOOL" AS="$AS" \
+${CONFIG_SHELL-/bin/sh} $ac_aux_dir/ltconfig --no-reexec \
+$libtool_flags --no-verify $ac_aux_dir/ltmain.sh $host \
+|| { echo "configure: error: libtool configure failed" 1>&2; exit 1; }
+
+# Reload cache, that may have been modified by ltconfig
+if test -r "$cache_file"; then
+ echo "loading cache $cache_file"
+ . $cache_file
+else
+ echo "creating cache $cache_file"
+ > $cache_file
+fi
+
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ac_aux_dir/ltconfig $ac_aux_dir/ltmain.sh"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+
+# Redirect the config.log output again, so that the ltconfig log is not
+# clobbered by the next message.
+exec 5>>./config.log
+
+
+# Check whether --with-target-subdir or --without-target-subdir was given.
+if test "${with_target_subdir+set}" = set; then
+ withval="$with_target_subdir"
+ :
+fi
+
+# Check whether --with-cross-host or --without-cross-host was given.
+if test "${with_cross_host+set}" = set; then
+ withval="$with_cross_host"
+ :
+fi
+
+
+echo $ac_n "checking whether to enable maintainer-specific portions of Makefiles""... $ac_c" 1>&6
+echo "configure:2544: checking whether to enable maintainer-specific portions of Makefiles" >&5
+ # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given.
+if test "${enable_maintainer_mode+set}" = set; then
+ enableval="$enable_maintainer_mode"
+ USE_MAINTAINER_MODE=$enableval
+else
+ USE_MAINTAINER_MODE=no
+fi
+
+ echo "$ac_t""$USE_MAINTAINER_MODE" 1>&6
+
+
+if test $USE_MAINTAINER_MODE = yes; then
+ MAINTAINER_MODE_TRUE=
+ MAINTAINER_MODE_FALSE='#'
+else
+ MAINTAINER_MODE_TRUE='#'
+ MAINTAINER_MODE_FALSE=
+fi
+ MAINT=$MAINTAINER_MODE_TRUE
+
+
+# automake wants to see AC_EXEEXT. But we don't need it. And having
+# it is actually a problem, because the compiler we're passed can't
+# necessarily do a full link. So we fool automake here.
+if test "x" = "y"; then
+
+
+echo $ac_n "checking for executable suffix""... $ac_c" 1>&6
+echo "configure:2573: checking for executable suffix" >&5
+if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test "$CYGWIN" = yes || test "$MINGW32" = yes; then
+ ac_cv_exeext=.exe
+else
+ rm -f conftest*
+ echo 'int main () { return 0; }' > conftest.$ac_ext
+ ac_cv_exeext=
+ if { (eval echo configure:2583: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
+ for file in conftest.*; do
+ case $file in
+ *.c | *.o | *.obj | *.ilk | *.pdb) ;;
+ *) ac_cv_exeext=`echo $file | sed -e s/conftest//` ;;
+ esac
+ done
+ else
+ { echo "configure: error: installation or configuration problem: compiler cannot create executables." 1>&2; exit 1; }
+ fi
+ rm -f conftest*
+ test x"${ac_cv_exeext}" = x && ac_cv_exeext=no
+fi
+fi
+
+EXEEXT=""
+test x"${ac_cv_exeext}" != xno && EXEEXT=${ac_cv_exeext}
+echo "$ac_t""${ac_cv_exeext}" 1>&6
+ac_exeext=$EXEEXT
+
+fi
+
+echo $ac_n "checking for threads package to use""... $ac_c" 1>&6
+echo "configure:2606: checking for threads package to use" >&5
+# Check whether --enable-threads or --disable-threads was given.
+if test "${enable_threads+set}" = set; then
+ enableval="$enable_threads"
+ THREADS=$enableval
+else
+ THREADS=no
+fi
+
+
+if test "$THREADS" = yes; then
+ case "$host" in
+ *-*-vxworks*)
+ THREADS=vxworks
+ ;;
+ *-*-linux*)
+ # FIXME: this isn't correct in all cases.
+ THREADS=posix
+ ;;
+ *-*-win*)
+ THREADS=win32
+ ;;
+ *-*-irix*)
+ # FIXME: for now, choose POSIX, because we implement that.
+ # Later, choose irix threads.
+ THREADS=posix
+ ;;
+ *-*-solaris*)
+ # FIXME: for now, choose POSIX, because we implement that.
+ # Later, choose solaris threads.
+ THREADS=posix
+ ;;
+ *)
+ # For now.
+ THREADS=none
+ ;;
+ esac
+fi
+
+INCLUDES=
+case "$THREADS" in
+ no | none | single)
+ THREADS=none
+ ;;
+ posix | pthreads)
+ THREADS=posix
+ case "$host" in
+ *-*-linux*)
+ cat >> confdefs.h <<\EOF
+#define LINUX_THREADS 1
+EOF
+
+ cat >> confdefs.h <<\EOF
+#define _REENTRANT 1
+EOF
+
+ ;;
+ *-*-solaris*)
+ cat >> confdefs.h <<\EOF
+#define SOLARIS_THREADS 1
+EOF
+
+ cat >> confdefs.h <<\EOF
+#define _SOLARIS_PTHREADS 1
+EOF
+
+ ;;
+ *-*-irix*)
+ cat >> confdefs.h <<\EOF
+#define IRIX_THREADS 1
+EOF
+
+ ;;
+ esac
+ ;;
+ qt)
+ cat >> confdefs.h <<\EOF
+#define QUICK_THREADS 1
+EOF
+
+ INCLUDES="-I${boehm_gc_basedir}/../qthreads"
+ ;;
+ decosf1 | irix | mach | os2 | solaris | win32 | dce | vxworks)
+ { echo "configure: error: thread package $THREADS not yet supported" 1>&2; exit 1; }
+ ;;
+ *)
+ { echo "configure: error: $THREADS is an unknown thread package" 1>&2; exit 1; }
+ ;;
+esac
+echo "$ac_t""$THREADS" 1>&6
+
+# Check whether --enable-java-gc or --disable-java-gc was given.
+if test "${enable_java_gc+set}" = set; then
+ enableval="$enable_java_gc"
+
+ GC=$enableval
+else
+ GC=boehm
+fi
+
+target_all=
+if test "$GC" = "boehm"; then
+ target_all=libgcjgc.la
+fi
+
+
+TARGET_ECOS="no"
+# Check whether --with-ecos or --without-ecos was given.
+if test "${with_ecos+set}" = set; then
+ withval="$with_ecos"
+ TARGET_ECOS="$with_ecos"
+
+fi
+
+
+addobjs=
+CXXINCLUDES=
+case "$TARGET_ECOS" in
+ no)
+ ;;
+ *)
+ cat >> confdefs.h <<\EOF
+#define ECOS 1
+EOF
+
+ CXXINCLUDES="-I${TARGET_ECOS}/include"
+ addobjs="$addobjs ecos.lo"
+ ;;
+esac
+
+
+
+
+
+machdep=
+case "$host" in
+ alpha*-*-*)
+ machdep="alpha_mach_dep.lo"
+ ;;
+ mips-*-*)
+ machdep="mips_sgi_mach_dep.lo"
+ cat >> confdefs.h <<\EOF
+#define NO_EXECUTE_PERMISSION 1
+EOF
+
+ ;;
+ mipstx39-*-elf*)
+ machdep="mips_ultrix_mach_dep.lo"
+ cat >> confdefs.h <<\EOF
+#define STACKBASE __stackbase
+EOF
+
+ cat >> confdefs.h <<\EOF
+#define DATASTART_IS_ETEXT 1
+EOF
+
+ ;;
+ sparc-sun-solaris2.3*)
+ cat >> confdefs.h <<\EOF
+#define SUNOS53_SHARED_LIB 1
+EOF
+
+ ;;
+esac
+if test x"$machdep" = x; then
+ machdep="mach_dep.lo"
+fi
+addobjs="$addobjs $machdep"
+
+
+case "$host" in
+ sparc-sun-solaris2*)
+ if test "$GCC" = yes; then
+ new_CFLAGS=
+ for i in $CFLAGS; do
+ case "$i" in
+ -O*)
+ ;;
+ *)
+ new_CFLAGS="$new_CFLAGS $i"
+ ;;
+ esac
+ done
+ CFLAGS="$new_CFLAGS"
+ fi
+ ;;
+esac
+
+MY_CFLAGS="$CFLAGS"
+
+
+cat >> confdefs.h <<\EOF
+#define SILENT 1
+EOF
+
+cat >> confdefs.h <<\EOF
+#define NO_SIGNALS 1
+EOF
+
+cat >> confdefs.h <<\EOF
+#define NO_DEBUGGING 1
+EOF
+
+cat >> confdefs.h <<\EOF
+#define JAVA_FINALIZATION 1
+EOF
+
+
+
+
+if test -n "${with_cross_host}"; then
+ cat >> confdefs.h <<\EOF
+#define NO_SIGSET 1
+EOF
+
+ cat >> confdefs.h <<\EOF
+#define NO_CLOCK 1
+EOF
+
+ cat >> confdefs.h <<\EOF
+#define SMALL_CONFIG 1
+EOF
+
+fi
+
+
+
+if test -z "$with_cross_host"; then
+ USE_LIBDIR_TRUE=
+ USE_LIBDIR_FALSE='#'
+else
+ USE_LIBDIR_TRUE='#'
+ USE_LIBDIR_FALSE=
+fi
+
+if test "${multilib}" = "yes"; then
+ multilib_arg="--enable-multilib"
+else
+ multilib_arg=
+fi
+
+trap '' 1 2 15
+cat > confcache <<\EOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs. It is not useful on other systems.
+# If it contains results you don't want to keep, you may remove or edit it.
+#
+# By default, configure uses ./config.cache as the cache file,
+# creating it if it does not exist already. You can give configure
+# the --cache-file=FILE option to use a different cache file; that is
+# what configure does when it calls configure scripts in
+# subdirectories, so they share the cache.
+# Giving --cache-file=/dev/null disables caching, for debugging configure.
+# config.status only pays attention to the cache file if you give it the
+# --recheck option to rerun configure.
+#
+EOF
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(set) 2>&1 |
+ case `(ac_space=' '; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ # `set' does not quote correctly, so add quotes (double-quote substitution
+ # turns \\\\ into \\, and sed turns \\ into \).
+ sed -n \
+ -e "s/'/'\\\\''/g" \
+ -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
+ ;;
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
+ ;;
+ esac >> confcache
+if cmp -s $cache_file confcache; then
+ :
+else
+ if test -w $cache_file; then
+ echo "updating cache $cache_file"
+ cat confcache > $cache_file
+ else
+ echo "not updating unwritable cache $cache_file"
+ fi
+fi
+rm -f confcache
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Any assignment to VPATH causes Sun make to only execute
+# the first set of double-colon rules, so remove it if not needed.
+# If there is a colon in the path, we need to keep it.
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d'
+fi
+
+trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
+
+# Transform confdefs.h into DEFS.
+# Protect against shell expansion while executing Makefile rules.
+# Protect against Makefile macro expansion.
+cat > conftest.defs <<\EOF
+s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g
+s%[ `~#$^&*(){}\\|;'"<>?]%\\&%g
+s%\[%\\&%g
+s%\]%\\&%g
+s%\$%$$%g
+EOF
+DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '`
+rm -f conftest.defs
+
+
+# Without the "./", some shells look in PATH for config.status.
+: ${CONFIG_STATUS=./config.status}
+
+echo creating $CONFIG_STATUS
+rm -f $CONFIG_STATUS
+cat > $CONFIG_STATUS <<EOF
+#! /bin/sh
+# Generated automatically by configure.
+# Run this file to recreate the current configuration.
+# This directory was configured as follows,
+# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+#
+# $0 $ac_configure_args
+#
+# Compiler output produced by configure, useful for debugging
+# configure, is in ./config.log if it exists.
+
+ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
+for ac_option
+do
+ case "\$ac_option" in
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
+ exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
+ -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
+ echo "$CONFIG_STATUS generated by autoconf version 2.13"
+ exit 0 ;;
+ -help | --help | --hel | --he | --h)
+ echo "\$ac_cs_usage"; exit 0 ;;
+ *) echo "\$ac_cs_usage"; exit 1 ;;
+ esac
+done
+
+ac_given_srcdir=$srcdir
+ac_given_INSTALL="$INSTALL"
+
+trap 'rm -fr `echo "Makefile" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+# Protect against being on the right side of a sed subst in config.status.
+sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
+ s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
+$ac_vpsub
+$extrasub
+s%@SHELL@%$SHELL%g
+s%@CFLAGS@%$CFLAGS%g
+s%@CPPFLAGS@%$CPPFLAGS%g
+s%@CXXFLAGS@%$CXXFLAGS%g
+s%@FFLAGS@%$FFLAGS%g
+s%@DEFS@%$DEFS%g
+s%@LDFLAGS@%$LDFLAGS%g
+s%@LIBS@%$LIBS%g
+s%@exec_prefix@%$exec_prefix%g
+s%@prefix@%$prefix%g
+s%@program_transform_name@%$program_transform_name%g
+s%@bindir@%$bindir%g
+s%@sbindir@%$sbindir%g
+s%@libexecdir@%$libexecdir%g
+s%@datadir@%$datadir%g
+s%@sysconfdir@%$sysconfdir%g
+s%@sharedstatedir@%$sharedstatedir%g
+s%@localstatedir@%$localstatedir%g
+s%@libdir@%$libdir%g
+s%@includedir@%$includedir%g
+s%@oldincludedir@%$oldincludedir%g
+s%@infodir@%$infodir%g
+s%@mandir@%$mandir%g
+s%@host@%$host%g
+s%@host_alias@%$host_alias%g
+s%@host_cpu@%$host_cpu%g
+s%@host_vendor@%$host_vendor%g
+s%@host_os@%$host_os%g
+s%@target@%$target%g
+s%@target_alias@%$target_alias%g
+s%@target_cpu@%$target_cpu%g
+s%@target_vendor@%$target_vendor%g
+s%@target_os@%$target_os%g
+s%@build@%$build%g
+s%@build_alias@%$build_alias%g
+s%@build_cpu@%$build_cpu%g
+s%@build_vendor@%$build_vendor%g
+s%@build_os@%$build_os%g
+s%@boehm_gc_basedir@%$boehm_gc_basedir%g
+s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
+s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g
+s%@INSTALL_DATA@%$INSTALL_DATA%g
+s%@PACKAGE@%$PACKAGE%g
+s%@VERSION@%$VERSION%g
+s%@ACLOCAL@%$ACLOCAL%g
+s%@AUTOCONF@%$AUTOCONF%g
+s%@AUTOMAKE@%$AUTOMAKE%g
+s%@AUTOHEADER@%$AUTOHEADER%g
+s%@MAKEINFO@%$MAKEINFO%g
+s%@SET_MAKE@%$SET_MAKE%g
+s%@CC@%$CC%g
+s%@CXX@%$CXX%g
+s%@AS@%$AS%g
+s%@AR@%$AR%g
+s%@RANLIB@%$RANLIB%g
+s%@MAINTAINER_MODE_TRUE@%$MAINTAINER_MODE_TRUE%g
+s%@MAINTAINER_MODE_FALSE@%$MAINTAINER_MODE_FALSE%g
+s%@MAINT@%$MAINT%g
+s%@EXEEXT@%$EXEEXT%g
+s%@BOEHM_GC_CFLAGS@%$BOEHM_GC_CFLAGS%g
+s%@LD@%$LD%g
+s%@NM@%$NM%g
+s%@USE_SYMBOL_UNDERSCORE@%$USE_SYMBOL_UNDERSCORE%g
+s%@LN_S@%$LN_S%g
+s%@DLLTOOL@%$DLLTOOL%g
+s%@LIBTOOL@%$LIBTOOL%g
+s%@target_all@%$target_all%g
+s%@INCLUDES@%$INCLUDES%g
+s%@CXXINCLUDES@%$CXXINCLUDES%g
+s%@addobjs@%$addobjs%g
+s%@MY_CFLAGS@%$MY_CFLAGS%g
+s%@USE_LIBDIR_TRUE@%$USE_LIBDIR_TRUE%g
+s%@USE_LIBDIR_FALSE@%$USE_LIBDIR_FALSE%g
+
+CEOF
+EOF
+
+cat >> $CONFIG_STATUS <<\EOF
+
+# Split the substitutions into bite-sized pieces for seds with
+# small command number limits, like on Digital OSF/1 and HP-UX.
+ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
+ac_file=1 # Number of current file.
+ac_beg=1 # First line for current file.
+ac_end=$ac_max_sed_cmds # Line after last line for current file.
+ac_more_lines=:
+ac_sed_cmds=""
+while $ac_more_lines; do
+ if test $ac_beg -gt 1; then
+ sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
+ else
+ sed "${ac_end}q" conftest.subs > conftest.s$ac_file
+ fi
+ if test ! -s conftest.s$ac_file; then
+ ac_more_lines=false
+ rm -f conftest.s$ac_file
+ else
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds="sed -f conftest.s$ac_file"
+ else
+ ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
+ fi
+ ac_file=`expr $ac_file + 1`
+ ac_beg=$ac_end
+ ac_end=`expr $ac_end + $ac_max_sed_cmds`
+ fi
+done
+if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds=cat
+fi
+EOF
+
+cat >> $CONFIG_STATUS <<EOF
+
+CONFIG_FILES=\${CONFIG_FILES-"Makefile"}
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case "$ac_file" in
+ *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+ ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+ *) ac_file_in="${ac_file}.in" ;;
+ esac
+
+ # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.
+
+ # Remove last slash and all that follows it. Not all systems have dirname.
+ ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+ if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+ # The file is in a subdirectory.
+ test ! -d "$ac_dir" && mkdir "$ac_dir"
+ ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
+ else
+ ac_dir_suffix= ac_dots=
+ fi
+
+ case "$ac_given_srcdir" in
+ .) srcdir=.
+ if test -z "$ac_dots"; then top_srcdir=.
+ else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
+ /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
+ *) # Relative path.
+ srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
+ top_srcdir="$ac_dots$ac_given_srcdir" ;;
+ esac
+
+ case "$ac_given_INSTALL" in
+ [/$]*) INSTALL="$ac_given_INSTALL" ;;
+ *) INSTALL="$ac_dots$ac_given_INSTALL" ;;
+ esac
+
+ echo creating "$ac_file"
+ rm -f "$ac_file"
+ configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
+ case "$ac_file" in
+ *Makefile*) ac_comsub="1i\\
+# $configure_input" ;;
+ *) ac_comsub= ;;
+ esac
+
+ ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+ sed -e "$ac_comsub
+s%@configure_input@%$configure_input%g
+s%@srcdir@%$srcdir%g
+s%@top_srcdir@%$top_srcdir%g
+s%@INSTALL@%$INSTALL%g
+" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
+fi; done
+rm -f conftest.s*
+
+EOF
+
+cat >> $CONFIG_STATUS <<EOF
+ac_sources="config.h"
+ac_dests="boehm-config.h"
+EOF
+
+cat >> $CONFIG_STATUS <<\EOF
+srcdir=$ac_given_srcdir
+while test -n "$ac_sources"; do
+ set $ac_dests; ac_dest=$1; shift; ac_dests=$*
+ set $ac_sources; ac_source=$1; shift; ac_sources=$*
+
+ echo "linking $srcdir/$ac_source to $ac_dest"
+
+ if test ! -r $srcdir/$ac_source; then
+ { echo "configure: error: $srcdir/$ac_source: File not found" 1>&2; exit 1; }
+ fi
+ rm -f $ac_dest
+
+ # Make relative symlinks.
+ # Remove last slash and all that follows it. Not all systems have dirname.
+ ac_dest_dir=`echo $ac_dest|sed 's%/[^/][^/]*$%%'`
+ if test "$ac_dest_dir" != "$ac_dest" && test "$ac_dest_dir" != .; then
+ # The dest file is in a subdirectory.
+ test ! -d "$ac_dest_dir" && mkdir "$ac_dest_dir"
+ ac_dest_dir_suffix="/`echo $ac_dest_dir|sed 's%^\./%%'`"
+ # A "../" for each directory in $ac_dest_dir_suffix.
+ ac_dots=`echo $ac_dest_dir_suffix|sed 's%/[^/]*%../%g'`
+ else
+ ac_dest_dir_suffix= ac_dots=
+ fi
+
+ case "$srcdir" in
+ [/$]*) ac_rel_source="$srcdir/$ac_source" ;;
+ *) ac_rel_source="$ac_dots$srcdir/$ac_source" ;;
+ esac
+
+ # Make a symlink if possible; otherwise try a hard link.
+ if ln -s $ac_rel_source $ac_dest 2>/dev/null ||
+ ln $srcdir/$ac_source $ac_dest; then :
+ else
+ { echo "configure: error: can not link $ac_dest to $srcdir/$ac_source" 1>&2; exit 1; }
+ fi
+done
+EOF
+cat >> $CONFIG_STATUS <<EOF
+srcdir=${srcdir}
+host=${host}
+target=${target}
+with_multisubdir=${with_multisubdir}
+ac_configure_args="${multilib_arg} ${ac_configure_args}"
+CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
+boehm_gc_basedir=${boehm_gc_basedir}
+CC="${CC}"
+DEFS="$DEFS"
+
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+
+echo "$DEFS" > boehm-cflags
+
+if test -n "$CONFIG_FILES"; then
+ ac_file=Makefile . ${boehm_gc_basedir}/../config-ml.in
+fi
+exit 0
+EOF
+chmod +x $CONFIG_STATUS
+rm -fr confdefs* $ac_clean_files
+test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
+
diff --git a/boehm-gc/configure.host b/boehm-gc/configure.host
new file mode 100644
index 00000000000..1903242fec4
--- /dev/null
+++ b/boehm-gc/configure.host
@@ -0,0 +1,43 @@
+# configure.host
+
+# This shell script handles all host based configuration for boehm_gc.
+# It sets various shell variables based on the the host and the
+# configuration options. You can modify this shell script without
+# needing to rerun autoconf.
+
+# This shell script should be invoked as
+# . configure.host
+# If it encounters an error, it will exit with a message.
+
+# It uses the following shell variables:
+# host The configuration host
+# host_cpu The configuration host CPU
+# target_optspace --enable-target-optspace ("yes", "no", "")
+
+# It sets the following shell variables:
+# boehm_gc_cflags Special CFLAGS to use when building
+
+boehm_gc_cflags=
+
+case "${target_optspace}:${host}" in
+ yes:*)
+ boehm_gc_cflags="${boehm_gc_cflags} -Os"
+ ;;
+ :m32r-* | :d10v-* | :d30v-*)
+ boehm_gc_cflags="${boehm_gc_cflags} -Os"
+ ;;
+ no:* | :*)
+ # Nothing.
+ ;;
+esac
+
+# Set any host dependent compiler flags.
+# THIS TABLE IS SORTED. KEEP IT THAT WAY.
+
+case "${host}" in
+ mips-tx39-*|mipstx39-unknown-*)
+ boehm_gc_cflags="${boehm_gc_cflags} -G 0"
+ ;;
+ *)
+ ;;
+esac
diff --git a/boehm-gc/configure.in b/boehm-gc/configure.in
new file mode 100644
index 00000000000..f14a677d9fe
--- /dev/null
+++ b/boehm-gc/configure.in
@@ -0,0 +1,232 @@
+dnl Process this file with autoconf to produce configure.
+
+AC_INIT(gc_mark.h)
+
+dnl Can't be done in BOEHM_CONFIGURE because that confuses automake.
+AC_CONFIG_AUX_DIR(..)
+
+AC_CANONICAL_SYSTEM
+
+BOEHM_CONFIGURE(.)
+
+AM_PROG_LIBTOOL
+
+dnl We use these options to decide which functions to include.
+AC_ARG_WITH(target-subdir,
+[ --with-target-subdir=SUBDIR Configuring with a cross compiler])
+AC_ARG_WITH(cross-host,
+[ --with-cross-host=HOST Configuring with a cross compiler])
+
+AM_MAINTAINER_MODE
+# automake wants to see AC_EXEEXT. But we don't need it. And having
+# it is actually a problem, because the compiler we're passed can't
+# necessarily do a full link. So we fool automake here.
+if test "x" = "y"; then
+ AC_EXEEXT
+fi
+
+AC_MSG_CHECKING([for threads package to use])
+AC_ARG_ENABLE(threads, [ --enable-threads=TYPE choose threading package],
+ THREADS=$enableval,
+ dnl FIXME: figure out native threads to use here.
+ THREADS=no)
+
+if test "$THREADS" = yes; then
+ case "$host" in
+ *-*-vxworks*)
+ THREADS=vxworks
+ ;;
+ *-*-linux*)
+ # FIXME: this isn't correct in all cases.
+ THREADS=posix
+ ;;
+ *-*-win*)
+ THREADS=win32
+ ;;
+ *-*-irix*)
+ # FIXME: for now, choose POSIX, because we implement that.
+ # Later, choose irix threads.
+ THREADS=posix
+ ;;
+ *-*-solaris*)
+ # FIXME: for now, choose POSIX, because we implement that.
+ # Later, choose solaris threads.
+ THREADS=posix
+ ;;
+ *)
+ # For now.
+ THREADS=none
+ ;;
+ esac
+fi
+
+INCLUDES=
+case "$THREADS" in
+ no | none | single)
+ THREADS=none
+ ;;
+ posix | pthreads)
+ THREADS=posix
+ case "$host" in
+ *-*-linux*)
+ AC_DEFINE(LINUX_THREADS)
+ AC_DEFINE(_REENTRANT)
+ ;;
+ *-*-solaris*)
+ AC_DEFINE(SOLARIS_THREADS)
+ AC_DEFINE(_SOLARIS_PTHREADS)
+ ;;
+ *-*-irix*)
+ AC_DEFINE(IRIX_THREADS)
+ ;;
+ esac
+ ;;
+ qt)
+ AC_DEFINE(QUICK_THREADS)
+ INCLUDES="-I${boehm_gc_basedir}/../qthreads"
+ ;;
+ decosf1 | irix | mach | os2 | solaris | win32 | dce | vxworks)
+ AC_MSG_ERROR(thread package $THREADS not yet supported)
+ ;;
+ *)
+ AC_MSG_ERROR($THREADS is an unknown thread package)
+ ;;
+esac
+AC_MSG_RESULT($THREADS)
+
+AC_ARG_ENABLE(java-gc,
+changequote(<<,>>)dnl
+<< --enable-java-gc=TYPE choose garbage collector [boehm]>>,
+changequote([,])
+ GC=$enableval,
+ GC=boehm)
+target_all=
+if test "$GC" = "boehm"; then
+ target_all=libgcjgc.la
+fi
+AC_SUBST(target_all)
+
+dnl If the target is an eCos system, use the appropriate eCos
+dnl I/O routines.
+dnl FIXME: this should not be a local option but a global target
+dnl system; at present there is no eCos target.
+TARGET_ECOS="no"
+AC_ARG_WITH(ecos,
+[ --with-ecos Enable runtime eCos target support.],
+TARGET_ECOS="$with_ecos"
+)
+
+addobjs=
+CXXINCLUDES=
+case "$TARGET_ECOS" in
+ no)
+ ;;
+ *)
+ AC_DEFINE(ECOS)
+ CXXINCLUDES="-I${TARGET_ECOS}/include"
+ addobjs="$addobjs ecos.lo"
+ ;;
+esac
+AC_SUBST(CXX)
+
+AC_SUBST(INCLUDES)
+AC_SUBST(CXXINCLUDES)
+
+machdep=
+case "$host" in
+ alpha*-*-*)
+ machdep="alpha_mach_dep.lo"
+ ;;
+ mips-*-*)
+ machdep="mips_sgi_mach_dep.lo"
+ AC_DEFINE(NO_EXECUTE_PERMISSION)
+ ;;
+ mipstx39-*-elf*)
+ machdep="mips_ultrix_mach_dep.lo"
+ AC_DEFINE(STACKBASE, __stackbase)
+ AC_DEFINE(DATASTART_IS_ETEXT)
+ ;;
+ sparc-sun-solaris2.3*)
+ AC_DEFINE(SUNOS53_SHARED_LIB)
+ ;;
+esac
+if test x"$machdep" = x; then
+ machdep="mach_dep.lo"
+fi
+addobjs="$addobjs $machdep"
+AC_SUBST(addobjs)
+
+dnl As of 4.13a2, the collector will not properly work on Solaris when
+dnl built with gcc and -O. So we remove -O in the appropriate case.
+case "$host" in
+ sparc-sun-solaris2*)
+ if test "$GCC" = yes; then
+ new_CFLAGS=
+ for i in $CFLAGS; do
+ case "$i" in
+ -O*)
+ ;;
+ *)
+ new_CFLAGS="$new_CFLAGS $i"
+ ;;
+ esac
+ done
+ CFLAGS="$new_CFLAGS"
+ fi
+ ;;
+esac
+
+dnl We need to override the top-level CFLAGS. This is how we do it.
+MY_CFLAGS="$CFLAGS"
+AC_SUBST(MY_CFLAGS)
+
+dnl Define a few things to retarget the library towards
+dnl embedded Java.
+AC_DEFINE(SILENT)
+AC_DEFINE(NO_SIGNALS)
+AC_DEFINE(NO_DEBUGGING)
+AC_DEFINE(JAVA_FINALIZATION)
+
+dnl Create boehm-config.h so that libjava can find it.
+dnl It is required to use gc_priv.h, which is required to write
+dnl a new marking function. So config.h in this package is
+dnl poorly named.
+AC_LINK_FILES(config.h, boehm-config.h)
+
+dnl This is something of a hack. When cross-compiling we turn off
+dnl some functionality. We also enable the "small" configuration.
+dnl These is only correct when targetting an embedded system. FIXME.
+if test -n "${with_cross_host}"; then
+ AC_DEFINE(NO_SIGSET)
+ AC_DEFINE(NO_CLOCK)
+ AC_DEFINE(SMALL_CONFIG)
+fi
+
+AM_CONDITIONAL(USE_LIBDIR, test -z "$with_cross_host")
+
+if test "${multilib}" = "yes"; then
+ multilib_arg="--enable-multilib"
+else
+ multilib_arg=
+fi
+
+AC_OUTPUT(Makefile,
+[
+dnl Put all the -D options in a file. These are required before
+dnl boehm-config.h can be included. This is a huge hack brought
+dnl about by overall poor structuring of this entire library.
+echo "$DEFS" > boehm-cflags
+
+if test -n "$CONFIG_FILES"; then
+ ac_file=Makefile . ${boehm_gc_basedir}/../config-ml.in
+fi],
+srcdir=${srcdir}
+host=${host}
+target=${target}
+with_multisubdir=${with_multisubdir}
+ac_configure_args="${multilib_arg} ${ac_configure_args}"
+CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
+boehm_gc_basedir=${boehm_gc_basedir}
+CC="${CC}"
+DEFS="$DEFS"
+)
diff --git a/boehm-gc/cord/README b/boehm-gc/cord/README
new file mode 100644
index 00000000000..62101452313
--- /dev/null
+++ b/boehm-gc/cord/README
@@ -0,0 +1,31 @@
+Copyright (c) 1993-1994 by Xerox Corporation. All rights reserved.
+
+THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+
+Permission is hereby granted to use or copy this program
+for any purpose, provided the above notices are retained on all copies.
+Permission to modify the code and to distribute modified code is granted,
+provided the above notices are retained, and a notice that the code was
+modified is included with the above copyright notice.
+
+Please send bug reports to Hans-J. Boehm (boehm@sgi.com).
+
+This is a string packages that uses a tree-based representation.
+See cord.h for a description of the functions provided. Ec.h describes
+"extensible cords", which are essentially output streams that write
+to a cord. These allow for efficient construction of cords without
+requiring a bound on the size of a cord.
+
+de.c is a very dumb text editor that illustrates the use of cords.
+It maintains a list of file versions. Each version is simply a
+cord representing the file contents. Nonetheless, standard
+editing operations are efficient, even on very large files.
+(Its 3 line "user manual" can be obtained by invoking it without
+arguments. Note that ^R^N and ^R^P move the cursor by
+almost a screen. It does not understand tabs, which will show
+up as highlighred "I"s. Use the UNIX "expand" program first.)
+To build the editor, type "make cord/de" in the gc directory.
+
+This package assumes an ANSI C compiler such as gcc. It will
+not compile with an old-style K&R compiler.
diff --git a/boehm-gc/cord/SCOPTIONS.amiga b/boehm-gc/cord/SCOPTIONS.amiga
new file mode 100644
index 00000000000..2a091970b8b
--- /dev/null
+++ b/boehm-gc/cord/SCOPTIONS.amiga
@@ -0,0 +1,14 @@
+MATH=STANDARD
+CPU=68030
+NOSTACKCHECK
+OPTIMIZE
+VERBOSE
+NOVERSION
+NOICONS
+OPTIMIZERTIME
+INCLUDEDIR=/
+DEFINE AMIGA
+LIBRARY=cord.lib
+LIBRARY=/gc.lib
+IGNORE=100
+IGNORE=161
diff --git a/boehm-gc/cord/SMakefile.amiga b/boehm-gc/cord/SMakefile.amiga
new file mode 100644
index 00000000000..5aef131e606
--- /dev/null
+++ b/boehm-gc/cord/SMakefile.amiga
@@ -0,0 +1,20 @@
+# Makefile for cord.lib
+# Michel Schinz 1994/07/20
+
+OBJS = cordbscs.o cordprnt.o cordxtra.o
+
+all: cord.lib cordtest
+
+cordbscs.o: cordbscs.c
+cordprnt.o: cordprnt.c
+cordxtra.o: cordxtra.c
+cordtest.o: cordtest.c
+
+cord.lib: $(OBJS)
+ oml cord.lib r $(OBJS)
+
+cordtest: cordtest.o cord.lib
+ sc cordtest.o link
+
+clean:
+ delete cord.lib cordtest \#?.o \#?.lnk
diff --git a/boehm-gc/cord/cord.h b/boehm-gc/cord/cord.h
new file mode 100644
index 00000000000..584112fd181
--- /dev/null
+++ b/boehm-gc/cord/cord.h
@@ -0,0 +1,327 @@
+/*
+ * Copyright (c) 1993-1994 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ * Author: Hans-J. Boehm (boehm@parc.xerox.com)
+ */
+/* Boehm, October 5, 1995 4:20 pm PDT */
+
+/*
+ * Cords are immutable character strings. A number of operations
+ * on long cords are much more efficient than their strings.h counterpart.
+ * In particular, concatenation takes constant time independent of the length
+ * of the arguments. (Cords are represented as trees, with internal
+ * nodes representing concatenation and leaves consisting of either C
+ * strings or a functional description of the string.)
+ *
+ * The following are reasonable applications of cords. They would perform
+ * unacceptably if C strings were used:
+ * - A compiler that produces assembly language output by repeatedly
+ * concatenating instructions onto a cord representing the output file.
+ * - A text editor that converts the input file to a cord, and then
+ * performs editing operations by producing a new cord representing
+ * the file after echa character change (and keeping the old ones in an
+ * edit history)
+ *
+ * For optimal performance, cords should be built by
+ * concatenating short sections.
+ * This interface is designed for maximum compatibility with C strings.
+ * ASCII NUL characters may be embedded in cords using CORD_from_fn.
+ * This is handled correctly, but CORD_to_char_star will produce a string
+ * with embedded NULs when given such a cord.
+ *
+ * This interface is fairly big, largely for performance reasons.
+ * The most basic constants and functions:
+ *
+ * CORD - the type fo a cord;
+ * CORD_EMPTY - empty cord;
+ * CORD_len(cord) - length of a cord;
+ * CORD_cat(cord1,cord2) - concatenation of two cords;
+ * CORD_substr(cord, start, len) - substring (or subcord);
+ * CORD_pos i; CORD_FOR(i, cord) { ... CORD_pos_fetch(i) ... } -
+ * examine each character in a cord. CORD_pos_fetch(i) is the char.
+ * CORD_fetch(int i) - Retrieve i'th character (slowly).
+ * CORD_cmp(cord1, cord2) - compare two cords.
+ * CORD_from_file(FILE * f) - turn a read-only file into a cord.
+ * CORD_to_char_star(cord) - convert to C string.
+ * (Non-NULL C constant strings are cords.)
+ * CORD_printf (etc.) - cord version of printf. Use %r for cords.
+ */
+# ifndef CORD_H
+
+# define CORD_H
+# include <stddef.h>
+# include <stdio.h>
+/* Cords have type const char *. This is cheating quite a bit, and not */
+/* 100% portable. But it means that nonempty character string */
+/* constants may be used as cords directly, provided the string is */
+/* never modified in place. The empty cord is represented by, and */
+/* can be written as, 0. */
+
+typedef const char * CORD;
+
+/* An empty cord is always represented as nil */
+# define CORD_EMPTY 0
+
+/* Is a nonempty cord represented as a C string? */
+#define CORD_IS_STRING(s) (*(s) != '\0')
+
+/* Concatenate two cords. If the arguments are C strings, they may */
+/* not be subsequently altered. */
+CORD CORD_cat(CORD x, CORD y);
+
+/* Concatenate a cord and a C string with known length. Except for the */
+/* empty string case, this is a special case of CORD_cat. Since the */
+/* length is known, it can be faster. */
+/* The string y is shared with the resulting CORD. Hence it should */
+/* not be altered by the caller. */
+CORD CORD_cat_char_star(CORD x, const char * y, size_t leny);
+
+/* Compute the length of a cord */
+size_t CORD_len(CORD x);
+
+/* Cords may be represented by functions defining the ith character */
+typedef char (* CORD_fn)(size_t i, void * client_data);
+
+/* Turn a functional description into a cord. */
+CORD CORD_from_fn(CORD_fn fn, void * client_data, size_t len);
+
+/* Return the substring (subcord really) of x with length at most n, */
+/* starting at position i. (The initial character has position 0.) */
+CORD CORD_substr(CORD x, size_t i, size_t n);
+
+/* Return the argument, but rebalanced to allow more efficient */
+/* character retrieval, substring operations, and comparisons. */
+/* This is useful only for cords that were built using repeated */
+/* concatenation. Guarantees log time access to the result, unless */
+/* x was obtained through a large number of repeated substring ops */
+/* or the embedded functional descriptions take longer to evaluate. */
+/* May reallocate significant parts of the cord. The argument is not */
+/* modified; only the result is balanced. */
+CORD CORD_balance(CORD x);
+
+/* The following traverse a cord by applying a function to each */
+/* character. This is occasionally appropriate, especially where */
+/* speed is crucial. But, since C doesn't have nested functions, */
+/* clients of this sort of traversal are clumsy to write. Consider */
+/* the functions that operate on cord positions instead. */
+
+/* Function to iteratively apply to individual characters in cord. */
+typedef int (* CORD_iter_fn)(char c, void * client_data);
+
+/* Function to apply to substrings of a cord. Each substring is a */
+/* a C character string, not a general cord. */
+typedef int (* CORD_batched_iter_fn)(const char * s, void * client_data);
+# define CORD_NO_FN ((CORD_batched_iter_fn)0)
+
+/* Apply f1 to each character in the cord, in ascending order, */
+/* starting at position i. If */
+/* f2 is not CORD_NO_FN, then multiple calls to f1 may be replaced by */
+/* a single call to f2. The parameter f2 is provided only to allow */
+/* some optimization by the client. This terminates when the right */
+/* end of this string is reached, or when f1 or f2 return != 0. In the */
+/* latter case CORD_iter returns != 0. Otherwise it returns 0. */
+/* The specified value of i must be < CORD_len(x). */
+int CORD_iter5(CORD x, size_t i, CORD_iter_fn f1,
+ CORD_batched_iter_fn f2, void * client_data);
+
+/* A simpler version that starts at 0, and without f2: */
+int CORD_iter(CORD x, CORD_iter_fn f1, void * client_data);
+# define CORD_iter(x, f1, cd) CORD_iter5(x, 0, f1, CORD_NO_FN, cd)
+
+/* Similar to CORD_iter5, but end-to-beginning. No provisions for */
+/* CORD_batched_iter_fn. */
+int CORD_riter4(CORD x, size_t i, CORD_iter_fn f1, void * client_data);
+
+/* A simpler version that starts at the end: */
+int CORD_riter(CORD x, CORD_iter_fn f1, void * client_data);
+
+/* Functions that operate on cord positions. The easy way to traverse */
+/* cords. A cord position is logically a pair consisting of a cord */
+/* and an index into that cord. But it is much faster to retrieve a */
+/* charcter based on a position than on an index. Unfortunately, */
+/* positions are big (order of a few 100 bytes), so allocate them with */
+/* caution. */
+/* Things in cord_pos.h should be treated as opaque, except as */
+/* described below. Also note that */
+/* CORD_pos_fetch, CORD_next and CORD_prev have both macro and function */
+/* definitions. The former may evaluate their argument more than once. */
+# include "private/cord_pos.h"
+
+/*
+ Visible definitions from above:
+
+ typedef <OPAQUE but fairly big> CORD_pos[1];
+
+ * Extract the cord from a position:
+ CORD CORD_pos_to_cord(CORD_pos p);
+
+ * Extract the current index from a position:
+ size_t CORD_pos_to_index(CORD_pos p);
+
+ * Fetch the character located at the given position:
+ char CORD_pos_fetch(CORD_pos p);
+
+ * Initialize the position to refer to the given cord and index.
+ * Note that this is the most expensive function on positions:
+ void CORD_set_pos(CORD_pos p, CORD x, size_t i);
+
+ * Advance the position to the next character.
+ * P must be initialized and valid.
+ * Invalidates p if past end:
+ void CORD_next(CORD_pos p);
+
+ * Move the position to the preceding character.
+ * P must be initialized and valid.
+ * Invalidates p if past beginning:
+ void CORD_prev(CORD_pos p);
+
+ * Is the position valid, i.e. inside the cord?
+ int CORD_pos_valid(CORD_pos p);
+*/
+# define CORD_FOR(pos, cord) \
+ for (CORD_set_pos(pos, cord, 0); CORD_pos_valid(pos); CORD_next(pos))
+
+
+/* An out of memory handler to call. May be supplied by client. */
+/* Must not return. */
+extern void (* CORD_oom_fn)(void);
+
+/* Dump the representation of x to stdout in an implementation defined */
+/* manner. Intended for debugging only. */
+void CORD_dump(CORD x);
+
+/* The following could easily be implemented by the client. They are */
+/* provided in cordxtra.c for convenience. */
+
+/* Concatenate a character to the end of a cord. */
+CORD CORD_cat_char(CORD x, char c);
+
+/* Concatenate n cords. */
+CORD CORD_catn(int n, /* CORD */ ...);
+
+/* Return the character in CORD_substr(x, i, 1) */
+char CORD_fetch(CORD x, size_t i);
+
+/* Return < 0, 0, or > 0, depending on whether x < y, x = y, x > y */
+int CORD_cmp(CORD x, CORD y);
+
+/* A generalization that takes both starting positions for the */
+/* comparison, and a limit on the number of characters to be compared. */
+int CORD_ncmp(CORD x, size_t x_start, CORD y, size_t y_start, size_t len);
+
+/* Find the first occurrence of s in x at position start or later. */
+/* Return the position of the first character of s in x, or */
+/* CORD_NOT_FOUND if there is none. */
+size_t CORD_str(CORD x, size_t start, CORD s);
+
+/* Return a cord consisting of i copies of (possibly NUL) c. Dangerous */
+/* in conjunction with CORD_to_char_star. */
+/* The resulting representation takes constant space, independent of i. */
+CORD CORD_chars(char c, size_t i);
+# define CORD_nul(i) CORD_chars('\0', (i))
+
+/* Turn a file into cord. The file must be seekable. Its contents */
+/* must remain constant. The file may be accessed as an immediate */
+/* result of this call and/or as a result of subsequent accesses to */
+/* the cord. Short files are likely to be immediately read, but */
+/* long files are likely to be read on demand, possibly relying on */
+/* stdio for buffering. */
+/* We must have exclusive access to the descriptor f, i.e. we may */
+/* read it at any time, and expect the file pointer to be */
+/* where we left it. Normally this should be invoked as */
+/* CORD_from_file(fopen(...)) */
+/* CORD_from_file arranges to close the file descriptor when it is no */
+/* longer needed (e.g. when the result becomes inaccessible). */
+/* The file f must be such that ftell reflects the actual character */
+/* position in the file, i.e. the number of characters that can be */
+/* or were read with fread. On UNIX systems this is always true. On */
+/* MS Windows systems, f must be opened in binary mode. */
+CORD CORD_from_file(FILE * f);
+
+/* Equivalent to the above, except that the entire file will be read */
+/* and the file pointer will be closed immediately. */
+/* The binary mode restriction from above does not apply. */
+CORD CORD_from_file_eager(FILE * f);
+
+/* Equivalent to the above, except that the file will be read on demand.*/
+/* The binary mode restriction applies. */
+CORD CORD_from_file_lazy(FILE * f);
+
+/* Turn a cord into a C string. The result shares no structure with */
+/* x, and is thus modifiable. */
+char * CORD_to_char_star(CORD x);
+
+/* Turn a C string into a CORD. The C string is copied, and so may */
+/* subsequently be modified. */
+CORD CORD_from_char_star(const char *s);
+
+/* Identical to the above, but the result may share structure with */
+/* the argument and is thus not modifiable. */
+const char * CORD_to_const_char_star(CORD x);
+
+/* Write a cord to a file, starting at the current position. No */
+/* trailing NULs are newlines are added. */
+/* Returns EOF if a write error occurs, 1 otherwise. */
+int CORD_put(CORD x, FILE * f);
+
+/* "Not found" result for the following two functions. */
+# define CORD_NOT_FOUND ((size_t)(-1))
+
+/* A vague analog of strchr. Returns the position (an integer, not */
+/* a pointer) of the first occurrence of (char) c inside x at position */
+/* i or later. The value i must be < CORD_len(x). */
+size_t CORD_chr(CORD x, size_t i, int c);
+
+/* A vague analog of strrchr. Returns index of the last occurrence */
+/* of (char) c inside x at position i or earlier. The value i */
+/* must be < CORD_len(x). */
+size_t CORD_rchr(CORD x, size_t i, int c);
+
+
+/* The following are also not primitive, but are implemented in */
+/* cordprnt.c. They provide functionality similar to the ANSI C */
+/* functions with corresponding names, but with the following */
+/* additions and changes: */
+/* 1. A %r conversion specification specifies a CORD argument. Field */
+/* width, precision, etc. have the same semantics as for %s. */
+/* (Note that %c,%C, and %S were already taken.) */
+/* 2. The format string is represented as a CORD. */
+/* 3. CORD_sprintf and CORD_vsprintf assign the result through the 1st */ /* argument. Unlike their ANSI C versions, there is no need to guess */
+/* the correct buffer size. */
+/* 4. Most of the conversions are implement through the native */
+/* vsprintf. Hence they are usually no faster, and */
+/* idiosyncracies of the native printf are preserved. However, */
+/* CORD arguments to CORD_sprintf and CORD_vsprintf are NOT copied; */
+/* the result shares the original structure. This may make them */
+/* very efficient in some unusual applications. */
+/* The format string is copied. */
+/* All functions return the number of characters generated or -1 on */
+/* error. This complies with the ANSI standard, but is inconsistent */
+/* with some older implementations of sprintf. */
+
+/* The implementation of these is probably less portable than the rest */
+/* of this package. */
+
+#ifndef CORD_NO_IO
+
+#include <stdarg.h>
+
+int CORD_sprintf(CORD * out, CORD format, ...);
+int CORD_vsprintf(CORD * out, CORD format, va_list args);
+int CORD_fprintf(FILE * f, CORD format, ...);
+int CORD_vfprintf(FILE * f, CORD format, va_list args);
+int CORD_printf(CORD format, ...);
+int CORD_vprintf(CORD format, va_list args);
+
+#endif /* CORD_NO_IO */
+
+# endif /* CORD_H */
diff --git a/boehm-gc/cord/cordbscs.c b/boehm-gc/cord/cordbscs.c
new file mode 100644
index 00000000000..b75f5812f17
--- /dev/null
+++ b/boehm-gc/cord/cordbscs.c
@@ -0,0 +1,916 @@
+/*
+ * Copyright (c) 1993-1994 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ * Author: Hans-J. Boehm (boehm@parc.xerox.com)
+ */
+/* Boehm, October 3, 1994 5:19 pm PDT */
+# include "gc.h"
+# include "cord.h"
+# include <stdlib.h>
+# include <stdio.h>
+# include <string.h>
+
+/* An implementation of the cord primitives. These are the only */
+/* Functions that understand the representation. We perform only */
+/* minimal checks on arguments to these functions. Out of bounds */
+/* arguments to the iteration functions may result in client functions */
+/* invoked on garbage data. In most cases, client functions should be */
+/* programmed defensively enough that this does not result in memory */
+/* smashes. */
+
+typedef void (* oom_fn)(void);
+
+oom_fn CORD_oom_fn = (oom_fn) 0;
+
+# define OUT_OF_MEMORY { if (CORD_oom_fn != (oom_fn) 0) (*CORD_oom_fn)(); \
+ ABORT("Out of memory\n"); }
+# define ABORT(msg) { fprintf(stderr, "%s\n", msg); abort(); }
+
+typedef unsigned long word;
+
+typedef union {
+ struct Concatenation {
+ char null;
+ char header;
+ char depth; /* concatenation nesting depth. */
+ unsigned char left_len;
+ /* Length of left child if it is sufficiently */
+ /* short; 0 otherwise. */
+# define MAX_LEFT_LEN 255
+ word len;
+ CORD left; /* length(left) > 0 */
+ CORD right; /* length(right) > 0 */
+ } concatenation;
+ struct Function {
+ char null;
+ char header;
+ char depth; /* always 0 */
+ char left_len; /* always 0 */
+ word len;
+ CORD_fn fn;
+ void * client_data;
+ } function;
+ struct Generic {
+ char null;
+ char header;
+ char depth;
+ char left_len;
+ word len;
+ } generic;
+ char string[1];
+} CordRep;
+
+# define CONCAT_HDR 1
+
+# define FN_HDR 4
+# define SUBSTR_HDR 6
+ /* Substring nodes are a special case of function nodes. */
+ /* The client_data field is known to point to a substr_args */
+ /* structure, and the function is either CORD_apply_access_fn */
+ /* or CORD_index_access_fn. */
+
+/* The following may be applied only to function and concatenation nodes: */
+#define IS_CONCATENATION(s) (((CordRep *)s)->generic.header == CONCAT_HDR)
+
+#define IS_FUNCTION(s) ((((CordRep *)s)->generic.header & FN_HDR) != 0)
+
+#define IS_SUBSTR(s) (((CordRep *)s)->generic.header == SUBSTR_HDR)
+
+#define LEN(s) (((CordRep *)s) -> generic.len)
+#define DEPTH(s) (((CordRep *)s) -> generic.depth)
+#define GEN_LEN(s) (CORD_IS_STRING(s) ? strlen(s) : LEN(s))
+
+#define LEFT_LEN(c) ((c) -> left_len != 0? \
+ (c) -> left_len \
+ : (CORD_IS_STRING((c) -> left) ? \
+ (c) -> len - GEN_LEN((c) -> right) \
+ : LEN((c) -> left)))
+
+#define SHORT_LIMIT (sizeof(CordRep) - 1)
+ /* Cords shorter than this are C strings */
+
+
+/* Dump the internal representation of x to stdout, with initial */
+/* indentation level n. */
+void CORD_dump_inner(CORD x, unsigned n)
+{
+ register size_t i;
+
+ for (i = 0; i < (size_t)n; i++) {
+ fputs(" ", stdout);
+ }
+ if (x == 0) {
+ fputs("NIL\n", stdout);
+ } else if (CORD_IS_STRING(x)) {
+ for (i = 0; i <= SHORT_LIMIT; i++) {
+ if (x[i] == '\0') break;
+ putchar(x[i]);
+ }
+ if (x[i] != '\0') fputs("...", stdout);
+ putchar('\n');
+ } else if (IS_CONCATENATION(x)) {
+ register struct Concatenation * conc =
+ &(((CordRep *)x) -> concatenation);
+ printf("Concatenation: %p (len: %d, depth: %d)\n",
+ x, (int)(conc -> len), (int)(conc -> depth));
+ CORD_dump_inner(conc -> left, n+1);
+ CORD_dump_inner(conc -> right, n+1);
+ } else /* function */{
+ register struct Function * func =
+ &(((CordRep *)x) -> function);
+ if (IS_SUBSTR(x)) printf("(Substring) ");
+ printf("Function: %p (len: %d): ", x, (int)(func -> len));
+ for (i = 0; i < 20 && i < func -> len; i++) {
+ putchar((*(func -> fn))(i, func -> client_data));
+ }
+ if (i < func -> len) fputs("...", stdout);
+ putchar('\n');
+ }
+}
+
+/* Dump the internal representation of x to stdout */
+void CORD_dump(CORD x)
+{
+ CORD_dump_inner(x, 0);
+ fflush(stdout);
+}
+
+CORD CORD_cat_char_star(CORD x, const char * y, size_t leny)
+{
+ register size_t result_len;
+ register size_t lenx;
+ register int depth;
+
+ if (x == CORD_EMPTY) return(y);
+ if (leny == 0) return(x);
+ if (CORD_IS_STRING(x)) {
+ lenx = strlen(x);
+ result_len = lenx + leny;
+ if (result_len <= SHORT_LIMIT) {
+ register char * result = GC_MALLOC_ATOMIC(result_len+1);
+
+ if (result == 0) OUT_OF_MEMORY;
+ memcpy(result, x, lenx);
+ memcpy(result + lenx, y, leny);
+ result[result_len] = '\0';
+ return((CORD) result);
+ } else {
+ depth = 1;
+ }
+ } else {
+ register CORD right;
+ register CORD left;
+ register char * new_right;
+ register size_t right_len;
+
+ lenx = LEN(x);
+
+ if (leny <= SHORT_LIMIT/2
+ && IS_CONCATENATION(x)
+ && CORD_IS_STRING(right = ((CordRep *)x) -> concatenation.right)) {
+ /* Merge y into right part of x. */
+ if (!CORD_IS_STRING(left = ((CordRep *)x) -> concatenation.left)) {
+ right_len = lenx - LEN(left);
+ } else if (((CordRep *)x) -> concatenation.left_len != 0) {
+ right_len = lenx - ((CordRep *)x) -> concatenation.left_len;
+ } else {
+ right_len = strlen(right);
+ }
+ result_len = right_len + leny; /* length of new_right */
+ if (result_len <= SHORT_LIMIT) {
+ new_right = GC_MALLOC_ATOMIC(result_len + 1);
+ memcpy(new_right, right, right_len);
+ memcpy(new_right + right_len, y, leny);
+ new_right[result_len] = '\0';
+ y = new_right;
+ leny = result_len;
+ x = left;
+ lenx -= right_len;
+ /* Now fall through to concatenate the two pieces: */
+ }
+ if (CORD_IS_STRING(x)) {
+ depth = 1;
+ } else {
+ depth = DEPTH(x) + 1;
+ }
+ } else {
+ depth = DEPTH(x) + 1;
+ }
+ result_len = lenx + leny;
+ }
+ {
+ /* The general case; lenx, result_len is known: */
+ register struct Concatenation * result;
+
+ result = GC_NEW(struct Concatenation);
+ if (result == 0) OUT_OF_MEMORY;
+ result->header = CONCAT_HDR;
+ result->depth = depth;
+ if (lenx <= MAX_LEFT_LEN) result->left_len = lenx;
+ result->len = result_len;
+ result->left = x;
+ result->right = y;
+ if (depth > MAX_DEPTH) {
+ return(CORD_balance((CORD)result));
+ } else {
+ return((CORD) result);
+ }
+ }
+}
+
+
+CORD CORD_cat(CORD x, CORD y)
+{
+ register size_t result_len;
+ register int depth;
+ register size_t lenx;
+
+ if (x == CORD_EMPTY) return(y);
+ if (y == CORD_EMPTY) return(x);
+ if (CORD_IS_STRING(y)) {
+ return(CORD_cat_char_star(x, y, strlen(y)));
+ } else if (CORD_IS_STRING(x)) {
+ lenx = strlen(x);
+ depth = DEPTH(y) + 1;
+ } else {
+ register int depthy = DEPTH(y);
+
+ lenx = LEN(x);
+ depth = DEPTH(x) + 1;
+ if (depthy >= depth) depth = depthy + 1;
+ }
+ result_len = lenx + LEN(y);
+ {
+ register struct Concatenation * result;
+
+ result = GC_NEW(struct Concatenation);
+ if (result == 0) OUT_OF_MEMORY;
+ result->header = CONCAT_HDR;
+ result->depth = depth;
+ if (lenx <= MAX_LEFT_LEN) result->left_len = lenx;
+ result->len = result_len;
+ result->left = x;
+ result->right = y;
+ return((CORD) result);
+ }
+}
+
+
+
+CORD CORD_from_fn(CORD_fn fn, void * client_data, size_t len)
+{
+ if (len <= 0) return(0);
+ if (len <= SHORT_LIMIT) {
+ register char * result;
+ register size_t i;
+ char buf[SHORT_LIMIT+1];
+ register char c;
+
+ for (i = 0; i < len; i++) {
+ c = (*fn)(i, client_data);
+ if (c == '\0') goto gen_case;
+ buf[i] = c;
+ }
+ buf[i] = '\0';
+ result = GC_MALLOC_ATOMIC(len+1);
+ if (result == 0) OUT_OF_MEMORY;
+ strcpy(result, buf);
+ result[len] = '\0';
+ return((CORD) result);
+ }
+ gen_case:
+ {
+ register struct Function * result;
+
+ result = GC_NEW(struct Function);
+ if (result == 0) OUT_OF_MEMORY;
+ result->header = FN_HDR;
+ /* depth is already 0 */
+ result->len = len;
+ result->fn = fn;
+ result->client_data = client_data;
+ return((CORD) result);
+ }
+}
+
+size_t CORD_len(CORD x)
+{
+ if (x == 0) {
+ return(0);
+ } else {
+ return(GEN_LEN(x));
+ }
+}
+
+struct substr_args {
+ CordRep * sa_cord;
+ size_t sa_index;
+};
+
+char CORD_index_access_fn(size_t i, void * client_data)
+{
+ register struct substr_args *descr = (struct substr_args *)client_data;
+
+ return(((char *)(descr->sa_cord))[i + descr->sa_index]);
+}
+
+char CORD_apply_access_fn(size_t i, void * client_data)
+{
+ register struct substr_args *descr = (struct substr_args *)client_data;
+ register struct Function * fn_cord = &(descr->sa_cord->function);
+
+ return((*(fn_cord->fn))(i + descr->sa_index, fn_cord->client_data));
+}
+
+/* A version of CORD_substr that simply returns a function node, thus */
+/* postponing its work. The fourth argument is a function that may */
+/* be used for efficient access to the ith character. */
+/* Assumes i >= 0 and i + n < length(x). */
+CORD CORD_substr_closure(CORD x, size_t i, size_t n, CORD_fn f)
+{
+ register struct substr_args * sa = GC_NEW(struct substr_args);
+ CORD result;
+
+ if (sa == 0) OUT_OF_MEMORY;
+ sa->sa_cord = (CordRep *)x;
+ sa->sa_index = i;
+ result = CORD_from_fn(f, (void *)sa, n);
+ ((CordRep *)result) -> function.header = SUBSTR_HDR;
+ return (result);
+}
+
+# define SUBSTR_LIMIT (10 * SHORT_LIMIT)
+ /* Substrings of function nodes and flat strings shorter than */
+ /* this are flat strings. Othewise we use a functional */
+ /* representation, which is significantly slower to access. */
+
+/* A version of CORD_substr that assumes i >= 0, n > 0, and i + n < length(x).*/
+CORD CORD_substr_checked(CORD x, size_t i, size_t n)
+{
+ if (CORD_IS_STRING(x)) {
+ if (n > SUBSTR_LIMIT) {
+ return(CORD_substr_closure(x, i, n, CORD_index_access_fn));
+ } else {
+ register char * result = GC_MALLOC_ATOMIC(n+1);
+ register char * p = result;
+
+ if (result == 0) OUT_OF_MEMORY;
+ strncpy(result, x+i, n);
+ result[n] = '\0';
+ return(result);
+ }
+ } else if (IS_CONCATENATION(x)) {
+ register struct Concatenation * conc
+ = &(((CordRep *)x) -> concatenation);
+ register size_t left_len;
+ register size_t right_len;
+
+ left_len = LEFT_LEN(conc);
+ right_len = conc -> len - left_len;
+ if (i >= left_len) {
+ if (n == right_len) return(conc -> right);
+ return(CORD_substr_checked(conc -> right, i - left_len, n));
+ } else if (i+n <= left_len) {
+ if (n == left_len) return(conc -> left);
+ return(CORD_substr_checked(conc -> left, i, n));
+ } else {
+ /* Need at least one character from each side. */
+ register CORD left_part;
+ register CORD right_part;
+ register size_t left_part_len = left_len - i;
+
+ if (i == 0) {
+ left_part = conc -> left;
+ } else {
+ left_part = CORD_substr_checked(conc -> left, i, left_part_len);
+ }
+ if (i + n == right_len + left_len) {
+ right_part = conc -> right;
+ } else {
+ right_part = CORD_substr_checked(conc -> right, 0,
+ n - left_part_len);
+ }
+ return(CORD_cat(left_part, right_part));
+ }
+ } else /* function */ {
+ if (n > SUBSTR_LIMIT) {
+ if (IS_SUBSTR(x)) {
+ /* Avoid nesting substring nodes. */
+ register struct Function * f = &(((CordRep *)x) -> function);
+ register struct substr_args *descr =
+ (struct substr_args *)(f -> client_data);
+
+ return(CORD_substr_closure((CORD)descr->sa_cord,
+ i + descr->sa_index,
+ n, f -> fn));
+ } else {
+ return(CORD_substr_closure(x, i, n, CORD_apply_access_fn));
+ }
+ } else {
+ char * result;
+ register struct Function * f = &(((CordRep *)x) -> function);
+ char buf[SUBSTR_LIMIT+1];
+ register char * p = buf;
+ register char c;
+ register int j;
+ register int lim = i + n;
+
+ for (j = i; j < lim; j++) {
+ c = (*(f -> fn))(j, f -> client_data);
+ if (c == '\0') {
+ return(CORD_substr_closure(x, i, n, CORD_apply_access_fn));
+ }
+ *p++ = c;
+ }
+ *p = '\0';
+ result = GC_MALLOC_ATOMIC(n+1);
+ if (result == 0) OUT_OF_MEMORY;
+ strcpy(result, buf);
+ return(result);
+ }
+ }
+}
+
+CORD CORD_substr(CORD x, size_t i, size_t n)
+{
+ register size_t len = CORD_len(x);
+
+ if (i >= len || n <= 0) return(0);
+ /* n < 0 is impossible in a correct C implementation, but */
+ /* quite possible under SunOS 4.X. */
+ if (i + n > len) n = len - i;
+# ifndef __STDC__
+ if (i < 0) ABORT("CORD_substr: second arg. negative");
+ /* Possible only if both client and C implementation are buggy. */
+ /* But empirically this happens frequently. */
+# endif
+ return(CORD_substr_checked(x, i, n));
+}
+
+/* See cord.h for definition. We assume i is in range. */
+int CORD_iter5(CORD x, size_t i, CORD_iter_fn f1,
+ CORD_batched_iter_fn f2, void * client_data)
+{
+ if (x == 0) return(0);
+ if (CORD_IS_STRING(x)) {
+ register const char *p = x+i;
+
+ if (*p == '\0') ABORT("2nd arg to CORD_iter5 too big");
+ if (f2 != CORD_NO_FN) {
+ return((*f2)(p, client_data));
+ } else {
+ while (*p) {
+ if ((*f1)(*p, client_data)) return(1);
+ p++;
+ }
+ return(0);
+ }
+ } else if (IS_CONCATENATION(x)) {
+ register struct Concatenation * conc
+ = &(((CordRep *)x) -> concatenation);
+
+
+ if (i > 0) {
+ register size_t left_len = LEFT_LEN(conc);
+
+ if (i >= left_len) {
+ return(CORD_iter5(conc -> right, i - left_len, f1, f2,
+ client_data));
+ }
+ }
+ if (CORD_iter5(conc -> left, i, f1, f2, client_data)) {
+ return(1);
+ }
+ return(CORD_iter5(conc -> right, 0, f1, f2, client_data));
+ } else /* function */ {
+ register struct Function * f = &(((CordRep *)x) -> function);
+ register size_t j;
+ register size_t lim = f -> len;
+
+ for (j = i; j < lim; j++) {
+ if ((*f1)((*(f -> fn))(j, f -> client_data), client_data)) {
+ return(1);
+ }
+ }
+ return(0);
+ }
+}
+
+#undef CORD_iter
+int CORD_iter(CORD x, CORD_iter_fn f1, void * client_data)
+{
+ return(CORD_iter5(x, 0, f1, CORD_NO_FN, client_data));
+}
+
+int CORD_riter4(CORD x, size_t i, CORD_iter_fn f1, void * client_data)
+{
+ if (x == 0) return(0);
+ if (CORD_IS_STRING(x)) {
+ register const char *p = x + i;
+ register char c;
+
+ for(;;) {
+ c = *p;
+ if (c == '\0') ABORT("2nd arg to CORD_riter4 too big");
+ if ((*f1)(c, client_data)) return(1);
+ if (p == x) break;
+ p--;
+ }
+ return(0);
+ } else if (IS_CONCATENATION(x)) {
+ register struct Concatenation * conc
+ = &(((CordRep *)x) -> concatenation);
+ register CORD left_part = conc -> left;
+ register size_t left_len;
+
+ left_len = LEFT_LEN(conc);
+ if (i >= left_len) {
+ if (CORD_riter4(conc -> right, i - left_len, f1, client_data)) {
+ return(1);
+ }
+ return(CORD_riter4(left_part, left_len - 1, f1, client_data));
+ } else {
+ return(CORD_riter4(left_part, i, f1, client_data));
+ }
+ } else /* function */ {
+ register struct Function * f = &(((CordRep *)x) -> function);
+ register size_t j;
+
+ for (j = i; ; j--) {
+ if ((*f1)((*(f -> fn))(j, f -> client_data), client_data)) {
+ return(1);
+ }
+ if (j == 0) return(0);
+ }
+ }
+}
+
+int CORD_riter(CORD x, CORD_iter_fn f1, void * client_data)
+{
+ return(CORD_riter4(x, CORD_len(x) - 1, f1, client_data));
+}
+
+/*
+ * The following functions are concerned with balancing cords.
+ * Strategy:
+ * Scan the cord from left to right, keeping the cord scanned so far
+ * as a forest of balanced trees of exponentialy decreasing length.
+ * When a new subtree needs to be added to the forest, we concatenate all
+ * shorter ones to the new tree in the appropriate order, and then insert
+ * the result into the forest.
+ * Crucial invariants:
+ * 1. The concatenation of the forest (in decreasing order) with the
+ * unscanned part of the rope is equal to the rope being balanced.
+ * 2. All trees in the forest are balanced.
+ * 3. forest[i] has depth at most i.
+ */
+
+typedef struct {
+ CORD c;
+ size_t len; /* Actual length of c */
+} ForestElement;
+
+static size_t min_len [ MAX_DEPTH ];
+
+static int min_len_init = 0;
+
+int CORD_max_len;
+
+typedef ForestElement Forest [ MAX_DEPTH ];
+ /* forest[i].len >= fib(i+1) */
+ /* The string is the concatenation */
+ /* of the forest in order of DECREASING */
+ /* indices. */
+
+void CORD_init_min_len()
+{
+ register int i;
+ register size_t last, previous, current;
+
+ min_len[0] = previous = 1;
+ min_len[1] = last = 2;
+ for (i = 2; i < MAX_DEPTH; i++) {
+ current = last + previous;
+ if (current < last) /* overflow */ current = last;
+ min_len[i] = current;
+ previous = last;
+ last = current;
+ }
+ CORD_max_len = last - 1;
+ min_len_init = 1;
+}
+
+
+void CORD_init_forest(ForestElement * forest, size_t max_len)
+{
+ register int i;
+
+ for (i = 0; i < MAX_DEPTH; i++) {
+ forest[i].c = 0;
+ if (min_len[i] > max_len) return;
+ }
+ ABORT("Cord too long");
+}
+
+/* Add a leaf to the appropriate level in the forest, cleaning */
+/* out lower levels as necessary. */
+/* Also works if x is a balanced tree of concatenations; however */
+/* in this case an extra concatenation node may be inserted above x; */
+/* This node should not be counted in the statement of the invariants. */
+void CORD_add_forest(ForestElement * forest, CORD x, size_t len)
+{
+ register int i = 0;
+ register CORD sum = CORD_EMPTY;
+ register size_t sum_len = 0;
+
+ while (len > min_len[i + 1]) {
+ if (forest[i].c != 0) {
+ sum = CORD_cat(forest[i].c, sum);
+ sum_len += forest[i].len;
+ forest[i].c = 0;
+ }
+ i++;
+ }
+ /* Sum has depth at most 1 greter than what would be required */
+ /* for balance. */
+ sum = CORD_cat(sum, x);
+ sum_len += len;
+ /* If x was a leaf, then sum is now balanced. To see this */
+ /* consider the two cases in which forest[i-1] either is or is */
+ /* not empty. */
+ while (sum_len >= min_len[i]) {
+ if (forest[i].c != 0) {
+ sum = CORD_cat(forest[i].c, sum);
+ sum_len += forest[i].len;
+ /* This is again balanced, since sum was balanced, and has */
+ /* allowable depth that differs from i by at most 1. */
+ forest[i].c = 0;
+ }
+ i++;
+ }
+ i--;
+ forest[i].c = sum;
+ forest[i].len = sum_len;
+}
+
+CORD CORD_concat_forest(ForestElement * forest, size_t expected_len)
+{
+ register int i = 0;
+ CORD sum = 0;
+ size_t sum_len = 0;
+
+ while (sum_len != expected_len) {
+ if (forest[i].c != 0) {
+ sum = CORD_cat(forest[i].c, sum);
+ sum_len += forest[i].len;
+ }
+ i++;
+ }
+ return(sum);
+}
+
+/* Insert the frontier of x into forest. Balanced subtrees are */
+/* treated as leaves. This potentially adds one to the depth */
+/* of the final tree. */
+void CORD_balance_insert(CORD x, size_t len, ForestElement * forest)
+{
+ register int depth;
+
+ if (CORD_IS_STRING(x)) {
+ CORD_add_forest(forest, x, len);
+ } else if (IS_CONCATENATION(x)
+ && ((depth = DEPTH(x)) >= MAX_DEPTH
+ || len < min_len[depth])) {
+ register struct Concatenation * conc
+ = &(((CordRep *)x) -> concatenation);
+ size_t left_len = LEFT_LEN(conc);
+
+ CORD_balance_insert(conc -> left, left_len, forest);
+ CORD_balance_insert(conc -> right, len - left_len, forest);
+ } else /* function or balanced */ {
+ CORD_add_forest(forest, x, len);
+ }
+}
+
+
+CORD CORD_balance(CORD x)
+{
+ Forest forest;
+ register size_t len;
+
+ if (x == 0) return(0);
+ if (CORD_IS_STRING(x)) return(x);
+ if (!min_len_init) CORD_init_min_len();
+ len = LEN(x);
+ CORD_init_forest(forest, len);
+ CORD_balance_insert(x, len, forest);
+ return(CORD_concat_forest(forest, len));
+}
+
+
+/* Position primitives */
+
+/* Private routines to deal with the hard cases only: */
+
+/* P contains a prefix of the path to cur_pos. Extend it to a full */
+/* path and set up leaf info. */
+/* Return 0 if past the end of cord, 1 o.w. */
+void CORD__extend_path(register CORD_pos p)
+{
+ register struct CORD_pe * current_pe = &(p[0].path[p[0].path_len]);
+ register CORD top = current_pe -> pe_cord;
+ register size_t pos = p[0].cur_pos;
+ register size_t top_pos = current_pe -> pe_start_pos;
+ register size_t top_len = GEN_LEN(top);
+
+ /* Fill in the rest of the path. */
+ while(!CORD_IS_STRING(top) && IS_CONCATENATION(top)) {
+ register struct Concatenation * conc =
+ &(((CordRep *)top) -> concatenation);
+ register size_t left_len;
+
+ left_len = LEFT_LEN(conc);
+ current_pe++;
+ if (pos >= top_pos + left_len) {
+ current_pe -> pe_cord = top = conc -> right;
+ current_pe -> pe_start_pos = top_pos = top_pos + left_len;
+ top_len -= left_len;
+ } else {
+ current_pe -> pe_cord = top = conc -> left;
+ current_pe -> pe_start_pos = top_pos;
+ top_len = left_len;
+ }
+ p[0].path_len++;
+ }
+ /* Fill in leaf description for fast access. */
+ if (CORD_IS_STRING(top)) {
+ p[0].cur_leaf = top;
+ p[0].cur_start = top_pos;
+ p[0].cur_end = top_pos + top_len;
+ } else {
+ p[0].cur_end = 0;
+ }
+ if (pos >= top_pos + top_len) p[0].path_len = CORD_POS_INVALID;
+}
+
+char CORD__pos_fetch(register CORD_pos p)
+{
+ /* Leaf is a function node */
+ struct CORD_pe * pe = &((p)[0].path[(p)[0].path_len]);
+ CORD leaf = pe -> pe_cord;
+ register struct Function * f = &(((CordRep *)leaf) -> function);
+
+ if (!IS_FUNCTION(leaf)) ABORT("CORD_pos_fetch: bad leaf");
+ return ((*(f -> fn))(p[0].cur_pos - pe -> pe_start_pos, f -> client_data));
+}
+
+void CORD__next(register CORD_pos p)
+{
+ register size_t cur_pos = p[0].cur_pos + 1;
+ register struct CORD_pe * current_pe = &((p)[0].path[(p)[0].path_len]);
+ register CORD leaf = current_pe -> pe_cord;
+
+ /* Leaf is not a string or we're at end of leaf */
+ p[0].cur_pos = cur_pos;
+ if (!CORD_IS_STRING(leaf)) {
+ /* Function leaf */
+ register struct Function * f = &(((CordRep *)leaf) -> function);
+ register size_t start_pos = current_pe -> pe_start_pos;
+ register size_t end_pos = start_pos + f -> len;
+
+ if (cur_pos < end_pos) {
+ /* Fill cache and return. */
+ register size_t i;
+ register size_t limit = cur_pos + FUNCTION_BUF_SZ;
+ register CORD_fn fn = f -> fn;
+ register void * client_data = f -> client_data;
+
+ if (limit > end_pos) {
+ limit = end_pos;
+ }
+ for (i = cur_pos; i < limit; i++) {
+ p[0].function_buf[i - cur_pos] =
+ (*fn)(i - start_pos, client_data);
+ }
+ p[0].cur_start = cur_pos;
+ p[0].cur_leaf = p[0].function_buf;
+ p[0].cur_end = limit;
+ return;
+ }
+ }
+ /* End of leaf */
+ /* Pop the stack until we find two concatenation nodes with the */
+ /* same start position: this implies we were in left part. */
+ {
+ while (p[0].path_len > 0
+ && current_pe[0].pe_start_pos != current_pe[-1].pe_start_pos) {
+ p[0].path_len--;
+ current_pe--;
+ }
+ if (p[0].path_len == 0) {
+ p[0].path_len = CORD_POS_INVALID;
+ return;
+ }
+ }
+ p[0].path_len--;
+ CORD__extend_path(p);
+}
+
+void CORD__prev(register CORD_pos p)
+{
+ register struct CORD_pe * pe = &(p[0].path[p[0].path_len]);
+
+ if (p[0].cur_pos == 0) {
+ p[0].path_len = CORD_POS_INVALID;
+ return;
+ }
+ p[0].cur_pos--;
+ if (p[0].cur_pos >= pe -> pe_start_pos) return;
+
+ /* Beginning of leaf */
+
+ /* Pop the stack until we find two concatenation nodes with the */
+ /* different start position: this implies we were in right part. */
+ {
+ register struct CORD_pe * current_pe = &((p)[0].path[(p)[0].path_len]);
+
+ while (p[0].path_len > 0
+ && current_pe[0].pe_start_pos == current_pe[-1].pe_start_pos) {
+ p[0].path_len--;
+ current_pe--;
+ }
+ }
+ p[0].path_len--;
+ CORD__extend_path(p);
+}
+
+#undef CORD_pos_fetch
+#undef CORD_next
+#undef CORD_prev
+#undef CORD_pos_to_index
+#undef CORD_pos_to_cord
+#undef CORD_pos_valid
+
+char CORD_pos_fetch(register CORD_pos p)
+{
+ if (p[0].cur_start <= p[0].cur_pos && p[0].cur_pos < p[0].cur_end) {
+ return(p[0].cur_leaf[p[0].cur_pos - p[0].cur_start]);
+ } else {
+ return(CORD__pos_fetch(p));
+ }
+}
+
+void CORD_next(CORD_pos p)
+{
+ if (p[0].cur_pos < p[0].cur_end - 1) {
+ p[0].cur_pos++;
+ } else {
+ CORD__next(p);
+ }
+}
+
+void CORD_prev(CORD_pos p)
+{
+ if (p[0].cur_end != 0 && p[0].cur_pos > p[0].cur_start) {
+ p[0].cur_pos--;
+ } else {
+ CORD__prev(p);
+ }
+}
+
+size_t CORD_pos_to_index(CORD_pos p)
+{
+ return(p[0].cur_pos);
+}
+
+CORD CORD_pos_to_cord(CORD_pos p)
+{
+ return(p[0].path[0].pe_cord);
+}
+
+int CORD_pos_valid(CORD_pos p)
+{
+ return(p[0].path_len != CORD_POS_INVALID);
+}
+
+void CORD_set_pos(CORD_pos p, CORD x, size_t i)
+{
+ if (x == CORD_EMPTY) {
+ p[0].path_len = CORD_POS_INVALID;
+ return;
+ }
+ p[0].path[0].pe_cord = x;
+ p[0].path[0].pe_start_pos = 0;
+ p[0].path_len = 0;
+ p[0].cur_pos = i;
+ CORD__extend_path(p);
+}
diff --git a/boehm-gc/cord/cordprnt.c b/boehm-gc/cord/cordprnt.c
new file mode 100644
index 00000000000..667560f2592
--- /dev/null
+++ b/boehm-gc/cord/cordprnt.c
@@ -0,0 +1,389 @@
+/*
+ * Copyright (c) 1993-1994 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+/* An sprintf implementation that understands cords. This is probably */
+/* not terribly portable. It assumes an ANSI stdarg.h. It further */
+/* assumes that I can make copies of va_list variables, and read */
+/* arguments repeatedly by applyting va_arg to the copies. This */
+/* could be avoided at some performance cost. */
+/* We also assume that unsigned and signed integers of various kinds */
+/* have the same sizes, and can be cast back and forth. */
+/* We assume that void * and char * have the same size. */
+/* All this cruft is needed because we want to rely on the underlying */
+/* sprintf implementation whenever possible. */
+/* Boehm, September 21, 1995 6:00 pm PDT */
+
+#include "cord.h"
+#include "ec.h"
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
+#include "gc.h"
+
+#define CONV_SPEC_LEN 50 /* Maximum length of a single */
+ /* conversion specification. */
+#define CONV_RESULT_LEN 50 /* Maximum length of any */
+ /* conversion with default */
+ /* width and prec. */
+
+
+static int ec_len(CORD_ec x)
+{
+ return(CORD_len(x[0].ec_cord) + (x[0].ec_bufptr - x[0].ec_buf));
+}
+
+/* Possible nonumeric precision values. */
+# define NONE -1
+# define VARIABLE -2
+/* Copy the conversion specification from CORD_pos into the buffer buf */
+/* Return negative on error. */
+/* Source initially points one past the leading %. */
+/* It is left pointing at the conversion type. */
+/* Assign field width and precision to *width and *prec. */
+/* If width or prec is *, VARIABLE is assigned. */
+/* Set *left to 1 if left adjustment flag is present. */
+/* Set *long_arg to 1 if long flag ('l' or 'L') is present, or to */
+/* -1 if 'h' is present. */
+static int extract_conv_spec(CORD_pos source, char *buf,
+ int * width, int *prec, int *left, int * long_arg)
+{
+ register int result = 0;
+ register int current_number = 0;
+ register int saw_period = 0;
+ register int saw_number;
+ register int chars_so_far = 0;
+ register char current;
+
+ *width = NONE;
+ buf[chars_so_far++] = '%';
+ while(CORD_pos_valid(source)) {
+ if (chars_so_far >= CONV_SPEC_LEN) return(-1);
+ current = CORD_pos_fetch(source);
+ buf[chars_so_far++] = current;
+ switch(current) {
+ case '*':
+ saw_number = 1;
+ current_number = VARIABLE;
+ break;
+ case '0':
+ if (!saw_number) {
+ /* Zero fill flag; ignore */
+ break;
+ } /* otherwise fall through: */
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ saw_number = 1;
+ current_number *= 10;
+ current_number += current - '0';
+ break;
+ case '.':
+ saw_period = 1;
+ if(saw_number) {
+ *width = current_number;
+ saw_number = 0;
+ }
+ current_number = 0;
+ break;
+ case 'l':
+ case 'L':
+ *long_arg = 1;
+ current_number = 0;
+ break;
+ case 'h':
+ *long_arg = -1;
+ current_number = 0;
+ break;
+ case ' ':
+ case '+':
+ case '#':
+ current_number = 0;
+ break;
+ case '-':
+ *left = 1;
+ current_number = 0;
+ break;
+ case 'd':
+ case 'i':
+ case 'o':
+ case 'u':
+ case 'x':
+ case 'X':
+ case 'f':
+ case 'e':
+ case 'E':
+ case 'g':
+ case 'G':
+ case 'c':
+ case 'C':
+ case 's':
+ case 'S':
+ case 'p':
+ case 'n':
+ case 'r':
+ goto done;
+ default:
+ return(-1);
+ }
+ CORD_next(source);
+ }
+ return(-1);
+ done:
+ if (saw_number) {
+ if (saw_period) {
+ *prec = current_number;
+ } else {
+ *prec = NONE;
+ *width = current_number;
+ }
+ } else {
+ *prec = NONE;
+ }
+ buf[chars_so_far] = '\0';
+ return(result);
+}
+
+int CORD_vsprintf(CORD * out, CORD format, va_list args)
+{
+ CORD_ec result;
+ register int count;
+ register char current;
+ CORD_pos pos;
+ char conv_spec[CONV_SPEC_LEN + 1];
+
+ CORD_ec_init(result);
+ for (CORD_set_pos(pos, format, 0); CORD_pos_valid(pos); CORD_next(pos)) {
+ current = CORD_pos_fetch(pos);
+ if (current == '%') {
+ CORD_next(pos);
+ if (!CORD_pos_valid(pos)) return(-1);
+ current = CORD_pos_fetch(pos);
+ if (current == '%') {
+ CORD_ec_append(result, current);
+ } else {
+ int width, prec;
+ int left_adj = 0;
+ int long_arg = 0;
+ CORD arg;
+ size_t len;
+
+ if (extract_conv_spec(pos, conv_spec,
+ &width, &prec,
+ &left_adj, &long_arg) < 0) {
+ return(-1);
+ }
+ current = CORD_pos_fetch(pos);
+ switch(current) {
+ case 'n':
+ /* Assign length to next arg */
+ if (long_arg == 0) {
+ int * pos_ptr;
+ pos_ptr = va_arg(args, int *);
+ *pos_ptr = ec_len(result);
+ } else if (long_arg > 0) {
+ long * pos_ptr;
+ pos_ptr = va_arg(args, long *);
+ *pos_ptr = ec_len(result);
+ } else {
+ short * pos_ptr;
+ pos_ptr = va_arg(args, short *);
+ *pos_ptr = ec_len(result);
+ }
+ goto done;
+ case 'r':
+ /* Append cord and any padding */
+ if (width == VARIABLE) width = va_arg(args, int);
+ if (prec == VARIABLE) prec = va_arg(args, int);
+ arg = va_arg(args, CORD);
+ len = CORD_len(arg);
+ if (prec != NONE && len > prec) {
+ if (prec < 0) return(-1);
+ arg = CORD_substr(arg, 0, prec);
+ len = prec;
+ }
+ if (width != NONE && len < width) {
+ char * blanks = GC_MALLOC_ATOMIC(width-len+1);
+
+ memset(blanks, ' ', width-len);
+ blanks[width-len] = '\0';
+ if (left_adj) {
+ arg = CORD_cat(arg, blanks);
+ } else {
+ arg = CORD_cat(blanks, arg);
+ }
+ }
+ CORD_ec_append_cord(result, arg);
+ goto done;
+ case 'c':
+ if (width == NONE && prec == NONE) {
+ register char c = va_arg(args, char);
+
+ CORD_ec_append(result, c);
+ goto done;
+ }
+ break;
+ case 's':
+ if (width == NONE && prec == NONE) {
+ char * str = va_arg(args, char *);
+ register char c;
+
+ while (c = *str++) {
+ CORD_ec_append(result, c);
+ }
+ goto done;
+ }
+ break;
+ default:
+ break;
+ }
+ /* Use standard sprintf to perform conversion */
+ {
+ register char * buf;
+ va_list vsprintf_args = args;
+ /* The above does not appear to be sanctioned */
+ /* by the ANSI C standard. */
+ int max_size = 0;
+ int res;
+
+ if (width == VARIABLE) width = va_arg(args, int);
+ if (prec == VARIABLE) prec = va_arg(args, int);
+ if (width != NONE) max_size = width;
+ if (prec != NONE && prec > max_size) max_size = prec;
+ max_size += CONV_RESULT_LEN;
+ if (max_size >= CORD_BUFSZ) {
+ buf = GC_MALLOC_ATOMIC(max_size + 1);
+ } else {
+ if (CORD_BUFSZ - (result[0].ec_bufptr-result[0].ec_buf)
+ < max_size) {
+ CORD_ec_flush_buf(result);
+ }
+ buf = result[0].ec_bufptr;
+ }
+ switch(current) {
+ case 'd':
+ case 'i':
+ case 'o':
+ case 'u':
+ case 'x':
+ case 'X':
+ case 'c':
+ if (long_arg <= 0) {
+ (void) va_arg(args, int);
+ } else if (long_arg > 0) {
+ (void) va_arg(args, long);
+ }
+ break;
+ case 's':
+ case 'p':
+ (void) va_arg(args, char *);
+ break;
+ case 'f':
+ case 'e':
+ case 'E':
+ case 'g':
+ case 'G':
+ (void) va_arg(args, double);
+ break;
+ default:
+ return(-1);
+ }
+ res = vsprintf(buf, conv_spec, vsprintf_args);
+ len = (size_t)res;
+ if ((char *)(GC_word)res == buf) {
+ /* old style vsprintf */
+ len = strlen(buf);
+ } else if (res < 0) {
+ return(-1);
+ }
+ if (buf != result[0].ec_bufptr) {
+ register char c;
+
+ while (c = *buf++) {
+ CORD_ec_append(result, c);
+ }
+ } else {
+ result[0].ec_bufptr = buf + len;
+ }
+ }
+ done:;
+ }
+ } else {
+ CORD_ec_append(result, current);
+ }
+ }
+ count = ec_len(result);
+ *out = CORD_balance(CORD_ec_to_cord(result));
+ return(count);
+}
+
+int CORD_sprintf(CORD * out, CORD format, ...)
+{
+ va_list args;
+ int result;
+
+ va_start(args, format);
+ result = CORD_vsprintf(out, format, args);
+ va_end(args);
+ return(result);
+}
+
+int CORD_fprintf(FILE * f, CORD format, ...)
+{
+ va_list args;
+ int result;
+ CORD out;
+
+ va_start(args, format);
+ result = CORD_vsprintf(&out, format, args);
+ va_end(args);
+ if (result > 0) CORD_put(out, f);
+ return(result);
+}
+
+int CORD_vfprintf(FILE * f, CORD format, va_list args)
+{
+ int result;
+ CORD out;
+
+ result = CORD_vsprintf(&out, format, args);
+ if (result > 0) CORD_put(out, f);
+ return(result);
+}
+
+int CORD_printf(CORD format, ...)
+{
+ va_list args;
+ int result;
+ CORD out;
+
+ va_start(args, format);
+ result = CORD_vsprintf(&out, format, args);
+ va_end(args);
+ if (result > 0) CORD_put(out, stdout);
+ return(result);
+}
+
+int CORD_vprintf(CORD format, va_list args)
+{
+ int result;
+ CORD out;
+
+ result = CORD_vsprintf(&out, format, args);
+ if (result > 0) CORD_put(out, stdout);
+ return(result);
+}
diff --git a/boehm-gc/cord/cordtest.c b/boehm-gc/cord/cordtest.c
new file mode 100644
index 00000000000..d11d7dd44df
--- /dev/null
+++ b/boehm-gc/cord/cordtest.c
@@ -0,0 +1,228 @@
+/*
+ * Copyright (c) 1993-1994 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+/* Boehm, August 24, 1994 11:58 am PDT */
+# include "cord.h"
+# include <string.h>
+# include <stdio.h>
+/* This is a very incomplete test of the cord package. It knows about */
+/* a few internals of the package (e.g. when C strings are returned) */
+/* that real clients shouldn't rely on. */
+
+# define ABORT(string) \
+{ int x = 0; fprintf(stderr, "FAILED: %s\n", string); x = 1 / x; abort(); }
+
+int count;
+
+int test_fn(char c, void * client_data)
+{
+ if (client_data != (void *)13) ABORT("bad client data");
+ if (count < 64*1024+1) {
+ if ((count & 1) == 0) {
+ if (c != 'b') ABORT("bad char");
+ } else {
+ if (c != 'a') ABORT("bad char");
+ }
+ count++;
+ return(0);
+ } else {
+ if (c != 'c') ABORT("bad char");
+ count++;
+ return(1);
+ }
+}
+
+char id_cord_fn(size_t i, void * client_data)
+{
+ return((char)i);
+}
+
+void test_basics()
+{
+ CORD x = CORD_from_char_star("ab");
+ register int i;
+ char c;
+ CORD y;
+ CORD_pos p;
+
+ x = CORD_cat(x,x);
+ if (!CORD_IS_STRING(x)) ABORT("short cord should usually be a string");
+ if (strcmp(x, "abab") != 0) ABORT("bad CORD_cat result");
+
+ for (i = 1; i < 16; i++) {
+ x = CORD_cat(x,x);
+ }
+ x = CORD_cat(x,"c");
+ if (CORD_len(x) != 128*1024+1) ABORT("bad length");
+
+ count = 0;
+ if (CORD_iter5(x, 64*1024-1, test_fn, CORD_NO_FN, (void *)13) == 0) {
+ ABORT("CORD_iter5 failed");
+ }
+ if (count != 64*1024 + 2) ABORT("CORD_iter5 failed");
+
+ count = 0;
+ CORD_set_pos(p, x, 64*1024-1);
+ while(CORD_pos_valid(p)) {
+ (void) test_fn(CORD_pos_fetch(p), (void *)13);
+ CORD_next(p);
+ }
+ if (count != 64*1024 + 2) ABORT("Position based iteration failed");
+
+ y = CORD_substr(x, 1023, 5);
+ if (!CORD_IS_STRING(y)) ABORT("short cord should usually be a string");
+ if (strcmp(y, "babab") != 0) ABORT("bad CORD_substr result");
+
+ y = CORD_substr(x, 1024, 8);
+ if (!CORD_IS_STRING(y)) ABORT("short cord should usually be a string");
+ if (strcmp(y, "abababab") != 0) ABORT("bad CORD_substr result");
+
+ y = CORD_substr(x, 128*1024-1, 8);
+ if (!CORD_IS_STRING(y)) ABORT("short cord should usually be a string");
+ if (strcmp(y, "bc") != 0) ABORT("bad CORD_substr result");
+
+ x = CORD_balance(x);
+ if (CORD_len(x) != 128*1024+1) ABORT("bad length");
+
+ count = 0;
+ if (CORD_iter5(x, 64*1024-1, test_fn, CORD_NO_FN, (void *)13) == 0) {
+ ABORT("CORD_iter5 failed");
+ }
+ if (count != 64*1024 + 2) ABORT("CORD_iter5 failed");
+
+ y = CORD_substr(x, 1023, 5);
+ if (!CORD_IS_STRING(y)) ABORT("short cord should usually be a string");
+ if (strcmp(y, "babab") != 0) ABORT("bad CORD_substr result");
+ y = CORD_from_fn(id_cord_fn, 0, 13);
+ i = 0;
+ CORD_set_pos(p, y, i);
+ while(CORD_pos_valid(p)) {
+ c = CORD_pos_fetch(p);
+ if(c != i) ABORT("Traversal of function node failed");
+ CORD_next(p); i++;
+ }
+ if (i != 13) ABORT("Bad apparent length for function node");
+}
+
+void test_extras()
+{
+# if defined(__OS2__)
+# define FNAME1 "tmp1"
+# define FNAME2 "tmp2"
+# elif defined(AMIGA)
+# define FNAME1 "T:tmp1"
+# define FNAME2 "T:tmp2"
+# else
+# define FNAME1 "/tmp/cord_test"
+# define FNAME2 "/tmp/cord_test2"
+# endif
+ register int i;
+ CORD y = "abcdefghijklmnopqrstuvwxyz0123456789";
+ CORD x = "{}";
+ CORD w, z;
+ FILE *f;
+ FILE *f1a, *f1b, *f2;
+
+ w = CORD_cat(CORD_cat(y,y),y);
+ z = CORD_catn(3,y,y,y);
+ if (CORD_cmp(w,z) != 0) ABORT("CORD_catn comparison wrong");
+ for (i = 1; i < 100; i++) {
+ x = CORD_cat(x, y);
+ }
+ z = CORD_balance(x);
+ if (CORD_cmp(x,z) != 0) ABORT("balanced string comparison wrong");
+ if (CORD_cmp(x,CORD_cat(z, CORD_nul(13))) >= 0) ABORT("comparison 2");
+ if (CORD_cmp(CORD_cat(x, CORD_nul(13)), z) <= 0) ABORT("comparison 3");
+ if (CORD_cmp(x,CORD_cat(z, "13")) >= 0) ABORT("comparison 4");
+ if ((f = fopen(FNAME1, "w")) == 0) ABORT("open failed");
+ if (CORD_put(z,f) == EOF) ABORT("CORD_put failed");
+ if (fclose(f) == EOF) ABORT("fclose failed");
+ w = CORD_from_file(f1a = fopen(FNAME1, "rb"));
+ if (CORD_len(w) != CORD_len(z)) ABORT("file length wrong");
+ if (CORD_cmp(w,z) != 0) ABORT("file comparison wrong");
+ if (CORD_cmp(CORD_substr(w, 50*36+2, 36), y) != 0)
+ ABORT("file substr wrong");
+ z = CORD_from_file_lazy(f1b = fopen(FNAME1, "rb"));
+ if (CORD_cmp(w,z) != 0) ABORT("File conversions differ");
+ if (CORD_chr(w, 0, '9') != 37) ABORT("CORD_chr failed 1");
+ if (CORD_chr(w, 3, 'a') != 38) ABORT("CORD_chr failed 2");
+ if (CORD_rchr(w, CORD_len(w) - 1, '}') != 1) ABORT("CORD_rchr failed");
+ x = y;
+ for (i = 1; i < 14; i++) {
+ x = CORD_cat(x,x);
+ }
+ if ((f = fopen(FNAME2, "w")) == 0) ABORT("2nd open failed");
+ if (CORD_put(x,f) == EOF) ABORT("CORD_put failed");
+ if (fclose(f) == EOF) ABORT("fclose failed");
+ w = CORD_from_file(f2 = fopen(FNAME2, "rb"));
+ if (CORD_len(w) != CORD_len(x)) ABORT("file length wrong");
+ if (CORD_cmp(w,x) != 0) ABORT("file comparison wrong");
+ if (CORD_cmp(CORD_substr(w, 1000*36, 36), y) != 0)
+ ABORT("file substr wrong");
+ if (strcmp(CORD_to_char_star(CORD_substr(w, 1000*36, 36)), y) != 0)
+ ABORT("char * file substr wrong");
+ if (strcmp(CORD_substr(w, 1000*36, 2), "ab") != 0)
+ ABORT("short file substr wrong");
+ if (CORD_str(x,1,"9a") != 35) ABORT("CORD_str failed 1");
+ if (CORD_str(x,0,"9abcdefghijk") != 35) ABORT("CORD_str failed 2");
+ if (CORD_str(x,0,"9abcdefghijx") != CORD_NOT_FOUND)
+ ABORT("CORD_str failed 3");
+ if (CORD_str(x,0,"9>") != CORD_NOT_FOUND) ABORT("CORD_str failed 4");
+ if (remove(FNAME1) != 0) {
+ /* On some systems, e.g. OS2, this may fail if f1 is still open. */
+ if ((fclose(f1a) == EOF) & (fclose(f1b) == EOF))
+ ABORT("fclose(f1) failed");
+ if (remove(FNAME1) != 0) ABORT("remove 1 failed");
+ }
+ if (remove(FNAME2) != 0) {
+ if (fclose(f2) == EOF) ABORT("fclose(f2) failed");
+ if (remove(FNAME2) != 0) ABORT("remove 2 failed");
+ }
+}
+
+void test_printf()
+{
+ CORD result;
+ char result2[200];
+ long l;
+ short s;
+ CORD x;
+
+ if (CORD_sprintf(&result, "%7.2f%ln", 3.14159F, &l) != 7)
+ ABORT("CORD_sprintf failed 1");
+ if (CORD_cmp(result, " 3.14") != 0)ABORT("CORD_sprintf goofed 1");
+ if (l != 7) ABORT("CORD_sprintf goofed 2");
+ if (CORD_sprintf(&result, "%-7.2s%hn%c%s", "abcd", &s, 'x', "yz") != 10)
+ ABORT("CORD_sprintf failed 2");
+ if (CORD_cmp(result, "ab xyz") != 0)ABORT("CORD_sprintf goofed 3");
+ if (s != 7) ABORT("CORD_sprintf goofed 4");
+ x = "abcdefghij";
+ x = CORD_cat(x,x);
+ x = CORD_cat(x,x);
+ x = CORD_cat(x,x);
+ if (CORD_sprintf(&result, "->%-120.78r!\n", x) != 124)
+ ABORT("CORD_sprintf failed 3");
+ (void) sprintf(result2, "->%-120.78s!\n", CORD_to_char_star(x));
+ if (CORD_cmp(result, result2) != 0)ABORT("CORD_sprintf goofed 5");
+}
+
+main()
+{
+# ifdef THINK_C
+ printf("cordtest:\n");
+# endif
+ test_basics();
+ test_extras();
+ test_printf();
+ CORD_fprintf(stderr, "SUCCEEDED\n");
+ return(0);
+}
diff --git a/boehm-gc/cord/cordxtra.c b/boehm-gc/cord/cordxtra.c
new file mode 100644
index 00000000000..b306fbaccea
--- /dev/null
+++ b/boehm-gc/cord/cordxtra.c
@@ -0,0 +1,621 @@
+/*
+ * Copyright (c) 1993-1994 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ * Author: Hans-J. Boehm (boehm@parc.xerox.com)
+ */
+/*
+ * These are functions on cords that do not need to understand their
+ * implementation. They serve also serve as example client code for
+ * cord_basics.
+ */
+/* Boehm, December 8, 1995 1:53 pm PST */
+# include <stdio.h>
+# include <string.h>
+# include <stdlib.h>
+# include <stdarg.h>
+# include "cord.h"
+# include "ec.h"
+# define I_HIDE_POINTERS /* So we get access to allocation lock. */
+ /* We use this for lazy file reading, */
+ /* so that we remain independent */
+ /* of the threads primitives. */
+# include "gc.h"
+
+/* For now we assume that pointer reads and writes are atomic, */
+/* i.e. another thread always sees the state before or after */
+/* a write. This might be false on a Motorola M68K with */
+/* pointers that are not 32-bit aligned. But there probably */
+/* aren't too many threads packages running on those. */
+# define ATOMIC_WRITE(x,y) (x) = (y)
+# define ATOMIC_READ(x) (*(x))
+
+/* The standard says these are in stdio.h, but they aren't always: */
+# ifndef SEEK_SET
+# define SEEK_SET 0
+# endif
+# ifndef SEEK_END
+# define SEEK_END 2
+# endif
+
+# define BUFSZ 2048 /* Size of stack allocated buffers when */
+ /* we want large buffers. */
+
+typedef void (* oom_fn)(void);
+
+# define OUT_OF_MEMORY { if (CORD_oom_fn != (oom_fn) 0) (*CORD_oom_fn)(); \
+ ABORT("Out of memory\n"); }
+# define ABORT(msg) { fprintf(stderr, "%s\n", msg); abort(); }
+
+CORD CORD_cat_char(CORD x, char c)
+{
+ register char * string;
+
+ if (c == '\0') return(CORD_cat(x, CORD_nul(1)));
+ string = GC_MALLOC_ATOMIC(2);
+ if (string == 0) OUT_OF_MEMORY;
+ string[0] = c;
+ string[1] = '\0';
+ return(CORD_cat_char_star(x, string, 1));
+}
+
+CORD CORD_catn(int nargs, ...)
+{
+ register CORD result = CORD_EMPTY;
+ va_list args;
+ register int i;
+
+ va_start(args, nargs);
+ for (i = 0; i < nargs; i++) {
+ register CORD next = va_arg(args, CORD);
+ result = CORD_cat(result, next);
+ }
+ va_end(args);
+ return(result);
+}
+
+typedef struct {
+ size_t len;
+ size_t count;
+ char * buf;
+} CORD_fill_data;
+
+int CORD_fill_proc(char c, void * client_data)
+{
+ register CORD_fill_data * d = (CORD_fill_data *)client_data;
+ register size_t count = d -> count;
+
+ (d -> buf)[count] = c;
+ d -> count = ++count;
+ if (count >= d -> len) {
+ return(1);
+ } else {
+ return(0);
+ }
+}
+
+int CORD_batched_fill_proc(const char * s, void * client_data)
+{
+ register CORD_fill_data * d = (CORD_fill_data *)client_data;
+ register size_t count = d -> count;
+ register size_t max = d -> len;
+ register char * buf = d -> buf;
+ register const char * t = s;
+
+ while((buf[count] = *t++) != '\0') {
+ count++;
+ if (count >= max) {
+ d -> count = count;
+ return(1);
+ }
+ }
+ d -> count = count;
+ return(0);
+}
+
+/* Fill buf with len characters starting at i. */
+/* Assumes len characters are available. */
+void CORD_fill_buf(CORD x, size_t i, size_t len, char * buf)
+{
+ CORD_fill_data fd;
+
+ fd.len = len;
+ fd.buf = buf;
+ fd.count = 0;
+ (void)CORD_iter5(x, i, CORD_fill_proc, CORD_batched_fill_proc, &fd);
+}
+
+int CORD_cmp(CORD x, CORD y)
+{
+ CORD_pos xpos;
+ CORD_pos ypos;
+ register size_t avail, yavail;
+
+ if (y == CORD_EMPTY) return(x != CORD_EMPTY);
+ if (x == CORD_EMPTY) return(-1);
+ if (CORD_IS_STRING(y) && CORD_IS_STRING(x)) return(strcmp(x,y));
+ CORD_set_pos(xpos, x, 0);
+ CORD_set_pos(ypos, y, 0);
+ for(;;) {
+ if (!CORD_pos_valid(xpos)) {
+ if (CORD_pos_valid(ypos)) {
+ return(-1);
+ } else {
+ return(0);
+ }
+ }
+ if (!CORD_pos_valid(ypos)) {
+ return(1);
+ }
+ if ((avail = CORD_pos_chars_left(xpos)) <= 0
+ || (yavail = CORD_pos_chars_left(ypos)) <= 0) {
+ register char xcurrent = CORD_pos_fetch(xpos);
+ register char ycurrent = CORD_pos_fetch(ypos);
+ if (xcurrent != ycurrent) return(xcurrent - ycurrent);
+ CORD_next(xpos);
+ CORD_next(ypos);
+ } else {
+ /* process as many characters as we can */
+ register int result;
+
+ if (avail > yavail) avail = yavail;
+ result = strncmp(CORD_pos_cur_char_addr(xpos),
+ CORD_pos_cur_char_addr(ypos), avail);
+ if (result != 0) return(result);
+ CORD_pos_advance(xpos, avail);
+ CORD_pos_advance(ypos, avail);
+ }
+ }
+}
+
+int CORD_ncmp(CORD x, size_t x_start, CORD y, size_t y_start, size_t len)
+{
+ CORD_pos xpos;
+ CORD_pos ypos;
+ register size_t count;
+ register long avail, yavail;
+
+ CORD_set_pos(xpos, x, x_start);
+ CORD_set_pos(ypos, y, y_start);
+ for(count = 0; count < len;) {
+ if (!CORD_pos_valid(xpos)) {
+ if (CORD_pos_valid(ypos)) {
+ return(-1);
+ } else {
+ return(0);
+ }
+ }
+ if (!CORD_pos_valid(ypos)) {
+ return(1);
+ }
+ if ((avail = CORD_pos_chars_left(xpos)) <= 0
+ || (yavail = CORD_pos_chars_left(ypos)) <= 0) {
+ register char xcurrent = CORD_pos_fetch(xpos);
+ register char ycurrent = CORD_pos_fetch(ypos);
+ if (xcurrent != ycurrent) return(xcurrent - ycurrent);
+ CORD_next(xpos);
+ CORD_next(ypos);
+ count++;
+ } else {
+ /* process as many characters as we can */
+ register int result;
+
+ if (avail > yavail) avail = yavail;
+ count += avail;
+ if (count > len) avail -= (count - len);
+ result = strncmp(CORD_pos_cur_char_addr(xpos),
+ CORD_pos_cur_char_addr(ypos), (size_t)avail);
+ if (result != 0) return(result);
+ CORD_pos_advance(xpos, (size_t)avail);
+ CORD_pos_advance(ypos, (size_t)avail);
+ }
+ }
+ return(0);
+}
+
+char * CORD_to_char_star(CORD x)
+{
+ register size_t len = CORD_len(x);
+ char * result = GC_MALLOC_ATOMIC(len + 1);
+
+ if (result == 0) OUT_OF_MEMORY;
+ CORD_fill_buf(x, 0, len, result);
+ result[len] = '\0';
+ return(result);
+}
+
+CORD CORD_from_char_star(const char *s)
+{
+ char * result;
+ size_t len = strlen(s);
+
+ if (0 == len) return(CORD_EMPTY);
+ result = GC_MALLOC_ATOMIC(len + 1);
+ if (result == 0) OUT_OF_MEMORY;
+ memcpy(result, s, len+1);
+ return(result);
+}
+
+const char * CORD_to_const_char_star(CORD x)
+{
+ if (x == 0) return("");
+ if (CORD_IS_STRING(x)) return((const char *)x);
+ return(CORD_to_char_star(x));
+}
+
+char CORD_fetch(CORD x, size_t i)
+{
+ CORD_pos xpos;
+
+ CORD_set_pos(xpos, x, i);
+ if (!CORD_pos_valid(xpos)) ABORT("bad index?");
+ return(CORD_pos_fetch(xpos));
+}
+
+
+int CORD_put_proc(char c, void * client_data)
+{
+ register FILE * f = (FILE *)client_data;
+
+ return(putc(c, f) == EOF);
+}
+
+int CORD_batched_put_proc(const char * s, void * client_data)
+{
+ register FILE * f = (FILE *)client_data;
+
+ return(fputs(s, f) == EOF);
+}
+
+
+int CORD_put(CORD x, FILE * f)
+{
+ if (CORD_iter5(x, 0, CORD_put_proc, CORD_batched_put_proc, f)) {
+ return(EOF);
+ } else {
+ return(1);
+ }
+}
+
+typedef struct {
+ size_t pos; /* Current position in the cord */
+ char target; /* Character we're looking for */
+} chr_data;
+
+int CORD_chr_proc(char c, void * client_data)
+{
+ register chr_data * d = (chr_data *)client_data;
+
+ if (c == d -> target) return(1);
+ (d -> pos) ++;
+ return(0);
+}
+
+int CORD_rchr_proc(char c, void * client_data)
+{
+ register chr_data * d = (chr_data *)client_data;
+
+ if (c == d -> target) return(1);
+ (d -> pos) --;
+ return(0);
+}
+
+int CORD_batched_chr_proc(const char *s, void * client_data)
+{
+ register chr_data * d = (chr_data *)client_data;
+ register char * occ = strchr(s, d -> target);
+
+ if (occ == 0) {
+ d -> pos += strlen(s);
+ return(0);
+ } else {
+ d -> pos += occ - s;
+ return(1);
+ }
+}
+
+size_t CORD_chr(CORD x, size_t i, int c)
+{
+ chr_data d;
+
+ d.pos = i;
+ d.target = c;
+ if (CORD_iter5(x, i, CORD_chr_proc, CORD_batched_chr_proc, &d)) {
+ return(d.pos);
+ } else {
+ return(CORD_NOT_FOUND);
+ }
+}
+
+size_t CORD_rchr(CORD x, size_t i, int c)
+{
+ chr_data d;
+
+ d.pos = i;
+ d.target = c;
+ if (CORD_riter4(x, i, CORD_rchr_proc, &d)) {
+ return(d.pos);
+ } else {
+ return(CORD_NOT_FOUND);
+ }
+}
+
+/* Find the first occurrence of s in x at position start or later. */
+/* This uses an asymptotically poor algorithm, which should typically */
+/* perform acceptably. We compare the first few characters directly, */
+/* and call CORD_ncmp whenever there is a partial match. */
+/* This has the advantage that we allocate very little, or not at all. */
+/* It's very fast if there are few close misses. */
+size_t CORD_str(CORD x, size_t start, CORD s)
+{
+ CORD_pos xpos;
+ size_t xlen = CORD_len(x);
+ size_t slen;
+ register size_t start_len;
+ const char * s_start;
+ unsigned long s_buf = 0; /* The first few characters of s */
+ unsigned long x_buf = 0; /* Start of candidate substring. */
+ /* Initialized only to make compilers */
+ /* happy. */
+ unsigned long mask = 0;
+ register size_t i;
+ register size_t match_pos;
+
+ if (s == CORD_EMPTY) return(start);
+ if (CORD_IS_STRING(s)) {
+ s_start = s;
+ slen = strlen(s);
+ } else {
+ s_start = CORD_to_char_star(CORD_substr(s, 0, sizeof(unsigned long)));
+ slen = CORD_len(s);
+ }
+ if (xlen < start || xlen - start < slen) return(CORD_NOT_FOUND);
+ start_len = slen;
+ if (start_len > sizeof(unsigned long)) start_len = sizeof(unsigned long);
+ CORD_set_pos(xpos, x, start);
+ for (i = 0; i < start_len; i++) {
+ mask <<= 8;
+ mask |= 0xff;
+ s_buf <<= 8;
+ s_buf |= s_start[i];
+ x_buf <<= 8;
+ x_buf |= CORD_pos_fetch(xpos);
+ CORD_next(xpos);
+ }
+ for (match_pos = start; ; match_pos++) {
+ if ((x_buf & mask) == s_buf) {
+ if (slen == start_len ||
+ CORD_ncmp(x, match_pos + start_len,
+ s, start_len, slen - start_len) == 0) {
+ return(match_pos);
+ }
+ }
+ if ( match_pos == xlen - slen ) {
+ return(CORD_NOT_FOUND);
+ }
+ x_buf <<= 8;
+ x_buf |= CORD_pos_fetch(xpos);
+ CORD_next(xpos);
+ }
+}
+
+void CORD_ec_flush_buf(CORD_ec x)
+{
+ register size_t len = x[0].ec_bufptr - x[0].ec_buf;
+ char * s;
+
+ if (len == 0) return;
+ s = GC_MALLOC_ATOMIC(len+1);
+ memcpy(s, x[0].ec_buf, len);
+ s[len] = '\0';
+ x[0].ec_cord = CORD_cat_char_star(x[0].ec_cord, s, len);
+ x[0].ec_bufptr = x[0].ec_buf;
+}
+
+void CORD_ec_append_cord(CORD_ec x, CORD s)
+{
+ CORD_ec_flush_buf(x);
+ x[0].ec_cord = CORD_cat(x[0].ec_cord, s);
+}
+
+/*ARGSUSED*/
+char CORD_nul_func(size_t i, void * client_data)
+{
+ return((char)(unsigned long)client_data);
+}
+
+
+CORD CORD_chars(char c, size_t i)
+{
+ return(CORD_from_fn(CORD_nul_func, (void *)(unsigned long)c, i));
+}
+
+CORD CORD_from_file_eager(FILE * f)
+{
+ register int c;
+ CORD_ec ecord;
+
+ CORD_ec_init(ecord);
+ for(;;) {
+ c = getc(f);
+ if (c == 0) {
+ /* Append the right number of NULs */
+ /* Note that any string of NULs is rpresented in 4 words, */
+ /* independent of its length. */
+ register size_t count = 1;
+
+ CORD_ec_flush_buf(ecord);
+ while ((c = getc(f)) == 0) count++;
+ ecord[0].ec_cord = CORD_cat(ecord[0].ec_cord, CORD_nul(count));
+ }
+ if (c == EOF) break;
+ CORD_ec_append(ecord, c);
+ }
+ (void) fclose(f);
+ return(CORD_balance(CORD_ec_to_cord(ecord)));
+}
+
+/* The state maintained for a lazily read file consists primarily */
+/* of a large direct-mapped cache of previously read values. */
+/* We could rely more on stdio buffering. That would have 2 */
+/* disadvantages: */
+/* 1) Empirically, not all fseek implementations preserve the */
+/* buffer whenever they could. */
+/* 2) It would fail if 2 different sections of a long cord */
+/* were being read alternately. */
+/* We do use the stdio buffer for read ahead. */
+/* To guarantee thread safety in the presence of atomic pointer */
+/* writes, cache lines are always replaced, and never modified in */
+/* place. */
+
+# define LOG_CACHE_SZ 14
+# define CACHE_SZ (1 << LOG_CACHE_SZ)
+# define LOG_LINE_SZ 9
+# define LINE_SZ (1 << LOG_LINE_SZ)
+
+typedef struct {
+ size_t tag;
+ char data[LINE_SZ];
+ /* data[i%LINE_SZ] = ith char in file if tag = i/LINE_SZ */
+} cache_line;
+
+typedef struct {
+ FILE * lf_file;
+ size_t lf_current; /* Current file pointer value */
+ cache_line * volatile lf_cache[CACHE_SZ/LINE_SZ];
+} lf_state;
+
+# define MOD_CACHE_SZ(n) ((n) & (CACHE_SZ - 1))
+# define DIV_CACHE_SZ(n) ((n) >> LOG_CACHE_SZ)
+# define MOD_LINE_SZ(n) ((n) & (LINE_SZ - 1))
+# define DIV_LINE_SZ(n) ((n) >> LOG_LINE_SZ)
+# define LINE_START(n) ((n) & ~(LINE_SZ - 1))
+
+typedef struct {
+ lf_state * state;
+ size_t file_pos; /* Position of needed character. */
+ cache_line * new_cache;
+} refill_data;
+
+/* Executed with allocation lock. */
+static char refill_cache(client_data)
+refill_data * client_data;
+{
+ register lf_state * state = client_data -> state;
+ register size_t file_pos = client_data -> file_pos;
+ FILE *f = state -> lf_file;
+ size_t line_start = LINE_START(file_pos);
+ size_t line_no = DIV_LINE_SZ(MOD_CACHE_SZ(file_pos));
+ cache_line * new_cache = client_data -> new_cache;
+
+ if (line_start != state -> lf_current
+ && fseek(f, line_start, SEEK_SET) != 0) {
+ ABORT("fseek failed");
+ }
+ if (fread(new_cache -> data, sizeof(char), LINE_SZ, f)
+ <= file_pos - line_start) {
+ ABORT("fread failed");
+ }
+ new_cache -> tag = DIV_LINE_SZ(file_pos);
+ /* Store barrier goes here. */
+ ATOMIC_WRITE(state -> lf_cache[line_no], new_cache);
+ state -> lf_current = line_start + LINE_SZ;
+ return(new_cache->data[MOD_LINE_SZ(file_pos)]);
+}
+
+char CORD_lf_func(size_t i, void * client_data)
+{
+ register lf_state * state = (lf_state *)client_data;
+ register cache_line * volatile * cl_addr =
+ &(state -> lf_cache[DIV_LINE_SZ(MOD_CACHE_SZ(i))]);
+ register cache_line * cl = (cache_line *)ATOMIC_READ(cl_addr);
+
+ if (cl == 0 || cl -> tag != DIV_LINE_SZ(i)) {
+ /* Cache miss */
+ refill_data rd;
+
+ rd.state = state;
+ rd.file_pos = i;
+ rd.new_cache = GC_NEW_ATOMIC(cache_line);
+ if (rd.new_cache == 0) OUT_OF_MEMORY;
+ return((char)(GC_word)
+ GC_call_with_alloc_lock((GC_fn_type) refill_cache, &rd));
+ }
+ return(cl -> data[MOD_LINE_SZ(i)]);
+}
+
+/*ARGSUSED*/
+void CORD_lf_close_proc(void * obj, void * client_data)
+{
+ if (fclose(((lf_state *)obj) -> lf_file) != 0) {
+ ABORT("CORD_lf_close_proc: fclose failed");
+ }
+}
+
+CORD CORD_from_file_lazy_inner(FILE * f, size_t len)
+{
+ register lf_state * state = GC_NEW(lf_state);
+ register int i;
+
+ if (state == 0) OUT_OF_MEMORY;
+ if (len != 0) {
+ /* Dummy read to force buffer allocation. */
+ /* This greatly increases the probability */
+ /* of avoiding deadlock if buffer allocation */
+ /* is redirected to GC_malloc and the */
+ /* world is multithreaded. */
+ char buf[1];
+
+ (void) fread(buf, 1, 1, f);
+ rewind(f);
+ }
+ state -> lf_file = f;
+ for (i = 0; i < CACHE_SZ/LINE_SZ; i++) {
+ state -> lf_cache[i] = 0;
+ }
+ state -> lf_current = 0;
+ GC_register_finalizer(state, CORD_lf_close_proc, 0, 0, 0);
+ return(CORD_from_fn(CORD_lf_func, state, len));
+}
+
+CORD CORD_from_file_lazy(FILE * f)
+{
+ register long len;
+
+ if (fseek(f, 0l, SEEK_END) != 0) {
+ ABORT("Bad fd argument - fseek failed");
+ }
+ if ((len = ftell(f)) < 0) {
+ ABORT("Bad fd argument - ftell failed");
+ }
+ rewind(f);
+ return(CORD_from_file_lazy_inner(f, (size_t)len));
+}
+
+# define LAZY_THRESHOLD (128*1024 + 1)
+
+CORD CORD_from_file(FILE * f)
+{
+ register long len;
+
+ if (fseek(f, 0l, SEEK_END) != 0) {
+ ABORT("Bad fd argument - fseek failed");
+ }
+ if ((len = ftell(f)) < 0) {
+ ABORT("Bad fd argument - ftell failed");
+ }
+ rewind(f);
+ if (len < LAZY_THRESHOLD) {
+ return(CORD_from_file_eager(f));
+ } else {
+ return(CORD_from_file_lazy_inner(f, (size_t)len));
+ }
+}
diff --git a/boehm-gc/cord/de.c b/boehm-gc/cord/de.c
new file mode 100644
index 00000000000..18625d2bb37
--- /dev/null
+++ b/boehm-gc/cord/de.c
@@ -0,0 +1,604 @@
+/*
+ * Copyright (c) 1993-1994 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ * Author: Hans-J. Boehm (boehm@parc.xerox.com)
+ */
+/*
+ * A really simple-minded text editor based on cords.
+ * Things it does right:
+ * No size bounds.
+ * Inbounded undo.
+ * Shouldn't crash no matter what file you invoke it on (e.g. /vmunix)
+ * (Make sure /vmunix is not writable before you try this.)
+ * Scrolls horizontally.
+ * Things it does wrong:
+ * It doesn't handle tabs reasonably (use "expand" first).
+ * The command set is MUCH too small.
+ * The redisplay algorithm doesn't let curses do the scrolling.
+ * The rule for moving the window over the file is suboptimal.
+ */
+/* Boehm, February 6, 1995 12:27 pm PST */
+
+/* Boehm, May 19, 1994 2:20 pm PDT */
+#include <stdio.h>
+#include "gc.h"
+#include "cord.h"
+
+#ifdef THINK_C
+#define MACINTOSH
+#include <ctype.h>
+#endif
+
+#if defined(__BORLANDC__) && !defined(WIN32)
+ /* If this is DOS or win16, we'll fail anyway. */
+ /* Might as well assume win32. */
+# define WIN32
+#endif
+
+#if defined(WIN32)
+# include <windows.h>
+# include "de_win.h"
+#elif defined(MACINTOSH)
+# include <console.h>
+/* curses emulation. */
+# define initscr()
+# define endwin()
+# define nonl()
+# define noecho() csetmode(C_NOECHO, stdout)
+# define cbreak() csetmode(C_CBREAK, stdout)
+# define refresh()
+# define addch(c) putchar(c)
+# define standout() cinverse(1, stdout)
+# define standend() cinverse(0, stdout)
+# define move(line,col) cgotoxy(col + 1, line + 1, stdout)
+# define clrtoeol() ccleol(stdout)
+# define de_error(s) { fprintf(stderr, s); getchar(); }
+# define LINES 25
+# define COLS 80
+#else
+# include <curses.h>
+# define de_error(s) { fprintf(stderr, s); sleep(2); }
+#endif
+#include "de_cmds.h"
+
+/* List of line number to position mappings, in descending order. */
+/* There may be holes. */
+typedef struct LineMapRep {
+ int line;
+ size_t pos;
+ struct LineMapRep * previous;
+} * line_map;
+
+/* List of file versions, one per edit operation */
+typedef struct HistoryRep {
+ CORD file_contents;
+ struct HistoryRep * previous;
+ line_map map; /* Invalid for first record "now" */
+} * history;
+
+history now = 0;
+CORD current; /* == now -> file_contents. */
+size_t current_len; /* Current file length. */
+line_map current_map = 0; /* Current line no. to pos. map */
+size_t current_map_size = 0; /* Number of current_map entries. */
+ /* Not always accurate, but reset */
+ /* by prune_map. */
+# define MAX_MAP_SIZE 3000
+
+/* Current display position */
+int dis_line = 0;
+int dis_col = 0;
+
+# define ALL -1
+# define NONE - 2
+int need_redisplay = 0; /* Line that needs to be redisplayed. */
+
+
+/* Current cursor position. Always within file. */
+int line = 0;
+int col = 0;
+size_t file_pos = 0; /* Character position corresponding to cursor. */
+
+/* Invalidate line map for lines > i */
+void invalidate_map(int i)
+{
+ while(current_map -> line > i) {
+ current_map = current_map -> previous;
+ current_map_size--;
+ }
+}
+
+/* Reduce the number of map entries to save space for huge files. */
+/* This also affects maps in histories. */
+void prune_map()
+{
+ line_map map = current_map;
+ int start_line = map -> line;
+
+ current_map_size = 0;
+ for(; map != 0; map = map -> previous) {
+ current_map_size++;
+ if (map -> line < start_line - LINES && map -> previous != 0) {
+ map -> previous = map -> previous -> previous;
+ }
+ }
+}
+/* Add mapping entry */
+void add_map(int line, size_t pos)
+{
+ line_map new_map = GC_NEW(struct LineMapRep);
+
+ if (current_map_size >= MAX_MAP_SIZE) prune_map();
+ new_map -> line = line;
+ new_map -> pos = pos;
+ new_map -> previous = current_map;
+ current_map = new_map;
+ current_map_size++;
+}
+
+
+
+/* Return position of column *c of ith line in */
+/* current file. Adjust *c to be within the line.*/
+/* A 0 pointer is taken as 0 column. */
+/* Returns CORD_NOT_FOUND if i is too big. */
+/* Assumes i > dis_line. */
+size_t line_pos(int i, int *c)
+{
+ int j;
+ size_t cur;
+ size_t next;
+ line_map map = current_map;
+
+ while (map -> line > i) map = map -> previous;
+ if (map -> line < i - 2) /* rebuild */ invalidate_map(i);
+ for (j = map -> line, cur = map -> pos; j < i;) {
+ cur = CORD_chr(current, cur, '\n');
+ if (cur == current_len-1) return(CORD_NOT_FOUND);
+ cur++;
+ if (++j > current_map -> line) add_map(j, cur);
+ }
+ if (c != 0) {
+ next = CORD_chr(current, cur, '\n');
+ if (next == CORD_NOT_FOUND) next = current_len - 1;
+ if (next < cur + *c) {
+ *c = next - cur;
+ }
+ cur += *c;
+ }
+ return(cur);
+}
+
+void add_hist(CORD s)
+{
+ history new_file = GC_NEW(struct HistoryRep);
+
+ new_file -> file_contents = current = s;
+ current_len = CORD_len(s);
+ new_file -> previous = now;
+ if (now != 0) now -> map = current_map;
+ now = new_file;
+}
+
+void del_hist(void)
+{
+ now = now -> previous;
+ current = now -> file_contents;
+ current_map = now -> map;
+ current_len = CORD_len(current);
+}
+
+/* Current screen_contents; a dynamically allocated array of CORDs */
+CORD * screen = 0;
+int screen_size = 0;
+
+# ifndef WIN32
+/* Replace a line in the curses stdscr. All control characters are */
+/* displayed as upper case characters in standout mode. This isn't */
+/* terribly appropriate for tabs. */
+void replace_line(int i, CORD s)
+{
+ register int c;
+ CORD_pos p;
+ size_t len = CORD_len(s);
+
+ if (screen == 0 || LINES > screen_size) {
+ screen_size = LINES;
+ screen = (CORD *)GC_MALLOC(screen_size * sizeof(CORD));
+ }
+# if !defined(MACINTOSH)
+ /* A gross workaround for an apparent curses bug: */
+ if (i == LINES-1 && len == COLS) {
+ s = CORD_substr(s, 0, CORD_len(s) - 1);
+ }
+# endif
+ if (CORD_cmp(screen[i], s) != 0) {
+ move(i, 0); clrtoeol(); move(i,0);
+
+ CORD_FOR (p, s) {
+ c = CORD_pos_fetch(p) & 0x7f;
+ if (iscntrl(c)) {
+ standout(); addch(c + 0x40); standend();
+ } else {
+ addch(c);
+ }
+ }
+ screen[i] = s;
+ }
+}
+#else
+# define replace_line(i,s) invalidate_line(i)
+#endif
+
+/* Return up to COLS characters of the line of s starting at pos, */
+/* returning only characters after the given column. */
+CORD retrieve_line(CORD s, size_t pos, unsigned column)
+{
+ CORD candidate = CORD_substr(s, pos, column + COLS);
+ /* avoids scanning very long lines */
+ int eol = CORD_chr(candidate, 0, '\n');
+ int len;
+
+ if (eol == CORD_NOT_FOUND) eol = CORD_len(candidate);
+ len = (int)eol - (int)column;
+ if (len < 0) len = 0;
+ return(CORD_substr(s, pos + column, len));
+}
+
+# ifdef WIN32
+# define refresh();
+
+ CORD retrieve_screen_line(int i)
+ {
+ register size_t pos;
+
+ invalidate_map(dis_line + LINES); /* Prune search */
+ pos = line_pos(dis_line + i, 0);
+ if (pos == CORD_NOT_FOUND) return(CORD_EMPTY);
+ return(retrieve_line(current, pos, dis_col));
+ }
+# endif
+
+/* Display the visible section of the current file */
+void redisplay(void)
+{
+ register int i;
+
+ invalidate_map(dis_line + LINES); /* Prune search */
+ for (i = 0; i < LINES; i++) {
+ if (need_redisplay == ALL || need_redisplay == i) {
+ register size_t pos = line_pos(dis_line + i, 0);
+
+ if (pos == CORD_NOT_FOUND) break;
+ replace_line(i, retrieve_line(current, pos, dis_col));
+ if (need_redisplay == i) goto done;
+ }
+ }
+ for (; i < LINES; i++) replace_line(i, CORD_EMPTY);
+done:
+ refresh();
+ need_redisplay = NONE;
+}
+
+int dis_granularity;
+
+/* Update dis_line, dis_col, and dis_pos to make cursor visible. */
+/* Assumes line, col, dis_line, dis_pos are in bounds. */
+void normalize_display()
+{
+ int old_line = dis_line;
+ int old_col = dis_col;
+
+ dis_granularity = 1;
+ if (LINES > 15 && COLS > 15) dis_granularity = 2;
+ while (dis_line > line) dis_line -= dis_granularity;
+ while (dis_col > col) dis_col -= dis_granularity;
+ while (line >= dis_line + LINES) dis_line += dis_granularity;
+ while (col >= dis_col + COLS) dis_col += dis_granularity;
+ if (old_line != dis_line || old_col != dis_col) {
+ need_redisplay = ALL;
+ }
+}
+
+# if defined(WIN32)
+# elif defined(MACINTOSH)
+# define move_cursor(x,y) cgotoxy(x + 1, y + 1, stdout)
+# else
+# define move_cursor(x,y) move(y,x)
+# endif
+
+/* Adjust display so that cursor is visible; move cursor into position */
+/* Update screen if necessary. */
+void fix_cursor(void)
+{
+ normalize_display();
+ if (need_redisplay != NONE) redisplay();
+ move_cursor(col - dis_col, line - dis_line);
+ refresh();
+# ifndef WIN32
+ fflush(stdout);
+# endif
+}
+
+/* Make sure line, col, and dis_pos are somewhere inside file. */
+/* Recompute file_pos. Assumes dis_pos is accurate or past eof */
+void fix_pos()
+{
+ int my_col = col;
+
+ if ((size_t)line > current_len) line = current_len;
+ file_pos = line_pos(line, &my_col);
+ if (file_pos == CORD_NOT_FOUND) {
+ for (line = current_map -> line, file_pos = current_map -> pos;
+ file_pos < current_len;
+ line++, file_pos = CORD_chr(current, file_pos, '\n') + 1);
+ line--;
+ file_pos = line_pos(line, &col);
+ } else {
+ col = my_col;
+ }
+}
+
+#if defined(WIN32)
+# define beep() Beep(1000 /* Hz */, 300 /* msecs */)
+#elif defined(MACINTOSH)
+# define beep() SysBeep(1)
+#else
+/*
+ * beep() is part of some curses packages and not others.
+ * We try to match the type of the builtin one, if any.
+ */
+#ifdef __STDC__
+ int beep(void)
+#else
+ int beep()
+#endif
+{
+ putc('\007', stderr);
+ return(0);
+}
+#endif
+
+# define NO_PREFIX -1
+# define BARE_PREFIX -2
+int repeat_count = NO_PREFIX; /* Current command prefix. */
+
+int locate_mode = 0; /* Currently between 2 ^Ls */
+CORD locate_string = CORD_EMPTY; /* Current search string. */
+
+char * arg_file_name;
+
+#ifdef WIN32
+/* Change the current position to whatever is currently displayed at */
+/* the given SCREEN coordinates. */
+void set_position(int c, int l)
+{
+ line = l + dis_line;
+ col = c + dis_col;
+ fix_pos();
+ move_cursor(col - dis_col, line - dis_line);
+}
+#endif /* WIN32 */
+
+/* Perform the command associated with character c. C may be an */
+/* integer > 256 denoting a windows command, one of the above control */
+/* characters, or another ASCII character to be used as either a */
+/* character to be inserted, a repeat count, or a search string, */
+/* depending on the current state. */
+void do_command(int c)
+{
+ int i;
+ int need_fix_pos;
+ FILE * out;
+
+ if ( c == '\r') c = '\n';
+ if (locate_mode) {
+ size_t new_pos;
+
+ if (c == LOCATE) {
+ locate_mode = 0;
+ locate_string = CORD_EMPTY;
+ return;
+ }
+ locate_string = CORD_cat_char(locate_string, (char)c);
+ new_pos = CORD_str(current, file_pos - CORD_len(locate_string) + 1,
+ locate_string);
+ if (new_pos != CORD_NOT_FOUND) {
+ need_redisplay = ALL;
+ new_pos += CORD_len(locate_string);
+ for (;;) {
+ file_pos = line_pos(line + 1, 0);
+ if (file_pos > new_pos) break;
+ line++;
+ }
+ col = new_pos - line_pos(line, 0);
+ file_pos = new_pos;
+ fix_cursor();
+ } else {
+ locate_string = CORD_substr(locate_string, 0,
+ CORD_len(locate_string) - 1);
+ beep();
+ }
+ return;
+ }
+ if (c == REPEAT) {
+ repeat_count = BARE_PREFIX; return;
+ } else if (c < 0x100 && isdigit(c)){
+ if (repeat_count == BARE_PREFIX) {
+ repeat_count = c - '0'; return;
+ } else if (repeat_count != NO_PREFIX) {
+ repeat_count = 10 * repeat_count + c - '0'; return;
+ }
+ }
+ if (repeat_count == NO_PREFIX) repeat_count = 1;
+ if (repeat_count == BARE_PREFIX && (c == UP || c == DOWN)) {
+ repeat_count = LINES - dis_granularity;
+ }
+ if (repeat_count == BARE_PREFIX) repeat_count = 8;
+ need_fix_pos = 0;
+ for (i = 0; i < repeat_count; i++) {
+ switch(c) {
+ case LOCATE:
+ locate_mode = 1;
+ break;
+ case TOP:
+ line = col = file_pos = 0;
+ break;
+ case UP:
+ if (line != 0) {
+ line--;
+ need_fix_pos = 1;
+ }
+ break;
+ case DOWN:
+ line++;
+ need_fix_pos = 1;
+ break;
+ case LEFT:
+ if (col != 0) {
+ col--; file_pos--;
+ }
+ break;
+ case RIGHT:
+ if (CORD_fetch(current, file_pos) == '\n') break;
+ col++; file_pos++;
+ break;
+ case UNDO:
+ del_hist();
+ need_redisplay = ALL; need_fix_pos = 1;
+ break;
+ case BS:
+ if (col == 0) {
+ beep();
+ break;
+ }
+ col--; file_pos--;
+ /* fall through: */
+ case DEL:
+ if (file_pos == current_len-1) break;
+ /* Can't delete trailing newline */
+ if (CORD_fetch(current, file_pos) == '\n') {
+ need_redisplay = ALL; need_fix_pos = 1;
+ } else {
+ need_redisplay = line - dis_line;
+ }
+ add_hist(CORD_cat(
+ CORD_substr(current, 0, file_pos),
+ CORD_substr(current, file_pos+1, current_len)));
+ invalidate_map(line);
+ break;
+ case WRITE:
+ {
+ CORD name = CORD_cat(CORD_from_char_star(arg_file_name),
+ ".new");
+
+ if ((out = fopen(CORD_to_const_char_star(name), "wb")) == NULL
+ || CORD_put(current, out) == EOF) {
+ de_error("Write failed\n");
+ need_redisplay = ALL;
+ } else {
+ fclose(out);
+ }
+ }
+ break;
+ default:
+ {
+ CORD left_part = CORD_substr(current, 0, file_pos);
+ CORD right_part = CORD_substr(current, file_pos, current_len);
+
+ add_hist(CORD_cat(CORD_cat_char(left_part, (char)c),
+ right_part));
+ invalidate_map(line);
+ if (c == '\n') {
+ col = 0; line++; file_pos++;
+ need_redisplay = ALL;
+ } else {
+ col++; file_pos++;
+ need_redisplay = line - dis_line;
+ }
+ break;
+ }
+ }
+ }
+ if (need_fix_pos) fix_pos();
+ fix_cursor();
+ repeat_count = NO_PREFIX;
+}
+
+/* OS independent initialization */
+
+void generic_init(void)
+{
+ FILE * f;
+ CORD initial;
+
+ if ((f = fopen(arg_file_name, "rb")) == NULL) {
+ initial = "\n";
+ } else {
+ initial = CORD_from_file(f);
+ if (initial == CORD_EMPTY
+ || CORD_fetch(initial, CORD_len(initial)-1) != '\n') {
+ initial = CORD_cat(initial, "\n");
+ }
+ }
+ add_map(0,0);
+ add_hist(initial);
+ now -> map = current_map;
+ now -> previous = now; /* Can't back up further: beginning of the world */
+ need_redisplay = ALL;
+ fix_cursor();
+}
+
+#ifndef WIN32
+
+main(argc, argv)
+int argc;
+char ** argv;
+{
+ int c;
+ CORD initial;
+
+#if defined(MACINTOSH)
+ console_options.title = "\pDumb Editor";
+ cshow(stdout);
+ GC_init();
+ argc = ccommand(&argv);
+#endif
+
+ if (argc != 2) goto usage;
+ arg_file_name = argv[1];
+ setvbuf(stdout, GC_MALLOC_ATOMIC(8192), _IOFBF, 8192);
+ initscr();
+ noecho(); nonl(); cbreak();
+ generic_init();
+ while ((c = getchar()) != QUIT) {
+ if (c == EOF) break;
+ do_command(c);
+ }
+done:
+ move(LINES-1, 0);
+ clrtoeol();
+ refresh();
+ nl();
+ echo();
+ endwin();
+ exit(0);
+usage:
+ fprintf(stderr, "Usage: %s file\n", argv[0]);
+ fprintf(stderr, "Cursor keys: ^B(left) ^F(right) ^P(up) ^N(down)\n");
+ fprintf(stderr, "Undo: ^U Write to <file>.new: ^W");
+ fprintf(stderr, "Quit:^D Repeat count: ^R[n]\n");
+ fprintf(stderr, "Top: ^T Locate (search, find): ^L text ^L\n");
+ exit(1);
+}
+
+#endif /* !WIN32 */
diff --git a/boehm-gc/cord/de_cmds.h b/boehm-gc/cord/de_cmds.h
new file mode 100644
index 00000000000..f42ddcf2da7
--- /dev/null
+++ b/boehm-gc/cord/de_cmds.h
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 1994 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+/* Boehm, May 19, 1994 2:24 pm PDT */
+
+#ifndef DE_CMDS_H
+
+# define DE_CMDS_H
+
+# define UP 16 /* ^P */
+# define DOWN 14 /* ^N */
+# define LEFT 2 /* ^B */
+# define RIGHT 6 /* ^F */
+# define DEL 127 /* ^? */
+# define BS 8 /* ^H */
+# define UNDO 21 /* ^U */
+# define WRITE 23 /* ^W */
+# define QUIT 4 /* ^D */
+# define REPEAT 18 /* ^R */
+# define LOCATE 12 /* ^L */
+# define TOP 20 /* ^T */
+
+#endif
+
diff --git a/boehm-gc/cord/de_win.ICO b/boehm-gc/cord/de_win.ICO
new file mode 100644
index 00000000000..b20ac3ee16a
--- /dev/null
+++ b/boehm-gc/cord/de_win.ICO
Binary files differ
diff --git a/boehm-gc/cord/de_win.RC b/boehm-gc/cord/de_win.RC
new file mode 100644
index 00000000000..554a3004389
--- /dev/null
+++ b/boehm-gc/cord/de_win.RC
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to copy this garbage collector for any purpose,
+ * provided the above notices are retained on all copies.
+ */
+/* Boehm, May 13, 1994 9:50 am PDT */
+
+#include "windows.h"
+#include "de_cmds.h"
+#include "de_win.h"
+
+
+
+ABOUTBOX DIALOG 19, 21, 163, 47
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "About Demonstration Text Editor"
+BEGIN
+ ICON "DE", -1, 8, 8, 13, 13, WS_CHILD | WS_VISIBLE
+ LTEXT "Demonstration Text Editor", -1, 44, 8, 118, 8, WS_CHILD | WS_VISIBLE | WS_GROUP
+ LTEXT "Version 4.1", -1, 44, 16, 60, 8, WS_CHILD | WS_VISIBLE | WS_GROUP
+ PUSHBUTTON "OK", IDOK, 118, 27, 24, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
+END
+
+
+DE MENU
+BEGIN
+ POPUP "&File"
+ BEGIN
+ MENUITEM "&Save\t^W", IDM_FILESAVE
+ MENUITEM "E&xit\t^D", IDM_FILEEXIT
+ END
+
+ POPUP "&Edit"
+ BEGIN
+ MENUITEM "Page &Down\t^R^N", IDM_EDITPDOWN
+ MENUITEM "Page &Up\t^R^P", IDM_EDITPUP
+ MENUITEM "U&ndo\t^U", IDM_EDITUNDO
+ MENUITEM "&Locate\t^L ... ^L", IDM_EDITLOCATE
+ MENUITEM "D&own\t^N", IDM_EDITDOWN
+ MENUITEM "U&p\t^P", IDM_EDITUP
+ MENUITEM "Le&ft\t^B", IDM_EDITLEFT
+ MENUITEM "&Right\t^F", IDM_EDITRIGHT
+ MENUITEM "Delete &Backward\tBS", IDM_EDITBS
+ MENUITEM "Delete F&orward\tDEL", IDM_EDITDEL
+ MENUITEM "&Top\t^T", IDM_EDITTOP
+ END
+
+ POPUP "&Help"
+ BEGIN
+ MENUITEM "&Contents", IDM_HELPCONTENTS
+ MENUITEM "&About...", IDM_HELPABOUT
+ END
+
+ MENUITEM "Page_&Down", IDM_EDITPDOWN
+ MENUITEM "Page_&Up", IDM_EDITPUP
+END
+
+
+DE ACCELERATORS
+BEGIN
+ "^R", IDM_EDITREPEAT
+ "^N", IDM_EDITDOWN
+ "^P", IDM_EDITUP
+ "^L", IDM_EDITLOCATE
+ "^B", IDM_EDITLEFT
+ "^F", IDM_EDITRIGHT
+ "^T", IDM_EDITTOP
+ VK_DELETE, IDM_EDITDEL, VIRTKEY
+ VK_BACK, IDM_EDITBS, VIRTKEY
+END
+
+
+DE ICON cord\de_win.ICO
+
diff --git a/boehm-gc/cord/de_win.c b/boehm-gc/cord/de_win.c
new file mode 100644
index 00000000000..119d0fa044c
--- /dev/null
+++ b/boehm-gc/cord/de_win.c
@@ -0,0 +1,365 @@
+/*
+ * Copyright (c) 1994 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+/* Boehm, February 6, 1995 12:29 pm PST */
+
+/*
+ * The MS Windows specific part of de.
+ * This started as the generic Windows application template
+ * made available by Rob Haack (rhaack@polaris.unm.edu), but
+ * significant parts didn't survive to the final version.
+ *
+ * This was written by a nonexpert windows programmer.
+ */
+
+
+#include "windows.h"
+#include "gc.h"
+#include "cord.h"
+#include "de_cmds.h"
+#include "de_win.h"
+
+int LINES = 0;
+int COLS = 0;
+
+char szAppName[] = "DE";
+char FullAppName[] = "Demonstration Editor";
+
+HWND hwnd;
+
+void de_error(char *s)
+{
+ MessageBox( hwnd, (LPSTR) s,
+ (LPSTR) FullAppName,
+ MB_ICONINFORMATION | MB_OK );
+ InvalidateRect(hwnd, NULL, TRUE);
+}
+
+int APIENTRY WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
+ LPSTR command_line, int nCmdShow)
+{
+ MSG msg;
+ WNDCLASS wndclass;
+ HANDLE hAccel;
+
+ if (!hPrevInstance)
+ {
+ wndclass.style = CS_HREDRAW | CS_VREDRAW;
+ wndclass.lpfnWndProc = WndProc;
+ wndclass.cbClsExtra = 0;
+ wndclass.cbWndExtra = DLGWINDOWEXTRA;
+ wndclass.hInstance = hInstance;
+ wndclass.hIcon = LoadIcon (hInstance, szAppName);
+ wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);
+ wndclass.hbrBackground = GetStockObject(WHITE_BRUSH);
+ wndclass.lpszMenuName = "DE";
+ wndclass.lpszClassName = szAppName;
+
+ if (RegisterClass (&wndclass) == 0) {
+ char buf[50];
+
+ sprintf(buf, "RegisterClass: error code: 0x%X", GetLastError());
+ de_error(buf);
+ return(0);
+ }
+ }
+
+ /* Empirically, the command line does not include the command name ...
+ if (command_line != 0) {
+ while (isspace(*command_line)) command_line++;
+ while (*command_line != 0 && !isspace(*command_line)) command_line++;
+ while (isspace(*command_line)) command_line++;
+ } */
+
+ if (command_line == 0 || *command_line == 0) {
+ de_error("File name argument required");
+ return( 0 );
+ } else {
+ char *p = command_line;
+
+ while (*p != 0 && !isspace(*p)) p++;
+ arg_file_name = CORD_to_char_star(
+ CORD_substr(command_line, 0, p - command_line));
+ }
+
+ hwnd = CreateWindow (szAppName,
+ FullAppName,
+ WS_OVERLAPPEDWINDOW | WS_CAPTION, /* Window style */
+ CW_USEDEFAULT, 0, /* default pos. */
+ CW_USEDEFAULT, 0, /* default width, height */
+ NULL, /* No parent */
+ NULL, /* Window class menu */
+ hInstance, NULL);
+ if (hwnd == NULL) {
+ char buf[50];
+
+ sprintf(buf, "CreateWindow: error code: 0x%X", GetLastError());
+ de_error(buf);
+ return(0);
+ }
+
+ ShowWindow (hwnd, nCmdShow);
+
+ hAccel = LoadAccelerators( hInstance, szAppName );
+
+ while (GetMessage (&msg, NULL, 0, 0))
+ {
+ if( !TranslateAccelerator( hwnd, hAccel, &msg ) )
+ {
+ TranslateMessage (&msg);
+ DispatchMessage (&msg);
+ }
+ }
+ return msg.wParam;
+}
+
+/* Return the argument with all control characters replaced by blanks. */
+char * plain_chars(char * text, size_t len)
+{
+ char * result = GC_MALLOC_ATOMIC(len + 1);
+ register size_t i;
+
+ for (i = 0; i < len; i++) {
+ if (iscntrl(text[i])) {
+ result[i] = ' ';
+ } else {
+ result[i] = text[i];
+ }
+ }
+ result[len] = '\0';
+ return(result);
+}
+
+/* Return the argument with all non-control-characters replaced by */
+/* blank, and all control characters c replaced by c + 32. */
+char * control_chars(char * text, size_t len)
+{
+ char * result = GC_MALLOC_ATOMIC(len + 1);
+ register size_t i;
+
+ for (i = 0; i < len; i++) {
+ if (iscntrl(text[i])) {
+ result[i] = text[i] + 0x40;
+ } else {
+ result[i] = ' ';
+ }
+ }
+ result[len] = '\0';
+ return(result);
+}
+
+int char_width;
+int char_height;
+
+void get_line_rect(int line, int win_width, RECT * rectp)
+{
+ rectp -> top = line * char_height;
+ rectp -> bottom = rectp->top + char_height;
+ rectp -> left = 0;
+ rectp -> right = win_width;
+}
+
+int caret_visible = 0; /* Caret is currently visible. */
+
+int screen_was_painted = 0;/* Screen has been painted at least once. */
+
+void update_cursor(void);
+
+LRESULT CALLBACK WndProc (HWND hwnd, UINT message,
+ WPARAM wParam, LPARAM lParam)
+{
+ static FARPROC lpfnAboutBox;
+ static HANDLE hInstance;
+ HDC dc;
+ PAINTSTRUCT ps;
+ RECT client_area;
+ RECT this_line;
+ RECT dummy;
+ TEXTMETRIC tm;
+ register int i;
+ int id;
+
+ switch (message)
+ {
+ case WM_CREATE:
+ hInstance = ( (LPCREATESTRUCT) lParam)->hInstance;
+ lpfnAboutBox = MakeProcInstance( (FARPROC) AboutBox, hInstance );
+ dc = GetDC(hwnd);
+ SelectObject(dc, GetStockObject(SYSTEM_FIXED_FONT));
+ GetTextMetrics(dc, &tm);
+ ReleaseDC(hwnd, dc);
+ char_width = tm.tmAveCharWidth;
+ char_height = tm.tmHeight + tm.tmExternalLeading;
+ GetClientRect(hwnd, &client_area);
+ COLS = (client_area.right - client_area.left)/char_width;
+ LINES = (client_area.bottom - client_area.top)/char_height;
+ generic_init();
+ return(0);
+
+ case WM_CHAR:
+ if (wParam == QUIT) {
+ SendMessage( hwnd, WM_CLOSE, 0, 0L );
+ } else {
+ do_command(wParam);
+ }
+ return(0);
+
+ case WM_SETFOCUS:
+ CreateCaret(hwnd, NULL, char_width, char_height);
+ ShowCaret(hwnd);
+ caret_visible = 1;
+ update_cursor();
+ return(0);
+
+ case WM_KILLFOCUS:
+ HideCaret(hwnd);
+ DestroyCaret();
+ caret_visible = 0;
+ return(0);
+
+ case WM_LBUTTONUP:
+ {
+ unsigned xpos = LOWORD(lParam); /* From left */
+ unsigned ypos = HIWORD(lParam); /* from top */
+
+ set_position( xpos/char_width, ypos/char_height );
+ return(0);
+ }
+
+ case WM_COMMAND:
+ id = LOWORD(wParam);
+ if (id & EDIT_CMD_FLAG) {
+ if (id & REPEAT_FLAG) do_command(REPEAT);
+ do_command(CHAR_CMD(id));
+ return( 0 );
+ } else {
+ switch(id) {
+ case IDM_FILEEXIT:
+ SendMessage( hwnd, WM_CLOSE, 0, 0L );
+ return( 0 );
+
+ case IDM_HELPABOUT:
+ if( DialogBox( hInstance, "ABOUTBOX",
+ hwnd, lpfnAboutBox ) );
+ InvalidateRect( hwnd, NULL, TRUE );
+ return( 0 );
+ case IDM_HELPCONTENTS:
+ de_error(
+ "Cursor keys: ^B(left) ^F(right) ^P(up) ^N(down)\n"
+ "Undo: ^U Write: ^W Quit:^D Repeat count: ^R[n]\n"
+ "Top: ^T Locate (search, find): ^L text ^L\n");
+ return( 0 );
+ }
+ }
+ break;
+
+ case WM_CLOSE:
+ DestroyWindow( hwnd );
+ return 0;
+
+ case WM_DESTROY:
+ PostQuitMessage (0);
+ return 0;
+
+ case WM_PAINT:
+ dc = BeginPaint(hwnd, &ps);
+ GetClientRect(hwnd, &client_area);
+ COLS = (client_area.right - client_area.left)/char_width;
+ LINES = (client_area.bottom - client_area.top)/char_height;
+ SelectObject(dc, GetStockObject(SYSTEM_FIXED_FONT));
+ for (i = 0; i < LINES; i++) {
+ get_line_rect(i, client_area.right, &this_line);
+ if (IntersectRect(&dummy, &this_line, &ps.rcPaint)) {
+ CORD raw_line = retrieve_screen_line(i);
+ size_t len = CORD_len(raw_line);
+ char * text = CORD_to_char_star(raw_line);
+ /* May contain embedded NULLs */
+ char * plain = plain_chars(text, len);
+ char * blanks = CORD_to_char_star(CORD_chars(' ',
+ COLS - len));
+ char * control = control_chars(text, len);
+# define RED RGB(255,0,0)
+
+ SetBkMode(dc, OPAQUE);
+ SetTextColor(dc, GetSysColor(COLOR_WINDOWTEXT));
+
+ TextOut(dc, this_line.left, this_line.top,
+ plain, len);
+ TextOut(dc, this_line.left + len * char_width, this_line.top,
+ blanks, COLS - len);
+ SetBkMode(dc, TRANSPARENT);
+ SetTextColor(dc, RED);
+ TextOut(dc, this_line.left, this_line.top,
+ control, strlen(control));
+ }
+ }
+ EndPaint(hwnd, &ps);
+ screen_was_painted = 1;
+ return 0;
+ }
+ return DefWindowProc (hwnd, message, wParam, lParam);
+}
+
+int last_col;
+int last_line;
+
+void move_cursor(int c, int l)
+{
+ last_col = c;
+ last_line = l;
+
+ if (caret_visible) update_cursor();
+}
+
+void update_cursor(void)
+{
+ SetCaretPos(last_col * char_width, last_line * char_height);
+ ShowCaret(hwnd);
+}
+
+void invalidate_line(int i)
+{
+ RECT line;
+
+ if (!screen_was_painted) return;
+ /* Invalidating a rectangle before painting seems result in a */
+ /* major performance problem. */
+ get_line_rect(i, COLS*char_width, &line);
+ InvalidateRect(hwnd, &line, FALSE);
+}
+
+LRESULT CALLBACK AboutBox( HWND hDlg, UINT message,
+ WPARAM wParam, LPARAM lParam )
+{
+ switch( message )
+ {
+ case WM_INITDIALOG:
+ SetFocus( GetDlgItem( hDlg, IDOK ) );
+ break;
+
+ case WM_COMMAND:
+ switch( wParam )
+ {
+ case IDOK:
+ EndDialog( hDlg, TRUE );
+ break;
+ }
+ break;
+
+ case WM_CLOSE:
+ EndDialog( hDlg, TRUE );
+ return TRUE;
+
+ }
+ return FALSE;
+}
+
diff --git a/boehm-gc/cord/de_win.h b/boehm-gc/cord/de_win.h
new file mode 100644
index 00000000000..57a47b45c41
--- /dev/null
+++ b/boehm-gc/cord/de_win.h
@@ -0,0 +1,103 @@
+/*
+ * Copyright (c) 1994 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+/* Boehm, May 19, 1994 2:25 pm PDT */
+
+/* cord.h, de_cmds.h, and windows.h should be included before this. */
+
+
+# define OTHER_FLAG 0x100
+# define EDIT_CMD_FLAG 0x200
+# define REPEAT_FLAG 0x400
+
+# define CHAR_CMD(i) ((i) & 0xff)
+
+/* MENU: DE */
+#define IDM_FILESAVE (EDIT_CMD_FLAG + WRITE)
+#define IDM_FILEEXIT (OTHER_FLAG + 1)
+#define IDM_HELPABOUT (OTHER_FLAG + 2)
+#define IDM_HELPCONTENTS (OTHER_FLAG + 3)
+
+#define IDM_EDITPDOWN (REPEAT_FLAG + EDIT_CMD_FLAG + DOWN)
+#define IDM_EDITPUP (REPEAT_FLAG + EDIT_CMD_FLAG + UP)
+#define IDM_EDITUNDO (EDIT_CMD_FLAG + UNDO)
+#define IDM_EDITLOCATE (EDIT_CMD_FLAG + LOCATE)
+#define IDM_EDITDOWN (EDIT_CMD_FLAG + DOWN)
+#define IDM_EDITUP (EDIT_CMD_FLAG + UP)
+#define IDM_EDITLEFT (EDIT_CMD_FLAG + LEFT)
+#define IDM_EDITRIGHT (EDIT_CMD_FLAG + RIGHT)
+#define IDM_EDITBS (EDIT_CMD_FLAG + BS)
+#define IDM_EDITDEL (EDIT_CMD_FLAG + DEL)
+#define IDM_EDITREPEAT (EDIT_CMD_FLAG + REPEAT)
+#define IDM_EDITTOP (EDIT_CMD_FLAG + TOP)
+
+
+
+
+/* Windows UI stuff */
+
+LRESULT CALLBACK WndProc (HWND hwnd, UINT message,
+ UINT wParam, LONG lParam);
+
+LRESULT CALLBACK AboutBox( HWND hDlg, UINT message,
+ UINT wParam, LONG lParam );
+
+
+/* Screen dimensions. Maintained by de_win.c. */
+extern int LINES;
+extern int COLS;
+
+/* File being edited. */
+extern char * arg_file_name;
+
+/* Current display position in file. Maintained by de.c */
+extern int dis_line;
+extern int dis_col;
+
+/* Current cursor position in file. */
+extern int line;
+extern int col;
+
+/*
+ * Calls from de_win.c to de.c
+ */
+
+CORD retrieve_screen_line(int i);
+ /* Get the contents of i'th screen line. */
+ /* Relies on COLS. */
+
+void set_position(int x, int y);
+ /* Set column, row. Upper left of window = (0,0). */
+
+void do_command(int);
+ /* Execute an editor command. */
+ /* Agument is a command character or one */
+ /* of the IDM_ commands. */
+
+void generic_init(void);
+ /* OS independent initialization */
+
+
+/*
+ * Calls from de.c to de_win.c
+ */
+
+void move_cursor(int column, int line);
+ /* Physically move the cursor on the display, */
+ /* so that it appears at */
+ /* (column, line). */
+
+void invalidate_line(int line);
+ /* Invalidate line i on the screen. */
+
+void de_error(char *s);
+ /* Display error message. */ \ No newline at end of file
diff --git a/boehm-gc/cord/ec.h b/boehm-gc/cord/ec.h
new file mode 100644
index 00000000000..c829b83ad11
--- /dev/null
+++ b/boehm-gc/cord/ec.h
@@ -0,0 +1,70 @@
+# ifndef EC_H
+# define EC_H
+
+# ifndef CORD_H
+# include "cord.h"
+# endif
+
+/* Extensible cords are strings that may be destructively appended to. */
+/* They allow fast construction of cords from characters that are */
+/* being read from a stream. */
+/*
+ * A client might look like:
+ *
+ * {
+ * CORD_ec x;
+ * CORD result;
+ * char c;
+ * FILE *f;
+ *
+ * ...
+ * CORD_ec_init(x);
+ * while(...) {
+ * c = getc(f);
+ * ...
+ * CORD_ec_append(x, c);
+ * }
+ * result = CORD_balance(CORD_ec_to_cord(x));
+ *
+ * If a C string is desired as the final result, the call to CORD_balance
+ * may be replaced by a call to CORD_to_char_star.
+ */
+
+# ifndef CORD_BUFSZ
+# define CORD_BUFSZ 128
+# endif
+
+typedef struct CORD_ec_struct {
+ CORD ec_cord;
+ char * ec_bufptr;
+ char ec_buf[CORD_BUFSZ+1];
+} CORD_ec[1];
+
+/* This structure represents the concatenation of ec_cord with */
+/* ec_buf[0 ... (ec_bufptr-ec_buf-1)] */
+
+/* Flush the buffer part of the extended chord into ec_cord. */
+/* Note that this is almost the only real function, and it is */
+/* implemented in 6 lines in cordxtra.c */
+void CORD_ec_flush_buf(CORD_ec x);
+
+/* Convert an extensible cord to a cord. */
+# define CORD_ec_to_cord(x) (CORD_ec_flush_buf(x), (x)[0].ec_cord)
+
+/* Initialize an extensible cord. */
+# define CORD_ec_init(x) ((x)[0].ec_cord = 0, (x)[0].ec_bufptr = (x)[0].ec_buf)
+
+/* Append a character to an extensible cord. */
+# define CORD_ec_append(x, c) \
+ { \
+ if ((x)[0].ec_bufptr == (x)[0].ec_buf + CORD_BUFSZ) { \
+ CORD_ec_flush_buf(x); \
+ } \
+ *((x)[0].ec_bufptr)++ = (c); \
+ }
+
+/* Append a cord to an extensible cord. Structure remains shared with */
+/* original. */
+void CORD_ec_append_cord(CORD_ec x, CORD s);
+
+# endif /* EC_H */
diff --git a/boehm-gc/cord/gc.h b/boehm-gc/cord/gc.h
new file mode 100644
index 00000000000..09c8ca8196c
--- /dev/null
+++ b/boehm-gc/cord/gc.h
@@ -0,0 +1,698 @@
+/*
+ * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+ * Copyright (c) 1991-1995 by Xerox Corporation. All rights reserved.
+ * Copyright 1996 by Silicon Graphics. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+/*
+ * Note that this defines a large number of tuning hooks, which can
+ * safely be ignored in nearly all cases. For normal use it suffices
+ * to call only GC_MALLOC and perhaps GC_REALLOC.
+ * For better performance, also look at GC_MALLOC_ATOMIC, and
+ * GC_enable_incremental. If you need an action to be performed
+ * immediately before an object is collected, look at GC_register_finalizer.
+ * If you are using Solaris threads, look at the end of this file.
+ * Everything else is best ignored unless you encounter performance
+ * problems.
+ */
+
+#ifndef _GC_H
+
+# define _GC_H
+# define __GC
+# include <stddef.h>
+
+#if defined(__CYGWIN32__) && defined(GC_USE_DLL)
+#include "libgc_globals.h"
+#endif
+
+#if defined(_MSC_VER) && defined(_DLL)
+#ifdef GC_BUILD
+#define GC_API __declspec(dllexport)
+#else
+#define GC_API __declspec(dllimport)
+#endif
+#endif
+
+#ifndef GC_API
+#define GC_API extern
+#endif
+
+# if defined(__STDC__) || defined(__cplusplus)
+# define GC_PROTO(args) args
+ typedef void * GC_PTR;
+# else
+# define GC_PROTO(args) ()
+ typedef char * GC_PTR;
+# endif
+
+# ifdef __cplusplus
+ extern "C" {
+# endif
+
+
+/* Define word and signed_word to be unsigned and signed types of the */
+/* size as char * or void *. There seems to be no way to do this */
+/* even semi-portably. The following is probably no better/worse */
+/* than almost anything else. */
+/* The ANSI standard suggests that size_t and ptr_diff_t might be */
+/* better choices. But those appear to have incorrect definitions */
+/* on may systems. Notably "typedef int size_t" seems to be both */
+/* frequent and WRONG. */
+typedef unsigned long GC_word;
+typedef long GC_signed_word;
+
+/* Public read-only variables */
+
+GC_API GC_word GC_gc_no;/* Counter incremented per collection. */
+ /* Includes empty GCs at startup. */
+
+
+/* Public R/W variables */
+
+GC_API GC_PTR (*GC_oom_fn) GC_PROTO((size_t bytes_requested));
+ /* When there is insufficient memory to satisfy */
+ /* an allocation request, we return */
+ /* (*GC_oom_fn)(). By default this just */
+ /* returns 0. */
+ /* If it returns, it must return 0 or a valid */
+ /* pointer to a previously allocated heap */
+ /* object. */
+
+GC_API int GC_quiet; /* Disable statistics output. Only matters if */
+ /* collector has been compiled with statistics */
+ /* enabled. This involves a performance cost, */
+ /* and is thus not the default. */
+
+GC_API int GC_dont_gc; /* Dont collect unless explicitly requested, e.g. */
+ /* because it's not safe. */
+
+GC_API int GC_dont_expand;
+ /* Dont expand heap unless explicitly requested */
+ /* or forced to. */
+
+GC_API int GC_full_freq; /* Number of partial collections between */
+ /* full collections. Matters only if */
+ /* GC_incremental is set. */
+
+GC_API GC_word GC_non_gc_bytes;
+ /* Bytes not considered candidates for collection. */
+ /* Used only to control scheduling of collections. */
+
+GC_API GC_word GC_free_space_divisor;
+ /* We try to make sure that we allocate at */
+ /* least N/GC_free_space_divisor bytes between */
+ /* collections, where N is the heap size plus */
+ /* a rough estimate of the root set size. */
+ /* Initially, GC_free_space_divisor = 4. */
+ /* Increasing its value will use less space */
+ /* but more collection time. Decreasing it */
+ /* will appreciably decrease collection time */
+ /* at the expense of space. */
+ /* GC_free_space_divisor = 1 will effectively */
+ /* disable collections. */
+
+GC_API GC_word GC_max_retries;
+ /* The maximum number of GCs attempted before */
+ /* reporting out of memory after heap */
+ /* expansion fails. Initially 0. */
+
+
+/* Public procedures */
+/*
+ * general purpose allocation routines, with roughly malloc calling conv.
+ * The atomic versions promise that no relevant pointers are contained
+ * in the object. The nonatomic versions guarantee that the new object
+ * is cleared. GC_malloc_stubborn promises that no changes to the object
+ * will occur after GC_end_stubborn_change has been called on the
+ * result of GC_malloc_stubborn. GC_malloc_uncollectable allocates an object
+ * that is scanned for pointers to collectable objects, but is not itself
+ * collectable. GC_malloc_uncollectable and GC_free called on the resulting
+ * object implicitly update GC_non_gc_bytes appropriately.
+ */
+GC_API GC_PTR GC_malloc GC_PROTO((size_t size_in_bytes));
+GC_API GC_PTR GC_malloc_atomic GC_PROTO((size_t size_in_bytes));
+GC_API GC_PTR GC_malloc_uncollectable GC_PROTO((size_t size_in_bytes));
+GC_API GC_PTR GC_malloc_stubborn GC_PROTO((size_t size_in_bytes));
+
+/* The following is only defined if the library has been suitably */
+/* compiled: */
+GC_API GC_PTR GC_malloc_atomic_uncollectable GC_PROTO((size_t size_in_bytes));
+
+/* Explicitly deallocate an object. Dangerous if used incorrectly. */
+/* Requires a pointer to the base of an object. */
+/* If the argument is stubborn, it should not be changeable when freed. */
+/* An object should not be enable for finalization when it is */
+/* explicitly deallocated. */
+/* GC_free(0) is a no-op, as required by ANSI C for free. */
+GC_API void GC_free GC_PROTO((GC_PTR object_addr));
+
+/*
+ * Stubborn objects may be changed only if the collector is explicitly informed.
+ * The collector is implicitly informed of coming change when such
+ * an object is first allocated. The following routines inform the
+ * collector that an object will no longer be changed, or that it will
+ * once again be changed. Only nonNIL pointer stores into the object
+ * are considered to be changes. The argument to GC_end_stubborn_change
+ * must be exacly the value returned by GC_malloc_stubborn or passed to
+ * GC_change_stubborn. (In the second case it may be an interior pointer
+ * within 512 bytes of the beginning of the objects.)
+ * There is a performance penalty for allowing more than
+ * one stubborn object to be changed at once, but it is acceptable to
+ * do so. The same applies to dropping stubborn objects that are still
+ * changeable.
+ */
+GC_API void GC_change_stubborn GC_PROTO((GC_PTR));
+GC_API void GC_end_stubborn_change GC_PROTO((GC_PTR));
+
+/* Return a pointer to the base (lowest address) of an object given */
+/* a pointer to a location within the object. */
+/* Return 0 if displaced_pointer doesn't point to within a valid */
+/* object. */
+GC_API GC_PTR GC_base GC_PROTO((GC_PTR displaced_pointer));
+
+/* Given a pointer to the base of an object, return its size in bytes. */
+/* The returned size may be slightly larger than what was originally */
+/* requested. */
+GC_API size_t GC_size GC_PROTO((GC_PTR object_addr));
+
+/* For compatibility with C library. This is occasionally faster than */
+/* a malloc followed by a bcopy. But if you rely on that, either here */
+/* or with the standard C library, your code is broken. In my */
+/* opinion, it shouldn't have been invented, but now we're stuck. -HB */
+/* The resulting object has the same kind as the original. */
+/* If the argument is stubborn, the result will have changes enabled. */
+/* It is an error to have changes enabled for the original object. */
+/* Follows ANSI comventions for NULL old_object. */
+GC_API GC_PTR GC_realloc GC_PROTO((GC_PTR old_object,
+ size_t new_size_in_bytes));
+
+/* Explicitly increase the heap size. */
+/* Returns 0 on failure, 1 on success. */
+GC_API int GC_expand_hp GC_PROTO((size_t number_of_bytes));
+
+/* Limit the heap size to n bytes. Useful when you're debugging, */
+/* especially on systems that don't handle running out of memory well. */
+/* n == 0 ==> unbounded. This is the default. */
+GC_API void GC_set_max_heap_size GC_PROTO((GC_word n));
+
+/* Inform the collector that a certain section of statically allocated */
+/* memory contains no pointers to garbage collected memory. Thus it */
+/* need not be scanned. This is sometimes important if the application */
+/* maps large read/write files into the address space, which could be */
+/* mistaken for dynamic library data segments on some systems. */
+GC_API void GC_exclude_static_roots GC_PROTO((GC_PTR start, GC_PTR finish));
+
+/* Clear the set of root segments. Wizards only. */
+GC_API void GC_clear_roots GC_PROTO((void));
+
+/* Add a root segment. Wizards only. */
+GC_API void GC_add_roots GC_PROTO((char * low_address,
+ char * high_address_plus_1));
+
+/* Add a displacement to the set of those considered valid by the */
+/* collector. GC_register_displacement(n) means that if p was returned */
+/* by GC_malloc, then (char *)p + n will be considered to be a valid */
+/* pointer to n. N must be small and less than the size of p. */
+/* (All pointers to the interior of objects from the stack are */
+/* considered valid in any case. This applies to heap objects and */
+/* static data.) */
+/* Preferably, this should be called before any other GC procedures. */
+/* Calling it later adds to the probability of excess memory */
+/* retention. */
+/* This is a no-op if the collector was compiled with recognition of */
+/* arbitrary interior pointers enabled, which is now the default. */
+GC_API void GC_register_displacement GC_PROTO((GC_word n));
+
+/* The following version should be used if any debugging allocation is */
+/* being done. */
+GC_API void GC_debug_register_displacement GC_PROTO((GC_word n));
+
+/* Explicitly trigger a full, world-stop collection. */
+GC_API void GC_gcollect GC_PROTO((void));
+
+/* Trigger a full world-stopped collection. Abort the collection if */
+/* and when stop_func returns a nonzero value. Stop_func will be */
+/* called frequently, and should be reasonably fast. This works even */
+/* if virtual dirty bits, and hence incremental collection is not */
+/* available for this architecture. Collections can be aborted faster */
+/* than normal pause times for incremental collection. However, */
+/* aborted collections do no useful work; the next collection needs */
+/* to start from the beginning. */
+typedef int (* GC_stop_func) GC_PROTO((void));
+GC_API int GC_try_to_collect GC_PROTO((GC_stop_func stop_func));
+
+/* Return the number of bytes in the heap. Excludes collector private */
+/* data structures. Includes empty blocks and fragmentation loss. */
+/* Includes some pages that were allocated but never written. */
+GC_API size_t GC_get_heap_size GC_PROTO((void));
+
+/* Return the number of bytes allocated since the last collection. */
+GC_API size_t GC_get_bytes_since_gc GC_PROTO((void));
+
+/* Enable incremental/generational collection. */
+/* Not advisable unless dirty bits are */
+/* available or most heap objects are */
+/* pointerfree(atomic) or immutable. */
+/* Don't use in leak finding mode. */
+/* Ignored if GC_dont_gc is true. */
+GC_API void GC_enable_incremental GC_PROTO((void));
+
+/* Perform some garbage collection work, if appropriate. */
+/* Return 0 if there is no more work to be done. */
+/* Typically performs an amount of work corresponding roughly */
+/* to marking from one page. May do more work if further */
+/* progress requires it, e.g. if incremental collection is */
+/* disabled. It is reasonable to call this in a wait loop */
+/* until it returns 0. */
+GC_API int GC_collect_a_little GC_PROTO((void));
+
+/* Allocate an object of size lb bytes. The client guarantees that */
+/* as long as the object is live, it will be referenced by a pointer */
+/* that points to somewhere within the first 256 bytes of the object. */
+/* (This should normally be declared volatile to prevent the compiler */
+/* from invalidating this assertion.) This routine is only useful */
+/* if a large array is being allocated. It reduces the chance of */
+/* accidentally retaining such an array as a result of scanning an */
+/* integer that happens to be an address inside the array. (Actually, */
+/* it reduces the chance of the allocator not finding space for such */
+/* an array, since it will try hard to avoid introducing such a false */
+/* reference.) On a SunOS 4.X or MS Windows system this is recommended */
+/* for arrays likely to be larger than 100K or so. For other systems, */
+/* or if the collector is not configured to recognize all interior */
+/* pointers, the threshold is normally much higher. */
+GC_API GC_PTR GC_malloc_ignore_off_page GC_PROTO((size_t lb));
+GC_API GC_PTR GC_malloc_atomic_ignore_off_page GC_PROTO((size_t lb));
+
+#if defined(__sgi) && !defined(__GNUC__) && _COMPILER_VERSION >= 720
+# define GC_ADD_CALLER
+# define GC_RETURN_ADDR (GC_word)__return_address
+#endif
+
+#ifdef GC_ADD_CALLER
+# define GC_EXTRAS GC_RETURN_ADDR, __FILE__, __LINE__
+# define GC_EXTRA_PARAMS GC_word ra, char * descr_string, int descr_int
+#else
+# define GC_EXTRAS __FILE__, __LINE__
+# define GC_EXTRA_PARAMS char * descr_string, int descr_int
+#endif
+
+/* Debugging (annotated) allocation. GC_gcollect will check */
+/* objects allocated in this way for overwrites, etc. */
+GC_API GC_PTR GC_debug_malloc
+ GC_PROTO((size_t size_in_bytes, GC_EXTRA_PARAMS));
+GC_API GC_PTR GC_debug_malloc_atomic
+ GC_PROTO((size_t size_in_bytes, GC_EXTRA_PARAMS));
+GC_API GC_PTR GC_debug_malloc_uncollectable
+ GC_PROTO((size_t size_in_bytes, GC_EXTRA_PARAMS));
+GC_API GC_PTR GC_debug_malloc_stubborn
+ GC_PROTO((size_t size_in_bytes, GC_EXTRA_PARAMS));
+GC_API void GC_debug_free GC_PROTO((GC_PTR object_addr));
+GC_API GC_PTR GC_debug_realloc
+ GC_PROTO((GC_PTR old_object, size_t new_size_in_bytes,
+ GC_EXTRA_PARAMS));
+
+GC_API void GC_debug_change_stubborn GC_PROTO((GC_PTR));
+GC_API void GC_debug_end_stubborn_change GC_PROTO((GC_PTR));
+# ifdef GC_DEBUG
+# define GC_MALLOC(sz) GC_debug_malloc(sz, GC_EXTRAS)
+# define GC_MALLOC_ATOMIC(sz) GC_debug_malloc_atomic(sz, GC_EXTRAS)
+# define GC_MALLOC_UNCOLLECTABLE(sz) GC_debug_malloc_uncollectable(sz, \
+ GC_EXTRAS)
+# define GC_REALLOC(old, sz) GC_debug_realloc(old, sz, GC_EXTRAS)
+# define GC_FREE(p) GC_debug_free(p)
+# define GC_REGISTER_FINALIZER(p, f, d, of, od) \
+ GC_debug_register_finalizer(p, f, d, of, od)
+# define GC_REGISTER_FINALIZER_IGNORE_SELF(p, f, d, of, od) \
+ GC_debug_register_finalizer_ignore_self(p, f, d, of, od)
+# define GC_MALLOC_STUBBORN(sz) GC_debug_malloc_stubborn(sz, GC_EXTRAS);
+# define GC_CHANGE_STUBBORN(p) GC_debug_change_stubborn(p)
+# define GC_END_STUBBORN_CHANGE(p) GC_debug_end_stubborn_change(p)
+# define GC_GENERAL_REGISTER_DISAPPEARING_LINK(link, obj) \
+ GC_general_register_disappearing_link(link, GC_base(obj))
+# define GC_REGISTER_DISPLACEMENT(n) GC_debug_register_displacement(n)
+# else
+# define GC_MALLOC(sz) GC_malloc(sz)
+# define GC_MALLOC_ATOMIC(sz) GC_malloc_atomic(sz)
+# define GC_MALLOC_UNCOLLECTABLE(sz) GC_malloc_uncollectable(sz)
+# define GC_REALLOC(old, sz) GC_realloc(old, sz)
+# define GC_FREE(p) GC_free(p)
+# define GC_REGISTER_FINALIZER(p, f, d, of, od) \
+ GC_register_finalizer(p, f, d, of, od)
+# define GC_REGISTER_FINALIZER_IGNORE_SELF(p, f, d, of, od) \
+ GC_register_finalizer_ignore_self(p, f, d, of, od)
+# define GC_MALLOC_STUBBORN(sz) GC_malloc_stubborn(sz)
+# define GC_CHANGE_STUBBORN(p) GC_change_stubborn(p)
+# define GC_END_STUBBORN_CHANGE(p) GC_end_stubborn_change(p)
+# define GC_GENERAL_REGISTER_DISAPPEARING_LINK(link, obj) \
+ GC_general_register_disappearing_link(link, obj)
+# define GC_REGISTER_DISPLACEMENT(n) GC_register_displacement(n)
+# endif
+/* The following are included because they are often convenient, and */
+/* reduce the chance for a misspecifed size argument. But calls may */
+/* expand to something syntactically incorrect if t is a complicated */
+/* type expression. */
+# define GC_NEW(t) (t *)GC_MALLOC(sizeof (t))
+# define GC_NEW_ATOMIC(t) (t *)GC_MALLOC_ATOMIC(sizeof (t))
+# define GC_NEW_STUBBORN(t) (t *)GC_MALLOC_STUBBORN(sizeof (t))
+# define GC_NEW_UNCOLLECTABLE(t) (t *)GC_MALLOC_UNCOLLECTABLE(sizeof (t))
+
+/* Finalization. Some of these primitives are grossly unsafe. */
+/* The idea is to make them both cheap, and sufficient to build */
+/* a safer layer, closer to PCedar finalization. */
+/* The interface represents my conclusions from a long discussion */
+/* with Alan Demers, Dan Greene, Carl Hauser, Barry Hayes, */
+/* Christian Jacobi, and Russ Atkinson. It's not perfect, and */
+/* probably nobody else agrees with it. Hans-J. Boehm 3/13/92 */
+typedef void (*GC_finalization_proc)
+ GC_PROTO((GC_PTR obj, GC_PTR client_data));
+
+GC_API void GC_register_finalizer
+ GC_PROTO((GC_PTR obj, GC_finalization_proc fn, GC_PTR cd,
+ GC_finalization_proc *ofn, GC_PTR *ocd));
+GC_API void GC_debug_register_finalizer
+ GC_PROTO((GC_PTR obj, GC_finalization_proc fn, GC_PTR cd,
+ GC_finalization_proc *ofn, GC_PTR *ocd));
+ /* When obj is no longer accessible, invoke */
+ /* (*fn)(obj, cd). If a and b are inaccessible, and */
+ /* a points to b (after disappearing links have been */
+ /* made to disappear), then only a will be */
+ /* finalized. (If this does not create any new */
+ /* pointers to b, then b will be finalized after the */
+ /* next collection.) Any finalizable object that */
+ /* is reachable from itself by following one or more */
+ /* pointers will not be finalized (or collected). */
+ /* Thus cycles involving finalizable objects should */
+ /* be avoided, or broken by disappearing links. */
+ /* All but the last finalizer registered for an object */
+ /* is ignored. */
+ /* Finalization may be removed by passing 0 as fn. */
+ /* Finalizers are implicitly unregistered just before */
+ /* they are invoked. */
+ /* The old finalizer and client data are stored in */
+ /* *ofn and *ocd. */
+ /* Fn is never invoked on an accessible object, */
+ /* provided hidden pointers are converted to real */
+ /* pointers only if the allocation lock is held, and */
+ /* such conversions are not performed by finalization */
+ /* routines. */
+ /* If GC_register_finalizer is aborted as a result of */
+ /* a signal, the object may be left with no */
+ /* finalization, even if neither the old nor new */
+ /* finalizer were NULL. */
+ /* Obj should be the nonNULL starting address of an */
+ /* object allocated by GC_malloc or friends. */
+ /* Note that any garbage collectable object referenced */
+ /* by cd will be considered accessible until the */
+ /* finalizer is invoked. */
+
+/* Another versions of the above follow. It ignores */
+/* self-cycles, i.e. pointers from a finalizable object to */
+/* itself. There is a stylistic argument that this is wrong, */
+/* but it's unavoidable for C++, since the compiler may */
+/* silently introduce these. It's also benign in that specific */
+/* case. */
+GC_API void GC_register_finalizer_ignore_self
+ GC_PROTO((GC_PTR obj, GC_finalization_proc fn, GC_PTR cd,
+ GC_finalization_proc *ofn, GC_PTR *ocd));
+GC_API void GC_debug_register_finalizer_ignore_self
+ GC_PROTO((GC_PTR obj, GC_finalization_proc fn, GC_PTR cd,
+ GC_finalization_proc *ofn, GC_PTR *ocd));
+
+/* The following routine may be used to break cycles between */
+/* finalizable objects, thus causing cyclic finalizable */
+/* objects to be finalized in the correct order. Standard */
+/* use involves calling GC_register_disappearing_link(&p), */
+/* where p is a pointer that is not followed by finalization */
+/* code, and should not be considered in determining */
+/* finalization order. */
+GC_API int GC_register_disappearing_link GC_PROTO((GC_PTR * /* link */));
+ /* Link should point to a field of a heap allocated */
+ /* object obj. *link will be cleared when obj is */
+ /* found to be inaccessible. This happens BEFORE any */
+ /* finalization code is invoked, and BEFORE any */
+ /* decisions about finalization order are made. */
+ /* This is useful in telling the finalizer that */
+ /* some pointers are not essential for proper */
+ /* finalization. This may avoid finalization cycles. */
+ /* Note that obj may be resurrected by another */
+ /* finalizer, and thus the clearing of *link may */
+ /* be visible to non-finalization code. */
+ /* There's an argument that an arbitrary action should */
+ /* be allowed here, instead of just clearing a pointer. */
+ /* But this causes problems if that action alters, or */
+ /* examines connectivity. */
+ /* Returns 1 if link was already registered, 0 */
+ /* otherwise. */
+ /* Only exists for backward compatibility. See below: */
+
+GC_API int GC_general_register_disappearing_link
+ GC_PROTO((GC_PTR * /* link */, GC_PTR obj));
+ /* A slight generalization of the above. *link is */
+ /* cleared when obj first becomes inaccessible. This */
+ /* can be used to implement weak pointers easily and */
+ /* safely. Typically link will point to a location */
+ /* holding a disguised pointer to obj. (A pointer */
+ /* inside an "atomic" object is effectively */
+ /* disguised.) In this way soft */
+ /* pointers are broken before any object */
+ /* reachable from them are finalized. Each link */
+ /* May be registered only once, i.e. with one obj */
+ /* value. This was added after a long email discussion */
+ /* with John Ellis. */
+ /* Obj must be a pointer to the first word of an object */
+ /* we allocated. It is unsafe to explicitly deallocate */
+ /* the object containing link. Explicitly deallocating */
+ /* obj may or may not cause link to eventually be */
+ /* cleared. */
+GC_API int GC_unregister_disappearing_link GC_PROTO((GC_PTR * /* link */));
+ /* Returns 0 if link was not actually registered. */
+ /* Undoes a registration by either of the above two */
+ /* routines. */
+
+/* Auxiliary fns to make finalization work correctly with displaced */
+/* pointers introduced by the debugging allocators. */
+GC_API GC_PTR GC_make_closure GC_PROTO((GC_finalization_proc fn, GC_PTR data));
+GC_API void GC_debug_invoke_finalizer GC_PROTO((GC_PTR obj, GC_PTR data));
+
+GC_API int GC_invoke_finalizers GC_PROTO((void));
+ /* Run finalizers for all objects that are ready to */
+ /* be finalized. Return the number of finalizers */
+ /* that were run. Normally this is also called */
+ /* implicitly during some allocations. If */
+ /* FINALIZE_ON_DEMAND is defined, it must be called */
+ /* explicitly. */
+
+/* GC_set_warn_proc can be used to redirect or filter warning messages. */
+/* p may not be a NULL pointer. */
+typedef void (*GC_warn_proc) GC_PROTO((char *msg, GC_word arg));
+GC_API GC_warn_proc GC_set_warn_proc GC_PROTO((GC_warn_proc p));
+ /* Returns old warning procedure. */
+
+/* The following is intended to be used by a higher level */
+/* (e.g. cedar-like) finalization facility. It is expected */
+/* that finalization code will arrange for hidden pointers to */
+/* disappear. Otherwise objects can be accessed after they */
+/* have been collected. */
+/* Note that putting pointers in atomic objects or in */
+/* nonpointer slots of "typed" objects is equivalent to */
+/* disguising them in this way, and may have other advantages. */
+# if defined(I_HIDE_POINTERS) || defined(GC_I_HIDE_POINTERS)
+ typedef GC_word GC_hidden_pointer;
+# define HIDE_POINTER(p) (~(GC_hidden_pointer)(p))
+# define REVEAL_POINTER(p) ((GC_PTR)(HIDE_POINTER(p)))
+ /* Converting a hidden pointer to a real pointer requires verifying */
+ /* that the object still exists. This involves acquiring the */
+ /* allocator lock to avoid a race with the collector. */
+# endif /* I_HIDE_POINTERS */
+
+typedef GC_PTR (*GC_fn_type) GC_PROTO((GC_PTR client_data));
+GC_API GC_PTR GC_call_with_alloc_lock
+ GC_PROTO((GC_fn_type fn, GC_PTR client_data));
+
+/* Check that p and q point to the same object. */
+/* Fail conspicuously if they don't. */
+/* Returns the first argument. */
+/* Succeeds if neither p nor q points to the heap. */
+/* May succeed if both p and q point to between heap objects. */
+GC_API GC_PTR GC_same_obj GC_PROTO((GC_PTR p, GC_PTR q));
+
+/* Checked pointer pre- and post- increment operations. Note that */
+/* the second argument is in units of bytes, not multiples of the */
+/* object size. This should either be invoked from a macro, or the */
+/* call should be automatically generated. */
+GC_API GC_PTR GC_pre_incr GC_PROTO((GC_PTR *p, size_t how_much));
+GC_API GC_PTR GC_post_incr GC_PROTO((GC_PTR *p, size_t how_much));
+
+/* Check that p is visible */
+/* to the collector as a possibly pointer containing location. */
+/* If it isn't fail conspicuously. */
+/* Returns the argument in all cases. May erroneously succeed */
+/* in hard cases. (This is intended for debugging use with */
+/* untyped allocations. The idea is that it should be possible, though */
+/* slow, to add such a call to all indirect pointer stores.) */
+/* Currently useless for multithreaded worlds. */
+GC_API GC_PTR GC_is_visible GC_PROTO((GC_PTR p));
+
+/* Check that if p is a pointer to a heap page, then it points to */
+/* a valid displacement within a heap object. */
+/* Fail conspicuously if this property does not hold. */
+/* Uninteresting with ALL_INTERIOR_POINTERS. */
+/* Always returns its argument. */
+GC_API GC_PTR GC_is_valid_displacement GC_PROTO((GC_PTR p));
+
+/* Safer, but slow, pointer addition. Probably useful mainly with */
+/* a preprocessor. Useful only for heap pointers. */
+#ifdef GC_DEBUG
+# define GC_PTR_ADD3(x, n, type_of_result) \
+ ((type_of_result)GC_same_obj((x)+(n), (x)))
+# define GC_PRE_INCR3(x, n, type_of_result) \
+ ((type_of_result)GC_pre_incr(&(x), (n)*sizeof(*x))
+# define GC_POST_INCR2(x, type_of_result) \
+ ((type_of_result)GC_post_incr(&(x), sizeof(*x))
+# ifdef __GNUC__
+# define GC_PTR_ADD(x, n) \
+ GC_PTR_ADD3(x, n, typeof(x))
+# define GC_PRE_INCR(x, n) \
+ GC_PRE_INCR3(x, n, typeof(x))
+# define GC_POST_INCR(x, n) \
+ GC_POST_INCR3(x, typeof(x))
+# else
+ /* We can't do this right without typeof, which ANSI */
+ /* decided was not sufficiently useful. Repeatedly */
+ /* mentioning the arguments seems too dangerous to be */
+ /* useful. So does not casting the result. */
+# define GC_PTR_ADD(x, n) ((x)+(n))
+# endif
+#else /* !GC_DEBUG */
+# define GC_PTR_ADD3(x, n, type_of_result) ((x)+(n))
+# define GC_PTR_ADD(x, n) ((x)+(n))
+# define GC_PRE_INCR3(x, n, type_of_result) ((x) += (n))
+# define GC_PRE_INCR(x, n) ((x) += (n))
+# define GC_POST_INCR2(x, n, type_of_result) ((x)++)
+# define GC_POST_INCR(x, n) ((x)++)
+#endif
+
+/* Safer assignment of a pointer to a nonstack location. */
+#ifdef GC_DEBUG
+# ifdef __STDC__
+# define GC_PTR_STORE(p, q) \
+ (*(void **)GC_is_visible(p) = GC_is_valid_displacement(q))
+# else
+# define GC_PTR_STORE(p, q) \
+ (*(char **)GC_is_visible(p) = GC_is_valid_displacement(q))
+# endif
+#else /* !GC_DEBUG */
+# define GC_PTR_STORE(p, q) *((p) = (q))
+#endif
+
+/* Fynctions called to report pointer checking errors */
+GC_API void (*GC_same_obj_print_proc) GC_PROTO((GC_PTR p, GC_PTR q));
+
+GC_API void (*GC_is_valid_displacement_print_proc)
+ GC_PROTO((GC_PTR p));
+
+GC_API void (*GC_is_visible_print_proc)
+ GC_PROTO((GC_PTR p));
+
+#ifdef SOLARIS_THREADS
+/* We need to intercept calls to many of the threads primitives, so */
+/* that we can locate thread stacks and stop the world. */
+/* Note also that the collector cannot see thread specific data. */
+/* Thread specific data should generally consist of pointers to */
+/* uncollectable objects, which are deallocated using the destructor */
+/* facility in thr_keycreate. */
+# include <thread.h>
+# include <signal.h>
+ int GC_thr_create(void *stack_base, size_t stack_size,
+ void *(*start_routine)(void *), void *arg, long flags,
+ thread_t *new_thread);
+ int GC_thr_join(thread_t wait_for, thread_t *departed, void **status);
+ int GC_thr_suspend(thread_t target_thread);
+ int GC_thr_continue(thread_t target_thread);
+ void * GC_dlopen(const char *path, int mode);
+
+# ifdef _SOLARIS_PTHREADS
+# include <pthread.h>
+ extern int GC_pthread_create(pthread_t *new_thread,
+ const pthread_attr_t *attr,
+ void * (*thread_execp)(void *), void *arg);
+ extern int GC_pthread_join(pthread_t wait_for, void **status);
+
+# undef thread_t
+
+# define pthread_join GC_pthread_join
+# define pthread_create GC_pthread_create
+#endif
+
+# define thr_create GC_thr_create
+# define thr_join GC_thr_join
+# define thr_suspend GC_thr_suspend
+# define thr_continue GC_thr_continue
+# define dlopen GC_dlopen
+
+# endif /* SOLARIS_THREADS */
+
+
+#if defined(IRIX_THREADS) || defined(LINUX_THREADS)
+/* We treat these similarly. */
+# include <pthread.h>
+# include <signal.h>
+
+ int GC_pthread_create(pthread_t *new_thread,
+ const pthread_attr_t *attr,
+ void *(*start_routine)(void *), void *arg);
+ int GC_pthread_sigmask(int how, const sigset_t *set, sigset_t *oset);
+ int GC_pthread_join(pthread_t thread, void **retval);
+
+# define pthread_create GC_pthread_create
+# define pthread_sigmask GC_pthread_sigmask
+# define pthread_join GC_pthread_join
+
+#endif /* IRIX_THREADS || LINUX_THREADS */
+
+#if defined(THREADS) && !defined(SRC_M3)
+/* This returns a list of objects, linked through their first */
+/* word. Its use can greatly reduce lock contention problems, since */
+/* the allocation lock can be acquired and released many fewer times. */
+GC_PTR GC_malloc_many(size_t lb);
+#define GC_NEXT(p) (*(GC_PTR *)(p)) /* Retrieve the next element */
+ /* in returned list. */
+extern void GC_thr_init(); /* Needed for Solaris/X86 */
+
+#endif /* THREADS && !SRC_M3 */
+
+/*
+ * If you are planning on putting
+ * the collector in a SunOS 5 dynamic library, you need to call GC_INIT()
+ * from the statically loaded program section.
+ * This circumvents a Solaris 2.X (X<=4) linker bug.
+ */
+#if defined(sparc) || defined(__sparc)
+# define GC_INIT() { extern end, etext; \
+ GC_noop(&end, &etext); }
+#else
+# if defined(__CYGWIN32__) && defined(GC_USE_DLL)
+ /*
+ * Similarly gnu-win32 DLLs need explicit initialization
+ */
+# define GC_INIT() { GC_add_roots(DATASTART, DATAEND); }
+# else
+# define GC_INIT()
+# endif
+#endif
+
+#ifdef __cplusplus
+ } /* end of extern "C" */
+#endif
+
+#endif /* _GC_H */
diff --git a/boehm-gc/cord/private/cord_pos.h b/boehm-gc/cord/private/cord_pos.h
new file mode 100644
index 00000000000..d2b24bb8ab6
--- /dev/null
+++ b/boehm-gc/cord/private/cord_pos.h
@@ -0,0 +1,118 @@
+/*
+ * Copyright (c) 1993-1994 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+/* Boehm, May 19, 1994 2:23 pm PDT */
+# ifndef CORD_POSITION_H
+
+/* The representation of CORD_position. This is private to the */
+/* implementation, but the size is known to clients. Also */
+/* the implementation of some exported macros relies on it. */
+/* Don't use anything defined here and not in cord.h. */
+
+# define MAX_DEPTH 48
+ /* The maximum depth of a balanced cord + 1. */
+ /* We don't let cords get deeper than MAX_DEPTH. */
+
+struct CORD_pe {
+ CORD pe_cord;
+ size_t pe_start_pos;
+};
+
+/* A structure describing an entry on the path from the root */
+/* to current position. */
+typedef struct CORD_Pos {
+ size_t cur_pos;
+ int path_len;
+# define CORD_POS_INVALID (0x55555555)
+ /* path_len == INVALID <==> position invalid */
+ const char *cur_leaf; /* Current leaf, if it is a string. */
+ /* If the current leaf is a function, */
+ /* then this may point to function_buf */
+ /* containing the next few characters. */
+ /* Always points to a valid string */
+ /* containing the current character */
+ /* unless cur_end is 0. */
+ size_t cur_start; /* Start position of cur_leaf */
+ size_t cur_end; /* Ending position of cur_leaf */
+ /* 0 if cur_leaf is invalid. */
+ struct CORD_pe path[MAX_DEPTH + 1];
+ /* path[path_len] is the leaf corresponding to cur_pos */
+ /* path[0].pe_cord is the cord we point to. */
+# define FUNCTION_BUF_SZ 8
+ char function_buf[FUNCTION_BUF_SZ]; /* Space for next few chars */
+ /* from function node. */
+} CORD_pos[1];
+
+/* Extract the cord from a position: */
+CORD CORD_pos_to_cord(CORD_pos p);
+
+/* Extract the current index from a position: */
+size_t CORD_pos_to_index(CORD_pos p);
+
+/* Fetch the character located at the given position: */
+char CORD_pos_fetch(CORD_pos p);
+
+/* Initialize the position to refer to the give cord and index. */
+/* Note that this is the most expensive function on positions: */
+void CORD_set_pos(CORD_pos p, CORD x, size_t i);
+
+/* Advance the position to the next character. */
+/* P must be initialized and valid. */
+/* Invalidates p if past end: */
+void CORD_next(CORD_pos p);
+
+/* Move the position to the preceding character. */
+/* P must be initialized and valid. */
+/* Invalidates p if past beginning: */
+void CORD_prev(CORD_pos p);
+
+/* Is the position valid, i.e. inside the cord? */
+int CORD_pos_valid(CORD_pos p);
+
+char CORD__pos_fetch(CORD_pos);
+void CORD__next(CORD_pos);
+void CORD__prev(CORD_pos);
+
+#define CORD_pos_fetch(p) \
+ (((p)[0].cur_end != 0)? \
+ (p)[0].cur_leaf[(p)[0].cur_pos - (p)[0].cur_start] \
+ : CORD__pos_fetch(p))
+
+#define CORD_next(p) \
+ (((p)[0].cur_pos + 1 < (p)[0].cur_end)? \
+ (p)[0].cur_pos++ \
+ : (CORD__next(p), 0))
+
+#define CORD_prev(p) \
+ (((p)[0].cur_end != 0 && (p)[0].cur_pos > (p)[0].cur_start)? \
+ (p)[0].cur_pos-- \
+ : (CORD__prev(p), 0))
+
+#define CORD_pos_to_index(p) ((p)[0].cur_pos)
+
+#define CORD_pos_to_cord(p) ((p)[0].path[0].pe_cord)
+
+#define CORD_pos_valid(p) ((p)[0].path_len != CORD_POS_INVALID)
+
+/* Some grubby stuff for performance-critical friends: */
+#define CORD_pos_chars_left(p) ((long)((p)[0].cur_end) - (long)((p)[0].cur_pos))
+ /* Number of characters in cache. <= 0 ==> none */
+
+#define CORD_pos_advance(p,n) ((p)[0].cur_pos += (n) - 1, CORD_next(p))
+ /* Advance position by n characters */
+ /* 0 < n < CORD_pos_chars_left(p) */
+
+#define CORD_pos_cur_char_addr(p) \
+ (p)[0].cur_leaf + ((p)[0].cur_pos - (p)[0].cur_start)
+ /* address of current character in cache. */
+
+#endif
diff --git a/boehm-gc/dbg_mlc.c b/boehm-gc/dbg_mlc.c
new file mode 100644
index 00000000000..079e43be7cb
--- /dev/null
+++ b/boehm-gc/dbg_mlc.c
@@ -0,0 +1,693 @@
+/*
+ * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+ * Copyright (c) 1991-1995 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1997 by Silicon Graphics. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+/* Boehm, October 9, 1995 1:16 pm PDT */
+# include "gc_priv.h"
+
+/* Do we want to and know how to save the call stack at the time of */
+/* an allocation? How much space do we want to use in each object? */
+
+# define START_FLAG ((word)0xfedcedcb)
+# define END_FLAG ((word)0xbcdecdef)
+ /* Stored both one past the end of user object, and one before */
+ /* the end of the object as seen by the allocator. */
+
+
+/* Object header */
+typedef struct {
+ char * oh_string; /* object descriptor string */
+ word oh_int; /* object descriptor integers */
+# ifdef NEED_CALLINFO
+ struct callinfo oh_ci[NFRAMES];
+# endif
+ word oh_sz; /* Original malloc arg. */
+ word oh_sf; /* start flag */
+} oh;
+/* The size of the above structure is assumed not to dealign things, */
+/* and to be a multiple of the word length. */
+
+#define DEBUG_BYTES (sizeof (oh) + sizeof (word))
+#undef ROUNDED_UP_WORDS
+#define ROUNDED_UP_WORDS(n) BYTES_TO_WORDS((n) + WORDS_TO_BYTES(1) - 1)
+
+
+#ifdef SAVE_CALL_CHAIN
+# define ADD_CALL_CHAIN(base, ra) GC_save_callers(((oh *)(base)) -> oh_ci)
+# define PRINT_CALL_CHAIN(base) GC_print_callers(((oh *)(base)) -> oh_ci)
+#else
+# ifdef GC_ADD_CALLER
+# define ADD_CALL_CHAIN(base, ra) ((oh *)(base)) -> oh_ci[0].ci_pc = (ra)
+# define PRINT_CALL_CHAIN(base) GC_print_callers(((oh *)(base)) -> oh_ci)
+# else
+# define ADD_CALL_CHAIN(base, ra)
+# define PRINT_CALL_CHAIN(base)
+# endif
+#endif
+
+/* Check whether object with base pointer p has debugging info */
+/* p is assumed to point to a legitimate object in our part */
+/* of the heap. */
+GC_bool GC_has_debug_info(p)
+ptr_t p;
+{
+ register oh * ohdr = (oh *)p;
+ register ptr_t body = (ptr_t)(ohdr + 1);
+ register word sz = GC_size((ptr_t) ohdr);
+
+ if (HBLKPTR((ptr_t)ohdr) != HBLKPTR((ptr_t)body)
+ || sz < sizeof (oh)) {
+ return(FALSE);
+ }
+ if (ohdr -> oh_sz == sz) {
+ /* Object may have had debug info, but has been deallocated */
+ return(FALSE);
+ }
+ if (ohdr -> oh_sf == (START_FLAG ^ (word)body)) return(TRUE);
+ if (((word *)ohdr)[BYTES_TO_WORDS(sz)-1] == (END_FLAG ^ (word)body)) {
+ return(TRUE);
+ }
+ return(FALSE);
+}
+
+/* Return start of object that might have debugging info. */
+ptr_t GC_debug_object_start(p)
+ptr_t p;
+{
+ register word * result = (word *)((oh *)p + 1);
+ if (! GC_has_debug_info(p))
+ return(p);
+ return((ptr_t)result);
+}
+
+/* Store debugging info into p. Return displaced pointer. */
+/* Assumes we don't hold allocation lock. */
+ptr_t GC_store_debug_info(p, sz, string, integer)
+register ptr_t p; /* base pointer */
+word sz; /* bytes */
+char * string;
+word integer;
+{
+ register word * result = (word *)((oh *)p + 1);
+ DCL_LOCK_STATE;
+
+ /* There is some argument that we should dissble signals here. */
+ /* But that's expensive. And this way things should only appear */
+ /* inconsistent while we're in the handler. */
+ LOCK();
+ ((oh *)p) -> oh_string = string;
+ ((oh *)p) -> oh_int = integer;
+ ((oh *)p) -> oh_sz = sz;
+ ((oh *)p) -> oh_sf = START_FLAG ^ (word)result;
+ ((word *)p)[BYTES_TO_WORDS(GC_size(p))-1] =
+ result[ROUNDED_UP_WORDS(sz)] = END_FLAG ^ (word)result;
+ UNLOCK();
+ return((ptr_t)result);
+}
+
+/* Check the object with debugging info at p */
+/* return NIL if it's OK. Else return clobbered */
+/* address. */
+ptr_t GC_check_annotated_obj(ohdr)
+register oh * ohdr;
+{
+ register ptr_t body = (ptr_t)(ohdr + 1);
+ register word gc_sz = GC_size((ptr_t)ohdr);
+ if (ohdr -> oh_sz + DEBUG_BYTES > gc_sz) {
+ return((ptr_t)(&(ohdr -> oh_sz)));
+ }
+ if (ohdr -> oh_sf != (START_FLAG ^ (word)body)) {
+ return((ptr_t)(&(ohdr -> oh_sf)));
+ }
+ if (((word *)ohdr)[BYTES_TO_WORDS(gc_sz)-1] != (END_FLAG ^ (word)body)) {
+ return((ptr_t)((word *)ohdr + BYTES_TO_WORDS(gc_sz)-1));
+ }
+ if (((word *)body)[ROUNDED_UP_WORDS(ohdr -> oh_sz)]
+ != (END_FLAG ^ (word)body)) {
+ return((ptr_t)((word *)body + ROUNDED_UP_WORDS(ohdr -> oh_sz)));
+ }
+ return(0);
+}
+
+void GC_print_obj(p)
+ptr_t p;
+{
+ register oh * ohdr = (oh *)GC_base(p);
+
+ GC_err_printf1("0x%lx (", (unsigned long)ohdr + sizeof(oh));
+ GC_err_puts(ohdr -> oh_string);
+ GC_err_printf2(":%ld, sz=%ld)\n", (unsigned long)(ohdr -> oh_int),
+ (unsigned long)(ohdr -> oh_sz));
+ PRINT_CALL_CHAIN(ohdr);
+}
+
+void GC_debug_print_heap_obj_proc(p)
+ptr_t p;
+{
+ if (GC_has_debug_info(p)) {
+ GC_print_obj(p);
+ } else {
+ GC_default_print_heap_obj_proc(p);
+ }
+}
+
+void GC_print_smashed_obj(p, clobbered_addr)
+ptr_t p, clobbered_addr;
+{
+ register oh * ohdr = (oh *)GC_base(p);
+
+ GC_err_printf2("0x%lx in object at 0x%lx(", (unsigned long)clobbered_addr,
+ (unsigned long)p);
+ if (clobbered_addr <= (ptr_t)(&(ohdr -> oh_sz))
+ || ohdr -> oh_string == 0) {
+ GC_err_printf1("<smashed>, appr. sz = %ld)\n",
+ GC_size((ptr_t)ohdr) - DEBUG_BYTES);
+ } else {
+ if (ohdr -> oh_string[0] == '\0') {
+ GC_err_puts("EMPTY(smashed?)");
+ } else {
+ GC_err_puts(ohdr -> oh_string);
+ }
+ GC_err_printf2(":%ld, sz=%ld)\n", (unsigned long)(ohdr -> oh_int),
+ (unsigned long)(ohdr -> oh_sz));
+ PRINT_CALL_CHAIN(ohdr);
+ }
+}
+
+void GC_check_heap_proc();
+
+void GC_start_debugging()
+{
+ GC_check_heap = GC_check_heap_proc;
+ GC_print_heap_obj = GC_debug_print_heap_obj_proc;
+ GC_debugging_started = TRUE;
+ GC_register_displacement((word)sizeof(oh));
+}
+
+# if defined(__STDC__) || defined(__cplusplus)
+ void GC_debug_register_displacement(GC_word offset)
+# else
+ void GC_debug_register_displacement(offset)
+ GC_word offset;
+# endif
+{
+ GC_register_displacement(offset);
+ GC_register_displacement((word)sizeof(oh) + offset);
+}
+
+# ifdef GC_ADD_CALLER
+# define EXTRA_ARGS word ra, char * s, int i
+# define OPT_RA ra,
+# else
+# define EXTRA_ARGS char * s, int i
+# define OPT_RA
+# endif
+
+# ifdef __STDC__
+ GC_PTR GC_debug_malloc(size_t lb, EXTRA_ARGS)
+# else
+ GC_PTR GC_debug_malloc(lb, s, i)
+ size_t lb;
+ char * s;
+ int i;
+# ifdef GC_ADD_CALLER
+ --> GC_ADD_CALLER not implemented for K&R C
+# endif
+# endif
+{
+ GC_PTR result = GC_malloc(lb + DEBUG_BYTES);
+
+ if (result == 0) {
+ GC_err_printf1("GC_debug_malloc(%ld) returning NIL (",
+ (unsigned long) lb);
+ GC_err_puts(s);
+ GC_err_printf1(":%ld)\n", (unsigned long)i);
+ return(0);
+ }
+ if (!GC_debugging_started) {
+ GC_start_debugging();
+ }
+ ADD_CALL_CHAIN(result, ra);
+ return (GC_store_debug_info(result, (word)lb, s, (word)i));
+}
+
+# ifdef __STDC__
+ GC_PTR GC_debug_generic_malloc(size_t lb, int k, EXTRA_ARGS)
+# else
+ GC_PTR GC_debug_malloc(lb, k, s, i)
+ size_t lb;
+ int k;
+ char * s;
+ int i;
+# ifdef GC_ADD_CALLER
+ --> GC_ADD_CALLER not implemented for K&R C
+# endif
+# endif
+{
+ GC_PTR result = GC_generic_malloc(lb + DEBUG_BYTES, k);
+
+ if (result == 0) {
+ GC_err_printf1("GC_debug_malloc(%ld) returning NIL (",
+ (unsigned long) lb);
+ GC_err_puts(s);
+ GC_err_printf1(":%ld)\n", (unsigned long)i);
+ return(0);
+ }
+ if (!GC_debugging_started) {
+ GC_start_debugging();
+ }
+ ADD_CALL_CHAIN(result, ra);
+ return (GC_store_debug_info(result, (word)lb, s, (word)i));
+}
+
+#ifdef STUBBORN_ALLOC
+# ifdef __STDC__
+ GC_PTR GC_debug_malloc_stubborn(size_t lb, EXTRA_ARGS)
+# else
+ GC_PTR GC_debug_malloc_stubborn(lb, s, i)
+ size_t lb;
+ char * s;
+ int i;
+# endif
+{
+ GC_PTR result = GC_malloc_stubborn(lb + DEBUG_BYTES);
+
+ if (result == 0) {
+ GC_err_printf1("GC_debug_malloc(%ld) returning NIL (",
+ (unsigned long) lb);
+ GC_err_puts(s);
+ GC_err_printf1(":%ld)\n", (unsigned long)i);
+ return(0);
+ }
+ if (!GC_debugging_started) {
+ GC_start_debugging();
+ }
+ ADD_CALL_CHAIN(result, ra);
+ return (GC_store_debug_info(result, (word)lb, s, (word)i));
+}
+
+void GC_debug_change_stubborn(p)
+GC_PTR p;
+{
+ register GC_PTR q = GC_base(p);
+ register hdr * hhdr;
+
+ if (q == 0) {
+ GC_err_printf1("Bad argument: 0x%lx to GC_debug_change_stubborn\n",
+ (unsigned long) p);
+ ABORT("GC_debug_change_stubborn: bad arg");
+ }
+ hhdr = HDR(q);
+ if (hhdr -> hb_obj_kind != STUBBORN) {
+ GC_err_printf1("GC_debug_change_stubborn arg not stubborn: 0x%lx\n",
+ (unsigned long) p);
+ ABORT("GC_debug_change_stubborn: arg not stubborn");
+ }
+ GC_change_stubborn(q);
+}
+
+void GC_debug_end_stubborn_change(p)
+GC_PTR p;
+{
+ register GC_PTR q = GC_base(p);
+ register hdr * hhdr;
+
+ if (q == 0) {
+ GC_err_printf1("Bad argument: 0x%lx to GC_debug_end_stubborn_change\n",
+ (unsigned long) p);
+ ABORT("GC_debug_end_stubborn_change: bad arg");
+ }
+ hhdr = HDR(q);
+ if (hhdr -> hb_obj_kind != STUBBORN) {
+ GC_err_printf1("debug_end_stubborn_change arg not stubborn: 0x%lx\n",
+ (unsigned long) p);
+ ABORT("GC_debug_end_stubborn_change: arg not stubborn");
+ }
+ GC_end_stubborn_change(q);
+}
+
+#endif /* STUBBORN_ALLOC */
+
+# ifdef __STDC__
+ GC_PTR GC_debug_malloc_atomic(size_t lb, EXTRA_ARGS)
+# else
+ GC_PTR GC_debug_malloc_atomic(lb, s, i)
+ size_t lb;
+ char * s;
+ int i;
+# endif
+{
+ GC_PTR result = GC_malloc_atomic(lb + DEBUG_BYTES);
+
+ if (result == 0) {
+ GC_err_printf1("GC_debug_malloc_atomic(%ld) returning NIL (",
+ (unsigned long) lb);
+ GC_err_puts(s);
+ GC_err_printf1(":%ld)\n", (unsigned long)i);
+ return(0);
+ }
+ if (!GC_debugging_started) {
+ GC_start_debugging();
+ }
+ ADD_CALL_CHAIN(result, ra);
+ return (GC_store_debug_info(result, (word)lb, s, (word)i));
+}
+
+# ifdef __STDC__
+ GC_PTR GC_debug_malloc_uncollectable(size_t lb, EXTRA_ARGS)
+# else
+ GC_PTR GC_debug_malloc_uncollectable(lb, s, i)
+ size_t lb;
+ char * s;
+ int i;
+# endif
+{
+ GC_PTR result = GC_malloc_uncollectable(lb + DEBUG_BYTES);
+
+ if (result == 0) {
+ GC_err_printf1("GC_debug_malloc_uncollectable(%ld) returning NIL (",
+ (unsigned long) lb);
+ GC_err_puts(s);
+ GC_err_printf1(":%ld)\n", (unsigned long)i);
+ return(0);
+ }
+ if (!GC_debugging_started) {
+ GC_start_debugging();
+ }
+ ADD_CALL_CHAIN(result, ra);
+ return (GC_store_debug_info(result, (word)lb, s, (word)i));
+}
+
+#ifdef ATOMIC_UNCOLLECTABLE
+# ifdef __STDC__
+ GC_PTR GC_debug_malloc_atomic_uncollectable(size_t lb, EXTRA_ARGS)
+# else
+ GC_PTR GC_debug_malloc_atomic_uncollectable(lb, s, i)
+ size_t lb;
+ char * s;
+ int i;
+# endif
+{
+ GC_PTR result = GC_malloc_atomic_uncollectable(lb + DEBUG_BYTES);
+
+ if (result == 0) {
+ GC_err_printf1(
+ "GC_debug_malloc_atomic_uncollectable(%ld) returning NIL (",
+ (unsigned long) lb);
+ GC_err_puts(s);
+ GC_err_printf1(":%ld)\n", (unsigned long)i);
+ return(0);
+ }
+ if (!GC_debugging_started) {
+ GC_start_debugging();
+ }
+ ADD_CALL_CHAIN(result, ra);
+ return (GC_store_debug_info(result, (word)lb, s, (word)i));
+}
+#endif /* ATOMIC_UNCOLLECTABLE */
+
+# ifdef __STDC__
+ void GC_debug_free(GC_PTR p)
+# else
+ void GC_debug_free(p)
+ GC_PTR p;
+# endif
+{
+ register GC_PTR base = GC_base(p);
+ register ptr_t clobbered;
+
+ if (base == 0) {
+ GC_err_printf1("Attempt to free invalid pointer %lx\n",
+ (unsigned long)p);
+ if (p != 0) ABORT("free(invalid pointer)");
+ }
+ if ((ptr_t)p - (ptr_t)base != sizeof(oh)) {
+ GC_err_printf1(
+ "GC_debug_free called on pointer %lx wo debugging info\n",
+ (unsigned long)p);
+ } else {
+ clobbered = GC_check_annotated_obj((oh *)base);
+ if (clobbered != 0) {
+ if (((oh *)base) -> oh_sz == GC_size(base)) {
+ GC_err_printf0(
+ "GC_debug_free: found previously deallocated (?) object at ");
+ } else {
+ GC_err_printf0("GC_debug_free: found smashed object at ");
+ }
+ GC_print_smashed_obj(p, clobbered);
+ }
+ /* Invalidate size */
+ ((oh *)base) -> oh_sz = GC_size(base);
+ }
+# ifdef FIND_LEAK
+ GC_free(base);
+# else
+ {
+ register hdr * hhdr = HDR(p);
+ GC_bool uncollectable = FALSE;
+
+ if (hhdr -> hb_obj_kind == UNCOLLECTABLE) {
+ uncollectable = TRUE;
+ }
+# ifdef ATOMIC_UNCOLLECTABLE
+ if (hhdr -> hb_obj_kind == AUNCOLLECTABLE) {
+ uncollectable = TRUE;
+ }
+# endif
+ if (uncollectable) GC_free(base);
+ }
+# endif
+}
+
+# ifdef __STDC__
+ GC_PTR GC_debug_realloc(GC_PTR p, size_t lb, EXTRA_ARGS)
+# else
+ GC_PTR GC_debug_realloc(p, lb, s, i)
+ GC_PTR p;
+ size_t lb;
+ char *s;
+ int i;
+# endif
+{
+ register GC_PTR base = GC_base(p);
+ register ptr_t clobbered;
+ register GC_PTR result;
+ register size_t copy_sz = lb;
+ register size_t old_sz;
+ register hdr * hhdr;
+
+ if (p == 0) return(GC_debug_malloc(lb, OPT_RA s, i));
+ if (base == 0) {
+ GC_err_printf1(
+ "Attempt to reallocate invalid pointer %lx\n", (unsigned long)p);
+ ABORT("realloc(invalid pointer)");
+ }
+ if ((ptr_t)p - (ptr_t)base != sizeof(oh)) {
+ GC_err_printf1(
+ "GC_debug_realloc called on pointer %lx wo debugging info\n",
+ (unsigned long)p);
+ return(GC_realloc(p, lb));
+ }
+ hhdr = HDR(base);
+ switch (hhdr -> hb_obj_kind) {
+# ifdef STUBBORN_ALLOC
+ case STUBBORN:
+ result = GC_debug_malloc_stubborn(lb, OPT_RA s, i);
+ break;
+# endif
+ case NORMAL:
+ result = GC_debug_malloc(lb, OPT_RA s, i);
+ break;
+ case PTRFREE:
+ result = GC_debug_malloc_atomic(lb, OPT_RA s, i);
+ break;
+ case UNCOLLECTABLE:
+ result = GC_debug_malloc_uncollectable(lb, OPT_RA s, i);
+ break;
+# ifdef ATOMIC_UNCOLLECTABLE
+ case AUNCOLLECTABLE:
+ result = GC_debug_malloc_atomic_uncollectable(lb, OPT_RA s, i);
+ break;
+# endif
+ default:
+ GC_err_printf0("GC_debug_realloc: encountered bad kind\n");
+ ABORT("bad kind");
+ }
+ clobbered = GC_check_annotated_obj((oh *)base);
+ if (clobbered != 0) {
+ GC_err_printf0("GC_debug_realloc: found smashed object at ");
+ GC_print_smashed_obj(p, clobbered);
+ }
+ old_sz = ((oh *)base) -> oh_sz;
+ if (old_sz < copy_sz) copy_sz = old_sz;
+ if (result == 0) return(0);
+ BCOPY(p, result, copy_sz);
+ GC_debug_free(p);
+ return(result);
+}
+
+/* Check all marked objects in the given block for validity */
+/*ARGSUSED*/
+void GC_check_heap_block(hbp, dummy)
+register struct hblk *hbp; /* ptr to current heap block */
+word dummy;
+{
+ register struct hblkhdr * hhdr = HDR(hbp);
+ register word sz = hhdr -> hb_sz;
+ register int word_no;
+ register word *p, *plim;
+
+ p = (word *)(hbp->hb_body);
+ word_no = HDR_WORDS;
+ if (sz > MAXOBJSZ) {
+ plim = p;
+ } else {
+ plim = (word *)((((word)hbp) + HBLKSIZE) - WORDS_TO_BYTES(sz));
+ }
+ /* go through all words in block */
+ while( p <= plim ) {
+ if( mark_bit_from_hdr(hhdr, word_no)
+ && GC_has_debug_info((ptr_t)p)) {
+ ptr_t clobbered = GC_check_annotated_obj((oh *)p);
+
+ if (clobbered != 0) {
+ GC_err_printf0(
+ "GC_check_heap_block: found smashed object at ");
+ GC_print_smashed_obj((ptr_t)p, clobbered);
+ }
+ }
+ word_no += sz;
+ p += sz;
+ }
+}
+
+
+/* This assumes that all accessible objects are marked, and that */
+/* I hold the allocation lock. Normally called by collector. */
+void GC_check_heap_proc()
+{
+# ifndef SMALL_CONFIG
+ if (sizeof(oh) & (2 * sizeof(word) - 1) != 0) {
+ ABORT("Alignment problem: object header has inappropriate size\n");
+ }
+# endif
+ GC_apply_to_all_blocks(GC_check_heap_block, (word)0);
+}
+
+struct closure {
+ GC_finalization_proc cl_fn;
+ GC_PTR cl_data;
+};
+
+# ifdef __STDC__
+ void * GC_make_closure(GC_finalization_proc fn, void * data)
+# else
+ GC_PTR GC_make_closure(fn, data)
+ GC_finalization_proc fn;
+ GC_PTR data;
+# endif
+{
+ struct closure * result =
+ (struct closure *) GC_malloc(sizeof (struct closure));
+
+ result -> cl_fn = fn;
+ result -> cl_data = data;
+ return((GC_PTR)result);
+}
+
+# ifdef __STDC__
+ void GC_debug_invoke_finalizer(void * obj, void * data)
+# else
+ void GC_debug_invoke_finalizer(obj, data)
+ char * obj;
+ char * data;
+# endif
+{
+ register struct closure * cl = (struct closure *) data;
+
+ (*(cl -> cl_fn))((GC_PTR)((char *)obj + sizeof(oh)), cl -> cl_data);
+}
+
+
+# ifdef __STDC__
+ void GC_debug_register_finalizer(GC_PTR obj, GC_finalization_proc fn,
+ GC_PTR cd, GC_finalization_proc *ofn,
+ GC_PTR *ocd)
+# else
+ void GC_debug_register_finalizer(obj, fn, cd, ofn, ocd)
+ GC_PTR obj;
+ GC_finalization_proc fn;
+ GC_PTR cd;
+ GC_finalization_proc *ofn;
+ GC_PTR *ocd;
+# endif
+{
+ ptr_t base = GC_base(obj);
+ if (0 == base || (ptr_t)obj - base != sizeof(oh)) {
+ GC_err_printf1(
+ "GC_register_finalizer called with non-base-pointer 0x%lx\n",
+ obj);
+ }
+ GC_register_finalizer(base, GC_debug_invoke_finalizer,
+ GC_make_closure(fn,cd), ofn, ocd);
+}
+
+# ifdef __STDC__
+ void GC_debug_register_finalizer_ignore_self
+ (GC_PTR obj, GC_finalization_proc fn,
+ GC_PTR cd, GC_finalization_proc *ofn,
+ GC_PTR *ocd)
+# else
+ void GC_debug_register_finalizer_ignore_self
+ (obj, fn, cd, ofn, ocd)
+ GC_PTR obj;
+ GC_finalization_proc fn;
+ GC_PTR cd;
+ GC_finalization_proc *ofn;
+ GC_PTR *ocd;
+# endif
+{
+ ptr_t base = GC_base(obj);
+ if (0 == base || (ptr_t)obj - base != sizeof(oh)) {
+ GC_err_printf1(
+ "GC_register_finalizer_ignore_self called with non-base-pointer 0x%lx\n",
+ obj);
+ }
+ GC_register_finalizer_ignore_self(base, GC_debug_invoke_finalizer,
+ GC_make_closure(fn,cd), ofn, ocd);
+}
+
+# ifdef __STDC__
+ void GC_debug_register_finalizer_no_order
+ (GC_PTR obj, GC_finalization_proc fn,
+ GC_PTR cd, GC_finalization_proc *ofn,
+ GC_PTR *ocd)
+# else
+ void GC_debug_register_finalizer_no_order
+ (obj, fn, cd, ofn, ocd)
+ GC_PTR obj;
+ GC_finalization_proc fn;
+ GC_PTR cd;
+ GC_finalization_proc *ofn;
+ GC_PTR *ocd;
+# endif
+{
+ ptr_t base = GC_base(obj);
+ if (0 == base || (ptr_t)obj - base != sizeof(oh)) {
+ GC_err_printf1(
+ "GC_register_finalizer_no_order called with non-base-pointer 0x%lx\n",
+ obj);
+ }
+ GC_register_finalizer_no_order(base, GC_debug_invoke_finalizer,
+ GC_make_closure(fn,cd), ofn, ocd);
+}
diff --git a/boehm-gc/dyn_load.c b/boehm-gc/dyn_load.c
new file mode 100644
index 00000000000..d0f523c3400
--- /dev/null
+++ b/boehm-gc/dyn_load.c
@@ -0,0 +1,797 @@
+/*
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1997 by Silicon Graphics. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ * Original author: Bill Janssen
+ * Heavily modified by Hans Boehm and others
+ */
+
+/*
+ * This is incredibly OS specific code for tracking down data sections in
+ * dynamic libraries. There appears to be no way of doing this quickly
+ * without groveling through undocumented data structures. We would argue
+ * that this is a bug in the design of the dlopen interface. THIS CODE
+ * MAY BREAK IN FUTURE OS RELEASES. If this matters to you, don't hesitate
+ * to let your vendor know ...
+ *
+ * None of this is safe with dlclose and incremental collection.
+ * But then not much of anything is safe in the presence of dlclose.
+ */
+#ifndef MACOS
+# include <sys/types.h>
+#endif
+#include "gc_priv.h"
+
+/* BTL: avoid circular redefinition of dlopen if SOLARIS_THREADS defined */
+# if defined(SOLARIS_THREADS) && defined(dlopen)
+ /* To support threads in Solaris, gc.h interposes on dlopen by */
+ /* defining "dlopen" to be "GC_dlopen", which is implemented below. */
+ /* However, both GC_FirstDLOpenedLinkMap() and GC_dlopen() use the */
+ /* real system dlopen() in their implementation. We first remove */
+ /* gc.h's dlopen definition and restore it later, after GC_dlopen(). */
+# undef dlopen
+# define GC_must_restore_redefined_dlopen
+# else
+# undef GC_must_restore_redefined_dlopen
+# endif
+
+#if (defined(DYNAMIC_LOADING) || defined(MSWIN32)) && !defined(PCR)
+#if !defined(SUNOS4) && !defined(SUNOS5DL) && !defined(IRIX5) && \
+ !defined(MSWIN32) && !(defined(ALPHA) && defined(OSF1)) && \
+ !defined(HP_PA) && (!defined(LINUX) && !defined(__ELF__)) && \
+ !defined(RS6000) && !defined(SCO_ELF)
+ --> We only know how to find data segments of dynamic libraries for the
+ --> above. Additional SVR4 variants might not be too
+ --> hard to add.
+#endif
+
+#include <stdio.h>
+#ifdef SUNOS5DL
+# include <sys/elf.h>
+# include <dlfcn.h>
+# include <link.h>
+#endif
+#ifdef SUNOS4
+# include <dlfcn.h>
+# include <link.h>
+# include <a.out.h>
+ /* struct link_map field overrides */
+# define l_next lm_next
+# define l_addr lm_addr
+# define l_name lm_name
+#endif
+
+
+#if defined(SUNOS5DL) && !defined(USE_PROC_FOR_LIBRARIES)
+
+#ifdef LINT
+ Elf32_Dyn _DYNAMIC;
+#endif
+
+static struct link_map *
+GC_FirstDLOpenedLinkMap()
+{
+ extern Elf32_Dyn _DYNAMIC;
+ Elf32_Dyn *dp;
+ struct r_debug *r;
+ static struct link_map * cachedResult = 0;
+ static Elf32_Dyn *dynStructureAddr = 0;
+ /* BTL: added to avoid Solaris 5.3 ld.so _DYNAMIC bug */
+
+# ifdef SUNOS53_SHARED_LIB
+ /* BTL: Avoid the Solaris 5.3 bug that _DYNAMIC isn't being set */
+ /* up properly in dynamically linked .so's. This means we have */
+ /* to use its value in the set of original object files loaded */
+ /* at program startup. */
+ if( dynStructureAddr == 0 ) {
+ void* startupSyms = dlopen(0, RTLD_LAZY);
+ dynStructureAddr = (Elf32_Dyn*)dlsym(startupSyms, "_DYNAMIC");
+ }
+# else
+ dynStructureAddr = &_DYNAMIC;
+# endif
+
+ if( dynStructureAddr == 0) {
+ return(0);
+ }
+ if( cachedResult == 0 ) {
+ int tag;
+ for( dp = ((Elf32_Dyn *)(&_DYNAMIC)); (tag = dp->d_tag) != 0; dp++ ) {
+ if( tag == DT_DEBUG ) {
+ struct link_map *lm
+ = ((struct r_debug *)(dp->d_un.d_ptr))->r_map;
+ if( lm != 0 ) cachedResult = lm->l_next; /* might be NIL */
+ break;
+ }
+ }
+ }
+ return cachedResult;
+}
+
+#endif /* SUNOS5DL ... */
+
+#if defined(SUNOS4) && !defined(USE_PROC_FOR_LIBRARIES)
+
+#ifdef LINT
+ struct link_dynamic _DYNAMIC;
+#endif
+
+static struct link_map *
+GC_FirstDLOpenedLinkMap()
+{
+ extern struct link_dynamic _DYNAMIC;
+
+ if( &_DYNAMIC == 0) {
+ return(0);
+ }
+ return(_DYNAMIC.ld_un.ld_1->ld_loaded);
+}
+
+/* Return the address of the ld.so allocated common symbol */
+/* with the least address, or 0 if none. */
+static ptr_t GC_first_common()
+{
+ ptr_t result = 0;
+ extern struct link_dynamic _DYNAMIC;
+ struct rtc_symb * curr_symbol;
+
+ if( &_DYNAMIC == 0) {
+ return(0);
+ }
+ curr_symbol = _DYNAMIC.ldd -> ldd_cp;
+ for (; curr_symbol != 0; curr_symbol = curr_symbol -> rtc_next) {
+ if (result == 0
+ || (ptr_t)(curr_symbol -> rtc_sp -> n_value) < result) {
+ result = (ptr_t)(curr_symbol -> rtc_sp -> n_value);
+ }
+ }
+ return(result);
+}
+
+#endif /* SUNOS4 ... */
+
+# if defined(SUNOS4) || defined(SUNOS5DL)
+/* Add dynamic library data sections to the root set. */
+# if !defined(PCR) && !defined(SOLARIS_THREADS) \
+ && !defined(QUICK_THREADS) && defined(THREADS)
+# ifndef SRC_M3
+ --> fix mutual exclusion with dlopen
+# endif /* We assume M3 programs don't call dlopen for now */
+# endif
+
+# ifdef SOLARIS_THREADS
+ /* Redefine dlopen to guarantee mutual exclusion with */
+ /* GC_register_dynamic_libraries. */
+ /* assumes that dlopen doesn't need to call GC_malloc */
+ /* and friends. */
+# include <thread.h>
+# include <synch.h>
+
+void * GC_dlopen(const char *path, int mode)
+{
+ void * result;
+
+# ifndef USE_PROC_FOR_LIBRARIES
+ mutex_lock(&GC_allocate_ml);
+# endif
+ result = dlopen(path, mode);
+# ifndef USE_PROC_FOR_LIBRARIES
+ mutex_unlock(&GC_allocate_ml);
+# endif
+ return(result);
+}
+# endif /* SOLARIS_THREADS */
+
+/* BTL: added to fix circular dlopen definition if SOLARIS_THREADS defined */
+# if defined(GC_must_restore_redefined_dlopen)
+# define dlopen GC_dlopen
+# endif
+
+# ifndef USE_PROC_FOR_LIBRARIES
+void GC_register_dynamic_libraries()
+{
+ struct link_map *lm = GC_FirstDLOpenedLinkMap();
+
+
+ for (lm = GC_FirstDLOpenedLinkMap();
+ lm != (struct link_map *) 0; lm = lm->l_next)
+ {
+# ifdef SUNOS4
+ struct exec *e;
+
+ e = (struct exec *) lm->lm_addr;
+ GC_add_roots_inner(
+ ((char *) (N_DATOFF(*e) + lm->lm_addr)),
+ ((char *) (N_BSSADDR(*e) + e->a_bss + lm->lm_addr)),
+ TRUE);
+# endif
+# ifdef SUNOS5DL
+ Elf32_Ehdr * e;
+ Elf32_Phdr * p;
+ unsigned long offset;
+ char * start;
+ register int i;
+
+ e = (Elf32_Ehdr *) lm->l_addr;
+ p = ((Elf32_Phdr *)(((char *)(e)) + e->e_phoff));
+ offset = ((unsigned long)(lm->l_addr));
+ for( i = 0; i < (int)(e->e_phnum); ((i++),(p++)) ) {
+ switch( p->p_type ) {
+ case PT_LOAD:
+ {
+ if( !(p->p_flags & PF_W) ) break;
+ start = ((char *)(p->p_vaddr)) + offset;
+ GC_add_roots_inner(
+ start,
+ start + p->p_memsz,
+ TRUE
+ );
+ }
+ break;
+ default:
+ break;
+ }
+ }
+# endif
+ }
+# ifdef SUNOS4
+ {
+ static ptr_t common_start = 0;
+ ptr_t common_end;
+ extern ptr_t GC_find_limit();
+
+ if (common_start == 0) common_start = GC_first_common();
+ if (common_start != 0) {
+ common_end = GC_find_limit(common_start, TRUE);
+ GC_add_roots_inner((char *)common_start, (char *)common_end, TRUE);
+ }
+ }
+# endif
+}
+
+# endif /* !USE_PROC ... */
+# endif /* SUNOS */
+
+#if defined(LINUX) && defined(__ELF__) || defined(SCO_ELF)
+
+/* Dynamic loading code for Linux running ELF. Somewhat tested on
+ * Linux/x86, untested but hopefully should work on Linux/Alpha.
+ * This code was derived from the Solaris/ELF support. Thanks to
+ * whatever kind soul wrote that. - Patrick Bridges */
+
+#include <elf.h>
+#include <link.h>
+
+/* Newer versions of Linux/Alpha and Linux/x86 define this macro. We
+ * define it for those older versions that don't. */
+# ifndef ElfW
+# if !defined(ELF_CLASS) || ELF_CLASS == ELFCLASS32
+# define ElfW(type) Elf32_##type
+# else
+# define ElfW(type) Elf64_##type
+# endif
+# endif
+
+static struct link_map *
+GC_FirstDLOpenedLinkMap()
+{
+#ifdef __GNUC__
+ /* On some Linux systems, `_DYNAMIC' will not be defined when a
+ static link is done. */
+# pragma weak _DYNAMIC
+#endif
+ extern ElfW(Dyn) _DYNAMIC[];
+ ElfW(Dyn) *dp;
+ struct r_debug *r;
+ static struct link_map *cachedResult = 0;
+
+ if( _DYNAMIC == 0) {
+ return(0);
+ }
+ if( cachedResult == 0 ) {
+ int tag;
+ for( dp = _DYNAMIC; (tag = dp->d_tag) != 0; dp++ ) {
+ if( tag == DT_DEBUG ) {
+ struct link_map *lm
+ = ((struct r_debug *)(dp->d_un.d_ptr))->r_map;
+ if( lm != 0 ) cachedResult = lm->l_next; /* might be NIL */
+ break;
+ }
+ }
+ }
+ return cachedResult;
+}
+
+
+void GC_register_dynamic_libraries()
+{
+ struct link_map *lm = GC_FirstDLOpenedLinkMap();
+
+
+ for (lm = GC_FirstDLOpenedLinkMap();
+ lm != (struct link_map *) 0; lm = lm->l_next)
+ {
+ ElfW(Ehdr) * e;
+ ElfW(Phdr) * p;
+ unsigned long offset;
+ char * start;
+ register int i;
+
+ e = (ElfW(Ehdr) *) lm->l_addr;
+ p = ((ElfW(Phdr) *)(((char *)(e)) + e->e_phoff));
+ offset = ((unsigned long)(lm->l_addr));
+ for( i = 0; i < (int)(e->e_phnum); ((i++),(p++)) ) {
+ switch( p->p_type ) {
+ case PT_LOAD:
+ {
+ if( !(p->p_flags & PF_W) ) break;
+ start = ((char *)(p->p_vaddr)) + offset;
+ GC_add_roots_inner(start, start + p->p_memsz, TRUE);
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ }
+}
+
+#endif
+
+#if defined(IRIX5) || defined(USE_PROC_FOR_LIBRARIES)
+
+#include <sys/procfs.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <elf.h>
+#include <errno.h>
+
+extern void * GC_roots_present();
+
+extern ptr_t GC_scratch_last_end_ptr; /* End of GC_scratch_alloc arena */
+
+/* We use /proc to track down all parts of the address space that are */
+/* mapped by the process, and throw out regions we know we shouldn't */
+/* worry about. This may also work under other SVR4 variants. */
+void GC_register_dynamic_libraries()
+{
+ static int fd = -1;
+ char buf[30];
+ static prmap_t * addr_map = 0;
+ static int current_sz = 0; /* Number of records currently in addr_map */
+ static int needed_sz; /* Required size of addr_map */
+ register int i;
+ register long flags;
+ register ptr_t start;
+ register ptr_t limit;
+ ptr_t heap_start = (ptr_t)HEAP_START;
+ ptr_t heap_end = heap_start;
+
+# ifdef SUNOS5DL
+# define MA_PHYS 0
+# endif /* SUNOS5DL */
+
+ if (fd < 0) {
+ sprintf(buf, "/proc/%d", getpid());
+ fd = open(buf, O_RDONLY);
+ if (fd < 0) {
+ ABORT("/proc open failed");
+ }
+ }
+ if (ioctl(fd, PIOCNMAP, &needed_sz) < 0) {
+ GC_err_printf2("fd = %d, errno = %d\n", fd, errno);
+ ABORT("/proc PIOCNMAP ioctl failed");
+ }
+ if (needed_sz >= current_sz) {
+ current_sz = needed_sz * 2 + 1;
+ /* Expansion, plus room for 0 record */
+ addr_map = (prmap_t *)GC_scratch_alloc(current_sz * sizeof(prmap_t));
+ }
+ if (ioctl(fd, PIOCMAP, addr_map) < 0) {
+ GC_err_printf4("fd = %d, errno = %d, needed_sz = %d, addr_map = 0x%X\n",
+ fd, errno, needed_sz, addr_map);
+ ABORT("/proc PIOCMAP ioctl failed");
+ };
+ if (GC_n_heap_sects > 0) {
+ heap_end = GC_heap_sects[GC_n_heap_sects-1].hs_start
+ + GC_heap_sects[GC_n_heap_sects-1].hs_bytes;
+ if (heap_end < GC_scratch_last_end_ptr) heap_end = GC_scratch_last_end_ptr;
+ }
+ for (i = 0; i < needed_sz; i++) {
+ flags = addr_map[i].pr_mflags;
+ if ((flags & (MA_BREAK | MA_STACK | MA_PHYS)) != 0) goto irrelevant;
+ if ((flags & (MA_READ | MA_WRITE)) != (MA_READ | MA_WRITE))
+ goto irrelevant;
+ /* The latter test is empirically useless. Other than the */
+ /* main data and stack segments, everything appears to be */
+ /* mapped readable, writable, executable, and shared(!!). */
+ /* This makes no sense to me. - HB */
+ start = (ptr_t)(addr_map[i].pr_vaddr);
+ if (GC_roots_present(start)) goto irrelevant;
+ if (start < heap_end && start >= heap_start)
+ goto irrelevant;
+# ifdef MMAP_STACKS
+ if (GC_is_thread_stack(start)) goto irrelevant;
+# endif /* MMAP_STACKS */
+
+ limit = start + addr_map[i].pr_size;
+ if (addr_map[i].pr_off == 0 && strncmp(start, ELFMAG, 4) == 0) {
+ /* Discard text segments, i.e. 0-offset mappings against */
+ /* executable files which appear to have ELF headers. */
+ caddr_t arg;
+ int obj;
+# define MAP_IRR_SZ 10
+ static ptr_t map_irr[MAP_IRR_SZ];
+ /* Known irrelevant map entries */
+ static int n_irr = 0;
+ struct stat buf;
+ register int i;
+
+ for (i = 0; i < n_irr; i++) {
+ if (map_irr[i] == start) goto irrelevant;
+ }
+ arg = (caddr_t)start;
+ obj = ioctl(fd, PIOCOPENM, &arg);
+ if (obj >= 0) {
+ fstat(obj, &buf);
+ close(obj);
+ if ((buf.st_mode & 0111) != 0) {
+ if (n_irr < MAP_IRR_SZ) {
+ map_irr[n_irr++] = start;
+ }
+ goto irrelevant;
+ }
+ }
+ }
+ GC_add_roots_inner(start, limit, TRUE);
+ irrelevant: ;
+ }
+ /* Dont keep cached descriptor, for now. Some kernels don't like us */
+ /* to keep a /proc file descriptor around during kill -9. */
+ if (close(fd) < 0) ABORT("Couldnt close /proc file");
+ fd = -1;
+}
+
+# endif /* USE_PROC || IRIX5 */
+
+# ifdef MSWIN32
+
+# define WIN32_LEAN_AND_MEAN
+# define NOSERVICE
+# include <windows.h>
+# include <stdlib.h>
+
+ /* We traverse the entire address space and register all segments */
+ /* that could possibly have been written to. */
+ DWORD GC_allocation_granularity;
+
+ extern GC_bool GC_is_heap_base (ptr_t p);
+
+# ifdef WIN32_THREADS
+ extern void GC_get_next_stack(char *start, char **lo, char **hi);
+# endif
+
+ void GC_cond_add_roots(char *base, char * limit)
+ {
+ char dummy;
+ char * stack_top
+ = (char *) ((word)(&dummy) & ~(GC_allocation_granularity-1));
+ if (base == limit) return;
+# ifdef WIN32_THREADS
+ {
+ char * curr_base = base;
+ char * next_stack_lo;
+ char * next_stack_hi;
+
+ for(;;) {
+ GC_get_next_stack(curr_base, &next_stack_lo, &next_stack_hi);
+ if (next_stack_lo >= limit) break;
+ GC_add_roots_inner(curr_base, next_stack_lo, TRUE);
+ curr_base = next_stack_hi;
+ }
+ if (curr_base < limit) GC_add_roots_inner(curr_base, limit, TRUE);
+ }
+# else
+ if (limit > stack_top && base < GC_stackbottom) {
+ /* Part of the stack; ignore it. */
+ return;
+ }
+ GC_add_roots_inner(base, limit, TRUE);
+# endif
+ }
+
+ extern GC_bool GC_win32s;
+
+ void GC_register_dynamic_libraries()
+ {
+ MEMORY_BASIC_INFORMATION buf;
+ SYSTEM_INFO sysinfo;
+ DWORD result;
+ DWORD protect;
+ LPVOID p;
+ char * base;
+ char * limit, * new_limit;
+
+ if (GC_win32s) return;
+ GetSystemInfo(&sysinfo);
+ base = limit = p = sysinfo.lpMinimumApplicationAddress;
+ GC_allocation_granularity = sysinfo.dwAllocationGranularity;
+ while (p < sysinfo.lpMaximumApplicationAddress) {
+ result = VirtualQuery(p, &buf, sizeof(buf));
+ if (result != sizeof(buf)) {
+ ABORT("Weird VirtualQuery result");
+ }
+ new_limit = (char *)p + buf.RegionSize;
+ protect = buf.Protect;
+ if (buf.State == MEM_COMMIT
+ && (protect == PAGE_EXECUTE_READWRITE
+ || protect == PAGE_READWRITE)
+ && !GC_is_heap_base(buf.AllocationBase)) {
+ if ((char *)p == limit) {
+ limit = new_limit;
+ } else {
+ GC_cond_add_roots(base, limit);
+ base = p;
+ limit = new_limit;
+ }
+ }
+ if (p > (LPVOID)new_limit /* overflow */) break;
+ p = (LPVOID)new_limit;
+ }
+ GC_cond_add_roots(base, limit);
+ }
+
+#endif /* MSWIN32 */
+
+#if defined(ALPHA) && defined(OSF1)
+
+#include <loader.h>
+
+void GC_register_dynamic_libraries()
+{
+ int status;
+ ldr_process_t mypid;
+
+ /* module */
+ ldr_module_t moduleid = LDR_NULL_MODULE;
+ ldr_module_info_t moduleinfo;
+ size_t moduleinfosize = sizeof(moduleinfo);
+ size_t modulereturnsize;
+
+ /* region */
+ ldr_region_t region;
+ ldr_region_info_t regioninfo;
+ size_t regioninfosize = sizeof(regioninfo);
+ size_t regionreturnsize;
+
+ /* Obtain id of this process */
+ mypid = ldr_my_process();
+
+ /* For each module */
+ while (TRUE) {
+
+ /* Get the next (first) module */
+ status = ldr_next_module(mypid, &moduleid);
+
+ /* Any more modules? */
+ if (moduleid == LDR_NULL_MODULE)
+ break; /* No more modules */
+
+ /* Check status AFTER checking moduleid because */
+ /* of a bug in the non-shared ldr_next_module stub */
+ if (status != 0 ) {
+ GC_printf1("dynamic_load: status = %ld\n", (long)status);
+ {
+ extern char *sys_errlist[];
+ extern int sys_nerr;
+ extern int errno;
+ if (errno <= sys_nerr) {
+ GC_printf1("dynamic_load: %s\n", (long)sys_errlist[errno]);
+ } else {
+ GC_printf1("dynamic_load: %d\n", (long)errno);
+ }
+ }
+ ABORT("ldr_next_module failed");
+ }
+
+ /* Get the module information */
+ status = ldr_inq_module(mypid, moduleid, &moduleinfo,
+ moduleinfosize, &modulereturnsize);
+ if (status != 0 )
+ ABORT("ldr_inq_module failed");
+
+ /* is module for the main program (i.e. nonshared portion)? */
+ if (moduleinfo.lmi_flags & LDR_MAIN)
+ continue; /* skip the main module */
+
+# ifdef VERBOSE
+ GC_printf("---Module---\n");
+ GC_printf("Module ID = %16ld\n", moduleinfo.lmi_modid);
+ GC_printf("Count of regions = %16d\n", moduleinfo.lmi_nregion);
+ GC_printf("flags for module = %16lx\n", moduleinfo.lmi_flags);
+ GC_printf("pathname of module = \"%s\"\n", moduleinfo.lmi_name);
+# endif
+
+ /* For each region in this module */
+ for (region = 0; region < moduleinfo.lmi_nregion; region++) {
+
+ /* Get the region information */
+ status = ldr_inq_region(mypid, moduleid, region, &regioninfo,
+ regioninfosize, &regionreturnsize);
+ if (status != 0 )
+ ABORT("ldr_inq_region failed");
+
+ /* only process writable (data) regions */
+ if (! (regioninfo.lri_prot & LDR_W))
+ continue;
+
+# ifdef VERBOSE
+ GC_printf("--- Region ---\n");
+ GC_printf("Region number = %16ld\n",
+ regioninfo.lri_region_no);
+ GC_printf("Protection flags = %016x\n", regioninfo.lri_prot);
+ GC_printf("Virtual address = %16p\n", regioninfo.lri_vaddr);
+ GC_printf("Mapped address = %16p\n", regioninfo.lri_mapaddr);
+ GC_printf("Region size = %16ld\n", regioninfo.lri_size);
+ GC_printf("Region name = \"%s\"\n", regioninfo.lri_name);
+# endif
+
+ /* register region as a garbage collection root */
+ GC_add_roots_inner (
+ (char *)regioninfo.lri_mapaddr,
+ (char *)regioninfo.lri_mapaddr + regioninfo.lri_size,
+ TRUE);
+
+ }
+ }
+}
+#endif
+
+#if defined(HP_PA)
+
+#include <errno.h>
+#include <dl.h>
+
+extern int errno;
+extern char *sys_errlist[];
+extern int sys_nerr;
+
+void GC_register_dynamic_libraries()
+{
+ int status;
+ int index = 1; /* Ordinal position in shared library search list */
+ struct shl_descriptor *shl_desc; /* Shared library info, see dl.h */
+
+ /* For each dynamic library loaded */
+ while (TRUE) {
+
+ /* Get info about next shared library */
+ status = shl_get(index, &shl_desc);
+
+ /* Check if this is the end of the list or if some error occured */
+ if (status != 0) {
+ if (errno == EINVAL) {
+ break; /* Moved past end of shared library list --> finished */
+ } else {
+ if (errno <= sys_nerr) {
+ GC_printf1("dynamic_load: %s\n", (long) sys_errlist[errno]);
+ } else {
+ GC_printf1("dynamic_load: %d\n", (long) errno);
+ }
+ ABORT("shl_get failed");
+ }
+ }
+
+# ifdef VERBOSE
+ GC_printf0("---Shared library---\n");
+ GC_printf1("\tfilename = \"%s\"\n", shl_desc->filename);
+ GC_printf1("\tindex = %d\n", index);
+ GC_printf1("\thandle = %08x\n",
+ (unsigned long) shl_desc->handle);
+ GC_printf1("\ttext seg. start = %08x\n", shl_desc->tstart);
+ GC_printf1("\ttext seg. end = %08x\n", shl_desc->tend);
+ GC_printf1("\tdata seg. start = %08x\n", shl_desc->dstart);
+ GC_printf1("\tdata seg. end = %08x\n", shl_desc->dend);
+ GC_printf1("\tref. count = %lu\n", shl_desc->ref_count);
+# endif
+
+ /* register shared library's data segment as a garbage collection root */
+ GC_add_roots_inner((char *) shl_desc->dstart,
+ (char *) shl_desc->dend, TRUE);
+
+ index++;
+ }
+}
+#endif /* HP_PA */
+
+#ifdef RS6000
+#pragma alloca
+#include <sys/ldr.h>
+#include <sys/errno.h>
+void GC_register_dynamic_libraries()
+{
+ int len;
+ char *ldibuf;
+ int ldibuflen;
+ struct ld_info *ldi;
+
+ ldibuf = alloca(ldibuflen = 8192);
+
+ while ( (len = loadquery(L_GETINFO,ldibuf,ldibuflen)) < 0) {
+ if (errno != ENOMEM) {
+ ABORT("loadquery failed");
+ }
+ ldibuf = alloca(ldibuflen *= 2);
+ }
+
+ ldi = (struct ld_info *)ldibuf;
+ while (ldi) {
+ len = ldi->ldinfo_next;
+ GC_add_roots_inner(
+ ldi->ldinfo_dataorg,
+ (unsigned long)ldi->ldinfo_dataorg
+ + ldi->ldinfo_datasize,
+ TRUE);
+ ldi = len ? (struct ld_info *)((char *)ldi + len) : 0;
+ }
+}
+#endif /* RS6000 */
+
+
+
+#else /* !DYNAMIC_LOADING */
+
+#ifdef PCR
+
+# include "il/PCR_IL.h"
+# include "th/PCR_ThCtl.h"
+# include "mm/PCR_MM.h"
+
+void GC_register_dynamic_libraries()
+{
+ /* Add new static data areas of dynamically loaded modules. */
+ {
+ PCR_IL_LoadedFile * p = PCR_IL_GetLastLoadedFile();
+ PCR_IL_LoadedSegment * q;
+
+ /* Skip uncommited files */
+ while (p != NIL && !(p -> lf_commitPoint)) {
+ /* The loading of this file has not yet been committed */
+ /* Hence its description could be inconsistent. */
+ /* Furthermore, it hasn't yet been run. Hence its data */
+ /* segments can't possibly reference heap allocated */
+ /* objects. */
+ p = p -> lf_prev;
+ }
+ for (; p != NIL; p = p -> lf_prev) {
+ for (q = p -> lf_ls; q != NIL; q = q -> ls_next) {
+ if ((q -> ls_flags & PCR_IL_SegFlags_Traced_MASK)
+ == PCR_IL_SegFlags_Traced_on) {
+ GC_add_roots_inner
+ ((char *)(q -> ls_addr),
+ (char *)(q -> ls_addr) + q -> ls_bytes,
+ TRUE);
+ }
+ }
+ }
+ }
+}
+
+
+#else /* !PCR */
+
+void GC_register_dynamic_libraries(){}
+
+int GC_no_dynamic_loading;
+
+#endif /* !PCR */
+#endif /* !DYNAMIC_LOADING */
diff --git a/boehm-gc/finalize.c b/boehm-gc/finalize.c
new file mode 100644
index 00000000000..d825bf91a36
--- /dev/null
+++ b/boehm-gc/finalize.c
@@ -0,0 +1,734 @@
+/*
+ * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+ * Copyright (c) 1991-1996 by Xerox Corporation. All rights reserved.
+
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+/* Boehm, February 1, 1996 1:19 pm PST */
+# define I_HIDE_POINTERS
+# include "gc_priv.h"
+# include "gc_mark.h"
+
+/* Type of mark procedure used for marking from finalizable object. */
+/* This procedure normally does not mark the object, only its */
+/* descendents. */
+typedef void finalization_mark_proc(/* ptr_t finalizable_obj_ptr */);
+
+# define HASH3(addr,size,log_size) \
+ ((((word)(addr) >> 3) ^ ((word)(addr) >> (3+(log_size)))) \
+ & ((size) - 1))
+#define HASH2(addr,log_size) HASH3(addr, 1 << log_size, log_size)
+
+struct hash_chain_entry {
+ word hidden_key;
+ struct hash_chain_entry * next;
+};
+
+unsigned GC_finalization_failures = 0;
+ /* Number of finalization requests that failed for lack of memory. */
+
+static struct disappearing_link {
+ struct hash_chain_entry prolog;
+# define dl_hidden_link prolog.hidden_key
+ /* Field to be cleared. */
+# define dl_next(x) (struct disappearing_link *)((x) -> prolog.next)
+# define dl_set_next(x,y) (x) -> prolog.next = (struct hash_chain_entry *)(y)
+
+ word dl_hidden_obj; /* Pointer to object base */
+} **dl_head = 0;
+
+static signed_word log_dl_table_size = -1;
+ /* Binary log of */
+ /* current size of array pointed to by dl_head. */
+ /* -1 ==> size is 0. */
+
+word GC_dl_entries = 0; /* Number of entries currently in disappearing */
+ /* link table. */
+
+static struct finalizable_object {
+ struct hash_chain_entry prolog;
+# define fo_hidden_base prolog.hidden_key
+ /* Pointer to object base. */
+ /* No longer hidden once object */
+ /* is on finalize_now queue. */
+# define fo_next(x) (struct finalizable_object *)((x) -> prolog.next)
+# define fo_set_next(x,y) (x) -> prolog.next = (struct hash_chain_entry *)(y)
+ GC_finalization_proc fo_fn; /* Finalizer. */
+ ptr_t fo_client_data;
+ word fo_object_size; /* In bytes. */
+ finalization_mark_proc * fo_mark_proc; /* Mark-through procedure */
+} **fo_head = 0;
+
+struct finalizable_object * GC_finalize_now = 0;
+ /* LIst of objects that should be finalized now. */
+
+static signed_word log_fo_table_size = -1;
+
+word GC_fo_entries = 0;
+
+# ifdef SRC_M3
+void GC_push_finalizer_structures()
+{
+ GC_push_all((ptr_t)(&dl_head), (ptr_t)(&dl_head) + sizeof(word));
+ GC_push_all((ptr_t)(&fo_head), (ptr_t)(&fo_head) + sizeof(word));
+}
+# endif
+
+/* Double the size of a hash table. *size_ptr is the log of its current */
+/* size. May be a noop. */
+/* *table is a pointer to an array of hash headers. If we succeed, we */
+/* update both *table and *log_size_ptr. */
+/* Lock is held. Signals are disabled. */
+void GC_grow_table(table, log_size_ptr)
+struct hash_chain_entry ***table;
+signed_word * log_size_ptr;
+{
+ register word i;
+ register struct hash_chain_entry *p;
+ int log_old_size = *log_size_ptr;
+ register int log_new_size = log_old_size + 1;
+ word old_size = ((log_old_size == -1)? 0: (1 << log_old_size));
+ register word new_size = 1 << log_new_size;
+ struct hash_chain_entry **new_table = (struct hash_chain_entry **)
+ GC_generic_malloc_inner_ignore_off_page(
+ (size_t)new_size * sizeof(struct hash_chain_entry *), NORMAL);
+
+ if (new_table == 0) {
+ if (table == 0) {
+ ABORT("Insufficient space for initial table allocation");
+ } else {
+ return;
+ }
+ }
+ for (i = 0; i < old_size; i++) {
+ p = (*table)[i];
+ while (p != 0) {
+ register ptr_t real_key = (ptr_t)REVEAL_POINTER(p -> hidden_key);
+ register struct hash_chain_entry *next = p -> next;
+ register int new_hash = HASH3(real_key, new_size, log_new_size);
+
+ p -> next = new_table[new_hash];
+ new_table[new_hash] = p;
+ p = next;
+ }
+ }
+ *log_size_ptr = log_new_size;
+ *table = new_table;
+}
+
+# if defined(__STDC__) || defined(__cplusplus)
+ int GC_register_disappearing_link(GC_PTR * link)
+# else
+ int GC_register_disappearing_link(link)
+ GC_PTR * link;
+# endif
+{
+ ptr_t base;
+
+ base = (ptr_t)GC_base((GC_PTR)link);
+ if (base == 0)
+ ABORT("Bad arg to GC_register_disappearing_link");
+ return(GC_general_register_disappearing_link(link, base));
+}
+
+# if defined(__STDC__) || defined(__cplusplus)
+ int GC_general_register_disappearing_link(GC_PTR * link,
+ GC_PTR obj)
+# else
+ int GC_general_register_disappearing_link(link, obj)
+ GC_PTR * link;
+ GC_PTR obj;
+# endif
+
+{
+ struct disappearing_link *curr_dl;
+ int index;
+ struct disappearing_link * new_dl;
+ DCL_LOCK_STATE;
+
+ if ((word)link & (ALIGNMENT-1))
+ ABORT("Bad arg to GC_general_register_disappearing_link");
+# ifdef THREADS
+ DISABLE_SIGNALS();
+ LOCK();
+# endif
+ if (log_dl_table_size == -1
+ || GC_dl_entries > ((word)1 << log_dl_table_size)) {
+# ifndef THREADS
+ DISABLE_SIGNALS();
+# endif
+ GC_grow_table((struct hash_chain_entry ***)(&dl_head),
+ &log_dl_table_size);
+# ifdef PRINTSTATS
+ GC_printf1("Grew dl table to %lu entries\n",
+ (unsigned long)(1 << log_dl_table_size));
+# endif
+# ifndef THREADS
+ ENABLE_SIGNALS();
+# endif
+ }
+ index = HASH2(link, log_dl_table_size);
+ curr_dl = dl_head[index];
+ for (curr_dl = dl_head[index]; curr_dl != 0; curr_dl = dl_next(curr_dl)) {
+ if (curr_dl -> dl_hidden_link == HIDE_POINTER(link)) {
+ curr_dl -> dl_hidden_obj = HIDE_POINTER(obj);
+# ifdef THREADS
+ UNLOCK();
+ ENABLE_SIGNALS();
+# endif
+ return(1);
+ }
+ }
+# ifdef THREADS
+ new_dl = (struct disappearing_link *)
+ GC_generic_malloc_inner(sizeof(struct disappearing_link),NORMAL);
+# else
+ new_dl = (struct disappearing_link *)
+ GC_malloc(sizeof(struct disappearing_link));
+# endif
+ if (new_dl != 0) {
+ new_dl -> dl_hidden_obj = HIDE_POINTER(obj);
+ new_dl -> dl_hidden_link = HIDE_POINTER(link);
+ dl_set_next(new_dl, dl_head[index]);
+ dl_head[index] = new_dl;
+ GC_dl_entries++;
+ } else {
+ GC_finalization_failures++;
+ }
+# ifdef THREADS
+ UNLOCK();
+ ENABLE_SIGNALS();
+# endif
+ return(0);
+}
+
+# if defined(__STDC__) || defined(__cplusplus)
+ int GC_unregister_disappearing_link(GC_PTR * link)
+# else
+ int GC_unregister_disappearing_link(link)
+ GC_PTR * link;
+# endif
+{
+ struct disappearing_link *curr_dl, *prev_dl;
+ int index;
+ DCL_LOCK_STATE;
+
+ DISABLE_SIGNALS();
+ LOCK();
+ index = HASH2(link, log_dl_table_size);
+ if (((unsigned long)link & (ALIGNMENT-1))) goto out;
+ prev_dl = 0; curr_dl = dl_head[index];
+ while (curr_dl != 0) {
+ if (curr_dl -> dl_hidden_link == HIDE_POINTER(link)) {
+ if (prev_dl == 0) {
+ dl_head[index] = dl_next(curr_dl);
+ } else {
+ dl_set_next(prev_dl, dl_next(curr_dl));
+ }
+ GC_dl_entries--;
+ UNLOCK();
+ ENABLE_SIGNALS();
+ GC_free((GC_PTR)curr_dl);
+ return(1);
+ }
+ prev_dl = curr_dl;
+ curr_dl = dl_next(curr_dl);
+ }
+out:
+ UNLOCK();
+ ENABLE_SIGNALS();
+ return(0);
+}
+
+/* Possible finalization_marker procedures. Note that mark stack */
+/* overflow is handled by the caller, and is not a disaster. */
+void GC_normal_finalize_mark_proc(p)
+ptr_t p;
+{
+ hdr * hhdr = HDR(p);
+
+ PUSH_OBJ((word *)p, hhdr, GC_mark_stack_top,
+ &(GC_mark_stack[GC_mark_stack_size]));
+}
+
+/* This only pays very partial attention to the mark descriptor. */
+/* It does the right thing for normal and atomic objects, and treats */
+/* most others as normal. */
+void GC_ignore_self_finalize_mark_proc(p)
+ptr_t p;
+{
+ hdr * hhdr = HDR(p);
+ word descr = hhdr -> hb_descr;
+ ptr_t q, r;
+ ptr_t scan_limit;
+ ptr_t target_limit = p + WORDS_TO_BYTES(hhdr -> hb_sz) - 1;
+
+ if ((descr & DS_TAGS) == DS_LENGTH) {
+ scan_limit = p + descr - sizeof(word);
+ } else {
+ scan_limit = target_limit + 1 - sizeof(word);
+ }
+ for (q = p; q <= scan_limit; q += ALIGNMENT) {
+ r = *(ptr_t *)q;
+ if (r < p || r > target_limit) {
+ GC_PUSH_ONE_HEAP((word)r);
+ }
+ }
+}
+
+/*ARGSUSED*/
+void GC_null_finalize_mark_proc(p)
+ptr_t p;
+{
+}
+
+
+
+/* Register a finalization function. See gc.h for details. */
+/* in the nonthreads case, we try to avoid disabling signals, */
+/* since it can be expensive. Threads packages typically */
+/* make it cheaper. */
+void GC_register_finalizer_inner(obj, fn, cd, ofn, ocd, mp)
+GC_PTR obj;
+GC_finalization_proc fn;
+GC_PTR cd;
+GC_finalization_proc * ofn;
+GC_PTR * ocd;
+finalization_mark_proc * mp;
+{
+ ptr_t base;
+ struct finalizable_object * curr_fo, * prev_fo;
+ int index;
+ struct finalizable_object *new_fo;
+ DCL_LOCK_STATE;
+
+# ifdef THREADS
+ DISABLE_SIGNALS();
+ LOCK();
+# endif
+ if (log_fo_table_size == -1
+ || GC_fo_entries > ((word)1 << log_fo_table_size)) {
+# ifndef THREADS
+ DISABLE_SIGNALS();
+# endif
+ GC_grow_table((struct hash_chain_entry ***)(&fo_head),
+ &log_fo_table_size);
+# ifdef PRINTSTATS
+ GC_printf1("Grew fo table to %lu entries\n",
+ (unsigned long)(1 << log_fo_table_size));
+# endif
+# ifndef THREADS
+ ENABLE_SIGNALS();
+# endif
+ }
+ /* in the THREADS case signals are disabled and we hold allocation */
+ /* lock; otherwise neither is true. Proceed carefully. */
+ base = (ptr_t)obj;
+ index = HASH2(base, log_fo_table_size);
+ prev_fo = 0; curr_fo = fo_head[index];
+ while (curr_fo != 0) {
+ if (curr_fo -> fo_hidden_base == HIDE_POINTER(base)) {
+ /* Interruption by a signal in the middle of this */
+ /* should be safe. The client may see only *ocd */
+ /* updated, but we'll declare that to be his */
+ /* problem. */
+ if (ocd) *ocd = (GC_PTR) curr_fo -> fo_client_data;
+ if (ofn) *ofn = curr_fo -> fo_fn;
+ /* Delete the structure for base. */
+ if (prev_fo == 0) {
+ fo_head[index] = fo_next(curr_fo);
+ } else {
+ fo_set_next(prev_fo, fo_next(curr_fo));
+ }
+ if (fn == 0) {
+ GC_fo_entries--;
+ /* May not happen if we get a signal. But a high */
+ /* estimate will only make the table larger than */
+ /* necessary. */
+# ifndef THREADS
+ GC_free((GC_PTR)curr_fo);
+# endif
+ } else {
+ curr_fo -> fo_fn = fn;
+ curr_fo -> fo_client_data = (ptr_t)cd;
+ curr_fo -> fo_mark_proc = mp;
+ /* Reinsert it. We deleted it first to maintain */
+ /* consistency in the event of a signal. */
+ if (prev_fo == 0) {
+ fo_head[index] = curr_fo;
+ } else {
+ fo_set_next(prev_fo, curr_fo);
+ }
+ }
+# ifdef THREADS
+ UNLOCK();
+ ENABLE_SIGNALS();
+# endif
+ return;
+ }
+ prev_fo = curr_fo;
+ curr_fo = fo_next(curr_fo);
+ }
+ if (ofn) *ofn = 0;
+ if (ocd) *ocd = 0;
+ if (fn == 0) {
+# ifdef THREADS
+ UNLOCK();
+ ENABLE_SIGNALS();
+# endif
+ return;
+ }
+# ifdef THREADS
+ new_fo = (struct finalizable_object *)
+ GC_generic_malloc_inner(sizeof(struct finalizable_object),NORMAL);
+# else
+ new_fo = (struct finalizable_object *)
+ GC_malloc(sizeof(struct finalizable_object));
+# endif
+ if (new_fo != 0) {
+ new_fo -> fo_hidden_base = (word)HIDE_POINTER(base);
+ new_fo -> fo_fn = fn;
+ new_fo -> fo_client_data = (ptr_t)cd;
+ new_fo -> fo_object_size = GC_size(base);
+ new_fo -> fo_mark_proc = mp;
+ fo_set_next(new_fo, fo_head[index]);
+ GC_fo_entries++;
+ fo_head[index] = new_fo;
+ } else {
+ GC_finalization_failures++;
+ }
+# ifdef THREADS
+ UNLOCK();
+ ENABLE_SIGNALS();
+# endif
+}
+
+# if defined(__STDC__)
+ void GC_register_finalizer(void * obj,
+ GC_finalization_proc fn, void * cd,
+ GC_finalization_proc *ofn, void ** ocd)
+# else
+ void GC_register_finalizer(obj, fn, cd, ofn, ocd)
+ GC_PTR obj;
+ GC_finalization_proc fn;
+ GC_PTR cd;
+ GC_finalization_proc * ofn;
+ GC_PTR * ocd;
+# endif
+{
+ GC_register_finalizer_inner(obj, fn, cd, ofn,
+ ocd, GC_normal_finalize_mark_proc);
+}
+
+# if defined(__STDC__)
+ void GC_register_finalizer_ignore_self(void * obj,
+ GC_finalization_proc fn, void * cd,
+ GC_finalization_proc *ofn, void ** ocd)
+# else
+ void GC_register_finalizer_ignore_self(obj, fn, cd, ofn, ocd)
+ GC_PTR obj;
+ GC_finalization_proc fn;
+ GC_PTR cd;
+ GC_finalization_proc * ofn;
+ GC_PTR * ocd;
+# endif
+{
+ GC_register_finalizer_inner(obj, fn, cd, ofn,
+ ocd, GC_ignore_self_finalize_mark_proc);
+}
+
+# if defined(__STDC__)
+ void GC_register_finalizer_no_order(void * obj,
+ GC_finalization_proc fn, void * cd,
+ GC_finalization_proc *ofn, void ** ocd)
+# else
+ void GC_register_finalizer_no_order(obj, fn, cd, ofn, ocd)
+ GC_PTR obj;
+ GC_finalization_proc fn;
+ GC_PTR cd;
+ GC_finalization_proc * ofn;
+ GC_PTR * ocd;
+# endif
+{
+ GC_register_finalizer_inner(obj, fn, cd, ofn,
+ ocd, GC_null_finalize_mark_proc);
+}
+
+/* Called with world stopped. Cause disappearing links to disappear, */
+/* and invoke finalizers. */
+void GC_finalize()
+{
+ struct disappearing_link * curr_dl, * prev_dl, * next_dl;
+ struct finalizable_object * curr_fo, * prev_fo, * next_fo;
+ ptr_t real_ptr, real_link;
+ register int i;
+ int dl_size = (log_dl_table_size == -1 ) ? 0 : (1 << log_dl_table_size);
+ int fo_size = (log_fo_table_size == -1 ) ? 0 : (1 << log_fo_table_size);
+
+ /* Make disappearing links disappear */
+ for (i = 0; i < dl_size; i++) {
+ curr_dl = dl_head[i];
+ prev_dl = 0;
+ while (curr_dl != 0) {
+ real_ptr = (ptr_t)REVEAL_POINTER(curr_dl -> dl_hidden_obj);
+ real_link = (ptr_t)REVEAL_POINTER(curr_dl -> dl_hidden_link);
+ if (!GC_is_marked(real_ptr)) {
+ *(word *)real_link = 0;
+ next_dl = dl_next(curr_dl);
+ if (prev_dl == 0) {
+ dl_head[i] = next_dl;
+ } else {
+ dl_set_next(prev_dl, next_dl);
+ }
+ GC_clear_mark_bit((ptr_t)curr_dl);
+ GC_dl_entries--;
+ curr_dl = next_dl;
+ } else {
+ prev_dl = curr_dl;
+ curr_dl = dl_next(curr_dl);
+ }
+ }
+ }
+ /* Mark all objects reachable via chains of 1 or more pointers */
+ /* from finalizable objects. */
+# ifdef PRINTSTATS
+ if (GC_mark_state != MS_NONE) ABORT("Bad mark state");
+# endif
+ for (i = 0; i < fo_size; i++) {
+ for (curr_fo = fo_head[i]; curr_fo != 0; curr_fo = fo_next(curr_fo)) {
+ real_ptr = (ptr_t)REVEAL_POINTER(curr_fo -> fo_hidden_base);
+ if (!GC_is_marked(real_ptr)) {
+ GC_MARK_FO(real_ptr, curr_fo -> fo_mark_proc);
+ if (GC_is_marked(real_ptr)) {
+ WARN("Finalization cycle involving %lx\n", real_ptr);
+ }
+ }
+ }
+ }
+ /* Enqueue for finalization all objects that are still */
+ /* unreachable. */
+ GC_words_finalized = 0;
+ for (i = 0; i < fo_size; i++) {
+ curr_fo = fo_head[i];
+ prev_fo = 0;
+ while (curr_fo != 0) {
+ real_ptr = (ptr_t)REVEAL_POINTER(curr_fo -> fo_hidden_base);
+ if (!GC_is_marked(real_ptr)) {
+# ifndef JAVA_FINALIZATION
+ GC_set_mark_bit(real_ptr);
+# endif
+ /* Delete from hash table */
+ next_fo = fo_next(curr_fo);
+ if (prev_fo == 0) {
+ fo_head[i] = next_fo;
+ } else {
+ fo_set_next(prev_fo, next_fo);
+ }
+ GC_fo_entries--;
+ /* Add to list of objects awaiting finalization. */
+ fo_set_next(curr_fo, GC_finalize_now);
+ GC_finalize_now = curr_fo;
+ /* unhide object pointer so any future collections will */
+ /* see it. */
+ curr_fo -> fo_hidden_base =
+ (word) REVEAL_POINTER(curr_fo -> fo_hidden_base);
+ GC_words_finalized +=
+ ALIGNED_WORDS(curr_fo -> fo_object_size)
+ + ALIGNED_WORDS(sizeof(struct finalizable_object));
+# ifdef PRINTSTATS
+ if (!GC_is_marked((ptr_t)curr_fo)) {
+ ABORT("GC_finalize: found accessible unmarked object\n");
+ }
+# endif
+ curr_fo = next_fo;
+ } else {
+ prev_fo = curr_fo;
+ curr_fo = fo_next(curr_fo);
+ }
+ }
+ }
+
+# ifdef JAVA_FINALIZATION
+ /* make sure we mark everything reachable from objects finalized
+ using the no_order mark_proc */
+ for (curr_fo = GC_finalize_now;
+ curr_fo != NULL; curr_fo = fo_next(curr_fo)) {
+ real_ptr = (ptr_t)curr_fo -> fo_hidden_base;
+ if (!GC_is_marked(real_ptr)) {
+ if (curr_fo -> fo_mark_proc == GC_null_finalize_mark_proc) {
+ GC_MARK_FO(real_ptr, GC_normal_finalize_mark_proc);
+ }
+ GC_set_mark_bit(real_ptr);
+ }
+ }
+# endif
+
+ /* Remove dangling disappearing links. */
+ for (i = 0; i < dl_size; i++) {
+ curr_dl = dl_head[i];
+ prev_dl = 0;
+ while (curr_dl != 0) {
+ real_link = GC_base((ptr_t)REVEAL_POINTER(curr_dl -> dl_hidden_link));
+ if (real_link != 0 && !GC_is_marked(real_link)) {
+ next_dl = dl_next(curr_dl);
+ if (prev_dl == 0) {
+ dl_head[i] = next_dl;
+ } else {
+ dl_set_next(prev_dl, next_dl);
+ }
+ GC_clear_mark_bit((ptr_t)curr_dl);
+ GC_dl_entries--;
+ curr_dl = next_dl;
+ } else {
+ prev_dl = curr_dl;
+ curr_dl = dl_next(curr_dl);
+ }
+ }
+ }
+}
+
+#ifdef JAVA_FINALIZATION
+
+/* Enqueue all remaining finalizers to be run - Assumes lock is
+ * held, and signals are disabled */
+void GC_enqueue_all_finalizers()
+{
+ struct finalizable_object * curr_fo, * prev_fo, * next_fo;
+ ptr_t real_ptr, real_link;
+ register int i;
+ int fo_size;
+
+ fo_size = (log_fo_table_size == -1 ) ? 0 : (1 << log_fo_table_size);
+ GC_words_finalized = 0;
+ for (i = 0; i < fo_size; i++) {
+ curr_fo = fo_head[i];
+ prev_fo = 0;
+ while (curr_fo != 0) {
+ real_ptr = (ptr_t)REVEAL_POINTER(curr_fo -> fo_hidden_base);
+ GC_MARK_FO(real_ptr, GC_normal_finalize_mark_proc);
+ GC_set_mark_bit(real_ptr);
+
+ /* Delete from hash table */
+ next_fo = fo_next(curr_fo);
+ if (prev_fo == 0) {
+ fo_head[i] = next_fo;
+ } else {
+ fo_set_next(prev_fo, next_fo);
+ }
+ GC_fo_entries--;
+
+ /* Add to list of objects awaiting finalization. */
+ fo_set_next(curr_fo, GC_finalize_now);
+ GC_finalize_now = curr_fo;
+
+ /* unhide object pointer so any future collections will */
+ /* see it. */
+ curr_fo -> fo_hidden_base =
+ (word) REVEAL_POINTER(curr_fo -> fo_hidden_base);
+
+ GC_words_finalized +=
+ ALIGNED_WORDS(curr_fo -> fo_object_size)
+ + ALIGNED_WORDS(sizeof(struct finalizable_object));
+ curr_fo = next_fo;
+ }
+ }
+
+ return;
+}
+
+/* Invoke all remaining finalizers that haven't yet been run.
+ * This is needed for strict compliance with the Java standard,
+ * which can make the runtime guarantee that all finalizers are run.
+ * Unfortunately, the Java standard implies we have to keep running
+ * finalizers until there are no more left, a potential infinite loop.
+ * YUCK. * This routine is externally callable, so is called without
+ * the allocation lock
+ */
+void GC_finalize_all()
+{
+ DCL_LOCK_STATE;
+
+ DISABLE_SIGNALS();
+ LOCK();
+ while (GC_fo_entries > 0) {
+ GC_enqueue_all_finalizers();
+ UNLOCK();
+ ENABLE_SIGNALS();
+ GC_INVOKE_FINALIZERS();
+ DISABLE_SIGNALS();
+ LOCK();
+ }
+ UNLOCK();
+ ENABLE_SIGNALS();
+}
+#endif
+
+/* Invoke finalizers for all objects that are ready to be finalized. */
+/* Should be called without allocation lock. */
+int GC_invoke_finalizers()
+{
+ register struct finalizable_object * curr_fo;
+ register int count = 0;
+ DCL_LOCK_STATE;
+
+ while (GC_finalize_now != 0) {
+# ifdef THREADS
+ DISABLE_SIGNALS();
+ LOCK();
+# endif
+ curr_fo = GC_finalize_now;
+# ifdef THREADS
+ if (curr_fo != 0) GC_finalize_now = fo_next(curr_fo);
+ UNLOCK();
+ ENABLE_SIGNALS();
+ if (curr_fo == 0) break;
+# else
+ GC_finalize_now = fo_next(curr_fo);
+# endif
+ fo_set_next(curr_fo, 0);
+ (*(curr_fo -> fo_fn))((ptr_t)(curr_fo -> fo_hidden_base),
+ curr_fo -> fo_client_data);
+ curr_fo -> fo_client_data = 0;
+ ++count;
+# ifdef UNDEFINED
+ /* This is probably a bad idea. It throws off accounting if */
+ /* nearly all objects are finalizable. O.w. it shouldn't */
+ /* matter. */
+ GC_free((GC_PTR)curr_fo);
+# endif
+ }
+ return count;
+}
+
+# ifdef __STDC__
+ GC_PTR GC_call_with_alloc_lock(GC_fn_type fn,
+ GC_PTR client_data)
+# else
+ GC_PTR GC_call_with_alloc_lock(fn, client_data)
+ GC_fn_type fn;
+ GC_PTR client_data;
+# endif
+{
+ GC_PTR result;
+ DCL_LOCK_STATE;
+
+# ifdef THREADS
+ DISABLE_SIGNALS();
+ LOCK();
+ SET_LOCK_HOLDER();
+# endif
+ result = (*fn)(client_data);
+# ifdef THREADS
+ UNSET_LOCK_HOLDER();
+ UNLOCK();
+ ENABLE_SIGNALS();
+# endif
+ return(result);
+}
diff --git a/boehm-gc/gc.h b/boehm-gc/gc.h
new file mode 100644
index 00000000000..a4d57e860d1
--- /dev/null
+++ b/boehm-gc/gc.h
@@ -0,0 +1,711 @@
+/*
+ * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+ * Copyright (c) 1991-1995 by Xerox Corporation. All rights reserved.
+ * Copyright 1996 by Silicon Graphics. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+/*
+ * Note that this defines a large number of tuning hooks, which can
+ * safely be ignored in nearly all cases. For normal use it suffices
+ * to call only GC_MALLOC and perhaps GC_REALLOC.
+ * For better performance, also look at GC_MALLOC_ATOMIC, and
+ * GC_enable_incremental. If you need an action to be performed
+ * immediately before an object is collected, look at GC_register_finalizer.
+ * If you are using Solaris threads, look at the end of this file.
+ * Everything else is best ignored unless you encounter performance
+ * problems.
+ */
+
+#ifndef _GC_H
+
+# define _GC_H
+# define __GC
+# include <stddef.h>
+
+#if defined(__CYGWIN32__) && defined(GC_USE_DLL)
+#include "libgc_globals.h"
+#endif
+
+#if defined(_MSC_VER) && defined(_DLL)
+#ifdef GC_BUILD
+#define GC_API __declspec(dllexport)
+#else
+#define GC_API __declspec(dllimport)
+#endif
+#endif
+
+#ifndef GC_API
+#define GC_API extern
+#endif
+
+# if defined(__STDC__) || defined(__cplusplus)
+# define GC_PROTO(args) args
+ typedef void * GC_PTR;
+# else
+# define GC_PROTO(args) ()
+ typedef char * GC_PTR;
+# endif
+
+# ifdef __cplusplus
+ extern "C" {
+# endif
+
+
+/* Define word and signed_word to be unsigned and signed types of the */
+/* size as char * or void *. There seems to be no way to do this */
+/* even semi-portably. The following is probably no better/worse */
+/* than almost anything else. */
+/* The ANSI standard suggests that size_t and ptr_diff_t might be */
+/* better choices. But those appear to have incorrect definitions */
+/* on may systems. Notably "typedef int size_t" seems to be both */
+/* frequent and WRONG. */
+typedef unsigned long GC_word;
+typedef long GC_signed_word;
+
+/* Public read-only variables */
+
+GC_API GC_word GC_gc_no;/* Counter incremented per collection. */
+ /* Includes empty GCs at startup. */
+
+
+/* Public R/W variables */
+
+GC_API GC_PTR (*GC_oom_fn) GC_PROTO((size_t bytes_requested));
+ /* When there is insufficient memory to satisfy */
+ /* an allocation request, we return */
+ /* (*GC_oom_fn)(). By default this just */
+ /* returns 0. */
+ /* If it returns, it must return 0 or a valid */
+ /* pointer to a previously allocated heap */
+ /* object. */
+
+GC_API int GC_quiet; /* Disable statistics output. Only matters if */
+ /* collector has been compiled with statistics */
+ /* enabled. This involves a performance cost, */
+ /* and is thus not the default. */
+
+GC_API int GC_dont_gc; /* Dont collect unless explicitly requested, e.g. */
+ /* because it's not safe. */
+
+GC_API int GC_dont_expand;
+ /* Dont expand heap unless explicitly requested */
+ /* or forced to. */
+
+GC_API int GC_full_freq; /* Number of partial collections between */
+ /* full collections. Matters only if */
+ /* GC_incremental is set. */
+
+GC_API GC_word GC_non_gc_bytes;
+ /* Bytes not considered candidates for collection. */
+ /* Used only to control scheduling of collections. */
+
+GC_API GC_word GC_free_space_divisor;
+ /* We try to make sure that we allocate at */
+ /* least N/GC_free_space_divisor bytes between */
+ /* collections, where N is the heap size plus */
+ /* a rough estimate of the root set size. */
+ /* Initially, GC_free_space_divisor = 4. */
+ /* Increasing its value will use less space */
+ /* but more collection time. Decreasing it */
+ /* will appreciably decrease collection time */
+ /* at the expense of space. */
+ /* GC_free_space_divisor = 1 will effectively */
+ /* disable collections. */
+
+GC_API GC_word GC_max_retries;
+ /* The maximum number of GCs attempted before */
+ /* reporting out of memory after heap */
+ /* expansion fails. Initially 0. */
+
+
+/* Public procedures */
+/*
+ * general purpose allocation routines, with roughly malloc calling conv.
+ * The atomic versions promise that no relevant pointers are contained
+ * in the object. The nonatomic versions guarantee that the new object
+ * is cleared. GC_malloc_stubborn promises that no changes to the object
+ * will occur after GC_end_stubborn_change has been called on the
+ * result of GC_malloc_stubborn. GC_malloc_uncollectable allocates an object
+ * that is scanned for pointers to collectable objects, but is not itself
+ * collectable. GC_malloc_uncollectable and GC_free called on the resulting
+ * object implicitly update GC_non_gc_bytes appropriately.
+ */
+GC_API GC_PTR GC_malloc GC_PROTO((size_t size_in_bytes));
+GC_API GC_PTR GC_malloc_atomic GC_PROTO((size_t size_in_bytes));
+GC_API GC_PTR GC_malloc_uncollectable GC_PROTO((size_t size_in_bytes));
+GC_API GC_PTR GC_malloc_stubborn GC_PROTO((size_t size_in_bytes));
+
+/* The following is only defined if the library has been suitably */
+/* compiled: */
+GC_API GC_PTR GC_malloc_atomic_uncollectable GC_PROTO((size_t size_in_bytes));
+
+/* Explicitly deallocate an object. Dangerous if used incorrectly. */
+/* Requires a pointer to the base of an object. */
+/* If the argument is stubborn, it should not be changeable when freed. */
+/* An object should not be enable for finalization when it is */
+/* explicitly deallocated. */
+/* GC_free(0) is a no-op, as required by ANSI C for free. */
+GC_API void GC_free GC_PROTO((GC_PTR object_addr));
+
+/*
+ * Stubborn objects may be changed only if the collector is explicitly informed.
+ * The collector is implicitly informed of coming change when such
+ * an object is first allocated. The following routines inform the
+ * collector that an object will no longer be changed, or that it will
+ * once again be changed. Only nonNIL pointer stores into the object
+ * are considered to be changes. The argument to GC_end_stubborn_change
+ * must be exacly the value returned by GC_malloc_stubborn or passed to
+ * GC_change_stubborn. (In the second case it may be an interior pointer
+ * within 512 bytes of the beginning of the objects.)
+ * There is a performance penalty for allowing more than
+ * one stubborn object to be changed at once, but it is acceptable to
+ * do so. The same applies to dropping stubborn objects that are still
+ * changeable.
+ */
+GC_API void GC_change_stubborn GC_PROTO((GC_PTR));
+GC_API void GC_end_stubborn_change GC_PROTO((GC_PTR));
+
+/* Return a pointer to the base (lowest address) of an object given */
+/* a pointer to a location within the object. */
+/* Return 0 if displaced_pointer doesn't point to within a valid */
+/* object. */
+GC_API GC_PTR GC_base GC_PROTO((GC_PTR displaced_pointer));
+
+/* Given a pointer to the base of an object, return its size in bytes. */
+/* The returned size may be slightly larger than what was originally */
+/* requested. */
+GC_API size_t GC_size GC_PROTO((GC_PTR object_addr));
+
+/* For compatibility with C library. This is occasionally faster than */
+/* a malloc followed by a bcopy. But if you rely on that, either here */
+/* or with the standard C library, your code is broken. In my */
+/* opinion, it shouldn't have been invented, but now we're stuck. -HB */
+/* The resulting object has the same kind as the original. */
+/* If the argument is stubborn, the result will have changes enabled. */
+/* It is an error to have changes enabled for the original object. */
+/* Follows ANSI comventions for NULL old_object. */
+GC_API GC_PTR GC_realloc GC_PROTO((GC_PTR old_object,
+ size_t new_size_in_bytes));
+
+/* Explicitly increase the heap size. */
+/* Returns 0 on failure, 1 on success. */
+GC_API int GC_expand_hp GC_PROTO((size_t number_of_bytes));
+
+/* Limit the heap size to n bytes. Useful when you're debugging, */
+/* especially on systems that don't handle running out of memory well. */
+/* n == 0 ==> unbounded. This is the default. */
+GC_API void GC_set_max_heap_size GC_PROTO((GC_word n));
+
+/* Inform the collector that a certain section of statically allocated */
+/* memory contains no pointers to garbage collected memory. Thus it */
+/* need not be scanned. This is sometimes important if the application */
+/* maps large read/write files into the address space, which could be */
+/* mistaken for dynamic library data segments on some systems. */
+GC_API void GC_exclude_static_roots GC_PROTO((GC_PTR start, GC_PTR finish));
+
+/* Clear the set of root segments. Wizards only. */
+GC_API void GC_clear_roots GC_PROTO((void));
+
+/* Add a root segment. Wizards only. */
+GC_API void GC_add_roots GC_PROTO((char * low_address,
+ char * high_address_plus_1));
+
+/* Add a displacement to the set of those considered valid by the */
+/* collector. GC_register_displacement(n) means that if p was returned */
+/* by GC_malloc, then (char *)p + n will be considered to be a valid */
+/* pointer to n. N must be small and less than the size of p. */
+/* (All pointers to the interior of objects from the stack are */
+/* considered valid in any case. This applies to heap objects and */
+/* static data.) */
+/* Preferably, this should be called before any other GC procedures. */
+/* Calling it later adds to the probability of excess memory */
+/* retention. */
+/* This is a no-op if the collector was compiled with recognition of */
+/* arbitrary interior pointers enabled, which is now the default. */
+GC_API void GC_register_displacement GC_PROTO((GC_word n));
+
+/* The following version should be used if any debugging allocation is */
+/* being done. */
+GC_API void GC_debug_register_displacement GC_PROTO((GC_word n));
+
+/* Explicitly trigger a full, world-stop collection. */
+GC_API void GC_gcollect GC_PROTO((void));
+
+/* Trigger a full world-stopped collection. Abort the collection if */
+/* and when stop_func returns a nonzero value. Stop_func will be */
+/* called frequently, and should be reasonably fast. This works even */
+/* if virtual dirty bits, and hence incremental collection is not */
+/* available for this architecture. Collections can be aborted faster */
+/* than normal pause times for incremental collection. However, */
+/* aborted collections do no useful work; the next collection needs */
+/* to start from the beginning. */
+typedef int (* GC_stop_func) GC_PROTO((void));
+GC_API int GC_try_to_collect GC_PROTO((GC_stop_func stop_func));
+
+/* Return the number of bytes in the heap. Excludes collector private */
+/* data structures. Includes empty blocks and fragmentation loss. */
+/* Includes some pages that were allocated but never written. */
+GC_API size_t GC_get_heap_size GC_PROTO((void));
+
+/* Return the number of bytes allocated since the last collection. */
+GC_API size_t GC_get_bytes_since_gc GC_PROTO((void));
+
+/* Enable incremental/generational collection. */
+/* Not advisable unless dirty bits are */
+/* available or most heap objects are */
+/* pointerfree(atomic) or immutable. */
+/* Don't use in leak finding mode. */
+/* Ignored if GC_dont_gc is true. */
+GC_API void GC_enable_incremental GC_PROTO((void));
+
+/* Perform some garbage collection work, if appropriate. */
+/* Return 0 if there is no more work to be done. */
+/* Typically performs an amount of work corresponding roughly */
+/* to marking from one page. May do more work if further */
+/* progress requires it, e.g. if incremental collection is */
+/* disabled. It is reasonable to call this in a wait loop */
+/* until it returns 0. */
+GC_API int GC_collect_a_little GC_PROTO((void));
+
+/* Allocate an object of size lb bytes. The client guarantees that */
+/* as long as the object is live, it will be referenced by a pointer */
+/* that points to somewhere within the first 256 bytes of the object. */
+/* (This should normally be declared volatile to prevent the compiler */
+/* from invalidating this assertion.) This routine is only useful */
+/* if a large array is being allocated. It reduces the chance of */
+/* accidentally retaining such an array as a result of scanning an */
+/* integer that happens to be an address inside the array. (Actually, */
+/* it reduces the chance of the allocator not finding space for such */
+/* an array, since it will try hard to avoid introducing such a false */
+/* reference.) On a SunOS 4.X or MS Windows system this is recommended */
+/* for arrays likely to be larger than 100K or so. For other systems, */
+/* or if the collector is not configured to recognize all interior */
+/* pointers, the threshold is normally much higher. */
+GC_API GC_PTR GC_malloc_ignore_off_page GC_PROTO((size_t lb));
+GC_API GC_PTR GC_malloc_atomic_ignore_off_page GC_PROTO((size_t lb));
+
+#if defined(__sgi) && !defined(__GNUC__) && _COMPILER_VERSION >= 720
+# define GC_ADD_CALLER
+# define GC_RETURN_ADDR (GC_word)__return_address
+#endif
+
+#ifdef GC_ADD_CALLER
+# define GC_EXTRAS GC_RETURN_ADDR, __FILE__, __LINE__
+# define GC_EXTRA_PARAMS GC_word ra, char * descr_string, int descr_int
+#else
+# define GC_EXTRAS __FILE__, __LINE__
+# define GC_EXTRA_PARAMS char * descr_string, int descr_int
+#endif
+
+/* Debugging (annotated) allocation. GC_gcollect will check */
+/* objects allocated in this way for overwrites, etc. */
+GC_API GC_PTR GC_debug_malloc
+ GC_PROTO((size_t size_in_bytes, GC_EXTRA_PARAMS));
+GC_API GC_PTR GC_debug_malloc_atomic
+ GC_PROTO((size_t size_in_bytes, GC_EXTRA_PARAMS));
+GC_API GC_PTR GC_debug_malloc_uncollectable
+ GC_PROTO((size_t size_in_bytes, GC_EXTRA_PARAMS));
+GC_API GC_PTR GC_debug_malloc_stubborn
+ GC_PROTO((size_t size_in_bytes, GC_EXTRA_PARAMS));
+GC_API void GC_debug_free GC_PROTO((GC_PTR object_addr));
+GC_API GC_PTR GC_debug_realloc
+ GC_PROTO((GC_PTR old_object, size_t new_size_in_bytes,
+ GC_EXTRA_PARAMS));
+
+GC_API void GC_debug_change_stubborn GC_PROTO((GC_PTR));
+GC_API void GC_debug_end_stubborn_change GC_PROTO((GC_PTR));
+# ifdef GC_DEBUG
+# define GC_MALLOC(sz) GC_debug_malloc(sz, GC_EXTRAS)
+# define GC_MALLOC_ATOMIC(sz) GC_debug_malloc_atomic(sz, GC_EXTRAS)
+# define GC_MALLOC_UNCOLLECTABLE(sz) GC_debug_malloc_uncollectable(sz, \
+ GC_EXTRAS)
+# define GC_REALLOC(old, sz) GC_debug_realloc(old, sz, GC_EXTRAS)
+# define GC_FREE(p) GC_debug_free(p)
+# define GC_REGISTER_FINALIZER(p, f, d, of, od) \
+ GC_debug_register_finalizer(p, f, d, of, od)
+# define GC_REGISTER_FINALIZER_IGNORE_SELF(p, f, d, of, od) \
+ GC_debug_register_finalizer_ignore_self(p, f, d, of, od)
+# define GC_REGISTER_FINALIZER_NO_ORDER(p, f, d, of, od) \
+ GC_debug_register_finalizer_no_order(p, f, d, of, od)
+# define GC_MALLOC_STUBBORN(sz) GC_debug_malloc_stubborn(sz, GC_EXTRAS);
+# define GC_CHANGE_STUBBORN(p) GC_debug_change_stubborn(p)
+# define GC_END_STUBBORN_CHANGE(p) GC_debug_end_stubborn_change(p)
+# define GC_GENERAL_REGISTER_DISAPPEARING_LINK(link, obj) \
+ GC_general_register_disappearing_link(link, GC_base(obj))
+# define GC_REGISTER_DISPLACEMENT(n) GC_debug_register_displacement(n)
+# else
+# define GC_MALLOC(sz) GC_malloc(sz)
+# define GC_MALLOC_ATOMIC(sz) GC_malloc_atomic(sz)
+# define GC_MALLOC_UNCOLLECTABLE(sz) GC_malloc_uncollectable(sz)
+# define GC_REALLOC(old, sz) GC_realloc(old, sz)
+# define GC_FREE(p) GC_free(p)
+# define GC_REGISTER_FINALIZER(p, f, d, of, od) \
+ GC_register_finalizer(p, f, d, of, od)
+# define GC_REGISTER_FINALIZER_IGNORE_SELF(p, f, d, of, od) \
+ GC_register_finalizer_ignore_self(p, f, d, of, od)
+# define GC_REGISTER_FINALIZER_NO_ORDER(p, f, d, of, od) \
+ GC_register_finalizer_no_order(p, f, d, of, od)
+# define GC_MALLOC_STUBBORN(sz) GC_malloc_stubborn(sz)
+# define GC_CHANGE_STUBBORN(p) GC_change_stubborn(p)
+# define GC_END_STUBBORN_CHANGE(p) GC_end_stubborn_change(p)
+# define GC_GENERAL_REGISTER_DISAPPEARING_LINK(link, obj) \
+ GC_general_register_disappearing_link(link, obj)
+# define GC_REGISTER_DISPLACEMENT(n) GC_register_displacement(n)
+# endif
+/* The following are included because they are often convenient, and */
+/* reduce the chance for a misspecifed size argument. But calls may */
+/* expand to something syntactically incorrect if t is a complicated */
+/* type expression. */
+# define GC_NEW(t) (t *)GC_MALLOC(sizeof (t))
+# define GC_NEW_ATOMIC(t) (t *)GC_MALLOC_ATOMIC(sizeof (t))
+# define GC_NEW_STUBBORN(t) (t *)GC_MALLOC_STUBBORN(sizeof (t))
+# define GC_NEW_UNCOLLECTABLE(t) (t *)GC_MALLOC_UNCOLLECTABLE(sizeof (t))
+
+/* Finalization. Some of these primitives are grossly unsafe. */
+/* The idea is to make them both cheap, and sufficient to build */
+/* a safer layer, closer to PCedar finalization. */
+/* The interface represents my conclusions from a long discussion */
+/* with Alan Demers, Dan Greene, Carl Hauser, Barry Hayes, */
+/* Christian Jacobi, and Russ Atkinson. It's not perfect, and */
+/* probably nobody else agrees with it. Hans-J. Boehm 3/13/92 */
+typedef void (*GC_finalization_proc)
+ GC_PROTO((GC_PTR obj, GC_PTR client_data));
+
+GC_API void GC_register_finalizer
+ GC_PROTO((GC_PTR obj, GC_finalization_proc fn, GC_PTR cd,
+ GC_finalization_proc *ofn, GC_PTR *ocd));
+GC_API void GC_debug_register_finalizer
+ GC_PROTO((GC_PTR obj, GC_finalization_proc fn, GC_PTR cd,
+ GC_finalization_proc *ofn, GC_PTR *ocd));
+ /* When obj is no longer accessible, invoke */
+ /* (*fn)(obj, cd). If a and b are inaccessible, and */
+ /* a points to b (after disappearing links have been */
+ /* made to disappear), then only a will be */
+ /* finalized. (If this does not create any new */
+ /* pointers to b, then b will be finalized after the */
+ /* next collection.) Any finalizable object that */
+ /* is reachable from itself by following one or more */
+ /* pointers will not be finalized (or collected). */
+ /* Thus cycles involving finalizable objects should */
+ /* be avoided, or broken by disappearing links. */
+ /* All but the last finalizer registered for an object */
+ /* is ignored. */
+ /* Finalization may be removed by passing 0 as fn. */
+ /* Finalizers are implicitly unregistered just before */
+ /* they are invoked. */
+ /* The old finalizer and client data are stored in */
+ /* *ofn and *ocd. */
+ /* Fn is never invoked on an accessible object, */
+ /* provided hidden pointers are converted to real */
+ /* pointers only if the allocation lock is held, and */
+ /* such conversions are not performed by finalization */
+ /* routines. */
+ /* If GC_register_finalizer is aborted as a result of */
+ /* a signal, the object may be left with no */
+ /* finalization, even if neither the old nor new */
+ /* finalizer were NULL. */
+ /* Obj should be the nonNULL starting address of an */
+ /* object allocated by GC_malloc or friends. */
+ /* Note that any garbage collectable object referenced */
+ /* by cd will be considered accessible until the */
+ /* finalizer is invoked. */
+
+/* Another versions of the above follow. It ignores */
+/* self-cycles, i.e. pointers from a finalizable object to */
+/* itself. There is a stylistic argument that this is wrong, */
+/* but it's unavoidable for C++, since the compiler may */
+/* silently introduce these. It's also benign in that specific */
+/* case. */
+GC_API void GC_register_finalizer_ignore_self
+ GC_PROTO((GC_PTR obj, GC_finalization_proc fn, GC_PTR cd,
+ GC_finalization_proc *ofn, GC_PTR *ocd));
+GC_API void GC_debug_register_finalizer_ignore_self
+ GC_PROTO((GC_PTR obj, GC_finalization_proc fn, GC_PTR cd,
+ GC_finalization_proc *ofn, GC_PTR *ocd));
+
+/* Another version of the above. It ignores all cycles. */
+/* It should probably only be used by Java implementations. */
+GC_API void GC_register_finalizer_no_order
+ GC_PROTO((GC_PTR obj, GC_finalization_proc fn, GC_PTR cd,
+ GC_finalization_proc *ofn, GC_PTR *ocd));
+GC_API void GC_debug_register_finalizer_no_order
+ GC_PROTO((GC_PTR obj, GC_finalization_proc fn, GC_PTR cd,
+ GC_finalization_proc *ofn, GC_PTR *ocd));
+
+/* The following routine may be used to break cycles between */
+/* finalizable objects, thus causing cyclic finalizable */
+/* objects to be finalized in the correct order. Standard */
+/* use involves calling GC_register_disappearing_link(&p), */
+/* where p is a pointer that is not followed by finalization */
+/* code, and should not be considered in determining */
+/* finalization order. */
+GC_API int GC_register_disappearing_link GC_PROTO((GC_PTR * /* link */));
+ /* Link should point to a field of a heap allocated */
+ /* object obj. *link will be cleared when obj is */
+ /* found to be inaccessible. This happens BEFORE any */
+ /* finalization code is invoked, and BEFORE any */
+ /* decisions about finalization order are made. */
+ /* This is useful in telling the finalizer that */
+ /* some pointers are not essential for proper */
+ /* finalization. This may avoid finalization cycles. */
+ /* Note that obj may be resurrected by another */
+ /* finalizer, and thus the clearing of *link may */
+ /* be visible to non-finalization code. */
+ /* There's an argument that an arbitrary action should */
+ /* be allowed here, instead of just clearing a pointer. */
+ /* But this causes problems if that action alters, or */
+ /* examines connectivity. */
+ /* Returns 1 if link was already registered, 0 */
+ /* otherwise. */
+ /* Only exists for backward compatibility. See below: */
+
+GC_API int GC_general_register_disappearing_link
+ GC_PROTO((GC_PTR * /* link */, GC_PTR obj));
+ /* A slight generalization of the above. *link is */
+ /* cleared when obj first becomes inaccessible. This */
+ /* can be used to implement weak pointers easily and */
+ /* safely. Typically link will point to a location */
+ /* holding a disguised pointer to obj. (A pointer */
+ /* inside an "atomic" object is effectively */
+ /* disguised.) In this way soft */
+ /* pointers are broken before any object */
+ /* reachable from them are finalized. Each link */
+ /* May be registered only once, i.e. with one obj */
+ /* value. This was added after a long email discussion */
+ /* with John Ellis. */
+ /* Obj must be a pointer to the first word of an object */
+ /* we allocated. It is unsafe to explicitly deallocate */
+ /* the object containing link. Explicitly deallocating */
+ /* obj may or may not cause link to eventually be */
+ /* cleared. */
+GC_API int GC_unregister_disappearing_link GC_PROTO((GC_PTR * /* link */));
+ /* Returns 0 if link was not actually registered. */
+ /* Undoes a registration by either of the above two */
+ /* routines. */
+
+/* Auxiliary fns to make finalization work correctly with displaced */
+/* pointers introduced by the debugging allocators. */
+GC_API GC_PTR GC_make_closure GC_PROTO((GC_finalization_proc fn, GC_PTR data));
+GC_API void GC_debug_invoke_finalizer GC_PROTO((GC_PTR obj, GC_PTR data));
+
+GC_API int GC_invoke_finalizers GC_PROTO((void));
+ /* Run finalizers for all objects that are ready to */
+ /* be finalized. Return the number of finalizers */
+ /* that were run. Normally this is also called */
+ /* implicitly during some allocations. If */
+ /* FINALIZE_ON_DEMAND is defined, it must be called */
+ /* explicitly. */
+
+/* GC_set_warn_proc can be used to redirect or filter warning messages. */
+/* p may not be a NULL pointer. */
+typedef void (*GC_warn_proc) GC_PROTO((char *msg, GC_word arg));
+GC_API GC_warn_proc GC_set_warn_proc GC_PROTO((GC_warn_proc p));
+ /* Returns old warning procedure. */
+
+/* The following is intended to be used by a higher level */
+/* (e.g. cedar-like) finalization facility. It is expected */
+/* that finalization code will arrange for hidden pointers to */
+/* disappear. Otherwise objects can be accessed after they */
+/* have been collected. */
+/* Note that putting pointers in atomic objects or in */
+/* nonpointer slots of "typed" objects is equivalent to */
+/* disguising them in this way, and may have other advantages. */
+# if defined(I_HIDE_POINTERS) || defined(GC_I_HIDE_POINTERS)
+ typedef GC_word GC_hidden_pointer;
+# define HIDE_POINTER(p) (~(GC_hidden_pointer)(p))
+# define REVEAL_POINTER(p) ((GC_PTR)(HIDE_POINTER(p)))
+ /* Converting a hidden pointer to a real pointer requires verifying */
+ /* that the object still exists. This involves acquiring the */
+ /* allocator lock to avoid a race with the collector. */
+# endif /* I_HIDE_POINTERS */
+
+typedef GC_PTR (*GC_fn_type) GC_PROTO((GC_PTR client_data));
+GC_API GC_PTR GC_call_with_alloc_lock
+ GC_PROTO((GC_fn_type fn, GC_PTR client_data));
+
+/* Check that p and q point to the same object. */
+/* Fail conspicuously if they don't. */
+/* Returns the first argument. */
+/* Succeeds if neither p nor q points to the heap. */
+/* May succeed if both p and q point to between heap objects. */
+GC_API GC_PTR GC_same_obj GC_PROTO((GC_PTR p, GC_PTR q));
+
+/* Checked pointer pre- and post- increment operations. Note that */
+/* the second argument is in units of bytes, not multiples of the */
+/* object size. This should either be invoked from a macro, or the */
+/* call should be automatically generated. */
+GC_API GC_PTR GC_pre_incr GC_PROTO((GC_PTR *p, size_t how_much));
+GC_API GC_PTR GC_post_incr GC_PROTO((GC_PTR *p, size_t how_much));
+
+/* Check that p is visible */
+/* to the collector as a possibly pointer containing location. */
+/* If it isn't fail conspicuously. */
+/* Returns the argument in all cases. May erroneously succeed */
+/* in hard cases. (This is intended for debugging use with */
+/* untyped allocations. The idea is that it should be possible, though */
+/* slow, to add such a call to all indirect pointer stores.) */
+/* Currently useless for multithreaded worlds. */
+GC_API GC_PTR GC_is_visible GC_PROTO((GC_PTR p));
+
+/* Check that if p is a pointer to a heap page, then it points to */
+/* a valid displacement within a heap object. */
+/* Fail conspicuously if this property does not hold. */
+/* Uninteresting with ALL_INTERIOR_POINTERS. */
+/* Always returns its argument. */
+GC_API GC_PTR GC_is_valid_displacement GC_PROTO((GC_PTR p));
+
+/* Safer, but slow, pointer addition. Probably useful mainly with */
+/* a preprocessor. Useful only for heap pointers. */
+#ifdef GC_DEBUG
+# define GC_PTR_ADD3(x, n, type_of_result) \
+ ((type_of_result)GC_same_obj((x)+(n), (x)))
+# define GC_PRE_INCR3(x, n, type_of_result) \
+ ((type_of_result)GC_pre_incr(&(x), (n)*sizeof(*x))
+# define GC_POST_INCR2(x, type_of_result) \
+ ((type_of_result)GC_post_incr(&(x), sizeof(*x))
+# ifdef __GNUC__
+# define GC_PTR_ADD(x, n) \
+ GC_PTR_ADD3(x, n, typeof(x))
+# define GC_PRE_INCR(x, n) \
+ GC_PRE_INCR3(x, n, typeof(x))
+# define GC_POST_INCR(x, n) \
+ GC_POST_INCR3(x, typeof(x))
+# else
+ /* We can't do this right without typeof, which ANSI */
+ /* decided was not sufficiently useful. Repeatedly */
+ /* mentioning the arguments seems too dangerous to be */
+ /* useful. So does not casting the result. */
+# define GC_PTR_ADD(x, n) ((x)+(n))
+# endif
+#else /* !GC_DEBUG */
+# define GC_PTR_ADD3(x, n, type_of_result) ((x)+(n))
+# define GC_PTR_ADD(x, n) ((x)+(n))
+# define GC_PRE_INCR3(x, n, type_of_result) ((x) += (n))
+# define GC_PRE_INCR(x, n) ((x) += (n))
+# define GC_POST_INCR2(x, n, type_of_result) ((x)++)
+# define GC_POST_INCR(x, n) ((x)++)
+#endif
+
+/* Safer assignment of a pointer to a nonstack location. */
+#ifdef GC_DEBUG
+# ifdef __STDC__
+# define GC_PTR_STORE(p, q) \
+ (*(void **)GC_is_visible(p) = GC_is_valid_displacement(q))
+# else
+# define GC_PTR_STORE(p, q) \
+ (*(char **)GC_is_visible(p) = GC_is_valid_displacement(q))
+# endif
+#else /* !GC_DEBUG */
+# define GC_PTR_STORE(p, q) *((p) = (q))
+#endif
+
+/* Fynctions called to report pointer checking errors */
+GC_API void (*GC_same_obj_print_proc) GC_PROTO((GC_PTR p, GC_PTR q));
+
+GC_API void (*GC_is_valid_displacement_print_proc)
+ GC_PROTO((GC_PTR p));
+
+GC_API void (*GC_is_visible_print_proc)
+ GC_PROTO((GC_PTR p));
+
+#ifdef SOLARIS_THREADS
+/* We need to intercept calls to many of the threads primitives, so */
+/* that we can locate thread stacks and stop the world. */
+/* Note also that the collector cannot see thread specific data. */
+/* Thread specific data should generally consist of pointers to */
+/* uncollectable objects, which are deallocated using the destructor */
+/* facility in thr_keycreate. */
+# include <thread.h>
+# include <signal.h>
+ int GC_thr_create(void *stack_base, size_t stack_size,
+ void *(*start_routine)(void *), void *arg, long flags,
+ thread_t *new_thread);
+ int GC_thr_join(thread_t wait_for, thread_t *departed, void **status);
+ int GC_thr_suspend(thread_t target_thread);
+ int GC_thr_continue(thread_t target_thread);
+ void * GC_dlopen(const char *path, int mode);
+
+# ifdef _SOLARIS_PTHREADS
+# include <pthread.h>
+ extern int GC_pthread_create(pthread_t *new_thread,
+ const pthread_attr_t *attr,
+ void * (*thread_execp)(void *), void *arg);
+ extern int GC_pthread_join(pthread_t wait_for, void **status);
+
+# undef thread_t
+
+# define pthread_join GC_pthread_join
+# define pthread_create GC_pthread_create
+#endif
+
+# define thr_create GC_thr_create
+# define thr_join GC_thr_join
+# define thr_suspend GC_thr_suspend
+# define thr_continue GC_thr_continue
+# define dlopen GC_dlopen
+
+# endif /* SOLARIS_THREADS */
+
+
+#if defined(IRIX_THREADS) || defined(LINUX_THREADS)
+/* We treat these similarly. */
+# include <pthread.h>
+# include <signal.h>
+
+ int GC_pthread_create(pthread_t *new_thread,
+ const pthread_attr_t *attr,
+ void *(*start_routine)(void *), void *arg);
+ int GC_pthread_sigmask(int how, const sigset_t *set, sigset_t *oset);
+ int GC_pthread_join(pthread_t thread, void **retval);
+
+# define pthread_create GC_pthread_create
+# define pthread_sigmask GC_pthread_sigmask
+# define pthread_join GC_pthread_join
+
+#endif /* IRIX_THREADS || LINUX_THREADS */
+
+#if defined(THREADS) && !defined(SRC_M3)
+/* This returns a list of objects, linked through their first */
+/* word. Its use can greatly reduce lock contention problems, since */
+/* the allocation lock can be acquired and released many fewer times. */
+GC_PTR GC_malloc_many(size_t lb);
+#define GC_NEXT(p) (*(GC_PTR *)(p)) /* Retrieve the next element */
+ /* in returned list. */
+extern void GC_thr_init(); /* Needed for Solaris/X86 */
+
+#endif /* THREADS && !SRC_M3 */
+
+/*
+ * If you are planning on putting
+ * the collector in a SunOS 5 dynamic library, you need to call GC_INIT()
+ * from the statically loaded program section.
+ * This circumvents a Solaris 2.X (X<=4) linker bug.
+ */
+#if defined(sparc) || defined(__sparc)
+# define GC_INIT() { extern end, etext; \
+ GC_noop(&end, &etext); }
+#else
+# if defined(__CYGWIN32__) && defined(GC_USE_DLL)
+ /*
+ * Similarly gnu-win32 DLLs need explicit initialization
+ */
+# define GC_INIT() { GC_add_roots(DATASTART, DATAEND); }
+# else
+# define GC_INIT()
+# endif
+#endif
+
+#ifdef __cplusplus
+ } /* end of extern "C" */
+#endif
+
+#endif /* _GC_H */
diff --git a/boehm-gc/gc.mak b/boehm-gc/gc.mak
new file mode 100644
index 00000000000..fdd0c9c6dc3
--- /dev/null
+++ b/boehm-gc/gc.mak
@@ -0,0 +1,2087 @@
+# Microsoft Developer Studio Generated NMAKE File, Format Version 4.10
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Application" 0x0101
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+!IF "$(CFG)" == ""
+CFG=cord - Win32 Debug
+!MESSAGE No configuration specified. Defaulting to cord - Win32 Debug.
+!ENDIF
+
+!IF "$(CFG)" != "gc - Win32 Release" && "$(CFG)" != "gc - Win32 Debug" &&\
+ "$(CFG)" != "gctest - Win32 Release" && "$(CFG)" != "gctest - Win32 Debug" &&\
+ "$(CFG)" != "cord - Win32 Release" && "$(CFG)" != "cord - Win32 Debug"
+!MESSAGE Invalid configuration "$(CFG)" specified.
+!MESSAGE You can specify a configuration when running NMAKE on this makefile
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "gc.mak" CFG="cord - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "gc - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "gc - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "gctest - Win32 Release" (based on "Win32 (x86) Application")
+!MESSAGE "gctest - Win32 Debug" (based on "Win32 (x86) Application")
+!MESSAGE "cord - Win32 Release" (based on "Win32 (x86) Application")
+!MESSAGE "cord - Win32 Debug" (based on "Win32 (x86) Application")
+!MESSAGE
+!ERROR An invalid configuration is specified.
+!ENDIF
+
+!IF "$(OS)" == "Windows_NT"
+NULL=
+!ELSE
+NULL=nul
+!ENDIF
+################################################################################
+# Begin Project
+# PROP Target_Last_Scanned "gctest - Win32 Debug"
+
+!IF "$(CFG)" == "gc - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Target_Dir ""
+OUTDIR=.\Release
+INTDIR=.\Release
+
+ALL : ".\Release\gc.dll" ".\Release\gc.bsc"
+
+CLEAN :
+ -@erase ".\Release\allchblk.obj"
+ -@erase ".\Release\allchblk.sbr"
+ -@erase ".\Release\alloc.obj"
+ -@erase ".\Release\alloc.sbr"
+ -@erase ".\Release\blacklst.obj"
+ -@erase ".\Release\blacklst.sbr"
+ -@erase ".\Release\checksums.obj"
+ -@erase ".\Release\checksums.sbr"
+ -@erase ".\Release\dbg_mlc.obj"
+ -@erase ".\Release\dbg_mlc.sbr"
+ -@erase ".\Release\dyn_load.obj"
+ -@erase ".\Release\dyn_load.sbr"
+ -@erase ".\Release\finalize.obj"
+ -@erase ".\Release\finalize.sbr"
+ -@erase ".\Release\gc.bsc"
+ -@erase ".\Release\gc.dll"
+ -@erase ".\Release\gc.exp"
+ -@erase ".\Release\gc.lib"
+ -@erase ".\Release\headers.obj"
+ -@erase ".\Release\headers.sbr"
+ -@erase ".\Release\mach_dep.obj"
+ -@erase ".\Release\mach_dep.sbr"
+ -@erase ".\Release\malloc.obj"
+ -@erase ".\Release\malloc.sbr"
+ -@erase ".\Release\mallocx.obj"
+ -@erase ".\Release\mallocx.sbr"
+ -@erase ".\Release\mark.obj"
+ -@erase ".\Release\mark.sbr"
+ -@erase ".\Release\mark_rts.obj"
+ -@erase ".\Release\mark_rts.sbr"
+ -@erase ".\Release\misc.obj"
+ -@erase ".\Release\misc.sbr"
+ -@erase ".\Release\new_hblk.obj"
+ -@erase ".\Release\new_hblk.sbr"
+ -@erase ".\Release\obj_map.obj"
+ -@erase ".\Release\obj_map.sbr"
+ -@erase ".\Release\os_dep.obj"
+ -@erase ".\Release\os_dep.sbr"
+ -@erase ".\Release\ptr_chck.obj"
+ -@erase ".\Release\ptr_chck.sbr"
+ -@erase ".\Release\reclaim.obj"
+ -@erase ".\Release\reclaim.sbr"
+ -@erase ".\Release\stubborn.obj"
+ -@erase ".\Release\stubborn.sbr"
+ -@erase ".\Release\typd_mlc.obj"
+ -@erase ".\Release\typd_mlc.sbr"
+ -@erase ".\Release\win32_threads.obj"
+ -@erase ".\Release\win32_threads.sbr"
+
+"$(OUTDIR)" :
+ if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP=cl.exe
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /c
+# ADD CPP /nologo /MD /W3 /GX /O2 /D "NDEBUG" /D "SILENT" /D "GC_BUILD" /D "WIN32" /D "_WINDOWS" /D "ALL_INTERIOR_POINTERS" /D "__STDC__" /D "WIN32_THREADS" /FR /YX /c
+CPP_PROJ=/nologo /MD /W3 /GX /O2 /D "NDEBUG" /D "SILENT" /D "GC_BUILD" /D\
+ "WIN32" /D "_WINDOWS" /D "ALL_INTERIOR_POINTERS" /D "__STDC__" /D\
+ "WIN32_THREADS" /FR"$(INTDIR)/" /Fp"$(INTDIR)/gc.pch" /YX /Fo"$(INTDIR)/" /c
+CPP_OBJS=.\Release/
+CPP_SBRS=.\Release/
+
+.c{$(CPP_OBJS)}.obj:
+ $(CPP) $(CPP_PROJ) $<
+
+.cpp{$(CPP_OBJS)}.obj:
+ $(CPP) $(CPP_PROJ) $<
+
+.cxx{$(CPP_OBJS)}.obj:
+ $(CPP) $(CPP_PROJ) $<
+
+.c{$(CPP_SBRS)}.sbr:
+ $(CPP) $(CPP_PROJ) $<
+
+.cpp{$(CPP_SBRS)}.sbr:
+ $(CPP) $(CPP_PROJ) $<
+
+.cxx{$(CPP_SBRS)}.sbr:
+ $(CPP) $(CPP_PROJ) $<
+
+MTL=mktyplib.exe
+# ADD BASE MTL /nologo /D "NDEBUG" /win32
+# ADD MTL /nologo /D "NDEBUG" /win32
+MTL_PROJ=/nologo /D "NDEBUG" /win32
+RSC=rc.exe
+# ADD BASE RSC /l 0x809 /d "NDEBUG"
+# ADD RSC /l 0x809 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+BSC32_FLAGS=/nologo /o"$(OUTDIR)/gc.bsc"
+BSC32_SBRS= \
+ ".\Release\allchblk.sbr" \
+ ".\Release\alloc.sbr" \
+ ".\Release\blacklst.sbr" \
+ ".\Release\checksums.sbr" \
+ ".\Release\dbg_mlc.sbr" \
+ ".\Release\dyn_load.sbr" \
+ ".\Release\finalize.sbr" \
+ ".\Release\headers.sbr" \
+ ".\Release\mach_dep.sbr" \
+ ".\Release\malloc.sbr" \
+ ".\Release\mallocx.sbr" \
+ ".\Release\mark.sbr" \
+ ".\Release\mark_rts.sbr" \
+ ".\Release\misc.sbr" \
+ ".\Release\new_hblk.sbr" \
+ ".\Release\obj_map.sbr" \
+ ".\Release\os_dep.sbr" \
+ ".\Release\ptr_chck.sbr" \
+ ".\Release\reclaim.sbr" \
+ ".\Release\stubborn.sbr" \
+ ".\Release\typd_mlc.sbr" \
+ ".\Release\win32_threads.sbr"
+
+".\Release\gc.bsc" : "$(OUTDIR)" $(BSC32_SBRS)
+ $(BSC32) @<<
+ $(BSC32_FLAGS) $(BSC32_SBRS)
+<<
+
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386
+LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\
+ advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib\
+ odbccp32.lib /nologo /subsystem:windows /dll /incremental:no\
+ /pdb:"$(OUTDIR)/gc.pdb" /machine:I386 /out:"$(OUTDIR)/gc.dll"\
+ /implib:"$(OUTDIR)/gc.lib"
+LINK32_OBJS= \
+ ".\Release\allchblk.obj" \
+ ".\Release\alloc.obj" \
+ ".\Release\blacklst.obj" \
+ ".\Release\checksums.obj" \
+ ".\Release\dbg_mlc.obj" \
+ ".\Release\dyn_load.obj" \
+ ".\Release\finalize.obj" \
+ ".\Release\headers.obj" \
+ ".\Release\mach_dep.obj" \
+ ".\Release\malloc.obj" \
+ ".\Release\mallocx.obj" \
+ ".\Release\mark.obj" \
+ ".\Release\mark_rts.obj" \
+ ".\Release\misc.obj" \
+ ".\Release\new_hblk.obj" \
+ ".\Release\obj_map.obj" \
+ ".\Release\os_dep.obj" \
+ ".\Release\ptr_chck.obj" \
+ ".\Release\reclaim.obj" \
+ ".\Release\stubborn.obj" \
+ ".\Release\typd_mlc.obj" \
+ ".\Release\win32_threads.obj"
+
+".\Release\gc.dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+ $(LINK32) @<<
+ $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+!ELSEIF "$(CFG)" == "gc - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Target_Dir ""
+OUTDIR=.\Debug
+INTDIR=.\Debug
+
+ALL : ".\Debug\gc.dll" ".\Debug\gc.bsc"
+
+CLEAN :
+ -@erase ".\Debug\allchblk.obj"
+ -@erase ".\Debug\allchblk.sbr"
+ -@erase ".\Debug\alloc.obj"
+ -@erase ".\Debug\alloc.sbr"
+ -@erase ".\Debug\blacklst.obj"
+ -@erase ".\Debug\blacklst.sbr"
+ -@erase ".\Debug\checksums.obj"
+ -@erase ".\Debug\checksums.sbr"
+ -@erase ".\Debug\dbg_mlc.obj"
+ -@erase ".\Debug\dbg_mlc.sbr"
+ -@erase ".\Debug\dyn_load.obj"
+ -@erase ".\Debug\dyn_load.sbr"
+ -@erase ".\Debug\finalize.obj"
+ -@erase ".\Debug\finalize.sbr"
+ -@erase ".\Debug\gc.bsc"
+ -@erase ".\Debug\gc.dll"
+ -@erase ".\Debug\gc.exp"
+ -@erase ".\Debug\gc.lib"
+ -@erase ".\Debug\gc.map"
+ -@erase ".\Debug\gc.pdb"
+ -@erase ".\Debug\headers.obj"
+ -@erase ".\Debug\headers.sbr"
+ -@erase ".\Debug\mach_dep.obj"
+ -@erase ".\Debug\mach_dep.sbr"
+ -@erase ".\Debug\malloc.obj"
+ -@erase ".\Debug\malloc.sbr"
+ -@erase ".\Debug\mallocx.obj"
+ -@erase ".\Debug\mallocx.sbr"
+ -@erase ".\Debug\mark.obj"
+ -@erase ".\Debug\mark.sbr"
+ -@erase ".\Debug\mark_rts.obj"
+ -@erase ".\Debug\mark_rts.sbr"
+ -@erase ".\Debug\misc.obj"
+ -@erase ".\Debug\misc.sbr"
+ -@erase ".\Debug\new_hblk.obj"
+ -@erase ".\Debug\new_hblk.sbr"
+ -@erase ".\Debug\obj_map.obj"
+ -@erase ".\Debug\obj_map.sbr"
+ -@erase ".\Debug\os_dep.obj"
+ -@erase ".\Debug\os_dep.sbr"
+ -@erase ".\Debug\ptr_chck.obj"
+ -@erase ".\Debug\ptr_chck.sbr"
+ -@erase ".\Debug\reclaim.obj"
+ -@erase ".\Debug\reclaim.sbr"
+ -@erase ".\Debug\stubborn.obj"
+ -@erase ".\Debug\stubborn.sbr"
+ -@erase ".\Debug\typd_mlc.obj"
+ -@erase ".\Debug\typd_mlc.sbr"
+ -@erase ".\Debug\vc40.idb"
+ -@erase ".\Debug\vc40.pdb"
+ -@erase ".\Debug\win32_threads.obj"
+ -@erase ".\Debug\win32_threads.sbr"
+
+"$(OUTDIR)" :
+ if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP=cl.exe
+# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /D "_DEBUG" /D "SILENT" /D "GC_BUILD" /D "WIN32" /D "_WINDOWS" /D "ALL_INTERIOR_POINTERS" /D "__STDC__" /D "WIN32_THREADS" /FR /YX /c
+CPP_PROJ=/nologo /MDd /W3 /Gm /GX /Zi /Od /D "_DEBUG" /D "SILENT" /D "GC_BUILD"\
+ /D "WIN32" /D "_WINDOWS" /D "ALL_INTERIOR_POINTERS" /D "__STDC__" /D\
+ "WIN32_THREADS" /FR"$(INTDIR)/" /Fp"$(INTDIR)/gc.pch" /YX /Fo"$(INTDIR)/"\
+ /Fd"$(INTDIR)/" /c
+CPP_OBJS=.\Debug/
+CPP_SBRS=.\Debug/
+
+.c{$(CPP_OBJS)}.obj:
+ $(CPP) $(CPP_PROJ) $<
+
+.cpp{$(CPP_OBJS)}.obj:
+ $(CPP) $(CPP_PROJ) $<
+
+.cxx{$(CPP_OBJS)}.obj:
+ $(CPP) $(CPP_PROJ) $<
+
+.c{$(CPP_SBRS)}.sbr:
+ $(CPP) $(CPP_PROJ) $<
+
+.cpp{$(CPP_SBRS)}.sbr:
+ $(CPP) $(CPP_PROJ) $<
+
+.cxx{$(CPP_SBRS)}.sbr:
+ $(CPP) $(CPP_PROJ) $<
+
+MTL=mktyplib.exe
+# ADD BASE MTL /nologo /D "_DEBUG" /win32
+# ADD MTL /nologo /D "_DEBUG" /win32
+MTL_PROJ=/nologo /D "_DEBUG" /win32
+RSC=rc.exe
+# ADD BASE RSC /l 0x809 /d "_DEBUG"
+# ADD RSC /l 0x809 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+BSC32_FLAGS=/nologo /o"$(OUTDIR)/gc.bsc"
+BSC32_SBRS= \
+ ".\Debug\allchblk.sbr" \
+ ".\Debug\alloc.sbr" \
+ ".\Debug\blacklst.sbr" \
+ ".\Debug\checksums.sbr" \
+ ".\Debug\dbg_mlc.sbr" \
+ ".\Debug\dyn_load.sbr" \
+ ".\Debug\finalize.sbr" \
+ ".\Debug\headers.sbr" \
+ ".\Debug\mach_dep.sbr" \
+ ".\Debug\malloc.sbr" \
+ ".\Debug\mallocx.sbr" \
+ ".\Debug\mark.sbr" \
+ ".\Debug\mark_rts.sbr" \
+ ".\Debug\misc.sbr" \
+ ".\Debug\new_hblk.sbr" \
+ ".\Debug\obj_map.sbr" \
+ ".\Debug\os_dep.sbr" \
+ ".\Debug\ptr_chck.sbr" \
+ ".\Debug\reclaim.sbr" \
+ ".\Debug\stubborn.sbr" \
+ ".\Debug\typd_mlc.sbr" \
+ ".\Debug\win32_threads.sbr"
+
+".\Debug\gc.bsc" : "$(OUTDIR)" $(BSC32_SBRS)
+ $(BSC32) @<<
+ $(BSC32_FLAGS) $(BSC32_SBRS)
+<<
+
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /incremental:no /map /debug /machine:I386
+LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\
+ advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib\
+ odbccp32.lib /nologo /subsystem:windows /dll /incremental:no\
+ /pdb:"$(OUTDIR)/gc.pdb" /map:"$(INTDIR)/gc.map" /debug /machine:I386\
+ /out:"$(OUTDIR)/gc.dll" /implib:"$(OUTDIR)/gc.lib"
+LINK32_OBJS= \
+ ".\Debug\allchblk.obj" \
+ ".\Debug\alloc.obj" \
+ ".\Debug\blacklst.obj" \
+ ".\Debug\checksums.obj" \
+ ".\Debug\dbg_mlc.obj" \
+ ".\Debug\dyn_load.obj" \
+ ".\Debug\finalize.obj" \
+ ".\Debug\headers.obj" \
+ ".\Debug\mach_dep.obj" \
+ ".\Debug\malloc.obj" \
+ ".\Debug\mallocx.obj" \
+ ".\Debug\mark.obj" \
+ ".\Debug\mark_rts.obj" \
+ ".\Debug\misc.obj" \
+ ".\Debug\new_hblk.obj" \
+ ".\Debug\obj_map.obj" \
+ ".\Debug\os_dep.obj" \
+ ".\Debug\ptr_chck.obj" \
+ ".\Debug\reclaim.obj" \
+ ".\Debug\stubborn.obj" \
+ ".\Debug\typd_mlc.obj" \
+ ".\Debug\win32_threads.obj"
+
+".\Debug\gc.dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+ $(LINK32) @<<
+ $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+!ELSEIF "$(CFG)" == "gctest - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "gctest\Release"
+# PROP BASE Intermediate_Dir "gctest\Release"
+# PROP BASE Target_Dir "gctest"
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "gctest\Release"
+# PROP Intermediate_Dir "gctest\Release"
+# PROP Target_Dir "gctest"
+OUTDIR=.\gctest\Release
+INTDIR=.\gctest\Release
+
+ALL : "gc - Win32 Release" ".\Release\gctest.exe"
+
+CLEAN :
+ -@erase ".\gctest\Release\test.obj"
+ -@erase ".\Release\gctest.exe"
+
+"$(OUTDIR)" :
+ if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP=cl.exe
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /c
+# ADD CPP /nologo /MD /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "ALL_INTERIOR_POINTERS" /D "__STDC__" /D "WIN32_THREADS" /YX /c
+CPP_PROJ=/nologo /MD /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D\
+ "ALL_INTERIOR_POINTERS" /D "__STDC__" /D "WIN32_THREADS"\
+ /Fp"$(INTDIR)/gctest.pch" /YX /Fo"$(INTDIR)/" /c
+CPP_OBJS=.\gctest\Release/
+CPP_SBRS=.\.
+
+.c{$(CPP_OBJS)}.obj:
+ $(CPP) $(CPP_PROJ) $<
+
+.cpp{$(CPP_OBJS)}.obj:
+ $(CPP) $(CPP_PROJ) $<
+
+.cxx{$(CPP_OBJS)}.obj:
+ $(CPP) $(CPP_PROJ) $<
+
+.c{$(CPP_SBRS)}.sbr:
+ $(CPP) $(CPP_PROJ) $<
+
+.cpp{$(CPP_SBRS)}.sbr:
+ $(CPP) $(CPP_PROJ) $<
+
+.cxx{$(CPP_SBRS)}.sbr:
+ $(CPP) $(CPP_PROJ) $<
+
+MTL=mktyplib.exe
+# ADD BASE MTL /nologo /D "NDEBUG" /win32
+# ADD MTL /nologo /D "NDEBUG" /win32
+MTL_PROJ=/nologo /D "NDEBUG" /win32
+RSC=rc.exe
+# ADD BASE RSC /l 0x809 /d "NDEBUG"
+# ADD RSC /l 0x809 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+BSC32_FLAGS=/nologo /o"$(OUTDIR)/gctest.bsc"
+BSC32_SBRS= \
+
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 /out:"Release/gctest.exe"
+LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\
+ advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib\
+ odbccp32.lib /nologo /subsystem:windows /incremental:no\
+ /pdb:"$(OUTDIR)/gctest.pdb" /machine:I386 /out:"Release/gctest.exe"
+LINK32_OBJS= \
+ ".\gctest\Release\test.obj" \
+ ".\Release\gc.lib"
+
+".\Release\gctest.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+ $(LINK32) @<<
+ $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+!ELSEIF "$(CFG)" == "gctest - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "gctest\Debug"
+# PROP BASE Intermediate_Dir "gctest\Debug"
+# PROP BASE Target_Dir "gctest"
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "gctest\Debug"
+# PROP Intermediate_Dir "gctest\Debug"
+# PROP Target_Dir "gctest"
+OUTDIR=.\gctest\Debug
+INTDIR=.\gctest\Debug
+
+ALL : "gc - Win32 Debug" ".\Debug\gctest.exe" ".\gctest\Debug\gctest.bsc"
+
+CLEAN :
+ -@erase ".\Debug\gctest.exe"
+ -@erase ".\gctest\Debug\gctest.bsc"
+ -@erase ".\gctest\Debug\gctest.map"
+ -@erase ".\gctest\Debug\gctest.pdb"
+ -@erase ".\gctest\Debug\test.obj"
+ -@erase ".\gctest\Debug\test.sbr"
+ -@erase ".\gctest\Debug\vc40.idb"
+ -@erase ".\gctest\Debug\vc40.pdb"
+
+"$(OUTDIR)" :
+ if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP=cl.exe
+# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "ALL_INTERIOR_POINTERS" /D "__STDC__" /D "WIN32_THREADS" /FR /YX /c
+CPP_PROJ=/nologo /MDd /W3 /Gm /GX /Zi /Od /D "_DEBUG" /D "WIN32" /D "_WINDOWS"\
+ /D "ALL_INTERIOR_POINTERS" /D "__STDC__" /D "WIN32_THREADS" /FR"$(INTDIR)/"\
+ /Fp"$(INTDIR)/gctest.pch" /YX /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c
+CPP_OBJS=.\gctest\Debug/
+CPP_SBRS=.\gctest\Debug/
+
+.c{$(CPP_OBJS)}.obj:
+ $(CPP) $(CPP_PROJ) $<
+
+.cpp{$(CPP_OBJS)}.obj:
+ $(CPP) $(CPP_PROJ) $<
+
+.cxx{$(CPP_OBJS)}.obj:
+ $(CPP) $(CPP_PROJ) $<
+
+.c{$(CPP_SBRS)}.sbr:
+ $(CPP) $(CPP_PROJ) $<
+
+.cpp{$(CPP_SBRS)}.sbr:
+ $(CPP) $(CPP_PROJ) $<
+
+.cxx{$(CPP_SBRS)}.sbr:
+ $(CPP) $(CPP_PROJ) $<
+
+MTL=mktyplib.exe
+# ADD BASE MTL /nologo /D "_DEBUG" /win32
+# ADD MTL /nologo /D "_DEBUG" /win32
+MTL_PROJ=/nologo /D "_DEBUG" /win32
+RSC=rc.exe
+# ADD BASE RSC /l 0x809 /d "_DEBUG"
+# ADD RSC /l 0x809 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+BSC32_FLAGS=/nologo /o"$(OUTDIR)/gctest.bsc"
+BSC32_SBRS= \
+ ".\gctest\Debug\test.sbr"
+
+".\gctest\Debug\gctest.bsc" : "$(OUTDIR)" $(BSC32_SBRS)
+ $(BSC32) @<<
+ $(BSC32_FLAGS) $(BSC32_SBRS)
+<<
+
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /incremental:no /map /debug /machine:I386 /out:"Debug/gctest.exe"
+LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\
+ advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib\
+ odbccp32.lib /nologo /subsystem:windows /incremental:no\
+ /pdb:"$(OUTDIR)/gctest.pdb" /map:"$(INTDIR)/gctest.map" /debug /machine:I386\
+ /out:"Debug/gctest.exe"
+LINK32_OBJS= \
+ ".\Debug\gc.lib" \
+ ".\gctest\Debug\test.obj"
+
+".\Debug\gctest.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+ $(LINK32) @<<
+ $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+!ELSEIF "$(CFG)" == "cord - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "cord\Release"
+# PROP BASE Intermediate_Dir "cord\Release"
+# PROP BASE Target_Dir "cord"
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "cord\Release"
+# PROP Intermediate_Dir "cord\Release"
+# PROP Target_Dir "cord"
+OUTDIR=.\cord\Release
+INTDIR=.\cord\Release
+
+ALL : "gc - Win32 Release" ".\Release\de.exe"
+
+CLEAN :
+ -@erase ".\cord\Release\cordbscs.obj"
+ -@erase ".\cord\Release\cordxtra.obj"
+ -@erase ".\cord\Release\de.obj"
+ -@erase ".\cord\Release\de_win.obj"
+ -@erase ".\cord\Release\de_win.res"
+ -@erase ".\Release\de.exe"
+
+"$(OUTDIR)" :
+ if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP=cl.exe
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /c
+# ADD CPP /nologo /MD /W3 /GX /O2 /I "." /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "ALL_INTERIOR_POINTERS" /YX /c
+CPP_PROJ=/nologo /MD /W3 /GX /O2 /I "." /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D\
+ "ALL_INTERIOR_POINTERS" /Fp"$(INTDIR)/cord.pch" /YX /Fo"$(INTDIR)/" /c
+CPP_OBJS=.\cord\Release/
+CPP_SBRS=.\.
+
+.c{$(CPP_OBJS)}.obj:
+ $(CPP) $(CPP_PROJ) $<
+
+.cpp{$(CPP_OBJS)}.obj:
+ $(CPP) $(CPP_PROJ) $<
+
+.cxx{$(CPP_OBJS)}.obj:
+ $(CPP) $(CPP_PROJ) $<
+
+.c{$(CPP_SBRS)}.sbr:
+ $(CPP) $(CPP_PROJ) $<
+
+.cpp{$(CPP_SBRS)}.sbr:
+ $(CPP) $(CPP_PROJ) $<
+
+.cxx{$(CPP_SBRS)}.sbr:
+ $(CPP) $(CPP_PROJ) $<
+
+MTL=mktyplib.exe
+# ADD BASE MTL /nologo /D "NDEBUG" /win32
+# ADD MTL /nologo /D "NDEBUG" /win32
+MTL_PROJ=/nologo /D "NDEBUG" /win32
+RSC=rc.exe
+# ADD BASE RSC /l 0x809 /d "NDEBUG"
+# ADD RSC /l 0x809 /d "NDEBUG"
+RSC_PROJ=/l 0x809 /fo"$(INTDIR)/de_win.res" /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+BSC32_FLAGS=/nologo /o"$(OUTDIR)/cord.bsc"
+BSC32_SBRS= \
+
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 /out:"Release/de.exe"
+LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\
+ advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib\
+ odbccp32.lib /nologo /subsystem:windows /incremental:no /pdb:"$(OUTDIR)/de.pdb"\
+ /machine:I386 /out:"Release/de.exe"
+LINK32_OBJS= \
+ ".\cord\Release\cordbscs.obj" \
+ ".\cord\Release\cordxtra.obj" \
+ ".\cord\Release\de.obj" \
+ ".\cord\Release\de_win.obj" \
+ ".\cord\Release\de_win.res" \
+ ".\Release\gc.lib"
+
+".\Release\de.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+ $(LINK32) @<<
+ $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+!ELSEIF "$(CFG)" == "cord - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "cord\Debug"
+# PROP BASE Intermediate_Dir "cord\Debug"
+# PROP BASE Target_Dir "cord"
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "cord\Debug"
+# PROP Intermediate_Dir "cord\Debug"
+# PROP Target_Dir "cord"
+OUTDIR=.\cord\Debug
+INTDIR=.\cord\Debug
+
+ALL : "gc - Win32 Debug" ".\Debug\de.exe"
+
+CLEAN :
+ -@erase ".\cord\Debug\cordbscs.obj"
+ -@erase ".\cord\Debug\cordxtra.obj"
+ -@erase ".\cord\Debug\de.obj"
+ -@erase ".\cord\Debug\de.pdb"
+ -@erase ".\cord\Debug\de_win.obj"
+ -@erase ".\cord\Debug\de_win.res"
+ -@erase ".\cord\Debug\vc40.idb"
+ -@erase ".\cord\Debug\vc40.pdb"
+ -@erase ".\Debug\de.exe"
+ -@erase ".\Debug\de.ilk"
+
+"$(OUTDIR)" :
+ if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP=cl.exe
+# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "." /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "ALL_INTERIOR_POINTERS" /YX /c
+CPP_PROJ=/nologo /MDd /W3 /Gm /GX /Zi /Od /I "." /D "_DEBUG" /D "WIN32" /D\
+ "_WINDOWS" /D "ALL_INTERIOR_POINTERS" /Fp"$(INTDIR)/cord.pch" /YX\
+ /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c
+CPP_OBJS=.\cord\Debug/
+CPP_SBRS=.\.
+
+.c{$(CPP_OBJS)}.obj:
+ $(CPP) $(CPP_PROJ) $<
+
+.cpp{$(CPP_OBJS)}.obj:
+ $(CPP) $(CPP_PROJ) $<
+
+.cxx{$(CPP_OBJS)}.obj:
+ $(CPP) $(CPP_PROJ) $<
+
+.c{$(CPP_SBRS)}.sbr:
+ $(CPP) $(CPP_PROJ) $<
+
+.cpp{$(CPP_SBRS)}.sbr:
+ $(CPP) $(CPP_PROJ) $<
+
+.cxx{$(CPP_SBRS)}.sbr:
+ $(CPP) $(CPP_PROJ) $<
+
+MTL=mktyplib.exe
+# ADD BASE MTL /nologo /D "_DEBUG" /win32
+# ADD MTL /nologo /D "_DEBUG" /win32
+MTL_PROJ=/nologo /D "_DEBUG" /win32
+RSC=rc.exe
+# ADD BASE RSC /l 0x809 /d "_DEBUG"
+# ADD RSC /l 0x809 /d "_DEBUG"
+RSC_PROJ=/l 0x809 /fo"$(INTDIR)/de_win.res" /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+BSC32_FLAGS=/nologo /o"$(OUTDIR)/cord.bsc"
+BSC32_SBRS= \
+
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /out:"Debug/de.exe"
+LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\
+ advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib\
+ odbccp32.lib /nologo /subsystem:windows /incremental:yes\
+ /pdb:"$(OUTDIR)/de.pdb" /debug /machine:I386 /out:"Debug/de.exe"
+LINK32_OBJS= \
+ ".\cord\Debug\cordbscs.obj" \
+ ".\cord\Debug\cordxtra.obj" \
+ ".\cord\Debug\de.obj" \
+ ".\cord\Debug\de_win.obj" \
+ ".\cord\Debug\de_win.res" \
+ ".\Debug\gc.lib"
+
+".\Debug\de.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+ $(LINK32) @<<
+ $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+!ENDIF
+
+################################################################################
+# Begin Target
+
+# Name "gc - Win32 Release"
+# Name "gc - Win32 Debug"
+
+!IF "$(CFG)" == "gc - Win32 Release"
+
+!ELSEIF "$(CFG)" == "gc - Win32 Debug"
+
+!ENDIF
+
+################################################################################
+# Begin Source File
+
+SOURCE=.\reclaim.c
+
+!IF "$(CFG)" == "gc - Win32 Release"
+
+DEP_CPP_RECLA=\
+ ".\config.h"\
+ ".\gc.h"\
+ ".\gc_hdrs.h"\
+ ".\gc_priv.h"\
+ {$(INCLUDE)}"\sys\TYPES.H"\
+
+NODEP_CPP_RECLA=\
+ ".\th\PCR_Th.h"\
+ ".\th\PCR_ThCrSec.h"\
+ ".\th\PCR_ThCtl.h"\
+
+
+".\Release\reclaim.obj" : $(SOURCE) $(DEP_CPP_RECLA) "$(INTDIR)"
+
+".\Release\reclaim.sbr" : $(SOURCE) $(DEP_CPP_RECLA) "$(INTDIR)"
+
+
+!ELSEIF "$(CFG)" == "gc - Win32 Debug"
+
+DEP_CPP_RECLA=\
+ ".\config.h"\
+ ".\gc.h"\
+ ".\gc_hdrs.h"\
+ ".\gc_priv.h"\
+ {$(INCLUDE)}"\sys\TYPES.H"\
+
+NODEP_CPP_RECLA=\
+ ".\th\PCR_Th.h"\
+ ".\th\PCR_ThCrSec.h"\
+ ".\th\PCR_ThCtl.h"\
+
+
+".\Debug\reclaim.obj" : $(SOURCE) $(DEP_CPP_RECLA) "$(INTDIR)"
+
+".\Debug\reclaim.sbr" : $(SOURCE) $(DEP_CPP_RECLA) "$(INTDIR)"
+
+
+!ENDIF
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\os_dep.c
+
+!IF "$(CFG)" == "gc - Win32 Release"
+
+DEP_CPP_OS_DE=\
+ ".\config.h"\
+ ".\gc.h"\
+ ".\gc_hdrs.h"\
+ ".\gc_priv.h"\
+ {$(INCLUDE)}"\sys\STAT.H"\
+ {$(INCLUDE)}"\sys\TYPES.H"\
+
+NODEP_CPP_OS_DE=\
+ ".\il\PCR_IL.h"\
+ ".\mm\PCR_MM.h"\
+ ".\th\PCR_Th.h"\
+ ".\th\PCR_ThCrSec.h"\
+ ".\th\PCR_ThCtl.h"\
+ ".\vd\PCR_VD.h"\
+
+
+".\Release\os_dep.obj" : $(SOURCE) $(DEP_CPP_OS_DE) "$(INTDIR)"
+
+".\Release\os_dep.sbr" : $(SOURCE) $(DEP_CPP_OS_DE) "$(INTDIR)"
+
+
+!ELSEIF "$(CFG)" == "gc - Win32 Debug"
+
+DEP_CPP_OS_DE=\
+ ".\config.h"\
+ ".\gc.h"\
+ ".\gc_hdrs.h"\
+ ".\gc_priv.h"\
+ {$(INCLUDE)}"\sys\STAT.H"\
+ {$(INCLUDE)}"\sys\TYPES.H"\
+
+NODEP_CPP_OS_DE=\
+ ".\il\PCR_IL.h"\
+ ".\mm\PCR_MM.h"\
+ ".\th\PCR_Th.h"\
+ ".\th\PCR_ThCrSec.h"\
+ ".\th\PCR_ThCtl.h"\
+ ".\vd\PCR_VD.h"\
+
+
+".\Debug\os_dep.obj" : $(SOURCE) $(DEP_CPP_OS_DE) "$(INTDIR)"
+
+".\Debug\os_dep.sbr" : $(SOURCE) $(DEP_CPP_OS_DE) "$(INTDIR)"
+
+
+!ENDIF
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\misc.c
+
+!IF "$(CFG)" == "gc - Win32 Release"
+
+DEP_CPP_MISC_=\
+ ".\config.h"\
+ ".\gc.h"\
+ ".\gc_hdrs.h"\
+ ".\gc_priv.h"\
+ {$(INCLUDE)}"\sys\TYPES.H"\
+
+NODEP_CPP_MISC_=\
+ ".\il\PCR_IL.h"\
+ ".\th\PCR_Th.h"\
+ ".\th\PCR_ThCrSec.h"\
+ ".\th\PCR_ThCtl.h"\
+
+
+".\Release\misc.obj" : $(SOURCE) $(DEP_CPP_MISC_) "$(INTDIR)"
+
+".\Release\misc.sbr" : $(SOURCE) $(DEP_CPP_MISC_) "$(INTDIR)"
+
+
+!ELSEIF "$(CFG)" == "gc - Win32 Debug"
+
+DEP_CPP_MISC_=\
+ ".\config.h"\
+ ".\gc.h"\
+ ".\gc_hdrs.h"\
+ ".\gc_priv.h"\
+ {$(INCLUDE)}"\sys\TYPES.H"\
+
+NODEP_CPP_MISC_=\
+ ".\il\PCR_IL.h"\
+ ".\th\PCR_Th.h"\
+ ".\th\PCR_ThCrSec.h"\
+ ".\th\PCR_ThCtl.h"\
+
+
+".\Debug\misc.obj" : $(SOURCE) $(DEP_CPP_MISC_) "$(INTDIR)"
+
+".\Debug\misc.sbr" : $(SOURCE) $(DEP_CPP_MISC_) "$(INTDIR)"
+
+
+!ENDIF
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\mark_rts.c
+
+!IF "$(CFG)" == "gc - Win32 Release"
+
+DEP_CPP_MARK_=\
+ ".\config.h"\
+ ".\gc.h"\
+ ".\gc_hdrs.h"\
+ ".\gc_priv.h"\
+ {$(INCLUDE)}"\sys\TYPES.H"\
+
+NODEP_CPP_MARK_=\
+ ".\th\PCR_Th.h"\
+ ".\th\PCR_ThCrSec.h"\
+ ".\th\PCR_ThCtl.h"\
+
+
+".\Release\mark_rts.obj" : $(SOURCE) $(DEP_CPP_MARK_) "$(INTDIR)"
+
+".\Release\mark_rts.sbr" : $(SOURCE) $(DEP_CPP_MARK_) "$(INTDIR)"
+
+
+!ELSEIF "$(CFG)" == "gc - Win32 Debug"
+
+DEP_CPP_MARK_=\
+ ".\config.h"\
+ ".\gc.h"\
+ ".\gc_hdrs.h"\
+ ".\gc_priv.h"\
+ {$(INCLUDE)}"\sys\TYPES.H"\
+
+NODEP_CPP_MARK_=\
+ ".\th\PCR_Th.h"\
+ ".\th\PCR_ThCrSec.h"\
+ ".\th\PCR_ThCtl.h"\
+
+
+".\Debug\mark_rts.obj" : $(SOURCE) $(DEP_CPP_MARK_) "$(INTDIR)"
+
+".\Debug\mark_rts.sbr" : $(SOURCE) $(DEP_CPP_MARK_) "$(INTDIR)"
+
+
+!ENDIF
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\mach_dep.c
+
+!IF "$(CFG)" == "gc - Win32 Release"
+
+DEP_CPP_MACH_=\
+ ".\config.h"\
+ ".\gc.h"\
+ ".\gc_hdrs.h"\
+ ".\gc_priv.h"\
+ {$(INCLUDE)}"\sys\TYPES.H"\
+
+NODEP_CPP_MACH_=\
+ ".\th\PCR_Th.h"\
+ ".\th\PCR_ThCrSec.h"\
+ ".\th\PCR_ThCtl.h"\
+
+
+".\Release\mach_dep.obj" : $(SOURCE) $(DEP_CPP_MACH_) "$(INTDIR)"
+
+".\Release\mach_dep.sbr" : $(SOURCE) $(DEP_CPP_MACH_) "$(INTDIR)"
+
+
+!ELSEIF "$(CFG)" == "gc - Win32 Debug"
+
+DEP_CPP_MACH_=\
+ ".\config.h"\
+ ".\gc.h"\
+ ".\gc_hdrs.h"\
+ ".\gc_priv.h"\
+ {$(INCLUDE)}"\sys\TYPES.H"\
+
+NODEP_CPP_MACH_=\
+ ".\th\PCR_Th.h"\
+ ".\th\PCR_ThCrSec.h"\
+ ".\th\PCR_ThCtl.h"\
+
+
+".\Debug\mach_dep.obj" : $(SOURCE) $(DEP_CPP_MACH_) "$(INTDIR)"
+
+".\Debug\mach_dep.sbr" : $(SOURCE) $(DEP_CPP_MACH_) "$(INTDIR)"
+
+
+!ENDIF
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\headers.c
+
+!IF "$(CFG)" == "gc - Win32 Release"
+
+DEP_CPP_HEADE=\
+ ".\config.h"\
+ ".\gc.h"\
+ ".\gc_hdrs.h"\
+ ".\gc_priv.h"\
+ {$(INCLUDE)}"\sys\TYPES.H"\
+
+NODEP_CPP_HEADE=\
+ ".\th\PCR_Th.h"\
+ ".\th\PCR_ThCrSec.h"\
+ ".\th\PCR_ThCtl.h"\
+
+
+".\Release\headers.obj" : $(SOURCE) $(DEP_CPP_HEADE) "$(INTDIR)"
+
+".\Release\headers.sbr" : $(SOURCE) $(DEP_CPP_HEADE) "$(INTDIR)"
+
+
+!ELSEIF "$(CFG)" == "gc - Win32 Debug"
+
+DEP_CPP_HEADE=\
+ ".\config.h"\
+ ".\gc.h"\
+ ".\gc_hdrs.h"\
+ ".\gc_priv.h"\
+ {$(INCLUDE)}"\sys\TYPES.H"\
+
+NODEP_CPP_HEADE=\
+ ".\th\PCR_Th.h"\
+ ".\th\PCR_ThCrSec.h"\
+ ".\th\PCR_ThCtl.h"\
+
+
+".\Debug\headers.obj" : $(SOURCE) $(DEP_CPP_HEADE) "$(INTDIR)"
+
+".\Debug\headers.sbr" : $(SOURCE) $(DEP_CPP_HEADE) "$(INTDIR)"
+
+
+!ENDIF
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\alloc.c
+
+!IF "$(CFG)" == "gc - Win32 Release"
+
+DEP_CPP_ALLOC=\
+ ".\config.h"\
+ ".\gc.h"\
+ ".\gc_hdrs.h"\
+ ".\gc_priv.h"\
+ {$(INCLUDE)}"\sys\TYPES.H"\
+
+NODEP_CPP_ALLOC=\
+ ".\th\PCR_Th.h"\
+ ".\th\PCR_ThCrSec.h"\
+ ".\th\PCR_ThCtl.h"\
+
+
+".\Release\alloc.obj" : $(SOURCE) $(DEP_CPP_ALLOC) "$(INTDIR)"
+
+".\Release\alloc.sbr" : $(SOURCE) $(DEP_CPP_ALLOC) "$(INTDIR)"
+
+
+!ELSEIF "$(CFG)" == "gc - Win32 Debug"
+
+DEP_CPP_ALLOC=\
+ ".\config.h"\
+ ".\gc.h"\
+ ".\gc_hdrs.h"\
+ ".\gc_priv.h"\
+ {$(INCLUDE)}"\sys\TYPES.H"\
+
+NODEP_CPP_ALLOC=\
+ ".\th\PCR_Th.h"\
+ ".\th\PCR_ThCrSec.h"\
+ ".\th\PCR_ThCtl.h"\
+
+
+".\Debug\alloc.obj" : $(SOURCE) $(DEP_CPP_ALLOC) "$(INTDIR)"
+
+".\Debug\alloc.sbr" : $(SOURCE) $(DEP_CPP_ALLOC) "$(INTDIR)"
+
+
+!ENDIF
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\allchblk.c
+
+!IF "$(CFG)" == "gc - Win32 Release"
+
+DEP_CPP_ALLCH=\
+ ".\config.h"\
+ ".\gc.h"\
+ ".\gc_hdrs.h"\
+ ".\gc_priv.h"\
+ {$(INCLUDE)}"\sys\TYPES.H"\
+
+NODEP_CPP_ALLCH=\
+ ".\th\PCR_Th.h"\
+ ".\th\PCR_ThCrSec.h"\
+ ".\th\PCR_ThCtl.h"\
+
+
+".\Release\allchblk.obj" : $(SOURCE) $(DEP_CPP_ALLCH) "$(INTDIR)"
+
+".\Release\allchblk.sbr" : $(SOURCE) $(DEP_CPP_ALLCH) "$(INTDIR)"
+
+
+!ELSEIF "$(CFG)" == "gc - Win32 Debug"
+
+DEP_CPP_ALLCH=\
+ ".\config.h"\
+ ".\gc.h"\
+ ".\gc_hdrs.h"\
+ ".\gc_priv.h"\
+ {$(INCLUDE)}"\sys\TYPES.H"\
+
+NODEP_CPP_ALLCH=\
+ ".\th\PCR_Th.h"\
+ ".\th\PCR_ThCrSec.h"\
+ ".\th\PCR_ThCtl.h"\
+
+
+".\Debug\allchblk.obj" : $(SOURCE) $(DEP_CPP_ALLCH) "$(INTDIR)"
+
+".\Debug\allchblk.sbr" : $(SOURCE) $(DEP_CPP_ALLCH) "$(INTDIR)"
+
+
+!ENDIF
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\stubborn.c
+
+!IF "$(CFG)" == "gc - Win32 Release"
+
+DEP_CPP_STUBB=\
+ ".\config.h"\
+ ".\gc.h"\
+ ".\gc_hdrs.h"\
+ ".\gc_priv.h"\
+ {$(INCLUDE)}"\sys\TYPES.H"\
+
+NODEP_CPP_STUBB=\
+ ".\th\PCR_Th.h"\
+ ".\th\PCR_ThCrSec.h"\
+ ".\th\PCR_ThCtl.h"\
+
+
+".\Release\stubborn.obj" : $(SOURCE) $(DEP_CPP_STUBB) "$(INTDIR)"
+
+".\Release\stubborn.sbr" : $(SOURCE) $(DEP_CPP_STUBB) "$(INTDIR)"
+
+
+!ELSEIF "$(CFG)" == "gc - Win32 Debug"
+
+DEP_CPP_STUBB=\
+ ".\config.h"\
+ ".\gc.h"\
+ ".\gc_hdrs.h"\
+ ".\gc_priv.h"\
+ {$(INCLUDE)}"\sys\TYPES.H"\
+
+NODEP_CPP_STUBB=\
+ ".\th\PCR_Th.h"\
+ ".\th\PCR_ThCrSec.h"\
+ ".\th\PCR_ThCtl.h"\
+
+
+".\Debug\stubborn.obj" : $(SOURCE) $(DEP_CPP_STUBB) "$(INTDIR)"
+
+".\Debug\stubborn.sbr" : $(SOURCE) $(DEP_CPP_STUBB) "$(INTDIR)"
+
+
+!ENDIF
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\obj_map.c
+
+!IF "$(CFG)" == "gc - Win32 Release"
+
+DEP_CPP_OBJ_M=\
+ ".\config.h"\
+ ".\gc.h"\
+ ".\gc_hdrs.h"\
+ ".\gc_priv.h"\
+ {$(INCLUDE)}"\sys\TYPES.H"\
+
+NODEP_CPP_OBJ_M=\
+ ".\th\PCR_Th.h"\
+ ".\th\PCR_ThCrSec.h"\
+ ".\th\PCR_ThCtl.h"\
+
+
+".\Release\obj_map.obj" : $(SOURCE) $(DEP_CPP_OBJ_M) "$(INTDIR)"
+
+".\Release\obj_map.sbr" : $(SOURCE) $(DEP_CPP_OBJ_M) "$(INTDIR)"
+
+
+!ELSEIF "$(CFG)" == "gc - Win32 Debug"
+
+DEP_CPP_OBJ_M=\
+ ".\config.h"\
+ ".\gc.h"\
+ ".\gc_hdrs.h"\
+ ".\gc_priv.h"\
+ {$(INCLUDE)}"\sys\TYPES.H"\
+
+NODEP_CPP_OBJ_M=\
+ ".\th\PCR_Th.h"\
+ ".\th\PCR_ThCrSec.h"\
+ ".\th\PCR_ThCtl.h"\
+
+
+".\Debug\obj_map.obj" : $(SOURCE) $(DEP_CPP_OBJ_M) "$(INTDIR)"
+
+".\Debug\obj_map.sbr" : $(SOURCE) $(DEP_CPP_OBJ_M) "$(INTDIR)"
+
+
+!ENDIF
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\new_hblk.c
+
+!IF "$(CFG)" == "gc - Win32 Release"
+
+DEP_CPP_NEW_H=\
+ ".\config.h"\
+ ".\gc.h"\
+ ".\gc_hdrs.h"\
+ ".\gc_priv.h"\
+ {$(INCLUDE)}"\sys\TYPES.H"\
+
+NODEP_CPP_NEW_H=\
+ ".\th\PCR_Th.h"\
+ ".\th\PCR_ThCrSec.h"\
+ ".\th\PCR_ThCtl.h"\
+
+
+".\Release\new_hblk.obj" : $(SOURCE) $(DEP_CPP_NEW_H) "$(INTDIR)"
+
+".\Release\new_hblk.sbr" : $(SOURCE) $(DEP_CPP_NEW_H) "$(INTDIR)"
+
+
+!ELSEIF "$(CFG)" == "gc - Win32 Debug"
+
+DEP_CPP_NEW_H=\
+ ".\config.h"\
+ ".\gc.h"\
+ ".\gc_hdrs.h"\
+ ".\gc_priv.h"\
+ {$(INCLUDE)}"\sys\TYPES.H"\
+
+NODEP_CPP_NEW_H=\
+ ".\th\PCR_Th.h"\
+ ".\th\PCR_ThCrSec.h"\
+ ".\th\PCR_ThCtl.h"\
+
+
+".\Debug\new_hblk.obj" : $(SOURCE) $(DEP_CPP_NEW_H) "$(INTDIR)"
+
+".\Debug\new_hblk.sbr" : $(SOURCE) $(DEP_CPP_NEW_H) "$(INTDIR)"
+
+
+!ENDIF
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\mark.c
+
+!IF "$(CFG)" == "gc - Win32 Release"
+
+DEP_CPP_MARK_C=\
+ ".\config.h"\
+ ".\gc.h"\
+ ".\gc_hdrs.h"\
+ ".\gc_mark.h"\
+ ".\gc_priv.h"\
+ {$(INCLUDE)}"\sys\TYPES.H"\
+
+NODEP_CPP_MARK_C=\
+ ".\th\PCR_Th.h"\
+ ".\th\PCR_ThCrSec.h"\
+ ".\th\PCR_ThCtl.h"\
+
+
+".\Release\mark.obj" : $(SOURCE) $(DEP_CPP_MARK_C) "$(INTDIR)"
+
+".\Release\mark.sbr" : $(SOURCE) $(DEP_CPP_MARK_C) "$(INTDIR)"
+
+
+!ELSEIF "$(CFG)" == "gc - Win32 Debug"
+
+DEP_CPP_MARK_C=\
+ ".\config.h"\
+ ".\gc.h"\
+ ".\gc_hdrs.h"\
+ ".\gc_mark.h"\
+ ".\gc_priv.h"\
+ {$(INCLUDE)}"\sys\TYPES.H"\
+
+NODEP_CPP_MARK_C=\
+ ".\th\PCR_Th.h"\
+ ".\th\PCR_ThCrSec.h"\
+ ".\th\PCR_ThCtl.h"\
+
+
+".\Debug\mark.obj" : $(SOURCE) $(DEP_CPP_MARK_C) "$(INTDIR)"
+
+".\Debug\mark.sbr" : $(SOURCE) $(DEP_CPP_MARK_C) "$(INTDIR)"
+
+
+!ENDIF
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\malloc.c
+
+!IF "$(CFG)" == "gc - Win32 Release"
+
+DEP_CPP_MALLO=\
+ ".\config.h"\
+ ".\gc.h"\
+ ".\gc_hdrs.h"\
+ ".\gc_priv.h"\
+ {$(INCLUDE)}"\sys\TYPES.H"\
+
+NODEP_CPP_MALLO=\
+ ".\th\PCR_Th.h"\
+ ".\th\PCR_ThCrSec.h"\
+ ".\th\PCR_ThCtl.h"\
+
+
+".\Release\malloc.obj" : $(SOURCE) $(DEP_CPP_MALLO) "$(INTDIR)"
+
+".\Release\malloc.sbr" : $(SOURCE) $(DEP_CPP_MALLO) "$(INTDIR)"
+
+
+!ELSEIF "$(CFG)" == "gc - Win32 Debug"
+
+DEP_CPP_MALLO=\
+ ".\config.h"\
+ ".\gc.h"\
+ ".\gc_hdrs.h"\
+ ".\gc_priv.h"\
+ {$(INCLUDE)}"\sys\TYPES.H"\
+
+NODEP_CPP_MALLO=\
+ ".\th\PCR_Th.h"\
+ ".\th\PCR_ThCrSec.h"\
+ ".\th\PCR_ThCtl.h"\
+
+
+".\Debug\malloc.obj" : $(SOURCE) $(DEP_CPP_MALLO) "$(INTDIR)"
+
+".\Debug\malloc.sbr" : $(SOURCE) $(DEP_CPP_MALLO) "$(INTDIR)"
+
+
+!ENDIF
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\mallocx.c
+
+!IF "$(CFG)" == "gc - Win32 Release"
+
+DEP_CPP_MALLX=\
+ ".\config.h"\
+ ".\gc.h"\
+ ".\gc_hdrs.h"\
+ ".\gc_priv.h"\
+ {$(INCLUDE)}"\sys\TYPES.H"\
+
+NODEP_CPP_MALLX=\
+ ".\th\PCR_Th.h"\
+ ".\th\PCR_ThCrSec.h"\
+ ".\th\PCR_ThCtl.h"\
+
+
+".\Release\mallocx.obj" : $(SOURCE) $(DEP_CPP_MALLX) "$(INTDIR)"
+
+".\Release\mallocx.sbr" : $(SOURCE) $(DEP_CPP_MALLX) "$(INTDIR)"
+
+
+!ELSEIF "$(CFG)" == "gc - Win32 Debug"
+
+DEP_CPP_MALLX=\
+ ".\config.h"\
+ ".\gc.h"\
+ ".\gc_hdrs.h"\
+ ".\gc_priv.h"\
+ {$(INCLUDE)}"\sys\TYPES.H"\
+
+NODEP_CPP_MALLX=\
+ ".\th\PCR_Th.h"\
+ ".\th\PCR_ThCrSec.h"\
+ ".\th\PCR_ThCtl.h"\
+
+
+".\Debug\mallocx.obj" : $(SOURCE) $(DEP_CPP_MALLX) "$(INTDIR)"
+
+".\Debug\mallocx.sbr" : $(SOURCE) $(DEP_CPP_MALLX) "$(INTDIR)"
+
+
+!ENDIF
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\finalize.c
+
+!IF "$(CFG)" == "gc - Win32 Release"
+
+DEP_CPP_FINAL=\
+ ".\config.h"\
+ ".\gc.h"\
+ ".\gc_hdrs.h"\
+ ".\gc_mark.h"\
+ ".\gc_priv.h"\
+ {$(INCLUDE)}"\sys\TYPES.H"\
+
+NODEP_CPP_FINAL=\
+ ".\th\PCR_Th.h"\
+ ".\th\PCR_ThCrSec.h"\
+ ".\th\PCR_ThCtl.h"\
+
+
+".\Release\finalize.obj" : $(SOURCE) $(DEP_CPP_FINAL) "$(INTDIR)"
+
+".\Release\finalize.sbr" : $(SOURCE) $(DEP_CPP_FINAL) "$(INTDIR)"
+
+
+!ELSEIF "$(CFG)" == "gc - Win32 Debug"
+
+DEP_CPP_FINAL=\
+ ".\config.h"\
+ ".\gc.h"\
+ ".\gc_hdrs.h"\
+ ".\gc_mark.h"\
+ ".\gc_priv.h"\
+ {$(INCLUDE)}"\sys\TYPES.H"\
+
+NODEP_CPP_FINAL=\
+ ".\th\PCR_Th.h"\
+ ".\th\PCR_ThCrSec.h"\
+ ".\th\PCR_ThCtl.h"\
+
+
+".\Debug\finalize.obj" : $(SOURCE) $(DEP_CPP_FINAL) "$(INTDIR)"
+
+".\Debug\finalize.sbr" : $(SOURCE) $(DEP_CPP_FINAL) "$(INTDIR)"
+
+
+!ENDIF
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\dbg_mlc.c
+
+!IF "$(CFG)" == "gc - Win32 Release"
+
+DEP_CPP_DBG_M=\
+ ".\config.h"\
+ ".\gc.h"\
+ ".\gc_hdrs.h"\
+ ".\gc_priv.h"\
+ {$(INCLUDE)}"\sys\TYPES.H"\
+
+NODEP_CPP_DBG_M=\
+ ".\th\PCR_Th.h"\
+ ".\th\PCR_ThCrSec.h"\
+ ".\th\PCR_ThCtl.h"\
+
+
+".\Release\dbg_mlc.obj" : $(SOURCE) $(DEP_CPP_DBG_M) "$(INTDIR)"
+
+".\Release\dbg_mlc.sbr" : $(SOURCE) $(DEP_CPP_DBG_M) "$(INTDIR)"
+
+
+!ELSEIF "$(CFG)" == "gc - Win32 Debug"
+
+DEP_CPP_DBG_M=\
+ ".\config.h"\
+ ".\gc.h"\
+ ".\gc_hdrs.h"\
+ ".\gc_priv.h"\
+ {$(INCLUDE)}"\sys\TYPES.H"\
+
+NODEP_CPP_DBG_M=\
+ ".\th\PCR_Th.h"\
+ ".\th\PCR_ThCrSec.h"\
+ ".\th\PCR_ThCtl.h"\
+
+
+".\Debug\dbg_mlc.obj" : $(SOURCE) $(DEP_CPP_DBG_M) "$(INTDIR)"
+
+".\Debug\dbg_mlc.sbr" : $(SOURCE) $(DEP_CPP_DBG_M) "$(INTDIR)"
+
+
+!ENDIF
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\blacklst.c
+
+!IF "$(CFG)" == "gc - Win32 Release"
+
+DEP_CPP_BLACK=\
+ ".\config.h"\
+ ".\gc.h"\
+ ".\gc_hdrs.h"\
+ ".\gc_priv.h"\
+ {$(INCLUDE)}"\sys\TYPES.H"\
+
+NODEP_CPP_BLACK=\
+ ".\th\PCR_Th.h"\
+ ".\th\PCR_ThCrSec.h"\
+ ".\th\PCR_ThCtl.h"\
+
+
+".\Release\blacklst.obj" : $(SOURCE) $(DEP_CPP_BLACK) "$(INTDIR)"
+
+".\Release\blacklst.sbr" : $(SOURCE) $(DEP_CPP_BLACK) "$(INTDIR)"
+
+
+!ELSEIF "$(CFG)" == "gc - Win32 Debug"
+
+DEP_CPP_BLACK=\
+ ".\config.h"\
+ ".\gc.h"\
+ ".\gc_hdrs.h"\
+ ".\gc_priv.h"\
+ {$(INCLUDE)}"\sys\TYPES.H"\
+
+NODEP_CPP_BLACK=\
+ ".\th\PCR_Th.h"\
+ ".\th\PCR_ThCrSec.h"\
+ ".\th\PCR_ThCtl.h"\
+
+
+".\Debug\blacklst.obj" : $(SOURCE) $(DEP_CPP_BLACK) "$(INTDIR)"
+
+".\Debug\blacklst.sbr" : $(SOURCE) $(DEP_CPP_BLACK) "$(INTDIR)"
+
+
+!ENDIF
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\typd_mlc.c
+
+!IF "$(CFG)" == "gc - Win32 Release"
+
+DEP_CPP_TYPD_=\
+ ".\config.h"\
+ ".\gc.h"\
+ ".\gc_hdrs.h"\
+ ".\gc_mark.h"\
+ ".\gc_priv.h"\
+ ".\gc_typed.h"\
+ {$(INCLUDE)}"\sys\TYPES.H"\
+
+NODEP_CPP_TYPD_=\
+ ".\th\PCR_Th.h"\
+ ".\th\PCR_ThCrSec.h"\
+ ".\th\PCR_ThCtl.h"\
+
+
+".\Release\typd_mlc.obj" : $(SOURCE) $(DEP_CPP_TYPD_) "$(INTDIR)"
+
+".\Release\typd_mlc.sbr" : $(SOURCE) $(DEP_CPP_TYPD_) "$(INTDIR)"
+
+
+!ELSEIF "$(CFG)" == "gc - Win32 Debug"
+
+DEP_CPP_TYPD_=\
+ ".\config.h"\
+ ".\gc.h"\
+ ".\gc_hdrs.h"\
+ ".\gc_mark.h"\
+ ".\gc_priv.h"\
+ ".\gc_typed.h"\
+ {$(INCLUDE)}"\sys\TYPES.H"\
+
+NODEP_CPP_TYPD_=\
+ ".\th\PCR_Th.h"\
+ ".\th\PCR_ThCrSec.h"\
+ ".\th\PCR_ThCtl.h"\
+
+
+".\Debug\typd_mlc.obj" : $(SOURCE) $(DEP_CPP_TYPD_) "$(INTDIR)"
+
+".\Debug\typd_mlc.sbr" : $(SOURCE) $(DEP_CPP_TYPD_) "$(INTDIR)"
+
+
+!ENDIF
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\ptr_chck.c
+
+!IF "$(CFG)" == "gc - Win32 Release"
+
+DEP_CPP_PTR_C=\
+ ".\config.h"\
+ ".\gc.h"\
+ ".\gc_hdrs.h"\
+ ".\gc_mark.h"\
+ ".\gc_priv.h"\
+ {$(INCLUDE)}"\sys\TYPES.H"\
+
+NODEP_CPP_PTR_C=\
+ ".\th\PCR_Th.h"\
+ ".\th\PCR_ThCrSec.h"\
+ ".\th\PCR_ThCtl.h"\
+
+
+".\Release\ptr_chck.obj" : $(SOURCE) $(DEP_CPP_PTR_C) "$(INTDIR)"
+
+".\Release\ptr_chck.sbr" : $(SOURCE) $(DEP_CPP_PTR_C) "$(INTDIR)"
+
+
+!ELSEIF "$(CFG)" == "gc - Win32 Debug"
+
+DEP_CPP_PTR_C=\
+ ".\config.h"\
+ ".\gc.h"\
+ ".\gc_hdrs.h"\
+ ".\gc_mark.h"\
+ ".\gc_priv.h"\
+ {$(INCLUDE)}"\sys\TYPES.H"\
+
+NODEP_CPP_PTR_C=\
+ ".\th\PCR_Th.h"\
+ ".\th\PCR_ThCrSec.h"\
+ ".\th\PCR_ThCtl.h"\
+
+
+".\Debug\ptr_chck.obj" : $(SOURCE) $(DEP_CPP_PTR_C) "$(INTDIR)"
+
+".\Debug\ptr_chck.sbr" : $(SOURCE) $(DEP_CPP_PTR_C) "$(INTDIR)"
+
+
+!ENDIF
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\dyn_load.c
+
+!IF "$(CFG)" == "gc - Win32 Release"
+
+DEP_CPP_DYN_L=\
+ ".\config.h"\
+ ".\gc.h"\
+ ".\gc_hdrs.h"\
+ ".\gc_priv.h"\
+ {$(INCLUDE)}"\sys\STAT.H"\
+ {$(INCLUDE)}"\sys\TYPES.H"\
+
+NODEP_CPP_DYN_L=\
+ ".\il\PCR_IL.h"\
+ ".\mm\PCR_MM.h"\
+ ".\th\PCR_Th.h"\
+ ".\th\PCR_ThCrSec.h"\
+ ".\th\PCR_ThCtl.h"\
+
+
+".\Release\dyn_load.obj" : $(SOURCE) $(DEP_CPP_DYN_L) "$(INTDIR)"
+
+".\Release\dyn_load.sbr" : $(SOURCE) $(DEP_CPP_DYN_L) "$(INTDIR)"
+
+
+!ELSEIF "$(CFG)" == "gc - Win32 Debug"
+
+DEP_CPP_DYN_L=\
+ ".\config.h"\
+ ".\gc.h"\
+ ".\gc_hdrs.h"\
+ ".\gc_priv.h"\
+ {$(INCLUDE)}"\sys\STAT.H"\
+ {$(INCLUDE)}"\sys\TYPES.H"\
+
+NODEP_CPP_DYN_L=\
+ ".\il\PCR_IL.h"\
+ ".\mm\PCR_MM.h"\
+ ".\th\PCR_Th.h"\
+ ".\th\PCR_ThCrSec.h"\
+ ".\th\PCR_ThCtl.h"\
+
+
+".\Debug\dyn_load.obj" : $(SOURCE) $(DEP_CPP_DYN_L) "$(INTDIR)"
+
+".\Debug\dyn_load.sbr" : $(SOURCE) $(DEP_CPP_DYN_L) "$(INTDIR)"
+
+
+!ENDIF
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\win32_threads.c
+
+!IF "$(CFG)" == "gc - Win32 Release"
+
+DEP_CPP_WIN32=\
+ ".\config.h"\
+ ".\gc.h"\
+ ".\gc_hdrs.h"\
+ ".\gc_priv.h"\
+ {$(INCLUDE)}"\sys\TYPES.H"\
+
+NODEP_CPP_WIN32=\
+ ".\th\PCR_Th.h"\
+ ".\th\PCR_ThCrSec.h"\
+ ".\th\PCR_ThCtl.h"\
+
+
+".\Release\win32_threads.obj" : $(SOURCE) $(DEP_CPP_WIN32) "$(INTDIR)"
+
+".\Release\win32_threads.sbr" : $(SOURCE) $(DEP_CPP_WIN32) "$(INTDIR)"
+
+
+!ELSEIF "$(CFG)" == "gc - Win32 Debug"
+
+DEP_CPP_WIN32=\
+ ".\config.h"\
+ ".\gc.h"\
+ ".\gc_hdrs.h"\
+ ".\gc_priv.h"\
+ {$(INCLUDE)}"\sys\TYPES.H"\
+
+NODEP_CPP_WIN32=\
+ ".\th\PCR_Th.h"\
+ ".\th\PCR_ThCrSec.h"\
+ ".\th\PCR_ThCtl.h"\
+
+
+".\Debug\win32_threads.obj" : $(SOURCE) $(DEP_CPP_WIN32) "$(INTDIR)"
+
+".\Debug\win32_threads.sbr" : $(SOURCE) $(DEP_CPP_WIN32) "$(INTDIR)"
+
+
+!ENDIF
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\checksums.c
+
+!IF "$(CFG)" == "gc - Win32 Release"
+
+DEP_CPP_CHECK=\
+ ".\config.h"\
+ ".\gc.h"\
+ ".\gc_hdrs.h"\
+ ".\gc_priv.h"\
+ {$(INCLUDE)}"\sys\TYPES.H"\
+
+NODEP_CPP_CHECK=\
+ ".\th\PCR_Th.h"\
+ ".\th\PCR_ThCrSec.h"\
+ ".\th\PCR_ThCtl.h"\
+
+
+".\Release\checksums.obj" : $(SOURCE) $(DEP_CPP_CHECK) "$(INTDIR)"
+
+".\Release\checksums.sbr" : $(SOURCE) $(DEP_CPP_CHECK) "$(INTDIR)"
+
+
+!ELSEIF "$(CFG)" == "gc - Win32 Debug"
+
+DEP_CPP_CHECK=\
+ ".\config.h"\
+ ".\gc.h"\
+ ".\gc_hdrs.h"\
+ ".\gc_priv.h"\
+ {$(INCLUDE)}"\sys\TYPES.H"\
+
+NODEP_CPP_CHECK=\
+ ".\th\PCR_Th.h"\
+ ".\th\PCR_ThCrSec.h"\
+ ".\th\PCR_ThCtl.h"\
+
+
+".\Debug\checksums.obj" : $(SOURCE) $(DEP_CPP_CHECK) "$(INTDIR)"
+
+".\Debug\checksums.sbr" : $(SOURCE) $(DEP_CPP_CHECK) "$(INTDIR)"
+
+
+!ENDIF
+
+# End Source File
+# End Target
+################################################################################
+# Begin Target
+
+# Name "gctest - Win32 Release"
+# Name "gctest - Win32 Debug"
+
+!IF "$(CFG)" == "gctest - Win32 Release"
+
+!ELSEIF "$(CFG)" == "gctest - Win32 Debug"
+
+!ENDIF
+
+################################################################################
+# Begin Project Dependency
+
+# Project_Dep_Name "gc"
+
+!IF "$(CFG)" == "gctest - Win32 Release"
+
+"gc - Win32 Release" :
+ $(MAKE) /$(MAKEFLAGS) /F ".\gc.mak" CFG="gc - Win32 Release"
+
+!ELSEIF "$(CFG)" == "gctest - Win32 Debug"
+
+"gc - Win32 Debug" :
+ $(MAKE) /$(MAKEFLAGS) /F ".\gc.mak" CFG="gc - Win32 Debug"
+
+!ENDIF
+
+# End Project Dependency
+################################################################################
+# Begin Source File
+
+SOURCE=.\test.c
+DEP_CPP_TEST_=\
+ ".\config.h"\
+ ".\gc.h"\
+ ".\gc_hdrs.h"\
+ ".\gc_priv.h"\
+ ".\gc_typed.h"\
+ {$(INCLUDE)}"\sys\TYPES.H"\
+
+NODEP_CPP_TEST_=\
+ ".\th\PCR_Th.h"\
+ ".\th\PCR_ThCrSec.h"\
+ ".\th\PCR_ThCtl.h"\
+
+
+!IF "$(CFG)" == "gctest - Win32 Release"
+
+
+".\gctest\Release\test.obj" : $(SOURCE) $(DEP_CPP_TEST_) "$(INTDIR)"
+
+
+!ELSEIF "$(CFG)" == "gctest - Win32 Debug"
+
+
+".\gctest\Debug\test.obj" : $(SOURCE) $(DEP_CPP_TEST_) "$(INTDIR)"
+
+".\gctest\Debug\test.sbr" : $(SOURCE) $(DEP_CPP_TEST_) "$(INTDIR)"
+
+
+!ENDIF
+
+# End Source File
+# End Target
+################################################################################
+# Begin Target
+
+# Name "cord - Win32 Release"
+# Name "cord - Win32 Debug"
+
+!IF "$(CFG)" == "cord - Win32 Release"
+
+!ELSEIF "$(CFG)" == "cord - Win32 Debug"
+
+!ENDIF
+
+################################################################################
+# Begin Project Dependency
+
+# Project_Dep_Name "gc"
+
+!IF "$(CFG)" == "cord - Win32 Release"
+
+"gc - Win32 Release" :
+ $(MAKE) /$(MAKEFLAGS) /F ".\gc.mak" CFG="gc - Win32 Release"
+
+!ELSEIF "$(CFG)" == "cord - Win32 Debug"
+
+"gc - Win32 Debug" :
+ $(MAKE) /$(MAKEFLAGS) /F ".\gc.mak" CFG="gc - Win32 Debug"
+
+!ENDIF
+
+# End Project Dependency
+################################################################################
+# Begin Source File
+
+SOURCE=.\cord\de_win.c
+DEP_CPP_DE_WI=\
+ ".\cord\cord.h"\
+ ".\cord\de_cmds.h"\
+ ".\cord\de_win.h"\
+ ".\cord\private\cord_pos.h"\
+
+NODEP_CPP_DE_WI=\
+ ".\cord\gc.h"\
+
+
+!IF "$(CFG)" == "cord - Win32 Release"
+
+
+".\cord\Release\de_win.obj" : $(SOURCE) $(DEP_CPP_DE_WI) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+!ELSEIF "$(CFG)" == "cord - Win32 Debug"
+
+
+".\cord\Debug\de_win.obj" : $(SOURCE) $(DEP_CPP_DE_WI) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+!ENDIF
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\cord\de.c
+DEP_CPP_DE_C2e=\
+ ".\cord\cord.h"\
+ ".\cord\de_cmds.h"\
+ ".\cord\de_win.h"\
+ ".\cord\private\cord_pos.h"\
+
+NODEP_CPP_DE_C2e=\
+ ".\cord\gc.h"\
+
+
+!IF "$(CFG)" == "cord - Win32 Release"
+
+
+".\cord\Release\de.obj" : $(SOURCE) $(DEP_CPP_DE_C2e) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+!ELSEIF "$(CFG)" == "cord - Win32 Debug"
+
+
+".\cord\Debug\de.obj" : $(SOURCE) $(DEP_CPP_DE_C2e) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+!ENDIF
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\cord\cordxtra.c
+DEP_CPP_CORDX=\
+ ".\cord\cord.h"\
+ ".\cord\ec.h"\
+ ".\cord\private\cord_pos.h"\
+
+NODEP_CPP_CORDX=\
+ ".\cord\gc.h"\
+
+
+!IF "$(CFG)" == "cord - Win32 Release"
+
+
+".\cord\Release\cordxtra.obj" : $(SOURCE) $(DEP_CPP_CORDX) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+!ELSEIF "$(CFG)" == "cord - Win32 Debug"
+
+
+".\cord\Debug\cordxtra.obj" : $(SOURCE) $(DEP_CPP_CORDX) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+!ENDIF
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\cord\cordbscs.c
+DEP_CPP_CORDB=\
+ ".\cord\cord.h"\
+ ".\cord\private\cord_pos.h"\
+
+NODEP_CPP_CORDB=\
+ ".\cord\gc.h"\
+
+
+!IF "$(CFG)" == "cord - Win32 Release"
+
+
+".\cord\Release\cordbscs.obj" : $(SOURCE) $(DEP_CPP_CORDB) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+!ELSEIF "$(CFG)" == "cord - Win32 Debug"
+
+
+".\cord\Debug\cordbscs.obj" : $(SOURCE) $(DEP_CPP_CORDB) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+!ENDIF
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\cord\de_win.RC
+
+!IF "$(CFG)" == "cord - Win32 Release"
+
+
+".\cord\Release\de_win.res" : $(SOURCE) "$(INTDIR)"
+ $(RSC) /l 0x809 /fo"$(INTDIR)/de_win.res" /i "cord" /d "NDEBUG" $(SOURCE)
+
+
+!ELSEIF "$(CFG)" == "cord - Win32 Debug"
+
+
+".\cord\Debug\de_win.res" : $(SOURCE) "$(INTDIR)"
+ $(RSC) /l 0x809 /fo"$(INTDIR)/de_win.res" /i "cord" /d "_DEBUG" $(SOURCE)
+
+
+!ENDIF
+
+# End Source File
+# End Target
+# End Project
+################################################################################
diff --git a/boehm-gc/gc.man b/boehm-gc/gc.man
new file mode 100644
index 00000000000..5409e706550
--- /dev/null
+++ b/boehm-gc/gc.man
@@ -0,0 +1,80 @@
+.TH GC_MALLOC 1L "12 February 1996"
+.SH NAME
+GC_malloc, GC_malloc_atomic, GC_free, GC_realloc, GC_enable_incremental, GC_register_finalizer, GC_malloc_ignore_off_page, GC_malloc_atomic_ignore_off_page, GC_set_warn_proc \- Garbage collecting malloc replacement
+.SH SYNOPSIS
+#include "gc.h"
+.br
+# define malloc(n) GC_malloc(n)
+.br
+... malloc(...) ...
+.br
+.sp
+cc ... gc.a
+.LP
+.SH DESCRIPTION
+.I GC_malloc
+and
+.I GC_free
+are plug-in replacements for standard malloc and free. However,
+.I
+GC_malloc
+will attempt to reclaim inaccessible space automatically by invoking a conservative garbage collector at appropriate points. The collector traverses all data structures accessible by following pointers from the machines registers, stack(s), data, and bss segments. Inaccessible structures will be reclaimed. A machine word is considered to be a valid pointer if it is an address inside an object allocated by
+.I
+GC_malloc
+or friends.
+.LP
+See the documentation in the include file gc_cpp.h for an alternate, C++ specific interface to the garbage collector.
+.LP
+Unlike the standard implementations of malloc,
+.I
+GC_malloc
+clears the newly allocated storage.
+.I
+GC_malloc_atomic
+does not. Furthermore, it informs the collector that the resulting object will never contain any pointers, and should therefore not be scanned by the collector.
+.LP
+.I
+GC_free
+can be used to deallocate objects, but its use is optional, and generally discouraged.
+.I
+GC_realloc
+has the standard realloc semantics. It preserves pointer-free-ness.
+.I
+GC_register_finalizer
+allows for registration of functions that are invoked when an object becomes inaccessible.
+.LP
+The garbage collector tries to avoid allocating memory at locations that already appear to be referenced before allocation. (Such apparent ``pointers'' are usually large integers and the like that just happen to look like an address.) This may make it hard to allocate very large objects. An attempt to do so may generate a warning.
+.LP
+.I
+GC_malloc_ignore_off_page
+and
+.I
+GC_malloc_atomic_ignore_off_page
+inform the collector that the client code will always maintain a pointer to near the beginning of the object (within the first 512 bytes), and that pointers beyond that can be ignored by the collector. This makes it much easier for the collector to place large objects. These are recommended for large object allocation. (Objects expected to be larger than about 100KBytes should be allocated this way.)
+.LP
+It is also possible to use the collector to find storage leaks in programs destined to be run with standard malloc/free. The collector can be compiled for thread-safe operation. Unlike standard malloc, it is safe to call malloc after a previous malloc call was interrupted by a signal, provided the original malloc call is not resumed.
+.LP
+The collector may, on rare occasion produce warning messages. On UNIX machines these appear on stderr. Warning messages can be filtered, redirected, or ignored with
+.I
+GC_set_warn_proc.
+This is recommended for production code. See gc.h for details.
+.LP
+Debugging versions of many of the above routines are provided as macros. Their names are identical to the above, but consist of all capital letters. If GC_DEBUG is defined before gc.h is included, these routines do additional checking, and allow the leak detecting version of the collector to produce slightly more useful output. Without GC_DEBUG defined, they behave exactly like the lower-case versions.
+.LP
+On some machines, collection will be performed incrementally after a call to
+.I
+GC_enable_incremental.
+This may temporarily write protect pages in the heap. See the README file for more information on how this interacts with system calls that write to the heap.
+.LP
+Other facilities not discussed here include limited facilities to support incremental collection on machines without appropriate VM support, provisions for providing more explicit object layout information to the garbage collector, more direct support for ``weak'' pointers, support for ``abortable'' garbage collections during idle time, etc.
+.LP
+.SH "SEE ALSO"
+The README and gc.h files in the distribution. More detailed definitions of the functions exported by the collector are given there. (The above list is not complete.)
+.LP
+Boehm, H., and M. Weiser, "Garbage Collection in an Uncooperative Environment",
+\fISoftware Practice & Experience\fP, September 1988, pp. 807-820.
+.LP
+The malloc(3) man page.
+.LP
+.SH AUTHOR
+Hans-J. Boehm (boehm@parc.xerox.com). Some of the code was written by others, most notably Alan Demers.
diff --git a/boehm-gc/gc_alloc.h b/boehm-gc/gc_alloc.h
new file mode 100644
index 00000000000..1d912db2f0b
--- /dev/null
+++ b/boehm-gc/gc_alloc.h
@@ -0,0 +1,380 @@
+/*
+ * Copyright (c) 1996-1998 by Silicon Graphics. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+//
+// This is a C++ header file that is intended to replace the SGI STL
+// alloc.h.
+//
+// This assumes the collector has been compiled with -DATOMIC_UNCOLLECTABLE
+// and -DALL_INTERIOR_POINTERS. We also recommend
+// -DREDIRECT_MALLOC=GC_uncollectable_malloc.
+//
+// Some of this could be faster in the explicit deallocation case. In particular,
+// we spend too much time clearing objects on the free lists. That could be avoided.
+//
+// This uses template classes with static members, and hence does not work
+// with g++ 2.7.2 and earlier.
+//
+
+#include "gc.h"
+
+#ifndef GC_ALLOC_H
+
+#define GC_ALLOC_H
+#define __ALLOC_H // Prevent inclusion of the default version. Ugly.
+#define __SGI_STL_ALLOC_H
+#define __SGI_STL_INTERNAL_ALLOC_H
+
+#ifndef __ALLOC
+# define __ALLOC alloc
+#endif
+
+#include <stddef.h>
+#include <string.h>
+
+// The following is just replicated from the conventional SGI alloc.h:
+
+template<class T, class alloc>
+class simple_alloc {
+
+public:
+ static T *allocate(size_t n)
+ { return 0 == n? 0 : (T*) alloc::allocate(n * sizeof (T)); }
+ static T *allocate(void)
+ { return (T*) alloc::allocate(sizeof (T)); }
+ static void deallocate(T *p, size_t n)
+ { if (0 != n) alloc::deallocate(p, n * sizeof (T)); }
+ static void deallocate(T *p)
+ { alloc::deallocate(p, sizeof (T)); }
+};
+
+#include "gc.h"
+
+// The following need to match collector data structures.
+// We can't include gc_priv.h, since that pulls in way too much stuff.
+// This should eventually be factored out into another include file.
+
+extern "C" {
+ extern void ** const GC_objfreelist_ptr;
+ extern void ** const GC_aobjfreelist_ptr;
+ extern void ** const GC_uobjfreelist_ptr;
+ extern void ** const GC_auobjfreelist_ptr;
+
+ extern void GC_incr_words_allocd(size_t words);
+ extern void GC_incr_mem_freed(size_t words);
+
+ extern char * GC_generic_malloc_words_small(size_t word, int kind);
+}
+
+// Object kinds; must match PTRFREE, NORMAL, UNCOLLECTABLE, and
+// AUNCOLLECTABLE in gc_priv.h.
+
+enum { GC_PTRFREE = 0, GC_NORMAL = 1, GC_UNCOLLECTABLE = 2,
+ GC_AUNCOLLECTABLE = 3 };
+
+enum { GC_max_fast_bytes = 255 };
+
+enum { GC_bytes_per_word = sizeof(char *) };
+
+enum { GC_byte_alignment = 8 };
+
+enum { GC_word_alignment = GC_byte_alignment/GC_bytes_per_word };
+
+inline void * &GC_obj_link(void * p)
+{ return *(void **)p; }
+
+// Compute a number of words >= n+1 bytes.
+// The +1 allows for pointers one past the end.
+inline size_t GC_round_up(size_t n)
+{
+ return ((n + GC_byte_alignment)/GC_byte_alignment)*GC_word_alignment;
+}
+
+// The same but don't allow for extra byte.
+inline size_t GC_round_up_uncollectable(size_t n)
+{
+ return ((n + GC_byte_alignment - 1)/GC_byte_alignment)*GC_word_alignment;
+}
+
+template <int dummy>
+class GC_aux_template {
+public:
+ // File local count of allocated words. Occasionally this is
+ // added into the global count. A separate count is necessary since the
+ // real one must be updated with a procedure call.
+ static size_t GC_words_recently_allocd;
+
+ // Same for uncollectable mmory. Not yet reflected in either
+ // GC_words_recently_allocd or GC_non_gc_bytes.
+ static size_t GC_uncollectable_words_recently_allocd;
+
+ // Similar counter for explicitly deallocated memory.
+ static size_t GC_mem_recently_freed;
+
+ // Again for uncollectable memory.
+ static size_t GC_uncollectable_mem_recently_freed;
+
+ static void * GC_out_of_line_malloc(size_t nwords, int kind);
+};
+
+template <int dummy>
+size_t GC_aux_template<dummy>::GC_words_recently_allocd = 0;
+
+template <int dummy>
+size_t GC_aux_template<dummy>::GC_uncollectable_words_recently_allocd = 0;
+
+template <int dummy>
+size_t GC_aux_template<dummy>::GC_mem_recently_freed = 0;
+
+template <int dummy>
+size_t GC_aux_template<dummy>::GC_uncollectable_mem_recently_freed = 0;
+
+template <int dummy>
+void * GC_aux_template<dummy>::GC_out_of_line_malloc(size_t nwords, int kind)
+{
+ GC_words_recently_allocd += GC_uncollectable_words_recently_allocd;
+ GC_non_gc_bytes +=
+ GC_bytes_per_word * GC_uncollectable_words_recently_allocd;
+ GC_uncollectable_words_recently_allocd = 0;
+
+ GC_mem_recently_freed += GC_uncollectable_mem_recently_freed;
+ GC_non_gc_bytes -=
+ GC_bytes_per_word * GC_uncollectable_mem_recently_freed;
+ GC_uncollectable_mem_recently_freed = 0;
+
+ GC_incr_words_allocd(GC_words_recently_allocd);
+ GC_words_recently_allocd = 0;
+
+ GC_incr_mem_freed(GC_mem_recently_freed);
+ GC_mem_recently_freed = 0;
+
+ return GC_generic_malloc_words_small(nwords, kind);
+}
+
+typedef GC_aux_template<0> GC_aux;
+
+// A fast, single-threaded, garbage-collected allocator
+// We assume the first word will be immediately overwritten.
+// In this version, deallocation is not a noop, and explicit
+// deallocation is likely to help performance.
+template <int dummy>
+class single_client_gc_alloc_template {
+ public:
+ static void * allocate(size_t n)
+ {
+ size_t nwords = GC_round_up(n);
+ void ** flh;
+ void * op;
+
+ if (n > GC_max_fast_bytes) return GC_malloc(n);
+ flh = GC_objfreelist_ptr + nwords;
+ if (0 == (op = *flh)) {
+ return GC_aux::GC_out_of_line_malloc(nwords, GC_NORMAL);
+ }
+ *flh = GC_obj_link(op);
+ GC_aux::GC_words_recently_allocd += nwords;
+ return op;
+ }
+ static void * ptr_free_allocate(size_t n)
+ {
+ size_t nwords = GC_round_up(n);
+ void ** flh;
+ void * op;
+
+ if (n > GC_max_fast_bytes) return GC_malloc_atomic(n);
+ flh = GC_aobjfreelist_ptr + nwords;
+ if (0 == (op = *flh)) {
+ return GC_aux::GC_out_of_line_malloc(nwords, GC_PTRFREE);
+ }
+ *flh = GC_obj_link(op);
+ GC_aux::GC_words_recently_allocd += nwords;
+ return op;
+ }
+ static void deallocate(void *p, size_t n)
+ {
+ size_t nwords = GC_round_up(n);
+ void ** flh;
+
+ if (n > GC_max_fast_bytes) {
+ GC_free(p);
+ } else {
+ flh = GC_objfreelist_ptr + nwords;
+ GC_obj_link(p) = *flh;
+ memset((char *)p + GC_bytes_per_word, 0,
+ GC_bytes_per_word * (nwords - 1));
+ *flh = p;
+ GC_aux::GC_mem_recently_freed += nwords;
+ }
+ }
+ static void ptr_free_deallocate(void *p, size_t n)
+ {
+ size_t nwords = GC_round_up(n);
+ void ** flh;
+
+ if (n > GC_max_fast_bytes) {
+ GC_free(p);
+ } else {
+ flh = GC_aobjfreelist_ptr + nwords;
+ GC_obj_link(p) = *flh;
+ *flh = p;
+ GC_aux::GC_mem_recently_freed += nwords;
+ }
+ }
+};
+
+typedef single_client_gc_alloc_template<0> single_client_gc_alloc;
+
+// Once more, for uncollectable objects.
+template <int dummy>
+class single_client_alloc_template {
+ public:
+ static void * allocate(size_t n)
+ {
+ size_t nwords = GC_round_up_uncollectable(n);
+ void ** flh;
+ void * op;
+
+ if (n > GC_max_fast_bytes) return GC_malloc_uncollectable(n);
+ flh = GC_uobjfreelist_ptr + nwords;
+ if (0 == (op = *flh)) {
+ return GC_aux::GC_out_of_line_malloc(nwords, GC_UNCOLLECTABLE);
+ }
+ *flh = GC_obj_link(op);
+ GC_aux::GC_uncollectable_words_recently_allocd += nwords;
+ return op;
+ }
+ static void * ptr_free_allocate(size_t n)
+ {
+ size_t nwords = GC_round_up_uncollectable(n);
+ void ** flh;
+ void * op;
+
+ if (n > GC_max_fast_bytes) return GC_malloc_atomic_uncollectable(n);
+ flh = GC_auobjfreelist_ptr + nwords;
+ if (0 == (op = *flh)) {
+ return GC_aux::GC_out_of_line_malloc(nwords, GC_AUNCOLLECTABLE);
+ }
+ *flh = GC_obj_link(op);
+ GC_aux::GC_uncollectable_words_recently_allocd += nwords;
+ return op;
+ }
+ static void deallocate(void *p, size_t n)
+ {
+ size_t nwords = GC_round_up_uncollectable(n);
+ void ** flh;
+
+ if (n > GC_max_fast_bytes) {
+ GC_free(p);
+ } else {
+ flh = GC_uobjfreelist_ptr + nwords;
+ GC_obj_link(p) = *flh;
+ *flh = p;
+ GC_aux::GC_uncollectable_mem_recently_freed += nwords;
+ }
+ }
+ static void ptr_free_deallocate(void *p, size_t n)
+ {
+ size_t nwords = GC_round_up_uncollectable(n);
+ void ** flh;
+
+ if (n > GC_max_fast_bytes) {
+ GC_free(p);
+ } else {
+ flh = GC_auobjfreelist_ptr + nwords;
+ GC_obj_link(p) = *flh;
+ *flh = p;
+ GC_aux::GC_uncollectable_mem_recently_freed += nwords;
+ }
+ }
+};
+
+typedef single_client_alloc_template<0> single_client_alloc;
+
+template < int dummy >
+class gc_alloc_template {
+ public:
+ static void * allocate(size_t n) { return GC_malloc(n); }
+ static void * ptr_free_allocate(size_t n)
+ { return GC_malloc_atomic(n); }
+ static void deallocate(void *, size_t) { }
+ static void ptr_free_deallocate(void *, size_t) { }
+};
+
+typedef gc_alloc_template < 0 > gc_alloc;
+
+template < int dummy >
+class alloc_template {
+ public:
+ static void * allocate(size_t n) { return GC_malloc_uncollectable(n); }
+ static void * ptr_free_allocate(size_t n)
+ { return GC_malloc_atomic_uncollectable(n); }
+ static void deallocate(void *p, size_t) { GC_free(p); }
+ static void ptr_free_deallocate(void *p, size_t) { GC_free(p); }
+};
+
+typedef alloc_template < 0 > alloc;
+
+#ifdef _SGI_SOURCE
+
+// We want to specialize simple_alloc so that it does the right thing
+// for all pointerfree types. At the moment there is no portable way to
+// even approximate that. The following approximation should work for
+// SGI compilers, and perhaps some others.
+
+# define __GC_SPECIALIZE(T,alloc) \
+class simple_alloc<T, alloc> { \
+public: \
+ static T *allocate(size_t n) \
+ { return 0 == n? 0 : \
+ (T*) alloc::ptr_free_allocate(n * sizeof (T)); } \
+ static T *allocate(void) \
+ { return (T*) alloc::ptr_free_allocate(sizeof (T)); } \
+ static void deallocate(T *p, size_t n) \
+ { if (0 != n) alloc::ptr_free_deallocate(p, n * sizeof (T)); } \
+ static void deallocate(T *p) \
+ { alloc::ptr_free_deallocate(p, sizeof (T)); } \
+};
+
+__GC_SPECIALIZE(char, gc_alloc)
+__GC_SPECIALIZE(int, gc_alloc)
+__GC_SPECIALIZE(unsigned, gc_alloc)
+__GC_SPECIALIZE(float, gc_alloc)
+__GC_SPECIALIZE(double, gc_alloc)
+
+__GC_SPECIALIZE(char, alloc)
+__GC_SPECIALIZE(int, alloc)
+__GC_SPECIALIZE(unsigned, alloc)
+__GC_SPECIALIZE(float, alloc)
+__GC_SPECIALIZE(double, alloc)
+
+__GC_SPECIALIZE(char, single_client_gc_alloc)
+__GC_SPECIALIZE(int, single_client_gc_alloc)
+__GC_SPECIALIZE(unsigned, single_client_gc_alloc)
+__GC_SPECIALIZE(float, single_client_gc_alloc)
+__GC_SPECIALIZE(double, single_client_gc_alloc)
+
+__GC_SPECIALIZE(char, single_client_alloc)
+__GC_SPECIALIZE(int, single_client_alloc)
+__GC_SPECIALIZE(unsigned, single_client_alloc)
+__GC_SPECIALIZE(float, single_client_alloc)
+__GC_SPECIALIZE(double, single_client_alloc)
+
+#ifdef __STL_USE_STD_ALLOCATORS
+
+???copy stuff from stl_alloc.h or remove it to a different file ???
+
+#endif /* __STL_USE_STD_ALLOCATORS */
+
+#endif /* _SGI_SOURCE */
+
+#endif /* GC_ALLOC_H */
diff --git a/boehm-gc/gc_cpp.cc b/boehm-gc/gc_cpp.cc
new file mode 100644
index 00000000000..a766a01a328
--- /dev/null
+++ b/boehm-gc/gc_cpp.cc
@@ -0,0 +1,46 @@
+/*************************************************************************
+Copyright (c) 1994 by Xerox Corporation. All rights reserved.
+
+THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+
+ Last modified on Sat Nov 19 19:31:14 PST 1994 by ellis
+ on Sat Jun 8 15:10:00 PST 1994 by boehm
+
+Permission is hereby granted to copy this code for any purpose,
+provided the above notices are retained on all copies.
+
+This implementation module for gc_c++.h provides an implementation of
+the global operators "new" and "delete" that calls the Boehm
+allocator. All objects allocated by this implementation will be
+non-collectable but part of the root set of the collector.
+
+You should ensure (using implementation-dependent techniques) that the
+linker finds this module before the library that defines the default
+built-in "new" and "delete".
+
+Authors: John R. Ellis and Jesse Hull
+
+**************************************************************************/
+/* Boehm, December 20, 1994 7:26 pm PST */
+
+#include "gc_cpp.h"
+
+void* operator new( size_t size ) {
+ return GC_MALLOC_UNCOLLECTABLE( size );}
+
+void operator delete( void* obj ) {
+ GC_FREE( obj );}
+
+
+#ifdef OPERATOR_NEW_ARRAY
+
+void* operator new[]( size_t size ) {
+ return GC_MALLOC_UNCOLLECTABLE( size );}
+
+void operator delete[]( void* obj ) {
+ GC_FREE( obj );}
+
+#endif /* OPERATOR_NEW_ARRAY */
+
+
diff --git a/boehm-gc/gc_cpp.h b/boehm-gc/gc_cpp.h
new file mode 100644
index 00000000000..e2f456fb526
--- /dev/null
+++ b/boehm-gc/gc_cpp.h
@@ -0,0 +1,287 @@
+#ifndef GC_CPP_H
+#define GC_CPP_H
+/****************************************************************************
+Copyright (c) 1994 by Xerox Corporation. All rights reserved.
+
+THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+
+Permission is hereby granted to use or copy this program for any
+purpose, provided the above notices are retained on all copies.
+Permission to modify the code and to distribute modified code is
+granted, provided the above notices are retained, and a notice that
+the code was modified is included with the above copyright notice.
+****************************************************************************
+
+C++ Interface to the Boehm Collector
+
+ John R. Ellis and Jesse Hull
+ Last modified on Mon Jul 24 15:43:42 PDT 1995 by ellis
+
+This interface provides access to the Boehm collector. It provides
+basic facilities similar to those described in "Safe, Efficient
+Garbage Collection for C++", by John R. Elis and David L. Detlefs
+(ftp.parc.xerox.com:/pub/ellis/gc).
+
+All heap-allocated objects are either "collectable" or
+"uncollectable". Programs must explicitly delete uncollectable
+objects, whereas the garbage collector will automatically delete
+collectable objects when it discovers them to be inaccessible.
+Collectable objects may freely point at uncollectable objects and vice
+versa.
+
+Objects allocated with the built-in "::operator new" are uncollectable.
+
+Objects derived from class "gc" are collectable. For example:
+
+ class A: public gc {...};
+ A* a = new A; // a is collectable.
+
+Collectable instances of non-class types can be allocated using the GC
+placement:
+
+ typedef int A[ 10 ];
+ A* a = new (GC) A;
+
+Uncollectable instances of classes derived from "gc" can be allocated
+using the NoGC placement:
+
+ class A: public gc {...};
+ A* a = new (NoGC) A; // a is uncollectable.
+
+Both uncollectable and collectable objects can be explicitly deleted
+with "delete", which invokes an object's destructors and frees its
+storage immediately.
+
+A collectable object may have a clean-up function, which will be
+invoked when the collector discovers the object to be inaccessible.
+An object derived from "gc_cleanup" or containing a member derived
+from "gc_cleanup" has a default clean-up function that invokes the
+object's destructors. Explicit clean-up functions may be specified as
+an additional placement argument:
+
+ A* a = ::new (GC, MyCleanup) A;
+
+An object is considered "accessible" by the collector if it can be
+reached by a path of pointers from static variables, automatic
+variables of active functions, or from some object with clean-up
+enabled; pointers from an object to itself are ignored.
+
+Thus, if objects A and B both have clean-up functions, and A points at
+B, B is considered accessible. After A's clean-up is invoked and its
+storage released, B will then become inaccessible and will have its
+clean-up invoked. If A points at B and B points to A, forming a
+cycle, then that's considered a storage leak, and neither will be
+collectable. See the interface gc.h for low-level facilities for
+handling such cycles of objects with clean-up.
+
+The collector cannot guarrantee that it will find all inaccessible
+objects. In practice, it finds almost all of them.
+
+
+Cautions:
+
+1. Be sure the collector has been augmented with "make c++".
+
+2. If your compiler supports the new "operator new[]" syntax, then
+add -DOPERATOR_NEW_ARRAY to the Makefile.
+
+If your compiler doesn't support "operator new[]", beware that an
+array of type T, where T is derived from "gc", may or may not be
+allocated as a collectable object (it depends on the compiler). Use
+the explicit GC placement to make the array collectable. For example:
+
+ class A: public gc {...};
+ A* a1 = new A[ 10 ]; // collectable or uncollectable?
+ A* a2 = new (GC) A[ 10 ]; // collectable
+
+3. The destructors of collectable arrays of objects derived from
+"gc_cleanup" will not be invoked properly. For example:
+
+ class A: public gc_cleanup {...};
+ A* a = new (GC) A[ 10 ]; // destructors not invoked correctly
+
+Typically, only the destructor for the first element of the array will
+be invoked when the array is garbage-collected. To get all the
+destructors of any array executed, you must supply an explicit
+clean-up function:
+
+ A* a = new (GC, MyCleanUp) A[ 10 ];
+
+(Implementing clean-up of arrays correctly, portably, and in a way
+that preserves the correct exception semantics requires a language
+extension, e.g. the "gc" keyword.)
+
+4. Compiler bugs:
+
+* Solaris 2's CC (SC3.0) doesn't implement t->~T() correctly, so the
+destructors of classes derived from gc_cleanup won't be invoked.
+You'll have to explicitly register a clean-up function with
+new-placement syntax.
+
+* Evidently cfront 3.0 does not allow destructors to be explicitly
+invoked using the ANSI-conforming syntax t->~T(). If you're using
+cfront 3.0, you'll have to comment out the class gc_cleanup, which
+uses explicit invocation.
+
+****************************************************************************/
+
+#include "gc.h"
+
+#ifndef THINK_CPLUS
+#define _cdecl
+#endif
+
+#if ! defined( OPERATOR_NEW_ARRAY ) \
+ && (__BORLANDC__ >= 0x450 || (__GNUC__ >= 2 && __GNUC_MINOR__ >= 6))
+# define OPERATOR_NEW_ARRAY
+#endif
+
+enum GCPlacement {GC, NoGC, PointerFreeGC};
+
+class gc {public:
+ inline void* operator new( size_t size );
+ inline void* operator new( size_t size, GCPlacement gcp );
+ inline void operator delete( void* obj );
+
+#ifdef OPERATOR_NEW_ARRAY
+ inline void* operator new[]( size_t size );
+ inline void* operator new[]( size_t size, GCPlacement gcp );
+ inline void operator delete[]( void* obj );
+#endif /* OPERATOR_NEW_ARRAY */
+ };
+ /*
+ Instances of classes derived from "gc" will be allocated in the
+ collected heap by default, unless an explicit NoGC placement is
+ specified. */
+
+class gc_cleanup: virtual public gc {public:
+ inline gc_cleanup();
+ inline virtual ~gc_cleanup();
+private:
+ inline static void _cdecl cleanup( void* obj, void* clientData );};
+ /*
+ Instances of classes derived from "gc_cleanup" will be allocated
+ in the collected heap by default. When the collector discovers an
+ inaccessible object derived from "gc_cleanup" or containing a
+ member derived from "gc_cleanup", its destructors will be
+ invoked. */
+
+extern "C" {typedef void (*GCCleanUpFunc)( void* obj, void* clientData );}
+
+inline void* operator new(
+ size_t size,
+ GCPlacement gcp,
+ GCCleanUpFunc cleanup = 0,
+ void* clientData = 0 );
+ /*
+ Allocates a collectable or uncollected object, according to the
+ value of "gcp".
+
+ For collectable objects, if "cleanup" is non-null, then when the
+ allocated object "obj" becomes inaccessible, the collector will
+ invoke the function "cleanup( obj, clientData )" but will not
+ invoke the object's destructors. It is an error to explicitly
+ delete an object allocated with a non-null "cleanup".
+
+ It is an error to specify a non-null "cleanup" with NoGC or for
+ classes derived from "gc_cleanup" or containing members derived
+ from "gc_cleanup". */
+
+#ifdef OPERATOR_NEW_ARRAY
+
+inline void* operator new[](
+ size_t size,
+ GCPlacement gcp,
+ GCCleanUpFunc cleanup = 0,
+ void* clientData = 0 );
+ /*
+ The operator new for arrays, identical to the above. */
+
+#endif /* OPERATOR_NEW_ARRAY */
+
+/****************************************************************************
+
+Inline implementation
+
+****************************************************************************/
+
+inline void* gc::operator new( size_t size ) {
+ return GC_MALLOC( size );}
+
+inline void* gc::operator new( size_t size, GCPlacement gcp ) {
+ if (gcp == GC)
+ return GC_MALLOC( size );
+ else
+ return GC_MALLOC_UNCOLLECTABLE( size );}
+
+inline void gc::operator delete( void* obj ) {
+ GC_FREE( obj );}
+
+
+#ifdef OPERATOR_NEW_ARRAY
+
+inline void* gc::operator new[]( size_t size ) {
+ return gc::operator new( size );}
+
+inline void* gc::operator new[]( size_t size, GCPlacement gcp ) {
+ return gc::operator new( size, gcp );}
+
+inline void gc::operator delete[]( void* obj ) {
+ gc::operator delete( obj );}
+
+#endif /* OPERATOR_NEW_ARRAY */
+
+
+inline gc_cleanup::~gc_cleanup() {
+ GC_REGISTER_FINALIZER_IGNORE_SELF( this, 0, 0, 0, 0 );}
+
+inline void gc_cleanup::cleanup( void* obj, void* displ ) {
+ ((gc_cleanup*) ((char*) obj + (ptrdiff_t) displ))->~gc_cleanup();}
+
+inline gc_cleanup::gc_cleanup() {
+ GC_finalization_proc oldProc;
+ void* oldData;
+ void* base = GC_base( (void *) this );
+ if (0 == base) return;
+ GC_REGISTER_FINALIZER_IGNORE_SELF(
+ base, cleanup, (void*) ((char*) this - (char*) base),
+ &oldProc, &oldData );
+ if (0 != oldProc) {
+ GC_REGISTER_FINALIZER_IGNORE_SELF( base, oldProc, oldData, 0, 0 );}}
+
+inline void* operator new(
+ size_t size,
+ GCPlacement gcp,
+ GCCleanUpFunc cleanup,
+ void* clientData )
+{
+ void* obj;
+
+ if (gcp == GC) {
+ obj = GC_MALLOC( size );
+ if (cleanup != 0)
+ GC_REGISTER_FINALIZER_IGNORE_SELF(
+ obj, cleanup, clientData, 0, 0 );}
+ else if (gcp == PointerFreeGC) {
+ obj = GC_MALLOC_ATOMIC( size );}
+ else {
+ obj = GC_MALLOC_UNCOLLECTABLE( size );};
+ return obj;}
+
+
+#ifdef OPERATOR_NEW_ARRAY
+
+inline void* operator new[](
+ size_t size,
+ GCPlacement gcp,
+ GCCleanUpFunc cleanup,
+ void* clientData )
+{
+ return ::operator new( size, gcp, cleanup, clientData );}
+
+#endif /* OPERATOR_NEW_ARRAY */
+
+
+#endif /* GC_CPP_H */
+
diff --git a/boehm-gc/gc_hdrs.h b/boehm-gc/gc_hdrs.h
new file mode 100644
index 00000000000..2f2d1bf9b8a
--- /dev/null
+++ b/boehm-gc/gc_hdrs.h
@@ -0,0 +1,133 @@
+/*
+ * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+/* Boehm, July 11, 1995 11:54 am PDT */
+# ifndef GC_HEADERS_H
+# define GC_HEADERS_H
+typedef struct hblkhdr hdr;
+
+# if CPP_WORDSZ != 32 && CPP_WORDSZ < 36
+ --> Get a real machine.
+# endif
+
+/*
+ * The 2 level tree data structure that is used to find block headers.
+ * If there are more than 32 bits in a pointer, the top level is a hash
+ * table.
+ */
+
+# if CPP_WORDSZ > 32
+# define HASH_TL
+# endif
+
+/* Define appropriate out-degrees for each of the two tree levels */
+# ifdef SMALL_CONFIG
+# define LOG_BOTTOM_SZ 11
+ /* Keep top index size reasonable with smaller blocks. */
+# else
+# define LOG_BOTTOM_SZ 10
+# endif
+# ifndef HASH_TL
+# define LOG_TOP_SZ (WORDSZ - LOG_BOTTOM_SZ - LOG_HBLKSIZE)
+# else
+# define LOG_TOP_SZ 11
+# endif
+# define TOP_SZ (1 << LOG_TOP_SZ)
+# define BOTTOM_SZ (1 << LOG_BOTTOM_SZ)
+
+typedef struct bi {
+ hdr * index[BOTTOM_SZ];
+ /*
+ * The bottom level index contains one of three kinds of values:
+ * 0 means we're not responsible for this block.
+ * 1 < (long)X <= MAX_JUMP means the block starts at least
+ * X * HBLKSIZE bytes before the current address.
+ * A valid pointer points to a hdr structure. (The above can't be
+ * valid pointers due to the GET_MEM return convention.)
+ */
+ struct bi * asc_link; /* All indices are linked in */
+ /* ascending order. */
+ word key; /* high order address bits. */
+# ifdef HASH_TL
+ struct bi * hash_link; /* Hash chain link. */
+# endif
+} bottom_index;
+
+/* extern bottom_index GC_all_nils; - really part of GC_arrays */
+
+/* extern bottom_index * GC_top_index []; - really part of GC_arrays */
+ /* Each entry points to a bottom_index. */
+ /* On a 32 bit machine, it points to */
+ /* the index for a set of high order */
+ /* bits equal to the index. For longer */
+ /* addresses, we hash the high order */
+ /* bits to compute the index in */
+ /* GC_top_index, and each entry points */
+ /* to a hash chain. */
+ /* The last entry in each chain is */
+ /* GC_all_nils. */
+
+
+# define MAX_JUMP (HBLKSIZE - 1)
+
+# define HDR_FROM_BI(bi, p) \
+ ((bi)->index[((word)(p) >> LOG_HBLKSIZE) & (BOTTOM_SZ - 1)])
+# ifndef HASH_TL
+# define BI(p) (GC_top_index \
+ [(word)(p) >> (LOG_BOTTOM_SZ + LOG_HBLKSIZE)])
+# define HDR_INNER(p) HDR_FROM_BI(BI(p),p)
+# ifdef SMALL_CONFIG
+# define HDR(p) GC_find_header((ptr_t)(p))
+# else
+# define HDR(p) HDR_INNER(p)
+# endif
+# define GET_BI(p, bottom_indx) (bottom_indx) = BI(p)
+# define GET_HDR(p, hhdr) (hhdr) = HDR(p)
+# define SET_HDR(p, hhdr) HDR_INNER(p) = (hhdr)
+# define GET_HDR_ADDR(p, ha) (ha) = &(HDR_INNER(p))
+# else /* hash */
+/* Hash function for tree top level */
+# define TL_HASH(hi) ((hi) & (TOP_SZ - 1))
+/* Set bottom_indx to point to the bottom index for address p */
+# define GET_BI(p, bottom_indx) \
+ { \
+ register word hi = \
+ (word)(p) >> (LOG_BOTTOM_SZ + LOG_HBLKSIZE); \
+ register bottom_index * _bi = GC_top_index[TL_HASH(hi)]; \
+ \
+ while (_bi -> key != hi && _bi != GC_all_nils) \
+ _bi = _bi -> hash_link; \
+ (bottom_indx) = _bi; \
+ }
+# define GET_HDR_ADDR(p, ha) \
+ { \
+ register bottom_index * bi; \
+ \
+ GET_BI(p, bi); \
+ (ha) = &(HDR_FROM_BI(bi, p)); \
+ }
+# define GET_HDR(p, hhdr) { register hdr ** _ha; GET_HDR_ADDR(p, _ha); \
+ (hhdr) = *_ha; }
+# define SET_HDR(p, hhdr) { register hdr ** _ha; GET_HDR_ADDR(p, _ha); \
+ *_ha = (hhdr); }
+# define HDR(p) GC_find_header((ptr_t)(p))
+# endif
+
+/* Is the result a forwarding address to someplace closer to the */
+/* beginning of the block or NIL? */
+# define IS_FORWARDING_ADDR_OR_NIL(hhdr) ((unsigned long) (hhdr) <= MAX_JUMP)
+
+/* Get an HBLKSIZE aligned address closer to the beginning of the block */
+/* h. Assumes hhdr == HDR(h) and IS_FORWARDING_ADDR(hhdr). */
+# define FORWARDED_ADDR(h, hhdr) ((struct hblk *)(h) - (unsigned long)(hhdr))
+# endif /* GC_HEADERS_H */
diff --git a/boehm-gc/gc_mark.h b/boehm-gc/gc_mark.h
new file mode 100644
index 00000000000..ade98a91857
--- /dev/null
+++ b/boehm-gc/gc_mark.h
@@ -0,0 +1,267 @@
+/*
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+/* Boehm, November 7, 1994 4:56 pm PST */
+
+/*
+ * Declarations of mark stack. Needed by marker and client supplied mark
+ * routines. To be included after gc_priv.h.
+ */
+#ifndef GC_MARK_H
+# define GC_MARK_H
+
+/* A client supplied mark procedure. Returns new mark stack pointer. */
+/* Primary effect should be to push new entries on the mark stack. */
+/* Mark stack pointer values are passed and returned explicitly. */
+/* Global variables decribing mark stack are not necessarily valid. */
+/* (This usually saves a few cycles by keeping things in registers.) */
+/* Assumed to scan about PROC_BYTES on average. If it needs to do */
+/* much more work than that, it should do it in smaller pieces by */
+/* pushing itself back on the mark stack. */
+/* Note that it should always do some work (defined as marking some */
+/* objects) before pushing more than one entry on the mark stack. */
+/* This is required to ensure termination in the event of mark stack */
+/* overflows. */
+/* This procedure is always called with at least one empty entry on the */
+/* mark stack. */
+/* Currently we require that mark procedures look for pointers in a */
+/* subset of the places the conservative marker would. It must be safe */
+/* to invoke the normal mark procedure instead. */
+# define PROC_BYTES 100
+typedef struct ms_entry * (*mark_proc)(/* word * addr, mark_stack_ptr,
+ mark_stack_limit, env */);
+
+# define LOG_MAX_MARK_PROCS 6
+# define MAX_MARK_PROCS (1 << LOG_MAX_MARK_PROCS)
+extern mark_proc GC_mark_procs[MAX_MARK_PROCS];
+extern word GC_n_mark_procs;
+
+/* Object descriptors on mark stack or in objects. Low order two */
+/* bits are tags distinguishing among the following 4 possibilities */
+/* for the high order 30 bits. */
+#define DS_TAG_BITS 2
+#define DS_TAGS ((1 << DS_TAG_BITS) - 1)
+#define DS_LENGTH 0 /* The entire word is a length in bytes that */
+ /* must be a multiple of 4. */
+#define DS_BITMAP 1 /* 30 bits are a bitmap describing pointer */
+ /* fields. The msb is 1 iff the first word */
+ /* is a pointer. */
+ /* (This unconventional ordering sometimes */
+ /* makes the marker slightly faster.) */
+ /* Zeroes indicate definite nonpointers. Ones */
+ /* indicate possible pointers. */
+ /* Only usable if pointers are word aligned. */
+# define BITMAP_BITS (WORDSZ - DS_TAG_BITS)
+#define DS_PROC 2
+ /* The objects referenced by this object can be */
+ /* pushed on the mark stack by invoking */
+ /* PROC(descr). ENV(descr) is passed as the */
+ /* last argument. */
+# define PROC(descr) \
+ (GC_mark_procs[((descr) >> DS_TAG_BITS) & (MAX_MARK_PROCS-1)])
+# define ENV(descr) \
+ ((descr) >> (DS_TAG_BITS + LOG_MAX_MARK_PROCS))
+# define MAX_ENV \
+ (((word)1 << (WORDSZ - DS_TAG_BITS - LOG_MAX_MARK_PROCS)) - 1)
+# define MAKE_PROC(proc_index, env) \
+ (((((env) << LOG_MAX_MARK_PROCS) | (proc_index)) << DS_TAG_BITS) \
+ | DS_PROC)
+#define DS_PER_OBJECT 3 /* The real descriptor is at the */
+ /* byte displacement from the beginning of the */
+ /* object given by descr & ~DS_TAGS */
+
+typedef struct ms_entry {
+ word * mse_start; /* First word of object */
+ word mse_descr; /* Descriptor; low order two bits are tags, */
+ /* identifying the upper 30 bits as one of the */
+ /* following: */
+} mse;
+
+extern word GC_mark_stack_size;
+
+extern mse * GC_mark_stack_top;
+
+extern mse * GC_mark_stack;
+
+word GC_find_start();
+
+mse * GC_signal_mark_stack_overflow();
+
+# ifdef GATHERSTATS
+# define ADD_TO_ATOMIC(sz) GC_atomic_in_use += (sz)
+# define ADD_TO_COMPOSITE(sz) GC_composite_in_use += (sz)
+# else
+# define ADD_TO_ATOMIC(sz)
+# define ADD_TO_COMPOSITE(sz)
+# endif
+
+/* Push the object obj with corresponding heap block header hhdr onto */
+/* the mark stack. */
+# define PUSH_OBJ(obj, hhdr, mark_stack_top, mark_stack_limit) \
+{ \
+ register word _descr = (hhdr) -> hb_descr; \
+ \
+ if (_descr == 0) { \
+ ADD_TO_ATOMIC((hhdr) -> hb_sz); \
+ } else { \
+ ADD_TO_COMPOSITE((hhdr) -> hb_sz); \
+ mark_stack_top++; \
+ if (mark_stack_top >= mark_stack_limit) { \
+ mark_stack_top = GC_signal_mark_stack_overflow(mark_stack_top); \
+ } \
+ mark_stack_top -> mse_start = (obj); \
+ mark_stack_top -> mse_descr = _descr; \
+ } \
+}
+
+#ifdef PRINT_BLACK_LIST
+# define GC_FIND_START(current, hhdr, source) \
+ GC_find_start(current, hhdr, source)
+#else
+# define GC_FIND_START(current, hhdr, source) \
+ GC_find_start(current, hhdr)
+#endif
+
+/* Push the contents of current onto the mark stack if it is a valid */
+/* ptr to a currently unmarked object. Mark it. */
+/* If we assumed a standard-conforming compiler, we could probably */
+/* generate the exit_label transparently. */
+# define PUSH_CONTENTS(current, mark_stack_top, mark_stack_limit, \
+ source, exit_label) \
+{ \
+ register int displ; /* Displacement in block; first bytes, then words */ \
+ register hdr * hhdr; \
+ register map_entry_type map_entry; \
+ \
+ GET_HDR(current,hhdr); \
+ if (IS_FORWARDING_ADDR_OR_NIL(hhdr)) { \
+ current = GC_FIND_START(current, hhdr, (word)source); \
+ if (current == 0) goto exit_label; \
+ hhdr = HDR(current); \
+ } \
+ displ = HBLKDISPL(current); \
+ map_entry = MAP_ENTRY((hhdr -> hb_map), displ); \
+ if (map_entry == OBJ_INVALID) { \
+ GC_ADD_TO_BLACK_LIST_NORMAL(current, source); goto exit_label; \
+ } \
+ displ = BYTES_TO_WORDS(displ); \
+ displ -= map_entry; \
+ \
+ { \
+ register word * mark_word_addr = hhdr -> hb_marks + divWORDSZ(displ); \
+ register word mark_word = *mark_word_addr; \
+ register word mark_bit = (word)1 << modWORDSZ(displ); \
+ \
+ if (mark_word & mark_bit) { \
+ /* Mark bit is already set */ \
+ goto exit_label; \
+ } \
+ *mark_word_addr = mark_word | mark_bit; \
+ } \
+ PUSH_OBJ(((word *)(HBLKPTR(current)) + displ), hhdr, \
+ mark_stack_top, mark_stack_limit) \
+ exit_label: ; \
+}
+
+
+/*
+ * Push a single value onto mark stack. Mark from the object pointed to by p.
+ * GC_push_one is normally called by GC_push_regs, and thus must be defined.
+ * P is considered valid even if it is an interior pointer.
+ * Previously marked objects are not pushed. Hence we make progress even
+ * if the mark stack overflows.
+ */
+# define GC_PUSH_ONE_STACK(p) \
+ if ((ptr_t)(p) >= GC_least_plausible_heap_addr \
+ && (ptr_t)(p) < GC_greatest_plausible_heap_addr) { \
+ GC_push_one_checked(p,TRUE); \
+ }
+
+/*
+ * As above, but interior pointer recognition as for
+ * normal for heap pointers.
+ */
+# ifdef ALL_INTERIOR_POINTERS
+# define AIP TRUE
+# else
+# define AIP FALSE
+# endif
+# define GC_PUSH_ONE_HEAP(p) \
+ if ((ptr_t)(p) >= GC_least_plausible_heap_addr \
+ && (ptr_t)(p) < GC_greatest_plausible_heap_addr) { \
+ GC_push_one_checked(p,AIP); \
+ }
+
+/*
+ * Mark from one finalizable object using the specified
+ * mark proc. May not mark the object pointed to by
+ * real_ptr. That is the job of the caller, if appropriate
+ */
+# define GC_MARK_FO(real_ptr, mark_proc) \
+{ \
+ (*(mark_proc))(real_ptr); \
+ while (!GC_mark_stack_empty()) GC_mark_from_mark_stack(); \
+ if (GC_mark_state != MS_NONE) { \
+ GC_set_mark_bit(real_ptr); \
+ while (!GC_mark_some()); \
+ } \
+}
+
+extern GC_bool GC_mark_stack_too_small;
+ /* We need a larger mark stack. May be */
+ /* set by client supplied mark routines.*/
+
+typedef int mark_state_t; /* Current state of marking, as follows:*/
+ /* Used to remember where we are during */
+ /* concurrent marking. */
+
+ /* We say something is dirty if it was */
+ /* written since the last time we */
+ /* retrieved dirty bits. We say it's */
+ /* grungy if it was marked dirty in the */
+ /* last set of bits we retrieved. */
+
+ /* Invariant I: all roots and marked */
+ /* objects p are either dirty, or point */
+ /* objects q that are either marked or */
+ /* a pointer to q appears in a range */
+ /* on the mark stack. */
+
+# define MS_NONE 0 /* No marking in progress. I holds. */
+ /* Mark stack is empty. */
+
+# define MS_PUSH_RESCUERS 1 /* Rescuing objects are currently */
+ /* being pushed. I holds, except */
+ /* that grungy roots may point to */
+ /* unmarked objects, as may marked */
+ /* grungy objects above scan_ptr. */
+
+# define MS_PUSH_UNCOLLECTABLE 2
+ /* I holds, except that marked */
+ /* uncollectable objects above scan_ptr */
+ /* may point to unmarked objects. */
+ /* Roots may point to unmarked objects */
+
+# define MS_ROOTS_PUSHED 3 /* I holds, mark stack may be nonempty */
+
+# define MS_PARTIALLY_INVALID 4 /* I may not hold, e.g. because of M.S. */
+ /* overflow. However marked heap */
+ /* objects below scan_ptr point to */
+ /* marked or stacked objects. */
+
+# define MS_INVALID 5 /* I may not hold. */
+
+extern mark_state_t GC_mark_state;
+
+#endif /* GC_MARK_H */
+
diff --git a/boehm-gc/gc_priv.h b/boehm-gc/gc_priv.h
new file mode 100644
index 00000000000..cc8b1476ddc
--- /dev/null
+++ b/boehm-gc/gc_priv.h
@@ -0,0 +1,1591 @@
+/*
+ * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+/* Boehm, February 16, 1996 2:30 pm PST */
+
+
+# ifndef GC_PRIVATE_H
+# define GC_PRIVATE_H
+
+#if defined(mips) && defined(SYSTYPE_BSD) && defined(sony_news)
+ /* sony RISC NEWS, NEWSOS 4 */
+# define BSD_TIME
+/* typedef long ptrdiff_t; -- necessary on some really old systems */
+#endif
+
+#if defined(mips) && defined(SYSTYPE_BSD43)
+ /* MIPS RISCOS 4 */
+# define BSD_TIME
+#endif
+
+#ifdef BSD_TIME
+# include <sys/types.h>
+# include <sys/time.h>
+# include <sys/resource.h>
+#endif /* BSD_TIME */
+
+# ifndef GC_H
+# include "gc.h"
+# endif
+
+typedef GC_word word;
+typedef GC_signed_word signed_word;
+
+# ifndef CONFIG_H
+# include "config.h"
+# endif
+
+# ifndef HEADERS_H
+# include "gc_hdrs.h"
+# endif
+
+typedef int GC_bool;
+# define TRUE 1
+# define FALSE 0
+
+typedef char * ptr_t; /* A generic pointer to which we can add */
+ /* byte displacements. */
+ /* Preferably identical to caddr_t, if it */
+ /* exists. */
+
+#if defined(__STDC__)
+# include <stdlib.h>
+# if !(defined( sony_news ) )
+# include <stddef.h>
+# endif
+# define VOLATILE volatile
+# define CONST const
+#else
+# ifdef MSWIN32
+# include <stdlib.h>
+# endif
+# define VOLATILE
+# define CONST
+#endif
+
+#ifdef AMIGA
+# define GC_FAR __far
+#else
+# define GC_FAR
+#endif
+
+/*********************************/
+/* */
+/* Definitions for conservative */
+/* collector */
+/* */
+/*********************************/
+
+/*********************************/
+/* */
+/* Easily changeable parameters */
+/* */
+/*********************************/
+
+#define STUBBORN_ALLOC /* Define stubborn allocation primitives */
+#if defined(SRC_M3) || defined(SMALL_CONFIG)
+# undef STUBBORN_ALLOC
+#endif
+
+
+/* #define ALL_INTERIOR_POINTERS */
+ /* Forces all pointers into the interior of an */
+ /* object to be considered valid. Also causes the */
+ /* sizes of all objects to be inflated by at least */
+ /* one byte. This should suffice to guarantee */
+ /* that in the presence of a compiler that does */
+ /* not perform garbage-collector-unsafe */
+ /* optimizations, all portable, strictly ANSI */
+ /* conforming C programs should be safely usable */
+ /* with malloc replaced by GC_malloc and free */
+ /* calls removed. There are several disadvantages: */
+ /* 1. There are probably no interesting, portable, */
+ /* strictly ANSI conforming C programs. */
+ /* 2. This option makes it hard for the collector */
+ /* to allocate space that is not ``pointed to'' */
+ /* by integers, etc. Under SunOS 4.X with a */
+ /* statically linked libc, we empiricaly */
+ /* observed that it would be difficult to */
+ /* allocate individual objects larger than 100K. */
+ /* Even if only smaller objects are allocated, */
+ /* more swap space is likely to be needed. */
+ /* Fortunately, much of this will never be */
+ /* touched. */
+ /* If you can easily avoid using this option, do. */
+ /* If not, try to keep individual objects small. */
+
+#define PRINTSTATS /* Print garbage collection statistics */
+ /* For less verbose output, undefine in reclaim.c */
+
+#define PRINTTIMES /* Print the amount of time consumed by each garbage */
+ /* collection. */
+
+#define PRINTBLOCKS /* Print object sizes associated with heap blocks, */
+ /* whether the objects are atomic or composite, and */
+ /* whether or not the block was found to be empty */
+ /* during the reclaim phase. Typically generates */
+ /* about one screenful per garbage collection. */
+#undef PRINTBLOCKS
+
+#ifdef SILENT
+# ifdef PRINTSTATS
+# undef PRINTSTATS
+# endif
+# ifdef PRINTTIMES
+# undef PRINTTIMES
+# endif
+# ifdef PRINTNBLOCKS
+# undef PRINTNBLOCKS
+# endif
+#endif
+
+#if defined(PRINTSTATS) && !defined(GATHERSTATS)
+# define GATHERSTATS
+#endif
+
+#ifdef FINALIZE_ON_DEMAND
+# define GC_INVOKE_FINALIZERS()
+#else
+# define GC_INVOKE_FINALIZERS() (void)GC_invoke_finalizers()
+#endif
+
+#define MERGE_SIZES /* Round up some object sizes, so that fewer distinct */
+ /* free lists are actually maintained. This applies */
+ /* only to the top level routines in misc.c, not to */
+ /* user generated code that calls GC_allocobj and */
+ /* GC_allocaobj directly. */
+ /* Slows down average programs slightly. May however */
+ /* substantially reduce fragmentation if allocation */
+ /* request sizes are widely scattered. */
+ /* May save significant amounts of space for obj_map */
+ /* entries. */
+
+#ifndef OLD_BLOCK_ALLOC
+ /* Macros controlling large block allocation strategy. */
+# define EXACT_FIRST /* Make a complete pass through the large object */
+ /* free list before splitting a block */
+# define PRESERVE_LAST /* Do not divide last allocated heap segment */
+ /* unless we would otherwise need to expand the */
+ /* heap. */
+#endif
+
+/* ALIGN_DOUBLE requires MERGE_SIZES at present. */
+# if defined(ALIGN_DOUBLE) && !defined(MERGE_SIZES)
+# define MERGE_SIZES
+# endif
+
+#if defined(ALL_INTERIOR_POINTERS) && !defined(DONT_ADD_BYTE_AT_END)
+# define ADD_BYTE_AT_END
+#endif
+
+
+# ifndef LARGE_CONFIG
+# define MINHINCR 16 /* Minimum heap increment, in blocks of HBLKSIZE */
+ /* Must be multiple of largest page size. */
+# define MAXHINCR 512 /* Maximum heap increment, in blocks */
+# else
+# define MINHINCR 64
+# define MAXHINCR 4096
+# endif
+
+# define TIME_LIMIT 50 /* We try to keep pause times from exceeding */
+ /* this by much. In milliseconds. */
+
+# define BL_LIMIT GC_black_list_spacing
+ /* If we need a block of N bytes, and we have */
+ /* a block of N + BL_LIMIT bytes available, */
+ /* and N > BL_LIMIT, */
+ /* but all possible positions in it are */
+ /* blacklisted, we just use it anyway (and */
+ /* print a warning, if warnings are enabled). */
+ /* This risks subsequently leaking the block */
+ /* due to a false reference. But not using */
+ /* the block risks unreasonable immediate */
+ /* heap growth. */
+
+/*********************************/
+/* */
+/* Stack saving for debugging */
+/* */
+/*********************************/
+
+#ifdef SAVE_CALL_CHAIN
+
+/*
+ * Number of frames and arguments to save in objects allocated by
+ * debugging allocator.
+ */
+# define NFRAMES 6 /* Number of frames to save. Even for */
+ /* alignment reasons. */
+# define NARGS 2 /* Mumber of arguments to save for each call. */
+
+# define NEED_CALLINFO
+
+/* Fill in the pc and argument information for up to NFRAMES of my */
+/* callers. Ignore my frame and my callers frame. */
+void GC_save_callers (/* struct callinfo info[NFRAMES] */);
+
+void GC_print_callers (/* struct callinfo info[NFRAMES] */);
+
+#else
+
+# ifdef GC_ADD_CALLER
+# define NFRAMES 1
+# define NARGS 0
+# define NEED_CALLINFO
+# endif
+
+#endif
+
+#ifdef NEED_CALLINFO
+ struct callinfo {
+ word ci_pc;
+# if NARGS > 0
+ word ci_arg[NARGS]; /* bit-wise complement to avoid retention */
+# endif
+# if defined(ALIGN_DOUBLE) && (NFRAMES * (NARGS + 1)) % 2 == 1
+ /* Likely alignment problem. */
+ word ci_dummy;
+# endif
+ };
+#endif
+
+
+/*********************************/
+/* */
+/* OS interface routines */
+/* */
+/*********************************/
+
+#ifdef BSD_TIME
+# undef CLOCK_TYPE
+# undef GET_TIME
+# undef MS_TIME_DIFF
+# define CLOCK_TYPE struct timeval
+# define GET_TIME(x) { struct rusage rusage; \
+ getrusage (RUSAGE_SELF, &rusage); \
+ x = rusage.ru_utime; }
+# define MS_TIME_DIFF(a,b) ((double) (a.tv_sec - b.tv_sec) * 1000.0 \
+ + (double) (a.tv_usec - b.tv_usec) / 1000.0)
+#else /* !BSD_TIME */
+# include <time.h>
+# if !defined(__STDC__) && defined(SPARC) && defined(SUNOS4)
+ clock_t clock(); /* Not in time.h, where it belongs */
+# endif
+# if defined(FREEBSD) && !defined(CLOCKS_PER_SEC)
+# include <machine/limits.h>
+# define CLOCKS_PER_SEC CLK_TCK
+# endif
+# if !defined(CLOCKS_PER_SEC)
+# define CLOCKS_PER_SEC 1000000
+/*
+ * This is technically a bug in the implementation. ANSI requires that
+ * CLOCKS_PER_SEC be defined. But at least under SunOS4.1.1, it isn't.
+ * Also note that the combination of ANSI C and POSIX is incredibly gross
+ * here. The type clock_t is used by both clock() and times(). But on
+ * some machines these use different notions of a clock tick, CLOCKS_PER_SEC
+ * seems to apply only to clock. Hence we use it here. On many machines,
+ * including SunOS, clock actually uses units of microseconds (which are
+ * not really clock ticks).
+ */
+# endif
+# define CLOCK_TYPE clock_t
+# define GET_TIME(x) x = clock()
+# define MS_TIME_DIFF(a,b) ((unsigned long) \
+ (1000.0*(double)((a)-(b))/(double)CLOCKS_PER_SEC))
+#endif /* !BSD_TIME */
+
+/* We use bzero and bcopy internally. They may not be available. */
+# if defined(SPARC) && defined(SUNOS4)
+# define BCOPY_EXISTS
+# endif
+# if defined(M68K) && defined(AMIGA)
+# define BCOPY_EXISTS
+# endif
+# if defined(M68K) && defined(NEXT)
+# define BCOPY_EXISTS
+# endif
+# if defined(VAX)
+# define BCOPY_EXISTS
+# endif
+# if defined(AMIGA)
+# include <string.h>
+# define BCOPY_EXISTS
+# endif
+
+# ifndef BCOPY_EXISTS
+# include <string.h>
+# define BCOPY(x,y,n) memcpy(y, x, (size_t)(n))
+# define BZERO(x,n) memset(x, 0, (size_t)(n))
+# else
+# define BCOPY(x,y,n) bcopy((char *)(x),(char *)(y),(int)(n))
+# define BZERO(x,n) bzero((char *)(x),(int)(n))
+# endif
+
+/* HBLKSIZE aligned allocation. 0 is taken to mean failure */
+/* space is assumed to be cleared. */
+/* In the case os USE_MMAP, the argument must also be a */
+/* physical page size. */
+# ifdef PCR
+ char * real_malloc();
+# define GET_MEM(bytes) HBLKPTR(real_malloc((size_t)bytes + GC_page_size) \
+ + GC_page_size-1)
+# else
+# ifdef OS2
+ void * os2_alloc(size_t bytes);
+# define GET_MEM(bytes) HBLKPTR((ptr_t)os2_alloc((size_t)bytes \
+ + GC_page_size) \
+ + GC_page_size-1)
+# else
+# if defined(AMIGA) || defined(NEXT) || defined(DOS4GW)
+# define GET_MEM(bytes) HBLKPTR((size_t) \
+ calloc(1, (size_t)bytes + GC_page_size) \
+ + GC_page_size-1)
+# else
+# ifdef MSWIN32
+ extern ptr_t GC_win32_get_mem();
+# define GET_MEM(bytes) (struct hblk *)GC_win32_get_mem(bytes)
+# else
+# ifdef MACOS
+# if defined(USE_TEMPORARY_MEMORY)
+ extern Ptr GC_MacTemporaryNewPtr(size_t size,
+ Boolean clearMemory);
+# define GET_MEM(bytes) HBLKPTR( \
+ GC_MacTemporaryNewPtr(bytes + GC_page_size, true) \
+ + GC_page_size-1)
+# else
+# define GET_MEM(bytes) HBLKPTR( \
+ NewPtrClear(bytes + GC_page_size) + GC_page_size-1)
+# endif
+# else
+ extern ptr_t GC_unix_get_mem();
+# define GET_MEM(bytes) (struct hblk *)GC_unix_get_mem(bytes)
+# endif
+# endif
+# endif
+# endif
+# endif
+
+/*
+ * Mutual exclusion between allocator/collector routines.
+ * Needed if there is more than one allocator thread.
+ * FASTLOCK() is assumed to try to acquire the lock in a cheap and
+ * dirty way that is acceptable for a few instructions, e.g. by
+ * inhibiting preemption. This is assumed to have succeeded only
+ * if a subsequent call to FASTLOCK_SUCCEEDED() returns TRUE.
+ * FASTUNLOCK() is called whether or not FASTLOCK_SUCCEEDED().
+ * If signals cannot be tolerated with the FASTLOCK held, then
+ * FASTLOCK should disable signals. The code executed under
+ * FASTLOCK is otherwise immune to interruption, provided it is
+ * not restarted.
+ * DCL_LOCK_STATE declares any local variables needed by LOCK and UNLOCK
+ * and/or DISABLE_SIGNALS and ENABLE_SIGNALS and/or FASTLOCK.
+ * (There is currently no equivalent for FASTLOCK.)
+ */
+# ifdef THREADS
+# ifdef PCR_OBSOLETE /* Faster, but broken with multiple lwp's */
+# include "th/PCR_Th.h"
+# include "th/PCR_ThCrSec.h"
+ extern struct PCR_Th_MLRep GC_allocate_ml;
+# define DCL_LOCK_STATE PCR_sigset_t GC_old_sig_mask
+# define LOCK() PCR_Th_ML_Acquire(&GC_allocate_ml)
+# define UNLOCK() PCR_Th_ML_Release(&GC_allocate_ml)
+# define FASTLOCK() PCR_ThCrSec_EnterSys()
+ /* Here we cheat (a lot): */
+# define FASTLOCK_SUCCEEDED() (*(int *)(&GC_allocate_ml) == 0)
+ /* TRUE if nobody currently holds the lock */
+# define FASTUNLOCK() PCR_ThCrSec_ExitSys()
+# endif
+# ifdef PCR
+# include <base/PCR_Base.h>
+# include <th/PCR_Th.h>
+ extern PCR_Th_ML GC_allocate_ml;
+# define DCL_LOCK_STATE \
+ PCR_ERes GC_fastLockRes; PCR_sigset_t GC_old_sig_mask
+# define LOCK() PCR_Th_ML_Acquire(&GC_allocate_ml)
+# define UNLOCK() PCR_Th_ML_Release(&GC_allocate_ml)
+# define FASTLOCK() (GC_fastLockRes = PCR_Th_ML_Try(&GC_allocate_ml))
+# define FASTLOCK_SUCCEEDED() (GC_fastLockRes == PCR_ERes_okay)
+# define FASTUNLOCK() {\
+ if( FASTLOCK_SUCCEEDED() ) PCR_Th_ML_Release(&GC_allocate_ml); }
+# endif
+# ifdef SRC_M3
+ extern word RT0u__inCritical;
+# define LOCK() RT0u__inCritical++
+# define UNLOCK() RT0u__inCritical--
+# endif
+# ifdef SOLARIS_THREADS
+# include <thread.h>
+# include <signal.h>
+ extern mutex_t GC_allocate_ml;
+# define LOCK() mutex_lock(&GC_allocate_ml);
+# define UNLOCK() mutex_unlock(&GC_allocate_ml);
+# endif
+# ifdef LINUX_THREADS
+# include <pthread.h>
+# ifdef __i386__
+ inline static int GC_test_and_set(volatile unsigned int *addr) {
+ int oldval;
+ /* Note: the "xchg" instruction does not need a "lock" prefix */
+ __asm__ __volatile__("xchgl %0, %1"
+ : "=r"(oldval), "=m"(*(addr))
+ : "0"(1), "m"(*(addr)));
+ return oldval;
+ }
+ inline static void GC_clear(volatile unsigned int *addr) {
+ *(addr) = 0;
+ }
+# elif defined(__alpha__)
+ inline static int GC_test_and_set(volatile unsigned int *addr) {
+ long oldval, temp;
+
+ __asm__ __volatile__(
+ "1:\tldl_l %0,%3\n"
+ "\tbne %0,2f\n"
+ "\tor $31,1,%1\n"
+ "\tstl_c %1,%2\n"
+ "\tbeq %1,1b\n"
+ "2:\tmb\n"
+ : "=&r"(oldval), "=&r"(temp), "=m"(*(addr))
+ : "m"(*(addr))
+ : "memory");
+ return (int)oldval;
+ }
+ inline static void GC_clear(volatile unsigned int *addr) {
+ __asm__ __volatile__("mb": : :"memory");
+ *(addr) = 0;
+ }
+# else
+ -- > Need implementation of GC_test_and_set()
+# endif
+
+ extern volatile unsigned int GC_allocate_lock;
+ /* This is not a mutex because mutexes that obey the (optional) */
+ /* POSIX scheduling rules are subject to convoys in high contention */
+ /* applications. This is basically a spin lock. */
+ extern pthread_t GC_lock_holder;
+ extern void GC_lock(void);
+ /* Allocation lock holder. Only set if acquired by client through */
+ /* GC_call_with_alloc_lock. */
+# define SET_LOCK_HOLDER() GC_lock_holder = pthread_self()
+# define NO_THREAD (pthread_t)(-1)
+# define UNSET_LOCK_HOLDER() GC_lock_holder = NO_THREAD
+# define I_HOLD_LOCK() (pthread_equal(GC_lock_holder, pthread_self()))
+# ifdef UNDEFINED
+# define LOCK() pthread_mutex_lock(&GC_allocate_ml)
+# define UNLOCK() pthread_mutex_unlock(&GC_allocate_ml)
+# else
+# define LOCK() \
+ { if (GC_test_and_set(&GC_allocate_lock)) GC_lock(); }
+# define UNLOCK() \
+ GC_clear(&GC_allocate_lock)
+# endif
+ extern GC_bool GC_collecting;
+# define ENTER_GC() \
+ { \
+ GC_collecting = 1; \
+ }
+# define EXIT_GC() GC_collecting = 0;
+# endif /* LINUX_THREADS */
+# ifdef IRIX_THREADS
+# include <pthread.h>
+# include <mutex.h>
+
+# if __mips < 3 || !(defined (_ABIN32) || defined(_ABI64))
+# define GC_test_and_set(addr, v) test_and_set(addr,v)
+# else
+# define GC_test_and_set(addr, v) __test_and_set(addr,v)
+# endif
+ extern unsigned long GC_allocate_lock;
+ /* This is not a mutex because mutexes that obey the (optional) */
+ /* POSIX scheduling rules are subject to convoys in high contention */
+ /* applications. This is basically a spin lock. */
+ extern pthread_t GC_lock_holder;
+ extern void GC_lock(void);
+ /* Allocation lock holder. Only set if acquired by client through */
+ /* GC_call_with_alloc_lock. */
+# define SET_LOCK_HOLDER() GC_lock_holder = pthread_self()
+# define NO_THREAD (pthread_t)(-1)
+# define UNSET_LOCK_HOLDER() GC_lock_holder = NO_THREAD
+# define I_HOLD_LOCK() (pthread_equal(GC_lock_holder, pthread_self()))
+# ifdef UNDEFINED
+# define LOCK() pthread_mutex_lock(&GC_allocate_ml)
+# define UNLOCK() pthread_mutex_unlock(&GC_allocate_ml)
+# else
+# define LOCK() { if (GC_test_and_set(&GC_allocate_lock, 1)) GC_lock(); }
+# if __mips >= 3 && (defined (_ABIN32) || defined(_ABI64))
+# define UNLOCK() __lock_release(&GC_allocate_lock)
+# else
+# define UNLOCK() GC_allocate_lock = 0
+# endif
+# endif
+ extern GC_bool GC_collecting;
+# define ENTER_GC() \
+ { \
+ GC_collecting = 1; \
+ }
+# define EXIT_GC() GC_collecting = 0;
+# endif /* IRIX_THREADS */
+# ifdef WIN32_THREADS
+# include <windows.h>
+ GC_API CRITICAL_SECTION GC_allocate_ml;
+# define LOCK() EnterCriticalSection(&GC_allocate_ml);
+# define UNLOCK() LeaveCriticalSection(&GC_allocate_ml);
+# endif
+# ifdef QUICK_THREADS
+# define LOCK()
+# define UNLOCK()
+# endif
+# ifndef SET_LOCK_HOLDER
+# define SET_LOCK_HOLDER()
+# define UNSET_LOCK_HOLDER()
+# define I_HOLD_LOCK() FALSE
+ /* Used on platforms were locks can be reacquired, */
+ /* so it doesn't matter if we lie. */
+# endif
+# else
+# define LOCK()
+# define UNLOCK()
+# endif
+# ifndef SET_LOCK_HOLDER
+# define SET_LOCK_HOLDER()
+# define UNSET_LOCK_HOLDER()
+# define I_HOLD_LOCK() FALSE
+ /* Used on platforms were locks can be reacquired, */
+ /* so it doesn't matter if we lie. */
+# endif
+# ifndef ENTER_GC
+# define ENTER_GC()
+# define EXIT_GC()
+# endif
+
+# ifndef DCL_LOCK_STATE
+# define DCL_LOCK_STATE
+# endif
+# ifndef FASTLOCK
+# define FASTLOCK() LOCK()
+# define FASTLOCK_SUCCEEDED() TRUE
+# define FASTUNLOCK() UNLOCK()
+# endif
+
+/* Delay any interrupts or signals that may abort this thread. Data */
+/* structures are in a consistent state outside this pair of calls. */
+/* ANSI C allows both to be empty (though the standard isn't very */
+/* clear on that point). Standard malloc implementations are usually */
+/* neither interruptable nor thread-safe, and thus correspond to */
+/* empty definitions. */
+# ifdef PCR
+# define DISABLE_SIGNALS() \
+ PCR_Th_SetSigMask(PCR_allSigsBlocked,&GC_old_sig_mask)
+# define ENABLE_SIGNALS() \
+ PCR_Th_SetSigMask(&GC_old_sig_mask, NIL)
+# else
+# if defined(SRC_M3) || defined(AMIGA) || defined(SOLARIS_THREADS) \
+ || defined(MSWIN32) || defined(MACOS) || defined(DJGPP) \
+ || defined(NO_SIGNALS) || defined(IRIX_THREADS) \
+ || defined(LINUX_THREADS)
+ /* Also useful for debugging. */
+ /* Should probably use thr_sigsetmask for SOLARIS_THREADS. */
+# define DISABLE_SIGNALS()
+# define ENABLE_SIGNALS()
+# else
+# define DISABLE_SIGNALS() GC_disable_signals()
+ void GC_disable_signals();
+# define ENABLE_SIGNALS() GC_enable_signals()
+ void GC_enable_signals();
+# endif
+# endif
+
+/*
+ * Stop and restart mutator threads.
+ */
+# ifdef PCR
+# include "th/PCR_ThCtl.h"
+# define STOP_WORLD() \
+ PCR_ThCtl_SetExclusiveMode(PCR_ThCtl_ExclusiveMode_stopNormal, \
+ PCR_allSigsBlocked, \
+ PCR_waitForever)
+# define START_WORLD() \
+ PCR_ThCtl_SetExclusiveMode(PCR_ThCtl_ExclusiveMode_null, \
+ PCR_allSigsBlocked, \
+ PCR_waitForever);
+# else
+# if defined(SOLARIS_THREADS) || defined(WIN32_THREADS) \
+ || defined(IRIX_THREADS) || defined(LINUX_THREADS)
+ void GC_stop_world();
+ void GC_start_world();
+# define STOP_WORLD() GC_stop_world()
+# define START_WORLD() GC_start_world()
+# else
+# define STOP_WORLD()
+# define START_WORLD()
+# endif
+# endif
+
+/* Abandon ship */
+# ifdef PCR
+# define ABORT(s) PCR_Base_Panic(s)
+# else
+# ifdef SMALL_CONFIG
+# define ABORT(msg) abort();
+# else
+ GC_API void GC_abort();
+# define ABORT(msg) GC_abort(msg);
+# endif
+# endif
+
+/* Exit abnormally, but without making a mess (e.g. out of memory) */
+# ifdef PCR
+# define EXIT() PCR_Base_Exit(1,PCR_waitForever)
+# else
+# define EXIT() (void)exit(1)
+# endif
+
+/* Print warning message, e.g. almost out of memory. */
+# define WARN(msg,arg) (*GC_current_warn_proc)(msg, (GC_word)(arg))
+extern GC_warn_proc GC_current_warn_proc;
+
+/*********************************/
+/* */
+/* Word-size-dependent defines */
+/* */
+/*********************************/
+
+#if CPP_WORDSZ == 32
+# define WORDS_TO_BYTES(x) ((x)<<2)
+# define BYTES_TO_WORDS(x) ((x)>>2)
+# define LOGWL ((word)5) /* log[2] of CPP_WORDSZ */
+# define modWORDSZ(n) ((n) & 0x1f) /* n mod size of word */
+# if ALIGNMENT != 4
+# define UNALIGNED
+# endif
+#endif
+
+#if CPP_WORDSZ == 64
+# define WORDS_TO_BYTES(x) ((x)<<3)
+# define BYTES_TO_WORDS(x) ((x)>>3)
+# define LOGWL ((word)6) /* log[2] of CPP_WORDSZ */
+# define modWORDSZ(n) ((n) & 0x3f) /* n mod size of word */
+# if ALIGNMENT != 8
+# define UNALIGNED
+# endif
+#endif
+
+#define WORDSZ ((word)CPP_WORDSZ)
+#define SIGNB ((word)1 << (WORDSZ-1))
+#define BYTES_PER_WORD ((word)(sizeof (word)))
+#define ONES ((word)(-1))
+#define divWORDSZ(n) ((n) >> LOGWL) /* divide n by size of word */
+
+/*********************/
+/* */
+/* Size Parameters */
+/* */
+/*********************/
+
+/* heap block size, bytes. Should be power of 2 */
+
+#ifndef HBLKSIZE
+# ifdef SMALL_CONFIG
+# define CPP_LOG_HBLKSIZE 10
+# else
+# if CPP_WORDSZ == 32
+# define CPP_LOG_HBLKSIZE 12
+# else
+# define CPP_LOG_HBLKSIZE 13
+# endif
+# endif
+#else
+# if HBLKSIZE == 512
+# define CPP_LOG_HBLKSIZE 9
+# endif
+# if HBLKSIZE == 1024
+# define CPP_LOG_HBLKSIZE 10
+# endif
+# if HBLKSIZE == 2048
+# define CPP_LOG_HBLKSIZE 11
+# endif
+# if HBLKSIZE == 4096
+# define CPP_LOG_HBLKSIZE 12
+# endif
+# if HBLKSIZE == 8192
+# define CPP_LOG_HBLKSIZE 13
+# endif
+# if HBLKSIZE == 16384
+# define CPP_LOG_HBLKSIZE 14
+# endif
+# ifndef CPP_LOG_HBLKSIZE
+ --> fix HBLKSIZE
+# endif
+# undef HBLKSIZE
+#endif
+# define CPP_HBLKSIZE (1 << CPP_LOG_HBLKSIZE)
+# define LOG_HBLKSIZE ((word)CPP_LOG_HBLKSIZE)
+# define HBLKSIZE ((word)CPP_HBLKSIZE)
+
+
+/* max size objects supported by freelist (larger objects may be */
+/* allocated, but less efficiently) */
+
+#define CPP_MAXOBJSZ BYTES_TO_WORDS(CPP_HBLKSIZE/2)
+#define MAXOBJSZ ((word)CPP_MAXOBJSZ)
+
+# define divHBLKSZ(n) ((n) >> LOG_HBLKSIZE)
+
+# define HBLK_PTR_DIFF(p,q) divHBLKSZ((ptr_t)p - (ptr_t)q)
+ /* Equivalent to subtracting 2 hblk pointers. */
+ /* We do it this way because a compiler should */
+ /* find it hard to use an integer division */
+ /* instead of a shift. The bundled SunOS 4.1 */
+ /* o.w. sometimes pessimizes the subtraction to */
+ /* involve a call to .div. */
+
+# define modHBLKSZ(n) ((n) & (HBLKSIZE-1))
+
+# define HBLKPTR(objptr) ((struct hblk *)(((word) (objptr)) & ~(HBLKSIZE-1)))
+
+# define HBLKDISPL(objptr) (((word) (objptr)) & (HBLKSIZE-1))
+
+/* Round up byte allocation requests to integral number of words, etc. */
+# ifdef ADD_BYTE_AT_END
+# define ROUNDED_UP_WORDS(n) BYTES_TO_WORDS((n) + WORDS_TO_BYTES(1))
+# ifdef ALIGN_DOUBLE
+# define ALIGNED_WORDS(n) (BYTES_TO_WORDS((n) + WORDS_TO_BYTES(2)) & ~1)
+# else
+# define ALIGNED_WORDS(n) ROUNDED_UP_WORDS(n)
+# endif
+# define SMALL_OBJ(bytes) ((bytes) < WORDS_TO_BYTES(MAXOBJSZ))
+# define ADD_SLOP(bytes) ((bytes)+1)
+# else
+# define ROUNDED_UP_WORDS(n) BYTES_TO_WORDS((n) + (WORDS_TO_BYTES(1) - 1))
+# ifdef ALIGN_DOUBLE
+# define ALIGNED_WORDS(n) \
+ (BYTES_TO_WORDS((n) + WORDS_TO_BYTES(2) - 1) & ~1)
+# else
+# define ALIGNED_WORDS(n) ROUNDED_UP_WORDS(n)
+# endif
+# define SMALL_OBJ(bytes) ((bytes) <= WORDS_TO_BYTES(MAXOBJSZ))
+# define ADD_SLOP(bytes) (bytes)
+# endif
+
+
+/*
+ * Hash table representation of sets of pages. This assumes it is
+ * OK to add spurious entries to sets.
+ * Used by black-listing code, and perhaps by dirty bit maintenance code.
+ */
+
+# ifdef LARGE_CONFIG
+# define LOG_PHT_ENTRIES 17
+# else
+# define LOG_PHT_ENTRIES 14 /* Collisions are likely if heap grows */
+ /* to more than 16K hblks = 64MB. */
+ /* Each hash table occupies 2K bytes. */
+# endif
+# define PHT_ENTRIES ((word)1 << LOG_PHT_ENTRIES)
+# define PHT_SIZE (PHT_ENTRIES >> LOGWL)
+typedef word page_hash_table[PHT_SIZE];
+
+# define PHT_HASH(addr) ((((word)(addr)) >> LOG_HBLKSIZE) & (PHT_ENTRIES - 1))
+
+# define get_pht_entry_from_index(bl, index) \
+ (((bl)[divWORDSZ(index)] >> modWORDSZ(index)) & 1)
+# define set_pht_entry_from_index(bl, index) \
+ (bl)[divWORDSZ(index)] |= (word)1 << modWORDSZ(index)
+# define clear_pht_entry_from_index(bl, index) \
+ (bl)[divWORDSZ(index)] &= ~((word)1 << modWORDSZ(index))
+
+
+
+/********************************************/
+/* */
+/* H e a p B l o c k s */
+/* */
+/********************************************/
+
+/* heap block header */
+#define HBLKMASK (HBLKSIZE-1)
+
+#define BITS_PER_HBLK (HBLKSIZE * 8)
+
+#define MARK_BITS_PER_HBLK (BITS_PER_HBLK/CPP_WORDSZ)
+ /* upper bound */
+ /* We allocate 1 bit/word. Only the first word */
+ /* in each object is actually marked. */
+
+# ifdef ALIGN_DOUBLE
+# define MARK_BITS_SZ (((MARK_BITS_PER_HBLK + 2*CPP_WORDSZ - 1) \
+ / (2*CPP_WORDSZ))*2)
+# else
+# define MARK_BITS_SZ ((MARK_BITS_PER_HBLK + CPP_WORDSZ - 1)/CPP_WORDSZ)
+# endif
+ /* Upper bound on number of mark words per heap block */
+
+struct hblkhdr {
+ word hb_sz; /* If in use, size in words, of objects in the block. */
+ /* if free, the size in bytes of the whole block */
+ struct hblk * hb_next; /* Link field for hblk free list */
+ /* and for lists of chunks waiting to be */
+ /* reclaimed. */
+ word hb_descr; /* object descriptor for marking. See */
+ /* mark.h. */
+ char* hb_map; /* A pointer to a pointer validity map of the block. */
+ /* See GC_obj_map. */
+ /* Valid for all blocks with headers. */
+ /* Free blocks point to GC_invalid_map. */
+ unsigned char hb_obj_kind;
+ /* Kind of objects in the block. Each kind */
+ /* identifies a mark procedure and a set of */
+ /* list headers. Sometimes called regions. */
+ unsigned char hb_flags;
+# define IGNORE_OFF_PAGE 1 /* Ignore pointers that do not */
+ /* point to the first page of */
+ /* this object. */
+ unsigned short hb_last_reclaimed;
+ /* Value of GC_gc_no when block was */
+ /* last allocated or swept. May wrap. */
+ word hb_marks[MARK_BITS_SZ];
+ /* Bit i in the array refers to the */
+ /* object starting at the ith word (header */
+ /* INCLUDED) in the heap block. */
+ /* The lsb of word 0 is numbered 0. */
+};
+
+/* heap block body */
+
+# define DISCARD_WORDS 0
+ /* Number of words to be dropped at the beginning of each block */
+ /* Must be a multiple of WORDSZ. May reasonably be nonzero */
+ /* on machines that don't guarantee longword alignment of */
+ /* pointers, so that the number of false hits is minimized. */
+ /* 0 and WORDSZ are probably the only reasonable values. */
+
+# define BODY_SZ ((HBLKSIZE-WORDS_TO_BYTES(DISCARD_WORDS))/sizeof(word))
+
+struct hblk {
+# if (DISCARD_WORDS != 0)
+ word garbage[DISCARD_WORDS];
+# endif
+ word hb_body[BODY_SZ];
+};
+
+# define HDR_WORDS ((word)DISCARD_WORDS)
+# define HDR_BYTES ((word)WORDS_TO_BYTES(DISCARD_WORDS))
+
+# define OBJ_SZ_TO_BLOCKS(sz) \
+ divHBLKSZ(HDR_BYTES + WORDS_TO_BYTES(sz) + HBLKSIZE-1)
+ /* Size of block (in units of HBLKSIZE) needed to hold objects of */
+ /* given sz (in words). */
+
+/* Object free list link */
+# define obj_link(p) (*(ptr_t *)(p))
+
+/* lists of all heap blocks and free lists */
+/* These are grouped together in a struct */
+/* so that they can be easily skipped by the */
+/* GC_mark routine. */
+/* The ordering is weird to make GC_malloc */
+/* faster by keeping the important fields */
+/* sufficiently close together that a */
+/* single load of a base register will do. */
+/* Scalars that could easily appear to */
+/* be pointers are also put here. */
+/* The main fields should precede any */
+/* conditionally included fields, so that */
+/* gc_inl.h will work even if a different set */
+/* of macros is defined when the client is */
+/* compiled. */
+
+struct _GC_arrays {
+ word _heapsize;
+ word _max_heapsize;
+ ptr_t _last_heap_addr;
+ ptr_t _prev_heap_addr;
+ word _words_allocd_before_gc;
+ /* Number of words allocated before this */
+ /* collection cycle. */
+ word _words_allocd;
+ /* Number of words allocated during this collection cycle */
+ word _words_wasted;
+ /* Number of words wasted due to internal fragmentation */
+ /* in large objects, or due to dropping blacklisted */
+ /* blocks, since last gc. Approximate. */
+ word _words_finalized;
+ /* Approximate number of words in objects (and headers) */
+ /* That became ready for finalization in the last */
+ /* collection. */
+ word _non_gc_bytes_at_gc;
+ /* Number of explicitly managed bytes of storage */
+ /* at last collection. */
+ word _mem_freed;
+ /* Number of explicitly deallocated words of memory */
+ /* since last collection. */
+
+ ptr_t _objfreelist[MAXOBJSZ+1];
+ /* free list for objects */
+ ptr_t _aobjfreelist[MAXOBJSZ+1];
+ /* free list for atomic objs */
+
+ ptr_t _uobjfreelist[MAXOBJSZ+1];
+ /* uncollectable but traced objs */
+ /* objects on this and auobjfreelist */
+ /* are always marked, except during */
+ /* garbage collections. */
+# ifdef ATOMIC_UNCOLLECTABLE
+ ptr_t _auobjfreelist[MAXOBJSZ+1];
+# endif
+ /* uncollectable but traced objs */
+
+# ifdef GATHERSTATS
+ word _composite_in_use;
+ /* Number of words in accessible composite */
+ /* objects. */
+ word _atomic_in_use;
+ /* Number of words in accessible atomic */
+ /* objects. */
+# endif
+# ifdef MERGE_SIZES
+ unsigned _size_map[WORDS_TO_BYTES(MAXOBJSZ+1)];
+ /* Number of words to allocate for a given allocation request in */
+ /* bytes. */
+# endif
+
+# ifdef STUBBORN_ALLOC
+ ptr_t _sobjfreelist[MAXOBJSZ+1];
+# endif
+ /* free list for immutable objects */
+ ptr_t _obj_map[MAXOBJSZ+1];
+ /* If not NIL, then a pointer to a map of valid */
+ /* object addresses. _obj_map[sz][i] is j if the */
+ /* address block_start+i is a valid pointer */
+ /* to an object at */
+ /* block_start+i&~3 - WORDS_TO_BYTES(j). */
+ /* (If ALL_INTERIOR_POINTERS is defined, then */
+ /* instead ((short *)(hbh_map[sz])[i] is j if */
+ /* block_start+WORDS_TO_BYTES(i) is in the */
+ /* interior of an object starting at */
+ /* block_start+WORDS_TO_BYTES(i-j)). */
+ /* It is OBJ_INVALID if */
+ /* block_start+WORDS_TO_BYTES(i) is not */
+ /* valid as a pointer to an object. */
+ /* We assume all values of j <= OBJ_INVALID. */
+ /* The zeroth entry corresponds to large objects.*/
+# ifdef ALL_INTERIOR_POINTERS
+# define map_entry_type short
+# define OBJ_INVALID 0x7fff
+# define MAP_ENTRY(map, bytes) \
+ (((map_entry_type *)(map))[BYTES_TO_WORDS(bytes)])
+# define MAP_ENTRIES BYTES_TO_WORDS(HBLKSIZE)
+# define MAP_SIZE (MAP_ENTRIES * sizeof(map_entry_type))
+# define OFFSET_VALID(displ) TRUE
+# define CPP_MAX_OFFSET (HBLKSIZE - HDR_BYTES - 1)
+# define MAX_OFFSET ((word)CPP_MAX_OFFSET)
+# else
+# define map_entry_type char
+# define OBJ_INVALID 0x7f
+# define MAP_ENTRY(map, bytes) \
+ (map)[bytes]
+# define MAP_ENTRIES HBLKSIZE
+# define MAP_SIZE MAP_ENTRIES
+# define CPP_MAX_OFFSET (WORDS_TO_BYTES(OBJ_INVALID) - 1)
+# define MAX_OFFSET ((word)CPP_MAX_OFFSET)
+# define VALID_OFFSET_SZ \
+ (CPP_MAX_OFFSET > WORDS_TO_BYTES(CPP_MAXOBJSZ)? \
+ CPP_MAX_OFFSET+1 \
+ : WORDS_TO_BYTES(CPP_MAXOBJSZ)+1)
+ char _valid_offsets[VALID_OFFSET_SZ];
+ /* GC_valid_offsets[i] == TRUE ==> i */
+ /* is registered as a displacement. */
+# define OFFSET_VALID(displ) GC_valid_offsets[displ]
+ char _modws_valid_offsets[sizeof(word)];
+ /* GC_valid_offsets[i] ==> */
+ /* GC_modws_valid_offsets[i%sizeof(word)] */
+# endif
+# ifdef STUBBORN_ALLOC
+ page_hash_table _changed_pages;
+ /* Stubborn object pages that were changes since last call to */
+ /* GC_read_changed. */
+ page_hash_table _prev_changed_pages;
+ /* Stubborn object pages that were changes before last call to */
+ /* GC_read_changed. */
+# endif
+# if defined(PROC_VDB) || defined(MPROTECT_VDB)
+ page_hash_table _grungy_pages; /* Pages that were dirty at last */
+ /* GC_read_dirty. */
+# endif
+# ifdef LARGE_CONFIG
+# if CPP_WORDSZ > 32
+# define MAX_HEAP_SECTS 4096 /* overflows at roughly 64 GB */
+# else
+# define MAX_HEAP_SECTS 768 /* Separately added heap sections. */
+# endif
+# else
+# define MAX_HEAP_SECTS 256
+# endif
+ struct HeapSect {
+ ptr_t hs_start; word hs_bytes;
+ } _heap_sects[MAX_HEAP_SECTS];
+# ifdef MSWIN32
+ ptr_t _heap_bases[MAX_HEAP_SECTS];
+ /* Start address of memory regions obtained from kernel. */
+# endif
+ /* Block header index; see gc_headers.h */
+ bottom_index * _all_nils;
+ bottom_index * _top_index [TOP_SZ];
+#ifdef SAVE_CALL_CHAIN
+ struct callinfo _last_stack[NFRAMES]; /* Stack at last garbage collection.*/
+ /* Useful for debugging mysterious */
+ /* object disappearances. */
+ /* In the multithreaded case, we */
+ /* currently only save the calling */
+ /* stack. */
+#endif
+};
+
+GC_API GC_FAR struct _GC_arrays GC_arrays;
+
+# define GC_objfreelist GC_arrays._objfreelist
+# define GC_aobjfreelist GC_arrays._aobjfreelist
+# define GC_uobjfreelist GC_arrays._uobjfreelist
+# ifdef ATOMIC_UNCOLLECTABLE
+# define GC_auobjfreelist GC_arrays._auobjfreelist
+# endif
+# define GC_sobjfreelist GC_arrays._sobjfreelist
+# define GC_valid_offsets GC_arrays._valid_offsets
+# define GC_modws_valid_offsets GC_arrays._modws_valid_offsets
+# ifdef STUBBORN_ALLOC
+# define GC_changed_pages GC_arrays._changed_pages
+# define GC_prev_changed_pages GC_arrays._prev_changed_pages
+# endif
+# define GC_obj_map GC_arrays._obj_map
+# define GC_last_heap_addr GC_arrays._last_heap_addr
+# define GC_prev_heap_addr GC_arrays._prev_heap_addr
+# define GC_words_allocd GC_arrays._words_allocd
+# define GC_words_wasted GC_arrays._words_wasted
+# define GC_words_finalized GC_arrays._words_finalized
+# define GC_non_gc_bytes_at_gc GC_arrays._non_gc_bytes_at_gc
+# define GC_mem_freed GC_arrays._mem_freed
+# define GC_heapsize GC_arrays._heapsize
+# define GC_max_heapsize GC_arrays._max_heapsize
+# define GC_words_allocd_before_gc GC_arrays._words_allocd_before_gc
+# define GC_heap_sects GC_arrays._heap_sects
+# define GC_last_stack GC_arrays._last_stack
+# ifdef MSWIN32
+# define GC_heap_bases GC_arrays._heap_bases
+# endif
+# define GC_all_nils GC_arrays._all_nils
+# define GC_top_index GC_arrays._top_index
+# if defined(PROC_VDB) || defined(MPROTECT_VDB)
+# define GC_grungy_pages GC_arrays._grungy_pages
+# endif
+# ifdef GATHERSTATS
+# define GC_composite_in_use GC_arrays._composite_in_use
+# define GC_atomic_in_use GC_arrays._atomic_in_use
+# endif
+# ifdef MERGE_SIZES
+# define GC_size_map GC_arrays._size_map
+# endif
+
+# define beginGC_arrays ((ptr_t)(&GC_arrays))
+# define endGC_arrays (((ptr_t)(&GC_arrays)) + (sizeof GC_arrays))
+
+GC_API word GC_fo_entries;
+
+# define MAXOBJKINDS 16
+
+/* Object kinds: */
+extern struct obj_kind {
+ ptr_t *ok_freelist; /* Array of free listheaders for this kind of object */
+ /* Point either to GC_arrays or to storage allocated */
+ /* with GC_scratch_alloc. */
+ struct hblk **ok_reclaim_list;
+ /* List headers for lists of blocks waiting to be */
+ /* swept. */
+ word ok_descriptor; /* Descriptor template for objects in this */
+ /* block. */
+ GC_bool ok_relocate_descr;
+ /* Add object size in bytes to descriptor */
+ /* template to obtain descriptor. Otherwise */
+ /* template is used as is. */
+ GC_bool ok_init; /* Clear objects before putting them on the free list. */
+} GC_obj_kinds[MAXOBJKINDS];
+/* Predefined kinds: */
+# define PTRFREE 0
+# define NORMAL 1
+# define UNCOLLECTABLE 2
+# ifdef ATOMIC_UNCOLLECTABLE
+# define AUNCOLLECTABLE 3
+# define STUBBORN 4
+# define IS_UNCOLLECTABLE(k) (((k) & ~1) == UNCOLLECTABLE)
+# else
+# define STUBBORN 3
+# define IS_UNCOLLECTABLE(k) ((k) == UNCOLLECTABLE)
+# endif
+
+extern int GC_n_kinds;
+
+extern word GC_n_heap_sects; /* Number of separately added heap */
+ /* sections. */
+
+extern word GC_page_size;
+
+# ifdef MSWIN32
+extern word GC_n_heap_bases; /* See GC_heap_bases. */
+# endif
+
+extern word GC_total_stack_black_listed;
+ /* Number of bytes on stack blacklist. */
+
+extern word GC_black_list_spacing;
+ /* Average number of bytes between blacklisted */
+ /* blocks. Approximate. */
+ /* Counts only blocks that are */
+ /* "stack-blacklisted", i.e. that are */
+ /* problematic in the interior of an object. */
+
+extern char * GC_invalid_map;
+ /* Pointer to the nowhere valid hblk map */
+ /* Blocks pointing to this map are free. */
+
+extern struct hblk * GC_hblkfreelist;
+ /* List of completely empty heap blocks */
+ /* Linked through hb_next field of */
+ /* header structure associated with */
+ /* block. */
+
+extern GC_bool GC_is_initialized; /* GC_init() has been run. */
+
+extern GC_bool GC_objects_are_marked; /* There are marked objects in */
+ /* the heap. */
+
+extern GC_bool GC_incremental; /* Using incremental/generational collection. */
+
+extern GC_bool GC_dirty_maintained;
+ /* Dirty bits are being maintained, */
+ /* either for incremental collection, */
+ /* or to limit the root set. */
+
+# ifndef PCR
+ extern ptr_t GC_stackbottom; /* Cool end of user stack */
+# endif
+
+extern word GC_root_size; /* Total size of registered root sections */
+
+extern GC_bool GC_debugging_started; /* GC_debug_malloc has been called. */
+
+extern ptr_t GC_least_plausible_heap_addr;
+extern ptr_t GC_greatest_plausible_heap_addr;
+ /* Bounds on the heap. Guaranteed valid */
+ /* Likely to include future heap expansion. */
+
+/* Operations */
+# ifndef abs
+# define abs(x) ((x) < 0? (-(x)) : (x))
+# endif
+
+
+/* Marks are in a reserved area in */
+/* each heap block. Each word has one mark bit associated */
+/* with it. Only those corresponding to the beginning of an */
+/* object are used. */
+
+
+/* Mark bit operations */
+
+/*
+ * Retrieve, set, clear the mark bit corresponding
+ * to the nth word in a given heap block.
+ *
+ * (Recall that bit n corresponds to object beginning at word n
+ * relative to the beginning of the block, including unused words)
+ */
+
+# define mark_bit_from_hdr(hhdr,n) (((hhdr)->hb_marks[divWORDSZ(n)] \
+ >> (modWORDSZ(n))) & (word)1)
+# define set_mark_bit_from_hdr(hhdr,n) (hhdr)->hb_marks[divWORDSZ(n)] \
+ |= (word)1 << modWORDSZ(n)
+
+# define clear_mark_bit_from_hdr(hhdr,n) (hhdr)->hb_marks[divWORDSZ(n)] \
+ &= ~((word)1 << modWORDSZ(n))
+
+/* Important internal collector routines */
+
+ptr_t GC_approx_sp();
+
+GC_bool GC_should_collect();
+#ifdef PRESERVE_LAST
+ GC_bool GC_in_last_heap_sect(/* ptr_t */);
+ /* In last added heap section? If so, avoid breaking up. */
+#endif
+void GC_apply_to_all_blocks(/*fn, client_data*/);
+ /* Invoke fn(hbp, client_data) for each */
+ /* allocated heap block. */
+struct hblk * GC_next_block(/* struct hblk * h */);
+void GC_mark_init();
+void GC_clear_marks(); /* Clear mark bits for all heap objects. */
+void GC_invalidate_mark_state(); /* Tell the marker that marked */
+ /* objects may point to unmarked */
+ /* ones, and roots may point to */
+ /* unmarked objects. */
+ /* Reset mark stack. */
+void GC_mark_from_mark_stack(); /* Mark from everything on the mark stack. */
+ /* Return after about one pages worth of */
+ /* work. */
+GC_bool GC_mark_stack_empty();
+GC_bool GC_mark_some(); /* Perform about one pages worth of marking */
+ /* work of whatever kind is needed. Returns */
+ /* quickly if no collection is in progress. */
+ /* Return TRUE if mark phase finished. */
+void GC_initiate_gc(); /* initiate collection. */
+ /* If the mark state is invalid, this */
+ /* becomes full colleection. Otherwise */
+ /* it's partial. */
+void GC_push_all(/*b,t*/); /* Push everything in a range */
+ /* onto mark stack. */
+void GC_push_dirty(/*b,t*/); /* Push all possibly changed */
+ /* subintervals of [b,t) onto */
+ /* mark stack. */
+#ifndef SMALL_CONFIG
+ void GC_push_conditional(/* ptr_t b, ptr_t t, GC_bool all*/);
+#else
+# define GC_push_conditional(b, t, all) GC_push_all(b, t)
+#endif
+ /* Do either of the above, depending */
+ /* on the third arg. */
+void GC_push_all_stack(/*b,t*/); /* As above, but consider */
+ /* interior pointers as valid */
+void GC_push_roots(/* GC_bool all */); /* Push all or dirty roots. */
+extern void (*GC_push_other_roots)();
+ /* Push system or application specific roots */
+ /* onto the mark stack. In some environments */
+ /* (e.g. threads environments) this is */
+ /* predfined to be non-zero. A client supplied */
+ /* replacement should also call the original */
+ /* function. */
+extern void (*GC_start_call_back)(/* void */);
+ /* Called at start of full collections. */
+ /* Not called if 0. Called with allocation */
+ /* lock held. */
+ /* 0 by default. */
+void GC_push_regs(); /* Push register contents onto mark stack. */
+void GC_remark(); /* Mark from all marked objects. Used */
+ /* only if we had to drop something. */
+# if defined(MSWIN32)
+ void __cdecl GC_push_one();
+# else
+ void GC_push_one(/*p*/); /* If p points to an object, mark it */
+ /* and push contents on the mark stack */
+# endif
+void GC_push_one_checked(/*p*/); /* Ditto, omits plausibility test */
+void GC_push_marked(/* struct hblk h, hdr * hhdr */);
+ /* Push contents of all marked objects in h onto */
+ /* mark stack. */
+#ifdef SMALL_CONFIG
+# define GC_push_next_marked_dirty(h) GC_push_next_marked(h)
+#else
+ struct hblk * GC_push_next_marked_dirty(/* h */);
+ /* Invoke GC_push_marked on next dirty block above h. */
+ /* Return a pointer just past the end of this block. */
+#endif /* !SMALL_CONFIG */
+struct hblk * GC_push_next_marked(/* h */);
+ /* Ditto, but also mark from clean pages. */
+struct hblk * GC_push_next_marked_uncollectable(/* h */);
+ /* Ditto, but mark only from uncollectable pages. */
+GC_bool GC_stopped_mark(); /* Stop world and mark from all roots */
+ /* and rescuers. */
+void GC_clear_hdr_marks(/* hhdr */); /* Clear the mark bits in a header */
+void GC_set_hdr_marks(/* hhdr */); /* Set the mark bits in a header */
+void GC_add_roots_inner();
+GC_bool GC_is_static_root(/* ptr_t p */);
+ /* Is the address p in one of the registered static */
+ /* root sections? */
+void GC_register_dynamic_libraries();
+ /* Add dynamic library data sections to the root set. */
+
+/* Machine dependent startup routines */
+ptr_t GC_get_stack_base();
+void GC_register_data_segments();
+
+/* Black listing: */
+void GC_bl_init();
+# ifndef ALL_INTERIOR_POINTERS
+ void GC_add_to_black_list_normal(/* bits, maybe source */);
+ /* Register bits as a possible future false */
+ /* reference from the heap or static data */
+# ifdef PRINT_BLACK_LIST
+# define GC_ADD_TO_BLACK_LIST_NORMAL(bits, source) \
+ GC_add_to_black_list_normal(bits, source)
+# else
+# define GC_ADD_TO_BLACK_LIST_NORMAL(bits, source) \
+ GC_add_to_black_list_normal(bits)
+# endif
+# else
+# ifdef PRINT_BLACK_LIST
+# define GC_ADD_TO_BLACK_LIST_NORMAL(bits, source) \
+ GC_add_to_black_list_stack(bits, source)
+# else
+# define GC_ADD_TO_BLACK_LIST_NORMAL(bits, source) \
+ GC_add_to_black_list_stack(bits)
+# endif
+# endif
+
+void GC_add_to_black_list_stack(/* bits, maybe source */);
+struct hblk * GC_is_black_listed(/* h, len */);
+ /* If there are likely to be false references */
+ /* to a block starting at h of the indicated */
+ /* length, then return the next plausible */
+ /* starting location for h that might avoid */
+ /* these false references. */
+void GC_promote_black_lists();
+ /* Declare an end to a black listing phase. */
+void GC_unpromote_black_lists();
+ /* Approximately undo the effect of the above. */
+ /* This actually loses some information, but */
+ /* only in a reasonably safe way. */
+word GC_number_stack_black_listed(/*struct hblk *start, struct hblk *endp1 */);
+ /* Return the number of (stack) blacklisted */
+ /* blocks in the range for statistical */
+ /* purposes. */
+
+ptr_t GC_scratch_alloc(/*bytes*/);
+ /* GC internal memory allocation for */
+ /* small objects. Deallocation is not */
+ /* possible. */
+
+/* Heap block layout maps: */
+void GC_invalidate_map(/* hdr */);
+ /* Remove the object map associated */
+ /* with the block. This identifies */
+ /* the block as invalid to the mark */
+ /* routines. */
+GC_bool GC_add_map_entry(/*sz*/);
+ /* Add a heap block map for objects of */
+ /* size sz to obj_map. */
+ /* Return FALSE on failure. */
+void GC_register_displacement_inner(/*offset*/);
+ /* Version of GC_register_displacement */
+ /* that assumes lock is already held */
+ /* and signals are already disabled. */
+
+/* hblk allocation: */
+void GC_new_hblk(/*size_in_words, kind*/);
+ /* Allocate a new heap block, and build */
+ /* a free list in it. */
+struct hblk * GC_allochblk(/*size_in_words, kind*/);
+ /* Allocate a heap block, clear it if */
+ /* for composite objects, inform */
+ /* the marker that block is valid */
+ /* for objects of indicated size. */
+ /* sz < 0 ==> atomic. */
+void GC_freehblk(); /* Deallocate a heap block and mark it */
+ /* as invalid. */
+
+/* Misc GC: */
+void GC_init_inner();
+GC_bool GC_expand_hp_inner();
+void GC_start_reclaim(/*abort_if_found*/);
+ /* Restore unmarked objects to free */
+ /* lists, or (if abort_if_found is */
+ /* TRUE) report them. */
+ /* Sweeping of small object pages is */
+ /* largely deferred. */
+void GC_continue_reclaim(/*size, kind*/);
+ /* Sweep pages of the given size and */
+ /* kind, as long as possible, and */
+ /* as long as the corr. free list is */
+ /* empty. */
+void GC_reclaim_or_delete_all();
+ /* Arrange for all reclaim lists to be */
+ /* empty. Judiciously choose between */
+ /* sweeping and discarding each page. */
+GC_bool GC_reclaim_all(/* GC_stop_func f*/);
+ /* Reclaim all blocks. Abort (in a */
+ /* consistent state) if f returns TRUE. */
+GC_bool GC_block_empty(/* hhdr */); /* Block completely unmarked? */
+GC_bool GC_never_stop_func(); /* Returns FALSE. */
+GC_bool GC_try_to_collect_inner(/* GC_stop_func f */);
+ /* Collect; caller must have acquired */
+ /* lock and disabled signals. */
+ /* Collection is aborted if f returns */
+ /* TRUE. Returns TRUE if it completes */
+ /* successfully. */
+# define GC_gcollect_inner() \
+ (void) GC_try_to_collect_inner(GC_never_stop_func)
+void GC_finish_collection(); /* Finish collection. Mark bits are */
+ /* consistent and lock is still held. */
+GC_bool GC_collect_or_expand(/* needed_blocks */);
+ /* Collect or expand heap in an attempt */
+ /* make the indicated number of free */
+ /* blocks available. Should be called */
+ /* until the blocks are available or */
+ /* until it fails by returning FALSE. */
+void GC_init(); /* Initialize collector. */
+void GC_collect_a_little_inner(/* int n */);
+ /* Do n units worth of garbage */
+ /* collection work, if appropriate. */
+ /* A unit is an amount appropriate for */
+ /* HBLKSIZE bytes of allocation. */
+ptr_t GC_generic_malloc(/* bytes, kind */);
+ /* Allocate an object of the given */
+ /* kind. By default, there are only */
+ /* a few kinds: composite(pointerfree), */
+ /* atomic, uncollectable, etc. */
+ /* We claim it's possible for clever */
+ /* client code that understands GC */
+ /* internals to add more, e.g. to */
+ /* communicate object layout info */
+ /* to the collector. */
+ptr_t GC_generic_malloc_ignore_off_page(/* bytes, kind */);
+ /* As above, but pointers past the */
+ /* first page of the resulting object */
+ /* are ignored. */
+ptr_t GC_generic_malloc_inner(/* bytes, kind */);
+ /* Ditto, but I already hold lock, etc. */
+ptr_t GC_generic_malloc_words_small GC_PROTO((size_t words, int kind));
+ /* As above, but size in units of words */
+ /* Bypasses MERGE_SIZES. Assumes */
+ /* words <= MAXOBJSZ. */
+ptr_t GC_generic_malloc_inner_ignore_off_page(/* bytes, kind */);
+ /* Allocate an object, where */
+ /* the client guarantees that there */
+ /* will always be a pointer to the */
+ /* beginning of the object while the */
+ /* object is live. */
+ptr_t GC_allocobj(/* sz_inn_words, kind */);
+ /* Make the indicated */
+ /* free list nonempty, and return its */
+ /* head. */
+
+void GC_init_headers();
+GC_bool GC_install_header(/*h*/);
+ /* Install a header for block h. */
+ /* Return FALSE on failure. */
+GC_bool GC_install_counts(/*h, sz*/);
+ /* Set up forwarding counts for block */
+ /* h of size sz. */
+ /* Return FALSE on failure. */
+void GC_remove_header(/*h*/);
+ /* Remove the header for block h. */
+void GC_remove_counts(/*h, sz*/);
+ /* Remove forwarding counts for h. */
+hdr * GC_find_header(/*p*/); /* Debugging only. */
+
+void GC_finalize(); /* Perform all indicated finalization actions */
+ /* on unmarked objects. */
+ /* Unreachable finalizable objects are enqueued */
+ /* for processing by GC_invoke_finalizers. */
+ /* Invoked with lock. */
+
+void GC_add_to_heap(/*p, bytes*/);
+ /* Add a HBLKSIZE aligned chunk to the heap. */
+
+void GC_print_obj(/* ptr_t p */);
+ /* P points to somewhere inside an object with */
+ /* debugging info. Print a human readable */
+ /* description of the object to stderr. */
+ptr_t GC_debug_object_start(/* ptr_t p */);
+ /* P points to the start of an object that may */
+ /* have debug info at its head. Return the */
+ /* start of the real data. */
+extern void (*GC_check_heap)();
+ /* Check that all objects in the heap with */
+ /* debugging info are intact. Print */
+ /* descriptions of any that are not. */
+extern void (*GC_print_heap_obj)(/* ptr_t p */);
+ /* If possible print s followed by a more */
+ /* detailed description of the object */
+ /* referred to by p. */
+
+/* Virtual dirty bit implementation: */
+/* Each implementation exports the following: */
+void GC_read_dirty(); /* Retrieve dirty bits. */
+GC_bool GC_page_was_dirty(/* struct hblk * h */);
+ /* Read retrieved dirty bits. */
+GC_bool GC_page_was_ever_dirty(/* struct hblk * h */);
+ /* Could the page contain valid heap pointers? */
+void GC_is_fresh(/* struct hblk * h, word number_of_blocks */);
+ /* Assert the region currently contains no */
+ /* valid pointers. */
+void GC_write_hint(/* struct hblk * h */);
+ /* h is about to be written. */
+void GC_dirty_init();
+
+/* Slow/general mark bit manipulation: */
+GC_bool GC_is_marked();
+void GC_clear_mark_bit();
+void GC_set_mark_bit();
+
+/* Stubborn objects: */
+void GC_read_changed(); /* Analogous to GC_read_dirty */
+GC_bool GC_page_was_changed(/* h */); /* Analogous to GC_page_was_dirty */
+void GC_clean_changing_list(); /* Collect obsolete changing list entries */
+void GC_stubborn_init();
+
+/* Debugging print routines: */
+void GC_print_block_list();
+void GC_print_hblkfreelist();
+void GC_print_heap_sects();
+void GC_print_static_roots();
+void GC_dump();
+
+/* Make arguments appear live to compiler */
+# ifdef __WATCOMC__
+ void GC_noop(void*, ...);
+# else
+ GC_API void GC_noop();
+# endif
+
+void GC_noop1(/* word arg */);
+
+/* Logging and diagnostic output: */
+GC_API void GC_printf GC_PROTO((char * format, long, long, long, long, long, long));
+ /* A version of printf that doesn't allocate, */
+ /* is restricted to long arguments, and */
+ /* (unfortunately) doesn't use varargs for */
+ /* portability. Restricted to 6 args and */
+ /* 1K total output length. */
+ /* (We use sprintf. Hopefully that doesn't */
+ /* allocate for long arguments.) */
+# define GC_printf0(f) GC_printf(f, 0l, 0l, 0l, 0l, 0l, 0l)
+# define GC_printf1(f,a) GC_printf(f, (long)a, 0l, 0l, 0l, 0l, 0l)
+# define GC_printf2(f,a,b) GC_printf(f, (long)a, (long)b, 0l, 0l, 0l, 0l)
+# define GC_printf3(f,a,b,c) GC_printf(f, (long)a, (long)b, (long)c, 0l, 0l, 0l)
+# define GC_printf4(f,a,b,c,d) GC_printf(f, (long)a, (long)b, (long)c, \
+ (long)d, 0l, 0l)
+# define GC_printf5(f,a,b,c,d,e) GC_printf(f, (long)a, (long)b, (long)c, \
+ (long)d, (long)e, 0l)
+# define GC_printf6(f,a,b,c,d,e,g) GC_printf(f, (long)a, (long)b, (long)c, \
+ (long)d, (long)e, (long)g)
+
+void GC_err_printf(/* format, a, b, c, d, e, f */);
+# define GC_err_printf0(f) GC_err_puts(f)
+# define GC_err_printf1(f,a) GC_err_printf(f, (long)a, 0l, 0l, 0l, 0l, 0l)
+# define GC_err_printf2(f,a,b) GC_err_printf(f, (long)a, (long)b, 0l, 0l, 0l, 0l)
+# define GC_err_printf3(f,a,b,c) GC_err_printf(f, (long)a, (long)b, (long)c, \
+ 0l, 0l, 0l)
+# define GC_err_printf4(f,a,b,c,d) GC_err_printf(f, (long)a, (long)b, \
+ (long)c, (long)d, 0l, 0l)
+# define GC_err_printf5(f,a,b,c,d,e) GC_err_printf(f, (long)a, (long)b, \
+ (long)c, (long)d, \
+ (long)e, 0l)
+# define GC_err_printf6(f,a,b,c,d,e,g) GC_err_printf(f, (long)a, (long)b, \
+ (long)c, (long)d, \
+ (long)e, (long)g)
+ /* Ditto, writes to stderr. */
+
+void GC_err_puts(/* char *s */);
+ /* Write s to stderr, don't buffer, don't add */
+ /* newlines, don't ... */
+
+
+# endif /* GC_PRIVATE_H */
diff --git a/boehm-gc/gc_private.h b/boehm-gc/gc_private.h
new file mode 100644
index 00000000000..3dd7c8553bb
--- /dev/null
+++ b/boehm-gc/gc_private.h
@@ -0,0 +1 @@
+# include "gc_priv.h"
diff --git a/boehm-gc/gc_typed.h b/boehm-gc/gc_typed.h
new file mode 100644
index 00000000000..e4a6b94756e
--- /dev/null
+++ b/boehm-gc/gc_typed.h
@@ -0,0 +1,91 @@
+/*
+ * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright 1996 Silicon Graphics. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+/*
+ * Some simple primitives for allocation with explicit type information.
+ * Facilities for dynamic type inference may be added later.
+ * Should be used only for extremely performance critical applications,
+ * or if conservative collector leakage is otherwise a problem (unlikely).
+ * Note that this is implemented completely separately from the rest
+ * of the collector, and is not linked in unless referenced.
+ * This does not currently support GC_DEBUG in any interesting way.
+ */
+/* Boehm, May 19, 1994 2:13 pm PDT */
+
+#ifndef _GC_TYPED_H
+# define _GC_TYPED_H
+# ifndef _GC_H
+# include "gc.h"
+# endif
+
+typedef GC_word * GC_bitmap;
+ /* The least significant bit of the first word is one if */
+ /* the first word in the object may be a pointer. */
+
+# define GC_get_bit(bm, index) \
+ (((bm)[divWORDSZ(index)] >> modWORDSZ(index)) & 1)
+# define GC_set_bit(bm, index) \
+ (bm)[divWORDSZ(index)] |= (word)1 << modWORDSZ(index)
+
+typedef GC_word GC_descr;
+
+GC_API GC_descr GC_make_descriptor GC_PROTO((GC_bitmap bm, size_t len));
+ /* Return a type descriptor for the object whose layout */
+ /* is described by the argument. */
+ /* The least significant bit of the first word is one */
+ /* if the first word in the object may be a pointer. */
+ /* The second argument specifies the number of */
+ /* meaningful bits in the bitmap. The actual object */
+ /* may be larger (but not smaller). Any additional */
+ /* words in the object are assumed not to contain */
+ /* pointers. */
+ /* Returns a conservative approximation in the */
+ /* (unlikely) case of insufficient memory to build */
+ /* the descriptor. Calls to GC_make_descriptor */
+ /* may consume some amount of a finite resource. This */
+ /* is intended to be called once per type, not once */
+ /* per allocation. */
+
+GC_API GC_PTR GC_malloc_explicitly_typed
+ GC_PROTO((size_t size_in_bytes, GC_descr d));
+ /* Allocate an object whose layout is described by d. */
+ /* The resulting object MAY NOT BE PASSED TO REALLOC. */
+
+GC_API GC_PTR GC_malloc_explicitly_typed_ignore_off_page
+ GC_PROTO((size_t size_in_bytes, GC_descr d));
+
+GC_API GC_PTR GC_calloc_explicitly_typed
+ GC_PROTO((size_t nelements,
+ size_t element_size_in_bytes,
+ GC_descr d));
+ /* Allocate an array of nelements elements, each of the */
+ /* given size, and with the given descriptor. */
+ /* The elemnt size must be a multiple of the byte */
+ /* alignment required for pointers. E.g. on a 32-bit */
+ /* machine with 16-bit aligned pointers, size_in_bytes */
+ /* must be a multiple of 2. */
+
+#ifdef GC_DEBUG
+# define GC_MALLOC_EXPLICTLY_TYPED(bytes, d) GC_MALLOC(bytes)
+# define GC_CALLOC_EXPLICTLY_TYPED(n, bytes, d) GC_MALLOC(n*bytes)
+#else
+# define GC_MALLOC_EXPLICTLY_TYPED(bytes, d) \
+ GC_malloc_explicitly_typed(bytes, d)
+# define GC_CALLOC_EXPLICTLY_TYPED(n, bytes, d) \
+ GC_calloc_explicitly_typed(n, bytes, d)
+#endif /* !GC_DEBUG */
+
+
+#endif /* _GC_TYPED_H */
+
diff --git a/boehm-gc/gc_watcom.asm b/boehm-gc/gc_watcom.asm
new file mode 100644
index 00000000000..5131ab96505
--- /dev/null
+++ b/boehm-gc/gc_watcom.asm
@@ -0,0 +1,51 @@
+
+ name gc_watcom
+
+.386p
+
+ extrn _edata : byte ; end of DATA (start of BSS)
+ extrn _end : byte ; end of BSS (start of STACK)
+ extrn __nullarea : word
+
+ extrn "C",_STACKLOW : dword
+ extrn "C",_STACKTOP : dword
+
+
+DGROUP group _DATA
+
+_DATA segment dword public 'DATA'
+_DATA ends
+
+_TEXT segment para public use32 'CODE'
+ assume cs:_TEXT, ds:DGROUP, ss:DGROUP
+
+ public Get_DATASTART
+ align 4
+Get_DATASTART proc near
+
+ mov eax,offset DGROUP:__nullarea
+ ret
+
+Get_DATASTART endp
+
+ public Get_DATAEND
+ align 4
+Get_DATAEND proc near
+
+ mov eax,offset DGROUP:_end
+ ret
+
+Get_DATAEND endp
+
+ public Get_STACKBOTTOM
+ align 4
+Get_STACKBOTTOM proc near
+
+ mov eax,_STACKTOP
+ ret
+
+Get_STACKBOTTOM endp
+
+_TEXT ends
+
+ end
diff --git a/boehm-gc/gcc_support.c b/boehm-gc/gcc_support.c
new file mode 100644
index 00000000000..e8a7b8201db
--- /dev/null
+++ b/boehm-gc/gcc_support.c
@@ -0,0 +1,516 @@
+/***************************************************************************
+
+Interface between g++ and Boehm GC
+
+ Copyright (c) 1991-1995 by Xerox Corporation. All rights reserved.
+
+ THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+
+ Permission is hereby granted to copy this code for any purpose,
+ provided the above notices are retained on all copies.
+
+ Last modified on Sun Jul 16 23:21:14 PDT 1995 by ellis
+
+This module provides runtime support for implementing the
+Ellis/Detlefs GC proposal, "Safe, Efficient Garbage Collection for
+C++", within g++, using its -fgc-keyword extension. It defines
+versions of __builtin_new, __builtin_new_gc, __builtin_vec_new,
+__builtin_vec_new_gc, __builtin_delete, and __builtin_vec_delete that
+invoke the Bohem GC. It also implements the WeakPointer.h interface.
+
+This module assumes the following configuration options of the Boehm GC:
+
+ -DALL_INTERIOR_POINTERS
+ -DDONT_ADD_BYTE_AT_END
+
+This module adds its own required padding to the end of objects to
+support C/C++ "one-past-the-object" pointer semantics.
+
+****************************************************************************/
+
+#include <stddef.h>
+#include "gc.h"
+
+#if defined(__STDC__)
+# define PROTO( args ) args
+#else
+# define PROTO( args ) ()
+# endif
+
+#define BITSPERBYTE 8
+ /* What's the portable way to do this? */
+
+
+typedef void (*vfp) PROTO(( void ));
+extern vfp __new_handler;
+extern void __default_new_handler PROTO(( void ));
+
+
+/* A destructor_proc is the compiler generated procedure representing a
+C++ destructor. The "flag" argument is a hidden argument following some
+compiler convention. */
+
+typedef (*destructor_proc) PROTO(( void* this, int flag ));
+
+
+/***************************************************************************
+
+A BI_header is the header the compiler adds to the front of
+new-allocated arrays of objects with destructors. The header is
+padded out to a double, because that's what the compiler does to
+ensure proper alignment of array elements on some architectures.
+
+int NUM_ARRAY_ELEMENTS (void* o)
+ returns the number of array elements for array object o.
+
+char* FIRST_ELEMENT_P (void* o)
+ returns the address of the first element of array object o.
+
+***************************************************************************/
+
+typedef struct BI_header {
+ int nelts;
+ char padding [sizeof( double ) - sizeof( int )];
+ /* Better way to do this? */
+} BI_header;
+
+#define NUM_ARRAY_ELEMENTS( o ) \
+ (((BI_header*) o)->nelts)
+
+#define FIRST_ELEMENT_P( o ) \
+ ((char*) o + sizeof( BI_header ))
+
+
+/***************************************************************************
+
+The __builtin_new routines add a descriptor word to the end of each
+object. The descriptor serves two purposes.
+
+First, the descriptor acts as padding, implementing C/C++ pointer
+semantics. C and C++ allow a valid array pointer to be incremented
+one past the end of an object. The extra padding ensures that the
+collector will recognize that such a pointer points to the object and
+not the next object in memory.
+
+Second, the descriptor stores three extra pieces of information,
+whether an object has a registered finalizer (destructor), whether it
+may have any weak pointers referencing it, and for collectible arrays,
+the element size of the array. The element size is required for the
+array's finalizer to iterate through the elements of the array. (An
+alternative design would have the compiler generate a finalizer
+procedure for each different array type. But given the overhead of
+finalization, there isn't any efficiency to be gained by that.)
+
+The descriptor must be added to non-collectible as well as collectible
+objects, since the Ellis/Detlefs proposal allows "pointer to gc T" to
+be assigned to a "pointer to T", which could then be deleted. Thus,
+__builtin_delete must determine at runtime whether an object is
+collectible, whether it has weak pointers referencing it, and whether
+it may have a finalizer that needs unregistering. Though
+GC_REGISTER_FINALIZER doesn't care if you ask it to unregister a
+finalizer for an object that doesn't have one, it is a non-trivial
+procedure that does a hash look-up, etc. The descriptor trades a
+little extra space for a significant increase in time on the fast path
+through delete. (A similar argument applies to
+GC_UNREGISTER_DISAPPEARING_LINK).
+
+For non-array types, the space for the descriptor could be shrunk to a
+single byte for storing the "has finalizer" flag. But this would save
+space only on arrays of char (whose size is not a multiple of the word
+size) and structs whose largest member is less than a word in size
+(very infrequent). And it would require that programmers actually
+remember to call "delete[]" instead of "delete" (which they should,
+but there are probably lots of buggy programs out there). For the
+moment, the space savings seems not worthwhile, especially considering
+that the Boehm GC is already quite space competitive with other
+malloc's.
+
+
+Given a pointer o to the base of an object:
+
+Descriptor* DESCRIPTOR (void* o)
+ returns a pointer to the descriptor for o.
+
+The implementation of descriptors relies on the fact that the GC
+implementation allocates objects in units of the machine's natural
+word size (e.g. 32 bits on a SPARC, 64 bits on an Alpha).
+
+**************************************************************************/
+
+typedef struct Descriptor {
+ unsigned has_weak_pointers: 1;
+ unsigned has_finalizer: 1;
+ unsigned element_size: BITSPERBYTE * sizeof( unsigned ) - 2;
+} Descriptor;
+
+#define DESCRIPTOR( o ) \
+ ((Descriptor*) ((char*)(o) + GC_size( o ) - sizeof( Descriptor )))
+
+
+/**************************************************************************
+
+Implementations of global operator new() and operator delete()
+
+***************************************************************************/
+
+
+void* __builtin_new( size )
+ size_t size;
+ /*
+ For non-gc non-array types, the compiler generates calls to
+ __builtin_new, which allocates non-collected storage via
+ GC_MALLOC_UNCOLLECTABLE. This ensures that the non-collected
+ storage will be part of the collector's root set, required by the
+ Ellis/Detlefs semantics. */
+{
+ vfp handler = __new_handler ? __new_handler : __default_new_handler;
+
+ while (1) {
+ void* o = GC_MALLOC_UNCOLLECTABLE( size + sizeof( Descriptor ) );
+ if (o != 0) return o;
+ (*handler) ();}}
+
+
+void* __builtin_vec_new( size )
+ size_t size;
+ /*
+ For non-gc array types, the compiler generates calls to
+ __builtin_vec_new. */
+{
+ return __builtin_new( size );}
+
+
+void* __builtin_new_gc( size )
+ size_t size;
+ /*
+ For gc non-array types, the compiler generates calls to
+ __builtin_new_gc, which allocates collected storage via
+ GC_MALLOC. */
+{
+ vfp handler = __new_handler ? __new_handler : __default_new_handler;
+
+ while (1) {
+ void* o = GC_MALLOC( size + sizeof( Descriptor ) );
+ if (o != 0) return o;
+ (*handler) ();}}
+
+
+void* __builtin_new_gc_a( size )
+ size_t size;
+ /*
+ For non-pointer-containing gc non-array types, the compiler
+ generates calls to __builtin_new_gc_a, which allocates collected
+ storage via GC_MALLOC_ATOMIC. */
+{
+ vfp handler = __new_handler ? __new_handler : __default_new_handler;
+
+ while (1) {
+ void* o = GC_MALLOC_ATOMIC( size + sizeof( Descriptor ) );
+ if (o != 0) return o;
+ (*handler) ();}}
+
+
+void* __builtin_vec_new_gc( size )
+ size_t size;
+ /*
+ For gc array types, the compiler generates calls to
+ __builtin_vec_new_gc. */
+{
+ return __builtin_new_gc( size );}
+
+
+void* __builtin_vec_new_gc_a( size )
+ size_t size;
+ /*
+ For non-pointer-containing gc array types, the compiler generates
+ calls to __builtin_vec_new_gc_a. */
+{
+ return __builtin_new_gc_a( size );}
+
+
+static void call_destructor( o, data )
+ void* o;
+ void* data;
+ /*
+ call_destructor is the GC finalizer proc registered for non-array
+ gc objects with destructors. Its client data is the destructor
+ proc, which it calls with the magic integer 2, a special flag
+ obeying the compiler convention for destructors. */
+{
+ ((destructor_proc) data)( o, 2 );}
+
+
+void* __builtin_new_gc_dtor( o, d )
+ void* o;
+ destructor_proc d;
+ /*
+ The compiler generates a call to __builtin_new_gc_dtor to register
+ the destructor "d" of a non-array gc object "o" as a GC finalizer.
+ The destructor is registered via
+ GC_REGISTER_FINALIZER_IGNORE_SELF, which causes the collector to
+ ignore pointers from the object to itself when determining when
+ the object can be finalized. This is necessary due to the self
+ pointers used in the internal representation of multiply-inherited
+ objects. */
+{
+ Descriptor* desc = DESCRIPTOR( o );
+
+ GC_REGISTER_FINALIZER_IGNORE_SELF( o, call_destructor, d, 0, 0 );
+ desc->has_finalizer = 1;}
+
+
+static void call_array_destructor( o, data )
+ void* o;
+ void* data;
+ /*
+ call_array_destructor is the GC finalizer proc registered for gc
+ array objects whose elements have destructors. Its client data is
+ the destructor proc. It iterates through the elements of the
+ array in reverse order, calling the destructor on each. */
+{
+ int num = NUM_ARRAY_ELEMENTS( o );
+ Descriptor* desc = DESCRIPTOR( o );
+ size_t size = desc->element_size;
+ char* first_p = FIRST_ELEMENT_P( o );
+ char* p = first_p + (num - 1) * size;
+
+ if (num > 0) {
+ while (1) {
+ ((destructor_proc) data)( p, 2 );
+ if (p == first_p) break;
+ p -= size;}}}
+
+
+void* __builtin_vec_new_gc_dtor( first_elem, d, element_size )
+ void* first_elem;
+ destructor_proc d;
+ size_t element_size;
+ /*
+ The compiler generates a call to __builtin_vec_new_gc_dtor to
+ register the destructor "d" of a gc array object as a GC
+ finalizer. "first_elem" points to the first element of the array,
+ *not* the beginning of the object (this makes the generated call
+ to this function smaller). The elements of the array are of size
+ "element_size". The destructor is registered as in
+ _builtin_new_gc_dtor. */
+{
+ void* o = (char*) first_elem - sizeof( BI_header );
+ Descriptor* desc = DESCRIPTOR( o );
+
+ GC_REGISTER_FINALIZER_IGNORE_SELF( o, call_array_destructor, d, 0, 0 );
+ desc->element_size = element_size;
+ desc->has_finalizer = 1;}
+
+
+void __builtin_delete( o )
+ void* o;
+ /*
+ The compiler generates calls to __builtin_delete for operator
+ delete(). The GC currently requires that any registered
+ finalizers be unregistered before explicitly freeing an object.
+ If the object has any weak pointers referencing it, we can't
+ actually free it now. */
+{
+ if (o != 0) {
+ Descriptor* desc = DESCRIPTOR( o );
+ if (desc->has_finalizer) GC_REGISTER_FINALIZER( o, 0, 0, 0, 0 );
+ if (! desc->has_weak_pointers) GC_FREE( o );}}
+
+
+void __builtin_vec_delete( o )
+ void* o;
+ /*
+ The compiler generates calls to __builitn_vec_delete for operator
+ delete[](). */
+{
+ __builtin_delete( o );}
+
+
+/**************************************************************************
+
+Implementations of the template class WeakPointer from WeakPointer.h
+
+***************************************************************************/
+
+typedef struct WeakPointer {
+ void* pointer;
+} WeakPointer;
+
+
+void* _WeakPointer_New( t )
+ void* t;
+{
+ if (t == 0) {
+ return 0;}
+ else {
+ void* base = GC_base( t );
+ WeakPointer* wp =
+ (WeakPointer*) GC_MALLOC_ATOMIC( sizeof( WeakPointer ) );
+ Descriptor* desc = DESCRIPTOR( base );
+
+ wp->pointer = t;
+ desc->has_weak_pointers = 1;
+ GC_general_register_disappearing_link( &wp->pointer, base );
+ return wp;}}
+
+
+static void* PointerWithLock( wp )
+ WeakPointer* wp;
+{
+ if (wp == 0 || wp->pointer == 0) {
+ return 0;}
+ else {
+ return (void*) wp->pointer;}}
+
+
+void* _WeakPointer_Pointer( wp )
+ WeakPointer* wp;
+{
+ return (void*) GC_call_with_alloc_lock( PointerWithLock, wp );}
+
+
+typedef struct EqualClosure {
+ WeakPointer* wp1;
+ WeakPointer* wp2;
+} EqualClosure;
+
+
+static void* EqualWithLock( ec )
+ EqualClosure* ec;
+{
+ if (ec->wp1 == 0 || ec->wp2 == 0) {
+ return (void*) (ec->wp1 == ec->wp2);}
+ else {
+ return (void*) (ec->wp1->pointer == ec->wp2->pointer);}}
+
+
+int _WeakPointer_Equal( wp1, wp2 )
+ WeakPointer* wp1;
+ WeakPointer* wp2;
+{
+ EqualClosure ec;
+
+ ec.wp1 = wp1;
+ ec.wp2 = wp2;
+ return (int) GC_call_with_alloc_lock( EqualWithLock, &ec );}
+
+
+int _WeakPointer_Hash( wp )
+ WeakPointer* wp;
+{
+ return (int) _WeakPointer_Pointer( wp );}
+
+
+/**************************************************************************
+
+Implementations of the template class CleanUp from WeakPointer.h
+
+***************************************************************************/
+
+typedef struct Closure {
+ void (*c) PROTO(( void* d, void* t ));
+ ptrdiff_t t_offset;
+ void* d;
+} Closure;
+
+
+static void _CleanUp_CallClosure( obj, data )
+ void* obj;
+ void* data;
+{
+ Closure* closure = (Closure*) data;
+ closure->c( closure->d, (char*) obj + closure->t_offset );}
+
+
+void _CleanUp_Set( t, c, d )
+ void* t;
+ void (*c) PROTO(( void* d, void* t ));
+ void* d;
+{
+ void* base = GC_base( t );
+ Descriptor* desc = DESCRIPTOR( t );
+
+ if (c == 0) {
+ GC_REGISTER_FINALIZER_IGNORE_SELF( base, 0, 0, 0, 0 );
+ desc->has_finalizer = 0;}
+ else {
+ Closure* closure = (Closure*) GC_MALLOC( sizeof( Closure ) );
+ closure->c = c;
+ closure->t_offset = (char*) t - (char*) base;
+ closure->d = d;
+ GC_REGISTER_FINALIZER_IGNORE_SELF( base, _CleanUp_CallClosure,
+ closure, 0, 0 );
+ desc->has_finalizer = 1;}}
+
+
+void _CleanUp_Call( t )
+ void* t;
+{
+ /* ? Aren't we supposed to deactivate weak pointers to t too?
+ Why? */
+ void* base = GC_base( t );
+ void* d;
+ GC_finalization_proc f;
+
+ GC_REGISTER_FINALIZER( base, 0, 0, &f, &d );
+ f( base, d );}
+
+
+typedef struct QueueElem {
+ void* o;
+ GC_finalization_proc f;
+ void* d;
+ struct QueueElem* next;
+} QueueElem;
+
+
+void* _CleanUp_Queue_NewHead()
+{
+ return GC_MALLOC( sizeof( QueueElem ) );}
+
+
+static void _CleanUp_Queue_Enqueue( obj, data )
+ void* obj;
+ void* data;
+{
+ QueueElem* q = (QueueElem*) data;
+ QueueElem* head = q->next;
+
+ q->o = obj;
+ q->next = head->next;
+ head->next = q;}
+
+
+void _CleanUp_Queue_Set( h, t )
+ void* h;
+ void* t;
+{
+ QueueElem* head = (QueueElem*) h;
+ void* base = GC_base( t );
+ void* d;
+ GC_finalization_proc f;
+ QueueElem* q = (QueueElem*) GC_MALLOC( sizeof( QueueElem ) );
+
+ GC_REGISTER_FINALIZER( base, _CleanUp_Queue_Enqueue, q, &f, &d );
+ q->f = f;
+ q->d = d;
+ q->next = head;}
+
+
+int _CleanUp_Queue_Call( h )
+ void* h;
+{
+ QueueElem* head = (QueueElem*) h;
+ QueueElem* q = head->next;
+
+ if (q == 0) {
+ return 0;}
+ else {
+ head->next = q->next;
+ q->next = 0;
+ if (q->f != 0) q->f( q->o, q->d );
+ return 1;}}
+
+
+
diff --git a/boehm-gc/headers.c b/boehm-gc/headers.c
new file mode 100644
index 00000000000..b5cc1af8a8d
--- /dev/null
+++ b/boehm-gc/headers.c
@@ -0,0 +1,296 @@
+/*
+ * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996 by Silicon Graphics. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+/*
+ * This implements:
+ * 1. allocation of heap block headers
+ * 2. A map from addresses to heap block addresses to heap block headers
+ *
+ * Access speed is crucial. We implement an index structure based on a 2
+ * level tree.
+ */
+
+# include "gc_priv.h"
+
+bottom_index * GC_all_bottom_indices = 0;
+
+/* Non-macro version of header location routine */
+hdr * GC_find_header(h)
+ptr_t h;
+{
+# ifdef HASH_TL
+ register hdr * result;
+ GET_HDR(h, result);
+ return(result);
+# else
+ return(HDR_INNER(h));
+# endif
+}
+
+/* Routines to dynamically allocate collector data structures that will */
+/* never be freed. */
+
+static ptr_t scratch_free_ptr = 0;
+
+ptr_t GC_scratch_end_ptr = 0;
+
+ptr_t GC_scratch_last_end_ptr = 0;
+ /* End point of last obtained scratch area */
+
+ptr_t GC_scratch_alloc(bytes)
+register word bytes;
+{
+ register ptr_t result = scratch_free_ptr;
+ register word bytes_needed = bytes;
+
+# ifdef ALIGN_DOUBLE
+# define GRANULARITY (2 * sizeof(word))
+# else
+# define GRANULARITY sizeof(word)
+# endif
+ bytes += GRANULARITY-1;
+ bytes &= ~(GRANULARITY-1);
+ scratch_free_ptr += bytes;
+ if (scratch_free_ptr <= GC_scratch_end_ptr) {
+ return(result);
+ }
+ {
+ word bytes_to_get = MINHINCR * HBLKSIZE;
+
+ if (bytes_to_get <= bytes) {
+ /* Undo the damage, and get memory directly */
+ bytes_to_get = bytes;
+# ifdef USE_MMAP
+ bytes_to_get += GC_page_size - 1;
+ bytes_to_get &= ~(GC_page_size - 1);
+# endif
+ result = (ptr_t)GET_MEM(bytes_to_get);
+ scratch_free_ptr -= bytes;
+ GC_scratch_last_end_ptr = result + bytes;
+ return(result);
+ }
+ result = (ptr_t)GET_MEM(bytes_to_get);
+ if (result == 0) {
+# ifdef PRINTSTATS
+ GC_printf0("Out of memory - trying to allocate less\n");
+# endif
+ scratch_free_ptr -= bytes;
+ bytes_to_get = bytes;
+# ifdef USE_MMAP
+ bytes_to_get += GC_page_size - 1;
+ bytes_to_get &= (GC_page_size - 1);
+# endif
+ return((ptr_t)GET_MEM(bytes_to_get));
+ }
+ scratch_free_ptr = result;
+ GC_scratch_end_ptr = scratch_free_ptr + bytes_to_get;
+ GC_scratch_last_end_ptr = GC_scratch_end_ptr;
+ return(GC_scratch_alloc(bytes));
+ }
+}
+
+static hdr * hdr_free_list = 0;
+
+/* Return an uninitialized header */
+static hdr * alloc_hdr()
+{
+ register hdr * result;
+
+ if (hdr_free_list == 0) {
+ result = (hdr *) GC_scratch_alloc((word)(sizeof(hdr)));
+ } else {
+ result = hdr_free_list;
+ hdr_free_list = (hdr *) (result -> hb_next);
+ }
+ return(result);
+}
+
+static void free_hdr(hhdr)
+hdr * hhdr;
+{
+ hhdr -> hb_next = (struct hblk *) hdr_free_list;
+ hdr_free_list = hhdr;
+}
+
+void GC_init_headers()
+{
+ register int i;
+
+ GC_all_nils = (bottom_index *)GC_scratch_alloc((word)sizeof(bottom_index));
+ BZERO(GC_all_nils, sizeof(bottom_index));
+ for (i = 0; i < TOP_SZ; i++) {
+ GC_top_index[i] = GC_all_nils;
+ }
+}
+
+/* Make sure that there is a bottom level index block for address addr */
+/* Return FALSE on failure. */
+static GC_bool get_index(addr)
+register word addr;
+{
+ register word hi =
+ (word)(addr) >> (LOG_BOTTOM_SZ + LOG_HBLKSIZE);
+ register bottom_index * r;
+ register bottom_index * p;
+ register bottom_index ** prev;
+# ifdef HASH_TL
+ register unsigned i = TL_HASH(hi);
+ register bottom_index * old;
+
+ old = p = GC_top_index[i];
+ while(p != GC_all_nils) {
+ if (p -> key == hi) return(TRUE);
+ p = p -> hash_link;
+ }
+ r = (bottom_index*)GC_scratch_alloc((word)(sizeof (bottom_index)));
+ if (r == 0) return(FALSE);
+ BZERO(r, sizeof (bottom_index));
+ r -> hash_link = old;
+ GC_top_index[i] = r;
+# else
+ if (GC_top_index[hi] != GC_all_nils) return(TRUE);
+ r = (bottom_index*)GC_scratch_alloc((word)(sizeof (bottom_index)));
+ if (r == 0) return(FALSE);
+ GC_top_index[hi] = r;
+ BZERO(r, sizeof (bottom_index));
+# endif
+ r -> key = hi;
+ /* Add it to the list of bottom indices */
+ prev = &GC_all_bottom_indices;
+ while ((p = *prev) != 0 && p -> key < hi) prev = &(p -> asc_link);
+ r -> asc_link = p;
+ *prev = r;
+ return(TRUE);
+}
+
+/* Install a header for block h. */
+/* The header is uninitialized. */
+/* Returns FALSE on failure. */
+GC_bool GC_install_header(h)
+register struct hblk * h;
+{
+ hdr * result;
+
+ if (!get_index((word) h)) return(FALSE);
+ result = alloc_hdr();
+ SET_HDR(h, result);
+ return(result != 0);
+}
+
+/* Set up forwarding counts for block h of size sz */
+GC_bool GC_install_counts(h, sz)
+register struct hblk * h;
+register word sz; /* bytes */
+{
+ register struct hblk * hbp;
+ register int i;
+
+ for (hbp = h; (char *)hbp < (char *)h + sz; hbp += BOTTOM_SZ) {
+ if (!get_index((word) hbp)) return(FALSE);
+ }
+ if (!get_index((word)h + sz - 1)) return(FALSE);
+ for (hbp = h + 1; (char *)hbp < (char *)h + sz; hbp += 1) {
+ i = HBLK_PTR_DIFF(hbp, h);
+ SET_HDR(hbp, (hdr *)(i > MAX_JUMP? MAX_JUMP : i));
+ }
+ return(TRUE);
+}
+
+/* Remove the header for block h */
+void GC_remove_header(h)
+register struct hblk * h;
+{
+ hdr ** ha;
+
+ GET_HDR_ADDR(h, ha);
+ free_hdr(*ha);
+ *ha = 0;
+}
+
+/* Remove forwarding counts for h */
+void GC_remove_counts(h, sz)
+register struct hblk * h;
+register word sz; /* bytes */
+{
+ register struct hblk * hbp;
+
+ for (hbp = h+1; (char *)hbp < (char *)h + sz; hbp += 1) {
+ SET_HDR(hbp, 0);
+ }
+}
+
+/* Apply fn to all allocated blocks */
+/*VARARGS1*/
+void GC_apply_to_all_blocks(fn, client_data)
+void (*fn)(/* struct hblk *h, word client_data */);
+word client_data;
+{
+ register int j;
+ register bottom_index * index_p;
+
+ for (index_p = GC_all_bottom_indices; index_p != 0;
+ index_p = index_p -> asc_link) {
+ for (j = BOTTOM_SZ-1; j >= 0;) {
+ if (!IS_FORWARDING_ADDR_OR_NIL(index_p->index[j])) {
+ if (index_p->index[j]->hb_map != GC_invalid_map) {
+ (*fn)(((struct hblk *)
+ (((index_p->key << LOG_BOTTOM_SZ) + (word)j)
+ << LOG_HBLKSIZE)),
+ client_data);
+ }
+ j--;
+ } else if (index_p->index[j] == 0) {
+ j--;
+ } else {
+ j -= (word)(index_p->index[j]);
+ }
+ }
+ }
+}
+
+/* Get the next valid block whose address is at least h */
+/* Return 0 if there is none. */
+struct hblk * GC_next_block(h)
+struct hblk * h;
+{
+ register bottom_index * bi;
+ register word j = ((word)h >> LOG_HBLKSIZE) & (BOTTOM_SZ-1);
+
+ GET_BI(h, bi);
+ if (bi == GC_all_nils) {
+ register word hi = (word)h >> (LOG_BOTTOM_SZ + LOG_HBLKSIZE);
+ bi = GC_all_bottom_indices;
+ while (bi != 0 && bi -> key < hi) bi = bi -> asc_link;
+ j = 0;
+ }
+ while(bi != 0) {
+ while (j < BOTTOM_SZ) {
+ if (IS_FORWARDING_ADDR_OR_NIL(bi -> index[j])) {
+ j++;
+ } else {
+ if (bi->index[j]->hb_map != GC_invalid_map) {
+ return((struct hblk *)
+ (((bi -> key << LOG_BOTTOM_SZ) + j)
+ << LOG_HBLKSIZE));
+ } else {
+ j += divHBLKSZ(bi->index[j] -> hb_sz);
+ }
+ }
+ }
+ j = 0;
+ bi = bi -> asc_link;
+ }
+ return(0);
+}
diff --git a/boehm-gc/if_mach.c b/boehm-gc/if_mach.c
new file mode 100644
index 00000000000..da2b7f90a62
--- /dev/null
+++ b/boehm-gc/if_mach.c
@@ -0,0 +1,25 @@
+/* Conditionally execute a command based on machine and OS from config.h */
+/* Boehm, November 21, 1994 1:40 pm PST */
+# include "config.h"
+# include <stdio.h>
+
+int main(argc, argv, envp)
+int argc;
+char ** argv;
+char ** envp;
+{
+ if (argc < 4) goto Usage;
+ if (strcmp(MACH_TYPE, argv[1]) != 0) return(0);
+ if (strcmp(OS_TYPE, "") != 0 && strcmp(argv[2], "") != 0
+ && strcmp(OS_TYPE, argv[2]) != 0) return(0);
+ printf("^^^^Starting command^^^^\n");
+ execvp(argv[3], argv+3);
+ perror("Couldn't execute");
+
+Usage:
+ fprintf(stderr, "Usage: %s mach_type os_type command\n", argv[0]);
+ fprintf(stderr, "Currently mach_type = %s, os_type = %s\n",
+ MACH_TYPE, OS_TYPE);
+ return(1);
+}
+
diff --git a/boehm-gc/if_not_there.c b/boehm-gc/if_not_there.c
new file mode 100644
index 00000000000..9616309d824
--- /dev/null
+++ b/boehm-gc/if_not_there.c
@@ -0,0 +1,26 @@
+/* Conditionally execute a command based if the file argv[1] doesn't exist */
+/* Except for execvp, we stick to ANSI C. */
+# include "config.h"
+# include <stdio.h>
+
+int main(argc, argv, envp)
+int argc;
+char ** argv;
+char ** envp;
+{
+ FILE * f;
+ if (argc < 3) goto Usage;
+ if ((f = fopen(argv[1], "rb")) != 0
+ || (f = fopen(argv[1], "r")) != 0) {
+ fclose(f);
+ return(0);
+ }
+ printf("^^^^Starting command^^^^\n");
+ execvp(argv[2], argv+2);
+ exit(1);
+
+Usage:
+ fprintf(stderr, "Usage: %s file_name command\n", argv[0]);
+ return(1);
+}
+
diff --git a/boehm-gc/include/cord.h b/boehm-gc/include/cord.h
new file mode 100644
index 00000000000..584112fd181
--- /dev/null
+++ b/boehm-gc/include/cord.h
@@ -0,0 +1,327 @@
+/*
+ * Copyright (c) 1993-1994 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ * Author: Hans-J. Boehm (boehm@parc.xerox.com)
+ */
+/* Boehm, October 5, 1995 4:20 pm PDT */
+
+/*
+ * Cords are immutable character strings. A number of operations
+ * on long cords are much more efficient than their strings.h counterpart.
+ * In particular, concatenation takes constant time independent of the length
+ * of the arguments. (Cords are represented as trees, with internal
+ * nodes representing concatenation and leaves consisting of either C
+ * strings or a functional description of the string.)
+ *
+ * The following are reasonable applications of cords. They would perform
+ * unacceptably if C strings were used:
+ * - A compiler that produces assembly language output by repeatedly
+ * concatenating instructions onto a cord representing the output file.
+ * - A text editor that converts the input file to a cord, and then
+ * performs editing operations by producing a new cord representing
+ * the file after echa character change (and keeping the old ones in an
+ * edit history)
+ *
+ * For optimal performance, cords should be built by
+ * concatenating short sections.
+ * This interface is designed for maximum compatibility with C strings.
+ * ASCII NUL characters may be embedded in cords using CORD_from_fn.
+ * This is handled correctly, but CORD_to_char_star will produce a string
+ * with embedded NULs when given such a cord.
+ *
+ * This interface is fairly big, largely for performance reasons.
+ * The most basic constants and functions:
+ *
+ * CORD - the type fo a cord;
+ * CORD_EMPTY - empty cord;
+ * CORD_len(cord) - length of a cord;
+ * CORD_cat(cord1,cord2) - concatenation of two cords;
+ * CORD_substr(cord, start, len) - substring (or subcord);
+ * CORD_pos i; CORD_FOR(i, cord) { ... CORD_pos_fetch(i) ... } -
+ * examine each character in a cord. CORD_pos_fetch(i) is the char.
+ * CORD_fetch(int i) - Retrieve i'th character (slowly).
+ * CORD_cmp(cord1, cord2) - compare two cords.
+ * CORD_from_file(FILE * f) - turn a read-only file into a cord.
+ * CORD_to_char_star(cord) - convert to C string.
+ * (Non-NULL C constant strings are cords.)
+ * CORD_printf (etc.) - cord version of printf. Use %r for cords.
+ */
+# ifndef CORD_H
+
+# define CORD_H
+# include <stddef.h>
+# include <stdio.h>
+/* Cords have type const char *. This is cheating quite a bit, and not */
+/* 100% portable. But it means that nonempty character string */
+/* constants may be used as cords directly, provided the string is */
+/* never modified in place. The empty cord is represented by, and */
+/* can be written as, 0. */
+
+typedef const char * CORD;
+
+/* An empty cord is always represented as nil */
+# define CORD_EMPTY 0
+
+/* Is a nonempty cord represented as a C string? */
+#define CORD_IS_STRING(s) (*(s) != '\0')
+
+/* Concatenate two cords. If the arguments are C strings, they may */
+/* not be subsequently altered. */
+CORD CORD_cat(CORD x, CORD y);
+
+/* Concatenate a cord and a C string with known length. Except for the */
+/* empty string case, this is a special case of CORD_cat. Since the */
+/* length is known, it can be faster. */
+/* The string y is shared with the resulting CORD. Hence it should */
+/* not be altered by the caller. */
+CORD CORD_cat_char_star(CORD x, const char * y, size_t leny);
+
+/* Compute the length of a cord */
+size_t CORD_len(CORD x);
+
+/* Cords may be represented by functions defining the ith character */
+typedef char (* CORD_fn)(size_t i, void * client_data);
+
+/* Turn a functional description into a cord. */
+CORD CORD_from_fn(CORD_fn fn, void * client_data, size_t len);
+
+/* Return the substring (subcord really) of x with length at most n, */
+/* starting at position i. (The initial character has position 0.) */
+CORD CORD_substr(CORD x, size_t i, size_t n);
+
+/* Return the argument, but rebalanced to allow more efficient */
+/* character retrieval, substring operations, and comparisons. */
+/* This is useful only for cords that were built using repeated */
+/* concatenation. Guarantees log time access to the result, unless */
+/* x was obtained through a large number of repeated substring ops */
+/* or the embedded functional descriptions take longer to evaluate. */
+/* May reallocate significant parts of the cord. The argument is not */
+/* modified; only the result is balanced. */
+CORD CORD_balance(CORD x);
+
+/* The following traverse a cord by applying a function to each */
+/* character. This is occasionally appropriate, especially where */
+/* speed is crucial. But, since C doesn't have nested functions, */
+/* clients of this sort of traversal are clumsy to write. Consider */
+/* the functions that operate on cord positions instead. */
+
+/* Function to iteratively apply to individual characters in cord. */
+typedef int (* CORD_iter_fn)(char c, void * client_data);
+
+/* Function to apply to substrings of a cord. Each substring is a */
+/* a C character string, not a general cord. */
+typedef int (* CORD_batched_iter_fn)(const char * s, void * client_data);
+# define CORD_NO_FN ((CORD_batched_iter_fn)0)
+
+/* Apply f1 to each character in the cord, in ascending order, */
+/* starting at position i. If */
+/* f2 is not CORD_NO_FN, then multiple calls to f1 may be replaced by */
+/* a single call to f2. The parameter f2 is provided only to allow */
+/* some optimization by the client. This terminates when the right */
+/* end of this string is reached, or when f1 or f2 return != 0. In the */
+/* latter case CORD_iter returns != 0. Otherwise it returns 0. */
+/* The specified value of i must be < CORD_len(x). */
+int CORD_iter5(CORD x, size_t i, CORD_iter_fn f1,
+ CORD_batched_iter_fn f2, void * client_data);
+
+/* A simpler version that starts at 0, and without f2: */
+int CORD_iter(CORD x, CORD_iter_fn f1, void * client_data);
+# define CORD_iter(x, f1, cd) CORD_iter5(x, 0, f1, CORD_NO_FN, cd)
+
+/* Similar to CORD_iter5, but end-to-beginning. No provisions for */
+/* CORD_batched_iter_fn. */
+int CORD_riter4(CORD x, size_t i, CORD_iter_fn f1, void * client_data);
+
+/* A simpler version that starts at the end: */
+int CORD_riter(CORD x, CORD_iter_fn f1, void * client_data);
+
+/* Functions that operate on cord positions. The easy way to traverse */
+/* cords. A cord position is logically a pair consisting of a cord */
+/* and an index into that cord. But it is much faster to retrieve a */
+/* charcter based on a position than on an index. Unfortunately, */
+/* positions are big (order of a few 100 bytes), so allocate them with */
+/* caution. */
+/* Things in cord_pos.h should be treated as opaque, except as */
+/* described below. Also note that */
+/* CORD_pos_fetch, CORD_next and CORD_prev have both macro and function */
+/* definitions. The former may evaluate their argument more than once. */
+# include "private/cord_pos.h"
+
+/*
+ Visible definitions from above:
+
+ typedef <OPAQUE but fairly big> CORD_pos[1];
+
+ * Extract the cord from a position:
+ CORD CORD_pos_to_cord(CORD_pos p);
+
+ * Extract the current index from a position:
+ size_t CORD_pos_to_index(CORD_pos p);
+
+ * Fetch the character located at the given position:
+ char CORD_pos_fetch(CORD_pos p);
+
+ * Initialize the position to refer to the given cord and index.
+ * Note that this is the most expensive function on positions:
+ void CORD_set_pos(CORD_pos p, CORD x, size_t i);
+
+ * Advance the position to the next character.
+ * P must be initialized and valid.
+ * Invalidates p if past end:
+ void CORD_next(CORD_pos p);
+
+ * Move the position to the preceding character.
+ * P must be initialized and valid.
+ * Invalidates p if past beginning:
+ void CORD_prev(CORD_pos p);
+
+ * Is the position valid, i.e. inside the cord?
+ int CORD_pos_valid(CORD_pos p);
+*/
+# define CORD_FOR(pos, cord) \
+ for (CORD_set_pos(pos, cord, 0); CORD_pos_valid(pos); CORD_next(pos))
+
+
+/* An out of memory handler to call. May be supplied by client. */
+/* Must not return. */
+extern void (* CORD_oom_fn)(void);
+
+/* Dump the representation of x to stdout in an implementation defined */
+/* manner. Intended for debugging only. */
+void CORD_dump(CORD x);
+
+/* The following could easily be implemented by the client. They are */
+/* provided in cordxtra.c for convenience. */
+
+/* Concatenate a character to the end of a cord. */
+CORD CORD_cat_char(CORD x, char c);
+
+/* Concatenate n cords. */
+CORD CORD_catn(int n, /* CORD */ ...);
+
+/* Return the character in CORD_substr(x, i, 1) */
+char CORD_fetch(CORD x, size_t i);
+
+/* Return < 0, 0, or > 0, depending on whether x < y, x = y, x > y */
+int CORD_cmp(CORD x, CORD y);
+
+/* A generalization that takes both starting positions for the */
+/* comparison, and a limit on the number of characters to be compared. */
+int CORD_ncmp(CORD x, size_t x_start, CORD y, size_t y_start, size_t len);
+
+/* Find the first occurrence of s in x at position start or later. */
+/* Return the position of the first character of s in x, or */
+/* CORD_NOT_FOUND if there is none. */
+size_t CORD_str(CORD x, size_t start, CORD s);
+
+/* Return a cord consisting of i copies of (possibly NUL) c. Dangerous */
+/* in conjunction with CORD_to_char_star. */
+/* The resulting representation takes constant space, independent of i. */
+CORD CORD_chars(char c, size_t i);
+# define CORD_nul(i) CORD_chars('\0', (i))
+
+/* Turn a file into cord. The file must be seekable. Its contents */
+/* must remain constant. The file may be accessed as an immediate */
+/* result of this call and/or as a result of subsequent accesses to */
+/* the cord. Short files are likely to be immediately read, but */
+/* long files are likely to be read on demand, possibly relying on */
+/* stdio for buffering. */
+/* We must have exclusive access to the descriptor f, i.e. we may */
+/* read it at any time, and expect the file pointer to be */
+/* where we left it. Normally this should be invoked as */
+/* CORD_from_file(fopen(...)) */
+/* CORD_from_file arranges to close the file descriptor when it is no */
+/* longer needed (e.g. when the result becomes inaccessible). */
+/* The file f must be such that ftell reflects the actual character */
+/* position in the file, i.e. the number of characters that can be */
+/* or were read with fread. On UNIX systems this is always true. On */
+/* MS Windows systems, f must be opened in binary mode. */
+CORD CORD_from_file(FILE * f);
+
+/* Equivalent to the above, except that the entire file will be read */
+/* and the file pointer will be closed immediately. */
+/* The binary mode restriction from above does not apply. */
+CORD CORD_from_file_eager(FILE * f);
+
+/* Equivalent to the above, except that the file will be read on demand.*/
+/* The binary mode restriction applies. */
+CORD CORD_from_file_lazy(FILE * f);
+
+/* Turn a cord into a C string. The result shares no structure with */
+/* x, and is thus modifiable. */
+char * CORD_to_char_star(CORD x);
+
+/* Turn a C string into a CORD. The C string is copied, and so may */
+/* subsequently be modified. */
+CORD CORD_from_char_star(const char *s);
+
+/* Identical to the above, but the result may share structure with */
+/* the argument and is thus not modifiable. */
+const char * CORD_to_const_char_star(CORD x);
+
+/* Write a cord to a file, starting at the current position. No */
+/* trailing NULs are newlines are added. */
+/* Returns EOF if a write error occurs, 1 otherwise. */
+int CORD_put(CORD x, FILE * f);
+
+/* "Not found" result for the following two functions. */
+# define CORD_NOT_FOUND ((size_t)(-1))
+
+/* A vague analog of strchr. Returns the position (an integer, not */
+/* a pointer) of the first occurrence of (char) c inside x at position */
+/* i or later. The value i must be < CORD_len(x). */
+size_t CORD_chr(CORD x, size_t i, int c);
+
+/* A vague analog of strrchr. Returns index of the last occurrence */
+/* of (char) c inside x at position i or earlier. The value i */
+/* must be < CORD_len(x). */
+size_t CORD_rchr(CORD x, size_t i, int c);
+
+
+/* The following are also not primitive, but are implemented in */
+/* cordprnt.c. They provide functionality similar to the ANSI C */
+/* functions with corresponding names, but with the following */
+/* additions and changes: */
+/* 1. A %r conversion specification specifies a CORD argument. Field */
+/* width, precision, etc. have the same semantics as for %s. */
+/* (Note that %c,%C, and %S were already taken.) */
+/* 2. The format string is represented as a CORD. */
+/* 3. CORD_sprintf and CORD_vsprintf assign the result through the 1st */ /* argument. Unlike their ANSI C versions, there is no need to guess */
+/* the correct buffer size. */
+/* 4. Most of the conversions are implement through the native */
+/* vsprintf. Hence they are usually no faster, and */
+/* idiosyncracies of the native printf are preserved. However, */
+/* CORD arguments to CORD_sprintf and CORD_vsprintf are NOT copied; */
+/* the result shares the original structure. This may make them */
+/* very efficient in some unusual applications. */
+/* The format string is copied. */
+/* All functions return the number of characters generated or -1 on */
+/* error. This complies with the ANSI standard, but is inconsistent */
+/* with some older implementations of sprintf. */
+
+/* The implementation of these is probably less portable than the rest */
+/* of this package. */
+
+#ifndef CORD_NO_IO
+
+#include <stdarg.h>
+
+int CORD_sprintf(CORD * out, CORD format, ...);
+int CORD_vsprintf(CORD * out, CORD format, va_list args);
+int CORD_fprintf(FILE * f, CORD format, ...);
+int CORD_vfprintf(FILE * f, CORD format, va_list args);
+int CORD_printf(CORD format, ...);
+int CORD_vprintf(CORD format, va_list args);
+
+#endif /* CORD_NO_IO */
+
+# endif /* CORD_H */
diff --git a/boehm-gc/include/ec.h b/boehm-gc/include/ec.h
new file mode 100644
index 00000000000..c829b83ad11
--- /dev/null
+++ b/boehm-gc/include/ec.h
@@ -0,0 +1,70 @@
+# ifndef EC_H
+# define EC_H
+
+# ifndef CORD_H
+# include "cord.h"
+# endif
+
+/* Extensible cords are strings that may be destructively appended to. */
+/* They allow fast construction of cords from characters that are */
+/* being read from a stream. */
+/*
+ * A client might look like:
+ *
+ * {
+ * CORD_ec x;
+ * CORD result;
+ * char c;
+ * FILE *f;
+ *
+ * ...
+ * CORD_ec_init(x);
+ * while(...) {
+ * c = getc(f);
+ * ...
+ * CORD_ec_append(x, c);
+ * }
+ * result = CORD_balance(CORD_ec_to_cord(x));
+ *
+ * If a C string is desired as the final result, the call to CORD_balance
+ * may be replaced by a call to CORD_to_char_star.
+ */
+
+# ifndef CORD_BUFSZ
+# define CORD_BUFSZ 128
+# endif
+
+typedef struct CORD_ec_struct {
+ CORD ec_cord;
+ char * ec_bufptr;
+ char ec_buf[CORD_BUFSZ+1];
+} CORD_ec[1];
+
+/* This structure represents the concatenation of ec_cord with */
+/* ec_buf[0 ... (ec_bufptr-ec_buf-1)] */
+
+/* Flush the buffer part of the extended chord into ec_cord. */
+/* Note that this is almost the only real function, and it is */
+/* implemented in 6 lines in cordxtra.c */
+void CORD_ec_flush_buf(CORD_ec x);
+
+/* Convert an extensible cord to a cord. */
+# define CORD_ec_to_cord(x) (CORD_ec_flush_buf(x), (x)[0].ec_cord)
+
+/* Initialize an extensible cord. */
+# define CORD_ec_init(x) ((x)[0].ec_cord = 0, (x)[0].ec_bufptr = (x)[0].ec_buf)
+
+/* Append a character to an extensible cord. */
+# define CORD_ec_append(x, c) \
+ { \
+ if ((x)[0].ec_bufptr == (x)[0].ec_buf + CORD_BUFSZ) { \
+ CORD_ec_flush_buf(x); \
+ } \
+ *((x)[0].ec_bufptr)++ = (c); \
+ }
+
+/* Append a cord to an extensible cord. Structure remains shared with */
+/* original. */
+void CORD_ec_append_cord(CORD_ec x, CORD s);
+
+# endif /* EC_H */
diff --git a/boehm-gc/include/gc.h b/boehm-gc/include/gc.h
new file mode 100644
index 00000000000..09c8ca8196c
--- /dev/null
+++ b/boehm-gc/include/gc.h
@@ -0,0 +1,698 @@
+/*
+ * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+ * Copyright (c) 1991-1995 by Xerox Corporation. All rights reserved.
+ * Copyright 1996 by Silicon Graphics. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+/*
+ * Note that this defines a large number of tuning hooks, which can
+ * safely be ignored in nearly all cases. For normal use it suffices
+ * to call only GC_MALLOC and perhaps GC_REALLOC.
+ * For better performance, also look at GC_MALLOC_ATOMIC, and
+ * GC_enable_incremental. If you need an action to be performed
+ * immediately before an object is collected, look at GC_register_finalizer.
+ * If you are using Solaris threads, look at the end of this file.
+ * Everything else is best ignored unless you encounter performance
+ * problems.
+ */
+
+#ifndef _GC_H
+
+# define _GC_H
+# define __GC
+# include <stddef.h>
+
+#if defined(__CYGWIN32__) && defined(GC_USE_DLL)
+#include "libgc_globals.h"
+#endif
+
+#if defined(_MSC_VER) && defined(_DLL)
+#ifdef GC_BUILD
+#define GC_API __declspec(dllexport)
+#else
+#define GC_API __declspec(dllimport)
+#endif
+#endif
+
+#ifndef GC_API
+#define GC_API extern
+#endif
+
+# if defined(__STDC__) || defined(__cplusplus)
+# define GC_PROTO(args) args
+ typedef void * GC_PTR;
+# else
+# define GC_PROTO(args) ()
+ typedef char * GC_PTR;
+# endif
+
+# ifdef __cplusplus
+ extern "C" {
+# endif
+
+
+/* Define word and signed_word to be unsigned and signed types of the */
+/* size as char * or void *. There seems to be no way to do this */
+/* even semi-portably. The following is probably no better/worse */
+/* than almost anything else. */
+/* The ANSI standard suggests that size_t and ptr_diff_t might be */
+/* better choices. But those appear to have incorrect definitions */
+/* on may systems. Notably "typedef int size_t" seems to be both */
+/* frequent and WRONG. */
+typedef unsigned long GC_word;
+typedef long GC_signed_word;
+
+/* Public read-only variables */
+
+GC_API GC_word GC_gc_no;/* Counter incremented per collection. */
+ /* Includes empty GCs at startup. */
+
+
+/* Public R/W variables */
+
+GC_API GC_PTR (*GC_oom_fn) GC_PROTO((size_t bytes_requested));
+ /* When there is insufficient memory to satisfy */
+ /* an allocation request, we return */
+ /* (*GC_oom_fn)(). By default this just */
+ /* returns 0. */
+ /* If it returns, it must return 0 or a valid */
+ /* pointer to a previously allocated heap */
+ /* object. */
+
+GC_API int GC_quiet; /* Disable statistics output. Only matters if */
+ /* collector has been compiled with statistics */
+ /* enabled. This involves a performance cost, */
+ /* and is thus not the default. */
+
+GC_API int GC_dont_gc; /* Dont collect unless explicitly requested, e.g. */
+ /* because it's not safe. */
+
+GC_API int GC_dont_expand;
+ /* Dont expand heap unless explicitly requested */
+ /* or forced to. */
+
+GC_API int GC_full_freq; /* Number of partial collections between */
+ /* full collections. Matters only if */
+ /* GC_incremental is set. */
+
+GC_API GC_word GC_non_gc_bytes;
+ /* Bytes not considered candidates for collection. */
+ /* Used only to control scheduling of collections. */
+
+GC_API GC_word GC_free_space_divisor;
+ /* We try to make sure that we allocate at */
+ /* least N/GC_free_space_divisor bytes between */
+ /* collections, where N is the heap size plus */
+ /* a rough estimate of the root set size. */
+ /* Initially, GC_free_space_divisor = 4. */
+ /* Increasing its value will use less space */
+ /* but more collection time. Decreasing it */
+ /* will appreciably decrease collection time */
+ /* at the expense of space. */
+ /* GC_free_space_divisor = 1 will effectively */
+ /* disable collections. */
+
+GC_API GC_word GC_max_retries;
+ /* The maximum number of GCs attempted before */
+ /* reporting out of memory after heap */
+ /* expansion fails. Initially 0. */
+
+
+/* Public procedures */
+/*
+ * general purpose allocation routines, with roughly malloc calling conv.
+ * The atomic versions promise that no relevant pointers are contained
+ * in the object. The nonatomic versions guarantee that the new object
+ * is cleared. GC_malloc_stubborn promises that no changes to the object
+ * will occur after GC_end_stubborn_change has been called on the
+ * result of GC_malloc_stubborn. GC_malloc_uncollectable allocates an object
+ * that is scanned for pointers to collectable objects, but is not itself
+ * collectable. GC_malloc_uncollectable and GC_free called on the resulting
+ * object implicitly update GC_non_gc_bytes appropriately.
+ */
+GC_API GC_PTR GC_malloc GC_PROTO((size_t size_in_bytes));
+GC_API GC_PTR GC_malloc_atomic GC_PROTO((size_t size_in_bytes));
+GC_API GC_PTR GC_malloc_uncollectable GC_PROTO((size_t size_in_bytes));
+GC_API GC_PTR GC_malloc_stubborn GC_PROTO((size_t size_in_bytes));
+
+/* The following is only defined if the library has been suitably */
+/* compiled: */
+GC_API GC_PTR GC_malloc_atomic_uncollectable GC_PROTO((size_t size_in_bytes));
+
+/* Explicitly deallocate an object. Dangerous if used incorrectly. */
+/* Requires a pointer to the base of an object. */
+/* If the argument is stubborn, it should not be changeable when freed. */
+/* An object should not be enable for finalization when it is */
+/* explicitly deallocated. */
+/* GC_free(0) is a no-op, as required by ANSI C for free. */
+GC_API void GC_free GC_PROTO((GC_PTR object_addr));
+
+/*
+ * Stubborn objects may be changed only if the collector is explicitly informed.
+ * The collector is implicitly informed of coming change when such
+ * an object is first allocated. The following routines inform the
+ * collector that an object will no longer be changed, or that it will
+ * once again be changed. Only nonNIL pointer stores into the object
+ * are considered to be changes. The argument to GC_end_stubborn_change
+ * must be exacly the value returned by GC_malloc_stubborn or passed to
+ * GC_change_stubborn. (In the second case it may be an interior pointer
+ * within 512 bytes of the beginning of the objects.)
+ * There is a performance penalty for allowing more than
+ * one stubborn object to be changed at once, but it is acceptable to
+ * do so. The same applies to dropping stubborn objects that are still
+ * changeable.
+ */
+GC_API void GC_change_stubborn GC_PROTO((GC_PTR));
+GC_API void GC_end_stubborn_change GC_PROTO((GC_PTR));
+
+/* Return a pointer to the base (lowest address) of an object given */
+/* a pointer to a location within the object. */
+/* Return 0 if displaced_pointer doesn't point to within a valid */
+/* object. */
+GC_API GC_PTR GC_base GC_PROTO((GC_PTR displaced_pointer));
+
+/* Given a pointer to the base of an object, return its size in bytes. */
+/* The returned size may be slightly larger than what was originally */
+/* requested. */
+GC_API size_t GC_size GC_PROTO((GC_PTR object_addr));
+
+/* For compatibility with C library. This is occasionally faster than */
+/* a malloc followed by a bcopy. But if you rely on that, either here */
+/* or with the standard C library, your code is broken. In my */
+/* opinion, it shouldn't have been invented, but now we're stuck. -HB */
+/* The resulting object has the same kind as the original. */
+/* If the argument is stubborn, the result will have changes enabled. */
+/* It is an error to have changes enabled for the original object. */
+/* Follows ANSI comventions for NULL old_object. */
+GC_API GC_PTR GC_realloc GC_PROTO((GC_PTR old_object,
+ size_t new_size_in_bytes));
+
+/* Explicitly increase the heap size. */
+/* Returns 0 on failure, 1 on success. */
+GC_API int GC_expand_hp GC_PROTO((size_t number_of_bytes));
+
+/* Limit the heap size to n bytes. Useful when you're debugging, */
+/* especially on systems that don't handle running out of memory well. */
+/* n == 0 ==> unbounded. This is the default. */
+GC_API void GC_set_max_heap_size GC_PROTO((GC_word n));
+
+/* Inform the collector that a certain section of statically allocated */
+/* memory contains no pointers to garbage collected memory. Thus it */
+/* need not be scanned. This is sometimes important if the application */
+/* maps large read/write files into the address space, which could be */
+/* mistaken for dynamic library data segments on some systems. */
+GC_API void GC_exclude_static_roots GC_PROTO((GC_PTR start, GC_PTR finish));
+
+/* Clear the set of root segments. Wizards only. */
+GC_API void GC_clear_roots GC_PROTO((void));
+
+/* Add a root segment. Wizards only. */
+GC_API void GC_add_roots GC_PROTO((char * low_address,
+ char * high_address_plus_1));
+
+/* Add a displacement to the set of those considered valid by the */
+/* collector. GC_register_displacement(n) means that if p was returned */
+/* by GC_malloc, then (char *)p + n will be considered to be a valid */
+/* pointer to n. N must be small and less than the size of p. */
+/* (All pointers to the interior of objects from the stack are */
+/* considered valid in any case. This applies to heap objects and */
+/* static data.) */
+/* Preferably, this should be called before any other GC procedures. */
+/* Calling it later adds to the probability of excess memory */
+/* retention. */
+/* This is a no-op if the collector was compiled with recognition of */
+/* arbitrary interior pointers enabled, which is now the default. */
+GC_API void GC_register_displacement GC_PROTO((GC_word n));
+
+/* The following version should be used if any debugging allocation is */
+/* being done. */
+GC_API void GC_debug_register_displacement GC_PROTO((GC_word n));
+
+/* Explicitly trigger a full, world-stop collection. */
+GC_API void GC_gcollect GC_PROTO((void));
+
+/* Trigger a full world-stopped collection. Abort the collection if */
+/* and when stop_func returns a nonzero value. Stop_func will be */
+/* called frequently, and should be reasonably fast. This works even */
+/* if virtual dirty bits, and hence incremental collection is not */
+/* available for this architecture. Collections can be aborted faster */
+/* than normal pause times for incremental collection. However, */
+/* aborted collections do no useful work; the next collection needs */
+/* to start from the beginning. */
+typedef int (* GC_stop_func) GC_PROTO((void));
+GC_API int GC_try_to_collect GC_PROTO((GC_stop_func stop_func));
+
+/* Return the number of bytes in the heap. Excludes collector private */
+/* data structures. Includes empty blocks and fragmentation loss. */
+/* Includes some pages that were allocated but never written. */
+GC_API size_t GC_get_heap_size GC_PROTO((void));
+
+/* Return the number of bytes allocated since the last collection. */
+GC_API size_t GC_get_bytes_since_gc GC_PROTO((void));
+
+/* Enable incremental/generational collection. */
+/* Not advisable unless dirty bits are */
+/* available or most heap objects are */
+/* pointerfree(atomic) or immutable. */
+/* Don't use in leak finding mode. */
+/* Ignored if GC_dont_gc is true. */
+GC_API void GC_enable_incremental GC_PROTO((void));
+
+/* Perform some garbage collection work, if appropriate. */
+/* Return 0 if there is no more work to be done. */
+/* Typically performs an amount of work corresponding roughly */
+/* to marking from one page. May do more work if further */
+/* progress requires it, e.g. if incremental collection is */
+/* disabled. It is reasonable to call this in a wait loop */
+/* until it returns 0. */
+GC_API int GC_collect_a_little GC_PROTO((void));
+
+/* Allocate an object of size lb bytes. The client guarantees that */
+/* as long as the object is live, it will be referenced by a pointer */
+/* that points to somewhere within the first 256 bytes of the object. */
+/* (This should normally be declared volatile to prevent the compiler */
+/* from invalidating this assertion.) This routine is only useful */
+/* if a large array is being allocated. It reduces the chance of */
+/* accidentally retaining such an array as a result of scanning an */
+/* integer that happens to be an address inside the array. (Actually, */
+/* it reduces the chance of the allocator not finding space for such */
+/* an array, since it will try hard to avoid introducing such a false */
+/* reference.) On a SunOS 4.X or MS Windows system this is recommended */
+/* for arrays likely to be larger than 100K or so. For other systems, */
+/* or if the collector is not configured to recognize all interior */
+/* pointers, the threshold is normally much higher. */
+GC_API GC_PTR GC_malloc_ignore_off_page GC_PROTO((size_t lb));
+GC_API GC_PTR GC_malloc_atomic_ignore_off_page GC_PROTO((size_t lb));
+
+#if defined(__sgi) && !defined(__GNUC__) && _COMPILER_VERSION >= 720
+# define GC_ADD_CALLER
+# define GC_RETURN_ADDR (GC_word)__return_address
+#endif
+
+#ifdef GC_ADD_CALLER
+# define GC_EXTRAS GC_RETURN_ADDR, __FILE__, __LINE__
+# define GC_EXTRA_PARAMS GC_word ra, char * descr_string, int descr_int
+#else
+# define GC_EXTRAS __FILE__, __LINE__
+# define GC_EXTRA_PARAMS char * descr_string, int descr_int
+#endif
+
+/* Debugging (annotated) allocation. GC_gcollect will check */
+/* objects allocated in this way for overwrites, etc. */
+GC_API GC_PTR GC_debug_malloc
+ GC_PROTO((size_t size_in_bytes, GC_EXTRA_PARAMS));
+GC_API GC_PTR GC_debug_malloc_atomic
+ GC_PROTO((size_t size_in_bytes, GC_EXTRA_PARAMS));
+GC_API GC_PTR GC_debug_malloc_uncollectable
+ GC_PROTO((size_t size_in_bytes, GC_EXTRA_PARAMS));
+GC_API GC_PTR GC_debug_malloc_stubborn
+ GC_PROTO((size_t size_in_bytes, GC_EXTRA_PARAMS));
+GC_API void GC_debug_free GC_PROTO((GC_PTR object_addr));
+GC_API GC_PTR GC_debug_realloc
+ GC_PROTO((GC_PTR old_object, size_t new_size_in_bytes,
+ GC_EXTRA_PARAMS));
+
+GC_API void GC_debug_change_stubborn GC_PROTO((GC_PTR));
+GC_API void GC_debug_end_stubborn_change GC_PROTO((GC_PTR));
+# ifdef GC_DEBUG
+# define GC_MALLOC(sz) GC_debug_malloc(sz, GC_EXTRAS)
+# define GC_MALLOC_ATOMIC(sz) GC_debug_malloc_atomic(sz, GC_EXTRAS)
+# define GC_MALLOC_UNCOLLECTABLE(sz) GC_debug_malloc_uncollectable(sz, \
+ GC_EXTRAS)
+# define GC_REALLOC(old, sz) GC_debug_realloc(old, sz, GC_EXTRAS)
+# define GC_FREE(p) GC_debug_free(p)
+# define GC_REGISTER_FINALIZER(p, f, d, of, od) \
+ GC_debug_register_finalizer(p, f, d, of, od)
+# define GC_REGISTER_FINALIZER_IGNORE_SELF(p, f, d, of, od) \
+ GC_debug_register_finalizer_ignore_self(p, f, d, of, od)
+# define GC_MALLOC_STUBBORN(sz) GC_debug_malloc_stubborn(sz, GC_EXTRAS);
+# define GC_CHANGE_STUBBORN(p) GC_debug_change_stubborn(p)
+# define GC_END_STUBBORN_CHANGE(p) GC_debug_end_stubborn_change(p)
+# define GC_GENERAL_REGISTER_DISAPPEARING_LINK(link, obj) \
+ GC_general_register_disappearing_link(link, GC_base(obj))
+# define GC_REGISTER_DISPLACEMENT(n) GC_debug_register_displacement(n)
+# else
+# define GC_MALLOC(sz) GC_malloc(sz)
+# define GC_MALLOC_ATOMIC(sz) GC_malloc_atomic(sz)
+# define GC_MALLOC_UNCOLLECTABLE(sz) GC_malloc_uncollectable(sz)
+# define GC_REALLOC(old, sz) GC_realloc(old, sz)
+# define GC_FREE(p) GC_free(p)
+# define GC_REGISTER_FINALIZER(p, f, d, of, od) \
+ GC_register_finalizer(p, f, d, of, od)
+# define GC_REGISTER_FINALIZER_IGNORE_SELF(p, f, d, of, od) \
+ GC_register_finalizer_ignore_self(p, f, d, of, od)
+# define GC_MALLOC_STUBBORN(sz) GC_malloc_stubborn(sz)
+# define GC_CHANGE_STUBBORN(p) GC_change_stubborn(p)
+# define GC_END_STUBBORN_CHANGE(p) GC_end_stubborn_change(p)
+# define GC_GENERAL_REGISTER_DISAPPEARING_LINK(link, obj) \
+ GC_general_register_disappearing_link(link, obj)
+# define GC_REGISTER_DISPLACEMENT(n) GC_register_displacement(n)
+# endif
+/* The following are included because they are often convenient, and */
+/* reduce the chance for a misspecifed size argument. But calls may */
+/* expand to something syntactically incorrect if t is a complicated */
+/* type expression. */
+# define GC_NEW(t) (t *)GC_MALLOC(sizeof (t))
+# define GC_NEW_ATOMIC(t) (t *)GC_MALLOC_ATOMIC(sizeof (t))
+# define GC_NEW_STUBBORN(t) (t *)GC_MALLOC_STUBBORN(sizeof (t))
+# define GC_NEW_UNCOLLECTABLE(t) (t *)GC_MALLOC_UNCOLLECTABLE(sizeof (t))
+
+/* Finalization. Some of these primitives are grossly unsafe. */
+/* The idea is to make them both cheap, and sufficient to build */
+/* a safer layer, closer to PCedar finalization. */
+/* The interface represents my conclusions from a long discussion */
+/* with Alan Demers, Dan Greene, Carl Hauser, Barry Hayes, */
+/* Christian Jacobi, and Russ Atkinson. It's not perfect, and */
+/* probably nobody else agrees with it. Hans-J. Boehm 3/13/92 */
+typedef void (*GC_finalization_proc)
+ GC_PROTO((GC_PTR obj, GC_PTR client_data));
+
+GC_API void GC_register_finalizer
+ GC_PROTO((GC_PTR obj, GC_finalization_proc fn, GC_PTR cd,
+ GC_finalization_proc *ofn, GC_PTR *ocd));
+GC_API void GC_debug_register_finalizer
+ GC_PROTO((GC_PTR obj, GC_finalization_proc fn, GC_PTR cd,
+ GC_finalization_proc *ofn, GC_PTR *ocd));
+ /* When obj is no longer accessible, invoke */
+ /* (*fn)(obj, cd). If a and b are inaccessible, and */
+ /* a points to b (after disappearing links have been */
+ /* made to disappear), then only a will be */
+ /* finalized. (If this does not create any new */
+ /* pointers to b, then b will be finalized after the */
+ /* next collection.) Any finalizable object that */
+ /* is reachable from itself by following one or more */
+ /* pointers will not be finalized (or collected). */
+ /* Thus cycles involving finalizable objects should */
+ /* be avoided, or broken by disappearing links. */
+ /* All but the last finalizer registered for an object */
+ /* is ignored. */
+ /* Finalization may be removed by passing 0 as fn. */
+ /* Finalizers are implicitly unregistered just before */
+ /* they are invoked. */
+ /* The old finalizer and client data are stored in */
+ /* *ofn and *ocd. */
+ /* Fn is never invoked on an accessible object, */
+ /* provided hidden pointers are converted to real */
+ /* pointers only if the allocation lock is held, and */
+ /* such conversions are not performed by finalization */
+ /* routines. */
+ /* If GC_register_finalizer is aborted as a result of */
+ /* a signal, the object may be left with no */
+ /* finalization, even if neither the old nor new */
+ /* finalizer were NULL. */
+ /* Obj should be the nonNULL starting address of an */
+ /* object allocated by GC_malloc or friends. */
+ /* Note that any garbage collectable object referenced */
+ /* by cd will be considered accessible until the */
+ /* finalizer is invoked. */
+
+/* Another versions of the above follow. It ignores */
+/* self-cycles, i.e. pointers from a finalizable object to */
+/* itself. There is a stylistic argument that this is wrong, */
+/* but it's unavoidable for C++, since the compiler may */
+/* silently introduce these. It's also benign in that specific */
+/* case. */
+GC_API void GC_register_finalizer_ignore_self
+ GC_PROTO((GC_PTR obj, GC_finalization_proc fn, GC_PTR cd,
+ GC_finalization_proc *ofn, GC_PTR *ocd));
+GC_API void GC_debug_register_finalizer_ignore_self
+ GC_PROTO((GC_PTR obj, GC_finalization_proc fn, GC_PTR cd,
+ GC_finalization_proc *ofn, GC_PTR *ocd));
+
+/* The following routine may be used to break cycles between */
+/* finalizable objects, thus causing cyclic finalizable */
+/* objects to be finalized in the correct order. Standard */
+/* use involves calling GC_register_disappearing_link(&p), */
+/* where p is a pointer that is not followed by finalization */
+/* code, and should not be considered in determining */
+/* finalization order. */
+GC_API int GC_register_disappearing_link GC_PROTO((GC_PTR * /* link */));
+ /* Link should point to a field of a heap allocated */
+ /* object obj. *link will be cleared when obj is */
+ /* found to be inaccessible. This happens BEFORE any */
+ /* finalization code is invoked, and BEFORE any */
+ /* decisions about finalization order are made. */
+ /* This is useful in telling the finalizer that */
+ /* some pointers are not essential for proper */
+ /* finalization. This may avoid finalization cycles. */
+ /* Note that obj may be resurrected by another */
+ /* finalizer, and thus the clearing of *link may */
+ /* be visible to non-finalization code. */
+ /* There's an argument that an arbitrary action should */
+ /* be allowed here, instead of just clearing a pointer. */
+ /* But this causes problems if that action alters, or */
+ /* examines connectivity. */
+ /* Returns 1 if link was already registered, 0 */
+ /* otherwise. */
+ /* Only exists for backward compatibility. See below: */
+
+GC_API int GC_general_register_disappearing_link
+ GC_PROTO((GC_PTR * /* link */, GC_PTR obj));
+ /* A slight generalization of the above. *link is */
+ /* cleared when obj first becomes inaccessible. This */
+ /* can be used to implement weak pointers easily and */
+ /* safely. Typically link will point to a location */
+ /* holding a disguised pointer to obj. (A pointer */
+ /* inside an "atomic" object is effectively */
+ /* disguised.) In this way soft */
+ /* pointers are broken before any object */
+ /* reachable from them are finalized. Each link */
+ /* May be registered only once, i.e. with one obj */
+ /* value. This was added after a long email discussion */
+ /* with John Ellis. */
+ /* Obj must be a pointer to the first word of an object */
+ /* we allocated. It is unsafe to explicitly deallocate */
+ /* the object containing link. Explicitly deallocating */
+ /* obj may or may not cause link to eventually be */
+ /* cleared. */
+GC_API int GC_unregister_disappearing_link GC_PROTO((GC_PTR * /* link */));
+ /* Returns 0 if link was not actually registered. */
+ /* Undoes a registration by either of the above two */
+ /* routines. */
+
+/* Auxiliary fns to make finalization work correctly with displaced */
+/* pointers introduced by the debugging allocators. */
+GC_API GC_PTR GC_make_closure GC_PROTO((GC_finalization_proc fn, GC_PTR data));
+GC_API void GC_debug_invoke_finalizer GC_PROTO((GC_PTR obj, GC_PTR data));
+
+GC_API int GC_invoke_finalizers GC_PROTO((void));
+ /* Run finalizers for all objects that are ready to */
+ /* be finalized. Return the number of finalizers */
+ /* that were run. Normally this is also called */
+ /* implicitly during some allocations. If */
+ /* FINALIZE_ON_DEMAND is defined, it must be called */
+ /* explicitly. */
+
+/* GC_set_warn_proc can be used to redirect or filter warning messages. */
+/* p may not be a NULL pointer. */
+typedef void (*GC_warn_proc) GC_PROTO((char *msg, GC_word arg));
+GC_API GC_warn_proc GC_set_warn_proc GC_PROTO((GC_warn_proc p));
+ /* Returns old warning procedure. */
+
+/* The following is intended to be used by a higher level */
+/* (e.g. cedar-like) finalization facility. It is expected */
+/* that finalization code will arrange for hidden pointers to */
+/* disappear. Otherwise objects can be accessed after they */
+/* have been collected. */
+/* Note that putting pointers in atomic objects or in */
+/* nonpointer slots of "typed" objects is equivalent to */
+/* disguising them in this way, and may have other advantages. */
+# if defined(I_HIDE_POINTERS) || defined(GC_I_HIDE_POINTERS)
+ typedef GC_word GC_hidden_pointer;
+# define HIDE_POINTER(p) (~(GC_hidden_pointer)(p))
+# define REVEAL_POINTER(p) ((GC_PTR)(HIDE_POINTER(p)))
+ /* Converting a hidden pointer to a real pointer requires verifying */
+ /* that the object still exists. This involves acquiring the */
+ /* allocator lock to avoid a race with the collector. */
+# endif /* I_HIDE_POINTERS */
+
+typedef GC_PTR (*GC_fn_type) GC_PROTO((GC_PTR client_data));
+GC_API GC_PTR GC_call_with_alloc_lock
+ GC_PROTO((GC_fn_type fn, GC_PTR client_data));
+
+/* Check that p and q point to the same object. */
+/* Fail conspicuously if they don't. */
+/* Returns the first argument. */
+/* Succeeds if neither p nor q points to the heap. */
+/* May succeed if both p and q point to between heap objects. */
+GC_API GC_PTR GC_same_obj GC_PROTO((GC_PTR p, GC_PTR q));
+
+/* Checked pointer pre- and post- increment operations. Note that */
+/* the second argument is in units of bytes, not multiples of the */
+/* object size. This should either be invoked from a macro, or the */
+/* call should be automatically generated. */
+GC_API GC_PTR GC_pre_incr GC_PROTO((GC_PTR *p, size_t how_much));
+GC_API GC_PTR GC_post_incr GC_PROTO((GC_PTR *p, size_t how_much));
+
+/* Check that p is visible */
+/* to the collector as a possibly pointer containing location. */
+/* If it isn't fail conspicuously. */
+/* Returns the argument in all cases. May erroneously succeed */
+/* in hard cases. (This is intended for debugging use with */
+/* untyped allocations. The idea is that it should be possible, though */
+/* slow, to add such a call to all indirect pointer stores.) */
+/* Currently useless for multithreaded worlds. */
+GC_API GC_PTR GC_is_visible GC_PROTO((GC_PTR p));
+
+/* Check that if p is a pointer to a heap page, then it points to */
+/* a valid displacement within a heap object. */
+/* Fail conspicuously if this property does not hold. */
+/* Uninteresting with ALL_INTERIOR_POINTERS. */
+/* Always returns its argument. */
+GC_API GC_PTR GC_is_valid_displacement GC_PROTO((GC_PTR p));
+
+/* Safer, but slow, pointer addition. Probably useful mainly with */
+/* a preprocessor. Useful only for heap pointers. */
+#ifdef GC_DEBUG
+# define GC_PTR_ADD3(x, n, type_of_result) \
+ ((type_of_result)GC_same_obj((x)+(n), (x)))
+# define GC_PRE_INCR3(x, n, type_of_result) \
+ ((type_of_result)GC_pre_incr(&(x), (n)*sizeof(*x))
+# define GC_POST_INCR2(x, type_of_result) \
+ ((type_of_result)GC_post_incr(&(x), sizeof(*x))
+# ifdef __GNUC__
+# define GC_PTR_ADD(x, n) \
+ GC_PTR_ADD3(x, n, typeof(x))
+# define GC_PRE_INCR(x, n) \
+ GC_PRE_INCR3(x, n, typeof(x))
+# define GC_POST_INCR(x, n) \
+ GC_POST_INCR3(x, typeof(x))
+# else
+ /* We can't do this right without typeof, which ANSI */
+ /* decided was not sufficiently useful. Repeatedly */
+ /* mentioning the arguments seems too dangerous to be */
+ /* useful. So does not casting the result. */
+# define GC_PTR_ADD(x, n) ((x)+(n))
+# endif
+#else /* !GC_DEBUG */
+# define GC_PTR_ADD3(x, n, type_of_result) ((x)+(n))
+# define GC_PTR_ADD(x, n) ((x)+(n))
+# define GC_PRE_INCR3(x, n, type_of_result) ((x) += (n))
+# define GC_PRE_INCR(x, n) ((x) += (n))
+# define GC_POST_INCR2(x, n, type_of_result) ((x)++)
+# define GC_POST_INCR(x, n) ((x)++)
+#endif
+
+/* Safer assignment of a pointer to a nonstack location. */
+#ifdef GC_DEBUG
+# ifdef __STDC__
+# define GC_PTR_STORE(p, q) \
+ (*(void **)GC_is_visible(p) = GC_is_valid_displacement(q))
+# else
+# define GC_PTR_STORE(p, q) \
+ (*(char **)GC_is_visible(p) = GC_is_valid_displacement(q))
+# endif
+#else /* !GC_DEBUG */
+# define GC_PTR_STORE(p, q) *((p) = (q))
+#endif
+
+/* Fynctions called to report pointer checking errors */
+GC_API void (*GC_same_obj_print_proc) GC_PROTO((GC_PTR p, GC_PTR q));
+
+GC_API void (*GC_is_valid_displacement_print_proc)
+ GC_PROTO((GC_PTR p));
+
+GC_API void (*GC_is_visible_print_proc)
+ GC_PROTO((GC_PTR p));
+
+#ifdef SOLARIS_THREADS
+/* We need to intercept calls to many of the threads primitives, so */
+/* that we can locate thread stacks and stop the world. */
+/* Note also that the collector cannot see thread specific data. */
+/* Thread specific data should generally consist of pointers to */
+/* uncollectable objects, which are deallocated using the destructor */
+/* facility in thr_keycreate. */
+# include <thread.h>
+# include <signal.h>
+ int GC_thr_create(void *stack_base, size_t stack_size,
+ void *(*start_routine)(void *), void *arg, long flags,
+ thread_t *new_thread);
+ int GC_thr_join(thread_t wait_for, thread_t *departed, void **status);
+ int GC_thr_suspend(thread_t target_thread);
+ int GC_thr_continue(thread_t target_thread);
+ void * GC_dlopen(const char *path, int mode);
+
+# ifdef _SOLARIS_PTHREADS
+# include <pthread.h>
+ extern int GC_pthread_create(pthread_t *new_thread,
+ const pthread_attr_t *attr,
+ void * (*thread_execp)(void *), void *arg);
+ extern int GC_pthread_join(pthread_t wait_for, void **status);
+
+# undef thread_t
+
+# define pthread_join GC_pthread_join
+# define pthread_create GC_pthread_create
+#endif
+
+# define thr_create GC_thr_create
+# define thr_join GC_thr_join
+# define thr_suspend GC_thr_suspend
+# define thr_continue GC_thr_continue
+# define dlopen GC_dlopen
+
+# endif /* SOLARIS_THREADS */
+
+
+#if defined(IRIX_THREADS) || defined(LINUX_THREADS)
+/* We treat these similarly. */
+# include <pthread.h>
+# include <signal.h>
+
+ int GC_pthread_create(pthread_t *new_thread,
+ const pthread_attr_t *attr,
+ void *(*start_routine)(void *), void *arg);
+ int GC_pthread_sigmask(int how, const sigset_t *set, sigset_t *oset);
+ int GC_pthread_join(pthread_t thread, void **retval);
+
+# define pthread_create GC_pthread_create
+# define pthread_sigmask GC_pthread_sigmask
+# define pthread_join GC_pthread_join
+
+#endif /* IRIX_THREADS || LINUX_THREADS */
+
+#if defined(THREADS) && !defined(SRC_M3)
+/* This returns a list of objects, linked through their first */
+/* word. Its use can greatly reduce lock contention problems, since */
+/* the allocation lock can be acquired and released many fewer times. */
+GC_PTR GC_malloc_many(size_t lb);
+#define GC_NEXT(p) (*(GC_PTR *)(p)) /* Retrieve the next element */
+ /* in returned list. */
+extern void GC_thr_init(); /* Needed for Solaris/X86 */
+
+#endif /* THREADS && !SRC_M3 */
+
+/*
+ * If you are planning on putting
+ * the collector in a SunOS 5 dynamic library, you need to call GC_INIT()
+ * from the statically loaded program section.
+ * This circumvents a Solaris 2.X (X<=4) linker bug.
+ */
+#if defined(sparc) || defined(__sparc)
+# define GC_INIT() { extern end, etext; \
+ GC_noop(&end, &etext); }
+#else
+# if defined(__CYGWIN32__) && defined(GC_USE_DLL)
+ /*
+ * Similarly gnu-win32 DLLs need explicit initialization
+ */
+# define GC_INIT() { GC_add_roots(DATASTART, DATAEND); }
+# else
+# define GC_INIT()
+# endif
+#endif
+
+#ifdef __cplusplus
+ } /* end of extern "C" */
+#endif
+
+#endif /* _GC_H */
diff --git a/boehm-gc/include/gc_alloc.h b/boehm-gc/include/gc_alloc.h
new file mode 100644
index 00000000000..1d912db2f0b
--- /dev/null
+++ b/boehm-gc/include/gc_alloc.h
@@ -0,0 +1,380 @@
+/*
+ * Copyright (c) 1996-1998 by Silicon Graphics. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+//
+// This is a C++ header file that is intended to replace the SGI STL
+// alloc.h.
+//
+// This assumes the collector has been compiled with -DATOMIC_UNCOLLECTABLE
+// and -DALL_INTERIOR_POINTERS. We also recommend
+// -DREDIRECT_MALLOC=GC_uncollectable_malloc.
+//
+// Some of this could be faster in the explicit deallocation case. In particular,
+// we spend too much time clearing objects on the free lists. That could be avoided.
+//
+// This uses template classes with static members, and hence does not work
+// with g++ 2.7.2 and earlier.
+//
+
+#include "gc.h"
+
+#ifndef GC_ALLOC_H
+
+#define GC_ALLOC_H
+#define __ALLOC_H // Prevent inclusion of the default version. Ugly.
+#define __SGI_STL_ALLOC_H
+#define __SGI_STL_INTERNAL_ALLOC_H
+
+#ifndef __ALLOC
+# define __ALLOC alloc
+#endif
+
+#include <stddef.h>
+#include <string.h>
+
+// The following is just replicated from the conventional SGI alloc.h:
+
+template<class T, class alloc>
+class simple_alloc {
+
+public:
+ static T *allocate(size_t n)
+ { return 0 == n? 0 : (T*) alloc::allocate(n * sizeof (T)); }
+ static T *allocate(void)
+ { return (T*) alloc::allocate(sizeof (T)); }
+ static void deallocate(T *p, size_t n)
+ { if (0 != n) alloc::deallocate(p, n * sizeof (T)); }
+ static void deallocate(T *p)
+ { alloc::deallocate(p, sizeof (T)); }
+};
+
+#include "gc.h"
+
+// The following need to match collector data structures.
+// We can't include gc_priv.h, since that pulls in way too much stuff.
+// This should eventually be factored out into another include file.
+
+extern "C" {
+ extern void ** const GC_objfreelist_ptr;
+ extern void ** const GC_aobjfreelist_ptr;
+ extern void ** const GC_uobjfreelist_ptr;
+ extern void ** const GC_auobjfreelist_ptr;
+
+ extern void GC_incr_words_allocd(size_t words);
+ extern void GC_incr_mem_freed(size_t words);
+
+ extern char * GC_generic_malloc_words_small(size_t word, int kind);
+}
+
+// Object kinds; must match PTRFREE, NORMAL, UNCOLLECTABLE, and
+// AUNCOLLECTABLE in gc_priv.h.
+
+enum { GC_PTRFREE = 0, GC_NORMAL = 1, GC_UNCOLLECTABLE = 2,
+ GC_AUNCOLLECTABLE = 3 };
+
+enum { GC_max_fast_bytes = 255 };
+
+enum { GC_bytes_per_word = sizeof(char *) };
+
+enum { GC_byte_alignment = 8 };
+
+enum { GC_word_alignment = GC_byte_alignment/GC_bytes_per_word };
+
+inline void * &GC_obj_link(void * p)
+{ return *(void **)p; }
+
+// Compute a number of words >= n+1 bytes.
+// The +1 allows for pointers one past the end.
+inline size_t GC_round_up(size_t n)
+{
+ return ((n + GC_byte_alignment)/GC_byte_alignment)*GC_word_alignment;
+}
+
+// The same but don't allow for extra byte.
+inline size_t GC_round_up_uncollectable(size_t n)
+{
+ return ((n + GC_byte_alignment - 1)/GC_byte_alignment)*GC_word_alignment;
+}
+
+template <int dummy>
+class GC_aux_template {
+public:
+ // File local count of allocated words. Occasionally this is
+ // added into the global count. A separate count is necessary since the
+ // real one must be updated with a procedure call.
+ static size_t GC_words_recently_allocd;
+
+ // Same for uncollectable mmory. Not yet reflected in either
+ // GC_words_recently_allocd or GC_non_gc_bytes.
+ static size_t GC_uncollectable_words_recently_allocd;
+
+ // Similar counter for explicitly deallocated memory.
+ static size_t GC_mem_recently_freed;
+
+ // Again for uncollectable memory.
+ static size_t GC_uncollectable_mem_recently_freed;
+
+ static void * GC_out_of_line_malloc(size_t nwords, int kind);
+};
+
+template <int dummy>
+size_t GC_aux_template<dummy>::GC_words_recently_allocd = 0;
+
+template <int dummy>
+size_t GC_aux_template<dummy>::GC_uncollectable_words_recently_allocd = 0;
+
+template <int dummy>
+size_t GC_aux_template<dummy>::GC_mem_recently_freed = 0;
+
+template <int dummy>
+size_t GC_aux_template<dummy>::GC_uncollectable_mem_recently_freed = 0;
+
+template <int dummy>
+void * GC_aux_template<dummy>::GC_out_of_line_malloc(size_t nwords, int kind)
+{
+ GC_words_recently_allocd += GC_uncollectable_words_recently_allocd;
+ GC_non_gc_bytes +=
+ GC_bytes_per_word * GC_uncollectable_words_recently_allocd;
+ GC_uncollectable_words_recently_allocd = 0;
+
+ GC_mem_recently_freed += GC_uncollectable_mem_recently_freed;
+ GC_non_gc_bytes -=
+ GC_bytes_per_word * GC_uncollectable_mem_recently_freed;
+ GC_uncollectable_mem_recently_freed = 0;
+
+ GC_incr_words_allocd(GC_words_recently_allocd);
+ GC_words_recently_allocd = 0;
+
+ GC_incr_mem_freed(GC_mem_recently_freed);
+ GC_mem_recently_freed = 0;
+
+ return GC_generic_malloc_words_small(nwords, kind);
+}
+
+typedef GC_aux_template<0> GC_aux;
+
+// A fast, single-threaded, garbage-collected allocator
+// We assume the first word will be immediately overwritten.
+// In this version, deallocation is not a noop, and explicit
+// deallocation is likely to help performance.
+template <int dummy>
+class single_client_gc_alloc_template {
+ public:
+ static void * allocate(size_t n)
+ {
+ size_t nwords = GC_round_up(n);
+ void ** flh;
+ void * op;
+
+ if (n > GC_max_fast_bytes) return GC_malloc(n);
+ flh = GC_objfreelist_ptr + nwords;
+ if (0 == (op = *flh)) {
+ return GC_aux::GC_out_of_line_malloc(nwords, GC_NORMAL);
+ }
+ *flh = GC_obj_link(op);
+ GC_aux::GC_words_recently_allocd += nwords;
+ return op;
+ }
+ static void * ptr_free_allocate(size_t n)
+ {
+ size_t nwords = GC_round_up(n);
+ void ** flh;
+ void * op;
+
+ if (n > GC_max_fast_bytes) return GC_malloc_atomic(n);
+ flh = GC_aobjfreelist_ptr + nwords;
+ if (0 == (op = *flh)) {
+ return GC_aux::GC_out_of_line_malloc(nwords, GC_PTRFREE);
+ }
+ *flh = GC_obj_link(op);
+ GC_aux::GC_words_recently_allocd += nwords;
+ return op;
+ }
+ static void deallocate(void *p, size_t n)
+ {
+ size_t nwords = GC_round_up(n);
+ void ** flh;
+
+ if (n > GC_max_fast_bytes) {
+ GC_free(p);
+ } else {
+ flh = GC_objfreelist_ptr + nwords;
+ GC_obj_link(p) = *flh;
+ memset((char *)p + GC_bytes_per_word, 0,
+ GC_bytes_per_word * (nwords - 1));
+ *flh = p;
+ GC_aux::GC_mem_recently_freed += nwords;
+ }
+ }
+ static void ptr_free_deallocate(void *p, size_t n)
+ {
+ size_t nwords = GC_round_up(n);
+ void ** flh;
+
+ if (n > GC_max_fast_bytes) {
+ GC_free(p);
+ } else {
+ flh = GC_aobjfreelist_ptr + nwords;
+ GC_obj_link(p) = *flh;
+ *flh = p;
+ GC_aux::GC_mem_recently_freed += nwords;
+ }
+ }
+};
+
+typedef single_client_gc_alloc_template<0> single_client_gc_alloc;
+
+// Once more, for uncollectable objects.
+template <int dummy>
+class single_client_alloc_template {
+ public:
+ static void * allocate(size_t n)
+ {
+ size_t nwords = GC_round_up_uncollectable(n);
+ void ** flh;
+ void * op;
+
+ if (n > GC_max_fast_bytes) return GC_malloc_uncollectable(n);
+ flh = GC_uobjfreelist_ptr + nwords;
+ if (0 == (op = *flh)) {
+ return GC_aux::GC_out_of_line_malloc(nwords, GC_UNCOLLECTABLE);
+ }
+ *flh = GC_obj_link(op);
+ GC_aux::GC_uncollectable_words_recently_allocd += nwords;
+ return op;
+ }
+ static void * ptr_free_allocate(size_t n)
+ {
+ size_t nwords = GC_round_up_uncollectable(n);
+ void ** flh;
+ void * op;
+
+ if (n > GC_max_fast_bytes) return GC_malloc_atomic_uncollectable(n);
+ flh = GC_auobjfreelist_ptr + nwords;
+ if (0 == (op = *flh)) {
+ return GC_aux::GC_out_of_line_malloc(nwords, GC_AUNCOLLECTABLE);
+ }
+ *flh = GC_obj_link(op);
+ GC_aux::GC_uncollectable_words_recently_allocd += nwords;
+ return op;
+ }
+ static void deallocate(void *p, size_t n)
+ {
+ size_t nwords = GC_round_up_uncollectable(n);
+ void ** flh;
+
+ if (n > GC_max_fast_bytes) {
+ GC_free(p);
+ } else {
+ flh = GC_uobjfreelist_ptr + nwords;
+ GC_obj_link(p) = *flh;
+ *flh = p;
+ GC_aux::GC_uncollectable_mem_recently_freed += nwords;
+ }
+ }
+ static void ptr_free_deallocate(void *p, size_t n)
+ {
+ size_t nwords = GC_round_up_uncollectable(n);
+ void ** flh;
+
+ if (n > GC_max_fast_bytes) {
+ GC_free(p);
+ } else {
+ flh = GC_auobjfreelist_ptr + nwords;
+ GC_obj_link(p) = *flh;
+ *flh = p;
+ GC_aux::GC_uncollectable_mem_recently_freed += nwords;
+ }
+ }
+};
+
+typedef single_client_alloc_template<0> single_client_alloc;
+
+template < int dummy >
+class gc_alloc_template {
+ public:
+ static void * allocate(size_t n) { return GC_malloc(n); }
+ static void * ptr_free_allocate(size_t n)
+ { return GC_malloc_atomic(n); }
+ static void deallocate(void *, size_t) { }
+ static void ptr_free_deallocate(void *, size_t) { }
+};
+
+typedef gc_alloc_template < 0 > gc_alloc;
+
+template < int dummy >
+class alloc_template {
+ public:
+ static void * allocate(size_t n) { return GC_malloc_uncollectable(n); }
+ static void * ptr_free_allocate(size_t n)
+ { return GC_malloc_atomic_uncollectable(n); }
+ static void deallocate(void *p, size_t) { GC_free(p); }
+ static void ptr_free_deallocate(void *p, size_t) { GC_free(p); }
+};
+
+typedef alloc_template < 0 > alloc;
+
+#ifdef _SGI_SOURCE
+
+// We want to specialize simple_alloc so that it does the right thing
+// for all pointerfree types. At the moment there is no portable way to
+// even approximate that. The following approximation should work for
+// SGI compilers, and perhaps some others.
+
+# define __GC_SPECIALIZE(T,alloc) \
+class simple_alloc<T, alloc> { \
+public: \
+ static T *allocate(size_t n) \
+ { return 0 == n? 0 : \
+ (T*) alloc::ptr_free_allocate(n * sizeof (T)); } \
+ static T *allocate(void) \
+ { return (T*) alloc::ptr_free_allocate(sizeof (T)); } \
+ static void deallocate(T *p, size_t n) \
+ { if (0 != n) alloc::ptr_free_deallocate(p, n * sizeof (T)); } \
+ static void deallocate(T *p) \
+ { alloc::ptr_free_deallocate(p, sizeof (T)); } \
+};
+
+__GC_SPECIALIZE(char, gc_alloc)
+__GC_SPECIALIZE(int, gc_alloc)
+__GC_SPECIALIZE(unsigned, gc_alloc)
+__GC_SPECIALIZE(float, gc_alloc)
+__GC_SPECIALIZE(double, gc_alloc)
+
+__GC_SPECIALIZE(char, alloc)
+__GC_SPECIALIZE(int, alloc)
+__GC_SPECIALIZE(unsigned, alloc)
+__GC_SPECIALIZE(float, alloc)
+__GC_SPECIALIZE(double, alloc)
+
+__GC_SPECIALIZE(char, single_client_gc_alloc)
+__GC_SPECIALIZE(int, single_client_gc_alloc)
+__GC_SPECIALIZE(unsigned, single_client_gc_alloc)
+__GC_SPECIALIZE(float, single_client_gc_alloc)
+__GC_SPECIALIZE(double, single_client_gc_alloc)
+
+__GC_SPECIALIZE(char, single_client_alloc)
+__GC_SPECIALIZE(int, single_client_alloc)
+__GC_SPECIALIZE(unsigned, single_client_alloc)
+__GC_SPECIALIZE(float, single_client_alloc)
+__GC_SPECIALIZE(double, single_client_alloc)
+
+#ifdef __STL_USE_STD_ALLOCATORS
+
+???copy stuff from stl_alloc.h or remove it to a different file ???
+
+#endif /* __STL_USE_STD_ALLOCATORS */
+
+#endif /* _SGI_SOURCE */
+
+#endif /* GC_ALLOC_H */
diff --git a/boehm-gc/include/gc_cpp.h b/boehm-gc/include/gc_cpp.h
new file mode 100644
index 00000000000..e2f456fb526
--- /dev/null
+++ b/boehm-gc/include/gc_cpp.h
@@ -0,0 +1,287 @@
+#ifndef GC_CPP_H
+#define GC_CPP_H
+/****************************************************************************
+Copyright (c) 1994 by Xerox Corporation. All rights reserved.
+
+THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+
+Permission is hereby granted to use or copy this program for any
+purpose, provided the above notices are retained on all copies.
+Permission to modify the code and to distribute modified code is
+granted, provided the above notices are retained, and a notice that
+the code was modified is included with the above copyright notice.
+****************************************************************************
+
+C++ Interface to the Boehm Collector
+
+ John R. Ellis and Jesse Hull
+ Last modified on Mon Jul 24 15:43:42 PDT 1995 by ellis
+
+This interface provides access to the Boehm collector. It provides
+basic facilities similar to those described in "Safe, Efficient
+Garbage Collection for C++", by John R. Elis and David L. Detlefs
+(ftp.parc.xerox.com:/pub/ellis/gc).
+
+All heap-allocated objects are either "collectable" or
+"uncollectable". Programs must explicitly delete uncollectable
+objects, whereas the garbage collector will automatically delete
+collectable objects when it discovers them to be inaccessible.
+Collectable objects may freely point at uncollectable objects and vice
+versa.
+
+Objects allocated with the built-in "::operator new" are uncollectable.
+
+Objects derived from class "gc" are collectable. For example:
+
+ class A: public gc {...};
+ A* a = new A; // a is collectable.
+
+Collectable instances of non-class types can be allocated using the GC
+placement:
+
+ typedef int A[ 10 ];
+ A* a = new (GC) A;
+
+Uncollectable instances of classes derived from "gc" can be allocated
+using the NoGC placement:
+
+ class A: public gc {...};
+ A* a = new (NoGC) A; // a is uncollectable.
+
+Both uncollectable and collectable objects can be explicitly deleted
+with "delete", which invokes an object's destructors and frees its
+storage immediately.
+
+A collectable object may have a clean-up function, which will be
+invoked when the collector discovers the object to be inaccessible.
+An object derived from "gc_cleanup" or containing a member derived
+from "gc_cleanup" has a default clean-up function that invokes the
+object's destructors. Explicit clean-up functions may be specified as
+an additional placement argument:
+
+ A* a = ::new (GC, MyCleanup) A;
+
+An object is considered "accessible" by the collector if it can be
+reached by a path of pointers from static variables, automatic
+variables of active functions, or from some object with clean-up
+enabled; pointers from an object to itself are ignored.
+
+Thus, if objects A and B both have clean-up functions, and A points at
+B, B is considered accessible. After A's clean-up is invoked and its
+storage released, B will then become inaccessible and will have its
+clean-up invoked. If A points at B and B points to A, forming a
+cycle, then that's considered a storage leak, and neither will be
+collectable. See the interface gc.h for low-level facilities for
+handling such cycles of objects with clean-up.
+
+The collector cannot guarrantee that it will find all inaccessible
+objects. In practice, it finds almost all of them.
+
+
+Cautions:
+
+1. Be sure the collector has been augmented with "make c++".
+
+2. If your compiler supports the new "operator new[]" syntax, then
+add -DOPERATOR_NEW_ARRAY to the Makefile.
+
+If your compiler doesn't support "operator new[]", beware that an
+array of type T, where T is derived from "gc", may or may not be
+allocated as a collectable object (it depends on the compiler). Use
+the explicit GC placement to make the array collectable. For example:
+
+ class A: public gc {...};
+ A* a1 = new A[ 10 ]; // collectable or uncollectable?
+ A* a2 = new (GC) A[ 10 ]; // collectable
+
+3. The destructors of collectable arrays of objects derived from
+"gc_cleanup" will not be invoked properly. For example:
+
+ class A: public gc_cleanup {...};
+ A* a = new (GC) A[ 10 ]; // destructors not invoked correctly
+
+Typically, only the destructor for the first element of the array will
+be invoked when the array is garbage-collected. To get all the
+destructors of any array executed, you must supply an explicit
+clean-up function:
+
+ A* a = new (GC, MyCleanUp) A[ 10 ];
+
+(Implementing clean-up of arrays correctly, portably, and in a way
+that preserves the correct exception semantics requires a language
+extension, e.g. the "gc" keyword.)
+
+4. Compiler bugs:
+
+* Solaris 2's CC (SC3.0) doesn't implement t->~T() correctly, so the
+destructors of classes derived from gc_cleanup won't be invoked.
+You'll have to explicitly register a clean-up function with
+new-placement syntax.
+
+* Evidently cfront 3.0 does not allow destructors to be explicitly
+invoked using the ANSI-conforming syntax t->~T(). If you're using
+cfront 3.0, you'll have to comment out the class gc_cleanup, which
+uses explicit invocation.
+
+****************************************************************************/
+
+#include "gc.h"
+
+#ifndef THINK_CPLUS
+#define _cdecl
+#endif
+
+#if ! defined( OPERATOR_NEW_ARRAY ) \
+ && (__BORLANDC__ >= 0x450 || (__GNUC__ >= 2 && __GNUC_MINOR__ >= 6))
+# define OPERATOR_NEW_ARRAY
+#endif
+
+enum GCPlacement {GC, NoGC, PointerFreeGC};
+
+class gc {public:
+ inline void* operator new( size_t size );
+ inline void* operator new( size_t size, GCPlacement gcp );
+ inline void operator delete( void* obj );
+
+#ifdef OPERATOR_NEW_ARRAY
+ inline void* operator new[]( size_t size );
+ inline void* operator new[]( size_t size, GCPlacement gcp );
+ inline void operator delete[]( void* obj );
+#endif /* OPERATOR_NEW_ARRAY */
+ };
+ /*
+ Instances of classes derived from "gc" will be allocated in the
+ collected heap by default, unless an explicit NoGC placement is
+ specified. */
+
+class gc_cleanup: virtual public gc {public:
+ inline gc_cleanup();
+ inline virtual ~gc_cleanup();
+private:
+ inline static void _cdecl cleanup( void* obj, void* clientData );};
+ /*
+ Instances of classes derived from "gc_cleanup" will be allocated
+ in the collected heap by default. When the collector discovers an
+ inaccessible object derived from "gc_cleanup" or containing a
+ member derived from "gc_cleanup", its destructors will be
+ invoked. */
+
+extern "C" {typedef void (*GCCleanUpFunc)( void* obj, void* clientData );}
+
+inline void* operator new(
+ size_t size,
+ GCPlacement gcp,
+ GCCleanUpFunc cleanup = 0,
+ void* clientData = 0 );
+ /*
+ Allocates a collectable or uncollected object, according to the
+ value of "gcp".
+
+ For collectable objects, if "cleanup" is non-null, then when the
+ allocated object "obj" becomes inaccessible, the collector will
+ invoke the function "cleanup( obj, clientData )" but will not
+ invoke the object's destructors. It is an error to explicitly
+ delete an object allocated with a non-null "cleanup".
+
+ It is an error to specify a non-null "cleanup" with NoGC or for
+ classes derived from "gc_cleanup" or containing members derived
+ from "gc_cleanup". */
+
+#ifdef OPERATOR_NEW_ARRAY
+
+inline void* operator new[](
+ size_t size,
+ GCPlacement gcp,
+ GCCleanUpFunc cleanup = 0,
+ void* clientData = 0 );
+ /*
+ The operator new for arrays, identical to the above. */
+
+#endif /* OPERATOR_NEW_ARRAY */
+
+/****************************************************************************
+
+Inline implementation
+
+****************************************************************************/
+
+inline void* gc::operator new( size_t size ) {
+ return GC_MALLOC( size );}
+
+inline void* gc::operator new( size_t size, GCPlacement gcp ) {
+ if (gcp == GC)
+ return GC_MALLOC( size );
+ else
+ return GC_MALLOC_UNCOLLECTABLE( size );}
+
+inline void gc::operator delete( void* obj ) {
+ GC_FREE( obj );}
+
+
+#ifdef OPERATOR_NEW_ARRAY
+
+inline void* gc::operator new[]( size_t size ) {
+ return gc::operator new( size );}
+
+inline void* gc::operator new[]( size_t size, GCPlacement gcp ) {
+ return gc::operator new( size, gcp );}
+
+inline void gc::operator delete[]( void* obj ) {
+ gc::operator delete( obj );}
+
+#endif /* OPERATOR_NEW_ARRAY */
+
+
+inline gc_cleanup::~gc_cleanup() {
+ GC_REGISTER_FINALIZER_IGNORE_SELF( this, 0, 0, 0, 0 );}
+
+inline void gc_cleanup::cleanup( void* obj, void* displ ) {
+ ((gc_cleanup*) ((char*) obj + (ptrdiff_t) displ))->~gc_cleanup();}
+
+inline gc_cleanup::gc_cleanup() {
+ GC_finalization_proc oldProc;
+ void* oldData;
+ void* base = GC_base( (void *) this );
+ if (0 == base) return;
+ GC_REGISTER_FINALIZER_IGNORE_SELF(
+ base, cleanup, (void*) ((char*) this - (char*) base),
+ &oldProc, &oldData );
+ if (0 != oldProc) {
+ GC_REGISTER_FINALIZER_IGNORE_SELF( base, oldProc, oldData, 0, 0 );}}
+
+inline void* operator new(
+ size_t size,
+ GCPlacement gcp,
+ GCCleanUpFunc cleanup,
+ void* clientData )
+{
+ void* obj;
+
+ if (gcp == GC) {
+ obj = GC_MALLOC( size );
+ if (cleanup != 0)
+ GC_REGISTER_FINALIZER_IGNORE_SELF(
+ obj, cleanup, clientData, 0, 0 );}
+ else if (gcp == PointerFreeGC) {
+ obj = GC_MALLOC_ATOMIC( size );}
+ else {
+ obj = GC_MALLOC_UNCOLLECTABLE( size );};
+ return obj;}
+
+
+#ifdef OPERATOR_NEW_ARRAY
+
+inline void* operator new[](
+ size_t size,
+ GCPlacement gcp,
+ GCCleanUpFunc cleanup,
+ void* clientData )
+{
+ return ::operator new( size, gcp, cleanup, clientData );}
+
+#endif /* OPERATOR_NEW_ARRAY */
+
+
+#endif /* GC_CPP_H */
+
diff --git a/boehm-gc/include/gc_inl.h b/boehm-gc/include/gc_inl.h
new file mode 100644
index 00000000000..700843bbf96
--- /dev/null
+++ b/boehm-gc/include/gc_inl.h
@@ -0,0 +1,103 @@
+/*
+ * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+ * Copyright (c) 1991-1995 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+/* Boehm, October 3, 1995 2:07 pm PDT */
+
+# ifndef GC_PRIVATE_H
+# include "private/gc_priv.h"
+# endif
+
+/* USE OF THIS FILE IS NOT RECOMMENDED unless the collector has been */
+/* compiled without -DALL_INTERIOR_POINTERS or with */
+/* -DDONT_ADD_BYTE_AT_END, or the specified size includes a pointerfree */
+/* word at the end. In the standard collector configuration, */
+/* the final word of each object may not be scanned. */
+/* This is most useful for compilers that generate C. */
+/* Manual use is hereby discouraged. */
+
+/* Allocate n words (NOT BYTES). X is made to point to the result. */
+/* It is assumed that n < MAXOBJSZ, and */
+/* that n > 0. On machines requiring double word alignment of some */
+/* data, we also assume that n is 1 or even. This bypasses the */
+/* MERGE_SIZES mechanism. In order to minimize the number of distinct */
+/* free lists that are maintained, the caller should ensure that a */
+/* small number of distinct values of n are used. (The MERGE_SIZES */
+/* mechanism normally does this by ensuring that only the leading three */
+/* bits of n may be nonzero. See misc.c for details.) We really */
+/* recommend this only in cases in which n is a constant, and no */
+/* locking is required. */
+/* In that case it may allow the compiler to perform substantial */
+/* additional optimizations. */
+# define GC_MALLOC_WORDS(result,n) \
+{ \
+ register ptr_t op; \
+ register ptr_t *opp; \
+ DCL_LOCK_STATE; \
+ \
+ opp = &(GC_objfreelist[n]); \
+ FASTLOCK(); \
+ if( !FASTLOCK_SUCCEEDED() || (op = *opp) == 0 ) { \
+ FASTUNLOCK(); \
+ (result) = GC_generic_malloc_words_small((n), NORMAL); \
+ } else { \
+ *opp = obj_link(op); \
+ obj_link(op) = 0; \
+ GC_words_allocd += (n); \
+ FASTUNLOCK(); \
+ (result) = (GC_PTR) op; \
+ } \
+}
+
+
+/* The same for atomic objects: */
+# define GC_MALLOC_ATOMIC_WORDS(result,n) \
+{ \
+ register ptr_t op; \
+ register ptr_t *opp; \
+ DCL_LOCK_STATE; \
+ \
+ opp = &(GC_aobjfreelist[n]); \
+ FASTLOCK(); \
+ if( !FASTLOCK_SUCCEEDED() || (op = *opp) == 0 ) { \
+ FASTUNLOCK(); \
+ (result) = GC_generic_malloc_words_small((n), PTRFREE); \
+ } else { \
+ *opp = obj_link(op); \
+ obj_link(op) = 0; \
+ GC_words_allocd += (n); \
+ FASTUNLOCK(); \
+ (result) = (GC_PTR) op; \
+ } \
+}
+
+/* And once more for two word initialized objects: */
+# define GC_CONS(result, first, second) \
+{ \
+ register ptr_t op; \
+ register ptr_t *opp; \
+ DCL_LOCK_STATE; \
+ \
+ opp = &(GC_objfreelist[2]); \
+ FASTLOCK(); \
+ if( !FASTLOCK_SUCCEEDED() || (op = *opp) == 0 ) { \
+ FASTUNLOCK(); \
+ op = GC_generic_malloc_words_small(2, NORMAL); \
+ } else { \
+ *opp = obj_link(op); \
+ GC_words_allocd += 2; \
+ FASTUNLOCK(); \
+ } \
+ ((word *)op)[0] = (word)(first); \
+ ((word *)op)[1] = (word)(second); \
+ (result) = (GC_PTR) op; \
+}
diff --git a/boehm-gc/include/gc_inline.h b/boehm-gc/include/gc_inline.h
new file mode 100644
index 00000000000..db62d1d58a8
--- /dev/null
+++ b/boehm-gc/include/gc_inline.h
@@ -0,0 +1 @@
+# include "gc_inl.h"
diff --git a/boehm-gc/include/gc_typed.h b/boehm-gc/include/gc_typed.h
new file mode 100644
index 00000000000..e4a6b94756e
--- /dev/null
+++ b/boehm-gc/include/gc_typed.h
@@ -0,0 +1,91 @@
+/*
+ * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright 1996 Silicon Graphics. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+/*
+ * Some simple primitives for allocation with explicit type information.
+ * Facilities for dynamic type inference may be added later.
+ * Should be used only for extremely performance critical applications,
+ * or if conservative collector leakage is otherwise a problem (unlikely).
+ * Note that this is implemented completely separately from the rest
+ * of the collector, and is not linked in unless referenced.
+ * This does not currently support GC_DEBUG in any interesting way.
+ */
+/* Boehm, May 19, 1994 2:13 pm PDT */
+
+#ifndef _GC_TYPED_H
+# define _GC_TYPED_H
+# ifndef _GC_H
+# include "gc.h"
+# endif
+
+typedef GC_word * GC_bitmap;
+ /* The least significant bit of the first word is one if */
+ /* the first word in the object may be a pointer. */
+
+# define GC_get_bit(bm, index) \
+ (((bm)[divWORDSZ(index)] >> modWORDSZ(index)) & 1)
+# define GC_set_bit(bm, index) \
+ (bm)[divWORDSZ(index)] |= (word)1 << modWORDSZ(index)
+
+typedef GC_word GC_descr;
+
+GC_API GC_descr GC_make_descriptor GC_PROTO((GC_bitmap bm, size_t len));
+ /* Return a type descriptor for the object whose layout */
+ /* is described by the argument. */
+ /* The least significant bit of the first word is one */
+ /* if the first word in the object may be a pointer. */
+ /* The second argument specifies the number of */
+ /* meaningful bits in the bitmap. The actual object */
+ /* may be larger (but not smaller). Any additional */
+ /* words in the object are assumed not to contain */
+ /* pointers. */
+ /* Returns a conservative approximation in the */
+ /* (unlikely) case of insufficient memory to build */
+ /* the descriptor. Calls to GC_make_descriptor */
+ /* may consume some amount of a finite resource. This */
+ /* is intended to be called once per type, not once */
+ /* per allocation. */
+
+GC_API GC_PTR GC_malloc_explicitly_typed
+ GC_PROTO((size_t size_in_bytes, GC_descr d));
+ /* Allocate an object whose layout is described by d. */
+ /* The resulting object MAY NOT BE PASSED TO REALLOC. */
+
+GC_API GC_PTR GC_malloc_explicitly_typed_ignore_off_page
+ GC_PROTO((size_t size_in_bytes, GC_descr d));
+
+GC_API GC_PTR GC_calloc_explicitly_typed
+ GC_PROTO((size_t nelements,
+ size_t element_size_in_bytes,
+ GC_descr d));
+ /* Allocate an array of nelements elements, each of the */
+ /* given size, and with the given descriptor. */
+ /* The elemnt size must be a multiple of the byte */
+ /* alignment required for pointers. E.g. on a 32-bit */
+ /* machine with 16-bit aligned pointers, size_in_bytes */
+ /* must be a multiple of 2. */
+
+#ifdef GC_DEBUG
+# define GC_MALLOC_EXPLICTLY_TYPED(bytes, d) GC_MALLOC(bytes)
+# define GC_CALLOC_EXPLICTLY_TYPED(n, bytes, d) GC_MALLOC(n*bytes)
+#else
+# define GC_MALLOC_EXPLICTLY_TYPED(bytes, d) \
+ GC_malloc_explicitly_typed(bytes, d)
+# define GC_CALLOC_EXPLICTLY_TYPED(n, bytes, d) \
+ GC_calloc_explicitly_typed(n, bytes, d)
+#endif /* !GC_DEBUG */
+
+
+#endif /* _GC_TYPED_H */
+
diff --git a/boehm-gc/include/private/config.h b/boehm-gc/include/private/config.h
new file mode 100644
index 00000000000..fc8004cebe5
--- /dev/null
+++ b/boehm-gc/include/private/config.h
@@ -0,0 +1,965 @@
+/*
+ * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996 by Silicon Graphics. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+#ifndef CONFIG_H
+
+# define CONFIG_H
+
+/* Machine dependent parameters. Some tuning parameters can be found */
+/* near the top of gc_private.h. */
+
+/* Machine specific parts contributed by various people. See README file. */
+
+/* Determine the machine type: */
+# if defined(sun) && defined(mc68000)
+# define M68K
+# define SUNOS4
+# define mach_type_known
+# endif
+# if defined(hp9000s300)
+# define M68K
+# define HP
+# define mach_type_known
+# endif
+# if defined(__NetBSD__) && defined(m68k)
+# define M68K
+# define NETBSD
+# define mach_type_known
+# endif
+# if defined(vax)
+# define VAX
+# ifdef ultrix
+# define ULTRIX
+# else
+# define BSD
+# endif
+# define mach_type_known
+# endif
+# if defined(mips) || defined(__mips)
+# define MIPS
+# if defined(ultrix) || defined(__ultrix) || defined(__NetBSD__)
+# define ULTRIX
+# else
+# if defined(_SYSTYPE_SVR4) || defined(SYSTYPE_SVR4) || defined(__SYSTYPE_SVR4__)
+# define IRIX5 /* or IRIX 6.X */
+# else
+# define RISCOS /* or IRIX 4.X */
+# endif
+# endif
+# define mach_type_known
+# endif
+# if defined(sequent) && defined(i386)
+# define I386
+# define SEQUENT
+# define mach_type_known
+# endif
+# if defined(sun) && defined(i386)
+# define I386
+# define SUNOS5
+# define mach_type_known
+# endif
+# if (defined(__OS2__) || defined(__EMX__)) && defined(__32BIT__)
+# define I386
+# define OS2
+# define mach_type_known
+# endif
+# if defined(ibm032)
+# define RT
+# define mach_type_known
+# endif
+# if defined(sun) && (defined(sparc) || defined(__sparc))
+# define SPARC
+ /* Test for SunOS 5.x */
+# include <errno.h>
+# ifdef ECHRNG
+# define SUNOS5
+# else
+# define SUNOS4
+# endif
+# define mach_type_known
+# endif
+# if defined(sparc) && defined(unix) && !defined(sun)
+# define SPARC
+# define DRSNX
+# define mach_type_known
+# endif
+# if defined(_IBMR2)
+# define RS6000
+# define mach_type_known
+# endif
+# if defined(_M_XENIX) && defined(_M_SYSV) && defined(_M_I386)
+ /* The above test may need refinement */
+# define I386
+# if defined(_SCO_ELF)
+# define SCO_ELF
+# else
+# define SCO
+# endif
+# define mach_type_known
+# endif
+# if defined(_AUX_SOURCE)
+# define M68K
+# define SYSV
+# define mach_type_known
+# endif
+# if defined(_PA_RISC1_0) || defined(_PA_RISC1_1)
+# define HP_PA
+# define mach_type_known
+# endif
+# if defined(linux) && defined(i386)
+# define I386
+# define LINUX
+# define mach_type_known
+# endif
+# if defined(linux) && defined(powerpc)
+# define POWERPC
+# define LINUX
+# define mach_type_known
+# endif
+# if defined(__alpha) || defined(__alpha__)
+# define ALPHA
+# if defined(linux) || defined(__linux__)
+# define LINUX
+# else
+# define OSF1 /* a.k.a Digital Unix */
+# endif
+# define mach_type_known
+# endif
+# if defined(_AMIGA)
+# define M68K
+# define AMIGA
+# define mach_type_known
+# endif
+# if defined(THINK_C) || defined(__MWERKS__) && !defined(__powerc)
+# define M68K
+# define MACOS
+# define mach_type_known
+# endif
+# if defined(__MWERKS__) && defined(__powerc)
+# define POWERPC
+# define MACOS
+# define mach_type_known
+# endif
+# if defined(NeXT) && defined(mc68000)
+# define M68K
+# define NEXT
+# define mach_type_known
+# endif
+# if defined(NeXT) && defined(i386)
+# define I386
+# define NEXT
+# define mach_type_known
+# endif
+# if defined(__FreeBSD__) && defined(i386)
+# define I386
+# define FREEBSD
+# define mach_type_known
+# endif
+# if defined(__NetBSD__) && defined(i386)
+# define I386
+# define NETBSD
+# define mach_type_known
+# endif
+# if defined(bsdi) && defined(i386)
+# define I386
+# define BSDI
+# define mach_type_known
+# endif
+# if !defined(mach_type_known) && defined(__386BSD__)
+# define I386
+# define THREE86BSD
+# define mach_type_known
+# endif
+# if defined(_CX_UX) && defined(_M88K)
+# define M88K
+# define CX_UX
+# define mach_type_known
+# endif
+# if defined(DGUX)
+# define M88K
+ /* DGUX defined */
+# define mach_type_known
+# endif
+# if (defined(_MSDOS) || defined(_MSC_VER)) && (_M_IX86 >= 300)
+# define I386
+# define MSWIN32 /* or Win32s */
+# define mach_type_known
+# endif
+# if defined(__DJGPP__)
+# define I386
+# ifndef DJGPP
+# define DJGPP /* MSDOS running the DJGPP port of GCC */
+# endif
+# define mach_type_known
+# endif
+# if defined(__CYGWIN32__)
+# define I386
+# define CYGWIN32
+# define mach_type_known
+# endif
+# if defined(__BORLANDC__)
+# define I386
+# define MSWIN32
+# define mach_type_known
+# endif
+# if defined(_UTS) && !defined(mach_type_known)
+# define S370
+# define UTS4
+# define mach_type_known
+# endif
+/* Ivan Demakov */
+# if defined(__WATCOMC__) && defined(__386__)
+# define I386
+# if !defined(OS2) && !defined(MSWIN32) && !defined(DOS4GW)
+# if defined(__OS2__)
+# define OS2
+# else
+# if defined(__WINDOWS_386__) || defined(__NT__)
+# define MSWIN32
+# else
+# define DOS4GW
+# endif
+# endif
+# endif
+# define mach_type_known
+# endif
+
+/* Feel free to add more clauses here */
+
+/* Or manually define the machine type here. A machine type is */
+/* characterized by the architecture. Some */
+/* machine types are further subdivided by OS. */
+/* the macros ULTRIX, RISCOS, and BSD to distinguish. */
+/* Note that SGI IRIX is treated identically to RISCOS. */
+/* SYSV on an M68K actually means A/UX. */
+/* The distinction in these cases is usually the stack starting address */
+# ifndef mach_type_known
+ --> unknown machine type
+# endif
+ /* Mapping is: M68K ==> Motorola 680X0 */
+ /* (SUNOS4,HP,NEXT, and SYSV (A/UX), */
+ /* MACOS and AMIGA variants) */
+ /* I386 ==> Intel 386 */
+ /* (SEQUENT, OS2, SCO, LINUX, NETBSD, */
+ /* FREEBSD, THREE86BSD, MSWIN32, */
+ /* BSDI, SUNOS5, NEXT variants) */
+ /* NS32K ==> Encore Multimax */
+ /* MIPS ==> R2000 or R3000 */
+ /* (RISCOS, ULTRIX variants) */
+ /* VAX ==> DEC VAX */
+ /* (BSD, ULTRIX variants) */
+ /* RS6000 ==> IBM RS/6000 AIX3.X */
+ /* RT ==> IBM PC/RT */
+ /* HP_PA ==> HP9000/700 & /800 */
+ /* HP/UX */
+ /* SPARC ==> SPARC under SunOS */
+ /* (SUNOS4, SUNOS5, */
+ /* DRSNX variants) */
+ /* ALPHA ==> DEC Alpha */
+ /* (OSF1 and LINUX variants) */
+ /* M88K ==> Motorola 88XX0 */
+ /* (CX_UX and DGUX) */
+ /* S370 ==> 370-like machine */
+ /* running Amdahl UTS4 */
+
+
+/*
+ * For each architecture and OS, the following need to be defined:
+ *
+ * CPP_WORD_SZ is a simple integer constant representing the word size.
+ * in bits. We assume byte addressibility, where a byte has 8 bits.
+ * We also assume CPP_WORD_SZ is either 32 or 64.
+ * (We care about the length of pointers, not hardware
+ * bus widths. Thus a 64 bit processor with a C compiler that uses
+ * 32 bit pointers should use CPP_WORD_SZ of 32, not 64. Default is 32.)
+ *
+ * MACH_TYPE is a string representation of the machine type.
+ * OS_TYPE is analogous for the OS.
+ *
+ * ALIGNMENT is the largest N, such that
+ * all pointer are guaranteed to be aligned on N byte boundaries.
+ * defining it to be 1 will always work, but perform poorly.
+ *
+ * DATASTART is the beginning of the data segment.
+ * On UNIX systems, the collector will scan the area between DATASTART
+ * and DATAEND for root pointers.
+ *
+ * DATAEND, if not &end.
+ *
+ * ALIGN_DOUBLE of GC_malloc should return blocks aligned to twice
+ * the pointer size.
+ *
+ * STACKBOTTOM is the cool end of the stack, which is usually the
+ * highest address in the stack.
+ * Under PCR or OS/2, we have other ways of finding thread stacks.
+ * For each machine, the following should:
+ * 1) define STACK_GROWS_UP if the stack grows toward higher addresses, and
+ * 2) define exactly one of
+ * STACKBOTTOM (should be defined to be an expression)
+ * HEURISTIC1
+ * HEURISTIC2
+ * If either of the last two macros are defined, then STACKBOTTOM is computed
+ * during collector startup using one of the following two heuristics:
+ * HEURISTIC1: Take an address inside GC_init's frame, and round it up to
+ * the next multiple of STACK_GRAN.
+ * HEURISTIC2: Take an address inside GC_init's frame, increment it repeatedly
+ * in small steps (decrement if STACK_GROWS_UP), and read the value
+ * at each location. Remember the value when the first
+ * Segmentation violation or Bus error is signalled. Round that
+ * to the nearest plausible page boundary, and use that instead
+ * of STACKBOTTOM.
+ *
+ * If no expression for STACKBOTTOM can be found, and neither of the above
+ * heuristics are usable, the collector can still be used with all of the above
+ * undefined, provided one of the following is done:
+ * 1) GC_mark_roots can be changed to somehow mark from the correct stack(s)
+ * without reference to STACKBOTTOM. This is appropriate for use in
+ * conjunction with thread packages, since there will be multiple stacks.
+ * (Allocating thread stacks in the heap, and treating them as ordinary
+ * heap data objects is also possible as a last resort. However, this is
+ * likely to introduce significant amounts of excess storage retention
+ * unless the dead parts of the thread stacks are periodically cleared.)
+ * 2) Client code may set GC_stackbottom before calling any GC_ routines.
+ * If the author of the client code controls the main program, this is
+ * easily accomplished by introducing a new main program, setting
+ * GC_stackbottom to the address of a local variable, and then calling
+ * the original main program. The new main program would read something
+ * like:
+ *
+ * # include "gc_private.h"
+ *
+ * main(argc, argv, envp)
+ * int argc;
+ * char **argv, **envp;
+ * {
+ * int dummy;
+ *
+ * GC_stackbottom = (ptr_t)(&dummy);
+ * return(real_main(argc, argv, envp));
+ * }
+ *
+ *
+ * Each architecture may also define the style of virtual dirty bit
+ * implementation to be used:
+ * MPROTECT_VDB: Write protect the heap and catch faults.
+ * PROC_VDB: Use the SVR4 /proc primitives to read dirty bits.
+ *
+ * An architecture may define DYNAMIC_LOADING if dynamic_load.c
+ * defined GC_register_dynamic_libraries() for the architecture.
+ */
+
+
+# define STACK_GRAN 0x1000000
+# ifdef M68K
+# define MACH_TYPE "M68K"
+# define ALIGNMENT 2
+# ifdef NETBSD
+# define OS_TYPE "NETBSD"
+# define HEURISTIC2
+ extern char etext;
+# define DATASTART ((ptr_t)(&etext))
+# endif
+# ifdef SUNOS4
+# define OS_TYPE "SUNOS4"
+ extern char etext;
+# define DATASTART ((ptr_t)((((word) (&etext)) + 0x1ffff) & ~0x1ffff))
+# define HEURISTIC1 /* differs */
+# define DYNAMIC_LOADING
+# endif
+# ifdef HP
+# define OS_TYPE "HP"
+ extern char etext;
+# define DATASTART ((ptr_t)((((word) (&etext)) + 0xfff) & ~0xfff))
+# define STACKBOTTOM ((ptr_t) 0xffeffffc)
+ /* empirically determined. seems to work. */
+# include <unistd.h>
+# define GETPAGESIZE() sysconf(_SC_PAGE_SIZE)
+# endif
+# ifdef SYSV
+# define OS_TYPE "SYSV"
+ extern etext;
+# define DATASTART ((ptr_t)((((word) (&etext)) + 0x3fffff) \
+ & ~0x3fffff) \
+ +((word)&etext & 0x1fff))
+ /* This only works for shared-text binaries with magic number 0413.
+ The other sorts of SysV binaries put the data at the end of the text,
+ in which case the default of &etext would work. Unfortunately,
+ handling both would require having the magic-number available.
+ -- Parag
+ */
+# define STACKBOTTOM ((ptr_t)0xFFFFFFFE)
+ /* The stack starts at the top of memory, but */
+ /* 0x0 cannot be used as setjump_test complains */
+ /* that the stack direction is incorrect. Two */
+ /* bytes down from 0x0 should be safe enough. */
+ /* --Parag */
+# include <sys/mmu.h>
+# define GETPAGESIZE() PAGESIZE /* Is this still right? */
+# endif
+# ifdef AMIGA
+# define OS_TYPE "AMIGA"
+ /* STACKBOTTOM and DATASTART handled specially */
+ /* in os_dep.c */
+# define DATAEND /* not needed */
+# define GETPAGESIZE() 4096
+# endif
+# ifdef MACOS
+# ifndef __LOWMEM__
+# include <LowMem.h>
+# endif
+# define OS_TYPE "MACOS"
+ /* see os_dep.c for details of global data segments. */
+# define STACKBOTTOM ((ptr_t) LMGetCurStackBase())
+# define DATAEND /* not needed */
+# define GETPAGESIZE() 4096
+# endif
+# ifdef NEXT
+# define OS_TYPE "NEXT"
+# define DATASTART ((ptr_t) get_etext())
+# define STACKBOTTOM ((ptr_t) 0x4000000)
+# define DATAEND /* not needed */
+# endif
+# endif
+
+# ifdef POWERPC
+# define MACH_TYPE "POWERPC"
+# define ALIGNMENT 2
+# ifdef MACOS
+# ifndef __LOWMEM__
+# include <LowMem.h>
+# endif
+# define OS_TYPE "MACOS"
+ /* see os_dep.c for details of global data segments. */
+# define STACKBOTTOM ((ptr_t) LMGetCurStackBase())
+# define DATAEND /* not needed */
+# endif
+# ifdef LINUX
+# define OS_TYPE "LINUX"
+# define STACKBOTTOM ((ptr_t)0x80000000)
+# define DATASTART GC_data_start
+ extern int _end;
+# define DATAEND (&_end)
+# endif
+# endif
+
+# ifdef VAX
+# define MACH_TYPE "VAX"
+# define ALIGNMENT 4 /* Pointers are longword aligned by 4.2 C compiler */
+ extern char etext;
+# define DATASTART ((ptr_t)(&etext))
+# ifdef BSD
+# define OS_TYPE "BSD"
+# define HEURISTIC1
+ /* HEURISTIC2 may be OK, but it's hard to test. */
+# endif
+# ifdef ULTRIX
+# define OS_TYPE "ULTRIX"
+# define STACKBOTTOM ((ptr_t) 0x7fffc800)
+# endif
+# endif
+
+# ifdef RT
+# define MACH_TYPE "RT"
+# define ALIGNMENT 4
+# define DATASTART ((ptr_t) 0x10000000)
+# define STACKBOTTOM ((ptr_t) 0x1fffd800)
+# endif
+
+# ifdef SPARC
+# define MACH_TYPE "SPARC"
+# define ALIGNMENT 4 /* Required by hardware */
+# define ALIGN_DOUBLE
+ extern int etext;
+# ifdef SUNOS5
+# define OS_TYPE "SUNOS5"
+ extern int _etext;
+ extern int _end;
+ extern char * GC_SysVGetDataStart();
+# define DATASTART (ptr_t)GC_SysVGetDataStart(0x10000, &_etext)
+# define DATAEND (&_end)
+# ifndef USE_MMAP
+# define USE_MMAP
+# endif
+# ifdef USE_MMAP
+# define HEAP_START (ptr_t)0x40000000
+# else
+# define HEAP_START DATAEND
+# endif
+# define PROC_VDB
+# define HEURISTIC1
+# include <unistd.h>
+# define GETPAGESIZE() sysconf(_SC_PAGESIZE)
+ /* getpagesize() appeared to be missing from at least one */
+ /* Solaris 5.4 installation. Weird. */
+# endif
+# ifdef SUNOS4
+# define OS_TYPE "SUNOS4"
+ /* [If you have a weak stomach, don't read this.] */
+ /* We would like to use: */
+/* # define DATASTART ((ptr_t)((((word) (&etext)) + 0x1fff) & ~0x1fff)) */
+ /* This fails occasionally, due to an ancient, but very */
+ /* persistent ld bug. &etext is set 32 bytes too high. */
+ /* We instead read the text segment size from the a.out */
+ /* header, which happens to be mapped into our address space */
+ /* at the start of the text segment. The detective work here */
+ /* was done by Robert Ehrlich, Manuel Serrano, and Bernard */
+ /* Serpette of INRIA. */
+ /* This assumes ZMAGIC, i.e. demand-loadable executables. */
+# define TEXTSTART 0x2000
+# define DATASTART ((ptr_t)(*(int *)(TEXTSTART+0x4)+TEXTSTART))
+# define MPROTECT_VDB
+# define HEURISTIC1
+# endif
+# ifdef DRSNX
+# define CPP_WORDSZ 32
+# define OS_TYPE "DRSNX"
+ extern char * GC_SysVGetDataStart();
+ extern int etext;
+# define DATASTART (ptr_t)GC_SysVGetDataStart(0x10000, &etext)
+# define MPROTECT_VDB
+# define STACKBOTTOM ((ptr_t) 0xdfff0000)
+# endif
+# define DYNAMIC_LOADING
+# endif
+
+# ifdef I386
+# define MACH_TYPE "I386"
+# define ALIGNMENT 4 /* Appears to hold for all "32 bit" compilers */
+ /* except Borland. The -a4 option fixes */
+ /* Borland. */
+ /* Ivan Demakov: For Watcom the option is -zp4. */
+# ifndef SMALL_CONFIG
+# define ALIGN_DOUBLE /* Not strictly necessary, but may give speed */
+ /* improvement on Pentiums. */
+# endif
+# ifdef SEQUENT
+# define OS_TYPE "SEQUENT"
+ extern int etext;
+# define DATASTART ((ptr_t)((((word) (&etext)) + 0xfff) & ~0xfff))
+# define STACKBOTTOM ((ptr_t) 0x3ffff000)
+# endif
+# ifdef SUNOS5
+# define OS_TYPE "SUNOS5"
+ extern int etext, _start;
+ extern char * GC_SysVGetDataStart();
+# define DATASTART GC_SysVGetDataStart(0x1000, &etext)
+# define STACKBOTTOM ((ptr_t)(&_start))
+/** At least in Solaris 2.5, PROC_VDB gives wrong values for dirty bits. */
+/*# define PROC_VDB*/
+# define DYNAMIC_LOADING
+# ifndef USE_MMAP
+# define USE_MMAP
+# endif
+# ifdef USE_MMAP
+# define HEAP_START (ptr_t)0x40000000
+# else
+# define HEAP_START DATAEND
+# endif
+# endif
+# ifdef SCO
+# define OS_TYPE "SCO"
+ extern int etext;
+# define DATASTART ((ptr_t)((((word) (&etext)) + 0x3fffff) \
+ & ~0x3fffff) \
+ +((word)&etext & 0xfff))
+# define STACKBOTTOM ((ptr_t) 0x7ffffffc)
+# endif
+# ifdef SCO_ELF
+# define OS_TYPE "SCO_ELF"
+ extern int etext;
+# define DATASTART ((ptr_t)(&etext))
+# define STACKBOTTOM ((ptr_t) 0x08048000)
+# define DYNAMIC_LOADING
+# define ELF_CLASS ELFCLASS32
+# endif
+# ifdef LINUX
+# define OS_TYPE "LINUX"
+# define STACKBOTTOM ((ptr_t)0xc0000000)
+ /* Appears to be 0xe0000000 for at least one 2.1.91 kernel. */
+ /* Probably needs to be more flexible, but I don't yet */
+ /* fully understand how flexible. */
+# define MPROTECT_VDB
+# ifdef __ELF__
+# define DYNAMIC_LOADING
+# ifdef UNDEFINED /* includes ro data */
+ extern int _etext;
+# define DATASTART ((ptr_t)((((word) (&_etext)) + 0xfff) & ~0xfff))
+# endif
+# include <linux/version.h>
+# include <features.h>
+# if LINUX_VERSION_CODE >= 0x20000 && defined(__GLIBC__) && __GLIBC__ >= 2
+ extern int __data_start;
+# define DATASTART ((ptr_t)(&__data_start))
+# else
+ extern char **__environ;
+# define DATASTART ((ptr_t)(&__environ))
+ /* hideous kludge: __environ is the first */
+ /* word in crt0.o, and delimits the start */
+ /* of the data segment, no matter which */
+ /* ld options were passed through. */
+ /* We could use _etext instead, but that */
+ /* would include .rodata, which may */
+ /* contain large read-only data tables */
+ /* that we'd rather not scan. */
+# endif
+ extern int _end;
+# define DATAEND (&_end)
+# else
+ extern int etext;
+# define DATASTART ((ptr_t)((((word) (&etext)) + 0xfff) & ~0xfff))
+# endif
+# endif
+# ifdef CYGWIN32
+ extern int _data_start__;
+ extern int _data_end__;
+ extern int _bss_start__;
+ extern int _bss_end__;
+ /* For binutils 2.9.1, we have */
+ /* DATASTART = _data_start__ */
+ /* DATAEND = _bss_end__ */
+ /* whereas for some earlier versions it was */
+ /* DATASTART = _bss_start__ */
+ /* DATAEND = _data_end__ */
+ /* To get it right for both, we take the */
+ /* minumum/maximum of the two. */
+# define MAX(x,y) ((x) > (y) ? (x) : (y))
+# define MIN(x,y) ((x) < (y) ? (x) : (y))
+# define DATASTART ((ptr_t) MIN(_data_start__, _bss_start__))
+# define DATAEND ((ptr_t) MAX(_data_end__, _bss_end__))
+# undef STACK_GRAN
+# define STACK_GRAN 0x10000
+# define HEURISTIC1
+# endif
+# ifdef OS2
+# define OS_TYPE "OS2"
+ /* STACKBOTTOM and DATASTART are handled specially in */
+ /* os_dep.c. OS2 actually has the right */
+ /* system call! */
+# define DATAEND /* not needed */
+# endif
+# ifdef MSWIN32
+# define OS_TYPE "MSWIN32"
+ /* STACKBOTTOM and DATASTART are handled specially in */
+ /* os_dep.c. */
+# ifndef __WATCOMC__
+# define MPROTECT_VDB
+# endif
+# define DATAEND /* not needed */
+# endif
+# ifdef DJGPP
+# define OS_TYPE "DJGPP"
+# include "stubinfo.h"
+ extern int etext;
+ extern int _stklen;
+# define DATASTART ((ptr_t)((((word) (&etext)) + 0x1ff) & ~0x1ff))
+# define STACKBOTTOM ((ptr_t)((word) _stubinfo + _stubinfo->size \
+ + _stklen))
+ /* This may not be right. */
+# endif
+# ifdef FREEBSD
+# define OS_TYPE "FREEBSD"
+# define MPROTECT_VDB
+# endif
+# ifdef NETBSD
+# define OS_TYPE "NETBSD"
+# endif
+# ifdef THREE86BSD
+# define OS_TYPE "THREE86BSD"
+# endif
+# ifdef BSDI
+# define OS_TYPE "BSDI"
+# endif
+# if defined(FREEBSD) || defined(NETBSD) \
+ || defined(THREE86BSD) || defined(BSDI)
+# define HEURISTIC2
+ extern char etext;
+# define DATASTART ((ptr_t)(&etext))
+# endif
+# ifdef NEXT
+# define OS_TYPE "NEXT"
+# define DATASTART ((ptr_t) get_etext())
+# define STACKBOTTOM ((ptr_t)0xc0000000)
+# define DATAEND /* not needed */
+# endif
+# ifdef DOS4GW
+# define OS_TYPE "DOS4GW"
+ /* Get_DATASTART, Get_DATAEND, Get_STACKBOTTOM
+ * Defined in gc-watcom.asm
+ */
+ extern char* Get_DATASTART (void);
+ extern char* Get_DATAEND (void);
+ extern char* Get_STACKBOTTOM (void);
+# pragma aux Get_DATASTART "*" value [eax];
+# pragma aux Get_DATAEND "*" value [eax];
+# pragma aux Get_STACKBOTTOM "*" value [eax];
+# define DATASTART ((ptr_t) Get_DATASTART())
+# define STACKBOTTOM ((ptr_t) Get_STACKBOTTOM())
+# define DATAEND ((ptr_t) Get_DATAEND())
+# endif
+# endif
+
+# ifdef NS32K
+# define MACH_TYPE "NS32K"
+# define ALIGNMENT 4
+ extern char **environ;
+# define DATASTART ((ptr_t)(&environ))
+ /* hideous kludge: environ is the first */
+ /* word in crt0.o, and delimits the start */
+ /* of the data segment, no matter which */
+ /* ld options were passed through. */
+# define STACKBOTTOM ((ptr_t) 0xfffff000) /* for Encore */
+# endif
+
+# ifdef MIPS
+# define MACH_TYPE "MIPS"
+# ifndef IRIX5
+# define DATASTART (ptr_t)0x10000000
+ /* Could probably be slightly higher since */
+ /* startup code allocates lots of stuff. */
+# else
+ extern int _fdata;
+# define DATASTART ((ptr_t)(&_fdata))
+# ifdef USE_MMAP
+# define HEAP_START (ptr_t)0x30000000
+# else
+# define HEAP_START DATASTART
+# endif
+ /* Lowest plausible heap address. */
+ /* In the MMAP case, we map there. */
+ /* In either case it is used to identify */
+ /* heap sections so they're not */
+ /* considered as roots. */
+# endif /* IRIX5 */
+# define HEURISTIC2
+/* # define STACKBOTTOM ((ptr_t)0x7fff8000) sometimes also works. */
+# ifdef ULTRIX
+# define OS_TYPE "ULTRIX"
+# define ALIGNMENT 4
+# endif
+# ifdef RISCOS
+# define OS_TYPE "RISCOS"
+# define ALIGNMENT 4 /* Required by hardware */
+# endif
+# ifdef IRIX5
+# define OS_TYPE "IRIX5"
+# define MPROTECT_VDB
+# ifdef _MIPS_SZPTR
+# define CPP_WORDSZ _MIPS_SZPTR
+# define ALIGNMENT (_MIPS_SZPTR/8)
+# if CPP_WORDSZ != 64
+# define ALIGN_DOUBLE
+# endif
+# else
+# define ALIGNMENT 4
+# define ALIGN_DOUBLE
+# endif
+# define DYNAMIC_LOADING
+# endif
+# endif
+
+# ifdef RS6000
+# define MACH_TYPE "RS6000"
+# define ALIGNMENT 4
+# define DATASTART ((ptr_t)0x20000000)
+ extern int errno;
+# define STACKBOTTOM ((ptr_t)((ulong)&errno))
+# define DYNAMIC_LOADING
+ /* For really old versions of AIX, this may have to be removed. */
+# endif
+
+# ifdef HP_PA
+# define MACH_TYPE "HP_PA"
+# define ALIGNMENT 4
+# define ALIGN_DOUBLE
+ extern int __data_start;
+# define DATASTART ((ptr_t)(&__data_start))
+# if 0
+ /* The following appears to work for 7xx systems running HP/UX */
+ /* 9.xx Furthermore, it might result in much faster */
+ /* collections than HEURISTIC2, which may involve scanning */
+ /* segments that directly precede the stack. It is not the */
+ /* default, since it may not work on older machine/OS */
+ /* combinations. (Thanks to Raymond X.T. Nijssen for uncovering */
+ /* this.) */
+# define STACKBOTTOM ((ptr_t) 0x7b033000) /* from /etc/conf/h/param.h */
+# else
+# define HEURISTIC2
+# endif
+# define STACK_GROWS_UP
+# define DYNAMIC_LOADING
+# include <unistd.h>
+# define GETPAGESIZE() sysconf(_SC_PAGE_SIZE)
+ /* They misspelled the Posix macro? */
+# endif
+
+# ifdef ALPHA
+# define MACH_TYPE "ALPHA"
+# define ALIGNMENT 8
+# ifdef OSF1
+# define OS_TYPE "OSF1"
+# define DATASTART ((ptr_t) 0x140000000)
+# define HEURISTIC2
+ /* Normally HEURISTIC2 is too conervative, since */
+ /* the text segment immediately follows the stack. */
+ /* Hence we give an upper pound. */
+ extern __start;
+# define HEURISTIC2_LIMIT ((ptr_t)((word)(&__start) & ~(getpagesize()-1)))
+# define CPP_WORDSZ 64
+# define MPROTECT_VDB
+# define DYNAMIC_LOADING
+# endif
+# ifdef LINUX
+# define OS_TYPE "LINUX"
+# define CPP_WORDSZ 64
+# define STACKBOTTOM ((ptr_t) 0x120000000)
+# ifdef __ELF__
+ extern int __data_start;
+# define DATASTART &__data_start
+# define DYNAMIC_LOADING
+# else
+# define DATASTART ((ptr_t) 0x140000000)
+# endif
+ extern int _end;
+# define DATAEND (&_end)
+ /* As of 1.3.90, I couldn't find a way to retrieve the correct */
+ /* fault address from a signal handler. */
+ /* Hence MPROTECT_VDB is broken. */
+# endif
+# endif
+
+# ifdef M88K
+# define MACH_TYPE "M88K"
+# define ALIGNMENT 4
+# define ALIGN_DOUBLE
+ extern int etext;
+# ifdef CX_UX
+# define OS_TYPE "CX_UX"
+# define DATASTART ((((word)&etext + 0x3fffff) & ~0x3fffff) + 0x10000)
+# endif
+# ifdef DGUX
+# define OS_TYPE "DGUX"
+ extern char * GC_SysVGetDataStart();
+# define DATASTART (ptr_t)GC_SysVGetDataStart(0x10000, &etext)
+# endif
+# define STACKBOTTOM ((char*)0xf0000000) /* determined empirically */
+# endif
+
+# ifdef S370
+# define MACH_TYPE "S370"
+# define OS_TYPE "UTS4"
+# define ALIGNMENT 4 /* Required by hardware */
+ extern int etext;
+ extern int _etext;
+ extern int _end;
+ extern char * GC_SysVGetDataStart();
+# define DATASTART (ptr_t)GC_SysVGetDataStart(0x10000, &_etext)
+# define DATAEND (&_end)
+# define HEURISTIC2
+# endif
+
+# ifndef STACK_GROWS_UP
+# define STACK_GROWS_DOWN
+# endif
+
+# ifndef CPP_WORDSZ
+# define CPP_WORDSZ 32
+# endif
+
+# ifndef OS_TYPE
+# define OS_TYPE ""
+# endif
+
+# ifndef DATAEND
+ extern int end;
+# define DATAEND (&end)
+# endif
+
+# if defined(SVR4) && !defined(GETPAGESIZE)
+# include <unistd.h>
+# define GETPAGESIZE() sysconf(_SC_PAGESIZE)
+# endif
+
+# ifndef GETPAGESIZE
+# if defined(SUNOS5) || defined(IRIX5)
+# include <unistd.h>
+# endif
+# define GETPAGESIZE() getpagesize()
+# endif
+
+# if defined(SUNOS5) || defined(DRSNX) || defined(UTS4)
+ /* OS has SVR4 generic features. Probably others also qualify. */
+# define SVR4
+# endif
+
+# if defined(SUNOS5) || defined(DRSNX)
+ /* OS has SUNOS5 style semi-undocumented interface to dynamic */
+ /* loader. */
+# define SUNOS5DL
+ /* OS has SUNOS5 style signal handlers. */
+# define SUNOS5SIGS
+# endif
+
+# if CPP_WORDSZ != 32 && CPP_WORDSZ != 64
+ -> bad word size
+# endif
+
+# ifdef PCR
+# undef DYNAMIC_LOADING
+# undef STACKBOTTOM
+# undef HEURISTIC1
+# undef HEURISTIC2
+# undef PROC_VDB
+# undef MPROTECT_VDB
+# define PCR_VDB
+# endif
+
+# ifdef SRC_M3
+/* Postponed for now. */
+# undef PROC_VDB
+# undef MPROTECT_VDB
+# endif
+
+# ifdef SMALL_CONFIG
+/* Presumably not worth the space it takes. */
+# undef PROC_VDB
+# undef MPROTECT_VDB
+# endif
+
+# if !defined(PCR_VDB) && !defined(PROC_VDB) && !defined(MPROTECT_VDB)
+# define DEFAULT_VDB
+# endif
+
+# if defined(IRIX_THREADS) && !defined(IRIX5)
+--> inconsistent configuration
+# endif
+# if defined(LINUX_THREADS) && !defined(LINUX)
+--> inconsistent configuration
+# endif
+# if defined(SOLARIS_THREADS) && !defined(SUNOS5)
+--> inconsistent configuration
+# endif
+# if defined(PCR) || defined(SRC_M3) || \
+ defined(SOLARIS_THREADS) || defined(WIN32_THREADS) || \
+ defined(IRIX_THREADS) || defined(LINUX_THREADS)
+# define THREADS
+# endif
+
+# if defined(SPARC)
+# define SAVE_CALL_CHAIN
+# define ASM_CLEAR_CODE /* Stack clearing is crucial, and we */
+ /* include assembly code to do it well. */
+# endif
+
+# endif
diff --git a/boehm-gc/include/private/cord_pos.h b/boehm-gc/include/private/cord_pos.h
new file mode 100644
index 00000000000..d2b24bb8ab6
--- /dev/null
+++ b/boehm-gc/include/private/cord_pos.h
@@ -0,0 +1,118 @@
+/*
+ * Copyright (c) 1993-1994 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+/* Boehm, May 19, 1994 2:23 pm PDT */
+# ifndef CORD_POSITION_H
+
+/* The representation of CORD_position. This is private to the */
+/* implementation, but the size is known to clients. Also */
+/* the implementation of some exported macros relies on it. */
+/* Don't use anything defined here and not in cord.h. */
+
+# define MAX_DEPTH 48
+ /* The maximum depth of a balanced cord + 1. */
+ /* We don't let cords get deeper than MAX_DEPTH. */
+
+struct CORD_pe {
+ CORD pe_cord;
+ size_t pe_start_pos;
+};
+
+/* A structure describing an entry on the path from the root */
+/* to current position. */
+typedef struct CORD_Pos {
+ size_t cur_pos;
+ int path_len;
+# define CORD_POS_INVALID (0x55555555)
+ /* path_len == INVALID <==> position invalid */
+ const char *cur_leaf; /* Current leaf, if it is a string. */
+ /* If the current leaf is a function, */
+ /* then this may point to function_buf */
+ /* containing the next few characters. */
+ /* Always points to a valid string */
+ /* containing the current character */
+ /* unless cur_end is 0. */
+ size_t cur_start; /* Start position of cur_leaf */
+ size_t cur_end; /* Ending position of cur_leaf */
+ /* 0 if cur_leaf is invalid. */
+ struct CORD_pe path[MAX_DEPTH + 1];
+ /* path[path_len] is the leaf corresponding to cur_pos */
+ /* path[0].pe_cord is the cord we point to. */
+# define FUNCTION_BUF_SZ 8
+ char function_buf[FUNCTION_BUF_SZ]; /* Space for next few chars */
+ /* from function node. */
+} CORD_pos[1];
+
+/* Extract the cord from a position: */
+CORD CORD_pos_to_cord(CORD_pos p);
+
+/* Extract the current index from a position: */
+size_t CORD_pos_to_index(CORD_pos p);
+
+/* Fetch the character located at the given position: */
+char CORD_pos_fetch(CORD_pos p);
+
+/* Initialize the position to refer to the give cord and index. */
+/* Note that this is the most expensive function on positions: */
+void CORD_set_pos(CORD_pos p, CORD x, size_t i);
+
+/* Advance the position to the next character. */
+/* P must be initialized and valid. */
+/* Invalidates p if past end: */
+void CORD_next(CORD_pos p);
+
+/* Move the position to the preceding character. */
+/* P must be initialized and valid. */
+/* Invalidates p if past beginning: */
+void CORD_prev(CORD_pos p);
+
+/* Is the position valid, i.e. inside the cord? */
+int CORD_pos_valid(CORD_pos p);
+
+char CORD__pos_fetch(CORD_pos);
+void CORD__next(CORD_pos);
+void CORD__prev(CORD_pos);
+
+#define CORD_pos_fetch(p) \
+ (((p)[0].cur_end != 0)? \
+ (p)[0].cur_leaf[(p)[0].cur_pos - (p)[0].cur_start] \
+ : CORD__pos_fetch(p))
+
+#define CORD_next(p) \
+ (((p)[0].cur_pos + 1 < (p)[0].cur_end)? \
+ (p)[0].cur_pos++ \
+ : (CORD__next(p), 0))
+
+#define CORD_prev(p) \
+ (((p)[0].cur_end != 0 && (p)[0].cur_pos > (p)[0].cur_start)? \
+ (p)[0].cur_pos-- \
+ : (CORD__prev(p), 0))
+
+#define CORD_pos_to_index(p) ((p)[0].cur_pos)
+
+#define CORD_pos_to_cord(p) ((p)[0].path[0].pe_cord)
+
+#define CORD_pos_valid(p) ((p)[0].path_len != CORD_POS_INVALID)
+
+/* Some grubby stuff for performance-critical friends: */
+#define CORD_pos_chars_left(p) ((long)((p)[0].cur_end) - (long)((p)[0].cur_pos))
+ /* Number of characters in cache. <= 0 ==> none */
+
+#define CORD_pos_advance(p,n) ((p)[0].cur_pos += (n) - 1, CORD_next(p))
+ /* Advance position by n characters */
+ /* 0 < n < CORD_pos_chars_left(p) */
+
+#define CORD_pos_cur_char_addr(p) \
+ (p)[0].cur_leaf + ((p)[0].cur_pos - (p)[0].cur_start)
+ /* address of current character in cache. */
+
+#endif
diff --git a/boehm-gc/include/private/gc_hdrs.h b/boehm-gc/include/private/gc_hdrs.h
new file mode 100644
index 00000000000..2f2d1bf9b8a
--- /dev/null
+++ b/boehm-gc/include/private/gc_hdrs.h
@@ -0,0 +1,133 @@
+/*
+ * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+/* Boehm, July 11, 1995 11:54 am PDT */
+# ifndef GC_HEADERS_H
+# define GC_HEADERS_H
+typedef struct hblkhdr hdr;
+
+# if CPP_WORDSZ != 32 && CPP_WORDSZ < 36
+ --> Get a real machine.
+# endif
+
+/*
+ * The 2 level tree data structure that is used to find block headers.
+ * If there are more than 32 bits in a pointer, the top level is a hash
+ * table.
+ */
+
+# if CPP_WORDSZ > 32
+# define HASH_TL
+# endif
+
+/* Define appropriate out-degrees for each of the two tree levels */
+# ifdef SMALL_CONFIG
+# define LOG_BOTTOM_SZ 11
+ /* Keep top index size reasonable with smaller blocks. */
+# else
+# define LOG_BOTTOM_SZ 10
+# endif
+# ifndef HASH_TL
+# define LOG_TOP_SZ (WORDSZ - LOG_BOTTOM_SZ - LOG_HBLKSIZE)
+# else
+# define LOG_TOP_SZ 11
+# endif
+# define TOP_SZ (1 << LOG_TOP_SZ)
+# define BOTTOM_SZ (1 << LOG_BOTTOM_SZ)
+
+typedef struct bi {
+ hdr * index[BOTTOM_SZ];
+ /*
+ * The bottom level index contains one of three kinds of values:
+ * 0 means we're not responsible for this block.
+ * 1 < (long)X <= MAX_JUMP means the block starts at least
+ * X * HBLKSIZE bytes before the current address.
+ * A valid pointer points to a hdr structure. (The above can't be
+ * valid pointers due to the GET_MEM return convention.)
+ */
+ struct bi * asc_link; /* All indices are linked in */
+ /* ascending order. */
+ word key; /* high order address bits. */
+# ifdef HASH_TL
+ struct bi * hash_link; /* Hash chain link. */
+# endif
+} bottom_index;
+
+/* extern bottom_index GC_all_nils; - really part of GC_arrays */
+
+/* extern bottom_index * GC_top_index []; - really part of GC_arrays */
+ /* Each entry points to a bottom_index. */
+ /* On a 32 bit machine, it points to */
+ /* the index for a set of high order */
+ /* bits equal to the index. For longer */
+ /* addresses, we hash the high order */
+ /* bits to compute the index in */
+ /* GC_top_index, and each entry points */
+ /* to a hash chain. */
+ /* The last entry in each chain is */
+ /* GC_all_nils. */
+
+
+# define MAX_JUMP (HBLKSIZE - 1)
+
+# define HDR_FROM_BI(bi, p) \
+ ((bi)->index[((word)(p) >> LOG_HBLKSIZE) & (BOTTOM_SZ - 1)])
+# ifndef HASH_TL
+# define BI(p) (GC_top_index \
+ [(word)(p) >> (LOG_BOTTOM_SZ + LOG_HBLKSIZE)])
+# define HDR_INNER(p) HDR_FROM_BI(BI(p),p)
+# ifdef SMALL_CONFIG
+# define HDR(p) GC_find_header((ptr_t)(p))
+# else
+# define HDR(p) HDR_INNER(p)
+# endif
+# define GET_BI(p, bottom_indx) (bottom_indx) = BI(p)
+# define GET_HDR(p, hhdr) (hhdr) = HDR(p)
+# define SET_HDR(p, hhdr) HDR_INNER(p) = (hhdr)
+# define GET_HDR_ADDR(p, ha) (ha) = &(HDR_INNER(p))
+# else /* hash */
+/* Hash function for tree top level */
+# define TL_HASH(hi) ((hi) & (TOP_SZ - 1))
+/* Set bottom_indx to point to the bottom index for address p */
+# define GET_BI(p, bottom_indx) \
+ { \
+ register word hi = \
+ (word)(p) >> (LOG_BOTTOM_SZ + LOG_HBLKSIZE); \
+ register bottom_index * _bi = GC_top_index[TL_HASH(hi)]; \
+ \
+ while (_bi -> key != hi && _bi != GC_all_nils) \
+ _bi = _bi -> hash_link; \
+ (bottom_indx) = _bi; \
+ }
+# define GET_HDR_ADDR(p, ha) \
+ { \
+ register bottom_index * bi; \
+ \
+ GET_BI(p, bi); \
+ (ha) = &(HDR_FROM_BI(bi, p)); \
+ }
+# define GET_HDR(p, hhdr) { register hdr ** _ha; GET_HDR_ADDR(p, _ha); \
+ (hhdr) = *_ha; }
+# define SET_HDR(p, hhdr) { register hdr ** _ha; GET_HDR_ADDR(p, _ha); \
+ *_ha = (hhdr); }
+# define HDR(p) GC_find_header((ptr_t)(p))
+# endif
+
+/* Is the result a forwarding address to someplace closer to the */
+/* beginning of the block or NIL? */
+# define IS_FORWARDING_ADDR_OR_NIL(hhdr) ((unsigned long) (hhdr) <= MAX_JUMP)
+
+/* Get an HBLKSIZE aligned address closer to the beginning of the block */
+/* h. Assumes hhdr == HDR(h) and IS_FORWARDING_ADDR(hhdr). */
+# define FORWARDED_ADDR(h, hhdr) ((struct hblk *)(h) - (unsigned long)(hhdr))
+# endif /* GC_HEADERS_H */
diff --git a/boehm-gc/include/private/gc_priv.h b/boehm-gc/include/private/gc_priv.h
new file mode 100644
index 00000000000..96ba1da1044
--- /dev/null
+++ b/boehm-gc/include/private/gc_priv.h
@@ -0,0 +1,1561 @@
+/*
+ * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+/* Boehm, February 16, 1996 2:30 pm PST */
+
+
+# ifndef GC_PRIVATE_H
+# define GC_PRIVATE_H
+
+#if defined(mips) && defined(SYSTYPE_BSD) && defined(sony_news)
+ /* sony RISC NEWS, NEWSOS 4 */
+# define BSD_TIME
+/* typedef long ptrdiff_t; -- necessary on some really old systems */
+#endif
+
+#if defined(mips) && defined(SYSTYPE_BSD43)
+ /* MIPS RISCOS 4 */
+# define BSD_TIME
+#endif
+
+#ifdef BSD_TIME
+# include <sys/types.h>
+# include <sys/time.h>
+# include <sys/resource.h>
+#endif /* BSD_TIME */
+
+# ifndef GC_H
+# include "gc.h"
+# endif
+
+typedef GC_word word;
+typedef GC_signed_word signed_word;
+
+# ifndef CONFIG_H
+# include "config.h"
+# endif
+
+# ifndef HEADERS_H
+# include "gc_hdrs.h"
+# endif
+
+typedef int GC_bool;
+# define TRUE 1
+# define FALSE 0
+
+typedef char * ptr_t; /* A generic pointer to which we can add */
+ /* byte displacements. */
+ /* Preferably identical to caddr_t, if it */
+ /* exists. */
+
+#if defined(__STDC__)
+# include <stdlib.h>
+# if !(defined( sony_news ) )
+# include <stddef.h>
+# endif
+# define VOLATILE volatile
+# define CONST const
+#else
+# ifdef MSWIN32
+# include <stdlib.h>
+# endif
+# define VOLATILE
+# define CONST
+#endif
+
+#ifdef AMIGA
+# define GC_FAR __far
+#else
+# define GC_FAR
+#endif
+
+/*********************************/
+/* */
+/* Definitions for conservative */
+/* collector */
+/* */
+/*********************************/
+
+/*********************************/
+/* */
+/* Easily changeable parameters */
+/* */
+/*********************************/
+
+#define STUBBORN_ALLOC /* Define stubborn allocation primitives */
+#if defined(SRC_M3) || defined(SMALL_CONFIG)
+# undef STUBBORN_ALLOC
+#endif
+
+
+/* #define ALL_INTERIOR_POINTERS */
+ /* Forces all pointers into the interior of an */
+ /* object to be considered valid. Also causes the */
+ /* sizes of all objects to be inflated by at least */
+ /* one byte. This should suffice to guarantee */
+ /* that in the presence of a compiler that does */
+ /* not perform garbage-collector-unsafe */
+ /* optimizations, all portable, strictly ANSI */
+ /* conforming C programs should be safely usable */
+ /* with malloc replaced by GC_malloc and free */
+ /* calls removed. There are several disadvantages: */
+ /* 1. There are probably no interesting, portable, */
+ /* strictly ANSI conforming C programs. */
+ /* 2. This option makes it hard for the collector */
+ /* to allocate space that is not ``pointed to'' */
+ /* by integers, etc. Under SunOS 4.X with a */
+ /* statically linked libc, we empiricaly */
+ /* observed that it would be difficult to */
+ /* allocate individual objects larger than 100K. */
+ /* Even if only smaller objects are allocated, */
+ /* more swap space is likely to be needed. */
+ /* Fortunately, much of this will never be */
+ /* touched. */
+ /* If you can easily avoid using this option, do. */
+ /* If not, try to keep individual objects small. */
+
+#define PRINTSTATS /* Print garbage collection statistics */
+ /* For less verbose output, undefine in reclaim.c */
+
+#define PRINTTIMES /* Print the amount of time consumed by each garbage */
+ /* collection. */
+
+#define PRINTBLOCKS /* Print object sizes associated with heap blocks, */
+ /* whether the objects are atomic or composite, and */
+ /* whether or not the block was found to be empty */
+ /* during the reclaim phase. Typically generates */
+ /* about one screenful per garbage collection. */
+#undef PRINTBLOCKS
+
+#ifdef SILENT
+# ifdef PRINTSTATS
+# undef PRINTSTATS
+# endif
+# ifdef PRINTTIMES
+# undef PRINTTIMES
+# endif
+# ifdef PRINTNBLOCKS
+# undef PRINTNBLOCKS
+# endif
+#endif
+
+#if defined(PRINTSTATS) && !defined(GATHERSTATS)
+# define GATHERSTATS
+#endif
+
+#ifdef FINALIZE_ON_DEMAND
+# define GC_INVOKE_FINALIZERS()
+#else
+# define GC_INVOKE_FINALIZERS() (void)GC_invoke_finalizers()
+#endif
+
+#define MERGE_SIZES /* Round up some object sizes, so that fewer distinct */
+ /* free lists are actually maintained. This applies */
+ /* only to the top level routines in misc.c, not to */
+ /* user generated code that calls GC_allocobj and */
+ /* GC_allocaobj directly. */
+ /* Slows down average programs slightly. May however */
+ /* substantially reduce fragmentation if allocation */
+ /* request sizes are widely scattered. */
+ /* May save significant amounts of space for obj_map */
+ /* entries. */
+
+#ifndef OLD_BLOCK_ALLOC
+ /* Macros controlling large block allocation strategy. */
+# define EXACT_FIRST /* Make a complete pass through the large object */
+ /* free list before splitting a block */
+# define PRESERVE_LAST /* Do not divide last allocated heap segment */
+ /* unless we would otherwise need to expand the */
+ /* heap. */
+#endif
+
+/* ALIGN_DOUBLE requires MERGE_SIZES at present. */
+# if defined(ALIGN_DOUBLE) && !defined(MERGE_SIZES)
+# define MERGE_SIZES
+# endif
+
+#if defined(ALL_INTERIOR_POINTERS) && !defined(DONT_ADD_BYTE_AT_END)
+# define ADD_BYTE_AT_END
+#endif
+
+
+# ifndef LARGE_CONFIG
+# define MINHINCR 16 /* Minimum heap increment, in blocks of HBLKSIZE */
+ /* Must be multiple of largest page size. */
+# define MAXHINCR 512 /* Maximum heap increment, in blocks */
+# else
+# define MINHINCR 64
+# define MAXHINCR 4096
+# endif
+
+# define TIME_LIMIT 50 /* We try to keep pause times from exceeding */
+ /* this by much. In milliseconds. */
+
+# define BL_LIMIT GC_black_list_spacing
+ /* If we need a block of N bytes, and we have */
+ /* a block of N + BL_LIMIT bytes available, */
+ /* and N > BL_LIMIT, */
+ /* but all possible positions in it are */
+ /* blacklisted, we just use it anyway (and */
+ /* print a warning, if warnings are enabled). */
+ /* This risks subsequently leaking the block */
+ /* due to a false reference. But not using */
+ /* the block risks unreasonable immediate */
+ /* heap growth. */
+
+/*********************************/
+/* */
+/* Stack saving for debugging */
+/* */
+/*********************************/
+
+#ifdef SAVE_CALL_CHAIN
+
+/*
+ * Number of frames and arguments to save in objects allocated by
+ * debugging allocator.
+ */
+# define NFRAMES 6 /* Number of frames to save. Even for */
+ /* alignment reasons. */
+# define NARGS 2 /* Mumber of arguments to save for each call. */
+
+# define NEED_CALLINFO
+
+/* Fill in the pc and argument information for up to NFRAMES of my */
+/* callers. Ignore my frame and my callers frame. */
+void GC_save_callers (/* struct callinfo info[NFRAMES] */);
+
+void GC_print_callers (/* struct callinfo info[NFRAMES] */);
+
+#else
+
+# ifdef GC_ADD_CALLER
+# define NFRAMES 1
+# define NARGS 0
+# define NEED_CALLINFO
+# endif
+
+#endif
+
+#ifdef NEED_CALLINFO
+ struct callinfo {
+ word ci_pc;
+# if NARGS > 0
+ word ci_arg[NARGS]; /* bit-wise complement to avoid retention */
+# endif
+# if defined(ALIGN_DOUBLE) && (NFRAMES * (NARGS + 1)) % 2 == 1
+ /* Likely alignment problem. */
+ word ci_dummy;
+# endif
+ };
+#endif
+
+
+/*********************************/
+/* */
+/* OS interface routines */
+/* */
+/*********************************/
+
+#ifdef BSD_TIME
+# undef CLOCK_TYPE
+# undef GET_TIME
+# undef MS_TIME_DIFF
+# define CLOCK_TYPE struct timeval
+# define GET_TIME(x) { struct rusage rusage; \
+ getrusage (RUSAGE_SELF, &rusage); \
+ x = rusage.ru_utime; }
+# define MS_TIME_DIFF(a,b) ((double) (a.tv_sec - b.tv_sec) * 1000.0 \
+ + (double) (a.tv_usec - b.tv_usec) / 1000.0)
+#else /* !BSD_TIME */
+# include <time.h>
+# if !defined(__STDC__) && defined(SPARC) && defined(SUNOS4)
+ clock_t clock(); /* Not in time.h, where it belongs */
+# endif
+# if defined(FREEBSD) && !defined(CLOCKS_PER_SEC)
+# include <machine/limits.h>
+# define CLOCKS_PER_SEC CLK_TCK
+# endif
+# if !defined(CLOCKS_PER_SEC)
+# define CLOCKS_PER_SEC 1000000
+/*
+ * This is technically a bug in the implementation. ANSI requires that
+ * CLOCKS_PER_SEC be defined. But at least under SunOS4.1.1, it isn't.
+ * Also note that the combination of ANSI C and POSIX is incredibly gross
+ * here. The type clock_t is used by both clock() and times(). But on
+ * some machines these use different notions of a clock tick, CLOCKS_PER_SEC
+ * seems to apply only to clock. Hence we use it here. On many machines,
+ * including SunOS, clock actually uses units of microseconds (which are
+ * not really clock ticks).
+ */
+# endif
+# define CLOCK_TYPE clock_t
+# define GET_TIME(x) x = clock()
+# define MS_TIME_DIFF(a,b) ((unsigned long) \
+ (1000.0*(double)((a)-(b))/(double)CLOCKS_PER_SEC))
+#endif /* !BSD_TIME */
+
+/* We use bzero and bcopy internally. They may not be available. */
+# if defined(SPARC) && defined(SUNOS4)
+# define BCOPY_EXISTS
+# endif
+# if defined(M68K) && defined(AMIGA)
+# define BCOPY_EXISTS
+# endif
+# if defined(M68K) && defined(NEXT)
+# define BCOPY_EXISTS
+# endif
+# if defined(VAX)
+# define BCOPY_EXISTS
+# endif
+# if defined(AMIGA)
+# include <string.h>
+# define BCOPY_EXISTS
+# endif
+
+# ifndef BCOPY_EXISTS
+# include <string.h>
+# define BCOPY(x,y,n) memcpy(y, x, (size_t)(n))
+# define BZERO(x,n) memset(x, 0, (size_t)(n))
+# else
+# define BCOPY(x,y,n) bcopy((char *)(x),(char *)(y),(int)(n))
+# define BZERO(x,n) bzero((char *)(x),(int)(n))
+# endif
+
+/* HBLKSIZE aligned allocation. 0 is taken to mean failure */
+/* space is assumed to be cleared. */
+/* In the case os USE_MMAP, the argument must also be a */
+/* physical page size. */
+# ifdef PCR
+ char * real_malloc();
+# define GET_MEM(bytes) HBLKPTR(real_malloc((size_t)bytes + GC_page_size) \
+ + GC_page_size-1)
+# else
+# ifdef OS2
+ void * os2_alloc(size_t bytes);
+# define GET_MEM(bytes) HBLKPTR((ptr_t)os2_alloc((size_t)bytes \
+ + GC_page_size) \
+ + GC_page_size-1)
+# else
+# if defined(AMIGA) || defined(NEXT) || defined(DOS4GW)
+# define GET_MEM(bytes) HBLKPTR((size_t) \
+ calloc(1, (size_t)bytes + GC_page_size) \
+ + GC_page_size-1)
+# else
+# ifdef MSWIN32
+ extern ptr_t GC_win32_get_mem();
+# define GET_MEM(bytes) (struct hblk *)GC_win32_get_mem(bytes)
+# else
+# ifdef MACOS
+# if defined(USE_TEMPORARY_MEMORY)
+ extern Ptr GC_MacTemporaryNewPtr(size_t size,
+ Boolean clearMemory);
+# define GET_MEM(bytes) HBLKPTR( \
+ GC_MacTemporaryNewPtr(bytes + GC_page_size, true) \
+ + GC_page_size-1)
+# else
+# define GET_MEM(bytes) HBLKPTR( \
+ NewPtrClear(bytes + GC_page_size) + GC_page_size-1)
+# endif
+# else
+ extern ptr_t GC_unix_get_mem();
+# define GET_MEM(bytes) (struct hblk *)GC_unix_get_mem(bytes)
+# endif
+# endif
+# endif
+# endif
+# endif
+
+/*
+ * Mutual exclusion between allocator/collector routines.
+ * Needed if there is more than one allocator thread.
+ * FASTLOCK() is assumed to try to acquire the lock in a cheap and
+ * dirty way that is acceptable for a few instructions, e.g. by
+ * inhibiting preemption. This is assumed to have succeeded only
+ * if a subsequent call to FASTLOCK_SUCCEEDED() returns TRUE.
+ * FASTUNLOCK() is called whether or not FASTLOCK_SUCCEEDED().
+ * If signals cannot be tolerated with the FASTLOCK held, then
+ * FASTLOCK should disable signals. The code executed under
+ * FASTLOCK is otherwise immune to interruption, provided it is
+ * not restarted.
+ * DCL_LOCK_STATE declares any local variables needed by LOCK and UNLOCK
+ * and/or DISABLE_SIGNALS and ENABLE_SIGNALS and/or FASTLOCK.
+ * (There is currently no equivalent for FASTLOCK.)
+ */
+# ifdef THREADS
+# ifdef PCR_OBSOLETE /* Faster, but broken with multiple lwp's */
+# include "th/PCR_Th.h"
+# include "th/PCR_ThCrSec.h"
+ extern struct PCR_Th_MLRep GC_allocate_ml;
+# define DCL_LOCK_STATE PCR_sigset_t GC_old_sig_mask
+# define LOCK() PCR_Th_ML_Acquire(&GC_allocate_ml)
+# define UNLOCK() PCR_Th_ML_Release(&GC_allocate_ml)
+# define FASTLOCK() PCR_ThCrSec_EnterSys()
+ /* Here we cheat (a lot): */
+# define FASTLOCK_SUCCEEDED() (*(int *)(&GC_allocate_ml) == 0)
+ /* TRUE if nobody currently holds the lock */
+# define FASTUNLOCK() PCR_ThCrSec_ExitSys()
+# endif
+# ifdef PCR
+# include <base/PCR_Base.h>
+# include <th/PCR_Th.h>
+ extern PCR_Th_ML GC_allocate_ml;
+# define DCL_LOCK_STATE \
+ PCR_ERes GC_fastLockRes; PCR_sigset_t GC_old_sig_mask
+# define LOCK() PCR_Th_ML_Acquire(&GC_allocate_ml)
+# define UNLOCK() PCR_Th_ML_Release(&GC_allocate_ml)
+# define FASTLOCK() (GC_fastLockRes = PCR_Th_ML_Try(&GC_allocate_ml))
+# define FASTLOCK_SUCCEEDED() (GC_fastLockRes == PCR_ERes_okay)
+# define FASTUNLOCK() {\
+ if( FASTLOCK_SUCCEEDED() ) PCR_Th_ML_Release(&GC_allocate_ml); }
+# endif
+# ifdef SRC_M3
+ extern word RT0u__inCritical;
+# define LOCK() RT0u__inCritical++
+# define UNLOCK() RT0u__inCritical--
+# endif
+# ifdef SOLARIS_THREADS
+# include <thread.h>
+# include <signal.h>
+ extern mutex_t GC_allocate_ml;
+# define LOCK() mutex_lock(&GC_allocate_ml);
+# define UNLOCK() mutex_unlock(&GC_allocate_ml);
+# endif
+# ifdef LINUX_THREADS
+# include <pthread.h>
+# ifdef __i386__
+ inline static GC_test_and_set(volatile unsigned int *addr) {
+ int oldval;
+ /* Note: the "xchg" instruction does not need a "lock" prefix */
+ __asm__ __volatile__("xchgl %0, %1"
+ : "=r"(oldval), "=m"(*(addr))
+ : "0"(1), "m"(*(addr)));
+ return oldval;
+ }
+# else
+ -- > Need implementation of GC_test_and_set()
+# endif
+# define GC_clear(addr) (*(addr) = 0)
+
+ extern volatile unsigned int GC_allocate_lock;
+ /* This is not a mutex because mutexes that obey the (optional) */
+ /* POSIX scheduling rules are subject to convoys in high contention */
+ /* applications. This is basically a spin lock. */
+ extern pthread_t GC_lock_holder;
+ extern void GC_lock(void);
+ /* Allocation lock holder. Only set if acquired by client through */
+ /* GC_call_with_alloc_lock. */
+# define SET_LOCK_HOLDER() GC_lock_holder = pthread_self()
+# define NO_THREAD (pthread_t)(-1)
+# define UNSET_LOCK_HOLDER() GC_lock_holder = NO_THREAD
+# define I_HOLD_LOCK() (pthread_equal(GC_lock_holder, pthread_self()))
+# ifdef UNDEFINED
+# define LOCK() pthread_mutex_lock(&GC_allocate_ml)
+# define UNLOCK() pthread_mutex_unlock(&GC_allocate_ml)
+# else
+# define LOCK() \
+ { if (GC_test_and_set(&GC_allocate_lock)) GC_lock(); }
+# define UNLOCK() \
+ GC_clear(&GC_allocate_lock)
+# endif
+ extern GC_bool GC_collecting;
+# define ENTER_GC() \
+ { \
+ GC_collecting = 1; \
+ }
+# define EXIT_GC() GC_collecting = 0;
+# endif /* LINUX_THREADS */
+# ifdef IRIX_THREADS
+# include <pthread.h>
+# include <mutex.h>
+
+# if __mips < 3 || !(defined (_ABIN32) || defined(_ABI64))
+# define GC_test_and_set(addr, v) test_and_set(addr,v)
+# else
+# define GC_test_and_set(addr, v) __test_and_set(addr,v)
+# endif
+ extern unsigned long GC_allocate_lock;
+ /* This is not a mutex because mutexes that obey the (optional) */
+ /* POSIX scheduling rules are subject to convoys in high contention */
+ /* applications. This is basically a spin lock. */
+ extern pthread_t GC_lock_holder;
+ extern void GC_lock(void);
+ /* Allocation lock holder. Only set if acquired by client through */
+ /* GC_call_with_alloc_lock. */
+# define SET_LOCK_HOLDER() GC_lock_holder = pthread_self()
+# define NO_THREAD (pthread_t)(-1)
+# define UNSET_LOCK_HOLDER() GC_lock_holder = NO_THREAD
+# define I_HOLD_LOCK() (pthread_equal(GC_lock_holder, pthread_self()))
+# ifdef UNDEFINED
+# define LOCK() pthread_mutex_lock(&GC_allocate_ml)
+# define UNLOCK() pthread_mutex_unlock(&GC_allocate_ml)
+# else
+# define LOCK() { if (GC_test_and_set(&GC_allocate_lock, 1)) GC_lock(); }
+# if __mips >= 3 && (defined (_ABIN32) || defined(_ABI64))
+# define UNLOCK() __lock_release(&GC_allocate_lock)
+# else
+# define UNLOCK() GC_allocate_lock = 0
+# endif
+# endif
+ extern GC_bool GC_collecting;
+# define ENTER_GC() \
+ { \
+ GC_collecting = 1; \
+ }
+# define EXIT_GC() GC_collecting = 0;
+# endif /* IRIX_THREADS */
+# ifdef WIN32_THREADS
+# include <windows.h>
+ GC_API CRITICAL_SECTION GC_allocate_ml;
+# define LOCK() EnterCriticalSection(&GC_allocate_ml);
+# define UNLOCK() LeaveCriticalSection(&GC_allocate_ml);
+# endif
+# ifndef SET_LOCK_HOLDER
+# define SET_LOCK_HOLDER()
+# define UNSET_LOCK_HOLDER()
+# define I_HOLD_LOCK() FALSE
+ /* Used on platforms were locks can be reacquired, */
+ /* so it doesn't matter if we lie. */
+# endif
+# else
+# define LOCK()
+# define UNLOCK()
+# endif
+# ifndef SET_LOCK_HOLDER
+# define SET_LOCK_HOLDER()
+# define UNSET_LOCK_HOLDER()
+# define I_HOLD_LOCK() FALSE
+ /* Used on platforms were locks can be reacquired, */
+ /* so it doesn't matter if we lie. */
+# endif
+# ifndef ENTER_GC
+# define ENTER_GC()
+# define EXIT_GC()
+# endif
+
+# ifndef DCL_LOCK_STATE
+# define DCL_LOCK_STATE
+# endif
+# ifndef FASTLOCK
+# define FASTLOCK() LOCK()
+# define FASTLOCK_SUCCEEDED() TRUE
+# define FASTUNLOCK() UNLOCK()
+# endif
+
+/* Delay any interrupts or signals that may abort this thread. Data */
+/* structures are in a consistent state outside this pair of calls. */
+/* ANSI C allows both to be empty (though the standard isn't very */
+/* clear on that point). Standard malloc implementations are usually */
+/* neither interruptable nor thread-safe, and thus correspond to */
+/* empty definitions. */
+# ifdef PCR
+# define DISABLE_SIGNALS() \
+ PCR_Th_SetSigMask(PCR_allSigsBlocked,&GC_old_sig_mask)
+# define ENABLE_SIGNALS() \
+ PCR_Th_SetSigMask(&GC_old_sig_mask, NIL)
+# else
+# if defined(SRC_M3) || defined(AMIGA) || defined(SOLARIS_THREADS) \
+ || defined(MSWIN32) || defined(MACOS) || defined(DJGPP) \
+ || defined(NO_SIGNALS) || defined(IRIX_THREADS) \
+ || defined(LINUX_THREADS)
+ /* Also useful for debugging. */
+ /* Should probably use thr_sigsetmask for SOLARIS_THREADS. */
+# define DISABLE_SIGNALS()
+# define ENABLE_SIGNALS()
+# else
+# define DISABLE_SIGNALS() GC_disable_signals()
+ void GC_disable_signals();
+# define ENABLE_SIGNALS() GC_enable_signals()
+ void GC_enable_signals();
+# endif
+# endif
+
+/*
+ * Stop and restart mutator threads.
+ */
+# ifdef PCR
+# include "th/PCR_ThCtl.h"
+# define STOP_WORLD() \
+ PCR_ThCtl_SetExclusiveMode(PCR_ThCtl_ExclusiveMode_stopNormal, \
+ PCR_allSigsBlocked, \
+ PCR_waitForever)
+# define START_WORLD() \
+ PCR_ThCtl_SetExclusiveMode(PCR_ThCtl_ExclusiveMode_null, \
+ PCR_allSigsBlocked, \
+ PCR_waitForever);
+# else
+# if defined(SOLARIS_THREADS) || defined(WIN32_THREADS) \
+ || defined(IRIX_THREADS) || defined(LINUX_THREADS)
+ void GC_stop_world();
+ void GC_start_world();
+# define STOP_WORLD() GC_stop_world()
+# define START_WORLD() GC_start_world()
+# else
+# define STOP_WORLD()
+# define START_WORLD()
+# endif
+# endif
+
+/* Abandon ship */
+# ifdef PCR
+# define ABORT(s) PCR_Base_Panic(s)
+# else
+# ifdef SMALL_CONFIG
+# define ABORT(msg) abort();
+# else
+ GC_API void GC_abort();
+# define ABORT(msg) GC_abort(msg);
+# endif
+# endif
+
+/* Exit abnormally, but without making a mess (e.g. out of memory) */
+# ifdef PCR
+# define EXIT() PCR_Base_Exit(1,PCR_waitForever)
+# else
+# define EXIT() (void)exit(1)
+# endif
+
+/* Print warning message, e.g. almost out of memory. */
+# define WARN(msg,arg) (*GC_current_warn_proc)(msg, (GC_word)(arg))
+extern GC_warn_proc GC_current_warn_proc;
+
+/*********************************/
+/* */
+/* Word-size-dependent defines */
+/* */
+/*********************************/
+
+#if CPP_WORDSZ == 32
+# define WORDS_TO_BYTES(x) ((x)<<2)
+# define BYTES_TO_WORDS(x) ((x)>>2)
+# define LOGWL ((word)5) /* log[2] of CPP_WORDSZ */
+# define modWORDSZ(n) ((n) & 0x1f) /* n mod size of word */
+# if ALIGNMENT != 4
+# define UNALIGNED
+# endif
+#endif
+
+#if CPP_WORDSZ == 64
+# define WORDS_TO_BYTES(x) ((x)<<3)
+# define BYTES_TO_WORDS(x) ((x)>>3)
+# define LOGWL ((word)6) /* log[2] of CPP_WORDSZ */
+# define modWORDSZ(n) ((n) & 0x3f) /* n mod size of word */
+# if ALIGNMENT != 8
+# define UNALIGNED
+# endif
+#endif
+
+#define WORDSZ ((word)CPP_WORDSZ)
+#define SIGNB ((word)1 << (WORDSZ-1))
+#define BYTES_PER_WORD ((word)(sizeof (word)))
+#define ONES ((word)(-1))
+#define divWORDSZ(n) ((n) >> LOGWL) /* divide n by size of word */
+
+/*********************/
+/* */
+/* Size Parameters */
+/* */
+/*********************/
+
+/* heap block size, bytes. Should be power of 2 */
+
+#ifndef HBLKSIZE
+# ifdef SMALL_CONFIG
+# define CPP_LOG_HBLKSIZE 10
+# else
+# if CPP_WORDSZ == 32
+# define CPP_LOG_HBLKSIZE 12
+# else
+# define CPP_LOG_HBLKSIZE 13
+# endif
+# endif
+#else
+# if HBLKSIZE == 512
+# define CPP_LOG_HBLKSIZE 9
+# endif
+# if HBLKSIZE == 1024
+# define CPP_LOG_HBLKSIZE 10
+# endif
+# if HBLKSIZE == 2048
+# define CPP_LOG_HBLKSIZE 11
+# endif
+# if HBLKSIZE == 4096
+# define CPP_LOG_HBLKSIZE 12
+# endif
+# if HBLKSIZE == 8192
+# define CPP_LOG_HBLKSIZE 13
+# endif
+# if HBLKSIZE == 16384
+# define CPP_LOG_HBLKSIZE 14
+# endif
+# ifndef CPP_LOG_HBLKSIZE
+ --> fix HBLKSIZE
+# endif
+# undef HBLKSIZE
+#endif
+# define CPP_HBLKSIZE (1 << CPP_LOG_HBLKSIZE)
+# define LOG_HBLKSIZE ((word)CPP_LOG_HBLKSIZE)
+# define HBLKSIZE ((word)CPP_HBLKSIZE)
+
+
+/* max size objects supported by freelist (larger objects may be */
+/* allocated, but less efficiently) */
+
+#define CPP_MAXOBJSZ BYTES_TO_WORDS(CPP_HBLKSIZE/2)
+#define MAXOBJSZ ((word)CPP_MAXOBJSZ)
+
+# define divHBLKSZ(n) ((n) >> LOG_HBLKSIZE)
+
+# define HBLK_PTR_DIFF(p,q) divHBLKSZ((ptr_t)p - (ptr_t)q)
+ /* Equivalent to subtracting 2 hblk pointers. */
+ /* We do it this way because a compiler should */
+ /* find it hard to use an integer division */
+ /* instead of a shift. The bundled SunOS 4.1 */
+ /* o.w. sometimes pessimizes the subtraction to */
+ /* involve a call to .div. */
+
+# define modHBLKSZ(n) ((n) & (HBLKSIZE-1))
+
+# define HBLKPTR(objptr) ((struct hblk *)(((word) (objptr)) & ~(HBLKSIZE-1)))
+
+# define HBLKDISPL(objptr) (((word) (objptr)) & (HBLKSIZE-1))
+
+/* Round up byte allocation requests to integral number of words, etc. */
+# ifdef ADD_BYTE_AT_END
+# define ROUNDED_UP_WORDS(n) BYTES_TO_WORDS((n) + WORDS_TO_BYTES(1))
+# ifdef ALIGN_DOUBLE
+# define ALIGNED_WORDS(n) (BYTES_TO_WORDS((n) + WORDS_TO_BYTES(2)) & ~1)
+# else
+# define ALIGNED_WORDS(n) ROUNDED_UP_WORDS(n)
+# endif
+# define SMALL_OBJ(bytes) ((bytes) < WORDS_TO_BYTES(MAXOBJSZ))
+# define ADD_SLOP(bytes) ((bytes)+1)
+# else
+# define ROUNDED_UP_WORDS(n) BYTES_TO_WORDS((n) + (WORDS_TO_BYTES(1) - 1))
+# ifdef ALIGN_DOUBLE
+# define ALIGNED_WORDS(n) \
+ (BYTES_TO_WORDS((n) + WORDS_TO_BYTES(2) - 1) & ~1)
+# else
+# define ALIGNED_WORDS(n) ROUNDED_UP_WORDS(n)
+# endif
+# define SMALL_OBJ(bytes) ((bytes) <= WORDS_TO_BYTES(MAXOBJSZ))
+# define ADD_SLOP(bytes) (bytes)
+# endif
+
+
+/*
+ * Hash table representation of sets of pages. This assumes it is
+ * OK to add spurious entries to sets.
+ * Used by black-listing code, and perhaps by dirty bit maintenance code.
+ */
+
+# ifdef LARGE_CONFIG
+# define LOG_PHT_ENTRIES 17
+# else
+# define LOG_PHT_ENTRIES 14 /* Collisions are likely if heap grows */
+ /* to more than 16K hblks = 64MB. */
+ /* Each hash table occupies 2K bytes. */
+# endif
+# define PHT_ENTRIES ((word)1 << LOG_PHT_ENTRIES)
+# define PHT_SIZE (PHT_ENTRIES >> LOGWL)
+typedef word page_hash_table[PHT_SIZE];
+
+# define PHT_HASH(addr) ((((word)(addr)) >> LOG_HBLKSIZE) & (PHT_ENTRIES - 1))
+
+# define get_pht_entry_from_index(bl, index) \
+ (((bl)[divWORDSZ(index)] >> modWORDSZ(index)) & 1)
+# define set_pht_entry_from_index(bl, index) \
+ (bl)[divWORDSZ(index)] |= (word)1 << modWORDSZ(index)
+# define clear_pht_entry_from_index(bl, index) \
+ (bl)[divWORDSZ(index)] &= ~((word)1 << modWORDSZ(index))
+
+
+
+/********************************************/
+/* */
+/* H e a p B l o c k s */
+/* */
+/********************************************/
+
+/* heap block header */
+#define HBLKMASK (HBLKSIZE-1)
+
+#define BITS_PER_HBLK (HBLKSIZE * 8)
+
+#define MARK_BITS_PER_HBLK (BITS_PER_HBLK/CPP_WORDSZ)
+ /* upper bound */
+ /* We allocate 1 bit/word. Only the first word */
+ /* in each object is actually marked. */
+
+# ifdef ALIGN_DOUBLE
+# define MARK_BITS_SZ (((MARK_BITS_PER_HBLK + 2*CPP_WORDSZ - 1) \
+ / (2*CPP_WORDSZ))*2)
+# else
+# define MARK_BITS_SZ ((MARK_BITS_PER_HBLK + CPP_WORDSZ - 1)/CPP_WORDSZ)
+# endif
+ /* Upper bound on number of mark words per heap block */
+
+struct hblkhdr {
+ word hb_sz; /* If in use, size in words, of objects in the block. */
+ /* if free, the size in bytes of the whole block */
+ struct hblk * hb_next; /* Link field for hblk free list */
+ /* and for lists of chunks waiting to be */
+ /* reclaimed. */
+ word hb_descr; /* object descriptor for marking. See */
+ /* mark.h. */
+ char* hb_map; /* A pointer to a pointer validity map of the block. */
+ /* See GC_obj_map. */
+ /* Valid for all blocks with headers. */
+ /* Free blocks point to GC_invalid_map. */
+ unsigned char hb_obj_kind;
+ /* Kind of objects in the block. Each kind */
+ /* identifies a mark procedure and a set of */
+ /* list headers. Sometimes called regions. */
+ unsigned char hb_flags;
+# define IGNORE_OFF_PAGE 1 /* Ignore pointers that do not */
+ /* point to the first page of */
+ /* this object. */
+ unsigned short hb_last_reclaimed;
+ /* Value of GC_gc_no when block was */
+ /* last allocated or swept. May wrap. */
+ word hb_marks[MARK_BITS_SZ];
+ /* Bit i in the array refers to the */
+ /* object starting at the ith word (header */
+ /* INCLUDED) in the heap block. */
+ /* The lsb of word 0 is numbered 0. */
+};
+
+/* heap block body */
+
+# define DISCARD_WORDS 0
+ /* Number of words to be dropped at the beginning of each block */
+ /* Must be a multiple of WORDSZ. May reasonably be nonzero */
+ /* on machines that don't guarantee longword alignment of */
+ /* pointers, so that the number of false hits is minimized. */
+ /* 0 and WORDSZ are probably the only reasonable values. */
+
+# define BODY_SZ ((HBLKSIZE-WORDS_TO_BYTES(DISCARD_WORDS))/sizeof(word))
+
+struct hblk {
+# if (DISCARD_WORDS != 0)
+ word garbage[DISCARD_WORDS];
+# endif
+ word hb_body[BODY_SZ];
+};
+
+# define HDR_WORDS ((word)DISCARD_WORDS)
+# define HDR_BYTES ((word)WORDS_TO_BYTES(DISCARD_WORDS))
+
+# define OBJ_SZ_TO_BLOCKS(sz) \
+ divHBLKSZ(HDR_BYTES + WORDS_TO_BYTES(sz) + HBLKSIZE-1)
+ /* Size of block (in units of HBLKSIZE) needed to hold objects of */
+ /* given sz (in words). */
+
+/* Object free list link */
+# define obj_link(p) (*(ptr_t *)(p))
+
+/* lists of all heap blocks and free lists */
+/* These are grouped together in a struct */
+/* so that they can be easily skipped by the */
+/* GC_mark routine. */
+/* The ordering is weird to make GC_malloc */
+/* faster by keeping the important fields */
+/* sufficiently close together that a */
+/* single load of a base register will do. */
+/* Scalars that could easily appear to */
+/* be pointers are also put here. */
+/* The main fields should precede any */
+/* conditionally included fields, so that */
+/* gc_inl.h will work even if a different set */
+/* of macros is defined when the client is */
+/* compiled. */
+
+struct _GC_arrays {
+ word _heapsize;
+ word _max_heapsize;
+ ptr_t _last_heap_addr;
+ ptr_t _prev_heap_addr;
+ word _words_allocd_before_gc;
+ /* Number of words allocated before this */
+ /* collection cycle. */
+ word _words_allocd;
+ /* Number of words allocated during this collection cycle */
+ word _words_wasted;
+ /* Number of words wasted due to internal fragmentation */
+ /* in large objects, or due to dropping blacklisted */
+ /* blocks, since last gc. Approximate. */
+ word _words_finalized;
+ /* Approximate number of words in objects (and headers) */
+ /* That became ready for finalization in the last */
+ /* collection. */
+ word _non_gc_bytes_at_gc;
+ /* Number of explicitly managed bytes of storage */
+ /* at last collection. */
+ word _mem_freed;
+ /* Number of explicitly deallocated words of memory */
+ /* since last collection. */
+
+ ptr_t _objfreelist[MAXOBJSZ+1];
+ /* free list for objects */
+ ptr_t _aobjfreelist[MAXOBJSZ+1];
+ /* free list for atomic objs */
+
+ ptr_t _uobjfreelist[MAXOBJSZ+1];
+ /* uncollectable but traced objs */
+ /* objects on this and auobjfreelist */
+ /* are always marked, except during */
+ /* garbage collections. */
+# ifdef ATOMIC_UNCOLLECTABLE
+ ptr_t _auobjfreelist[MAXOBJSZ+1];
+# endif
+ /* uncollectable but traced objs */
+
+# ifdef GATHERSTATS
+ word _composite_in_use;
+ /* Number of words in accessible composite */
+ /* objects. */
+ word _atomic_in_use;
+ /* Number of words in accessible atomic */
+ /* objects. */
+# endif
+# ifdef MERGE_SIZES
+ unsigned _size_map[WORDS_TO_BYTES(MAXOBJSZ+1)];
+ /* Number of words to allocate for a given allocation request in */
+ /* bytes. */
+# endif
+
+# ifdef STUBBORN_ALLOC
+ ptr_t _sobjfreelist[MAXOBJSZ+1];
+# endif
+ /* free list for immutable objects */
+ ptr_t _obj_map[MAXOBJSZ+1];
+ /* If not NIL, then a pointer to a map of valid */
+ /* object addresses. _obj_map[sz][i] is j if the */
+ /* address block_start+i is a valid pointer */
+ /* to an object at */
+ /* block_start+i&~3 - WORDS_TO_BYTES(j). */
+ /* (If ALL_INTERIOR_POINTERS is defined, then */
+ /* instead ((short *)(hbh_map[sz])[i] is j if */
+ /* block_start+WORDS_TO_BYTES(i) is in the */
+ /* interior of an object starting at */
+ /* block_start+WORDS_TO_BYTES(i-j)). */
+ /* It is OBJ_INVALID if */
+ /* block_start+WORDS_TO_BYTES(i) is not */
+ /* valid as a pointer to an object. */
+ /* We assume all values of j <= OBJ_INVALID. */
+ /* The zeroth entry corresponds to large objects.*/
+# ifdef ALL_INTERIOR_POINTERS
+# define map_entry_type short
+# define OBJ_INVALID 0x7fff
+# define MAP_ENTRY(map, bytes) \
+ (((map_entry_type *)(map))[BYTES_TO_WORDS(bytes)])
+# define MAP_ENTRIES BYTES_TO_WORDS(HBLKSIZE)
+# define MAP_SIZE (MAP_ENTRIES * sizeof(map_entry_type))
+# define OFFSET_VALID(displ) TRUE
+# define CPP_MAX_OFFSET (HBLKSIZE - HDR_BYTES - 1)
+# define MAX_OFFSET ((word)CPP_MAX_OFFSET)
+# else
+# define map_entry_type char
+# define OBJ_INVALID 0x7f
+# define MAP_ENTRY(map, bytes) \
+ (map)[bytes]
+# define MAP_ENTRIES HBLKSIZE
+# define MAP_SIZE MAP_ENTRIES
+# define CPP_MAX_OFFSET (WORDS_TO_BYTES(OBJ_INVALID) - 1)
+# define MAX_OFFSET ((word)CPP_MAX_OFFSET)
+# define VALID_OFFSET_SZ \
+ (CPP_MAX_OFFSET > WORDS_TO_BYTES(CPP_MAXOBJSZ)? \
+ CPP_MAX_OFFSET+1 \
+ : WORDS_TO_BYTES(CPP_MAXOBJSZ)+1)
+ char _valid_offsets[VALID_OFFSET_SZ];
+ /* GC_valid_offsets[i] == TRUE ==> i */
+ /* is registered as a displacement. */
+# define OFFSET_VALID(displ) GC_valid_offsets[displ]
+ char _modws_valid_offsets[sizeof(word)];
+ /* GC_valid_offsets[i] ==> */
+ /* GC_modws_valid_offsets[i%sizeof(word)] */
+# endif
+# ifdef STUBBORN_ALLOC
+ page_hash_table _changed_pages;
+ /* Stubborn object pages that were changes since last call to */
+ /* GC_read_changed. */
+ page_hash_table _prev_changed_pages;
+ /* Stubborn object pages that were changes before last call to */
+ /* GC_read_changed. */
+# endif
+# if defined(PROC_VDB) || defined(MPROTECT_VDB)
+ page_hash_table _grungy_pages; /* Pages that were dirty at last */
+ /* GC_read_dirty. */
+# endif
+# ifdef LARGE_CONFIG
+# if CPP_WORDSZ > 32
+# define MAX_HEAP_SECTS 4096 /* overflows at roughly 64 GB */
+# else
+# define MAX_HEAP_SECTS 768 /* Separately added heap sections. */
+# endif
+# else
+# define MAX_HEAP_SECTS 256
+# endif
+ struct HeapSect {
+ ptr_t hs_start; word hs_bytes;
+ } _heap_sects[MAX_HEAP_SECTS];
+# ifdef MSWIN32
+ ptr_t _heap_bases[MAX_HEAP_SECTS];
+ /* Start address of memory regions obtained from kernel. */
+# endif
+ /* Block header index; see gc_headers.h */
+ bottom_index * _all_nils;
+ bottom_index * _top_index [TOP_SZ];
+#ifdef SAVE_CALL_CHAIN
+ struct callinfo _last_stack[NFRAMES]; /* Stack at last garbage collection.*/
+ /* Useful for debugging mysterious */
+ /* object disappearances. */
+ /* In the multithreaded case, we */
+ /* currently only save the calling */
+ /* stack. */
+#endif
+};
+
+GC_API GC_FAR struct _GC_arrays GC_arrays;
+
+# define GC_objfreelist GC_arrays._objfreelist
+# define GC_aobjfreelist GC_arrays._aobjfreelist
+# define GC_uobjfreelist GC_arrays._uobjfreelist
+# ifdef ATOMIC_UNCOLLECTABLE
+# define GC_auobjfreelist GC_arrays._auobjfreelist
+# endif
+# define GC_sobjfreelist GC_arrays._sobjfreelist
+# define GC_valid_offsets GC_arrays._valid_offsets
+# define GC_modws_valid_offsets GC_arrays._modws_valid_offsets
+# ifdef STUBBORN_ALLOC
+# define GC_changed_pages GC_arrays._changed_pages
+# define GC_prev_changed_pages GC_arrays._prev_changed_pages
+# endif
+# define GC_obj_map GC_arrays._obj_map
+# define GC_last_heap_addr GC_arrays._last_heap_addr
+# define GC_prev_heap_addr GC_arrays._prev_heap_addr
+# define GC_words_allocd GC_arrays._words_allocd
+# define GC_words_wasted GC_arrays._words_wasted
+# define GC_words_finalized GC_arrays._words_finalized
+# define GC_non_gc_bytes_at_gc GC_arrays._non_gc_bytes_at_gc
+# define GC_mem_freed GC_arrays._mem_freed
+# define GC_heapsize GC_arrays._heapsize
+# define GC_max_heapsize GC_arrays._max_heapsize
+# define GC_words_allocd_before_gc GC_arrays._words_allocd_before_gc
+# define GC_heap_sects GC_arrays._heap_sects
+# define GC_last_stack GC_arrays._last_stack
+# ifdef MSWIN32
+# define GC_heap_bases GC_arrays._heap_bases
+# endif
+# define GC_all_nils GC_arrays._all_nils
+# define GC_top_index GC_arrays._top_index
+# if defined(PROC_VDB) || defined(MPROTECT_VDB)
+# define GC_grungy_pages GC_arrays._grungy_pages
+# endif
+# ifdef GATHERSTATS
+# define GC_composite_in_use GC_arrays._composite_in_use
+# define GC_atomic_in_use GC_arrays._atomic_in_use
+# endif
+# ifdef MERGE_SIZES
+# define GC_size_map GC_arrays._size_map
+# endif
+
+# define beginGC_arrays ((ptr_t)(&GC_arrays))
+# define endGC_arrays (((ptr_t)(&GC_arrays)) + (sizeof GC_arrays))
+
+GC_API word GC_fo_entries;
+
+# define MAXOBJKINDS 16
+
+/* Object kinds: */
+extern struct obj_kind {
+ ptr_t *ok_freelist; /* Array of free listheaders for this kind of object */
+ /* Point either to GC_arrays or to storage allocated */
+ /* with GC_scratch_alloc. */
+ struct hblk **ok_reclaim_list;
+ /* List headers for lists of blocks waiting to be */
+ /* swept. */
+ word ok_descriptor; /* Descriptor template for objects in this */
+ /* block. */
+ GC_bool ok_relocate_descr;
+ /* Add object size in bytes to descriptor */
+ /* template to obtain descriptor. Otherwise */
+ /* template is used as is. */
+ GC_bool ok_init; /* Clear objects before putting them on the free list. */
+} GC_obj_kinds[MAXOBJKINDS];
+/* Predefined kinds: */
+# define PTRFREE 0
+# define NORMAL 1
+# define UNCOLLECTABLE 2
+# ifdef ATOMIC_UNCOLLECTABLE
+# define AUNCOLLECTABLE 3
+# define STUBBORN 4
+# define IS_UNCOLLECTABLE(k) (((k) & ~1) == UNCOLLECTABLE)
+# else
+# define STUBBORN 3
+# define IS_UNCOLLECTABLE(k) ((k) == UNCOLLECTABLE)
+# endif
+
+extern int GC_n_kinds;
+
+extern word GC_n_heap_sects; /* Number of separately added heap */
+ /* sections. */
+
+extern word GC_page_size;
+
+# ifdef MSWIN32
+extern word GC_n_heap_bases; /* See GC_heap_bases. */
+# endif
+
+extern word GC_total_stack_black_listed;
+ /* Number of bytes on stack blacklist. */
+
+extern word GC_black_list_spacing;
+ /* Average number of bytes between blacklisted */
+ /* blocks. Approximate. */
+ /* Counts only blocks that are */
+ /* "stack-blacklisted", i.e. that are */
+ /* problematic in the interior of an object. */
+
+extern char * GC_invalid_map;
+ /* Pointer to the nowhere valid hblk map */
+ /* Blocks pointing to this map are free. */
+
+extern struct hblk * GC_hblkfreelist;
+ /* List of completely empty heap blocks */
+ /* Linked through hb_next field of */
+ /* header structure associated with */
+ /* block. */
+
+extern GC_bool GC_is_initialized; /* GC_init() has been run. */
+
+extern GC_bool GC_objects_are_marked; /* There are marked objects in */
+ /* the heap. */
+
+extern GC_bool GC_incremental; /* Using incremental/generational collection. */
+
+extern GC_bool GC_dirty_maintained;
+ /* Dirty bits are being maintained, */
+ /* either for incremental collection, */
+ /* or to limit the root set. */
+
+# ifndef PCR
+ extern ptr_t GC_stackbottom; /* Cool end of user stack */
+# endif
+
+extern word GC_root_size; /* Total size of registered root sections */
+
+extern GC_bool GC_debugging_started; /* GC_debug_malloc has been called. */
+
+extern ptr_t GC_least_plausible_heap_addr;
+extern ptr_t GC_greatest_plausible_heap_addr;
+ /* Bounds on the heap. Guaranteed valid */
+ /* Likely to include future heap expansion. */
+
+/* Operations */
+# ifndef abs
+# define abs(x) ((x) < 0? (-(x)) : (x))
+# endif
+
+
+/* Marks are in a reserved area in */
+/* each heap block. Each word has one mark bit associated */
+/* with it. Only those corresponding to the beginning of an */
+/* object are used. */
+
+
+/* Mark bit operations */
+
+/*
+ * Retrieve, set, clear the mark bit corresponding
+ * to the nth word in a given heap block.
+ *
+ * (Recall that bit n corresponds to object beginning at word n
+ * relative to the beginning of the block, including unused words)
+ */
+
+# define mark_bit_from_hdr(hhdr,n) (((hhdr)->hb_marks[divWORDSZ(n)] \
+ >> (modWORDSZ(n))) & (word)1)
+# define set_mark_bit_from_hdr(hhdr,n) (hhdr)->hb_marks[divWORDSZ(n)] \
+ |= (word)1 << modWORDSZ(n)
+
+# define clear_mark_bit_from_hdr(hhdr,n) (hhdr)->hb_marks[divWORDSZ(n)] \
+ &= ~((word)1 << modWORDSZ(n))
+
+/* Important internal collector routines */
+
+ptr_t GC_approx_sp();
+
+GC_bool GC_should_collect();
+#ifdef PRESERVE_LAST
+ GC_bool GC_in_last_heap_sect(/* ptr_t */);
+ /* In last added heap section? If so, avoid breaking up. */
+#endif
+void GC_apply_to_all_blocks(/*fn, client_data*/);
+ /* Invoke fn(hbp, client_data) for each */
+ /* allocated heap block. */
+struct hblk * GC_next_block(/* struct hblk * h */);
+void GC_mark_init();
+void GC_clear_marks(); /* Clear mark bits for all heap objects. */
+void GC_invalidate_mark_state(); /* Tell the marker that marked */
+ /* objects may point to unmarked */
+ /* ones, and roots may point to */
+ /* unmarked objects. */
+ /* Reset mark stack. */
+void GC_mark_from_mark_stack(); /* Mark from everything on the mark stack. */
+ /* Return after about one pages worth of */
+ /* work. */
+GC_bool GC_mark_stack_empty();
+GC_bool GC_mark_some(); /* Perform about one pages worth of marking */
+ /* work of whatever kind is needed. Returns */
+ /* quickly if no collection is in progress. */
+ /* Return TRUE if mark phase finished. */
+void GC_initiate_gc(); /* initiate collection. */
+ /* If the mark state is invalid, this */
+ /* becomes full colleection. Otherwise */
+ /* it's partial. */
+void GC_push_all(/*b,t*/); /* Push everything in a range */
+ /* onto mark stack. */
+void GC_push_dirty(/*b,t*/); /* Push all possibly changed */
+ /* subintervals of [b,t) onto */
+ /* mark stack. */
+#ifndef SMALL_CONFIG
+ void GC_push_conditional(/* ptr_t b, ptr_t t, GC_bool all*/);
+#else
+# define GC_push_conditional(b, t, all) GC_push_all(b, t)
+#endif
+ /* Do either of the above, depending */
+ /* on the third arg. */
+void GC_push_all_stack(/*b,t*/); /* As above, but consider */
+ /* interior pointers as valid */
+void GC_push_roots(/* GC_bool all */); /* Push all or dirty roots. */
+extern void (*GC_push_other_roots)();
+ /* Push system or application specific roots */
+ /* onto the mark stack. In some environments */
+ /* (e.g. threads environments) this is */
+ /* predfined to be non-zero. A client supplied */
+ /* replacement should also call the original */
+ /* function. */
+extern void (*GC_start_call_back)(/* void */);
+ /* Called at start of full collections. */
+ /* Not called if 0. Called with allocation */
+ /* lock held. */
+ /* 0 by default. */
+void GC_push_regs(); /* Push register contents onto mark stack. */
+void GC_remark(); /* Mark from all marked objects. Used */
+ /* only if we had to drop something. */
+# if defined(MSWIN32)
+ void __cdecl GC_push_one();
+# else
+ void GC_push_one(/*p*/); /* If p points to an object, mark it */
+ /* and push contents on the mark stack */
+# endif
+void GC_push_one_checked(/*p*/); /* Ditto, omits plausibility test */
+void GC_push_marked(/* struct hblk h, hdr * hhdr */);
+ /* Push contents of all marked objects in h onto */
+ /* mark stack. */
+#ifdef SMALL_CONFIG
+# define GC_push_next_marked_dirty(h) GC_push_next_marked(h)
+#else
+ struct hblk * GC_push_next_marked_dirty(/* h */);
+ /* Invoke GC_push_marked on next dirty block above h. */
+ /* Return a pointer just past the end of this block. */
+#endif /* !SMALL_CONFIG */
+struct hblk * GC_push_next_marked(/* h */);
+ /* Ditto, but also mark from clean pages. */
+struct hblk * GC_push_next_marked_uncollectable(/* h */);
+ /* Ditto, but mark only from uncollectable pages. */
+GC_bool GC_stopped_mark(); /* Stop world and mark from all roots */
+ /* and rescuers. */
+void GC_clear_hdr_marks(/* hhdr */); /* Clear the mark bits in a header */
+void GC_set_hdr_marks(/* hhdr */); /* Set the mark bits in a header */
+void GC_add_roots_inner();
+GC_bool GC_is_static_root(/* ptr_t p */);
+ /* Is the address p in one of the registered static */
+ /* root sections? */
+void GC_register_dynamic_libraries();
+ /* Add dynamic library data sections to the root set. */
+
+/* Machine dependent startup routines */
+ptr_t GC_get_stack_base();
+void GC_register_data_segments();
+
+/* Black listing: */
+void GC_bl_init();
+# ifndef ALL_INTERIOR_POINTERS
+ void GC_add_to_black_list_normal(/* bits, maybe source */);
+ /* Register bits as a possible future false */
+ /* reference from the heap or static data */
+# ifdef PRINT_BLACK_LIST
+# define GC_ADD_TO_BLACK_LIST_NORMAL(bits, source) \
+ GC_add_to_black_list_normal(bits, source)
+# else
+# define GC_ADD_TO_BLACK_LIST_NORMAL(bits, source) \
+ GC_add_to_black_list_normal(bits)
+# endif
+# else
+# ifdef PRINT_BLACK_LIST
+# define GC_ADD_TO_BLACK_LIST_NORMAL(bits, source) \
+ GC_add_to_black_list_stack(bits, source)
+# else
+# define GC_ADD_TO_BLACK_LIST_NORMAL(bits, source) \
+ GC_add_to_black_list_stack(bits)
+# endif
+# endif
+
+void GC_add_to_black_list_stack(/* bits, maybe source */);
+struct hblk * GC_is_black_listed(/* h, len */);
+ /* If there are likely to be false references */
+ /* to a block starting at h of the indicated */
+ /* length, then return the next plausible */
+ /* starting location for h that might avoid */
+ /* these false references. */
+void GC_promote_black_lists();
+ /* Declare an end to a black listing phase. */
+void GC_unpromote_black_lists();
+ /* Approximately undo the effect of the above. */
+ /* This actually loses some information, but */
+ /* only in a reasonably safe way. */
+word GC_number_stack_black_listed(/*struct hblk *start, struct hblk *endp1 */);
+ /* Return the number of (stack) blacklisted */
+ /* blocks in the range for statistical */
+ /* purposes. */
+
+ptr_t GC_scratch_alloc(/*bytes*/);
+ /* GC internal memory allocation for */
+ /* small objects. Deallocation is not */
+ /* possible. */
+
+/* Heap block layout maps: */
+void GC_invalidate_map(/* hdr */);
+ /* Remove the object map associated */
+ /* with the block. This identifies */
+ /* the block as invalid to the mark */
+ /* routines. */
+GC_bool GC_add_map_entry(/*sz*/);
+ /* Add a heap block map for objects of */
+ /* size sz to obj_map. */
+ /* Return FALSE on failure. */
+void GC_register_displacement_inner(/*offset*/);
+ /* Version of GC_register_displacement */
+ /* that assumes lock is already held */
+ /* and signals are already disabled. */
+
+/* hblk allocation: */
+void GC_new_hblk(/*size_in_words, kind*/);
+ /* Allocate a new heap block, and build */
+ /* a free list in it. */
+struct hblk * GC_allochblk(/*size_in_words, kind*/);
+ /* Allocate a heap block, clear it if */
+ /* for composite objects, inform */
+ /* the marker that block is valid */
+ /* for objects of indicated size. */
+ /* sz < 0 ==> atomic. */
+void GC_freehblk(); /* Deallocate a heap block and mark it */
+ /* as invalid. */
+
+/* Misc GC: */
+void GC_init_inner();
+GC_bool GC_expand_hp_inner();
+void GC_start_reclaim(/*abort_if_found*/);
+ /* Restore unmarked objects to free */
+ /* lists, or (if abort_if_found is */
+ /* TRUE) report them. */
+ /* Sweeping of small object pages is */
+ /* largely deferred. */
+void GC_continue_reclaim(/*size, kind*/);
+ /* Sweep pages of the given size and */
+ /* kind, as long as possible, and */
+ /* as long as the corr. free list is */
+ /* empty. */
+void GC_reclaim_or_delete_all();
+ /* Arrange for all reclaim lists to be */
+ /* empty. Judiciously choose between */
+ /* sweeping and discarding each page. */
+GC_bool GC_reclaim_all(/* GC_stop_func f*/);
+ /* Reclaim all blocks. Abort (in a */
+ /* consistent state) if f returns TRUE. */
+GC_bool GC_block_empty(/* hhdr */); /* Block completely unmarked? */
+GC_bool GC_never_stop_func(); /* Returns FALSE. */
+GC_bool GC_try_to_collect_inner(/* GC_stop_func f */);
+ /* Collect; caller must have acquired */
+ /* lock and disabled signals. */
+ /* Collection is aborted if f returns */
+ /* TRUE. Returns TRUE if it completes */
+ /* successfully. */
+# define GC_gcollect_inner() \
+ (void) GC_try_to_collect_inner(GC_never_stop_func)
+void GC_finish_collection(); /* Finish collection. Mark bits are */
+ /* consistent and lock is still held. */
+GC_bool GC_collect_or_expand(/* needed_blocks */);
+ /* Collect or expand heap in an attempt */
+ /* make the indicated number of free */
+ /* blocks available. Should be called */
+ /* until the blocks are available or */
+ /* until it fails by returning FALSE. */
+void GC_init(); /* Initialize collector. */
+void GC_collect_a_little_inner(/* int n */);
+ /* Do n units worth of garbage */
+ /* collection work, if appropriate. */
+ /* A unit is an amount appropriate for */
+ /* HBLKSIZE bytes of allocation. */
+ptr_t GC_generic_malloc(/* bytes, kind */);
+ /* Allocate an object of the given */
+ /* kind. By default, there are only */
+ /* a few kinds: composite(pointerfree), */
+ /* atomic, uncollectable, etc. */
+ /* We claim it's possible for clever */
+ /* client code that understands GC */
+ /* internals to add more, e.g. to */
+ /* communicate object layout info */
+ /* to the collector. */
+ptr_t GC_generic_malloc_ignore_off_page(/* bytes, kind */);
+ /* As above, but pointers past the */
+ /* first page of the resulting object */
+ /* are ignored. */
+ptr_t GC_generic_malloc_inner(/* bytes, kind */);
+ /* Ditto, but I already hold lock, etc. */
+ptr_t GC_generic_malloc_words_small GC_PROTO((size_t words, int kind));
+ /* As above, but size in units of words */
+ /* Bypasses MERGE_SIZES. Assumes */
+ /* words <= MAXOBJSZ. */
+ptr_t GC_generic_malloc_inner_ignore_off_page(/* bytes, kind */);
+ /* Allocate an object, where */
+ /* the client guarantees that there */
+ /* will always be a pointer to the */
+ /* beginning of the object while the */
+ /* object is live. */
+ptr_t GC_allocobj(/* sz_inn_words, kind */);
+ /* Make the indicated */
+ /* free list nonempty, and return its */
+ /* head. */
+
+void GC_init_headers();
+GC_bool GC_install_header(/*h*/);
+ /* Install a header for block h. */
+ /* Return FALSE on failure. */
+GC_bool GC_install_counts(/*h, sz*/);
+ /* Set up forwarding counts for block */
+ /* h of size sz. */
+ /* Return FALSE on failure. */
+void GC_remove_header(/*h*/);
+ /* Remove the header for block h. */
+void GC_remove_counts(/*h, sz*/);
+ /* Remove forwarding counts for h. */
+hdr * GC_find_header(/*p*/); /* Debugging only. */
+
+void GC_finalize(); /* Perform all indicated finalization actions */
+ /* on unmarked objects. */
+ /* Unreachable finalizable objects are enqueued */
+ /* for processing by GC_invoke_finalizers. */
+ /* Invoked with lock. */
+
+void GC_add_to_heap(/*p, bytes*/);
+ /* Add a HBLKSIZE aligned chunk to the heap. */
+
+void GC_print_obj(/* ptr_t p */);
+ /* P points to somewhere inside an object with */
+ /* debugging info. Print a human readable */
+ /* description of the object to stderr. */
+extern void (*GC_check_heap)();
+ /* Check that all objects in the heap with */
+ /* debugging info are intact. Print */
+ /* descriptions of any that are not. */
+extern void (*GC_print_heap_obj)(/* ptr_t p */);
+ /* If possible print s followed by a more */
+ /* detailed description of the object */
+ /* referred to by p. */
+
+/* Virtual dirty bit implementation: */
+/* Each implementation exports the following: */
+void GC_read_dirty(); /* Retrieve dirty bits. */
+GC_bool GC_page_was_dirty(/* struct hblk * h */);
+ /* Read retrieved dirty bits. */
+GC_bool GC_page_was_ever_dirty(/* struct hblk * h */);
+ /* Could the page contain valid heap pointers? */
+void GC_is_fresh(/* struct hblk * h, word number_of_blocks */);
+ /* Assert the region currently contains no */
+ /* valid pointers. */
+void GC_write_hint(/* struct hblk * h */);
+ /* h is about to be written. */
+void GC_dirty_init();
+
+/* Slow/general mark bit manipulation: */
+GC_bool GC_is_marked();
+void GC_clear_mark_bit();
+void GC_set_mark_bit();
+
+/* Stubborn objects: */
+void GC_read_changed(); /* Analogous to GC_read_dirty */
+GC_bool GC_page_was_changed(/* h */); /* Analogous to GC_page_was_dirty */
+void GC_clean_changing_list(); /* Collect obsolete changing list entries */
+void GC_stubborn_init();
+
+/* Debugging print routines: */
+void GC_print_block_list();
+void GC_print_hblkfreelist();
+void GC_print_heap_sects();
+void GC_print_static_roots();
+void GC_dump();
+
+/* Make arguments appear live to compiler */
+# ifdef __WATCOMC__
+ void GC_noop(void*, ...);
+# else
+ GC_API void GC_noop();
+# endif
+
+void GC_noop1(/* word arg */);
+
+/* Logging and diagnostic output: */
+GC_API void GC_printf GC_PROTO((char * format, long, long, long, long, long, long));
+ /* A version of printf that doesn't allocate, */
+ /* is restricted to long arguments, and */
+ /* (unfortunately) doesn't use varargs for */
+ /* portability. Restricted to 6 args and */
+ /* 1K total output length. */
+ /* (We use sprintf. Hopefully that doesn't */
+ /* allocate for long arguments.) */
+# define GC_printf0(f) GC_printf(f, 0l, 0l, 0l, 0l, 0l, 0l)
+# define GC_printf1(f,a) GC_printf(f, (long)a, 0l, 0l, 0l, 0l, 0l)
+# define GC_printf2(f,a,b) GC_printf(f, (long)a, (long)b, 0l, 0l, 0l, 0l)
+# define GC_printf3(f,a,b,c) GC_printf(f, (long)a, (long)b, (long)c, 0l, 0l, 0l)
+# define GC_printf4(f,a,b,c,d) GC_printf(f, (long)a, (long)b, (long)c, \
+ (long)d, 0l, 0l)
+# define GC_printf5(f,a,b,c,d,e) GC_printf(f, (long)a, (long)b, (long)c, \
+ (long)d, (long)e, 0l)
+# define GC_printf6(f,a,b,c,d,e,g) GC_printf(f, (long)a, (long)b, (long)c, \
+ (long)d, (long)e, (long)g)
+
+void GC_err_printf(/* format, a, b, c, d, e, f */);
+# define GC_err_printf0(f) GC_err_puts(f)
+# define GC_err_printf1(f,a) GC_err_printf(f, (long)a, 0l, 0l, 0l, 0l, 0l)
+# define GC_err_printf2(f,a,b) GC_err_printf(f, (long)a, (long)b, 0l, 0l, 0l, 0l)
+# define GC_err_printf3(f,a,b,c) GC_err_printf(f, (long)a, (long)b, (long)c, \
+ 0l, 0l, 0l)
+# define GC_err_printf4(f,a,b,c,d) GC_err_printf(f, (long)a, (long)b, \
+ (long)c, (long)d, 0l, 0l)
+# define GC_err_printf5(f,a,b,c,d,e) GC_err_printf(f, (long)a, (long)b, \
+ (long)c, (long)d, \
+ (long)e, 0l)
+# define GC_err_printf6(f,a,b,c,d,e,g) GC_err_printf(f, (long)a, (long)b, \
+ (long)c, (long)d, \
+ (long)e, (long)g)
+ /* Ditto, writes to stderr. */
+
+void GC_err_puts(/* char *s */);
+ /* Write s to stderr, don't buffer, don't add */
+ /* newlines, don't ... */
+
+
+# endif /* GC_PRIVATE_H */
diff --git a/boehm-gc/include/weakpointer.h b/boehm-gc/include/weakpointer.h
new file mode 100644
index 00000000000..84906b00a68
--- /dev/null
+++ b/boehm-gc/include/weakpointer.h
@@ -0,0 +1,221 @@
+#ifndef _weakpointer_h_
+#define _weakpointer_h_
+
+/****************************************************************************
+
+WeakPointer and CleanUp
+
+ Copyright (c) 1991 by Xerox Corporation. All rights reserved.
+
+ THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+
+ Permission is hereby granted to copy this code for any purpose,
+ provided the above notices are retained on all copies.
+
+ Last modified on Mon Jul 17 18:16:01 PDT 1995 by ellis
+
+****************************************************************************/
+
+/****************************************************************************
+
+WeakPointer
+
+A weak pointer is a pointer to a heap-allocated object that doesn't
+prevent the object from being garbage collected. Weak pointers can be
+used to track which objects haven't yet been reclaimed by the
+collector. A weak pointer is deactivated when the collector discovers
+its referent object is unreachable by normal pointers (reachability
+and deactivation are defined more precisely below). A deactivated weak
+pointer remains deactivated forever.
+
+****************************************************************************/
+
+
+template< class T > class WeakPointer {
+public:
+
+WeakPointer( T* t = 0 )
+ /* Constructs a weak pointer for *t. t may be null. It is an error
+ if t is non-null and *t is not a collected object. */
+ {impl = _WeakPointer_New( t );}
+
+T* Pointer()
+ /* wp.Pointer() returns a pointer to the referent object of wp or
+ null if wp has been deactivated (because its referent object
+ has been discovered unreachable by the collector). */
+ {return (T*) _WeakPointer_Pointer( this->impl );}
+
+int operator==( WeakPointer< T > wp2 )
+ /* Given weak pointers wp1 and wp2, if wp1 == wp2, then wp1 and
+ wp2 refer to the same object. If wp1 != wp2, then either wp1
+ and wp2 don't refer to the same object, or if they do, one or
+ both of them has been deactivated. (Note: If objects t1 and t2
+ are never made reachable by their clean-up functions, then
+ WeakPointer<T>(t1) == WeakPointer<T>(t2) if and only t1 == t2.) */
+ {return _WeakPointer_Equal( this->impl, wp2.impl );}
+
+int Hash()
+ /* Returns a hash code suitable for use by multiplicative- and
+ division-based hash tables. If wp1 == wp2, then wp1.Hash() ==
+ wp2.Hash(). */
+ {return _WeakPointer_Hash( this->impl );}
+
+private:
+void* impl;
+};
+
+/*****************************************************************************
+
+CleanUp
+
+A garbage-collected object can have an associated clean-up function
+that will be invoked some time after the collector discovers the
+object is unreachable via normal pointers. Clean-up functions can be
+used to release resources such as open-file handles or window handles
+when their containing objects become unreachable. If a C++ object has
+a non-empty explicit destructor (i.e. it contains programmer-written
+code), the destructor will be automatically registered as the object's
+initial clean-up function.
+
+There is no guarantee that the collector will detect every unreachable
+object (though it will find almost all of them). Clients should not
+rely on clean-up to cause some action to occur immediately -- clean-up
+is only a mechanism for improving resource usage.
+
+Every object with a clean-up function also has a clean-up queue. When
+the collector finds the object is unreachable, it enqueues it on its
+queue. The clean-up function is applied when the object is removed
+from the queue. By default, objects are enqueued on the garbage
+collector's queue, and the collector removes all objects from its
+queue after each collection. If a client supplies another queue for
+objects, it is his responsibility to remove objects (and cause their
+functions to be called) by polling it periodically.
+
+Clean-up queues allow clean-up functions accessing global data to
+synchronize with the main program. Garbage collection can occur at any
+time, and clean-ups invoked by the collector might access data in an
+inconsistent state. A client can control this by defining an explicit
+queue for objects and polling it at safe points.
+
+The following definitions are used by the specification below:
+
+Given a pointer t to a collected object, the base object BO(t) is the
+value returned by new when it created the object. (Because of multiple
+inheritance, t and BO(t) may not be the same address.)
+
+A weak pointer wp references an object *t if BO(wp.Pointer()) ==
+BO(t).
+
+***************************************************************************/
+
+template< class T, class Data > class CleanUp {
+public:
+
+static void Set( T* t, void c( Data* d, T* t ), Data* d = 0 )
+ /* Sets the clean-up function of object BO(t) to be <c, d>,
+ replacing any previously defined clean-up function for BO(t); c
+ and d can be null, but t cannot. Sets the clean-up queue for
+ BO(t) to be the collector's queue. When t is removed from its
+ clean-up queue, its clean-up will be applied by calling c(d,
+ t). It is an error if *t is not a collected object. */
+ {_CleanUp_Set( t, c, d );}
+
+static void Call( T* t )
+ /* Sets the new clean-up function for BO(t) to be null and, if the
+ old one is non-null, calls it immediately, even if BO(t) is
+ still reachable. Deactivates any weak pointers to BO(t). */
+ {_CleanUp_Call( t );}
+
+class Queue {public:
+ Queue()
+ /* Constructs a new queue. */
+ {this->head = _CleanUp_Queue_NewHead();}
+
+ void Set( T* t )
+ /* q.Set(t) sets the clean-up queue of BO(t) to be q. */
+ {_CleanUp_Queue_Set( this->head, t );}
+
+ int Call()
+ /* If q is non-empty, q.Call() removes the first object and
+ calls its clean-up function; does nothing if q is
+ empty. Returns true if there are more objects in the
+ queue. */
+ {return _CleanUp_Queue_Call( this->head );}
+
+ private:
+ void* head;
+ };
+};
+
+/**********************************************************************
+
+Reachability and Clean-up
+
+An object O is reachable if it can be reached via a non-empty path of
+normal pointers from the registers, stacks, global variables, or an
+object with a non-null clean-up function (including O itself),
+ignoring pointers from an object to itself.
+
+This definition of reachability ensures that if object B is accessible
+from object A (and not vice versa) and if both A and B have clean-up
+functions, then A will always be cleaned up before B. Note that as
+long as an object with a clean-up function is contained in a cycle of
+pointers, it will always be reachable and will never be cleaned up or
+collected.
+
+When the collector finds an unreachable object with a null clean-up
+function, it atomically deactivates all weak pointers referencing the
+object and recycles its storage. If object B is accessible from object
+A via a path of normal pointers, A will be discovered unreachable no
+later than B, and a weak pointer to A will be deactivated no later
+than a weak pointer to B.
+
+When the collector finds an unreachable object with a non-null
+clean-up function, the collector atomically deactivates all weak
+pointers referencing the object, redefines its clean-up function to be
+null, and enqueues it on its clean-up queue. The object then becomes
+reachable again and remains reachable at least until its clean-up
+function executes.
+
+The clean-up function is assured that its argument is the only
+accessible pointer to the object. Nothing prevents the function from
+redefining the object's clean-up function or making the object
+reachable again (for example, by storing the pointer in a global
+variable).
+
+If the clean-up function does not make its object reachable again and
+does not redefine its clean-up function, then the object will be
+collected by a subsequent collection (because the object remains
+unreachable and now has a null clean-up function). If the clean-up
+function does make its object reachable again and a clean-up function
+is subsequently redefined for the object, then the new clean-up
+function will be invoked the next time the collector finds the object
+unreachable.
+
+Note that a destructor for a collected object cannot safely redefine a
+clean-up function for its object, since after the destructor executes,
+the object has been destroyed into "raw memory". (In most
+implementations, destroying an object mutates its vtbl.)
+
+Finally, note that calling delete t on a collected object first
+deactivates any weak pointers to t and then invokes its clean-up
+function (destructor).
+
+**********************************************************************/
+
+extern "C" {
+ void* _WeakPointer_New( void* t );
+ void* _WeakPointer_Pointer( void* wp );
+ int _WeakPointer_Equal( void* wp1, void* wp2 );
+ int _WeakPointer_Hash( void* wp );
+ void _CleanUp_Set( void* t, void (*c)( void* d, void* t ), void* d );
+ void _CleanUp_Call( void* t );
+ void* _CleanUp_Queue_NewHead ();
+ void _CleanUp_Queue_Set( void* h, void* t );
+ int _CleanUp_Queue_Call( void* h );
+}
+
+#endif /* _weakpointer_h_ */
+
+
diff --git a/boehm-gc/irix_threads.c b/boehm-gc/irix_threads.c
new file mode 100644
index 00000000000..f45c4631c6e
--- /dev/null
+++ b/boehm-gc/irix_threads.c
@@ -0,0 +1,640 @@
+/*
+ * Copyright (c) 1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996 by Silicon Graphics. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+/*
+ * Support code for Irix (>=6.2) Pthreads. This relies on properties
+ * not guaranteed by the Pthread standard. It may or may not be portable
+ * to other implementations.
+ *
+ * Note that there is a lot of code duplication between linux_threads.c
+ * and irix_threads.c; any changes made here may need to be reflected
+ * there too.
+ */
+
+# if defined(IRIX_THREADS)
+
+# include "gc_priv.h"
+# include <pthread.h>
+# include <time.h>
+# include <errno.h>
+# include <unistd.h>
+# include <sys/mman.h>
+# include <sys/time.h>
+
+#undef pthread_create
+#undef pthread_sigmask
+#undef pthread_join
+
+void GC_thr_init();
+
+#if 0
+void GC_print_sig_mask()
+{
+ sigset_t blocked;
+ int i;
+
+ if (pthread_sigmask(SIG_BLOCK, NULL, &blocked) != 0)
+ ABORT("pthread_sigmask");
+ GC_printf0("Blocked: ");
+ for (i = 1; i <= MAXSIG; i++) {
+ if (sigismember(&blocked, i)) { GC_printf1("%ld ",(long) i); }
+ }
+ GC_printf0("\n");
+}
+#endif
+
+/* We use the allocation lock to protect thread-related data structures. */
+
+/* The set of all known threads. We intercept thread creation and */
+/* joins. We never actually create detached threads. We allocate all */
+/* new thread stacks ourselves. These allow us to maintain this */
+/* data structure. */
+/* Protected by GC_thr_lock. */
+/* Some of this should be declared volatile, but that's incosnsistent */
+/* with some library routine declarations. */
+typedef struct GC_Thread_Rep {
+ struct GC_Thread_Rep * next; /* More recently allocated threads */
+ /* with a given pthread id come */
+ /* first. (All but the first are */
+ /* guaranteed to be dead, but we may */
+ /* not yet have registered the join.) */
+ pthread_t id;
+ word stop;
+# define NOT_STOPPED 0
+# define PLEASE_STOP 1
+# define STOPPED 2
+ word flags;
+# define FINISHED 1 /* Thread has exited. */
+# define DETACHED 2 /* Thread is intended to be detached. */
+# define CLIENT_OWNS_STACK 4
+ /* Stack was supplied by client. */
+ ptr_t stack;
+ ptr_t stack_ptr; /* Valid only when stopped. */
+ /* But must be within stack region at */
+ /* all times. */
+ size_t stack_size; /* 0 for original thread. */
+ void * status; /* Used only to avoid premature */
+ /* reclamation of any data it might */
+ /* reference. */
+} * GC_thread;
+
+GC_thread GC_lookup_thread(pthread_t id);
+
+/*
+ * The only way to suspend threads given the pthread interface is to send
+ * signals. Unfortunately, this means we have to reserve
+ * a signal, and intercept client calls to change the signal mask.
+ */
+# define SIG_SUSPEND (SIGRTMIN + 6)
+
+pthread_mutex_t GC_suspend_lock = PTHREAD_MUTEX_INITIALIZER;
+ /* Number of threads stopped so far */
+pthread_cond_t GC_suspend_ack_cv = PTHREAD_COND_INITIALIZER;
+pthread_cond_t GC_continue_cv = PTHREAD_COND_INITIALIZER;
+
+void GC_suspend_handler(int sig)
+{
+ int dummy;
+ GC_thread me;
+ sigset_t all_sigs;
+ sigset_t old_sigs;
+ int i;
+
+ if (sig != SIG_SUSPEND) ABORT("Bad signal in suspend_handler");
+ me = GC_lookup_thread(pthread_self());
+ /* The lookup here is safe, since I'm doing this on behalf */
+ /* of a thread which holds the allocation lock in order */
+ /* to stop the world. Thus concurrent modification of the */
+ /* data structure is impossible. */
+ if (PLEASE_STOP != me -> stop) {
+ /* Misdirected signal. */
+ pthread_mutex_unlock(&GC_suspend_lock);
+ return;
+ }
+ pthread_mutex_lock(&GC_suspend_lock);
+ me -> stack_ptr = (ptr_t)(&dummy);
+ me -> stop = STOPPED;
+ pthread_cond_signal(&GC_suspend_ack_cv);
+ pthread_cond_wait(&GC_continue_cv, &GC_suspend_lock);
+ pthread_mutex_unlock(&GC_suspend_lock);
+ /* GC_printf1("Continuing 0x%x\n", pthread_self()); */
+}
+
+
+GC_bool GC_thr_initialized = FALSE;
+
+size_t GC_min_stack_sz;
+
+size_t GC_page_sz;
+
+# define N_FREE_LISTS 25
+ptr_t GC_stack_free_lists[N_FREE_LISTS] = { 0 };
+ /* GC_stack_free_lists[i] is free list for stacks of */
+ /* size GC_min_stack_sz*2**i. */
+ /* Free lists are linked through first word. */
+
+/* Return a stack of size at least *stack_size. *stack_size is */
+/* replaced by the actual stack size. */
+/* Caller holds allocation lock. */
+ptr_t GC_stack_alloc(size_t * stack_size)
+{
+ register size_t requested_sz = *stack_size;
+ register size_t search_sz = GC_min_stack_sz;
+ register int index = 0; /* = log2(search_sz/GC_min_stack_sz) */
+ register ptr_t result;
+
+ while (search_sz < requested_sz) {
+ search_sz *= 2;
+ index++;
+ }
+ if ((result = GC_stack_free_lists[index]) == 0
+ && (result = GC_stack_free_lists[index+1]) != 0) {
+ /* Try next size up. */
+ search_sz *= 2; index++;
+ }
+ if (result != 0) {
+ GC_stack_free_lists[index] = *(ptr_t *)result;
+ } else {
+ result = (ptr_t) GC_scratch_alloc(search_sz + 2*GC_page_sz);
+ result = (ptr_t)(((word)result + GC_page_sz) & ~(GC_page_sz - 1));
+ /* Protect hottest page to detect overflow. */
+ /* mprotect(result, GC_page_sz, PROT_NONE); */
+ result += GC_page_sz;
+ }
+ *stack_size = search_sz;
+ return(result);
+}
+
+/* Caller holds allocation lock. */
+void GC_stack_free(ptr_t stack, size_t size)
+{
+ register int index = 0;
+ register size_t search_sz = GC_min_stack_sz;
+
+ while (search_sz < size) {
+ search_sz *= 2;
+ index++;
+ }
+ if (search_sz != size) ABORT("Bad stack size");
+ *(ptr_t *)stack = GC_stack_free_lists[index];
+ GC_stack_free_lists[index] = stack;
+}
+
+
+
+# define THREAD_TABLE_SZ 128 /* Must be power of 2 */
+volatile GC_thread GC_threads[THREAD_TABLE_SZ];
+
+/* Add a thread to GC_threads. We assume it wasn't already there. */
+/* Caller holds allocation lock. */
+GC_thread GC_new_thread(pthread_t id)
+{
+ int hv = ((word)id) % THREAD_TABLE_SZ;
+ GC_thread result;
+ static struct GC_Thread_Rep first_thread;
+ static GC_bool first_thread_used = FALSE;
+
+ if (!first_thread_used) {
+ result = &first_thread;
+ first_thread_used = TRUE;
+ /* Dont acquire allocation lock, since we may already hold it. */
+ } else {
+ result = (struct GC_Thread_Rep *)
+ GC_generic_malloc_inner(sizeof(struct GC_Thread_Rep), NORMAL);
+ }
+ if (result == 0) return(0);
+ result -> id = id;
+ result -> next = GC_threads[hv];
+ GC_threads[hv] = result;
+ /* result -> flags = 0; */
+ /* result -> stop = 0; */
+ return(result);
+}
+
+/* Delete a thread from GC_threads. We assume it is there. */
+/* (The code intentionally traps if it wasn't.) */
+/* Caller holds allocation lock. */
+void GC_delete_thread(pthread_t id)
+{
+ int hv = ((word)id) % THREAD_TABLE_SZ;
+ register GC_thread p = GC_threads[hv];
+ register GC_thread prev = 0;
+
+ while (!pthread_equal(p -> id, id)) {
+ prev = p;
+ p = p -> next;
+ }
+ if (prev == 0) {
+ GC_threads[hv] = p -> next;
+ } else {
+ prev -> next = p -> next;
+ }
+}
+
+/* If a thread has been joined, but we have not yet */
+/* been notified, then there may be more than one thread */
+/* in the table with the same pthread id. */
+/* This is OK, but we need a way to delete a specific one. */
+void GC_delete_gc_thread(pthread_t id, GC_thread gc_id)
+{
+ int hv = ((word)id) % THREAD_TABLE_SZ;
+ register GC_thread p = GC_threads[hv];
+ register GC_thread prev = 0;
+
+ while (p != gc_id) {
+ prev = p;
+ p = p -> next;
+ }
+ if (prev == 0) {
+ GC_threads[hv] = p -> next;
+ } else {
+ prev -> next = p -> next;
+ }
+}
+
+/* Return a GC_thread corresponding to a given thread_t. */
+/* Returns 0 if it's not there. */
+/* Caller holds allocation lock or otherwise inhibits */
+/* updates. */
+/* If there is more than one thread with the given id we */
+/* return the most recent one. */
+GC_thread GC_lookup_thread(pthread_t id)
+{
+ int hv = ((word)id) % THREAD_TABLE_SZ;
+ register GC_thread p = GC_threads[hv];
+
+ while (p != 0 && !pthread_equal(p -> id, id)) p = p -> next;
+ return(p);
+}
+
+
+/* Caller holds allocation lock. */
+void GC_stop_world()
+{
+ pthread_t my_thread = pthread_self();
+ register int i;
+ register GC_thread p;
+ register int result;
+ struct timespec timeout;
+
+ for (i = 0; i < THREAD_TABLE_SZ; i++) {
+ for (p = GC_threads[i]; p != 0; p = p -> next) {
+ if (p -> id != my_thread) {
+ if (p -> flags & FINISHED) {
+ p -> stop = STOPPED;
+ continue;
+ }
+ p -> stop = PLEASE_STOP;
+ result = pthread_kill(p -> id, SIG_SUSPEND);
+ /* GC_printf1("Sent signal to 0x%x\n", p -> id); */
+ switch(result) {
+ case ESRCH:
+ /* Not really there anymore. Possible? */
+ p -> stop = STOPPED;
+ break;
+ case 0:
+ break;
+ default:
+ ABORT("pthread_kill failed");
+ }
+ }
+ }
+ }
+ pthread_mutex_lock(&GC_suspend_lock);
+ for (i = 0; i < THREAD_TABLE_SZ; i++) {
+ for (p = GC_threads[i]; p != 0; p = p -> next) {
+ while (p -> id != my_thread && p -> stop != STOPPED) {
+ clock_gettime(CLOCK_REALTIME, &timeout);
+ timeout.tv_nsec += 50000000; /* 50 msecs */
+ if (timeout.tv_nsec >= 1000000000) {
+ timeout.tv_nsec -= 1000000000;
+ ++timeout.tv_sec;
+ }
+ result = pthread_cond_timedwait(&GC_suspend_ack_cv,
+ &GC_suspend_lock,
+ &timeout);
+ if (result == ETIMEDOUT) {
+ /* Signal was lost or misdirected. Try again. */
+ /* Duplicate signals should be benign. */
+ result = pthread_kill(p -> id, SIG_SUSPEND);
+ }
+ }
+ }
+ }
+ pthread_mutex_unlock(&GC_suspend_lock);
+ /* GC_printf1("World stopped 0x%x\n", pthread_self()); */
+}
+
+/* Caller holds allocation lock. */
+void GC_start_world()
+{
+ GC_thread p;
+ unsigned i;
+
+ /* GC_printf0("World starting\n"); */
+ for (i = 0; i < THREAD_TABLE_SZ; i++) {
+ for (p = GC_threads[i]; p != 0; p = p -> next) {
+ p -> stop = NOT_STOPPED;
+ }
+ }
+ pthread_mutex_lock(&GC_suspend_lock);
+ /* All other threads are at pthread_cond_wait in signal handler. */
+ /* Otherwise we couldn't have acquired the lock. */
+ pthread_mutex_unlock(&GC_suspend_lock);
+ pthread_cond_broadcast(&GC_continue_cv);
+}
+
+# ifdef MMAP_STACKS
+--> not really supported yet.
+int GC_is_thread_stack(ptr_t addr)
+{
+ register int i;
+ register GC_thread p;
+
+ for (i = 0; i < THREAD_TABLE_SZ; i++) {
+ for (p = GC_threads[i]; p != 0; p = p -> next) {
+ if (p -> stack_size != 0) {
+ if (p -> stack <= addr &&
+ addr < p -> stack + p -> stack_size)
+ return 1;
+ }
+ }
+ }
+ return 0;
+}
+# endif
+
+/* We hold allocation lock. We assume the world is stopped. */
+void GC_push_all_stacks()
+{
+ register int i;
+ register GC_thread p;
+ register ptr_t sp = GC_approx_sp();
+ register ptr_t lo, hi;
+ pthread_t me = pthread_self();
+
+ if (!GC_thr_initialized) GC_thr_init();
+ /* GC_printf1("Pushing stacks from thread 0x%x\n", me); */
+ for (i = 0; i < THREAD_TABLE_SZ; i++) {
+ for (p = GC_threads[i]; p != 0; p = p -> next) {
+ if (p -> flags & FINISHED) continue;
+ if (pthread_equal(p -> id, me)) {
+ lo = GC_approx_sp();
+ } else {
+ lo = p -> stack_ptr;
+ }
+ if (p -> stack_size != 0) {
+ hi = p -> stack + p -> stack_size;
+ } else {
+ /* The original stack. */
+ hi = GC_stackbottom;
+ }
+ GC_push_all_stack(lo, hi);
+ }
+ }
+}
+
+
+/* We hold the allocation lock. */
+void GC_thr_init()
+{
+ GC_thread t;
+ struct sigaction act;
+
+ GC_thr_initialized = TRUE;
+ GC_min_stack_sz = HBLKSIZE;
+ GC_page_sz = sysconf(_SC_PAGESIZE);
+ (void) sigaction(SIG_SUSPEND, 0, &act);
+ if (act.sa_handler != SIG_DFL)
+ ABORT("Previously installed SIG_SUSPEND handler");
+ /* Install handler. */
+ act.sa_handler = GC_suspend_handler;
+ act.sa_flags = SA_RESTART;
+ (void) sigemptyset(&act.sa_mask);
+ if (0 != sigaction(SIG_SUSPEND, &act, 0))
+ ABORT("Failed to install SIG_SUSPEND handler");
+ /* Add the initial thread, so we can stop it. */
+ t = GC_new_thread(pthread_self());
+ t -> stack_size = 0;
+ t -> stack_ptr = (ptr_t)(&t);
+ t -> flags = DETACHED;
+}
+
+int GC_pthread_sigmask(int how, const sigset_t *set, sigset_t *oset)
+{
+ sigset_t fudged_set;
+
+ if (set != NULL && (how == SIG_BLOCK || how == SIG_SETMASK)) {
+ fudged_set = *set;
+ sigdelset(&fudged_set, SIG_SUSPEND);
+ set = &fudged_set;
+ }
+ return(pthread_sigmask(how, set, oset));
+}
+
+struct start_info {
+ void *(*start_routine)(void *);
+ void *arg;
+};
+
+void GC_thread_exit_proc(void *dummy)
+{
+ GC_thread me;
+
+ LOCK();
+ me = GC_lookup_thread(pthread_self());
+ if (me -> flags & DETACHED) {
+ GC_delete_thread(pthread_self());
+ } else {
+ me -> flags |= FINISHED;
+ }
+ UNLOCK();
+}
+
+int GC_pthread_join(pthread_t thread, void **retval)
+{
+ int result;
+ GC_thread thread_gc_id;
+
+ LOCK();
+ thread_gc_id = GC_lookup_thread(thread);
+ /* This is guaranteed to be the intended one, since the thread id */
+ /* cant have been recycled by pthreads. */
+ UNLOCK();
+ result = pthread_join(thread, retval);
+ LOCK();
+ /* Here the pthread thread id may have been recycled. */
+ GC_delete_gc_thread(thread, thread_gc_id);
+ UNLOCK();
+ return result;
+}
+
+void * GC_start_routine(void * arg)
+{
+ struct start_info * si = arg;
+ void * result;
+ GC_thread me;
+
+ LOCK();
+ me = GC_lookup_thread(pthread_self());
+ UNLOCK();
+ pthread_cleanup_push(GC_thread_exit_proc, 0);
+ result = (*(si -> start_routine))(si -> arg);
+ me -> status = result;
+ me -> flags |= FINISHED;
+ pthread_cleanup_pop(1);
+ /* This involves acquiring the lock, ensuring that we can't exit */
+ /* while a collection that thinks we're alive is trying to stop */
+ /* us. */
+ return(result);
+}
+
+int
+GC_pthread_create(pthread_t *new_thread,
+ const pthread_attr_t *attr,
+ void *(*start_routine)(void *), void *arg)
+{
+ int result;
+ GC_thread t;
+ pthread_t my_new_thread;
+ void * stack;
+ size_t stacksize;
+ pthread_attr_t new_attr;
+ int detachstate;
+ word my_flags = 0;
+ struct start_info * si = GC_malloc(sizeof(struct start_info));
+
+ if (0 == si) return(ENOMEM);
+ si -> start_routine = start_routine;
+ si -> arg = arg;
+ LOCK();
+ if (!GC_thr_initialized) GC_thr_init();
+ if (NULL == attr) {
+ stack = 0;
+ (void) pthread_attr_init(&new_attr);
+ } else {
+ new_attr = *attr;
+ pthread_attr_getstackaddr(&new_attr, &stack);
+ }
+ pthread_attr_getstacksize(&new_attr, &stacksize);
+ pthread_attr_getdetachstate(&new_attr, &detachstate);
+ if (stacksize < GC_min_stack_sz) ABORT("Stack too small");
+ if (0 == stack) {
+ stack = (void *)GC_stack_alloc(&stacksize);
+ if (0 == stack) {
+ UNLOCK();
+ return(ENOMEM);
+ }
+ pthread_attr_setstackaddr(&new_attr, stack);
+ } else {
+ my_flags |= CLIENT_OWNS_STACK;
+ }
+ if (PTHREAD_CREATE_DETACHED == detachstate) my_flags |= DETACHED;
+ result = pthread_create(&my_new_thread, &new_attr, GC_start_routine, si);
+ /* No GC can start until the thread is registered, since we hold */
+ /* the allocation lock. */
+ if (0 == result) {
+ t = GC_new_thread(my_new_thread);
+ t -> flags = my_flags;
+ t -> stack = stack;
+ t -> stack_size = stacksize;
+ t -> stack_ptr = (ptr_t)stack + stacksize - sizeof(word);
+ if (0 != new_thread) *new_thread = my_new_thread;
+ } else if (!(my_flags & CLIENT_OWNS_STACK)) {
+ GC_stack_free(stack, stacksize);
+ }
+ UNLOCK();
+ /* pthread_attr_destroy(&new_attr); */
+ return(result);
+}
+
+GC_bool GC_collecting = 0; /* A hint that we're in the collector and */
+ /* holding the allocation lock for an */
+ /* extended period. */
+
+/* Reasonably fast spin locks. Basically the same implementation */
+/* as STL alloc.h. This isn't really the right way to do this. */
+/* but until the POSIX scheduling mess gets straightened out ... */
+
+unsigned long GC_allocate_lock = 0;
+
+#define SLEEP_THRESHOLD 3
+
+void GC_lock()
+{
+# define low_spin_max 30 /* spin cycles if we suspect uniprocessor */
+# define high_spin_max 1000 /* spin cycles for multiprocessor */
+ static unsigned spin_max = low_spin_max;
+ unsigned my_spin_max;
+ static unsigned last_spins = 0;
+ unsigned my_last_spins;
+ volatile unsigned junk;
+# define PAUSE junk *= junk; junk *= junk; junk *= junk; junk *= junk
+ int i;
+
+ if (!GC_test_and_set(&GC_allocate_lock, 1)) {
+ return;
+ }
+ junk = 0;
+ my_spin_max = spin_max;
+ my_last_spins = last_spins;
+ for (i = 0; i < my_spin_max; i++) {
+ if (GC_collecting) goto yield;
+ if (i < my_last_spins/2 || GC_allocate_lock) {
+ PAUSE;
+ continue;
+ }
+ if (!GC_test_and_set(&GC_allocate_lock, 1)) {
+ /*
+ * got it!
+ * Spinning worked. Thus we're probably not being scheduled
+ * against the other process with which we were contending.
+ * Thus it makes sense to spin longer the next time.
+ */
+ last_spins = i;
+ spin_max = high_spin_max;
+ return;
+ }
+ }
+ /* We are probably being scheduled against the other process. Sleep. */
+ spin_max = low_spin_max;
+yield:
+ for (i = 0;; ++i) {
+ if (!GC_test_and_set(&GC_allocate_lock, 1)) {
+ return;
+ }
+ if (i < SLEEP_THRESHOLD) {
+ sched_yield();
+ } else {
+ struct timespec ts;
+
+ if (i > 26) i = 26;
+ /* Don't wait for more than about 60msecs, even */
+ /* under extreme contention. */
+ ts.tv_sec = 0;
+ ts.tv_nsec = 1 << i;
+ nanosleep(&ts, 0);
+ }
+ }
+}
+
+
+
+# else
+
+#ifndef LINT
+ int GC_no_Irix_threads;
+#endif
+
+# endif /* IRIX_THREADS */
+
diff --git a/boehm-gc/linux_threads.c b/boehm-gc/linux_threads.c
new file mode 100644
index 00000000000..f83e1dd37b2
--- /dev/null
+++ b/boehm-gc/linux_threads.c
@@ -0,0 +1,647 @@
+/*
+ * Copyright (c) 1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996 by Silicon Graphics. All rights reserved.
+ * Copyright (c) 1998 by Fergus Henderson. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+/*
+ * Support code for LinuxThreads, the clone()-based kernel
+ * thread package for Linux which is included in libc6.
+ *
+ * This code relies on implementation details of LinuxThreads,
+ * (i.e. properties not guaranteed by the Pthread standard):
+ *
+ * - the function GC_linux_thread_top_of_stack(void)
+ * relies on the way LinuxThreads lays out thread stacks
+ * in the address space.
+ *
+ * Note that there is a lot of code duplication between linux_threads.c
+ * and irix_threads.c; any changes made here may need to be reflected
+ * there too.
+ */
+
+# if defined(LINUX_THREADS)
+
+# include "gc_priv.h"
+# include <pthread.h>
+# include <time.h>
+# include <errno.h>
+# include <unistd.h>
+# include <sys/mman.h>
+# include <sys/time.h>
+# include <semaphore.h>
+
+#undef pthread_create
+#undef pthread_sigmask
+#undef pthread_join
+
+void GC_thr_init();
+
+#if 0
+void GC_print_sig_mask()
+{
+ sigset_t blocked;
+ int i;
+
+ if (pthread_sigmask(SIG_BLOCK, NULL, &blocked) != 0)
+ ABORT("pthread_sigmask");
+ GC_printf0("Blocked: ");
+ for (i = 1; i <= MAXSIG; i++) {
+ if (sigismember(&blocked, i)) { GC_printf1("%ld ",(long) i); }
+ }
+ GC_printf0("\n");
+}
+#endif
+
+/* We use the allocation lock to protect thread-related data structures. */
+
+/* The set of all known threads. We intercept thread creation and */
+/* joins. We never actually create detached threads. We allocate all */
+/* new thread stacks ourselves. These allow us to maintain this */
+/* data structure. */
+/* Protected by GC_thr_lock. */
+/* Some of this should be declared volatile, but that's incosnsistent */
+/* with some library routine declarations. */
+typedef struct GC_Thread_Rep {
+ struct GC_Thread_Rep * next; /* More recently allocated threads */
+ /* with a given pthread id come */
+ /* first. (All but the first are */
+ /* guaranteed to be dead, but we may */
+ /* not yet have registered the join.) */
+ pthread_t id;
+ word flags;
+# define FINISHED 1 /* Thread has exited. */
+# define DETACHED 2 /* Thread is intended to be detached. */
+# define MAIN_THREAD 4 /* True for the original thread only. */
+
+ ptr_t stack_end;
+ ptr_t stack_ptr; /* Valid only when stopped. */
+ int signal;
+ void * status; /* The value returned from the thread. */
+ /* Used only to avoid premature */
+ /* reclamation of any data it might */
+ /* reference. */
+} * GC_thread;
+
+GC_thread GC_lookup_thread(pthread_t id);
+
+/*
+ * The only way to suspend threads given the pthread interface is to send
+ * signals. We can't use SIGSTOP directly, because we need to get the
+ * thread to save its stack pointer in the GC thread table before
+ * suspending. So we have to reserve a signal of our own for this.
+ * This means we have to intercept client calls to change the signal mask.
+ * The linuxthreads package already uses SIGUSR1 and SIGUSR2,
+ * so we need to reuse something else. I chose SIGPWR.
+ * (Perhaps SIGUNUSED would be a better choice.)
+ */
+#define SIG_SUSPEND SIGPWR
+
+#define SIG_RESTART SIGXCPU
+
+sem_t GC_suspend_ack_sem;
+
+/*
+GC_linux_thread_top_of_stack() relies on implementation details of
+LinuxThreads, namely that thread stacks are allocated on 2M boundaries
+and grow to no more than 2M.
+To make sure that we're using LinuxThreads and not some other thread
+package, we generate a dummy reference to `__pthread_initial_thread_bos',
+which is a symbol defined in LinuxThreads, but (hopefully) not in other
+thread packages.
+*/
+#if 0
+/* Note: on Caldera OpenLinux, this symbols is `local' in the
+ libpthread.so (but not in libpthread.a). We don't really need
+ this, so we just comment it out. */
+extern char * __pthread_initial_thread_bos;
+char **dummy_var_to_force_linux_threads = &__pthread_initial_thread_bos;
+#endif
+
+#define LINUX_THREADS_STACK_SIZE (2 * 1024 * 1024)
+
+static inline ptr_t GC_linux_thread_top_of_stack(void)
+{
+ char *sp = GC_approx_sp();
+ ptr_t tos = (ptr_t) (((unsigned long)sp | (LINUX_THREADS_STACK_SIZE - 1)) + 1);
+#if DEBUG_THREADS
+ GC_printf1("SP = %lx\n", (unsigned long)sp);
+ GC_printf1("TOS = %lx\n", (unsigned long)tos);
+#endif
+ return tos;
+}
+
+void GC_suspend_handler(int sig)
+{
+ int dummy;
+ pthread_t my_thread = pthread_self();
+ GC_thread me;
+ sigset_t all_sigs;
+ sigset_t old_sigs;
+ int i;
+ sigset_t mask;
+
+ if (sig != SIG_SUSPEND) ABORT("Bad signal in suspend_handler");
+
+#if DEBUG_THREADS
+ GC_printf1("Suspending 0x%x\n", my_thread);
+#endif
+
+ me = GC_lookup_thread(my_thread);
+ /* The lookup here is safe, since I'm doing this on behalf */
+ /* of a thread which holds the allocation lock in order */
+ /* to stop the world. Thus concurrent modification of the */
+ /* data structure is impossible. */
+ me -> stack_ptr = (ptr_t)(&dummy);
+ me -> stack_end = GC_linux_thread_top_of_stack();
+
+ /* Tell the thread that wants to stop the world that this */
+ /* thread has been stopped. Note that sem_post() is */
+ /* the only async-signal-safe primitive in LinuxThreads. */
+ sem_post(&GC_suspend_ack_sem);
+
+ /* Wait until that thread tells us to restart by sending */
+ /* this thread a SIG_RESTART signal. */
+ /* SIG_RESTART should be masked at this point. Thus there */
+ /* is no race. */
+ if (sigfillset(&mask) != 0) ABORT("sigfillset() failed");
+ if (sigdelset(&mask, SIG_RESTART) != 0) ABORT("sigdelset() failed");
+ do {
+ me->signal = 0;
+ sigsuspend(&mask); /* Wait for signal */
+ } while (me->signal != SIG_RESTART);
+
+#if DEBUG_THREADS
+ GC_printf1("Continuing 0x%x\n", my_thread);
+#endif
+}
+
+void GC_restart_handler(int sig)
+{
+ GC_thread me;
+
+ if (sig != SIG_RESTART) ABORT("Bad signal in suspend_handler");
+
+ /* Let the GC_suspend_handler() know that we got a SIG_RESTART. */
+ /* The lookup here is safe, since I'm doing this on behalf */
+ /* of a thread which holds the allocation lock in order */
+ /* to stop the world. Thus concurrent modification of the */
+ /* data structure is impossible. */
+ me = GC_lookup_thread(pthread_self());
+ me->signal = SIG_RESTART;
+
+ /*
+ ** Note: even if we didn't do anything useful here,
+ ** it would still be necessary to have a signal handler,
+ ** rather than ignoring the signals, otherwise
+ ** the signals will not be delivered at all, and
+ ** will thus not interrupt the sigsuspend() above.
+ */
+
+#if DEBUG_THREADS
+ GC_printf1("In GC_restart_handler for 0x%x\n", pthread_self());
+#endif
+}
+
+GC_bool GC_thr_initialized = FALSE;
+
+# define THREAD_TABLE_SZ 128 /* Must be power of 2 */
+volatile GC_thread GC_threads[THREAD_TABLE_SZ];
+
+/* Add a thread to GC_threads. We assume it wasn't already there. */
+/* Caller holds allocation lock. */
+GC_thread GC_new_thread(pthread_t id)
+{
+ int hv = ((word)id) % THREAD_TABLE_SZ;
+ GC_thread result;
+ static struct GC_Thread_Rep first_thread;
+ static GC_bool first_thread_used = FALSE;
+
+ if (!first_thread_used) {
+ result = &first_thread;
+ first_thread_used = TRUE;
+ /* Dont acquire allocation lock, since we may already hold it. */
+ } else {
+ result = (struct GC_Thread_Rep *)
+ GC_generic_malloc_inner(sizeof(struct GC_Thread_Rep), NORMAL);
+ }
+ if (result == 0) return(0);
+ result -> id = id;
+ result -> next = GC_threads[hv];
+ GC_threads[hv] = result;
+ /* result -> flags = 0; */
+ return(result);
+}
+
+/* Delete a thread from GC_threads. We assume it is there. */
+/* (The code intentionally traps if it wasn't.) */
+/* Caller holds allocation lock. */
+void GC_delete_thread(pthread_t id)
+{
+ int hv = ((word)id) % THREAD_TABLE_SZ;
+ register GC_thread p = GC_threads[hv];
+ register GC_thread prev = 0;
+
+ while (!pthread_equal(p -> id, id)) {
+ prev = p;
+ p = p -> next;
+ }
+ if (prev == 0) {
+ GC_threads[hv] = p -> next;
+ } else {
+ prev -> next = p -> next;
+ }
+}
+
+/* If a thread has been joined, but we have not yet */
+/* been notified, then there may be more than one thread */
+/* in the table with the same pthread id. */
+/* This is OK, but we need a way to delete a specific one. */
+void GC_delete_gc_thread(pthread_t id, GC_thread gc_id)
+{
+ int hv = ((word)id) % THREAD_TABLE_SZ;
+ register GC_thread p = GC_threads[hv];
+ register GC_thread prev = 0;
+
+ while (p != gc_id) {
+ prev = p;
+ p = p -> next;
+ }
+ if (prev == 0) {
+ GC_threads[hv] = p -> next;
+ } else {
+ prev -> next = p -> next;
+ }
+}
+
+/* Return a GC_thread corresponding to a given thread_t. */
+/* Returns 0 if it's not there. */
+/* Caller holds allocation lock or otherwise inhibits */
+/* updates. */
+/* If there is more than one thread with the given id we */
+/* return the most recent one. */
+GC_thread GC_lookup_thread(pthread_t id)
+{
+ int hv = ((word)id) % THREAD_TABLE_SZ;
+ register GC_thread p = GC_threads[hv];
+
+ while (p != 0 && !pthread_equal(p -> id, id)) p = p -> next;
+ return(p);
+}
+
+/* Caller holds allocation lock. */
+void GC_stop_world()
+{
+ pthread_t my_thread = pthread_self();
+ register int i;
+ register GC_thread p;
+ register int n_live_threads = 0;
+ register int result;
+
+ for (i = 0; i < THREAD_TABLE_SZ; i++) {
+ for (p = GC_threads[i]; p != 0; p = p -> next) {
+ if (p -> id != my_thread) {
+ if (p -> flags & FINISHED) continue;
+ n_live_threads++;
+ #if DEBUG_THREADS
+ GC_printf1("Sending suspend signal to 0x%x\n", p -> id);
+ #endif
+ result = pthread_kill(p -> id, SIG_SUSPEND);
+ switch(result) {
+ case ESRCH:
+ /* Not really there anymore. Possible? */
+ n_live_threads--;
+ break;
+ case 0:
+ break;
+ default:
+ ABORT("pthread_kill failed");
+ }
+ }
+ }
+ }
+ for (i = 0; i < n_live_threads; i++) {
+ sem_wait(&GC_suspend_ack_sem);
+ }
+ #if DEBUG_THREADS
+ GC_printf1("World stopped 0x%x\n", pthread_self());
+ #endif
+}
+
+/* Caller holds allocation lock. */
+void GC_start_world()
+{
+ pthread_t my_thread = pthread_self();
+ register int i;
+ register GC_thread p;
+ register int n_live_threads = 0;
+ register int result;
+
+# if DEBUG_THREADS
+ GC_printf0("World starting\n");
+# endif
+
+ for (i = 0; i < THREAD_TABLE_SZ; i++) {
+ for (p = GC_threads[i]; p != 0; p = p -> next) {
+ if (p -> id != my_thread) {
+ if (p -> flags & FINISHED) continue;
+ n_live_threads++;
+ #if DEBUG_THREADS
+ GC_printf1("Sending restart signal to 0x%x\n", p -> id);
+ #endif
+ result = pthread_kill(p -> id, SIG_RESTART);
+ switch(result) {
+ case ESRCH:
+ /* Not really there anymore. Possible? */
+ n_live_threads--;
+ break;
+ case 0:
+ break;
+ default:
+ ABORT("pthread_kill failed");
+ }
+ }
+ }
+ }
+ #if DEBUG_THREADS
+ GC_printf0("World started\n");
+ #endif
+}
+
+/* We hold allocation lock. We assume the world is stopped. */
+void GC_push_all_stacks()
+{
+ register int i;
+ register GC_thread p;
+ register ptr_t sp = GC_approx_sp();
+ register ptr_t lo, hi;
+ pthread_t me = pthread_self();
+
+ if (!GC_thr_initialized) GC_thr_init();
+ #if DEBUG_THREADS
+ GC_printf1("Pushing stacks from thread 0x%lx\n", (unsigned long) me);
+ #endif
+ for (i = 0; i < THREAD_TABLE_SZ; i++) {
+ for (p = GC_threads[i]; p != 0; p = p -> next) {
+ if (p -> flags & FINISHED) continue;
+ if (pthread_equal(p -> id, me)) {
+ lo = GC_approx_sp();
+ } else {
+ lo = p -> stack_ptr;
+ }
+ if ((p -> flags & MAIN_THREAD) == 0) {
+ if (pthread_equal(p -> id, me)) {
+ hi = GC_linux_thread_top_of_stack();
+ } else {
+ hi = p -> stack_end;
+ }
+ } else {
+ /* The original stack. */
+ hi = GC_stackbottom;
+ }
+ #if DEBUG_THREADS
+ GC_printf3("Stack for thread 0x%lx = [%lx,%lx)\n",
+ (unsigned long) p -> id,
+ (unsigned long) lo, (unsigned long) hi);
+ #endif
+ GC_push_all_stack(lo, hi);
+ }
+ }
+}
+
+
+/* We hold the allocation lock. */
+void GC_thr_init()
+{
+ GC_thread t;
+ struct sigaction act;
+
+ GC_thr_initialized = TRUE;
+
+ if (sem_init(&GC_suspend_ack_sem, 0, 0) != 0)
+ ABORT("sem_init failed");
+
+ act.sa_flags = SA_RESTART;
+ if (sigfillset(&act.sa_mask) != 0) {
+ ABORT("sigfillset() failed");
+ }
+ /* SIG_RESTART is unmasked by the handler when necessary. */
+ act.sa_handler = GC_suspend_handler;
+ if (sigaction(SIG_SUSPEND, &act, NULL) != 0) {
+ ABORT("Cannot set SIG_SUSPEND handler");
+ }
+
+ act.sa_handler = GC_restart_handler;
+ if (sigaction(SIG_RESTART, &act, NULL) != 0) {
+ ABORT("Cannot set SIG_SUSPEND handler");
+ }
+
+ /* Add the initial thread, so we can stop it. */
+ t = GC_new_thread(pthread_self());
+ t -> stack_ptr = (ptr_t)(&t);
+ t -> flags = DETACHED | MAIN_THREAD;
+}
+
+int GC_pthread_sigmask(int how, const sigset_t *set, sigset_t *oset)
+{
+ sigset_t fudged_set;
+
+ if (set != NULL && (how == SIG_BLOCK || how == SIG_SETMASK)) {
+ fudged_set = *set;
+ sigdelset(&fudged_set, SIG_SUSPEND);
+ set = &fudged_set;
+ }
+ return(pthread_sigmask(how, set, oset));
+}
+
+struct start_info {
+ void *(*start_routine)(void *);
+ void *arg;
+};
+
+void GC_thread_exit_proc(void *dummy)
+{
+ GC_thread me;
+
+ LOCK();
+ me = GC_lookup_thread(pthread_self());
+ if (me -> flags & DETACHED) {
+ GC_delete_thread(pthread_self());
+ } else {
+ me -> flags |= FINISHED;
+ }
+ UNLOCK();
+}
+
+int GC_pthread_join(pthread_t thread, void **retval)
+{
+ int result;
+ GC_thread thread_gc_id;
+
+ LOCK();
+ thread_gc_id = GC_lookup_thread(thread);
+ /* This is guaranteed to be the intended one, since the thread id */
+ /* cant have been recycled by pthreads. */
+ UNLOCK();
+ result = pthread_join(thread, retval);
+ LOCK();
+ /* Here the pthread thread id may have been recycled. */
+ GC_delete_gc_thread(thread, thread_gc_id);
+ UNLOCK();
+ return result;
+}
+
+void * GC_start_routine(void * arg)
+{
+ struct start_info * si = arg;
+ void * result;
+ GC_thread me;
+
+ LOCK();
+ me = GC_lookup_thread(pthread_self());
+ UNLOCK();
+ pthread_cleanup_push(GC_thread_exit_proc, 0);
+# ifdef DEBUG_THREADS
+ GC_printf1("Starting thread 0x%x\n", pthread_self());
+ GC_printf1("pid = %ld\n", (long) getpid());
+ GC_printf1("sp = 0x%lx\n", (long) &arg);
+# endif
+ result = (*(si -> start_routine))(si -> arg);
+#if DEBUG_THREADS
+ GC_printf1("Finishing thread 0x%x\n", pthread_self());
+#endif
+ me -> status = result;
+ me -> flags |= FINISHED;
+ pthread_cleanup_pop(1);
+ /* This involves acquiring the lock, ensuring that we can't exit */
+ /* while a collection that thinks we're alive is trying to stop */
+ /* us. */
+ return(result);
+}
+
+int
+GC_pthread_create(pthread_t *new_thread,
+ const pthread_attr_t *attr,
+ void *(*start_routine)(void *), void *arg)
+{
+ int result;
+ GC_thread t;
+ pthread_t my_new_thread;
+ void * stack;
+ size_t stacksize;
+ pthread_attr_t new_attr;
+ int detachstate;
+ word my_flags = 0;
+ struct start_info * si = GC_malloc(sizeof(struct start_info));
+
+ if (0 == si) return(ENOMEM);
+ si -> start_routine = start_routine;
+ si -> arg = arg;
+ LOCK();
+ if (!GC_thr_initialized) GC_thr_init();
+ if (NULL == attr) {
+ stack = 0;
+ (void) pthread_attr_init(&new_attr);
+ } else {
+ new_attr = *attr;
+ }
+ pthread_attr_getdetachstate(&new_attr, &detachstate);
+ if (PTHREAD_CREATE_DETACHED == detachstate) my_flags |= DETACHED;
+ result = pthread_create(&my_new_thread, &new_attr, GC_start_routine, si);
+ /* No GC can start until the thread is registered, since we hold */
+ /* the allocation lock. */
+ if (0 == result) {
+ t = GC_new_thread(my_new_thread);
+ t -> flags = my_flags;
+ t -> stack_ptr = 0;
+ t -> stack_end = 0;
+ if (0 != new_thread) *new_thread = my_new_thread;
+ }
+ UNLOCK();
+ /* pthread_attr_destroy(&new_attr); */
+ return(result);
+}
+
+GC_bool GC_collecting = 0;
+ /* A hint that we're in the collector and */
+ /* holding the allocation lock for an */
+ /* extended period. */
+
+/* Reasonably fast spin locks. Basically the same implementation */
+/* as STL alloc.h. This isn't really the right way to do this. */
+/* but until the POSIX scheduling mess gets straightened out ... */
+
+volatile unsigned int GC_allocate_lock = 0;
+
+
+void GC_lock()
+{
+# define low_spin_max 30 /* spin cycles if we suspect uniprocessor */
+# define high_spin_max 1000 /* spin cycles for multiprocessor */
+ static unsigned spin_max = low_spin_max;
+ unsigned my_spin_max;
+ static unsigned last_spins = 0;
+ unsigned my_last_spins;
+ volatile unsigned junk;
+# define PAUSE junk *= junk; junk *= junk; junk *= junk; junk *= junk
+ int i;
+
+ if (!GC_test_and_set(&GC_allocate_lock)) {
+ return;
+ }
+ junk = 0;
+ my_spin_max = spin_max;
+ my_last_spins = last_spins;
+ for (i = 0; i < my_spin_max; i++) {
+ if (GC_collecting) goto yield;
+ if (i < my_last_spins/2 || GC_allocate_lock) {
+ PAUSE;
+ continue;
+ }
+ if (!GC_test_and_set(&GC_allocate_lock)) {
+ /*
+ * got it!
+ * Spinning worked. Thus we're probably not being scheduled
+ * against the other process with which we were contending.
+ * Thus it makes sense to spin longer the next time.
+ */
+ last_spins = i;
+ spin_max = high_spin_max;
+ return;
+ }
+ }
+ /* We are probably being scheduled against the other process. Sleep. */
+ spin_max = low_spin_max;
+yield:
+ for (i = 0;; ++i) {
+ if (!GC_test_and_set(&GC_allocate_lock)) {
+ return;
+ }
+# define SLEEP_THRESHOLD 12
+ /* nanosleep(<= 2ms) just spins under Linux. We */
+ /* want to be careful to avoid that behavior. */
+ if (i < SLEEP_THRESHOLD) {
+ sched_yield();
+ } else {
+ struct timespec ts;
+
+ if (i > 26) i = 26;
+ /* Don't wait for more than about 60msecs, even */
+ /* under extreme contention. */
+ ts.tv_sec = 0;
+ ts.tv_nsec = 1 << i;
+ nanosleep(&ts, 0);
+ }
+ }
+}
+
+# endif /* LINUX_THREADS */
+
diff --git a/boehm-gc/mach_dep.c b/boehm-gc/mach_dep.c
new file mode 100644
index 00000000000..09a79883fdf
--- /dev/null
+++ b/boehm-gc/mach_dep.c
@@ -0,0 +1,411 @@
+/*
+ * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+/* Boehm, November 17, 1995 12:13 pm PST */
+# include "gc_priv.h"
+# include <stdio.h>
+# include <setjmp.h>
+# if defined(OS2) || defined(CX_UX)
+# define _setjmp(b) setjmp(b)
+# define _longjmp(b,v) longjmp(b,v)
+# endif
+# ifdef AMIGA
+# include <dos.h>
+# endif
+
+#if defined(__MWERKS__) && !defined(POWERPC)
+
+asm static void PushMacRegisters()
+{
+ sub.w #4,sp // reserve space for one parameter.
+ move.l a2,(sp)
+ jsr GC_push_one
+ move.l a3,(sp)
+ jsr GC_push_one
+ move.l a4,(sp)
+ jsr GC_push_one
+# if !__option(a6frames)
+ // <pcb> perhaps a6 should be pushed if stack frames are not being used.
+ move.l a6,(sp)
+ jsr GC_push_one
+# endif
+ // skip a5 (globals), a6 (frame pointer), and a7 (stack pointer)
+ move.l d2,(sp)
+ jsr GC_push_one
+ move.l d3,(sp)
+ jsr GC_push_one
+ move.l d4,(sp)
+ jsr GC_push_one
+ move.l d5,(sp)
+ jsr GC_push_one
+ move.l d6,(sp)
+ jsr GC_push_one
+ move.l d7,(sp)
+ jsr GC_push_one
+ add.w #4,sp // fix stack.
+ rts
+}
+
+#endif /* __MWERKS__ */
+
+/* Routine to mark from registers that are preserved by the C compiler. */
+/* This must be ported to every new architecture. There is a generic */
+/* version at the end, that is likely, but not guaranteed to work */
+/* on your architecture. Run the test_setjmp program to see whether */
+/* there is any chance it will work. */
+
+void GC_push_regs()
+{
+# ifdef RT
+ register long TMP_SP; /* must be bound to r11 */
+# endif
+# ifdef VAX
+ /* VAX - generic code below does not work under 4.2 */
+ /* r1 through r5 are caller save, and therefore */
+ /* on the stack or dead. */
+ asm("pushl r11"); asm("calls $1,_GC_push_one");
+ asm("pushl r10"); asm("calls $1,_GC_push_one");
+ asm("pushl r9"); asm("calls $1,_GC_push_one");
+ asm("pushl r8"); asm("calls $1,_GC_push_one");
+ asm("pushl r7"); asm("calls $1,_GC_push_one");
+ asm("pushl r6"); asm("calls $1,_GC_push_one");
+# endif
+# if defined(M68K) && (defined(SUNOS4) || defined(NEXT))
+ /* M68K SUNOS - could be replaced by generic code */
+ /* a0, a1 and d1 are caller save */
+ /* and therefore are on stack or dead. */
+
+ asm("subqw #0x4,sp"); /* allocate word on top of stack */
+
+ asm("movl a2,sp@"); asm("jbsr _GC_push_one");
+ asm("movl a3,sp@"); asm("jbsr _GC_push_one");
+ asm("movl a4,sp@"); asm("jbsr _GC_push_one");
+ asm("movl a5,sp@"); asm("jbsr _GC_push_one");
+ /* Skip frame pointer and stack pointer */
+ asm("movl d1,sp@"); asm("jbsr _GC_push_one");
+ asm("movl d2,sp@"); asm("jbsr _GC_push_one");
+ asm("movl d3,sp@"); asm("jbsr _GC_push_one");
+ asm("movl d4,sp@"); asm("jbsr _GC_push_one");
+ asm("movl d5,sp@"); asm("jbsr _GC_push_one");
+ asm("movl d6,sp@"); asm("jbsr _GC_push_one");
+ asm("movl d7,sp@"); asm("jbsr _GC_push_one");
+
+ asm("addqw #0x4,sp"); /* put stack back where it was */
+# endif
+
+# if defined(M68K) && defined(HP)
+ /* M68K HP - could be replaced by generic code */
+ /* a0, a1 and d1 are caller save. */
+
+ asm("subq.w &0x4,%sp"); /* allocate word on top of stack */
+
+ asm("mov.l %a2,(%sp)"); asm("jsr _GC_push_one");
+ asm("mov.l %a3,(%sp)"); asm("jsr _GC_push_one");
+ asm("mov.l %a4,(%sp)"); asm("jsr _GC_push_one");
+ asm("mov.l %a5,(%sp)"); asm("jsr _GC_push_one");
+ /* Skip frame pointer and stack pointer */
+ asm("mov.l %d1,(%sp)"); asm("jsr _GC_push_one");
+ asm("mov.l %d2,(%sp)"); asm("jsr _GC_push_one");
+ asm("mov.l %d3,(%sp)"); asm("jsr _GC_push_one");
+ asm("mov.l %d4,(%sp)"); asm("jsr _GC_push_one");
+ asm("mov.l %d5,(%sp)"); asm("jsr _GC_push_one");
+ asm("mov.l %d6,(%sp)"); asm("jsr _GC_push_one");
+ asm("mov.l %d7,(%sp)"); asm("jsr _GC_push_one");
+
+ asm("addq.w &0x4,%sp"); /* put stack back where it was */
+# endif /* M68K HP */
+
+# ifdef AMIGA
+ /* AMIGA - could be replaced by generic code */
+ /* a0, a1, d0 and d1 are caller save */
+ GC_push_one(getreg(REG_A2));
+ GC_push_one(getreg(REG_A3));
+ GC_push_one(getreg(REG_A4));
+ GC_push_one(getreg(REG_A5));
+ GC_push_one(getreg(REG_A6));
+ /* Skip stack pointer */
+ GC_push_one(getreg(REG_D2));
+ GC_push_one(getreg(REG_D3));
+ GC_push_one(getreg(REG_D4));
+ GC_push_one(getreg(REG_D5));
+ GC_push_one(getreg(REG_D6));
+ GC_push_one(getreg(REG_D7));
+# endif
+
+# if defined(M68K) && defined(MACOS)
+# if defined(THINK_C)
+# define PushMacReg(reg) \
+ move.l reg,(sp) \
+ jsr GC_push_one
+ asm {
+ sub.w #4,sp ; reserve space for one parameter.
+ PushMacReg(a2);
+ PushMacReg(a3);
+ PushMacReg(a4);
+ ; skip a5 (globals), a6 (frame pointer), and a7 (stack pointer)
+ PushMacReg(d2);
+ PushMacReg(d3);
+ PushMacReg(d4);
+ PushMacReg(d5);
+ PushMacReg(d6);
+ PushMacReg(d7);
+ add.w #4,sp ; fix stack.
+ }
+# undef PushMacReg
+# endif /* THINK_C */
+# if defined(__MWERKS__)
+ PushMacRegisters();
+# endif /* __MWERKS__ */
+# endif /* MACOS */
+
+# if defined(I386) &&!defined(OS2) &&!defined(SVR4) &&!defined(MSWIN32) \
+ && !defined(SCO) && !defined(SCO_ELF) && !(defined(LINUX) \
+ && defined(__ELF__)) && !defined(DOS4GW) && !defined(FREEBSD)
+ /* I386 code, generic code does not appear to work */
+ /* It does appear to work under OS2, and asms dont */
+ /* This is used for some 38g UNIX variants and for CYGWIN32 */
+ asm("pushl %eax"); asm("call _GC_push_one"); asm("addl $4,%esp");
+ asm("pushl %ecx"); asm("call _GC_push_one"); asm("addl $4,%esp");
+ asm("pushl %edx"); asm("call _GC_push_one"); asm("addl $4,%esp");
+ asm("pushl %ebp"); asm("call _GC_push_one"); asm("addl $4,%esp");
+ asm("pushl %esi"); asm("call _GC_push_one"); asm("addl $4,%esp");
+ asm("pushl %edi"); asm("call _GC_push_one"); asm("addl $4,%esp");
+ asm("pushl %ebx"); asm("call _GC_push_one"); asm("addl $4,%esp");
+# endif
+
+# if defined(I386) && (defined(LINUX) || defined(FREEBSD)) && defined(__ELF__)
+ /* This is modified for Linux/FreeBSD with ELF (Note: _ELF_ only) */
+ asm("pushl %eax"); asm("call GC_push_one"); asm("addl $4,%esp");
+ asm("pushl %ecx"); asm("call GC_push_one"); asm("addl $4,%esp");
+ asm("pushl %edx"); asm("call GC_push_one"); asm("addl $4,%esp");
+ asm("pushl %ebp"); asm("call GC_push_one"); asm("addl $4,%esp");
+ asm("pushl %esi"); asm("call GC_push_one"); asm("addl $4,%esp");
+ asm("pushl %edi"); asm("call GC_push_one"); asm("addl $4,%esp");
+ asm("pushl %ebx"); asm("call GC_push_one"); asm("addl $4,%esp");
+# endif
+
+# if defined(I386) && defined(MSWIN32) && !defined(USE_GENERIC)
+ /* I386 code, Microsoft variant */
+ __asm push eax
+ __asm call GC_push_one
+ __asm add esp,4
+ __asm push ebx
+ __asm call GC_push_one
+ __asm add esp,4
+ __asm push ecx
+ __asm call GC_push_one
+ __asm add esp,4
+ __asm push edx
+ __asm call GC_push_one
+ __asm add esp,4
+ __asm push ebp
+ __asm call GC_push_one
+ __asm add esp,4
+ __asm push esi
+ __asm call GC_push_one
+ __asm add esp,4
+ __asm push edi
+ __asm call GC_push_one
+ __asm add esp,4
+# endif
+
+# if defined(I386) && (defined(SVR4) || defined(SCO) || defined(SCO_ELF))
+ /* I386 code, SVR4 variant, generic code does not appear to work */
+ asm("pushl %eax"); asm("call GC_push_one"); asm("addl $4,%esp");
+ asm("pushl %ebx"); asm("call GC_push_one"); asm("addl $4,%esp");
+ asm("pushl %ecx"); asm("call GC_push_one"); asm("addl $4,%esp");
+ asm("pushl %edx"); asm("call GC_push_one"); asm("addl $4,%esp");
+ asm("pushl %ebp"); asm("call GC_push_one"); asm("addl $4,%esp");
+ asm("pushl %esi"); asm("call GC_push_one"); asm("addl $4,%esp");
+ asm("pushl %edi"); asm("call GC_push_one"); asm("addl $4,%esp");
+# endif
+
+# ifdef NS32K
+ asm ("movd r3, tos"); asm ("bsr ?_GC_push_one"); asm ("adjspb $-4");
+ asm ("movd r4, tos"); asm ("bsr ?_GC_push_one"); asm ("adjspb $-4");
+ asm ("movd r5, tos"); asm ("bsr ?_GC_push_one"); asm ("adjspb $-4");
+ asm ("movd r6, tos"); asm ("bsr ?_GC_push_one"); asm ("adjspb $-4");
+ asm ("movd r7, tos"); asm ("bsr ?_GC_push_one"); asm ("adjspb $-4");
+# endif
+
+# ifdef SPARC
+ {
+ word GC_save_regs_in_stack();
+
+ /* generic code will not work */
+ (void)GC_save_regs_in_stack();
+ }
+# endif
+
+# ifdef RT
+ GC_push_one(TMP_SP); /* GC_push_one from r11 */
+
+ asm("cas r11, r6, r0"); GC_push_one(TMP_SP); /* r6 */
+ asm("cas r11, r7, r0"); GC_push_one(TMP_SP); /* through */
+ asm("cas r11, r8, r0"); GC_push_one(TMP_SP); /* r10 */
+ asm("cas r11, r9, r0"); GC_push_one(TMP_SP);
+ asm("cas r11, r10, r0"); GC_push_one(TMP_SP);
+
+ asm("cas r11, r12, r0"); GC_push_one(TMP_SP); /* r12 */
+ asm("cas r11, r13, r0"); GC_push_one(TMP_SP); /* through */
+ asm("cas r11, r14, r0"); GC_push_one(TMP_SP); /* r15 */
+ asm("cas r11, r15, r0"); GC_push_one(TMP_SP);
+# endif
+
+# if defined(M68K) && defined(SYSV)
+ /* Once again similar to SUN and HP, though setjmp appears to work.
+ --Parag
+ */
+# ifdef __GNUC__
+ asm("subqw #0x4,%sp"); /* allocate word on top of stack */
+
+ asm("movl %a2,%sp@"); asm("jbsr GC_push_one");
+ asm("movl %a3,%sp@"); asm("jbsr GC_push_one");
+ asm("movl %a4,%sp@"); asm("jbsr GC_push_one");
+ asm("movl %a5,%sp@"); asm("jbsr GC_push_one");
+ /* Skip frame pointer and stack pointer */
+ asm("movl %d1,%sp@"); asm("jbsr GC_push_one");
+ asm("movl %d2,%sp@"); asm("jbsr GC_push_one");
+ asm("movl %d3,%sp@"); asm("jbsr GC_push_one");
+ asm("movl %d4,%sp@"); asm("jbsr GC_push_one");
+ asm("movl %d5,%sp@"); asm("jbsr GC_push_one");
+ asm("movl %d6,%sp@"); asm("jbsr GC_push_one");
+ asm("movl %d7,%sp@"); asm("jbsr GC_push_one");
+
+ asm("addqw #0x4,%sp"); /* put stack back where it was */
+# else /* !__GNUC__*/
+ asm("subq.w &0x4,%sp"); /* allocate word on top of stack */
+
+ asm("mov.l %a2,(%sp)"); asm("jsr GC_push_one");
+ asm("mov.l %a3,(%sp)"); asm("jsr GC_push_one");
+ asm("mov.l %a4,(%sp)"); asm("jsr GC_push_one");
+ asm("mov.l %a5,(%sp)"); asm("jsr GC_push_one");
+ /* Skip frame pointer and stack pointer */
+ asm("mov.l %d1,(%sp)"); asm("jsr GC_push_one");
+ asm("mov.l %d2,(%sp)"); asm("jsr GC_push_one");
+ asm("mov.l %d3,(%sp)"); asm("jsr GC_push_one");
+ asm("mov.l %d4,(%sp)"); asm("jsr GC_push_one");
+ asm("mov.l %d5,(%sp)"); asm("jsr GC_push_one");
+ asm("mov.l %d6,(%sp)"); asm("jsr GC_push_one");
+ asm("mov.l %d7,(%sp)"); asm("jsr GC_push_one");
+
+ asm("addq.w &0x4,%sp"); /* put stack back where it was */
+# endif /* !__GNUC__ */
+# endif /* M68K/SYSV */
+
+
+# if defined(HP_PA) || defined(M88K) || defined(POWERPC) || (defined(I386) && (defined(OS2) || defined(USE_GENERIC))) || defined(UTS4)
+ /* Generic code */
+ /* The idea is due to Parag Patel at HP. */
+ /* We're not sure whether he would like */
+ /* to be he acknowledged for it or not. */
+ {
+ static jmp_buf regs;
+ register word * i = (word *) regs;
+ register ptr_t lim = (ptr_t)(regs) + (sizeof regs);
+
+ /* Setjmp on Sun 3s doesn't clear all of the buffer. */
+ /* That tends to preserve garbage. Clear it. */
+ for (; (char *)i < lim; i++) {
+ *i = 0;
+ }
+# if defined(POWERPC) || defined(MSWIN32) || defined(UTS4)
+ (void) setjmp(regs);
+# else
+ (void) _setjmp(regs);
+# endif
+ GC_push_all_stack((ptr_t)regs, lim);
+ }
+# endif
+
+ /* other machines... */
+# if !(defined M68K) && !(defined VAX) && !(defined RT)
+# if !(defined SPARC) && !(defined I386) && !(defined NS32K)
+# if !defined(HP_PA) && !defined(M88K) && !defined(POWERPC)
+# if !defined(UTS4)
+ --> bad news <--
+# endif
+# endif
+# endif
+# endif
+}
+
+/* On register window machines, we need a way to force registers into */
+/* the stack. Return sp. */
+# ifdef SPARC
+ asm(" .seg \"text\"");
+# ifdef SVR4
+ asm(" .globl GC_save_regs_in_stack");
+ asm("GC_save_regs_in_stack:");
+ asm(" .type GC_save_regs_in_stack,#function");
+# else
+ asm(" .globl _GC_save_regs_in_stack");
+ asm("_GC_save_regs_in_stack:");
+# endif
+ asm(" ta 0x3 ! ST_FLUSH_WINDOWS");
+ asm(" mov %sp,%o0");
+ asm(" retl");
+ asm(" nop");
+# ifdef SVR4
+ asm(" .GC_save_regs_in_stack_end:");
+ asm(" .size GC_save_regs_in_stack,.GC_save_regs_in_stack_end-GC_save_regs_in_stack");
+# endif
+# ifdef LINT
+ word GC_save_regs_in_stack() { return(0 /* sp really */);}
+# endif
+# endif
+
+
+/* GC_clear_stack_inner(arg, limit) clears stack area up to limit and */
+/* returns arg. Stack clearing is crucial on SPARC, so we supply */
+/* an assembly version that's more careful. Assumes limit is hotter */
+/* than sp, and limit is 8 byte aligned. */
+#if defined(ASM_CLEAR_CODE) && !defined(THREADS)
+#ifndef SPARC
+ --> fix it
+#endif
+# ifdef SUNOS4
+ asm(".globl _GC_clear_stack_inner");
+ asm("_GC_clear_stack_inner:");
+# else
+ asm(".globl GC_clear_stack_inner");
+ asm("GC_clear_stack_inner:");
+ asm(".type GC_save_regs_in_stack,#function");
+# endif
+ asm("mov %sp,%o2"); /* Save sp */
+ asm("add %sp,-8,%o3"); /* p = sp-8 */
+ asm("clr %g1"); /* [g0,g1] = 0 */
+ asm("add %o1,-0x60,%sp"); /* Move sp out of the way, */
+ /* so that traps still work. */
+ /* Includes some extra words */
+ /* so we can be sloppy below. */
+ asm("loop:");
+ asm("std %g0,[%o3]"); /* *(long long *)p = 0 */
+ asm("cmp %o3,%o1");
+ asm("bgu loop "); /* if (p > limit) goto loop */
+ asm("add %o3,-8,%o3"); /* p -= 8 (delay slot) */
+ asm("retl");
+ asm("mov %o2,%sp"); /* Restore sp., delay slot */
+ /* First argument = %o0 = return value */
+# ifdef SVR4
+ asm(" .GC_clear_stack_inner_end:");
+ asm(" .size GC_clear_stack_inner,.GC_clear_stack_inner_end-GC_clear_stack_inner");
+# endif
+
+# ifdef LINT
+ /*ARGSUSED*/
+ ptr_t GC_clear_stack_inner(arg, limit)
+ ptr_t arg; word limit;
+ { return(arg); }
+# endif
+#endif
diff --git a/boehm-gc/makefile.depend b/boehm-gc/makefile.depend
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/boehm-gc/makefile.depend
diff --git a/boehm-gc/malloc.c b/boehm-gc/malloc.c
new file mode 100644
index 00000000000..41553b7f376
--- /dev/null
+++ b/boehm-gc/malloc.c
@@ -0,0 +1,426 @@
+/*
+ * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+/* Boehm, February 7, 1996 4:32 pm PST */
+
+#include <stdio.h>
+#include "gc_priv.h"
+
+extern ptr_t GC_clear_stack(); /* in misc.c, behaves like identity */
+void GC_extend_size_map(); /* in misc.c. */
+
+/* Allocate reclaim list for kind: */
+/* Return TRUE on success */
+GC_bool GC_alloc_reclaim_list(kind)
+register struct obj_kind * kind;
+{
+ struct hblk ** result = (struct hblk **)
+ GC_scratch_alloc((MAXOBJSZ+1) * sizeof(struct hblk *));
+ if (result == 0) return(FALSE);
+ BZERO(result, (MAXOBJSZ+1)*sizeof(struct hblk *));
+ kind -> ok_reclaim_list = result;
+ return(TRUE);
+}
+
+/* allocate lb bytes for an object of kind. */
+/* Should not be used to directly to allocate */
+/* objects such as STUBBORN objects that */
+/* require special handling on allocation. */
+/* First a version that assumes we already */
+/* hold lock: */
+ptr_t GC_generic_malloc_inner(lb, k)
+register word lb;
+register int k;
+{
+register word lw;
+register ptr_t op;
+register ptr_t *opp;
+
+ if( SMALL_OBJ(lb) ) {
+ register struct obj_kind * kind = GC_obj_kinds + k;
+# ifdef MERGE_SIZES
+ lw = GC_size_map[lb];
+# else
+ lw = ALIGNED_WORDS(lb);
+ if (lw == 0) lw = 1;
+# endif
+ opp = &(kind -> ok_freelist[lw]);
+ if( (op = *opp) == 0 ) {
+# ifdef MERGE_SIZES
+ if (GC_size_map[lb] == 0) {
+ if (!GC_is_initialized) GC_init_inner();
+ if (GC_size_map[lb] == 0) GC_extend_size_map(lb);
+ return(GC_generic_malloc_inner(lb, k));
+ }
+# else
+ if (!GC_is_initialized) {
+ GC_init_inner();
+ return(GC_generic_malloc_inner(lb, k));
+ }
+# endif
+ if (kind -> ok_reclaim_list == 0) {
+ if (!GC_alloc_reclaim_list(kind)) goto out;
+ }
+ op = GC_allocobj(lw, k);
+ if (op == 0) goto out;
+ }
+ /* Here everything is in a consistent state. */
+ /* We assume the following assignment is */
+ /* atomic. If we get aborted */
+ /* after the assignment, we lose an object, */
+ /* but that's benign. */
+ /* Volatile declarations may need to be added */
+ /* to prevent the compiler from breaking things.*/
+ *opp = obj_link(op);
+ obj_link(op) = 0;
+ } else {
+ register struct hblk * h;
+ register word n_blocks = divHBLKSZ(ADD_SLOP(lb)
+ + HDR_BYTES + HBLKSIZE-1);
+
+ if (!GC_is_initialized) GC_init_inner();
+ /* Do our share of marking work */
+ if(GC_incremental && !GC_dont_gc)
+ GC_collect_a_little_inner((int)n_blocks);
+ lw = ROUNDED_UP_WORDS(lb);
+ while ((h = GC_allochblk(lw, k, 0)) == 0
+ && GC_collect_or_expand(n_blocks, FALSE));
+ if (h == 0) {
+ op = 0;
+ } else {
+ op = (ptr_t) (h -> hb_body);
+ GC_words_wasted += BYTES_TO_WORDS(n_blocks * HBLKSIZE) - lw;
+ }
+ }
+ GC_words_allocd += lw;
+
+out:
+ return((ptr_t)op);
+}
+
+ptr_t GC_generic_malloc(lb, k)
+register word lb;
+register int k;
+{
+ ptr_t result;
+ DCL_LOCK_STATE;
+
+ GC_INVOKE_FINALIZERS();
+ DISABLE_SIGNALS();
+ LOCK();
+ result = GC_generic_malloc_inner(lb, k);
+ UNLOCK();
+ ENABLE_SIGNALS();
+ if (0 == result) {
+ return((*GC_oom_fn)(lb));
+ } else {
+ return(result);
+ }
+}
+
+
+#define GENERAL_MALLOC(lb,k) \
+ (GC_PTR)GC_clear_stack(GC_generic_malloc((word)lb, k))
+/* We make the GC_clear_stack_call a tail call, hoping to get more of */
+/* the stack. */
+
+/* Allocate lb bytes of atomic (pointerfree) data */
+# ifdef __STDC__
+ GC_PTR GC_malloc_atomic(size_t lb)
+# else
+ GC_PTR GC_malloc_atomic(lb)
+ size_t lb;
+# endif
+{
+register ptr_t op;
+register ptr_t * opp;
+register word lw;
+DCL_LOCK_STATE;
+
+ if( SMALL_OBJ(lb) ) {
+# ifdef MERGE_SIZES
+ lw = GC_size_map[lb];
+# else
+ lw = ALIGNED_WORDS(lb);
+# endif
+ opp = &(GC_aobjfreelist[lw]);
+ FASTLOCK();
+ if( !FASTLOCK_SUCCEEDED() || (op = *opp) == 0 ) {
+ FASTUNLOCK();
+ return(GENERAL_MALLOC((word)lb, PTRFREE));
+ }
+ /* See above comment on signals. */
+ *opp = obj_link(op);
+ GC_words_allocd += lw;
+ FASTUNLOCK();
+ return((GC_PTR) op);
+ } else {
+ return(GENERAL_MALLOC((word)lb, PTRFREE));
+ }
+}
+
+/* Allocate lb bytes of composite (pointerful) data */
+# ifdef __STDC__
+ GC_PTR GC_malloc(size_t lb)
+# else
+ GC_PTR GC_malloc(lb)
+ size_t lb;
+# endif
+{
+register ptr_t op;
+register ptr_t *opp;
+register word lw;
+DCL_LOCK_STATE;
+
+ if( SMALL_OBJ(lb) ) {
+# ifdef MERGE_SIZES
+ lw = GC_size_map[lb];
+# else
+ lw = ALIGNED_WORDS(lb);
+# endif
+ opp = &(GC_objfreelist[lw]);
+ FASTLOCK();
+ if( !FASTLOCK_SUCCEEDED() || (op = *opp) == 0 ) {
+ FASTUNLOCK();
+ return(GENERAL_MALLOC((word)lb, NORMAL));
+ }
+ /* See above comment on signals. */
+ *opp = obj_link(op);
+ obj_link(op) = 0;
+ GC_words_allocd += lw;
+ FASTUNLOCK();
+ return((GC_PTR) op);
+ } else {
+ return(GENERAL_MALLOC((word)lb, NORMAL));
+ }
+}
+
+# ifdef REDIRECT_MALLOC
+# ifdef __STDC__
+ GC_PTR malloc(size_t lb)
+# else
+ GC_PTR malloc(lb)
+ size_t lb;
+# endif
+ {
+ /* It might help to manually inline the GC_malloc call here. */
+ /* But any decent compiler should reduce the extra procedure call */
+ /* to at most a jump instruction in this case. */
+# if defined(I386) && defined(SOLARIS_THREADS)
+ /*
+ * Thread initialisation can call malloc before
+ * we're ready for it.
+ */
+ if (!GC_is_initialized) return sbrk(lb);
+# endif /* I386 && SOLARIS_THREADS */
+ return(REDIRECT_MALLOC(lb));
+ }
+
+# ifdef __STDC__
+ GC_PTR calloc(size_t n, size_t lb)
+# else
+ GC_PTR calloc(n, lb)
+ size_t n, lb;
+# endif
+ {
+ return(REDIRECT_MALLOC(n*lb));
+ }
+# endif /* REDIRECT_MALLOC */
+
+GC_PTR GC_generic_or_special_malloc(lb,knd)
+word lb;
+int knd;
+{
+ switch(knd) {
+# ifdef STUBBORN_ALLOC
+ case STUBBORN:
+ return(GC_malloc_stubborn((size_t)lb));
+# endif
+ case PTRFREE:
+ return(GC_malloc_atomic((size_t)lb));
+ case NORMAL:
+ return(GC_malloc((size_t)lb));
+ case UNCOLLECTABLE:
+ return(GC_malloc_uncollectable((size_t)lb));
+# ifdef ATOMIC_UNCOLLECTABLE
+ case AUNCOLLECTABLE:
+ return(GC_malloc_atomic_uncollectable((size_t)lb));
+# endif /* ATOMIC_UNCOLLECTABLE */
+ default:
+ return(GC_generic_malloc(lb,knd));
+ }
+}
+
+
+/* Change the size of the block pointed to by p to contain at least */
+/* lb bytes. The object may be (and quite likely will be) moved. */
+/* The kind (e.g. atomic) is the same as that of the old. */
+/* Shrinking of large blocks is not implemented well. */
+# ifdef __STDC__
+ GC_PTR GC_realloc(GC_PTR p, size_t lb)
+# else
+ GC_PTR GC_realloc(p,lb)
+ GC_PTR p;
+ size_t lb;
+# endif
+{
+register struct hblk * h;
+register hdr * hhdr;
+register word sz; /* Current size in bytes */
+register word orig_sz; /* Original sz in bytes */
+int obj_kind;
+
+ if (p == 0) return(GC_malloc(lb)); /* Required by ANSI */
+ h = HBLKPTR(p);
+ hhdr = HDR(h);
+ sz = hhdr -> hb_sz;
+ obj_kind = hhdr -> hb_obj_kind;
+ sz = WORDS_TO_BYTES(sz);
+ orig_sz = sz;
+
+ if (sz > WORDS_TO_BYTES(MAXOBJSZ)) {
+ /* Round it up to the next whole heap block */
+ register word descr;
+
+ sz = (sz+HDR_BYTES+HBLKSIZE-1)
+ & (~HBLKMASK);
+ sz -= HDR_BYTES;
+ hhdr -> hb_sz = BYTES_TO_WORDS(sz);
+ descr = GC_obj_kinds[obj_kind].ok_descriptor;
+ if (GC_obj_kinds[obj_kind].ok_relocate_descr) descr += sz;
+ hhdr -> hb_descr = descr;
+ if (IS_UNCOLLECTABLE(obj_kind)) GC_non_gc_bytes += (sz - orig_sz);
+ /* Extra area is already cleared by allochblk. */
+ }
+ if (ADD_SLOP(lb) <= sz) {
+ if (lb >= (sz >> 1)) {
+# ifdef STUBBORN_ALLOC
+ if (obj_kind == STUBBORN) GC_change_stubborn(p);
+# endif
+ if (orig_sz > lb) {
+ /* Clear unneeded part of object to avoid bogus pointer */
+ /* tracing. */
+ /* Safe for stubborn objects. */
+ BZERO(((ptr_t)p) + lb, orig_sz - lb);
+ }
+ return(p);
+ } else {
+ /* shrink */
+ GC_PTR result =
+ GC_generic_or_special_malloc((word)lb, obj_kind);
+
+ if (result == 0) return(0);
+ /* Could also return original object. But this */
+ /* gives the client warning of imminent disaster. */
+ BCOPY(p, result, lb);
+# ifndef IGNORE_FREE
+ GC_free(p);
+# endif
+ return(result);
+ }
+ } else {
+ /* grow */
+ GC_PTR result =
+ GC_generic_or_special_malloc((word)lb, obj_kind);
+
+ if (result == 0) return(0);
+ BCOPY(p, result, sz);
+# ifndef IGNORE_FREE
+ GC_free(p);
+# endif
+ return(result);
+ }
+}
+
+# ifdef REDIRECT_MALLOC
+# ifdef __STDC__
+ GC_PTR realloc(GC_PTR p, size_t lb)
+# else
+ GC_PTR realloc(p,lb)
+ GC_PTR p;
+ size_t lb;
+# endif
+ {
+ return(GC_realloc(p, lb));
+ }
+# endif /* REDIRECT_MALLOC */
+
+/* Explicitly deallocate an object p. */
+# ifdef __STDC__
+ void GC_free(GC_PTR p)
+# else
+ void GC_free(p)
+ GC_PTR p;
+# endif
+{
+ register struct hblk *h;
+ register hdr *hhdr;
+ register signed_word sz;
+ register ptr_t * flh;
+ register int knd;
+ register struct obj_kind * ok;
+ DCL_LOCK_STATE;
+
+ if (p == 0) return;
+ /* Required by ANSI. It's not my fault ... */
+ h = HBLKPTR(p);
+ hhdr = HDR(h);
+ knd = hhdr -> hb_obj_kind;
+ sz = hhdr -> hb_sz;
+ ok = &GC_obj_kinds[knd];
+ if (sz <= MAXOBJSZ) {
+# ifdef THREADS
+ DISABLE_SIGNALS();
+ LOCK();
+# endif
+ GC_mem_freed += sz;
+ /* A signal here can make GC_mem_freed and GC_non_gc_bytes */
+ /* inconsistent. We claim this is benign. */
+ if (IS_UNCOLLECTABLE(knd)) GC_non_gc_bytes -= WORDS_TO_BYTES(sz);
+ /* Its unnecessary to clear the mark bit. If the */
+ /* object is reallocated, it doesn't matter. O.w. the */
+ /* collector will do it, since it's on a free list. */
+ if (ok -> ok_init) {
+ BZERO((word *)p + 1, WORDS_TO_BYTES(sz-1));
+ }
+ flh = &(ok -> ok_freelist[sz]);
+ obj_link(p) = *flh;
+ *flh = (ptr_t)p;
+# ifdef THREADS
+ UNLOCK();
+ ENABLE_SIGNALS();
+# endif
+ } else {
+ DISABLE_SIGNALS();
+ LOCK();
+ GC_mem_freed += sz;
+ if (IS_UNCOLLECTABLE(knd)) GC_non_gc_bytes -= WORDS_TO_BYTES(sz);
+ GC_freehblk(h);
+ UNLOCK();
+ ENABLE_SIGNALS();
+ }
+}
+
+# ifdef REDIRECT_MALLOC
+# ifdef __STDC__
+ void free(GC_PTR p)
+# else
+ void free(p)
+ GC_PTR p;
+# endif
+ {
+# ifndef IGNORE_FREE
+ GC_free(p);
+# endif
+ }
+# endif /* REDIRECT_MALLOC */
diff --git a/boehm-gc/mallocx.c b/boehm-gc/mallocx.c
new file mode 100644
index 00000000000..ae8bfffb8af
--- /dev/null
+++ b/boehm-gc/mallocx.c
@@ -0,0 +1,367 @@
+/*
+ * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996 by Silicon Graphics. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+/*
+ * These are extra allocation routines which are likely to be less
+ * frequently used than those in malloc.c. They are separate in the
+ * hope that the .o file will be excluded from statically linked
+ * executables. We should probably break this up further.
+ */
+
+#include <stdio.h>
+#include "gc_priv.h"
+
+extern ptr_t GC_clear_stack(); /* in misc.c, behaves like identity */
+void GC_extend_size_map(); /* in misc.c. */
+GC_bool GC_alloc_reclaim_list(); /* in malloc.c */
+
+/* Some externally visible but unadvertised variables to allow access to */
+/* free lists from inlined allocators without including gc_priv.h */
+/* or introducing dependencies on internal data structure layouts. */
+ptr_t * CONST GC_objfreelist_ptr = GC_objfreelist;
+ptr_t * CONST GC_aobjfreelist_ptr = GC_aobjfreelist;
+ptr_t * CONST GC_uobjfreelist_ptr = GC_uobjfreelist;
+# ifdef ATOMIC_UNCOLLECTABLE
+ ptr_t * CONST GC_auobjfreelist_ptr = GC_auobjfreelist;
+# endif
+
+/* Allocate a composite object of size n bytes. The caller guarantees */
+/* that pointers past the first page are not relevant. Caller holds */
+/* allocation lock. */
+ptr_t GC_generic_malloc_inner_ignore_off_page(lb, k)
+register size_t lb;
+register int k;
+{
+ register struct hblk * h;
+ register word n_blocks;
+ register word lw;
+ register ptr_t op;
+
+ if (lb <= HBLKSIZE)
+ return(GC_generic_malloc_inner((word)lb, k));
+ n_blocks = divHBLKSZ(ADD_SLOP(lb) + HDR_BYTES + HBLKSIZE-1);
+ if (!GC_is_initialized) GC_init_inner();
+ /* Do our share of marking work */
+ if(GC_incremental && !GC_dont_gc)
+ GC_collect_a_little_inner((int)n_blocks);
+ lw = ROUNDED_UP_WORDS(lb);
+ while ((h = GC_allochblk(lw, k, IGNORE_OFF_PAGE)) == 0
+ && GC_collect_or_expand(n_blocks, TRUE));
+ if (h == 0) {
+ op = 0;
+ } else {
+ op = (ptr_t) (h -> hb_body);
+ GC_words_wasted += BYTES_TO_WORDS(n_blocks * HBLKSIZE) - lw;
+ }
+ GC_words_allocd += lw;
+ return((ptr_t)op);
+}
+
+ptr_t GC_generic_malloc_ignore_off_page(lb, k)
+register size_t lb;
+register int k;
+{
+ register ptr_t result;
+ DCL_LOCK_STATE;
+
+ GC_INVOKE_FINALIZERS();
+ DISABLE_SIGNALS();
+ LOCK();
+ result = GC_generic_malloc_inner_ignore_off_page(lb,k);
+ UNLOCK();
+ ENABLE_SIGNALS();
+ if (0 == result) {
+ return((*GC_oom_fn)(lb));
+ } else {
+ return(result);
+ }
+}
+
+# if defined(__STDC__) || defined(__cplusplus)
+ void * GC_malloc_ignore_off_page(size_t lb)
+# else
+ char * GC_malloc_ignore_off_page(lb)
+ register size_t lb;
+# endif
+{
+ return((GC_PTR)GC_generic_malloc_ignore_off_page(lb, NORMAL));
+}
+
+# if defined(__STDC__) || defined(__cplusplus)
+ void * GC_malloc_atomic_ignore_off_page(size_t lb)
+# else
+ char * GC_malloc_atomic_ignore_off_page(lb)
+ register size_t lb;
+# endif
+{
+ return((GC_PTR)GC_generic_malloc_ignore_off_page(lb, PTRFREE));
+}
+
+/* Increment GC_words_allocd from code that doesn't have direct access */
+/* to GC_arrays. */
+# ifdef __STDC__
+void GC_incr_words_allocd(size_t n)
+{
+ GC_words_allocd += n;
+}
+
+/* The same for GC_mem_freed. */
+void GC_incr_mem_freed(size_t n)
+{
+ GC_mem_freed += n;
+}
+# endif /* __STDC__ */
+
+/* Analogous to the above, but assumes a small object size, and */
+/* bypasses MERGE_SIZES mechanism. Used by gc_inline.h. */
+#ifdef __STDC__
+ ptr_t GC_generic_malloc_words_small(size_t lw, int k)
+#else
+ ptr_t GC_generic_malloc_words_small(lw, k)
+ register size_t lw;
+ register int k;
+#endif
+{
+register ptr_t op;
+register ptr_t *opp;
+register struct obj_kind * kind = GC_obj_kinds + k;
+DCL_LOCK_STATE;
+
+ GC_INVOKE_FINALIZERS();
+ DISABLE_SIGNALS();
+ LOCK();
+ opp = &(kind -> ok_freelist[lw]);
+ if( (op = *opp) == 0 ) {
+ if (!GC_is_initialized) {
+ GC_init_inner();
+ }
+ if (kind -> ok_reclaim_list != 0 || GC_alloc_reclaim_list(kind)) {
+ op = GC_clear_stack(GC_allocobj(lw, k));
+ }
+ if (op == 0) {
+ UNLOCK();
+ ENABLE_SIGNALS();
+ return ((*GC_oom_fn)(WORDS_TO_BYTES(lw)));
+ }
+ }
+ *opp = obj_link(op);
+ obj_link(op) = 0;
+ GC_words_allocd += lw;
+ UNLOCK();
+ ENABLE_SIGNALS();
+ return((ptr_t)op);
+}
+
+#if defined(THREADS) && !defined(SRC_M3)
+/* Return a list of 1 or more objects of the indicated size, linked */
+/* through the first word in the object. This has the advantage that */
+/* it acquires the allocation lock only once, and may greatly reduce */
+/* time wasted contending for the allocation lock. Typical usage would */
+/* be in a thread that requires many items of the same size. It would */
+/* keep its own free list in thread-local storage, and call */
+/* GC_malloc_many or friends to replenish it. (We do not round up */
+/* object sizes, since a call indicates the intention to consume many */
+/* objects of exactly this size.) */
+/* Note that the client should usually clear the link field. */
+ptr_t GC_generic_malloc_many(lb, k)
+register word lb;
+register int k;
+{
+ptr_t op;
+register ptr_t p;
+ptr_t *opp;
+word lw;
+register word my_words_allocd;
+DCL_LOCK_STATE;
+
+ if (!SMALL_OBJ(lb)) {
+ op = GC_generic_malloc(lb, k);
+ if(0 != op) obj_link(op) = 0;
+ return(op);
+ }
+ lw = ALIGNED_WORDS(lb);
+ GC_INVOKE_FINALIZERS();
+ DISABLE_SIGNALS();
+ LOCK();
+ opp = &(GC_obj_kinds[k].ok_freelist[lw]);
+ if( (op = *opp) == 0 ) {
+ if (!GC_is_initialized) {
+ GC_init_inner();
+ }
+ op = GC_clear_stack(GC_allocobj(lw, k));
+ if (op == 0) {
+ UNLOCK();
+ ENABLE_SIGNALS();
+ op = (*GC_oom_fn)(lb);
+ if(0 != op) obj_link(op) = 0;
+ return(op);
+ }
+ }
+ *opp = 0;
+ my_words_allocd = 0;
+ for (p = op; p != 0; p = obj_link(p)) {
+ my_words_allocd += lw;
+ if (my_words_allocd >= BODY_SZ) {
+ *opp = obj_link(p);
+ obj_link(p) = 0;
+ break;
+ }
+ }
+ GC_words_allocd += my_words_allocd;
+
+out:
+ UNLOCK();
+ ENABLE_SIGNALS();
+ return(op);
+
+}
+
+void * GC_malloc_many(size_t lb)
+{
+ return(GC_generic_malloc_many(lb, NORMAL));
+}
+
+/* Note that the "atomic" version of this would be unsafe, since the */
+/* links would not be seen by the collector. */
+# endif
+
+/* Allocate lb bytes of pointerful, traced, but not collectable data */
+# ifdef __STDC__
+ GC_PTR GC_malloc_uncollectable(size_t lb)
+# else
+ GC_PTR GC_malloc_uncollectable(lb)
+ size_t lb;
+# endif
+{
+register ptr_t op;
+register ptr_t *opp;
+register word lw;
+DCL_LOCK_STATE;
+
+ if( SMALL_OBJ(lb) ) {
+# ifdef MERGE_SIZES
+# ifdef ADD_BYTE_AT_END
+ if (lb != 0) lb--;
+ /* We don't need the extra byte, since this won't be */
+ /* collected anyway. */
+# endif
+ lw = GC_size_map[lb];
+# else
+ lw = ALIGNED_WORDS(lb);
+# endif
+ opp = &(GC_uobjfreelist[lw]);
+ FASTLOCK();
+ if( FASTLOCK_SUCCEEDED() && (op = *opp) != 0 ) {
+ /* See above comment on signals. */
+ *opp = obj_link(op);
+ obj_link(op) = 0;
+ GC_words_allocd += lw;
+ /* Mark bit ws already set on free list. It will be */
+ /* cleared only temporarily during a collection, as a */
+ /* result of the normal free list mark bit clearing. */
+ GC_non_gc_bytes += WORDS_TO_BYTES(lw);
+ FASTUNLOCK();
+ return((GC_PTR) op);
+ }
+ FASTUNLOCK();
+ op = (ptr_t)GC_generic_malloc((word)lb, UNCOLLECTABLE);
+ } else {
+ op = (ptr_t)GC_generic_malloc((word)lb, UNCOLLECTABLE);
+ }
+ if (0 == op) return(0);
+ /* We don't need the lock here, since we have an undisguised */
+ /* pointer. We do need to hold the lock while we adjust */
+ /* mark bits. */
+ {
+ register struct hblk * h;
+
+ h = HBLKPTR(op);
+ lw = HDR(h) -> hb_sz;
+
+ DISABLE_SIGNALS();
+ LOCK();
+ GC_set_mark_bit(op);
+ GC_non_gc_bytes += WORDS_TO_BYTES(lw);
+ UNLOCK();
+ ENABLE_SIGNALS();
+ return((GC_PTR) op);
+ }
+}
+
+# ifdef ATOMIC_UNCOLLECTABLE
+/* Allocate lb bytes of pointerfree, untraced, uncollectable data */
+/* This is normally roughly equivalent to the system malloc. */
+/* But it may be useful if malloc is redefined. */
+# ifdef __STDC__
+ GC_PTR GC_malloc_atomic_uncollectable(size_t lb)
+# else
+ GC_PTR GC_malloc_atomic_uncollectable(lb)
+ size_t lb;
+# endif
+{
+register ptr_t op;
+register ptr_t *opp;
+register word lw;
+DCL_LOCK_STATE;
+
+ if( SMALL_OBJ(lb) ) {
+# ifdef MERGE_SIZES
+# ifdef ADD_BYTE_AT_END
+ if (lb != 0) lb--;
+ /* We don't need the extra byte, since this won't be */
+ /* collected anyway. */
+# endif
+ lw = GC_size_map[lb];
+# else
+ lw = ALIGNED_WORDS(lb);
+# endif
+ opp = &(GC_auobjfreelist[lw]);
+ FASTLOCK();
+ if( FASTLOCK_SUCCEEDED() && (op = *opp) != 0 ) {
+ /* See above comment on signals. */
+ *opp = obj_link(op);
+ obj_link(op) = 0;
+ GC_words_allocd += lw;
+ /* Mark bit was already set while object was on free list. */
+ GC_non_gc_bytes += WORDS_TO_BYTES(lw);
+ FASTUNLOCK();
+ return((GC_PTR) op);
+ }
+ FASTUNLOCK();
+ op = (ptr_t)GC_generic_malloc((word)lb, AUNCOLLECTABLE);
+ } else {
+ op = (ptr_t)GC_generic_malloc((word)lb, AUNCOLLECTABLE);
+ }
+ if (0 == op) return(0);
+ /* We don't need the lock here, since we have an undisguised */
+ /* pointer. We do need to hold the lock while we adjust */
+ /* mark bits. */
+ {
+ register struct hblk * h;
+
+ h = HBLKPTR(op);
+ lw = HDR(h) -> hb_sz;
+
+ DISABLE_SIGNALS();
+ LOCK();
+ GC_set_mark_bit(op);
+ GC_non_gc_bytes += WORDS_TO_BYTES(lw);
+ UNLOCK();
+ ENABLE_SIGNALS();
+ return((GC_PTR) op);
+ }
+}
+
+#endif /* ATOMIC_UNCOLLECTABLE */
diff --git a/boehm-gc/mark.c b/boehm-gc/mark.c
new file mode 100644
index 00000000000..632e792c56f
--- /dev/null
+++ b/boehm-gc/mark.c
@@ -0,0 +1,1095 @@
+
+/*
+ * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+ * Copyright (c) 1991-1995 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+
+# include <stdio.h>
+# include "gc_priv.h"
+# include "gc_mark.h"
+
+/* We put this here to minimize the risk of inlining. */
+/*VARARGS*/
+void GC_noop() {}
+
+/* Single argument version, robust against whole program analysis. */
+void GC_noop1(x)
+word x;
+{
+ static VOLATILE word sink;
+
+ sink = x;
+}
+
+mark_proc GC_mark_procs[MAX_MARK_PROCS] = {0};
+word GC_n_mark_procs = 0;
+
+/* Initialize GC_obj_kinds properly and standard free lists properly. */
+/* This must be done statically since they may be accessed before */
+/* GC_init is called. */
+/* It's done here, since we need to deal with mark descriptors. */
+struct obj_kind GC_obj_kinds[MAXOBJKINDS] = {
+/* PTRFREE */ { &GC_aobjfreelist[0], 0 /* filled in dynamically */,
+ 0 | DS_LENGTH, FALSE, FALSE },
+/* NORMAL */ { &GC_objfreelist[0], 0,
+# if defined(ADD_BYTE_AT_END) && ALIGNMENT > DS_TAGS
+ (word)(-ALIGNMENT) | DS_LENGTH,
+# else
+ 0 | DS_LENGTH,
+# endif
+ TRUE /* add length to descr */, TRUE },
+/* UNCOLLECTABLE */
+ { &GC_uobjfreelist[0], 0,
+ 0 | DS_LENGTH, TRUE /* add length to descr */, TRUE },
+# ifdef ATOMIC_UNCOLLECTABLE
+ /* AUNCOLLECTABLE */
+ { &GC_auobjfreelist[0], 0,
+ 0 | DS_LENGTH, FALSE /* add length to descr */, FALSE },
+# endif
+# ifdef STUBBORN_ALLOC
+/*STUBBORN*/ { &GC_sobjfreelist[0], 0,
+ 0 | DS_LENGTH, TRUE /* add length to descr */, TRUE },
+# endif
+};
+
+# ifdef ATOMIC_UNCOLLECTABLE
+# ifdef STUBBORN_ALLOC
+ int GC_n_kinds = 5;
+# else
+ int GC_n_kinds = 4;
+# endif
+# else
+# ifdef STUBBORN_ALLOC
+ int GC_n_kinds = 4;
+# else
+ int GC_n_kinds = 3;
+# endif
+# endif
+
+
+# ifndef INITIAL_MARK_STACK_SIZE
+# define INITIAL_MARK_STACK_SIZE (1*HBLKSIZE)
+ /* INITIAL_MARK_STACK_SIZE * sizeof(mse) should be a */
+ /* multiple of HBLKSIZE. */
+# endif
+
+/*
+ * Limits of stack for GC_mark routine.
+ * All ranges between GC_mark_stack(incl.) and GC_mark_stack_top(incl.) still
+ * need to be marked from.
+ */
+
+word GC_n_rescuing_pages; /* Number of dirty pages we marked from */
+ /* excludes ptrfree pages, etc. */
+
+mse * GC_mark_stack;
+
+word GC_mark_stack_size = 0;
+
+mse * GC_mark_stack_top;
+
+static struct hblk * scan_ptr;
+
+mark_state_t GC_mark_state = MS_NONE;
+
+GC_bool GC_mark_stack_too_small = FALSE;
+
+GC_bool GC_objects_are_marked = FALSE; /* Are there collectable marked */
+ /* objects in the heap? */
+
+GC_bool GC_collection_in_progress()
+{
+ return(GC_mark_state != MS_NONE);
+}
+
+/* clear all mark bits in the header */
+void GC_clear_hdr_marks(hhdr)
+register hdr * hhdr;
+{
+ BZERO(hhdr -> hb_marks, MARK_BITS_SZ*sizeof(word));
+}
+
+/* Set all mark bits in the header. Used for uncollectable blocks. */
+void GC_set_hdr_marks(hhdr)
+register hdr * hhdr;
+{
+ register int i;
+
+ for (i = 0; i < MARK_BITS_SZ; ++i) {
+ hhdr -> hb_marks[i] = ONES;
+ }
+}
+
+/*
+ * Clear all mark bits associated with block h.
+ */
+/*ARGSUSED*/
+static void clear_marks_for_block(h, dummy)
+struct hblk *h;
+word dummy;
+{
+ register hdr * hhdr = HDR(h);
+
+ if (IS_UNCOLLECTABLE(hhdr -> hb_obj_kind)) return;
+ /* Mark bit for these is cleared only once the object is */
+ /* explicitly deallocated. This either frees the block, or */
+ /* the bit is cleared once the object is on the free list. */
+ GC_clear_hdr_marks(hhdr);
+}
+
+/* Slow but general routines for setting/clearing/asking about mark bits */
+void GC_set_mark_bit(p)
+ptr_t p;
+{
+ register struct hblk *h = HBLKPTR(p);
+ register hdr * hhdr = HDR(h);
+ register int word_no = (word *)p - (word *)h;
+
+ set_mark_bit_from_hdr(hhdr, word_no);
+}
+
+void GC_clear_mark_bit(p)
+ptr_t p;
+{
+ register struct hblk *h = HBLKPTR(p);
+ register hdr * hhdr = HDR(h);
+ register int word_no = (word *)p - (word *)h;
+
+ clear_mark_bit_from_hdr(hhdr, word_no);
+}
+
+GC_bool GC_is_marked(p)
+ptr_t p;
+{
+ register struct hblk *h = HBLKPTR(p);
+ register hdr * hhdr = HDR(h);
+ register int word_no = (word *)p - (word *)h;
+
+ return(mark_bit_from_hdr(hhdr, word_no));
+}
+
+
+/*
+ * Clear mark bits in all allocated heap blocks. This invalidates
+ * the marker invariant, and sets GC_mark_state to reflect this.
+ * (This implicitly starts marking to reestablish the invariant.)
+ */
+void GC_clear_marks()
+{
+ GC_apply_to_all_blocks(clear_marks_for_block, (word)0);
+ GC_objects_are_marked = FALSE;
+ GC_mark_state = MS_INVALID;
+ scan_ptr = 0;
+# ifdef GATHERSTATS
+ /* Counters reflect currently marked objects: reset here */
+ GC_composite_in_use = 0;
+ GC_atomic_in_use = 0;
+# endif
+
+}
+
+/* Initiate a garbage collection. Initiates a full collection if the */
+/* mark state is invalid. */
+/*ARGSUSED*/
+void GC_initiate_gc()
+{
+ if (GC_dirty_maintained) GC_read_dirty();
+# ifdef STUBBORN_ALLOC
+ GC_read_changed();
+# endif
+# ifdef CHECKSUMS
+ {
+ extern void GC_check_dirty();
+
+ if (GC_dirty_maintained) GC_check_dirty();
+ }
+# endif
+# ifdef GATHERSTATS
+ GC_n_rescuing_pages = 0;
+# endif
+ if (GC_mark_state == MS_NONE) {
+ GC_mark_state = MS_PUSH_RESCUERS;
+ } else if (GC_mark_state != MS_INVALID) {
+ ABORT("unexpected state");
+ } /* else this is really a full collection, and mark */
+ /* bits are invalid. */
+ scan_ptr = 0;
+}
+
+
+static void alloc_mark_stack();
+
+/* Perform a small amount of marking. */
+/* We try to touch roughly a page of memory. */
+/* Return TRUE if we just finished a mark phase. */
+GC_bool GC_mark_some()
+{
+ switch(GC_mark_state) {
+ case MS_NONE:
+ return(FALSE);
+
+ case MS_PUSH_RESCUERS:
+ if (GC_mark_stack_top
+ >= GC_mark_stack + INITIAL_MARK_STACK_SIZE/4) {
+ GC_mark_from_mark_stack();
+ return(FALSE);
+ } else {
+ scan_ptr = GC_push_next_marked_dirty(scan_ptr);
+ if (scan_ptr == 0) {
+# ifdef PRINTSTATS
+ GC_printf1("Marked from %lu dirty pages\n",
+ (unsigned long)GC_n_rescuing_pages);
+# endif
+ GC_push_roots(FALSE);
+ GC_objects_are_marked = TRUE;
+ if (GC_mark_state != MS_INVALID) {
+ GC_mark_state = MS_ROOTS_PUSHED;
+ }
+ }
+ }
+ return(FALSE);
+
+ case MS_PUSH_UNCOLLECTABLE:
+ if (GC_mark_stack_top
+ >= GC_mark_stack + INITIAL_MARK_STACK_SIZE/4) {
+ GC_mark_from_mark_stack();
+ return(FALSE);
+ } else {
+ scan_ptr = GC_push_next_marked_uncollectable(scan_ptr);
+ if (scan_ptr == 0) {
+ GC_push_roots(TRUE);
+ GC_objects_are_marked = TRUE;
+ if (GC_mark_state != MS_INVALID) {
+ GC_mark_state = MS_ROOTS_PUSHED;
+ }
+ }
+ }
+ return(FALSE);
+
+ case MS_ROOTS_PUSHED:
+ if (GC_mark_stack_top >= GC_mark_stack) {
+ GC_mark_from_mark_stack();
+ return(FALSE);
+ } else {
+ GC_mark_state = MS_NONE;
+ if (GC_mark_stack_too_small) {
+ alloc_mark_stack(2*GC_mark_stack_size);
+ }
+ return(TRUE);
+ }
+
+ case MS_INVALID:
+ case MS_PARTIALLY_INVALID:
+ if (!GC_objects_are_marked) {
+ GC_mark_state = MS_PUSH_UNCOLLECTABLE;
+ return(FALSE);
+ }
+ if (GC_mark_stack_top >= GC_mark_stack) {
+ GC_mark_from_mark_stack();
+ return(FALSE);
+ }
+ if (scan_ptr == 0
+ && (GC_mark_state == MS_INVALID || GC_mark_stack_too_small)) {
+ alloc_mark_stack(2*GC_mark_stack_size);
+ GC_mark_state = MS_PARTIALLY_INVALID;
+ }
+ scan_ptr = GC_push_next_marked(scan_ptr);
+ if (scan_ptr == 0 && GC_mark_state == MS_PARTIALLY_INVALID) {
+ GC_push_roots(TRUE);
+ GC_objects_are_marked = TRUE;
+ if (GC_mark_state != MS_INVALID) {
+ GC_mark_state = MS_ROOTS_PUSHED;
+ }
+ }
+ return(FALSE);
+ default:
+ ABORT("GC_mark_some: bad state");
+ return(FALSE);
+ }
+}
+
+
+GC_bool GC_mark_stack_empty()
+{
+ return(GC_mark_stack_top < GC_mark_stack);
+}
+
+#ifdef PROF_MARKER
+ word GC_prof_array[10];
+# define PROF(n) GC_prof_array[n]++
+#else
+# define PROF(n)
+#endif
+
+/* Given a pointer to someplace other than a small object page or the */
+/* first page of a large object, return a pointer either to the */
+/* start of the large object or NIL. */
+/* In the latter case black list the address current. */
+/* Returns NIL without black listing if current points to a block */
+/* with IGNORE_OFF_PAGE set. */
+/*ARGSUSED*/
+# ifdef PRINT_BLACK_LIST
+ word GC_find_start(current, hhdr, source)
+ word source;
+# else
+ word GC_find_start(current, hhdr)
+# define source 0
+# endif
+register word current;
+register hdr * hhdr;
+{
+# ifdef ALL_INTERIOR_POINTERS
+ if (hhdr != 0) {
+ register word orig = current;
+
+ current = (word)HBLKPTR(current) + HDR_BYTES;
+ do {
+ current = current - HBLKSIZE*(word)hhdr;
+ hhdr = HDR(current);
+ } while(IS_FORWARDING_ADDR_OR_NIL(hhdr));
+ /* current points to the start of the large object */
+ if (hhdr -> hb_flags & IGNORE_OFF_PAGE) return(0);
+ if ((word *)orig - (word *)current
+ >= (ptrdiff_t)(hhdr->hb_sz)) {
+ /* Pointer past the end of the block */
+ GC_ADD_TO_BLACK_LIST_NORMAL(orig, source);
+ return(0);
+ }
+ return(current);
+ } else {
+ GC_ADD_TO_BLACK_LIST_NORMAL(current, source);
+ return(0);
+ }
+# else
+ GC_ADD_TO_BLACK_LIST_NORMAL(current, source);
+ return(0);
+# endif
+# undef source
+}
+
+void GC_invalidate_mark_state()
+{
+ GC_mark_state = MS_INVALID;
+ GC_mark_stack_top = GC_mark_stack-1;
+}
+
+mse * GC_signal_mark_stack_overflow(msp)
+mse * msp;
+{
+ GC_mark_state = MS_INVALID;
+# ifdef PRINTSTATS
+ GC_printf1("Mark stack overflow; current size = %lu entries\n",
+ GC_mark_stack_size);
+# endif
+ return(msp-INITIAL_MARK_STACK_SIZE/8);
+}
+
+
+/*
+ * Mark objects pointed to by the regions described by
+ * mark stack entries between GC_mark_stack and GC_mark_stack_top,
+ * inclusive. Assumes the upper limit of a mark stack entry
+ * is never 0. A mark stack entry never has size 0.
+ * We try to traverse on the order of a hblk of memory before we return.
+ * Caller is responsible for calling this until the mark stack is empty.
+ */
+void GC_mark_from_mark_stack()
+{
+ mse * GC_mark_stack_reg = GC_mark_stack;
+ mse * GC_mark_stack_top_reg = GC_mark_stack_top;
+ mse * mark_stack_limit = &(GC_mark_stack[GC_mark_stack_size]);
+ int credit = HBLKSIZE; /* Remaining credit for marking work */
+ register word * current_p; /* Pointer to current candidate ptr. */
+ register word current; /* Candidate pointer. */
+ register word * limit; /* (Incl) limit of current candidate */
+ /* range */
+ register word descr;
+ register ptr_t greatest_ha = GC_greatest_plausible_heap_addr;
+ register ptr_t least_ha = GC_least_plausible_heap_addr;
+# define SPLIT_RANGE_WORDS 128 /* Must be power of 2. */
+
+ GC_objects_are_marked = TRUE;
+# ifdef OS2 /* Use untweaked version to circumvent compiler problem */
+ while (GC_mark_stack_top_reg >= GC_mark_stack_reg && credit >= 0) {
+# else
+ while ((((ptr_t)GC_mark_stack_top_reg - (ptr_t)GC_mark_stack_reg) | credit)
+ >= 0) {
+# endif
+ current_p = GC_mark_stack_top_reg -> mse_start;
+ retry:
+ descr = GC_mark_stack_top_reg -> mse_descr;
+ if (descr & ((~(WORDS_TO_BYTES(SPLIT_RANGE_WORDS) - 1)) | DS_TAGS)) {
+ word tag = descr & DS_TAGS;
+
+ switch(tag) {
+ case DS_LENGTH:
+ /* Large length. */
+ /* Process part of the range to avoid pushing too much on the */
+ /* stack. */
+ GC_mark_stack_top_reg -> mse_start =
+ limit = current_p + SPLIT_RANGE_WORDS-1;
+ GC_mark_stack_top_reg -> mse_descr -=
+ WORDS_TO_BYTES(SPLIT_RANGE_WORDS-1);
+ /* Make sure that pointers overlapping the two ranges are */
+ /* considered. */
+ limit = (word *)((char *)limit + sizeof(word) - ALIGNMENT);
+ break;
+ case DS_BITMAP:
+ GC_mark_stack_top_reg--;
+ descr &= ~DS_TAGS;
+ credit -= WORDS_TO_BYTES(WORDSZ/2); /* guess */
+ while (descr != 0) {
+ if ((signed_word)descr < 0) {
+ current = *current_p;
+ if ((ptr_t)current >= least_ha && (ptr_t)current < greatest_ha) {
+ PUSH_CONTENTS(current, GC_mark_stack_top_reg, mark_stack_limit,
+ current_p, exit1);
+ }
+ }
+ descr <<= 1;
+ ++ current_p;
+ }
+ continue;
+ case DS_PROC:
+ GC_mark_stack_top_reg--;
+ credit -= PROC_BYTES;
+#ifdef GC_DEBUG
+ current_p = GC_debug_object_start(current_p);
+#endif
+ GC_mark_stack_top_reg =
+ (*PROC(descr))
+ (current_p, GC_mark_stack_top_reg,
+ mark_stack_limit, ENV(descr));
+ continue;
+ case DS_PER_OBJECT:
+ GC_mark_stack_top_reg -> mse_descr =
+ *(word *)((ptr_t)current_p + descr - tag);
+ goto retry;
+ }
+ } else {
+ GC_mark_stack_top_reg--;
+ limit = (word *)(((ptr_t)current_p) + (word)descr);
+ }
+ /* The simple case in which we're scanning a range. */
+ credit -= (ptr_t)limit - (ptr_t)current_p;
+ limit -= 1;
+ while (current_p <= limit) {
+ current = *current_p;
+ if ((ptr_t)current >= least_ha && (ptr_t)current < greatest_ha) {
+ PUSH_CONTENTS(current, GC_mark_stack_top_reg,
+ mark_stack_limit, current_p, exit2);
+ }
+ current_p = (word *)((char *)current_p + ALIGNMENT);
+ }
+ }
+ GC_mark_stack_top = GC_mark_stack_top_reg;
+}
+
+/* Allocate or reallocate space for mark stack of size s words */
+/* May silently fail. */
+static void alloc_mark_stack(n)
+word n;
+{
+ mse * new_stack = (mse *)GC_scratch_alloc(n * sizeof(struct ms_entry));
+
+ GC_mark_stack_too_small = FALSE;
+ if (GC_mark_stack_size != 0) {
+ if (new_stack != 0) {
+ word displ = (word)GC_mark_stack & (GC_page_size - 1);
+ word size = GC_mark_stack_size * sizeof(struct ms_entry);
+
+ /* Recycle old space */
+ if (0 != displ) displ = GC_page_size - displ;
+ size = (size - displ) & ~(GC_page_size - 1);
+ GC_add_to_heap((struct hblk *)
+ ((word)GC_mark_stack + displ), size);
+ GC_mark_stack = new_stack;
+ GC_mark_stack_size = n;
+# ifdef PRINTSTATS
+ GC_printf1("Grew mark stack to %lu frames\n",
+ (unsigned long) GC_mark_stack_size);
+# endif
+ } else {
+# ifdef PRINTSTATS
+ GC_printf1("Failed to grow mark stack to %lu frames\n",
+ (unsigned long) n);
+# endif
+ }
+ } else {
+ if (new_stack == 0) {
+ GC_err_printf0("No space for mark stack\n");
+ EXIT();
+ }
+ GC_mark_stack = new_stack;
+ GC_mark_stack_size = n;
+ }
+ GC_mark_stack_top = GC_mark_stack-1;
+}
+
+void GC_mark_init()
+{
+ alloc_mark_stack(INITIAL_MARK_STACK_SIZE);
+}
+
+/*
+ * Push all locations between b and t onto the mark stack.
+ * b is the first location to be checked. t is one past the last
+ * location to be checked.
+ * Should only be used if there is no possibility of mark stack
+ * overflow.
+ */
+void GC_push_all(bottom, top)
+ptr_t bottom;
+ptr_t top;
+{
+ register word length;
+
+ bottom = (ptr_t)(((word) bottom + ALIGNMENT-1) & ~(ALIGNMENT-1));
+ top = (ptr_t)(((word) top) & ~(ALIGNMENT-1));
+ if (top == 0 || bottom == top) return;
+ GC_mark_stack_top++;
+ if (GC_mark_stack_top >= GC_mark_stack + GC_mark_stack_size) {
+ ABORT("unexpected mark stack overflow");
+ }
+ length = top - bottom;
+# if DS_TAGS > ALIGNMENT - 1
+ length += DS_TAGS;
+ length &= ~DS_TAGS;
+# endif
+ GC_mark_stack_top -> mse_start = (word *)bottom;
+ GC_mark_stack_top -> mse_descr = length;
+}
+
+/*
+ * Analogous to the above, but push only those pages that may have been
+ * dirtied. A block h is assumed dirty if dirty_fn(h) != 0.
+ * We use push_fn to actually push the block.
+ * Will not overflow mark stack if push_fn pushes a small fixed number
+ * of entries. (This is invoked only if push_fn pushes a single entry,
+ * or if it marks each object before pushing it, thus ensuring progress
+ * in the event of a stack overflow.)
+ */
+void GC_push_dirty(bottom, top, dirty_fn, push_fn)
+ptr_t bottom;
+ptr_t top;
+int (*dirty_fn)(/* struct hblk * h */);
+void (*push_fn)(/* ptr_t bottom, ptr_t top */);
+{
+ register struct hblk * h;
+
+ bottom = (ptr_t)(((long) bottom + ALIGNMENT-1) & ~(ALIGNMENT-1));
+ top = (ptr_t)(((long) top) & ~(ALIGNMENT-1));
+
+ if (top == 0 || bottom == top) return;
+ h = HBLKPTR(bottom + HBLKSIZE);
+ if (top <= (ptr_t) h) {
+ if ((*dirty_fn)(h-1)) {
+ (*push_fn)(bottom, top);
+ }
+ return;
+ }
+ if ((*dirty_fn)(h-1)) {
+ (*push_fn)(bottom, (ptr_t)h);
+ }
+ while ((ptr_t)(h+1) <= top) {
+ if ((*dirty_fn)(h)) {
+ if ((word)(GC_mark_stack_top - GC_mark_stack)
+ > 3 * GC_mark_stack_size / 4) {
+ /* Danger of mark stack overflow */
+ (*push_fn)((ptr_t)h, top);
+ return;
+ } else {
+ (*push_fn)((ptr_t)h, (ptr_t)(h+1));
+ }
+ }
+ h++;
+ }
+ if ((ptr_t)h != top) {
+ if ((*dirty_fn)(h)) {
+ (*push_fn)((ptr_t)h, top);
+ }
+ }
+ if (GC_mark_stack_top >= GC_mark_stack + GC_mark_stack_size) {
+ ABORT("unexpected mark stack overflow");
+ }
+}
+
+# ifndef SMALL_CONFIG
+void GC_push_conditional(bottom, top, all)
+ptr_t bottom;
+ptr_t top;
+int all;
+{
+ if (all) {
+ if (GC_dirty_maintained) {
+# ifdef PROC_VDB
+ /* Pages that were never dirtied cannot contain pointers */
+ GC_push_dirty(bottom, top, GC_page_was_ever_dirty, GC_push_all);
+# else
+ GC_push_all(bottom, top);
+# endif
+ } else {
+ GC_push_all(bottom, top);
+ }
+ } else {
+ GC_push_dirty(bottom, top, GC_page_was_dirty, GC_push_all);
+ }
+}
+#endif
+
+# ifdef MSWIN32
+ void __cdecl GC_push_one(p)
+# else
+ void GC_push_one(p)
+# endif
+word p;
+{
+ GC_PUSH_ONE_STACK(p);
+}
+
+# ifdef __STDC__
+# define BASE(p) (word)GC_base((void *)(p))
+# else
+# define BASE(p) (word)GC_base((char *)(p))
+# endif
+
+/* As above, but argument passed preliminary test. */
+# ifdef PRINT_BLACK_LIST
+ void GC_push_one_checked(p, interior_ptrs, source)
+ ptr_t source;
+# else
+ void GC_push_one_checked(p, interior_ptrs)
+# define source 0
+# endif
+register word p;
+register GC_bool interior_ptrs;
+{
+ register word r;
+ register hdr * hhdr;
+ register int displ;
+
+ GET_HDR(p, hhdr);
+ if (IS_FORWARDING_ADDR_OR_NIL(hhdr)) {
+ if (hhdr != 0 && interior_ptrs) {
+ r = BASE(p);
+ hhdr = HDR(r);
+ displ = BYTES_TO_WORDS(HBLKDISPL(r));
+ } else {
+ hhdr = 0;
+ }
+ } else {
+ register map_entry_type map_entry;
+
+ displ = HBLKDISPL(p);
+ map_entry = MAP_ENTRY((hhdr -> hb_map), displ);
+ if (map_entry == OBJ_INVALID) {
+ if (interior_ptrs) {
+ r = BASE(p);
+ displ = BYTES_TO_WORDS(HBLKDISPL(r));
+ if (r == 0) hhdr = 0;
+ } else {
+ hhdr = 0;
+ }
+ } else {
+ displ = BYTES_TO_WORDS(displ);
+ displ -= map_entry;
+ r = (word)((word *)(HBLKPTR(p)) + displ);
+ }
+ }
+ /* If hhdr != 0 then r == GC_base(p), only we did it faster. */
+ /* displ is the word index within the block. */
+ if (hhdr == 0) {
+ if (interior_ptrs) {
+# ifdef PRINT_BLACK_LIST
+ GC_add_to_black_list_stack(p, source);
+# else
+ GC_add_to_black_list_stack(p);
+# endif
+ } else {
+ GC_ADD_TO_BLACK_LIST_NORMAL(p, source);
+# undef source /* In case we had to define it. */
+ }
+ } else {
+ if (!mark_bit_from_hdr(hhdr, displ)) {
+ set_mark_bit_from_hdr(hhdr, displ);
+ PUSH_OBJ((word *)r, hhdr, GC_mark_stack_top,
+ &(GC_mark_stack[GC_mark_stack_size]));
+ }
+ }
+}
+
+# ifdef TRACE_BUF
+
+# define TRACE_ENTRIES 1000
+
+struct trace_entry {
+ char * kind;
+ word gc_no;
+ word words_allocd;
+ word arg1;
+ word arg2;
+} GC_trace_buf[TRACE_ENTRIES];
+
+int GC_trace_buf_ptr = 0;
+
+void GC_add_trace_entry(char *kind, word arg1, word arg2)
+{
+ GC_trace_buf[GC_trace_buf_ptr].kind = kind;
+ GC_trace_buf[GC_trace_buf_ptr].gc_no = GC_gc_no;
+ GC_trace_buf[GC_trace_buf_ptr].words_allocd = GC_words_allocd;
+ GC_trace_buf[GC_trace_buf_ptr].arg1 = arg1 ^ 0x80000000;
+ GC_trace_buf[GC_trace_buf_ptr].arg2 = arg2 ^ 0x80000000;
+ GC_trace_buf_ptr++;
+ if (GC_trace_buf_ptr >= TRACE_ENTRIES) GC_trace_buf_ptr = 0;
+}
+
+void GC_print_trace(word gc_no, GC_bool lock)
+{
+ int i;
+ struct trace_entry *p;
+
+ if (lock) LOCK();
+ for (i = GC_trace_buf_ptr-1; i != GC_trace_buf_ptr; i--) {
+ if (i < 0) i = TRACE_ENTRIES-1;
+ p = GC_trace_buf + i;
+ if (p -> gc_no < gc_no || p -> kind == 0) return;
+ printf("Trace:%s (gc:%d,words:%d) 0x%X, 0x%X\n",
+ p -> kind, p -> gc_no, p -> words_allocd,
+ (p -> arg1) ^ 0x80000000, (p -> arg2) ^ 0x80000000);
+ }
+ printf("Trace incomplete\n");
+ if (lock) UNLOCK();
+}
+
+# endif /* TRACE_BUF */
+
+/*
+ * A version of GC_push_all that treats all interior pointers as valid
+ */
+void GC_push_all_stack(bottom, top)
+ptr_t bottom;
+ptr_t top;
+{
+# ifdef ALL_INTERIOR_POINTERS
+ GC_push_all(bottom, top);
+# ifdef TRACE_BUF
+ GC_add_trace_entry("GC_push_all_stack", bottom, top);
+# endif
+# else
+ word * b = (word *)(((long) bottom + ALIGNMENT-1) & ~(ALIGNMENT-1));
+ word * t = (word *)(((long) top) & ~(ALIGNMENT-1));
+ register word *p;
+ register word q;
+ register word *lim;
+ register ptr_t greatest_ha = GC_greatest_plausible_heap_addr;
+ register ptr_t least_ha = GC_least_plausible_heap_addr;
+# define GC_greatest_plausible_heap_addr greatest_ha
+# define GC_least_plausible_heap_addr least_ha
+
+ if (top == 0) return;
+ /* check all pointers in range and put in push if they appear */
+ /* to be valid. */
+ lim = t - 1 /* longword */;
+ for (p = b; p <= lim; p = (word *)(((char *)p) + ALIGNMENT)) {
+ q = *p;
+ GC_PUSH_ONE_STACK(q);
+ }
+# undef GC_greatest_plausible_heap_addr
+# undef GC_least_plausible_heap_addr
+# endif
+}
+
+#ifndef SMALL_CONFIG
+/* Push all objects reachable from marked objects in the given block */
+/* of size 1 objects. */
+void GC_push_marked1(h, hhdr)
+struct hblk *h;
+register hdr * hhdr;
+{
+ word * mark_word_addr = &(hhdr->hb_marks[divWORDSZ(HDR_WORDS)]);
+ register word *p;
+ word *plim;
+ register int i;
+ register word q;
+ register word mark_word;
+ register ptr_t greatest_ha = GC_greatest_plausible_heap_addr;
+ register ptr_t least_ha = GC_least_plausible_heap_addr;
+# define GC_greatest_plausible_heap_addr greatest_ha
+# define GC_least_plausible_heap_addr least_ha
+
+ p = (word *)(h->hb_body);
+ plim = (word *)(((word)h) + HBLKSIZE);
+
+ /* go through all words in block */
+ while( p < plim ) {
+ mark_word = *mark_word_addr++;
+ i = 0;
+ while(mark_word != 0) {
+ if (mark_word & 1) {
+ q = p[i];
+ GC_PUSH_ONE_HEAP(q);
+ }
+ i++;
+ mark_word >>= 1;
+ }
+ p += WORDSZ;
+ }
+# undef GC_greatest_plausible_heap_addr
+# undef GC_least_plausible_heap_addr
+}
+
+
+#ifndef UNALIGNED
+
+/* Push all objects reachable from marked objects in the given block */
+/* of size 2 objects. */
+void GC_push_marked2(h, hhdr)
+struct hblk *h;
+register hdr * hhdr;
+{
+ word * mark_word_addr = &(hhdr->hb_marks[divWORDSZ(HDR_WORDS)]);
+ register word *p;
+ word *plim;
+ register int i;
+ register word q;
+ register word mark_word;
+ register ptr_t greatest_ha = GC_greatest_plausible_heap_addr;
+ register ptr_t least_ha = GC_least_plausible_heap_addr;
+# define GC_greatest_plausible_heap_addr greatest_ha
+# define GC_least_plausible_heap_addr least_ha
+
+ p = (word *)(h->hb_body);
+ plim = (word *)(((word)h) + HBLKSIZE);
+
+ /* go through all words in block */
+ while( p < plim ) {
+ mark_word = *mark_word_addr++;
+ i = 0;
+ while(mark_word != 0) {
+ if (mark_word & 1) {
+ q = p[i];
+ GC_PUSH_ONE_HEAP(q);
+ q = p[i+1];
+ GC_PUSH_ONE_HEAP(q);
+ }
+ i += 2;
+ mark_word >>= 2;
+ }
+ p += WORDSZ;
+ }
+# undef GC_greatest_plausible_heap_addr
+# undef GC_least_plausible_heap_addr
+}
+
+/* Push all objects reachable from marked objects in the given block */
+/* of size 4 objects. */
+/* There is a risk of mark stack overflow here. But we handle that. */
+/* And only unmarked objects get pushed, so it's not very likely. */
+void GC_push_marked4(h, hhdr)
+struct hblk *h;
+register hdr * hhdr;
+{
+ word * mark_word_addr = &(hhdr->hb_marks[divWORDSZ(HDR_WORDS)]);
+ register word *p;
+ word *plim;
+ register int i;
+ register word q;
+ register word mark_word;
+ register ptr_t greatest_ha = GC_greatest_plausible_heap_addr;
+ register ptr_t least_ha = GC_least_plausible_heap_addr;
+# define GC_greatest_plausible_heap_addr greatest_ha
+# define GC_least_plausible_heap_addr least_ha
+
+ p = (word *)(h->hb_body);
+ plim = (word *)(((word)h) + HBLKSIZE);
+
+ /* go through all words in block */
+ while( p < plim ) {
+ mark_word = *mark_word_addr++;
+ i = 0;
+ while(mark_word != 0) {
+ if (mark_word & 1) {
+ q = p[i];
+ GC_PUSH_ONE_HEAP(q);
+ q = p[i+1];
+ GC_PUSH_ONE_HEAP(q);
+ q = p[i+2];
+ GC_PUSH_ONE_HEAP(q);
+ q = p[i+3];
+ GC_PUSH_ONE_HEAP(q);
+ }
+ i += 4;
+ mark_word >>= 4;
+ }
+ p += WORDSZ;
+ }
+# undef GC_greatest_plausible_heap_addr
+# undef GC_least_plausible_heap_addr
+}
+
+#endif /* UNALIGNED */
+
+#endif /* SMALL_CONFIG */
+
+/* Push all objects reachable from marked objects in the given block */
+void GC_push_marked(h, hhdr)
+struct hblk *h;
+register hdr * hhdr;
+{
+ register int sz = hhdr -> hb_sz;
+ register word * p;
+ register int word_no;
+ register word * lim;
+ register mse * GC_mark_stack_top_reg;
+ register mse * mark_stack_limit = &(GC_mark_stack[GC_mark_stack_size]);
+
+ /* Some quick shortcuts: */
+ {
+ struct obj_kind *ok = &(GC_obj_kinds[hhdr -> hb_obj_kind]);
+ if ((0 | DS_LENGTH) == ok -> ok_descriptor
+ && FALSE == ok -> ok_relocate_descr)
+ return;
+ }
+ if (GC_block_empty(hhdr)/* nothing marked */) return;
+# ifdef GATHERSTATS
+ GC_n_rescuing_pages++;
+# endif
+ GC_objects_are_marked = TRUE;
+ if (sz > MAXOBJSZ) {
+ lim = (word *)(h + 1);
+ } else {
+ lim = (word *)(h + 1) - sz;
+ }
+
+ switch(sz) {
+# if !defined(SMALL_CONFIG)
+ case 1:
+ GC_push_marked1(h, hhdr);
+ break;
+# endif
+# if !defined(SMALL_CONFIG) && !defined(UNALIGNED)
+ case 2:
+ GC_push_marked2(h, hhdr);
+ break;
+ case 4:
+ GC_push_marked4(h, hhdr);
+ break;
+# endif
+ default:
+ GC_mark_stack_top_reg = GC_mark_stack_top;
+ for (p = (word *)h + HDR_WORDS, word_no = HDR_WORDS; p <= lim;
+ p += sz, word_no += sz) {
+ /* This ignores user specified mark procs. This currently */
+ /* doesn't matter, since marking from the whole object */
+ /* is always sufficient, and we will eventually use the user */
+ /* mark proc to avoid any bogus pointers. */
+ if (mark_bit_from_hdr(hhdr, word_no)) {
+ /* Mark from fields inside the object */
+ PUSH_OBJ((word *)p, hhdr, GC_mark_stack_top_reg, mark_stack_limit);
+# ifdef GATHERSTATS
+ /* Subtract this object from total, since it was */
+ /* added in twice. */
+ GC_composite_in_use -= sz;
+# endif
+ }
+ }
+ GC_mark_stack_top = GC_mark_stack_top_reg;
+ }
+}
+
+#ifndef SMALL_CONFIG
+/* Test whether any page in the given block is dirty */
+GC_bool GC_block_was_dirty(h, hhdr)
+struct hblk *h;
+register hdr * hhdr;
+{
+ register int sz = hhdr -> hb_sz;
+
+ if (sz < MAXOBJSZ) {
+ return(GC_page_was_dirty(h));
+ } else {
+ register ptr_t p = (ptr_t)h;
+ sz += HDR_WORDS;
+ sz = WORDS_TO_BYTES(sz);
+ while (p < (ptr_t)h + sz) {
+ if (GC_page_was_dirty((struct hblk *)p)) return(TRUE);
+ p += HBLKSIZE;
+ }
+ return(FALSE);
+ }
+}
+#endif /* SMALL_CONFIG */
+
+/* Similar to GC_push_next_marked, but return address of next block */
+struct hblk * GC_push_next_marked(h)
+struct hblk *h;
+{
+ register hdr * hhdr;
+
+ h = GC_next_block(h);
+ if (h == 0) return(0);
+ hhdr = HDR(h);
+ GC_push_marked(h, hhdr);
+ return(h + OBJ_SZ_TO_BLOCKS(hhdr -> hb_sz));
+}
+
+#ifndef SMALL_CONFIG
+/* Identical to above, but mark only from dirty pages */
+struct hblk * GC_push_next_marked_dirty(h)
+struct hblk *h;
+{
+ register hdr * hhdr = HDR(h);
+
+ if (!GC_dirty_maintained) { ABORT("dirty bits not set up"); }
+ for (;;) {
+ h = GC_next_block(h);
+ if (h == 0) return(0);
+ hhdr = HDR(h);
+# ifdef STUBBORN_ALLOC
+ if (hhdr -> hb_obj_kind == STUBBORN) {
+ if (GC_page_was_changed(h) && GC_block_was_dirty(h, hhdr)) {
+ break;
+ }
+ } else {
+ if (GC_block_was_dirty(h, hhdr)) break;
+ }
+# else
+ if (GC_block_was_dirty(h, hhdr)) break;
+# endif
+ h += OBJ_SZ_TO_BLOCKS(hhdr -> hb_sz);
+ }
+ GC_push_marked(h, hhdr);
+ return(h + OBJ_SZ_TO_BLOCKS(hhdr -> hb_sz));
+}
+#endif
+
+/* Similar to above, but for uncollectable pages. Needed since we */
+/* do not clear marks for such pages, even for full collections. */
+struct hblk * GC_push_next_marked_uncollectable(h)
+struct hblk *h;
+{
+ register hdr * hhdr = HDR(h);
+
+ for (;;) {
+ h = GC_next_block(h);
+ if (h == 0) return(0);
+ hhdr = HDR(h);
+ if (hhdr -> hb_obj_kind == UNCOLLECTABLE) break;
+ h += OBJ_SZ_TO_BLOCKS(hhdr -> hb_sz);
+ }
+ GC_push_marked(h, hhdr);
+ return(h + OBJ_SZ_TO_BLOCKS(hhdr -> hb_sz));
+}
+
+
diff --git a/boehm-gc/mark_rts.c b/boehm-gc/mark_rts.c
new file mode 100644
index 00000000000..efe6b64058f
--- /dev/null
+++ b/boehm-gc/mark_rts.c
@@ -0,0 +1,461 @@
+/*
+ * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+/* Boehm, October 9, 1995 1:06 pm PDT */
+# include <stdio.h>
+# include "gc_priv.h"
+
+/* MAX_ROOT_SETS is the maximum number of ranges that can be */
+/* registered as static roots. */
+# ifdef LARGE_CONFIG
+# define MAX_ROOT_SETS 4096
+# else
+# ifdef PCR
+# define MAX_ROOT_SETS 1024
+# else
+# ifdef MSWIN32
+# define MAX_ROOT_SETS 512
+ /* Under NT, we add only written pages, which can result */
+ /* in many small root sets. */
+# else
+# define MAX_ROOT_SETS 64
+# endif
+# endif
+# endif
+
+# define MAX_EXCLUSIONS (MAX_ROOT_SETS/4)
+/* Maximum number of segments that can be excluded from root sets. */
+
+/* Data structure for list of root sets. */
+/* We keep a hash table, so that we can filter out duplicate additions. */
+/* Under Win32, we need to do a better job of filtering overlaps, so */
+/* we resort to sequential search, and pay the price. */
+struct roots {
+ ptr_t r_start;
+ ptr_t r_end;
+# ifndef MSWIN32
+ struct roots * r_next;
+# endif
+ GC_bool r_tmp;
+ /* Delete before registering new dynamic libraries */
+};
+
+static struct roots static_roots[MAX_ROOT_SETS];
+
+static int n_root_sets = 0;
+
+ /* static_roots[0..n_root_sets) contains the valid root sets. */
+
+# if !defined(NO_DEBUGGING)
+/* For debugging: */
+void GC_print_static_roots()
+{
+ register int i;
+ size_t total = 0;
+
+ for (i = 0; i < n_root_sets; i++) {
+ GC_printf2("From 0x%lx to 0x%lx ",
+ (unsigned long) static_roots[i].r_start,
+ (unsigned long) static_roots[i].r_end);
+ if (static_roots[i].r_tmp) {
+ GC_printf0(" (temporary)\n");
+ } else {
+ GC_printf0("\n");
+ }
+ total += static_roots[i].r_end - static_roots[i].r_start;
+ }
+ GC_printf1("Total size: %ld\n", (unsigned long) total);
+ if (GC_root_size != total) {
+ GC_printf1("GC_root_size incorrect: %ld!!\n",
+ (unsigned long) GC_root_size);
+ }
+}
+# endif /* NO_DEBUGGING */
+
+/* Primarily for debugging support: */
+/* Is the address p in one of the registered static */
+/* root sections? */
+GC_bool GC_is_static_root(p)
+ptr_t p;
+{
+ static int last_root_set = 0;
+ register int i;
+
+
+ if (p >= static_roots[last_root_set].r_start
+ && p < static_roots[last_root_set].r_end) return(TRUE);
+ for (i = 0; i < n_root_sets; i++) {
+ if (p >= static_roots[i].r_start
+ && p < static_roots[i].r_end) {
+ last_root_set = i;
+ return(TRUE);
+ }
+ }
+ return(FALSE);
+}
+
+#ifndef MSWIN32
+# define LOG_RT_SIZE 6
+# define RT_SIZE (1 << LOG_RT_SIZE) /* Power of 2, may be != MAX_ROOT_SETS */
+
+ static struct roots * root_index[RT_SIZE];
+ /* Hash table header. Used only to check whether a range is */
+ /* already present. */
+
+static int rt_hash(addr)
+char * addr;
+{
+ word result = (word) addr;
+# if CPP_WORDSZ > 8*LOG_RT_SIZE
+ result ^= result >> 8*LOG_RT_SIZE;
+# endif
+# if CPP_WORDSZ > 4*LOG_RT_SIZE
+ result ^= result >> 4*LOG_RT_SIZE;
+# endif
+ result ^= result >> 2*LOG_RT_SIZE;
+ result ^= result >> LOG_RT_SIZE;
+ result &= (RT_SIZE-1);
+ return(result);
+}
+
+/* Is a range starting at b already in the table? If so return a */
+/* pointer to it, else NIL. */
+struct roots * GC_roots_present(b)
+char *b;
+{
+ register int h = rt_hash(b);
+ register struct roots *p = root_index[h];
+
+ while (p != 0) {
+ if (p -> r_start == (ptr_t)b) return(p);
+ p = p -> r_next;
+ }
+ return(FALSE);
+}
+
+/* Add the given root structure to the index. */
+static void add_roots_to_index(p)
+struct roots *p;
+{
+ register int h = rt_hash(p -> r_start);
+
+ p -> r_next = root_index[h];
+ root_index[h] = p;
+}
+
+# else /* MSWIN32 */
+
+# define add_roots_to_index(p)
+
+# endif
+
+
+
+
+word GC_root_size = 0;
+
+void GC_add_roots(b, e)
+char * b; char * e;
+{
+ DCL_LOCK_STATE;
+
+ DISABLE_SIGNALS();
+ LOCK();
+ GC_add_roots_inner(b, e, FALSE);
+ UNLOCK();
+ ENABLE_SIGNALS();
+}
+
+
+/* Add [b,e) to the root set. Adding the same interval a second time */
+/* is a moderately fast noop, and hence benign. We do not handle */
+/* different but overlapping intervals efficiently. (We do handle */
+/* them correctly.) */
+/* Tmp specifies that the interval may be deleted before */
+/* reregistering dynamic libraries. */
+void GC_add_roots_inner(b, e, tmp)
+char * b; char * e;
+GC_bool tmp;
+{
+ struct roots * old;
+
+# ifdef MSWIN32
+ /* Spend the time to ensure that there are no overlapping */
+ /* or adjacent intervals. */
+ /* This could be done faster with e.g. a */
+ /* balanced tree. But the execution time here is */
+ /* virtually guaranteed to be dominated by the time it */
+ /* takes to scan the roots. */
+ {
+ register int i;
+
+ for (i = 0; i < n_root_sets; i++) {
+ old = static_roots + i;
+ if ((ptr_t)b <= old -> r_end && (ptr_t)e >= old -> r_start) {
+ if ((ptr_t)b < old -> r_start) {
+ old -> r_start = (ptr_t)b;
+ GC_root_size += (old -> r_start - (ptr_t)b);
+ }
+ if ((ptr_t)e > old -> r_end) {
+ old -> r_end = (ptr_t)e;
+ GC_root_size += ((ptr_t)e - old -> r_end);
+ }
+ old -> r_tmp &= tmp;
+ break;
+ }
+ }
+ if (i < n_root_sets) {
+ /* merge other overlapping intervals */
+ struct roots *other;
+
+ for (i++; i < n_root_sets; i++) {
+ other = static_roots + i;
+ b = (char *)(other -> r_start);
+ e = (char *)(other -> r_end);
+ if ((ptr_t)b <= old -> r_end && (ptr_t)e >= old -> r_start) {
+ if ((ptr_t)b < old -> r_start) {
+ old -> r_start = (ptr_t)b;
+ GC_root_size += (old -> r_start - (ptr_t)b);
+ }
+ if ((ptr_t)e > old -> r_end) {
+ old -> r_end = (ptr_t)e;
+ GC_root_size += ((ptr_t)e - old -> r_end);
+ }
+ old -> r_tmp &= other -> r_tmp;
+ /* Delete this entry. */
+ GC_root_size -= (other -> r_end - other -> r_start);
+ other -> r_start = static_roots[n_root_sets-1].r_start;
+ other -> r_end = static_roots[n_root_sets-1].r_end;
+ n_root_sets--;
+ }
+ }
+ return;
+ }
+ }
+# else
+ old = GC_roots_present(b);
+ if (old != 0) {
+ if ((ptr_t)e <= old -> r_end) /* already there */ return;
+ /* else extend */
+ GC_root_size += (ptr_t)e - old -> r_end;
+ old -> r_end = (ptr_t)e;
+ return;
+ }
+# endif
+ if (n_root_sets == MAX_ROOT_SETS) {
+ ABORT("Too many root sets\n");
+ }
+ static_roots[n_root_sets].r_start = (ptr_t)b;
+ static_roots[n_root_sets].r_end = (ptr_t)e;
+ static_roots[n_root_sets].r_tmp = tmp;
+# ifndef MSWIN32
+ static_roots[n_root_sets].r_next = 0;
+# endif
+ add_roots_to_index(static_roots + n_root_sets);
+ GC_root_size += (ptr_t)e - (ptr_t)b;
+ n_root_sets++;
+}
+
+void GC_clear_roots GC_PROTO((void))
+{
+ DCL_LOCK_STATE;
+
+ DISABLE_SIGNALS();
+ LOCK();
+ n_root_sets = 0;
+ GC_root_size = 0;
+# ifndef MSWIN32
+ {
+ register int i;
+
+ for (i = 0; i < RT_SIZE; i++) root_index[i] = 0;
+ }
+# endif
+ UNLOCK();
+ ENABLE_SIGNALS();
+}
+
+/* Internal use only; lock held. */
+void GC_remove_tmp_roots()
+{
+ register int i;
+
+ for (i = 0; i < n_root_sets; ) {
+ if (static_roots[i].r_tmp) {
+ GC_root_size -= (static_roots[i].r_end - static_roots[i].r_start);
+ static_roots[i].r_start = static_roots[n_root_sets-1].r_start;
+ static_roots[i].r_end = static_roots[n_root_sets-1].r_end;
+ static_roots[i].r_tmp = static_roots[n_root_sets-1].r_tmp;
+ n_root_sets--;
+ } else {
+ i++;
+ }
+ }
+# ifndef MSWIN32
+ {
+ register int i;
+
+ for (i = 0; i < RT_SIZE; i++) root_index[i] = 0;
+ for (i = 0; i < n_root_sets; i++) add_roots_to_index(static_roots + i);
+ }
+# endif
+
+}
+
+ptr_t GC_approx_sp()
+{
+ word dummy;
+
+ return((ptr_t)(&dummy));
+}
+
+/*
+ * Data structure for excluded static roots.
+ */
+struct exclusion {
+ ptr_t e_start;
+ ptr_t e_end;
+};
+
+struct exclusion excl_table[MAX_EXCLUSIONS];
+ /* Array of exclusions, ascending */
+ /* address order. */
+size_t excl_table_entries = 0; /* Number of entries in use. */
+
+/* Return the first exclusion range that includes an address >= start_addr */
+/* Assumes the exclusion table contains at least one entry (namely the */
+/* GC data structures). */
+struct exclusion * GC_next_exclusion(start_addr)
+ptr_t start_addr;
+{
+ size_t low = 0;
+ size_t high = excl_table_entries - 1;
+ size_t mid;
+
+ while (high > low) {
+ mid = (low + high) >> 1;
+ /* low <= mid < high */
+ if ((word) excl_table[mid].e_end <= (word) start_addr) {
+ low = mid + 1;
+ } else {
+ high = mid;
+ }
+ }
+ if ((word) excl_table[low].e_end <= (word) start_addr) return 0;
+ return excl_table + low;
+}
+
+void GC_exclude_static_roots(start, finish)
+GC_PTR start;
+GC_PTR finish;
+{
+ struct exclusion * next;
+ size_t next_index, i;
+
+ if (0 == excl_table_entries) {
+ next = 0;
+ } else {
+ next = GC_next_exclusion(start);
+ }
+ if (0 != next) {
+ if ((word)(next -> e_start) < (word) finish) {
+ /* incomplete error check. */
+ ABORT("exclusion ranges overlap");
+ }
+ if ((word)(next -> e_start) == (word) finish) {
+ /* extend old range backwards */
+ next -> e_start = (ptr_t)start;
+ return;
+ }
+ next_index = next - excl_table;
+ for (i = excl_table_entries; i > next_index; --i) {
+ excl_table[i] = excl_table[i-1];
+ }
+ } else {
+ next_index = excl_table_entries;
+ }
+ if (excl_table_entries == MAX_EXCLUSIONS) ABORT("Too many exclusions");
+ excl_table[next_index].e_start = (ptr_t)start;
+ excl_table[next_index].e_end = (ptr_t)finish;
+ ++excl_table_entries;
+}
+
+/* Invoke push_conditional on ranges that are not excluded. */
+void GC_push_conditional_with_exclusions(bottom, top, all)
+ptr_t bottom;
+ptr_t top;
+int all;
+{
+ struct exclusion * next;
+ ptr_t excl_start;
+
+ while (bottom < top) {
+ next = GC_next_exclusion(bottom);
+ if (0 == next || (excl_start = next -> e_start) >= top) {
+ GC_push_conditional(bottom, top, all);
+ return;
+ }
+ if (excl_start > bottom) GC_push_conditional(bottom, excl_start, all);
+ bottom = next -> e_end;
+ }
+}
+
+/*
+ * Call the mark routines (GC_tl_push for a single pointer, GC_push_conditional
+ * on groups of pointers) on every top level accessible pointer.
+ * If all is FALSE, arrange to push only possibly altered values.
+ */
+
+void GC_push_roots(all)
+GC_bool all;
+{
+ register int i;
+
+ /*
+ * push registers - i.e., call GC_push_one(r) for each
+ * register contents r.
+ */
+ GC_push_regs(); /* usually defined in machine_dep.c */
+
+ /*
+ * Next push static data. This must happen early on, since it's
+ * not robust against mark stack overflow.
+ */
+ /* Reregister dynamic libraries, in case one got added. */
+# if (defined(DYNAMIC_LOADING) || defined(MSWIN32) || defined(PCR)) \
+ && !defined(SRC_M3)
+ GC_remove_tmp_roots();
+ GC_register_dynamic_libraries();
+# endif
+ /* Mark everything in static data areas */
+ for (i = 0; i < n_root_sets; i++) {
+ GC_push_conditional_with_exclusions(
+ static_roots[i].r_start,
+ static_roots[i].r_end, all);
+ }
+
+ /*
+ * Now traverse stacks.
+ */
+# ifndef THREADS
+ /* Mark everything on the stack. */
+# ifdef STACK_GROWS_DOWN
+ GC_push_all_stack( GC_approx_sp(), GC_stackbottom );
+# else
+ GC_push_all_stack( GC_stackbottom, GC_approx_sp() );
+# endif
+# endif
+ if (GC_push_other_roots != 0) (*GC_push_other_roots)();
+ /* In the threads case, this also pushes thread stacks. */
+}
+
diff --git a/boehm-gc/mips_sgi_mach_dep.s b/boehm-gc/mips_sgi_mach_dep.s
new file mode 100644
index 00000000000..bae9b5ebfe4
--- /dev/null
+++ b/boehm-gc/mips_sgi_mach_dep.s
@@ -0,0 +1,41 @@
+#include <sys/regdef.h>
+#include <sys/asm.h>
+
+# define call_push(x) move $4,x; jal GC_push_one
+
+ .option pic2
+ .text
+/* Mark from machine registers that are saved by C compiler */
+# define FRAMESZ 32
+# define RAOFF FRAMESZ-SZREG
+# define GPOFF FRAMESZ-(2*SZREG)
+ NESTED(GC_push_regs, FRAMESZ, ra)
+ .mask 0x80000000,-SZREG # inform debugger of saved ra loc
+ move t0,gp
+ SETUP_GPX(t8)
+ PTR_SUBU sp,FRAMESZ
+# ifdef SETUP_GP64
+ SETUP_GP64(GPOFF, GC_push_regs)
+# endif
+ SAVE_GP(GPOFF)
+ REG_S ra,RAOFF(sp)
+# if (_MIPS_SIM == _MIPS_SIM_ABI32)
+ call_push($2)
+ call_push($3)
+# endif
+ call_push($16)
+ call_push($17)
+ call_push($18)
+ call_push($19)
+ call_push($20)
+ call_push($21)
+ call_push($22)
+ call_push($23)
+ call_push($30)
+ REG_L ra,RAOFF(sp)
+# ifdef RESTORE_GP64
+ RESTORE_GP64
+# endif
+ PTR_ADDU sp,FRAMESZ
+ j ra
+ .end GC_push_regs
diff --git a/boehm-gc/mips_ultrix_mach_dep.s b/boehm-gc/mips_ultrix_mach_dep.s
new file mode 100644
index 00000000000..178224e31c8
--- /dev/null
+++ b/boehm-gc/mips_ultrix_mach_dep.s
@@ -0,0 +1,26 @@
+# define call_push(x) move $4,x; jal GC_push_one
+
+ .text
+ # Mark from machine registers that are saved by C compiler
+ .globl GC_push_regs
+ .ent GC_push_regs
+GC_push_regs:
+ subu $sp,8 ## Need to save only return address
+ sw $31,4($sp)
+ .mask 0x80000000,-4
+ .frame $sp,8,$31
+ call_push($2)
+ call_push($3)
+ call_push($16)
+ call_push($17)
+ call_push($18)
+ call_push($19)
+ call_push($20)
+ call_push($21)
+ call_push($22)
+ call_push($23)
+ call_push($30)
+ lw $31,4($sp)
+ addu $sp,8
+ j $31
+ .end GC_push_regs
diff --git a/boehm-gc/misc.c b/boehm-gc/misc.c
new file mode 100644
index 00000000000..18b30a18a89
--- /dev/null
+++ b/boehm-gc/misc.c
@@ -0,0 +1,837 @@
+/*
+ * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+/* Boehm, July 31, 1995 5:02 pm PDT */
+
+
+#include <stdio.h>
+#include <signal.h>
+
+#define I_HIDE_POINTERS /* To make GC_call_with_alloc_lock visible */
+#include "gc_priv.h"
+
+#ifdef SOLARIS_THREADS
+# include <sys/syscall.h>
+#endif
+#ifdef MSWIN32
+# include <windows.h>
+#endif
+
+# ifdef THREADS
+# ifdef PCR
+# include "il/PCR_IL.h"
+ PCR_Th_ML GC_allocate_ml;
+# else
+# ifdef SRC_M3
+ /* Critical section counter is defined in the M3 runtime */
+ /* That's all we use. */
+# else
+# ifdef SOLARIS_THREADS
+ mutex_t GC_allocate_ml; /* Implicitly initialized. */
+# else
+# ifdef WIN32_THREADS
+ GC_API CRITICAL_SECTION GC_allocate_ml;
+# else
+# if defined(IRIX_THREADS) || defined(LINUX_THREADS)
+# ifdef UNDEFINED
+ pthread_mutex_t GC_allocate_ml = PTHREAD_MUTEX_INITIALIZER;
+# endif
+ pthread_t GC_lock_holder = NO_THREAD;
+# else
+# if defined(QUICK_THREADS)
+ /* Nothing. */
+# else
+ --> declare allocator lock here
+# endif
+# endif
+# endif
+# endif
+# endif
+# endif
+# endif
+
+#ifdef ECOS
+#undef STACKBASE
+#endif
+
+GC_FAR struct _GC_arrays GC_arrays /* = { 0 } */;
+
+
+GC_bool GC_debugging_started = FALSE;
+ /* defined here so we don't have to load debug_malloc.o */
+
+void (*GC_check_heap)() = (void (*)())0;
+
+void (*GC_start_call_back)() = (void (*)())0;
+
+ptr_t GC_stackbottom = 0;
+
+GC_bool GC_dont_gc = 0;
+
+GC_bool GC_quiet = 0;
+
+/*ARGSUSED*/
+GC_PTR GC_default_oom_fn GC_PROTO((size_t bytes_requested))
+{
+ return(0);
+}
+
+GC_PTR (*GC_oom_fn) GC_PROTO((size_t bytes_requested)) = GC_default_oom_fn;
+
+extern signed_word GC_mem_found;
+
+# ifdef MERGE_SIZES
+ /* Set things up so that GC_size_map[i] >= words(i), */
+ /* but not too much bigger */
+ /* and so that size_map contains relatively few distinct entries */
+ /* This is stolen from Russ Atkinson's Cedar quantization */
+ /* alogrithm (but we precompute it). */
+
+
+ void GC_init_size_map()
+ {
+ register unsigned i;
+
+ /* Map size 0 to 1. This avoids problems at lower levels. */
+ GC_size_map[0] = 1;
+ /* One word objects don't have to be 2 word aligned. */
+ for (i = 1; i < sizeof(word); i++) {
+ GC_size_map[i] = 1;
+ }
+ GC_size_map[sizeof(word)] = ROUNDED_UP_WORDS(sizeof(word));
+ for (i = sizeof(word) + 1; i <= 8 * sizeof(word); i++) {
+# ifdef ALIGN_DOUBLE
+ GC_size_map[i] = (ROUNDED_UP_WORDS(i) + 1) & (~1);
+# else
+ GC_size_map[i] = ROUNDED_UP_WORDS(i);
+# endif
+ }
+ for (i = 8*sizeof(word) + 1; i <= 16 * sizeof(word); i++) {
+ GC_size_map[i] = (ROUNDED_UP_WORDS(i) + 1) & (~1);
+ }
+ /* We leave the rest of the array to be filled in on demand. */
+ }
+
+ /* Fill in additional entries in GC_size_map, including the ith one */
+ /* We assume the ith entry is currently 0. */
+ /* Note that a filled in section of the array ending at n always */
+ /* has length at least n/4. */
+ void GC_extend_size_map(i)
+ word i;
+ {
+ word orig_word_sz = ROUNDED_UP_WORDS(i);
+ word word_sz = orig_word_sz;
+ register word byte_sz = WORDS_TO_BYTES(word_sz);
+ /* The size we try to preserve. */
+ /* Close to to i, unless this would */
+ /* introduce too many distinct sizes. */
+ word smaller_than_i = byte_sz - (byte_sz >> 3);
+ word much_smaller_than_i = byte_sz - (byte_sz >> 2);
+ register word low_limit; /* The lowest indexed entry we */
+ /* initialize. */
+ register word j;
+
+ if (GC_size_map[smaller_than_i] == 0) {
+ low_limit = much_smaller_than_i;
+ while (GC_size_map[low_limit] != 0) low_limit++;
+ } else {
+ low_limit = smaller_than_i + 1;
+ while (GC_size_map[low_limit] != 0) low_limit++;
+ word_sz = ROUNDED_UP_WORDS(low_limit);
+ word_sz += word_sz >> 3;
+ if (word_sz < orig_word_sz) word_sz = orig_word_sz;
+ }
+# ifdef ALIGN_DOUBLE
+ word_sz += 1;
+ word_sz &= ~1;
+# endif
+ if (word_sz > MAXOBJSZ) {
+ word_sz = MAXOBJSZ;
+ }
+ /* If we can fit the same number of larger objects in a block, */
+ /* do so. */
+ {
+ size_t number_of_objs = BODY_SZ/word_sz;
+ word_sz = BODY_SZ/number_of_objs;
+# ifdef ALIGN_DOUBLE
+ word_sz &= ~1;
+# endif
+ }
+ byte_sz = WORDS_TO_BYTES(word_sz);
+# ifdef ADD_BYTE_AT_END
+ /* We need one extra byte; don't fill in GC_size_map[byte_sz] */
+ byte_sz--;
+# endif
+
+ for (j = low_limit; j <= byte_sz; j++) GC_size_map[j] = word_sz;
+ }
+# endif
+
+
+/*
+ * The following is a gross hack to deal with a problem that can occur
+ * on machines that are sloppy about stack frame sizes, notably SPARC.
+ * Bogus pointers may be written to the stack and not cleared for
+ * a LONG time, because they always fall into holes in stack frames
+ * that are not written. We partially address this by clearing
+ * sections of the stack whenever we get control.
+ */
+word GC_stack_last_cleared = 0; /* GC_no when we last did this */
+# ifdef THREADS
+# define CLEAR_SIZE 2048
+# else
+# define CLEAR_SIZE 213
+# endif
+# define DEGRADE_RATE 50
+
+word GC_min_sp; /* Coolest stack pointer value from which we've */
+ /* already cleared the stack. */
+
+# ifdef STACK_GROWS_DOWN
+# define COOLER_THAN >
+# define HOTTER_THAN <
+# define MAKE_COOLER(x,y) if ((word)(x)+(y) > (word)(x)) {(x) += (y);} \
+ else {(x) = (word)ONES;}
+# define MAKE_HOTTER(x,y) (x) -= (y)
+# else
+# define COOLER_THAN <
+# define HOTTER_THAN >
+# define MAKE_COOLER(x,y) if ((word)(x)-(y) < (word)(x)) {(x) -= (y);} else {(x) = 0;}
+# define MAKE_HOTTER(x,y) (x) += (y)
+# endif
+
+word GC_high_water;
+ /* "hottest" stack pointer value we have seen */
+ /* recently. Degrades over time. */
+
+word GC_words_allocd_at_reset;
+
+#if defined(ASM_CLEAR_CODE) && !defined(THREADS)
+ extern ptr_t GC_clear_stack_inner();
+#endif
+
+#if !defined(ASM_CLEAR_CODE) && !defined(THREADS)
+/* Clear the stack up to about limit. Return arg. */
+/*ARGSUSED*/
+ptr_t GC_clear_stack_inner(arg, limit)
+ptr_t arg;
+word limit;
+{
+ word dummy[CLEAR_SIZE];
+
+ BZERO(dummy, CLEAR_SIZE*sizeof(word));
+ if ((word)(dummy) COOLER_THAN limit) {
+ (void) GC_clear_stack_inner(arg, limit);
+ }
+ /* Make sure the recursive call is not a tail call, and the bzero */
+ /* call is not recognized as dead code. */
+ GC_noop1((word)dummy);
+ return(arg);
+}
+#endif
+
+/* Clear some of the inaccessible part of the stack. Returns its */
+/* argument, so it can be used in a tail call position, hence clearing */
+/* another frame. */
+ptr_t GC_clear_stack(arg)
+ptr_t arg;
+{
+ register word sp = (word)GC_approx_sp(); /* Hotter than actual sp */
+# ifdef THREADS
+ word dummy[CLEAR_SIZE];
+# else
+ register word limit;
+# endif
+
+# define SLOP 400
+ /* Extra bytes we clear every time. This clears our own */
+ /* activation record, and should cause more frequent */
+ /* clearing near the cold end of the stack, a good thing. */
+# define GC_SLOP 4000
+ /* We make GC_high_water this much hotter than we really saw */
+ /* saw it, to cover for GC noise etc. above our current frame. */
+# define CLEAR_THRESHOLD 100000
+ /* We restart the clearing process after this many bytes of */
+ /* allocation. Otherwise very heavily recursive programs */
+ /* with sparse stacks may result in heaps that grow almost */
+ /* without bounds. As the heap gets larger, collection */
+ /* frequency decreases, thus clearing frequency would decrease, */
+ /* thus more junk remains accessible, thus the heap gets */
+ /* larger ... */
+# ifdef THREADS
+ BZERO(dummy, CLEAR_SIZE*sizeof(word));
+# else
+ if (GC_gc_no > GC_stack_last_cleared) {
+ /* Start things over, so we clear the entire stack again */
+ if (GC_stack_last_cleared == 0) GC_high_water = (word) GC_stackbottom;
+ GC_min_sp = GC_high_water;
+ GC_stack_last_cleared = GC_gc_no;
+ GC_words_allocd_at_reset = GC_words_allocd;
+ }
+ /* Adjust GC_high_water */
+ MAKE_COOLER(GC_high_water, WORDS_TO_BYTES(DEGRADE_RATE) + GC_SLOP);
+ if (sp HOTTER_THAN GC_high_water) {
+ GC_high_water = sp;
+ }
+ MAKE_HOTTER(GC_high_water, GC_SLOP);
+ limit = GC_min_sp;
+ MAKE_HOTTER(limit, SLOP);
+ if (sp COOLER_THAN limit) {
+ limit &= ~0xf; /* Make it sufficiently aligned for assembly */
+ /* implementations of GC_clear_stack_inner. */
+ GC_min_sp = sp;
+ return(GC_clear_stack_inner(arg, limit));
+ } else if (WORDS_TO_BYTES(GC_words_allocd - GC_words_allocd_at_reset)
+ > CLEAR_THRESHOLD) {
+ /* Restart clearing process, but limit how much clearing we do. */
+ GC_min_sp = sp;
+ MAKE_HOTTER(GC_min_sp, CLEAR_THRESHOLD/4);
+ if (GC_min_sp HOTTER_THAN GC_high_water) GC_min_sp = GC_high_water;
+ GC_words_allocd_at_reset = GC_words_allocd;
+ }
+# endif
+ return(arg);
+}
+
+
+/* Return a pointer to the base address of p, given a pointer to a */
+/* an address within an object. Return 0 o.w. */
+# ifdef __STDC__
+ GC_PTR GC_base(GC_PTR p)
+# else
+ GC_PTR GC_base(p)
+ GC_PTR p;
+# endif
+{
+ register word r;
+ register struct hblk *h;
+ register bottom_index *bi;
+ register hdr *candidate_hdr;
+ register word limit;
+
+ r = (word)p;
+ if (!GC_is_initialized) return 0;
+ h = HBLKPTR(r);
+ GET_BI(r, bi);
+ candidate_hdr = HDR_FROM_BI(bi, r);
+ if (candidate_hdr == 0) return(0);
+ /* If it's a pointer to the middle of a large object, move it */
+ /* to the beginning. */
+ while (IS_FORWARDING_ADDR_OR_NIL(candidate_hdr)) {
+ h = FORWARDED_ADDR(h,candidate_hdr);
+ r = (word)h + HDR_BYTES;
+ candidate_hdr = HDR(h);
+ }
+ if (candidate_hdr -> hb_map == GC_invalid_map) return(0);
+ /* Make sure r points to the beginning of the object */
+ r &= ~(WORDS_TO_BYTES(1) - 1);
+ {
+ register int offset = (char *)r - (char *)(HBLKPTR(r));
+ register signed_word sz = candidate_hdr -> hb_sz;
+
+# ifdef ALL_INTERIOR_POINTERS
+ register map_entry_type map_entry;
+
+ map_entry = MAP_ENTRY((candidate_hdr -> hb_map), offset);
+ if (map_entry == OBJ_INVALID) {
+ return(0);
+ }
+ r -= WORDS_TO_BYTES(map_entry);
+ limit = r + WORDS_TO_BYTES(sz);
+# else
+ register int correction;
+
+ offset = BYTES_TO_WORDS(offset - HDR_BYTES);
+ correction = offset % sz;
+ r -= (WORDS_TO_BYTES(correction));
+ limit = r + WORDS_TO_BYTES(sz);
+ if (limit > (word)(h + 1)
+ && sz <= BYTES_TO_WORDS(HBLKSIZE) - HDR_WORDS) {
+ return(0);
+ }
+# endif
+ if ((word)p >= limit) return(0);
+ }
+ return((GC_PTR)r);
+}
+
+
+/* Return the size of an object, given a pointer to its base. */
+/* (For small obects this also happens to work from interior pointers, */
+/* but that shouldn't be relied upon.) */
+# ifdef __STDC__
+ size_t GC_size(GC_PTR p)
+# else
+ size_t GC_size(p)
+ GC_PTR p;
+# endif
+{
+ register int sz;
+ register hdr * hhdr = HDR(p);
+
+ sz = WORDS_TO_BYTES(hhdr -> hb_sz);
+ if (sz < 0) {
+ return(-sz);
+ } else {
+ return(sz);
+ }
+}
+
+size_t GC_get_heap_size GC_PROTO(())
+{
+ return ((size_t) GC_heapsize);
+}
+
+size_t GC_get_bytes_since_gc GC_PROTO(())
+{
+ return ((size_t) WORDS_TO_BYTES(GC_words_allocd));
+}
+
+GC_bool GC_is_initialized = FALSE;
+
+#if defined(SOLARIS_THREADS) || defined(IRIX_THREADS)
+ extern void GC_thr_init();
+#endif
+
+void GC_init()
+{
+ DCL_LOCK_STATE;
+
+ DISABLE_SIGNALS();
+ LOCK();
+ GC_init_inner();
+ UNLOCK();
+ ENABLE_SIGNALS();
+
+}
+
+#ifdef MSWIN32
+ extern void GC_init_win32();
+#endif
+
+extern void GC_setpagesize();
+
+void GC_init_inner()
+{
+# ifndef THREADS
+ word dummy;
+# endif
+
+ if (GC_is_initialized) return;
+ GC_setpagesize();
+ GC_exclude_static_roots(beginGC_arrays, endGC_arrays);
+# ifdef MSWIN32
+ GC_init_win32();
+# endif
+# if defined(LINUX) && defined(POWERPC)
+ GC_init_linuxppc();
+# endif
+# if defined(LINUX) && defined(ALPHA)
+ GC_init_linuxalpha();
+# endif
+# if defined(LINUX) && defined(SPARC)
+ GC_init_linuxsparc();
+# endif
+# ifdef SOLARIS_THREADS
+ GC_thr_init();
+ /* We need dirty bits in order to find live stack sections. */
+ GC_dirty_init();
+# endif
+# if defined(IRIX_THREADS) || defined(LINUX_THREADS)
+ GC_thr_init();
+# endif
+# if !defined(THREADS) || defined(SOLARIS_THREADS) || defined(WIN32_THREADS) \
+ || defined(IRIX_THREADS) || defined(LINUX_THREADS) \
+ || defined (QUICK_THREADS)
+ if (GC_stackbottom == 0) {
+ GC_stackbottom = GC_get_stack_base();
+ }
+# endif
+ if (sizeof (ptr_t) != sizeof(word)) {
+ ABORT("sizeof (ptr_t) != sizeof(word)\n");
+ }
+ if (sizeof (signed_word) != sizeof(word)) {
+ ABORT("sizeof (signed_word) != sizeof(word)\n");
+ }
+ if (sizeof (struct hblk) != HBLKSIZE) {
+ ABORT("sizeof (struct hblk) != HBLKSIZE\n");
+ }
+# ifndef THREADS
+# if defined(STACK_GROWS_UP) && defined(STACK_GROWS_DOWN)
+ ABORT(
+ "Only one of STACK_GROWS_UP and STACK_GROWS_DOWN should be defd\n");
+# endif
+# if !defined(STACK_GROWS_UP) && !defined(STACK_GROWS_DOWN)
+ ABORT(
+ "One of STACK_GROWS_UP and STACK_GROWS_DOWN should be defd\n");
+# endif
+# ifdef STACK_GROWS_DOWN
+ if ((word)(&dummy) > (word)GC_stackbottom) {
+ GC_err_printf0(
+ "STACK_GROWS_DOWN is defd, but stack appears to grow up\n");
+# ifndef UTS4 /* Compiler bug workaround */
+ GC_err_printf2("sp = 0x%lx, GC_stackbottom = 0x%lx\n",
+ (unsigned long) (&dummy),
+ (unsigned long) GC_stackbottom);
+# endif
+ ABORT("stack direction 3\n");
+ }
+# else
+ if ((word)(&dummy) < (word)GC_stackbottom) {
+ GC_err_printf0(
+ "STACK_GROWS_UP is defd, but stack appears to grow down\n");
+ GC_err_printf2("sp = 0x%lx, GC_stackbottom = 0x%lx\n",
+ (unsigned long) (&dummy),
+ (unsigned long) GC_stackbottom);
+ ABORT("stack direction 4");
+ }
+# endif
+# endif
+# if !defined(_AUX_SOURCE) || defined(__GNUC__)
+ if ((word)(-1) < (word)0) {
+ GC_err_printf0("The type word should be an unsigned integer type\n");
+ GC_err_printf0("It appears to be signed\n");
+ ABORT("word");
+ }
+# endif
+ if ((signed_word)(-1) >= (signed_word)0) {
+ GC_err_printf0(
+ "The type signed_word should be a signed integer type\n");
+ GC_err_printf0("It appears to be unsigned\n");
+ ABORT("signed_word");
+ }
+
+ /* Add initial guess of root sets. Do this first, since sbrk(0) */
+ /* might be used. */
+ GC_register_data_segments();
+ GC_init_headers();
+ GC_bl_init();
+ GC_mark_init();
+ if (!GC_expand_hp_inner((word)MINHINCR)) {
+ GC_err_printf0("Can't start up: not enough memory\n");
+ EXIT();
+ }
+ /* Preallocate large object map. It's otherwise inconvenient to */
+ /* deal with failure. */
+ if (!GC_add_map_entry((word)0)) {
+ GC_err_printf0("Can't start up: not enough memory\n");
+ EXIT();
+ }
+ GC_register_displacement_inner(0L);
+# ifdef MERGE_SIZES
+ GC_init_size_map();
+# endif
+# ifdef PCR
+ if (PCR_IL_Lock(PCR_Bool_false, PCR_allSigsBlocked, PCR_waitForever)
+ != PCR_ERes_okay) {
+ ABORT("Can't lock load state\n");
+ } else if (PCR_IL_Unlock() != PCR_ERes_okay) {
+ ABORT("Can't unlock load state\n");
+ }
+ PCR_IL_Unlock();
+ GC_pcr_install();
+# endif
+ /* Get black list set up */
+ GC_gcollect_inner();
+# ifdef STUBBORN_ALLOC
+ GC_stubborn_init();
+# endif
+ GC_is_initialized = TRUE;
+ /* Convince lint that some things are used */
+# ifdef LINT
+ {
+ extern char * GC_copyright[];
+ extern int GC_read();
+ extern void GC_register_finalizer_no_order();
+
+ GC_noop(GC_copyright, GC_find_header,
+ GC_push_one, GC_call_with_alloc_lock, GC_read,
+ GC_dont_expand,
+# ifndef NO_DEBUGGING
+ GC_dump,
+# endif
+ GC_register_finalizer_no_order);
+ }
+# endif
+}
+
+void GC_enable_incremental GC_PROTO(())
+{
+ DCL_LOCK_STATE;
+
+# ifndef FIND_LEAK
+ DISABLE_SIGNALS();
+ LOCK();
+ if (GC_incremental) goto out;
+ GC_setpagesize();
+# ifdef MSWIN32
+ {
+ extern GC_bool GC_is_win32s();
+
+ /* VirtualProtect is not functional under win32s. */
+ if (GC_is_win32s()) goto out;
+ }
+# endif /* MSWIN32 */
+# ifndef SOLARIS_THREADS
+ GC_dirty_init();
+# endif
+ if (!GC_is_initialized) {
+ GC_init_inner();
+ }
+ if (GC_dont_gc) {
+ /* Can't easily do it. */
+ UNLOCK();
+ ENABLE_SIGNALS();
+ return;
+ }
+ if (GC_words_allocd > 0) {
+ /* There may be unmarked reachable objects */
+ GC_gcollect_inner();
+ } /* else we're OK in assuming everything's */
+ /* clean since nothing can point to an */
+ /* unmarked object. */
+ GC_read_dirty();
+ GC_incremental = TRUE;
+out:
+ UNLOCK();
+ ENABLE_SIGNALS();
+# endif
+}
+
+
+#ifdef MSWIN32
+# define LOG_FILE "gc.log"
+
+ HANDLE GC_stdout = 0, GC_stderr;
+ int GC_tmp;
+ DWORD GC_junk;
+
+ void GC_set_files()
+ {
+ if (!GC_stdout) {
+ GC_stdout = CreateFile(LOG_FILE, GENERIC_WRITE,
+ FILE_SHARE_READ | FILE_SHARE_WRITE,
+ NULL, CREATE_ALWAYS, FILE_FLAG_WRITE_THROUGH,
+ NULL);
+ if (INVALID_HANDLE_VALUE == GC_stdout) ABORT("Open of log file failed");
+ }
+ if (GC_stderr == 0) {
+ GC_stderr = GC_stdout;
+ }
+ }
+
+#endif
+
+#if defined(OS2) || defined(MACOS)
+FILE * GC_stdout = NULL;
+FILE * GC_stderr = NULL;
+int GC_tmp; /* Should really be local ... */
+
+ void GC_set_files()
+ {
+ if (GC_stdout == NULL) {
+ GC_stdout = stdout;
+ }
+ if (GC_stderr == NULL) {
+ GC_stderr = stderr;
+ }
+ }
+#endif
+
+#if !defined(OS2) && !defined(MACOS) && !defined(MSWIN32)
+ int GC_stdout = 1;
+ int GC_stderr = 2;
+# if !defined(AMIGA)
+# include <unistd.h>
+# endif
+#endif
+
+#if !defined(MSWIN32) && !defined(OS2) && !defined(MACOS) && !defined(ECOS)
+int GC_write(fd, buf, len)
+int fd;
+char *buf;
+size_t len;
+{
+ register int bytes_written = 0;
+ register int result;
+
+ while (bytes_written < len) {
+# ifdef SOLARIS_THREADS
+ result = syscall(SYS_write, fd, buf + bytes_written,
+ len - bytes_written);
+# else
+ result = write(fd, buf + bytes_written, len - bytes_written);
+# endif
+ if (-1 == result) return(result);
+ bytes_written += result;
+ }
+ return(bytes_written);
+}
+#endif /* UN*X */
+
+#if defined(ECOS)
+int GC_write(fd, buf, len)
+{
+ _Jv_diag_write (buf, len);
+ return len;
+}
+#endif
+
+
+#ifdef MSWIN32
+# define WRITE(f, buf, len) (GC_set_files(), \
+ GC_tmp = WriteFile((f), (buf), \
+ (len), &GC_junk, NULL),\
+ (GC_tmp? 1 : -1))
+#else
+# if defined(OS2) || defined(MACOS)
+# define WRITE(f, buf, len) (GC_set_files(), \
+ GC_tmp = fwrite((buf), 1, (len), (f)), \
+ fflush(f), GC_tmp)
+# else
+# define WRITE(f, buf, len) GC_write((f), (buf), (len))
+# endif
+#endif
+
+/* A version of printf that is unlikely to call malloc, and is thus safer */
+/* to call from the collector in case malloc has been bound to GC_malloc. */
+/* Assumes that no more than 1023 characters are written at once. */
+/* Assumes that all arguments have been converted to something of the */
+/* same size as long, and that the format conversions expect something */
+/* of that size. */
+void GC_printf(format, a, b, c, d, e, f)
+char * format;
+long a, b, c, d, e, f;
+{
+ char buf[1025];
+
+ if (GC_quiet) return;
+ buf[1024] = 0x15;
+ (void) sprintf(buf, format, a, b, c, d, e, f);
+ if (buf[1024] != 0x15) ABORT("GC_printf clobbered stack");
+ if (WRITE(GC_stdout, buf, strlen(buf)) < 0) ABORT("write to stdout failed");
+}
+
+void GC_err_printf(format, a, b, c, d, e, f)
+char * format;
+long a, b, c, d, e, f;
+{
+ char buf[1025];
+
+ buf[1024] = 0x15;
+ (void) sprintf(buf, format, a, b, c, d, e, f);
+ if (buf[1024] != 0x15) ABORT("GC_err_printf clobbered stack");
+ if (WRITE(GC_stderr, buf, strlen(buf)) < 0) ABORT("write to stderr failed");
+}
+
+void GC_err_puts(s)
+char *s;
+{
+ if (WRITE(GC_stderr, s, strlen(s)) < 0) ABORT("write to stderr failed");
+}
+
+# if defined(__STDC__) || defined(__cplusplus)
+ void GC_default_warn_proc(char *msg, GC_word arg)
+# else
+ void GC_default_warn_proc(msg, arg)
+ char *msg;
+ GC_word arg;
+# endif
+{
+ GC_err_printf1(msg, (unsigned long)arg);
+}
+
+GC_warn_proc GC_current_warn_proc = GC_default_warn_proc;
+
+# if defined(__STDC__) || defined(__cplusplus)
+ GC_warn_proc GC_set_warn_proc(GC_warn_proc p)
+# else
+ GC_warn_proc GC_set_warn_proc(p)
+ GC_warn_proc p;
+# endif
+{
+ GC_warn_proc result;
+
+ LOCK();
+ result = GC_current_warn_proc;
+ GC_current_warn_proc = p;
+ UNLOCK();
+ return(result);
+}
+
+
+#ifndef PCR
+void GC_abort(msg)
+char * msg;
+{
+ GC_err_printf1("%s\n", msg);
+ (void) abort();
+}
+#endif
+
+#ifdef NEED_CALLINFO
+
+void GC_print_callers (info)
+struct callinfo info[NFRAMES];
+{
+ register int i,j;
+
+# if NFRAMES == 1
+ GC_err_printf0("\tCaller at allocation:\n");
+# else
+ GC_err_printf0("\tCall chain at allocation:\n");
+# endif
+ for (i = 0; i < NFRAMES; i++) {
+ if (info[i].ci_pc == 0) break;
+# if NARGS > 0
+ GC_err_printf0("\t\targs: ");
+ for (j = 0; j < NARGS; j++) {
+ if (j != 0) GC_err_printf0(", ");
+ GC_err_printf2("%d (0x%X)", ~(info[i].ci_arg[j]),
+ ~(info[i].ci_arg[j]));
+ }
+ GC_err_printf0("\n");
+# endif
+ GC_err_printf1("\t\t##PC##= 0x%X\n", info[i].ci_pc);
+ }
+}
+
+#endif /* SAVE_CALL_CHAIN */
+
+# ifdef SRC_M3
+void GC_enable()
+{
+ GC_dont_gc--;
+}
+
+void GC_disable()
+{
+ GC_dont_gc++;
+}
+# endif
+
+#if !defined(NO_DEBUGGING)
+
+void GC_dump()
+{
+ GC_printf0("***Static roots:\n");
+ GC_print_static_roots();
+ GC_printf0("\n***Heap sections:\n");
+ GC_print_heap_sects();
+ GC_printf0("\n***Free blocks:\n");
+ GC_print_hblkfreelist();
+ GC_printf0("\n***Blocks in use:\n");
+ GC_print_block_list();
+}
+
+# endif /* NO_DEBUGGING */
diff --git a/boehm-gc/new_hblk.c b/boehm-gc/new_hblk.c
new file mode 100644
index 00000000000..9f32ae0dcb4
--- /dev/null
+++ b/boehm-gc/new_hblk.c
@@ -0,0 +1,244 @@
+/*
+ * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ * This file contains the functions:
+ * ptr_t GC_build_flXXX(h, old_fl)
+ * void GC_new_hblk(n)
+ */
+/* Boehm, May 19, 1994 2:09 pm PDT */
+
+
+# include <stdio.h>
+# include "gc_priv.h"
+
+#ifndef SMALL_CONFIG
+/*
+ * Build a free list for size 1 objects inside hblk h. Set the last link to
+ * be ofl. Return a pointer tpo the first free list entry.
+ */
+ptr_t GC_build_fl1(h, ofl)
+struct hblk *h;
+ptr_t ofl;
+{
+ register word * p = (word *)h;
+ register word * lim = (word *)(h + 1);
+
+ p[0] = (word)ofl;
+ p[1] = (word)(p);
+ p[2] = (word)(p+1);
+ p[3] = (word)(p+2);
+ p += 4;
+ for (; p < lim; p += 4) {
+ p[0] = (word)(p-1);
+ p[1] = (word)(p);
+ p[2] = (word)(p+1);
+ p[3] = (word)(p+2);
+ };
+ return((ptr_t)(p-1));
+}
+
+/* The same for size 2 cleared objects */
+ptr_t GC_build_fl_clear2(h, ofl)
+struct hblk *h;
+ptr_t ofl;
+{
+ register word * p = (word *)h;
+ register word * lim = (word *)(h + 1);
+
+ p[0] = (word)ofl;
+ p[1] = 0;
+ p[2] = (word)p;
+ p[3] = 0;
+ p += 4;
+ for (; p < lim; p += 4) {
+ p[0] = (word)(p-2);
+ p[1] = 0;
+ p[2] = (word)p;
+ p[3] = 0;
+ };
+ return((ptr_t)(p-2));
+}
+
+/* The same for size 3 cleared objects */
+ptr_t GC_build_fl_clear3(h, ofl)
+struct hblk *h;
+ptr_t ofl;
+{
+ register word * p = (word *)h;
+ register word * lim = (word *)(h + 1) - 2;
+
+ p[0] = (word)ofl;
+ p[1] = 0;
+ p[2] = 0;
+ p += 3;
+ for (; p < lim; p += 3) {
+ p[0] = (word)(p-3);
+ p[1] = 0;
+ p[2] = 0;
+ };
+ return((ptr_t)(p-3));
+}
+
+/* The same for size 4 cleared objects */
+ptr_t GC_build_fl_clear4(h, ofl)
+struct hblk *h;
+ptr_t ofl;
+{
+ register word * p = (word *)h;
+ register word * lim = (word *)(h + 1);
+
+ p[0] = (word)ofl;
+ p[1] = 0;
+ p[2] = 0;
+ p[3] = 0;
+ p += 4;
+ for (; p < lim; p += 4) {
+ p[0] = (word)(p-4);
+ p[1] = 0;
+ p[2] = 0;
+ p[3] = 0;
+ };
+ return((ptr_t)(p-4));
+}
+
+/* The same for size 2 uncleared objects */
+ptr_t GC_build_fl2(h, ofl)
+struct hblk *h;
+ptr_t ofl;
+{
+ register word * p = (word *)h;
+ register word * lim = (word *)(h + 1);
+
+ p[0] = (word)ofl;
+ p[2] = (word)p;
+ p += 4;
+ for (; p < lim; p += 4) {
+ p[0] = (word)(p-2);
+ p[2] = (word)p;
+ };
+ return((ptr_t)(p-2));
+}
+
+/* The same for size 4 uncleared objects */
+ptr_t GC_build_fl4(h, ofl)
+struct hblk *h;
+ptr_t ofl;
+{
+ register word * p = (word *)h;
+ register word * lim = (word *)(h + 1);
+
+ p[0] = (word)ofl;
+ p[4] = (word)p;
+ p += 8;
+ for (; p < lim; p += 8) {
+ p[0] = (word)(p-4);
+ p[4] = (word)p;
+ };
+ return((ptr_t)(p-4));
+}
+
+#endif /* !SMALL_CONFIG */
+
+/*
+ * Allocate a new heapblock for small objects of size n.
+ * Add all of the heapblock's objects to the free list for objects
+ * of that size.
+ * Set all mark bits if objects are uncollectable.
+ * Will fail to do anything if we are out of memory.
+ */
+void GC_new_hblk(sz, kind)
+register word sz;
+int kind;
+{
+ register word *p,
+ *prev;
+ word *last_object; /* points to last object in new hblk */
+ register struct hblk *h; /* the new heap block */
+ register GC_bool clear = GC_obj_kinds[kind].ok_init;
+
+# ifdef PRINTSTATS
+ if ((sizeof (struct hblk)) > HBLKSIZE) {
+ ABORT("HBLK SZ inconsistency");
+ }
+# endif
+
+ /* Allocate a new heap block */
+ h = GC_allochblk(sz, kind, 0);
+ if (h == 0) return;
+
+ /* Mark all objects if appropriate. */
+ if (IS_UNCOLLECTABLE(kind)) GC_set_hdr_marks(HDR(h));
+
+ /* Handle small objects sizes more efficiently. For larger objects */
+ /* the difference is less significant. */
+# ifndef SMALL_CONFIG
+ switch (sz) {
+ case 1: GC_obj_kinds[kind].ok_freelist[1] =
+ GC_build_fl1(h, GC_obj_kinds[kind].ok_freelist[1]);
+ return;
+ case 2: if (clear) {
+ GC_obj_kinds[kind].ok_freelist[2] =
+ GC_build_fl_clear2(h, GC_obj_kinds[kind].ok_freelist[2]);
+ } else {
+ GC_obj_kinds[kind].ok_freelist[2] =
+ GC_build_fl2(h, GC_obj_kinds[kind].ok_freelist[2]);
+ }
+ return;
+ case 3: if (clear) {
+ GC_obj_kinds[kind].ok_freelist[3] =
+ GC_build_fl_clear3(h, GC_obj_kinds[kind].ok_freelist[3]);
+ return;
+ } else {
+ /* It's messy to do better than the default here. */
+ break;
+ }
+ case 4: if (clear) {
+ GC_obj_kinds[kind].ok_freelist[4] =
+ GC_build_fl_clear4(h, GC_obj_kinds[kind].ok_freelist[4]);
+ } else {
+ GC_obj_kinds[kind].ok_freelist[4] =
+ GC_build_fl4(h, GC_obj_kinds[kind].ok_freelist[4]);
+ }
+ return;
+ default:
+ break;
+ }
+# endif /* !SMALL_CONFIG */
+
+ /* Clear the page if necessary. */
+ if (clear) BZERO(h, HBLKSIZE);
+
+ /* Add objects to free list */
+ p = &(h -> hb_body[sz]); /* second object in *h */
+ prev = &(h -> hb_body[0]); /* One object behind p */
+ last_object = (word *)((char *)h + HBLKSIZE);
+ last_object -= sz;
+ /* Last place for last object to start */
+
+ /* make a list of all objects in *h with head as last object */
+ while (p <= last_object) {
+ /* current object's link points to last object */
+ obj_link(p) = (ptr_t)prev;
+ prev = p;
+ p += sz;
+ }
+ p -= sz; /* p now points to last object */
+
+ /*
+ * put p (which is now head of list of objects in *h) as first
+ * pointer in the appropriate free list for this size.
+ */
+ obj_link(h -> hb_body) = GC_obj_kinds[kind].ok_freelist[sz];
+ GC_obj_kinds[kind].ok_freelist[sz] = ((ptr_t)p);
+}
+
diff --git a/boehm-gc/obj_map.c b/boehm-gc/obj_map.c
new file mode 100644
index 00000000000..82ebf311983
--- /dev/null
+++ b/boehm-gc/obj_map.c
@@ -0,0 +1,142 @@
+/*
+ * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+ * Copyright (c) 1991, 1992 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+/* Boehm, October 9, 1995 1:09 pm PDT */
+
+/* Routines for maintaining maps describing heap block
+ * layouts for various object sizes. Allows fast pointer validity checks
+ * and fast location of object start locations on machines (such as SPARC)
+ * with slow division.
+ */
+
+# include "gc_priv.h"
+
+char * GC_invalid_map = 0;
+
+/* Invalidate the object map associated with a block. Free blocks */
+/* are identified by invalid maps. */
+void GC_invalidate_map(hhdr)
+hdr *hhdr;
+{
+ register int displ;
+
+ if (GC_invalid_map == 0) {
+ GC_invalid_map = GC_scratch_alloc(MAP_SIZE);
+ if (GC_invalid_map == 0) {
+ GC_err_printf0(
+ "Cant initialize GC_invalid_map: insufficient memory\n");
+ EXIT();
+ }
+ for (displ = 0; displ < HBLKSIZE; displ++) {
+ MAP_ENTRY(GC_invalid_map, displ) = OBJ_INVALID;
+ }
+ }
+ hhdr -> hb_map = GC_invalid_map;
+}
+
+/* Consider pointers that are offset bytes displaced from the beginning */
+/* of an object to be valid. */
+
+# if defined(__STDC__) || defined(__cplusplus)
+ void GC_register_displacement(GC_word offset)
+# else
+ void GC_register_displacement(offset)
+ GC_word offset;
+# endif
+{
+# ifndef ALL_INTERIOR_POINTERS
+ DCL_LOCK_STATE;
+
+ DISABLE_SIGNALS();
+ LOCK();
+ GC_register_displacement_inner(offset);
+ UNLOCK();
+ ENABLE_SIGNALS();
+# endif
+}
+
+void GC_register_displacement_inner(offset)
+word offset;
+{
+# ifndef ALL_INTERIOR_POINTERS
+ register unsigned i;
+
+ if (offset > MAX_OFFSET) {
+ ABORT("Bad argument to GC_register_displacement");
+ }
+ if (!GC_valid_offsets[offset]) {
+ GC_valid_offsets[offset] = TRUE;
+ GC_modws_valid_offsets[offset % sizeof(word)] = TRUE;
+ for (i = 0; i <= MAXOBJSZ; i++) {
+ if (GC_obj_map[i] != 0) {
+ if (i == 0) {
+ GC_obj_map[i][offset + HDR_BYTES] = (char)BYTES_TO_WORDS(offset);
+ } else {
+ register unsigned j;
+ register unsigned lb = WORDS_TO_BYTES(i);
+
+ if (offset < lb) {
+ for (j = offset + HDR_BYTES; j < HBLKSIZE; j += lb) {
+ GC_obj_map[i][j] = (char)BYTES_TO_WORDS(offset);
+ }
+ }
+ }
+ }
+ }
+ }
+# endif
+}
+
+
+/* Add a heap block map for objects of size sz to obj_map. */
+/* Return FALSE on failure. */
+GC_bool GC_add_map_entry(sz)
+word sz;
+{
+ register unsigned obj_start;
+ register unsigned displ;
+ register char * new_map;
+
+ if (sz > MAXOBJSZ) sz = 0;
+ if (GC_obj_map[sz] != 0) {
+ return(TRUE);
+ }
+ new_map = GC_scratch_alloc(MAP_SIZE);
+ if (new_map == 0) return(FALSE);
+# ifdef PRINTSTATS
+ GC_printf1("Adding block map for size %lu\n", (unsigned long)sz);
+# endif
+ for (displ = 0; displ < HBLKSIZE; displ++) {
+ MAP_ENTRY(new_map,displ) = OBJ_INVALID;
+ }
+ if (sz == 0) {
+ for(displ = 0; displ <= MAX_OFFSET; displ++) {
+ if (OFFSET_VALID(displ)) {
+ MAP_ENTRY(new_map,displ+HDR_BYTES) = BYTES_TO_WORDS(displ);
+ }
+ }
+ } else {
+ for (obj_start = HDR_BYTES;
+ obj_start + WORDS_TO_BYTES(sz) <= HBLKSIZE;
+ obj_start += WORDS_TO_BYTES(sz)) {
+ for (displ = 0; displ < WORDS_TO_BYTES(sz); displ++) {
+ if (OFFSET_VALID(displ)) {
+ MAP_ENTRY(new_map, obj_start + displ) =
+ BYTES_TO_WORDS(displ);
+ }
+ }
+ }
+ }
+ GC_obj_map[sz] = new_map;
+ return(TRUE);
+}
diff --git a/boehm-gc/os_dep.c b/boehm-gc/os_dep.c
new file mode 100644
index 00000000000..1b1442fe5c5
--- /dev/null
+++ b/boehm-gc/os_dep.c
@@ -0,0 +1,2320 @@
+/*
+ * Copyright (c) 1991-1995 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996-1997 by Silicon Graphics. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+
+# include "gc_priv.h"
+
+# if defined(LINUX) && !defined(POWERPC)
+# include <linux/version.h>
+# if (LINUX_VERSION_CODE <= 0x10400)
+ /* Ugly hack to get struct sigcontext_struct definition. Required */
+ /* for some early 1.3.X releases. Will hopefully go away soon. */
+ /* in some later Linux releases, asm/sigcontext.h may have to */
+ /* be included instead. */
+# define __KERNEL__
+# include <asm/signal.h>
+# undef __KERNEL__
+# else
+ /* Kernels prior to 2.1.1 defined struct sigcontext_struct instead of */
+ /* struct sigcontext. libc6 (glibc2) uses "struct sigcontext" in */
+ /* prototypes, so we have to include the top-level sigcontext.h to */
+ /* make sure the former gets defined to be the latter if appropriate. */
+# include <features.h>
+# if 2 <= __GLIBC__ && 0 == __GLIBC_MINOR__
+# include <sigcontext.h>
+# else /* not 2 <= __GLIBC__ */
+ /* libc5 doesn't have <sigcontext.h>: go directly with the kernel */
+ /* one. Check LINUX_VERSION_CODE to see which we should reference. */
+# include <asm/sigcontext.h>
+# endif /* 2 <= __GLIBC__ */
+# endif
+# endif
+# if !defined(OS2) && !defined(PCR) && !defined(AMIGA) && !defined(MACOS)
+# include <sys/types.h>
+# if !defined(MSWIN32) && !defined(SUNOS4)
+# include <unistd.h>
+# endif
+# endif
+
+# include <stdio.h>
+# include <signal.h>
+
+/* Blatantly OS dependent routines, except for those that are related */
+/* dynamic loading. */
+
+# if !defined(THREADS) && !defined(STACKBOTTOM) && defined(HEURISTIC2)
+# define NEED_FIND_LIMIT
+# endif
+
+# if defined(IRIX_THREADS)
+# define NEED_FIND_LIMIT
+# endif
+
+# if (defined(SUNOS4) & defined(DYNAMIC_LOADING)) && !defined(PCR)
+# define NEED_FIND_LIMIT
+# endif
+
+# if (defined(SVR4) || defined(AUX) || defined(DGUX)) && !defined(PCR)
+# define NEED_FIND_LIMIT
+# endif
+
+# if defined(LINUX) && (defined(POWERPC) || defined(ALPHA) || defined(SPARC))
+# define NEED_FIND_LIMIT
+# endif
+
+#ifdef NEED_FIND_LIMIT
+# include <setjmp.h>
+#endif
+
+#ifdef FREEBSD
+# include <machine/trap.h>
+#endif
+
+#ifdef AMIGA
+# include <proto/exec.h>
+# include <proto/dos.h>
+# include <dos/dosextens.h>
+# include <workbench/startup.h>
+#endif
+
+#ifdef MSWIN32
+# define WIN32_LEAN_AND_MEAN
+# define NOSERVICE
+# include <windows.h>
+#endif
+
+#ifdef MACOS
+# include <Processes.h>
+#endif
+
+#ifdef IRIX5
+# include <sys/uio.h>
+# include <malloc.h> /* for locking */
+#endif
+#ifdef USE_MMAP
+# include <sys/types.h>
+# include <sys/mman.h>
+# include <sys/stat.h>
+# include <fcntl.h>
+#endif
+
+#ifdef SUNOS5SIGS
+# include <sys/siginfo.h>
+# undef setjmp
+# undef longjmp
+# define setjmp(env) sigsetjmp(env, 1)
+# define longjmp(env, val) siglongjmp(env, val)
+# define jmp_buf sigjmp_buf
+#endif
+
+#ifdef DJGPP
+ /* Apparently necessary for djgpp 2.01. May casuse problems with */
+ /* other versions. */
+ typedef long unsigned int caddr_t;
+#endif
+
+#ifdef PCR
+# include "il/PCR_IL.h"
+# include "th/PCR_ThCtl.h"
+# include "mm/PCR_MM.h"
+#endif
+
+#if !defined(NO_EXECUTE_PERMISSION)
+# define OPT_PROT_EXEC PROT_EXEC
+#else
+# define OPT_PROT_EXEC 0
+#endif
+
+#if defined(LINUX) && defined(POWERPC)
+ ptr_t GC_data_start;
+
+ void GC_init_linuxppc()
+ {
+ extern ptr_t GC_find_limit();
+ extern char **_environ;
+ /* This may need to be environ, without the underscore, for */
+ /* some versions. */
+ GC_data_start = GC_find_limit((ptr_t)&_environ, FALSE);
+ }
+#endif
+
+#if defined(LINUX) && defined(ALPHA)
+ ptr_t GC_data_start;
+
+ void GC_init_linuxalpha()
+ {
+# ifdef USE_PROC
+ FILE *fp = fopen("/proc/self/maps", "r");
+
+ if (fp) {
+ extern void *_etext;
+ ptr_t stacktop = 0, stackbottom = 0;
+ ptr_t textstart = 0, textend = 0;
+ ptr_t datastart = 0, dataend = 0;
+ ptr_t bssstart = 0, bssend = 0;
+
+ while (!feof(fp)) {
+ ptr_t start, end, offset;
+ unsigned short major, minor;
+ char r, w, x, p;
+ unsigned int inode;
+
+ int n = fscanf(fp, "%lx-%lx %c%c%c%c %lx %hx:%hx %d",
+ &start, &end, &r, &w, &x, &p, &offset, &major, &minor, &inode);
+ if (n < 10) break;
+
+ /*
+ * If local variable lies within segment, it is stack.
+ * Else if segment lies below _end and is executable,
+ * it is text. Otherwise, if segment start lies between
+ * _etext and _end and segment is writable and is mapped
+ * to the executable image it is data, otherwise bss.
+ */
+ if (start < (ptr_t)&fp && end > (ptr_t)&fp && w == 'w') {
+ stacktop = start;
+ stackbottom = end;
+ } else if (start < (ptr_t)&_end && w == '-' && x == 'x') {
+ textstart = start;
+ textend = end;
+ } else if (start >= (ptr_t)&_etext &&
+ start < (ptr_t)&_end && w == 'w') {
+ if (inode > 0) {
+ datastart = start;
+ dataend = end;
+ } else {
+ bssstart = start;
+ bssend = end;
+ }
+ }
+
+ //printf("%016lx-%016lx %c%c%c%c %016lx %02hx:%02hx %d\n",
+ // start, end, r, w, x, p, offset, major, minor, inode);
+
+ while (fgetc(fp) != '\n') ;
+ }
+ fclose(fp);
+
+ //fprintf(stderr, "text: %lx-%lx\n", textstart, textend);
+ //fprintf(stderr, "data: %lx-%lx\n", datastart, dataend);
+ //fprintf(stderr, "bss: %lx-%lx\n", bssstart, bssend);
+ //fprintf(stderr, "stack: %lx-%lx\n", stacktop, stackbottom);
+
+ GC_data_start = datastart;
+ } else {
+# endif
+ extern ptr_t GC_find_limit();
+ extern int _edata;
+ /* This may need to be environ, without the underscore, for */
+ /* some versions. */
+ GC_data_start = GC_find_limit((ptr_t)&_edata, FALSE);
+# ifdef USE_PROC
+ }
+# endif
+ //fprintf(stderr, "GC_data_start = %p\n", GC_data_start);
+ }
+#endif
+
+#if defined(LINUX) && defined(SPARC)
+ ptr_t GC_data_start;
+
+ void GC_init_linuxsparc()
+ {
+ extern ptr_t GC_find_limit();
+ extern char **_environ;
+ /* This may need to be environ, without the underscore, for */
+ /* some versions. */
+ GC_data_start = GC_find_limit((ptr_t)&_environ, FALSE);
+ }
+#endif
+
+# ifdef ECOS
+
+# ifndef ECOS_GC_MEMORY_SIZE
+# define ECOS_GC_MEMORY_SIZE (448 * 1024)
+# endif /* ECOS_GC_MEMORY_SIZE */
+
+// setjmp() function, as described in ANSI para 7.6.1.1
+#define setjmp( __env__ ) hal_setjmp( __env__ )
+
+// FIXME: This is a simple way of allocating memory which is
+// compatible with ECOS early releases. Later releases use a more
+// sophisticated means of allocating memory than this simple static
+// allocator, but this method is at least bound to work.
+static char memory[ECOS_GC_MEMORY_SIZE];
+static char *brk = memory;
+
+static void *tiny_sbrk(ptrdiff_t increment)
+{
+ void *p = brk;
+
+ brk += increment;
+
+ if (brk > memory + sizeof memory)
+ {
+ brk -= increment;
+ return NULL;
+ }
+
+ return p;
+}
+#define sbrk tiny_sbrk
+# endif /* ECOS */
+
+# ifdef OS2
+
+# include <stddef.h>
+
+# if !defined(__IBMC__) && !defined(__WATCOMC__) /* e.g. EMX */
+
+struct exe_hdr {
+ unsigned short magic_number;
+ unsigned short padding[29];
+ long new_exe_offset;
+};
+
+#define E_MAGIC(x) (x).magic_number
+#define EMAGIC 0x5A4D
+#define E_LFANEW(x) (x).new_exe_offset
+
+struct e32_exe {
+ unsigned char magic_number[2];
+ unsigned char byte_order;
+ unsigned char word_order;
+ unsigned long exe_format_level;
+ unsigned short cpu;
+ unsigned short os;
+ unsigned long padding1[13];
+ unsigned long object_table_offset;
+ unsigned long object_count;
+ unsigned long padding2[31];
+};
+
+#define E32_MAGIC1(x) (x).magic_number[0]
+#define E32MAGIC1 'L'
+#define E32_MAGIC2(x) (x).magic_number[1]
+#define E32MAGIC2 'X'
+#define E32_BORDER(x) (x).byte_order
+#define E32LEBO 0
+#define E32_WORDER(x) (x).word_order
+#define E32LEWO 0
+#define E32_CPU(x) (x).cpu
+#define E32CPU286 1
+#define E32_OBJTAB(x) (x).object_table_offset
+#define E32_OBJCNT(x) (x).object_count
+
+struct o32_obj {
+ unsigned long size;
+ unsigned long base;
+ unsigned long flags;
+ unsigned long pagemap;
+ unsigned long mapsize;
+ unsigned long reserved;
+};
+
+#define O32_FLAGS(x) (x).flags
+#define OBJREAD 0x0001L
+#define OBJWRITE 0x0002L
+#define OBJINVALID 0x0080L
+#define O32_SIZE(x) (x).size
+#define O32_BASE(x) (x).base
+
+# else /* IBM's compiler */
+
+/* A kludge to get around what appears to be a header file bug */
+# ifndef WORD
+# define WORD unsigned short
+# endif
+# ifndef DWORD
+# define DWORD unsigned long
+# endif
+
+# define EXE386 1
+# include <newexe.h>
+# include <exe386.h>
+
+# endif /* __IBMC__ */
+
+# define INCL_DOSEXCEPTIONS
+# define INCL_DOSPROCESS
+# define INCL_DOSERRORS
+# define INCL_DOSMODULEMGR
+# define INCL_DOSMEMMGR
+# include <os2.h>
+
+
+/* Disable and enable signals during nontrivial allocations */
+
+void GC_disable_signals(void)
+{
+ ULONG nest;
+
+ DosEnterMustComplete(&nest);
+ if (nest != 1) ABORT("nested GC_disable_signals");
+}
+
+void GC_enable_signals(void)
+{
+ ULONG nest;
+
+ DosExitMustComplete(&nest);
+ if (nest != 0) ABORT("GC_enable_signals");
+}
+
+
+# else
+
+# if !defined(PCR) && !defined(AMIGA) && !defined(MSWIN32) \
+ && !defined(MACOS) && !defined(DJGPP) && !defined(DOS4GW) \
+ && !defined(NO_SIGSET)
+
+# if defined(sigmask) && !defined(UTS4)
+ /* Use the traditional BSD interface */
+# define SIGSET_T int
+# define SIG_DEL(set, signal) (set) &= ~(sigmask(signal))
+# define SIG_FILL(set) (set) = 0x7fffffff
+ /* Setting the leading bit appears to provoke a bug in some */
+ /* longjmp implementations. Most systems appear not to have */
+ /* a signal 32. */
+# define SIGSETMASK(old, new) (old) = sigsetmask(new)
+# else
+ /* Use POSIX/SYSV interface */
+# define SIGSET_T sigset_t
+# define SIG_DEL(set, signal) sigdelset(&(set), (signal))
+# define SIG_FILL(set) sigfillset(&set)
+# define SIGSETMASK(old, new) sigprocmask(SIG_SETMASK, &(new), &(old))
+# endif
+
+static GC_bool mask_initialized = FALSE;
+
+static SIGSET_T new_mask;
+
+static SIGSET_T old_mask;
+
+static SIGSET_T dummy;
+
+#if defined(PRINTSTATS) && !defined(THREADS)
+# define CHECK_SIGNALS
+ int GC_sig_disabled = 0;
+#endif
+
+void GC_disable_signals()
+{
+ if (!mask_initialized) {
+ SIG_FILL(new_mask);
+
+ SIG_DEL(new_mask, SIGSEGV);
+ SIG_DEL(new_mask, SIGILL);
+ SIG_DEL(new_mask, SIGQUIT);
+# ifdef SIGBUS
+ SIG_DEL(new_mask, SIGBUS);
+# endif
+# ifdef SIGIOT
+ SIG_DEL(new_mask, SIGIOT);
+# endif
+# ifdef SIGEMT
+ SIG_DEL(new_mask, SIGEMT);
+# endif
+# ifdef SIGTRAP
+ SIG_DEL(new_mask, SIGTRAP);
+# endif
+ mask_initialized = TRUE;
+ }
+# ifdef CHECK_SIGNALS
+ if (GC_sig_disabled != 0) ABORT("Nested disables");
+ GC_sig_disabled++;
+# endif
+ SIGSETMASK(old_mask,new_mask);
+}
+
+void GC_enable_signals()
+{
+# ifdef CHECK_SIGNALS
+ if (GC_sig_disabled != 1) ABORT("Unmatched enable");
+ GC_sig_disabled--;
+# endif
+ SIGSETMASK(dummy,old_mask);
+}
+
+# endif /* !PCR */
+
+# endif /*!OS/2 */
+
+/* Ivan Demakov: simplest way (to me) */
+#if defined (DOS4GW) || defined (NO_SIGSET)
+ void GC_disable_signals() { }
+ void GC_enable_signals() { }
+#endif
+
+/* Find the page size */
+word GC_page_size;
+
+# ifdef MSWIN32
+ void GC_setpagesize()
+ {
+ SYSTEM_INFO sysinfo;
+
+ GetSystemInfo(&sysinfo);
+ GC_page_size = sysinfo.dwPageSize;
+ }
+
+# else
+# if defined(MPROTECT_VDB) || defined(PROC_VDB) || defined(USE_MMAP)
+ void GC_setpagesize()
+ {
+ GC_page_size = GETPAGESIZE();
+ }
+# else
+ /* It's acceptable to fake it. */
+ void GC_setpagesize()
+ {
+ GC_page_size = HBLKSIZE;
+ }
+# endif
+# endif
+
+/*
+ * Find the base of the stack.
+ * Used only in single-threaded environment.
+ * With threads, GC_mark_roots needs to know how to do this.
+ * Called with allocator lock held.
+ */
+# ifdef MSWIN32
+# define is_writable(prot) ((prot) == PAGE_READWRITE \
+ || (prot) == PAGE_WRITECOPY \
+ || (prot) == PAGE_EXECUTE_READWRITE \
+ || (prot) == PAGE_EXECUTE_WRITECOPY)
+/* Return the number of bytes that are writable starting at p. */
+/* The pointer p is assumed to be page aligned. */
+/* If base is not 0, *base becomes the beginning of the */
+/* allocation region containing p. */
+word GC_get_writable_length(ptr_t p, ptr_t *base)
+{
+ MEMORY_BASIC_INFORMATION buf;
+ word result;
+ word protect;
+
+ result = VirtualQuery(p, &buf, sizeof(buf));
+ if (result != sizeof(buf)) ABORT("Weird VirtualQuery result");
+ if (base != 0) *base = (ptr_t)(buf.AllocationBase);
+ protect = (buf.Protect & ~(PAGE_GUARD | PAGE_NOCACHE));
+ if (!is_writable(protect)) {
+ return(0);
+ }
+ if (buf.State != MEM_COMMIT) return(0);
+ return(buf.RegionSize);
+}
+
+ptr_t GC_get_stack_base()
+{
+ int dummy;
+ ptr_t sp = (ptr_t)(&dummy);
+ ptr_t trunc_sp = (ptr_t)((word)sp & ~(GC_page_size - 1));
+ word size = GC_get_writable_length(trunc_sp, 0);
+
+ return(trunc_sp + size);
+}
+
+
+# else
+
+# ifdef OS2
+
+ptr_t GC_get_stack_base()
+{
+ PTIB ptib;
+ PPIB ppib;
+
+ if (DosGetInfoBlocks(&ptib, &ppib) != NO_ERROR) {
+ GC_err_printf0("DosGetInfoBlocks failed\n");
+ ABORT("DosGetInfoBlocks failed\n");
+ }
+ return((ptr_t)(ptib -> tib_pstacklimit));
+}
+
+# else
+
+# ifdef AMIGA
+
+ptr_t GC_get_stack_base()
+{
+ extern struct WBStartup *_WBenchMsg;
+ extern long __base;
+ extern long __stack;
+ struct Task *task;
+ struct Process *proc;
+ struct CommandLineInterface *cli;
+ long size;
+
+ if ((task = FindTask(0)) == 0) {
+ GC_err_puts("Cannot find own task structure\n");
+ ABORT("task missing");
+ }
+ proc = (struct Process *)task;
+ cli = BADDR(proc->pr_CLI);
+
+ if (_WBenchMsg != 0 || cli == 0) {
+ size = (char *)task->tc_SPUpper - (char *)task->tc_SPLower;
+ } else {
+ size = cli->cli_DefaultStack * 4;
+ }
+ return (ptr_t)(__base + GC_max(size, __stack));
+}
+
+# else
+
+
+
+# ifdef NEED_FIND_LIMIT
+ /* Some tools to implement HEURISTIC2 */
+# define MIN_PAGE_SIZE 256 /* Smallest conceivable page size, bytes */
+ /* static */ jmp_buf GC_jmp_buf;
+
+ /*ARGSUSED*/
+ void GC_fault_handler(sig)
+ int sig;
+ {
+ longjmp(GC_jmp_buf, 1);
+ }
+
+# ifdef __STDC__
+ typedef void (*handler)(int);
+# else
+ typedef void (*handler)();
+# endif
+
+# if defined(SUNOS5SIGS) || defined(IRIX5)
+ static struct sigaction old_segv_act;
+ static struct sigaction old_bus_act;
+# else
+ static handler old_segv_handler, old_bus_handler;
+# endif
+
+ void GC_setup_temporary_fault_handler()
+ {
+# ifndef ECOS
+# if defined(SUNOS5SIGS) || defined(IRIX5)
+ struct sigaction act;
+
+ act.sa_handler = GC_fault_handler;
+ act.sa_flags = SA_RESTART | SA_NODEFER;
+ /* The presence of SA_NODEFER represents yet another gross */
+ /* hack. Under Solaris 2.3, siglongjmp doesn't appear to */
+ /* interact correctly with -lthread. We hide the confusion */
+ /* by making sure that signal handling doesn't affect the */
+ /* signal mask. */
+
+ (void) sigemptyset(&act.sa_mask);
+# ifdef IRIX_THREADS
+ /* Older versions have a bug related to retrieving and */
+ /* and setting a handler at the same time. */
+ (void) sigaction(SIGSEGV, 0, &old_segv_act);
+ (void) sigaction(SIGSEGV, &act, 0);
+# else
+ (void) sigaction(SIGSEGV, &act, &old_segv_act);
+# ifdef _sigargs /* Irix 5.x, not 6.x */
+ /* Under 5.x, we may get SIGBUS. */
+ /* Pthreads doesn't exist under 5.x, so we don't */
+ /* have to worry in the threads case. */
+ (void) sigaction(SIGBUS, &act, &old_bus_act);
+# endif
+# endif /* IRIX_THREADS */
+# else
+ old_segv_handler = signal(SIGSEGV, GC_fault_handler);
+# ifdef SIGBUS
+ old_bus_handler = signal(SIGBUS, GC_fault_handler);
+# endif
+# endif
+# endif /* ECOS */
+ }
+
+ void GC_reset_fault_handler()
+ {
+# ifndef ECOS
+# if defined(SUNOS5SIGS) || defined(IRIX5)
+ (void) sigaction(SIGSEGV, &old_segv_act, 0);
+# ifdef _sigargs /* Irix 5.x, not 6.x */
+ (void) sigaction(SIGBUS, &old_bus_act, 0);
+# endif
+# else
+ (void) signal(SIGSEGV, old_segv_handler);
+# ifdef SIGBUS
+ (void) signal(SIGBUS, old_bus_handler);
+# endif
+# endif
+# endif /* ECOS */
+ }
+
+ /* Return the first nonaddressible location > p (up) or */
+ /* the smallest location q s.t. [q,p] is addressible (!up). */
+ ptr_t GC_find_limit(p, up)
+ ptr_t p;
+ GC_bool up;
+ {
+# ifndef ECOS
+ static VOLATILE ptr_t result;
+ /* Needs to be static, since otherwise it may not be */
+ /* preserved across the longjmp. Can safely be */
+ /* static since it's only called once, with the */
+ /* allocation lock held. */
+
+
+ GC_setup_temporary_fault_handler();
+ if (setjmp(GC_jmp_buf) == 0) {
+ result = (ptr_t)(((word)(p))
+ & ~(MIN_PAGE_SIZE-1));
+ for (;;) {
+ if (up) {
+ result += MIN_PAGE_SIZE;
+ } else {
+ result -= MIN_PAGE_SIZE;
+ }
+ GC_noop1((word)(*result));
+ }
+ }
+ GC_reset_fault_handler();
+ if (!up) {
+ result += MIN_PAGE_SIZE;
+ }
+ return(result);
+# else /* ECOS */
+ abort();
+# endif /* ECOS */
+ }
+# endif
+
+
+# ifndef ECOS
+ptr_t GC_get_stack_base()
+{
+ word dummy;
+ ptr_t result;
+
+# define STACKBOTTOM_ALIGNMENT_M1 ((word)STACK_GRAN - 1)
+
+# if defined(STACKBASE)
+ extern ptr_t STACKBASE;
+ return(STACKBASE);
+# else
+# ifdef STACKBOTTOM
+ return(STACKBOTTOM);
+# else
+# ifdef HEURISTIC1
+# ifdef STACK_GROWS_DOWN
+ result = (ptr_t)((((word)(&dummy))
+ + STACKBOTTOM_ALIGNMENT_M1)
+ & ~STACKBOTTOM_ALIGNMENT_M1);
+# else
+ result = (ptr_t)(((word)(&dummy))
+ & ~STACKBOTTOM_ALIGNMENT_M1);
+# endif
+# endif /* HEURISTIC1 */
+# ifdef HEURISTIC2
+# ifdef STACK_GROWS_DOWN
+ result = GC_find_limit((ptr_t)(&dummy), TRUE);
+# ifdef HEURISTIC2_LIMIT
+ if (result > HEURISTIC2_LIMIT
+ && (ptr_t)(&dummy) < HEURISTIC2_LIMIT) {
+ result = HEURISTIC2_LIMIT;
+ }
+# endif
+# else
+ result = GC_find_limit((ptr_t)(&dummy), FALSE);
+# ifdef HEURISTIC2_LIMIT
+ if (result < HEURISTIC2_LIMIT
+ && (ptr_t)(&dummy) > HEURISTIC2_LIMIT) {
+ result = HEURISTIC2_LIMIT;
+ }
+# endif
+# endif
+
+# endif /* HEURISTIC2 */
+ return(result);
+# endif /* STACKBOTTOM */
+# endif /* STACKBASE */
+}
+# endif /* ECOS */
+
+# endif /* ! AMIGA */
+# endif /* ! OS2 */
+# endif /* ! MSWIN32 */
+
+/*
+ * Register static data segment(s) as roots.
+ * If more data segments are added later then they need to be registered
+ * add that point (as we do with SunOS dynamic loading),
+ * or GC_mark_roots needs to check for them (as we do with PCR).
+ * Called with allocator lock held.
+ */
+
+# ifdef OS2
+
+void GC_register_data_segments()
+{
+ PTIB ptib;
+ PPIB ppib;
+ HMODULE module_handle;
+# define PBUFSIZ 512
+ UCHAR path[PBUFSIZ];
+ FILE * myexefile;
+ struct exe_hdr hdrdos; /* MSDOS header. */
+ struct e32_exe hdr386; /* Real header for my executable */
+ struct o32_obj seg; /* Currrent segment */
+ int nsegs;
+
+
+ if (DosGetInfoBlocks(&ptib, &ppib) != NO_ERROR) {
+ GC_err_printf0("DosGetInfoBlocks failed\n");
+ ABORT("DosGetInfoBlocks failed\n");
+ }
+ module_handle = ppib -> pib_hmte;
+ if (DosQueryModuleName(module_handle, PBUFSIZ, path) != NO_ERROR) {
+ GC_err_printf0("DosQueryModuleName failed\n");
+ ABORT("DosGetInfoBlocks failed\n");
+ }
+ myexefile = fopen(path, "rb");
+ if (myexefile == 0) {
+ GC_err_puts("Couldn't open executable ");
+ GC_err_puts(path); GC_err_puts("\n");
+ ABORT("Failed to open executable\n");
+ }
+ if (fread((char *)(&hdrdos), 1, sizeof hdrdos, myexefile) < sizeof hdrdos) {
+ GC_err_puts("Couldn't read MSDOS header from ");
+ GC_err_puts(path); GC_err_puts("\n");
+ ABORT("Couldn't read MSDOS header");
+ }
+ if (E_MAGIC(hdrdos) != EMAGIC) {
+ GC_err_puts("Executable has wrong DOS magic number: ");
+ GC_err_puts(path); GC_err_puts("\n");
+ ABORT("Bad DOS magic number");
+ }
+ if (fseek(myexefile, E_LFANEW(hdrdos), SEEK_SET) != 0) {
+ GC_err_puts("Seek to new header failed in ");
+ GC_err_puts(path); GC_err_puts("\n");
+ ABORT("Bad DOS magic number");
+ }
+ if (fread((char *)(&hdr386), 1, sizeof hdr386, myexefile) < sizeof hdr386) {
+ GC_err_puts("Couldn't read MSDOS header from ");
+ GC_err_puts(path); GC_err_puts("\n");
+ ABORT("Couldn't read OS/2 header");
+ }
+ if (E32_MAGIC1(hdr386) != E32MAGIC1 || E32_MAGIC2(hdr386) != E32MAGIC2) {
+ GC_err_puts("Executable has wrong OS/2 magic number:");
+ GC_err_puts(path); GC_err_puts("\n");
+ ABORT("Bad OS/2 magic number");
+ }
+ if ( E32_BORDER(hdr386) != E32LEBO || E32_WORDER(hdr386) != E32LEWO) {
+ GC_err_puts("Executable %s has wrong byte order: ");
+ GC_err_puts(path); GC_err_puts("\n");
+ ABORT("Bad byte order");
+ }
+ if ( E32_CPU(hdr386) == E32CPU286) {
+ GC_err_puts("GC can't handle 80286 executables: ");
+ GC_err_puts(path); GC_err_puts("\n");
+ EXIT();
+ }
+ if (fseek(myexefile, E_LFANEW(hdrdos) + E32_OBJTAB(hdr386),
+ SEEK_SET) != 0) {
+ GC_err_puts("Seek to object table failed: ");
+ GC_err_puts(path); GC_err_puts("\n");
+ ABORT("Seek to object table failed");
+ }
+ for (nsegs = E32_OBJCNT(hdr386); nsegs > 0; nsegs--) {
+ int flags;
+ if (fread((char *)(&seg), 1, sizeof seg, myexefile) < sizeof seg) {
+ GC_err_puts("Couldn't read obj table entry from ");
+ GC_err_puts(path); GC_err_puts("\n");
+ ABORT("Couldn't read obj table entry");
+ }
+ flags = O32_FLAGS(seg);
+ if (!(flags & OBJWRITE)) continue;
+ if (!(flags & OBJREAD)) continue;
+ if (flags & OBJINVALID) {
+ GC_err_printf0("Object with invalid pages?\n");
+ continue;
+ }
+ GC_add_roots_inner(O32_BASE(seg), O32_BASE(seg)+O32_SIZE(seg), FALSE);
+ }
+}
+
+# else
+
+# ifdef MSWIN32
+ /* Unfortunately, we have to handle win32s very differently from NT, */
+ /* Since VirtualQuery has very different semantics. In particular, */
+ /* under win32s a VirtualQuery call on an unmapped page returns an */
+ /* invalid result. Under GC_register_data_segments is a noop and */
+ /* all real work is done by GC_register_dynamic_libraries. Under */
+ /* win32s, we cannot find the data segments associated with dll's. */
+ /* We rgister the main data segment here. */
+ GC_bool GC_win32s = FALSE; /* We're running under win32s. */
+
+ GC_bool GC_is_win32s()
+ {
+ DWORD v = GetVersion();
+
+ /* Check that this is not NT, and Windows major version <= 3 */
+ return ((v & 0x80000000) && (v & 0xff) <= 3);
+ }
+
+ void GC_init_win32()
+ {
+ GC_win32s = GC_is_win32s();
+ }
+
+ /* Return the smallest address a such that VirtualQuery */
+ /* returns correct results for all addresses between a and start. */
+ /* Assumes VirtualQuery returns correct information for start. */
+ ptr_t GC_least_described_address(ptr_t start)
+ {
+ MEMORY_BASIC_INFORMATION buf;
+ SYSTEM_INFO sysinfo;
+ DWORD result;
+ LPVOID limit;
+ ptr_t p;
+ LPVOID q;
+
+ GetSystemInfo(&sysinfo);
+ limit = sysinfo.lpMinimumApplicationAddress;
+ p = (ptr_t)((word)start & ~(GC_page_size - 1));
+ for (;;) {
+ q = (LPVOID)(p - GC_page_size);
+ if ((ptr_t)q > (ptr_t)p /* underflow */ || q < limit) break;
+ result = VirtualQuery(q, &buf, sizeof(buf));
+ if (result != sizeof(buf) || buf.AllocationBase == 0) break;
+ p = (ptr_t)(buf.AllocationBase);
+ }
+ return(p);
+ }
+
+ /* Is p the start of either the malloc heap, or of one of our */
+ /* heap sections? */
+ GC_bool GC_is_heap_base (ptr_t p)
+ {
+
+ register unsigned i;
+
+# ifndef REDIRECT_MALLOC
+ static ptr_t malloc_heap_pointer = 0;
+
+ if (0 == malloc_heap_pointer) {
+ MEMORY_BASIC_INFORMATION buf;
+ register DWORD result = VirtualQuery(malloc(1), &buf, sizeof(buf));
+
+ if (result != sizeof(buf)) {
+ ABORT("Weird VirtualQuery result");
+ }
+ malloc_heap_pointer = (ptr_t)(buf.AllocationBase);
+ }
+ if (p == malloc_heap_pointer) return(TRUE);
+# endif
+ for (i = 0; i < GC_n_heap_bases; i++) {
+ if (GC_heap_bases[i] == p) return(TRUE);
+ }
+ return(FALSE);
+ }
+
+ void GC_register_root_section(ptr_t static_root)
+ {
+ MEMORY_BASIC_INFORMATION buf;
+ SYSTEM_INFO sysinfo;
+ DWORD result;
+ DWORD protect;
+ LPVOID p;
+ char * base;
+ char * limit, * new_limit;
+
+ if (!GC_win32s) return;
+ p = base = limit = GC_least_described_address(static_root);
+ GetSystemInfo(&sysinfo);
+ while (p < sysinfo.lpMaximumApplicationAddress) {
+ result = VirtualQuery(p, &buf, sizeof(buf));
+ if (result != sizeof(buf) || buf.AllocationBase == 0
+ || GC_is_heap_base(buf.AllocationBase)) break;
+ new_limit = (char *)p + buf.RegionSize;
+ protect = buf.Protect;
+ if (buf.State == MEM_COMMIT
+ && is_writable(protect)) {
+ if ((char *)p == limit) {
+ limit = new_limit;
+ } else {
+ if (base != limit) GC_add_roots_inner(base, limit, FALSE);
+ base = p;
+ limit = new_limit;
+ }
+ }
+ if (p > (LPVOID)new_limit /* overflow */) break;
+ p = (LPVOID)new_limit;
+ }
+ if (base != limit) GC_add_roots_inner(base, limit, FALSE);
+ }
+
+ void GC_register_data_segments()
+ {
+ static char dummy;
+
+ GC_register_root_section((ptr_t)(&dummy));
+ }
+# else
+# ifdef AMIGA
+
+ void GC_register_data_segments()
+ {
+ extern struct WBStartup *_WBenchMsg;
+ struct Process *proc;
+ struct CommandLineInterface *cli;
+ BPTR myseglist;
+ ULONG *data;
+
+ if ( _WBenchMsg != 0 ) {
+ if ((myseglist = _WBenchMsg->sm_Segment) == 0) {
+ GC_err_puts("No seglist from workbench\n");
+ return;
+ }
+ } else {
+ if ((proc = (struct Process *)FindTask(0)) == 0) {
+ GC_err_puts("Cannot find process structure\n");
+ return;
+ }
+ if ((cli = BADDR(proc->pr_CLI)) == 0) {
+ GC_err_puts("No CLI\n");
+ return;
+ }
+ if ((myseglist = cli->cli_Module) == 0) {
+ GC_err_puts("No seglist from CLI\n");
+ return;
+ }
+ }
+
+ for (data = (ULONG *)BADDR(myseglist); data != 0;
+ data = (ULONG *)BADDR(data[0])) {
+# ifdef AMIGA_SKIP_SEG
+ if (((ULONG) GC_register_data_segments < (ULONG) &data[1]) ||
+ ((ULONG) GC_register_data_segments > (ULONG) &data[1] + data[-1])) {
+# else
+ {
+# endif /* AMIGA_SKIP_SEG */
+ GC_add_roots_inner((char *)&data[1],
+ ((char *)&data[1]) + data[-1], FALSE);
+ }
+ }
+ }
+
+
+# else
+
+# if (defined(SVR4) || defined(AUX) || defined(DGUX)) && !defined(PCR)
+char * GC_SysVGetDataStart(max_page_size, etext_addr)
+int max_page_size;
+int * etext_addr;
+{
+ word text_end = ((word)(etext_addr) + sizeof(word) - 1)
+ & ~(sizeof(word) - 1);
+ /* etext rounded to word boundary */
+ word next_page = ((text_end + (word)max_page_size - 1)
+ & ~((word)max_page_size - 1));
+ word page_offset = (text_end & ((word)max_page_size - 1));
+ VOLATILE char * result = (char *)(next_page + page_offset);
+ /* Note that this isnt equivalent to just adding */
+ /* max_page_size to &etext if &etext is at a page boundary */
+
+ GC_setup_temporary_fault_handler();
+ if (setjmp(GC_jmp_buf) == 0) {
+ /* Try writing to the address. */
+ *result = *result;
+ GC_reset_fault_handler();
+ } else {
+ GC_reset_fault_handler();
+ /* We got here via a longjmp. The address is not readable. */
+ /* This is known to happen under Solaris 2.4 + gcc, which place */
+ /* string constants in the text segment, but after etext. */
+ /* Use plan B. Note that we now know there is a gap between */
+ /* text and data segments, so plan A bought us something. */
+ result = (char *)GC_find_limit((ptr_t)(DATAEND) - MIN_PAGE_SIZE, FALSE);
+ }
+ return((char *)result);
+}
+# endif
+
+
+void GC_register_data_segments()
+{
+# if !defined(PCR) && !defined(SRC_M3) && !defined(NEXT) && !defined(MACOS)
+# if defined(REDIRECT_MALLOC) && defined(SOLARIS_THREADS)
+ /* As of Solaris 2.3, the Solaris threads implementation */
+ /* allocates the data structure for the initial thread with */
+ /* sbrk at process startup. It needs to be scanned, so that */
+ /* we don't lose some malloc allocated data structures */
+ /* hanging from it. We're on thin ice here ... */
+ extern caddr_t sbrk();
+
+ GC_add_roots_inner(DATASTART, (char *)sbrk(0), FALSE);
+# else
+ GC_add_roots_inner(DATASTART, (char *)(DATAEND), FALSE);
+# endif
+# endif
+# if !defined(PCR) && defined(NEXT)
+ GC_add_roots_inner(DATASTART, (char *) get_end(), FALSE);
+# endif
+# if defined(MACOS)
+ {
+# if defined(THINK_C)
+ extern void* GC_MacGetDataStart(void);
+ /* globals begin above stack and end at a5. */
+ GC_add_roots_inner((ptr_t)GC_MacGetDataStart(),
+ (ptr_t)LMGetCurrentA5(), FALSE);
+# else
+# if defined(__MWERKS__)
+# if !__POWERPC__
+ extern void* GC_MacGetDataStart(void);
+ /* globals begin above stack and end at a5. */
+ GC_add_roots_inner((ptr_t)GC_MacGetDataStart(),
+ (ptr_t)LMGetCurrentA5(), FALSE);
+# else
+ extern char __data_start__[], __data_end__[];
+ GC_add_roots_inner((ptr_t)&__data_start__,
+ (ptr_t)&__data_end__, FALSE);
+# endif /* __POWERPC__ */
+# endif /* __MWERKS__ */
+# endif /* !THINK_C */
+ }
+# endif /* MACOS */
+
+ /* Dynamic libraries are added at every collection, since they may */
+ /* change. */
+}
+
+# endif /* ! AMIGA */
+# endif /* ! MSWIN32 */
+# endif /* ! OS2 */
+
+/*
+ * Auxiliary routines for obtaining memory from OS.
+ */
+
+# if !defined(OS2) && !defined(PCR) && !defined(AMIGA) \
+ && !defined(MSWIN32) && !defined(MACOS) && !defined(DOS4GW)
+
+# ifdef SUNOS4
+ extern caddr_t sbrk();
+# endif
+# ifdef __STDC__
+# define SBRK_ARG_T ptrdiff_t
+# else
+# define SBRK_ARG_T int
+# endif
+
+# ifdef RS6000
+/* The compiler seems to generate speculative reads one past the end of */
+/* an allocated object. Hence we need to make sure that the page */
+/* following the last heap page is also mapped. */
+ptr_t GC_unix_get_mem(bytes)
+word bytes;
+{
+ caddr_t cur_brk = (caddr_t)sbrk(0);
+ caddr_t result;
+ SBRK_ARG_T lsbs = (word)cur_brk & (GC_page_size-1);
+ static caddr_t my_brk_val = 0;
+
+ if ((SBRK_ARG_T)bytes < 0) return(0); /* too big */
+ if (lsbs != 0) {
+ if((caddr_t)(sbrk(GC_page_size - lsbs)) == (caddr_t)(-1)) return(0);
+ }
+ if (cur_brk == my_brk_val) {
+ /* Use the extra block we allocated last time. */
+ result = (ptr_t)sbrk((SBRK_ARG_T)bytes);
+ if (result == (caddr_t)(-1)) return(0);
+ result -= GC_page_size;
+ } else {
+ result = (ptr_t)sbrk(GC_page_size + (SBRK_ARG_T)bytes);
+ if (result == (caddr_t)(-1)) return(0);
+ }
+ my_brk_val = result + bytes + GC_page_size; /* Always page aligned */
+ return((ptr_t)result);
+}
+
+#else /* Not RS6000 */
+
+#if defined(USE_MMAP)
+/* Tested only under IRIX5 */
+
+ptr_t GC_unix_get_mem(bytes)
+word bytes;
+{
+ static GC_bool initialized = FALSE;
+ static int fd;
+ void *result;
+ static ptr_t last_addr = HEAP_START;
+
+ if (!initialized) {
+ fd = open("/dev/zero", O_RDONLY);
+ initialized = TRUE;
+ }
+ if (bytes & (GC_page_size -1)) ABORT("Bad GET_MEM arg");
+ result = mmap(last_addr, bytes, PROT_READ | PROT_WRITE | OPT_PROT_EXEC,
+ MAP_PRIVATE | MAP_FIXED, fd, 0/* offset */);
+ if (result == MAP_FAILED) return(0);
+ last_addr = (ptr_t)result + bytes + GC_page_size - 1;
+ last_addr = (ptr_t)((word)last_addr & ~(GC_page_size - 1));
+ return((ptr_t)result);
+}
+
+#else /* Not RS6000, not USE_MMAP */
+ptr_t GC_unix_get_mem(bytes)
+word bytes;
+{
+ ptr_t result;
+# ifdef IRIX5
+ /* Bare sbrk isn't thread safe. Play by malloc rules. */
+ /* The equivalent may be needed on other systems as well. */
+ __LOCK_MALLOC();
+# endif
+ {
+ ptr_t cur_brk = (ptr_t)sbrk(0);
+ SBRK_ARG_T lsbs = (word)cur_brk & (GC_page_size-1);
+
+ if ((SBRK_ARG_T)bytes < 0) return(0); /* too big */
+ if (lsbs != 0) {
+ if((ptr_t)sbrk(GC_page_size - lsbs) == (ptr_t)(-1)) return(0);
+ }
+ result = (ptr_t)sbrk((SBRK_ARG_T)bytes);
+ if (result == (ptr_t)(-1)) result = 0;
+ }
+# ifdef IRIX5
+ __UNLOCK_MALLOC();
+# endif
+ return(result);
+}
+
+#endif /* Not USE_MMAP */
+#endif /* Not RS6000 */
+
+# endif /* UN*X */
+
+# ifdef OS2
+
+void * os2_alloc(size_t bytes)
+{
+ void * result;
+
+ if (DosAllocMem(&result, bytes, PAG_EXECUTE | PAG_READ |
+ PAG_WRITE | PAG_COMMIT)
+ != NO_ERROR) {
+ return(0);
+ }
+ if (result == 0) return(os2_alloc(bytes));
+ return(result);
+}
+
+# endif /* OS2 */
+
+
+# ifdef MSWIN32
+word GC_n_heap_bases = 0;
+
+ptr_t GC_win32_get_mem(bytes)
+word bytes;
+{
+ ptr_t result;
+
+ if (GC_win32s) {
+ /* VirtualAlloc doesn't like PAGE_EXECUTE_READWRITE. */
+ /* There are also unconfirmed rumors of other */
+ /* problems, so we dodge the issue. */
+ result = (ptr_t) GlobalAlloc(0, bytes + HBLKSIZE);
+ result = (ptr_t)(((word)result + HBLKSIZE) & ~(HBLKSIZE-1));
+ } else {
+ result = (ptr_t) VirtualAlloc(NULL, bytes,
+ MEM_COMMIT | MEM_RESERVE,
+ PAGE_EXECUTE_READWRITE);
+ }
+ if (HBLKDISPL(result) != 0) ABORT("Bad VirtualAlloc result");
+ /* If I read the documentation correctly, this can */
+ /* only happen if HBLKSIZE > 64k or not a power of 2. */
+ if (GC_n_heap_bases >= MAX_HEAP_SECTS) ABORT("Too many heap sections");
+ GC_heap_bases[GC_n_heap_bases++] = result;
+ return(result);
+}
+
+# endif
+
+/* Routine for pushing any additional roots. In THREADS */
+/* environment, this is also responsible for marking from */
+/* thread stacks. In the SRC_M3 case, it also handles */
+/* global variables. */
+#ifndef THREADS
+void (*GC_push_other_roots)() = 0;
+#else /* THREADS */
+
+# ifdef PCR
+PCR_ERes GC_push_thread_stack(PCR_Th_T *t, PCR_Any dummy)
+{
+ struct PCR_ThCtl_TInfoRep info;
+ PCR_ERes result;
+
+ info.ti_stkLow = info.ti_stkHi = 0;
+ result = PCR_ThCtl_GetInfo(t, &info);
+ GC_push_all_stack((ptr_t)(info.ti_stkLow), (ptr_t)(info.ti_stkHi));
+ return(result);
+}
+
+/* Push the contents of an old object. We treat this as stack */
+/* data only becasue that makes it robust against mark stack */
+/* overflow. */
+PCR_ERes GC_push_old_obj(void *p, size_t size, PCR_Any data)
+{
+ GC_push_all_stack((ptr_t)p, (ptr_t)p + size);
+ return(PCR_ERes_okay);
+}
+
+
+void GC_default_push_other_roots()
+{
+ /* Traverse data allocated by previous memory managers. */
+ {
+ extern struct PCR_MM_ProcsRep * GC_old_allocator;
+
+ if ((*(GC_old_allocator->mmp_enumerate))(PCR_Bool_false,
+ GC_push_old_obj, 0)
+ != PCR_ERes_okay) {
+ ABORT("Old object enumeration failed");
+ }
+ }
+ /* Traverse all thread stacks. */
+ if (PCR_ERes_IsErr(
+ PCR_ThCtl_ApplyToAllOtherThreads(GC_push_thread_stack,0))
+ || PCR_ERes_IsErr(GC_push_thread_stack(PCR_Th_CurrThread(), 0))) {
+ ABORT("Thread stack marking failed\n");
+ }
+}
+
+# endif /* PCR */
+
+# ifdef SRC_M3
+
+# ifdef ALL_INTERIOR_POINTERS
+ --> misconfigured
+# endif
+
+
+extern void ThreadF__ProcessStacks();
+
+void GC_push_thread_stack(start, stop)
+word start, stop;
+{
+ GC_push_all_stack((ptr_t)start, (ptr_t)stop + sizeof(word));
+}
+
+/* Push routine with M3 specific calling convention. */
+GC_m3_push_root(dummy1, p, dummy2, dummy3)
+word *p;
+ptr_t dummy1, dummy2;
+int dummy3;
+{
+ word q = *p;
+
+ if ((ptr_t)(q) >= GC_least_plausible_heap_addr
+ && (ptr_t)(q) < GC_greatest_plausible_heap_addr) {
+ GC_push_one_checked(q,FALSE);
+ }
+}
+
+/* M3 set equivalent to RTHeap.TracedRefTypes */
+typedef struct { int elts[1]; } RefTypeSet;
+RefTypeSet GC_TracedRefTypes = {{0x1}};
+
+/* From finalize.c */
+extern void GC_push_finalizer_structures();
+
+/* From stubborn.c: */
+# ifdef STUBBORN_ALLOC
+ extern GC_PTR * GC_changing_list_start;
+# endif
+
+
+void GC_default_push_other_roots()
+{
+ /* Use the M3 provided routine for finding static roots. */
+ /* This is a bit dubious, since it presumes no C roots. */
+ /* We handle the collector roots explicitly. */
+ {
+# ifdef STUBBORN_ALLOC
+ GC_push_one(GC_changing_list_start);
+# endif
+ GC_push_finalizer_structures();
+ RTMain__GlobalMapProc(GC_m3_push_root, 0, GC_TracedRefTypes);
+ }
+ if (GC_words_allocd > 0) {
+ ThreadF__ProcessStacks(GC_push_thread_stack);
+ }
+ /* Otherwise this isn't absolutely necessary, and we have */
+ /* startup ordering problems. */
+}
+
+# endif /* SRC_M3 */
+
+# if defined(SOLARIS_THREADS) || defined(WIN32_THREADS) \
+ || defined(IRIX_THREADS) || defined(LINUX_THREADS) \
+ || defined(QUICK_THREADS)
+
+extern void GC_push_all_stacks();
+
+void GC_default_push_other_roots()
+{
+ GC_push_all_stacks();
+}
+
+# endif /* SOLARIS_THREADS || ... */
+
+void (*GC_push_other_roots)() = GC_default_push_other_roots;
+
+#endif
+
+/*
+ * Routines for accessing dirty bits on virtual pages.
+ * We plan to eventaually implement four strategies for doing so:
+ * DEFAULT_VDB: A simple dummy implementation that treats every page
+ * as possibly dirty. This makes incremental collection
+ * useless, but the implementation is still correct.
+ * PCR_VDB: Use PPCRs virtual dirty bit facility.
+ * PROC_VDB: Use the /proc facility for reading dirty bits. Only
+ * works under some SVR4 variants. Even then, it may be
+ * too slow to be entirely satisfactory. Requires reading
+ * dirty bits for entire address space. Implementations tend
+ * to assume that the client is a (slow) debugger.
+ * MPROTECT_VDB:Protect pages and then catch the faults to keep track of
+ * dirtied pages. The implementation (and implementability)
+ * is highly system dependent. This usually fails when system
+ * calls write to a protected page. We prevent the read system
+ * call from doing so. It is the clients responsibility to
+ * make sure that other system calls are similarly protected
+ * or write only to the stack.
+ */
+
+GC_bool GC_dirty_maintained = FALSE;
+
+# ifdef DEFAULT_VDB
+
+/* All of the following assume the allocation lock is held, and */
+/* signals are disabled. */
+
+/* The client asserts that unallocated pages in the heap are never */
+/* written. */
+
+/* Initialize virtual dirty bit implementation. */
+void GC_dirty_init()
+{
+ GC_dirty_maintained = TRUE;
+}
+
+/* Retrieve system dirty bits for heap to a local buffer. */
+/* Restore the systems notion of which pages are dirty. */
+void GC_read_dirty()
+{}
+
+/* Is the HBLKSIZE sized page at h marked dirty in the local buffer? */
+/* If the actual page size is different, this returns TRUE if any */
+/* of the pages overlapping h are dirty. This routine may err on the */
+/* side of labelling pages as dirty (and this implementation does). */
+/*ARGSUSED*/
+GC_bool GC_page_was_dirty(h)
+struct hblk *h;
+{
+ return(TRUE);
+}
+
+/*
+ * The following two routines are typically less crucial. They matter
+ * most with large dynamic libraries, or if we can't accurately identify
+ * stacks, e.g. under Solaris 2.X. Otherwise the following default
+ * versions are adequate.
+ */
+
+/* Could any valid GC heap pointer ever have been written to this page? */
+/*ARGSUSED*/
+GC_bool GC_page_was_ever_dirty(h)
+struct hblk *h;
+{
+ return(TRUE);
+}
+
+/* Reset the n pages starting at h to "was never dirty" status. */
+void GC_is_fresh(h, n)
+struct hblk *h;
+word n;
+{
+}
+
+/* A call hints that h is about to be written. */
+/* May speed up some dirty bit implementations. */
+/*ARGSUSED*/
+void GC_write_hint(h)
+struct hblk *h;
+{
+}
+
+# endif /* DEFAULT_VDB */
+
+
+# ifdef MPROTECT_VDB
+
+/*
+ * See DEFAULT_VDB for interface descriptions.
+ */
+
+/*
+ * This implementation maintains dirty bits itself by catching write
+ * faults and keeping track of them. We assume nobody else catches
+ * SIGBUS or SIGSEGV. We assume no write faults occur in system calls
+ * except as a result of a read system call. This means clients must
+ * either ensure that system calls do not touch the heap, or must
+ * provide their own wrappers analogous to the one for read.
+ * We assume the page size is a multiple of HBLKSIZE.
+ * This implementation is currently SunOS 4.X and IRIX 5.X specific, though we
+ * tried to use portable code where easily possible. It is known
+ * not to work under a number of other systems.
+ */
+
+# ifndef MSWIN32
+
+# include <sys/mman.h>
+# include <signal.h>
+# include <sys/syscall.h>
+
+# define PROTECT(addr, len) \
+ if (mprotect((caddr_t)(addr), (int)(len), \
+ PROT_READ | OPT_PROT_EXEC) < 0) { \
+ ABORT("mprotect failed"); \
+ }
+# define UNPROTECT(addr, len) \
+ if (mprotect((caddr_t)(addr), (int)(len), \
+ PROT_WRITE | PROT_READ | OPT_PROT_EXEC ) < 0) { \
+ ABORT("un-mprotect failed"); \
+ }
+
+# else
+
+# include <signal.h>
+
+ static DWORD protect_junk;
+# define PROTECT(addr, len) \
+ if (!VirtualProtect((addr), (len), PAGE_EXECUTE_READ, \
+ &protect_junk)) { \
+ DWORD last_error = GetLastError(); \
+ GC_printf1("Last error code: %lx\n", last_error); \
+ ABORT("VirtualProtect failed"); \
+ }
+# define UNPROTECT(addr, len) \
+ if (!VirtualProtect((addr), (len), PAGE_EXECUTE_READWRITE, \
+ &protect_junk)) { \
+ ABORT("un-VirtualProtect failed"); \
+ }
+
+# endif
+
+VOLATILE page_hash_table GC_dirty_pages;
+ /* Pages dirtied since last GC_read_dirty. */
+
+#if defined(SUNOS4) || defined(FREEBSD)
+ typedef void (* SIG_PF)();
+#endif
+#if defined(SUNOS5SIGS) || defined(OSF1) || defined(LINUX)
+ typedef void (* SIG_PF)(int);
+#endif
+#if defined(MSWIN32)
+ typedef LPTOP_LEVEL_EXCEPTION_FILTER SIG_PF;
+# undef SIG_DFL
+# define SIG_DFL (LPTOP_LEVEL_EXCEPTION_FILTER) (-1)
+#endif
+
+#if defined(IRIX5) || defined(OSF1)
+ typedef void (* REAL_SIG_PF)(int, int, struct sigcontext *);
+#endif
+#if defined(SUNOS5SIGS)
+ typedef void (* REAL_SIG_PF)(int, struct siginfo *, void *);
+#endif
+#if defined(LINUX)
+# include <linux/version.h>
+# if (LINUX_VERSION_CODE >= 0x20100)
+ typedef void (* REAL_SIG_PF)(int, struct sigcontext);
+# else
+ typedef void (* REAL_SIG_PF)(int, struct sigcontext_struct);
+# endif
+# endif
+
+SIG_PF GC_old_bus_handler;
+SIG_PF GC_old_segv_handler; /* Also old MSWIN32 ACCESS_VIOLATION filter */
+
+/*ARGSUSED*/
+# if defined (SUNOS4) || defined(FREEBSD)
+ void GC_write_fault_handler(sig, code, scp, addr)
+ int sig, code;
+ struct sigcontext *scp;
+ char * addr;
+# ifdef SUNOS4
+# define SIG_OK (sig == SIGSEGV || sig == SIGBUS)
+# define CODE_OK (FC_CODE(code) == FC_PROT \
+ || (FC_CODE(code) == FC_OBJERR \
+ && FC_ERRNO(code) == FC_PROT))
+# endif
+# ifdef FREEBSD
+# define SIG_OK (sig == SIGBUS)
+# define CODE_OK (code == BUS_PAGE_FAULT)
+# endif
+# endif
+# if defined(IRIX5) || defined(OSF1)
+# include <errno.h>
+ void GC_write_fault_handler(int sig, int code, struct sigcontext *scp)
+# define SIG_OK (sig == SIGSEGV)
+# ifdef OSF1
+# define CODE_OK (code == 2 /* experimentally determined */)
+# endif
+# ifdef IRIX5
+# define CODE_OK (code == EACCES)
+# endif
+# endif
+# if defined(LINUX)
+# if (LINUX_VERSION_CODE >= 0x20100)
+ void GC_write_fault_handler(int sig, struct sigcontext sc)
+# else
+ void GC_write_fault_handler(int sig, struct sigcontext_struct sc)
+# endif
+# define SIG_OK (sig == SIGSEGV)
+# define CODE_OK TRUE
+ /* Empirically c.trapno == 14, but is that useful? */
+ /* We assume Intel architecture, so alignment */
+ /* faults are not possible. */
+# endif
+# if defined(SUNOS5SIGS)
+ void GC_write_fault_handler(int sig, struct siginfo *scp, void * context)
+# define SIG_OK (sig == SIGSEGV)
+# define CODE_OK (scp -> si_code == SEGV_ACCERR)
+# endif
+# if defined(MSWIN32)
+ LONG WINAPI GC_write_fault_handler(struct _EXCEPTION_POINTERS *exc_info)
+# define SIG_OK (exc_info -> ExceptionRecord -> ExceptionCode == \
+ EXCEPTION_ACCESS_VIOLATION)
+# define CODE_OK (exc_info -> ExceptionRecord -> ExceptionInformation[0] == 1)
+ /* Write fault */
+# endif
+{
+ register unsigned i;
+# ifdef IRIX5
+ char * addr = (char *) (size_t) (scp -> sc_badvaddr);
+# endif
+# if defined(OSF1) && defined(ALPHA)
+ char * addr = (char *) (scp -> sc_traparg_a0);
+# endif
+# ifdef SUNOS5SIGS
+ char * addr = (char *) (scp -> si_addr);
+# endif
+# ifdef LINUX
+# ifdef I386
+ char * addr = (char *) (sc.cr2);
+# else
+ char * addr = /* As of 1.3.90 there seemed to be no way to do this. */;
+# endif
+# endif
+# if defined(MSWIN32)
+ char * addr = (char *) (exc_info -> ExceptionRecord
+ -> ExceptionInformation[1]);
+# define sig SIGSEGV
+# endif
+
+ if (SIG_OK && CODE_OK) {
+ register struct hblk * h =
+ (struct hblk *)((word)addr & ~(GC_page_size-1));
+ GC_bool in_allocd_block;
+
+# ifdef SUNOS5SIGS
+ /* Address is only within the correct physical page. */
+ in_allocd_block = FALSE;
+ for (i = 0; i < divHBLKSZ(GC_page_size); i++) {
+ if (HDR(h+i) != 0) {
+ in_allocd_block = TRUE;
+ }
+ }
+# else
+ in_allocd_block = (HDR(addr) != 0);
+# endif
+ if (!in_allocd_block) {
+ /* Heap blocks now begin and end on page boundaries */
+ SIG_PF old_handler;
+
+ if (sig == SIGSEGV) {
+ old_handler = GC_old_segv_handler;
+ } else {
+ old_handler = GC_old_bus_handler;
+ }
+ if (old_handler == SIG_DFL) {
+# ifndef MSWIN32
+ ABORT("Unexpected bus error or segmentation fault");
+# else
+ return(EXCEPTION_CONTINUE_SEARCH);
+# endif
+ } else {
+# if defined (SUNOS4) || defined(FREEBSD)
+ (*old_handler) (sig, code, scp, addr);
+ return;
+# endif
+# if defined (SUNOS5SIGS)
+ (*(REAL_SIG_PF)old_handler) (sig, scp, context);
+ return;
+# endif
+# if defined (LINUX)
+ (*(REAL_SIG_PF)old_handler) (sig, sc);
+ return;
+# endif
+# if defined (IRIX5) || defined(OSF1)
+ (*(REAL_SIG_PF)old_handler) (sig, code, scp);
+ return;
+# endif
+# ifdef MSWIN32
+ return((*old_handler)(exc_info));
+# endif
+ }
+ }
+ for (i = 0; i < divHBLKSZ(GC_page_size); i++) {
+ register int index = PHT_HASH(h+i);
+
+ set_pht_entry_from_index(GC_dirty_pages, index);
+ }
+ UNPROTECT(h, GC_page_size);
+# if defined(OSF1) || defined(LINUX)
+ /* These reset the signal handler each time by default. */
+ signal(SIGSEGV, (SIG_PF) GC_write_fault_handler);
+# endif
+ /* The write may not take place before dirty bits are read. */
+ /* But then we'll fault again ... */
+# ifdef MSWIN32
+ return(EXCEPTION_CONTINUE_EXECUTION);
+# else
+ return;
+# endif
+ }
+#ifdef MSWIN32
+ return EXCEPTION_CONTINUE_SEARCH;
+#else
+ ABORT("Unexpected bus error or segmentation fault");
+#endif
+}
+
+/*
+ * We hold the allocation lock. We expect block h to be written
+ * shortly.
+ */
+void GC_write_hint(h)
+struct hblk *h;
+{
+ register struct hblk * h_trunc;
+ register unsigned i;
+ register GC_bool found_clean;
+
+ if (!GC_dirty_maintained) return;
+ h_trunc = (struct hblk *)((word)h & ~(GC_page_size-1));
+ found_clean = FALSE;
+ for (i = 0; i < divHBLKSZ(GC_page_size); i++) {
+ register int index = PHT_HASH(h_trunc+i);
+
+ if (!get_pht_entry_from_index(GC_dirty_pages, index)) {
+ found_clean = TRUE;
+ set_pht_entry_from_index(GC_dirty_pages, index);
+ }
+ }
+ if (found_clean) {
+ UNPROTECT(h_trunc, GC_page_size);
+ }
+}
+
+void GC_dirty_init()
+{
+#if defined(SUNOS5SIGS) || defined(IRIX5)
+ struct sigaction act, oldact;
+# ifdef IRIX5
+ act.sa_flags = SA_RESTART;
+ act.sa_handler = GC_write_fault_handler;
+# else
+ act.sa_flags = SA_RESTART | SA_SIGINFO;
+ act.sa_sigaction = GC_write_fault_handler;
+# endif
+ (void)sigemptyset(&act.sa_mask);
+#endif
+# ifdef PRINTSTATS
+ GC_printf0("Inititalizing mprotect virtual dirty bit implementation\n");
+# endif
+ GC_dirty_maintained = TRUE;
+ if (GC_page_size % HBLKSIZE != 0) {
+ GC_err_printf0("Page size not multiple of HBLKSIZE\n");
+ ABORT("Page size not multiple of HBLKSIZE");
+ }
+# if defined(SUNOS4) || defined(FREEBSD)
+ GC_old_bus_handler = signal(SIGBUS, GC_write_fault_handler);
+ if (GC_old_bus_handler == SIG_IGN) {
+ GC_err_printf0("Previously ignored bus error!?");
+ GC_old_bus_handler = SIG_DFL;
+ }
+ if (GC_old_bus_handler != SIG_DFL) {
+# ifdef PRINTSTATS
+ GC_err_printf0("Replaced other SIGBUS handler\n");
+# endif
+ }
+# endif
+# if defined(OSF1) || defined(SUNOS4) || defined(LINUX)
+ GC_old_segv_handler = signal(SIGSEGV, (SIG_PF)GC_write_fault_handler);
+ if (GC_old_segv_handler == SIG_IGN) {
+ GC_err_printf0("Previously ignored segmentation violation!?");
+ GC_old_segv_handler = SIG_DFL;
+ }
+ if (GC_old_segv_handler != SIG_DFL) {
+# ifdef PRINTSTATS
+ GC_err_printf0("Replaced other SIGSEGV handler\n");
+# endif
+ }
+# endif
+# if defined(SUNOS5SIGS) || defined(IRIX5)
+# ifdef IRIX_THREADS
+ sigaction(SIGSEGV, 0, &oldact);
+ sigaction(SIGSEGV, &act, 0);
+# else
+ sigaction(SIGSEGV, &act, &oldact);
+# endif
+# if defined(_sigargs)
+ /* This is Irix 5.x, not 6.x. Irix 5.x does not have */
+ /* sa_sigaction. */
+ GC_old_segv_handler = oldact.sa_handler;
+# else /* Irix 6.x or SUNOS5SIGS */
+ if (oldact.sa_flags & SA_SIGINFO) {
+ GC_old_segv_handler = (SIG_PF)(oldact.sa_sigaction);
+ } else {
+ GC_old_segv_handler = oldact.sa_handler;
+ }
+# endif
+ if (GC_old_segv_handler == SIG_IGN) {
+ GC_err_printf0("Previously ignored segmentation violation!?");
+ GC_old_segv_handler = SIG_DFL;
+ }
+ if (GC_old_segv_handler != SIG_DFL) {
+# ifdef PRINTSTATS
+ GC_err_printf0("Replaced other SIGSEGV handler\n");
+# endif
+ }
+# endif
+# if defined(MSWIN32)
+ GC_old_segv_handler = SetUnhandledExceptionFilter(GC_write_fault_handler);
+ if (GC_old_segv_handler != NULL) {
+# ifdef PRINTSTATS
+ GC_err_printf0("Replaced other UnhandledExceptionFilter\n");
+# endif
+ } else {
+ GC_old_segv_handler = SIG_DFL;
+ }
+# endif
+}
+
+
+
+void GC_protect_heap()
+{
+ ptr_t start;
+ word len;
+ unsigned i;
+
+ for (i = 0; i < GC_n_heap_sects; i++) {
+ start = GC_heap_sects[i].hs_start;
+ len = GC_heap_sects[i].hs_bytes;
+ PROTECT(start, len);
+ }
+}
+
+/* We assume that either the world is stopped or its OK to lose dirty */
+/* bits while this is happenning (as in GC_enable_incremental). */
+void GC_read_dirty()
+{
+ BCOPY((word *)GC_dirty_pages, GC_grungy_pages,
+ (sizeof GC_dirty_pages));
+ BZERO((word *)GC_dirty_pages, (sizeof GC_dirty_pages));
+ GC_protect_heap();
+}
+
+GC_bool GC_page_was_dirty(h)
+struct hblk * h;
+{
+ register word index = PHT_HASH(h);
+
+ return(HDR(h) == 0 || get_pht_entry_from_index(GC_grungy_pages, index));
+}
+
+/*
+ * Acquiring the allocation lock here is dangerous, since this
+ * can be called from within GC_call_with_alloc_lock, and the cord
+ * package does so. On systems that allow nested lock acquisition, this
+ * happens to work.
+ * On other systems, SET_LOCK_HOLDER and friends must be suitably defined.
+ */
+
+void GC_begin_syscall()
+{
+ if (!I_HOLD_LOCK()) LOCK();
+}
+
+void GC_end_syscall()
+{
+ if (!I_HOLD_LOCK()) UNLOCK();
+}
+
+void GC_unprotect_range(addr, len)
+ptr_t addr;
+word len;
+{
+ struct hblk * start_block;
+ struct hblk * end_block;
+ register struct hblk *h;
+ ptr_t obj_start;
+
+ if (!GC_incremental) return;
+ obj_start = GC_base(addr);
+ if (obj_start == 0) return;
+ if (GC_base(addr + len - 1) != obj_start) {
+ ABORT("GC_unprotect_range(range bigger than object)");
+ }
+ start_block = (struct hblk *)((word)addr & ~(GC_page_size - 1));
+ end_block = (struct hblk *)((word)(addr + len - 1) & ~(GC_page_size - 1));
+ end_block += GC_page_size/HBLKSIZE - 1;
+ for (h = start_block; h <= end_block; h++) {
+ register word index = PHT_HASH(h);
+
+ set_pht_entry_from_index(GC_dirty_pages, index);
+ }
+ UNPROTECT(start_block,
+ ((ptr_t)end_block - (ptr_t)start_block) + HBLKSIZE);
+}
+
+#ifndef MSWIN32
+/* Replacement for UNIX system call. */
+/* Other calls that write to the heap */
+/* should be handled similarly. */
+# if defined(__STDC__) && !defined(SUNOS4)
+# include <unistd.h>
+ ssize_t read(int fd, void *buf, size_t nbyte)
+# else
+# ifndef LINT
+ int read(fd, buf, nbyte)
+# else
+ int GC_read(fd, buf, nbyte)
+# endif
+ int fd;
+ char *buf;
+ int nbyte;
+# endif
+{
+ int result;
+
+ GC_begin_syscall();
+ GC_unprotect_range(buf, (word)nbyte);
+# ifdef IRIX5
+ /* Indirect system call may not always be easily available. */
+ /* We could call _read, but that would interfere with the */
+ /* libpthread interception of read. */
+ {
+ struct iovec iov;
+
+ iov.iov_base = buf;
+ iov.iov_len = nbyte;
+ result = readv(fd, &iov, 1);
+ }
+# else
+ result = syscall(SYS_read, fd, buf, nbyte);
+# endif
+ GC_end_syscall();
+ return(result);
+}
+#endif /* !MSWIN32 */
+
+/*ARGSUSED*/
+GC_bool GC_page_was_ever_dirty(h)
+struct hblk *h;
+{
+ return(TRUE);
+}
+
+/* Reset the n pages starting at h to "was never dirty" status. */
+/*ARGSUSED*/
+void GC_is_fresh(h, n)
+struct hblk *h;
+word n;
+{
+}
+
+# endif /* MPROTECT_VDB */
+
+# ifdef PROC_VDB
+
+/*
+ * See DEFAULT_VDB for interface descriptions.
+ */
+
+/*
+ * This implementaion assumes a Solaris 2.X like /proc pseudo-file-system
+ * from which we can read page modified bits. This facility is far from
+ * optimal (e.g. we would like to get the info for only some of the
+ * address space), but it avoids intercepting system calls.
+ */
+
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/signal.h>
+#include <sys/fault.h>
+#include <sys/syscall.h>
+#include <sys/procfs.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#define INITIAL_BUF_SZ 4096
+word GC_proc_buf_size = INITIAL_BUF_SZ;
+char *GC_proc_buf;
+
+page_hash_table GC_written_pages = { 0 }; /* Pages ever dirtied */
+
+#ifdef SOLARIS_THREADS
+/* We don't have exact sp values for threads. So we count on */
+/* occasionally declaring stack pages to be fresh. Thus we */
+/* need a real implementation of GC_is_fresh. We can't clear */
+/* entries in GC_written_pages, since that would declare all */
+/* pages with the given hash address to be fresh. */
+# define MAX_FRESH_PAGES 8*1024 /* Must be power of 2 */
+ struct hblk ** GC_fresh_pages; /* A direct mapped cache. */
+ /* Collisions are dropped. */
+
+# define FRESH_PAGE_SLOT(h) (divHBLKSZ((word)(h)) & (MAX_FRESH_PAGES-1))
+# define ADD_FRESH_PAGE(h) \
+ GC_fresh_pages[FRESH_PAGE_SLOT(h)] = (h)
+# define PAGE_IS_FRESH(h) \
+ (GC_fresh_pages[FRESH_PAGE_SLOT(h)] == (h) && (h) != 0)
+#endif
+
+/* Add all pages in pht2 to pht1 */
+void GC_or_pages(pht1, pht2)
+page_hash_table pht1, pht2;
+{
+ register int i;
+
+ for (i = 0; i < PHT_SIZE; i++) pht1[i] |= pht2[i];
+}
+
+int GC_proc_fd;
+
+void GC_dirty_init()
+{
+ int fd;
+ char buf[30];
+
+ GC_dirty_maintained = TRUE;
+ if (GC_words_allocd != 0 || GC_words_allocd_before_gc != 0) {
+ register int i;
+
+ for (i = 0; i < PHT_SIZE; i++) GC_written_pages[i] = (word)(-1);
+# ifdef PRINTSTATS
+ GC_printf1("Allocated words:%lu:all pages may have been written\n",
+ (unsigned long)
+ (GC_words_allocd + GC_words_allocd_before_gc));
+# endif
+ }
+ sprintf(buf, "/proc/%d", getpid());
+ fd = open(buf, O_RDONLY);
+ if (fd < 0) {
+ ABORT("/proc open failed");
+ }
+ GC_proc_fd = syscall(SYS_ioctl, fd, PIOCOPENPD, 0);
+ close(fd);
+ if (GC_proc_fd < 0) {
+ ABORT("/proc ioctl failed");
+ }
+ GC_proc_buf = GC_scratch_alloc(GC_proc_buf_size);
+# ifdef SOLARIS_THREADS
+ GC_fresh_pages = (struct hblk **)
+ GC_scratch_alloc(MAX_FRESH_PAGES * sizeof (struct hblk *));
+ if (GC_fresh_pages == 0) {
+ GC_err_printf0("No space for fresh pages\n");
+ EXIT();
+ }
+ BZERO(GC_fresh_pages, MAX_FRESH_PAGES * sizeof (struct hblk *));
+# endif
+}
+
+/* Ignore write hints. They don't help us here. */
+/*ARGSUSED*/
+void GC_write_hint(h)
+struct hblk *h;
+{
+}
+
+#ifdef SOLARIS_THREADS
+# define READ(fd,buf,nbytes) syscall(SYS_read, fd, buf, nbytes)
+#else
+# define READ(fd,buf,nbytes) read(fd, buf, nbytes)
+#endif
+
+void GC_read_dirty()
+{
+ unsigned long ps, np;
+ int nmaps;
+ ptr_t vaddr;
+ struct prasmap * map;
+ char * bufp;
+ ptr_t current_addr, limit;
+ int i;
+int dummy;
+
+ BZERO(GC_grungy_pages, (sizeof GC_grungy_pages));
+
+ bufp = GC_proc_buf;
+ if (READ(GC_proc_fd, bufp, GC_proc_buf_size) <= 0) {
+# ifdef PRINTSTATS
+ GC_printf1("/proc read failed: GC_proc_buf_size = %lu\n",
+ GC_proc_buf_size);
+# endif
+ {
+ /* Retry with larger buffer. */
+ word new_size = 2 * GC_proc_buf_size;
+ char * new_buf = GC_scratch_alloc(new_size);
+
+ if (new_buf != 0) {
+ GC_proc_buf = bufp = new_buf;
+ GC_proc_buf_size = new_size;
+ }
+ if (syscall(SYS_read, GC_proc_fd, bufp, GC_proc_buf_size) <= 0) {
+ WARN("Insufficient space for /proc read\n", 0);
+ /* Punt: */
+ memset(GC_grungy_pages, 0xff, sizeof (page_hash_table));
+ memset(GC_written_pages, 0xff, sizeof(page_hash_table));
+# ifdef SOLARIS_THREADS
+ BZERO(GC_fresh_pages,
+ MAX_FRESH_PAGES * sizeof (struct hblk *));
+# endif
+ return;
+ }
+ }
+ }
+ /* Copy dirty bits into GC_grungy_pages */
+ nmaps = ((struct prpageheader *)bufp) -> pr_nmap;
+ /* printf( "nmaps = %d, PG_REFERENCED = %d, PG_MODIFIED = %d\n",
+ nmaps, PG_REFERENCED, PG_MODIFIED); */
+ bufp = bufp + sizeof(struct prpageheader);
+ for (i = 0; i < nmaps; i++) {
+ map = (struct prasmap *)bufp;
+ vaddr = (ptr_t)(map -> pr_vaddr);
+ ps = map -> pr_pagesize;
+ np = map -> pr_npage;
+ /* printf("vaddr = 0x%X, ps = 0x%X, np = 0x%X\n", vaddr, ps, np); */
+ limit = vaddr + ps * np;
+ bufp += sizeof (struct prasmap);
+ for (current_addr = vaddr;
+ current_addr < limit; current_addr += ps){
+ if ((*bufp++) & PG_MODIFIED) {
+ register struct hblk * h = (struct hblk *) current_addr;
+
+ while ((ptr_t)h < current_addr + ps) {
+ register word index = PHT_HASH(h);
+
+ set_pht_entry_from_index(GC_grungy_pages, index);
+# ifdef SOLARIS_THREADS
+ {
+ register int slot = FRESH_PAGE_SLOT(h);
+
+ if (GC_fresh_pages[slot] == h) {
+ GC_fresh_pages[slot] = 0;
+ }
+ }
+# endif
+ h++;
+ }
+ }
+ }
+ bufp += sizeof(long) - 1;
+ bufp = (char *)((unsigned long)bufp & ~(sizeof(long)-1));
+ }
+ /* Update GC_written_pages. */
+ GC_or_pages(GC_written_pages, GC_grungy_pages);
+# ifdef SOLARIS_THREADS
+ /* Make sure that old stacks are considered completely clean */
+ /* unless written again. */
+ GC_old_stacks_are_fresh();
+# endif
+}
+
+#undef READ
+
+GC_bool GC_page_was_dirty(h)
+struct hblk *h;
+{
+ register word index = PHT_HASH(h);
+ register GC_bool result;
+
+ result = get_pht_entry_from_index(GC_grungy_pages, index);
+# ifdef SOLARIS_THREADS
+ if (result && PAGE_IS_FRESH(h)) result = FALSE;
+ /* This happens only if page was declared fresh since */
+ /* the read_dirty call, e.g. because it's in an unused */
+ /* thread stack. It's OK to treat it as clean, in */
+ /* that case. And it's consistent with */
+ /* GC_page_was_ever_dirty. */
+# endif
+ return(result);
+}
+
+GC_bool GC_page_was_ever_dirty(h)
+struct hblk *h;
+{
+ register word index = PHT_HASH(h);
+ register GC_bool result;
+
+ result = get_pht_entry_from_index(GC_written_pages, index);
+# ifdef SOLARIS_THREADS
+ if (result && PAGE_IS_FRESH(h)) result = FALSE;
+# endif
+ return(result);
+}
+
+/* Caller holds allocation lock. */
+void GC_is_fresh(h, n)
+struct hblk *h;
+word n;
+{
+
+ register word index;
+
+# ifdef SOLARIS_THREADS
+ register word i;
+
+ if (GC_fresh_pages != 0) {
+ for (i = 0; i < n; i++) {
+ ADD_FRESH_PAGE(h + i);
+ }
+ }
+# endif
+}
+
+# endif /* PROC_VDB */
+
+
+# ifdef PCR_VDB
+
+# include "vd/PCR_VD.h"
+
+# define NPAGES (32*1024) /* 128 MB */
+
+PCR_VD_DB GC_grungy_bits[NPAGES];
+
+ptr_t GC_vd_base; /* Address corresponding to GC_grungy_bits[0] */
+ /* HBLKSIZE aligned. */
+
+void GC_dirty_init()
+{
+ GC_dirty_maintained = TRUE;
+ /* For the time being, we assume the heap generally grows up */
+ GC_vd_base = GC_heap_sects[0].hs_start;
+ if (GC_vd_base == 0) {
+ ABORT("Bad initial heap segment");
+ }
+ if (PCR_VD_Start(HBLKSIZE, GC_vd_base, NPAGES*HBLKSIZE)
+ != PCR_ERes_okay) {
+ ABORT("dirty bit initialization failed");
+ }
+}
+
+void GC_read_dirty()
+{
+ /* lazily enable dirty bits on newly added heap sects */
+ {
+ static int onhs = 0;
+ int nhs = GC_n_heap_sects;
+ for( ; onhs < nhs; onhs++ ) {
+ PCR_VD_WriteProtectEnable(
+ GC_heap_sects[onhs].hs_start,
+ GC_heap_sects[onhs].hs_bytes );
+ }
+ }
+
+
+ if (PCR_VD_Clear(GC_vd_base, NPAGES*HBLKSIZE, GC_grungy_bits)
+ != PCR_ERes_okay) {
+ ABORT("dirty bit read failed");
+ }
+}
+
+GC_bool GC_page_was_dirty(h)
+struct hblk *h;
+{
+ if((ptr_t)h < GC_vd_base || (ptr_t)h >= GC_vd_base + NPAGES*HBLKSIZE) {
+ return(TRUE);
+ }
+ return(GC_grungy_bits[h - (struct hblk *)GC_vd_base] & PCR_VD_DB_dirtyBit);
+}
+
+/*ARGSUSED*/
+void GC_write_hint(h)
+struct hblk *h;
+{
+ PCR_VD_WriteProtectDisable(h, HBLKSIZE);
+ PCR_VD_WriteProtectEnable(h, HBLKSIZE);
+}
+
+# endif /* PCR_VDB */
+
+/*
+ * Call stack save code for debugging.
+ * Should probably be in mach_dep.c, but that requires reorganization.
+ */
+#if defined(SPARC) && !defined(LINUX)
+# if defined(SUNOS4)
+# include <machine/frame.h>
+# else
+# if defined (DRSNX)
+# include <sys/sparc/frame.h>
+# else
+# include <sys/frame.h>
+# endif
+# endif
+# if NARGS > 6
+ --> We only know how to to get the first 6 arguments
+# endif
+
+#ifdef SAVE_CALL_CHAIN
+/* Fill in the pc and argument information for up to NFRAMES of my */
+/* callers. Ignore my frame and my callers frame. */
+void GC_save_callers (info)
+struct callinfo info[NFRAMES];
+{
+ struct frame *frame;
+ struct frame *fp;
+ int nframes = 0;
+ word GC_save_regs_in_stack();
+
+ frame = (struct frame *) GC_save_regs_in_stack ();
+
+ for (fp = frame -> fr_savfp; fp != 0 && nframes < NFRAMES;
+ fp = fp -> fr_savfp, nframes++) {
+ register int i;
+
+ info[nframes].ci_pc = fp->fr_savpc;
+ for (i = 0; i < NARGS; i++) {
+ info[nframes].ci_arg[i] = ~(fp->fr_arg[i]);
+ }
+ }
+ if (nframes < NFRAMES) info[nframes].ci_pc = 0;
+}
+
+#endif /* SAVE_CALL_CHAIN */
+#endif /* SPARC */
+
+
+
diff --git a/boehm-gc/pc_excludes b/boehm-gc/pc_excludes
new file mode 100644
index 00000000000..52da43110cf
--- /dev/null
+++ b/boehm-gc/pc_excludes
@@ -0,0 +1,15 @@
+solaris_threads.c
+pcr_interface.c
+real_malloc.c
+mips_mach_dep.s
+rs6000_mach_dep.s
+alpha_mach_dep.s
+sparc_mach_dep.s
+PCR-Makefile
+setjmp_t.c
+callprocs
+gc.man
+pc_excludes
+barrett_diagram
+include/gc_c++.h
+include/gc_inline.h \ No newline at end of file
diff --git a/boehm-gc/pcr_interface.c b/boehm-gc/pcr_interface.c
new file mode 100644
index 00000000000..4c950933704
--- /dev/null
+++ b/boehm-gc/pcr_interface.c
@@ -0,0 +1,173 @@
+/*
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+/* Boehm, February 7, 1996 11:09 am PST */
+# include "gc_priv.h"
+
+# ifdef PCR
+/*
+ * Note that POSIX PCR requires an ANSI C compiler. Hence we are allowed
+ * to make the same assumption here.
+ * We wrap all of the allocator functions to avoid questions of
+ * compatibility between the prototyped and nonprototyped versions of the f
+ */
+# include "config/PCR_StdTypes.h"
+# include "mm/PCR_MM.h"
+# include <errno.h>
+
+# define MY_MAGIC 17L
+# define MY_DEBUGMAGIC 42L
+
+void * GC_AllocProc(size_t size, PCR_Bool ptrFree, PCR_Bool clear )
+{
+ if (ptrFree) {
+ void * result = (void *)GC_malloc_atomic(size);
+ if (clear && result != 0) BZERO(result, size);
+ return(result);
+ } else {
+ return((void *)GC_malloc(size));
+ }
+}
+
+void * GC_DebugAllocProc(size_t size, PCR_Bool ptrFree, PCR_Bool clear )
+{
+ if (ptrFree) {
+ void * result = (void *)GC_debug_malloc_atomic(size, __FILE__,
+ __LINE__);
+ if (clear && result != 0) BZERO(result, size);
+ return(result);
+ } else {
+ return((void *)GC_debug_malloc(size, __FILE__, __LINE__));
+ }
+}
+
+# define GC_ReallocProc GC_realloc
+void * GC_DebugReallocProc(void * old_object, size_t new_size_in_bytes)
+{
+ return(GC_debug_realloc(old_object, new_size_in_bytes, __FILE__, __LINE__));
+}
+
+# define GC_FreeProc GC_free
+# define GC_DebugFreeProc GC_debug_free
+
+typedef struct {
+ PCR_ERes (*ed_proc)(void *p, size_t size, PCR_Any data);
+ GC_bool ed_pointerfree;
+ PCR_ERes ed_fail_code;
+ PCR_Any ed_client_data;
+} enumerate_data;
+
+void GC_enumerate_block(h, ed)
+register struct hblk *h;
+enumerate_data * ed;
+{
+ register hdr * hhdr;
+ register int sz;
+ word *p;
+ word * lim;
+
+ hhdr = HDR(h);
+ sz = hhdr -> hb_sz;
+ if (sz >= 0 && ed -> ed_pointerfree
+ || sz <= 0 && !(ed -> ed_pointerfree)) return;
+ if (sz < 0) sz = -sz;
+ lim = (word *)(h+1) - sz;
+ p = (word *)h;
+ do {
+ if (PCR_ERes_IsErr(ed -> ed_fail_code)) return;
+ ed -> ed_fail_code =
+ (*(ed -> ed_proc))(p, WORDS_TO_BYTES(sz), ed -> ed_client_data);
+ p+= sz;
+ } while (p <= lim);
+}
+
+struct PCR_MM_ProcsRep * GC_old_allocator = 0;
+
+PCR_ERes GC_EnumerateProc(
+ PCR_Bool ptrFree,
+ PCR_ERes (*proc)(void *p, size_t size, PCR_Any data),
+ PCR_Any data
+)
+{
+ enumerate_data ed;
+
+ ed.ed_proc = proc;
+ ed.ed_pointerfree = ptrFree;
+ ed.ed_fail_code = PCR_ERes_okay;
+ ed.ed_client_data = data;
+ GC_apply_to_all_blocks(GC_enumerate_block, &ed);
+ if (ed.ed_fail_code != PCR_ERes_okay) {
+ return(ed.ed_fail_code);
+ } else {
+ /* Also enumerate objects allocated by my predecessors */
+ return((*(GC_old_allocator->mmp_enumerate))(ptrFree, proc, data));
+ }
+}
+
+void GC_DummyFreeProc(void *p) {}
+
+void GC_DummyShutdownProc(void) {}
+
+struct PCR_MM_ProcsRep GC_Rep = {
+ MY_MAGIC,
+ GC_AllocProc,
+ GC_ReallocProc,
+ GC_DummyFreeProc, /* mmp_free */
+ GC_FreeProc, /* mmp_unsafeFree */
+ GC_EnumerateProc,
+ GC_DummyShutdownProc /* mmp_shutdown */
+};
+
+struct PCR_MM_ProcsRep GC_DebugRep = {
+ MY_DEBUGMAGIC,
+ GC_DebugAllocProc,
+ GC_DebugReallocProc,
+ GC_DummyFreeProc, /* mmp_free */
+ GC_DebugFreeProc, /* mmp_unsafeFree */
+ GC_EnumerateProc,
+ GC_DummyShutdownProc /* mmp_shutdown */
+};
+
+GC_bool GC_use_debug = 0;
+
+void GC_pcr_install()
+{
+ PCR_MM_Install((GC_use_debug? &GC_DebugRep : &GC_Rep), &GC_old_allocator);
+}
+
+PCR_ERes
+PCR_GC_Setup(void)
+{
+ return PCR_ERes_okay;
+}
+
+PCR_ERes
+PCR_GC_Run(void)
+{
+
+ if( !PCR_Base_TestPCRArg("-nogc") ) {
+ GC_quiet = ( PCR_Base_TestPCRArg("-gctrace") ? 0 : 1 );
+ GC_use_debug = (GC_bool)PCR_Base_TestPCRArg("-debug_alloc");
+ GC_init();
+ if( !PCR_Base_TestPCRArg("-nogc_incremental") ) {
+ /*
+ * awful hack to test whether VD is implemented ...
+ */
+ if( PCR_VD_Start( 0, NIL, 0) != PCR_ERes_FromErr(ENOSYS) ) {
+ GC_enable_incremental();
+ }
+ }
+ }
+ return PCR_ERes_okay;
+}
+
+# endif
diff --git a/boehm-gc/ptr_chck.c b/boehm-gc/ptr_chck.c
new file mode 100644
index 00000000000..f3451ee6f8c
--- /dev/null
+++ b/boehm-gc/ptr_chck.c
@@ -0,0 +1,326 @@
+/*
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+/* Boehm, September 19, 1995 1:26 pm PDT */
+
+#include "gc_priv.h"
+#include "gc_mark.h"
+
+#ifdef __STDC__
+void GC_default_same_obj_print_proc(GC_PTR p, GC_PTR q)
+#else
+void GC_default_same_obj_print_proc (p, q)
+GC_PTR p, q;
+#endif
+{
+ GC_err_printf2("0x%lx and 0x%lx are not in the same object\n",
+ (unsigned long)p, (unsigned long)q);
+ ABORT("GC_same_obj test failed");
+}
+
+void (*GC_same_obj_print_proc) GC_PROTO((GC_PTR, GC_PTR))
+ = GC_default_same_obj_print_proc;
+
+/* Check that p and q point to the same object. Call */
+/* *GC_same_obj_print_proc if they don't. */
+/* Returns the first argument. (Return value may be hard */
+/* to use,due to typing issues. But if we had a suitable */
+/* preprocessor ...) */
+/* Succeeds if neither p nor q points to the heap. */
+/* We assume this is performance critical. (It shouldn't */
+/* be called by production code, but this can easily make */
+/* debugging intolerably slow.) */
+#ifdef __STDC__
+ GC_PTR GC_same_obj(register void *p, register void *q)
+#else
+ GC_PTR GC_same_obj(p, q)
+ register char *p, *q;
+#endif
+{
+ register struct hblk *h;
+ register hdr *hhdr;
+ register ptr_t base, limit;
+ register word sz;
+
+ if (!GC_is_initialized) GC_init();
+ hhdr = HDR((word)p);
+ if (hhdr == 0) {
+ if (divHBLKSZ((word)p) != divHBLKSZ((word)q)
+ && HDR((word)q) != 0) {
+ goto fail;
+ }
+ return(p);
+ }
+ /* If it's a pointer to the middle of a large object, move it */
+ /* to the beginning. */
+ if (IS_FORWARDING_ADDR_OR_NIL(hhdr)) {
+ h = HBLKPTR(p) - (word)hhdr;
+ hhdr = HDR(h);
+ while (IS_FORWARDING_ADDR_OR_NIL(hhdr)) {
+ h = FORWARDED_ADDR(h, hhdr);
+ hhdr = HDR(h);
+ }
+ limit = (ptr_t)((word *)h + HDR_WORDS + hhdr -> hb_sz);
+ if ((ptr_t)p >= limit || (ptr_t)q >= limit || (ptr_t)q < (ptr_t)h ) {
+ goto fail;
+ }
+ return(p);
+ }
+ sz = WORDS_TO_BYTES(hhdr -> hb_sz);
+ if (sz > WORDS_TO_BYTES(MAXOBJSZ)) {
+ base = (ptr_t)HBLKPTR(p);
+ limit = base + sz;
+ if ((ptr_t)p >= limit) {
+ goto fail;
+ }
+ } else {
+# ifdef ALL_INTERIOR_POINTERS
+ register map_entry_type map_entry;
+ register int pdispl;
+
+ pdispl = HBLKDISPL(p);
+ map_entry = MAP_ENTRY((hhdr -> hb_map), pdispl);
+ if (map_entry == OBJ_INVALID) {
+ goto fail;
+ } else {
+ base = (char *)((word)p & ~(WORDS_TO_BYTES(1) - 1));
+ base -= WORDS_TO_BYTES(map_entry);
+ }
+# else
+ register int offset = HBLKDISPL(p) - HDR_BYTES;
+ register word correction = offset % sz;
+
+ if (HBLKPTR(p) != HBLKPTR(q)) {
+ /* The following computation otherwise fails in this case */
+ goto fail;
+ }
+ base = (ptr_t)p - correction;
+# endif
+ limit = base + sz;
+ }
+ /* [base, limit) delimits the object containing p, if any. */
+ /* If p is not inside a valid object, then either q is */
+ /* also outside any valid object, or it is outside */
+ /* [base, limit). */
+ if ((ptr_t)q >= limit || (ptr_t)q < base) {
+ goto fail;
+ }
+ return(p);
+fail:
+ (*GC_same_obj_print_proc)((ptr_t)p, (ptr_t)q);
+ return(p);
+}
+
+#ifdef __STDC__
+void GC_default_is_valid_displacement_print_proc (GC_PTR p)
+#else
+void GC_default_is_valid_displacement_print_proc (p)
+GC_PTR p;
+#endif
+{
+ GC_err_printf1("0x%lx does not point to valid object displacement\n",
+ (unsigned long)p);
+ ABORT("GC_is_valid_displacement test failed");
+}
+
+void (*GC_is_valid_displacement_print_proc) GC_PROTO((GC_PTR)) =
+ GC_default_is_valid_displacement_print_proc;
+
+/* Check that if p is a pointer to a heap page, then it points to */
+/* a valid displacement within a heap object. */
+/* Uninteresting with ALL_INTERIOR_POINTERS. */
+/* Always returns its argument. */
+/* Note that we don't lock, since nothing relevant about the header */
+/* should change while we have a valid object pointer to the block. */
+#ifdef __STDC__
+ void * GC_is_valid_displacement(void *p)
+#else
+ char *GC_is_valid_displacement(p)
+ char *p;
+#endif
+{
+ register hdr *hhdr;
+ register word pdispl;
+ register struct hblk *h;
+ register map_entry_type map_entry;
+ register word sz;
+
+ if (!GC_is_initialized) GC_init();
+ hhdr = HDR((word)p);
+ if (hhdr == 0) return(p);
+ h = HBLKPTR(p);
+# ifdef ALL_INTERIOR_POINTERS
+ while (IS_FORWARDING_ADDR_OR_NIL(hhdr)) {
+ h = FORWARDED_ADDR(h, hhdr);
+ hhdr = HDR(h);
+ }
+# endif
+ if (IS_FORWARDING_ADDR_OR_NIL(hhdr)) {
+ goto fail;
+ }
+ sz = WORDS_TO_BYTES(hhdr -> hb_sz);
+ pdispl = HBLKDISPL(p);
+ map_entry = MAP_ENTRY((hhdr -> hb_map), pdispl);
+ if (map_entry == OBJ_INVALID
+ || sz > MAXOBJSZ && (ptr_t)p >= (ptr_t)h + sz) {
+ goto fail;
+ }
+ return(p);
+fail:
+ (*GC_is_valid_displacement_print_proc)((ptr_t)p);
+ return(p);
+}
+
+#ifdef __STDC__
+void GC_default_is_visible_print_proc(GC_PTR p)
+#else
+void GC_default_is_visible_print_proc(p)
+GC_PTR p;
+#endif
+{
+ GC_err_printf1("0x%lx is not a GC visible pointer location\n",
+ (unsigned long)p);
+ ABORT("GC_is_visible test failed");
+}
+
+void (*GC_is_visible_print_proc) GC_PROTO((GC_PTR p)) =
+ GC_default_is_visible_print_proc;
+
+/* Could p be a stack address? */
+GC_bool GC_on_stack(p)
+ptr_t p;
+{
+# ifdef THREADS
+ return(TRUE);
+# else
+ int dummy;
+# ifdef STACK_GROWS_DOWN
+ if ((ptr_t)p >= (ptr_t)(&dummy) && (ptr_t)p < GC_stackbottom ) {
+ return(TRUE);
+ }
+# else
+ if ((ptr_t)p <= (ptr_t)(&dummy) && (ptr_t)p > GC_stackbottom ) {
+ return(TRUE);
+ }
+# endif
+ return(FALSE);
+# endif
+}
+
+/* Check that p is visible */
+/* to the collector as a possibly pointer containing location. */
+/* If it isn't invoke *GC_is_visible_print_proc. */
+/* Returns the argument in all cases. May erroneously succeed */
+/* in hard cases. (This is intended for debugging use with */
+/* untyped allocations. The idea is that it should be possible, though */
+/* slow, to add such a call to all indirect pointer stores.) */
+/* Currently useless for multithreaded worlds. */
+#ifdef __STDC__
+ void * GC_is_visible(void *p)
+#else
+ char *GC_is_visible(p)
+ char *p;
+#endif
+{
+ register hdr *hhdr;
+
+ if ((word)p & (ALIGNMENT - 1)) goto fail;
+ if (!GC_is_initialized) GC_init();
+# ifdef THREADS
+ hhdr = HDR((word)p);
+ if (hhdr != 0 && GC_base(p) == 0) {
+ goto fail;
+ } else {
+ /* May be inside thread stack. We can't do much. */
+ return(p);
+ }
+# else
+ /* Check stack first: */
+ if (GC_on_stack(p)) return(p);
+ hhdr = HDR((word)p);
+ if (hhdr == 0) {
+ GC_bool result;
+
+ if (GC_is_static_root(p)) return(p);
+ /* Else do it again correctly: */
+# if (defined(DYNAMIC_LOADING) || defined(MSWIN32) || defined(PCR)) \
+ && !defined(SRC_M3)
+ DISABLE_SIGNALS();
+ GC_register_dynamic_libraries();
+ result = GC_is_static_root(p);
+ ENABLE_SIGNALS();
+ if (result) return(p);
+# endif
+ goto fail;
+ } else {
+ /* p points to the heap. */
+ word descr;
+ ptr_t base = GC_base(p); /* Should be manually inlined? */
+
+ if (base == 0) goto fail;
+ if (HBLKPTR(base) != HBLKPTR(p)) hhdr = HDR((word)p);
+ descr = hhdr -> hb_descr;
+ retry:
+ switch(descr & DS_TAGS) {
+ case DS_LENGTH:
+ if ((word)((ptr_t)p - (ptr_t)base) > (word)descr) goto fail;
+ break;
+ case DS_BITMAP:
+ if ((ptr_t)p - (ptr_t)base
+ >= WORDS_TO_BYTES(BITMAP_BITS)
+ || ((word)p & (sizeof(word) - 1))) goto fail;
+ if (!((1 << (WORDSZ - ((ptr_t)p - (ptr_t)base) - 1))
+ & descr)) goto fail;
+ break;
+ case DS_PROC:
+ /* We could try to decipher this partially. */
+ /* For now we just punt. */
+ break;
+ case DS_PER_OBJECT:
+ descr = *(word *)((ptr_t)base + (descr & ~DS_TAGS));
+ goto retry;
+ }
+ return(p);
+ }
+# endif
+fail:
+ (*GC_is_visible_print_proc)((ptr_t)p);
+ return(p);
+}
+
+
+GC_PTR GC_pre_incr (p, how_much)
+GC_PTR *p;
+size_t how_much;
+{
+ GC_PTR initial = *p;
+ GC_PTR result = GC_same_obj((GC_PTR)((word)initial + how_much), initial);
+
+# ifndef ALL_INTERIOR_POINTERS
+ (void) GC_is_valid_displacement(result);
+# endif
+ return (*p = result);
+}
+
+GC_PTR GC_post_incr (p, how_much)
+GC_PTR *p;
+size_t how_much;
+{
+ GC_PTR initial = *p;
+ GC_PTR result = GC_same_obj((GC_PTR)((word)initial + how_much), initial);
+
+# ifndef ALL_INTERIOR_POINTERS
+ (void) GC_is_valid_displacement(result);
+# endif
+ *p = result;
+ return(initial);
+}
diff --git a/boehm-gc/quick_threads.c b/boehm-gc/quick_threads.c
new file mode 100644
index 00000000000..adc26da6d59
--- /dev/null
+++ b/boehm-gc/quick_threads.c
@@ -0,0 +1,55 @@
+/*
+ * Support code for cooperative coop/quick threads.
+ * Copyright (c) 1998, 1999 Cygnus Solutions.
+ */
+
+#include "boehm-config.h"
+
+#ifdef QUICK_THREADS
+
+#include "gc_priv.h"
+
+#include "coop.h"
+
+void GC_push_all_stacks (void)
+{
+ coop_t *t;
+ ptr_t lo, hi;
+
+ t = coop_first_thread ();
+
+ if (t == NULL)
+ {
+ /* Threads haven't started, so mark the real stack. */
+#ifdef STACK_GROWS_DOWN
+ GC_push_all_stack( GC_approx_sp(), GC_stackbottom );
+#else
+ GC_push_all_stack( GC_stackbottom, GC_approx_sp() );
+#endif
+ }
+ else
+ {
+ for ( ; t != NULL; t = coop_next_thread (t))
+ {
+ if (t == coop_global_curr)
+ lo = GC_approx_sp ();
+ else
+ {
+ lo = t->top;
+ /* LO can be NULL when the new thread has not yet been
+ used. */
+ if (! lo)
+ continue;
+ }
+ hi = t->base;
+
+#ifdef STACK_GROWS_DOWN
+ GC_push_all_stack (lo, hi);
+#else
+ GC_push_all_stack (hi, lo);
+#endif
+ }
+ }
+}
+
+#endif /* QUICK_THREADS */
diff --git a/boehm-gc/real_malloc.c b/boehm-gc/real_malloc.c
new file mode 100644
index 00000000000..dece9fdc09c
--- /dev/null
+++ b/boehm-gc/real_malloc.c
@@ -0,0 +1,36 @@
+/*
+ * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+/* Boehm, May 19, 1994 2:04 pm PDT */
+
+
+# ifdef PCR
+/*
+ * This definition should go in its own file that includes no other
+ * header files. Otherwise, we risk not getting the underlying system
+ * malloc.
+ */
+# define PCR_NO_RENAME
+# include <stdlib.h>
+
+# ifdef __STDC__
+ char * real_malloc(size_t size)
+# else
+ char * real_malloc()
+ int size;
+# endif
+{
+ return((char *)malloc(size));
+}
+#endif /* PCR */
+
diff --git a/boehm-gc/reclaim.c b/boehm-gc/reclaim.c
new file mode 100644
index 00000000000..407b4c68194
--- /dev/null
+++ b/boehm-gc/reclaim.c
@@ -0,0 +1,723 @@
+/*
+ * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+/* Boehm, February 15, 1996 2:41 pm PST */
+
+#include <stdio.h>
+#include "gc_priv.h"
+
+signed_word GC_mem_found = 0;
+ /* Number of words of memory reclaimed */
+
+# ifdef FIND_LEAK
+static void report_leak(p, sz)
+ptr_t p;
+word sz;
+{
+ if (HDR(p) -> hb_obj_kind == PTRFREE) {
+ GC_err_printf0("Leaked atomic object at ");
+ } else {
+ GC_err_printf0("Leaked composite object at ");
+ }
+ if (GC_debugging_started && GC_has_debug_info(p)) {
+ GC_print_obj(p);
+ } else {
+ GC_err_printf2("0x%lx (appr. size = %ld)\n",
+ (unsigned long)p,
+ (unsigned long)WORDS_TO_BYTES(sz));
+ }
+}
+
+# define FOUND_FREE(hblk, word_no) \
+ if (abort_if_found) { \
+ report_leak((ptr_t)hblk + WORDS_TO_BYTES(word_no), \
+ HDR(hblk) -> hb_sz); \
+ }
+# else
+# define FOUND_FREE(hblk, word_no)
+# endif
+
+/*
+ * reclaim phase
+ *
+ */
+
+
+/*
+ * Test whether a block is completely empty, i.e. contains no marked
+ * objects. This does not require the block to be in physical
+ * memory.
+ */
+
+GC_bool GC_block_empty(hhdr)
+register hdr * hhdr;
+{
+ register word *p = (word *)(&(hhdr -> hb_marks[0]));
+ register word * plim =
+ (word *)(&(hhdr -> hb_marks[MARK_BITS_SZ]));
+ while (p < plim) {
+ if (*p++) return(FALSE);
+ }
+ return(TRUE);
+}
+
+# ifdef GATHERSTATS
+# define INCR_WORDS(sz) n_words_found += (sz)
+# else
+# define INCR_WORDS(sz)
+# endif
+/*
+ * Restore unmarked small objects in h of size sz to the object
+ * free list. Returns the new list.
+ * Clears unmarked objects.
+ */
+/*ARGSUSED*/
+ptr_t GC_reclaim_clear(hbp, hhdr, sz, list, abort_if_found)
+register struct hblk *hbp; /* ptr to current heap block */
+register hdr * hhdr;
+GC_bool abort_if_found; /* Abort if a reclaimable object is found */
+register ptr_t list;
+register word sz;
+{
+ register int word_no;
+ register word *p, *q, *plim;
+# ifdef GATHERSTATS
+ register int n_words_found = 0;
+# endif
+
+ p = (word *)(hbp->hb_body);
+ word_no = HDR_WORDS;
+ plim = (word *)((((word)hbp) + HBLKSIZE)
+ - WORDS_TO_BYTES(sz));
+
+ /* go through all words in block */
+ while( p <= plim ) {
+ if( mark_bit_from_hdr(hhdr, word_no) ) {
+ p += sz;
+ } else {
+ FOUND_FREE(hbp, word_no);
+ INCR_WORDS(sz);
+ /* object is available - put on list */
+ obj_link(p) = list;
+ list = ((ptr_t)p);
+ /* Clear object, advance p to next object in the process */
+ q = p + sz;
+ p++; /* Skip link field */
+ while (p < q) {
+ *p++ = 0;
+ }
+ }
+ word_no += sz;
+ }
+# ifdef GATHERSTATS
+ GC_mem_found += n_words_found;
+# endif
+ return(list);
+}
+
+#ifndef SMALL_CONFIG
+
+/*
+ * A special case for 2 word composite objects (e.g. cons cells):
+ */
+/*ARGSUSED*/
+ptr_t GC_reclaim_clear2(hbp, hhdr, list, abort_if_found)
+register struct hblk *hbp; /* ptr to current heap block */
+hdr * hhdr;
+GC_bool abort_if_found; /* Abort if a reclaimable object is found */
+register ptr_t list;
+{
+ register word * mark_word_addr = &(hhdr->hb_marks[divWORDSZ(HDR_WORDS)]);
+ register word *p, *plim;
+# ifdef GATHERSTATS
+ register int n_words_found = 0;
+# endif
+ register word mark_word;
+ register int i;
+# define DO_OBJ(start_displ) \
+ if (!(mark_word & ((word)1 << start_displ))) { \
+ FOUND_FREE(hbp, p - (word *)hbp + start_displ); \
+ p[start_displ] = (word)list; \
+ list = (ptr_t)(p+start_displ); \
+ p[start_displ+1] = 0; \
+ INCR_WORDS(2); \
+ }
+
+ p = (word *)(hbp->hb_body);
+ plim = (word *)(((word)hbp) + HBLKSIZE);
+
+ /* go through all words in block */
+ while( p < plim ) {
+ mark_word = *mark_word_addr++;
+ for (i = 0; i < WORDSZ; i += 8) {
+ DO_OBJ(0);
+ DO_OBJ(2);
+ DO_OBJ(4);
+ DO_OBJ(6);
+ p += 8;
+ mark_word >>= 8;
+ }
+ }
+# ifdef GATHERSTATS
+ GC_mem_found += n_words_found;
+# endif
+ return(list);
+# undef DO_OBJ
+}
+
+/*
+ * Another special case for 4 word composite objects:
+ */
+/*ARGSUSED*/
+ptr_t GC_reclaim_clear4(hbp, hhdr, list, abort_if_found)
+register struct hblk *hbp; /* ptr to current heap block */
+hdr * hhdr;
+GC_bool abort_if_found; /* Abort if a reclaimable object is found */
+register ptr_t list;
+{
+ register word * mark_word_addr = &(hhdr->hb_marks[divWORDSZ(HDR_WORDS)]);
+ register word *p, *plim;
+# ifdef GATHERSTATS
+ register int n_words_found = 0;
+# endif
+ register word mark_word;
+# define DO_OBJ(start_displ) \
+ if (!(mark_word & ((word)1 << start_displ))) { \
+ FOUND_FREE(hbp, p - (word *)hbp + start_displ); \
+ p[start_displ] = (word)list; \
+ list = (ptr_t)(p+start_displ); \
+ p[start_displ+1] = 0; \
+ p[start_displ+2] = 0; \
+ p[start_displ+3] = 0; \
+ INCR_WORDS(4); \
+ }
+
+ p = (word *)(hbp->hb_body);
+ plim = (word *)(((word)hbp) + HBLKSIZE);
+
+ /* go through all words in block */
+ while( p < plim ) {
+ mark_word = *mark_word_addr++;
+ DO_OBJ(0);
+ DO_OBJ(4);
+ DO_OBJ(8);
+ DO_OBJ(12);
+ DO_OBJ(16);
+ DO_OBJ(20);
+ DO_OBJ(24);
+ DO_OBJ(28);
+# if CPP_WORDSZ == 64
+ DO_OBJ(32);
+ DO_OBJ(36);
+ DO_OBJ(40);
+ DO_OBJ(44);
+ DO_OBJ(48);
+ DO_OBJ(52);
+ DO_OBJ(56);
+ DO_OBJ(60);
+# endif
+ p += WORDSZ;
+ }
+# ifdef GATHERSTATS
+ GC_mem_found += n_words_found;
+# endif
+ return(list);
+# undef DO_OBJ
+}
+
+#endif /* !SMALL_CONFIG */
+
+/* The same thing, but don't clear objects: */
+/*ARGSUSED*/
+ptr_t GC_reclaim_uninit(hbp, hhdr, sz, list, abort_if_found)
+register struct hblk *hbp; /* ptr to current heap block */
+register hdr * hhdr;
+GC_bool abort_if_found; /* Abort if a reclaimable object is found */
+register ptr_t list;
+register word sz;
+{
+ register int word_no;
+ register word *p, *plim;
+# ifdef GATHERSTATS
+ register int n_words_found = 0;
+# endif
+
+ p = (word *)(hbp->hb_body);
+ word_no = HDR_WORDS;
+ plim = (word *)((((word)hbp) + HBLKSIZE)
+ - WORDS_TO_BYTES(sz));
+
+ /* go through all words in block */
+ while( p <= plim ) {
+ if( !mark_bit_from_hdr(hhdr, word_no) ) {
+ FOUND_FREE(hbp, word_no);
+ INCR_WORDS(sz);
+ /* object is available - put on list */
+ obj_link(p) = list;
+ list = ((ptr_t)p);
+ }
+ p += sz;
+ word_no += sz;
+ }
+# ifdef GATHERSTATS
+ GC_mem_found += n_words_found;
+# endif
+ return(list);
+}
+
+#ifndef SMALL_CONFIG
+/*
+ * Another special case for 2 word atomic objects:
+ */
+/*ARGSUSED*/
+ptr_t GC_reclaim_uninit2(hbp, hhdr, list, abort_if_found)
+register struct hblk *hbp; /* ptr to current heap block */
+hdr * hhdr;
+GC_bool abort_if_found; /* Abort if a reclaimable object is found */
+register ptr_t list;
+{
+ register word * mark_word_addr = &(hhdr->hb_marks[divWORDSZ(HDR_WORDS)]);
+ register word *p, *plim;
+# ifdef GATHERSTATS
+ register int n_words_found = 0;
+# endif
+ register word mark_word;
+ register int i;
+# define DO_OBJ(start_displ) \
+ if (!(mark_word & ((word)1 << start_displ))) { \
+ FOUND_FREE(hbp, p - (word *)hbp + start_displ); \
+ p[start_displ] = (word)list; \
+ list = (ptr_t)(p+start_displ); \
+ INCR_WORDS(2); \
+ }
+
+ p = (word *)(hbp->hb_body);
+ plim = (word *)(((word)hbp) + HBLKSIZE);
+
+ /* go through all words in block */
+ while( p < plim ) {
+ mark_word = *mark_word_addr++;
+ for (i = 0; i < WORDSZ; i += 8) {
+ DO_OBJ(0);
+ DO_OBJ(2);
+ DO_OBJ(4);
+ DO_OBJ(6);
+ p += 8;
+ mark_word >>= 8;
+ }
+ }
+# ifdef GATHERSTATS
+ GC_mem_found += n_words_found;
+# endif
+ return(list);
+# undef DO_OBJ
+}
+
+/*
+ * Another special case for 4 word atomic objects:
+ */
+/*ARGSUSED*/
+ptr_t GC_reclaim_uninit4(hbp, hhdr, list, abort_if_found)
+register struct hblk *hbp; /* ptr to current heap block */
+hdr * hhdr;
+GC_bool abort_if_found; /* Abort if a reclaimable object is found */
+register ptr_t list;
+{
+ register word * mark_word_addr = &(hhdr->hb_marks[divWORDSZ(HDR_WORDS)]);
+ register word *p, *plim;
+# ifdef GATHERSTATS
+ register int n_words_found = 0;
+# endif
+ register word mark_word;
+# define DO_OBJ(start_displ) \
+ if (!(mark_word & ((word)1 << start_displ))) { \
+ FOUND_FREE(hbp, p - (word *)hbp + start_displ); \
+ p[start_displ] = (word)list; \
+ list = (ptr_t)(p+start_displ); \
+ INCR_WORDS(4); \
+ }
+
+ p = (word *)(hbp->hb_body);
+ plim = (word *)(((word)hbp) + HBLKSIZE);
+
+ /* go through all words in block */
+ while( p < plim ) {
+ mark_word = *mark_word_addr++;
+ DO_OBJ(0);
+ DO_OBJ(4);
+ DO_OBJ(8);
+ DO_OBJ(12);
+ DO_OBJ(16);
+ DO_OBJ(20);
+ DO_OBJ(24);
+ DO_OBJ(28);
+# if CPP_WORDSZ == 64
+ DO_OBJ(32);
+ DO_OBJ(36);
+ DO_OBJ(40);
+ DO_OBJ(44);
+ DO_OBJ(48);
+ DO_OBJ(52);
+ DO_OBJ(56);
+ DO_OBJ(60);
+# endif
+ p += WORDSZ;
+ }
+# ifdef GATHERSTATS
+ GC_mem_found += n_words_found;
+# endif
+ return(list);
+# undef DO_OBJ
+}
+
+/* Finally the one word case, which never requires any clearing: */
+/*ARGSUSED*/
+ptr_t GC_reclaim1(hbp, hhdr, list, abort_if_found)
+register struct hblk *hbp; /* ptr to current heap block */
+hdr * hhdr;
+GC_bool abort_if_found; /* Abort if a reclaimable object is found */
+register ptr_t list;
+{
+ register word * mark_word_addr = &(hhdr->hb_marks[divWORDSZ(HDR_WORDS)]);
+ register word *p, *plim;
+# ifdef GATHERSTATS
+ register int n_words_found = 0;
+# endif
+ register word mark_word;
+ register int i;
+# define DO_OBJ(start_displ) \
+ if (!(mark_word & ((word)1 << start_displ))) { \
+ FOUND_FREE(hbp, p - (word *)hbp + start_displ); \
+ p[start_displ] = (word)list; \
+ list = (ptr_t)(p+start_displ); \
+ INCR_WORDS(1); \
+ }
+
+ p = (word *)(hbp->hb_body);
+ plim = (word *)(((word)hbp) + HBLKSIZE);
+
+ /* go through all words in block */
+ while( p < plim ) {
+ mark_word = *mark_word_addr++;
+ for (i = 0; i < WORDSZ; i += 4) {
+ DO_OBJ(0);
+ DO_OBJ(1);
+ DO_OBJ(2);
+ DO_OBJ(3);
+ p += 4;
+ mark_word >>= 4;
+ }
+ }
+# ifdef GATHERSTATS
+ GC_mem_found += n_words_found;
+# endif
+ return(list);
+# undef DO_OBJ
+}
+
+#endif /* !SMALL_CONFIG */
+
+/*
+ * Restore unmarked small objects in the block pointed to by hbp
+ * to the appropriate object free list.
+ * If entirely empty blocks are to be completely deallocated, then
+ * caller should perform that check.
+ */
+void GC_reclaim_small_nonempty_block(hbp, abort_if_found)
+register struct hblk *hbp; /* ptr to current heap block */
+int abort_if_found; /* Abort if a reclaimable object is found */
+{
+ hdr * hhdr;
+ register word sz; /* size of objects in current block */
+ register struct obj_kind * ok;
+ register ptr_t * flh;
+ register int kind;
+
+ hhdr = HDR(hbp);
+ sz = hhdr -> hb_sz;
+ hhdr -> hb_last_reclaimed = (unsigned short) GC_gc_no;
+ kind = hhdr -> hb_obj_kind;
+ ok = &GC_obj_kinds[kind];
+ flh = &(ok -> ok_freelist[sz]);
+ GC_write_hint(hbp);
+
+ if (ok -> ok_init) {
+ switch(sz) {
+# ifndef SMALL_CONFIG
+ case 1:
+ *flh = GC_reclaim1(hbp, hhdr, *flh, abort_if_found);
+ break;
+ case 2:
+ *flh = GC_reclaim_clear2(hbp, hhdr, *flh, abort_if_found);
+ break;
+ case 4:
+ *flh = GC_reclaim_clear4(hbp, hhdr, *flh, abort_if_found);
+ break;
+# endif
+ default:
+ *flh = GC_reclaim_clear(hbp, hhdr, sz, *flh, abort_if_found);
+ break;
+ }
+ } else {
+ switch(sz) {
+# ifndef SMALL_CONFIG
+ case 1:
+ *flh = GC_reclaim1(hbp, hhdr, *flh, abort_if_found);
+ break;
+ case 2:
+ *flh = GC_reclaim_uninit2(hbp, hhdr, *flh, abort_if_found);
+ break;
+ case 4:
+ *flh = GC_reclaim_uninit4(hbp, hhdr, *flh, abort_if_found);
+ break;
+# endif
+ default:
+ *flh = GC_reclaim_uninit(hbp, hhdr, sz, *flh, abort_if_found);
+ break;
+ }
+ }
+ if (IS_UNCOLLECTABLE(kind)) GC_set_hdr_marks(hhdr);
+}
+
+/*
+ * Restore an unmarked large object or an entirely empty blocks of small objects
+ * to the heap block free list.
+ * Otherwise enqueue the block for later processing
+ * by GC_reclaim_small_nonempty_block.
+ * If abort_if_found is TRUE, then process any block immediately.
+ */
+void GC_reclaim_block(hbp, abort_if_found)
+register struct hblk *hbp; /* ptr to current heap block */
+word abort_if_found; /* Abort if a reclaimable object is found */
+{
+ register hdr * hhdr;
+ register word sz; /* size of objects in current block */
+ register struct obj_kind * ok;
+ struct hblk ** rlh;
+
+ hhdr = HDR(hbp);
+ sz = hhdr -> hb_sz;
+ ok = &GC_obj_kinds[hhdr -> hb_obj_kind];
+
+ if( sz > MAXOBJSZ ) { /* 1 big object */
+ if( !mark_bit_from_hdr(hhdr, HDR_WORDS) ) {
+ FOUND_FREE(hbp, HDR_WORDS);
+# ifdef GATHERSTATS
+ GC_mem_found += sz;
+# endif
+ GC_freehblk(hbp);
+ }
+ } else {
+ GC_bool empty = GC_block_empty(hhdr);
+ if (abort_if_found) {
+ GC_reclaim_small_nonempty_block(hbp, (int)abort_if_found);
+ } else if (empty) {
+# ifdef GATHERSTATS
+ GC_mem_found += BYTES_TO_WORDS(HBLKSIZE);
+# endif
+ GC_freehblk(hbp);
+ } else {
+ /* group of smaller objects, enqueue the real work */
+ rlh = &(ok -> ok_reclaim_list[sz]);
+ hhdr -> hb_next = *rlh;
+ *rlh = hbp;
+ }
+ }
+}
+
+#if !defined(NO_DEBUGGING)
+/* Routines to gather and print heap block info */
+/* intended for debugging. Otherwise should be called */
+/* with lock. */
+static size_t number_of_blocks;
+static size_t total_bytes;
+
+/* Number of set bits in a word. Not performance critical. */
+static int set_bits(n)
+word n;
+{
+ register word m = n;
+ register int result = 0;
+
+ while (m > 0) {
+ if (m & 1) result++;
+ m >>= 1;
+ }
+ return(result);
+}
+
+/* Return the number of set mark bits in the given header */
+int GC_n_set_marks(hhdr)
+hdr * hhdr;
+{
+ register int result = 0;
+ register int i;
+
+ for (i = 0; i < MARK_BITS_SZ; i++) {
+ result += set_bits(hhdr -> hb_marks[i]);
+ }
+ return(result);
+}
+
+/*ARGSUSED*/
+void GC_print_block_descr(h, dummy)
+struct hblk *h;
+word dummy;
+{
+ register hdr * hhdr = HDR(h);
+ register size_t bytes = WORDS_TO_BYTES(hhdr -> hb_sz);
+
+ GC_printf3("(%lu:%lu,%lu)", (unsigned long)(hhdr -> hb_obj_kind),
+ (unsigned long)bytes,
+ (unsigned long)(GC_n_set_marks(hhdr)));
+ bytes += HDR_BYTES + HBLKSIZE-1;
+ bytes &= ~(HBLKSIZE-1);
+ total_bytes += bytes;
+ number_of_blocks++;
+}
+
+void GC_print_block_list()
+{
+ GC_printf0("(kind(0=ptrfree,1=normal,2=unc.,3=stubborn):size_in_bytes, #_marks_set)\n");
+ number_of_blocks = 0;
+ total_bytes = 0;
+ GC_apply_to_all_blocks(GC_print_block_descr, (word)0);
+ GC_printf2("\nblocks = %lu, bytes = %lu\n",
+ (unsigned long)number_of_blocks,
+ (unsigned long)total_bytes);
+}
+
+#endif /* NO_DEBUGGING */
+
+/*
+ * Do the same thing on the entire heap, after first clearing small object
+ * free lists (if we are not just looking for leaks).
+ */
+void GC_start_reclaim(abort_if_found)
+int abort_if_found; /* Abort if a GC_reclaimable object is found */
+{
+ int kind;
+
+ /* Clear reclaim- and free-lists */
+ for (kind = 0; kind < GC_n_kinds; kind++) {
+ register ptr_t *fop;
+ register ptr_t *lim;
+ register struct hblk ** rlp;
+ register struct hblk ** rlim;
+ register struct hblk ** rlist = GC_obj_kinds[kind].ok_reclaim_list;
+
+ if (rlist == 0) continue; /* This kind not used. */
+ if (!abort_if_found) {
+ lim = &(GC_obj_kinds[kind].ok_freelist[MAXOBJSZ+1]);
+ for( fop = GC_obj_kinds[kind].ok_freelist; fop < lim; fop++ ) {
+ *fop = 0;
+ }
+ } /* otherwise free list objects are marked, */
+ /* and its safe to leave them */
+ rlim = rlist + MAXOBJSZ+1;
+ for( rlp = rlist; rlp < rlim; rlp++ ) {
+ *rlp = 0;
+ }
+ }
+
+# ifdef PRINTBLOCKS
+ GC_printf0("GC_reclaim: current block sizes:\n");
+ GC_print_block_list();
+# endif
+
+ /* Go through all heap blocks (in hblklist) and reclaim unmarked objects */
+ /* or enqueue the block for later processing. */
+ GC_apply_to_all_blocks(GC_reclaim_block, (word)abort_if_found);
+
+}
+
+/*
+ * Sweep blocks of the indicated object size and kind until either the
+ * appropriate free list is nonempty, or there are no more blocks to
+ * sweep.
+ */
+void GC_continue_reclaim(sz, kind)
+word sz; /* words */
+int kind;
+{
+ register hdr * hhdr;
+ register struct hblk * hbp;
+ register struct obj_kind * ok = &(GC_obj_kinds[kind]);
+ struct hblk ** rlh = ok -> ok_reclaim_list;
+ ptr_t *flh = &(ok -> ok_freelist[sz]);
+
+ if (rlh == 0) return; /* No blocks of this kind. */
+ rlh += sz;
+ while ((hbp = *rlh) != 0) {
+ hhdr = HDR(hbp);
+ *rlh = hhdr -> hb_next;
+ GC_reclaim_small_nonempty_block(hbp, FALSE);
+ if (*flh != 0) break;
+ }
+}
+
+/*
+ * Reclaim all small blocks waiting to be reclaimed.
+ * Abort and return FALSE when/if (*stop_func)() returns TRUE.
+ * If this returns TRUE, then it's safe to restart the world
+ * with incorrectly cleared mark bits.
+ * If ignore_old is TRUE, then reclain only blocks that have been
+ * recently reclaimed, and discard the rest.
+ * Stop_func may be 0.
+ */
+GC_bool GC_reclaim_all(stop_func, ignore_old)
+GC_stop_func stop_func;
+GC_bool ignore_old;
+{
+ register word sz;
+ register int kind;
+ register hdr * hhdr;
+ register struct hblk * hbp;
+ register struct obj_kind * ok;
+ struct hblk ** rlp;
+ struct hblk ** rlh;
+# ifdef PRINTTIMES
+ CLOCK_TYPE start_time;
+ CLOCK_TYPE done_time;
+
+ GET_TIME(start_time);
+# endif
+
+ for (kind = 0; kind < GC_n_kinds; kind++) {
+ ok = &(GC_obj_kinds[kind]);
+ rlp = ok -> ok_reclaim_list;
+ if (rlp == 0) continue;
+ for (sz = 1; sz <= MAXOBJSZ; sz++) {
+ rlh = rlp + sz;
+ while ((hbp = *rlh) != 0) {
+ if (stop_func != (GC_stop_func)0 && (*stop_func)()) {
+ return(FALSE);
+ }
+ hhdr = HDR(hbp);
+ *rlh = hhdr -> hb_next;
+ if (!ignore_old || hhdr -> hb_last_reclaimed == GC_gc_no - 1) {
+ /* It's likely we'll need it this time, too */
+ /* It's been touched recently, so this */
+ /* shouldn't trigger paging. */
+ GC_reclaim_small_nonempty_block(hbp, FALSE);
+ }
+ }
+ }
+ }
+# ifdef PRINTTIMES
+ GET_TIME(done_time);
+ GC_printf1("Disposing of reclaim lists took %lu msecs\n",
+ MS_TIME_DIFF(done_time,start_time));
+# endif
+ return(TRUE);
+}
diff --git a/boehm-gc/rs6000_mach_dep.s b/boehm-gc/rs6000_mach_dep.s
new file mode 100644
index 00000000000..e0dbe808596
--- /dev/null
+++ b/boehm-gc/rs6000_mach_dep.s
@@ -0,0 +1,105 @@
+ .csect
+ .set r0,0
+ .set r1,1
+ .set r2,2
+ .set r3,3
+ .set r4,4
+ .set r5,5
+ .set r6,6
+ .set r7,7
+ .set r8,8
+ .set r9,9
+ .set r10,10
+ .set r11,11
+ .set r12,12
+ .set r13,13
+ .set r14,14
+ .set r15,15
+ .set r16,16
+ .set r17,17
+ .set r18,18
+ .set r19,19
+ .set r20,20
+ .set r21,21
+ .set r22,22
+ .set r23,23
+ .set r24,24
+ .set r25,25
+ .set r26,26
+ .set r27,27
+ .set r28,28
+ .set r29,29
+ .set r30,30
+ .set r31,31
+
+ # Mark from machine registers that are saved by C compiler
+ .globl .GC_push_regs
+.GC_push_regs:
+ .extern .GC_push_one
+ stu r1,-64(r1) # reserve stack frame
+ mflr r0 # save link register
+ st r0,0x48(r1)
+ oril r3,r2,0x0 # mark from r2
+ bl .GC_push_one
+ cror 15,15,15
+ oril r3,r13,0x0 # mark from r13-r31
+ bl .GC_push_one
+ cror 15,15,15
+ oril r3,r14,0x0
+ bl .GC_push_one
+ cror 15,15,15
+ oril r3,r15,0x0
+ bl .GC_push_one
+ cror 15,15,15
+ oril r3,r16,0x0
+ bl .GC_push_one
+ cror 15,15,15
+ oril r3,r17,0x0
+ bl .GC_push_one
+ cror 15,15,15
+ oril r3,r18,0x0
+ bl .GC_push_one
+ cror 15,15,15
+ oril r3,r19,0x0
+ bl .GC_push_one
+ cror 15,15,15
+ oril r3,r20,0x0
+ bl .GC_push_one
+ cror 15,15,15
+ oril r3,r21,0x0
+ bl .GC_push_one
+ cror 15,15,15
+ oril r3,r22,0x0
+ bl .GC_push_one
+ cror 15,15,15
+ oril r3,r23,0x0
+ bl .GC_push_one
+ cror 15,15,15
+ oril r3,r24,0x0
+ bl .GC_push_one
+ cror 15,15,15
+ oril r3,r25,0x0
+ bl .GC_push_one
+ cror 15,15,15
+ oril r3,r26,0x0
+ bl .GC_push_one
+ cror 15,15,15
+ oril r3,r27,0x0
+ bl .GC_push_one
+ cror 15,15,15
+ oril r3,r28,0x0
+ bl .GC_push_one
+ cror 15,15,15
+ oril r3,r29,0x0
+ bl .GC_push_one
+ cror 15,15,15
+ oril r3,r30,0x0
+ bl .GC_push_one
+ cror 15,15,15
+ oril r3,r31,0x0
+ bl .GC_push_one
+ cror 15,15,15
+ l r0,0x48(r1)
+ mtlr r0
+ ai r1,r1,64
+ br
diff --git a/boehm-gc/setjmp_t.c b/boehm-gc/setjmp_t.c
new file mode 100644
index 00000000000..9ed92138b6c
--- /dev/null
+++ b/boehm-gc/setjmp_t.c
@@ -0,0 +1,115 @@
+/*
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+/* Boehm, September 21, 1995 5:39 pm PDT */
+
+/* Check whether setjmp actually saves registers in jmp_buf. */
+/* If it doesn't, the generic mark_regs code won't work. */
+/* Compilers vary as to whether they will put x in a */
+/* (callee-save) register without -O. The code is */
+/* contrived such that any decent compiler should put x in */
+/* a callee-save register with -O. Thus it is is */
+/* recommended that this be run optimized. (If the machine */
+/* has no callee-save registers, then the generic code is */
+/* safe, but this will not be noticed by this piece of */
+/* code.) */
+#include <stdio.h>
+#include <setjmp.h>
+#include <string.h>
+#include "config.h"
+
+#ifdef OS2
+/* GETPAGESIZE() is set to getpagesize() by default, but that */
+/* doesn't really exist, and the collector doesn't need it. */
+#define INCL_DOSFILEMGR
+#define INCL_DOSMISC
+#define INCL_DOSERRORS
+#include <os2.h>
+
+int
+getpagesize()
+{
+ ULONG result[1];
+
+ if (DosQuerySysInfo(QSV_PAGE_SIZE, QSV_PAGE_SIZE,
+ (void *)result, sizeof(ULONG)) != NO_ERROR) {
+ fprintf(stderr, "DosQuerySysInfo failed\n");
+ result[0] = 4096;
+ }
+ return((int)(result[0]));
+}
+#endif
+
+struct {char a_a; char * a_b;} a;
+
+int * nested_sp()
+{
+ int dummy;
+
+ return(&dummy);
+}
+
+main()
+{
+ int dummy;
+ long ps = GETPAGESIZE();
+ jmp_buf b;
+ register int x = (int)strlen("a"); /* 1, slightly disguised */
+ static int y = 0;
+
+ printf("This appears to be a %s running %s\n", MACH_TYPE, OS_TYPE);
+ if (nested_sp() < &dummy) {
+ printf("Stack appears to grow down, which is the default.\n");
+ printf("A good guess for STACKBOTTOM on this machine is 0x%lx.\n",
+ ((unsigned long)(&dummy) + ps) & ~(ps-1));
+ } else {
+ printf("Stack appears to grow up.\n");
+ printf("Define STACK_GROWS_UP in gc_private.h\n");
+ printf("A good guess for STACKBOTTOM on this machine is 0x%lx.\n",
+ ((unsigned long)(&dummy) + ps) & ~(ps-1));
+ }
+ printf("Note that this may vary between machines of ostensibly\n");
+ printf("the same architecture (e.g. Sun 3/50s and 3/80s).\n");
+ printf("On many machines the value is not fixed.\n");
+ printf("A good guess for ALIGNMENT on this machine is %ld.\n",
+ (unsigned long)(&(a.a_b))-(unsigned long)(&a));
+
+ /* Encourage the compiler to keep x in a callee-save register */
+ x = 2*x-1;
+ printf("");
+ x = 2*x-1;
+ setjmp(b);
+ if (y == 1) {
+ if (x == 2) {
+ printf("Generic mark_regs code probably wont work\n");
+# if defined(SPARC) || defined(RS6000) || defined(VAX) || defined(MIPS) || defined(M68K) || defined(I386) || defined(NS32K) || defined(RT)
+ printf("Assembly code supplied\n");
+# else
+ printf("Need assembly code\n");
+# endif
+ } else if (x == 1) {
+ printf("Generic mark_regs code may work\n");
+ } else {
+ printf("Very strange setjmp implementation\n");
+ }
+ }
+ y++;
+ x = 2;
+ if (y == 1) longjmp(b,1);
+ return(0);
+}
+
+int g(x)
+int x;
+{
+ return(x);
+}
diff --git a/boehm-gc/solaris_pthreads.c b/boehm-gc/solaris_pthreads.c
new file mode 100644
index 00000000000..91a0f01b33f
--- /dev/null
+++ b/boehm-gc/solaris_pthreads.c
@@ -0,0 +1,171 @@
+/*
+ * Copyright (c) 1994 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+/*
+ * Support code for Solaris threads. Provides functionality we wish Sun
+ * had provided. Relies on some information we probably shouldn't rely on.
+ * Modified Peter C. for Solaris Posix Threads.
+ */
+/* Boehm, September 14, 1994 4:44 pm PDT */
+
+# if defined(_SOLARIS_PTHREADS)
+# include "gc_priv.h"
+# include <pthread.h>
+# include <thread.h>
+# include <signal.h>
+# include <fcntl.h>
+# include <sys/types.h>
+# include <sys/mman.h>
+# include <sys/time.h>
+# include <sys/resource.h>
+# include <sys/stat.h>
+# include <sys/syscall.h>
+# include <sys/procfs.h>
+# include <sys/lwp.h>
+# include <sys/reg.h>
+# define _CLASSIC_XOPEN_TYPES
+# include <unistd.h>
+# include <errno.h>
+# include "solaris_threads.h"
+# include <stdio.h>
+
+#undef pthread_join
+#undef pthread_create
+
+pthread_cond_t GC_prom_join_cv; /* Broadcast when any thread terminates */
+pthread_cond_t GC_create_cv; /* Signalled when a new undetached */
+ /* thread starts. */
+
+extern GC_bool GC_multithreaded;
+
+/* We use the allocation lock to protect thread-related data structures. */
+
+/* We stop the world using /proc primitives. This makes some */
+/* minimal assumptions about the threads implementation. */
+/* We don't play by the rules, since the rules make this */
+/* impossible (as of Solaris 2.3). Also note that as of */
+/* Solaris 2.3 the various thread and lwp suspension */
+/* primitives failed to stop threads by the time the request */
+/* is completed. */
+
+
+
+int GC_pthread_join(pthread_t wait_for, void **status)
+{
+ return GC_thr_join((thread_t)wait_for, NULL, status);
+}
+
+
+int
+GC_pthread_create(pthread_t *new_thread,
+ const pthread_attr_t *attr_in,
+ void * (*thread_execp)(void *), void *arg)
+{
+ int result;
+ GC_thread t;
+ pthread_t my_new_thread;
+ pthread_attr_t attr;
+ word my_flags = 0;
+ int flag;
+ void * stack;
+ size_t stack_size;
+ int n;
+ struct sched_param schedparam;
+
+ (void)pthread_attr_getstacksize(attr_in, &stack_size);
+ (void)pthread_attr_getstackaddr(attr_in, &stack);
+ (void)pthread_attr_init(&attr);
+
+ LOCK();
+ if (!GC_thr_initialized) {
+ GC_thr_init();
+ }
+ GC_multithreaded++;
+
+ if (stack == 0) {
+ if (stack_size == 0)
+ stack_size = GC_min_stack_sz;
+ else
+ stack_size += thr_min_stack();
+
+ stack = (void *)GC_stack_alloc(&stack_size);
+ if (stack == 0) {
+ GC_multithreaded--;
+ UNLOCK();
+ errno = ENOMEM;
+ return -1;
+ }
+ } else {
+ my_flags |= CLIENT_OWNS_STACK;
+ }
+ (void)pthread_attr_setstacksize(&attr, stack_size);
+ (void)pthread_attr_setstackaddr(&attr, stack);
+ (void)pthread_attr_getscope(attr_in, &n);
+ (void)pthread_attr_setscope(&attr, n);
+ (void)pthread_attr_getschedparam(attr_in, &schedparam);
+ (void)pthread_attr_setschedparam(&attr, &schedparam);
+ (void)pthread_attr_getschedpolicy(attr_in, &n);
+ (void)pthread_attr_setschedpolicy(&attr, n);
+ (void)pthread_attr_getinheritsched(attr_in, &n);
+ (void)pthread_attr_setinheritsched(&attr, n);
+
+ (void)pthread_attr_getdetachstate(attr_in, &flag);
+ if (flag == PTHREAD_CREATE_DETACHED) {
+ my_flags |= DETACHED;
+ }
+ (void)pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
+ /*
+ * thr_create can call malloc(), which if redirected will
+ * attempt to acquire the allocation lock.
+ * Unlock here to prevent deadlock.
+ */
+
+
+#if 0
+#ifdef I386
+ UNLOCK();
+#endif
+#endif
+ result =
+ pthread_create(&my_new_thread, &attr, thread_execp, arg);
+#if 0
+#ifdef I386
+ LOCK();
+#endif
+#endif
+ if (result == 0) {
+ t = GC_new_thread(my_new_thread);
+ t -> flags = my_flags;
+ if (!(my_flags & DETACHED)) cond_init(&(t->join_cv), USYNC_THREAD, 0);
+ t -> stack = stack;
+ t -> stack_size = stack_size;
+ if (new_thread != 0) *new_thread = my_new_thread;
+ pthread_cond_signal(&GC_create_cv);
+ } else {
+ if (!(my_flags & CLIENT_OWNS_STACK)) {
+ GC_stack_free(stack, stack_size);
+ }
+ GC_multithreaded--;
+ }
+ UNLOCK();
+ pthread_attr_destroy(&attr);
+ return(result);
+}
+
+# else
+
+#ifndef LINT
+ int GC_no_sunOS_pthreads;
+#endif
+
+# endif /* SOLARIS_THREADS */
+
diff --git a/boehm-gc/solaris_threads.c b/boehm-gc/solaris_threads.c
new file mode 100644
index 00000000000..1f5ebcdc390
--- /dev/null
+++ b/boehm-gc/solaris_threads.c
@@ -0,0 +1,925 @@
+/*
+ * Copyright (c) 1994 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+/*
+ * Support code for Solaris threads. Provides functionality we wish Sun
+ * had provided. Relies on some information we probably shouldn't rely on.
+ */
+/* Boehm, September 14, 1994 4:44 pm PDT */
+
+# if defined(SOLARIS_THREADS)
+
+# include "gc_priv.h"
+# include "solaris_threads.h"
+# include <thread.h>
+# include <synch.h>
+# include <signal.h>
+# include <fcntl.h>
+# include <sys/types.h>
+# include <sys/mman.h>
+# include <sys/time.h>
+# include <sys/resource.h>
+# include <sys/stat.h>
+# include <sys/syscall.h>
+# include <sys/procfs.h>
+# include <sys/lwp.h>
+# include <sys/reg.h>
+# define _CLASSIC_XOPEN_TYPES
+# include <unistd.h>
+# include <errno.h>
+
+/*
+ * This is the default size of the LWP arrays. If there are more LWPs
+ * than this when a stop-the-world GC happens, set_max_lwps will be
+ * called to cope.
+ * This must be higher than the number of LWPs at startup time.
+ * The threads library creates a thread early on, so the min. is 3
+ */
+# define DEFAULT_MAX_LWPS 4
+
+#undef thr_join
+#undef thr_create
+#undef thr_suspend
+#undef thr_continue
+
+cond_t GC_prom_join_cv; /* Broadcast when any thread terminates */
+cond_t GC_create_cv; /* Signalled when a new undetached */
+ /* thread starts. */
+
+
+#ifdef MMAP_STACKS
+static int GC_zfd;
+#endif /* MMAP_STACKS */
+
+/* We use the allocation lock to protect thread-related data structures. */
+
+/* We stop the world using /proc primitives. This makes some */
+/* minimal assumptions about the threads implementation. */
+/* We don't play by the rules, since the rules make this */
+/* impossible (as of Solaris 2.3). Also note that as of */
+/* Solaris 2.3 the various thread and lwp suspension */
+/* primitives failed to stop threads by the time the request */
+/* is completed. */
+
+
+static sigset_t old_mask;
+
+/* Sleep for n milliseconds, n < 1000 */
+void GC_msec_sleep(int n)
+{
+ struct timespec ts;
+
+ ts.tv_sec = 0;
+ ts.tv_nsec = 1000000*n;
+ if (syscall(SYS_nanosleep, &ts, 0) < 0) {
+ ABORT("nanosleep failed");
+ }
+}
+/* Turn off preemption; gross but effective. */
+/* Caller has allocation lock. */
+/* Actually this is not needed under Solaris 2.3 and */
+/* 2.4, but hopefully that'll change. */
+void preempt_off()
+{
+ sigset_t set;
+
+ (void)sigfillset(&set);
+ sigdelset(&set, SIGABRT);
+ syscall(SYS_sigprocmask, SIG_SETMASK, &set, &old_mask);
+}
+
+void preempt_on()
+{
+ syscall(SYS_sigprocmask, SIG_SETMASK, &old_mask, NULL);
+}
+
+int GC_main_proc_fd = -1;
+
+
+struct lwp_cache_entry {
+ lwpid_t lc_id;
+ int lc_descr; /* /proc file descriptor. */
+} GC_lwp_cache_default[DEFAULT_MAX_LWPS];
+
+static int max_lwps = DEFAULT_MAX_LWPS;
+static struct lwp_cache_entry *GC_lwp_cache = GC_lwp_cache_default;
+
+static prgregset_t GC_lwp_registers_default[DEFAULT_MAX_LWPS];
+static prgregset_t *GC_lwp_registers = GC_lwp_registers_default;
+
+/* Return a file descriptor for the /proc entry corresponding */
+/* to the given lwp. The file descriptor may be stale if the */
+/* lwp exited and a new one was forked. */
+static int open_lwp(lwpid_t id)
+{
+ int result;
+ static int next_victim = 0;
+ register int i;
+
+ for (i = 0; i < max_lwps; i++) {
+ if (GC_lwp_cache[i].lc_id == id) return(GC_lwp_cache[i].lc_descr);
+ }
+ result = syscall(SYS_ioctl, GC_main_proc_fd, PIOCOPENLWP, &id);
+ /*
+ * If PIOCOPENLWP fails, try closing fds in the cache until it succeeds.
+ */
+ if (result < 0 && errno == EMFILE) {
+ for (i = 0; i < max_lwps; i++) {
+ if (GC_lwp_cache[i].lc_id != 0) {
+ (void)syscall(SYS_close, GC_lwp_cache[i].lc_descr);
+ result = syscall(SYS_ioctl, GC_main_proc_fd, PIOCOPENLWP, &id);
+ if (result >= 0 || (result < 0 && errno != EMFILE))
+ break;
+ }
+ }
+ }
+ if (result < 0) {
+ if (errno == EMFILE) {
+ ABORT("Too many open files");
+ }
+ return(-1) /* exited? */;
+ }
+ if (GC_lwp_cache[next_victim].lc_id != 0)
+ (void)syscall(SYS_close, GC_lwp_cache[next_victim].lc_descr);
+ GC_lwp_cache[next_victim].lc_id = id;
+ GC_lwp_cache[next_victim].lc_descr = result;
+ if (++next_victim >= max_lwps)
+ next_victim = 0;
+ return(result);
+}
+
+static void uncache_lwp(lwpid_t id)
+{
+ register int i;
+
+ for (i = 0; i < max_lwps; i++) {
+ if (GC_lwp_cache[i].lc_id == id) {
+ (void)syscall(SYS_close, GC_lwp_cache[id].lc_descr);
+ GC_lwp_cache[i].lc_id = 0;
+ break;
+ }
+ }
+}
+ /* Sequence of current lwp ids */
+static lwpid_t GC_current_ids_default[DEFAULT_MAX_LWPS + 1];
+static lwpid_t *GC_current_ids = GC_current_ids_default;
+
+ /* Temporary used below (can be big if large number of LWPs) */
+static lwpid_t last_ids_default[DEFAULT_MAX_LWPS + 1];
+static lwpid_t *last_ids = last_ids_default;
+
+
+#define ROUNDUP(n) WORDS_TO_BYTES(ROUNDED_UP_WORDS(n))
+
+static void set_max_lwps(GC_word n)
+{
+ char *mem;
+ char *oldmem;
+ int required_bytes = ROUNDUP(n * sizeof(struct lwp_cache_entry))
+ + ROUNDUP(n * sizeof(prgregset_t))
+ + ROUNDUP((n + 1) * sizeof(lwpid_t))
+ + ROUNDUP((n + 1) * sizeof(lwpid_t));
+
+ GC_expand_hp_inner(divHBLKSZ((word)required_bytes));
+ oldmem = mem = GC_scratch_alloc(required_bytes);
+ if (0 == mem) ABORT("No space for lwp data structures");
+
+ /*
+ * We can either flush the old lwp cache or copy it over. Do the latter.
+ */
+ memcpy(mem, GC_lwp_cache, max_lwps * sizeof(struct lwp_cache_entry));
+ GC_lwp_cache = (struct lwp_cache_entry*)mem;
+ mem += ROUNDUP(n * sizeof(struct lwp_cache_entry));
+
+ BZERO(GC_lwp_registers, max_lwps * sizeof(GC_lwp_registers[0]));
+ GC_lwp_registers = (prgregset_t *)mem;
+ mem += ROUNDUP(n * sizeof(prgregset_t));
+
+
+ GC_current_ids = (lwpid_t *)mem;
+ mem += ROUNDUP((n + 1) * sizeof(lwpid_t));
+
+ last_ids = (lwpid_t *)mem;
+ mem += ROUNDUP((n + 1)* sizeof(lwpid_t));
+
+ if (mem > oldmem + required_bytes)
+ ABORT("set_max_lwps buffer overflow");
+
+ max_lwps = n;
+}
+
+
+/* Stop all lwps in process. Assumes preemption is off. */
+/* Caller has allocation lock (and any other locks he may */
+/* need). */
+static void stop_all_lwps()
+{
+ int lwp_fd;
+ char buf[30];
+ prstatus_t status;
+ register int i;
+ GC_bool changed;
+ lwpid_t me = _lwp_self();
+
+ if (GC_main_proc_fd == -1) {
+ sprintf(buf, "/proc/%d", getpid());
+ GC_main_proc_fd = syscall(SYS_open, buf, O_RDONLY);
+ if (GC_main_proc_fd < 0) {
+ if (errno == EMFILE)
+ ABORT("/proc open failed: too many open files");
+ GC_printf1("/proc open failed: errno %d", errno);
+ abort();
+ }
+ }
+ BZERO(GC_lwp_registers, sizeof (prgregset_t) * max_lwps);
+ for (i = 0; i < max_lwps; i++)
+ last_ids[i] = 0;
+ for (;;) {
+ if (syscall(SYS_ioctl, GC_main_proc_fd, PIOCSTATUS, &status) < 0)
+ ABORT("Main PIOCSTATUS failed");
+ if (status.pr_nlwp < 1)
+ ABORT("Invalid number of lwps returned by PIOCSTATUS");
+ if (status.pr_nlwp >= max_lwps) {
+ set_max_lwps(status.pr_nlwp*2 + 10);
+ /*
+ * The data in the old GC_current_ids and
+ * GC_lwp_registers has been trashed. Cleaning out last_ids
+ * will make sure every LWP gets re-examined.
+ */
+ for (i = 0; i < max_lwps; i++)
+ last_ids[i] = 0;
+ continue;
+ }
+ if (syscall(SYS_ioctl, GC_main_proc_fd, PIOCLWPIDS, GC_current_ids) < 0)
+ ABORT("PIOCLWPIDS failed");
+ changed = FALSE;
+ for (i = 0; GC_current_ids[i] != 0 && i < max_lwps; i++) {
+ if (GC_current_ids[i] != last_ids[i]) {
+ changed = TRUE;
+ if (GC_current_ids[i] != me) {
+ /* PIOCSTOP doesn't work without a writable */
+ /* descriptor. And that makes the process */
+ /* undebuggable. */
+ if (_lwp_suspend(GC_current_ids[i]) < 0) {
+ /* Could happen if the lwp exited */
+ uncache_lwp(GC_current_ids[i]);
+ GC_current_ids[i] = me; /* ignore */
+ }
+ }
+ }
+ }
+ /*
+ * In the unlikely event something does a fork between the
+ * PIOCSTATUS and the PIOCLWPIDS.
+ */
+ if (i >= max_lwps)
+ continue;
+ /* All lwps in GC_current_ids != me have been suspended. Note */
+ /* that _lwp_suspend is idempotent. */
+ for (i = 0; GC_current_ids[i] != 0; i++) {
+ if (GC_current_ids[i] != last_ids[i]) {
+ if (GC_current_ids[i] != me) {
+ lwp_fd = open_lwp(GC_current_ids[i]);
+ if (lwp_fd == -1)
+ {
+ GC_current_ids[i] = me;
+ continue;
+ }
+ /* LWP should be stopped. Empirically it sometimes */
+ /* isn't, and more frequently the PR_STOPPED flag */
+ /* is not set. Wait for PR_STOPPED. */
+ if (syscall(SYS_ioctl, lwp_fd,
+ PIOCSTATUS, &status) < 0) {
+ /* Possible if the descriptor was stale, or */
+ /* we encountered the 2.3 _lwp_suspend bug. */
+ uncache_lwp(GC_current_ids[i]);
+ GC_current_ids[i] = me; /* handle next time. */
+ } else {
+ while (!(status.pr_flags & PR_STOPPED)) {
+ GC_msec_sleep(1);
+ if (syscall(SYS_ioctl, lwp_fd,
+ PIOCSTATUS, &status) < 0) {
+ ABORT("Repeated PIOCSTATUS failed");
+ }
+ if (status.pr_flags & PR_STOPPED) break;
+
+ GC_msec_sleep(20);
+ if (syscall(SYS_ioctl, lwp_fd,
+ PIOCSTATUS, &status) < 0) {
+ ABORT("Repeated PIOCSTATUS failed");
+ }
+ }
+ if (status.pr_who != GC_current_ids[i]) {
+ /* can happen if thread was on death row */
+ uncache_lwp(GC_current_ids[i]);
+ GC_current_ids[i] = me; /* handle next time. */
+ continue;
+ }
+ /* Save registers where collector can */
+ /* find them. */
+ BCOPY(status.pr_reg, GC_lwp_registers[i],
+ sizeof (prgregset_t));
+ }
+ }
+ }
+ }
+ if (!changed) break;
+ for (i = 0; i < max_lwps; i++) last_ids[i] = GC_current_ids[i];
+ }
+}
+
+/* Restart all lwps in process. Assumes preemption is off. */
+static void restart_all_lwps()
+{
+ int lwp_fd;
+ register int i;
+ GC_bool changed;
+ lwpid_t me = _lwp_self();
+# define PARANOID
+
+ for (i = 0; GC_current_ids[i] != 0; i++) {
+# ifdef PARANOID
+ if (GC_current_ids[i] != me) {
+ int lwp_fd = open_lwp(GC_current_ids[i]);
+ prstatus_t status;
+
+ if (lwp_fd < 0) ABORT("open_lwp failed");
+ if (syscall(SYS_ioctl, lwp_fd,
+ PIOCSTATUS, &status) < 0) {
+ ABORT("PIOCSTATUS failed in restart_all_lwps");
+ }
+ if (memcmp(status.pr_reg, GC_lwp_registers[i],
+ sizeof (prgregset_t)) != 0) {
+ int j;
+
+ for(j = 0; j < NGREG; j++)
+ {
+ GC_printf3("%i: %x -> %x\n", j,
+ GC_lwp_registers[i][j],
+ status.pr_reg[j]);
+ }
+ ABORT("Register contents changed");
+ }
+ if (!status.pr_flags & PR_STOPPED) {
+ ABORT("lwp no longer stopped");
+ }
+#ifdef SPARC
+ {
+ gwindows_t windows;
+ if (syscall(SYS_ioctl, lwp_fd,
+ PIOCGWIN, &windows) < 0) {
+ ABORT("PIOCSTATUS failed in restart_all_lwps");
+ }
+ if (windows.wbcnt > 0) ABORT("unsaved register windows");
+ }
+#endif
+ }
+# endif /* PARANOID */
+ if (GC_current_ids[i] == me) continue;
+ if (_lwp_continue(GC_current_ids[i]) < 0) {
+ ABORT("Failed to restart lwp");
+ }
+ }
+ if (i >= max_lwps) ABORT("Too many lwps");
+}
+
+GC_bool GC_multithreaded = 0;
+
+void GC_stop_world()
+{
+ preempt_off();
+ if (GC_multithreaded)
+ stop_all_lwps();
+}
+
+void GC_start_world()
+{
+ if (GC_multithreaded)
+ restart_all_lwps();
+ preempt_on();
+}
+
+void GC_thr_init(void);
+
+GC_bool GC_thr_initialized = FALSE;
+
+size_t GC_min_stack_sz;
+
+size_t GC_page_sz;
+
+/*
+ * stack_head is stored at the top of free stacks
+ */
+struct stack_head {
+ struct stack_head *next;
+ ptr_t base;
+ thread_t owner;
+};
+
+# define N_FREE_LISTS 25
+struct stack_head *GC_stack_free_lists[N_FREE_LISTS] = { 0 };
+ /* GC_stack_free_lists[i] is free list for stacks of */
+ /* size GC_min_stack_sz*2**i. */
+ /* Free lists are linked through stack_head stored */ /* at top of stack. */
+
+/* Return a stack of size at least *stack_size. *stack_size is */
+/* replaced by the actual stack size. */
+/* Caller holds allocation lock. */
+ptr_t GC_stack_alloc(size_t * stack_size)
+{
+ register size_t requested_sz = *stack_size;
+ register size_t search_sz = GC_min_stack_sz;
+ register int index = 0; /* = log2(search_sz/GC_min_stack_sz) */
+ register ptr_t base;
+ register struct stack_head *result;
+
+ while (search_sz < requested_sz) {
+ search_sz *= 2;
+ index++;
+ }
+ if ((result = GC_stack_free_lists[index]) == 0
+ && (result = GC_stack_free_lists[index+1]) != 0) {
+ /* Try next size up. */
+ search_sz *= 2; index++;
+ }
+ if (result != 0) {
+ base = GC_stack_free_lists[index]->base;
+ GC_stack_free_lists[index] = GC_stack_free_lists[index]->next;
+ } else {
+#ifdef MMAP_STACKS
+ base = (ptr_t)mmap(0, search_sz + GC_page_sz,
+ PROT_READ|PROT_WRITE, MAP_PRIVATE |MAP_NORESERVE,
+ GC_zfd, 0);
+ if (base == (ptr_t)-1)
+ {
+ *stack_size = 0;
+ return NULL;
+ }
+
+ mprotect(base, GC_page_sz, PROT_NONE);
+ /* Should this use divHBLKSZ(search_sz + GC_page_sz) ? -- cf */
+ GC_is_fresh((struct hblk *)base, divHBLKSZ(search_sz));
+ base += GC_page_sz;
+
+#else
+ base = (ptr_t) GC_scratch_alloc(search_sz + 2*GC_page_sz);
+ if (base == NULL)
+ {
+ *stack_size = 0;
+ return NULL;
+ }
+
+ base = (ptr_t)(((word)base + GC_page_sz) & ~(GC_page_sz - 1));
+ /* Protect hottest page to detect overflow. */
+# ifdef SOLARIS23_MPROTECT_BUG_FIXED
+ mprotect(base, GC_page_sz, PROT_NONE);
+# endif
+ GC_is_fresh((struct hblk *)base, divHBLKSZ(search_sz));
+
+ base += GC_page_sz;
+#endif
+ }
+ *stack_size = search_sz;
+ return(base);
+}
+
+/* Caller holds allocationlock. */
+void GC_stack_free(ptr_t stack, size_t size)
+{
+ register int index = 0;
+ register size_t search_sz = GC_min_stack_sz;
+ register struct stack_head *head;
+
+#ifdef MMAP_STACKS
+ /* Zero pointers */
+ mmap(stack, size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_NORESERVE|MAP_FIXED,
+ GC_zfd, 0);
+#endif
+ while (search_sz < size) {
+ search_sz *= 2;
+ index++;
+ }
+ if (search_sz != size) ABORT("Bad stack size");
+
+ head = (struct stack_head *)(stack + search_sz - sizeof(struct stack_head));
+ head->next = GC_stack_free_lists[index];
+ head->base = stack;
+ GC_stack_free_lists[index] = head;
+}
+
+void GC_my_stack_limits();
+
+/* Notify virtual dirty bit implementation that known empty parts of */
+/* stacks do not contain useful data. */
+/* Caller holds allocation lock. */
+void GC_old_stacks_are_fresh()
+{
+/* No point in doing this for MMAP stacks - and pointers are zero'd out */
+/* by the mmap in GC_stack_free */
+#ifndef MMAP_STACKS
+ register int i;
+ register struct stack_head *s;
+ register ptr_t p;
+ register size_t sz;
+ register struct hblk * h;
+ int dummy;
+
+ for (i = 0, sz= GC_min_stack_sz; i < N_FREE_LISTS;
+ i++, sz *= 2) {
+ for (s = GC_stack_free_lists[i]; s != 0; s = s->next) {
+ p = s->base;
+ h = (struct hblk *)(((word)p + HBLKSIZE-1) & ~(HBLKSIZE-1));
+ if ((ptr_t)h == p) {
+ GC_is_fresh((struct hblk *)p, divHBLKSZ(sz));
+ } else {
+ GC_is_fresh((struct hblk *)p, divHBLKSZ(sz) - 1);
+ BZERO(p, (ptr_t)h - p);
+ }
+ }
+ }
+#endif /* MMAP_STACKS */
+ GC_my_stack_limits();
+}
+
+/* The set of all known threads. We intercept thread creation and */
+/* joins. We never actually create detached threads. We allocate all */
+/* new thread stacks ourselves. These allow us to maintain this */
+/* data structure. */
+
+# define THREAD_TABLE_SZ 128 /* Must be power of 2 */
+volatile GC_thread GC_threads[THREAD_TABLE_SZ];
+
+/* Add a thread to GC_threads. We assume it wasn't already there. */
+/* Caller holds allocation lock. */
+GC_thread GC_new_thread(thread_t id)
+{
+ int hv = ((word)id) % THREAD_TABLE_SZ;
+ GC_thread result;
+ static struct GC_Thread_Rep first_thread;
+ static GC_bool first_thread_used = FALSE;
+
+ if (!first_thread_used) {
+ result = &first_thread;
+ first_thread_used = TRUE;
+ /* Dont acquire allocation lock, since we may already hold it. */
+ } else {
+ result = (struct GC_Thread_Rep *)
+ GC_generic_malloc_inner(sizeof(struct GC_Thread_Rep), NORMAL);
+ }
+ if (result == 0) return(0);
+ result -> id = id;
+ result -> next = GC_threads[hv];
+ GC_threads[hv] = result;
+ /* result -> finished = 0; */
+ (void) cond_init(&(result->join_cv), USYNC_THREAD, 0);
+ return(result);
+}
+
+/* Delete a thread from GC_threads. We assume it is there. */
+/* (The code intentionally traps if it wasn't.) */
+/* Caller holds allocation lock. */
+void GC_delete_thread(thread_t id)
+{
+ int hv = ((word)id) % THREAD_TABLE_SZ;
+ register GC_thread p = GC_threads[hv];
+ register GC_thread prev = 0;
+
+ while (p -> id != id) {
+ prev = p;
+ p = p -> next;
+ }
+ if (prev == 0) {
+ GC_threads[hv] = p -> next;
+ } else {
+ prev -> next = p -> next;
+ }
+}
+
+/* Return the GC_thread correpsonding to a given thread_t. */
+/* Returns 0 if it's not there. */
+/* Caller holds allocation lock. */
+GC_thread GC_lookup_thread(thread_t id)
+{
+ int hv = ((word)id) % THREAD_TABLE_SZ;
+ register GC_thread p = GC_threads[hv];
+
+ while (p != 0 && p -> id != id) p = p -> next;
+ return(p);
+}
+
+/* Notify dirty bit implementation of unused parts of my stack. */
+/* Caller holds allocation lock. */
+void GC_my_stack_limits()
+{
+ int dummy;
+ register ptr_t hottest = (ptr_t)((word)(&dummy) & ~(HBLKSIZE-1));
+ register GC_thread me = GC_lookup_thread(thr_self());
+ register size_t stack_size = me -> stack_size;
+ register ptr_t stack;
+
+ if (stack_size == 0) {
+ /* original thread */
+ struct rlimit rl;
+
+ if (getrlimit(RLIMIT_STACK, &rl) != 0) ABORT("getrlimit failed");
+ /* Empirically, what should be the stack page with lowest */
+ /* address is actually inaccessible. */
+ stack_size = ((word)rl.rlim_cur & ~(HBLKSIZE-1)) - GC_page_sz;
+ stack = GC_stackbottom - stack_size + GC_page_sz;
+ } else {
+ stack = me -> stack;
+ }
+ if (stack > hottest || stack + stack_size < hottest) {
+ ABORT("sp out of bounds");
+ }
+ GC_is_fresh((struct hblk *)stack, divHBLKSZ(hottest - stack));
+}
+
+
+/* We hold allocation lock. We assume the world is stopped. */
+void GC_push_all_stacks()
+{
+ register int i;
+ register GC_thread p;
+ register ptr_t sp = GC_approx_sp();
+ register ptr_t bottom, top;
+ struct rlimit rl;
+
+# define PUSH(bottom,top) \
+ if (GC_dirty_maintained) { \
+ GC_push_dirty((bottom), (top), GC_page_was_ever_dirty, \
+ GC_push_all_stack); \
+ } else { \
+ GC_push_all_stack((bottom), (top)); \
+ }
+ GC_push_all_stack((ptr_t)GC_lwp_registers,
+ (ptr_t)GC_lwp_registers
+ + max_lwps * sizeof(GC_lwp_registers[0]));
+ for (i = 0; i < THREAD_TABLE_SZ; i++) {
+ for (p = GC_threads[i]; p != 0; p = p -> next) {
+ if (p -> stack_size != 0) {
+ bottom = p -> stack;
+ top = p -> stack + p -> stack_size;
+ } else {
+ /* The original stack. */
+ if (getrlimit(RLIMIT_STACK, &rl) != 0) ABORT("getrlimit failed");
+ bottom = GC_stackbottom - rl.rlim_cur + GC_page_sz;
+ top = GC_stackbottom;
+ }
+ if ((word)sp > (word)bottom && (word)sp < (word)top) bottom = sp;
+ PUSH(bottom, top);
+ }
+ }
+}
+
+
+int GC_is_thread_stack(ptr_t addr)
+{
+ register int i;
+ register GC_thread p;
+ register ptr_t bottom, top;
+ struct rlimit rl;
+
+ for (i = 0; i < THREAD_TABLE_SZ; i++) {
+ for (p = GC_threads[i]; p != 0; p = p -> next) {
+ if (p -> stack_size != 0) {
+ if (p -> stack <= addr &&
+ addr < p -> stack + p -> stack_size)
+ return 1;
+ }
+ }
+ }
+}
+
+/* The only thread that ever really performs a thr_join. */
+void * GC_thr_daemon(void * dummy)
+{
+ void *status;
+ thread_t departed;
+ register GC_thread t;
+ register int i;
+ register int result;
+
+ for(;;) {
+ start:
+ result = thr_join((thread_t)0, &departed, &status);
+ LOCK();
+ if (result != 0) {
+ /* No more threads; wait for create. */
+ for (i = 0; i < THREAD_TABLE_SZ; i++) {
+ for (t = GC_threads[i]; t != 0; t = t -> next) {
+ if (!(t -> flags & (DETACHED | FINISHED))) {
+ UNLOCK();
+ goto start; /* Thread started just before we */
+ /* acquired the lock. */
+ }
+ }
+ }
+ cond_wait(&GC_create_cv, &GC_allocate_ml);
+ UNLOCK();
+ } else {
+ t = GC_lookup_thread(departed);
+ GC_multithreaded--;
+ if (!(t -> flags & CLIENT_OWNS_STACK)) {
+ GC_stack_free(t -> stack, t -> stack_size);
+ }
+ if (t -> flags & DETACHED) {
+ GC_delete_thread(departed);
+ } else {
+ t -> status = status;
+ t -> flags |= FINISHED;
+ cond_signal(&(t -> join_cv));
+ cond_broadcast(&GC_prom_join_cv);
+ }
+ UNLOCK();
+ }
+ }
+}
+
+/* We hold the allocation lock, or caller ensures that 2 instances */
+/* cannot be invoked concurrently. */
+void GC_thr_init(void)
+{
+ GC_thread t;
+ thread_t tid;
+
+ if (GC_thr_initialized)
+ return;
+ GC_thr_initialized = TRUE;
+ GC_min_stack_sz = ((thr_min_stack() + 32*1024 + HBLKSIZE-1)
+ & ~(HBLKSIZE - 1));
+ GC_page_sz = sysconf(_SC_PAGESIZE);
+#ifdef MMAP_STACKS
+ GC_zfd = open("/dev/zero", O_RDONLY);
+ if (GC_zfd == -1)
+ ABORT("Can't open /dev/zero");
+#endif /* MMAP_STACKS */
+ cond_init(&GC_prom_join_cv, USYNC_THREAD, 0);
+ cond_init(&GC_create_cv, USYNC_THREAD, 0);
+ /* Add the initial thread, so we can stop it. */
+ t = GC_new_thread(thr_self());
+ t -> stack_size = 0;
+ t -> flags = DETACHED | CLIENT_OWNS_STACK;
+ if (thr_create(0 /* stack */, 0 /* stack_size */, GC_thr_daemon,
+ 0 /* arg */, THR_DETACHED | THR_DAEMON,
+ &tid /* thread_id */) != 0) {
+ ABORT("Cant fork daemon");
+ }
+ thr_setprio(tid, 126);
+}
+
+/* We acquire the allocation lock to prevent races with */
+/* stopping/starting world. */
+/* This is no more correct than the underlying Solaris 2.X */
+/* implementation. Under 2.3 THIS IS BROKEN. */
+int GC_thr_suspend(thread_t target_thread)
+{
+ GC_thread t;
+ int result;
+
+ LOCK();
+ result = thr_suspend(target_thread);
+ if (result == 0) {
+ t = GC_lookup_thread(target_thread);
+ if (t == 0) ABORT("thread unknown to GC");
+ t -> flags |= SUSPENDED;
+ }
+ UNLOCK();
+ return(result);
+}
+
+int GC_thr_continue(thread_t target_thread)
+{
+ GC_thread t;
+ int result;
+
+ LOCK();
+ result = thr_continue(target_thread);
+ if (result == 0) {
+ t = GC_lookup_thread(target_thread);
+ if (t == 0) ABORT("thread unknown to GC");
+ t -> flags &= ~SUSPENDED;
+ }
+ UNLOCK();
+ return(result);
+}
+
+int GC_thr_join(thread_t wait_for, thread_t *departed, void **status)
+{
+ register GC_thread t;
+ int result = 0;
+
+ LOCK();
+ if (wait_for == 0) {
+ register int i;
+ register GC_bool thread_exists;
+
+ for (;;) {
+ thread_exists = FALSE;
+ for (i = 0; i < THREAD_TABLE_SZ; i++) {
+ for (t = GC_threads[i]; t != 0; t = t -> next) {
+ if (!(t -> flags & DETACHED)) {
+ if (t -> flags & FINISHED) {
+ goto found;
+ }
+ thread_exists = TRUE;
+ }
+ }
+ }
+ if (!thread_exists) {
+ result = ESRCH;
+ goto out;
+ }
+ cond_wait(&GC_prom_join_cv, &GC_allocate_ml);
+ }
+ } else {
+ t = GC_lookup_thread(wait_for);
+ if (t == 0 || t -> flags & DETACHED) {
+ result = ESRCH;
+ goto out;
+ }
+ if (wait_for == thr_self()) {
+ result = EDEADLK;
+ goto out;
+ }
+ while (!(t -> flags & FINISHED)) {
+ cond_wait(&(t -> join_cv), &GC_allocate_ml);
+ }
+
+ }
+ found:
+ if (status) *status = t -> status;
+ if (departed) *departed = t -> id;
+ cond_destroy(&(t -> join_cv));
+ GC_delete_thread(t -> id);
+ out:
+ UNLOCK();
+ return(result);
+}
+
+
+int
+GC_thr_create(void *stack_base, size_t stack_size,
+ void *(*start_routine)(void *), void *arg, long flags,
+ thread_t *new_thread)
+{
+ int result;
+ GC_thread t;
+ thread_t my_new_thread;
+ word my_flags = 0;
+ void * stack = stack_base;
+
+ LOCK();
+ if (!GC_thr_initialized)
+ {
+ GC_thr_init();
+ }
+ GC_multithreaded++;
+ if (stack == 0) {
+ if (stack_size == 0) stack_size = GC_min_stack_sz;
+ stack = (void *)GC_stack_alloc(&stack_size);
+ if (stack == 0) {
+ GC_multithreaded--;
+ UNLOCK();
+ return(ENOMEM);
+ }
+ } else {
+ my_flags |= CLIENT_OWNS_STACK;
+ }
+ if (flags & THR_DETACHED) my_flags |= DETACHED;
+ if (flags & THR_SUSPENDED) my_flags |= SUSPENDED;
+ result = thr_create(stack, stack_size, start_routine,
+ arg, flags & ~THR_DETACHED, &my_new_thread);
+ if (result == 0) {
+ t = GC_new_thread(my_new_thread);
+ t -> flags = my_flags;
+ if (!(my_flags & DETACHED)) cond_init(&(t -> join_cv), USYNC_THREAD, 0);
+ t -> stack = stack;
+ t -> stack_size = stack_size;
+ if (new_thread != 0) *new_thread = my_new_thread;
+ cond_signal(&GC_create_cv);
+ } else {
+ GC_multithreaded--;
+ if (!(my_flags & CLIENT_OWNS_STACK)) {
+ GC_stack_free(stack, stack_size);
+ }
+ }
+ UNLOCK();
+ return(result);
+}
+
+# else /* SOLARIS_THREADS */
+
+#ifndef LINT
+ int GC_no_sunOS_threads;
+#endif
+#endif
diff --git a/boehm-gc/solaris_threads.h b/boehm-gc/solaris_threads.h
new file mode 100644
index 00000000000..b2cdb36e98d
--- /dev/null
+++ b/boehm-gc/solaris_threads.h
@@ -0,0 +1,34 @@
+#ifdef SOLARIS_THREADS
+
+/* The set of all known threads. We intercept thread creation and */
+/* joins. We never actually create detached threads. We allocate all */
+/* new thread stacks ourselves. These allow us to maintain this */
+/* data structure. */
+/* Protected by GC_thr_lock. */
+/* Some of this should be declared volatile, but that's incosnsistent */
+/* with some library routine declarations. In particular, the */
+/* definition of cond_t doesn't mention volatile! */
+ typedef struct GC_Thread_Rep {
+ struct GC_Thread_Rep * next;
+ thread_t id;
+ word flags;
+# define FINISHED 1 /* Thread has exited. */
+# define DETACHED 2 /* Thread is intended to be detached. */
+# define CLIENT_OWNS_STACK 4
+ /* Stack was supplied by client. */
+# define SUSPENDED 8 /* Currently suspended. */
+ ptr_t stack;
+ size_t stack_size;
+ cond_t join_cv;
+ void * status;
+ } * GC_thread;
+ extern GC_thread GC_new_thread(thread_t id);
+
+ extern GC_bool GC_thr_initialized;
+ extern volatile GC_thread GC_threads[];
+ extern size_t GC_min_stack_sz;
+ extern size_t GC_page_sz;
+ extern void GC_thr_init(void);
+
+# endif /* SOLARIS_THREADS */
+
diff --git a/boehm-gc/sparc_mach_dep.s b/boehm-gc/sparc_mach_dep.s
new file mode 100644
index 00000000000..a6a0a241080
--- /dev/null
+++ b/boehm-gc/sparc_mach_dep.s
@@ -0,0 +1,38 @@
+! SPARCompiler 3.0 and later apparently no loner handles
+! asm outside functions. So we need a separate .s file
+! This is only set up for SunOS 5, not SunOS 4.
+! Assumes this is called before the stack contents are
+! examined.
+
+ .seg "text"
+ .globl GC_save_regs_in_stack
+ .globl GC_push_regs
+GC_save_regs_in_stack:
+GC_push_regs:
+ ta 0x3 ! ST_FLUSH_WINDOWS
+ mov %sp,%o0
+ retl
+ nop
+
+ .globl GC_clear_stack_inner
+GC_clear_stack_inner:
+ mov %sp,%o2 ! Save sp
+ add %sp,-8,%o3 ! p = sp-8
+ clr %g1 ! [g0,g1] = 0
+ add %o1,-0x60,%sp ! Move sp out of the way,
+ ! so that traps still work.
+ ! Includes some extra words
+ ! so we can be sloppy below.
+loop:
+ std %g0,[%o3] ! *(long long *)p = 0
+ cmp %o3,%o1
+ bgu loop ! if (p > limit) goto loop
+ add %o3,-8,%o3 ! p -= 8 (delay slot)
+ retl
+ mov %o2,%sp ! Restore sp., delay slot
+
+
+
+
+
+ \ No newline at end of file
diff --git a/boehm-gc/sparc_sunos4_mach_dep.s b/boehm-gc/sparc_sunos4_mach_dep.s
new file mode 100644
index 00000000000..7accadd3dfb
--- /dev/null
+++ b/boehm-gc/sparc_sunos4_mach_dep.s
@@ -0,0 +1,38 @@
+! SPARCompiler 3.0 and later apparently no loner handles
+! asm outside functions. So we need a separate .s file
+! This is only set up for SunOS 4.
+! Assumes this is called before the stack contents are
+! examined.
+
+ .seg "text"
+ .globl _GC_save_regs_in_stack
+ .globl _GC_push_regs
+_GC_save_regs_in_stack:
+_GC_push_regs:
+ ta 0x3 ! ST_FLUSH_WINDOWS
+ mov %sp,%o0
+ retl
+ nop
+
+ .globl _GC_clear_stack_inner
+_GC_clear_stack_inner:
+ mov %sp,%o2 ! Save sp
+ add %sp,-8,%o3 ! p = sp-8
+ clr %g1 ! [g0,g1] = 0
+ add %o1,-0x60,%sp ! Move sp out of the way,
+ ! so that traps still work.
+ ! Includes some extra words
+ ! so we can be sloppy below.
+loop:
+ std %g0,[%o3] ! *(long long *)p = 0
+ cmp %o3,%o1
+ bgu loop ! if (p > limit) goto loop
+ add %o3,-8,%o3 ! p -= 8 (delay slot)
+ retl
+ mov %o2,%sp ! Restore sp., delay slot
+
+
+
+
+
+
diff --git a/boehm-gc/stubborn.c b/boehm-gc/stubborn.c
new file mode 100644
index 00000000000..bef7b98a486
--- /dev/null
+++ b/boehm-gc/stubborn.c
@@ -0,0 +1,317 @@
+/*
+ * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+/* Boehm, July 31, 1995 5:02 pm PDT */
+
+
+#include "gc_priv.h"
+
+# ifdef STUBBORN_ALLOC
+/* Stubborn object (hard to change, nearly immutable) allocation. */
+
+extern ptr_t GC_clear_stack(); /* in misc.c, behaves like identity */
+
+#define GENERAL_MALLOC(lb,k) \
+ (GC_PTR)GC_clear_stack(GC_generic_malloc((word)lb, k))
+
+/* Data structure representing immutable objects that */
+/* are still being initialized. */
+/* This is a bit baroque in order to avoid acquiring */
+/* the lock twice for a typical allocation. */
+
+GC_PTR * GC_changing_list_start;
+
+# ifdef THREADS
+ VOLATILE GC_PTR * VOLATILE GC_changing_list_current;
+# else
+ GC_PTR * GC_changing_list_current;
+# endif
+ /* Points at last added element. Also (ab)used for */
+ /* synchronization. Updates and reads are assumed atomic. */
+
+GC_PTR * GC_changing_list_limit;
+ /* Points at the last word of the buffer, which is always 0 */
+ /* All entries in (GC_changing_list_current, */
+ /* GC_changing_list_limit] are 0 */
+
+
+void GC_stubborn_init()
+{
+# define INIT_SIZE 10
+
+ GC_changing_list_start = (GC_PTR *)
+ GC_generic_malloc_inner(
+ (word)(INIT_SIZE * sizeof(GC_PTR)),
+ PTRFREE);
+ BZERO(GC_changing_list_start,
+ INIT_SIZE * sizeof(GC_PTR));
+ if (GC_changing_list_start == 0) {
+ GC_err_printf0("Insufficient space to start up\n");
+ ABORT("GC_stubborn_init: put of space");
+ }
+ GC_changing_list_current = GC_changing_list_start;
+ GC_changing_list_limit = GC_changing_list_start + INIT_SIZE - 1;
+ * GC_changing_list_limit = 0;
+}
+
+/* Compact and possibly grow GC_uninit_list. The old copy is */
+/* left alone. Lock must be held. */
+/* When called GC_changing_list_current == GC_changing_list_limit */
+/* which is one past the current element. */
+/* When we finish GC_changing_list_current again points one past last */
+/* element. */
+/* Invariant while this is running: GC_changing_list_current */
+/* points at a word containing 0. */
+/* Returns FALSE on failure. */
+GC_bool GC_compact_changing_list()
+{
+ register GC_PTR *p, *q;
+ register word count = 0;
+ word old_size = (char **)GC_changing_list_limit
+ - (char **)GC_changing_list_start+1;
+ /* The casts are needed as a workaround for an Amiga bug */
+ register word new_size = old_size;
+ GC_PTR * new_list;
+
+ for (p = GC_changing_list_start; p < GC_changing_list_limit; p++) {
+ if (*p != 0) count++;
+ }
+ if (2 * count > old_size) new_size = 2 * count;
+ new_list = (GC_PTR *)
+ GC_generic_malloc_inner(
+ new_size * sizeof(GC_PTR), PTRFREE);
+ /* PTRFREE is a lie. But we don't want the collector to */
+ /* consider these. We do want the list itself to be */
+ /* collectable. */
+ if (new_list == 0) return(FALSE);
+ BZERO(new_list, new_size * sizeof(GC_PTR));
+ q = new_list;
+ for (p = GC_changing_list_start; p < GC_changing_list_limit; p++) {
+ if (*p != 0) *q++ = *p;
+ }
+ GC_changing_list_start = new_list;
+ GC_changing_list_limit = new_list + new_size - 1;
+ GC_changing_list_current = q;
+ return(TRUE);
+}
+
+/* Add p to changing list. Clear p on failure. */
+# define ADD_CHANGING(p) \
+ { \
+ register struct hblk * h = HBLKPTR(p); \
+ register word index = PHT_HASH(h); \
+ \
+ set_pht_entry_from_index(GC_changed_pages, index); \
+ } \
+ if (*GC_changing_list_current != 0 \
+ && ++GC_changing_list_current == GC_changing_list_limit) { \
+ if (!GC_compact_changing_list()) (p) = 0; \
+ } \
+ *GC_changing_list_current = p;
+
+void GC_change_stubborn(p)
+GC_PTR p;
+{
+ DCL_LOCK_STATE;
+
+ DISABLE_SIGNALS();
+ LOCK();
+ ADD_CHANGING(p);
+ UNLOCK();
+ ENABLE_SIGNALS();
+}
+
+void GC_end_stubborn_change(p)
+GC_PTR p;
+{
+# ifdef THREADS
+ register VOLATILE GC_PTR * my_current = GC_changing_list_current;
+# else
+ register GC_PTR * my_current = GC_changing_list_current;
+# endif
+ register GC_bool tried_quick;
+ DCL_LOCK_STATE;
+
+ if (*my_current == p) {
+ /* Hopefully the normal case. */
+ /* Compaction could not have been running when we started. */
+ *my_current = 0;
+# ifdef THREADS
+ if (my_current == GC_changing_list_current) {
+ /* Compaction can't have run in the interim. */
+ /* We got away with the quick and dirty approach. */
+ return;
+ }
+ tried_quick = TRUE;
+# else
+ return;
+# endif
+ } else {
+ tried_quick = FALSE;
+ }
+ DISABLE_SIGNALS();
+ LOCK();
+ my_current = GC_changing_list_current;
+ for (; my_current >= GC_changing_list_start; my_current--) {
+ if (*my_current == p) {
+ *my_current = 0;
+ UNLOCK();
+ ENABLE_SIGNALS();
+ return;
+ }
+ }
+ if (!tried_quick) {
+ GC_err_printf1("Bad arg to GC_end_stubborn_change: 0x%lx\n",
+ (unsigned long)p);
+ ABORT("Bad arg to GC_end_stubborn_change");
+ }
+ UNLOCK();
+ ENABLE_SIGNALS();
+}
+
+/* Allocate lb bytes of composite (pointerful) data */
+/* No pointer fields may be changed after a call to */
+/* GC_end_stubborn_change(p) where p is the value */
+/* returned by GC_malloc_stubborn. */
+# ifdef __STDC__
+ GC_PTR GC_malloc_stubborn(size_t lb)
+# else
+ GC_PTR GC_malloc_stubborn(lb)
+ size_t lb;
+# endif
+{
+register ptr_t op;
+register ptr_t *opp;
+register word lw;
+ptr_t result;
+DCL_LOCK_STATE;
+
+ if( SMALL_OBJ(lb) ) {
+# ifdef MERGE_SIZES
+ lw = GC_size_map[lb];
+# else
+ lw = ALIGNED_WORDS(lb);
+# endif
+ opp = &(GC_sobjfreelist[lw]);
+ FASTLOCK();
+ if( !FASTLOCK_SUCCEEDED() || (op = *opp) == 0 ) {
+ FASTUNLOCK();
+ result = GC_generic_malloc((word)lb, STUBBORN);
+ goto record;
+ }
+ *opp = obj_link(op);
+ obj_link(op) = 0;
+ GC_words_allocd += lw;
+ result = (GC_PTR) op;
+ ADD_CHANGING(result);
+ FASTUNLOCK();
+ return((GC_PTR)result);
+ } else {
+ result = (GC_PTR)
+ GC_generic_malloc((word)lb, STUBBORN);
+ }
+record:
+ DISABLE_SIGNALS();
+ LOCK();
+ ADD_CHANGING(result);
+ UNLOCK();
+ ENABLE_SIGNALS();
+ return((GC_PTR)GC_clear_stack(result));
+}
+
+
+/* Functions analogous to GC_read_dirty and GC_page_was_dirty. */
+/* Report pages on which stubborn objects were changed. */
+void GC_read_changed()
+{
+ register GC_PTR * p = GC_changing_list_start;
+ register GC_PTR q;
+ register struct hblk * h;
+ register word index;
+
+ if (p == 0) /* initializing */ return;
+ BCOPY(GC_changed_pages, GC_prev_changed_pages,
+ (sizeof GC_changed_pages));
+ BZERO(GC_changed_pages, (sizeof GC_changed_pages));
+ for (; p <= GC_changing_list_current; p++) {
+ if ((q = *p) != 0) {
+ h = HBLKPTR(q);
+ index = PHT_HASH(h);
+ set_pht_entry_from_index(GC_changed_pages, index);
+ }
+ }
+}
+
+GC_bool GC_page_was_changed(h)
+struct hblk * h;
+{
+ register word index = PHT_HASH(h);
+
+ return(get_pht_entry_from_index(GC_prev_changed_pages, index));
+}
+
+/* Remove unreachable entries from changed list. Should only be */
+/* called with mark bits consistent and lock held. */
+void GC_clean_changing_list()
+{
+ register GC_PTR * p = GC_changing_list_start;
+ register GC_PTR q;
+ register ptr_t r;
+ register unsigned long count = 0;
+ register unsigned long dropped_count = 0;
+
+ if (p == 0) /* initializing */ return;
+ for (; p <= GC_changing_list_current; p++) {
+ if ((q = *p) != 0) {
+ count++;
+ r = (ptr_t)GC_base(q);
+ if (r == 0 || !GC_is_marked(r)) {
+ *p = 0;
+ dropped_count++;
+ }
+ }
+ }
+# ifdef PRINTSTATS
+ if (count > 0) {
+ GC_printf2("%lu entries in changing list: reclaimed %lu\n",
+ (unsigned long)count, (unsigned long)dropped_count);
+ }
+# endif
+}
+
+#else /* !STUBBORN_ALLOC */
+
+# ifdef __STDC__
+ GC_PTR GC_malloc_stubborn(size_t lb)
+# else
+ GC_PTR GC_malloc_stubborn(lb)
+ size_t lb;
+# endif
+{
+ return(GC_malloc(lb));
+}
+
+/*ARGSUSED*/
+void GC_end_stubborn_change(p)
+GC_PTR p;
+{
+}
+
+/*ARGSUSED*/
+void GC_change_stubborn(p)
+GC_PTR p;
+{
+}
+
+
+#endif
diff --git a/boehm-gc/test.c b/boehm-gc/test.c
new file mode 100644
index 00000000000..2fc51e12ed7
--- /dev/null
+++ b/boehm-gc/test.c
@@ -0,0 +1,1152 @@
+/*
+ * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ * Copyright (c) 1996 by Silicon Graphics. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ */
+/* An incomplete test for the garbage collector. */
+/* Some more obscure entry points are not tested at all. */
+
+# if defined(mips) && defined(SYSTYPE_BSD43)
+ /* MIPS RISCOS 4 */
+# else
+# include <stdlib.h>
+# endif
+# include <stdio.h>
+# include <assert.h> /* Not normally used, but handy for debugging. */
+# include "gc.h"
+# include "gc_typed.h"
+# include "gc_priv.h" /* For output, locking, and some statistics */
+# include "config.h"
+
+# ifdef MSWIN32
+# include <windows.h>
+# endif
+
+# ifdef PCR
+# include "th/PCR_ThCrSec.h"
+# include "th/PCR_Th.h"
+# undef GC_printf0
+# define GC_printf0 printf
+# undef GC_printf1
+# define GC_printf1 printf
+# endif
+
+# ifdef SOLARIS_THREADS
+# include <thread.h>
+# include <synch.h>
+# endif
+
+# if defined(IRIX_THREADS) || defined(LINUX_THREADS)
+# include <pthread.h>
+# endif
+
+# ifdef WIN32_THREADS
+# include <process.h>
+ static CRITICAL_SECTION incr_cs;
+# endif
+# if defined(PCR) || defined(SOLARIS_THREADS) || defined(WIN32_THREADS)
+# define THREADS
+# endif
+
+# ifdef AMIGA
+ long __stack = 200000;
+# endif
+
+# define FAIL (void)abort()
+
+/* AT_END may be defined to excercise the interior pointer test */
+/* if the collector is configured with ALL_INTERIOR_POINTERS. */
+/* As it stands, this test should succeed with either */
+/* configuration. In the FIND_LEAK configuration, it should */
+/* find lots of leaks, since we free almost nothing. */
+
+struct SEXPR {
+ struct SEXPR * sexpr_car;
+ struct SEXPR * sexpr_cdr;
+};
+
+
+typedef struct SEXPR * sexpr;
+
+# define INT_TO_SEXPR(x) ((sexpr)(unsigned long)(x))
+
+# undef nil
+# define nil (INT_TO_SEXPR(0))
+# define car(x) ((x) -> sexpr_car)
+# define cdr(x) ((x) -> sexpr_cdr)
+# define is_nil(x) ((x) == nil)
+
+
+int extra_count = 0; /* Amount of space wasted in cons node */
+
+/* Silly implementation of Lisp cons. Intentionally wastes lots of space */
+/* to test collector. */
+sexpr cons (x, y)
+sexpr x;
+sexpr y;
+{
+ register sexpr r;
+ register int *p;
+ register int my_extra = extra_count;
+
+ r = (sexpr) GC_MALLOC_STUBBORN(sizeof(struct SEXPR) + my_extra);
+ if (r == 0) {
+ (void)GC_printf0("Out of memory\n");
+ exit(1);
+ }
+ for (p = (int *)r;
+ ((char *)p) < ((char *)r) + my_extra + sizeof(struct SEXPR); p++) {
+ if (*p) {
+ (void)GC_printf1("Found nonzero at 0x%lx - allocator is broken\n",
+ (unsigned long)p);
+ FAIL;
+ }
+ *p = 13;
+ }
+# ifdef AT_END
+ r = (sexpr)((char *)r + (my_extra & ~7));
+# endif
+ r -> sexpr_car = x;
+ r -> sexpr_cdr = y;
+ my_extra++;
+ if ( my_extra >= 5000 ) {
+ extra_count = 0;
+ } else {
+ extra_count = my_extra;
+ }
+ GC_END_STUBBORN_CHANGE((char *)r);
+ return(r);
+}
+
+sexpr small_cons (x, y)
+sexpr x;
+sexpr y;
+{
+ register sexpr r;
+
+ r = (sexpr) GC_MALLOC(sizeof(struct SEXPR));
+ if (r == 0) {
+ (void)GC_printf0("Out of memory\n");
+ exit(1);
+ }
+ r -> sexpr_car = x;
+ r -> sexpr_cdr = y;
+ return(r);
+}
+
+sexpr small_cons_uncollectable (x, y)
+sexpr x;
+sexpr y;
+{
+ register sexpr r;
+
+ r = (sexpr) GC_MALLOC_UNCOLLECTABLE(sizeof(struct SEXPR));
+assert(GC_is_marked(r));
+ if (r == 0) {
+ (void)GC_printf0("Out of memory\n");
+ exit(1);
+ }
+ r -> sexpr_car = x;
+ r -> sexpr_cdr = (sexpr)(~(unsigned long)y);
+ return(r);
+}
+
+/* Return reverse(x) concatenated with y */
+sexpr reverse1(x, y)
+sexpr x, y;
+{
+ if (is_nil(x)) {
+ return(y);
+ } else {
+ return( reverse1(cdr(x), cons(car(x), y)) );
+ }
+}
+
+sexpr reverse(x)
+sexpr x;
+{
+ return( reverse1(x, nil) );
+}
+
+sexpr ints(low, up)
+int low, up;
+{
+ if (low > up) {
+ return(nil);
+ } else {
+ return(small_cons(small_cons(INT_TO_SEXPR(low), nil), ints(low+1, up)));
+ }
+}
+
+/* To check uncollectable allocation we build lists with disguised cdr */
+/* pointers, and make sure they don't go away. */
+sexpr uncollectable_ints(low, up)
+int low, up;
+{
+ if (low > up) {
+ return(nil);
+ } else {
+ return(small_cons_uncollectable(small_cons(INT_TO_SEXPR(low), nil),
+ uncollectable_ints(low+1, up)));
+ }
+}
+
+void check_ints(list, low, up)
+sexpr list;
+int low, up;
+{
+ if ((int)(GC_word)(car(car(list))) != low) {
+ (void)GC_printf0(
+ "List reversal produced incorrect list - collector is broken\n");
+ FAIL;
+ }
+ if (low == up) {
+ if (cdr(list) != nil) {
+ (void)GC_printf0("List too long - collector is broken\n");
+ FAIL;
+ }
+ } else {
+ check_ints(cdr(list), low+1, up);
+ }
+}
+
+# define UNCOLLECTABLE_CDR(x) (sexpr)(~(unsigned long)(cdr(x)))
+
+void check_uncollectable_ints(list, low, up)
+sexpr list;
+int low, up;
+{
+assert(GC_is_marked(list));
+ if ((int)(GC_word)(car(car(list))) != low) {
+ (void)GC_printf0(
+ "Uncollectable list corrupted - collector is broken\n");
+ FAIL;
+ }
+ if (low == up) {
+ if (UNCOLLECTABLE_CDR(list) != nil) {
+ (void)GC_printf0("Uncollectable list too long - collector is broken\n");
+ FAIL;
+ }
+ } else {
+ check_uncollectable_ints(UNCOLLECTABLE_CDR(list), low+1, up);
+ }
+}
+
+/* Not used, but useful for debugging: */
+void print_int_list(x)
+sexpr x;
+{
+ if (is_nil(x)) {
+ (void)GC_printf0("NIL\n");
+ } else {
+ (void)GC_printf1("(%ld)", (long)(car(car(x))));
+ if (!is_nil(cdr(x))) {
+ (void)GC_printf0(", ");
+ (void)print_int_list(cdr(x));
+ } else {
+ (void)GC_printf0("\n");
+ }
+ }
+}
+
+/* Try to force a to be strangely aligned */
+struct {
+ char dummy;
+ sexpr aa;
+} A;
+#define a A.aa
+
+/*
+ * Repeatedly reverse lists built out of very different sized cons cells.
+ * Check that we didn't lose anything.
+ */
+void reverse_test()
+{
+ int i;
+ sexpr b;
+ sexpr c;
+ sexpr d;
+ sexpr e;
+ sexpr *f, *g, *h;
+# if defined(MSWIN32) || defined(MACOS)
+ /* Win32S only allows 128K stacks */
+# define BIG 1000
+# else
+# if defined PCR
+ /* PCR default stack is 100K. Stack frames are up to 120 bytes. */
+# define BIG 700
+# else
+# define BIG 4500
+# endif
+# endif
+
+ A.dummy = 17;
+ a = ints(1, 49);
+ b = ints(1, 50);
+ c = ints(1, BIG);
+ d = uncollectable_ints(1, 100);
+ e = uncollectable_ints(1, 1);
+ /* Check that realloc updates object descriptors correctly */
+ f = (sexpr *)GC_malloc(4 * sizeof(sexpr));
+ f = (sexpr *)GC_realloc((GC_PTR)f, 6 * sizeof(sexpr));
+ f[5] = ints(1,17);
+ g = (sexpr *)GC_malloc(513 * sizeof(sexpr));
+ g = (sexpr *)GC_realloc((GC_PTR)g, 800 * sizeof(sexpr));
+ g[799] = ints(1,18);
+ h = (sexpr *)GC_malloc(1025 * sizeof(sexpr));
+ h = (sexpr *)GC_realloc((GC_PTR)h, 2000 * sizeof(sexpr));
+ h[1999] = ints(1,19);
+ /* Try to force some collections and reuse of small list elements */
+ for (i = 0; i < 10; i++) {
+ (void)ints(1, BIG);
+ }
+ /* Superficially test interior pointer recognition on stack */
+ c = (sexpr)((char *)c + sizeof(char *));
+ d = (sexpr)((char *)d + sizeof(char *));
+
+# ifdef __STDC__
+ GC_FREE((void *)e);
+# else
+ GC_FREE((char *)e);
+# endif
+ check_ints(b,1,50);
+ check_ints(a,1,49);
+ for (i = 0; i < 50; i++) {
+ check_ints(b,1,50);
+ b = reverse(reverse(b));
+ }
+ check_ints(b,1,50);
+ check_ints(a,1,49);
+ for (i = 0; i < 60; i++) {
+ /* This maintains the invariant that a always points to a list of */
+ /* 49 integers. Thus this is thread safe without locks, */
+ /* assuming atomic pointer assignments. */
+ a = reverse(reverse(a));
+# if !defined(AT_END) && !defined(THREADS)
+ /* This is not thread safe, since realloc explicitly deallocates */
+ if (i & 1) {
+ a = (sexpr)GC_REALLOC((GC_PTR)a, 500);
+ } else {
+ a = (sexpr)GC_REALLOC((GC_PTR)a, 8200);
+ }
+# endif
+ }
+ check_ints(a,1,49);
+ check_ints(b,1,50);
+ c = (sexpr)((char *)c - sizeof(char *));
+ d = (sexpr)((char *)d - sizeof(char *));
+ check_ints(c,1,BIG);
+ check_uncollectable_ints(d, 1, 100);
+ check_ints(f[5], 1,17);
+ check_ints(g[799], 1,18);
+ check_ints(h[1999], 1,19);
+# ifndef THREADS
+ a = 0;
+# endif
+ b = c = 0;
+}
+
+/*
+ * The rest of this builds balanced binary trees, checks that they don't
+ * disappear, and tests finalization.
+ */
+typedef struct treenode {
+ int level;
+ struct treenode * lchild;
+ struct treenode * rchild;
+} tn;
+
+int finalizable_count = 0;
+int finalized_count = 0;
+VOLATILE int dropped_something = 0;
+
+# ifdef __STDC__
+ void finalizer(void * obj, void * client_data)
+# else
+ void finalizer(obj, client_data)
+ char * obj;
+ char * client_data;
+# endif
+{
+ tn * t = (tn *)obj;
+
+# ifdef PCR
+ PCR_ThCrSec_EnterSys();
+# endif
+# ifdef SOLARIS_THREADS
+ static mutex_t incr_lock;
+ mutex_lock(&incr_lock);
+# endif
+# if defined(IRIX_THREADS) || defined(LINUX_THREADS)
+ static pthread_mutex_t incr_lock = PTHREAD_MUTEX_INITIALIZER;
+ pthread_mutex_lock(&incr_lock);
+# endif
+# ifdef WIN32_THREADS
+ EnterCriticalSection(&incr_cs);
+# endif
+ if ((int)(GC_word)client_data != t -> level) {
+ (void)GC_printf0("Wrong finalization data - collector is broken\n");
+ FAIL;
+ }
+ finalized_count++;
+# ifdef PCR
+ PCR_ThCrSec_ExitSys();
+# endif
+# ifdef SOLARIS_THREADS
+ mutex_unlock(&incr_lock);
+# endif
+# if defined(IRIX_THREADS) || defined(LINUX_THREADS)
+ pthread_mutex_unlock(&incr_lock);
+# endif
+# ifdef WIN32_THREADS
+ LeaveCriticalSection(&incr_cs);
+# endif
+}
+
+size_t counter = 0;
+
+# define MAX_FINALIZED 8000
+
+# if !defined(MACOS)
+ GC_FAR GC_word live_indicators[MAX_FINALIZED] = {0};
+#else
+ /* Too big for THINK_C. have to allocate it dynamically. */
+ GC_word *live_indicators = 0;
+#endif
+
+int live_indicators_count = 0;
+
+tn * mktree(n)
+int n;
+{
+ tn * result = (tn *)GC_MALLOC(sizeof(tn));
+
+#if defined(MACOS)
+ /* get around static data limitations. */
+ if (!live_indicators)
+ live_indicators =
+ (GC_word*)NewPtrClear(MAX_FINALIZED * sizeof(GC_word));
+ if (!live_indicators) {
+ (void)GC_printf0("Out of memory\n");
+ exit(1);
+ }
+#endif
+ if (n == 0) return(0);
+ if (result == 0) {
+ (void)GC_printf0("Out of memory\n");
+ exit(1);
+ }
+ result -> level = n;
+ result -> lchild = mktree(n-1);
+ result -> rchild = mktree(n-1);
+ if (counter++ % 17 == 0 && n >= 2) {
+ tn * tmp = result -> lchild -> rchild;
+
+ result -> lchild -> rchild = result -> rchild -> lchild;
+ result -> rchild -> lchild = tmp;
+ }
+ if (counter++ % 119 == 0) {
+ int my_index;
+
+ {
+# ifdef PCR
+ PCR_ThCrSec_EnterSys();
+# endif
+# ifdef SOLARIS_THREADS
+ static mutex_t incr_lock;
+ mutex_lock(&incr_lock);
+# endif
+# if defined(IRIX_THREADS) || defined(LINUX_THREADS)
+ static pthread_mutex_t incr_lock = PTHREAD_MUTEX_INITIALIZER;
+ pthread_mutex_lock(&incr_lock);
+# endif
+# ifdef WIN32_THREADS
+ EnterCriticalSection(&incr_cs);
+# endif
+ /* Losing a count here causes erroneous report of failure. */
+ finalizable_count++;
+ my_index = live_indicators_count++;
+# ifdef PCR
+ PCR_ThCrSec_ExitSys();
+# endif
+# ifdef SOLARIS_THREADS
+ mutex_unlock(&incr_lock);
+# endif
+# if defined(IRIX_THREADS) || defined(LINUX_THREADS)
+ pthread_mutex_unlock(&incr_lock);
+# endif
+# ifdef WIN32_THREADS
+ LeaveCriticalSection(&incr_cs);
+# endif
+ }
+
+ GC_REGISTER_FINALIZER((GC_PTR)result, finalizer, (GC_PTR)(GC_word)n,
+ (GC_finalization_proc *)0, (GC_PTR *)0);
+ if (my_index >= MAX_FINALIZED) {
+ GC_printf0("live_indicators overflowed\n");
+ FAIL;
+ }
+ live_indicators[my_index] = 13;
+ if (GC_GENERAL_REGISTER_DISAPPEARING_LINK(
+ (GC_PTR *)(&(live_indicators[my_index])),
+ (GC_PTR)result) != 0) {
+ GC_printf0("GC_general_register_disappearing_link failed\n");
+ FAIL;
+ }
+ if (GC_unregister_disappearing_link(
+ (GC_PTR *)
+ (&(live_indicators[my_index]))) == 0) {
+ GC_printf0("GC_unregister_disappearing_link failed\n");
+ FAIL;
+ }
+ if (GC_GENERAL_REGISTER_DISAPPEARING_LINK(
+ (GC_PTR *)(&(live_indicators[my_index])),
+ (GC_PTR)result) != 0) {
+ GC_printf0("GC_general_register_disappearing_link failed 2\n");
+ FAIL;
+ }
+ }
+ return(result);
+}
+
+void chktree(t,n)
+tn *t;
+int n;
+{
+ if (n == 0 && t != 0) {
+ (void)GC_printf0("Clobbered a leaf - collector is broken\n");
+ FAIL;
+ }
+ if (n == 0) return;
+ if (t -> level != n) {
+ (void)GC_printf1("Lost a node at level %lu - collector is broken\n",
+ (unsigned long)n);
+ FAIL;
+ }
+ if (counter++ % 373 == 0) (void) GC_MALLOC(counter%5001);
+ chktree(t -> lchild, n-1);
+ if (counter++ % 73 == 0) (void) GC_MALLOC(counter%373);
+ chktree(t -> rchild, n-1);
+}
+
+# ifdef SOLARIS_THREADS
+thread_key_t fl_key;
+
+void * alloc8bytes()
+{
+# ifdef SMALL_CONFIG
+ return(GC_malloc(8));
+# else
+ void ** my_free_list_ptr;
+ void * my_free_list;
+
+ if (thr_getspecific(fl_key, (void **)(&my_free_list_ptr)) != 0) {
+ (void)GC_printf0("thr_getspecific failed\n");
+ FAIL;
+ }
+ if (my_free_list_ptr == 0) {
+ my_free_list_ptr = GC_NEW_UNCOLLECTABLE(void *);
+ if (thr_setspecific(fl_key, my_free_list_ptr) != 0) {
+ (void)GC_printf0("thr_setspecific failed\n");
+ FAIL;
+ }
+ }
+ my_free_list = *my_free_list_ptr;
+ if (my_free_list == 0) {
+ my_free_list = GC_malloc_many(8);
+ if (my_free_list == 0) {
+ (void)GC_printf0("alloc8bytes out of memory\n");
+ FAIL;
+ }
+ }
+ *my_free_list_ptr = GC_NEXT(my_free_list);
+ GC_NEXT(my_free_list) = 0;
+ return(my_free_list);
+# endif
+}
+
+#else
+# define alloc8bytes() GC_MALLOC_ATOMIC(8)
+#endif
+
+void alloc_small(n)
+int n;
+{
+ register int i;
+
+ for (i = 0; i < n; i += 8) {
+ if (alloc8bytes() == 0) {
+ (void)GC_printf0("Out of memory\n");
+ FAIL;
+ }
+ }
+}
+
+# if defined(THREADS) && defined(GC_DEBUG)
+# define TREE_HEIGHT 15
+# else
+# define TREE_HEIGHT 16
+# endif
+void tree_test()
+{
+ tn * root;
+ register int i;
+
+ root = mktree(TREE_HEIGHT);
+ alloc_small(5000000);
+ chktree(root, TREE_HEIGHT);
+ if (finalized_count && ! dropped_something) {
+ (void)GC_printf0("Premature finalization - collector is broken\n");
+ FAIL;
+ }
+ dropped_something = 1;
+ GC_noop(root); /* Root needs to remain live until */
+ /* dropped_something is set. */
+ root = mktree(TREE_HEIGHT);
+ chktree(root, TREE_HEIGHT);
+ for (i = TREE_HEIGHT; i >= 0; i--) {
+ root = mktree(i);
+ chktree(root, i);
+ }
+ alloc_small(5000000);
+}
+
+unsigned n_tests = 0;
+
+GC_word bm_huge[10] = {
+ 0xffffffff,
+ 0xffffffff,
+ 0xffffffff,
+ 0xffffffff,
+ 0xffffffff,
+ 0xffffffff,
+ 0xffffffff,
+ 0xffffffff,
+ 0xffffffff,
+ 0x00ffffff,
+};
+
+
+/* A very simple test of explicitly typed allocation */
+void typed_test()
+{
+ GC_word * old, * new;
+ GC_word bm3 = 0x3;
+ GC_word bm2 = 0x2;
+ GC_word bm_large = 0xf7ff7fff;
+ GC_descr d1 = GC_make_descriptor(&bm3, 2);
+ GC_descr d2 = GC_make_descriptor(&bm2, 2);
+# ifndef LINT
+ GC_descr dummy = GC_make_descriptor(&bm_large, 32);
+# endif
+ GC_descr d3 = GC_make_descriptor(&bm_large, 32);
+ GC_descr d4 = GC_make_descriptor(bm_huge, 320);
+ GC_word * x = (GC_word *)GC_malloc_explicitly_typed(2000, d4);
+ register int i;
+
+ old = 0;
+ for (i = 0; i < 4000; i++) {
+ new = (GC_word *) GC_malloc_explicitly_typed(4 * sizeof(GC_word), d1);
+ new[0] = 17;
+ new[1] = (GC_word)old;
+ old = new;
+ new = (GC_word *) GC_malloc_explicitly_typed(4 * sizeof(GC_word), d2);
+ new[0] = 17;
+ new[1] = (GC_word)old;
+ old = new;
+ new = (GC_word *) GC_malloc_explicitly_typed(33 * sizeof(GC_word), d3);
+ new[0] = 17;
+ new[1] = (GC_word)old;
+ old = new;
+ new = (GC_word *) GC_calloc_explicitly_typed(4, 2 * sizeof(GC_word),
+ d1);
+ new[0] = 17;
+ new[1] = (GC_word)old;
+ old = new;
+ if (i & 0xff) {
+ new = (GC_word *) GC_calloc_explicitly_typed(7, 3 * sizeof(GC_word),
+ d2);
+ } else {
+ new = (GC_word *) GC_calloc_explicitly_typed(1001,
+ 3 * sizeof(GC_word),
+ d2);
+ }
+ new[0] = 17;
+ new[1] = (GC_word)old;
+ old = new;
+ }
+ for (i = 0; i < 20000; i++) {
+ if (new[0] != 17) {
+ (void)GC_printf1("typed alloc failed at %lu\n",
+ (unsigned long)i);
+ FAIL;
+ }
+ new[0] = 0;
+ old = new;
+ new = (GC_word *)(old[1]);
+ }
+ GC_gcollect();
+ GC_noop(x);
+}
+
+int fail_count = 0;
+
+#ifndef __STDC__
+/*ARGSUSED*/
+void fail_proc1(x)
+GC_PTR x;
+{
+ fail_count++;
+}
+
+#else
+
+/*ARGSUSED*/
+void fail_proc1(GC_PTR x)
+{
+ fail_count++;
+}
+
+#endif /* __STDC__ */
+
+#ifdef THREADS
+# define TEST_FAIL_COUNT(n) 1
+#else
+# define TEST_FAIL_COUNT(n) (fail_count >= (n))
+#endif
+
+void run_one_test()
+{
+ char *x;
+# ifdef LINT
+ char *y = 0;
+# else
+ char *y = (char *)(size_t)fail_proc1;
+# endif
+ DCL_LOCK_STATE;
+
+# ifdef FIND_LEAK
+ (void)GC_printf0(
+ "This test program is not designed for leak detection mode\n");
+ (void)GC_printf0("Expect lots of problems.\n");
+# endif
+ if (GC_size(GC_malloc(7)) != 8
+ || GC_size(GC_malloc(15)) != 16) {
+ (void)GC_printf0("GC_size produced unexpected results\n");
+ FAIL;
+ }
+ if (GC_size(GC_malloc(0)) != 4 && GC_size(GC_malloc(0)) != 8) {
+ (void)GC_printf0("GC_malloc(0) failed\n");
+ FAIL;
+ }
+ if (GC_size(GC_malloc_uncollectable(0)) != 4
+ && GC_size(GC_malloc_uncollectable(0)) != 8) {
+ (void)GC_printf0("GC_malloc_uncollectable(0) failed\n");
+ FAIL;
+ }
+ GC_is_valid_displacement_print_proc = fail_proc1;
+ GC_is_visible_print_proc = fail_proc1;
+ x = GC_malloc(16);
+ if (GC_base(x + 13) != x) {
+ (void)GC_printf0("GC_base(heap ptr) produced incorrect result\n");
+ FAIL;
+ }
+# ifndef PCR
+ if (GC_base(y) != 0) {
+ (void)GC_printf0("GC_base(fn_ptr) produced incorrect result\n");
+ FAIL;
+ }
+# endif
+ if (GC_same_obj(x+5, x) != x + 5) {
+ (void)GC_printf0("GC_same_obj produced incorrect result\n");
+ FAIL;
+ }
+ if (GC_is_visible(y) != y || GC_is_visible(x) != x) {
+ (void)GC_printf0("GC_is_visible produced incorrect result\n");
+ FAIL;
+ }
+ if (!TEST_FAIL_COUNT(1)) {
+# if!(defined(RS6000) || defined(POWERPC))
+ /* ON RS6000s function pointers point to a descriptor in the */
+ /* data segment, so there should have been no failures. */
+ (void)GC_printf0("GC_is_visible produced wrong failure indication\n");
+ FAIL;
+# endif
+ }
+ if (GC_is_valid_displacement(y) != y
+ || GC_is_valid_displacement(x) != x
+ || GC_is_valid_displacement(x + 3) != x + 3) {
+ (void)GC_printf0(
+ "GC_is_valid_displacement produced incorrect result\n");
+ FAIL;
+ }
+# ifndef ALL_INTERIOR_POINTERS
+# if defined(RS6000) || defined(POWERPC)
+ if (!TEST_FAIL_COUNT(1)) {
+# else
+ if (!TEST_FAIL_COUNT(2)) {
+# endif
+ (void)GC_printf0("GC_is_valid_displacement produced wrong failure indication\n");
+ FAIL;
+ }
+# endif
+ /* Test floating point alignment */
+ *(double *)GC_MALLOC(sizeof(double)) = 1.0;
+ *(double *)GC_MALLOC(sizeof(double)) = 1.0;
+ /* Repeated list reversal test. */
+ reverse_test();
+# ifdef PRINTSTATS
+ GC_printf0("-------------Finished reverse_test\n");
+# endif
+ typed_test();
+# ifdef PRINTSTATS
+ GC_printf0("-------------Finished typed_test\n");
+# endif
+ tree_test();
+ LOCK();
+ n_tests++;
+ UNLOCK();
+ /* GC_printf1("Finished %x\n", pthread_self()); */
+}
+
+void check_heap_stats()
+{
+ unsigned long max_heap_sz;
+ register int i;
+ int still_live;
+ int late_finalize_count = 0;
+
+ if (sizeof(char *) > 4) {
+ max_heap_sz = 13000000;
+ } else {
+ max_heap_sz = 11000000;
+ }
+# ifdef GC_DEBUG
+ max_heap_sz *= 2;
+# ifdef SPARC
+ max_heap_sz *= 2;
+# endif
+# endif
+ /* Garbage collect repeatedly so that all inaccessible objects */
+ /* can be finalized. */
+ while (GC_collect_a_little()) { }
+ for (i = 0; i < 16; i++) {
+ GC_gcollect();
+ late_finalize_count += GC_invoke_finalizers();
+ }
+ (void)GC_printf1("Completed %lu tests\n", (unsigned long)n_tests);
+ (void)GC_printf2("Finalized %lu/%lu objects - ",
+ (unsigned long)finalized_count,
+ (unsigned long)finalizable_count);
+# ifdef FINALIZE_ON_DEMAND
+ if (finalized_count != late_finalize_count) {
+ (void)GC_printf0("Demand finalization error\n");
+ FAIL;
+ }
+# endif
+ if (finalized_count > finalizable_count
+ || finalized_count < finalizable_count/2) {
+ (void)GC_printf0("finalization is probably broken\n");
+ FAIL;
+ } else {
+ (void)GC_printf0("finalization is probably ok\n");
+ }
+ still_live = 0;
+ for (i = 0; i < MAX_FINALIZED; i++) {
+ if (live_indicators[i] != 0) {
+ still_live++;
+ }
+ }
+ i = finalizable_count - finalized_count - still_live;
+ if (0 != i) {
+ (void)GC_printf2
+ ("%lu disappearing links remain and %lu more objects were not finalized\n",
+ (unsigned long) still_live, (unsigned long)i);
+ if (i > 10) {
+ GC_printf0("\tVery suspicious!\n");
+ } else {
+ GC_printf0("\tSlightly suspicious, but probably OK.\n");
+ }
+ }
+ (void)GC_printf1("Total number of bytes allocated is %lu\n",
+ (unsigned long)
+ WORDS_TO_BYTES(GC_words_allocd + GC_words_allocd_before_gc));
+ (void)GC_printf1("Final heap size is %lu bytes\n",
+ (unsigned long)GC_get_heap_size());
+ if (WORDS_TO_BYTES(GC_words_allocd + GC_words_allocd_before_gc)
+ < 33500000*n_tests) {
+ (void)GC_printf0("Incorrect execution - missed some allocations\n");
+ FAIL;
+ }
+ if (GC_get_heap_size() > max_heap_sz*n_tests) {
+ (void)GC_printf0("Unexpected heap growth - collector may be broken\n");
+ FAIL;
+ }
+ (void)GC_printf0("Collector appears to work\n");
+}
+
+#if defined(MACOS)
+void SetMinimumStack(long minSize)
+{
+ long newApplLimit;
+
+ if (minSize > LMGetDefltStack())
+ {
+ newApplLimit = (long) GetApplLimit()
+ - (minSize - LMGetDefltStack());
+ SetApplLimit((Ptr) newApplLimit);
+ MaxApplZone();
+ }
+}
+
+#define cMinStackSpace (512L * 1024L)
+
+#endif
+
+#ifdef __STDC__
+ void warn_proc(char *msg, GC_word p)
+#else
+ void warn_proc(msg, p)
+ char *msg;
+ GC_word p;
+#endif
+{
+ GC_printf1(msg, (unsigned long)p);
+ FAIL;
+}
+
+
+#if !defined(PCR) && !defined(SOLARIS_THREADS) && !defined(WIN32_THREADS) \
+ && !defined(IRIX_THREADS) && !defined(LINUX_THREADS) || defined(LINT)
+#ifdef MSWIN32
+ int APIENTRY WinMain(HINSTANCE instance, HINSTANCE prev, LPSTR cmd, int n)
+#else
+ int main()
+#endif
+{
+# if defined(DJGPP)
+ int dummy;
+# endif
+ n_tests = 0;
+
+# if defined(DJGPP)
+ /* No good way to determine stack base from library; do it */
+ /* manually on this platform. */
+ GC_stackbottom = (GC_PTR)(&dummy);
+# endif
+# if defined(MACOS)
+ /* Make sure we have lots and lots of stack space. */
+ SetMinimumStack(cMinStackSpace);
+ /* Cheat and let stdio initialize toolbox for us. */
+ printf("Testing GC Macintosh port.\n");
+# endif
+ GC_INIT(); /* Only needed if gc is dynamic library. */
+ (void) GC_set_warn_proc(warn_proc);
+# if defined(MPROTECT_VDB) || defined(PROC_VDB)
+ GC_enable_incremental();
+ (void) GC_printf0("Switched to incremental mode\n");
+# if defined(MPROTECT_VDB)
+ (void)GC_printf0("Emulating dirty bits with mprotect/signals\n");
+# else
+ (void)GC_printf0("Reading dirty bits from /proc\n");
+# endif
+# endif
+ run_one_test();
+ check_heap_stats();
+ (void)fflush(stdout);
+# ifdef LINT
+ /* Entry points we should be testing, but aren't. */
+ /* Some can be tested by defining GC_DEBUG at the top of this file */
+ /* This is a bit SunOS4 specific. */
+ GC_noop(GC_expand_hp, GC_add_roots, GC_clear_roots,
+ GC_register_disappearing_link,
+ GC_register_finalizer_ignore_self,
+ GC_debug_register_displacement,
+ GC_print_obj, GC_debug_change_stubborn,
+ GC_debug_end_stubborn_change, GC_debug_malloc_uncollectable,
+ GC_debug_free, GC_debug_realloc, GC_generic_malloc_words_small,
+ GC_init, GC_make_closure, GC_debug_invoke_finalizer,
+ GC_page_was_ever_dirty, GC_is_fresh,
+ GC_malloc_ignore_off_page, GC_malloc_atomic_ignore_off_page,
+ GC_set_max_heap_size, GC_get_bytes_since_gc,
+ GC_pre_incr, GC_post_incr);
+# endif
+ return(0);
+}
+# endif
+
+#ifdef WIN32_THREADS
+
+unsigned __stdcall thr_run_one_test(void *arg)
+{
+ run_one_test();
+ return 0;
+}
+
+#define NTEST 2
+
+int APIENTRY WinMain(HINSTANCE instance, HINSTANCE prev, LPSTR cmd, int n)
+{
+# if NTEST > 0
+ HANDLE h[NTEST];
+# endif
+ int i;
+ unsigned thread_id;
+# if 0
+ GC_enable_incremental();
+# endif
+ InitializeCriticalSection(&incr_cs);
+ (void) GC_set_warn_proc(warn_proc);
+ for (i = 0; i < NTEST; i++) {
+ h[i] = (HANDLE)_beginthreadex(NULL, 0, thr_run_one_test, 0, 0, &thread_id);
+ if (h[i] == (HANDLE)-1) {
+ (void)GC_printf1("Thread creation failed %lu\n", (unsigned long)GetLastError());
+ FAIL;
+ }
+ }
+ run_one_test();
+ for (i = 0; i < NTEST; i++)
+ if (WaitForSingleObject(h[i], INFINITE) != WAIT_OBJECT_0) {
+ (void)GC_printf1("Thread wait failed %lu\n", (unsigned long)GetLastError());
+ FAIL;
+ }
+ check_heap_stats();
+ (void)fflush(stdout);
+ return(0);
+}
+
+#endif /* WIN32_THREADS */
+
+
+#ifdef PCR
+test()
+{
+ PCR_Th_T * th1;
+ PCR_Th_T * th2;
+ int code;
+
+ n_tests = 0;
+ /* GC_enable_incremental(); */
+ (void) GC_set_warn_proc(warn_proc);
+ th1 = PCR_Th_Fork(run_one_test, 0);
+ th2 = PCR_Th_Fork(run_one_test, 0);
+ run_one_test();
+ if (PCR_Th_T_Join(th1, &code, NIL, PCR_allSigsBlocked, PCR_waitForever)
+ != PCR_ERes_okay || code != 0) {
+ (void)GC_printf0("Thread 1 failed\n");
+ }
+ if (PCR_Th_T_Join(th2, &code, NIL, PCR_allSigsBlocked, PCR_waitForever)
+ != PCR_ERes_okay || code != 0) {
+ (void)GC_printf0("Thread 2 failed\n");
+ }
+ check_heap_stats();
+ (void)fflush(stdout);
+ return(0);
+}
+#endif
+
+#if defined(SOLARIS_THREADS) || defined(IRIX_THREADS) || defined(LINUX_THREADS)
+void * thr_run_one_test(void * arg)
+{
+ run_one_test();
+ return(0);
+}
+
+#ifdef GC_DEBUG
+# define GC_free GC_debug_free
+#endif
+
+#ifdef SOLARIS_THREADS
+main()
+{
+ thread_t th1;
+ thread_t th2;
+ int code;
+
+ n_tests = 0;
+ GC_INIT(); /* Only needed if gc is dynamic library. */
+ GC_enable_incremental();
+ (void) GC_set_warn_proc(warn_proc);
+ if (thr_keycreate(&fl_key, GC_free) != 0) {
+ (void)GC_printf1("Key creation failed %lu\n", (unsigned long)code);
+ FAIL;
+ }
+ if ((code = thr_create(0, 1024*1024, thr_run_one_test, 0, 0, &th1)) != 0) {
+ (void)GC_printf1("Thread 1 creation failed %lu\n", (unsigned long)code);
+ FAIL;
+ }
+ if ((code = thr_create(0, 1024*1024, thr_run_one_test, 0, THR_NEW_LWP, &th2)) != 0) {
+ (void)GC_printf1("Thread 2 creation failed %lu\n", (unsigned long)code);
+ FAIL;
+ }
+ run_one_test();
+ if ((code = thr_join(th1, 0, 0)) != 0) {
+ (void)GC_printf1("Thread 1 failed %lu\n", (unsigned long)code);
+ FAIL;
+ }
+ if (thr_join(th2, 0, 0) != 0) {
+ (void)GC_printf1("Thread 2 failed %lu\n", (unsigned long)code);
+ FAIL;
+ }
+ check_heap_stats();
+ (void)fflush(stdout);
+ return(0);
+}
+#else /* pthreads */
+main()
+{
+ pthread_t th1;
+ pthread_t th2;
+ pthread_attr_t attr;
+ int code;
+
+# ifdef IRIX_THREADS
+ /* Force a larger stack to be preallocated */
+ /* Since the initial cant always grow later. */
+ *((volatile char *)&code - 1024*1024) = 0; /* Require 1 Mb */
+# endif /* IRIX_THREADS */
+ pthread_attr_init(&attr);
+# ifdef IRIX_THREADS
+ pthread_attr_setstacksize(&attr, 1000000);
+# endif
+ n_tests = 0;
+# ifdef MPROTECT_VDB
+ GC_enable_incremental();
+ (void) GC_printf0("Switched to incremental mode\n");
+ (void) GC_printf0("Emulating dirty bits with mprotect/signals\n");
+# endif
+ (void) GC_set_warn_proc(warn_proc);
+ if ((code = pthread_create(&th1, &attr, thr_run_one_test, 0)) != 0) {
+ (void)GC_printf1("Thread 1 creation failed %lu\n", (unsigned long)code);
+ FAIL;
+ }
+ if ((code = pthread_create(&th2, &attr, thr_run_one_test, 0)) != 0) {
+ (void)GC_printf1("Thread 2 creation failed %lu\n", (unsigned long)code);
+ FAIL;
+ }
+ run_one_test();
+ if ((code = pthread_join(th1, 0)) != 0) {
+ (void)GC_printf1("Thread 1 failed %lu\n", (unsigned long)code);
+ FAIL;
+ }
+ if (pthread_join(th2, 0) != 0) {
+ (void)GC_printf1("Thread 2 failed %lu\n", (unsigned long)code);
+ FAIL;
+ }
+ check_heap_stats();
+ (void)fflush(stdout);
+ pthread_attr_destroy(&attr);
+ GC_printf1("Completed %d collections\n", GC_gc_no);
+ return(0);
+}
+#endif /* pthreads */
+#endif /* SOLARIS_THREADS || IRIX_THREADS || LINUX_THREADS */
diff --git a/boehm-gc/test_cpp.cc b/boehm-gc/test_cpp.cc
new file mode 100644
index 00000000000..3160b0984bb
--- /dev/null
+++ b/boehm-gc/test_cpp.cc
@@ -0,0 +1,265 @@
+/****************************************************************************
+Copyright (c) 1994 by Xerox Corporation. All rights reserved.
+
+THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+
+Permission is hereby granted to use or copy this program for any
+purpose, provided the above notices are retained on all copies.
+Permission to modify the code and to distribute modified code is
+granted, provided the above notices are retained, and a notice that
+the code was modified is included with the above copyright notice.
+****************************************************************************
+Last modified on Mon Jul 10 21:06:03 PDT 1995 by ellis
+ modified on December 20, 1994 7:27 pm PST by boehm
+
+usage: test_cpp number-of-iterations
+
+This program tries to test the specific C++ functionality provided by
+gc_c++.h that isn't tested by the more general test routines of the
+collector.
+
+A recommended value for number-of-iterations is 10, which will take a
+few minutes to complete.
+
+***************************************************************************/
+
+#include "gc_cpp.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#ifndef __GNUC__
+# include "gc_alloc.h"
+#endif
+extern "C" {
+#include "gc_priv.h"
+}
+#ifdef MSWIN32
+# include <windows.h>
+#endif
+
+
+#define my_assert( e ) \
+ if (! (e)) { \
+ GC_printf1( "Assertion failure in " __FILE__ ", line %d: " #e "\n", \
+ __LINE__ ); \
+ exit( 1 ); }
+
+
+class A {public:
+ /* An uncollectable class. */
+
+ A( int iArg ): i( iArg ) {}
+ void Test( int iArg ) {
+ my_assert( i == iArg );}
+ int i;};
+
+
+class B: public gc, public A {public:
+ /* A collectable class. */
+
+ B( int j ): A( j ) {}
+ ~B() {
+ my_assert( deleting );}
+ static void Deleting( int on ) {
+ deleting = on;}
+ static int deleting;};
+
+int B::deleting = 0;
+
+
+class C: public gc_cleanup, public A {public:
+ /* A collectable class with cleanup and virtual multiple inheritance. */
+
+ C( int levelArg ): A( levelArg ), level( levelArg ) {
+ nAllocated++;
+ if (level > 0) {
+ left = new C( level - 1 );
+ right = new C( level - 1 );}
+ else {
+ left = right = 0;}}
+ ~C() {
+ this->A::Test( level );
+ nFreed++;
+ my_assert( level == 0 ?
+ left == 0 && right == 0 :
+ level == left->level + 1 && level == right->level + 1 );
+ left = right = 0;
+ level = -123456;}
+ static void Test() {
+ my_assert( nFreed <= nAllocated && nFreed >= .8 * nAllocated );}
+
+ static int nFreed;
+ static int nAllocated;
+ int level;
+ C* left;
+ C* right;};
+
+int C::nFreed = 0;
+int C::nAllocated = 0;
+
+
+class D: public gc {public:
+ /* A collectable class with a static member function to be used as
+ an explicit clean-up function supplied to ::new. */
+
+ D( int iArg ): i( iArg ) {
+ nAllocated++;}
+ static void CleanUp( void* obj, void* data ) {
+ D* self = (D*) obj;
+ nFreed++;
+ my_assert( self->i == (int) (long) data );}
+ static void Test() {
+ my_assert( nFreed >= .8 * nAllocated );}
+
+ int i;
+ static int nFreed;
+ static int nAllocated;};
+
+int D::nFreed = 0;
+int D::nAllocated = 0;
+
+
+class E: public gc_cleanup {public:
+ /* A collectable class with clean-up for use by F. */
+
+ E() {
+ nAllocated++;}
+ ~E() {
+ nFreed++;}
+
+ static int nFreed;
+ static int nAllocated;};
+
+int E::nFreed = 0;
+int E::nAllocated = 0;
+
+
+class F: public E {public:
+ /* A collectable class with clean-up, a base with clean-up, and a
+ member with clean-up. */
+
+ F() {
+ nAllocated++;}
+ ~F() {
+ nFreed++;}
+ static void Test() {
+ my_assert( nFreed >= .8 * nAllocated );
+ my_assert( 2 * nFreed == E::nFreed );}
+
+ E e;
+ static int nFreed;
+ static int nAllocated;};
+
+int F::nFreed = 0;
+int F::nAllocated = 0;
+
+
+long Disguise( void* p ) {
+ return ~ (long) p;}
+
+void* Undisguise( long i ) {
+ return (void*) ~ i;}
+
+
+#ifdef MSWIN32
+int APIENTRY WinMain(
+ HINSTANCE instance, HINSTANCE prev, LPSTR cmd, int cmdShow )
+{
+ int argc;
+ char* argv[ 3 ];
+
+ for (argc = 1; argc < sizeof( argv ) / sizeof( argv[ 0 ] ); argc++) {
+ argv[ argc ] = strtok( argc == 1 ? cmd : 0, " \t" );
+ if (0 == argv[ argc ]) break;}
+
+#else
+# ifdef MACOS
+ int main() {
+# else
+ int main( int argc, char* argv[] ) {
+# endif
+#endif
+
+# if defined(MACOS) // MacOS
+ char* argv_[] = {"test_cpp", "10"}; // doesn't
+ argv = argv_; // have a
+ argc = sizeof(argv_)/sizeof(argv_[0]); // commandline
+# endif
+ int i, iters, n;
+# if !defined(__GNUC__) && !defined(MACOS)
+ int *x = (int *)alloc::allocate(sizeof(int));
+
+ *x = 29;
+ x -= 3;
+# endif
+ if (argc != 2 || (0 >= (n = atoi( argv[ 1 ] )))) {
+ GC_printf0( "usage: test_cpp number-of-iterations\n" );
+ exit( 1 );}
+
+ for (iters = 1; iters <= n; iters++) {
+ GC_printf1( "Starting iteration %d\n", iters );
+
+ /* Allocate some uncollectable As and disguise their pointers.
+ Later we'll check to see if the objects are still there. We're
+ checking to make sure these objects really are uncollectable. */
+ long as[ 1000 ];
+ long bs[ 1000 ];
+ for (i = 0; i < 1000; i++) {
+ as[ i ] = Disguise( new (NoGC) A( i ) );
+ bs[ i ] = Disguise( new (NoGC) B( i ) );}
+
+ /* Allocate a fair number of finalizable Cs, Ds, and Fs.
+ Later we'll check to make sure they've gone away. */
+ for (i = 0; i < 1000; i++) {
+ C* c = new C( 2 );
+ C c1( 2 ); /* stack allocation should work too */
+ D* d = ::new (GC, D::CleanUp, (void*) i) D( i );
+ F* f = new F;
+ if (0 == i % 10) delete c;}
+
+ /* Allocate a very large number of collectable As and Bs and
+ drop the references to them immediately, forcing many
+ collections. */
+ for (i = 0; i < 1000000; i++) {
+ A* a = new (GC) A( i );
+ B* b = new B( i );
+ b = new (GC) B( i );
+ if (0 == i % 10) {
+ B::Deleting( 1 );
+ delete b;
+ B::Deleting( 0 );}
+# ifdef FINALIZE_ON_DEMAND
+ GC_invoke_finalizers();
+# endif
+ }
+
+ /* Make sure the uncollectable As and Bs are still there. */
+ for (i = 0; i < 1000; i++) {
+ A* a = (A*) Undisguise( as[ i ] );
+ B* b = (B*) Undisguise( bs[ i ] );
+ a->Test( i );
+ delete a;
+ b->Test( i );
+ B::Deleting( 1 );
+ delete b;
+ B::Deleting( 0 );
+# ifdef FINALIZE_ON_DEMAND
+ GC_invoke_finalizers();
+# endif
+
+ }
+
+ /* Make sure most of the finalizable Cs, Ds, and Fs have
+ gone away. */
+ C::Test();
+ D::Test();
+ F::Test();}
+
+# if !defined(__GNUC__) && !defined(MACOS)
+ my_assert (29 == x[3]);
+# endif
+ GC_printf0( "The test appears to have succeeded.\n" );
+ return( 0 );}
+
+
diff --git a/boehm-gc/threadlibs.c b/boehm-gc/threadlibs.c
new file mode 100644
index 00000000000..c8530e6fe33
--- /dev/null
+++ b/boehm-gc/threadlibs.c
@@ -0,0 +1,14 @@
+# include "config.h"
+# include <stdio.h>
+
+int main()
+{
+# if defined(IRIX_THREADS) || defined(LINUX_THREADS)
+ printf("-lpthread\n");
+# endif
+# ifdef SOLARIS_THREADS
+ printf("-lthread -ldl\n");
+# endif
+ return 0;
+}
+
diff --git a/boehm-gc/typd_mlc.c b/boehm-gc/typd_mlc.c
new file mode 100644
index 00000000000..387d2305829
--- /dev/null
+++ b/boehm-gc/typd_mlc.c
@@ -0,0 +1,814 @@
+/*
+ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+/* Boehm, July 31, 1995 5:02 pm PDT */
+
+
+/*
+ * Some simple primitives for allocation with explicit type information.
+ * Simple objects are allocated such that they contain a GC_descr at the
+ * end (in the last allocated word). This descriptor may be a procedure
+ * which then examines an extended descriptor passed as its environment.
+ *
+ * Arrays are treated as simple objects if they have sufficiently simple
+ * structure. Otherwise they are allocated from an array kind that supplies
+ * a special mark procedure. These arrays contain a pointer to a
+ * complex_descriptor as their last word.
+ * This is done because the environment field is too small, and the collector
+ * must trace the complex_descriptor.
+ *
+ * Note that descriptors inside objects may appear cleared, if we encounter a
+ * false refrence to an object on a free list. In the GC_descr case, this
+ * is OK, since a 0 descriptor corresponds to examining no fields.
+ * In the complex_descriptor case, we explicitly check for that case.
+ *
+ * MAJOR PARTS OF THIS CODE HAVE NOT BEEN TESTED AT ALL and are not testable,
+ * since they are not accessible through the current interface.
+ */
+
+#include "gc_priv.h"
+#include "gc_mark.h"
+#include "gc_typed.h"
+
+# ifdef ADD_BYTE_AT_END
+# define EXTRA_BYTES (sizeof(word) - 1)
+# else
+# define EXTRA_BYTES (sizeof(word))
+# endif
+
+GC_bool GC_explicit_typing_initialized = FALSE;
+
+int GC_explicit_kind; /* Object kind for objects with indirect */
+ /* (possibly extended) descriptors. */
+
+int GC_array_kind; /* Object kind for objects with complex */
+ /* descriptors and GC_array_mark_proc. */
+
+/* Extended descriptors. GC_typed_mark_proc understands these. */
+/* These are used for simple objects that are larger than what */
+/* can be described by a BITMAP_BITS sized bitmap. */
+typedef struct {
+ word ed_bitmap; /* lsb corresponds to first word. */
+ GC_bool ed_continued; /* next entry is continuation. */
+} ext_descr;
+
+/* Array descriptors. GC_array_mark_proc understands these. */
+/* We may eventually need to add provisions for headers and */
+/* trailers. Hence we provide for tree structured descriptors, */
+/* though we don't really use them currently. */
+typedef union ComplexDescriptor {
+ struct LeafDescriptor { /* Describes simple array */
+ word ld_tag;
+# define LEAF_TAG 1
+ word ld_size; /* bytes per element */
+ /* multiple of ALIGNMENT */
+ word ld_nelements; /* Number of elements. */
+ GC_descr ld_descriptor; /* A simple length, bitmap, */
+ /* or procedure descriptor. */
+ } ld;
+ struct ComplexArrayDescriptor {
+ word ad_tag;
+# define ARRAY_TAG 2
+ word ad_nelements;
+ union ComplexDescriptor * ad_element_descr;
+ } ad;
+ struct SequenceDescriptor {
+ word sd_tag;
+# define SEQUENCE_TAG 3
+ union ComplexDescriptor * sd_first;
+ union ComplexDescriptor * sd_second;
+ } sd;
+} complex_descriptor;
+#define TAG ld.ld_tag
+
+ext_descr * GC_ext_descriptors; /* Points to array of extended */
+ /* descriptors. */
+
+word GC_ed_size = 0; /* Current size of above arrays. */
+# define ED_INITIAL_SIZE 100;
+
+word GC_avail_descr = 0; /* Next available slot. */
+
+int GC_typed_mark_proc_index; /* Indices of my mark */
+int GC_array_mark_proc_index; /* procedures. */
+
+/* Add a multiword bitmap to GC_ext_descriptors arrays. Return */
+/* starting index. */
+/* Returns -1 on failure. */
+/* Caller does not hold allocation lock. */
+signed_word GC_add_ext_descriptor(bm, nbits)
+GC_bitmap bm;
+word nbits;
+{
+ register size_t nwords = divWORDSZ(nbits + WORDSZ-1);
+ register signed_word result;
+ register word i;
+ register word last_part;
+ register int extra_bits;
+ DCL_LOCK_STATE;
+
+ DISABLE_SIGNALS();
+ LOCK();
+ while (GC_avail_descr + nwords >= GC_ed_size) {
+ ext_descr * new;
+ size_t new_size;
+ word ed_size = GC_ed_size;
+
+ UNLOCK();
+ ENABLE_SIGNALS();
+ if (ed_size == 0) {
+ new_size = ED_INITIAL_SIZE;
+ } else {
+ new_size = 2 * ed_size;
+ if (new_size > MAX_ENV) return(-1);
+ }
+ new = (ext_descr *) GC_malloc_atomic(new_size * sizeof(ext_descr));
+ if (new == 0) return(-1);
+ DISABLE_SIGNALS();
+ LOCK();
+ if (ed_size == GC_ed_size) {
+ if (GC_avail_descr != 0) {
+ BCOPY(GC_ext_descriptors, new,
+ GC_avail_descr * sizeof(ext_descr));
+ }
+ GC_ed_size = new_size;
+ GC_ext_descriptors = new;
+ } /* else another thread already resized it in the meantime */
+ }
+ result = GC_avail_descr;
+ for (i = 0; i < nwords-1; i++) {
+ GC_ext_descriptors[result + i].ed_bitmap = bm[i];
+ GC_ext_descriptors[result + i].ed_continued = TRUE;
+ }
+ last_part = bm[i];
+ /* Clear irrelevant bits. */
+ extra_bits = nwords * WORDSZ - nbits;
+ last_part <<= extra_bits;
+ last_part >>= extra_bits;
+ GC_ext_descriptors[result + i].ed_bitmap = last_part;
+ GC_ext_descriptors[result + i].ed_continued = FALSE;
+ GC_avail_descr += nwords;
+ UNLOCK();
+ ENABLE_SIGNALS();
+ return(result);
+}
+
+/* Table of bitmap descriptors for n word long all pointer objects. */
+GC_descr GC_bm_table[WORDSZ/2];
+
+/* Return a descriptor for the concatenation of 2 nwords long objects, */
+/* each of which is described by descriptor. */
+/* The result is known to be short enough to fit into a bitmap */
+/* descriptor. */
+/* Descriptor is a DS_LENGTH or DS_BITMAP descriptor. */
+GC_descr GC_double_descr(descriptor, nwords)
+register GC_descr descriptor;
+register word nwords;
+{
+ if (descriptor && DS_TAGS == DS_LENGTH) {
+ descriptor = GC_bm_table[BYTES_TO_WORDS((word)descriptor)];
+ };
+ descriptor |= (descriptor & ~DS_TAGS) >> nwords;
+ return(descriptor);
+}
+
+complex_descriptor * GC_make_sequence_descriptor();
+
+/* Build a descriptor for an array with nelements elements, */
+/* each of which can be described by a simple descriptor. */
+/* We try to optimize some common cases. */
+/* If the result is COMPLEX, then a complex_descr* is returned */
+/* in *complex_d. */
+/* If the result is LEAF, then we built a LeafDescriptor in */
+/* the structure pointed to by leaf. */
+/* The tag in the leaf structure is not set. */
+/* If the result is SIMPLE, then a GC_descr */
+/* is returned in *simple_d. */
+/* If the result is NO_MEM, then */
+/* we failed to allocate the descriptor. */
+/* The implementation knows that DS_LENGTH is 0. */
+/* *leaf, *complex_d, and *simple_d may be used as temporaries */
+/* during the construction. */
+# define COMPLEX 2
+# define LEAF 1
+# define SIMPLE 0
+# define NO_MEM (-1)
+int GC_make_array_descriptor(nelements, size, descriptor,
+ simple_d, complex_d, leaf)
+word size;
+word nelements;
+GC_descr descriptor;
+GC_descr *simple_d;
+complex_descriptor **complex_d;
+struct LeafDescriptor * leaf;
+{
+# define OPT_THRESHOLD 50
+ /* For larger arrays, we try to combine descriptors of adjacent */
+ /* descriptors to speed up marking, and to reduce the amount */
+ /* of space needed on the mark stack. */
+ if ((descriptor & DS_TAGS) == DS_LENGTH) {
+ if ((word)descriptor == size) {
+ *simple_d = nelements * descriptor;
+ return(SIMPLE);
+ } else if ((word)descriptor == 0) {
+ *simple_d = (GC_descr)0;
+ return(SIMPLE);
+ }
+ }
+ if (nelements <= OPT_THRESHOLD) {
+ if (nelements <= 1) {
+ if (nelements == 1) {
+ *simple_d = descriptor;
+ return(SIMPLE);
+ } else {
+ *simple_d = (GC_descr)0;
+ return(SIMPLE);
+ }
+ }
+ } else if (size <= BITMAP_BITS/2
+ && (descriptor & DS_TAGS) != DS_PROC
+ && (size & (sizeof(word)-1)) == 0) {
+ int result =
+ GC_make_array_descriptor(nelements/2, 2*size,
+ GC_double_descr(descriptor,
+ BYTES_TO_WORDS(size)),
+ simple_d, complex_d, leaf);
+ if ((nelements & 1) == 0) {
+ return(result);
+ } else {
+ struct LeafDescriptor * one_element =
+ (struct LeafDescriptor *)
+ GC_malloc_atomic(sizeof(struct LeafDescriptor));
+
+ if (result == NO_MEM || one_element == 0) return(NO_MEM);
+ one_element -> ld_tag = LEAF_TAG;
+ one_element -> ld_size = size;
+ one_element -> ld_nelements = 1;
+ one_element -> ld_descriptor = descriptor;
+ switch(result) {
+ case SIMPLE:
+ {
+ struct LeafDescriptor * beginning =
+ (struct LeafDescriptor *)
+ GC_malloc_atomic(sizeof(struct LeafDescriptor));
+ if (beginning == 0) return(NO_MEM);
+ beginning -> ld_tag = LEAF_TAG;
+ beginning -> ld_size = size;
+ beginning -> ld_nelements = 1;
+ beginning -> ld_descriptor = *simple_d;
+ *complex_d = GC_make_sequence_descriptor(
+ (complex_descriptor *)beginning,
+ (complex_descriptor *)one_element);
+ break;
+ }
+ case LEAF:
+ {
+ struct LeafDescriptor * beginning =
+ (struct LeafDescriptor *)
+ GC_malloc_atomic(sizeof(struct LeafDescriptor));
+ if (beginning == 0) return(NO_MEM);
+ beginning -> ld_tag = LEAF_TAG;
+ beginning -> ld_size = leaf -> ld_size;
+ beginning -> ld_nelements = leaf -> ld_nelements;
+ beginning -> ld_descriptor = leaf -> ld_descriptor;
+ *complex_d = GC_make_sequence_descriptor(
+ (complex_descriptor *)beginning,
+ (complex_descriptor *)one_element);
+ break;
+ }
+ case COMPLEX:
+ *complex_d = GC_make_sequence_descriptor(
+ *complex_d,
+ (complex_descriptor *)one_element);
+ break;
+ }
+ return(COMPLEX);
+ }
+ }
+ {
+ leaf -> ld_size = size;
+ leaf -> ld_nelements = nelements;
+ leaf -> ld_descriptor = descriptor;
+ return(LEAF);
+ }
+}
+
+complex_descriptor * GC_make_sequence_descriptor(first, second)
+complex_descriptor * first;
+complex_descriptor * second;
+{
+ struct SequenceDescriptor * result =
+ (struct SequenceDescriptor *)
+ GC_malloc(sizeof(struct SequenceDescriptor));
+ /* Can't result in overly conservative marking, since tags are */
+ /* very small integers. Probably faster than maintaining type */
+ /* info. */
+ if (result != 0) {
+ result -> sd_tag = SEQUENCE_TAG;
+ result -> sd_first = first;
+ result -> sd_second = second;
+ }
+ return((complex_descriptor *)result);
+}
+
+#ifdef UNDEFINED
+complex_descriptor * GC_make_complex_array_descriptor(nelements, descr)
+word nelements;
+complex_descriptor * descr;
+{
+ struct ComplexArrayDescriptor * result =
+ (struct ComplexArrayDescriptor *)
+ GC_malloc(sizeof(struct ComplexArrayDescriptor));
+
+ if (result != 0) {
+ result -> ad_tag = ARRAY_TAG;
+ result -> ad_nelements = nelements;
+ result -> ad_element_descr = descr;
+ }
+ return((complex_descriptor *)result);
+}
+#endif
+
+ptr_t * GC_eobjfreelist;
+
+ptr_t * GC_arobjfreelist;
+
+mse * GC_typed_mark_proc();
+
+mse * GC_array_mark_proc();
+
+GC_descr GC_generic_array_descr;
+
+/* Caller does not hold allocation lock. */
+void GC_init_explicit_typing()
+{
+ register int i;
+ DCL_LOCK_STATE;
+
+
+# ifdef PRINTSTATS
+ if (sizeof(struct LeafDescriptor) % sizeof(word) != 0)
+ ABORT("Bad leaf descriptor size");
+# endif
+ DISABLE_SIGNALS();
+ LOCK();
+ if (GC_explicit_typing_initialized) {
+ UNLOCK();
+ ENABLE_SIGNALS();
+ return;
+ }
+ GC_explicit_typing_initialized = TRUE;
+ /* Set up object kind with simple indirect descriptor. */
+ GC_eobjfreelist = (ptr_t *)
+ GC_generic_malloc_inner((MAXOBJSZ+1)*sizeof(ptr_t), PTRFREE);
+ if (GC_eobjfreelist == 0) ABORT("Couldn't allocate GC_eobjfreelist");
+ BZERO(GC_eobjfreelist, (MAXOBJSZ+1)*sizeof(ptr_t));
+ GC_explicit_kind = GC_n_kinds++;
+ GC_obj_kinds[GC_explicit_kind].ok_freelist = GC_eobjfreelist;
+ GC_obj_kinds[GC_explicit_kind].ok_reclaim_list = 0;
+ GC_obj_kinds[GC_explicit_kind].ok_descriptor =
+ (((word)WORDS_TO_BYTES(-1)) | DS_PER_OBJECT);
+ GC_obj_kinds[GC_explicit_kind].ok_relocate_descr = TRUE;
+ GC_obj_kinds[GC_explicit_kind].ok_init = TRUE;
+ /* Descriptors are in the last word of the object. */
+ GC_typed_mark_proc_index = GC_n_mark_procs;
+ GC_mark_procs[GC_typed_mark_proc_index] = GC_typed_mark_proc;
+ GC_n_mark_procs++;
+ /* Moving this up breaks DEC AXP compiler. */
+ /* Set up object kind with array descriptor. */
+ GC_arobjfreelist = (ptr_t *)
+ GC_generic_malloc_inner((MAXOBJSZ+1)*sizeof(ptr_t), PTRFREE);
+ if (GC_arobjfreelist == 0) ABORT("Couldn't allocate GC_arobjfreelist");
+ BZERO(GC_arobjfreelist, (MAXOBJSZ+1)*sizeof(ptr_t));
+ if (GC_n_mark_procs >= MAX_MARK_PROCS)
+ ABORT("No slot for array mark proc");
+ GC_array_mark_proc_index = GC_n_mark_procs++;
+ if (GC_n_kinds >= MAXOBJKINDS)
+ ABORT("No kind available for array objects");
+ GC_array_kind = GC_n_kinds++;
+ GC_obj_kinds[GC_array_kind].ok_freelist = GC_arobjfreelist;
+ GC_obj_kinds[GC_array_kind].ok_reclaim_list = 0;
+ GC_obj_kinds[GC_array_kind].ok_descriptor =
+ MAKE_PROC(GC_array_mark_proc_index, 0);;
+ GC_obj_kinds[GC_array_kind].ok_relocate_descr = FALSE;
+ GC_obj_kinds[GC_array_kind].ok_init = TRUE;
+ /* Descriptors are in the last word of the object. */
+ GC_mark_procs[GC_array_mark_proc_index] = GC_array_mark_proc;
+ for (i = 0; i < WORDSZ/2; i++) {
+ GC_descr d = (((word)(-1)) >> (WORDSZ - i)) << (WORDSZ - i);
+ d |= DS_BITMAP;
+ GC_bm_table[i] = d;
+ }
+ GC_generic_array_descr = MAKE_PROC(GC_array_mark_proc_index, 0);
+ UNLOCK();
+ ENABLE_SIGNALS();
+}
+
+mse * GC_typed_mark_proc(addr, mark_stack_ptr, mark_stack_limit, env)
+register word * addr;
+register mse * mark_stack_ptr;
+mse * mark_stack_limit;
+word env;
+{
+ register word bm = GC_ext_descriptors[env].ed_bitmap;
+ register word * current_p = addr;
+ register word current;
+ register ptr_t greatest_ha = GC_greatest_plausible_heap_addr;
+ register ptr_t least_ha = GC_least_plausible_heap_addr;
+
+ for (; bm != 0; bm >>= 1, current_p++) {
+ if (bm & 1) {
+ current = *current_p;
+ if ((ptr_t)current >= least_ha && (ptr_t)current <= greatest_ha) {
+ PUSH_CONTENTS(current, mark_stack_ptr,
+ mark_stack_limit, current_p, exit1);
+ }
+ }
+ }
+ if (GC_ext_descriptors[env].ed_continued) {
+ /* Push an entry with the rest of the descriptor back onto the */
+ /* stack. Thus we never do too much work at once. Note that */
+ /* we also can't overflow the mark stack unless we actually */
+ /* mark something. */
+ mark_stack_ptr++;
+ if (mark_stack_ptr >= mark_stack_limit) {
+ mark_stack_ptr = GC_signal_mark_stack_overflow(mark_stack_ptr);
+ }
+ mark_stack_ptr -> mse_start = addr + WORDSZ;
+ mark_stack_ptr -> mse_descr =
+ MAKE_PROC(GC_typed_mark_proc_index, env+1);
+ }
+ return(mark_stack_ptr);
+}
+
+/* Return the size of the object described by d. It would be faster to */
+/* store this directly, or to compute it as part of */
+/* GC_push_complex_descriptor, but hopefully it doesn't matter. */
+word GC_descr_obj_size(d)
+register complex_descriptor *d;
+{
+ switch(d -> TAG) {
+ case LEAF_TAG:
+ return(d -> ld.ld_nelements * d -> ld.ld_size);
+ case ARRAY_TAG:
+ return(d -> ad.ad_nelements
+ * GC_descr_obj_size(d -> ad.ad_element_descr));
+ case SEQUENCE_TAG:
+ return(GC_descr_obj_size(d -> sd.sd_first)
+ + GC_descr_obj_size(d -> sd.sd_second));
+ default:
+ ABORT("Bad complex descriptor");
+ /*NOTREACHED*/ return 0; /*NOTREACHED*/
+ }
+}
+
+/* Push descriptors for the object at addr with complex descriptor d */
+/* onto the mark stack. Return 0 if the mark stack overflowed. */
+mse * GC_push_complex_descriptor(addr, d, msp, msl)
+word * addr;
+register complex_descriptor *d;
+register mse * msp;
+mse * msl;
+{
+ register ptr_t current = (ptr_t) addr;
+ register word nelements;
+ register word sz;
+ register word i;
+
+ switch(d -> TAG) {
+ case LEAF_TAG:
+ {
+ register GC_descr descr = d -> ld.ld_descriptor;
+
+ nelements = d -> ld.ld_nelements;
+ if (msl - msp <= (ptrdiff_t)nelements) return(0);
+ sz = d -> ld.ld_size;
+ for (i = 0; i < nelements; i++) {
+ msp++;
+ msp -> mse_start = (word *)current;
+ msp -> mse_descr = descr;
+ current += sz;
+ }
+ return(msp);
+ }
+ case ARRAY_TAG:
+ {
+ register complex_descriptor *descr = d -> ad.ad_element_descr;
+
+ nelements = d -> ad.ad_nelements;
+ sz = GC_descr_obj_size(descr);
+ for (i = 0; i < nelements; i++) {
+ msp = GC_push_complex_descriptor((word *)current, descr,
+ msp, msl);
+ if (msp == 0) return(0);
+ current += sz;
+ }
+ return(msp);
+ }
+ case SEQUENCE_TAG:
+ {
+ sz = GC_descr_obj_size(d -> sd.sd_first);
+ msp = GC_push_complex_descriptor((word *)current, d -> sd.sd_first,
+ msp, msl);
+ if (msp == 0) return(0);
+ current += sz;
+ msp = GC_push_complex_descriptor((word *)current, d -> sd.sd_second,
+ msp, msl);
+ return(msp);
+ }
+ default:
+ ABORT("Bad complex descriptor");
+ /*NOTREACHED*/ return 0; /*NOTREACHED*/
+ }
+}
+
+/*ARGSUSED*/
+mse * GC_array_mark_proc(addr, mark_stack_ptr, mark_stack_limit, env)
+register word * addr;
+register mse * mark_stack_ptr;
+mse * mark_stack_limit;
+word env;
+{
+ register hdr * hhdr = HDR(addr);
+ register word sz = hhdr -> hb_sz;
+ register complex_descriptor * descr = (complex_descriptor *)(addr[sz-1]);
+ mse * orig_mark_stack_ptr = mark_stack_ptr;
+ mse * new_mark_stack_ptr;
+
+ if (descr == 0) {
+ /* Found a reference to a free list entry. Ignore it. */
+ return(orig_mark_stack_ptr);
+ }
+ /* In use counts were already updated when array descriptor was */
+ /* pushed. Here we only replace it by subobject descriptors, so */
+ /* no update is necessary. */
+ new_mark_stack_ptr = GC_push_complex_descriptor(addr, descr,
+ mark_stack_ptr,
+ mark_stack_limit-1);
+ if (new_mark_stack_ptr == 0) {
+ /* Doesn't fit. Conservatively push the whole array as a unit */
+ /* and request a mark stack expansion. */
+ /* This cannot cause a mark stack overflow, since it replaces */
+ /* the original array entry. */
+ GC_mark_stack_too_small = TRUE;
+ new_mark_stack_ptr = orig_mark_stack_ptr + 1;
+ new_mark_stack_ptr -> mse_start = addr;
+ new_mark_stack_ptr -> mse_descr = WORDS_TO_BYTES(sz) | DS_LENGTH;
+ } else {
+ /* Push descriptor itself */
+ new_mark_stack_ptr++;
+ new_mark_stack_ptr -> mse_start = addr + sz - 1;
+ new_mark_stack_ptr -> mse_descr = sizeof(word) | DS_LENGTH;
+ }
+ return(new_mark_stack_ptr);
+}
+
+#if defined(__STDC__) || defined(__cplusplus)
+ GC_descr GC_make_descriptor(GC_bitmap bm, size_t len)
+#else
+ GC_descr GC_make_descriptor(bm, len)
+ GC_bitmap bm;
+ size_t len;
+#endif
+{
+ register signed_word last_set_bit = len - 1;
+ register word result;
+ register int i;
+# define HIGH_BIT (((word)1) << (WORDSZ - 1))
+
+ if (!GC_explicit_typing_initialized) GC_init_explicit_typing();
+ while (last_set_bit >= 0 && !GC_get_bit(bm, last_set_bit)) last_set_bit --;
+ if (last_set_bit < 0) return(0 /* no pointers */);
+# if ALIGNMENT == CPP_WORDSZ/8
+ {
+ register GC_bool all_bits_set = TRUE;
+ for (i = 0; i < last_set_bit; i++) {
+ if (!GC_get_bit(bm, i)) {
+ all_bits_set = FALSE;
+ break;
+ }
+ }
+ if (all_bits_set) {
+ /* An initial section contains all pointers. Use length descriptor. */
+ return(WORDS_TO_BYTES(last_set_bit+1) | DS_LENGTH);
+ }
+ }
+# endif
+ if (last_set_bit < BITMAP_BITS) {
+ /* Hopefully the common case. */
+ /* Build bitmap descriptor (with bits reversed) */
+ result = HIGH_BIT;
+ for (i = last_set_bit - 1; i >= 0; i--) {
+ result >>= 1;
+ if (GC_get_bit(bm, i)) result |= HIGH_BIT;
+ }
+ result |= DS_BITMAP;
+ return(result);
+ } else {
+ signed_word index;
+
+ index = GC_add_ext_descriptor(bm, (word)last_set_bit+1);
+ if (index == -1) return(WORDS_TO_BYTES(last_set_bit+1) | DS_LENGTH);
+ /* Out of memory: use conservative */
+ /* approximation. */
+ result = MAKE_PROC(GC_typed_mark_proc_index, (word)index);
+ return(result);
+ }
+}
+
+ptr_t GC_clear_stack();
+
+#define GENERAL_MALLOC(lb,k) \
+ (GC_PTR)GC_clear_stack(GC_generic_malloc((word)lb, k))
+
+#define GENERAL_MALLOC_IOP(lb,k) \
+ (GC_PTR)GC_clear_stack(GC_generic_malloc_ignore_off_page((word)lb, k))
+
+#if defined(__STDC__) || defined(__cplusplus)
+ void * GC_malloc_explicitly_typed(size_t lb, GC_descr d)
+#else
+ char * GC_malloc_explicitly_typed(lb, d)
+ size_t lb;
+ GC_descr d;
+#endif
+{
+register ptr_t op;
+register ptr_t * opp;
+register word lw;
+DCL_LOCK_STATE;
+
+ lb += EXTRA_BYTES;
+ if( SMALL_OBJ(lb) ) {
+# ifdef MERGE_SIZES
+ lw = GC_size_map[lb];
+# else
+ lw = ALIGNED_WORDS(lb);
+# endif
+ opp = &(GC_eobjfreelist[lw]);
+ FASTLOCK();
+ if( !FASTLOCK_SUCCEEDED() || (op = *opp) == 0 ) {
+ FASTUNLOCK();
+ op = (ptr_t)GENERAL_MALLOC((word)lb, GC_explicit_kind);
+ if (0 == op) return(0);
+# ifdef MERGE_SIZES
+ lw = GC_size_map[lb]; /* May have been uninitialized. */
+# endif
+ } else {
+ *opp = obj_link(op);
+ GC_words_allocd += lw;
+ FASTUNLOCK();
+ }
+ } else {
+ op = (ptr_t)GENERAL_MALLOC((word)lb, GC_explicit_kind);
+ if (op != NULL)
+ lw = BYTES_TO_WORDS(GC_size(op));
+ }
+ if (op != NULL)
+ ((word *)op)[lw - 1] = d;
+ return((GC_PTR) op);
+}
+
+#if defined(__STDC__) || defined(__cplusplus)
+ void * GC_malloc_explicitly_typed_ignore_off_page(size_t lb, GC_descr d)
+#else
+ char * GC_malloc_explicitly_typed_ignore_off_page(lb, d)
+ size_t lb;
+ GC_descr d;
+#endif
+{
+register ptr_t op;
+register ptr_t * opp;
+register word lw;
+DCL_LOCK_STATE;
+
+ lb += EXTRA_BYTES;
+ if( SMALL_OBJ(lb) ) {
+# ifdef MERGE_SIZES
+ lw = GC_size_map[lb];
+# else
+ lw = ALIGNED_WORDS(lb);
+# endif
+ opp = &(GC_eobjfreelist[lw]);
+ FASTLOCK();
+ if( !FASTLOCK_SUCCEEDED() || (op = *opp) == 0 ) {
+ FASTUNLOCK();
+ op = (ptr_t)GENERAL_MALLOC_IOP((word)lb, GC_explicit_kind);
+# ifdef MERGE_SIZES
+ lw = GC_size_map[lb]; /* May have been uninitialized. */
+# endif
+ } else {
+ *opp = obj_link(op);
+ GC_words_allocd += lw;
+ FASTUNLOCK();
+ }
+ } else {
+ op = (ptr_t)GENERAL_MALLOC_IOP((word)lb, GC_explicit_kind);
+ if (op != NULL)
+ lw = BYTES_TO_WORDS(GC_size(op));
+ }
+ if (op != NULL)
+ ((word *)op)[lw - 1] = d;
+ return((GC_PTR) op);
+}
+
+#if defined(__STDC__) || defined(__cplusplus)
+ void * GC_calloc_explicitly_typed(size_t n,
+ size_t lb,
+ GC_descr d)
+#else
+ char * GC_calloc_explicitly_typed(n, lb, d)
+ size_t n;
+ size_t lb;
+ GC_descr d;
+#endif
+{
+register ptr_t op;
+register ptr_t * opp;
+register word lw;
+GC_descr simple_descr;
+complex_descriptor *complex_descr;
+register int descr_type;
+struct LeafDescriptor leaf;
+DCL_LOCK_STATE;
+
+ descr_type = GC_make_array_descriptor((word)n, (word)lb, d,
+ &simple_descr, &complex_descr, &leaf);
+ switch(descr_type) {
+ case NO_MEM: return(0);
+ case SIMPLE: return(GC_malloc_explicitly_typed(n*lb, simple_descr));
+ case LEAF:
+ lb *= n;
+ lb += sizeof(struct LeafDescriptor) + EXTRA_BYTES;
+ break;
+ case COMPLEX:
+ lb *= n;
+ lb += EXTRA_BYTES;
+ break;
+ }
+ if( SMALL_OBJ(lb) ) {
+# ifdef MERGE_SIZES
+ lw = GC_size_map[lb];
+# else
+ lw = ALIGNED_WORDS(lb);
+# endif
+ opp = &(GC_arobjfreelist[lw]);
+ FASTLOCK();
+ if( !FASTLOCK_SUCCEEDED() || (op = *opp) == 0 ) {
+ FASTUNLOCK();
+ op = (ptr_t)GENERAL_MALLOC((word)lb, GC_array_kind);
+ if (0 == op) return(0);
+# ifdef MERGE_SIZES
+ lw = GC_size_map[lb]; /* May have been uninitialized. */
+# endif
+ } else {
+ *opp = obj_link(op);
+ GC_words_allocd += lw;
+ FASTUNLOCK();
+ }
+ } else {
+ op = (ptr_t)GENERAL_MALLOC((word)lb, GC_array_kind);
+ if (0 == op) return(0);
+ lw = BYTES_TO_WORDS(GC_size(op));
+ }
+ if (descr_type == LEAF) {
+ /* Set up the descriptor inside the object itself. */
+ VOLATILE struct LeafDescriptor * lp =
+ (struct LeafDescriptor *)
+ ((word *)op
+ + lw - (BYTES_TO_WORDS(sizeof(struct LeafDescriptor)) + 1));
+
+ lp -> ld_tag = LEAF_TAG;
+ lp -> ld_size = leaf.ld_size;
+ lp -> ld_nelements = leaf.ld_nelements;
+ lp -> ld_descriptor = leaf.ld_descriptor;
+ ((VOLATILE word *)op)[lw - 1] = (word)lp;
+ } else {
+ extern unsigned GC_finalization_failures;
+ unsigned ff = GC_finalization_failures;
+
+ ((word *)op)[lw - 1] = (word)complex_descr;
+ /* Make sure the descriptor is cleared once there is any danger */
+ /* it may have been collected. */
+ (void)
+ GC_general_register_disappearing_link((GC_PTR *)
+ ((word *)op+lw-1),
+ (GC_PTR) op);
+ if (ff != GC_finalization_failures) {
+ /* Couldn't register it due to lack of memory. Punt. */
+ /* This will probably fail too, but gives the recovery code */
+ /* a chance. */
+ return(GC_malloc(n*lb));
+ }
+ }
+ return((GC_PTR) op);
+}
diff --git a/boehm-gc/version.h b/boehm-gc/version.h
new file mode 100644
index 00000000000..5611487373c
--- /dev/null
+++ b/boehm-gc/version.h
@@ -0,0 +1,11 @@
+#define GC_VERSION_MAJOR 4
+#define GC_VERSION_MINOR 13
+#define GC_ALPHA_VERSION 2
+
+# define GC_NOT_ALPHA 0xff
+
+#ifndef GC_NO_VERSION_VAR
+
+unsigned GC_version = ((GC_VERSION_MAJOR << 16) | (GC_VERSION_MINOR << 8) | GC_ALPHA_VERSION);
+
+#endif /* GC_NO_VERSION_VAR */
diff --git a/boehm-gc/weakpointer.h b/boehm-gc/weakpointer.h
new file mode 100644
index 00000000000..84906b00a68
--- /dev/null
+++ b/boehm-gc/weakpointer.h
@@ -0,0 +1,221 @@
+#ifndef _weakpointer_h_
+#define _weakpointer_h_
+
+/****************************************************************************
+
+WeakPointer and CleanUp
+
+ Copyright (c) 1991 by Xerox Corporation. All rights reserved.
+
+ THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+
+ Permission is hereby granted to copy this code for any purpose,
+ provided the above notices are retained on all copies.
+
+ Last modified on Mon Jul 17 18:16:01 PDT 1995 by ellis
+
+****************************************************************************/
+
+/****************************************************************************
+
+WeakPointer
+
+A weak pointer is a pointer to a heap-allocated object that doesn't
+prevent the object from being garbage collected. Weak pointers can be
+used to track which objects haven't yet been reclaimed by the
+collector. A weak pointer is deactivated when the collector discovers
+its referent object is unreachable by normal pointers (reachability
+and deactivation are defined more precisely below). A deactivated weak
+pointer remains deactivated forever.
+
+****************************************************************************/
+
+
+template< class T > class WeakPointer {
+public:
+
+WeakPointer( T* t = 0 )
+ /* Constructs a weak pointer for *t. t may be null. It is an error
+ if t is non-null and *t is not a collected object. */
+ {impl = _WeakPointer_New( t );}
+
+T* Pointer()
+ /* wp.Pointer() returns a pointer to the referent object of wp or
+ null if wp has been deactivated (because its referent object
+ has been discovered unreachable by the collector). */
+ {return (T*) _WeakPointer_Pointer( this->impl );}
+
+int operator==( WeakPointer< T > wp2 )
+ /* Given weak pointers wp1 and wp2, if wp1 == wp2, then wp1 and
+ wp2 refer to the same object. If wp1 != wp2, then either wp1
+ and wp2 don't refer to the same object, or if they do, one or
+ both of them has been deactivated. (Note: If objects t1 and t2
+ are never made reachable by their clean-up functions, then
+ WeakPointer<T>(t1) == WeakPointer<T>(t2) if and only t1 == t2.) */
+ {return _WeakPointer_Equal( this->impl, wp2.impl );}
+
+int Hash()
+ /* Returns a hash code suitable for use by multiplicative- and
+ division-based hash tables. If wp1 == wp2, then wp1.Hash() ==
+ wp2.Hash(). */
+ {return _WeakPointer_Hash( this->impl );}
+
+private:
+void* impl;
+};
+
+/*****************************************************************************
+
+CleanUp
+
+A garbage-collected object can have an associated clean-up function
+that will be invoked some time after the collector discovers the
+object is unreachable via normal pointers. Clean-up functions can be
+used to release resources such as open-file handles or window handles
+when their containing objects become unreachable. If a C++ object has
+a non-empty explicit destructor (i.e. it contains programmer-written
+code), the destructor will be automatically registered as the object's
+initial clean-up function.
+
+There is no guarantee that the collector will detect every unreachable
+object (though it will find almost all of them). Clients should not
+rely on clean-up to cause some action to occur immediately -- clean-up
+is only a mechanism for improving resource usage.
+
+Every object with a clean-up function also has a clean-up queue. When
+the collector finds the object is unreachable, it enqueues it on its
+queue. The clean-up function is applied when the object is removed
+from the queue. By default, objects are enqueued on the garbage
+collector's queue, and the collector removes all objects from its
+queue after each collection. If a client supplies another queue for
+objects, it is his responsibility to remove objects (and cause their
+functions to be called) by polling it periodically.
+
+Clean-up queues allow clean-up functions accessing global data to
+synchronize with the main program. Garbage collection can occur at any
+time, and clean-ups invoked by the collector might access data in an
+inconsistent state. A client can control this by defining an explicit
+queue for objects and polling it at safe points.
+
+The following definitions are used by the specification below:
+
+Given a pointer t to a collected object, the base object BO(t) is the
+value returned by new when it created the object. (Because of multiple
+inheritance, t and BO(t) may not be the same address.)
+
+A weak pointer wp references an object *t if BO(wp.Pointer()) ==
+BO(t).
+
+***************************************************************************/
+
+template< class T, class Data > class CleanUp {
+public:
+
+static void Set( T* t, void c( Data* d, T* t ), Data* d = 0 )
+ /* Sets the clean-up function of object BO(t) to be <c, d>,
+ replacing any previously defined clean-up function for BO(t); c
+ and d can be null, but t cannot. Sets the clean-up queue for
+ BO(t) to be the collector's queue. When t is removed from its
+ clean-up queue, its clean-up will be applied by calling c(d,
+ t). It is an error if *t is not a collected object. */
+ {_CleanUp_Set( t, c, d );}
+
+static void Call( T* t )
+ /* Sets the new clean-up function for BO(t) to be null and, if the
+ old one is non-null, calls it immediately, even if BO(t) is
+ still reachable. Deactivates any weak pointers to BO(t). */
+ {_CleanUp_Call( t );}
+
+class Queue {public:
+ Queue()
+ /* Constructs a new queue. */
+ {this->head = _CleanUp_Queue_NewHead();}
+
+ void Set( T* t )
+ /* q.Set(t) sets the clean-up queue of BO(t) to be q. */
+ {_CleanUp_Queue_Set( this->head, t );}
+
+ int Call()
+ /* If q is non-empty, q.Call() removes the first object and
+ calls its clean-up function; does nothing if q is
+ empty. Returns true if there are more objects in the
+ queue. */
+ {return _CleanUp_Queue_Call( this->head );}
+
+ private:
+ void* head;
+ };
+};
+
+/**********************************************************************
+
+Reachability and Clean-up
+
+An object O is reachable if it can be reached via a non-empty path of
+normal pointers from the registers, stacks, global variables, or an
+object with a non-null clean-up function (including O itself),
+ignoring pointers from an object to itself.
+
+This definition of reachability ensures that if object B is accessible
+from object A (and not vice versa) and if both A and B have clean-up
+functions, then A will always be cleaned up before B. Note that as
+long as an object with a clean-up function is contained in a cycle of
+pointers, it will always be reachable and will never be cleaned up or
+collected.
+
+When the collector finds an unreachable object with a null clean-up
+function, it atomically deactivates all weak pointers referencing the
+object and recycles its storage. If object B is accessible from object
+A via a path of normal pointers, A will be discovered unreachable no
+later than B, and a weak pointer to A will be deactivated no later
+than a weak pointer to B.
+
+When the collector finds an unreachable object with a non-null
+clean-up function, the collector atomically deactivates all weak
+pointers referencing the object, redefines its clean-up function to be
+null, and enqueues it on its clean-up queue. The object then becomes
+reachable again and remains reachable at least until its clean-up
+function executes.
+
+The clean-up function is assured that its argument is the only
+accessible pointer to the object. Nothing prevents the function from
+redefining the object's clean-up function or making the object
+reachable again (for example, by storing the pointer in a global
+variable).
+
+If the clean-up function does not make its object reachable again and
+does not redefine its clean-up function, then the object will be
+collected by a subsequent collection (because the object remains
+unreachable and now has a null clean-up function). If the clean-up
+function does make its object reachable again and a clean-up function
+is subsequently redefined for the object, then the new clean-up
+function will be invoked the next time the collector finds the object
+unreachable.
+
+Note that a destructor for a collected object cannot safely redefine a
+clean-up function for its object, since after the destructor executes,
+the object has been destroyed into "raw memory". (In most
+implementations, destroying an object mutates its vtbl.)
+
+Finally, note that calling delete t on a collected object first
+deactivates any weak pointers to t and then invokes its clean-up
+function (destructor).
+
+**********************************************************************/
+
+extern "C" {
+ void* _WeakPointer_New( void* t );
+ void* _WeakPointer_Pointer( void* wp );
+ int _WeakPointer_Equal( void* wp1, void* wp2 );
+ int _WeakPointer_Hash( void* wp );
+ void _CleanUp_Set( void* t, void (*c)( void* d, void* t ), void* d );
+ void _CleanUp_Call( void* t );
+ void* _CleanUp_Queue_NewHead ();
+ void _CleanUp_Queue_Set( void* h, void* t );
+ int _CleanUp_Queue_Call( void* h );
+}
+
+#endif /* _weakpointer_h_ */
+
+
diff --git a/boehm-gc/win32_threads.c b/boehm-gc/win32_threads.c
new file mode 100644
index 00000000000..eb485bdc064
--- /dev/null
+++ b/boehm-gc/win32_threads.c
@@ -0,0 +1,168 @@
+#ifdef WIN32_THREADS
+
+#include "gc_priv.h"
+
+#define STRICT
+#include <windows.h>
+
+#define MAX_THREADS 64
+
+struct thread_entry {
+ DWORD id;
+ HANDLE handle;
+ void *stack; /* The cold end of the stack. */
+ CONTEXT context;
+};
+
+struct thread_entry thread_table[MAX_THREADS];
+
+void GC_stop_world()
+{
+ DWORD thread_id = GetCurrentThreadId();
+ int i;
+ for (i = 0; i < MAX_THREADS; i++)
+ if (thread_table[i].stack != 0 && thread_table[i].id != thread_id) {
+ if (SuspendThread(thread_table[i].handle) == (DWORD)-1)
+ ABORT("SuspendThread failed");
+ }
+}
+
+void GC_start_world()
+{
+ DWORD thread_id = GetCurrentThreadId();
+ int i;
+ for (i = 0; i < MAX_THREADS; i++)
+ if (thread_table[i].stack != 0 && thread_table[i].id != thread_id) {
+ if (ResumeThread(thread_table[i].handle) == (DWORD)-1)
+ ABORT("ResumeThread failed");
+ }
+}
+
+ptr_t GC_current_stackbottom()
+{
+ DWORD thread_id = GetCurrentThreadId();
+ int i;
+ for (i = 0; i < MAX_THREADS; i++)
+ if (thread_table[i].stack && thread_table[i].id == thread_id)
+ return thread_table[i].stack;
+ ABORT("no thread table entry for current thread");
+}
+
+ptr_t GC_get_lo_stack_addr(ptr_t s)
+{
+ ptr_t bottom;
+ MEMORY_BASIC_INFORMATION info;
+ VirtualQuery(s, &info, sizeof(info));
+ do {
+ bottom = info.BaseAddress;
+ VirtualQuery(bottom - 1, &info, sizeof(info));
+ } while ((info.Protect & PAGE_READWRITE) && !(info.Protect & PAGE_GUARD));
+ return(bottom);
+}
+
+void GC_push_all_stacks()
+{
+ DWORD thread_id = GetCurrentThreadId();
+ int i;
+ for (i = 0; i < MAX_THREADS; i++)
+ if (thread_table[i].stack) {
+ ptr_t bottom = GC_get_lo_stack_addr(thread_table[i].stack);
+ if (thread_table[i].id == thread_id)
+ GC_push_all(&i, thread_table[i].stack);
+ else {
+ thread_table[i].context.ContextFlags
+ = (CONTEXT_INTEGER|CONTEXT_CONTROL);
+ if (!GetThreadContext(thread_table[i].handle,
+ &thread_table[i].context))
+ ABORT("GetThreadContext failed");
+ if (thread_table[i].context.Esp >= (DWORD)thread_table[i].stack
+ || thread_table[i].context.Esp < (DWORD)bottom)
+ ABORT("Thread stack pointer out of range");
+ GC_push_all_stack(thread_table[i].context.Esp, thread_table[i].stack);
+ }
+ }
+}
+
+void GC_get_next_stack(char *start, char **lo, char **hi)
+{
+ int i;
+# define ADDR_LIMIT (char *)(-1L)
+ char * current_min = ADDR_LIMIT;
+
+ for (i = 0; i < MAX_THREADS; i++) {
+ char * s = (char *)thread_table[i].stack;
+
+ if (0 != s && s > start && s < current_min) {
+ current_min = s;
+ }
+ }
+ *hi = current_min;
+ if (current_min == ADDR_LIMIT) {
+ *lo = ADDR_LIMIT;
+ return;
+ }
+ *lo = GC_get_lo_stack_addr(current_min);
+ if (*lo < start) *lo = start;
+}
+
+LONG WINAPI GC_write_fault_handler(struct _EXCEPTION_POINTERS *exc_info);
+
+/*
+ * This isn't generally safe, since DllMain is not premptible.
+ * If another thread holds the lock while this runs we're in trouble.
+ * Pontus Rydin suggests wrapping the thread start routine instead.
+ */
+BOOL WINAPI DllMain(HINSTANCE inst, ULONG reason, LPVOID reserved)
+{
+ switch (reason) {
+ case DLL_PROCESS_ATTACH:
+ InitializeCriticalSection(&GC_allocate_ml);
+ /* fall through */
+ case DLL_THREAD_ATTACH:
+ {
+ int i;
+ LOCK();
+ /* The following should be a noop according to the win32 */
+ /* documentation. There is empirical evidence that it */
+ /* isn't. - HB */
+ if (GC_incremental) SetUnhandledExceptionFilter(GC_write_fault_handler);
+ for (i = 0; thread_table[i].stack != 0; i++) {
+ if (i == MAX_THREADS - 1)
+ ABORT("too many threads");
+ }
+ thread_table[i].stack = GC_get_stack_base();
+ thread_table[i].id = GetCurrentThreadId();
+ if (!DuplicateHandle(GetCurrentProcess(),
+ GetCurrentThread(),
+ GetCurrentProcess(),
+ &thread_table[i].handle,
+ 0,
+ 0,
+ DUPLICATE_SAME_ACCESS)) {
+ DWORD last_error = GetLastError();
+ GC_printf1("Last error code: %lx\n", last_error);
+ ABORT("DuplicateHandle failed");
+ }
+ UNLOCK();
+ }
+ break;
+ case DLL_PROCESS_DETACH:
+ case DLL_THREAD_DETACH:
+ {
+ int i;
+ DWORD thread_id = GetCurrentThreadId();
+ LOCK();
+ for (i = 0; thread_table[i].stack == 0 || thread_table[i].id != thread_id; i++)
+ if (i == MAX_THREADS - 1)
+ ABORT("thread not found on detach");
+ thread_table[i].stack = 0;
+ CloseHandle(thread_table[i].handle);
+ BZERO(&thread_table[i].context, sizeof(CONTEXT));
+ UNLOCK();
+ }
+ break;
+ }
+ return TRUE;
+}
+
+#endif /* WIN32_THREADS */
diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index befc1522870..b0235f6fe91 100644
--- a/libjava/ChangeLog
+++ b/libjava/ChangeLog
@@ -1,3 +1,945 @@
+1999-08-01 Tom Tromey <tromey@cygnus.com>
+
+ * configure: Rebuilt.
+ * acinclude.m4 (version): Set to 2.95.0.
+
+Sun Aug 1 16:29:25 1999 Tom Tromey <tromey@ferrule.cygnus.com>
+
+ * Makefile.in: Rebuilt.
+ * Makefile.am (AM_CXXFLAGS): Added -fpermissive.
+
+1999-08-01 Alexandre Oliva <oliva@dcc.unicamp.br>
+
+ * configure.in: Check for bstring.h.
+ * configure, include/config.h.in: Rebuilt.
+ * java/net/natPlainDatagramSocketImpl.cc: #include bstring.h.
+ * java/net/natPlainSocketImpl.cc: Likewise.
+
+1999-07-31 Tom Tromey <tromey@cygnus.com>
+
+ * NEWS: Likewise.
+ * THANKS: New file.
+
+1999-07-31 Alexandre Oliva <oliva@dcc.unicamp.br>
+
+ * configure.in: Check for struct hostent_data and need for
+ -D_REENTRANT for gethostbyname_r declaration.
+ * java/net/natInetAddress.cc: Define _REENTRANT if needed.
+ (lookup): Use hostent_data for fixed_buffer.
+ * configure, include/config.h.in: Rebuilt.
+
+1999-07-31 Alexandre Oliva <oliva@dcc.unicamp.br>
+
+ * include/javaprims.h (TRUE, FALSE): Redefine as themselves.
+
+1999-07-31 Alexandre Oliva <oliva@dcc.unicamp.br>
+
+ * configure.in: Check for gcc 2.95 -g jboolean bug, that affects
+ Solaris/x86, adding -g0 to JCFLAGS and CXXFLAGS if needed.
+ AC_SUBST JCFLAGS.
+ * Makefile.am (JCFLAGS): Removed; automake will take care of it.
+ (JC1FLAGS): Replace -g with @JCFLAGS@.
+ * Makefile.in: Rebuilt.
+
+1999-07-31 Alexandre Oliva <oliva@dcc.unicamp.br>
+
+ * java/lang/natSystem.cc (arraycopy): Use bcopy if memmove is not
+ available. Don't cast memmove args to (void*).
+ * configure.in: Do not abort if memmove is not available.
+
+Sun Jul 25 01:43:34 1999 Anthony Green <green@cygnus.com>
+
+ * mauve-libgcj: Disable Object Serialization tests.
+
+1999-07-19 Tom Tromey <tromey@cygnus.com>
+
+ * include/stamp-h.in: New file.
+
+1999-07-12 Tom Tromey <tromey@cygnus.com>
+
+ * java/lang/mprec.h: Protect definition of uint32_t with #ifndef
+ _UINT32_T.
+
+1999-07-08 Tom Tromey <tromey@cygnus.com>
+
+ * mauve-libgcj: Omit InetAddressTest. Don't mention
+ MyURLConnection.
+
+1999-07-07 Tom Tromey <tromey@cygnus.com>
+
+ * mauve-libgcj: Omit SocketTest and URLConnectionTest.
+
+ * mauve-libgcj: Turn off many tests which are known to fail.
+
+1999-07-07 Andrew Haley <aph@cygnus.com>
+
+ * include/i386-signal.h (MAKE_THROW_FRAME): Advance EIP by two
+ bytes to make it point after the instruction where the trap
+ occurred.
+ (HANDLE_DIVIDE_OVERFLOW): Ditto.
+
+1999-07-07 Tom Tromey <tromey@cygnus.com>
+
+ * mauve-libgcj: Explicitly enable formerly disabled java.text
+ tests.
+
+ * mauve-libgcj: Turn off ClassTest test. Enable java.text tests
+ again.
+
+1999-07-01 Andrew Haley <aph@cygnus.com>
+
+ * include/i386-signal.h: Replace sigaction () with __sigaction ().
+ This is a workaround for a bug in glibc's pthreads package which
+ doesn't deliver any sigcontext information to a signal handler.
+
+1999-06-24 Tom Tromey <tromey@cygnus.com>
+
+ * java/lang/e_asin.c: Don't use __int32_t or __uint32_t.
+ * java/lang/fdlibm.h (HUGE): Conditionally define.
+
+Fri May 28 22:20:03 1999 Anthony Green <green@cygnus.com>
+
+ * java/lang/fdlibm.h: Don't use __uint32_t. Include mprec.h.
+ * java/lang/e_log.c: Don't use __uint32_t.
+
+1999-05-27 Eric Christopher <echristo@cygnus.com>
+
+ * configure: Rebuilt
+ * configure.in: Fixed ISO C9X and namespace collision with __uint32_t
+ * acconfig.h: Rebuilt
+ * include/config.h.in: Rebuilt
+
+ * java/lang/mprec.h, java/lang/e_acos.c, java/lang/e_asin.c,
+ java/lang/e_atan2.c, java/lang/e_exp.c, java/lang/e_fmod.c,
+ e_log.c, java/lang/e_pow.c, java/lang/e_rem_pio2.c,
+ java/lang/e_remainder.c, java/lang/e_sqrt.c, java/lang/fdlibm.h,
+ k_tan.c, java/lang/mprec.h, java/lang/s_atan.c,
+ java/lang/s_ceil.c, java/lang/s_copysign.c, java/lang/s_fabs.c,
+ s_floor.c, java/lang/s_rint.c, java/lang/sf_rint.c: Fixed ISO C9X
+ and namespace collision with __uint32_t
+
+1999-06-23 Tom Tromey <tromey@cygnus.com>
+
+ * java/util/zip/InflaterInputStream.java (read): Throw
+ ZipException if inflater throws a DataFormatException.
+
+1999-06-23 Warren Levy <warrenl@cygnus.com>
+
+ * java/net/DatagramSocketImpl.java (localPort): Fixed typo to match JDK.
+ * java/net/natPlainDatagramSocketImpl.cc (bind): ditto.
+ * java/text/ChoiceFormat.java (nextDouble(double, boolean)): Method
+ is not final per JDK.
+ * java/util/PropertyResourceBundle.java (handleGetObject): Method is
+ public per JDK.
+ * java/util/zip/DataFormatException.java: Class extends Exception.
+ * java/util/zip/Deflater.java (finalize): Method is protected per JDK.
+ * java/util/zip/ZipEntry.java: Class implements ZipConstants.
+ * java/util/zip/ZipInputStream.java: ditto.
+ (closeEntry): Changed method name to match JDK spec.
+
+1999-06-21 Tom Tromey <tromey@cygnus.com>
+
+ * java/lang/ieeefp.h (__IEEE_LITTLE_ENDIAN): Define for alpha.
+ From Jeff Sturm.
+
+ * Makefile.in: Rebuilt.
+ * Makefile.am (toolexeclibdir): Define as libdir when
+ appropriate.
+ * configure: Rebuilt.
+ * configure.in (USE_LIBDIR): New conditional.
+
+1999-06-18 Bryce McKinlay <bryce@albatross.co.nz>
+
+ * java/net/natInetAddress.cc (lookup): Preserve caller-supplied
+ hostname in returned InetAddress objects.
+ (getLocalHostname): Fix typo.
+ * java/net/InetAddress.java (getByName): Set hostname on return
+ object.
+ (getLocalHost): Call lookup directly to ensure that a fully-qualified
+ name is returned.
+
+1999-06-17 Bryce McKinlay <bryce@albatross.co.nz>
+
+ * java/net/natPlainSocketImpl.cc (bind): Bind to any/all network
+ interfaces if host==NULL.
+ (accept): Throw message with InterruptedIOException.
+ (getOption): Cache localAddress.
+ * java/net/natPlainDatagramSocketImpl.cc (bind): Don't need
+ 'address' for DatagramSocket.
+ (setTimeToLive): Fix compiler warnings.
+ (getOption): Cache localAddress.
+ * java/net/Socket.java (getLocalAddress): Don't need local
+ InetAddress object. Add FIXME comment about calling checkConnect().
+ * java/net/ServerSocket.java (ServerSocket(int)): Initialize
+ connection queue to 50 as per JDK 1.2 docs.
+ (ServerSocket(int,int)): Listen on all network interfaces by
+ default, per JDK 1.2 docs.
+ * java/net/PlainDatagramSocketImpl.java: Don't need 'address'.
+ Add localAddress caching.
+
+1999-06-15 Bryce McKinlay <bryce@albatross.co.nz>
+
+ * java/io/FilterOutputStream.java (write(byte[])): Rewrite according
+ to JDK 1.2 docs.
+ (write(byte[],int,int)): ditto.
+
+1999-06-14 Bryce McKinlay <bryce@albatross.co.nz>
+
+ * posix-threads.cc (_Jv_CondWait): Fix currentTimeMillis() overflow.
+
+1999-06-11 Warren Levy <warrenl@cygnus.com>
+
+ * mauve-libgcj: Activated java.net Mauve tests.
+
+1999-06-10 Bryce McKinlay <bryce@albatross.co.nz>
+
+ * java/net/natInetAddress.cc (aton): Fix typos.
+ (lookup): Use a bigger buffer size for gethostbyname_r on all
+ versions of glibc. Updated FIXME comment explaining this.
+ Modified while loops to not set herr = ERANGE to work around glibc
+ problems. Use user specified hostname in InetAddress result when
+ available (consistent with JDK).
+
+1999-06-10 Warren Levy <warrenl@cygnus.com>
+
+ * java/io/FileDescriptor.java (FileDescriptor(String, int)):
+ Throw FileNotFoundException instead of IOException.
+ (open): ditto.
+ * java/io/FileInputStream.java (FileInputStream): Doesn't throw
+ IOException.
+ * java/text/Collator.java (CANONICAL_DECOMPOSITION): Fixed typo
+ in static field name.
+ * java/text/DecimalFormat.java: Throw IllegalArgumentException
+ throughout rather than ParseException.
+
+1999-06-09 Bryce McKinlay <bryce@albatross.co.nz>
+
+ * java/lang/Runtime.java (exec): Convert prog name and arguments
+ to string array.
+ * java/lang/natPosixProcess.cc (startProcess): Fix typo in
+ environment array conversion. Preserve current environment if envp
+ not passed. Preserve PATH unless explicitly specified.
+ * java/io/DataInputStream.java (readLine): Fix case where '\r' is
+ followed by EOF. Set a flag when a line is terminated by '\r' and
+ ignore following '\n' if set.
+
+1999-06-02 Warren Levy <warrenl@cygnus.com>
+
+ * java/net/URL.java (URL(URL,String)): Initialize port to -1.
+ Ignore context if spec is an absolute URL. Fix braindead
+ string comparison.
+ (hashCode): Use JDK 1.2 style algorithm.
+ * java/net/URLStreamHandler.java (parseURL): Reimplement to handle
+ context URL properly.
+
+1999-05-30 Anthony Green <green@cygnus.com>
+
+ * java/net/URLStreamHandler.java (parseURL): Parse relative URLs
+ correctly. Clean up "/../" and "/./" path fragments.
+
+1999-05-28 Warren Levy <warrenl@cygnus.com>
+
+ * java/net/DatagramSocket.java (laddr): Removed.
+ (DatagramSocket): Removed attempts to get or set laddr if null.
+ (getLocalAddress): Reimplemented per spec.
+ * java/net/MulticastSocket.java (setTimeToLive): Throw exception
+ when ttl is 0.
+ (joinGroup): Throw NullPointerException if any argument is null.
+ (leaveGroup): ditto.
+ * java/net/PlainDatagramSocketImpl.java: Updated comments.
+ * java/net/PlainSocketImpl.java (timeout): Added.
+ (getInputStream): Added FIXME comment on how to support timeouts
+ for TCP.
+ * java/net/ServerSocket.java (ServerSocket): Added FIXME comment.
+ * java/net/Socket.java: Added FIXME comments to identify
+ conflicting specs between the JCL and JDK 1.2 documents.
+ * java/net/natPlainDatagramSocketImpl.cc (bind): Use INADDR_ANY
+ if host is null. Get localport value resolved by kernel if bind
+ lport is 0.
+ (receive): Implemented support for timeouts in UDP.
+ (setOption): Implemented based on natPlainSocketImpl version.
+ (getOption): ditto.
+ * java/net/natPlainSocketImpl.cc (bind): Get localport value
+ resolved by kernel if bind lport is 0.
+ (connect): Get localport value resolved by kernel if bind wasn't
+ done to set localport.
+ (accept): Implemented support for timeouts for ServerSocket.
+ (setOption): Save value for SO_TIMEOUT.
+ (getOption): Return timeout for SO_TIMEOUT.
+
+1999-05-26 Bryce McKinlay <bryce@albatross.co.nz>
+
+ * java/net/DatagramSocket.java (getSoTimeout): Verify class type.
+ * java/net/DatagramSocketImpl.java (getOption): Made abstract.
+ (setOption): Made abstract.
+ * java/net/PlainDatagramSocketImpl.java: Mirror SocketOptions fields
+ to avoid cpp conflicts in native code.
+ * java/net/PlainSocketImpl.java: Mirror SocketOptions fields to avoid
+ cpp conflicts in native code.
+ * java/net/ServerSocket.java (toString): Prepended "ServerSocket".
+ * java/net/Socket.java (getLocalAddress): Implemented.
+ (setTcpNoDelay): Implemented.
+ (getTcpNoDelay): Implemented.
+ (setSoLinger): Implemented.
+ (getSoLinger): Implemented.
+ (getSoTimeout): Verify class type.
+ (setSendBufferSize): Implemented.
+ (getSendBufferSize): Implemented.
+ (setReceiveBufferSize): Implemented.
+ (getReceiveBufferSize): Implemented.
+ (toString): Prepended "Socket".
+ * java/net/SocketImpl.java (toString): Rewritten.
+ (getOption): Made abstract.
+ (setOption): Made abstract.
+ * java/net/natPlainSocketImpl.cc (connect): Set localport properly.
+ (setOption): Implemented.
+ (getOption): Implemented.
+
+1999-05-26 Warren Levy <warrenl@cygnus.com>
+
+ * java/net/DatagramSocket.java (DatagramSocket): Get local host
+ address when null. Set SO_REUSEADDR for multicasts.
+ (getSoTimeout): Implemented.
+ (setSoTimeout): Implemented.
+ * java/net/DatagramSocketImpl.java: Implement SocketOptions interface.
+ * java/net/MulticastSocket.java (getInterface): Implemented.
+ (setInterface): Implemented.
+ (setTimeToLive): Check for invalid ttl.
+ (joinGroup): Verify multicast address and security.
+ (leaveGroup): Verify multicast address and security.
+ (send): Implemented.
+ * java/net/PlainDatagramSocketImpl.java (timeout): Added.
+ (iface): Added.
+ (ttl): Added.
+ (setOption): Added.
+ (getOption): Added.
+ (mcastGrp): Added.
+ (getTTL): Implemented as non-native.
+ (setTTL): ditto.
+ (join): ditto.
+ (leave): ditto.
+ * java/net/ServerSocket.java (setSoTimeout): Implemented.
+ (getSoTimeout): Implemented.
+ (setSocketFactory): Made synchronized.
+ * java/net/Socket.java (setSoTimeout): Implemented.
+ (getSoTimeout): Implemented.
+ (close): Made synchronized.
+ (setSocketImplFactory): Made synchronized.
+ * java/net/SocketImpl.java: Implement SocketOptions interface.
+ * java/net/natInetAddress.cc: Corrected module name at top of file.
+ * java/net/natPlainDatagramSocketImpl.cc (McastReq): Added union.
+ (bind): Added FIXME.
+ (peek): Implemented.
+ (setTTL): Removed.
+ (getTTL): Removed.
+ (join): Removed.
+ (leave): Removed.
+ (mcastGrp): Added.
+ (setOption): Implemented for SO_REUSEADDR.
+ (getOption): Implemented for SO_REUSEADDR.
+
+1999-05-24 Tom Tromey <tromey@cygnus.com>
+
+ * java/util/ResourceBundle.java (getBundle): Throw
+ NullPointerException if baseName is null.
+
+1999-05-22 Tom Tromey <tromey@cygnus.com>
+
+ * java/util/zip/ZipInputStream.java (fill): New method.
+ (compressed_len): New instance variable.
+ (getNextStream): Set it.
+ (read): Reset inflater on EOF. Only read via `super' if entry is
+ deflated.
+ (skip): Only skip via `super' if entry is deflated.
+ * java/util/zip/Deflater.java (last_input_count): Removed.
+ * java/util/zip/natDeflater.cc (deflate): Return 0 if input array
+ is length 0.
+ (needsInput): Don't use last_input_count.
+ (setInput): Don't set last_input_count.
+ * java/util/zip/natInflater.cc (getRemaining): Return correct
+ result.
+ (inflate): Return 0 if input array is length 0.
+ (setInput): Don't set last_input_count.
+ * java/util/zip/Inflater.java (last_input_count): Removed.
+
+1999-05-21 Tom Tromey <tromey@cygnus.com>
+
+ * Makefile.in: Rebuilt.
+ * Makefile.am (INCLUDES): Added $(ZINCS).
+ * configure: Rebuilt.
+ * configure.in (ZINCS): New subst.
+
+1999-05-21 Andrew Haley <aph@cygnus.com>
+
+ * include/sparc-signal.h (INIT_FPE, INIT_SEGV): SA_NODEFER added
+ to signal options to allow the same exceptions to be rethrown
+ later.
+
+1999-05-20 Andrew Haley <aph@cygnus.com>
+
+ * libjava/prims.cc (catch_fpe): Call to HANDLE_DIVIDE_OVERFLOW
+ added.
+ * include/i386-signal.h (HANDLE_DIVIDE_OVERFLOW): New macro.
+ (INIT_FPE): Exception string made more informative.
+ * include/sparc-signal.h (INIT_FPE): Exception string made more
+ informative.
+ * testsuite/libjava.lang/Divide_1.java: New file.
+ * testsuite/libjava.lang/Divide_1.out: New file.
+
+1999-05-19 Tom Tromey <tromey@cygnus.com>
+
+ * aclocal.m4, configure: Rebuilt.
+ * acinclude.m4 (version): New variable; pass to AM_INIT_AUTOMAKE.
+
+ * java/util/zip/GZIPOutputStream.java (write(byte[])): New
+ method.
+
+ * java/util/zip/natInflater.cc (inflate): Cast `len' to unsigned.
+ Include <stdlib.h>.
+ * java/util/zip/natDeflater.cc (deflate): Cast `len' to unsigned.
+ Include <stdlib.h>.
+ (update): Fail in default case. Always initialize `strat'.
+
+ * mauve-libgcj: Enable java.util.zip.
+
+1999-05-18 Warren Levy <warrenl@cygnus.com>
+
+ * Makefile.am (ordinary_java_source_files): Added DatagramPacket.java,
+ DatagramSocket.java, DatagramSocketImpl.java, MulticastSocket.java,
+ PlainDatagramSocketImpl.java, and SocketOptions.java.
+ (nat_source_files): Added natPlainDatagramSocketImpl.cc.
+ * Makefile.in: Rebuilt.
+
+ * java/net/DatagramPacket.java: New file.
+ * java/net/DatagramSocket.java: New file.
+ * java/net/DatagramSocketImpl.java: New file.
+ * java/net/MulticastSocket.java: New file.
+ * java/net/PlainDatagramSocketImpl.java: New file.
+ * java/net/SocketOptions.java: New file.
+ * java/net/natPlainDatagramSocketImpl.cc: New file.
+
+1999-05-18 Tom Tromey <tromey@cygnus.com>
+
+ * java/util/zip/ZipOutputStream.java (level): Initial value is
+ Deflater.DEFAULT_COMPRESSION.
+ (close): New method.
+ (closeEntry): Likewise.
+ (finish): Likewise.
+ (put_version): Likewise.
+ (write_entry): Likewise.
+ (put2, put4): Now return `int'.
+ (comment): Default to empty string.
+ (bytes_written): New instance variable.
+ (chain): Likewise.
+ * java/util/zip/ZipEntry.java (setComment): Limit length of
+ comment string.
+ (setCrc): Check CRC validity.
+ (setExtra): Check argument validity.
+ (setMethod): Likewise.
+ (setSize): Likewise.
+ (ZipEntry): Likewise.
+ * include/javaprims.h: Updated namespace declarations.
+ * Makefile.in: Rebuilt.
+ * Makefile.am (ordinary_java_source_files): Mention new files.
+ (nat_source_files): Likewise.
+ * java/util/zip/ZipFile.java (readu2): Throw ZipException, not
+ EOFException.
+ (read4): Likewise.
+ (getInputStream): Handle compressed entries.
+ * java/util/zip/GZIPOutputStream.java: New file.
+ * java/util/zip/GZIPInputStream.java: New file.
+ * java/util/zip/DataFormatException.java: New file.
+ * java/util/zip/CheckedInputStream.java: New file.
+ * java/util/zip/CheckedOutputStream.java: New file.
+ * java/util/zip/InflaterInputStream.java: Implemented.
+ * java/util/zip/natInflater.cc: New file.
+ * java/util/zip/Deflater.java: Implemented.
+ * java/util/zip/natDeflater.cc: New file.
+ * java/util/zip/DeflaterOutputStream.java: Implemented.
+
+ * java/util/zip/ZipInputStream.java (closeZipEntry): Throw
+ ZipException, not IOException.
+ * java/util/zip/ZipFile.java (readDirectory): Throw ZipException,
+ not IOException.
+
+1999-05-17 Tom Tromey <tromey@cygnus.com>
+
+ * java/lang/natSystem.cc (init_properties): URL now points to
+ sourceware.
+
+1999-05-12 Per Bothner <bothner@cygnus.com>
+
+ * java/util/Calendar.java (set): First call computeFields if needed.
+ * java/util/natGregorianCalendar.cc (computeTime): Cast 1000 to jlong.
+
+1999-05-12 Tom Tromey <tromey@cygnus.com>
+
+ * configure: Rebuilt.
+ * configure.in: Look for -ldl when using the Boehm collector.
+ Look for sched_yield in -lposix4.
+
+1999-05-12 Per Bothner <bothner@cygnus.com>
+
+ * java/io/File.java (mkdirs): Handle a null parent directory.
+
+1999-05-12 Tom Tromey <tromey@cygnus.com>
+
+ * include/javaprims.h: Updated namespace declarations.
+ * classes.pl (scan): Uniquify class list.
+ * Makefile.in, configure: Rebuilt.
+ * Makefile.am (nat_source_files): Added natConcreteProcess.cc.
+ (built_java_source_files): New macro.
+ (nat_headers): Added built_java_source_files.
+ (javao_files): Likewise.
+ (EXTRA_libgcj_la_SOURCES): Likewise.
+ (libgcj.zip): Create built class files.
+ ($(built_java_source_files:.java=.class)): New target.
+ (jv_convert_LDADD): Added -L$(here)/.libs.
+ * configure.in: Create links for ConcreteProcess.java and
+ natConcreteProcess.cc.
+ * java/lang/Runtime.java (exec): Create a ConcreteProcess.
+ * java/lang/natEcosProcess.cc: New file.
+ * java/lang/EcosProcess.java: New file.
+ * java/lang/PosixProcess.java: New file.
+ * java/lang/natPosixProcess.cc: New file.
+
+1999-05-12 Warren Levy <warrenl@cygnus.com>
+
+ * java/net/PlainSocketImpl.java: Corrected copyright & header comments.
+ * java/net/SocketImpl.java: Added marker for JDK 1.2 work.
+ * java/net/natPlainSocketImpl.cc (bind): Throw BindException.
+ (connect): Throw ConnectException.
+
+1999-05-11 Tom Tromey <tromey@cygnus.com>
+
+ * Makefile.in: Rebuilt.
+ * Makefile.am (jv_convert_DEPENDENCIES): Include libgcj.spec.
+ * libgcj.spec.in: Don't use `+'. Instead, put old lib spec after
+ our libraries.
+
+ * Makefile.in: Rebuilt.
+ * Makefile.am (jv_convert_LDADD): Removed `-L.'; it is not needed
+ and it causes problems with libtool.
+
+ * Makefile.in, configure: Rebuilt.
+ * Makefile.am (jv_convert_LDFLAGS): Removed -nodefaultlibs.
+ (jv_convert_LDADD): Added ZLIBS. Removed -lm, -lc, -lgcc.
+ (jv_convert_DEPENDENCIES): Added ZDEPS.
+ * configure.in (GCSPEC): Added `-L' to point to boehm-gc build
+ directory.
+ (THREADSPEC): Added `-L' to point to qthreads build directory.
+ (ZLIBS): New subst.
+ (ZDEPS): New subst.
+
+ * configure, Makefile.in: Rebuilt.
+ * Makefile.am (toolexeclib_DATA): New macro.
+ * configure.in: Create libgcj.spec. Look for -lsocket and -lnsl.
+ Recognize --with-system-zlib.
+ (GCSPEC): New subst.
+ (THREADSPEC): New subst.
+ (SYSTEMSPEC): New subst.
+ (ZLIBSPEC): New subst.
+ * libgcj.spec.in: New file.
+
+1999-05-10 Tom Tromey <tromey@cygnus.com>
+
+ * java/io/InputStreamReader.java (read): If length is 0, return
+ 0. Reset `wpos' and `wcount' when buffer has been filled and
+ emptied.
+
+ * java/util/Properties.java (save): Removed `FIXME' comment.
+ (load): Invalid characters in \u now treated as terminators.
+ Make sure to append character resulting from `\' handling.
+ Cast to `char' when appending to key or value.
+ (skip_ws): Inverted test for whitespace.
+
+ * java/io/RandomAccessFile.java (RandomAccessFile): Removed
+ `FIXME' comment.
+ (readLine): Likewise.
+ (readFully): Implemented.
+
+ * java/lang/natObject.cc (sync_init): Use _Jv_AllocBytesChecked.
+
+ * java/awt/natToolkit.cc: Added copyright header.
+ * java/util/zip/InflaterInputStream.java: Added copyright header.
+
+ * java/io/FilterWriter.java (FilterWriter): Removed `FIXME'
+ comment.
+ * java/io/SequenceInputStream.java (SequenceInputStream): Removed
+ `FIXME' comment.
+ (getNextStream): Likewise.
+
+ * java/util/ResourceBundle.java (partialGetBundle): Explicitly use
+ locale.toString().
+ (getBundle): Don't explicitly throw null pointer exception.
+
+ * gnu/gcj/RawData.java: Added copyright header.
+
+ * include/jni.h (_Jv_va_list): Always define as va_list.
+
+1999-05-9 Anthony Green <green@cygnus.com>
+
+ * java/text/DateFormat.java (computeInstance): Separate time
+ and date styles.
+ (getDateTimeInstance): Ditto.
+ (getDateTimeInstance(int,int)): New method.
+
+ * Makefile.in: Rebuilt.
+ * Makefile.am (ordinary_java_source_files): Add new classes.
+
+ * java/util/PropertyResourceBundle.java: New file.
+ * gnu/gcj/util/EnumerationChain.java: New file.
+
+1999-05-07 Tom Tromey <tromey@cygnus.com>
+
+ * acconfig.h (GCJVERSION): New undef.
+ * java/lang/natSystem.cc (init_properties): Define java.version,
+ java.class.version, os.name, os.arch, os.version.
+ Include <sys/utsname.h> if required.
+ * configure: Rebuilt.
+ * configure.in: Compute and define GCJVERSION.
+
+ * java/lang/natSystem.cc (default_file_encoding): Now static.
+
+ * java/lang/natCharacter.cc (isLowerCase): Use a binary search.
+
+ * libtool-version: New file.
+ * Makefile.in: Rebuilt.
+ * Makefile.am (libgcj_la_LDFLAGS): Use -version-info, not
+ -release.
+
+ * mauve-libgcj: Don't omit Utf8Encoding or StringTest.
+ Comment out FieldPosition, ParsePosition, and SimpleDateFormat
+ again (oops).
+
+ * mauve-libgcj: Test more from java.text. Don't mention 1.1 tests
+ (we pick those up already).
+
+1999-05-05 Per Bothner <bothner@cygnus.com>
+
+ * java/awt/*: Check a bunch of classes, a few complete, but mostly
+ stub classes. (This is enough to get Kawa to compile against libgcj.)
+
+ * gnu/gcj/RawData.java: New class.
+ * doc/cni.sgml: Document RawData.
+
+ * java/util/zip/InflaterInputStream.java: New stub class.
+ * java/util/zip/ZipInputStream.java: New class. Partly works.
+ * java/util/zip/ZipConstants.java: Add two (internal) constants.
+ * java/util/zip/ZipEntry.java (timeFromDOS): New static method.
+ * java/util/zip/ZipFile.java: Now mostly works (unless compressed).
+ * java/util/zip/ZipOutputStream.java: Start implementation.
+
+ * java/lang/natSystem.cc (DEFAULT_FILE_ENCODING): New macro.
+ (default_file_encoding): New global, initial value is above macro.
+ (init_properties): Default file.encoding to default_file_encoding.
+
+ * Makefile.am: Add new classes.
+
+1999-05-05 Tom Tromey <tromey@cygnus.com>
+
+ * Makefile.in: Rebuilt.
+ * Makefile.am (CLEANFILES): Don't mention $(class_files).
+ (clean-local): New target
+
+ * java/lang/natRuntime.cc: Include <ltdl.h> if required.
+ (load, loadLibrary): Now native.
+ (init): New method.
+ * java/lang/Runtime.java (load, loadLibrary): Now native.
+ (init): New native method.
+ (Runtime): Use init.
+ * prims.cc: Include <ltdl.h> if required.
+ (JvRunMain): Call LTDL_SET_PRELOADED_SYMBOLS.
+
+1999-05-05 Gilles Zunino <Gilles.Zunino@hei.fr>
+
+ * configure.in: Switch from irix threads to posix threads
+ * configure: Regenerate.
+
+1999-04-30 Tom Tromey <tromey@cygnus.com>
+
+ * Makefile.in: Rebuilt.
+ * Makefile.am (jv_convert_LDADD): Added -lgcc.
+
+1999-04-29 Tom Tromey <tromey@cygnus.com>
+
+ * java/lang/StringBuffer.java (ensureCapacity): Don't resize
+ vector when shared.
+
+ * java/util/Locale.java (Locale(String,String)): Implement in
+ terms of 3-argument version; variant now defaults to empty
+ string.
+ (toString): Assume variant is not null.
+ (equals): Assume all strings are not null.
+ (Locale): Throw NullPointerException if any argument is null.
+
+ * java/util/ResourceBundle.java (getBundle): Don't try the base
+ name; now implicit in partialGetBundle call.
+ (trySomeGetBundle): Search for parent bundles and call setParent
+ as required.
+ (partialGetBundle): Added `langStop' argument. Use
+ `Locale.toString' to compute bundleName.
+ (resource_cache): New static field.
+ (partialGetBundle): Cache the returned resource bundle. Now
+ synchronized.
+
+ * gnu/gcj/text/LocaleData_en.java (contents): [collatorRule] Added
+ missing `<'.
+
+ * mauve-libgcj: Enable Collator and RuleBasedCollator.
+ * java/text/natCollator.cc (decomposeCharacter): `base' now
+ `const'.
+ * Makefile.in: Rebuilt.
+ * Makefile.am (ordinary_java_source_files): Added
+ CollationElementIterator, CollationKey, Collator,
+ RuleBasedCollator.
+ (nat_source_files): Added natCollator.cc.
+ * java/text/RuleBasedCollator.java (ceiNext): No longer static.
+ (compare): Pass `this' to CollationElementIterator constructor.
+ (getCollationElementIterator): Likewise.
+ (ceiNext): Fix off-by-one error when finding initial substring.
+ (next): Correctly mask off bits when computing return value.
+ Fixed return values when one string is shorter than the other.
+ * java/text/CollationElementIterator.java (collator): New field.
+ (CollationElementIterator): Added collator argument.
+ (next): Call ceiNext on collator object.
+
+1999-04-26 Tom Tromey <tromey@cygnus.com>
+
+ * natCollator.cc: New file.
+
+ * java/util/GregorianCalendar.java (setDefaultTime): New method.
+ (GregorianCalendar): Use it in all constructors.
+ * java/util/Calendar.java (Calendar): Changed argument name to
+ `zone' to match code.
+
+ * gnu/gcj/text/LocaleData_en.java: Added collatorRule element.
+ * java/text/CollationKey.java: New file.
+ * java/text/CollationElementIterator.java: New file.
+ * java/text/Collator.java: New file.
+ * java/text/RuleBasedCollator.java: New file.
+
+ * Makefile.in: Rebuilt.
+ * Makefile.am (jv_convert_LDFLAGS): Added -nodefaultlibs.
+ (jv_convert_LDADD): Explicltly add -lm -lc.
+
+1999-04-26 Tom Tromey <tromey@cygnus.com>
+
+ * configure, Makefile.in: Rebuilt.
+ * configure.in: Added AM_PROG_LIBTOOL.
+ (GCOBJS): Use `.lo' form of files.
+ (THREADOBJS): Likewise.
+ (GCDEPS): Use `.la' form of library.
+ (GCLIBS): Set to be the same as GCDEPS.
+ (THREADDEPS): Use `.la' form of library.
+ (THREADLIBS): Set to be the same as THREADDEPS.
+ * Makefile.am (toolexeclib_LTLIBRARIES): Renamed from
+ toolexeclib_LIBRARIES.
+ (libgcj_la_SOURCES): Renamed for libtoolization.
+ (EXTRA_libgcj_la_SOURCES): Likewise.
+ (libgcj_la_DEPENDENCIES): Likewise.
+ (libgcj_la_LIBADD): Likewise.
+ ($(nat_files)): Use LTCXXCOMPILE.
+ ($(c_files)): Use LTCOMPILE.
+ (GCJCOMPILE): New macro.
+ (.class.o): Use it.
+ (.java.o): Likewise.
+ ($(javao_files)): Likewise.
+ (jv_convert_LINK): Use LIBTOOL.
+ (nat_files): Use `.lo' files.
+ (c_files): Likewise.
+ (javao_files): Likewise.
+ (.class.lo): Renamed.
+ (.java.lo): Likewise.
+ ($(nat_files)): Depend on %.lo.
+ ($(c_files)): Likewise.
+ ($(javao_files)): Likewise.
+ (jv_convert_LDADD): Link against .lo files.
+ (jv_convert_DEPENDENCIES): Depend on .lo files.
+ (maintainer-check): Depend on libgcj.la, but examine .a file.
+ (jv_convert_DEPENDENCIES): Depend on libgcj.la.
+ (libgcj_la_LDFLAGS): New macro.
+
+1999-04-23 Warren Levy <warrenl@cygnus.com>
+
+ * Makefile.am: Added URLDecoder and URLEncoder.
+ * Makefile.in: Rebuilt.
+
+ * java/net/ServerSocket.java (setSocketFactory): Renamed from
+ setSocketImplFactory to match spec.
+ * java/net/Socket.java (getSoLinger): Changed return type to
+ match spec.
+
+ * java/net/URLDecoder.java: New file.
+ * java/net/URLEncoder.java: New file.
+
+1999-04-21 Tom Tromey <tromey@cygnus.com>
+
+ * java/lang/natString.cc (getBytes): Reverted earlier change and
+ applied correct fix from Per Bothner.
+
+ * java/lang/String.java: Don't throw
+ UnsupportedEncodingException.
+
+ * java/lang/natString.cc (getBytes): Correctly size result
+ buffer. From Bryce McKinlay <bryce@albatross.co.nz>.
+
+1999-04-20 Andrew Haley <aph@cygnus.com>
+
+ * include/sparc-signal.h: new file.
+ * configure.in: include/sparc-signal.h added.
+ * configure: regenerated.
+ * prims.cc (JvRunMain): signal handling code rewritten to be more
+ portable.
+ (catch_segv): ditto.
+ (catch_fpe): ditto.
+ * include/i386-signal.h: reorganized.
+ * include/default-signal.h: reorganized.
+
+1999-04-19 Tom Tromey <tromey@cygnus.com>
+
+ * java/lang/natSystem.cc (init_properties): Only declare pwd_entry
+ once. From Anthony Green.
+
+1999-04-19 Andrew Haley <aph@cygnus.com>
+
+ * Makefile.in: Processed with new automake.
+
+1999-04-19 Tom Tromey <tromey@cygnus.com>
+
+ * include/javaprims.h: Removed security namespace.
+
+1999-04-20 Anthony Green <green@cygnus.com>
+
+ * java/io/PrintStream.java (println): Remove extra println.
+
+1999-04-19 Anthony Green <green@cygnus.com>
+
+ * Makefile.in: Rebuilt.
+ * Makefile.am (ordinary_java_source_files): Add new security files.
+
+ * java/security/NoSuchAlgorithmException.java,
+ java/security/MessageDigest.java: New files.
+
+ * include/javaprims.h: Add security namespace.
+
+1999-04-16 Per Bothner <bothner@cygnus.com>
+
+ * gnu/gcj/convert/JIS0201.h: New file, generated from Unicode table.
+ * gnu/gcj/convert/Input_JavaSrc.java: New BytesToUnicode class.
+ * gnu/gcj/convert/Input_SJIS.java: New BytesToUnicode class.
+ * gnu/gcj/convert/Output_EUCJIS.java: New UnicodeToBytes class.
+ * gnu/gcj/convert/Output_SJIS.java: New UnicodeToBytes class.
+ * gnu/gcj/convert/natInput_EUCJIS.cc: New file.
+ * gnu/gcj/convert/natInput_SJIS.cc: New file.
+ * gnu/gcj/convert/natOutput_EUCJIS.cc: New file.
+ * gnu/gcj/convert/natOutput_SJIS.cc: New file.
+ * gnu/gcj/convert/make-trie.c: New file: functions to make a trie.
+ * gnu/gcj/convert/gen-from-JIS.c: Invoke make-trie for output.
+ * gnu/gcj/convert/Unicode_to_JIS.cc: New generated trie table.
+ * Makefile.am: Various changes for new files and conversions.
+
+ * gnu/gcj/convert/UnicodeToBytes.java (write(String,int,int,char[])):
+ New overloading, allows greater efficiency.
+ * gnu/gcj/convert/Output_8859_1.java (write(String,int,int,char[])):
+ New overloading (for efficiency - avoids copying).
+
+ * gnu/gcj/convert/Output_UTF8.java: Fix typo: 0xC0 -> 0c3F.
+ * gnu/gcj/convert/Input_UTF8.java: Fix typos in bit masks.
+
+ * java/io/InputStreamReader.java (<init>): Set super.in correctly.
+ * java/io/OutputStreamWriter.java (<init>): Set super.in correctly.
+ (writeChars): Don't be quite so eager to flush.
+ * java/io/PrintStream.java: Rewrite. Now more similar to
+ OutputStreamWriter, using explicit UnicodeToBytes converter.
+ Also, autoflush does not need to flush so often.
+ * java/lang/natString.cc (getBytes): More efficient algorithm.
+ (init(jbyteArray,jint,jint,jstring)): More efficient.
+
+1999-04-15 Warren Levy <warrenl@cygnus.com>
+
+ * Makefile.am (ordinary_java_source_files): Added new Connection
+ and Handler classes in gnu.gcj.protocol.file package.
+ * Makefile.in: Rebuilt.
+
+ * gnu/gcj/protocol/file/Connection.java: New file.
+ * gnu/gcj/protocol/file/Handler.java: New file.
+ * gnu/gcj/protocol/http/Connection.java (getInputStream): Check
+ if doInput allows input.
+ (getOutputStream): Check if doOutput allows output.
+ * java/net/URLStreamHandler.java (parseURL): Fix indentation.
+
+1999-04-14 Tom Tromey <tromey@cygnus.com>
+
+ * java/net/natInetAddress.cc (lookup): On glibc2.0 systems, make
+ buffer larger to work around bug.
+ From Bryce McKinlay <bryce@albatross.co.nz>.
+
+1999-04-14 Andrew Haley <aph@cygnus.com>
+
+ * java/lang/natDouble.java (doubleToLongBits): ensure that all
+ NaNs are always converted to the same long value.
+ * java/lang/natFloat.java (floatToIntBits): ditto, but for float
+ converted to int.
+
+1999-04-13 Tom Tromey <tromey@cygnus.com>
+
+ * java/lang/natSystem.cc (arraycopy): Don't always use jbyteArray;
+ instead switch on actual element type.
+
+ * Makefile.in: Rebuilt.
+ * Makefile.am (AM_MAKEFLAGS): Added JC1FLAGS.
+
+1999-04-13 Andrew Haley <aph@cygnus.com>
+
+ * include/i386-signal.h, include/default-signal.h: New files.
+ * prims.cc (catch_segv): Call MAKE_THROW_FRAME in exception
+ handler.
+ (catch_fpe): New function.
+ * configure.in: Make link to appropriate include/java-signal.h.
+ * configure: Rebuilt.
+ * Makefile.am: include/java-signal.h added to dependency list.
+ * Makefile.in: Rebuilt.
+
+1999-04-12 Urban Widmark <urban@svenskatest.se>
+
+ * java/io/DataInputStream.java (readLine): Corrected handling of
+ empty lines, from null to "".
+
+1999-04-12 Tom Tromey <tromey@cygnus.com>
+
+ * Makefile.in: Rebuilt.
+ * Makefile.am (libgcj.zip): Put `gnu' classes into zip file.
+
+ * java/lang/natSystem.cc (SystemClass): New define.
+ (init_properties): Synchronize.
+
+1999-04-08 Geoff Berry <gcb@gnu.org>
+
+ * natInetAddress.cc (lookup): Fix typo (AF_INET16 -> AF_INET6).
+ * natPlainSocketImpl.cc (accept): Add missing else if check
+ for AF_INET6.
+
+1999-04-08 Tom Tromey <tromey@cygnus.com>
+
+ * java/lang/Long.java (parseLong): Corrected overflow detection
+ code.
+ * java/lang/Integer.java (parseInt): Corrected overflow detection
+ code.
+
+ * java/io/PrintStream.java (print): Handle null string argument.
+ (println): Likewise.
+
+1999-04-07 Warren Levy <warrenl@cygnus.com>
+
+ * java/lang/natString.cc (init(jbyteArray,jint,jint,jstring)):
+ Set count to 0 when InputStreamReader returns -1 for EOF.
+
+1999-04-07 Tom Tromey <tromey@cygnus.com>
+
+ * mauve-libgcj: Omit java.text.Collator,
+ java.text.RuleBasedCollator.
+
1999-04-06 Tom Tromey <tromey@cygnus.com>
* gnu/gcj/protocol/http/Connection.java (getHeaderField): Catch
diff --git a/libjava/Makefile.am b/libjava/Makefile.am
index eed9d2ac600..dc638d1aeaf 100644
--- a/libjava/Makefile.am
+++ b/libjava/Makefile.am
@@ -12,10 +12,17 @@ endif
## What gets installed, and where.
##
+## Install a library built with a cross compiler in tooldir, not
+## libdir.
+if USE_LIBDIR
+toolexeclibdir = $(libdir)
+else
toolexecdir = $(exec_prefix)/$(target_alias)
toolexeclibdir = $(toolexecdir)/lib$(MULTISUBDIR)
+endif
-toolexeclib_LIBRARIES = libgcj.a
+toolexeclib_LTLIBRARIES = libgcj.la
+toolexeclib_DATA = libgcj.spec
data_DATA = libgcj.zip
## For now, only on native systems.
@@ -53,22 +60,25 @@ GCJH = $(MULTIBUILDTOP)../$(COMPPATH)/gcc/gcjh$(EXEEXT)
ZIP = $(MULTIBUILDTOP)../$(COMPPATH)/zip/zip$(EXEEXT)
endif # CANADIAN
+GCJCOMPILE = CLASSPATH=$(here) $(LIBTOOL) --mode=compile $(GCJ) -fassume-compiled $(JC1FLAGS) -c
+
JAVAC = $(GCJ) -C
EH_COMMON_INCLUDE = @EH_COMMON_INCLUDE@
WARNINGS = -W -Wall
-AM_CXXFLAGS = -fno-rtti -fvtable-thunks @LIBGCJ_CXXFLAGS@ $(WARNINGS)
+## Need -fpermissive for SunOS. FIXME.
+AM_CXXFLAGS = -fno-rtti -fvtable-thunks -fpermissive @LIBGCJ_CXXFLAGS@ $(WARNINGS)
if USING_GCC
AM_CFLAGS = @LIBGCJ_CFLAGS@ $(WARNINGS)
else
AM_CFLAGS = @LIBGCJ_CFLAGS@
endif
-JCFLAGS = -g
-JC1FLAGS = -g @LIBGCJ_JAVAFLAGS@
+JC1FLAGS = @JCFLAGS@ @LIBGCJ_JAVAFLAGS@
-INCLUDES = -Iinclude -I$(top_srcdir)/include $(GCINCS) $(THREADINCS) $(EH_COMMON_INCLUDE)
+INCLUDES = -Iinclude -I$(top_srcdir)/include $(GCINCS) $(THREADINCS) \
+ $(EH_COMMON_INCLUDE) $(ZINCS)
## ################################################################
@@ -78,19 +88,23 @@ INCLUDES = -Iinclude -I$(top_srcdir)/include $(GCINCS) $(THREADINCS) $(EH_COMMON
##
## Objects from C++ sources in subdirs.
-nat_files = $(nat_source_files:.cc=.o)
+nat_files = $(nat_source_files:.cc=.lo)
## Objects from C sources in subdirs.
-c_files = $(c_source_files:.c=.o)
+c_files = $(c_source_files:.c=.lo)
## Objects from Java sources in subdirs.
-javao_files = $(java_source_files:.java=.o)
+javao_files = $(java_source_files:.java=.lo) \
+ $(built_java_source_files:.java=.lo)
-libgcj_a_SOURCES = prims.cc jni.cc exception.cc
-EXTRA_libgcj_a_SOURCES = boehm.cc nogc.cc posix-threads.cc no-threads.cc \
- $(c_source_files) $(java_source_files)
-libgcj_a_DEPENDENCIES = libgcj.zip $(javao_files) $(nat_files) \
+libgcj_la_SOURCES = prims.cc jni.cc exception.cc
+EXTRA_libgcj_la_SOURCES = boehm.cc nogc.cc posix-threads.cc no-threads.cc \
+ $(c_source_files) $(java_source_files) $(built_java_source_files)
+libgcj_la_DEPENDENCIES = libgcj.zip $(javao_files) $(nat_files) \
$(c_files) $(GCOBJS) $(THREADOBJS)
-libgcj_a_LIBADD = $(javao_files) $(nat_files) $(c_files) $(GCOBJS) \
+libgcj_la_LIBADD = $(javao_files) $(nat_files) $(c_files) $(GCOBJS) \
$(THREADOBJS)
+libgcj_la_LDFLAGS = -rpath $(toolexeclibdir) \
+## The mysterious backslash is consumed by make.
+ -version-info `grep -v '^\#' $(srcdir)/libtool-version`
## Make the .class files depend on the .zip file. This seems
## backwards, but is right. This doesn't catch all the .class files,
@@ -100,6 +114,14 @@ libgcj_a_LIBADD = $(javao_files) $(nat_files) $(c_files) $(GCOBJS) \
## hand-maintained headers.
$(java_source_files:.java=.class): libgcj.zip
+## FIXME: this isn't really correct.
+$(built_java_source_files:.java=.class): $(built_java_source_files)
+## This little nastiness is here so that the backquoted stuff in the
+## GCJ definition can be correctly expanded, if required.
+ javac="$(JAVAC)"; \
+ $$javac $(JCFLAGS) -classpath $(here):`cd $(srcdir) && /bin/pwd` \
+ -d $(here) $?
+
## We have the zip file depend on the java sources and not the class
## files, because we don't know the names of all the class files.
## FIXME: this method fails in a peculiar case: if libgcj.zip is
@@ -107,6 +129,9 @@ $(java_source_files:.java=.class): libgcj.zip
## `make libgcj.zip' will not rebuilt foo.class. That's because
## libgcj.zip is not out-of-date with respect to foo.java.
libgcj.zip: $(java_source_files)
+## FIXME: this ought to depend on built_java_source_files, but right
+## now it can't. Ugly.
+ $(MAKE) $(built_java_source_files:.java=.class)
## This little nastiness is here so that the backquoted stuff in the
## GCJ definition can be correctly expanded, if required.
javac="$(JAVAC)"; cd $(srcdir); \
@@ -114,38 +139,42 @@ libgcj.zip: $(java_source_files)
$(subst $(srcdir)/,,$?)
-@rm -f libgcj.zip
## Note that we explicitly want to include directory information.
- $(ZIP) -r libgcj java -n .class -i '*.class' -i '*/'
+ $(ZIP) -r libgcj java gnu -n .class -i '*.class' -i '*/'
MOSTLYCLEANFILES = $(javao_files) $(nat_files) $(nat_headers) $(c_files)
-CLEANFILES = libgcj.zip $(class_files)
+CLEANFILES = libgcj.zip
+
+clean-local:
+## We just remove every .class file that was created.
+ find . -name '*.class' -print | xargs rm -f
SUFFIXES = .class .java .h
-.class.o:
- CLASSPATH=$(here) $(CC) -fassume-compiled $(JC1FLAGS) -c -o $@ $<
+.class.lo:
+ $(GCJCOMPILE) -o $@ $<
-.java.o:
- CLASSPATH=$(here) $(GCJ) -fassume-compiled $(JC1FLAGS) -c -o $@ $<
+.java.lo:
+ $(GCJCOMPILE) -o $@ $<
## This is GNU make specific. For the .o files in subdirs, use a
## special rule. The standard automake rule can't be overridden (this
## is a bug in automake), and it also won't put the .o files into
## subdirs. FIXME.
-$(nat_files): %.o: %.cc
- $(CXXCOMPILE) -c -o $@ $<
+$(nat_files): %.lo: %.cc
+ $(LTCXXCOMPILE) -c -o $@ $<
-$(nat_files) $(GCOBJS) $(THREADOBJS) $(libgcj_a_OBJECTS): \
- include/config.h $(nat_headers)
+$(nat_files) $(GCOBJS) $(THREADOBJS) $(libgcj_la_OBJECTS): \
+ include/config.h include/java-signal.h $(nat_headers)
## FIXME: GNU make.
-$(c_files): %.o: %.c
- $(COMPILE) -c -o $@ $<
+$(c_files): %.lo: %.c
+ $(LTCOMPILE) -c -o $@ $<
$(c_files): java/lang/fdlibm.h java/lang/ieeefp.h java/lang/mprec.h
## FIXME: GNU make.
-$(javao_files): %.o: %.java
- CLASSPATH=$(here) $(GCJ) -fassume-compiled $(JC1FLAGS) -c -o $@ $<
+$(javao_files): %.lo: %.java
+ $(GCJCOMPILE) -o $@ $<
## ################################################################
@@ -158,7 +187,8 @@ $(javao_files): %.o: %.java
$(GCJH) -classpath $(top_builddir) $(basename $<)
## Header files used when compiling some of the nat* files.
-nat_headers = $(ordinary_java_source_files:.java=.h)
+nat_headers = $(ordinary_java_source_files:.java=.h) \
+ $(built_java_source_files:.java=.h)
$(nat_headers): libgcj.zip
@@ -210,8 +240,8 @@ java/lang/reflect/Method.h: java/lang/reflect/Method.class libgcj.zip
NM = nm
## Try to make sure our library doesn't stomp the namespace.
-maintainer-check: libgcj.a
- $(NM) libgcj.a | grep ' T ' \
+maintainer-check: libgcj.la
+ $(NM) .libs/libgcj.a | grep ' T ' \
## Anything with `4java' is assumed to be from .java source.
| grep -v '4java' \
## Anything with Jv is ok.
@@ -248,44 +278,77 @@ CONVERT_DIR = gnu/gcj/convert
jv_convert_SOURCES =
EXTRA_jv_convert_SOURCES = $(convert_source_files)
-jv_convert_LDFLAGS = --main=gnu.gcj.convert.Convert
-jv_convert_LINK = $(GCJ) $(JC1FLAGS) $(LDFLAGS) -o jv-convert
-jv_convert_LDADD = $(convert_source_files:.java=.o) -L. $(GCLIBS) $(THREADLIBS)
-jv_convert_DEPENDENCIES = $(convert_source_files:.java=.o) \
- $(GCDEPS) $(THREADDEPS) libgcj.a
+## We need -nodefaultlibs because we want to avoid gcj's `-lgcj'. We
+## need this because we are explicitly using libtool to link using the
+## `.la' file.
+jv_convert_LDFLAGS = --main=gnu.gcj.convert.Convert \
+ -rpath $(toolexeclibdir)
+jv_convert_LINK = $(LIBTOOL) --mode=link $(GCJ) $(JC1FLAGS) $(LDFLAGS) \
+ -o jv-convert
+## We explicitly link in the libraries we need. This way we don't
+## need -nodefaultlibs, so we can still rely on gcj picking up the
+## system libraries we need (via the specs file).
+## We need the -L so that gcj can find libgcj with `-lgcj'.
+## FIXME: should be _libs on some systems.
+jv_convert_LDADD = $(convert_source_files:.java=.lo) libgcj.la \
+ $(GCLIBS) $(THREADLIBS) $(ZLIBS) -L$(here)/.libs
+## Depend on the spec file to make sure it is up to date before
+## linking this program.
+jv_convert_DEPENDENCIES = $(convert_source_files:.java=.lo) \
+ $(GCDEPS) $(THREADDEPS) $(ZDEPS) libgcj.la libgcj.spec
+
+# The Unicode consortium does not permit re-distributing the file JIS0201.TXT.
+# You can get it from ftp://ftp.unicode.org/Public/MAPPINGS/EASTASIA/JIS/.
+
+$(srcdir)/$(CONVERT_DIR)/JIS0201.h: # $(CONVERT_DIR)/JIS0201.TXT
+ echo '/* This file is automatically generated from Unicode tables */' > tmp-0201; \
+ tr -d '\r' <$(CONVERT_DIR)/JIS0201.TXT \
+ | sed -n -e 's|\(0x..\).*\(0x....\).*#\(.*\)$$|MAP(0x00, \1, \2) /*\3 */|p' \
+ >> tmp-0201; \
+ mv tmp-0201 $(srcdir)/$(CONVERT_DIR)/JIS0201.h
# The Unicode consortium does not permit re-distributing the file JIS0208.TXT.
# You can get it from ftp://ftp.unicode.org/Public/MAPPINGS/EASTASIA/JIS/.
-$(srcdir)/$(CONVERT_DIR)/JIS0208.h: # JIS0208.TXT
- echo '/* This file is autoamtically generated from Unicode tables */' > tmp-0208; \
- sed -n -e 's|\(0x....\).*0x\(..\)\(..\).*\(0x....\).*#\(.*\).$$|MAP(0x\2, 0x\3, \4) /*\5 */|p' \
- <JIS0208.TXT >> tmp-0208; \
+$(srcdir)/$(CONVERT_DIR)/JIS0208.h: # $(CONVERT_DIR)/JIS0208.TXT
+ echo '/* This file is automatically generated from Unicode tables */' > tmp-0208; \
+ tr -d '\r' <$(CONVERT_DIR)/JIS0208.TXT \
+ | sed -n -e 's|\(0x....\).*0x\(..\)\(..\).*\(0x....\).*#\(.*\)$$|MAP(0x\2, 0x\3, \4) /*\5 */|p' \
+ >> tmp-0208; \
mv tmp-0208 $(srcdir)/$(CONVERT_DIR)/JIS0208.h
# The Unicode consortium does not permit re-distributing the file JIS0212.TXT.
# You can get it from ftp://ftp.unicode.org/Public/MAPPINGS/EASTASIA/JIS/.
-$(srcdir)/$(CONVERT_DIR)/JIS0212.h: # JIS0212.TXT
- echo '/* This file is autoamtically generated from Unicode tables */' > tmp-0212; \
- sed -n -e 's|0x\(..\)\(..\).*\(0x....\).*#\(.*\).$$|MAP(0x\1, 0x\2, \3) /*\4 */|p' \
- <JIS0212.TXT >> tmp-0212; \
+$(srcdir)/$(CONVERT_DIR)/JIS0212.h: # $(CONVERT_DIR)/JIS0212.TXT
+ echo '/* This file is automatically generated from Unicode tables */' > tmp-0212; \
+ tr -d '\r' <$(CONVERT_DIR)/JIS0212.TXT \
+ | sed -n -e 's|0x\(..\)\(..\).*\(0x....\).*#\(.*\)$$|MAP(0x\1, 0x\2, \3) /*\4 */|p' \
+ >> tmp-0212; \
mv tmp-0212 $(srcdir)/$(CONVERT_DIR)/JIS0212.h
gen_from_JIS_SOURCES =
EXTRA_gen_from_JIS_SOURCES = $(srcdir)/$(CONVERT_DIR)/gen-from-JIS.c \
+ $(srcdir)/$(CONVERT_DIR)/make-trie.c \
+ $(srcdir)/$(CONVERT_DIR)/JIS0201.h \
$(srcdir)/$(CONVERT_DIR)/JIS0208.h \
$(srcdir)/$(CONVERT_DIR)/JIS0212.h
-gen_from_JIS_LDADD = $(CONVERT_DIR)/gen-from-JIS.o
-gen_from_JIS_DEPENDENCIES = $(CONVERT_DIR)/gen-from-JIS.o
+gen_from_JIS_LDADD = $(CONVERT_DIR)/gen-from-JIS.o $(CONVERT_DIR)/make-trie.o
+gen_from_JIS_DEPENDENCIES = $(CONVERT_DIR)/gen-from-JIS.o \
+ $(CONVERT_DIR)/make-trie.o
$(CONVERT_DIR)/gen-from-JIS.o: $(srcdir)/$(CONVERT_DIR)/gen-from-JIS.c \
+ $(srcdir)/$(CONVERT_DIR)/JIS0201.h \
$(srcdir)/$(CONVERT_DIR)/JIS0208.h \
$(srcdir)/$(CONVERT_DIR)/JIS0212.h
$(COMPILE) -c -o $(CONVERT_DIR)/gen-from-JIS.o \
$(srcdir)/$(CONVERT_DIR)/gen-from-JIS.c
+$(CONVERT_DIR)/make-trie.o: $(srcdir)/$(CONVERT_DIR)/make-trie.c
+ $(COMPILE) -c -o $(CONVERT_DIR)/make-trie.o \
+ $(srcdir)/$(CONVERT_DIR)/make-trie.c
+
if NATIVE
if MAINTAINER_MODE
@@ -295,6 +358,9 @@ $(srcdir)/$(CONVERT_DIR)/JIS0208_to_Unicode.cc: ./gen-from-JIS$(EXEEXT)
$(srcdir)/$(CONVERT_DIR)/JIS0212_to_Unicode.cc: ./gen-from-JIS$(EXEEXT)
./gen-from-JIS JIS0212>$(srcdir)/$(CONVERT_DIR)/JIS0212_to_Unicode.cc
+$(srcdir)/$(CONVERT_DIR)/Unicode_to_JIS.cc: ./gen-from-JIS$(EXEEXT)
+ ./gen-from-JIS toJIS>$(srcdir)/$(CONVERT_DIR)/Unicode_to_JIS.cc
+
endif # MAINTAINER_MODE
endif # NATIVE
@@ -310,9 +376,13 @@ gnu/gcj/convert/BytesToUnicode.java \
gnu/gcj/convert/Convert.java \
gnu/gcj/convert/Input_8859_1.java \
gnu/gcj/convert/Input_EUCJIS.java \
+gnu/gcj/convert/Input_JavaSrc.java \
+gnu/gcj/convert/Input_SJIS.java \
gnu/gcj/convert/Input_UTF8.java \
gnu/gcj/convert/Output_8859_1.java \
+gnu/gcj/convert/Output_EUCJIS.java \
gnu/gcj/convert/Output_JavaSrc.java \
+gnu/gcj/convert/Output_SJIS.java \
gnu/gcj/convert/Output_UTF8.java \
gnu/gcj/convert/UnicodeToBytes.java
@@ -320,6 +390,53 @@ gnu/gcj/convert/UnicodeToBytes.java
## hand.
special_java_source_files = java/lang/Class.java java/lang/Object.java
+awt_java_source_files = \
+java/awt/AWTEvent.java \
+java/awt/BorderLayout.java \
+java/awt/Component.java \
+java/awt/Container.java \
+java/awt/Dimension.java \
+java/awt/Event.java \
+java/awt/Font.java \
+java/awt/Frame.java \
+java/awt/LayoutManager.java \
+java/awt/LayoutManager2.java \
+java/awt/Menu.java \
+java/awt/MenuBar.java \
+java/awt/MenuItem.java \
+java/awt/MenuComponent.java \
+java/awt/MenuContainer.java \
+java/awt/Point.java \
+java/awt/Rectangle.java \
+java/awt/Shape.java \
+java/awt/TextArea.java \
+java/awt/TextComponent.java \
+java/awt/Toolkit.java \
+java/awt/Window.java \
+java/awt/event/ActionEvent.java \
+java/awt/event/ActionListener.java \
+java/awt/event/ComponentEvent.java \
+java/awt/event/InputEvent.java \
+java/awt/event/KeyEvent.java \
+java/awt/event/KeyListener.java \
+java/awt/event/TextEvent.java \
+java/awt/event/TextListener.java \
+java/awt/event/WindowAdapter.java \
+java/awt/event/WindowEvent.java \
+java/awt/event/WindowListener.java \
+java/awt/geom/Point2D.java \
+java/awt/geom/Dimension2D.java \
+java/awt/peer/ComponentPeer.java \
+java/awt/peer/ContainerPeer.java \
+java/awt/peer/FramePeer.java \
+java/awt/peer/WindowPeer.java
+
+# $(awt_java_source_files)
+
+## Java files which are created by configure and thus are in the build
+## directory.
+built_java_source_files = java/lang/ConcreteProcess.java
+
## List of all .java files to be compiled. Please keep this list
## alphabetical. Please put files from gnu/gcj/convert into
## convert_source_files. If the .java file has a hand-maintained
@@ -332,8 +449,12 @@ gnu/gcj/text/LocaleData_en.java \
gnu/gcj/text/LocaleData_en_US.java \
gnu/gcj/text/SentenceBreakIterator.java \
gnu/gcj/text/WordBreakIterator.java \
+gnu/gcj/protocol/file/Connection.java \
+gnu/gcj/protocol/file/Handler.java \
gnu/gcj/protocol/http/Connection.java \
gnu/gcj/protocol/http/Handler.java \
+gnu/gcj/RawData.java \
+gnu/gcj/util/EnumerationChain.java \
java/io/BufferedInputStream.java \
java/io/BufferedOutputStream.java \
java/io/BufferedReader.java \
@@ -470,11 +591,16 @@ java/net/BindException.java \
java/net/ConnectException.java \
java/net/ContentHandler.java \
java/net/ContentHandlerFactory.java \
+java/net/DatagramPacket.java \
+java/net/DatagramSocket.java \
+java/net/DatagramSocketImpl.java \
java/net/FileNameMap.java \
java/net/HttpURLConnection.java \
java/net/InetAddress.java \
java/net/MalformedURLException.java \
+java/net/MulticastSocket.java \
java/net/NoRouteToHostException.java \
+java/net/PlainDatagramSocketImpl.java \
java/net/PlainSocketImpl.java \
java/net/ProtocolException.java \
java/net/ServerSocket.java \
@@ -482,15 +608,23 @@ java/net/Socket.java \
java/net/SocketException.java \
java/net/SocketImpl.java \
java/net/SocketImplFactory.java \
+java/net/SocketOptions.java \
java/net/URL.java \
java/net/URLConnection.java \
+java/net/URLDecoder.java \
+java/net/URLEncoder.java \
java/net/URLStreamHandler.java \
java/net/URLStreamHandlerFactory.java \
java/net/UnknownHostException.java \
java/net/UnknownServiceException.java \
+java/security/MessageDigest.java \
+java/security/NoSuchAlgorithmException.java \
java/text/BreakIterator.java \
java/text/CharacterIterator.java \
java/text/ChoiceFormat.java \
+java/text/CollationElementIterator.java \
+java/text/CollationKey.java \
+java/text/Collator.java \
java/text/DateFormat.java \
java/text/DateFormatSymbols.java \
java/text/DecimalFormat.java \
@@ -501,6 +635,7 @@ java/text/MessageFormat.java \
java/text/NumberFormat.java \
java/text/ParseException.java \
java/text/ParsePosition.java \
+java/text/RuleBasedCollator.java \
java/text/SimpleDateFormat.java \
java/text/StringCharacterIterator.java \
java/util/BitSet.java \
@@ -521,6 +656,7 @@ java/util/NoSuchElementException.java \
java/util/Observable.java \
java/util/Observer.java \
java/util/Properties.java \
+java/util/PropertyResourceBundle.java \
java/util/Random.java \
java/util/ResourceBundle.java \
java/util/SimpleTimeZone.java \
@@ -531,13 +667,21 @@ java/util/TooManyListenersException.java \
java/util/Vector.java \
java/util/zip/Adler32.java \
java/util/zip/CRC32.java \
+java/util/zip/CheckedInputStream.java \
+java/util/zip/CheckedOutputStream.java \
java/util/zip/Checksum.java \
+java/util/zip/DataFormatException.java \
java/util/zip/Deflater.java \
java/util/zip/DeflaterOutputStream.java \
+java/util/zip/GZIPInputStream.java \
+java/util/zip/GZIPOutputStream.java \
+java/util/zip/Inflater.java \
+java/util/zip/InflaterInputStream.java \
java/util/zip/ZipConstants.java \
java/util/zip/ZipEntry.java \
java/util/zip/ZipException.java \
java/util/zip/ZipFile.java \
+java/util/zip/ZipInputStream.java \
java/util/zip/ZipOutputStream.java
java_source_files = $(ordinary_java_source_files) $(special_java_source_files)
@@ -558,18 +702,42 @@ c_source_files = \
java/lang/e_sqrt.c java/lang/s_scalbn.c java/lang/sf_rint.c \
java/lang/k_cos.c java/lang/s_sin.c
+#java/awt/natToolkit.cc
+
## This lists all the C++ source files in subdirectories.
-nat_source_files = java/lang/natObject.cc java/lang/natClass.cc \
-java/lang/natString.cc java/lang/natDouble.cc java/lang/natRuntime.cc \
-java/lang/natSystem.cc java/lang/natThread.cc java/io/natFile.cc \
-java/io/natFileDescriptor.cc java/util/natDate.cc \
-java/util/natGregorianCalendar.cc java/lang/natFirstThread.cc \
-java/lang/natCharacter.cc java/lang/natMath.cc java/lang/natFloat.cc \
-java/lang/reflect/natField.cc java/net/natInetAddress.cc \
-java/net/natPlainSocketImpl.cc java/lang/reflect/natMethod.cc \
-java/lang/reflect/natArray.cc gnu/gcj/convert/natInput_EUCJIS.cc \
+nat_source_files = \
gnu/gcj/convert/JIS0208_to_Unicode.cc \
-gnu/gcj/convert/JIS0212_to_Unicode.cc
+gnu/gcj/convert/JIS0212_to_Unicode.cc \
+gnu/gcj/convert/Unicode_to_JIS.cc \
+gnu/gcj/convert/natInput_EUCJIS.cc \
+gnu/gcj/convert/natInput_SJIS.cc \
+gnu/gcj/convert/natOutput_EUCJIS.cc \
+gnu/gcj/convert/natOutput_SJIS.cc \
+java/io/natFile.cc \
+java/io/natFileDescriptor.cc \
+java/lang/natCharacter.cc \
+java/lang/natClass.cc \
+java/lang/natConcreteProcess.cc \
+java/lang/natDouble.cc \
+java/lang/natFirstThread.cc \
+java/lang/natFloat.cc \
+java/lang/natMath.cc \
+java/lang/natObject.cc \
+java/lang/natRuntime.cc \
+java/lang/natString.cc \
+java/lang/natSystem.cc \
+java/lang/natThread.cc \
+java/lang/reflect/natArray.cc \
+java/lang/reflect/natField.cc \
+java/lang/reflect/natMethod.cc \
+java/net/natInetAddress.cc \
+java/net/natPlainDatagramSocketImpl.cc \
+java/net/natPlainSocketImpl.cc \
+java/text/natCollator.cc \
+java/util/natDate.cc \
+java/util/natGregorianCalendar.cc \
+java/util/zip/natDeflater.cc \
+java/util/zip/natInflater.cc
## ################################################################
@@ -591,6 +759,7 @@ AM_MAKEFLAGS = \
"INSTALL_DATA=$(INSTALL_DATA)" \
"INSTALL_PROGRAM=$(INSTALL_PROGRAM)" \
"INSTALL_SCRIPT=$(INSTALL_SCRIPT)" \
+ "JC1FLAGS=$(JC1FLAGS)" \
"LDFLAGS=$(LDFLAGS)" \
"LIBCFLAGS=$(LIBCFLAGS)" \
"LIBCFLAGS_FOR_TARGET=$(LIBCFLAGS_FOR_TARGET)" \
diff --git a/libjava/Makefile.in b/libjava/Makefile.in
index d47a7f8057a..7409ee3a10c 100644
--- a/libjava/Makefile.in
+++ b/libjava/Makefile.in
@@ -71,24 +71,37 @@ COMPPATH = @COMPPATH@
CPP = @CPP@
CXX = @CXX@
CXXCPP = @CXXCPP@
+DLLTOOL = @DLLTOOL@
EXEEXT = @EXEEXT@
GCDEPS = @GCDEPS@
GCINCS = @GCINCS@
GCLIBS = @GCLIBS@
GCOBJS = @GCOBJS@
+GCSPEC = @GCSPEC@
+JCFLAGS = @JCFLAGS@
+LD = @LD@
LIBGCJ_CFLAGS = @LIBGCJ_CFLAGS@
LIBGCJ_CXXFLAGS = @LIBGCJ_CXXFLAGS@
LIBGCJ_JAVAFLAGS = @LIBGCJ_JAVAFLAGS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
MAINT = @MAINT@
MAKEINFO = @MAKEINFO@
PACKAGE = @PACKAGE@
PERL = @PERL@
RANLIB = @RANLIB@
+SYSTEMSPEC = @SYSTEMSPEC@
THREADDEPS = @THREADDEPS@
THREADINCS = @THREADINCS@
THREADLIBS = @THREADLIBS@
THREADOBJS = @THREADOBJS@
+THREADSPEC = @THREADSPEC@
+USE_SYMBOL_UNDERSCORE = @USE_SYMBOL_UNDERSCORE@
VERSION = @VERSION@
+ZDEPS = @ZDEPS@
+ZINCS = @ZINCS@
+ZLIBS = @ZLIBS@
+ZLIBSPEC = @ZLIBSPEC@
here = @here@
libgcj_basedir = @libgcj_basedir@
@@ -96,11 +109,15 @@ AUTOMAKE_OPTIONS = foreign no-installinfo
@TESTSUBDIR_TRUE@SUBDIRS = \
@TESTSUBDIR_TRUE@testsuite
-
-toolexecdir = $(exec_prefix)/$(target_alias)
-toolexeclibdir = $(toolexecdir)/lib$(MULTISUBDIR)
-
-toolexeclib_LIBRARIES = libgcj.a
+@USE_LIBDIR_TRUE@toolexeclibdir = \
+@USE_LIBDIR_TRUE@$(libdir)
+@USE_LIBDIR_FALSE@toolexeclibdir = \
+@USE_LIBDIR_FALSE@$(toolexecdir)/lib$(MULTISUBDIR)
+@USE_LIBDIR_FALSE@toolexecdir = \
+@USE_LIBDIR_FALSE@$(exec_prefix)/$(target_alias)
+
+toolexeclib_LTLIBRARIES = libgcj.la
+toolexeclib_DATA = libgcj.spec
data_DATA = libgcj.zip
@NATIVE_TRUE@bin_PROGRAMS = \
@@ -124,43 +141,53 @@ data_DATA = libgcj.zip
@CANADIAN_FALSE@expanded = \
@CANADIAN_FALSE@`cd $(MULTIBUILDTOP)../$(COMPPATH)/gcc && pwd`
+GCJCOMPILE = CLASSPATH=$(here) $(LIBTOOL) --mode=compile $(GCJ) -fassume-compiled $(JC1FLAGS) -c
+
JAVAC = $(GCJ) -C
EH_COMMON_INCLUDE = @EH_COMMON_INCLUDE@
WARNINGS = -W -Wall
-AM_CXXFLAGS = -fno-rtti -fvtable-thunks @LIBGCJ_CXXFLAGS@ $(WARNINGS)
+AM_CXXFLAGS = -fno-rtti -fvtable-thunks -fpermissive @LIBGCJ_CXXFLAGS@ $(WARNINGS)
@USING_GCC_TRUE@AM_CFLAGS = \
@USING_GCC_TRUE@@LIBGCJ_CFLAGS@ $(WARNINGS)
@USING_GCC_FALSE@AM_CFLAGS = \
@USING_GCC_FALSE@@LIBGCJ_CFLAGS@
-JCFLAGS = -g
-JC1FLAGS = -g @LIBGCJ_JAVAFLAGS@
+JC1FLAGS = @JCFLAGS@ @LIBGCJ_JAVAFLAGS@
-INCLUDES = -Iinclude -I$(top_srcdir)/include $(GCINCS) $(THREADINCS) $(EH_COMMON_INCLUDE)
+INCLUDES = -Iinclude -I$(top_srcdir)/include $(GCINCS) $(THREADINCS) \
+ $(EH_COMMON_INCLUDE) $(ZINCS)
-nat_files = $(nat_source_files:.cc=.o)
-c_files = $(c_source_files:.c=.o)
-javao_files = $(java_source_files:.java=.o)
-libgcj_a_SOURCES = prims.cc jni.cc exception.cc
-EXTRA_libgcj_a_SOURCES = boehm.cc nogc.cc posix-threads.cc no-threads.cc \
- $(c_source_files) $(java_source_files)
+nat_files = $(nat_source_files:.cc=.lo)
+c_files = $(c_source_files:.c=.lo)
+javao_files = $(java_source_files:.java=.lo) \
+ $(built_java_source_files:.java=.lo)
-libgcj_a_DEPENDENCIES = libgcj.zip $(javao_files) $(nat_files) \
+
+libgcj_la_SOURCES = prims.cc jni.cc exception.cc
+EXTRA_libgcj_la_SOURCES = boehm.cc nogc.cc posix-threads.cc no-threads.cc \
+ $(c_source_files) $(java_source_files) $(built_java_source_files)
+
+libgcj_la_DEPENDENCIES = libgcj.zip $(javao_files) $(nat_files) \
$(c_files) $(GCOBJS) $(THREADOBJS)
-libgcj_a_LIBADD = $(javao_files) $(nat_files) $(c_files) $(GCOBJS) \
+libgcj_la_LIBADD = $(javao_files) $(nat_files) $(c_files) $(GCOBJS) \
$(THREADOBJS)
+libgcj_la_LDFLAGS = -rpath $(toolexeclibdir) \
+ -version-info `grep -v '^\#' $(srcdir)/libtool-version`
+
MOSTLYCLEANFILES = $(javao_files) $(nat_files) $(nat_headers) $(c_files)
-CLEANFILES = libgcj.zip $(class_files)
+CLEANFILES = libgcj.zip
SUFFIXES = .class .java .h
-nat_headers = $(ordinary_java_source_files:.java=.h)
+nat_headers = $(ordinary_java_source_files:.java=.h) \
+ $(built_java_source_files:.java=.h)
+
FTFRIEND = void JvRunMain (jclass klass, int argc, const char **argv)
@@ -175,35 +202,95 @@ CONVERT_DIR = gnu/gcj/convert
jv_convert_SOURCES =
EXTRA_jv_convert_SOURCES = $(convert_source_files)
-jv_convert_LDFLAGS = --main=gnu.gcj.convert.Convert
-jv_convert_LINK = $(GCJ) $(JC1FLAGS) $(LDFLAGS) -o jv-convert
-jv_convert_LDADD = $(convert_source_files:.java=.o) -L. $(GCLIBS) $(THREADLIBS)
-jv_convert_DEPENDENCIES = $(convert_source_files:.java=.o) \
- $(GCDEPS) $(THREADDEPS) libgcj.a
+jv_convert_LDFLAGS = --main=gnu.gcj.convert.Convert \
+ -rpath $(toolexeclibdir)
+
+jv_convert_LINK = $(LIBTOOL) --mode=link $(GCJ) $(JC1FLAGS) $(LDFLAGS) \
+ -o jv-convert
+
+jv_convert_LDADD = $(convert_source_files:.java=.lo) libgcj.la \
+ $(GCLIBS) $(THREADLIBS) $(ZLIBS) -L$(here)/.libs
+
+jv_convert_DEPENDENCIES = $(convert_source_files:.java=.lo) \
+ $(GCDEPS) $(THREADDEPS) $(ZDEPS) libgcj.la libgcj.spec
gen_from_JIS_SOURCES =
EXTRA_gen_from_JIS_SOURCES = $(srcdir)/$(CONVERT_DIR)/gen-from-JIS.c \
+ $(srcdir)/$(CONVERT_DIR)/make-trie.c \
+ $(srcdir)/$(CONVERT_DIR)/JIS0201.h \
$(srcdir)/$(CONVERT_DIR)/JIS0208.h \
$(srcdir)/$(CONVERT_DIR)/JIS0212.h
-gen_from_JIS_LDADD = $(CONVERT_DIR)/gen-from-JIS.o
-gen_from_JIS_DEPENDENCIES = $(CONVERT_DIR)/gen-from-JIS.o
+gen_from_JIS_LDADD = $(CONVERT_DIR)/gen-from-JIS.o $(CONVERT_DIR)/make-trie.o
+gen_from_JIS_DEPENDENCIES = $(CONVERT_DIR)/gen-from-JIS.o \
+ $(CONVERT_DIR)/make-trie.o
+
convert_source_files = \
gnu/gcj/convert/BytesToUnicode.java \
gnu/gcj/convert/Convert.java \
gnu/gcj/convert/Input_8859_1.java \
gnu/gcj/convert/Input_EUCJIS.java \
+gnu/gcj/convert/Input_JavaSrc.java \
+gnu/gcj/convert/Input_SJIS.java \
gnu/gcj/convert/Input_UTF8.java \
gnu/gcj/convert/Output_8859_1.java \
+gnu/gcj/convert/Output_EUCJIS.java \
gnu/gcj/convert/Output_JavaSrc.java \
+gnu/gcj/convert/Output_SJIS.java \
gnu/gcj/convert/Output_UTF8.java \
gnu/gcj/convert/UnicodeToBytes.java
special_java_source_files = java/lang/Class.java java/lang/Object.java
+awt_java_source_files = \
+java/awt/AWTEvent.java \
+java/awt/BorderLayout.java \
+java/awt/Component.java \
+java/awt/Container.java \
+java/awt/Dimension.java \
+java/awt/Event.java \
+java/awt/Font.java \
+java/awt/Frame.java \
+java/awt/LayoutManager.java \
+java/awt/LayoutManager2.java \
+java/awt/Menu.java \
+java/awt/MenuBar.java \
+java/awt/MenuItem.java \
+java/awt/MenuComponent.java \
+java/awt/MenuContainer.java \
+java/awt/Point.java \
+java/awt/Rectangle.java \
+java/awt/Shape.java \
+java/awt/TextArea.java \
+java/awt/TextComponent.java \
+java/awt/Toolkit.java \
+java/awt/Window.java \
+java/awt/event/ActionEvent.java \
+java/awt/event/ActionListener.java \
+java/awt/event/ComponentEvent.java \
+java/awt/event/InputEvent.java \
+java/awt/event/KeyEvent.java \
+java/awt/event/KeyListener.java \
+java/awt/event/TextEvent.java \
+java/awt/event/TextListener.java \
+java/awt/event/WindowAdapter.java \
+java/awt/event/WindowEvent.java \
+java/awt/event/WindowListener.java \
+java/awt/geom/Point2D.java \
+java/awt/geom/Dimension2D.java \
+java/awt/peer/ComponentPeer.java \
+java/awt/peer/ContainerPeer.java \
+java/awt/peer/FramePeer.java \
+java/awt/peer/WindowPeer.java
+
+
+# $(awt_java_source_files)
+
+built_java_source_files = java/lang/ConcreteProcess.java
+
ordinary_java_source_files = $(convert_source_files) \
gnu/gcj/text/BaseBreakIterator.java \
gnu/gcj/text/CharacterBreakIterator.java \
@@ -212,8 +299,12 @@ gnu/gcj/text/LocaleData_en.java \
gnu/gcj/text/LocaleData_en_US.java \
gnu/gcj/text/SentenceBreakIterator.java \
gnu/gcj/text/WordBreakIterator.java \
+gnu/gcj/protocol/file/Connection.java \
+gnu/gcj/protocol/file/Handler.java \
gnu/gcj/protocol/http/Connection.java \
gnu/gcj/protocol/http/Handler.java \
+gnu/gcj/RawData.java \
+gnu/gcj/util/EnumerationChain.java \
java/io/BufferedInputStream.java \
java/io/BufferedOutputStream.java \
java/io/BufferedReader.java \
@@ -350,11 +441,16 @@ java/net/BindException.java \
java/net/ConnectException.java \
java/net/ContentHandler.java \
java/net/ContentHandlerFactory.java \
+java/net/DatagramPacket.java \
+java/net/DatagramSocket.java \
+java/net/DatagramSocketImpl.java \
java/net/FileNameMap.java \
java/net/HttpURLConnection.java \
java/net/InetAddress.java \
java/net/MalformedURLException.java \
+java/net/MulticastSocket.java \
java/net/NoRouteToHostException.java \
+java/net/PlainDatagramSocketImpl.java \
java/net/PlainSocketImpl.java \
java/net/ProtocolException.java \
java/net/ServerSocket.java \
@@ -362,15 +458,23 @@ java/net/Socket.java \
java/net/SocketException.java \
java/net/SocketImpl.java \
java/net/SocketImplFactory.java \
+java/net/SocketOptions.java \
java/net/URL.java \
java/net/URLConnection.java \
+java/net/URLDecoder.java \
+java/net/URLEncoder.java \
java/net/URLStreamHandler.java \
java/net/URLStreamHandlerFactory.java \
java/net/UnknownHostException.java \
java/net/UnknownServiceException.java \
+java/security/MessageDigest.java \
+java/security/NoSuchAlgorithmException.java \
java/text/BreakIterator.java \
java/text/CharacterIterator.java \
java/text/ChoiceFormat.java \
+java/text/CollationElementIterator.java \
+java/text/CollationKey.java \
+java/text/Collator.java \
java/text/DateFormat.java \
java/text/DateFormatSymbols.java \
java/text/DecimalFormat.java \
@@ -381,6 +485,7 @@ java/text/MessageFormat.java \
java/text/NumberFormat.java \
java/text/ParseException.java \
java/text/ParsePosition.java \
+java/text/RuleBasedCollator.java \
java/text/SimpleDateFormat.java \
java/text/StringCharacterIterator.java \
java/util/BitSet.java \
@@ -401,6 +506,7 @@ java/util/NoSuchElementException.java \
java/util/Observable.java \
java/util/Observer.java \
java/util/Properties.java \
+java/util/PropertyResourceBundle.java \
java/util/Random.java \
java/util/ResourceBundle.java \
java/util/SimpleTimeZone.java \
@@ -411,13 +517,21 @@ java/util/TooManyListenersException.java \
java/util/Vector.java \
java/util/zip/Adler32.java \
java/util/zip/CRC32.java \
+java/util/zip/CheckedInputStream.java \
+java/util/zip/CheckedOutputStream.java \
java/util/zip/Checksum.java \
+java/util/zip/DataFormatException.java \
java/util/zip/Deflater.java \
java/util/zip/DeflaterOutputStream.java \
+java/util/zip/GZIPInputStream.java \
+java/util/zip/GZIPOutputStream.java \
+java/util/zip/Inflater.java \
+java/util/zip/InflaterInputStream.java \
java/util/zip/ZipConstants.java \
java/util/zip/ZipEntry.java \
java/util/zip/ZipException.java \
java/util/zip/ZipFile.java \
+java/util/zip/ZipInputStream.java \
java/util/zip/ZipOutputStream.java
@@ -439,17 +553,41 @@ c_source_files = \
java/lang/k_cos.c java/lang/s_sin.c
-nat_source_files = java/lang/natObject.cc java/lang/natClass.cc \
-java/lang/natString.cc java/lang/natDouble.cc java/lang/natRuntime.cc \
-java/lang/natSystem.cc java/lang/natThread.cc java/io/natFile.cc \
-java/io/natFileDescriptor.cc java/util/natDate.cc \
-java/util/natGregorianCalendar.cc java/lang/natFirstThread.cc \
-java/lang/natCharacter.cc java/lang/natMath.cc java/lang/natFloat.cc \
-java/lang/reflect/natField.cc java/net/natInetAddress.cc \
-java/net/natPlainSocketImpl.cc java/lang/reflect/natMethod.cc \
-java/lang/reflect/natArray.cc gnu/gcj/convert/natInput_EUCJIS.cc \
+#java/awt/natToolkit.cc
+
+nat_source_files = \
gnu/gcj/convert/JIS0208_to_Unicode.cc \
-gnu/gcj/convert/JIS0212_to_Unicode.cc
+gnu/gcj/convert/JIS0212_to_Unicode.cc \
+gnu/gcj/convert/Unicode_to_JIS.cc \
+gnu/gcj/convert/natInput_EUCJIS.cc \
+gnu/gcj/convert/natInput_SJIS.cc \
+gnu/gcj/convert/natOutput_EUCJIS.cc \
+gnu/gcj/convert/natOutput_SJIS.cc \
+java/io/natFile.cc \
+java/io/natFileDescriptor.cc \
+java/lang/natCharacter.cc \
+java/lang/natClass.cc \
+java/lang/natConcreteProcess.cc \
+java/lang/natDouble.cc \
+java/lang/natFirstThread.cc \
+java/lang/natFloat.cc \
+java/lang/natMath.cc \
+java/lang/natObject.cc \
+java/lang/natRuntime.cc \
+java/lang/natString.cc \
+java/lang/natSystem.cc \
+java/lang/natThread.cc \
+java/lang/reflect/natArray.cc \
+java/lang/reflect/natField.cc \
+java/lang/reflect/natMethod.cc \
+java/net/natInetAddress.cc \
+java/net/natPlainDatagramSocketImpl.cc \
+java/net/natPlainSocketImpl.cc \
+java/text/natCollator.cc \
+java/util/natDate.cc \
+java/util/natGregorianCalendar.cc \
+java/util/zip/natDeflater.cc \
+java/util/zip/natInflater.cc
# Work around what appears to be a GNU make bug handling MAKEFLAGS
@@ -466,6 +604,7 @@ AM_MAKEFLAGS = \
"INSTALL_DATA=$(INSTALL_DATA)" \
"INSTALL_PROGRAM=$(INSTALL_PROGRAM)" \
"INSTALL_SCRIPT=$(INSTALL_SCRIPT)" \
+ "JC1FLAGS=$(JC1FLAGS)" \
"LDFLAGS=$(LDFLAGS)" \
"LIBCFLAGS=$(LIBCFLAGS)" \
"LIBCFLAGS_FOR_TARGET=$(LIBCFLAGS_FOR_TARGET)" \
@@ -502,20 +641,19 @@ MULTISUBDIR =
MULTIDO = true
MULTICLEAN = true
-
cygnus_hack =
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
mkinstalldirs = $(SHELL) $(top_srcdir)/../mkinstalldirs
CONFIG_HEADER = ./include/config.h
-CONFIG_CLEAN_FILES =
-LIBRARIES = $(toolexeclib_LIBRARIES)
+CONFIG_CLEAN_FILES = libgcj.spec
+LTLIBRARIES = $(toolexeclib_LTLIBRARIES)
DEFS = @DEFS@ -I. -I$(srcdir) -I./include
CPPFLAGS = @CPPFLAGS@
LDFLAGS = @LDFLAGS@
LIBS = @LIBS@
-libgcj_a_OBJECTS = prims.o jni.o exception.o
+libgcj_la_OBJECTS = prims.lo jni.lo exception.lo
@NATIVE_TRUE@bin_PROGRAMS = jv-convert$(EXEEXT)
@NATIVE_TRUE@@MAINTAINER_MODE_TRUE@noinst_PROGRAMS = \
@NATIVE_TRUE@@MAINTAINER_MODE_TRUE@gen-from-JIS$(EXEEXT)
@@ -526,17 +664,19 @@ gen_from_JIS_OBJECTS =
gen_from_JIS_LDFLAGS =
CXXFLAGS = @CXXFLAGS@
CXXCOMPILE = $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --mode=compile $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
CXXLD = $(CXX)
-CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(LDFLAGS) -o $@
+CXXLINK = $(LIBTOOL) --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(LDFLAGS) -o $@
CFLAGS = @CFLAGS@
COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
CCLD = $(CC)
-LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
-DATA = $(data_DATA)
+LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
+DATA = $(data_DATA) $(toolexeclib_DATA)
-DIST_COMMON = COPYING.LIB ChangeLog Makefile.am Makefile.in acconfig.h \
-acinclude.m4 aclocal.m4 configure configure.in include/config.h.in \
-include/stamp-h.in
+DIST_COMMON = COPYING.LIB ChangeLog Makefile.am Makefile.in NEWS THANKS \
+acconfig.h acinclude.m4 aclocal.m4 configure configure.in \
+include/config.h.in include/stamp-h.in libgcj.spec.in
DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
@@ -544,14 +684,21 @@ DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
TAR = tar
GZIP_ENV = --best
DIST_SUBDIRS = testsuite
-DEP_FILES = .deps/$(srcdir)/$(CONVERT_DIR)/gen-from-JIS.P .deps/boehm.P \
-.deps/exception.P .deps/gnu/gcj/convert/BytesToUnicode.P \
-.deps/gnu/gcj/convert/Convert.P .deps/gnu/gcj/convert/Input_8859_1.P \
-.deps/gnu/gcj/convert/Input_EUCJIS.P .deps/gnu/gcj/convert/Input_UTF8.P \
+DEP_FILES = .deps/$(srcdir)/$(CONVERT_DIR)/gen-from-JIS.P \
+.deps/$(srcdir)/$(CONVERT_DIR)/make-trie.P .deps/boehm.P \
+.deps/exception.P .deps/gnu/gcj/RawData.P \
+.deps/gnu/gcj/convert/BytesToUnicode.P .deps/gnu/gcj/convert/Convert.P \
+.deps/gnu/gcj/convert/Input_8859_1.P \
+.deps/gnu/gcj/convert/Input_EUCJIS.P \
+.deps/gnu/gcj/convert/Input_JavaSrc.P \
+.deps/gnu/gcj/convert/Input_SJIS.P .deps/gnu/gcj/convert/Input_UTF8.P \
.deps/gnu/gcj/convert/Output_8859_1.P \
+.deps/gnu/gcj/convert/Output_EUCJIS.P \
.deps/gnu/gcj/convert/Output_JavaSrc.P \
-.deps/gnu/gcj/convert/Output_UTF8.P \
+.deps/gnu/gcj/convert/Output_SJIS.P .deps/gnu/gcj/convert/Output_UTF8.P \
.deps/gnu/gcj/convert/UnicodeToBytes.P \
+.deps/gnu/gcj/protocol/file/Connection.P \
+.deps/gnu/gcj/protocol/file/Handler.P \
.deps/gnu/gcj/protocol/http/Connection.P \
.deps/gnu/gcj/protocol/http/Handler.P \
.deps/gnu/gcj/text/BaseBreakIterator.P \
@@ -561,6 +708,7 @@ DEP_FILES = .deps/$(srcdir)/$(CONVERT_DIR)/gen-from-JIS.P .deps/boehm.P \
.deps/gnu/gcj/text/LocaleData_en_US.P \
.deps/gnu/gcj/text/SentenceBreakIterator.P \
.deps/gnu/gcj/text/WordBreakIterator.P \
+.deps/gnu/gcj/util/EnumerationChain.P \
.deps/java/io/BufferedInputStream.P \
.deps/java/io/BufferedOutputStream.P .deps/java/io/BufferedReader.P \
.deps/java/io/BufferedWriter.P .deps/java/io/ByteArrayInputStream.P \
@@ -601,8 +749,9 @@ DEP_FILES = .deps/$(srcdir)/$(CONVERT_DIR)/gen-from-JIS.P .deps/boehm.P \
.deps/java/lang/ClassNotFoundException.P \
.deps/java/lang/CloneNotSupportedException.P \
.deps/java/lang/Cloneable.P .deps/java/lang/Comparable.P \
-.deps/java/lang/Compiler.P .deps/java/lang/Double.P \
-.deps/java/lang/Error.P .deps/java/lang/Exception.P \
+.deps/java/lang/Compiler.P .deps/java/lang/ConcreteProcess.P \
+.deps/java/lang/Double.P .deps/java/lang/Error.P \
+.deps/java/lang/Exception.P \
.deps/java/lang/ExceptionInInitializerError.P \
.deps/java/lang/FirstThread.P .deps/java/lang/Float.P \
.deps/java/lang/IllegalAccessError.P \
@@ -664,24 +813,34 @@ DEP_FILES = .deps/$(srcdir)/$(CONVERT_DIR)/gen-from-JIS.P .deps/boehm.P \
.deps/java/lang/w_remainder.P .deps/java/lang/w_sqrt.P \
.deps/java/net/BindException.P .deps/java/net/ConnectException.P \
.deps/java/net/ContentHandler.P .deps/java/net/ContentHandlerFactory.P \
-.deps/java/net/FileNameMap.P .deps/java/net/HttpURLConnection.P \
-.deps/java/net/InetAddress.P .deps/java/net/MalformedURLException.P \
+.deps/java/net/DatagramPacket.P .deps/java/net/DatagramSocket.P \
+.deps/java/net/DatagramSocketImpl.P .deps/java/net/FileNameMap.P \
+.deps/java/net/HttpURLConnection.P .deps/java/net/InetAddress.P \
+.deps/java/net/MalformedURLException.P .deps/java/net/MulticastSocket.P \
.deps/java/net/NoRouteToHostException.P \
+.deps/java/net/PlainDatagramSocketImpl.P \
.deps/java/net/PlainSocketImpl.P .deps/java/net/ProtocolException.P \
.deps/java/net/ServerSocket.P .deps/java/net/Socket.P \
.deps/java/net/SocketException.P .deps/java/net/SocketImpl.P \
-.deps/java/net/SocketImplFactory.P .deps/java/net/URL.P \
-.deps/java/net/URLConnection.P .deps/java/net/URLStreamHandler.P \
+.deps/java/net/SocketImplFactory.P .deps/java/net/SocketOptions.P \
+.deps/java/net/URL.P .deps/java/net/URLConnection.P \
+.deps/java/net/URLDecoder.P .deps/java/net/URLEncoder.P \
+.deps/java/net/URLStreamHandler.P \
.deps/java/net/URLStreamHandlerFactory.P \
.deps/java/net/UnknownHostException.P \
.deps/java/net/UnknownServiceException.P \
+.deps/java/security/MessageDigest.P \
+.deps/java/security/NoSuchAlgorithmException.P \
.deps/java/text/BreakIterator.P .deps/java/text/CharacterIterator.P \
-.deps/java/text/ChoiceFormat.P .deps/java/text/DateFormat.P \
-.deps/java/text/DateFormatSymbols.P .deps/java/text/DecimalFormat.P \
-.deps/java/text/DecimalFormatSymbols.P .deps/java/text/FieldPosition.P \
-.deps/java/text/Format.P .deps/java/text/MessageFormat.P \
-.deps/java/text/NumberFormat.P .deps/java/text/ParseException.P \
-.deps/java/text/ParsePosition.P .deps/java/text/SimpleDateFormat.P \
+.deps/java/text/ChoiceFormat.P \
+.deps/java/text/CollationElementIterator.P \
+.deps/java/text/CollationKey.P .deps/java/text/Collator.P \
+.deps/java/text/DateFormat.P .deps/java/text/DateFormatSymbols.P \
+.deps/java/text/DecimalFormat.P .deps/java/text/DecimalFormatSymbols.P \
+.deps/java/text/FieldPosition.P .deps/java/text/Format.P \
+.deps/java/text/MessageFormat.P .deps/java/text/NumberFormat.P \
+.deps/java/text/ParseException.P .deps/java/text/ParsePosition.P \
+.deps/java/text/RuleBasedCollator.P .deps/java/text/SimpleDateFormat.P \
.deps/java/text/StringCharacterIterator.P .deps/java/util/BitSet.P \
.deps/java/util/Calendar.P \
.deps/java/util/ConcurrentModificationException.P \
@@ -693,23 +852,31 @@ DEP_FILES = .deps/$(srcdir)/$(CONVERT_DIR)/gen-from-JIS.P .deps/boehm.P \
.deps/java/util/MissingResourceException.P \
.deps/java/util/NoSuchElementException.P .deps/java/util/Observable.P \
.deps/java/util/Observer.P .deps/java/util/Properties.P \
-.deps/java/util/Random.P .deps/java/util/ResourceBundle.P \
-.deps/java/util/SimpleTimeZone.P .deps/java/util/Stack.P \
-.deps/java/util/StringTokenizer.P .deps/java/util/TimeZone.P \
-.deps/java/util/TooManyListenersException.P .deps/java/util/Vector.P \
-.deps/java/util/zip/Adler32.P .deps/java/util/zip/CRC32.P \
-.deps/java/util/zip/Checksum.P .deps/java/util/zip/Deflater.P \
+.deps/java/util/PropertyResourceBundle.P .deps/java/util/Random.P \
+.deps/java/util/ResourceBundle.P .deps/java/util/SimpleTimeZone.P \
+.deps/java/util/Stack.P .deps/java/util/StringTokenizer.P \
+.deps/java/util/TimeZone.P .deps/java/util/TooManyListenersException.P \
+.deps/java/util/Vector.P .deps/java/util/zip/Adler32.P \
+.deps/java/util/zip/CRC32.P .deps/java/util/zip/CheckedInputStream.P \
+.deps/java/util/zip/CheckedOutputStream.P \
+.deps/java/util/zip/Checksum.P \
+.deps/java/util/zip/DataFormatException.P \
+.deps/java/util/zip/Deflater.P \
.deps/java/util/zip/DeflaterOutputStream.P \
+.deps/java/util/zip/GZIPInputStream.P \
+.deps/java/util/zip/GZIPOutputStream.P .deps/java/util/zip/Inflater.P \
+.deps/java/util/zip/InflaterInputStream.P \
.deps/java/util/zip/ZipConstants.P .deps/java/util/zip/ZipEntry.P \
.deps/java/util/zip/ZipException.P .deps/java/util/zip/ZipFile.P \
+.deps/java/util/zip/ZipInputStream.P \
.deps/java/util/zip/ZipOutputStream.P .deps/jni.P .deps/no-threads.P \
.deps/nogc.P .deps/posix-threads.P .deps/prims.P
-SOURCES = $(libgcj_a_SOURCES) $(EXTRA_libgcj_a_SOURCES) $(jv_convert_SOURCES) $(EXTRA_jv_convert_SOURCES) $(gen_from_JIS_SOURCES) $(EXTRA_gen_from_JIS_SOURCES)
-OBJECTS = $(libgcj_a_OBJECTS) $(jv_convert_OBJECTS) $(gen_from_JIS_OBJECTS)
+SOURCES = $(libgcj_la_SOURCES) $(EXTRA_libgcj_la_SOURCES) $(jv_convert_SOURCES) $(EXTRA_jv_convert_SOURCES) $(gen_from_JIS_SOURCES) $(EXTRA_gen_from_JIS_SOURCES)
+OBJECTS = $(libgcj_la_OBJECTS) $(jv_convert_OBJECTS) $(gen_from_JIS_OBJECTS)
all: all-redirect
.SUFFIXES:
-.SUFFIXES: .S .c .cc .class .h .java .o .s
+.SUFFIXES: .S .c .cc .class .h .java .lo .o .s
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile
@@ -752,37 +919,32 @@ distclean-hdr:
-rm -f include/config.h
maintainer-clean-hdr:
+libgcj.spec: $(top_builddir)/config.status libgcj.spec.in
+ cd $(top_builddir) && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status
-mostlyclean-toolexeclibLIBRARIES:
+mostlyclean-toolexeclibLTLIBRARIES:
-clean-toolexeclibLIBRARIES:
- -test -z "$(toolexeclib_LIBRARIES)" || rm -f $(toolexeclib_LIBRARIES)
+clean-toolexeclibLTLIBRARIES:
+ -test -z "$(toolexeclib_LTLIBRARIES)" || rm -f $(toolexeclib_LTLIBRARIES)
-distclean-toolexeclibLIBRARIES:
+distclean-toolexeclibLTLIBRARIES:
-maintainer-clean-toolexeclibLIBRARIES:
+maintainer-clean-toolexeclibLTLIBRARIES:
-install-toolexeclibLIBRARIES: $(toolexeclib_LIBRARIES)
+install-toolexeclibLTLIBRARIES: $(toolexeclib_LTLIBRARIES)
@$(NORMAL_INSTALL)
$(mkinstalldirs) $(DESTDIR)$(toolexeclibdir)
- @list='$(toolexeclib_LIBRARIES)'; for p in $$list; do \
- if test -f $$p; then \
- echo " $(INSTALL_DATA) $$p $(DESTDIR)$(toolexeclibdir)/$$p"; \
- $(INSTALL_DATA) $$p $(DESTDIR)$(toolexeclibdir)/$$p; \
- else :; fi; \
- done
- @$(POST_INSTALL)
- @list='$(toolexeclib_LIBRARIES)'; for p in $$list; do \
+ @list='$(toolexeclib_LTLIBRARIES)'; for p in $$list; do \
if test -f $$p; then \
- echo " $(RANLIB) $(DESTDIR)$(toolexeclibdir)/$$p"; \
- $(RANLIB) $(DESTDIR)$(toolexeclibdir)/$$p; \
+ echo "$(LIBTOOL) --mode=install $(INSTALL) $$p $(DESTDIR)$(toolexeclibdir)/$$p"; \
+ $(LIBTOOL) --mode=install $(INSTALL) $$p $(DESTDIR)$(toolexeclibdir)/$$p; \
else :; fi; \
done
-uninstall-toolexeclibLIBRARIES:
+uninstall-toolexeclibLTLIBRARIES:
@$(NORMAL_UNINSTALL)
- list='$(toolexeclib_LIBRARIES)'; for p in $$list; do \
- rm -f $(DESTDIR)$(toolexeclibdir)/$$p; \
+ list='$(toolexeclib_LTLIBRARIES)'; for p in $$list; do \
+ $(LIBTOOL) --mode=uninstall rm -f $(DESTDIR)$(toolexeclibdir)/$$p; \
done
.s.o:
@@ -801,10 +963,24 @@ distclean-compile:
maintainer-clean-compile:
-libgcj.a: $(libgcj_a_OBJECTS) $(libgcj_a_DEPENDENCIES)
- -rm -f libgcj.a
- $(AR) cru libgcj.a $(libgcj_a_OBJECTS) $(libgcj_a_LIBADD)
- $(RANLIB) libgcj.a
+.s.lo:
+ $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+
+.S.lo:
+ $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+
+maintainer-clean-libtool:
+
+libgcj.la: $(libgcj_la_OBJECTS) $(libgcj_la_DEPENDENCIES)
+ $(CXXLINK) -rpath $(toolexeclibdir) $(libgcj_la_LDFLAGS) $(libgcj_la_OBJECTS) $(libgcj_la_LIBADD) $(LIBS)
mostlyclean-binPROGRAMS:
@@ -820,8 +996,8 @@ install-binPROGRAMS: $(bin_PROGRAMS)
$(mkinstalldirs) $(DESTDIR)$(bindir)
@list='$(bin_PROGRAMS)'; for p in $$list; do \
if test -f $$p; then \
- echo " $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \
- $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+ echo " $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \
+ $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
else :; fi; \
done
@@ -849,6 +1025,8 @@ gen-from-JIS$(EXEEXT): $(gen_from_JIS_OBJECTS) $(gen_from_JIS_DEPENDENCIES)
$(LINK) $(gen_from_JIS_LDFLAGS) $(gen_from_JIS_OBJECTS) $(gen_from_JIS_LDADD) $(LIBS)
.cc.o:
$(CXXCOMPILE) -c $<
+.cc.lo:
+ $(LTCXXCOMPILE) -c $<
install-dataDATA: $(data_DATA)
@$(NORMAL_INSTALL)
@@ -869,6 +1047,25 @@ uninstall-dataDATA:
rm -f $(DESTDIR)$(datadir)/$$p; \
done
+install-toolexeclibDATA: $(toolexeclib_DATA)
+ @$(NORMAL_INSTALL)
+ $(mkinstalldirs) $(DESTDIR)$(toolexeclibdir)
+ @list='$(toolexeclib_DATA)'; for p in $$list; do \
+ if test -f $(srcdir)/$$p; then \
+ echo " $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(toolexeclibdir)/$$p"; \
+ $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(toolexeclibdir)/$$p; \
+ else if test -f $$p; then \
+ echo " $(INSTALL_DATA) $$p $(DESTDIR)$(toolexeclibdir)/$$p"; \
+ $(INSTALL_DATA) $$p $(DESTDIR)$(toolexeclibdir)/$$p; \
+ fi; fi; \
+ done
+
+uninstall-toolexeclibDATA:
+ @$(NORMAL_UNINSTALL)
+ list='$(toolexeclib_DATA)'; for p in $$list; do \
+ rm -f $(DESTDIR)$(toolexeclibdir)/$$p; \
+ done
+
# This directory's subdirectories are mostly independent; you can cd
# into them and run `make' without going through this Makefile.
# To change the values of `make' variables: instead of editing Makefiles,
@@ -1082,7 +1279,8 @@ installcheck-am:
installcheck: installcheck-recursive
install-info-am:
install-info: install-info-recursive
-install-exec-am: install-toolexeclibLIBRARIES install-binPROGRAMS
+install-exec-am: install-toolexeclibLTLIBRARIES install-binPROGRAMS \
+ install-toolexeclibDATA
install-exec: install-exec-recursive
install-data-am: install-dataDATA
@@ -1091,17 +1289,17 @@ install-data: install-data-recursive
install-am: all-am
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
install: install-recursive
-uninstall-am: uninstall-toolexeclibLIBRARIES uninstall-binPROGRAMS \
- uninstall-dataDATA
+uninstall-am: uninstall-toolexeclibLTLIBRARIES uninstall-binPROGRAMS \
+ uninstall-dataDATA uninstall-toolexeclibDATA
uninstall: uninstall-recursive
-all-am: Makefile $(LIBRARIES) $(PROGRAMS) $(DATA)
+all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(DATA)
all-redirect: all-recursive
install-strip:
$(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
installdirs: installdirs-recursive
installdirs-am:
$(mkinstalldirs) $(DESTDIR)$(toolexeclibdir) $(DESTDIR)$(bindir) \
- $(DESTDIR)$(datadir)
+ $(DESTDIR)$(datadir) $(DESTDIR)$(toolexeclibdir)
mostlyclean-generic:
@@ -1115,30 +1313,34 @@ distclean-generic:
-rm -f config.cache config.log stamp-h stamp-h[0-9]*
maintainer-clean-generic:
-mostlyclean-am: mostlyclean-hdr mostlyclean-toolexeclibLIBRARIES \
- mostlyclean-compile mostlyclean-binPROGRAMS \
- mostlyclean-noinstPROGRAMS mostlyclean-tags \
- mostlyclean-depend mostlyclean-generic
+mostlyclean-am: mostlyclean-hdr mostlyclean-toolexeclibLTLIBRARIES \
+ mostlyclean-compile mostlyclean-libtool \
+ mostlyclean-binPROGRAMS mostlyclean-noinstPROGRAMS \
+ mostlyclean-tags mostlyclean-depend mostlyclean-generic
mostlyclean: mostlyclean-recursive
-clean-am: clean-hdr clean-toolexeclibLIBRARIES clean-compile \
- clean-binPROGRAMS clean-noinstPROGRAMS clean-tags \
- clean-depend clean-generic mostlyclean-am
+clean-am: clean-hdr clean-toolexeclibLTLIBRARIES clean-compile \
+ clean-libtool clean-binPROGRAMS clean-noinstPROGRAMS \
+ clean-tags clean-depend clean-generic mostlyclean-am \
+ clean-local
clean: clean-recursive
-distclean-am: distclean-hdr distclean-toolexeclibLIBRARIES \
- distclean-compile distclean-binPROGRAMS \
- distclean-noinstPROGRAMS distclean-tags \
- distclean-depend distclean-generic clean-am
+distclean-am: distclean-hdr distclean-toolexeclibLTLIBRARIES \
+ distclean-compile distclean-libtool \
+ distclean-binPROGRAMS distclean-noinstPROGRAMS \
+ distclean-tags distclean-depend distclean-generic \
+ clean-am
+ -rm -f libtool
distclean: distclean-recursive
-rm -f config.status
maintainer-clean-am: maintainer-clean-hdr \
- maintainer-clean-toolexeclibLIBRARIES \
- maintainer-clean-compile maintainer-clean-binPROGRAMS \
+ maintainer-clean-toolexeclibLTLIBRARIES \
+ maintainer-clean-compile maintainer-clean-libtool \
+ maintainer-clean-binPROGRAMS \
maintainer-clean-noinstPROGRAMS maintainer-clean-tags \
maintainer-clean-depend maintainer-clean-generic \
distclean-am
@@ -1149,19 +1351,21 @@ maintainer-clean: maintainer-clean-recursive
-rm -f config.status
.PHONY: mostlyclean-hdr distclean-hdr clean-hdr maintainer-clean-hdr \
-mostlyclean-toolexeclibLIBRARIES distclean-toolexeclibLIBRARIES \
-clean-toolexeclibLIBRARIES maintainer-clean-toolexeclibLIBRARIES \
-uninstall-toolexeclibLIBRARIES install-toolexeclibLIBRARIES \
+mostlyclean-toolexeclibLTLIBRARIES distclean-toolexeclibLTLIBRARIES \
+clean-toolexeclibLTLIBRARIES maintainer-clean-toolexeclibLTLIBRARIES \
+uninstall-toolexeclibLTLIBRARIES install-toolexeclibLTLIBRARIES \
mostlyclean-compile distclean-compile clean-compile \
-maintainer-clean-compile mostlyclean-binPROGRAMS distclean-binPROGRAMS \
-clean-binPROGRAMS maintainer-clean-binPROGRAMS uninstall-binPROGRAMS \
-install-binPROGRAMS mostlyclean-noinstPROGRAMS distclean-noinstPROGRAMS \
-clean-noinstPROGRAMS maintainer-clean-noinstPROGRAMS uninstall-dataDATA \
-install-dataDATA install-data-recursive uninstall-data-recursive \
-install-exec-recursive uninstall-exec-recursive installdirs-recursive \
-uninstalldirs-recursive all-recursive check-recursive \
-installcheck-recursive info-recursive dvi-recursive \
-mostlyclean-recursive distclean-recursive clean-recursive \
+maintainer-clean-compile mostlyclean-libtool distclean-libtool \
+clean-libtool maintainer-clean-libtool mostlyclean-binPROGRAMS \
+distclean-binPROGRAMS clean-binPROGRAMS maintainer-clean-binPROGRAMS \
+uninstall-binPROGRAMS install-binPROGRAMS mostlyclean-noinstPROGRAMS \
+distclean-noinstPROGRAMS clean-noinstPROGRAMS \
+maintainer-clean-noinstPROGRAMS uninstall-dataDATA install-dataDATA \
+uninstall-toolexeclibDATA install-toolexeclibDATA \
+install-data-recursive uninstall-data-recursive install-exec-recursive \
+uninstall-exec-recursive installdirs-recursive uninstalldirs-recursive \
+all-recursive check-recursive installcheck-recursive info-recursive \
+dvi-recursive mostlyclean-recursive distclean-recursive clean-recursive \
maintainer-clean-recursive tags tags-recursive mostlyclean-tags \
distclean-tags clean-tags maintainer-clean-tags distdir \
mostlyclean-depend distclean-depend clean-depend \
@@ -1175,32 +1379,41 @@ maintainer-clean-generic clean mostlyclean distclean maintainer-clean
$(java_source_files:.java=.class): libgcj.zip
+$(built_java_source_files:.java=.class): $(built_java_source_files)
+ javac="$(JAVAC)"; \
+ $$javac $(JCFLAGS) -classpath $(here):`cd $(srcdir) && /bin/pwd` \
+ -d $(here) $?
+
libgcj.zip: $(java_source_files)
+ $(MAKE) $(built_java_source_files:.java=.class)
javac="$(JAVAC)"; cd $(srcdir); \
$$javac $(JCFLAGS) -classpath $(here):`/bin/pwd` -d $(here) \
$(subst $(srcdir)/,,$?)
-@rm -f libgcj.zip
- $(ZIP) -r libgcj java -n .class -i '*.class' -i '*/'
+ $(ZIP) -r libgcj java gnu -n .class -i '*.class' -i '*/'
+
+clean-local:
+ find . -name '*.class' -print | xargs rm -f
-.class.o:
- CLASSPATH=$(here) $(CC) -fassume-compiled $(JC1FLAGS) -c -o $@ $<
+.class.lo:
+ $(GCJCOMPILE) -o $@ $<
-.java.o:
- CLASSPATH=$(here) $(GCJ) -fassume-compiled $(JC1FLAGS) -c -o $@ $<
+.java.lo:
+ $(GCJCOMPILE) -o $@ $<
-$(nat_files): %.o: %.cc
- $(CXXCOMPILE) -c -o $@ $<
+$(nat_files): %.lo: %.cc
+ $(LTCXXCOMPILE) -c -o $@ $<
-$(nat_files) $(GCOBJS) $(THREADOBJS) $(libgcj_a_OBJECTS): \
- include/config.h $(nat_headers)
+$(nat_files) $(GCOBJS) $(THREADOBJS) $(libgcj_la_OBJECTS): \
+ include/config.h include/java-signal.h $(nat_headers)
-$(c_files): %.o: %.c
- $(COMPILE) -c -o $@ $<
+$(c_files): %.lo: %.c
+ $(LTCOMPILE) -c -o $@ $<
$(c_files): java/lang/fdlibm.h java/lang/ieeefp.h java/lang/mprec.h
-$(javao_files): %.o: %.java
- CLASSPATH=$(here) $(GCJ) -fassume-compiled $(JC1FLAGS) -c -o $@ $<
+$(javao_files): %.lo: %.java
+ $(GCJCOMPILE) -o $@ $<
.class.h:
$(GCJH) -classpath $(top_builddir) $(basename $<)
@@ -1236,8 +1449,8 @@ java/lang/reflect/Method.h: java/lang/reflect/Method.class libgcj.zip
-friend 'java::lang::Class;' \
$(basename $<)
-maintainer-check: libgcj.a
- $(NM) libgcj.a | grep ' T ' \
+maintainer-check: libgcj.la
+ $(NM) .libs/libgcj.a | grep ' T ' \
| grep -v '4java' \
| grep -v 'Jv' \
| grep -v 'terminate__Fv' | grep -v 'unexpected__Fv'
@@ -1249,36 +1462,56 @@ header-check: libgcj.zip $(nat_headers)
done; \
$(CXXCOMPILE) -fsyntax-only htest.cc
+# The Unicode consortium does not permit re-distributing the file JIS0201.TXT.
+# You can get it from ftp://ftp.unicode.org/Public/MAPPINGS/EASTASIA/JIS/.
+
+$(srcdir)/$(CONVERT_DIR)/JIS0201.h: # $(CONVERT_DIR)/JIS0201.TXT
+ echo '/* This file is automatically generated from Unicode tables */' > tmp-0201; \
+ tr -d '\r' <$(CONVERT_DIR)/JIS0201.TXT \
+ | sed -n -e 's|\(0x..\).*\(0x....\).*#\(.*\)$$|MAP(0x00, \1, \2) /*\3 */|p' \
+ >> tmp-0201; \
+ mv tmp-0201 $(srcdir)/$(CONVERT_DIR)/JIS0201.h
+
# The Unicode consortium does not permit re-distributing the file JIS0208.TXT.
# You can get it from ftp://ftp.unicode.org/Public/MAPPINGS/EASTASIA/JIS/.
-$(srcdir)/$(CONVERT_DIR)/JIS0208.h: # JIS0208.TXT
- echo '/* This file is autoamtically generated from Unicode tables */' > tmp-0208; \
- sed -n -e 's|\(0x....\).*0x\(..\)\(..\).*\(0x....\).*#\(.*\).$$|MAP(0x\2, 0x\3, \4) /*\5 */|p' \
- <JIS0208.TXT >> tmp-0208; \
+$(srcdir)/$(CONVERT_DIR)/JIS0208.h: # $(CONVERT_DIR)/JIS0208.TXT
+ echo '/* This file is automatically generated from Unicode tables */' > tmp-0208; \
+ tr -d '\r' <$(CONVERT_DIR)/JIS0208.TXT \
+ | sed -n -e 's|\(0x....\).*0x\(..\)\(..\).*\(0x....\).*#\(.*\)$$|MAP(0x\2, 0x\3, \4) /*\5 */|p' \
+ >> tmp-0208; \
mv tmp-0208 $(srcdir)/$(CONVERT_DIR)/JIS0208.h
# The Unicode consortium does not permit re-distributing the file JIS0212.TXT.
# You can get it from ftp://ftp.unicode.org/Public/MAPPINGS/EASTASIA/JIS/.
-$(srcdir)/$(CONVERT_DIR)/JIS0212.h: # JIS0212.TXT
- echo '/* This file is autoamtically generated from Unicode tables */' > tmp-0212; \
- sed -n -e 's|0x\(..\)\(..\).*\(0x....\).*#\(.*\).$$|MAP(0x\1, 0x\2, \3) /*\4 */|p' \
- <JIS0212.TXT >> tmp-0212; \
+$(srcdir)/$(CONVERT_DIR)/JIS0212.h: # $(CONVERT_DIR)/JIS0212.TXT
+ echo '/* This file is automatically generated from Unicode tables */' > tmp-0212; \
+ tr -d '\r' <$(CONVERT_DIR)/JIS0212.TXT \
+ | sed -n -e 's|0x\(..\)\(..\).*\(0x....\).*#\(.*\)$$|MAP(0x\1, 0x\2, \3) /*\4 */|p' \
+ >> tmp-0212; \
mv tmp-0212 $(srcdir)/$(CONVERT_DIR)/JIS0212.h
$(CONVERT_DIR)/gen-from-JIS.o: $(srcdir)/$(CONVERT_DIR)/gen-from-JIS.c \
+ $(srcdir)/$(CONVERT_DIR)/JIS0201.h \
$(srcdir)/$(CONVERT_DIR)/JIS0208.h \
$(srcdir)/$(CONVERT_DIR)/JIS0212.h
$(COMPILE) -c -o $(CONVERT_DIR)/gen-from-JIS.o \
$(srcdir)/$(CONVERT_DIR)/gen-from-JIS.c
+$(CONVERT_DIR)/make-trie.o: $(srcdir)/$(CONVERT_DIR)/make-trie.c
+ $(COMPILE) -c -o $(CONVERT_DIR)/make-trie.o \
+ $(srcdir)/$(CONVERT_DIR)/make-trie.c
+
@NATIVE_TRUE@@MAINTAINER_MODE_TRUE@$(srcdir)/$(CONVERT_DIR)/JIS0208_to_Unicode.cc: ./gen-from-JIS$(EXEEXT)
@NATIVE_TRUE@@MAINTAINER_MODE_TRUE@ ./gen-from-JIS JIS0208>$(srcdir)/$(CONVERT_DIR)/JIS0208_to_Unicode.cc
@NATIVE_TRUE@@MAINTAINER_MODE_TRUE@$(srcdir)/$(CONVERT_DIR)/JIS0212_to_Unicode.cc: ./gen-from-JIS$(EXEEXT)
@NATIVE_TRUE@@MAINTAINER_MODE_TRUE@ ./gen-from-JIS JIS0212>$(srcdir)/$(CONVERT_DIR)/JIS0212_to_Unicode.cc
+@NATIVE_TRUE@@MAINTAINER_MODE_TRUE@$(srcdir)/$(CONVERT_DIR)/Unicode_to_JIS.cc: ./gen-from-JIS$(EXEEXT)
+@NATIVE_TRUE@@MAINTAINER_MODE_TRUE@ ./gen-from-JIS toJIS>$(srcdir)/$(CONVERT_DIR)/Unicode_to_JIS.cc
+
# Multilib support.
.PHONY: all-multi mostlyclean-multi clean-multi distclean-multi \
maintainer-clean-multi
@@ -1303,7 +1536,6 @@ distclean-multi:
maintainer-clean-multi:
$(MULTICLEAN) $(AM_MAKEFLAGS) DO=maintainer-clean multi-clean
-
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:
diff --git a/libjava/NEWS b/libjava/NEWS
new file mode 100644
index 00000000000..114e48ac999
--- /dev/null
+++ b/libjava/NEWS
@@ -0,0 +1,3 @@
+New in libgcj 2.95:
+
+* First public release
diff --git a/libjava/THANKS b/libjava/THANKS
new file mode 100644
index 00000000000..b0f055cb152
--- /dev/null
+++ b/libjava/THANKS
@@ -0,0 +1,16 @@
+libgcj wouldn't be what it is today without the help of these people:
+
+Alexandre Oliva oliva@dcc.unicamp.br
+Alexandre Petit-Bianco apbianco@cygnus.com
+Andrew Haley aph@cygnus.com
+Anthony Green green@cygnus.com
+Bonzo Armstrong bonzo@cygnus.com
+Bryce McKinlay bryce@albatross.co.nz
+Eric Christopher echristo@cygnus.com
+Geoff Berry gcb@gnu.org
+Gilles Zunino Gilles.Zunino@hei.fr
+Per Bothner per@bother.com
+Stu Grossman grossman@cygnus.com
+Tom Tromey tromey@cygnus.com
+Urban Widmark urban@svenskatest.se
+Warren Levy warrenl@cygnus.com
diff --git a/libjava/acconfig.h b/libjava/acconfig.h
index 11a7c3787e3..daddbb14102 100644
--- a/libjava/acconfig.h
+++ b/libjava/acconfig.h
@@ -28,9 +28,12 @@
/* Define if you have sleep. */
#undef HAVE_SLEEP
-/* Define if you have __int32_t and __uint32_t. */
+/* Define if you have int32_t and uint32_t. */
#undef HAVE_INT32_DEFINED
+/* Define if you have u_int32_t */
+#undef HAVE_BSD_INT32_DEFINED
+
/* Define if you're running eCos. */
#undef ECOS
@@ -76,6 +79,9 @@
/* Define if global `timezone' exists. */
#undef HAVE_TIMEZONE
+/* Define to version of GCJ in use. */
+#undef GCJVERSION
+
/* Define if you have the appropriate function. */
#undef HAVE_ACCESS
#undef HAVE_STAT
diff --git a/libjava/acinclude.m4 b/libjava/acinclude.m4
index 2056b9f9b77..c160eb9f631 100644
--- a/libjava/acinclude.m4
+++ b/libjava/acinclude.m4
@@ -31,8 +31,10 @@ AC_SUBST(libgcj_basedir)
AC_CANONICAL_HOST
+dnl version is pulled out to make it a bit easier to change using sed.
+version=2.95.0
dnl Still use "libjava" here to placate dejagnu.
-AM_INIT_AUTOMAKE(libjava, 0.0.7)
+AM_INIT_AUTOMAKE(libjava, $version)
# FIXME: We temporarily define our own version of AC_PROG_CC. This is
# copied from autoconf 2.12, but does not call AC_PROG_CC_WORKS. We
diff --git a/libjava/aclocal.m4 b/libjava/aclocal.m4
index 651dd93fc24..00d0218365c 100644
--- a/libjava/aclocal.m4
+++ b/libjava/aclocal.m4
@@ -43,8 +43,10 @@ AC_SUBST(libgcj_basedir)
AC_CANONICAL_HOST
+dnl version is pulled out to make it a bit easier to change using sed.
+version=2.95.0
dnl Still use "libjava" here to placate dejagnu.
-AM_INIT_AUTOMAKE(libjava, 0.0.7)
+AM_INIT_AUTOMAKE(libjava, $version)
# FIXME: We temporarily define our own version of AC_PROG_CC. This is
# copied from autoconf 2.12, but does not call AC_PROG_CC_WORKS. We
@@ -315,3 +317,607 @@ for am_file in <<$1>>; do
done<<>>dnl>>)
changequote([,]))])
+
+# serial 35 AC_PROG_LIBTOOL
+AC_DEFUN(AC_PROG_LIBTOOL,
+[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl
+
+# Save cache, so that ltconfig can load it
+AC_CACHE_SAVE
+
+# Actually configure libtool. ac_aux_dir is where install-sh is found.
+CC="$CC" CFLAGS="$CFLAGS" CPPFLAGS="$CPPFLAGS" \
+LD="$LD" NM="$NM" RANLIB="$RANLIB" LN_S="$LN_S" \
+DLLTOOL="$DLLTOOL" AS="$AS" \
+${CONFIG_SHELL-/bin/sh} $ac_aux_dir/ltconfig --no-reexec \
+$libtool_flags --no-verify $ac_aux_dir/ltmain.sh $host \
+|| AC_MSG_ERROR([libtool configure failed])
+
+# Reload cache, that may have been modified by ltconfig
+AC_CACHE_LOAD
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ac_aux_dir/ltconfig $ac_aux_dir/ltmain.sh"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+AC_SUBST(LIBTOOL)dnl
+
+# Redirect the config.log output again, so that the ltconfig log is not
+# clobbered by the next message.
+exec 5>>./config.log
+])
+
+AC_DEFUN(AC_LIBTOOL_SETUP,
+[AC_PREREQ(2.13)dnl
+AC_REQUIRE([AC_ENABLE_SHARED])dnl
+AC_REQUIRE([AC_ENABLE_STATIC])dnl
+AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+AC_REQUIRE([AC_PROG_RANLIB])dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_PROG_LD])dnl
+AC_REQUIRE([AC_PROG_NM])dnl
+AC_REQUIRE([AC_SYS_NM_PARSE])dnl
+AC_REQUIRE([AC_SYS_SYMBOL_UNDERSCORE])dnl
+AC_REQUIRE([AC_PROG_LN_S])dnl
+dnl
+
+# Check for any special flags to pass to ltconfig.
+libtool_flags="--cache-file=$cache_file"
+test "$enable_shared" = no && libtool_flags="$libtool_flags --disable-shared"
+test "$enable_static" = no && libtool_flags="$libtool_flags --disable-static"
+test "$enable_fast_install" = no && libtool_flags="$libtool_flags --disable-fast-install"
+test "$lt_dlopen" = yes && libtool_flags="$libtool_flags --enable-dlopen"
+test "$silent" = yes && libtool_flags="$libtool_flags --silent"
+test "$ac_cv_prog_gcc" = yes && libtool_flags="$libtool_flags --with-gcc"
+test "$ac_cv_prog_gnu_ld" = yes && libtool_flags="$libtool_flags --with-gnu-ld"
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case "$host" in
+*-*-irix6*)
+ # Find out which ABI we are using.
+ echo '[#]line __oline__ "configure"' > conftest.$ac_ext
+ if AC_TRY_EVAL(ac_compile); then
+ case "`/usr/bin/file conftest.o`" in
+ *32-bit*)
+ LD="${LD-ld} -32"
+ ;;
+ *N32*)
+ LD="${LD-ld} -n32"
+ ;;
+ *64-bit*)
+ LD="${LD-ld} -64"
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+
+*-*-sco3.2v5*)
+ # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+ SAVE_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -belf"
+ AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
+ [AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])])
+ if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+ # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+ CFLAGS="$SAVE_CFLAGS"
+ fi
+ ;;
+
+*-*-cygwin*)
+ AC_SYS_LIBTOOL_CYGWIN
+ ;;
+
+esac
+
+# enable the --disable-libtool-lock switch
+
+AC_ARG_ENABLE(libtool-lock,
+[ --disable-libtool-lock force libtool not to do file locking],
+need_locks=$enableval,
+need_locks=yes)
+
+if test x"$need_locks" = xno; then
+ libtool_flags="$libtool_flags --disable-lock"
+fi
+])
+
+# AC_LIBTOOL_DLOPEN - check for dlopen support
+AC_DEFUN(AC_LIBTOOL_DLOPEN, [lt_dlopen=yes])
+
+# AC_ENABLE_SHARED - implement the --enable-shared flag
+# Usage: AC_ENABLE_SHARED[(DEFAULT)]
+# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to
+# `yes'.
+AC_DEFUN(AC_ENABLE_SHARED,
+[define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl
+AC_ARG_ENABLE(shared,
+changequote(<<, >>)dnl
+<< --enable-shared[=PKGS] build shared libraries [default=>>AC_ENABLE_SHARED_DEFAULT],
+changequote([, ])dnl
+[p=${PACKAGE-default}
+case "$enableval" in
+yes) enable_shared=yes ;;
+no) enable_shared=no ;;
+*)
+ enable_shared=no
+ # Look at the argument we got. We use all the common list separators.
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
+ for pkg in $enableval; do
+ if test "X$pkg" = "X$p"; then
+ enable_shared=yes
+ fi
+ done
+ IFS="$ac_save_ifs"
+ ;;
+esac],
+enable_shared=AC_ENABLE_SHARED_DEFAULT)dnl
+])
+
+# AC_DISABLE_SHARED - set the default shared flag to --disable-shared
+AC_DEFUN(AC_DISABLE_SHARED,
+[AC_ENABLE_SHARED(no)])
+
+# AC_ENABLE_STATIC - implement the --enable-static flag
+# Usage: AC_ENABLE_STATIC[(DEFAULT)]
+# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to
+# `yes'.
+AC_DEFUN(AC_ENABLE_STATIC,
+[define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl
+AC_ARG_ENABLE(static,
+changequote(<<, >>)dnl
+<< --enable-static[=PKGS] build static libraries [default=>>AC_ENABLE_STATIC_DEFAULT],
+changequote([, ])dnl
+[p=${PACKAGE-default}
+case "$enableval" in
+yes) enable_static=yes ;;
+no) enable_static=no ;;
+*)
+ enable_static=no
+ # Look at the argument we got. We use all the common list separators.
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
+ for pkg in $enableval; do
+ if test "X$pkg" = "X$p"; then
+ enable_static=yes
+ fi
+ done
+ IFS="$ac_save_ifs"
+ ;;
+esac],
+enable_static=AC_ENABLE_STATIC_DEFAULT)dnl
+])
+
+# AC_DISABLE_STATIC - set the default static flag to --disable-static
+AC_DEFUN(AC_DISABLE_STATIC,
+[AC_ENABLE_STATIC(no)])
+
+
+# AC_ENABLE_FAST_INSTALL - implement the --enable-fast-install flag
+# Usage: AC_ENABLE_FAST_INSTALL[(DEFAULT)]
+# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to
+# `yes'.
+AC_DEFUN(AC_ENABLE_FAST_INSTALL,
+[define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl
+AC_ARG_ENABLE(fast-install,
+changequote(<<, >>)dnl
+<< --enable-fast-install[=PKGS] optimize for fast installation [default=>>AC_ENABLE_FAST_INSTALL_DEFAULT],
+changequote([, ])dnl
+[p=${PACKAGE-default}
+case "$enableval" in
+yes) enable_fast_install=yes ;;
+no) enable_fast_install=no ;;
+*)
+ enable_fast_install=no
+ # Look at the argument we got. We use all the common list separators.
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
+ for pkg in $enableval; do
+ if test "X$pkg" = "X$p"; then
+ enable_fast_install=yes
+ fi
+ done
+ IFS="$ac_save_ifs"
+ ;;
+esac],
+enable_fast_install=AC_ENABLE_FAST_INSTALL_DEFAULT)dnl
+])
+
+# AC_ENABLE_FAST_INSTALL - set the default to --disable-fast-install
+AC_DEFUN(AC_DISABLE_FAST_INSTALL,
+[AC_ENABLE_FAST_INSTALL(no)])
+
+
+# AC_PROG_LD - find the path to the GNU or non-GNU linker
+AC_DEFUN(AC_PROG_LD,
+[AC_ARG_WITH(gnu-ld,
+[ --with-gnu-ld assume the C compiler uses GNU ld [default=no]],
+test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no)
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+ac_prog=ld
+if test "$ac_cv_prog_gcc" = yes; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ AC_MSG_CHECKING([for ld used by GCC])
+ ac_prog=`($CC -print-prog-name=ld) 2>&5`
+ case "$ac_prog" in
+ # Accept absolute paths.
+changequote(,)dnl
+ /* | [A-Za-z]:[\\/]*)
+ re_direlt='/[^/][^/]*/\.\./'
+changequote([,])dnl
+ # Canonicalize the path of ld
+ ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'`
+ while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
+ ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
+ done
+ test -z "$LD" && LD="$ac_prog"
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ac_prog=ld
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+elif test "$with_gnu_ld" = yes; then
+ AC_MSG_CHECKING([for GNU ld])
+else
+ AC_MSG_CHECKING([for non-GNU ld])
+fi
+AC_CACHE_VAL(ac_cv_path_LD,
+[if test -z "$LD"; then
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog"; then
+ ac_cv_path_LD="$ac_dir/$ac_prog"
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some GNU ld's only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ if "$ac_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then
+ test "$with_gnu_ld" != no && break
+ else
+ test "$with_gnu_ld" != yes && break
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+else
+ ac_cv_path_LD="$LD" # Let the user override the test with a path.
+fi])
+LD="$ac_cv_path_LD"
+if test -n "$LD"; then
+ AC_MSG_RESULT($LD)
+else
+ AC_MSG_RESULT(no)
+fi
+test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
+AC_SUBST(LD)
+AC_PROG_LD_GNU
+])
+
+AC_DEFUN(AC_PROG_LD_GNU,
+[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], ac_cv_prog_gnu_ld,
+[# I'd rather use --version here, but apparently some GNU ld's only accept -v.
+if $LD -v 2>&1 </dev/null | egrep '(GNU|with BFD)' 1>&5; then
+ ac_cv_prog_gnu_ld=yes
+else
+ ac_cv_prog_gnu_ld=no
+fi])
+])
+
+# AC_PROG_NM - find the path to a BSD-compatible name lister
+AC_DEFUN(AC_PROG_NM,
+[AC_MSG_CHECKING([for BSD-compatible nm])
+AC_CACHE_VAL(ac_cv_path_NM,
+[if test -n "$NM"; then
+ # Let the user override the test.
+ ac_cv_path_NM="$NM"
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/nm; then
+ # Check to see if the nm accepts a BSD-compat flag.
+ # Adding the `sed 1q' prevents false positives on HP-UX, which says:
+ # nm: unknown option "B" ignored
+ if ($ac_dir/nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
+ ac_cv_path_NM="$ac_dir/nm -B"
+ break
+ elif ($ac_dir/nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
+ ac_cv_path_NM="$ac_dir/nm -p"
+ break
+ else
+ ac_cv_path_NM=${ac_cv_path_NM="$ac_dir/nm"} # keep the first match, but
+ continue # so that we can try to find one that supports BSD flags
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_NM" && ac_cv_path_NM=nm
+fi])
+NM="$ac_cv_path_NM"
+AC_MSG_RESULT([$NM])
+AC_SUBST(NM)
+])
+
+# AC_SYS_NM_PARSE - Check for command to grab the raw symbol name followed
+# by C symbol name from nm.
+AC_DEFUN(AC_SYS_NM_PARSE,
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_PROG_NM])dnl
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+AC_MSG_CHECKING([command to parse $NM output])
+AC_CACHE_VAL(ac_cv_sys_global_symbol_pipe,
+[# These are sane defaults that work on at least a few old systems.
+# {They come from Ultrix. What could be older than Ultrix?!! ;)}
+
+changequote(,)dnl
+# Character class describing NM global symbol codes.
+ac_symcode='[BCDEGRST]'
+
+# Regexp to match symbols that can be accessed directly from C.
+ac_sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
+
+# Transform the above into a raw symbol and a C symbol.
+ac_symxfrm='\1 \2\3 \3'
+
+# Transform an extracted symbol line into a proper C declaration
+ac_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern char \1;/p'"
+
+# Define system-specific variables.
+case "$host_os" in
+aix*)
+ ac_symcode='[BCDT]'
+ ;;
+cygwin* | mingw*)
+ ac_symcode='[ABCDGISTW]'
+ ;;
+hpux*)
+ ac_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern char \1();/p' -e 's/^. .* \(.*\)$/extern char \1;/p'"
+ ;;
+irix*)
+ ac_symcode='[BCDEGRST]'
+ ;;
+solaris*)
+ ac_symcode='[BDT]'
+ ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+if $NM -V 2>&1 | egrep '(GNU|with BFD)' > /dev/null; then
+ ac_symcode='[ABCDGISTW]'
+fi
+changequote([,])dnl
+
+# Try without a prefix undercore, then with it.
+for ac_symprfx in "" "_"; do
+
+ ac_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($ac_symcode\)[ ][ ]*\($ac_symprfx\)$ac_sympat$/$ac_symxfrm/p'"
+
+ # Check to see that the pipe works correctly.
+ ac_pipe_works=no
+ rm -f conftest.$ac_ext
+ cat > conftest.$ac_ext <<EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func;return 0;}
+EOF
+
+ if AC_TRY_EVAL(ac_compile); then
+ # Now try to grab the symbols.
+ ac_nlist=conftest.nm
+
+ if AC_TRY_EVAL(NM conftest.$ac_objext \| $ac_cv_sys_global_symbol_pipe \> $ac_nlist) && test -s "$ac_nlist"; then
+
+ # Try sorting and uniquifying the output.
+ if sort "$ac_nlist" | uniq > "$ac_nlist"T; then
+ mv -f "$ac_nlist"T "$ac_nlist"
+ else
+ rm -f "$ac_nlist"T
+ fi
+
+ # Make sure that we snagged all the symbols we need.
+ if egrep ' nm_test_var$' "$ac_nlist" >/dev/null; then
+ if egrep ' nm_test_func$' "$ac_nlist" >/dev/null; then
+ cat <<EOF > conftest.c
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+EOF
+ # Now generate the symbol file.
+ eval "$ac_global_symbol_to_cdecl"' < "$ac_nlist" >> conftest.c'
+
+ cat <<EOF >> conftest.c
+#if defined (__STDC__) && __STDC__
+# define lt_ptr_t void *
+#else
+# define lt_ptr_t char *
+# define const
+#endif
+
+/* The mapping between symbol names and symbols. */
+const struct {
+ const char *name;
+ lt_ptr_t address;
+}
+changequote(,)dnl
+lt_preloaded_symbols[] =
+changequote([,])dnl
+{
+EOF
+ sed 's/^. \(.*\) \(.*\)$/ {"\2", (lt_ptr_t) \&\2},/' < "$ac_nlist" >> conftest.c
+ cat <<\EOF >> conftest.c
+ {0, (lt_ptr_t) 0}
+};
+
+#ifdef __cplusplus
+}
+#endif
+EOF
+ # Now try linking the two files.
+ mv conftest.$ac_objext conftestm.$ac_objext
+ ac_save_LIBS="$LIBS"
+ ac_save_CFLAGS="$CFLAGS"
+ LIBS="conftestm.$ac_objext"
+ CFLAGS="$CFLAGS$no_builtin_flag"
+ if AC_TRY_EVAL(ac_link) && test -s conftest; then
+ ac_pipe_works=yes
+ else
+ echo "configure: failed program was:" >&AC_FD_CC
+ cat conftest.c >&AC_FD_CC
+ fi
+ LIBS="$ac_save_LIBS"
+ CFLAGS="$ac_save_CFLAGS"
+ else
+ echo "cannot find nm_test_func in $ac_nlist" >&AC_FD_CC
+ fi
+ else
+ echo "cannot find nm_test_var in $ac_nlist" >&AC_FD_CC
+ fi
+ else
+ echo "cannot run $ac_cv_sys_global_symbol_pipe" >&AC_FD_CC
+ fi
+ else
+ echo "$progname: failed program was:" >&AC_FD_CC
+ cat conftest.c >&AC_FD_CC
+ fi
+ rm -rf conftest*
+
+ # Do not use the global_symbol_pipe unless it works.
+ if test "$ac_pipe_works" = yes; then
+ if test x"$ac_symprfx" = x"_"; then
+ ac_cv_sys_symbol_underscore=yes
+ else
+ ac_cv_sys_symbol_underscore=no
+ fi
+ break
+ else
+ ac_cv_sys_global_symbol_pipe=
+ fi
+done
+])
+
+ac_result=yes
+if test -z "$ac_cv_sys_global_symbol_pipe"; then
+ ac_result=no
+fi
+AC_MSG_RESULT($ac_result)
+])
+
+# AC_SYS_LIBTOOL_CYGWIN - find tools needed on cygwin
+AC_DEFUN(AC_SYS_LIBTOOL_CYGWIN,
+[AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+AC_CHECK_TOOL(AS, as, false)
+])
+
+# AC_SYS_SYMBOL_UNDERSCORE - does the compiler prefix global symbols
+# with an underscore?
+AC_DEFUN(AC_SYS_SYMBOL_UNDERSCORE,
+[AC_REQUIRE([AC_PROG_NM])dnl
+AC_REQUIRE([AC_SYS_NM_PARSE])dnl
+AC_MSG_CHECKING([for _ prefix in compiled symbols])
+AC_CACHE_VAL(ac_cv_sys_symbol_underscore,
+[ac_cv_sys_symbol_underscore=no
+cat > conftest.$ac_ext <<EOF
+void nm_test_func(){}
+int main(){nm_test_func;return 0;}
+EOF
+if AC_TRY_EVAL(ac_compile); then
+ # Now try to grab the symbols.
+ ac_nlist=conftest.nm
+ if AC_TRY_EVAL(NM conftest.$ac_objext \| $ac_cv_sys_global_symbol_pipe \> $ac_nlist) && test -s "$ac_nlist"; then
+ # See whether the symbols have a leading underscore.
+ if egrep '^. _nm_test_func' "$ac_nlist" >/dev/null; then
+ ac_cv_sys_symbol_underscore=yes
+ else
+ if egrep '^. nm_test_func ' "$ac_nlist" >/dev/null; then
+ :
+ else
+ echo "configure: cannot find nm_test_func in $ac_nlist" >&AC_FD_CC
+ fi
+ fi
+ else
+ echo "configure: cannot run $ac_cv_sys_global_symbol_pipe" >&AC_FD_CC
+ fi
+else
+ echo "configure: failed program was:" >&AC_FD_CC
+ cat conftest.c >&AC_FD_CC
+fi
+rm -rf conftest*
+])
+AC_MSG_RESULT($ac_cv_sys_symbol_underscore)
+USE_SYMBOL_UNDERSCORE=${ac_cv_sys_symbol_underscore=no}
+AC_SUBST(USE_SYMBOL_UNDERSCORE)dnl
+])
+
+# AC_CHECK_LIBM - check for math library
+AC_DEFUN(AC_CHECK_LIBM, [
+AC_CHECK_LIB(mw, _mwvalidcheckl)
+AC_CHECK_LIB(m, cos)
+])
+
+# AC_LIBLTDL_CONVENIENCE[(dir)] - sets LIBLTDL to the link flags for
+# the libltdl convenience library, adds --enable-ltdl-convenience to
+# the configure arguments. Note that LIBLTDL is not AC_SUBSTed, nor
+# is AC_CONFIG_SUBDIRS called. If DIR is not provided, it is assumed
+# to be `${top_builddir}/libltdl'. Make sure you start DIR with
+# '${top_builddir}/' (note the single quotes!) if your package is not
+# flat, and, if you're not using automake, define top_builddir as
+# appropriate in the Makefiles.
+AC_DEFUN(AC_LIBLTDL_CONVENIENCE, [
+ case "$enable_ltdl_convenience" in
+ no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;;
+ "") enable_ltdl_convenience=yes
+ ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;;
+ esac
+ LIBLTDL=ifelse($#,1,$1,['${top_builddir}/libltdl'])/libltdlc.la
+])
+
+# AC_LIBLTDL_INSTALLABLE[(dir)] - sets LIBLTDL to the link flags for
+# the libltdl installable library, and adds --enable-ltdl-install to
+# the configure arguments. Note that LIBLTDL is not AC_SUBSTed, nor
+# is AC_CONFIG_SUBDIRS called. If DIR is not provided, it is assumed
+# to be `${top_builddir}/libltdl'. Make sure you start DIR with
+# '${top_builddir}/' (note the single quotes!) if your package is not
+# flat, and, if you're not using automake, define top_builddir as
+# appropriate in the Makefiles.
+# In the future, this macro may have to be called after AC_PROG_LIBTOOL.
+AC_DEFUN(AC_LIBLTDL_INSTALLABLE, [
+ AC_CHECK_LIB(ltdl, main, LIBLTDL="-lltdl", [
+ case "$enable_ltdl_install" in
+ no) AC_MSG_WARN([libltdl not installed, but installation disabled]) ;;
+ "") enable_ltdl_install=yes
+ ac_configure_args="$ac_configure_args --enable-ltdl-install" ;;
+ esac
+ ])
+ if test x"$enable_ltdl_install" != x"no"; then
+ LIBLTDL=ifelse($#,1,$1,['${top_builddir}/libltdl'])/libltdl.la
+ fi
+])
+
+dnl old names
+AC_DEFUN(AM_PROG_LIBTOOL, [indir([AC_PROG_LIBTOOL])])dnl
+AC_DEFUN(AM_ENABLE_SHARED, [indir([AC_ENABLE_SHARED], $@)])dnl
+AC_DEFUN(AM_ENABLE_STATIC, [indir([AC_ENABLE_STATIC], $@)])dnl
+AC_DEFUN(AM_DISABLE_SHARED, [indir([AC_DISABLE_SHARED], $@)])dnl
+AC_DEFUN(AM_DISABLE_STATIC, [indir([AC_DISABLE_STATIC], $@)])dnl
+AC_DEFUN(AM_PROG_LD, [indir([AC_PROG_LD])])dnl
+AC_DEFUN(AM_PROG_NM, [indir([AC_PROG_NM])])dnl
+AC_DEFUN(AM_SYS_NM_PARSE, [indir([AC_SYS_NM_PARSE])])dnl
+AC_DEFUN(AM_SYS_SYMBOL_UNDERSCORE, [indir([AC_SYS_SYMBOL_UNDERSCORE])])dnl
+AC_DEFUN(AM_SYS_LIBTOOL_CYGWIN, [indir([AC_SYS_LIBTOOL_CYGWIN])])dnl
+
diff --git a/libjava/classes.pl b/libjava/classes.pl
index 4db80a08c2e..35da03ef1a0 100644
--- a/libjava/classes.pl
+++ b/libjava/classes.pl
@@ -36,7 +36,7 @@ sub scan
{
local ($dir, $indent) = @_;
local (@subdirs) = ();
- local (@classes) = ();
+ local (%classes) = ();
local ($d) = new DirHandle $dir;
local (*JFILE);
@@ -72,7 +72,7 @@ sub scan
# For now assume that class names start with upper
# case letter.
next unless /(class|interface) ([A-Z][A-Za-z0-9]+)/;
- push (@classes, $2);
+ $classes{$2} = 1;
}
close (FILE);
}
@@ -86,7 +86,7 @@ sub scan
print $spaces, "namespace ", $classname, "\n";
print $spaces, "{\n";
- foreach (sort @classes)
+ foreach (sort keys %classes)
{
print $spaces, " class ", $_, ";\n";
}
diff --git a/libjava/configure b/libjava/configure
index 84067083648..19fa3210d2d 100755
--- a/libjava/configure
+++ b/libjava/configure
@@ -21,12 +21,24 @@ ac_help="$ac_help
--enable-maintainer-mode enable make rules and dependencies not useful
(and sometimes confusing) to the casual installer"
ac_help="$ac_help
+ --enable-shared[=PKGS] build shared libraries [default=yes]"
+ac_help="$ac_help
+ --enable-static[=PKGS] build static libraries [default=yes]"
+ac_help="$ac_help
+ --enable-fast-install[=PKGS] optimize for fast installation [default=yes]"
+ac_help="$ac_help
+ --with-gnu-ld assume the C compiler uses GNU ld [default=no]"
+ac_help="$ac_help
+ --disable-libtool-lock force libtool not to do file locking"
+ac_help="$ac_help
--enable-fast-character Prefer speed over size for Character"
ac_help="$ac_help
--enable-libgcj-debug Enable runtime debugging code"
ac_help="$ac_help
--with-ecos Enable runtime eCos target support."
ac_help="$ac_help
+ --with-system-zlib Use installed libz"
+ac_help="$ac_help
--enable-java-gc=TYPE choose garbage collector [boehm]"
ac_help="$ac_help
--enable-threads=TYPE choose threading package"
@@ -589,7 +601,7 @@ else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; }
fi
echo $ac_n "checking host system type""... $ac_c" 1>&6
-echo "configure:593: checking host system type" >&5
+echo "configure:605: checking host system type" >&5
host_alias=$host
case "$host_alias" in
@@ -610,7 +622,7 @@ host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
echo "$ac_t""$host" 1>&6
echo $ac_n "checking target system type""... $ac_c" 1>&6
-echo "configure:614: checking target system type" >&5
+echo "configure:626: checking target system type" >&5
target_alias=$target
case "$target_alias" in
@@ -628,7 +640,7 @@ target_os=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
echo "$ac_t""$target" 1>&6
echo $ac_n "checking build system type""... $ac_c" 1>&6
-echo "configure:632: checking build system type" >&5
+echo "configure:644: checking build system type" >&5
build_alias=$build
case "$build_alias" in
@@ -676,7 +688,7 @@ fi
# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
# ./install, which can be erroneously created by make from ./install.sh.
echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
-echo "configure:680: checking for a BSD compatible install" >&5
+echo "configure:692: checking for a BSD compatible install" >&5
if test -z "$INSTALL"; then
if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -729,7 +741,7 @@ test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}'
test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6
-echo "configure:733: checking whether build environment is sane" >&5
+echo "configure:745: checking whether build environment is sane" >&5
# Just in case
sleep 1
echo timestamp > conftestfile
@@ -786,7 +798,7 @@ test "$program_suffix" != NONE &&
test "$program_transform_name" = "" && program_transform_name="s,x,x,"
echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
-echo "configure:790: checking whether ${MAKE-make} sets \${MAKE}" >&5
+echo "configure:802: checking whether ${MAKE-make} sets \${MAKE}" >&5
set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -819,12 +831,12 @@ else
fi
echo $ac_n "checking for Cygwin environment""... $ac_c" 1>&6
-echo "configure:823: checking for Cygwin environment" >&5
+echo "configure:835: checking for Cygwin environment" >&5
if eval "test \"`echo '$''{'ac_cv_cygwin'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 828 "configure"
+#line 840 "configure"
#include "confdefs.h"
int main() {
@@ -835,7 +847,7 @@ int main() {
return __CYGWIN__;
; return 0; }
EOF
-if { (eval echo configure:839: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:851: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_cygwin=yes
else
@@ -852,19 +864,19 @@ echo "$ac_t""$ac_cv_cygwin" 1>&6
CYGWIN=
test "$ac_cv_cygwin" = yes && CYGWIN=yes
echo $ac_n "checking for mingw32 environment""... $ac_c" 1>&6
-echo "configure:856: checking for mingw32 environment" >&5
+echo "configure:868: checking for mingw32 environment" >&5
if eval "test \"`echo '$''{'ac_cv_mingw32'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 861 "configure"
+#line 873 "configure"
#include "confdefs.h"
int main() {
return __MINGW32__;
; return 0; }
EOF
-if { (eval echo configure:868: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:880: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_mingw32=yes
else
@@ -912,7 +924,7 @@ else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; }
fi
echo $ac_n "checking host system type""... $ac_c" 1>&6
-echo "configure:916: checking host system type" >&5
+echo "configure:928: checking host system type" >&5
host_alias=$host
case "$host_alias" in
@@ -933,10 +945,11 @@ host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
echo "$ac_t""$host" 1>&6
+version=2.95.0
PACKAGE=libjava
-VERSION=0.0.7
+VERSION=$version
if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then
{ echo "configure: error: source directory already configured; run "make distclean" there first" 1>&2; exit 1; }
@@ -953,7 +966,7 @@ EOF
missing_dir=`cd $ac_aux_dir && pwd`
echo $ac_n "checking for working aclocal""... $ac_c" 1>&6
-echo "configure:957: checking for working aclocal" >&5
+echo "configure:970: checking for working aclocal" >&5
# Run test in a subshell; some versions of sh will print an error if
# an executable is not found, even if stderr is redirected.
# Redirect stdin to placate older versions of autoconf. Sigh.
@@ -966,7 +979,7 @@ else
fi
echo $ac_n "checking for working autoconf""... $ac_c" 1>&6
-echo "configure:970: checking for working autoconf" >&5
+echo "configure:983: checking for working autoconf" >&5
# Run test in a subshell; some versions of sh will print an error if
# an executable is not found, even if stderr is redirected.
# Redirect stdin to placate older versions of autoconf. Sigh.
@@ -979,7 +992,7 @@ else
fi
echo $ac_n "checking for working automake""... $ac_c" 1>&6
-echo "configure:983: checking for working automake" >&5
+echo "configure:996: checking for working automake" >&5
# Run test in a subshell; some versions of sh will print an error if
# an executable is not found, even if stderr is redirected.
# Redirect stdin to placate older versions of autoconf. Sigh.
@@ -992,7 +1005,7 @@ else
fi
echo $ac_n "checking for working autoheader""... $ac_c" 1>&6
-echo "configure:996: checking for working autoheader" >&5
+echo "configure:1009: checking for working autoheader" >&5
# Run test in a subshell; some versions of sh will print an error if
# an executable is not found, even if stderr is redirected.
# Redirect stdin to placate older versions of autoconf. Sigh.
@@ -1005,7 +1018,7 @@ else
fi
echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6
-echo "configure:1009: checking for working makeinfo" >&5
+echo "configure:1022: checking for working makeinfo" >&5
# Run test in a subshell; some versions of sh will print an error if
# an executable is not found, even if stderr is redirected.
# Redirect stdin to placate older versions of autoconf. Sigh.
@@ -1030,7 +1043,7 @@ fi
# Extract the first word of "gcc", so it can be a program name with args.
set dummy gcc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1034: checking for $ac_word" >&5
+echo "configure:1047: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1060,7 +1073,7 @@ if test -z "$CC"; then
# Extract the first word of "cc", so it can be a program name with args.
set dummy cc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1064: checking for $ac_word" >&5
+echo "configure:1077: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1109,7 +1122,7 @@ fi
fi
echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
-echo "configure:1113: checking whether we are using GNU C" >&5
+echo "configure:1126: checking whether we are using GNU C" >&5
if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1118,7 +1131,7 @@ else
yes;
#endif
EOF
-if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1122: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1135: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
ac_cv_prog_gcc=yes
else
ac_cv_prog_gcc=no
@@ -1133,7 +1146,7 @@ if test $ac_cv_prog_gcc = yes; then
ac_save_CFLAGS="$CFLAGS"
CFLAGS=
echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
-echo "configure:1137: checking whether ${CC-cc} accepts -g" >&5
+echo "configure:1150: checking whether ${CC-cc} accepts -g" >&5
if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1169,7 +1182,7 @@ do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1173: checking for $ac_word" >&5
+echo "configure:1186: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CXX'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1202,7 +1215,7 @@ test -n "$CXX" || CXX="gcc"
test -z "$CXX" && { echo "configure: error: no acceptable c++ found in \$PATH" 1>&2; exit 1; }
echo $ac_n "checking whether we are using GNU C++""... $ac_c" 1>&6
-echo "configure:1206: checking whether we are using GNU C++" >&5
+echo "configure:1219: checking whether we are using GNU C++" >&5
if eval "test \"`echo '$''{'ac_cv_prog_gxx'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1211,7 +1224,7 @@ else
yes;
#endif
EOF
-if { ac_try='${CXX-g++} -E conftest.C'; { (eval echo configure:1215: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+if { ac_try='${CXX-g++} -E conftest.C'; { (eval echo configure:1228: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
ac_cv_prog_gxx=yes
else
ac_cv_prog_gxx=no
@@ -1226,7 +1239,7 @@ if test $ac_cv_prog_gxx = yes; then
ac_save_CXXFLAGS="$CXXFLAGS"
CXXFLAGS=
echo $ac_n "checking whether ${CXX-g++} accepts -g""... $ac_c" 1>&6
-echo "configure:1230: checking whether ${CXX-g++} accepts -g" >&5
+echo "configure:1243: checking whether ${CXX-g++} accepts -g" >&5
if eval "test \"`echo '$''{'ac_cv_prog_cxx_g'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1259,7 +1272,7 @@ fi
# LIBGCJ_CONFIGURE, which doesn't work because that means that it will
# be run before AC_CANONICAL_HOST.
echo $ac_n "checking build system type""... $ac_c" 1>&6
-echo "configure:1263: checking build system type" >&5
+echo "configure:1276: checking build system type" >&5
build_alias=$build
case "$build_alias" in
@@ -1280,7 +1293,7 @@ echo "$ac_t""$build" 1>&6
# Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args.
set dummy ${ac_tool_prefix}as; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1284: checking for $ac_word" >&5
+echo "configure:1297: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_AS'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1312,7 +1325,7 @@ fi
# Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
set dummy ${ac_tool_prefix}ar; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1316: checking for $ac_word" >&5
+echo "configure:1329: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1344,7 +1357,7 @@ fi
# Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
set dummy ${ac_tool_prefix}ranlib; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1348: checking for $ac_word" >&5
+echo "configure:1361: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1376,7 +1389,7 @@ if test -n "$ac_tool_prefix"; then
# Extract the first word of "ranlib", so it can be a program name with args.
set dummy ranlib; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1380: checking for $ac_word" >&5
+echo "configure:1393: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1421,7 +1434,7 @@ fi
# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
# ./install, which can be erroneously created by make from ./install.sh.
echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
-echo "configure:1425: checking for a BSD compatible install" >&5
+echo "configure:1438: checking for a BSD compatible install" >&5
if test -z "$INSTALL"; then
if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -1475,7 +1488,7 @@ test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
echo $ac_n "checking whether to enable maintainer-specific portions of Makefiles""... $ac_c" 1>&6
-echo "configure:1479: checking whether to enable maintainer-specific portions of Makefiles" >&5
+echo "configure:1492: checking whether to enable maintainer-specific portions of Makefiles" >&5
# Check whether --enable-maintainer-mode or --disable-maintainer-mode was given.
if test "${enable_maintainer_mode+set}" = set; then
enableval="$enable_maintainer_mode"
@@ -1509,7 +1522,7 @@ if false; then
echo $ac_n "checking for executable suffix""... $ac_c" 1>&6
-echo "configure:1513: checking for executable suffix" >&5
+echo "configure:1526: checking for executable suffix" >&5
if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -1519,7 +1532,7 @@ else
rm -f conftest*
echo 'int main () { return 0; }' > conftest.$ac_ext
ac_cv_exeext=
- if { (eval echo configure:1523: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
+ if { (eval echo configure:1536: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
for file in conftest.*; do
case $file in
*.c | *.o | *.obj | *.ilk | *.pdb) ;;
@@ -1569,6 +1582,982 @@ LIBGCJ_JAVAFLAGS="${libgcj_javaflags}"
+# Check whether --enable-shared or --disable-shared was given.
+if test "${enable_shared+set}" = set; then
+ enableval="$enable_shared"
+ p=${PACKAGE-default}
+case "$enableval" in
+yes) enable_shared=yes ;;
+no) enable_shared=no ;;
+*)
+ enable_shared=no
+ # Look at the argument we got. We use all the common list separators.
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
+ for pkg in $enableval; do
+ if test "X$pkg" = "X$p"; then
+ enable_shared=yes
+ fi
+ done
+ IFS="$ac_save_ifs"
+ ;;
+esac
+else
+ enable_shared=yes
+fi
+
+# Check whether --enable-static or --disable-static was given.
+if test "${enable_static+set}" = set; then
+ enableval="$enable_static"
+ p=${PACKAGE-default}
+case "$enableval" in
+yes) enable_static=yes ;;
+no) enable_static=no ;;
+*)
+ enable_static=no
+ # Look at the argument we got. We use all the common list separators.
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
+ for pkg in $enableval; do
+ if test "X$pkg" = "X$p"; then
+ enable_static=yes
+ fi
+ done
+ IFS="$ac_save_ifs"
+ ;;
+esac
+else
+ enable_static=yes
+fi
+
+# Check whether --enable-fast-install or --disable-fast-install was given.
+if test "${enable_fast_install+set}" = set; then
+ enableval="$enable_fast_install"
+ p=${PACKAGE-default}
+case "$enableval" in
+yes) enable_fast_install=yes ;;
+no) enable_fast_install=no ;;
+*)
+ enable_fast_install=no
+ # Look at the argument we got. We use all the common list separators.
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
+ for pkg in $enableval; do
+ if test "X$pkg" = "X$p"; then
+ enable_fast_install=yes
+ fi
+ done
+ IFS="$ac_save_ifs"
+ ;;
+esac
+else
+ enable_fast_install=yes
+fi
+
+# Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1658: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$RANLIB"; then
+ ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_RANLIB="ranlib"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":"
+fi
+fi
+RANLIB="$ac_cv_prog_RANLIB"
+if test -n "$RANLIB"; then
+ echo "$ac_t""$RANLIB" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+# Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1688: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_CC="gcc"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1718: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_prog_rejected=no
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# -gt 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ set dummy "$ac_dir/$ac_word" "$@"
+ shift
+ ac_cv_prog_CC="$@"
+ fi
+fi
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ if test -z "$CC"; then
+ case "`uname -s`" in
+ *win32* | *WIN32*)
+ # Extract the first word of "cl", so it can be a program name with args.
+set dummy cl; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1769: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_CC="cl"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+ ;;
+ esac
+ fi
+ test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
+echo "configure:1801: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+cat > conftest.$ac_ext << EOF
+
+#line 1812 "configure"
+#include "confdefs.h"
+
+main(){return(0);}
+EOF
+if { (eval echo configure:1817: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ ac_cv_prog_cc_works=yes
+ # If we can't run a trivial program, we are probably using a cross compiler.
+ if (./conftest; exit) 2>/dev/null; then
+ ac_cv_prog_cc_cross=no
+ else
+ ac_cv_prog_cc_cross=yes
+ fi
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ ac_cv_prog_cc_works=no
+fi
+rm -fr conftest*
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo "$ac_t""$ac_cv_prog_cc_works" 1>&6
+if test $ac_cv_prog_cc_works = no; then
+ { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
+fi
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
+echo "configure:1843: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
+echo "configure:1848: checking whether we are using GNU C" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.c <<EOF
+#ifdef __GNUC__
+ yes;
+#endif
+EOF
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1857: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+ ac_cv_prog_gcc=yes
+else
+ ac_cv_prog_gcc=no
+fi
+fi
+
+echo "$ac_t""$ac_cv_prog_gcc" 1>&6
+
+if test $ac_cv_prog_gcc = yes; then
+ GCC=yes
+else
+ GCC=
+fi
+
+ac_test_CFLAGS="${CFLAGS+set}"
+ac_save_CFLAGS="$CFLAGS"
+CFLAGS=
+echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
+echo "configure:1876: checking whether ${CC-cc} accepts -g" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ echo 'void f(){}' > conftest.c
+if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
+ ac_cv_prog_cc_g=yes
+else
+ ac_cv_prog_cc_g=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$ac_cv_prog_cc_g" 1>&6
+if test "$ac_test_CFLAGS" = set; then
+ CFLAGS="$ac_save_CFLAGS"
+elif test $ac_cv_prog_cc_g = yes; then
+ if test "$GCC" = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-g"
+ fi
+else
+ if test "$GCC" = yes; then
+ CFLAGS="-O2"
+ else
+ CFLAGS=
+ fi
+fi
+
+# Check whether --with-gnu-ld or --without-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then
+ withval="$with_gnu_ld"
+ test "$withval" = no || with_gnu_ld=yes
+else
+ with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test "$ac_cv_prog_gcc" = yes; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ echo $ac_n "checking for ld used by GCC""... $ac_c" 1>&6
+echo "configure:1919: checking for ld used by GCC" >&5
+ ac_prog=`($CC -print-prog-name=ld) 2>&5`
+ case "$ac_prog" in
+ # Accept absolute paths.
+ /* | [A-Za-z]:[\\/]*)
+ re_direlt='/[^/][^/]*/\.\./'
+ # Canonicalize the path of ld
+ ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'`
+ while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
+ ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
+ done
+ test -z "$LD" && LD="$ac_prog"
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ac_prog=ld
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+elif test "$with_gnu_ld" = yes; then
+ echo $ac_n "checking for GNU ld""... $ac_c" 1>&6
+echo "configure:1943: checking for GNU ld" >&5
+else
+ echo $ac_n "checking for non-GNU ld""... $ac_c" 1>&6
+echo "configure:1946: checking for non-GNU ld" >&5
+fi
+if eval "test \"`echo '$''{'ac_cv_path_LD'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -z "$LD"; then
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog"; then
+ ac_cv_path_LD="$ac_dir/$ac_prog"
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some GNU ld's only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ if "$ac_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then
+ test "$with_gnu_ld" != no && break
+ else
+ test "$with_gnu_ld" != yes && break
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+else
+ ac_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$ac_cv_path_LD"
+if test -n "$LD"; then
+ echo "$ac_t""$LD" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+test -z "$LD" && { echo "configure: error: no acceptable ld found in \$PATH" 1>&2; exit 1; }
+
+echo $ac_n "checking if the linker ($LD) is GNU ld""... $ac_c" 1>&6
+echo "configure:1982: checking if the linker ($LD) is GNU ld" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_gnu_ld'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ # I'd rather use --version here, but apparently some GNU ld's only accept -v.
+if $LD -v 2>&1 </dev/null | egrep '(GNU|with BFD)' 1>&5; then
+ ac_cv_prog_gnu_ld=yes
+else
+ ac_cv_prog_gnu_ld=no
+fi
+fi
+
+echo "$ac_t""$ac_cv_prog_gnu_ld" 1>&6
+
+
+echo $ac_n "checking for BSD-compatible nm""... $ac_c" 1>&6
+echo "configure:1998: checking for BSD-compatible nm" >&5
+if eval "test \"`echo '$''{'ac_cv_path_NM'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$NM"; then
+ # Let the user override the test.
+ ac_cv_path_NM="$NM"
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/nm; then
+ # Check to see if the nm accepts a BSD-compat flag.
+ # Adding the `sed 1q' prevents false positives on HP-UX, which says:
+ # nm: unknown option "B" ignored
+ if ($ac_dir/nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
+ ac_cv_path_NM="$ac_dir/nm -B"
+ break
+ elif ($ac_dir/nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
+ ac_cv_path_NM="$ac_dir/nm -p"
+ break
+ else
+ ac_cv_path_NM=${ac_cv_path_NM="$ac_dir/nm"} # keep the first match, but
+ continue # so that we can try to find one that supports BSD flags
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_NM" && ac_cv_path_NM=nm
+fi
+fi
+
+NM="$ac_cv_path_NM"
+echo "$ac_t""$NM" 1>&6
+
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+echo $ac_n "checking command to parse $NM output""... $ac_c" 1>&6
+echo "configure:2036: checking command to parse $NM output" >&5
+if eval "test \"`echo '$''{'ac_cv_sys_global_symbol_pipe'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ # These are sane defaults that work on at least a few old systems.
+# {They come from Ultrix. What could be older than Ultrix?!! ;)}
+
+# Character class describing NM global symbol codes.
+ac_symcode='[BCDEGRST]'
+
+# Regexp to match symbols that can be accessed directly from C.
+ac_sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
+
+# Transform the above into a raw symbol and a C symbol.
+ac_symxfrm='\1 \2\3 \3'
+
+# Transform an extracted symbol line into a proper C declaration
+ac_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern char \1;/p'"
+
+# Define system-specific variables.
+case "$host_os" in
+aix*)
+ ac_symcode='[BCDT]'
+ ;;
+cygwin* | mingw*)
+ ac_symcode='[ABCDGISTW]'
+ ;;
+hpux*)
+ ac_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern char \1();/p' -e 's/^. .* \(.*\)$/extern char \1;/p'"
+ ;;
+irix*)
+ ac_symcode='[BCDEGRST]'
+ ;;
+solaris*)
+ ac_symcode='[BDT]'
+ ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+if $NM -V 2>&1 | egrep '(GNU|with BFD)' > /dev/null; then
+ ac_symcode='[ABCDGISTW]'
+fi
+
+# Try without a prefix undercore, then with it.
+for ac_symprfx in "" "_"; do
+
+ ac_cv_sys_global_symbol_pipe="sed -n -e 's/^.* \($ac_symcode\) *\($ac_symprfx\)$ac_sympat$/$ac_symxfrm/p'"
+
+ # Check to see that the pipe works correctly.
+ ac_pipe_works=no
+ rm -f conftest.$ac_ext
+ cat > conftest.$ac_ext <<EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func;return 0;}
+EOF
+
+ if { (eval echo configure:2099: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ # Now try to grab the symbols.
+ ac_nlist=conftest.nm
+
+ if { (eval echo configure:2103: \"$NM conftest.$ac_objext \| $ac_cv_sys_global_symbol_pipe \> $ac_nlist\") 1>&5; (eval $NM conftest.$ac_objext \| $ac_cv_sys_global_symbol_pipe \> $ac_nlist) 2>&5; } && test -s "$ac_nlist"; then
+
+ # Try sorting and uniquifying the output.
+ if sort "$ac_nlist" | uniq > "$ac_nlist"T; then
+ mv -f "$ac_nlist"T "$ac_nlist"
+ else
+ rm -f "$ac_nlist"T
+ fi
+
+ # Make sure that we snagged all the symbols we need.
+ if egrep ' nm_test_var$' "$ac_nlist" >/dev/null; then
+ if egrep ' nm_test_func$' "$ac_nlist" >/dev/null; then
+ cat <<EOF > conftest.c
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+EOF
+ # Now generate the symbol file.
+ eval "$ac_global_symbol_to_cdecl"' < "$ac_nlist" >> conftest.c'
+
+ cat <<EOF >> conftest.c
+#if defined (__STDC__) && __STDC__
+# define lt_ptr_t void *
+#else
+# define lt_ptr_t char *
+# define const
+#endif
+
+/* The mapping between symbol names and symbols. */
+const struct {
+ const char *name;
+ lt_ptr_t address;
+}
+lt_preloaded_symbols[] =
+{
+EOF
+ sed 's/^. \(.*\) \(.*\)$/ {"\2", (lt_ptr_t) \&\2},/' < "$ac_nlist" >> conftest.c
+ cat <<\EOF >> conftest.c
+ {0, (lt_ptr_t) 0}
+};
+
+#ifdef __cplusplus
+}
+#endif
+EOF
+ # Now try linking the two files.
+ mv conftest.$ac_objext conftestm.$ac_objext
+ ac_save_LIBS="$LIBS"
+ ac_save_CFLAGS="$CFLAGS"
+ LIBS="conftestm.$ac_objext"
+ CFLAGS="$CFLAGS$no_builtin_flag"
+ if { (eval echo configure:2155: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ ac_pipe_works=yes
+ else
+ echo "configure: failed program was:" >&5
+ cat conftest.c >&5
+ fi
+ LIBS="$ac_save_LIBS"
+ CFLAGS="$ac_save_CFLAGS"
+ else
+ echo "cannot find nm_test_func in $ac_nlist" >&5
+ fi
+ else
+ echo "cannot find nm_test_var in $ac_nlist" >&5
+ fi
+ else
+ echo "cannot run $ac_cv_sys_global_symbol_pipe" >&5
+ fi
+ else
+ echo "$progname: failed program was:" >&5
+ cat conftest.c >&5
+ fi
+ rm -rf conftest*
+
+ # Do not use the global_symbol_pipe unless it works.
+ if test "$ac_pipe_works" = yes; then
+ if test x"$ac_symprfx" = x"_"; then
+ ac_cv_sys_symbol_underscore=yes
+ else
+ ac_cv_sys_symbol_underscore=no
+ fi
+ break
+ else
+ ac_cv_sys_global_symbol_pipe=
+ fi
+done
+
+fi
+
+
+ac_result=yes
+if test -z "$ac_cv_sys_global_symbol_pipe"; then
+ ac_result=no
+fi
+echo "$ac_t""$ac_result" 1>&6
+
+echo $ac_n "checking for _ prefix in compiled symbols""... $ac_c" 1>&6
+echo "configure:2201: checking for _ prefix in compiled symbols" >&5
+if eval "test \"`echo '$''{'ac_cv_sys_symbol_underscore'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_cv_sys_symbol_underscore=no
+cat > conftest.$ac_ext <<EOF
+void nm_test_func(){}
+int main(){nm_test_func;return 0;}
+EOF
+if { (eval echo configure:2210: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ # Now try to grab the symbols.
+ ac_nlist=conftest.nm
+ if { (eval echo configure:2213: \"$NM conftest.$ac_objext \| $ac_cv_sys_global_symbol_pipe \> $ac_nlist\") 1>&5; (eval $NM conftest.$ac_objext \| $ac_cv_sys_global_symbol_pipe \> $ac_nlist) 2>&5; } && test -s "$ac_nlist"; then
+ # See whether the symbols have a leading underscore.
+ if egrep '^. _nm_test_func' "$ac_nlist" >/dev/null; then
+ ac_cv_sys_symbol_underscore=yes
+ else
+ if egrep '^. nm_test_func ' "$ac_nlist" >/dev/null; then
+ :
+ else
+ echo "configure: cannot find nm_test_func in $ac_nlist" >&5
+ fi
+ fi
+ else
+ echo "configure: cannot run $ac_cv_sys_global_symbol_pipe" >&5
+ fi
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.c >&5
+fi
+rm -rf conftest*
+
+fi
+
+echo "$ac_t""$ac_cv_sys_symbol_underscore" 1>&6
+USE_SYMBOL_UNDERSCORE=${ac_cv_sys_symbol_underscore=no}
+
+echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6
+echo "configure:2239: checking whether ln -s works" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ rm -f conftestdata
+if ln -s X conftestdata 2>/dev/null
+then
+ rm -f conftestdata
+ ac_cv_prog_LN_S="ln -s"
+else
+ ac_cv_prog_LN_S=ln
+fi
+fi
+LN_S="$ac_cv_prog_LN_S"
+if test "$ac_cv_prog_LN_S" = "ln -s"; then
+ echo "$ac_t""yes" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+# Check for any special flags to pass to ltconfig.
+libtool_flags="--cache-file=$cache_file"
+test "$enable_shared" = no && libtool_flags="$libtool_flags --disable-shared"
+test "$enable_static" = no && libtool_flags="$libtool_flags --disable-static"
+test "$enable_fast_install" = no && libtool_flags="$libtool_flags --disable-fast-install"
+test "$lt_dlopen" = yes && libtool_flags="$libtool_flags --enable-dlopen"
+test "$silent" = yes && libtool_flags="$libtool_flags --silent"
+test "$ac_cv_prog_gcc" = yes && libtool_flags="$libtool_flags --with-gcc"
+test "$ac_cv_prog_gnu_ld" = yes && libtool_flags="$libtool_flags --with-gnu-ld"
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case "$host" in
+*-*-irix6*)
+ # Find out which ABI we are using.
+ echo '#line 2275 "configure"' > conftest.$ac_ext
+ if { (eval echo configure:2276: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ case "`/usr/bin/file conftest.o`" in
+ *32-bit*)
+ LD="${LD-ld} -32"
+ ;;
+ *N32*)
+ LD="${LD-ld} -n32"
+ ;;
+ *64-bit*)
+ LD="${LD-ld} -64"
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+
+*-*-sco3.2v5*)
+ # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+ SAVE_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -belf"
+ echo $ac_n "checking whether the C compiler needs -belf""... $ac_c" 1>&6
+echo "configure:2297: checking whether the C compiler needs -belf" >&5
+if eval "test \"`echo '$''{'lt_cv_cc_needs_belf'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2302 "configure"
+#include "confdefs.h"
+
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:2309: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ lt_cv_cc_needs_belf=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ lt_cv_cc_needs_belf=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$lt_cv_cc_needs_belf" 1>&6
+ if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+ # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+ CFLAGS="$SAVE_CFLAGS"
+ fi
+ ;;
+
+*-*-cygwin*)
+ # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dlltool; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:2332: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_DLLTOOL'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$DLLTOOL"; then
+ ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+DLLTOOL="$ac_cv_prog_DLLTOOL"
+if test -n "$DLLTOOL"; then
+ echo "$ac_t""$DLLTOOL" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+if test -z "$ac_cv_prog_DLLTOOL"; then
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "dlltool", so it can be a program name with args.
+set dummy dlltool; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:2364: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_DLLTOOL'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$DLLTOOL"; then
+ ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_DLLTOOL="dlltool"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_prog_DLLTOOL" && ac_cv_prog_DLLTOOL="false"
+fi
+fi
+DLLTOOL="$ac_cv_prog_DLLTOOL"
+if test -n "$DLLTOOL"; then
+ echo "$ac_t""$DLLTOOL" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+else
+ DLLTOOL="false"
+fi
+fi
+
+# Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args.
+set dummy ${ac_tool_prefix}as; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:2399: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_AS'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$AS"; then
+ ac_cv_prog_AS="$AS" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_AS="${ac_tool_prefix}as"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+AS="$ac_cv_prog_AS"
+if test -n "$AS"; then
+ echo "$ac_t""$AS" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+if test -z "$ac_cv_prog_AS"; then
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "as", so it can be a program name with args.
+set dummy as; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:2431: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_AS'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$AS"; then
+ ac_cv_prog_AS="$AS" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_AS="as"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_prog_AS" && ac_cv_prog_AS="false"
+fi
+fi
+AS="$ac_cv_prog_AS"
+if test -n "$AS"; then
+ echo "$ac_t""$AS" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+else
+ AS="false"
+fi
+fi
+
+
+ ;;
+
+esac
+
+# enable the --disable-libtool-lock switch
+
+# Check whether --enable-libtool-lock or --disable-libtool-lock was given.
+if test "${enable_libtool_lock+set}" = set; then
+ enableval="$enable_libtool_lock"
+ need_locks=$enableval
+else
+ need_locks=yes
+fi
+
+
+if test x"$need_locks" = xno; then
+ libtool_flags="$libtool_flags --disable-lock"
+fi
+
+
+# Save cache, so that ltconfig can load it
+cat > confcache <<\EOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs. It is not useful on other systems.
+# If it contains results you don't want to keep, you may remove or edit it.
+#
+# By default, configure uses ./config.cache as the cache file,
+# creating it if it does not exist already. You can give configure
+# the --cache-file=FILE option to use a different cache file; that is
+# what configure does when it calls configure scripts in
+# subdirectories, so they share the cache.
+# Giving --cache-file=/dev/null disables caching, for debugging configure.
+# config.status only pays attention to the cache file if you give it the
+# --recheck option to rerun configure.
+#
+EOF
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(set) 2>&1 |
+ case `(ac_space=' '; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ # `set' does not quote correctly, so add quotes (double-quote substitution
+ # turns \\\\ into \\, and sed turns \\ into \).
+ sed -n \
+ -e "s/'/'\\\\''/g" \
+ -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
+ ;;
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
+ ;;
+ esac >> confcache
+if cmp -s $cache_file confcache; then
+ :
+else
+ if test -w $cache_file; then
+ echo "updating cache $cache_file"
+ cat confcache > $cache_file
+ else
+ echo "not updating unwritable cache $cache_file"
+ fi
+fi
+rm -f confcache
+
+
+# Actually configure libtool. ac_aux_dir is where install-sh is found.
+CC="$CC" CFLAGS="$CFLAGS" CPPFLAGS="$CPPFLAGS" \
+LD="$LD" NM="$NM" RANLIB="$RANLIB" LN_S="$LN_S" \
+DLLTOOL="$DLLTOOL" AS="$AS" \
+${CONFIG_SHELL-/bin/sh} $ac_aux_dir/ltconfig --no-reexec \
+$libtool_flags --no-verify $ac_aux_dir/ltmain.sh $host \
+|| { echo "configure: error: libtool configure failed" 1>&2; exit 1; }
+
+# Reload cache, that may have been modified by ltconfig
+if test -r "$cache_file"; then
+ echo "loading cache $cache_file"
+ . $cache_file
+else
+ echo "creating cache $cache_file"
+ > $cache_file
+fi
+
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ac_aux_dir/ltconfig $ac_aux_dir/ltmain.sh"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+
+# Redirect the config.log output again, so that the ltconfig log is not
+# clobbered by the next message.
+exec 5>>./config.log
+
+
if test -z "$with_target_subdir" || test "$with_target_subdir" = "."; then
COMPPATH=.
else
@@ -1623,9 +2612,11 @@ fi
case "$TARGET_ECOS" in
no)
FILE_DESCRIPTOR=natFileDescriptorPosix.cc
+ PROCESS=Posix
;;
*)
FILE_DESCRIPTOR=natFileDescriptorEcos.cc
+ PROCESS=Ecos
cat >> confdefs.h <<\EOF
#define ECOS 1
EOF
@@ -1634,7 +2625,7 @@ EOF
esac
echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
-echo "configure:1638: checking how to run the C preprocessor" >&5
+echo "configure:2629: checking how to run the C preprocessor" >&5
# On Suns, sometimes $CPP names a directory.
if test -n "$CPP" && test -d "$CPP"; then
CPP=
@@ -1649,13 +2640,13 @@ else
# On the NeXT, cc -E runs the code through the compiler's parser,
# not just through cpp.
cat > conftest.$ac_ext <<EOF
-#line 1653 "configure"
+#line 2644 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1659: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:2650: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
:
@@ -1666,13 +2657,13 @@ else
rm -rf conftest*
CPP="${CC-cc} -E -traditional-cpp"
cat > conftest.$ac_ext <<EOF
-#line 1670 "configure"
+#line 2661 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1676: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:2667: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
:
@@ -1683,13 +2674,13 @@ else
rm -rf conftest*
CPP="${CC-cc} -nologo -E"
cat > conftest.$ac_ext <<EOF
-#line 1687 "configure"
+#line 2678 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1693: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:2684: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
:
@@ -1714,12 +2705,12 @@ fi
echo "$ac_t""$CPP" 1>&6
cat > conftest.$ac_ext <<EOF
-#line 1718 "configure"
+#line 2709 "configure"
#include "confdefs.h"
-#include <sys/types.h>
+#include <stdint.h>
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- egrep "__uint32_t" >/dev/null 2>&1; then
+ egrep "uint32_t" >/dev/null 2>&1; then
rm -rf conftest*
cat >> confdefs.h <<\EOF
#define HAVE_INT32_DEFINED 1
@@ -1729,12 +2720,12 @@ fi
rm -f conftest*
cat > conftest.$ac_ext <<EOF
-#line 1733 "configure"
+#line 2724 "configure"
#include "confdefs.h"
-#include <sys/config.h>
+#include <inttypes.h>
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- egrep "__uint32_t" >/dev/null 2>&1; then
+ egrep "uint32_t" >/dev/null 2>&1; then
rm -rf conftest*
cat >> confdefs.h <<\EOF
#define HAVE_INT32_DEFINED 1
@@ -1743,9 +2734,40 @@ EOF
fi
rm -f conftest*
+cat > conftest.$ac_ext <<EOF
+#line 2739 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "u_int32_t" >/dev/null 2>&1; then
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define HAVE_BSD_INT32_DEFINED 1
+EOF
+
+fi
+rm -f conftest*
+
+cat > conftest.$ac_ext <<EOF
+#line 2754 "configure"
+#include "confdefs.h"
+#include <sys/config.h>
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "u_int32_t" >/dev/null 2>&1; then
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define HAVE_BSD_INT32_DEFINED 1
+EOF
+
+fi
+rm -f conftest*
+
+
cat > conftest.$ac_ext <<EOF
-#line 1749 "configure"
+#line 2771 "configure"
#include "confdefs.h"
#include <time.h>
EOF
@@ -1760,7 +2782,7 @@ fi
rm -f conftest*
cat > conftest.$ac_ext <<EOF
-#line 1764 "configure"
+#line 2786 "configure"
#include "confdefs.h"
#include <time.h>
EOF
@@ -1779,8 +2801,26 @@ test -d java || mkdir java
test -d java/io || mkdir java/io
+test -d java/lang || mkdir java/lang
+
+
+
+SYSTEMSPEC=
+
+
+# Check whether --with-system-zlib or --without-system-zlib was given.
+if test "${with_system_zlib+set}" = set; then
+ withval="$with_system_zlib"
+ :
+fi
+
+ZLIBSPEC=
+
+
+libsubdir=.libs
+
echo $ac_n "checking for garbage collector to use""... $ac_c" 1>&6
-echo "configure:1784: checking for garbage collector to use" >&5
+echo "configure:2824: checking for garbage collector to use" >&5
# Check whether --enable-java-gc or --disable-java-gc was given.
if test "${enable_java_gc+set}" = set; then
enableval="$enable_java_gc"
@@ -1794,14 +2834,18 @@ GCLIBS=
GCINCS=
GCDEPS=
GCOBJS=
+GCSPEC=
case "$GC" in
boehm)
echo "$ac_t""boehm" 1>&6
- GCLIBS='-L$(top_builddir)/../boehm-gc -lgcjgc'
- GCDEPS='$(top_builddir)/../boehm-gc/libgcjgc.a'
+ GCDEPS='$(top_builddir)/../boehm-gc/libgcjgc.la'
+ # We include the path to the boehm-gc build directory.
+ # See Makefile.am to understand why.
+ GCLIBS="$GCDEPS -L\$(here)/../boehm-gc/$libsubdir"
GCINCS='-I$(top_srcdir)/../boehm-gc -I$(top_builddir)/../boehm-gc'
+ GCSPEC='-lgcjgc'
GCINCS="$GCINCS `cat ../boehm-gc/boehm-cflags`"
- GCOBJS=boehm.o
+ GCOBJS=boehm.lo
GCHDR=boehm-gc.h
cat >> confdefs.h <<\EOF
#define HAVE_BOEHM_GC 1
@@ -1810,7 +2854,7 @@ EOF
;;
no)
echo "$ac_t""none" 1>&6
- GCOBJS=nogc.o
+ GCOBJS=nogc.lo
GCHDR=no-gc.h
;;
*)
@@ -1824,8 +2868,9 @@ esac
+
echo $ac_n "checking for threads package to use""... $ac_c" 1>&6
-echo "configure:1829: checking for threads package to use" >&5
+echo "configure:2874: checking for threads package to use" >&5
# Check whether --enable-threads or --disable-threads was given.
if test "${enable_threads+set}" = set; then
enableval="$enable_threads"
@@ -1848,7 +2893,9 @@ if test "$THREADS" = yes; then
THREADS=win32
;;
*-*-irix*)
- THREADS=irix
+ # FIXME: for now, choose POSIX, because we implement that.
+ # Later, choose irix threads.
+ THREADS=posix
;;
*-*-solaris*)
# FIXME: for now, choose POSIX, because we implement that.
@@ -1893,10 +2940,12 @@ THREADINCS=
THREADDEPS=
THREADOBJS=
THREADH=
+THREADSPEC=
case "$THREADS" in
posix)
THREADLIBS=-lpthread
- THREADOBJS=posix-threads.o
+ THREADSPEC=-lpthread
+ THREADOBJS=posix-threads.lo
THREADH=posix-threads.h
# MIT pthreads doesn't seem to have the mutexattr functions.
# But for now we don't check for it. We just assume you aren't
@@ -1908,15 +2957,18 @@ EOF
;;
qt)
- THREADLIBS='-L$(top_builddir)/../qthreads -lgcjcoop'
- THREADOBJS=quick-threads.o
+ THREADDEPS='$(top_builddir)/../qthreads/libgcjcoop.la'
+ # We include the path to the qthreads build directory.
+ # See Makefile.am to understand why.
+ THREADLIBS="$THREADDEPS -L\$(here)/../qthreads/$libsubdir"
+ THREADSPEC='-lgcjcoop'
+ THREADOBJS=quick-threads.lo
THREADINCS='-I$(top_srcdir)/../qthreads'
THREADH=quick-threads.h
- THREADDEPS='$(top_builddir)/../qthreads/libgcjcoop.a'
;;
none)
- THREADOBJS=no-threads.o
+ THREADOBJS=no-threads.lo
THREADH=no-threads.h
;;
esac
@@ -1928,6 +2980,7 @@ esac
+
if test "$GCC" = yes; then
USING_GCC_TRUE=
USING_GCC_FALSE='#'
@@ -1992,11 +3045,16 @@ EOF
EOF
+ ZLIBSPEC=-lgcj
+
# If Canadian cross, then don't pick up tools from the build
# directory.
if test "$build" != "$with_cross_host"; then
CANADIAN=yes
EH_COMMON_INCLUDE=
+ GCJ="${target_alias}/gcj"
+ else
+ GCJ=
fi
else
# Some POSIX thread systems don't have pthread_mutexattr_settype.
@@ -2004,12 +3062,12 @@ else
for ac_func in strerror ioctl select open fsync sleep
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:2008: checking for $ac_func" >&5
+echo "configure:3066: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 2013 "configure"
+#line 3071 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -2032,7 +3090,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:2036: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3094: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -2059,12 +3117,12 @@ done
for ac_func in ctime_r ctime
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:2063: checking for $ac_func" >&5
+echo "configure:3121: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 2068 "configure"
+#line 3126 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -2087,7 +3145,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:2091: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3149: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -2114,12 +3172,12 @@ done
for ac_func in gmtime_r localtime_r readdir_r getpwuid_r
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:2118: checking for $ac_func" >&5
+echo "configure:3176: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 2123 "configure"
+#line 3181 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -2142,7 +3200,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:2146: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3204: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -2169,12 +3227,12 @@ done
for ac_func in access stat mkdir rename rmdir unlink realpath
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:2173: checking for $ac_func" >&5
+echo "configure:3231: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 2178 "configure"
+#line 3236 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -2197,7 +3255,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:2201: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3259: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -2224,12 +3282,12 @@ done
for ac_func in inet_aton inet_addr
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:2228: checking for $ac_func" >&5
+echo "configure:3286: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 2233 "configure"
+#line 3291 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -2252,7 +3310,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:2256: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3314: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -2279,12 +3337,12 @@ done
for ac_func in inet_pton uname
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:2283: checking for $ac_func" >&5
+echo "configure:3341: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 2288 "configure"
+#line 3346 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -2307,7 +3365,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:2311: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3369: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -2335,12 +3393,12 @@ done
for ac_func in gethostbyname_r
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:2339: checking for $ac_func" >&5
+echo "configure:3397: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 2344 "configure"
+#line 3402 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -2363,7 +3421,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:2367: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3425: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -2390,7 +3448,7 @@ EOF
# We look for the one that returns `int'.
# Hopefully this check is robust enough.
cat > conftest.$ac_ext <<EOF
-#line 2394 "configure"
+#line 3452 "configure"
#include "confdefs.h"
#include <netdb.h>
EOF
@@ -2405,6 +3463,119 @@ EOF
fi
rm -f conftest*
+
+ case " $GCINCS " in
+ *" -D_REENTRANT "*) ;;
+ *)
+ echo $ac_n "checking whether gethostbyname_r declaration requires -D_REENTRANT""... $ac_c" 1>&6
+echo "configure:3472: checking whether gethostbyname_r declaration requires -D_REENTRANT" >&5
+if eval "test \"`echo '$''{'libjava_cv_gethostbyname_r_needs_reentrant'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+
+ ac_ext=C
+# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cxx_cross
+
+ cat > conftest.$ac_ext <<EOF
+#line 3485 "configure"
+#include "confdefs.h"
+#include <netdb.h>
+int main() {
+gethostbyname_r("", 0, 0);
+; return 0; }
+EOF
+if { (eval echo configure:3492: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ libjava_cv_gethostbyname_r_needs_reentrant=no
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ CPPFLAGS_SAVE="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS -D_REENTRANT"
+ cat > conftest.$ac_ext <<EOF
+#line 3502 "configure"
+#include "confdefs.h"
+#include <netdb.h>
+int main() {
+gethostbyname_r("", 0, 0);
+; return 0; }
+EOF
+if { (eval echo configure:3509: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ libjava_cv_gethostbyname_r_needs_reentrant=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ libjava_cv_gethostbyname_r_needs_reentrant=fail
+fi
+rm -f conftest*
+ CPPFLAGS="$CPPFLAGS_SAVE"
+
+fi
+rm -f conftest*
+ ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+
+fi
+
+echo "$ac_t""$libjava_cv_gethostbyname_r_needs_reentrant" 1>&6
+ if test "x$libjava_cv_gethostbyname_r_needs_reentrant" = xyes; then
+ cat >> confdefs.h <<\EOF
+#define GETHOSTBYNAME_R_NEEDS_REENTRANT 1
+EOF
+
+ fi
+ ;;
+ esac
+
+ echo $ac_n "checking for struct hostent_data""... $ac_c" 1>&6
+echo "configure:3544: checking for struct hostent_data" >&5
+if eval "test \"`echo '$''{'libjava_cv_struct_hostent_data'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 3549 "configure"
+#include "confdefs.h"
+
+#if GETHOSTBYNAME_R_NEEDS_REENTRANT && !defined(_REENTRANT)
+# define _REENTRANT 1
+#endif
+#include <netdb.h>
+int main() {
+struct hostent_data data;
+; return 0; }
+EOF
+if { (eval echo configure:3560: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ libjava_cv_struct_hostent_data=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ libjava_cv_struct_hostent_data=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$libjava_cv_struct_hostent_data" 1>&6
+ if test "x$libjava_cv_struct_hostent_data" = xyes; then
+ cat >> confdefs.h <<\EOF
+#define HAVE_STRUCT_HOSTENT_DATA 1
+EOF
+
+ fi
+
else
echo "$ac_t""no" 1>&6
fi
@@ -2414,12 +3585,12 @@ done
for ac_func in gethostbyaddr_r
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:2418: checking for $ac_func" >&5
+echo "configure:3589: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 2423 "configure"
+#line 3594 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -2442,7 +3613,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:2446: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3617: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -2469,7 +3640,7 @@ EOF
# We look for the one that returns `int'.
# Hopefully this check is robust enough.
cat > conftest.$ac_ext <<EOF
-#line 2473 "configure"
+#line 3644 "configure"
#include "confdefs.h"
#include <netdb.h>
EOF
@@ -2493,12 +3664,12 @@ done
for ac_func in gethostname
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:2497: checking for $ac_func" >&5
+echo "configure:3668: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 2502 "configure"
+#line 3673 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -2521,7 +3692,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:2525: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3696: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -2545,7 +3716,7 @@ EOF
EOF
cat > conftest.$ac_ext <<EOF
-#line 2549 "configure"
+#line 3720 "configure"
#include "confdefs.h"
#include <unistd.h>
EOF
@@ -2572,12 +3743,12 @@ done
for ac_func in pthread_mutexattr_settype pthread_mutexattr_setkind_np sched_yield
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:2576: checking for $ac_func" >&5
+echo "configure:3747: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 2581 "configure"
+#line 3752 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -2600,7 +3771,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:2604: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3775: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -2624,6 +3795,107 @@ else
fi
done
+ # Look for sched_yield. Sometimes it is in the posix4 library.
+ for ac_func in sched_yield
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:3803: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 3808 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:3831: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+echo $ac_n "checking for sched_yield in -lposix4""... $ac_c" 1>&6
+echo "configure:3853: checking for sched_yield in -lposix4" >&5
+ac_lib_var=`echo posix4'_'sched_yield | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-lposix4 $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 3861 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char sched_yield();
+
+int main() {
+sched_yield()
+; return 0; }
+EOF
+if { (eval echo configure:3872: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+
+ cat >> confdefs.h <<\EOF
+#define HAVE_SCHED_YIELD 1
+EOF
+
+ THREADLIBS="$THREADLIBS -lposix4"
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+fi
+done
+
LIBS="$save_LIBS"
# We require a way to get the time.
@@ -2631,12 +3903,12 @@ done
for ac_func in gettimeofday time ftime
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:2635: checking for $ac_func" >&5
+echo "configure:3907: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 2640 "configure"
+#line 3912 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -2659,7 +3931,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:2663: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3935: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -2687,17 +3959,15 @@ done
{ echo "configure: error: no function found to get the time" 1>&2; exit 1; }
fi
- # We require memmove.
- memmove_found=no
for ac_func in memmove
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:2696: checking for $ac_func" >&5
+echo "configure:3966: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 2701 "configure"
+#line 3971 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -2720,7 +3990,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:2724: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3994: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -2738,27 +4008,24 @@ if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
cat >> confdefs.h <<EOF
#define $ac_tr_func 1
EOF
- memmove_found=yes
+
else
echo "$ac_t""no" 1>&6
fi
done
- if test "$memmove_found" = no; then
- { echo "configure: error: memmove is required" 1>&2; exit 1; }
- fi
# We require memcpy.
memcpy_found=no
for ac_func in memcpy
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:2757: checking for $ac_func" >&5
+echo "configure:4024: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 2762 "configure"
+#line 4029 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -2781,7 +4048,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:2785: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4052: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -2809,14 +4076,387 @@ done
{ echo "configure: error: memcpy is required" 1>&2; exit 1; }
fi
- test -d "$libgcj_basedir/../gcc/java" || {
+ # Some library-finding code we stole from Tcl.
+ #--------------------------------------------------------------------
+ # Check for the existence of the -lsocket and -lnsl libraries.
+ # The order here is important, so that they end up in the right
+ # order in the command line generated by make. Here are some
+ # special considerations:
+ # 1. Use "connect" and "accept" to check for -lsocket, and
+ # "gethostbyname" to check for -lnsl.
+ # 2. Use each function name only once: can't redo a check because
+ # autoconf caches the results of the last check and won't redo it.
+ # 3. Use -lnsl and -lsocket only if they supply procedures that
+ # aren't already present in the normal libraries. This is because
+ # IRIX 5.2 has libraries, but they aren't needed and they're
+ # bogus: they goof up name resolution if used.
+ # 4. On some SVR4 systems, can't use -lsocket without -lnsl too.
+ # To get around this problem, check for both libraries together
+ # if -lsocket doesn't work by itself.
+ #--------------------------------------------------------------------
+
+ echo $ac_n "checking for socket libraries""... $ac_c" 1>&6
+echo "configure:4100: checking for socket libraries" >&5
+if eval "test \"`echo '$''{'gcj_cv_lib_sockets'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ gcj_cv_lib_sockets=
+ gcj_checkBoth=0
+ unset ac_cv_func_connect
+ echo $ac_n "checking for connect""... $ac_c" 1>&6
+echo "configure:4108: checking for connect" >&5
+if eval "test \"`echo '$''{'ac_cv_func_connect'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 4113 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char connect(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char connect();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_connect) || defined (__stub___connect)
+choke me
+#else
+connect();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:4136: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func_connect=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_connect=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'connect`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ gcj_checkSocket=0
+else
+ echo "$ac_t""no" 1>&6
+gcj_checkSocket=1
+fi
+
+ if test "$gcj_checkSocket" = 1; then
+ unset ac_cv_func_connect
+ echo $ac_n "checking for main in -lsocket""... $ac_c" 1>&6
+echo "configure:4159: checking for main in -lsocket" >&5
+ac_lib_var=`echo socket'_'main | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-lsocket $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 4167 "configure"
+#include "confdefs.h"
+
+int main() {
+main()
+; return 0; }
+EOF
+if { (eval echo configure:4174: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ gcj_cv_lib_sockets="-lsocket"
+else
+ echo "$ac_t""no" 1>&6
+gcj_checkBoth=1
+fi
+
+ fi
+ if test "$gcj_checkBoth" = 1; then
+ gcj_oldLibs=$LIBS
+ LIBS="$LIBS -lsocket -lnsl"
+ unset ac_cv_func_accept
+ echo $ac_n "checking for accept""... $ac_c" 1>&6
+echo "configure:4201: checking for accept" >&5
+if eval "test \"`echo '$''{'ac_cv_func_accept'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 4206 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char accept(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char accept();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_accept) || defined (__stub___accept)
+choke me
+#else
+accept();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:4229: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func_accept=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_accept=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'accept`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ gcj_checkNsl=0
+ gcj_cv_lib_sockets="-lsocket -lnsl"
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ unset ac_cv_func_accept
+ LIBS=$gcj_oldLibs
+ fi
+ unset ac_cv_func_gethostbyname
+ gcj_oldLibs=$LIBS
+ LIBS="$LIBS $gcj_cv_lib_sockets"
+ echo $ac_n "checking for gethostbyname""... $ac_c" 1>&6
+echo "configure:4256: checking for gethostbyname" >&5
+if eval "test \"`echo '$''{'ac_cv_func_gethostbyname'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 4261 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char gethostbyname(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char gethostbyname();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_gethostbyname) || defined (__stub___gethostbyname)
+choke me
+#else
+gethostbyname();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:4284: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func_gethostbyname=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_gethostbyname=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'gethostbyname`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ :
+else
+ echo "$ac_t""no" 1>&6
+echo $ac_n "checking for main in -lnsl""... $ac_c" 1>&6
+echo "configure:4302: checking for main in -lnsl" >&5
+ac_lib_var=`echo nsl'_'main | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-lnsl $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 4310 "configure"
+#include "confdefs.h"
+
+int main() {
+main()
+; return 0; }
+EOF
+if { (eval echo configure:4317: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ gcj_cv_lib_sockets="$gcj_cv_lib_sockets -lnsl"
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+fi
+
+ unset ac_cv_func_gethostbyname
+ LIBS=$gcj_oldLIBS
+
+fi
+
+echo "$ac_t""$gcj_cv_lib_sockets" 1>&6
+ SYSTEMSPEC="$SYSTEMSPEC $gcj_cv_lib_sockets"
+
+ if test "$with_system_zlib" = yes; then
+ echo $ac_n "checking for deflate in -lz""... $ac_c" 1>&6
+echo "configure:4349: checking for deflate in -lz" >&5
+ac_lib_var=`echo z'_'deflate | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-lz $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 4357 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char deflate();
+
+int main() {
+deflate()
+; return 0; }
+EOF
+if { (eval echo configure:4368: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ZLIBSPEC=-lz
+else
+ echo "$ac_t""no" 1>&6
+ZLIBSPEC=-lzgcj
+fi
+
+ else
+ ZLIBSPEC=-lzgcj
+ fi
+
+ # On Solaris, and maybe other architectures, the Boehm collector
+ # requires -ldl.
+ if test "$GC" = boehm; then
+ echo $ac_n "checking for main in -ldl""... $ac_c" 1>&6
+echo "configure:4397: checking for main in -ldl" >&5
+ac_lib_var=`echo dl'_'main | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-ldl $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 4405 "configure"
+#include "confdefs.h"
+
+int main() {
+main()
+; return 0; }
+EOF
+if { (eval echo configure:4412: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ SYSTEMSPEC="$SYSTEMSPEC -ldl"
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ fi
+
+ if test -d "$libgcj_basedir/../gcc/java"; then
+ GCJ=
+ else
CANADIAN=yes
NULL_TARGET=yes
- }
+ GCJ=gcj
+ fi
+fi
+
+ZLIBS=
+ZDEPS=
+ZINCS=
+if test "x$ZLIBSPEC" = "x-lzgcj"; then
+ # We include the path to the zlib build directory.
+ # See Makefile.am to understand why.
+ ZDEPS='$(top_builddir)/../zlib/libzgcj.la'
+ ZLIBS="$ZDEPS -L\$(here)/../zlib/$libsubdir"
+ ZINCS='-I$(top_srcdir)/../zlib'
+else
+ ZLIBS="$ZLIBSPEC"
fi
+
+
+
if test "$CANADIAN" = yes; then
CANADIAN_TRUE=
CANADIAN_FALSE='#'
@@ -2844,24 +4484,50 @@ else
fi
+if test -z "$with_cross_host"; then
+ USE_LIBDIR_TRUE=
+ USE_LIBDIR_FALSE='#'
+else
+ USE_LIBDIR_TRUE='#'
+ USE_LIBDIR_FALSE=
+fi
+
+
+# Determine gcj version number.
+if test "$GCJ" = ""; then
+ if test -z "${with_multisubdir}"; then
+ builddotdot=.
+ else
+ builddotdot=`echo ${with_multisubdir} | sed -e 's:^/^/*:..:g'`
+ fi
+ dir="`cd ${builddotdot}/../../gcc && pwd`"
+ GCJ="$dir/gcj -B$dir/"
+fi
+
+gcjvers="`$GCJ -v 2>&1 | sed -n 's/^.*version \([^ ]*\).*$/\1/p'`"
+
+cat >> confdefs.h <<EOF
+#define GCJVERSION "$gcjvers"
+EOF
+
-for ac_hdr in unistd.h sys/time.h sys/types.h fcntl.h sys/ioctl.h sys/filio.h sys/stat.h sys/select.h sys/socket.h netinet/in.h arpa/inet.h netdb.h pwd.h
+for ac_hdr in unistd.h bstring.h sys/time.h sys/types.h fcntl.h sys/ioctl.h sys/filio.h sys/stat.h sys/select.h sys/socket.h netinet/in.h arpa/inet.h netdb.h pwd.h sys/config.h inttypes.h stdint.h
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:2855: checking for $ac_hdr" >&5
+echo "configure:4521: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 2860 "configure"
+#line 4526 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2865: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:4531: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -2891,17 +4557,17 @@ for ac_hdr in dirent.h
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:2895: checking for $ac_hdr" >&5
+echo "configure:4561: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 2900 "configure"
+#line 4566 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2905: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:4571: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -2929,16 +4595,16 @@ done
echo $ac_n "checking whether struct sockaddr_in6 is in netinet/in.h""... $ac_c" 1>&6
-echo "configure:2933: checking whether struct sockaddr_in6 is in netinet/in.h" >&5
+echo "configure:4599: checking whether struct sockaddr_in6 is in netinet/in.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 2935 "configure"
+#line 4601 "configure"
#include "confdefs.h"
#include <netinet/in.h>
int main() {
struct sockaddr_in6 addr6;
; return 0; }
EOF
-if { (eval echo configure:2942: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:4608: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
cat >> confdefs.h <<\EOF
#define HAVE_INET6 1
@@ -2954,16 +4620,16 @@ fi
rm -f conftest*
echo $ac_n "checking for socklen_t in sys/socket.h""... $ac_c" 1>&6
-echo "configure:2958: checking for socklen_t in sys/socket.h" >&5
+echo "configure:4624: checking for socklen_t in sys/socket.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 2960 "configure"
+#line 4626 "configure"
#include "confdefs.h"
#include <sys/socket.h>
int main() {
socklen_t x = 5;
; return 0; }
EOF
-if { (eval echo configure:2967: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:4633: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
cat >> confdefs.h <<\EOF
#define HAVE_SOCKLEN_T 1
@@ -2979,16 +4645,16 @@ fi
rm -f conftest*
echo $ac_n "checking for tm_gmtoff in struct tm""... $ac_c" 1>&6
-echo "configure:2983: checking for tm_gmtoff in struct tm" >&5
+echo "configure:4649: checking for tm_gmtoff in struct tm" >&5
cat > conftest.$ac_ext <<EOF
-#line 2985 "configure"
+#line 4651 "configure"
#include "confdefs.h"
#include <time.h>
int main() {
struct tm tim; tim.tm_gmtoff = 0;
; return 0; }
EOF
-if { (eval echo configure:2992: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:4658: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
cat >> confdefs.h <<\EOF
#define STRUCT_TM_HAS_GMTOFF 1
@@ -3001,16 +4667,16 @@ else
rm -rf conftest*
echo "$ac_t""no" 1>&6
echo $ac_n "checking for global timezone variable""... $ac_c" 1>&6
-echo "configure:3005: checking for global timezone variable" >&5
+echo "configure:4671: checking for global timezone variable" >&5
cat > conftest.$ac_ext <<EOF
-#line 3007 "configure"
+#line 4673 "configure"
#include "confdefs.h"
#include <time.h>
int main() {
long z2 = timezone;
; return 0; }
EOF
-if { (eval echo configure:3014: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:4680: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
cat >> confdefs.h <<\EOF
#define HAVE_TIMEZONE 1
@@ -3030,19 +4696,19 @@ rm -f conftest*
# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
# for constant arguments. Useless!
echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6
-echo "configure:3034: checking for working alloca.h" >&5
+echo "configure:4700: checking for working alloca.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 3039 "configure"
+#line 4705 "configure"
#include "confdefs.h"
#include <alloca.h>
int main() {
char *p = alloca(2 * sizeof(int));
; return 0; }
EOF
-if { (eval echo configure:3046: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4712: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
ac_cv_header_alloca_h=yes
else
@@ -3063,12 +4729,12 @@ EOF
fi
echo $ac_n "checking for alloca""... $ac_c" 1>&6
-echo "configure:3067: checking for alloca" >&5
+echo "configure:4733: checking for alloca" >&5
if eval "test \"`echo '$''{'ac_cv_func_alloca_works'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 3072 "configure"
+#line 4738 "configure"
#include "confdefs.h"
#ifdef __GNUC__
@@ -3096,7 +4762,7 @@ int main() {
char *p = (char *) alloca(1);
; return 0; }
EOF
-if { (eval echo configure:3100: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4766: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
ac_cv_func_alloca_works=yes
else
@@ -3128,12 +4794,12 @@ EOF
echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6
-echo "configure:3132: checking whether alloca needs Cray hooks" >&5
+echo "configure:4798: checking whether alloca needs Cray hooks" >&5
if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 3137 "configure"
+#line 4803 "configure"
#include "confdefs.h"
#if defined(CRAY) && ! defined(CRAY2)
webecray
@@ -3158,12 +4824,12 @@ echo "$ac_t""$ac_cv_os_cray" 1>&6
if test $ac_cv_os_cray = yes; then
for ac_func in _getb67 GETB67 getb67; do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:3162: checking for $ac_func" >&5
+echo "configure:4828: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 3167 "configure"
+#line 4833 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -3186,7 +4852,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:3190: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4856: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -3213,7 +4879,7 @@ done
fi
echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6
-echo "configure:3217: checking stack direction for C alloca" >&5
+echo "configure:4883: checking stack direction for C alloca" >&5
if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -3221,7 +4887,7 @@ else
ac_cv_c_stack_direction=0
else
cat > conftest.$ac_ext <<EOF
-#line 3225 "configure"
+#line 4891 "configure"
#include "confdefs.h"
find_stack_direction ()
{
@@ -3240,7 +4906,7 @@ main ()
exit (find_stack_direction() < 0);
}
EOF
-if { (eval echo configure:3244: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:4910: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
ac_cv_c_stack_direction=1
else
@@ -3262,12 +4928,62 @@ EOF
fi
+echo $ac_n "checking for g++ -g jboolean bug""... $ac_c" 1>&6
+echo "configure:4933: checking for g++ -g jboolean bug" >&5
+if eval "test \"`echo '$''{'libjava_cv_gxx_debug_jboolean_bug'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+
+ ac_ext=C
+# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cxx_cross
+
+ cat > conftest.$ac_ext <<EOF
+#line 4946 "configure"
+#include "confdefs.h"
+typedef __java_boolean jboolean;
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:4953: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ libjava_cv_gxx_debug_jboolean_bug=no
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ libjava_cv_gxx_debug_jboolean_bug=yes
+fi
+rm -f conftest*
+ ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+
+fi
+
+echo "$ac_t""$libjava_cv_gxx_debug_jboolean_bug" 1>&6
+if test "x$libjava_cv_gxx_debug_jboolean_bug" = xyes; then
+ JCFLAGS="$JCFLAGS -g0"
+
+else
+ JCFLAGS="$JCFLAGS -g"
+fi
+
+
for ac_prog in perl
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3271: checking for $ac_word" >&5
+echo "configure:4987: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_PERL'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -3298,6 +5014,20 @@ done
test -n "$PERL" || PERL="false"
+case "${host}" in
+ i?86-*-linux*)
+ SIGNAL_HANDLER=include/i386-signal.h
+ ;;
+ sparc-sun-solaris*)
+ SIGNAL_HANDLER=include/sparc-signal.h
+ ;;
+ *)
+ SIGNAL_HANDLER=include/default-signal.h
+ ;;
+esac
+
+
+
if test "${multilib}" = "yes"; then
multilib_arg="--enable-multilib"
else
@@ -3408,7 +5138,7 @@ done
ac_given_srcdir=$srcdir
ac_given_INSTALL="$INSTALL"
-trap 'rm -fr `echo "Makefile testsuite/Makefile include/config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
+trap 'rm -fr `echo "Makefile libgcj.spec testsuite/Makefile include/config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
EOF
cat >> $CONFIG_STATUS <<EOF
@@ -3479,29 +5209,45 @@ s%@EXEEXT@%$EXEEXT%g
s%@LIBGCJ_CFLAGS@%$LIBGCJ_CFLAGS%g
s%@LIBGCJ_CXXFLAGS@%$LIBGCJ_CXXFLAGS%g
s%@LIBGCJ_JAVAFLAGS@%$LIBGCJ_JAVAFLAGS%g
+s%@LD@%$LD%g
+s%@NM@%$NM%g
+s%@USE_SYMBOL_UNDERSCORE@%$USE_SYMBOL_UNDERSCORE%g
+s%@LN_S@%$LN_S%g
+s%@DLLTOOL@%$DLLTOOL%g
+s%@LIBTOOL@%$LIBTOOL%g
s%@COMPPATH@%$COMPPATH%g
s%@TESTSUBDIR_TRUE@%$TESTSUBDIR_TRUE%g
s%@TESTSUBDIR_FALSE@%$TESTSUBDIR_FALSE%g
s%@CPP@%$CPP%g
+s%@SYSTEMSPEC@%$SYSTEMSPEC%g
+s%@ZLIBSPEC@%$ZLIBSPEC%g
s%@GCLIBS@%$GCLIBS%g
s%@GCINCS@%$GCINCS%g
s%@GCDEPS@%$GCDEPS%g
s%@GCOBJS@%$GCOBJS%g
+s%@GCSPEC@%$GCSPEC%g
s%@THREADLIBS@%$THREADLIBS%g
s%@THREADINCS@%$THREADINCS%g
s%@THREADDEPS@%$THREADDEPS%g
s%@THREADOBJS@%$THREADOBJS%g
+s%@THREADSPEC@%$THREADSPEC%g
s%@USING_GCC_TRUE@%$USING_GCC_TRUE%g
s%@USING_GCC_FALSE@%$USING_GCC_FALSE%g
+s%@ZLIBS@%$ZLIBS%g
+s%@ZDEPS@%$ZDEPS%g
+s%@ZINCS@%$ZINCS%g
s%@CANADIAN_TRUE@%$CANADIAN_TRUE%g
s%@CANADIAN_FALSE@%$CANADIAN_FALSE%g
s%@NULL_TARGET_TRUE@%$NULL_TARGET_TRUE%g
s%@NULL_TARGET_FALSE@%$NULL_TARGET_FALSE%g
s%@NATIVE_TRUE@%$NATIVE_TRUE%g
s%@NATIVE_FALSE@%$NATIVE_FALSE%g
+s%@USE_LIBDIR_TRUE@%$USE_LIBDIR_TRUE%g
+s%@USE_LIBDIR_FALSE@%$USE_LIBDIR_FALSE%g
s%@EH_COMMON_INCLUDE@%$EH_COMMON_INCLUDE%g
s%@AM_RUNTESTFLAGS@%$AM_RUNTESTFLAGS%g
s%@ALLOCA@%$ALLOCA%g
+s%@JCFLAGS@%$JCFLAGS%g
s%@PERL@%$PERL%g
s%@here@%$here%g
@@ -3545,7 +5291,7 @@ EOF
cat >> $CONFIG_STATUS <<EOF
-CONFIG_FILES=\${CONFIG_FILES-"Makefile testsuite/Makefile"}
+CONFIG_FILES=\${CONFIG_FILES-"Makefile libgcj.spec testsuite/Makefile"}
EOF
cat >> $CONFIG_STATUS <<\EOF
for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
@@ -3714,8 +5460,8 @@ fi; done
EOF
cat >> $CONFIG_STATUS <<EOF
-ac_sources="java/io/$FILE_DESCRIPTOR include/$GCHDR include/$THREADH"
-ac_dests="java/io/natFileDescriptor.cc include/java-gc.h include/java-threads.h"
+ac_sources="java/io/$FILE_DESCRIPTOR java/lang/${PROCESS}Process.java java/lang/nat${PROCESS}Process.cc include/$GCHDR include/$THREADH $SIGNAL_HANDLER"
+ac_dests="java/io/natFileDescriptor.cc java/lang/ConcreteProcess.java java/lang/natConcreteProcess.cc include/java-gc.h include/java-threads.h include/java-signal.h"
EOF
cat >> $CONFIG_STATUS <<\EOF
@@ -3759,6 +5505,7 @@ done
EOF
cat >> $CONFIG_STATUS <<EOF
+libjava_cv_gxx_debug_jboolean_bug=$libjava_cv_gxx_debug_jboolean_bug
srcdir=${srcdir}
host=${host}
target=${target}
@@ -3772,6 +5519,17 @@ CXX="${CXX}"
EOF
cat >> $CONFIG_STATUS <<\EOF
test -z "$CONFIG_HEADERS" || echo timestamp > include/stamp-h
+case " $CONFIG_FILES " in " Makefile ")
+ if test "x$libjava_cv_gxx_debug_jboolean_bug" = xyes; then
+ rm -f Makefile.new
+ sed < Makefile > Makefile.new \
+ -e '/^CXXCOMPILE = / s/$/ -g0/' \
+ -e '/^LTCXXCOMPILE = / s/$/ -g0/'
+ mv Makefile.new Makefile ||
+ { rm -f Makefile && mv Makefile.new Makefile; }
+ fi
+ ;;
+ esac
if test -n "$CONFIG_FILES"; then
ac_file=Makefile . ${libgcj_basedir}/../config-ml.in
fi
diff --git a/libjava/configure.in b/libjava/configure.in
index 98083c9d6da..4d91d2c85c6 100644
--- a/libjava/configure.in
+++ b/libjava/configure.in
@@ -1,7 +1,7 @@
dnl Process this with autoconf to create configure
AC_INIT(java/lang/System.java)
-dnl Can't be done in LIBGCJ_CONFIGURE because that confuses automake.
+dnl Can't be done in LIBGCJ_CONFIGURE because that confuses automake.
AC_CONFIG_AUX_DIR(..)
AC_CANONICAL_SYSTEM
@@ -16,6 +16,8 @@ LIBGCJ_CONFIGURE(.)
AM_CONFIG_HEADER(include/config.h)
+AM_PROG_LIBTOOL
+
if test -z "$with_target_subdir" || test "$with_target_subdir" = "."; then
COMPPATH=.
else
@@ -53,15 +55,20 @@ TARGET_ECOS="$with_ecos"
case "$TARGET_ECOS" in
no)
FILE_DESCRIPTOR=natFileDescriptorPosix.cc
+ PROCESS=Posix
;;
*)
FILE_DESCRIPTOR=natFileDescriptorEcos.cc
+ PROCESS=Ecos
AC_DEFINE(ECOS)
;;
esac
-AC_EGREP_HEADER(__uint32_t, sys/types.h, AC_DEFINE(HAVE_INT32_DEFINED))
-AC_EGREP_HEADER(__uint32_t, sys/config.h, AC_DEFINE(HAVE_INT32_DEFINED))
+AC_EGREP_HEADER(uint32_t, stdint.h, AC_DEFINE(HAVE_INT32_DEFINED))
+AC_EGREP_HEADER(uint32_t, inttypes.h, AC_DEFINE(HAVE_INT32_DEFINED))
+AC_EGREP_HEADER(u_int32_t, sys/types.h, AC_DEFINE(HAVE_BSD_INT32_DEFINED))
+AC_EGREP_HEADER(u_int32_t, sys/config.h, AC_DEFINE(HAVE_BSD_INT32_DEFINED))
+
dnl These may not be defined in a non-ANS conformant embedded system.
dnl FIXME: Should these case a runtime exception in that case?
@@ -74,6 +81,22 @@ test -d java || mkdir java
test -d java/io || mkdir java/io
AC_LINK_FILES(java/io/$FILE_DESCRIPTOR, java/io/natFileDescriptor.cc)
+dnl Likewise for ConcreteProcess.java and natConcreteProcess.cc.
+test -d java/lang || mkdir java/lang
+AC_LINK_FILES(java/lang/${PROCESS}Process.java, java/lang/ConcreteProcess.java)
+AC_LINK_FILES(java/lang/nat${PROCESS}Process.cc, java/lang/natConcreteProcess.cc)
+
+SYSTEMSPEC=
+AC_SUBST(SYSTEMSPEC)
+
+AC_ARG_WITH(system-zlib,
+[ --with-system-zlib Use installed libz])
+ZLIBSPEC=
+AC_SUBST(ZLIBSPEC)
+
+dnl FIXME: this should be _libs on some hosts.
+libsubdir=.libs
+
dnl Allow the GC to be disabled. Can be useful when debugging.
AC_MSG_CHECKING([for garbage collector to use])
AC_ARG_ENABLE(java-gc,
@@ -86,23 +109,27 @@ GCLIBS=
GCINCS=
GCDEPS=
GCOBJS=
+GCSPEC=
case "$GC" in
boehm)
AC_MSG_RESULT(boehm)
- GCLIBS='-L$(top_builddir)/../boehm-gc -lgcjgc'
- GCDEPS='$(top_builddir)/../boehm-gc/libgcjgc.a'
+ GCDEPS='$(top_builddir)/../boehm-gc/libgcjgc.la'
+ # We include the path to the boehm-gc build directory.
+ # See Makefile.am to understand why.
+ GCLIBS="$GCDEPS -L\$(here)/../boehm-gc/$libsubdir"
GCINCS='-I$(top_srcdir)/../boehm-gc -I$(top_builddir)/../boehm-gc'
+ GCSPEC='-lgcjgc'
dnl We also want to pick up some cpp flags required when including
dnl boehm-config.h. Yuck.
GCINCS="$GCINCS `cat ../boehm-gc/boehm-cflags`"
- GCOBJS=boehm.o
+ GCOBJS=boehm.lo
GCHDR=boehm-gc.h
dnl The POSIX thread support needs to know this.
AC_DEFINE(HAVE_BOEHM_GC)
;;
no)
AC_MSG_RESULT(none)
- GCOBJS=nogc.o
+ GCOBJS=nogc.lo
GCHDR=no-gc.h
;;
*)
@@ -113,6 +140,7 @@ AC_SUBST(GCLIBS)
AC_SUBST(GCINCS)
AC_SUBST(GCDEPS)
AC_SUBST(GCOBJS)
+AC_SUBST(GCSPEC)
AC_LINK_FILES(include/$GCHDR, include/java-gc.h)
@@ -138,7 +166,9 @@ if test "$THREADS" = yes; then
THREADS=win32
;;
*-*-irix*)
- THREADS=irix
+ # FIXME: for now, choose POSIX, because we implement that.
+ # Later, choose irix threads.
+ THREADS=posix
;;
*-*-solaris*)
# FIXME: for now, choose POSIX, because we implement that.
@@ -180,10 +210,12 @@ THREADINCS=
THREADDEPS=
THREADOBJS=
THREADH=
+THREADSPEC=
case "$THREADS" in
posix)
THREADLIBS=-lpthread
- THREADOBJS=posix-threads.o
+ THREADSPEC=-lpthread
+ THREADOBJS=posix-threads.lo
THREADH=posix-threads.h
# MIT pthreads doesn't seem to have the mutexattr functions.
# But for now we don't check for it. We just assume you aren't
@@ -192,15 +224,18 @@ case "$THREADS" in
;;
qt)
- THREADLIBS='-L$(top_builddir)/../qthreads -lgcjcoop'
- THREADOBJS=quick-threads.o
+ THREADDEPS='$(top_builddir)/../qthreads/libgcjcoop.la'
+ # We include the path to the qthreads build directory.
+ # See Makefile.am to understand why.
+ THREADLIBS="$THREADDEPS -L\$(here)/../qthreads/$libsubdir"
+ THREADSPEC='-lgcjcoop'
+ THREADOBJS=quick-threads.lo
THREADINCS='-I$(top_srcdir)/../qthreads'
THREADH=quick-threads.h
- THREADDEPS='$(top_builddir)/../qthreads/libgcjcoop.a'
;;
none)
- THREADOBJS=no-threads.o
+ THREADOBJS=no-threads.lo
THREADH=no-threads.h
;;
esac
@@ -209,6 +244,7 @@ AC_SUBST(THREADLIBS)
AC_SUBST(THREADINCS)
AC_SUBST(THREADDEPS)
AC_SUBST(THREADOBJS)
+AC_SUBST(THREADSPEC)
AM_CONDITIONAL(USING_GCC, test "$GCC" = yes)
@@ -246,11 +282,16 @@ if test -n "${with_cross_host}"; then
dnl We also assume we are using gcc, which provides alloca.
AC_DEFINE(HAVE_ALLOCA)
+ ZLIBSPEC=-lgcj
+
# If Canadian cross, then don't pick up tools from the build
# directory.
if test "$build" != "$with_cross_host"; then
CANADIAN=yes
EH_COMMON_INCLUDE=
+ GCJ="${target_alias}/gcj"
+ else
+ GCJ=
fi
else
# Some POSIX thread systems don't have pthread_mutexattr_settype.
@@ -268,7 +309,48 @@ else
# We look for the one that returns `int'.
# Hopefully this check is robust enough.
AC_EGREP_HEADER(int.*gethostbyname_r, netdb.h, [
- AC_DEFINE(GETHOSTBYNAME_R_RETURNS_INT)])])
+ AC_DEFINE(GETHOSTBYNAME_R_RETURNS_INT)])
+
+ case " $GCINCS " in
+ *" -D_REENTRANT "*) ;;
+ *)
+ dnl On DU4.0, gethostbyname_r is only declared with -D_REENTRANT
+ AC_CACHE_CHECK([whether gethostbyname_r declaration requires -D_REENTRANT],
+ [libjava_cv_gethostbyname_r_needs_reentrant],
+ [ AC_LANG_SAVE
+ AC_LANG_CPLUSPLUS
+ AC_TRY_COMPILE([#include <netdb.h>],
+ [gethostbyname_r("", 0, 0);],
+ [libjava_cv_gethostbyname_r_needs_reentrant=no], [dnl
+ CPPFLAGS_SAVE="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS -D_REENTRANT"
+ AC_TRY_COMPILE([#include <netdb.h>], [gethostbyname_r("", 0, 0);],
+ [libjava_cv_gethostbyname_r_needs_reentrant=yes],
+ [libjava_cv_gethostbyname_r_needs_reentrant=fail])
+ CPPFLAGS="$CPPFLAGS_SAVE"
+ ])
+ AC_LANG_RESTORE
+ ])
+ if test "x$libjava_cv_gethostbyname_r_needs_reentrant" = xyes; then
+ AC_DEFINE(GETHOSTBYNAME_R_NEEDS_REENTRANT, 1, [Define if gethostbyname_r is only declared if _REENTRANT is defined])
+ fi
+ ;;
+ esac
+
+ AC_CACHE_CHECK([for struct hostent_data],
+ [libjava_cv_struct_hostent_data], [dnl
+ AC_TRY_COMPILE([
+#if GETHOSTBYNAME_R_NEEDS_REENTRANT && !defined(_REENTRANT)
+# define _REENTRANT 1
+#endif
+#include <netdb.h>], [struct hostent_data data;],
+ [libjava_cv_struct_hostent_data=yes],
+ [libjava_cv_struct_hostent_data=no])])
+ if test "x$libjava_cv_struct_hostent_data" = xyes; then
+ AC_DEFINE(HAVE_STRUCT_HOSTENT_DATA, 1,
+ [Define if struct hostent_data is defined in netdb.h])
+ fi
+ ])
AC_CHECK_FUNCS(gethostbyaddr_r, [
AC_DEFINE(HAVE_GETHOSTBYADDR_R)
@@ -287,6 +369,11 @@ else
save_LIBS="$LIBS"
LIBS="$LIBS $THREADLIBS"
AC_CHECK_FUNCS(pthread_mutexattr_settype pthread_mutexattr_setkind_np sched_yield)
+ # Look for sched_yield. Sometimes it is in the posix4 library.
+ AC_CHECK_FUNCS(sched_yield, , [
+ AC_CHECK_LIB(posix4, sched_yield, [
+ AC_DEFINE(HAVE_SCHED_YIELD)
+ THREADLIBS="$THREADLIBS -lposix4"])])
LIBS="$save_LIBS"
# We require a way to get the time.
@@ -296,12 +383,7 @@ else
AC_MSG_ERROR([no function found to get the time])
fi
- # We require memmove.
- memmove_found=no
- AC_CHECK_FUNCS(memmove, memmove_found=yes)
- if test "$memmove_found" = no; then
- AC_MSG_ERROR([memmove is required])
- fi
+ AC_CHECK_FUNCS(memmove)
# We require memcpy.
memcpy_found=no
@@ -310,24 +392,120 @@ else
AC_MSG_ERROR([memcpy is required])
fi
- test -d "$libgcj_basedir/../gcc/java" || {
+ # Some library-finding code we stole from Tcl.
+ #--------------------------------------------------------------------
+ # Check for the existence of the -lsocket and -lnsl libraries.
+ # The order here is important, so that they end up in the right
+ # order in the command line generated by make. Here are some
+ # special considerations:
+ # 1. Use "connect" and "accept" to check for -lsocket, and
+ # "gethostbyname" to check for -lnsl.
+ # 2. Use each function name only once: can't redo a check because
+ # autoconf caches the results of the last check and won't redo it.
+ # 3. Use -lnsl and -lsocket only if they supply procedures that
+ # aren't already present in the normal libraries. This is because
+ # IRIX 5.2 has libraries, but they aren't needed and they're
+ # bogus: they goof up name resolution if used.
+ # 4. On some SVR4 systems, can't use -lsocket without -lnsl too.
+ # To get around this problem, check for both libraries together
+ # if -lsocket doesn't work by itself.
+ #--------------------------------------------------------------------
+
+ AC_CACHE_CHECK([for socket libraries], gcj_cv_lib_sockets,
+ [gcj_cv_lib_sockets=
+ gcj_checkBoth=0
+ unset ac_cv_func_connect
+ AC_CHECK_FUNC(connect, gcj_checkSocket=0, gcj_checkSocket=1)
+ if test "$gcj_checkSocket" = 1; then
+ unset ac_cv_func_connect
+ AC_CHECK_LIB(socket, main, gcj_cv_lib_sockets="-lsocket",
+ gcj_checkBoth=1)
+ fi
+ if test "$gcj_checkBoth" = 1; then
+ gcj_oldLibs=$LIBS
+ LIBS="$LIBS -lsocket -lnsl"
+ unset ac_cv_func_accept
+ AC_CHECK_FUNC(accept,
+ [gcj_checkNsl=0
+ gcj_cv_lib_sockets="-lsocket -lnsl"])
+ unset ac_cv_func_accept
+ LIBS=$gcj_oldLibs
+ fi
+ unset ac_cv_func_gethostbyname
+ gcj_oldLibs=$LIBS
+ LIBS="$LIBS $gcj_cv_lib_sockets"
+ AC_CHECK_FUNC(gethostbyname, ,
+ [AC_CHECK_LIB(nsl, main,
+ [gcj_cv_lib_sockets="$gcj_cv_lib_sockets -lnsl"])])
+ unset ac_cv_func_gethostbyname
+ LIBS=$gcj_oldLIBS
+ ])
+ SYSTEMSPEC="$SYSTEMSPEC $gcj_cv_lib_sockets"
+
+ if test "$with_system_zlib" = yes; then
+ AC_CHECK_LIB(z, deflate, ZLIBSPEC=-lz, ZLIBSPEC=-lzgcj)
+ else
+ ZLIBSPEC=-lzgcj
+ fi
+
+ # On Solaris, and maybe other architectures, the Boehm collector
+ # requires -ldl.
+ if test "$GC" = boehm; then
+ AC_CHECK_LIB(dl, main, SYSTEMSPEC="$SYSTEMSPEC -ldl")
+ fi
+
+ if test -d "$libgcj_basedir/../gcc/java"; then
+ GCJ=
+ else
CANADIAN=yes
NULL_TARGET=yes
- }
+ GCJ=gcj
+ fi
fi
+ZLIBS=
+ZDEPS=
+ZINCS=
+if test "x$ZLIBSPEC" = "x-lzgcj"; then
+ # We include the path to the zlib build directory.
+ # See Makefile.am to understand why.
+ ZDEPS='$(top_builddir)/../zlib/libzgcj.la'
+ ZLIBS="$ZDEPS -L\$(here)/../zlib/$libsubdir"
+ ZINCS='-I$(top_srcdir)/../zlib'
+else
+ ZLIBS="$ZLIBSPEC"
+fi
+AC_SUBST(ZLIBS)
+AC_SUBST(ZDEPS)
+AC_SUBST(ZINCS)
+
AM_CONDITIONAL(CANADIAN, test "$CANADIAN" = yes)
AM_CONDITIONAL(NULL_TARGET, test "$NULL_TARGET" = yes)
AM_CONDITIONAL(NATIVE, test "$CANADIAN" = no || test "$NULL_TARGET" = yes)
-
+AM_CONDITIONAL(USE_LIBDIR, test -z "$with_cross_host")
AC_SUBST(EH_COMMON_INCLUDE)
+# Determine gcj version number.
+if test "$GCJ" = ""; then
+ if test -z "${with_multisubdir}"; then
+ builddotdot=.
+ else
+ builddotdot=`echo ${with_multisubdir} | sed -e 's:[^/][^/]*:..:g'`
+ fi
+ dir="`cd ${builddotdot}/../../gcc && pwd`"
+ GCJ="$dir/gcj -B$dir/"
+fi
+changequote(<<,>>)
+gcjvers="`$GCJ -v 2>&1 | sed -n 's/^.*version \([^ ]*\).*$/\1/p'`"
+changequote([,])
+AC_DEFINE_UNQUOTED(GCJVERSION, "$gcjvers")
+
AC_SUBST(AM_RUNTESTFLAGS)
dnl We check for sys/filio.h because Solaris 2.5 defines FIONREAD there.
dnl On that system, sys/ioctl.h will not include sys/filio.h unless
dnl BSD_COMP is defined; just including sys/filio.h is simpler.
-AC_CHECK_HEADERS(unistd.h sys/time.h sys/types.h fcntl.h sys/ioctl.h sys/filio.h sys/stat.h sys/select.h sys/socket.h netinet/in.h arpa/inet.h netdb.h pwd.h)
+AC_CHECK_HEADERS(unistd.h bstring.h sys/time.h sys/types.h fcntl.h sys/ioctl.h sys/filio.h sys/stat.h sys/select.h sys/socket.h netinet/in.h arpa/inet.h netdb.h pwd.h sys/config.h inttypes.h stdint.h)
dnl We avoid AC_HEADER_DIRENT since we really only care about dirent.h
dnl for now. If you change this, you also must update natFile.cc.
AC_CHECK_HEADERS(dirent.h)
@@ -360,8 +538,54 @@ AC_TRY_COMPILE([#include <time.h>], [struct tm tim; tim.tm_gmtoff = 0;],
AC_FUNC_ALLOCA
+dnl On Solaris/x86, gcc 2.95 ICEs on this testcase
+AC_CACHE_CHECK([for g++ -g jboolean bug], [libjava_cv_gxx_debug_jboolean_bug],
+[ AC_LANG_SAVE
+ AC_LANG_CPLUSPLUS
+ AC_TRY_COMPILE([typedef __java_boolean jboolean;], [],
+ [libjava_cv_gxx_debug_jboolean_bug=no],
+ [libjava_cv_gxx_debug_jboolean_bug=yes])
+ AC_LANG_RESTORE
+])
+if test "x$libjava_cv_gxx_debug_jboolean_bug" = xyes; then
+ JCFLAGS="$JCFLAGS -g0"
+ dnl Top-leve Makefile overrides CXXFLAGS, and AM_CXXFLAGS is before it,
+ dnl so we have to use this dirty hack
+ dnl Note that, even though this code is within an if statement, it is
+ dnl unconditionally added to config.status, so we have to test again.
+ AC_OUTPUT_COMMANDS([case " $CONFIG_FILES " in " Makefile ")
+ if test "x$libjava_cv_gxx_debug_jboolean_bug" = xyes; then
+ rm -f Makefile.new
+ sed < Makefile > Makefile.new \
+ -e '/^CXXCOMPILE = / s/$/ -g0/' \
+ -e '/^LTCXXCOMPILE = / s/$/ -g0/'
+ mv Makefile.new Makefile ||
+ { rm -f Makefile && mv Makefile.new Makefile; }
+ fi
+ ;;
+ esac],
+ [libjava_cv_gxx_debug_jboolean_bug=$libjava_cv_gxx_debug_jboolean_bug])
+else
+ JCFLAGS="$JCFLAGS -g"
+fi
+AC_SUBST(JCFLAGS)
+
AC_CHECK_PROGS(PERL, perl, false)
+case "${host}" in
+ i?86-*-linux*)
+ SIGNAL_HANDLER=include/i386-signal.h
+ ;;
+ sparc-sun-solaris*)
+ SIGNAL_HANDLER=include/sparc-signal.h
+ ;;
+ *)
+ SIGNAL_HANDLER=include/default-signal.h
+ ;;
+esac
+
+AC_LINK_FILES($SIGNAL_HANDLER, include/java-signal.h)
+
if test "${multilib}" = "yes"; then
multilib_arg="--enable-multilib"
else
@@ -371,7 +595,7 @@ fi
here=`pwd`
AC_SUBST(here)
-AC_OUTPUT(Makefile testsuite/Makefile,
+AC_OUTPUT(Makefile libgcj.spec testsuite/Makefile,
[if test -n "$CONFIG_FILES"; then
ac_file=Makefile . ${libgcj_basedir}/../config-ml.in
fi],
diff --git a/libjava/doc/cni.sgml b/libjava/doc/cni.sgml
index 02554319508..fac01db7512 100644
--- a/libjava/doc/cni.sgml
+++ b/libjava/doc/cni.sgml
@@ -369,6 +369,98 @@ to private C++ fields and methods, but other fields and methods
are mapped to public fields and methods.
</para>
</sect2>
+<sect2><title>Non-Java fields</title>
+<para>
+When you write a Java wrapper around an existing library, that library
+will often allocate and manage its own data structures. These are
+<quote>objects</quote> that are not Java <literal>Object</literal>s;
+instead they are usually C <literal>struct</literal> instances.
+Typically, you will write a Java class, and use native CNI methods
+which call functions in the C library. The problem is how to get
+from the Java wrapper object to the C <literal>struct</literal> instances.
+The obvious solution is to add a field to the Java object that
+points to the C structure. The problem is that there is no Java
+type that we can give to this field.</para>
+<para>The GCJ solution is to define a special dummy class
+<literal>gnu.gcj.RawData</literal>. This can be used as the type for fields,
+parameters, array elements, or local variables in Java code.
+It means that the field or variable is a pointer to a non-Java object.
+Nothing else is known about it, so it corresponds to a
+<literal>(void*)</literal> declaration is C or C++ code.</para>
+<para>
+The garbage collector will ignore a field that has type
+<literal>gnu.gcj.RawData</literal>. You are responsible for
+freeing the C data structure when you are done with it, and
+performing any necessary cleanups. In most cases, you should
+use a <literal>finalize</literal> method, and have it call
+the library's cleanup routine. Also, the C data structure
+should not contain a pointer back to the Java object, since
+the garbage collector will not know about the pointer.
+If you need to save a pointer to a Java object inside some
+non-Java data structure, you first need to <quote>pin</quote>
+or <quote>globalize</quote> the pointer; there is no CNI function
+to do this yet.
+(From the point of view of the
+implementation, a <literal>gnu.gcj.RawData</literal> value is
+the same as an integer that has the same size as a pointer.)</para>
+<para>
+Here is an example where we create a Java wrapper around C stdio:
+<programlisting>
+import gnu.gcj.RawData;
+
+public class StdioFile
+{
+ private RawData file;
+ public StdioFile (RawData file) { this.file = file; }
+ public StdioFile (String name, String mode)
+ throws FileNotFoundException
+ { init(name, mode); }
+ private native void init (String name, String mode)
+ throws FileNotFoundException;
+ public native int getc();
+ public native int close();
+ protected native void finalize();
+}
+</programlisting>
+This is the CNI implementation:
+<programlisting>
+jint
+StdioFile::getc()
+{
+ return getc((FILE*) file);
+}
+
+jint
+StdioFile::close()
+{
+ return fclose((FILE*) file);
+}
+
+void
+StdioFile::init(jstring name, jstring mode)
+{
+ int cname_len = JvGetStringUTFLength (name);
+ int cmode_len = JvGetStringUTFLength (mode);
+ char cname[cname_len + 1];
+ char cmode[cmode_len + 1];
+ JvGetStringUTFRegion (name, 0, name->length(), cname);
+ JvGetStringUTFRegion (mode, 0, mode->length(), cmode);
+ cname[cname_len] = '\0';
+ cmode[cmode_len] = '\0';
+ file = (gnu::gcj::RawData*) fopen(cname, cmode);
+ if (file == NULL)
+ JvThrow(new java::lang::FileNotFoundException(name));
+}
+
+void
+StdioFile::finalize()
+{
+ fclose((FILE*) file);
+}
+</programlisting>
+
+</sect2>
+
</sect1>
<sect1><title>Arrays</title>
diff --git a/libjava/gnu/gcj/RawData.java b/libjava/gnu/gcj/RawData.java
new file mode 100644
index 00000000000..9473fb05e5f
--- /dev/null
+++ b/libjava/gnu/gcj/RawData.java
@@ -0,0 +1,16 @@
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+package gnu.gcj;
+
+/** A type uses to indicate pointers to non-Java data. */
+
+public final class RawData
+{
+ private RawData() { }
+}
diff --git a/libjava/gnu/gcj/convert/BytesToUnicode.java b/libjava/gnu/gcj/convert/BytesToUnicode.java
index 21c1e7e6230..cfcb813c9cf 100644
--- a/libjava/gnu/gcj/convert/BytesToUnicode.java
+++ b/libjava/gnu/gcj/convert/BytesToUnicode.java
@@ -91,7 +91,7 @@ public abstract class BytesToUnicode
* bytes start at inbuffer[inpos], and end at inbuffer[inlength-1].
* @param outbuffer buffer for the converted character
* @param outpos position in buffer to start putting converted characters
- * @param outlength the maximum number of characters to read
+ * @param outlength the maximum number of characters to convert
* @return number of chars placed in outbuffer.
* Also, this.inpos is incremented by the number of bytes consumed.
*
diff --git a/libjava/gnu/gcj/convert/Input_8859_1.java b/libjava/gnu/gcj/convert/Input_8859_1.java
index 262099a13aa..e0d2d5100b4 100644
--- a/libjava/gnu/gcj/convert/Input_8859_1.java
+++ b/libjava/gnu/gcj/convert/Input_8859_1.java
@@ -8,6 +8,12 @@ details. */
package gnu.gcj.convert;
+/**
+ * Convert ISO-Latin-1 (8851-1) text to Unicode.
+ * @author Per Bothner <bothner@cygnus.com>
+ * @date Match 1999.
+ */
+
public class Input_8859_1 extends BytesToUnicode
{
public String getName() { return "8859_1"; }
diff --git a/libjava/gnu/gcj/convert/Input_EUCJIS.java b/libjava/gnu/gcj/convert/Input_EUCJIS.java
index ecc0fdb9bb8..1531442a40d 100644
--- a/libjava/gnu/gcj/convert/Input_EUCJIS.java
+++ b/libjava/gnu/gcj/convert/Input_EUCJIS.java
@@ -8,6 +8,12 @@ details. */
package gnu.gcj.convert;
+/**
+ * Convert EUCJIS (Extended Unix Code for Japan) to Unicode.
+ * @author Per Bothner <bothner@cygnus.com>
+ * @date April 1999.
+ */
+
public class Input_EUCJIS extends BytesToUnicode
{
public String getName() { return "EUCJIS"; }
diff --git a/libjava/gnu/gcj/convert/Input_JavaSrc.java b/libjava/gnu/gcj/convert/Input_JavaSrc.java
new file mode 100644
index 00000000000..fc2107a591b
--- /dev/null
+++ b/libjava/gnu/gcj/convert/Input_JavaSrc.java
@@ -0,0 +1,89 @@
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+package gnu.gcj.convert;
+
+/**
+ * Convert Ascii with \ u XXXX-escapes to Unicode.
+ * @author Per Bothner <bothner@cygnus.com>
+ * @date April 1999.
+ */
+
+public class Input_JavaSrc extends BytesToUnicode
+{
+ public String getName() { return "JavaSrc"; }
+
+ // 0: normal
+ // 1: seen '\\'
+ // 2: seen '\\' and 'u'
+ // 3: seen '\\' and need to emit value.
+ // 4, 5, 6, 7: seen '\\u', 'u' and (state-3) hex digits.
+ int state = 0;
+
+ int value;
+
+ public int read (char[] outbuffer, int outpos, int outlength)
+ {
+ int origpos = outpos;
+ for (;;)
+ {
+ if (inpos >= inlength)
+ break;
+ if (outpos >= outlength)
+ break;
+ char b = (char) (inbuffer[inpos++] & 0xFF);
+ switch (state)
+ {
+ case 0:
+ if (b == '\\')
+ {
+ state = 1;
+ continue;
+ }
+ break;
+ case 1:
+ if (b == 'u')
+ {
+ state = 2;
+ continue;
+ }
+ if (b != '\\')
+ {
+ value = b;
+ b = '\\';
+ state = 3;
+ }
+ break;
+ case 3:
+ b = (char) value;
+ break;
+ default: // case 4: case 5: case 6: case 7:
+ int digit = Character.digit(b, 16);
+ if (digit < 0)
+ {
+ b = '\uFFFD';
+ state = 0;
+ }
+ else
+ {
+ value = value * 16 + digit;
+ if (state < 7)
+ {
+ state++;
+ continue;
+ }
+ b = (char) value;
+ }
+ state = 0;
+ }
+ outbuffer[outpos++] = b;
+ }
+ return outpos - origpos;
+ }
+}
+
diff --git a/libjava/gnu/gcj/convert/Input_SJIS.java b/libjava/gnu/gcj/convert/Input_SJIS.java
new file mode 100644
index 00000000000..cdc7c4cb819
--- /dev/null
+++ b/libjava/gnu/gcj/convert/Input_SJIS.java
@@ -0,0 +1,24 @@
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+package gnu.gcj.convert;
+
+/**
+ * Convert SJIS (Shift JIS, used on Japanese MS-Windows) to Unicode.
+ * @author Per Bothner <bothner@cygnus.com>
+ * @date April 1999.
+ */
+
+public class Input_SJIS extends BytesToUnicode
+{
+ public String getName() { return "SJIS"; }
+
+ public native int read (char[] outbuffer, int outpos, int outlength);
+
+ int first_byte;
+}
diff --git a/libjava/gnu/gcj/convert/Input_UTF8.java b/libjava/gnu/gcj/convert/Input_UTF8.java
index c706a5259a7..0bb5c48a13e 100644
--- a/libjava/gnu/gcj/convert/Input_UTF8.java
+++ b/libjava/gnu/gcj/convert/Input_UTF8.java
@@ -8,6 +8,12 @@ details. */
package gnu.gcj.convert;
+/**
+ * Convert UTF8 to Unicode.
+ * @author Per Bothner <bothner@cygnus.com>
+ * @date Match 1999.
+ */
+
public class Input_UTF8 extends BytesToUnicode
{
public String getName() { return "UTF8"; }
@@ -84,12 +90,12 @@ public class Input_UTF8 extends BytesToUnicode
}
else // prefix byte
{
- if ((b & 0xE) == 0xC0)
+ if ((b & 0xE0) == 0xC0)
{
partial = b & 0x1F;
partial_bytes_expected = 1;
}
- else if ((b & 0xF) == 0xF0)
+ else if ((b & 0xF0) == 0xE0)
{
partial = b & 0xF;
partial_bytes_expected = 2;
diff --git a/libjava/gnu/gcj/convert/JIS0201.h b/libjava/gnu/gcj/convert/JIS0201.h
new file mode 100644
index 00000000000..3a3b4f1b85a
--- /dev/null
+++ b/libjava/gnu/gcj/convert/JIS0201.h
@@ -0,0 +1,159 @@
+/* This file is automatically generated from Unicode tables */
+MAP(0x00, 0x20, 0x0020) /* SPACE */
+MAP(0x00, 0x21, 0x0021) /* EXCLAMATION MARK */
+MAP(0x00, 0x22, 0x0022) /* QUOTATION MARK */
+MAP(0x00, 0x23, 0x0023) /* NUMBER SIGN */
+MAP(0x00, 0x24, 0x0024) /* DOLLAR SIGN */
+MAP(0x00, 0x25, 0x0025) /* PERCENT SIGN */
+MAP(0x00, 0x26, 0x0026) /* AMPERSAND */
+MAP(0x00, 0x27, 0x0027) /* APOSTROPHE */
+MAP(0x00, 0x28, 0x0028) /* LEFT PARENTHESIS */
+MAP(0x00, 0x29, 0x0029) /* RIGHT PARENTHESIS */
+MAP(0x00, 0x2A, 0x002A) /* ASTERISK */
+MAP(0x00, 0x2B, 0x002B) /* PLUS SIGN */
+MAP(0x00, 0x2C, 0x002C) /* COMMA */
+MAP(0x00, 0x2D, 0x002D) /* HYPHEN-MINUS */
+MAP(0x00, 0x2E, 0x002E) /* FULL STOP */
+MAP(0x00, 0x2F, 0x002F) /* SOLIDUS */
+MAP(0x00, 0x30, 0x0030) /* DIGIT ZERO */
+MAP(0x00, 0x31, 0x0031) /* DIGIT ONE */
+MAP(0x00, 0x32, 0x0032) /* DIGIT TWO */
+MAP(0x00, 0x33, 0x0033) /* DIGIT THREE */
+MAP(0x00, 0x34, 0x0034) /* DIGIT FOUR */
+MAP(0x00, 0x35, 0x0035) /* DIGIT FIVE */
+MAP(0x00, 0x36, 0x0036) /* DIGIT SIX */
+MAP(0x00, 0x37, 0x0037) /* DIGIT SEVEN */
+MAP(0x00, 0x38, 0x0038) /* DIGIT EIGHT */
+MAP(0x00, 0x39, 0x0039) /* DIGIT NINE */
+MAP(0x00, 0x3A, 0x003A) /* COLON */
+MAP(0x00, 0x3B, 0x003B) /* SEMICOLON */
+MAP(0x00, 0x3C, 0x003C) /* LESS-THAN SIGN */
+MAP(0x00, 0x3D, 0x003D) /* EQUALS SIGN */
+MAP(0x00, 0x3E, 0x003E) /* GREATER-THAN SIGN */
+MAP(0x00, 0x3F, 0x003F) /* QUESTION MARK */
+MAP(0x00, 0x40, 0x0040) /* COMMERCIAL AT */
+MAP(0x00, 0x41, 0x0041) /* LATIN CAPITAL LETTER A */
+MAP(0x00, 0x42, 0x0042) /* LATIN CAPITAL LETTER B */
+MAP(0x00, 0x43, 0x0043) /* LATIN CAPITAL LETTER C */
+MAP(0x00, 0x44, 0x0044) /* LATIN CAPITAL LETTER D */
+MAP(0x00, 0x45, 0x0045) /* LATIN CAPITAL LETTER E */
+MAP(0x00, 0x46, 0x0046) /* LATIN CAPITAL LETTER F */
+MAP(0x00, 0x47, 0x0047) /* LATIN CAPITAL LETTER G */
+MAP(0x00, 0x48, 0x0048) /* LATIN CAPITAL LETTER H */
+MAP(0x00, 0x49, 0x0049) /* LATIN CAPITAL LETTER I */
+MAP(0x00, 0x4A, 0x004A) /* LATIN CAPITAL LETTER J */
+MAP(0x00, 0x4B, 0x004B) /* LATIN CAPITAL LETTER K */
+MAP(0x00, 0x4C, 0x004C) /* LATIN CAPITAL LETTER L */
+MAP(0x00, 0x4D, 0x004D) /* LATIN CAPITAL LETTER M */
+MAP(0x00, 0x4E, 0x004E) /* LATIN CAPITAL LETTER N */
+MAP(0x00, 0x4F, 0x004F) /* LATIN CAPITAL LETTER O */
+MAP(0x00, 0x50, 0x0050) /* LATIN CAPITAL LETTER P */
+MAP(0x00, 0x51, 0x0051) /* LATIN CAPITAL LETTER Q */
+MAP(0x00, 0x52, 0x0052) /* LATIN CAPITAL LETTER R */
+MAP(0x00, 0x53, 0x0053) /* LATIN CAPITAL LETTER S */
+MAP(0x00, 0x54, 0x0054) /* LATIN CAPITAL LETTER T */
+MAP(0x00, 0x55, 0x0055) /* LATIN CAPITAL LETTER U */
+MAP(0x00, 0x56, 0x0056) /* LATIN CAPITAL LETTER V */
+MAP(0x00, 0x57, 0x0057) /* LATIN CAPITAL LETTER W */
+MAP(0x00, 0x58, 0x0058) /* LATIN CAPITAL LETTER X */
+MAP(0x00, 0x59, 0x0059) /* LATIN CAPITAL LETTER Y */
+MAP(0x00, 0x5A, 0x005A) /* LATIN CAPITAL LETTER Z */
+MAP(0x00, 0x5B, 0x005B) /* LEFT SQUARE BRACKET */
+MAP(0x00, 0x5C, 0x00A5) /* YEN SIGN */
+MAP(0x00, 0x5D, 0x005D) /* RIGHT SQUARE BRACKET */
+MAP(0x00, 0x5E, 0x005E) /* CIRCUMFLEX ACCENT */
+MAP(0x00, 0x5F, 0x005F) /* LOW LINE */
+MAP(0x00, 0x60, 0x0060) /* GRAVE ACCENT */
+MAP(0x00, 0x61, 0x0061) /* LATIN SMALL LETTER A */
+MAP(0x00, 0x62, 0x0062) /* LATIN SMALL LETTER B */
+MAP(0x00, 0x63, 0x0063) /* LATIN SMALL LETTER C */
+MAP(0x00, 0x64, 0x0064) /* LATIN SMALL LETTER D */
+MAP(0x00, 0x65, 0x0065) /* LATIN SMALL LETTER E */
+MAP(0x00, 0x66, 0x0066) /* LATIN SMALL LETTER F */
+MAP(0x00, 0x67, 0x0067) /* LATIN SMALL LETTER G */
+MAP(0x00, 0x68, 0x0068) /* LATIN SMALL LETTER H */
+MAP(0x00, 0x69, 0x0069) /* LATIN SMALL LETTER I */
+MAP(0x00, 0x6A, 0x006A) /* LATIN SMALL LETTER J */
+MAP(0x00, 0x6B, 0x006B) /* LATIN SMALL LETTER K */
+MAP(0x00, 0x6C, 0x006C) /* LATIN SMALL LETTER L */
+MAP(0x00, 0x6D, 0x006D) /* LATIN SMALL LETTER M */
+MAP(0x00, 0x6E, 0x006E) /* LATIN SMALL LETTER N */
+MAP(0x00, 0x6F, 0x006F) /* LATIN SMALL LETTER O */
+MAP(0x00, 0x70, 0x0070) /* LATIN SMALL LETTER P */
+MAP(0x00, 0x71, 0x0071) /* LATIN SMALL LETTER Q */
+MAP(0x00, 0x72, 0x0072) /* LATIN SMALL LETTER R */
+MAP(0x00, 0x73, 0x0073) /* LATIN SMALL LETTER S */
+MAP(0x00, 0x74, 0x0074) /* LATIN SMALL LETTER T */
+MAP(0x00, 0x75, 0x0075) /* LATIN SMALL LETTER U */
+MAP(0x00, 0x76, 0x0076) /* LATIN SMALL LETTER V */
+MAP(0x00, 0x77, 0x0077) /* LATIN SMALL LETTER W */
+MAP(0x00, 0x78, 0x0078) /* LATIN SMALL LETTER X */
+MAP(0x00, 0x79, 0x0079) /* LATIN SMALL LETTER Y */
+MAP(0x00, 0x7A, 0x007A) /* LATIN SMALL LETTER Z */
+MAP(0x00, 0x7B, 0x007B) /* LEFT CURLY BRACKET */
+MAP(0x00, 0x7C, 0x007C) /* VERTICAL LINE */
+MAP(0x00, 0x7D, 0x007D) /* RIGHT CURLY BRACKET */
+MAP(0x00, 0x7E, 0x203E) /* OVERLINE */
+MAP(0x00, 0xA1, 0xFF61) /* HALFWIDTH IDEOGRAPHIC FULL STOP */
+MAP(0x00, 0xA2, 0xFF62) /* HALFWIDTH LEFT CORNER BRACKET */
+MAP(0x00, 0xA3, 0xFF63) /* HALFWIDTH RIGHT CORNER BRACKET */
+MAP(0x00, 0xA4, 0xFF64) /* HALFWIDTH IDEOGRAPHIC COMMA */
+MAP(0x00, 0xA5, 0xFF65) /* HALFWIDTH KATAKANA MIDDLE DOT */
+MAP(0x00, 0xA6, 0xFF66) /* HALFWIDTH KATAKANA LETTER WO */
+MAP(0x00, 0xA7, 0xFF67) /* HALFWIDTH KATAKANA LETTER SMALL A */
+MAP(0x00, 0xA8, 0xFF68) /* HALFWIDTH KATAKANA LETTER SMALL I */
+MAP(0x00, 0xA9, 0xFF69) /* HALFWIDTH KATAKANA LETTER SMALL U */
+MAP(0x00, 0xAA, 0xFF6A) /* HALFWIDTH KATAKANA LETTER SMALL E */
+MAP(0x00, 0xAB, 0xFF6B) /* HALFWIDTH KATAKANA LETTER SMALL O */
+MAP(0x00, 0xAC, 0xFF6C) /* HALFWIDTH KATAKANA LETTER SMALL YA */
+MAP(0x00, 0xAD, 0xFF6D) /* HALFWIDTH KATAKANA LETTER SMALL YU */
+MAP(0x00, 0xAE, 0xFF6E) /* HALFWIDTH KATAKANA LETTER SMALL YO */
+MAP(0x00, 0xAF, 0xFF6F) /* HALFWIDTH KATAKANA LETTER SMALL TU */
+MAP(0x00, 0xB0, 0xFF70) /* HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK */
+MAP(0x00, 0xB1, 0xFF71) /* HALFWIDTH KATAKANA LETTER A */
+MAP(0x00, 0xB2, 0xFF72) /* HALFWIDTH KATAKANA LETTER I */
+MAP(0x00, 0xB3, 0xFF73) /* HALFWIDTH KATAKANA LETTER U */
+MAP(0x00, 0xB4, 0xFF74) /* HALFWIDTH KATAKANA LETTER E */
+MAP(0x00, 0xB5, 0xFF75) /* HALFWIDTH KATAKANA LETTER O */
+MAP(0x00, 0xB6, 0xFF76) /* HALFWIDTH KATAKANA LETTER KA */
+MAP(0x00, 0xB7, 0xFF77) /* HALFWIDTH KATAKANA LETTER KI */
+MAP(0x00, 0xB8, 0xFF78) /* HALFWIDTH KATAKANA LETTER KU */
+MAP(0x00, 0xB9, 0xFF79) /* HALFWIDTH KATAKANA LETTER KE */
+MAP(0x00, 0xBA, 0xFF7A) /* HALFWIDTH KATAKANA LETTER KO */
+MAP(0x00, 0xBB, 0xFF7B) /* HALFWIDTH KATAKANA LETTER SA */
+MAP(0x00, 0xBC, 0xFF7C) /* HALFWIDTH KATAKANA LETTER SI */
+MAP(0x00, 0xBD, 0xFF7D) /* HALFWIDTH KATAKANA LETTER SU */
+MAP(0x00, 0xBE, 0xFF7E) /* HALFWIDTH KATAKANA LETTER SE */
+MAP(0x00, 0xBF, 0xFF7F) /* HALFWIDTH KATAKANA LETTER SO */
+MAP(0x00, 0xC0, 0xFF80) /* HALFWIDTH KATAKANA LETTER TA */
+MAP(0x00, 0xC1, 0xFF81) /* HALFWIDTH KATAKANA LETTER TI */
+MAP(0x00, 0xC2, 0xFF82) /* HALFWIDTH KATAKANA LETTER TU */
+MAP(0x00, 0xC3, 0xFF83) /* HALFWIDTH KATAKANA LETTER TE */
+MAP(0x00, 0xC4, 0xFF84) /* HALFWIDTH KATAKANA LETTER TO */
+MAP(0x00, 0xC5, 0xFF85) /* HALFWIDTH KATAKANA LETTER NA */
+MAP(0x00, 0xC6, 0xFF86) /* HALFWIDTH KATAKANA LETTER NI */
+MAP(0x00, 0xC7, 0xFF87) /* HALFWIDTH KATAKANA LETTER NU */
+MAP(0x00, 0xC8, 0xFF88) /* HALFWIDTH KATAKANA LETTER NE */
+MAP(0x00, 0xC9, 0xFF89) /* HALFWIDTH KATAKANA LETTER NO */
+MAP(0x00, 0xCA, 0xFF8A) /* HALFWIDTH KATAKANA LETTER HA */
+MAP(0x00, 0xCB, 0xFF8B) /* HALFWIDTH KATAKANA LETTER HI */
+MAP(0x00, 0xCC, 0xFF8C) /* HALFWIDTH KATAKANA LETTER HU */
+MAP(0x00, 0xCD, 0xFF8D) /* HALFWIDTH KATAKANA LETTER HE */
+MAP(0x00, 0xCE, 0xFF8E) /* HALFWIDTH KATAKANA LETTER HO */
+MAP(0x00, 0xCF, 0xFF8F) /* HALFWIDTH KATAKANA LETTER MA */
+MAP(0x00, 0xD0, 0xFF90) /* HALFWIDTH KATAKANA LETTER MI */
+MAP(0x00, 0xD1, 0xFF91) /* HALFWIDTH KATAKANA LETTER MU */
+MAP(0x00, 0xD2, 0xFF92) /* HALFWIDTH KATAKANA LETTER ME */
+MAP(0x00, 0xD3, 0xFF93) /* HALFWIDTH KATAKANA LETTER MO */
+MAP(0x00, 0xD4, 0xFF94) /* HALFWIDTH KATAKANA LETTER YA */
+MAP(0x00, 0xD5, 0xFF95) /* HALFWIDTH KATAKANA LETTER YU */
+MAP(0x00, 0xD6, 0xFF96) /* HALFWIDTH KATAKANA LETTER YO */
+MAP(0x00, 0xD7, 0xFF97) /* HALFWIDTH KATAKANA LETTER RA */
+MAP(0x00, 0xD8, 0xFF98) /* HALFWIDTH KATAKANA LETTER RI */
+MAP(0x00, 0xD9, 0xFF99) /* HALFWIDTH KATAKANA LETTER RU */
+MAP(0x00, 0xDA, 0xFF9A) /* HALFWIDTH KATAKANA LETTER RE */
+MAP(0x00, 0xDB, 0xFF9B) /* HALFWIDTH KATAKANA LETTER RO */
+MAP(0x00, 0xDC, 0xFF9C) /* HALFWIDTH KATAKANA LETTER WA */
+MAP(0x00, 0xDD, 0xFF9D) /* HALFWIDTH KATAKANA LETTER N */
+MAP(0x00, 0xDE, 0xFF9E) /* HALFWIDTH KATAKANA VOICED SOUND MARK */
+MAP(0x00, 0xDF, 0xFF9F) /* HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK */
diff --git a/libjava/gnu/gcj/convert/JIS0208.h b/libjava/gnu/gcj/convert/JIS0208.h
index 204348f8d77..d0406fa7f4c 100644
--- a/libjava/gnu/gcj/convert/JIS0208.h
+++ b/libjava/gnu/gcj/convert/JIS0208.h
@@ -1,6880 +1,6880 @@
-/* This file is autoamtically generated from Unicode tables */
-MAP(0x21, 0x21, 0x3000) /* IDEOGRAPHIC SPAC */
-MAP(0x21, 0x22, 0x3001) /* IDEOGRAPHIC COMM */
-MAP(0x21, 0x23, 0x3002) /* IDEOGRAPHIC FULL STO */
-MAP(0x21, 0x24, 0xFF0C) /* FULLWIDTH COMM */
-MAP(0x21, 0x25, 0xFF0E) /* FULLWIDTH FULL STO */
-MAP(0x21, 0x26, 0x30FB) /* KATAKANA MIDDLE DO */
-MAP(0x21, 0x27, 0xFF1A) /* FULLWIDTH COLO */
-MAP(0x21, 0x28, 0xFF1B) /* FULLWIDTH SEMICOLO */
-MAP(0x21, 0x29, 0xFF1F) /* FULLWIDTH QUESTION MAR */
-MAP(0x21, 0x2A, 0xFF01) /* FULLWIDTH EXCLAMATION MAR */
-MAP(0x21, 0x2B, 0x309B) /* KATAKANA-HIRAGANA VOICED SOUND MAR */
-MAP(0x21, 0x2C, 0x309C) /* KATAKANA-HIRAGANA SEMI-VOICED SOUND MAR */
-MAP(0x21, 0x2D, 0x00B4) /* ACUTE ACCEN */
-MAP(0x21, 0x2E, 0xFF40) /* FULLWIDTH GRAVE ACCEN */
-MAP(0x21, 0x2F, 0x00A8) /* DIAERESI */
-MAP(0x21, 0x30, 0xFF3E) /* FULLWIDTH CIRCUMFLEX ACCEN */
-MAP(0x21, 0x31, 0xFFE3) /* FULLWIDTH MACRO */
-MAP(0x21, 0x32, 0xFF3F) /* FULLWIDTH LOW LIN */
-MAP(0x21, 0x33, 0x30FD) /* KATAKANA ITERATION MAR */
-MAP(0x21, 0x34, 0x30FE) /* KATAKANA VOICED ITERATION MAR */
-MAP(0x21, 0x35, 0x309D) /* HIRAGANA ITERATION MAR */
-MAP(0x21, 0x36, 0x309E) /* HIRAGANA VOICED ITERATION MAR */
-MAP(0x21, 0x37, 0x3003) /* DITTO MAR */
-MAP(0x21, 0x38, 0x4EDD) /* <CJK */
-MAP(0x21, 0x39, 0x3005) /* IDEOGRAPHIC ITERATION MAR */
-MAP(0x21, 0x3A, 0x3006) /* IDEOGRAPHIC CLOSING MAR */
-MAP(0x21, 0x3B, 0x3007) /* IDEOGRAPHIC NUMBER ZER */
-MAP(0x21, 0x3C, 0x30FC) /* KATAKANA-HIRAGANA PROLONGED SOUND MAR */
-MAP(0x21, 0x3D, 0x2015) /* HORIZONTAL BA */
-MAP(0x21, 0x3E, 0x2010) /* HYPHE */
-MAP(0x21, 0x3F, 0xFF0F) /* FULLWIDTH SOLIDU */
-MAP(0x21, 0x40, 0x005C) /* REVERSE SOLIDU */
-MAP(0x21, 0x41, 0x301C) /* WAVE DAS */
-MAP(0x21, 0x42, 0x2016) /* DOUBLE VERTICAL LIN */
-MAP(0x21, 0x43, 0xFF5C) /* FULLWIDTH VERTICAL LIN */
-MAP(0x21, 0x44, 0x2026) /* HORIZONTAL ELLIPSI */
-MAP(0x21, 0x45, 0x2025) /* TWO DOT LEADE */
-MAP(0x21, 0x46, 0x2018) /* LEFT SINGLE QUOTATION MAR */
-MAP(0x21, 0x47, 0x2019) /* RIGHT SINGLE QUOTATION MAR */
-MAP(0x21, 0x48, 0x201C) /* LEFT DOUBLE QUOTATION MAR */
-MAP(0x21, 0x49, 0x201D) /* RIGHT DOUBLE QUOTATION MAR */
-MAP(0x21, 0x4A, 0xFF08) /* FULLWIDTH LEFT PARENTHESI */
-MAP(0x21, 0x4B, 0xFF09) /* FULLWIDTH RIGHT PARENTHESI */
-MAP(0x21, 0x4C, 0x3014) /* LEFT TORTOISE SHELL BRACKE */
-MAP(0x21, 0x4D, 0x3015) /* RIGHT TORTOISE SHELL BRACKE */
-MAP(0x21, 0x4E, 0xFF3B) /* FULLWIDTH LEFT SQUARE BRACKE */
-MAP(0x21, 0x4F, 0xFF3D) /* FULLWIDTH RIGHT SQUARE BRACKE */
-MAP(0x21, 0x50, 0xFF5B) /* FULLWIDTH LEFT CURLY BRACKE */
-MAP(0x21, 0x51, 0xFF5D) /* FULLWIDTH RIGHT CURLY BRACKE */
-MAP(0x21, 0x52, 0x3008) /* LEFT ANGLE BRACKE */
-MAP(0x21, 0x53, 0x3009) /* RIGHT ANGLE BRACKE */
-MAP(0x21, 0x54, 0x300A) /* LEFT DOUBLE ANGLE BRACKE */
-MAP(0x21, 0x55, 0x300B) /* RIGHT DOUBLE ANGLE BRACKE */
-MAP(0x21, 0x56, 0x300C) /* LEFT CORNER BRACKE */
-MAP(0x21, 0x57, 0x300D) /* RIGHT CORNER BRACKE */
-MAP(0x21, 0x58, 0x300E) /* LEFT WHITE CORNER BRACKE */
-MAP(0x21, 0x59, 0x300F) /* RIGHT WHITE CORNER BRACKE */
-MAP(0x21, 0x5A, 0x3010) /* LEFT BLACK LENTICULAR BRACKE */
-MAP(0x21, 0x5B, 0x3011) /* RIGHT BLACK LENTICULAR BRACKE */
-MAP(0x21, 0x5C, 0xFF0B) /* FULLWIDTH PLUS SIG */
-MAP(0x21, 0x5D, 0x2212) /* MINUS SIG */
-MAP(0x21, 0x5E, 0x00B1) /* PLUS-MINUS SIG */
-MAP(0x21, 0x5F, 0x00D7) /* MULTIPLICATION SIG */
-MAP(0x21, 0x60, 0x00F7) /* DIVISION SIG */
-MAP(0x21, 0x61, 0xFF1D) /* FULLWIDTH EQUALS SIG */
-MAP(0x21, 0x62, 0x2260) /* NOT EQUAL T */
-MAP(0x21, 0x63, 0xFF1C) /* FULLWIDTH LESS-THAN SIG */
-MAP(0x21, 0x64, 0xFF1E) /* FULLWIDTH GREATER-THAN SIG */
-MAP(0x21, 0x65, 0x2266) /* LESS-THAN OVER EQUAL T */
-MAP(0x21, 0x66, 0x2267) /* GREATER-THAN OVER EQUAL T */
-MAP(0x21, 0x67, 0x221E) /* INFINIT */
-MAP(0x21, 0x68, 0x2234) /* THEREFOR */
-MAP(0x21, 0x69, 0x2642) /* MALE SIG */
-MAP(0x21, 0x6A, 0x2640) /* FEMALE SIG */
-MAP(0x21, 0x6B, 0x00B0) /* DEGREE SIG */
-MAP(0x21, 0x6C, 0x2032) /* PRIM */
-MAP(0x21, 0x6D, 0x2033) /* DOUBLE PRIM */
-MAP(0x21, 0x6E, 0x2103) /* DEGREE CELSIU */
-MAP(0x21, 0x6F, 0xFFE5) /* FULLWIDTH YEN SIG */
-MAP(0x21, 0x70, 0xFF04) /* FULLWIDTH DOLLAR SIG */
-MAP(0x21, 0x71, 0x00A2) /* CENT SIG */
-MAP(0x21, 0x72, 0x00A3) /* POUND SIG */
-MAP(0x21, 0x73, 0xFF05) /* FULLWIDTH PERCENT SIG */
-MAP(0x21, 0x74, 0xFF03) /* FULLWIDTH NUMBER SIG */
-MAP(0x21, 0x75, 0xFF06) /* FULLWIDTH AMPERSAN */
-MAP(0x21, 0x76, 0xFF0A) /* FULLWIDTH ASTERIS */
-MAP(0x21, 0x77, 0xFF20) /* FULLWIDTH COMMERCIAL A */
-MAP(0x21, 0x78, 0x00A7) /* SECTION SIG */
-MAP(0x21, 0x79, 0x2606) /* WHITE STA */
-MAP(0x21, 0x7A, 0x2605) /* BLACK STA */
-MAP(0x21, 0x7B, 0x25CB) /* WHITE CIRCL */
-MAP(0x21, 0x7C, 0x25CF) /* BLACK CIRCL */
-MAP(0x21, 0x7D, 0x25CE) /* BULLSEY */
-MAP(0x21, 0x7E, 0x25C7) /* WHITE DIAMON */
-MAP(0x22, 0x21, 0x25C6) /* BLACK DIAMON */
-MAP(0x22, 0x22, 0x25A1) /* WHITE SQUAR */
-MAP(0x22, 0x23, 0x25A0) /* BLACK SQUAR */
-MAP(0x22, 0x24, 0x25B3) /* WHITE UP-POINTING TRIANGL */
-MAP(0x22, 0x25, 0x25B2) /* BLACK UP-POINTING TRIANGL */
-MAP(0x22, 0x26, 0x25BD) /* WHITE DOWN-POINTING TRIANGL */
-MAP(0x22, 0x27, 0x25BC) /* BLACK DOWN-POINTING TRIANGL */
-MAP(0x22, 0x28, 0x203B) /* REFERENCE MAR */
-MAP(0x22, 0x29, 0x3012) /* POSTAL MAR */
-MAP(0x22, 0x2A, 0x2192) /* RIGHTWARDS ARRO */
-MAP(0x22, 0x2B, 0x2190) /* LEFTWARDS ARRO */
-MAP(0x22, 0x2C, 0x2191) /* UPWARDS ARRO */
-MAP(0x22, 0x2D, 0x2193) /* DOWNWARDS ARRO */
-MAP(0x22, 0x2E, 0x3013) /* GETA MAR */
-MAP(0x22, 0x3A, 0x2208) /* ELEMENT O */
-MAP(0x22, 0x3B, 0x220B) /* CONTAINS AS MEMBE */
-MAP(0x22, 0x3C, 0x2286) /* SUBSET OF OR EQUAL T */
-MAP(0x22, 0x3D, 0x2287) /* SUPERSET OF OR EQUAL T */
-MAP(0x22, 0x3E, 0x2282) /* SUBSET O */
-MAP(0x22, 0x3F, 0x2283) /* SUPERSET O */
-MAP(0x22, 0x40, 0x222A) /* UNIO */
-MAP(0x22, 0x41, 0x2229) /* INTERSECTIO */
-MAP(0x22, 0x4A, 0x2227) /* LOGICAL AN */
-MAP(0x22, 0x4B, 0x2228) /* LOGICAL O */
-MAP(0x22, 0x4C, 0x00AC) /* NOT SIG */
-MAP(0x22, 0x4D, 0x21D2) /* RIGHTWARDS DOUBLE ARRO */
-MAP(0x22, 0x4E, 0x21D4) /* LEFT RIGHT DOUBLE ARRO */
-MAP(0x22, 0x4F, 0x2200) /* FOR AL */
-MAP(0x22, 0x50, 0x2203) /* THERE EXIST */
-MAP(0x22, 0x5C, 0x2220) /* ANGL */
-MAP(0x22, 0x5D, 0x22A5) /* UP TAC */
-MAP(0x22, 0x5E, 0x2312) /* AR */
-MAP(0x22, 0x5F, 0x2202) /* PARTIAL DIFFERENTIA */
-MAP(0x22, 0x60, 0x2207) /* NABL */
-MAP(0x22, 0x61, 0x2261) /* IDENTICAL T */
-MAP(0x22, 0x62, 0x2252) /* APPROXIMATELY EQUAL TO OR THE IMAGE O */
-MAP(0x22, 0x63, 0x226A) /* MUCH LESS-THA */
-MAP(0x22, 0x64, 0x226B) /* MUCH GREATER-THA */
-MAP(0x22, 0x65, 0x221A) /* SQUARE ROO */
-MAP(0x22, 0x66, 0x223D) /* REVERSED TILD */
-MAP(0x22, 0x67, 0x221D) /* PROPORTIONAL T */
-MAP(0x22, 0x68, 0x2235) /* BECAUS */
-MAP(0x22, 0x69, 0x222B) /* INTEGRA */
-MAP(0x22, 0x6A, 0x222C) /* DOUBLE INTEGRA */
-MAP(0x22, 0x72, 0x212B) /* ANGSTROM SIG */
-MAP(0x22, 0x73, 0x2030) /* PER MILLE SIG */
-MAP(0x22, 0x74, 0x266F) /* MUSIC SHARP SIG */
-MAP(0x22, 0x75, 0x266D) /* MUSIC FLAT SIG */
-MAP(0x22, 0x76, 0x266A) /* EIGHTH NOT */
-MAP(0x22, 0x77, 0x2020) /* DAGGE */
-MAP(0x22, 0x78, 0x2021) /* DOUBLE DAGGE */
-MAP(0x22, 0x79, 0x00B6) /* PILCROW SIG */
-MAP(0x22, 0x7E, 0x25EF) /* LARGE CIRCL */
-MAP(0x23, 0x30, 0xFF10) /* FULLWIDTH DIGIT ZER */
-MAP(0x23, 0x31, 0xFF11) /* FULLWIDTH DIGIT ON */
-MAP(0x23, 0x32, 0xFF12) /* FULLWIDTH DIGIT TW */
-MAP(0x23, 0x33, 0xFF13) /* FULLWIDTH DIGIT THRE */
-MAP(0x23, 0x34, 0xFF14) /* FULLWIDTH DIGIT FOU */
-MAP(0x23, 0x35, 0xFF15) /* FULLWIDTH DIGIT FIV */
-MAP(0x23, 0x36, 0xFF16) /* FULLWIDTH DIGIT SI */
-MAP(0x23, 0x37, 0xFF17) /* FULLWIDTH DIGIT SEVE */
-MAP(0x23, 0x38, 0xFF18) /* FULLWIDTH DIGIT EIGH */
-MAP(0x23, 0x39, 0xFF19) /* FULLWIDTH DIGIT NIN */
-MAP(0x23, 0x41, 0xFF21) /* FULLWIDTH LATIN CAPITAL LETTER */
-MAP(0x23, 0x42, 0xFF22) /* FULLWIDTH LATIN CAPITAL LETTER */
-MAP(0x23, 0x43, 0xFF23) /* FULLWIDTH LATIN CAPITAL LETTER */
-MAP(0x23, 0x44, 0xFF24) /* FULLWIDTH LATIN CAPITAL LETTER */
-MAP(0x23, 0x45, 0xFF25) /* FULLWIDTH LATIN CAPITAL LETTER */
-MAP(0x23, 0x46, 0xFF26) /* FULLWIDTH LATIN CAPITAL LETTER */
-MAP(0x23, 0x47, 0xFF27) /* FULLWIDTH LATIN CAPITAL LETTER */
-MAP(0x23, 0x48, 0xFF28) /* FULLWIDTH LATIN CAPITAL LETTER */
-MAP(0x23, 0x49, 0xFF29) /* FULLWIDTH LATIN CAPITAL LETTER */
-MAP(0x23, 0x4A, 0xFF2A) /* FULLWIDTH LATIN CAPITAL LETTER */
-MAP(0x23, 0x4B, 0xFF2B) /* FULLWIDTH LATIN CAPITAL LETTER */
-MAP(0x23, 0x4C, 0xFF2C) /* FULLWIDTH LATIN CAPITAL LETTER */
-MAP(0x23, 0x4D, 0xFF2D) /* FULLWIDTH LATIN CAPITAL LETTER */
-MAP(0x23, 0x4E, 0xFF2E) /* FULLWIDTH LATIN CAPITAL LETTER */
-MAP(0x23, 0x4F, 0xFF2F) /* FULLWIDTH LATIN CAPITAL LETTER */
-MAP(0x23, 0x50, 0xFF30) /* FULLWIDTH LATIN CAPITAL LETTER */
-MAP(0x23, 0x51, 0xFF31) /* FULLWIDTH LATIN CAPITAL LETTER */
-MAP(0x23, 0x52, 0xFF32) /* FULLWIDTH LATIN CAPITAL LETTER */
-MAP(0x23, 0x53, 0xFF33) /* FULLWIDTH LATIN CAPITAL LETTER */
-MAP(0x23, 0x54, 0xFF34) /* FULLWIDTH LATIN CAPITAL LETTER */
-MAP(0x23, 0x55, 0xFF35) /* FULLWIDTH LATIN CAPITAL LETTER */
-MAP(0x23, 0x56, 0xFF36) /* FULLWIDTH LATIN CAPITAL LETTER */
-MAP(0x23, 0x57, 0xFF37) /* FULLWIDTH LATIN CAPITAL LETTER */
-MAP(0x23, 0x58, 0xFF38) /* FULLWIDTH LATIN CAPITAL LETTER */
-MAP(0x23, 0x59, 0xFF39) /* FULLWIDTH LATIN CAPITAL LETTER */
-MAP(0x23, 0x5A, 0xFF3A) /* FULLWIDTH LATIN CAPITAL LETTER */
-MAP(0x23, 0x61, 0xFF41) /* FULLWIDTH LATIN SMALL LETTER */
-MAP(0x23, 0x62, 0xFF42) /* FULLWIDTH LATIN SMALL LETTER */
-MAP(0x23, 0x63, 0xFF43) /* FULLWIDTH LATIN SMALL LETTER */
-MAP(0x23, 0x64, 0xFF44) /* FULLWIDTH LATIN SMALL LETTER */
-MAP(0x23, 0x65, 0xFF45) /* FULLWIDTH LATIN SMALL LETTER */
-MAP(0x23, 0x66, 0xFF46) /* FULLWIDTH LATIN SMALL LETTER */
-MAP(0x23, 0x67, 0xFF47) /* FULLWIDTH LATIN SMALL LETTER */
-MAP(0x23, 0x68, 0xFF48) /* FULLWIDTH LATIN SMALL LETTER */
-MAP(0x23, 0x69, 0xFF49) /* FULLWIDTH LATIN SMALL LETTER */
-MAP(0x23, 0x6A, 0xFF4A) /* FULLWIDTH LATIN SMALL LETTER */
-MAP(0x23, 0x6B, 0xFF4B) /* FULLWIDTH LATIN SMALL LETTER */
-MAP(0x23, 0x6C, 0xFF4C) /* FULLWIDTH LATIN SMALL LETTER */
-MAP(0x23, 0x6D, 0xFF4D) /* FULLWIDTH LATIN SMALL LETTER */
-MAP(0x23, 0x6E, 0xFF4E) /* FULLWIDTH LATIN SMALL LETTER */
-MAP(0x23, 0x6F, 0xFF4F) /* FULLWIDTH LATIN SMALL LETTER */
-MAP(0x23, 0x70, 0xFF50) /* FULLWIDTH LATIN SMALL LETTER */
-MAP(0x23, 0x71, 0xFF51) /* FULLWIDTH LATIN SMALL LETTER */
-MAP(0x23, 0x72, 0xFF52) /* FULLWIDTH LATIN SMALL LETTER */
-MAP(0x23, 0x73, 0xFF53) /* FULLWIDTH LATIN SMALL LETTER */
-MAP(0x23, 0x74, 0xFF54) /* FULLWIDTH LATIN SMALL LETTER */
-MAP(0x23, 0x75, 0xFF55) /* FULLWIDTH LATIN SMALL LETTER */
-MAP(0x23, 0x76, 0xFF56) /* FULLWIDTH LATIN SMALL LETTER */
-MAP(0x23, 0x77, 0xFF57) /* FULLWIDTH LATIN SMALL LETTER */
-MAP(0x23, 0x78, 0xFF58) /* FULLWIDTH LATIN SMALL LETTER */
-MAP(0x23, 0x79, 0xFF59) /* FULLWIDTH LATIN SMALL LETTER */
-MAP(0x23, 0x7A, 0xFF5A) /* FULLWIDTH LATIN SMALL LETTER */
-MAP(0x24, 0x21, 0x3041) /* HIRAGANA LETTER SMALL */
-MAP(0x24, 0x22, 0x3042) /* HIRAGANA LETTER */
-MAP(0x24, 0x23, 0x3043) /* HIRAGANA LETTER SMALL */
-MAP(0x24, 0x24, 0x3044) /* HIRAGANA LETTER */
-MAP(0x24, 0x25, 0x3045) /* HIRAGANA LETTER SMALL */
-MAP(0x24, 0x26, 0x3046) /* HIRAGANA LETTER */
-MAP(0x24, 0x27, 0x3047) /* HIRAGANA LETTER SMALL */
-MAP(0x24, 0x28, 0x3048) /* HIRAGANA LETTER */
-MAP(0x24, 0x29, 0x3049) /* HIRAGANA LETTER SMALL */
-MAP(0x24, 0x2A, 0x304A) /* HIRAGANA LETTER */
-MAP(0x24, 0x2B, 0x304B) /* HIRAGANA LETTER K */
-MAP(0x24, 0x2C, 0x304C) /* HIRAGANA LETTER G */
-MAP(0x24, 0x2D, 0x304D) /* HIRAGANA LETTER K */
-MAP(0x24, 0x2E, 0x304E) /* HIRAGANA LETTER G */
-MAP(0x24, 0x2F, 0x304F) /* HIRAGANA LETTER K */
-MAP(0x24, 0x30, 0x3050) /* HIRAGANA LETTER G */
-MAP(0x24, 0x31, 0x3051) /* HIRAGANA LETTER K */
-MAP(0x24, 0x32, 0x3052) /* HIRAGANA LETTER G */
-MAP(0x24, 0x33, 0x3053) /* HIRAGANA LETTER K */
-MAP(0x24, 0x34, 0x3054) /* HIRAGANA LETTER G */
-MAP(0x24, 0x35, 0x3055) /* HIRAGANA LETTER S */
-MAP(0x24, 0x36, 0x3056) /* HIRAGANA LETTER Z */
-MAP(0x24, 0x37, 0x3057) /* HIRAGANA LETTER S */
-MAP(0x24, 0x38, 0x3058) /* HIRAGANA LETTER Z */
-MAP(0x24, 0x39, 0x3059) /* HIRAGANA LETTER S */
-MAP(0x24, 0x3A, 0x305A) /* HIRAGANA LETTER Z */
-MAP(0x24, 0x3B, 0x305B) /* HIRAGANA LETTER S */
-MAP(0x24, 0x3C, 0x305C) /* HIRAGANA LETTER Z */
-MAP(0x24, 0x3D, 0x305D) /* HIRAGANA LETTER S */
-MAP(0x24, 0x3E, 0x305E) /* HIRAGANA LETTER Z */
-MAP(0x24, 0x3F, 0x305F) /* HIRAGANA LETTER T */
-MAP(0x24, 0x40, 0x3060) /* HIRAGANA LETTER D */
-MAP(0x24, 0x41, 0x3061) /* HIRAGANA LETTER T */
-MAP(0x24, 0x42, 0x3062) /* HIRAGANA LETTER D */
-MAP(0x24, 0x43, 0x3063) /* HIRAGANA LETTER SMALL T */
-MAP(0x24, 0x44, 0x3064) /* HIRAGANA LETTER T */
-MAP(0x24, 0x45, 0x3065) /* HIRAGANA LETTER D */
-MAP(0x24, 0x46, 0x3066) /* HIRAGANA LETTER T */
-MAP(0x24, 0x47, 0x3067) /* HIRAGANA LETTER D */
-MAP(0x24, 0x48, 0x3068) /* HIRAGANA LETTER T */
-MAP(0x24, 0x49, 0x3069) /* HIRAGANA LETTER D */
-MAP(0x24, 0x4A, 0x306A) /* HIRAGANA LETTER N */
-MAP(0x24, 0x4B, 0x306B) /* HIRAGANA LETTER N */
-MAP(0x24, 0x4C, 0x306C) /* HIRAGANA LETTER N */
-MAP(0x24, 0x4D, 0x306D) /* HIRAGANA LETTER N */
-MAP(0x24, 0x4E, 0x306E) /* HIRAGANA LETTER N */
-MAP(0x24, 0x4F, 0x306F) /* HIRAGANA LETTER H */
-MAP(0x24, 0x50, 0x3070) /* HIRAGANA LETTER B */
-MAP(0x24, 0x51, 0x3071) /* HIRAGANA LETTER P */
-MAP(0x24, 0x52, 0x3072) /* HIRAGANA LETTER H */
-MAP(0x24, 0x53, 0x3073) /* HIRAGANA LETTER B */
-MAP(0x24, 0x54, 0x3074) /* HIRAGANA LETTER P */
-MAP(0x24, 0x55, 0x3075) /* HIRAGANA LETTER H */
-MAP(0x24, 0x56, 0x3076) /* HIRAGANA LETTER B */
-MAP(0x24, 0x57, 0x3077) /* HIRAGANA LETTER P */
-MAP(0x24, 0x58, 0x3078) /* HIRAGANA LETTER H */
-MAP(0x24, 0x59, 0x3079) /* HIRAGANA LETTER B */
-MAP(0x24, 0x5A, 0x307A) /* HIRAGANA LETTER P */
-MAP(0x24, 0x5B, 0x307B) /* HIRAGANA LETTER H */
-MAP(0x24, 0x5C, 0x307C) /* HIRAGANA LETTER B */
-MAP(0x24, 0x5D, 0x307D) /* HIRAGANA LETTER P */
-MAP(0x24, 0x5E, 0x307E) /* HIRAGANA LETTER M */
-MAP(0x24, 0x5F, 0x307F) /* HIRAGANA LETTER M */
-MAP(0x24, 0x60, 0x3080) /* HIRAGANA LETTER M */
-MAP(0x24, 0x61, 0x3081) /* HIRAGANA LETTER M */
-MAP(0x24, 0x62, 0x3082) /* HIRAGANA LETTER M */
-MAP(0x24, 0x63, 0x3083) /* HIRAGANA LETTER SMALL Y */
-MAP(0x24, 0x64, 0x3084) /* HIRAGANA LETTER Y */
-MAP(0x24, 0x65, 0x3085) /* HIRAGANA LETTER SMALL Y */
-MAP(0x24, 0x66, 0x3086) /* HIRAGANA LETTER Y */
-MAP(0x24, 0x67, 0x3087) /* HIRAGANA LETTER SMALL Y */
-MAP(0x24, 0x68, 0x3088) /* HIRAGANA LETTER Y */
-MAP(0x24, 0x69, 0x3089) /* HIRAGANA LETTER R */
-MAP(0x24, 0x6A, 0x308A) /* HIRAGANA LETTER R */
-MAP(0x24, 0x6B, 0x308B) /* HIRAGANA LETTER R */
-MAP(0x24, 0x6C, 0x308C) /* HIRAGANA LETTER R */
-MAP(0x24, 0x6D, 0x308D) /* HIRAGANA LETTER R */
-MAP(0x24, 0x6E, 0x308E) /* HIRAGANA LETTER SMALL W */
-MAP(0x24, 0x6F, 0x308F) /* HIRAGANA LETTER W */
-MAP(0x24, 0x70, 0x3090) /* HIRAGANA LETTER W */
-MAP(0x24, 0x71, 0x3091) /* HIRAGANA LETTER W */
-MAP(0x24, 0x72, 0x3092) /* HIRAGANA LETTER W */
-MAP(0x24, 0x73, 0x3093) /* HIRAGANA LETTER */
-MAP(0x25, 0x21, 0x30A1) /* KATAKANA LETTER SMALL */
-MAP(0x25, 0x22, 0x30A2) /* KATAKANA LETTER */
-MAP(0x25, 0x23, 0x30A3) /* KATAKANA LETTER SMALL */
-MAP(0x25, 0x24, 0x30A4) /* KATAKANA LETTER */
-MAP(0x25, 0x25, 0x30A5) /* KATAKANA LETTER SMALL */
-MAP(0x25, 0x26, 0x30A6) /* KATAKANA LETTER */
-MAP(0x25, 0x27, 0x30A7) /* KATAKANA LETTER SMALL */
-MAP(0x25, 0x28, 0x30A8) /* KATAKANA LETTER */
-MAP(0x25, 0x29, 0x30A9) /* KATAKANA LETTER SMALL */
-MAP(0x25, 0x2A, 0x30AA) /* KATAKANA LETTER */
-MAP(0x25, 0x2B, 0x30AB) /* KATAKANA LETTER K */
-MAP(0x25, 0x2C, 0x30AC) /* KATAKANA LETTER G */
-MAP(0x25, 0x2D, 0x30AD) /* KATAKANA LETTER K */
-MAP(0x25, 0x2E, 0x30AE) /* KATAKANA LETTER G */
-MAP(0x25, 0x2F, 0x30AF) /* KATAKANA LETTER K */
-MAP(0x25, 0x30, 0x30B0) /* KATAKANA LETTER G */
-MAP(0x25, 0x31, 0x30B1) /* KATAKANA LETTER K */
-MAP(0x25, 0x32, 0x30B2) /* KATAKANA LETTER G */
-MAP(0x25, 0x33, 0x30B3) /* KATAKANA LETTER K */
-MAP(0x25, 0x34, 0x30B4) /* KATAKANA LETTER G */
-MAP(0x25, 0x35, 0x30B5) /* KATAKANA LETTER S */
-MAP(0x25, 0x36, 0x30B6) /* KATAKANA LETTER Z */
-MAP(0x25, 0x37, 0x30B7) /* KATAKANA LETTER S */
-MAP(0x25, 0x38, 0x30B8) /* KATAKANA LETTER Z */
-MAP(0x25, 0x39, 0x30B9) /* KATAKANA LETTER S */
-MAP(0x25, 0x3A, 0x30BA) /* KATAKANA LETTER Z */
-MAP(0x25, 0x3B, 0x30BB) /* KATAKANA LETTER S */
-MAP(0x25, 0x3C, 0x30BC) /* KATAKANA LETTER Z */
-MAP(0x25, 0x3D, 0x30BD) /* KATAKANA LETTER S */
-MAP(0x25, 0x3E, 0x30BE) /* KATAKANA LETTER Z */
-MAP(0x25, 0x3F, 0x30BF) /* KATAKANA LETTER T */
-MAP(0x25, 0x40, 0x30C0) /* KATAKANA LETTER D */
-MAP(0x25, 0x41, 0x30C1) /* KATAKANA LETTER T */
-MAP(0x25, 0x42, 0x30C2) /* KATAKANA LETTER D */
-MAP(0x25, 0x43, 0x30C3) /* KATAKANA LETTER SMALL T */
-MAP(0x25, 0x44, 0x30C4) /* KATAKANA LETTER T */
-MAP(0x25, 0x45, 0x30C5) /* KATAKANA LETTER D */
-MAP(0x25, 0x46, 0x30C6) /* KATAKANA LETTER T */
-MAP(0x25, 0x47, 0x30C7) /* KATAKANA LETTER D */
-MAP(0x25, 0x48, 0x30C8) /* KATAKANA LETTER T */
-MAP(0x25, 0x49, 0x30C9) /* KATAKANA LETTER D */
-MAP(0x25, 0x4A, 0x30CA) /* KATAKANA LETTER N */
-MAP(0x25, 0x4B, 0x30CB) /* KATAKANA LETTER N */
-MAP(0x25, 0x4C, 0x30CC) /* KATAKANA LETTER N */
-MAP(0x25, 0x4D, 0x30CD) /* KATAKANA LETTER N */
-MAP(0x25, 0x4E, 0x30CE) /* KATAKANA LETTER N */
-MAP(0x25, 0x4F, 0x30CF) /* KATAKANA LETTER H */
-MAP(0x25, 0x50, 0x30D0) /* KATAKANA LETTER B */
-MAP(0x25, 0x51, 0x30D1) /* KATAKANA LETTER P */
-MAP(0x25, 0x52, 0x30D2) /* KATAKANA LETTER H */
-MAP(0x25, 0x53, 0x30D3) /* KATAKANA LETTER B */
-MAP(0x25, 0x54, 0x30D4) /* KATAKANA LETTER P */
-MAP(0x25, 0x55, 0x30D5) /* KATAKANA LETTER H */
-MAP(0x25, 0x56, 0x30D6) /* KATAKANA LETTER B */
-MAP(0x25, 0x57, 0x30D7) /* KATAKANA LETTER P */
-MAP(0x25, 0x58, 0x30D8) /* KATAKANA LETTER H */
-MAP(0x25, 0x59, 0x30D9) /* KATAKANA LETTER B */
-MAP(0x25, 0x5A, 0x30DA) /* KATAKANA LETTER P */
-MAP(0x25, 0x5B, 0x30DB) /* KATAKANA LETTER H */
-MAP(0x25, 0x5C, 0x30DC) /* KATAKANA LETTER B */
-MAP(0x25, 0x5D, 0x30DD) /* KATAKANA LETTER P */
-MAP(0x25, 0x5E, 0x30DE) /* KATAKANA LETTER M */
-MAP(0x25, 0x5F, 0x30DF) /* KATAKANA LETTER M */
-MAP(0x25, 0x60, 0x30E0) /* KATAKANA LETTER M */
-MAP(0x25, 0x61, 0x30E1) /* KATAKANA LETTER M */
-MAP(0x25, 0x62, 0x30E2) /* KATAKANA LETTER M */
-MAP(0x25, 0x63, 0x30E3) /* KATAKANA LETTER SMALL Y */
-MAP(0x25, 0x64, 0x30E4) /* KATAKANA LETTER Y */
-MAP(0x25, 0x65, 0x30E5) /* KATAKANA LETTER SMALL Y */
-MAP(0x25, 0x66, 0x30E6) /* KATAKANA LETTER Y */
-MAP(0x25, 0x67, 0x30E7) /* KATAKANA LETTER SMALL Y */
-MAP(0x25, 0x68, 0x30E8) /* KATAKANA LETTER Y */
-MAP(0x25, 0x69, 0x30E9) /* KATAKANA LETTER R */
-MAP(0x25, 0x6A, 0x30EA) /* KATAKANA LETTER R */
-MAP(0x25, 0x6B, 0x30EB) /* KATAKANA LETTER R */
-MAP(0x25, 0x6C, 0x30EC) /* KATAKANA LETTER R */
-MAP(0x25, 0x6D, 0x30ED) /* KATAKANA LETTER R */
-MAP(0x25, 0x6E, 0x30EE) /* KATAKANA LETTER SMALL W */
-MAP(0x25, 0x6F, 0x30EF) /* KATAKANA LETTER W */
-MAP(0x25, 0x70, 0x30F0) /* KATAKANA LETTER W */
-MAP(0x25, 0x71, 0x30F1) /* KATAKANA LETTER W */
-MAP(0x25, 0x72, 0x30F2) /* KATAKANA LETTER W */
-MAP(0x25, 0x73, 0x30F3) /* KATAKANA LETTER */
-MAP(0x25, 0x74, 0x30F4) /* KATAKANA LETTER V */
-MAP(0x25, 0x75, 0x30F5) /* KATAKANA LETTER SMALL K */
-MAP(0x25, 0x76, 0x30F6) /* KATAKANA LETTER SMALL K */
-MAP(0x26, 0x21, 0x0391) /* GREEK CAPITAL LETTER ALPH */
-MAP(0x26, 0x22, 0x0392) /* GREEK CAPITAL LETTER BET */
-MAP(0x26, 0x23, 0x0393) /* GREEK CAPITAL LETTER GAMM */
-MAP(0x26, 0x24, 0x0394) /* GREEK CAPITAL LETTER DELT */
-MAP(0x26, 0x25, 0x0395) /* GREEK CAPITAL LETTER EPSILO */
-MAP(0x26, 0x26, 0x0396) /* GREEK CAPITAL LETTER ZET */
-MAP(0x26, 0x27, 0x0397) /* GREEK CAPITAL LETTER ET */
-MAP(0x26, 0x28, 0x0398) /* GREEK CAPITAL LETTER THET */
-MAP(0x26, 0x29, 0x0399) /* GREEK CAPITAL LETTER IOT */
-MAP(0x26, 0x2A, 0x039A) /* GREEK CAPITAL LETTER KAPP */
-MAP(0x26, 0x2B, 0x039B) /* GREEK CAPITAL LETTER LAMD */
-MAP(0x26, 0x2C, 0x039C) /* GREEK CAPITAL LETTER M */
-MAP(0x26, 0x2D, 0x039D) /* GREEK CAPITAL LETTER N */
-MAP(0x26, 0x2E, 0x039E) /* GREEK CAPITAL LETTER X */
-MAP(0x26, 0x2F, 0x039F) /* GREEK CAPITAL LETTER OMICRO */
-MAP(0x26, 0x30, 0x03A0) /* GREEK CAPITAL LETTER P */
-MAP(0x26, 0x31, 0x03A1) /* GREEK CAPITAL LETTER RH */
-MAP(0x26, 0x32, 0x03A3) /* GREEK CAPITAL LETTER SIGM */
-MAP(0x26, 0x33, 0x03A4) /* GREEK CAPITAL LETTER TA */
-MAP(0x26, 0x34, 0x03A5) /* GREEK CAPITAL LETTER UPSILO */
-MAP(0x26, 0x35, 0x03A6) /* GREEK CAPITAL LETTER PH */
-MAP(0x26, 0x36, 0x03A7) /* GREEK CAPITAL LETTER CH */
-MAP(0x26, 0x37, 0x03A8) /* GREEK CAPITAL LETTER PS */
-MAP(0x26, 0x38, 0x03A9) /* GREEK CAPITAL LETTER OMEG */
-MAP(0x26, 0x41, 0x03B1) /* GREEK SMALL LETTER ALPH */
-MAP(0x26, 0x42, 0x03B2) /* GREEK SMALL LETTER BET */
-MAP(0x26, 0x43, 0x03B3) /* GREEK SMALL LETTER GAMM */
-MAP(0x26, 0x44, 0x03B4) /* GREEK SMALL LETTER DELT */
-MAP(0x26, 0x45, 0x03B5) /* GREEK SMALL LETTER EPSILO */
-MAP(0x26, 0x46, 0x03B6) /* GREEK SMALL LETTER ZET */
-MAP(0x26, 0x47, 0x03B7) /* GREEK SMALL LETTER ET */
-MAP(0x26, 0x48, 0x03B8) /* GREEK SMALL LETTER THET */
-MAP(0x26, 0x49, 0x03B9) /* GREEK SMALL LETTER IOT */
-MAP(0x26, 0x4A, 0x03BA) /* GREEK SMALL LETTER KAPP */
-MAP(0x26, 0x4B, 0x03BB) /* GREEK SMALL LETTER LAMD */
-MAP(0x26, 0x4C, 0x03BC) /* GREEK SMALL LETTER M */
-MAP(0x26, 0x4D, 0x03BD) /* GREEK SMALL LETTER N */
-MAP(0x26, 0x4E, 0x03BE) /* GREEK SMALL LETTER X */
-MAP(0x26, 0x4F, 0x03BF) /* GREEK SMALL LETTER OMICRO */
-MAP(0x26, 0x50, 0x03C0) /* GREEK SMALL LETTER P */
-MAP(0x26, 0x51, 0x03C1) /* GREEK SMALL LETTER RH */
-MAP(0x26, 0x52, 0x03C3) /* GREEK SMALL LETTER SIGM */
-MAP(0x26, 0x53, 0x03C4) /* GREEK SMALL LETTER TA */
-MAP(0x26, 0x54, 0x03C5) /* GREEK SMALL LETTER UPSILO */
-MAP(0x26, 0x55, 0x03C6) /* GREEK SMALL LETTER PH */
-MAP(0x26, 0x56, 0x03C7) /* GREEK SMALL LETTER CH */
-MAP(0x26, 0x57, 0x03C8) /* GREEK SMALL LETTER PS */
-MAP(0x26, 0x58, 0x03C9) /* GREEK SMALL LETTER OMEG */
-MAP(0x27, 0x21, 0x0410) /* CYRILLIC CAPITAL LETTER */
-MAP(0x27, 0x22, 0x0411) /* CYRILLIC CAPITAL LETTER B */
-MAP(0x27, 0x23, 0x0412) /* CYRILLIC CAPITAL LETTER V */
-MAP(0x27, 0x24, 0x0413) /* CYRILLIC CAPITAL LETTER GH */
-MAP(0x27, 0x25, 0x0414) /* CYRILLIC CAPITAL LETTER D */
-MAP(0x27, 0x26, 0x0415) /* CYRILLIC CAPITAL LETTER I */
-MAP(0x27, 0x27, 0x0401) /* CYRILLIC CAPITAL LETTER I */
-MAP(0x27, 0x28, 0x0416) /* CYRILLIC CAPITAL LETTER ZH */
-MAP(0x27, 0x29, 0x0417) /* CYRILLIC CAPITAL LETTER Z */
-MAP(0x27, 0x2A, 0x0418) /* CYRILLIC CAPITAL LETTER */
-MAP(0x27, 0x2B, 0x0419) /* CYRILLIC CAPITAL LETTER SHORT */
-MAP(0x27, 0x2C, 0x041A) /* CYRILLIC CAPITAL LETTER K */
-MAP(0x27, 0x2D, 0x041B) /* CYRILLIC CAPITAL LETTER E */
-MAP(0x27, 0x2E, 0x041C) /* CYRILLIC CAPITAL LETTER E */
-MAP(0x27, 0x2F, 0x041D) /* CYRILLIC CAPITAL LETTER E */
-MAP(0x27, 0x30, 0x041E) /* CYRILLIC CAPITAL LETTER */
-MAP(0x27, 0x31, 0x041F) /* CYRILLIC CAPITAL LETTER P */
-MAP(0x27, 0x32, 0x0420) /* CYRILLIC CAPITAL LETTER E */
-MAP(0x27, 0x33, 0x0421) /* CYRILLIC CAPITAL LETTER E */
-MAP(0x27, 0x34, 0x0422) /* CYRILLIC CAPITAL LETTER T */
-MAP(0x27, 0x35, 0x0423) /* CYRILLIC CAPITAL LETTER */
-MAP(0x27, 0x36, 0x0424) /* CYRILLIC CAPITAL LETTER E */
-MAP(0x27, 0x37, 0x0425) /* CYRILLIC CAPITAL LETTER H */
-MAP(0x27, 0x38, 0x0426) /* CYRILLIC CAPITAL LETTER TS */
-MAP(0x27, 0x39, 0x0427) /* CYRILLIC CAPITAL LETTER CH */
-MAP(0x27, 0x3A, 0x0428) /* CYRILLIC CAPITAL LETTER SH */
-MAP(0x27, 0x3B, 0x0429) /* CYRILLIC CAPITAL LETTER SHCH */
-MAP(0x27, 0x3C, 0x042A) /* CYRILLIC CAPITAL LETTER HARD SIG */
-MAP(0x27, 0x3D, 0x042B) /* CYRILLIC CAPITAL LETTER YER */
-MAP(0x27, 0x3E, 0x042C) /* CYRILLIC CAPITAL LETTER SOFT SIG */
-MAP(0x27, 0x3F, 0x042D) /* CYRILLIC CAPITAL LETTER */
-MAP(0x27, 0x40, 0x042E) /* CYRILLIC CAPITAL LETTER Y */
-MAP(0x27, 0x41, 0x042F) /* CYRILLIC CAPITAL LETTER Y */
-MAP(0x27, 0x51, 0x0430) /* CYRILLIC SMALL LETTER */
-MAP(0x27, 0x52, 0x0431) /* CYRILLIC SMALL LETTER B */
-MAP(0x27, 0x53, 0x0432) /* CYRILLIC SMALL LETTER V */
-MAP(0x27, 0x54, 0x0433) /* CYRILLIC SMALL LETTER GH */
-MAP(0x27, 0x55, 0x0434) /* CYRILLIC SMALL LETTER D */
-MAP(0x27, 0x56, 0x0435) /* CYRILLIC SMALL LETTER I */
-MAP(0x27, 0x57, 0x0451) /* CYRILLIC SMALL LETTER I */
-MAP(0x27, 0x58, 0x0436) /* CYRILLIC SMALL LETTER ZH */
-MAP(0x27, 0x59, 0x0437) /* CYRILLIC SMALL LETTER Z */
-MAP(0x27, 0x5A, 0x0438) /* CYRILLIC SMALL LETTER */
-MAP(0x27, 0x5B, 0x0439) /* CYRILLIC SMALL LETTER SHORT */
-MAP(0x27, 0x5C, 0x043A) /* CYRILLIC SMALL LETTER K */
-MAP(0x27, 0x5D, 0x043B) /* CYRILLIC SMALL LETTER E */
-MAP(0x27, 0x5E, 0x043C) /* CYRILLIC SMALL LETTER E */
-MAP(0x27, 0x5F, 0x043D) /* CYRILLIC SMALL LETTER E */
-MAP(0x27, 0x60, 0x043E) /* CYRILLIC SMALL LETTER */
-MAP(0x27, 0x61, 0x043F) /* CYRILLIC SMALL LETTER P */
-MAP(0x27, 0x62, 0x0440) /* CYRILLIC SMALL LETTER E */
-MAP(0x27, 0x63, 0x0441) /* CYRILLIC SMALL LETTER E */
-MAP(0x27, 0x64, 0x0442) /* CYRILLIC SMALL LETTER T */
-MAP(0x27, 0x65, 0x0443) /* CYRILLIC SMALL LETTER */
-MAP(0x27, 0x66, 0x0444) /* CYRILLIC SMALL LETTER E */
-MAP(0x27, 0x67, 0x0445) /* CYRILLIC SMALL LETTER H */
-MAP(0x27, 0x68, 0x0446) /* CYRILLIC SMALL LETTER TS */
-MAP(0x27, 0x69, 0x0447) /* CYRILLIC SMALL LETTER CH */
-MAP(0x27, 0x6A, 0x0448) /* CYRILLIC SMALL LETTER SH */
-MAP(0x27, 0x6B, 0x0449) /* CYRILLIC SMALL LETTER SHCH */
-MAP(0x27, 0x6C, 0x044A) /* CYRILLIC SMALL LETTER HARD SIG */
-MAP(0x27, 0x6D, 0x044B) /* CYRILLIC SMALL LETTER YER */
-MAP(0x27, 0x6E, 0x044C) /* CYRILLIC SMALL LETTER SOFT SIG */
-MAP(0x27, 0x6F, 0x044D) /* CYRILLIC SMALL LETTER */
-MAP(0x27, 0x70, 0x044E) /* CYRILLIC SMALL LETTER Y */
-MAP(0x27, 0x71, 0x044F) /* CYRILLIC SMALL LETTER Y */
-MAP(0x28, 0x21, 0x2500) /* BOX DRAWINGS LIGHT HORIZONTA */
-MAP(0x28, 0x22, 0x2502) /* BOX DRAWINGS LIGHT VERTICA */
-MAP(0x28, 0x23, 0x250C) /* BOX DRAWINGS LIGHT DOWN AND RIGH */
-MAP(0x28, 0x24, 0x2510) /* BOX DRAWINGS LIGHT DOWN AND LEF */
-MAP(0x28, 0x25, 0x2518) /* BOX DRAWINGS LIGHT UP AND LEF */
-MAP(0x28, 0x26, 0x2514) /* BOX DRAWINGS LIGHT UP AND RIGH */
-MAP(0x28, 0x27, 0x251C) /* BOX DRAWINGS LIGHT VERTICAL AND RIGH */
-MAP(0x28, 0x28, 0x252C) /* BOX DRAWINGS LIGHT DOWN AND HORIZONTA */
-MAP(0x28, 0x29, 0x2524) /* BOX DRAWINGS LIGHT VERTICAL AND LEF */
-MAP(0x28, 0x2A, 0x2534) /* BOX DRAWINGS LIGHT UP AND HORIZONTA */
-MAP(0x28, 0x2B, 0x253C) /* BOX DRAWINGS LIGHT VERTICAL AND HORIZONTA */
-MAP(0x28, 0x2C, 0x2501) /* BOX DRAWINGS HEAVY HORIZONTA */
-MAP(0x28, 0x2D, 0x2503) /* BOX DRAWINGS HEAVY VERTICA */
-MAP(0x28, 0x2E, 0x250F) /* BOX DRAWINGS HEAVY DOWN AND RIGH */
-MAP(0x28, 0x2F, 0x2513) /* BOX DRAWINGS HEAVY DOWN AND LEF */
-MAP(0x28, 0x30, 0x251B) /* BOX DRAWINGS HEAVY UP AND LEF */
-MAP(0x28, 0x31, 0x2517) /* BOX DRAWINGS HEAVY UP AND RIGH */
-MAP(0x28, 0x32, 0x2523) /* BOX DRAWINGS HEAVY VERTICAL AND RIGH */
-MAP(0x28, 0x33, 0x2533) /* BOX DRAWINGS HEAVY DOWN AND HORIZONTA */
-MAP(0x28, 0x34, 0x252B) /* BOX DRAWINGS HEAVY VERTICAL AND LEF */
-MAP(0x28, 0x35, 0x253B) /* BOX DRAWINGS HEAVY UP AND HORIZONTA */
-MAP(0x28, 0x36, 0x254B) /* BOX DRAWINGS HEAVY VERTICAL AND HORIZONTA */
-MAP(0x28, 0x37, 0x2520) /* BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGH */
-MAP(0x28, 0x38, 0x252F) /* BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAV */
-MAP(0x28, 0x39, 0x2528) /* BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGH */
-MAP(0x28, 0x3A, 0x2537) /* BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAV */
-MAP(0x28, 0x3B, 0x253F) /* BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAV */
-MAP(0x28, 0x3C, 0x251D) /* BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAV */
-MAP(0x28, 0x3D, 0x2530) /* BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGH */
-MAP(0x28, 0x3E, 0x2525) /* BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAV */
-MAP(0x28, 0x3F, 0x2538) /* BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGH */
-MAP(0x28, 0x40, 0x2542) /* BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGH */
-MAP(0x30, 0x21, 0x4E9C) /* <CJK */
-MAP(0x30, 0x22, 0x5516) /* <CJK */
-MAP(0x30, 0x23, 0x5A03) /* <CJK */
-MAP(0x30, 0x24, 0x963F) /* <CJK */
-MAP(0x30, 0x25, 0x54C0) /* <CJK */
-MAP(0x30, 0x26, 0x611B) /* <CJK */
-MAP(0x30, 0x27, 0x6328) /* <CJK */
-MAP(0x30, 0x28, 0x59F6) /* <CJK */
-MAP(0x30, 0x29, 0x9022) /* <CJK */
-MAP(0x30, 0x2A, 0x8475) /* <CJK */
-MAP(0x30, 0x2B, 0x831C) /* <CJK */
-MAP(0x30, 0x2C, 0x7A50) /* <CJK */
-MAP(0x30, 0x2D, 0x60AA) /* <CJK */
-MAP(0x30, 0x2E, 0x63E1) /* <CJK */
-MAP(0x30, 0x2F, 0x6E25) /* <CJK */
-MAP(0x30, 0x30, 0x65ED) /* <CJK */
-MAP(0x30, 0x31, 0x8466) /* <CJK */
-MAP(0x30, 0x32, 0x82A6) /* <CJK */
-MAP(0x30, 0x33, 0x9BF5) /* <CJK */
-MAP(0x30, 0x34, 0x6893) /* <CJK */
-MAP(0x30, 0x35, 0x5727) /* <CJK */
-MAP(0x30, 0x36, 0x65A1) /* <CJK */
-MAP(0x30, 0x37, 0x6271) /* <CJK */
-MAP(0x30, 0x38, 0x5B9B) /* <CJK */
-MAP(0x30, 0x39, 0x59D0) /* <CJK */
-MAP(0x30, 0x3A, 0x867B) /* <CJK */
-MAP(0x30, 0x3B, 0x98F4) /* <CJK */
-MAP(0x30, 0x3C, 0x7D62) /* <CJK */
-MAP(0x30, 0x3D, 0x7DBE) /* <CJK */
-MAP(0x30, 0x3E, 0x9B8E) /* <CJK */
-MAP(0x30, 0x3F, 0x6216) /* <CJK */
-MAP(0x30, 0x40, 0x7C9F) /* <CJK */
-MAP(0x30, 0x41, 0x88B7) /* <CJK */
-MAP(0x30, 0x42, 0x5B89) /* <CJK */
-MAP(0x30, 0x43, 0x5EB5) /* <CJK */
-MAP(0x30, 0x44, 0x6309) /* <CJK */
-MAP(0x30, 0x45, 0x6697) /* <CJK */
-MAP(0x30, 0x46, 0x6848) /* <CJK */
-MAP(0x30, 0x47, 0x95C7) /* <CJK */
-MAP(0x30, 0x48, 0x978D) /* <CJK */
-MAP(0x30, 0x49, 0x674F) /* <CJK */
-MAP(0x30, 0x4A, 0x4EE5) /* <CJK */
-MAP(0x30, 0x4B, 0x4F0A) /* <CJK */
-MAP(0x30, 0x4C, 0x4F4D) /* <CJK */
-MAP(0x30, 0x4D, 0x4F9D) /* <CJK */
-MAP(0x30, 0x4E, 0x5049) /* <CJK */
-MAP(0x30, 0x4F, 0x56F2) /* <CJK */
-MAP(0x30, 0x50, 0x5937) /* <CJK */
-MAP(0x30, 0x51, 0x59D4) /* <CJK */
-MAP(0x30, 0x52, 0x5A01) /* <CJK */
-MAP(0x30, 0x53, 0x5C09) /* <CJK */
-MAP(0x30, 0x54, 0x60DF) /* <CJK */
-MAP(0x30, 0x55, 0x610F) /* <CJK */
-MAP(0x30, 0x56, 0x6170) /* <CJK */
-MAP(0x30, 0x57, 0x6613) /* <CJK */
-MAP(0x30, 0x58, 0x6905) /* <CJK */
-MAP(0x30, 0x59, 0x70BA) /* <CJK */
-MAP(0x30, 0x5A, 0x754F) /* <CJK */
-MAP(0x30, 0x5B, 0x7570) /* <CJK */
-MAP(0x30, 0x5C, 0x79FB) /* <CJK */
-MAP(0x30, 0x5D, 0x7DAD) /* <CJK */
-MAP(0x30, 0x5E, 0x7DEF) /* <CJK */
-MAP(0x30, 0x5F, 0x80C3) /* <CJK */
-MAP(0x30, 0x60, 0x840E) /* <CJK */
-MAP(0x30, 0x61, 0x8863) /* <CJK */
-MAP(0x30, 0x62, 0x8B02) /* <CJK */
-MAP(0x30, 0x63, 0x9055) /* <CJK */
-MAP(0x30, 0x64, 0x907A) /* <CJK */
-MAP(0x30, 0x65, 0x533B) /* <CJK */
-MAP(0x30, 0x66, 0x4E95) /* <CJK */
-MAP(0x30, 0x67, 0x4EA5) /* <CJK */
-MAP(0x30, 0x68, 0x57DF) /* <CJK */
-MAP(0x30, 0x69, 0x80B2) /* <CJK */
-MAP(0x30, 0x6A, 0x90C1) /* <CJK */
-MAP(0x30, 0x6B, 0x78EF) /* <CJK */
-MAP(0x30, 0x6C, 0x4E00) /* <CJK */
-MAP(0x30, 0x6D, 0x58F1) /* <CJK */
-MAP(0x30, 0x6E, 0x6EA2) /* <CJK */
-MAP(0x30, 0x6F, 0x9038) /* <CJK */
-MAP(0x30, 0x70, 0x7A32) /* <CJK */
-MAP(0x30, 0x71, 0x8328) /* <CJK */
-MAP(0x30, 0x72, 0x828B) /* <CJK */
-MAP(0x30, 0x73, 0x9C2F) /* <CJK */
-MAP(0x30, 0x74, 0x5141) /* <CJK */
-MAP(0x30, 0x75, 0x5370) /* <CJK */
-MAP(0x30, 0x76, 0x54BD) /* <CJK */
-MAP(0x30, 0x77, 0x54E1) /* <CJK */
-MAP(0x30, 0x78, 0x56E0) /* <CJK */
-MAP(0x30, 0x79, 0x59FB) /* <CJK */
-MAP(0x30, 0x7A, 0x5F15) /* <CJK */
-MAP(0x30, 0x7B, 0x98F2) /* <CJK */
-MAP(0x30, 0x7C, 0x6DEB) /* <CJK */
-MAP(0x30, 0x7D, 0x80E4) /* <CJK */
-MAP(0x30, 0x7E, 0x852D) /* <CJK */
-MAP(0x31, 0x21, 0x9662) /* <CJK */
-MAP(0x31, 0x22, 0x9670) /* <CJK */
-MAP(0x31, 0x23, 0x96A0) /* <CJK */
-MAP(0x31, 0x24, 0x97FB) /* <CJK */
-MAP(0x31, 0x25, 0x540B) /* <CJK */
-MAP(0x31, 0x26, 0x53F3) /* <CJK */
-MAP(0x31, 0x27, 0x5B87) /* <CJK */
-MAP(0x31, 0x28, 0x70CF) /* <CJK */
-MAP(0x31, 0x29, 0x7FBD) /* <CJK */
-MAP(0x31, 0x2A, 0x8FC2) /* <CJK */
-MAP(0x31, 0x2B, 0x96E8) /* <CJK */
-MAP(0x31, 0x2C, 0x536F) /* <CJK */
-MAP(0x31, 0x2D, 0x9D5C) /* <CJK */
-MAP(0x31, 0x2E, 0x7ABA) /* <CJK */
-MAP(0x31, 0x2F, 0x4E11) /* <CJK */
-MAP(0x31, 0x30, 0x7893) /* <CJK */
-MAP(0x31, 0x31, 0x81FC) /* <CJK */
-MAP(0x31, 0x32, 0x6E26) /* <CJK */
-MAP(0x31, 0x33, 0x5618) /* <CJK */
-MAP(0x31, 0x34, 0x5504) /* <CJK */
-MAP(0x31, 0x35, 0x6B1D) /* <CJK */
-MAP(0x31, 0x36, 0x851A) /* <CJK */
-MAP(0x31, 0x37, 0x9C3B) /* <CJK */
-MAP(0x31, 0x38, 0x59E5) /* <CJK */
-MAP(0x31, 0x39, 0x53A9) /* <CJK */
-MAP(0x31, 0x3A, 0x6D66) /* <CJK */
-MAP(0x31, 0x3B, 0x74DC) /* <CJK */
-MAP(0x31, 0x3C, 0x958F) /* <CJK */
-MAP(0x31, 0x3D, 0x5642) /* <CJK */
-MAP(0x31, 0x3E, 0x4E91) /* <CJK */
-MAP(0x31, 0x3F, 0x904B) /* <CJK */
-MAP(0x31, 0x40, 0x96F2) /* <CJK */
-MAP(0x31, 0x41, 0x834F) /* <CJK */
-MAP(0x31, 0x42, 0x990C) /* <CJK */
-MAP(0x31, 0x43, 0x53E1) /* <CJK */
-MAP(0x31, 0x44, 0x55B6) /* <CJK */
-MAP(0x31, 0x45, 0x5B30) /* <CJK */
-MAP(0x31, 0x46, 0x5F71) /* <CJK */
-MAP(0x31, 0x47, 0x6620) /* <CJK */
-MAP(0x31, 0x48, 0x66F3) /* <CJK */
-MAP(0x31, 0x49, 0x6804) /* <CJK */
-MAP(0x31, 0x4A, 0x6C38) /* <CJK */
-MAP(0x31, 0x4B, 0x6CF3) /* <CJK */
-MAP(0x31, 0x4C, 0x6D29) /* <CJK */
-MAP(0x31, 0x4D, 0x745B) /* <CJK */
-MAP(0x31, 0x4E, 0x76C8) /* <CJK */
-MAP(0x31, 0x4F, 0x7A4E) /* <CJK */
-MAP(0x31, 0x50, 0x9834) /* <CJK */
-MAP(0x31, 0x51, 0x82F1) /* <CJK */
-MAP(0x31, 0x52, 0x885B) /* <CJK */
-MAP(0x31, 0x53, 0x8A60) /* <CJK */
-MAP(0x31, 0x54, 0x92ED) /* <CJK */
-MAP(0x31, 0x55, 0x6DB2) /* <CJK */
-MAP(0x31, 0x56, 0x75AB) /* <CJK */
-MAP(0x31, 0x57, 0x76CA) /* <CJK */
-MAP(0x31, 0x58, 0x99C5) /* <CJK */
-MAP(0x31, 0x59, 0x60A6) /* <CJK */
-MAP(0x31, 0x5A, 0x8B01) /* <CJK */
-MAP(0x31, 0x5B, 0x8D8A) /* <CJK */
-MAP(0x31, 0x5C, 0x95B2) /* <CJK */
-MAP(0x31, 0x5D, 0x698E) /* <CJK */
-MAP(0x31, 0x5E, 0x53AD) /* <CJK */
-MAP(0x31, 0x5F, 0x5186) /* <CJK */
-MAP(0x31, 0x60, 0x5712) /* <CJK */
-MAP(0x31, 0x61, 0x5830) /* <CJK */
-MAP(0x31, 0x62, 0x5944) /* <CJK */
-MAP(0x31, 0x63, 0x5BB4) /* <CJK */
-MAP(0x31, 0x64, 0x5EF6) /* <CJK */
-MAP(0x31, 0x65, 0x6028) /* <CJK */
-MAP(0x31, 0x66, 0x63A9) /* <CJK */
-MAP(0x31, 0x67, 0x63F4) /* <CJK */
-MAP(0x31, 0x68, 0x6CBF) /* <CJK */
-MAP(0x31, 0x69, 0x6F14) /* <CJK */
-MAP(0x31, 0x6A, 0x708E) /* <CJK */
-MAP(0x31, 0x6B, 0x7114) /* <CJK */
-MAP(0x31, 0x6C, 0x7159) /* <CJK */
-MAP(0x31, 0x6D, 0x71D5) /* <CJK */
-MAP(0x31, 0x6E, 0x733F) /* <CJK */
-MAP(0x31, 0x6F, 0x7E01) /* <CJK */
-MAP(0x31, 0x70, 0x8276) /* <CJK */
-MAP(0x31, 0x71, 0x82D1) /* <CJK */
-MAP(0x31, 0x72, 0x8597) /* <CJK */
-MAP(0x31, 0x73, 0x9060) /* <CJK */
-MAP(0x31, 0x74, 0x925B) /* <CJK */
-MAP(0x31, 0x75, 0x9D1B) /* <CJK */
-MAP(0x31, 0x76, 0x5869) /* <CJK */
-MAP(0x31, 0x77, 0x65BC) /* <CJK */
-MAP(0x31, 0x78, 0x6C5A) /* <CJK */
-MAP(0x31, 0x79, 0x7525) /* <CJK */
-MAP(0x31, 0x7A, 0x51F9) /* <CJK */
-MAP(0x31, 0x7B, 0x592E) /* <CJK */
-MAP(0x31, 0x7C, 0x5965) /* <CJK */
-MAP(0x31, 0x7D, 0x5F80) /* <CJK */
-MAP(0x31, 0x7E, 0x5FDC) /* <CJK */
-MAP(0x32, 0x21, 0x62BC) /* <CJK */
-MAP(0x32, 0x22, 0x65FA) /* <CJK */
-MAP(0x32, 0x23, 0x6A2A) /* <CJK */
-MAP(0x32, 0x24, 0x6B27) /* <CJK */
-MAP(0x32, 0x25, 0x6BB4) /* <CJK */
-MAP(0x32, 0x26, 0x738B) /* <CJK */
-MAP(0x32, 0x27, 0x7FC1) /* <CJK */
-MAP(0x32, 0x28, 0x8956) /* <CJK */
-MAP(0x32, 0x29, 0x9D2C) /* <CJK */
-MAP(0x32, 0x2A, 0x9D0E) /* <CJK */
-MAP(0x32, 0x2B, 0x9EC4) /* <CJK */
-MAP(0x32, 0x2C, 0x5CA1) /* <CJK */
-MAP(0x32, 0x2D, 0x6C96) /* <CJK */
-MAP(0x32, 0x2E, 0x837B) /* <CJK */
-MAP(0x32, 0x2F, 0x5104) /* <CJK */
-MAP(0x32, 0x30, 0x5C4B) /* <CJK */
-MAP(0x32, 0x31, 0x61B6) /* <CJK */
-MAP(0x32, 0x32, 0x81C6) /* <CJK */
-MAP(0x32, 0x33, 0x6876) /* <CJK */
-MAP(0x32, 0x34, 0x7261) /* <CJK */
-MAP(0x32, 0x35, 0x4E59) /* <CJK */
-MAP(0x32, 0x36, 0x4FFA) /* <CJK */
-MAP(0x32, 0x37, 0x5378) /* <CJK */
-MAP(0x32, 0x38, 0x6069) /* <CJK */
-MAP(0x32, 0x39, 0x6E29) /* <CJK */
-MAP(0x32, 0x3A, 0x7A4F) /* <CJK */
-MAP(0x32, 0x3B, 0x97F3) /* <CJK */
-MAP(0x32, 0x3C, 0x4E0B) /* <CJK */
-MAP(0x32, 0x3D, 0x5316) /* <CJK */
-MAP(0x32, 0x3E, 0x4EEE) /* <CJK */
-MAP(0x32, 0x3F, 0x4F55) /* <CJK */
-MAP(0x32, 0x40, 0x4F3D) /* <CJK */
-MAP(0x32, 0x41, 0x4FA1) /* <CJK */
-MAP(0x32, 0x42, 0x4F73) /* <CJK */
-MAP(0x32, 0x43, 0x52A0) /* <CJK */
-MAP(0x32, 0x44, 0x53EF) /* <CJK */
-MAP(0x32, 0x45, 0x5609) /* <CJK */
-MAP(0x32, 0x46, 0x590F) /* <CJK */
-MAP(0x32, 0x47, 0x5AC1) /* <CJK */
-MAP(0x32, 0x48, 0x5BB6) /* <CJK */
-MAP(0x32, 0x49, 0x5BE1) /* <CJK */
-MAP(0x32, 0x4A, 0x79D1) /* <CJK */
-MAP(0x32, 0x4B, 0x6687) /* <CJK */
-MAP(0x32, 0x4C, 0x679C) /* <CJK */
-MAP(0x32, 0x4D, 0x67B6) /* <CJK */
-MAP(0x32, 0x4E, 0x6B4C) /* <CJK */
-MAP(0x32, 0x4F, 0x6CB3) /* <CJK */
-MAP(0x32, 0x50, 0x706B) /* <CJK */
-MAP(0x32, 0x51, 0x73C2) /* <CJK */
-MAP(0x32, 0x52, 0x798D) /* <CJK */
-MAP(0x32, 0x53, 0x79BE) /* <CJK */
-MAP(0x32, 0x54, 0x7A3C) /* <CJK */
-MAP(0x32, 0x55, 0x7B87) /* <CJK */
-MAP(0x32, 0x56, 0x82B1) /* <CJK */
-MAP(0x32, 0x57, 0x82DB) /* <CJK */
-MAP(0x32, 0x58, 0x8304) /* <CJK */
-MAP(0x32, 0x59, 0x8377) /* <CJK */
-MAP(0x32, 0x5A, 0x83EF) /* <CJK */
-MAP(0x32, 0x5B, 0x83D3) /* <CJK */
-MAP(0x32, 0x5C, 0x8766) /* <CJK */
-MAP(0x32, 0x5D, 0x8AB2) /* <CJK */
-MAP(0x32, 0x5E, 0x5629) /* <CJK */
-MAP(0x32, 0x5F, 0x8CA8) /* <CJK */
-MAP(0x32, 0x60, 0x8FE6) /* <CJK */
-MAP(0x32, 0x61, 0x904E) /* <CJK */
-MAP(0x32, 0x62, 0x971E) /* <CJK */
-MAP(0x32, 0x63, 0x868A) /* <CJK */
-MAP(0x32, 0x64, 0x4FC4) /* <CJK */
-MAP(0x32, 0x65, 0x5CE8) /* <CJK */
-MAP(0x32, 0x66, 0x6211) /* <CJK */
-MAP(0x32, 0x67, 0x7259) /* <CJK */
-MAP(0x32, 0x68, 0x753B) /* <CJK */
-MAP(0x32, 0x69, 0x81E5) /* <CJK */
-MAP(0x32, 0x6A, 0x82BD) /* <CJK */
-MAP(0x32, 0x6B, 0x86FE) /* <CJK */
-MAP(0x32, 0x6C, 0x8CC0) /* <CJK */
-MAP(0x32, 0x6D, 0x96C5) /* <CJK */
-MAP(0x32, 0x6E, 0x9913) /* <CJK */
-MAP(0x32, 0x6F, 0x99D5) /* <CJK */
-MAP(0x32, 0x70, 0x4ECB) /* <CJK */
-MAP(0x32, 0x71, 0x4F1A) /* <CJK */
-MAP(0x32, 0x72, 0x89E3) /* <CJK */
-MAP(0x32, 0x73, 0x56DE) /* <CJK */
-MAP(0x32, 0x74, 0x584A) /* <CJK */
-MAP(0x32, 0x75, 0x58CA) /* <CJK */
-MAP(0x32, 0x76, 0x5EFB) /* <CJK */
-MAP(0x32, 0x77, 0x5FEB) /* <CJK */
-MAP(0x32, 0x78, 0x602A) /* <CJK */
-MAP(0x32, 0x79, 0x6094) /* <CJK */
-MAP(0x32, 0x7A, 0x6062) /* <CJK */
-MAP(0x32, 0x7B, 0x61D0) /* <CJK */
-MAP(0x32, 0x7C, 0x6212) /* <CJK */
-MAP(0x32, 0x7D, 0x62D0) /* <CJK */
-MAP(0x32, 0x7E, 0x6539) /* <CJK */
-MAP(0x33, 0x21, 0x9B41) /* <CJK */
-MAP(0x33, 0x22, 0x6666) /* <CJK */
-MAP(0x33, 0x23, 0x68B0) /* <CJK */
-MAP(0x33, 0x24, 0x6D77) /* <CJK */
-MAP(0x33, 0x25, 0x7070) /* <CJK */
-MAP(0x33, 0x26, 0x754C) /* <CJK */
-MAP(0x33, 0x27, 0x7686) /* <CJK */
-MAP(0x33, 0x28, 0x7D75) /* <CJK */
-MAP(0x33, 0x29, 0x82A5) /* <CJK */
-MAP(0x33, 0x2A, 0x87F9) /* <CJK */
-MAP(0x33, 0x2B, 0x958B) /* <CJK */
-MAP(0x33, 0x2C, 0x968E) /* <CJK */
-MAP(0x33, 0x2D, 0x8C9D) /* <CJK */
-MAP(0x33, 0x2E, 0x51F1) /* <CJK */
-MAP(0x33, 0x2F, 0x52BE) /* <CJK */
-MAP(0x33, 0x30, 0x5916) /* <CJK */
-MAP(0x33, 0x31, 0x54B3) /* <CJK */
-MAP(0x33, 0x32, 0x5BB3) /* <CJK */
-MAP(0x33, 0x33, 0x5D16) /* <CJK */
-MAP(0x33, 0x34, 0x6168) /* <CJK */
-MAP(0x33, 0x35, 0x6982) /* <CJK */
-MAP(0x33, 0x36, 0x6DAF) /* <CJK */
-MAP(0x33, 0x37, 0x788D) /* <CJK */
-MAP(0x33, 0x38, 0x84CB) /* <CJK */
-MAP(0x33, 0x39, 0x8857) /* <CJK */
-MAP(0x33, 0x3A, 0x8A72) /* <CJK */
-MAP(0x33, 0x3B, 0x93A7) /* <CJK */
-MAP(0x33, 0x3C, 0x9AB8) /* <CJK */
-MAP(0x33, 0x3D, 0x6D6C) /* <CJK */
-MAP(0x33, 0x3E, 0x99A8) /* <CJK */
-MAP(0x33, 0x3F, 0x86D9) /* <CJK */
-MAP(0x33, 0x40, 0x57A3) /* <CJK */
-MAP(0x33, 0x41, 0x67FF) /* <CJK */
-MAP(0x33, 0x42, 0x86CE) /* <CJK */
-MAP(0x33, 0x43, 0x920E) /* <CJK */
-MAP(0x33, 0x44, 0x5283) /* <CJK */
-MAP(0x33, 0x45, 0x5687) /* <CJK */
-MAP(0x33, 0x46, 0x5404) /* <CJK */
-MAP(0x33, 0x47, 0x5ED3) /* <CJK */
-MAP(0x33, 0x48, 0x62E1) /* <CJK */
-MAP(0x33, 0x49, 0x64B9) /* <CJK */
-MAP(0x33, 0x4A, 0x683C) /* <CJK */
-MAP(0x33, 0x4B, 0x6838) /* <CJK */
-MAP(0x33, 0x4C, 0x6BBB) /* <CJK */
-MAP(0x33, 0x4D, 0x7372) /* <CJK */
-MAP(0x33, 0x4E, 0x78BA) /* <CJK */
-MAP(0x33, 0x4F, 0x7A6B) /* <CJK */
-MAP(0x33, 0x50, 0x899A) /* <CJK */
-MAP(0x33, 0x51, 0x89D2) /* <CJK */
-MAP(0x33, 0x52, 0x8D6B) /* <CJK */
-MAP(0x33, 0x53, 0x8F03) /* <CJK */
-MAP(0x33, 0x54, 0x90ED) /* <CJK */
-MAP(0x33, 0x55, 0x95A3) /* <CJK */
-MAP(0x33, 0x56, 0x9694) /* <CJK */
-MAP(0x33, 0x57, 0x9769) /* <CJK */
-MAP(0x33, 0x58, 0x5B66) /* <CJK */
-MAP(0x33, 0x59, 0x5CB3) /* <CJK */
-MAP(0x33, 0x5A, 0x697D) /* <CJK */
-MAP(0x33, 0x5B, 0x984D) /* <CJK */
-MAP(0x33, 0x5C, 0x984E) /* <CJK */
-MAP(0x33, 0x5D, 0x639B) /* <CJK */
-MAP(0x33, 0x5E, 0x7B20) /* <CJK */
-MAP(0x33, 0x5F, 0x6A2B) /* <CJK */
-MAP(0x33, 0x60, 0x6A7F) /* <CJK */
-MAP(0x33, 0x61, 0x68B6) /* <CJK */
-MAP(0x33, 0x62, 0x9C0D) /* <CJK */
-MAP(0x33, 0x63, 0x6F5F) /* <CJK */
-MAP(0x33, 0x64, 0x5272) /* <CJK */
-MAP(0x33, 0x65, 0x559D) /* <CJK */
-MAP(0x33, 0x66, 0x6070) /* <CJK */
-MAP(0x33, 0x67, 0x62EC) /* <CJK */
-MAP(0x33, 0x68, 0x6D3B) /* <CJK */
-MAP(0x33, 0x69, 0x6E07) /* <CJK */
-MAP(0x33, 0x6A, 0x6ED1) /* <CJK */
-MAP(0x33, 0x6B, 0x845B) /* <CJK */
-MAP(0x33, 0x6C, 0x8910) /* <CJK */
-MAP(0x33, 0x6D, 0x8F44) /* <CJK */
-MAP(0x33, 0x6E, 0x4E14) /* <CJK */
-MAP(0x33, 0x6F, 0x9C39) /* <CJK */
-MAP(0x33, 0x70, 0x53F6) /* <CJK */
-MAP(0x33, 0x71, 0x691B) /* <CJK */
-MAP(0x33, 0x72, 0x6A3A) /* <CJK */
-MAP(0x33, 0x73, 0x9784) /* <CJK */
-MAP(0x33, 0x74, 0x682A) /* <CJK */
-MAP(0x33, 0x75, 0x515C) /* <CJK */
-MAP(0x33, 0x76, 0x7AC3) /* <CJK */
-MAP(0x33, 0x77, 0x84B2) /* <CJK */
-MAP(0x33, 0x78, 0x91DC) /* <CJK */
-MAP(0x33, 0x79, 0x938C) /* <CJK */
-MAP(0x33, 0x7A, 0x565B) /* <CJK */
-MAP(0x33, 0x7B, 0x9D28) /* <CJK */
-MAP(0x33, 0x7C, 0x6822) /* <CJK */
-MAP(0x33, 0x7D, 0x8305) /* <CJK */
-MAP(0x33, 0x7E, 0x8431) /* <CJK */
-MAP(0x34, 0x21, 0x7CA5) /* <CJK */
-MAP(0x34, 0x22, 0x5208) /* <CJK */
-MAP(0x34, 0x23, 0x82C5) /* <CJK */
-MAP(0x34, 0x24, 0x74E6) /* <CJK */
-MAP(0x34, 0x25, 0x4E7E) /* <CJK */
-MAP(0x34, 0x26, 0x4F83) /* <CJK */
-MAP(0x34, 0x27, 0x51A0) /* <CJK */
-MAP(0x34, 0x28, 0x5BD2) /* <CJK */
-MAP(0x34, 0x29, 0x520A) /* <CJK */
-MAP(0x34, 0x2A, 0x52D8) /* <CJK */
-MAP(0x34, 0x2B, 0x52E7) /* <CJK */
-MAP(0x34, 0x2C, 0x5DFB) /* <CJK */
-MAP(0x34, 0x2D, 0x559A) /* <CJK */
-MAP(0x34, 0x2E, 0x582A) /* <CJK */
-MAP(0x34, 0x2F, 0x59E6) /* <CJK */
-MAP(0x34, 0x30, 0x5B8C) /* <CJK */
-MAP(0x34, 0x31, 0x5B98) /* <CJK */
-MAP(0x34, 0x32, 0x5BDB) /* <CJK */
-MAP(0x34, 0x33, 0x5E72) /* <CJK */
-MAP(0x34, 0x34, 0x5E79) /* <CJK */
-MAP(0x34, 0x35, 0x60A3) /* <CJK */
-MAP(0x34, 0x36, 0x611F) /* <CJK */
-MAP(0x34, 0x37, 0x6163) /* <CJK */
-MAP(0x34, 0x38, 0x61BE) /* <CJK */
-MAP(0x34, 0x39, 0x63DB) /* <CJK */
-MAP(0x34, 0x3A, 0x6562) /* <CJK */
-MAP(0x34, 0x3B, 0x67D1) /* <CJK */
-MAP(0x34, 0x3C, 0x6853) /* <CJK */
-MAP(0x34, 0x3D, 0x68FA) /* <CJK */
-MAP(0x34, 0x3E, 0x6B3E) /* <CJK */
-MAP(0x34, 0x3F, 0x6B53) /* <CJK */
-MAP(0x34, 0x40, 0x6C57) /* <CJK */
-MAP(0x34, 0x41, 0x6F22) /* <CJK */
-MAP(0x34, 0x42, 0x6F97) /* <CJK */
-MAP(0x34, 0x43, 0x6F45) /* <CJK */
-MAP(0x34, 0x44, 0x74B0) /* <CJK */
-MAP(0x34, 0x45, 0x7518) /* <CJK */
-MAP(0x34, 0x46, 0x76E3) /* <CJK */
-MAP(0x34, 0x47, 0x770B) /* <CJK */
-MAP(0x34, 0x48, 0x7AFF) /* <CJK */
-MAP(0x34, 0x49, 0x7BA1) /* <CJK */
-MAP(0x34, 0x4A, 0x7C21) /* <CJK */
-MAP(0x34, 0x4B, 0x7DE9) /* <CJK */
-MAP(0x34, 0x4C, 0x7F36) /* <CJK */
-MAP(0x34, 0x4D, 0x7FF0) /* <CJK */
-MAP(0x34, 0x4E, 0x809D) /* <CJK */
-MAP(0x34, 0x4F, 0x8266) /* <CJK */
-MAP(0x34, 0x50, 0x839E) /* <CJK */
-MAP(0x34, 0x51, 0x89B3) /* <CJK */
-MAP(0x34, 0x52, 0x8ACC) /* <CJK */
-MAP(0x34, 0x53, 0x8CAB) /* <CJK */
-MAP(0x34, 0x54, 0x9084) /* <CJK */
-MAP(0x34, 0x55, 0x9451) /* <CJK */
-MAP(0x34, 0x56, 0x9593) /* <CJK */
-MAP(0x34, 0x57, 0x9591) /* <CJK */
-MAP(0x34, 0x58, 0x95A2) /* <CJK */
-MAP(0x34, 0x59, 0x9665) /* <CJK */
-MAP(0x34, 0x5A, 0x97D3) /* <CJK */
-MAP(0x34, 0x5B, 0x9928) /* <CJK */
-MAP(0x34, 0x5C, 0x8218) /* <CJK */
-MAP(0x34, 0x5D, 0x4E38) /* <CJK */
-MAP(0x34, 0x5E, 0x542B) /* <CJK */
-MAP(0x34, 0x5F, 0x5CB8) /* <CJK */
-MAP(0x34, 0x60, 0x5DCC) /* <CJK */
-MAP(0x34, 0x61, 0x73A9) /* <CJK */
-MAP(0x34, 0x62, 0x764C) /* <CJK */
-MAP(0x34, 0x63, 0x773C) /* <CJK */
-MAP(0x34, 0x64, 0x5CA9) /* <CJK */
-MAP(0x34, 0x65, 0x7FEB) /* <CJK */
-MAP(0x34, 0x66, 0x8D0B) /* <CJK */
-MAP(0x34, 0x67, 0x96C1) /* <CJK */
-MAP(0x34, 0x68, 0x9811) /* <CJK */
-MAP(0x34, 0x69, 0x9854) /* <CJK */
-MAP(0x34, 0x6A, 0x9858) /* <CJK */
-MAP(0x34, 0x6B, 0x4F01) /* <CJK */
-MAP(0x34, 0x6C, 0x4F0E) /* <CJK */
-MAP(0x34, 0x6D, 0x5371) /* <CJK */
-MAP(0x34, 0x6E, 0x559C) /* <CJK */
-MAP(0x34, 0x6F, 0x5668) /* <CJK */
-MAP(0x34, 0x70, 0x57FA) /* <CJK */
-MAP(0x34, 0x71, 0x5947) /* <CJK */
-MAP(0x34, 0x72, 0x5B09) /* <CJK */
-MAP(0x34, 0x73, 0x5BC4) /* <CJK */
-MAP(0x34, 0x74, 0x5C90) /* <CJK */
-MAP(0x34, 0x75, 0x5E0C) /* <CJK */
-MAP(0x34, 0x76, 0x5E7E) /* <CJK */
-MAP(0x34, 0x77, 0x5FCC) /* <CJK */
-MAP(0x34, 0x78, 0x63EE) /* <CJK */
-MAP(0x34, 0x79, 0x673A) /* <CJK */
-MAP(0x34, 0x7A, 0x65D7) /* <CJK */
-MAP(0x34, 0x7B, 0x65E2) /* <CJK */
-MAP(0x34, 0x7C, 0x671F) /* <CJK */
-MAP(0x34, 0x7D, 0x68CB) /* <CJK */
-MAP(0x34, 0x7E, 0x68C4) /* <CJK */
-MAP(0x35, 0x21, 0x6A5F) /* <CJK */
-MAP(0x35, 0x22, 0x5E30) /* <CJK */
-MAP(0x35, 0x23, 0x6BC5) /* <CJK */
-MAP(0x35, 0x24, 0x6C17) /* <CJK */
-MAP(0x35, 0x25, 0x6C7D) /* <CJK */
-MAP(0x35, 0x26, 0x757F) /* <CJK */
-MAP(0x35, 0x27, 0x7948) /* <CJK */
-MAP(0x35, 0x28, 0x5B63) /* <CJK */
-MAP(0x35, 0x29, 0x7A00) /* <CJK */
-MAP(0x35, 0x2A, 0x7D00) /* <CJK */
-MAP(0x35, 0x2B, 0x5FBD) /* <CJK */
-MAP(0x35, 0x2C, 0x898F) /* <CJK */
-MAP(0x35, 0x2D, 0x8A18) /* <CJK */
-MAP(0x35, 0x2E, 0x8CB4) /* <CJK */
-MAP(0x35, 0x2F, 0x8D77) /* <CJK */
-MAP(0x35, 0x30, 0x8ECC) /* <CJK */
-MAP(0x35, 0x31, 0x8F1D) /* <CJK */
-MAP(0x35, 0x32, 0x98E2) /* <CJK */
-MAP(0x35, 0x33, 0x9A0E) /* <CJK */
-MAP(0x35, 0x34, 0x9B3C) /* <CJK */
-MAP(0x35, 0x35, 0x4E80) /* <CJK */
-MAP(0x35, 0x36, 0x507D) /* <CJK */
-MAP(0x35, 0x37, 0x5100) /* <CJK */
-MAP(0x35, 0x38, 0x5993) /* <CJK */
-MAP(0x35, 0x39, 0x5B9C) /* <CJK */
-MAP(0x35, 0x3A, 0x622F) /* <CJK */
-MAP(0x35, 0x3B, 0x6280) /* <CJK */
-MAP(0x35, 0x3C, 0x64EC) /* <CJK */
-MAP(0x35, 0x3D, 0x6B3A) /* <CJK */
-MAP(0x35, 0x3E, 0x72A0) /* <CJK */
-MAP(0x35, 0x3F, 0x7591) /* <CJK */
-MAP(0x35, 0x40, 0x7947) /* <CJK */
-MAP(0x35, 0x41, 0x7FA9) /* <CJK */
-MAP(0x35, 0x42, 0x87FB) /* <CJK */
-MAP(0x35, 0x43, 0x8ABC) /* <CJK */
-MAP(0x35, 0x44, 0x8B70) /* <CJK */
-MAP(0x35, 0x45, 0x63AC) /* <CJK */
-MAP(0x35, 0x46, 0x83CA) /* <CJK */
-MAP(0x35, 0x47, 0x97A0) /* <CJK */
-MAP(0x35, 0x48, 0x5409) /* <CJK */
-MAP(0x35, 0x49, 0x5403) /* <CJK */
-MAP(0x35, 0x4A, 0x55AB) /* <CJK */
-MAP(0x35, 0x4B, 0x6854) /* <CJK */
-MAP(0x35, 0x4C, 0x6A58) /* <CJK */
-MAP(0x35, 0x4D, 0x8A70) /* <CJK */
-MAP(0x35, 0x4E, 0x7827) /* <CJK */
-MAP(0x35, 0x4F, 0x6775) /* <CJK */
-MAP(0x35, 0x50, 0x9ECD) /* <CJK */
-MAP(0x35, 0x51, 0x5374) /* <CJK */
-MAP(0x35, 0x52, 0x5BA2) /* <CJK */
-MAP(0x35, 0x53, 0x811A) /* <CJK */
-MAP(0x35, 0x54, 0x8650) /* <CJK */
-MAP(0x35, 0x55, 0x9006) /* <CJK */
-MAP(0x35, 0x56, 0x4E18) /* <CJK */
-MAP(0x35, 0x57, 0x4E45) /* <CJK */
-MAP(0x35, 0x58, 0x4EC7) /* <CJK */
-MAP(0x35, 0x59, 0x4F11) /* <CJK */
-MAP(0x35, 0x5A, 0x53CA) /* <CJK */
-MAP(0x35, 0x5B, 0x5438) /* <CJK */
-MAP(0x35, 0x5C, 0x5BAE) /* <CJK */
-MAP(0x35, 0x5D, 0x5F13) /* <CJK */
-MAP(0x35, 0x5E, 0x6025) /* <CJK */
-MAP(0x35, 0x5F, 0x6551) /* <CJK */
-MAP(0x35, 0x60, 0x673D) /* <CJK */
-MAP(0x35, 0x61, 0x6C42) /* <CJK */
-MAP(0x35, 0x62, 0x6C72) /* <CJK */
-MAP(0x35, 0x63, 0x6CE3) /* <CJK */
-MAP(0x35, 0x64, 0x7078) /* <CJK */
-MAP(0x35, 0x65, 0x7403) /* <CJK */
-MAP(0x35, 0x66, 0x7A76) /* <CJK */
-MAP(0x35, 0x67, 0x7AAE) /* <CJK */
-MAP(0x35, 0x68, 0x7B08) /* <CJK */
-MAP(0x35, 0x69, 0x7D1A) /* <CJK */
-MAP(0x35, 0x6A, 0x7CFE) /* <CJK */
-MAP(0x35, 0x6B, 0x7D66) /* <CJK */
-MAP(0x35, 0x6C, 0x65E7) /* <CJK */
-MAP(0x35, 0x6D, 0x725B) /* <CJK */
-MAP(0x35, 0x6E, 0x53BB) /* <CJK */
-MAP(0x35, 0x6F, 0x5C45) /* <CJK */
-MAP(0x35, 0x70, 0x5DE8) /* <CJK */
-MAP(0x35, 0x71, 0x62D2) /* <CJK */
-MAP(0x35, 0x72, 0x62E0) /* <CJK */
-MAP(0x35, 0x73, 0x6319) /* <CJK */
-MAP(0x35, 0x74, 0x6E20) /* <CJK */
-MAP(0x35, 0x75, 0x865A) /* <CJK */
-MAP(0x35, 0x76, 0x8A31) /* <CJK */
-MAP(0x35, 0x77, 0x8DDD) /* <CJK */
-MAP(0x35, 0x78, 0x92F8) /* <CJK */
-MAP(0x35, 0x79, 0x6F01) /* <CJK */
-MAP(0x35, 0x7A, 0x79A6) /* <CJK */
-MAP(0x35, 0x7B, 0x9B5A) /* <CJK */
-MAP(0x35, 0x7C, 0x4EA8) /* <CJK */
-MAP(0x35, 0x7D, 0x4EAB) /* <CJK */
-MAP(0x35, 0x7E, 0x4EAC) /* <CJK */
-MAP(0x36, 0x21, 0x4F9B) /* <CJK */
-MAP(0x36, 0x22, 0x4FA0) /* <CJK */
-MAP(0x36, 0x23, 0x50D1) /* <CJK */
-MAP(0x36, 0x24, 0x5147) /* <CJK */
-MAP(0x36, 0x25, 0x7AF6) /* <CJK */
-MAP(0x36, 0x26, 0x5171) /* <CJK */
-MAP(0x36, 0x27, 0x51F6) /* <CJK */
-MAP(0x36, 0x28, 0x5354) /* <CJK */
-MAP(0x36, 0x29, 0x5321) /* <CJK */
-MAP(0x36, 0x2A, 0x537F) /* <CJK */
-MAP(0x36, 0x2B, 0x53EB) /* <CJK */
-MAP(0x36, 0x2C, 0x55AC) /* <CJK */
-MAP(0x36, 0x2D, 0x5883) /* <CJK */
-MAP(0x36, 0x2E, 0x5CE1) /* <CJK */
-MAP(0x36, 0x2F, 0x5F37) /* <CJK */
-MAP(0x36, 0x30, 0x5F4A) /* <CJK */
-MAP(0x36, 0x31, 0x602F) /* <CJK */
-MAP(0x36, 0x32, 0x6050) /* <CJK */
-MAP(0x36, 0x33, 0x606D) /* <CJK */
-MAP(0x36, 0x34, 0x631F) /* <CJK */
-MAP(0x36, 0x35, 0x6559) /* <CJK */
-MAP(0x36, 0x36, 0x6A4B) /* <CJK */
-MAP(0x36, 0x37, 0x6CC1) /* <CJK */
-MAP(0x36, 0x38, 0x72C2) /* <CJK */
-MAP(0x36, 0x39, 0x72ED) /* <CJK */
-MAP(0x36, 0x3A, 0x77EF) /* <CJK */
-MAP(0x36, 0x3B, 0x80F8) /* <CJK */
-MAP(0x36, 0x3C, 0x8105) /* <CJK */
-MAP(0x36, 0x3D, 0x8208) /* <CJK */
-MAP(0x36, 0x3E, 0x854E) /* <CJK */
-MAP(0x36, 0x3F, 0x90F7) /* <CJK */
-MAP(0x36, 0x40, 0x93E1) /* <CJK */
-MAP(0x36, 0x41, 0x97FF) /* <CJK */
-MAP(0x36, 0x42, 0x9957) /* <CJK */
-MAP(0x36, 0x43, 0x9A5A) /* <CJK */
-MAP(0x36, 0x44, 0x4EF0) /* <CJK */
-MAP(0x36, 0x45, 0x51DD) /* <CJK */
-MAP(0x36, 0x46, 0x5C2D) /* <CJK */
-MAP(0x36, 0x47, 0x6681) /* <CJK */
-MAP(0x36, 0x48, 0x696D) /* <CJK */
-MAP(0x36, 0x49, 0x5C40) /* <CJK */
-MAP(0x36, 0x4A, 0x66F2) /* <CJK */
-MAP(0x36, 0x4B, 0x6975) /* <CJK */
-MAP(0x36, 0x4C, 0x7389) /* <CJK */
-MAP(0x36, 0x4D, 0x6850) /* <CJK */
-MAP(0x36, 0x4E, 0x7C81) /* <CJK */
-MAP(0x36, 0x4F, 0x50C5) /* <CJK */
-MAP(0x36, 0x50, 0x52E4) /* <CJK */
-MAP(0x36, 0x51, 0x5747) /* <CJK */
-MAP(0x36, 0x52, 0x5DFE) /* <CJK */
-MAP(0x36, 0x53, 0x9326) /* <CJK */
-MAP(0x36, 0x54, 0x65A4) /* <CJK */
-MAP(0x36, 0x55, 0x6B23) /* <CJK */
-MAP(0x36, 0x56, 0x6B3D) /* <CJK */
-MAP(0x36, 0x57, 0x7434) /* <CJK */
-MAP(0x36, 0x58, 0x7981) /* <CJK */
-MAP(0x36, 0x59, 0x79BD) /* <CJK */
-MAP(0x36, 0x5A, 0x7B4B) /* <CJK */
-MAP(0x36, 0x5B, 0x7DCA) /* <CJK */
-MAP(0x36, 0x5C, 0x82B9) /* <CJK */
-MAP(0x36, 0x5D, 0x83CC) /* <CJK */
-MAP(0x36, 0x5E, 0x887F) /* <CJK */
-MAP(0x36, 0x5F, 0x895F) /* <CJK */
-MAP(0x36, 0x60, 0x8B39) /* <CJK */
-MAP(0x36, 0x61, 0x8FD1) /* <CJK */
-MAP(0x36, 0x62, 0x91D1) /* <CJK */
-MAP(0x36, 0x63, 0x541F) /* <CJK */
-MAP(0x36, 0x64, 0x9280) /* <CJK */
-MAP(0x36, 0x65, 0x4E5D) /* <CJK */
-MAP(0x36, 0x66, 0x5036) /* <CJK */
-MAP(0x36, 0x67, 0x53E5) /* <CJK */
-MAP(0x36, 0x68, 0x533A) /* <CJK */
-MAP(0x36, 0x69, 0x72D7) /* <CJK */
-MAP(0x36, 0x6A, 0x7396) /* <CJK */
-MAP(0x36, 0x6B, 0x77E9) /* <CJK */
-MAP(0x36, 0x6C, 0x82E6) /* <CJK */
-MAP(0x36, 0x6D, 0x8EAF) /* <CJK */
-MAP(0x36, 0x6E, 0x99C6) /* <CJK */
-MAP(0x36, 0x6F, 0x99C8) /* <CJK */
-MAP(0x36, 0x70, 0x99D2) /* <CJK */
-MAP(0x36, 0x71, 0x5177) /* <CJK */
-MAP(0x36, 0x72, 0x611A) /* <CJK */
-MAP(0x36, 0x73, 0x865E) /* <CJK */
-MAP(0x36, 0x74, 0x55B0) /* <CJK */
-MAP(0x36, 0x75, 0x7A7A) /* <CJK */
-MAP(0x36, 0x76, 0x5076) /* <CJK */
-MAP(0x36, 0x77, 0x5BD3) /* <CJK */
-MAP(0x36, 0x78, 0x9047) /* <CJK */
-MAP(0x36, 0x79, 0x9685) /* <CJK */
-MAP(0x36, 0x7A, 0x4E32) /* <CJK */
-MAP(0x36, 0x7B, 0x6ADB) /* <CJK */
-MAP(0x36, 0x7C, 0x91E7) /* <CJK */
-MAP(0x36, 0x7D, 0x5C51) /* <CJK */
-MAP(0x36, 0x7E, 0x5C48) /* <CJK */
-MAP(0x37, 0x21, 0x6398) /* <CJK */
-MAP(0x37, 0x22, 0x7A9F) /* <CJK */
-MAP(0x37, 0x23, 0x6C93) /* <CJK */
-MAP(0x37, 0x24, 0x9774) /* <CJK */
-MAP(0x37, 0x25, 0x8F61) /* <CJK */
-MAP(0x37, 0x26, 0x7AAA) /* <CJK */
-MAP(0x37, 0x27, 0x718A) /* <CJK */
-MAP(0x37, 0x28, 0x9688) /* <CJK */
-MAP(0x37, 0x29, 0x7C82) /* <CJK */
-MAP(0x37, 0x2A, 0x6817) /* <CJK */
-MAP(0x37, 0x2B, 0x7E70) /* <CJK */
-MAP(0x37, 0x2C, 0x6851) /* <CJK */
-MAP(0x37, 0x2D, 0x936C) /* <CJK */
-MAP(0x37, 0x2E, 0x52F2) /* <CJK */
-MAP(0x37, 0x2F, 0x541B) /* <CJK */
-MAP(0x37, 0x30, 0x85AB) /* <CJK */
-MAP(0x37, 0x31, 0x8A13) /* <CJK */
-MAP(0x37, 0x32, 0x7FA4) /* <CJK */
-MAP(0x37, 0x33, 0x8ECD) /* <CJK */
-MAP(0x37, 0x34, 0x90E1) /* <CJK */
-MAP(0x37, 0x35, 0x5366) /* <CJK */
-MAP(0x37, 0x36, 0x8888) /* <CJK */
-MAP(0x37, 0x37, 0x7941) /* <CJK */
-MAP(0x37, 0x38, 0x4FC2) /* <CJK */
-MAP(0x37, 0x39, 0x50BE) /* <CJK */
-MAP(0x37, 0x3A, 0x5211) /* <CJK */
-MAP(0x37, 0x3B, 0x5144) /* <CJK */
-MAP(0x37, 0x3C, 0x5553) /* <CJK */
-MAP(0x37, 0x3D, 0x572D) /* <CJK */
-MAP(0x37, 0x3E, 0x73EA) /* <CJK */
-MAP(0x37, 0x3F, 0x578B) /* <CJK */
-MAP(0x37, 0x40, 0x5951) /* <CJK */
-MAP(0x37, 0x41, 0x5F62) /* <CJK */
-MAP(0x37, 0x42, 0x5F84) /* <CJK */
-MAP(0x37, 0x43, 0x6075) /* <CJK */
-MAP(0x37, 0x44, 0x6176) /* <CJK */
-MAP(0x37, 0x45, 0x6167) /* <CJK */
-MAP(0x37, 0x46, 0x61A9) /* <CJK */
-MAP(0x37, 0x47, 0x63B2) /* <CJK */
-MAP(0x37, 0x48, 0x643A) /* <CJK */
-MAP(0x37, 0x49, 0x656C) /* <CJK */
-MAP(0x37, 0x4A, 0x666F) /* <CJK */
-MAP(0x37, 0x4B, 0x6842) /* <CJK */
-MAP(0x37, 0x4C, 0x6E13) /* <CJK */
-MAP(0x37, 0x4D, 0x7566) /* <CJK */
-MAP(0x37, 0x4E, 0x7A3D) /* <CJK */
-MAP(0x37, 0x4F, 0x7CFB) /* <CJK */
-MAP(0x37, 0x50, 0x7D4C) /* <CJK */
-MAP(0x37, 0x51, 0x7D99) /* <CJK */
-MAP(0x37, 0x52, 0x7E4B) /* <CJK */
-MAP(0x37, 0x53, 0x7F6B) /* <CJK */
-MAP(0x37, 0x54, 0x830E) /* <CJK */
-MAP(0x37, 0x55, 0x834A) /* <CJK */
-MAP(0x37, 0x56, 0x86CD) /* <CJK */
-MAP(0x37, 0x57, 0x8A08) /* <CJK */
-MAP(0x37, 0x58, 0x8A63) /* <CJK */
-MAP(0x37, 0x59, 0x8B66) /* <CJK */
-MAP(0x37, 0x5A, 0x8EFD) /* <CJK */
-MAP(0x37, 0x5B, 0x981A) /* <CJK */
-MAP(0x37, 0x5C, 0x9D8F) /* <CJK */
-MAP(0x37, 0x5D, 0x82B8) /* <CJK */
-MAP(0x37, 0x5E, 0x8FCE) /* <CJK */
-MAP(0x37, 0x5F, 0x9BE8) /* <CJK */
-MAP(0x37, 0x60, 0x5287) /* <CJK */
-MAP(0x37, 0x61, 0x621F) /* <CJK */
-MAP(0x37, 0x62, 0x6483) /* <CJK */
-MAP(0x37, 0x63, 0x6FC0) /* <CJK */
-MAP(0x37, 0x64, 0x9699) /* <CJK */
-MAP(0x37, 0x65, 0x6841) /* <CJK */
-MAP(0x37, 0x66, 0x5091) /* <CJK */
-MAP(0x37, 0x67, 0x6B20) /* <CJK */
-MAP(0x37, 0x68, 0x6C7A) /* <CJK */
-MAP(0x37, 0x69, 0x6F54) /* <CJK */
-MAP(0x37, 0x6A, 0x7A74) /* <CJK */
-MAP(0x37, 0x6B, 0x7D50) /* <CJK */
-MAP(0x37, 0x6C, 0x8840) /* <CJK */
-MAP(0x37, 0x6D, 0x8A23) /* <CJK */
-MAP(0x37, 0x6E, 0x6708) /* <CJK */
-MAP(0x37, 0x6F, 0x4EF6) /* <CJK */
-MAP(0x37, 0x70, 0x5039) /* <CJK */
-MAP(0x37, 0x71, 0x5026) /* <CJK */
-MAP(0x37, 0x72, 0x5065) /* <CJK */
-MAP(0x37, 0x73, 0x517C) /* <CJK */
-MAP(0x37, 0x74, 0x5238) /* <CJK */
-MAP(0x37, 0x75, 0x5263) /* <CJK */
-MAP(0x37, 0x76, 0x55A7) /* <CJK */
-MAP(0x37, 0x77, 0x570F) /* <CJK */
-MAP(0x37, 0x78, 0x5805) /* <CJK */
-MAP(0x37, 0x79, 0x5ACC) /* <CJK */
-MAP(0x37, 0x7A, 0x5EFA) /* <CJK */
-MAP(0x37, 0x7B, 0x61B2) /* <CJK */
-MAP(0x37, 0x7C, 0x61F8) /* <CJK */
-MAP(0x37, 0x7D, 0x62F3) /* <CJK */
-MAP(0x37, 0x7E, 0x6372) /* <CJK */
-MAP(0x38, 0x21, 0x691C) /* <CJK */
-MAP(0x38, 0x22, 0x6A29) /* <CJK */
-MAP(0x38, 0x23, 0x727D) /* <CJK */
-MAP(0x38, 0x24, 0x72AC) /* <CJK */
-MAP(0x38, 0x25, 0x732E) /* <CJK */
-MAP(0x38, 0x26, 0x7814) /* <CJK */
-MAP(0x38, 0x27, 0x786F) /* <CJK */
-MAP(0x38, 0x28, 0x7D79) /* <CJK */
-MAP(0x38, 0x29, 0x770C) /* <CJK */
-MAP(0x38, 0x2A, 0x80A9) /* <CJK */
-MAP(0x38, 0x2B, 0x898B) /* <CJK */
-MAP(0x38, 0x2C, 0x8B19) /* <CJK */
-MAP(0x38, 0x2D, 0x8CE2) /* <CJK */
-MAP(0x38, 0x2E, 0x8ED2) /* <CJK */
-MAP(0x38, 0x2F, 0x9063) /* <CJK */
-MAP(0x38, 0x30, 0x9375) /* <CJK */
-MAP(0x38, 0x31, 0x967A) /* <CJK */
-MAP(0x38, 0x32, 0x9855) /* <CJK */
-MAP(0x38, 0x33, 0x9A13) /* <CJK */
-MAP(0x38, 0x34, 0x9E78) /* <CJK */
-MAP(0x38, 0x35, 0x5143) /* <CJK */
-MAP(0x38, 0x36, 0x539F) /* <CJK */
-MAP(0x38, 0x37, 0x53B3) /* <CJK */
-MAP(0x38, 0x38, 0x5E7B) /* <CJK */
-MAP(0x38, 0x39, 0x5F26) /* <CJK */
-MAP(0x38, 0x3A, 0x6E1B) /* <CJK */
-MAP(0x38, 0x3B, 0x6E90) /* <CJK */
-MAP(0x38, 0x3C, 0x7384) /* <CJK */
-MAP(0x38, 0x3D, 0x73FE) /* <CJK */
-MAP(0x38, 0x3E, 0x7D43) /* <CJK */
-MAP(0x38, 0x3F, 0x8237) /* <CJK */
-MAP(0x38, 0x40, 0x8A00) /* <CJK */
-MAP(0x38, 0x41, 0x8AFA) /* <CJK */
-MAP(0x38, 0x42, 0x9650) /* <CJK */
-MAP(0x38, 0x43, 0x4E4E) /* <CJK */
-MAP(0x38, 0x44, 0x500B) /* <CJK */
-MAP(0x38, 0x45, 0x53E4) /* <CJK */
-MAP(0x38, 0x46, 0x547C) /* <CJK */
-MAP(0x38, 0x47, 0x56FA) /* <CJK */
-MAP(0x38, 0x48, 0x59D1) /* <CJK */
-MAP(0x38, 0x49, 0x5B64) /* <CJK */
-MAP(0x38, 0x4A, 0x5DF1) /* <CJK */
-MAP(0x38, 0x4B, 0x5EAB) /* <CJK */
-MAP(0x38, 0x4C, 0x5F27) /* <CJK */
-MAP(0x38, 0x4D, 0x6238) /* <CJK */
-MAP(0x38, 0x4E, 0x6545) /* <CJK */
-MAP(0x38, 0x4F, 0x67AF) /* <CJK */
-MAP(0x38, 0x50, 0x6E56) /* <CJK */
-MAP(0x38, 0x51, 0x72D0) /* <CJK */
-MAP(0x38, 0x52, 0x7CCA) /* <CJK */
-MAP(0x38, 0x53, 0x88B4) /* <CJK */
-MAP(0x38, 0x54, 0x80A1) /* <CJK */
-MAP(0x38, 0x55, 0x80E1) /* <CJK */
-MAP(0x38, 0x56, 0x83F0) /* <CJK */
-MAP(0x38, 0x57, 0x864E) /* <CJK */
-MAP(0x38, 0x58, 0x8A87) /* <CJK */
-MAP(0x38, 0x59, 0x8DE8) /* <CJK */
-MAP(0x38, 0x5A, 0x9237) /* <CJK */
-MAP(0x38, 0x5B, 0x96C7) /* <CJK */
-MAP(0x38, 0x5C, 0x9867) /* <CJK */
-MAP(0x38, 0x5D, 0x9F13) /* <CJK */
-MAP(0x38, 0x5E, 0x4E94) /* <CJK */
-MAP(0x38, 0x5F, 0x4E92) /* <CJK */
-MAP(0x38, 0x60, 0x4F0D) /* <CJK */
-MAP(0x38, 0x61, 0x5348) /* <CJK */
-MAP(0x38, 0x62, 0x5449) /* <CJK */
-MAP(0x38, 0x63, 0x543E) /* <CJK */
-MAP(0x38, 0x64, 0x5A2F) /* <CJK */
-MAP(0x38, 0x65, 0x5F8C) /* <CJK */
-MAP(0x38, 0x66, 0x5FA1) /* <CJK */
-MAP(0x38, 0x67, 0x609F) /* <CJK */
-MAP(0x38, 0x68, 0x68A7) /* <CJK */
-MAP(0x38, 0x69, 0x6A8E) /* <CJK */
-MAP(0x38, 0x6A, 0x745A) /* <CJK */
-MAP(0x38, 0x6B, 0x7881) /* <CJK */
-MAP(0x38, 0x6C, 0x8A9E) /* <CJK */
-MAP(0x38, 0x6D, 0x8AA4) /* <CJK */
-MAP(0x38, 0x6E, 0x8B77) /* <CJK */
-MAP(0x38, 0x6F, 0x9190) /* <CJK */
-MAP(0x38, 0x70, 0x4E5E) /* <CJK */
-MAP(0x38, 0x71, 0x9BC9) /* <CJK */
-MAP(0x38, 0x72, 0x4EA4) /* <CJK */
-MAP(0x38, 0x73, 0x4F7C) /* <CJK */
-MAP(0x38, 0x74, 0x4FAF) /* <CJK */
-MAP(0x38, 0x75, 0x5019) /* <CJK */
-MAP(0x38, 0x76, 0x5016) /* <CJK */
-MAP(0x38, 0x77, 0x5149) /* <CJK */
-MAP(0x38, 0x78, 0x516C) /* <CJK */
-MAP(0x38, 0x79, 0x529F) /* <CJK */
-MAP(0x38, 0x7A, 0x52B9) /* <CJK */
-MAP(0x38, 0x7B, 0x52FE) /* <CJK */
-MAP(0x38, 0x7C, 0x539A) /* <CJK */
-MAP(0x38, 0x7D, 0x53E3) /* <CJK */
-MAP(0x38, 0x7E, 0x5411) /* <CJK */
-MAP(0x39, 0x21, 0x540E) /* <CJK */
-MAP(0x39, 0x22, 0x5589) /* <CJK */
-MAP(0x39, 0x23, 0x5751) /* <CJK */
-MAP(0x39, 0x24, 0x57A2) /* <CJK */
-MAP(0x39, 0x25, 0x597D) /* <CJK */
-MAP(0x39, 0x26, 0x5B54) /* <CJK */
-MAP(0x39, 0x27, 0x5B5D) /* <CJK */
-MAP(0x39, 0x28, 0x5B8F) /* <CJK */
-MAP(0x39, 0x29, 0x5DE5) /* <CJK */
-MAP(0x39, 0x2A, 0x5DE7) /* <CJK */
-MAP(0x39, 0x2B, 0x5DF7) /* <CJK */
-MAP(0x39, 0x2C, 0x5E78) /* <CJK */
-MAP(0x39, 0x2D, 0x5E83) /* <CJK */
-MAP(0x39, 0x2E, 0x5E9A) /* <CJK */
-MAP(0x39, 0x2F, 0x5EB7) /* <CJK */
-MAP(0x39, 0x30, 0x5F18) /* <CJK */
-MAP(0x39, 0x31, 0x6052) /* <CJK */
-MAP(0x39, 0x32, 0x614C) /* <CJK */
-MAP(0x39, 0x33, 0x6297) /* <CJK */
-MAP(0x39, 0x34, 0x62D8) /* <CJK */
-MAP(0x39, 0x35, 0x63A7) /* <CJK */
-MAP(0x39, 0x36, 0x653B) /* <CJK */
-MAP(0x39, 0x37, 0x6602) /* <CJK */
-MAP(0x39, 0x38, 0x6643) /* <CJK */
-MAP(0x39, 0x39, 0x66F4) /* <CJK */
-MAP(0x39, 0x3A, 0x676D) /* <CJK */
-MAP(0x39, 0x3B, 0x6821) /* <CJK */
-MAP(0x39, 0x3C, 0x6897) /* <CJK */
-MAP(0x39, 0x3D, 0x69CB) /* <CJK */
-MAP(0x39, 0x3E, 0x6C5F) /* <CJK */
-MAP(0x39, 0x3F, 0x6D2A) /* <CJK */
-MAP(0x39, 0x40, 0x6D69) /* <CJK */
-MAP(0x39, 0x41, 0x6E2F) /* <CJK */
-MAP(0x39, 0x42, 0x6E9D) /* <CJK */
-MAP(0x39, 0x43, 0x7532) /* <CJK */
-MAP(0x39, 0x44, 0x7687) /* <CJK */
-MAP(0x39, 0x45, 0x786C) /* <CJK */
-MAP(0x39, 0x46, 0x7A3F) /* <CJK */
-MAP(0x39, 0x47, 0x7CE0) /* <CJK */
-MAP(0x39, 0x48, 0x7D05) /* <CJK */
-MAP(0x39, 0x49, 0x7D18) /* <CJK */
-MAP(0x39, 0x4A, 0x7D5E) /* <CJK */
-MAP(0x39, 0x4B, 0x7DB1) /* <CJK */
-MAP(0x39, 0x4C, 0x8015) /* <CJK */
-MAP(0x39, 0x4D, 0x8003) /* <CJK */
-MAP(0x39, 0x4E, 0x80AF) /* <CJK */
-MAP(0x39, 0x4F, 0x80B1) /* <CJK */
-MAP(0x39, 0x50, 0x8154) /* <CJK */
-MAP(0x39, 0x51, 0x818F) /* <CJK */
-MAP(0x39, 0x52, 0x822A) /* <CJK */
-MAP(0x39, 0x53, 0x8352) /* <CJK */
-MAP(0x39, 0x54, 0x884C) /* <CJK */
-MAP(0x39, 0x55, 0x8861) /* <CJK */
-MAP(0x39, 0x56, 0x8B1B) /* <CJK */
-MAP(0x39, 0x57, 0x8CA2) /* <CJK */
-MAP(0x39, 0x58, 0x8CFC) /* <CJK */
-MAP(0x39, 0x59, 0x90CA) /* <CJK */
-MAP(0x39, 0x5A, 0x9175) /* <CJK */
-MAP(0x39, 0x5B, 0x9271) /* <CJK */
-MAP(0x39, 0x5C, 0x783F) /* <CJK */
-MAP(0x39, 0x5D, 0x92FC) /* <CJK */
-MAP(0x39, 0x5E, 0x95A4) /* <CJK */
-MAP(0x39, 0x5F, 0x964D) /* <CJK */
-MAP(0x39, 0x60, 0x9805) /* <CJK */
-MAP(0x39, 0x61, 0x9999) /* <CJK */
-MAP(0x39, 0x62, 0x9AD8) /* <CJK */
-MAP(0x39, 0x63, 0x9D3B) /* <CJK */
-MAP(0x39, 0x64, 0x525B) /* <CJK */
-MAP(0x39, 0x65, 0x52AB) /* <CJK */
-MAP(0x39, 0x66, 0x53F7) /* <CJK */
-MAP(0x39, 0x67, 0x5408) /* <CJK */
-MAP(0x39, 0x68, 0x58D5) /* <CJK */
-MAP(0x39, 0x69, 0x62F7) /* <CJK */
-MAP(0x39, 0x6A, 0x6FE0) /* <CJK */
-MAP(0x39, 0x6B, 0x8C6A) /* <CJK */
-MAP(0x39, 0x6C, 0x8F5F) /* <CJK */
-MAP(0x39, 0x6D, 0x9EB9) /* <CJK */
-MAP(0x39, 0x6E, 0x514B) /* <CJK */
-MAP(0x39, 0x6F, 0x523B) /* <CJK */
-MAP(0x39, 0x70, 0x544A) /* <CJK */
-MAP(0x39, 0x71, 0x56FD) /* <CJK */
-MAP(0x39, 0x72, 0x7A40) /* <CJK */
-MAP(0x39, 0x73, 0x9177) /* <CJK */
-MAP(0x39, 0x74, 0x9D60) /* <CJK */
-MAP(0x39, 0x75, 0x9ED2) /* <CJK */
-MAP(0x39, 0x76, 0x7344) /* <CJK */
-MAP(0x39, 0x77, 0x6F09) /* <CJK */
-MAP(0x39, 0x78, 0x8170) /* <CJK */
-MAP(0x39, 0x79, 0x7511) /* <CJK */
-MAP(0x39, 0x7A, 0x5FFD) /* <CJK */
-MAP(0x39, 0x7B, 0x60DA) /* <CJK */
-MAP(0x39, 0x7C, 0x9AA8) /* <CJK */
-MAP(0x39, 0x7D, 0x72DB) /* <CJK */
-MAP(0x39, 0x7E, 0x8FBC) /* <CJK */
-MAP(0x3A, 0x21, 0x6B64) /* <CJK */
-MAP(0x3A, 0x22, 0x9803) /* <CJK */
-MAP(0x3A, 0x23, 0x4ECA) /* <CJK */
-MAP(0x3A, 0x24, 0x56F0) /* <CJK */
-MAP(0x3A, 0x25, 0x5764) /* <CJK */
-MAP(0x3A, 0x26, 0x58BE) /* <CJK */
-MAP(0x3A, 0x27, 0x5A5A) /* <CJK */
-MAP(0x3A, 0x28, 0x6068) /* <CJK */
-MAP(0x3A, 0x29, 0x61C7) /* <CJK */
-MAP(0x3A, 0x2A, 0x660F) /* <CJK */
-MAP(0x3A, 0x2B, 0x6606) /* <CJK */
-MAP(0x3A, 0x2C, 0x6839) /* <CJK */
-MAP(0x3A, 0x2D, 0x68B1) /* <CJK */
-MAP(0x3A, 0x2E, 0x6DF7) /* <CJK */
-MAP(0x3A, 0x2F, 0x75D5) /* <CJK */
-MAP(0x3A, 0x30, 0x7D3A) /* <CJK */
-MAP(0x3A, 0x31, 0x826E) /* <CJK */
-MAP(0x3A, 0x32, 0x9B42) /* <CJK */
-MAP(0x3A, 0x33, 0x4E9B) /* <CJK */
-MAP(0x3A, 0x34, 0x4F50) /* <CJK */
-MAP(0x3A, 0x35, 0x53C9) /* <CJK */
-MAP(0x3A, 0x36, 0x5506) /* <CJK */
-MAP(0x3A, 0x37, 0x5D6F) /* <CJK */
-MAP(0x3A, 0x38, 0x5DE6) /* <CJK */
-MAP(0x3A, 0x39, 0x5DEE) /* <CJK */
-MAP(0x3A, 0x3A, 0x67FB) /* <CJK */
-MAP(0x3A, 0x3B, 0x6C99) /* <CJK */
-MAP(0x3A, 0x3C, 0x7473) /* <CJK */
-MAP(0x3A, 0x3D, 0x7802) /* <CJK */
-MAP(0x3A, 0x3E, 0x8A50) /* <CJK */
-MAP(0x3A, 0x3F, 0x9396) /* <CJK */
-MAP(0x3A, 0x40, 0x88DF) /* <CJK */
-MAP(0x3A, 0x41, 0x5750) /* <CJK */
-MAP(0x3A, 0x42, 0x5EA7) /* <CJK */
-MAP(0x3A, 0x43, 0x632B) /* <CJK */
-MAP(0x3A, 0x44, 0x50B5) /* <CJK */
-MAP(0x3A, 0x45, 0x50AC) /* <CJK */
-MAP(0x3A, 0x46, 0x518D) /* <CJK */
-MAP(0x3A, 0x47, 0x6700) /* <CJK */
-MAP(0x3A, 0x48, 0x54C9) /* <CJK */
-MAP(0x3A, 0x49, 0x585E) /* <CJK */
-MAP(0x3A, 0x4A, 0x59BB) /* <CJK */
-MAP(0x3A, 0x4B, 0x5BB0) /* <CJK */
-MAP(0x3A, 0x4C, 0x5F69) /* <CJK */
-MAP(0x3A, 0x4D, 0x624D) /* <CJK */
-MAP(0x3A, 0x4E, 0x63A1) /* <CJK */
-MAP(0x3A, 0x4F, 0x683D) /* <CJK */
-MAP(0x3A, 0x50, 0x6B73) /* <CJK */
-MAP(0x3A, 0x51, 0x6E08) /* <CJK */
-MAP(0x3A, 0x52, 0x707D) /* <CJK */
-MAP(0x3A, 0x53, 0x91C7) /* <CJK */
-MAP(0x3A, 0x54, 0x7280) /* <CJK */
-MAP(0x3A, 0x55, 0x7815) /* <CJK */
-MAP(0x3A, 0x56, 0x7826) /* <CJK */
-MAP(0x3A, 0x57, 0x796D) /* <CJK */
-MAP(0x3A, 0x58, 0x658E) /* <CJK */
-MAP(0x3A, 0x59, 0x7D30) /* <CJK */
-MAP(0x3A, 0x5A, 0x83DC) /* <CJK */
-MAP(0x3A, 0x5B, 0x88C1) /* <CJK */
-MAP(0x3A, 0x5C, 0x8F09) /* <CJK */
-MAP(0x3A, 0x5D, 0x969B) /* <CJK */
-MAP(0x3A, 0x5E, 0x5264) /* <CJK */
-MAP(0x3A, 0x5F, 0x5728) /* <CJK */
-MAP(0x3A, 0x60, 0x6750) /* <CJK */
-MAP(0x3A, 0x61, 0x7F6A) /* <CJK */
-MAP(0x3A, 0x62, 0x8CA1) /* <CJK */
-MAP(0x3A, 0x63, 0x51B4) /* <CJK */
-MAP(0x3A, 0x64, 0x5742) /* <CJK */
-MAP(0x3A, 0x65, 0x962A) /* <CJK */
-MAP(0x3A, 0x66, 0x583A) /* <CJK */
-MAP(0x3A, 0x67, 0x698A) /* <CJK */
-MAP(0x3A, 0x68, 0x80B4) /* <CJK */
-MAP(0x3A, 0x69, 0x54B2) /* <CJK */
-MAP(0x3A, 0x6A, 0x5D0E) /* <CJK */
-MAP(0x3A, 0x6B, 0x57FC) /* <CJK */
-MAP(0x3A, 0x6C, 0x7895) /* <CJK */
-MAP(0x3A, 0x6D, 0x9DFA) /* <CJK */
-MAP(0x3A, 0x6E, 0x4F5C) /* <CJK */
-MAP(0x3A, 0x6F, 0x524A) /* <CJK */
-MAP(0x3A, 0x70, 0x548B) /* <CJK */
-MAP(0x3A, 0x71, 0x643E) /* <CJK */
-MAP(0x3A, 0x72, 0x6628) /* <CJK */
-MAP(0x3A, 0x73, 0x6714) /* <CJK */
-MAP(0x3A, 0x74, 0x67F5) /* <CJK */
-MAP(0x3A, 0x75, 0x7A84) /* <CJK */
-MAP(0x3A, 0x76, 0x7B56) /* <CJK */
-MAP(0x3A, 0x77, 0x7D22) /* <CJK */
-MAP(0x3A, 0x78, 0x932F) /* <CJK */
-MAP(0x3A, 0x79, 0x685C) /* <CJK */
-MAP(0x3A, 0x7A, 0x9BAD) /* <CJK */
-MAP(0x3A, 0x7B, 0x7B39) /* <CJK */
-MAP(0x3A, 0x7C, 0x5319) /* <CJK */
-MAP(0x3A, 0x7D, 0x518A) /* <CJK */
-MAP(0x3A, 0x7E, 0x5237) /* <CJK */
-MAP(0x3B, 0x21, 0x5BDF) /* <CJK */
-MAP(0x3B, 0x22, 0x62F6) /* <CJK */
-MAP(0x3B, 0x23, 0x64AE) /* <CJK */
-MAP(0x3B, 0x24, 0x64E6) /* <CJK */
-MAP(0x3B, 0x25, 0x672D) /* <CJK */
-MAP(0x3B, 0x26, 0x6BBA) /* <CJK */
-MAP(0x3B, 0x27, 0x85A9) /* <CJK */
-MAP(0x3B, 0x28, 0x96D1) /* <CJK */
-MAP(0x3B, 0x29, 0x7690) /* <CJK */
-MAP(0x3B, 0x2A, 0x9BD6) /* <CJK */
-MAP(0x3B, 0x2B, 0x634C) /* <CJK */
-MAP(0x3B, 0x2C, 0x9306) /* <CJK */
-MAP(0x3B, 0x2D, 0x9BAB) /* <CJK */
-MAP(0x3B, 0x2E, 0x76BF) /* <CJK */
-MAP(0x3B, 0x2F, 0x6652) /* <CJK */
-MAP(0x3B, 0x30, 0x4E09) /* <CJK */
-MAP(0x3B, 0x31, 0x5098) /* <CJK */
-MAP(0x3B, 0x32, 0x53C2) /* <CJK */
-MAP(0x3B, 0x33, 0x5C71) /* <CJK */
-MAP(0x3B, 0x34, 0x60E8) /* <CJK */
-MAP(0x3B, 0x35, 0x6492) /* <CJK */
-MAP(0x3B, 0x36, 0x6563) /* <CJK */
-MAP(0x3B, 0x37, 0x685F) /* <CJK */
-MAP(0x3B, 0x38, 0x71E6) /* <CJK */
-MAP(0x3B, 0x39, 0x73CA) /* <CJK */
-MAP(0x3B, 0x3A, 0x7523) /* <CJK */
-MAP(0x3B, 0x3B, 0x7B97) /* <CJK */
-MAP(0x3B, 0x3C, 0x7E82) /* <CJK */
-MAP(0x3B, 0x3D, 0x8695) /* <CJK */
-MAP(0x3B, 0x3E, 0x8B83) /* <CJK */
-MAP(0x3B, 0x3F, 0x8CDB) /* <CJK */
-MAP(0x3B, 0x40, 0x9178) /* <CJK */
-MAP(0x3B, 0x41, 0x9910) /* <CJK */
-MAP(0x3B, 0x42, 0x65AC) /* <CJK */
-MAP(0x3B, 0x43, 0x66AB) /* <CJK */
-MAP(0x3B, 0x44, 0x6B8B) /* <CJK */
-MAP(0x3B, 0x45, 0x4ED5) /* <CJK */
-MAP(0x3B, 0x46, 0x4ED4) /* <CJK */
-MAP(0x3B, 0x47, 0x4F3A) /* <CJK */
-MAP(0x3B, 0x48, 0x4F7F) /* <CJK */
-MAP(0x3B, 0x49, 0x523A) /* <CJK */
-MAP(0x3B, 0x4A, 0x53F8) /* <CJK */
-MAP(0x3B, 0x4B, 0x53F2) /* <CJK */
-MAP(0x3B, 0x4C, 0x55E3) /* <CJK */
-MAP(0x3B, 0x4D, 0x56DB) /* <CJK */
-MAP(0x3B, 0x4E, 0x58EB) /* <CJK */
-MAP(0x3B, 0x4F, 0x59CB) /* <CJK */
-MAP(0x3B, 0x50, 0x59C9) /* <CJK */
-MAP(0x3B, 0x51, 0x59FF) /* <CJK */
-MAP(0x3B, 0x52, 0x5B50) /* <CJK */
-MAP(0x3B, 0x53, 0x5C4D) /* <CJK */
-MAP(0x3B, 0x54, 0x5E02) /* <CJK */
-MAP(0x3B, 0x55, 0x5E2B) /* <CJK */
-MAP(0x3B, 0x56, 0x5FD7) /* <CJK */
-MAP(0x3B, 0x57, 0x601D) /* <CJK */
-MAP(0x3B, 0x58, 0x6307) /* <CJK */
-MAP(0x3B, 0x59, 0x652F) /* <CJK */
-MAP(0x3B, 0x5A, 0x5B5C) /* <CJK */
-MAP(0x3B, 0x5B, 0x65AF) /* <CJK */
-MAP(0x3B, 0x5C, 0x65BD) /* <CJK */
-MAP(0x3B, 0x5D, 0x65E8) /* <CJK */
-MAP(0x3B, 0x5E, 0x679D) /* <CJK */
-MAP(0x3B, 0x5F, 0x6B62) /* <CJK */
-MAP(0x3B, 0x60, 0x6B7B) /* <CJK */
-MAP(0x3B, 0x61, 0x6C0F) /* <CJK */
-MAP(0x3B, 0x62, 0x7345) /* <CJK */
-MAP(0x3B, 0x63, 0x7949) /* <CJK */
-MAP(0x3B, 0x64, 0x79C1) /* <CJK */
-MAP(0x3B, 0x65, 0x7CF8) /* <CJK */
-MAP(0x3B, 0x66, 0x7D19) /* <CJK */
-MAP(0x3B, 0x67, 0x7D2B) /* <CJK */
-MAP(0x3B, 0x68, 0x80A2) /* <CJK */
-MAP(0x3B, 0x69, 0x8102) /* <CJK */
-MAP(0x3B, 0x6A, 0x81F3) /* <CJK */
-MAP(0x3B, 0x6B, 0x8996) /* <CJK */
-MAP(0x3B, 0x6C, 0x8A5E) /* <CJK */
-MAP(0x3B, 0x6D, 0x8A69) /* <CJK */
-MAP(0x3B, 0x6E, 0x8A66) /* <CJK */
-MAP(0x3B, 0x6F, 0x8A8C) /* <CJK */
-MAP(0x3B, 0x70, 0x8AEE) /* <CJK */
-MAP(0x3B, 0x71, 0x8CC7) /* <CJK */
-MAP(0x3B, 0x72, 0x8CDC) /* <CJK */
-MAP(0x3B, 0x73, 0x96CC) /* <CJK */
-MAP(0x3B, 0x74, 0x98FC) /* <CJK */
-MAP(0x3B, 0x75, 0x6B6F) /* <CJK */
-MAP(0x3B, 0x76, 0x4E8B) /* <CJK */
-MAP(0x3B, 0x77, 0x4F3C) /* <CJK */
-MAP(0x3B, 0x78, 0x4F8D) /* <CJK */
-MAP(0x3B, 0x79, 0x5150) /* <CJK */
-MAP(0x3B, 0x7A, 0x5B57) /* <CJK */
-MAP(0x3B, 0x7B, 0x5BFA) /* <CJK */
-MAP(0x3B, 0x7C, 0x6148) /* <CJK */
-MAP(0x3B, 0x7D, 0x6301) /* <CJK */
-MAP(0x3B, 0x7E, 0x6642) /* <CJK */
-MAP(0x3C, 0x21, 0x6B21) /* <CJK */
-MAP(0x3C, 0x22, 0x6ECB) /* <CJK */
-MAP(0x3C, 0x23, 0x6CBB) /* <CJK */
-MAP(0x3C, 0x24, 0x723E) /* <CJK */
-MAP(0x3C, 0x25, 0x74BD) /* <CJK */
-MAP(0x3C, 0x26, 0x75D4) /* <CJK */
-MAP(0x3C, 0x27, 0x78C1) /* <CJK */
-MAP(0x3C, 0x28, 0x793A) /* <CJK */
-MAP(0x3C, 0x29, 0x800C) /* <CJK */
-MAP(0x3C, 0x2A, 0x8033) /* <CJK */
-MAP(0x3C, 0x2B, 0x81EA) /* <CJK */
-MAP(0x3C, 0x2C, 0x8494) /* <CJK */
-MAP(0x3C, 0x2D, 0x8F9E) /* <CJK */
-MAP(0x3C, 0x2E, 0x6C50) /* <CJK */
-MAP(0x3C, 0x2F, 0x9E7F) /* <CJK */
-MAP(0x3C, 0x30, 0x5F0F) /* <CJK */
-MAP(0x3C, 0x31, 0x8B58) /* <CJK */
-MAP(0x3C, 0x32, 0x9D2B) /* <CJK */
-MAP(0x3C, 0x33, 0x7AFA) /* <CJK */
-MAP(0x3C, 0x34, 0x8EF8) /* <CJK */
-MAP(0x3C, 0x35, 0x5B8D) /* <CJK */
-MAP(0x3C, 0x36, 0x96EB) /* <CJK */
-MAP(0x3C, 0x37, 0x4E03) /* <CJK */
-MAP(0x3C, 0x38, 0x53F1) /* <CJK */
-MAP(0x3C, 0x39, 0x57F7) /* <CJK */
-MAP(0x3C, 0x3A, 0x5931) /* <CJK */
-MAP(0x3C, 0x3B, 0x5AC9) /* <CJK */
-MAP(0x3C, 0x3C, 0x5BA4) /* <CJK */
-MAP(0x3C, 0x3D, 0x6089) /* <CJK */
-MAP(0x3C, 0x3E, 0x6E7F) /* <CJK */
-MAP(0x3C, 0x3F, 0x6F06) /* <CJK */
-MAP(0x3C, 0x40, 0x75BE) /* <CJK */
-MAP(0x3C, 0x41, 0x8CEA) /* <CJK */
-MAP(0x3C, 0x42, 0x5B9F) /* <CJK */
-MAP(0x3C, 0x43, 0x8500) /* <CJK */
-MAP(0x3C, 0x44, 0x7BE0) /* <CJK */
-MAP(0x3C, 0x45, 0x5072) /* <CJK */
-MAP(0x3C, 0x46, 0x67F4) /* <CJK */
-MAP(0x3C, 0x47, 0x829D) /* <CJK */
-MAP(0x3C, 0x48, 0x5C61) /* <CJK */
-MAP(0x3C, 0x49, 0x854A) /* <CJK */
-MAP(0x3C, 0x4A, 0x7E1E) /* <CJK */
-MAP(0x3C, 0x4B, 0x820E) /* <CJK */
-MAP(0x3C, 0x4C, 0x5199) /* <CJK */
-MAP(0x3C, 0x4D, 0x5C04) /* <CJK */
-MAP(0x3C, 0x4E, 0x6368) /* <CJK */
-MAP(0x3C, 0x4F, 0x8D66) /* <CJK */
-MAP(0x3C, 0x50, 0x659C) /* <CJK */
-MAP(0x3C, 0x51, 0x716E) /* <CJK */
-MAP(0x3C, 0x52, 0x793E) /* <CJK */
-MAP(0x3C, 0x53, 0x7D17) /* <CJK */
-MAP(0x3C, 0x54, 0x8005) /* <CJK */
-MAP(0x3C, 0x55, 0x8B1D) /* <CJK */
-MAP(0x3C, 0x56, 0x8ECA) /* <CJK */
-MAP(0x3C, 0x57, 0x906E) /* <CJK */
-MAP(0x3C, 0x58, 0x86C7) /* <CJK */
-MAP(0x3C, 0x59, 0x90AA) /* <CJK */
-MAP(0x3C, 0x5A, 0x501F) /* <CJK */
-MAP(0x3C, 0x5B, 0x52FA) /* <CJK */
-MAP(0x3C, 0x5C, 0x5C3A) /* <CJK */
-MAP(0x3C, 0x5D, 0x6753) /* <CJK */
-MAP(0x3C, 0x5E, 0x707C) /* <CJK */
-MAP(0x3C, 0x5F, 0x7235) /* <CJK */
-MAP(0x3C, 0x60, 0x914C) /* <CJK */
-MAP(0x3C, 0x61, 0x91C8) /* <CJK */
-MAP(0x3C, 0x62, 0x932B) /* <CJK */
-MAP(0x3C, 0x63, 0x82E5) /* <CJK */
-MAP(0x3C, 0x64, 0x5BC2) /* <CJK */
-MAP(0x3C, 0x65, 0x5F31) /* <CJK */
-MAP(0x3C, 0x66, 0x60F9) /* <CJK */
-MAP(0x3C, 0x67, 0x4E3B) /* <CJK */
-MAP(0x3C, 0x68, 0x53D6) /* <CJK */
-MAP(0x3C, 0x69, 0x5B88) /* <CJK */
-MAP(0x3C, 0x6A, 0x624B) /* <CJK */
-MAP(0x3C, 0x6B, 0x6731) /* <CJK */
-MAP(0x3C, 0x6C, 0x6B8A) /* <CJK */
-MAP(0x3C, 0x6D, 0x72E9) /* <CJK */
-MAP(0x3C, 0x6E, 0x73E0) /* <CJK */
-MAP(0x3C, 0x6F, 0x7A2E) /* <CJK */
-MAP(0x3C, 0x70, 0x816B) /* <CJK */
-MAP(0x3C, 0x71, 0x8DA3) /* <CJK */
-MAP(0x3C, 0x72, 0x9152) /* <CJK */
-MAP(0x3C, 0x73, 0x9996) /* <CJK */
-MAP(0x3C, 0x74, 0x5112) /* <CJK */
-MAP(0x3C, 0x75, 0x53D7) /* <CJK */
-MAP(0x3C, 0x76, 0x546A) /* <CJK */
-MAP(0x3C, 0x77, 0x5BFF) /* <CJK */
-MAP(0x3C, 0x78, 0x6388) /* <CJK */
-MAP(0x3C, 0x79, 0x6A39) /* <CJK */
-MAP(0x3C, 0x7A, 0x7DAC) /* <CJK */
-MAP(0x3C, 0x7B, 0x9700) /* <CJK */
-MAP(0x3C, 0x7C, 0x56DA) /* <CJK */
-MAP(0x3C, 0x7D, 0x53CE) /* <CJK */
-MAP(0x3C, 0x7E, 0x5468) /* <CJK */
-MAP(0x3D, 0x21, 0x5B97) /* <CJK */
-MAP(0x3D, 0x22, 0x5C31) /* <CJK */
-MAP(0x3D, 0x23, 0x5DDE) /* <CJK */
-MAP(0x3D, 0x24, 0x4FEE) /* <CJK */
-MAP(0x3D, 0x25, 0x6101) /* <CJK */
-MAP(0x3D, 0x26, 0x62FE) /* <CJK */
-MAP(0x3D, 0x27, 0x6D32) /* <CJK */
-MAP(0x3D, 0x28, 0x79C0) /* <CJK */
-MAP(0x3D, 0x29, 0x79CB) /* <CJK */
-MAP(0x3D, 0x2A, 0x7D42) /* <CJK */
-MAP(0x3D, 0x2B, 0x7E4D) /* <CJK */
-MAP(0x3D, 0x2C, 0x7FD2) /* <CJK */
-MAP(0x3D, 0x2D, 0x81ED) /* <CJK */
-MAP(0x3D, 0x2E, 0x821F) /* <CJK */
-MAP(0x3D, 0x2F, 0x8490) /* <CJK */
-MAP(0x3D, 0x30, 0x8846) /* <CJK */
-MAP(0x3D, 0x31, 0x8972) /* <CJK */
-MAP(0x3D, 0x32, 0x8B90) /* <CJK */
-MAP(0x3D, 0x33, 0x8E74) /* <CJK */
-MAP(0x3D, 0x34, 0x8F2F) /* <CJK */
-MAP(0x3D, 0x35, 0x9031) /* <CJK */
-MAP(0x3D, 0x36, 0x914B) /* <CJK */
-MAP(0x3D, 0x37, 0x916C) /* <CJK */
-MAP(0x3D, 0x38, 0x96C6) /* <CJK */
-MAP(0x3D, 0x39, 0x919C) /* <CJK */
-MAP(0x3D, 0x3A, 0x4EC0) /* <CJK */
-MAP(0x3D, 0x3B, 0x4F4F) /* <CJK */
-MAP(0x3D, 0x3C, 0x5145) /* <CJK */
-MAP(0x3D, 0x3D, 0x5341) /* <CJK */
-MAP(0x3D, 0x3E, 0x5F93) /* <CJK */
-MAP(0x3D, 0x3F, 0x620E) /* <CJK */
-MAP(0x3D, 0x40, 0x67D4) /* <CJK */
-MAP(0x3D, 0x41, 0x6C41) /* <CJK */
-MAP(0x3D, 0x42, 0x6E0B) /* <CJK */
-MAP(0x3D, 0x43, 0x7363) /* <CJK */
-MAP(0x3D, 0x44, 0x7E26) /* <CJK */
-MAP(0x3D, 0x45, 0x91CD) /* <CJK */
-MAP(0x3D, 0x46, 0x9283) /* <CJK */
-MAP(0x3D, 0x47, 0x53D4) /* <CJK */
-MAP(0x3D, 0x48, 0x5919) /* <CJK */
-MAP(0x3D, 0x49, 0x5BBF) /* <CJK */
-MAP(0x3D, 0x4A, 0x6DD1) /* <CJK */
-MAP(0x3D, 0x4B, 0x795D) /* <CJK */
-MAP(0x3D, 0x4C, 0x7E2E) /* <CJK */
-MAP(0x3D, 0x4D, 0x7C9B) /* <CJK */
-MAP(0x3D, 0x4E, 0x587E) /* <CJK */
-MAP(0x3D, 0x4F, 0x719F) /* <CJK */
-MAP(0x3D, 0x50, 0x51FA) /* <CJK */
-MAP(0x3D, 0x51, 0x8853) /* <CJK */
-MAP(0x3D, 0x52, 0x8FF0) /* <CJK */
-MAP(0x3D, 0x53, 0x4FCA) /* <CJK */
-MAP(0x3D, 0x54, 0x5CFB) /* <CJK */
-MAP(0x3D, 0x55, 0x6625) /* <CJK */
-MAP(0x3D, 0x56, 0x77AC) /* <CJK */
-MAP(0x3D, 0x57, 0x7AE3) /* <CJK */
-MAP(0x3D, 0x58, 0x821C) /* <CJK */
-MAP(0x3D, 0x59, 0x99FF) /* <CJK */
-MAP(0x3D, 0x5A, 0x51C6) /* <CJK */
-MAP(0x3D, 0x5B, 0x5FAA) /* <CJK */
-MAP(0x3D, 0x5C, 0x65EC) /* <CJK */
-MAP(0x3D, 0x5D, 0x696F) /* <CJK */
-MAP(0x3D, 0x5E, 0x6B89) /* <CJK */
-MAP(0x3D, 0x5F, 0x6DF3) /* <CJK */
-MAP(0x3D, 0x60, 0x6E96) /* <CJK */
-MAP(0x3D, 0x61, 0x6F64) /* <CJK */
-MAP(0x3D, 0x62, 0x76FE) /* <CJK */
-MAP(0x3D, 0x63, 0x7D14) /* <CJK */
-MAP(0x3D, 0x64, 0x5DE1) /* <CJK */
-MAP(0x3D, 0x65, 0x9075) /* <CJK */
-MAP(0x3D, 0x66, 0x9187) /* <CJK */
-MAP(0x3D, 0x67, 0x9806) /* <CJK */
-MAP(0x3D, 0x68, 0x51E6) /* <CJK */
-MAP(0x3D, 0x69, 0x521D) /* <CJK */
-MAP(0x3D, 0x6A, 0x6240) /* <CJK */
-MAP(0x3D, 0x6B, 0x6691) /* <CJK */
-MAP(0x3D, 0x6C, 0x66D9) /* <CJK */
-MAP(0x3D, 0x6D, 0x6E1A) /* <CJK */
-MAP(0x3D, 0x6E, 0x5EB6) /* <CJK */
-MAP(0x3D, 0x6F, 0x7DD2) /* <CJK */
-MAP(0x3D, 0x70, 0x7F72) /* <CJK */
-MAP(0x3D, 0x71, 0x66F8) /* <CJK */
-MAP(0x3D, 0x72, 0x85AF) /* <CJK */
-MAP(0x3D, 0x73, 0x85F7) /* <CJK */
-MAP(0x3D, 0x74, 0x8AF8) /* <CJK */
-MAP(0x3D, 0x75, 0x52A9) /* <CJK */
-MAP(0x3D, 0x76, 0x53D9) /* <CJK */
-MAP(0x3D, 0x77, 0x5973) /* <CJK */
-MAP(0x3D, 0x78, 0x5E8F) /* <CJK */
-MAP(0x3D, 0x79, 0x5F90) /* <CJK */
-MAP(0x3D, 0x7A, 0x6055) /* <CJK */
-MAP(0x3D, 0x7B, 0x92E4) /* <CJK */
-MAP(0x3D, 0x7C, 0x9664) /* <CJK */
-MAP(0x3D, 0x7D, 0x50B7) /* <CJK */
-MAP(0x3D, 0x7E, 0x511F) /* <CJK */
-MAP(0x3E, 0x21, 0x52DD) /* <CJK */
-MAP(0x3E, 0x22, 0x5320) /* <CJK */
-MAP(0x3E, 0x23, 0x5347) /* <CJK */
-MAP(0x3E, 0x24, 0x53EC) /* <CJK */
-MAP(0x3E, 0x25, 0x54E8) /* <CJK */
-MAP(0x3E, 0x26, 0x5546) /* <CJK */
-MAP(0x3E, 0x27, 0x5531) /* <CJK */
-MAP(0x3E, 0x28, 0x5617) /* <CJK */
-MAP(0x3E, 0x29, 0x5968) /* <CJK */
-MAP(0x3E, 0x2A, 0x59BE) /* <CJK */
-MAP(0x3E, 0x2B, 0x5A3C) /* <CJK */
-MAP(0x3E, 0x2C, 0x5BB5) /* <CJK */
-MAP(0x3E, 0x2D, 0x5C06) /* <CJK */
-MAP(0x3E, 0x2E, 0x5C0F) /* <CJK */
-MAP(0x3E, 0x2F, 0x5C11) /* <CJK */
-MAP(0x3E, 0x30, 0x5C1A) /* <CJK */
-MAP(0x3E, 0x31, 0x5E84) /* <CJK */
-MAP(0x3E, 0x32, 0x5E8A) /* <CJK */
-MAP(0x3E, 0x33, 0x5EE0) /* <CJK */
-MAP(0x3E, 0x34, 0x5F70) /* <CJK */
-MAP(0x3E, 0x35, 0x627F) /* <CJK */
-MAP(0x3E, 0x36, 0x6284) /* <CJK */
-MAP(0x3E, 0x37, 0x62DB) /* <CJK */
-MAP(0x3E, 0x38, 0x638C) /* <CJK */
-MAP(0x3E, 0x39, 0x6377) /* <CJK */
-MAP(0x3E, 0x3A, 0x6607) /* <CJK */
-MAP(0x3E, 0x3B, 0x660C) /* <CJK */
-MAP(0x3E, 0x3C, 0x662D) /* <CJK */
-MAP(0x3E, 0x3D, 0x6676) /* <CJK */
-MAP(0x3E, 0x3E, 0x677E) /* <CJK */
-MAP(0x3E, 0x3F, 0x68A2) /* <CJK */
-MAP(0x3E, 0x40, 0x6A1F) /* <CJK */
-MAP(0x3E, 0x41, 0x6A35) /* <CJK */
-MAP(0x3E, 0x42, 0x6CBC) /* <CJK */
-MAP(0x3E, 0x43, 0x6D88) /* <CJK */
-MAP(0x3E, 0x44, 0x6E09) /* <CJK */
-MAP(0x3E, 0x45, 0x6E58) /* <CJK */
-MAP(0x3E, 0x46, 0x713C) /* <CJK */
-MAP(0x3E, 0x47, 0x7126) /* <CJK */
-MAP(0x3E, 0x48, 0x7167) /* <CJK */
-MAP(0x3E, 0x49, 0x75C7) /* <CJK */
-MAP(0x3E, 0x4A, 0x7701) /* <CJK */
-MAP(0x3E, 0x4B, 0x785D) /* <CJK */
-MAP(0x3E, 0x4C, 0x7901) /* <CJK */
-MAP(0x3E, 0x4D, 0x7965) /* <CJK */
-MAP(0x3E, 0x4E, 0x79F0) /* <CJK */
-MAP(0x3E, 0x4F, 0x7AE0) /* <CJK */
-MAP(0x3E, 0x50, 0x7B11) /* <CJK */
-MAP(0x3E, 0x51, 0x7CA7) /* <CJK */
-MAP(0x3E, 0x52, 0x7D39) /* <CJK */
-MAP(0x3E, 0x53, 0x8096) /* <CJK */
-MAP(0x3E, 0x54, 0x83D6) /* <CJK */
-MAP(0x3E, 0x55, 0x848B) /* <CJK */
-MAP(0x3E, 0x56, 0x8549) /* <CJK */
-MAP(0x3E, 0x57, 0x885D) /* <CJK */
-MAP(0x3E, 0x58, 0x88F3) /* <CJK */
-MAP(0x3E, 0x59, 0x8A1F) /* <CJK */
-MAP(0x3E, 0x5A, 0x8A3C) /* <CJK */
-MAP(0x3E, 0x5B, 0x8A54) /* <CJK */
-MAP(0x3E, 0x5C, 0x8A73) /* <CJK */
-MAP(0x3E, 0x5D, 0x8C61) /* <CJK */
-MAP(0x3E, 0x5E, 0x8CDE) /* <CJK */
-MAP(0x3E, 0x5F, 0x91A4) /* <CJK */
-MAP(0x3E, 0x60, 0x9266) /* <CJK */
-MAP(0x3E, 0x61, 0x937E) /* <CJK */
-MAP(0x3E, 0x62, 0x9418) /* <CJK */
-MAP(0x3E, 0x63, 0x969C) /* <CJK */
-MAP(0x3E, 0x64, 0x9798) /* <CJK */
-MAP(0x3E, 0x65, 0x4E0A) /* <CJK */
-MAP(0x3E, 0x66, 0x4E08) /* <CJK */
-MAP(0x3E, 0x67, 0x4E1E) /* <CJK */
-MAP(0x3E, 0x68, 0x4E57) /* <CJK */
-MAP(0x3E, 0x69, 0x5197) /* <CJK */
-MAP(0x3E, 0x6A, 0x5270) /* <CJK */
-MAP(0x3E, 0x6B, 0x57CE) /* <CJK */
-MAP(0x3E, 0x6C, 0x5834) /* <CJK */
-MAP(0x3E, 0x6D, 0x58CC) /* <CJK */
-MAP(0x3E, 0x6E, 0x5B22) /* <CJK */
-MAP(0x3E, 0x6F, 0x5E38) /* <CJK */
-MAP(0x3E, 0x70, 0x60C5) /* <CJK */
-MAP(0x3E, 0x71, 0x64FE) /* <CJK */
-MAP(0x3E, 0x72, 0x6761) /* <CJK */
-MAP(0x3E, 0x73, 0x6756) /* <CJK */
-MAP(0x3E, 0x74, 0x6D44) /* <CJK */
-MAP(0x3E, 0x75, 0x72B6) /* <CJK */
-MAP(0x3E, 0x76, 0x7573) /* <CJK */
-MAP(0x3E, 0x77, 0x7A63) /* <CJK */
-MAP(0x3E, 0x78, 0x84B8) /* <CJK */
-MAP(0x3E, 0x79, 0x8B72) /* <CJK */
-MAP(0x3E, 0x7A, 0x91B8) /* <CJK */
-MAP(0x3E, 0x7B, 0x9320) /* <CJK */
-MAP(0x3E, 0x7C, 0x5631) /* <CJK */
-MAP(0x3E, 0x7D, 0x57F4) /* <CJK */
-MAP(0x3E, 0x7E, 0x98FE) /* <CJK */
-MAP(0x3F, 0x21, 0x62ED) /* <CJK */
-MAP(0x3F, 0x22, 0x690D) /* <CJK */
-MAP(0x3F, 0x23, 0x6B96) /* <CJK */
-MAP(0x3F, 0x24, 0x71ED) /* <CJK */
-MAP(0x3F, 0x25, 0x7E54) /* <CJK */
-MAP(0x3F, 0x26, 0x8077) /* <CJK */
-MAP(0x3F, 0x27, 0x8272) /* <CJK */
-MAP(0x3F, 0x28, 0x89E6) /* <CJK */
-MAP(0x3F, 0x29, 0x98DF) /* <CJK */
-MAP(0x3F, 0x2A, 0x8755) /* <CJK */
-MAP(0x3F, 0x2B, 0x8FB1) /* <CJK */
-MAP(0x3F, 0x2C, 0x5C3B) /* <CJK */
-MAP(0x3F, 0x2D, 0x4F38) /* <CJK */
-MAP(0x3F, 0x2E, 0x4FE1) /* <CJK */
-MAP(0x3F, 0x2F, 0x4FB5) /* <CJK */
-MAP(0x3F, 0x30, 0x5507) /* <CJK */
-MAP(0x3F, 0x31, 0x5A20) /* <CJK */
-MAP(0x3F, 0x32, 0x5BDD) /* <CJK */
-MAP(0x3F, 0x33, 0x5BE9) /* <CJK */
-MAP(0x3F, 0x34, 0x5FC3) /* <CJK */
-MAP(0x3F, 0x35, 0x614E) /* <CJK */
-MAP(0x3F, 0x36, 0x632F) /* <CJK */
-MAP(0x3F, 0x37, 0x65B0) /* <CJK */
-MAP(0x3F, 0x38, 0x664B) /* <CJK */
-MAP(0x3F, 0x39, 0x68EE) /* <CJK */
-MAP(0x3F, 0x3A, 0x699B) /* <CJK */
-MAP(0x3F, 0x3B, 0x6D78) /* <CJK */
-MAP(0x3F, 0x3C, 0x6DF1) /* <CJK */
-MAP(0x3F, 0x3D, 0x7533) /* <CJK */
-MAP(0x3F, 0x3E, 0x75B9) /* <CJK */
-MAP(0x3F, 0x3F, 0x771F) /* <CJK */
-MAP(0x3F, 0x40, 0x795E) /* <CJK */
-MAP(0x3F, 0x41, 0x79E6) /* <CJK */
-MAP(0x3F, 0x42, 0x7D33) /* <CJK */
-MAP(0x3F, 0x43, 0x81E3) /* <CJK */
-MAP(0x3F, 0x44, 0x82AF) /* <CJK */
-MAP(0x3F, 0x45, 0x85AA) /* <CJK */
-MAP(0x3F, 0x46, 0x89AA) /* <CJK */
-MAP(0x3F, 0x47, 0x8A3A) /* <CJK */
-MAP(0x3F, 0x48, 0x8EAB) /* <CJK */
-MAP(0x3F, 0x49, 0x8F9B) /* <CJK */
-MAP(0x3F, 0x4A, 0x9032) /* <CJK */
-MAP(0x3F, 0x4B, 0x91DD) /* <CJK */
-MAP(0x3F, 0x4C, 0x9707) /* <CJK */
-MAP(0x3F, 0x4D, 0x4EBA) /* <CJK */
-MAP(0x3F, 0x4E, 0x4EC1) /* <CJK */
-MAP(0x3F, 0x4F, 0x5203) /* <CJK */
-MAP(0x3F, 0x50, 0x5875) /* <CJK */
-MAP(0x3F, 0x51, 0x58EC) /* <CJK */
-MAP(0x3F, 0x52, 0x5C0B) /* <CJK */
-MAP(0x3F, 0x53, 0x751A) /* <CJK */
-MAP(0x3F, 0x54, 0x5C3D) /* <CJK */
-MAP(0x3F, 0x55, 0x814E) /* <CJK */
-MAP(0x3F, 0x56, 0x8A0A) /* <CJK */
-MAP(0x3F, 0x57, 0x8FC5) /* <CJK */
-MAP(0x3F, 0x58, 0x9663) /* <CJK */
-MAP(0x3F, 0x59, 0x976D) /* <CJK */
-MAP(0x3F, 0x5A, 0x7B25) /* <CJK */
-MAP(0x3F, 0x5B, 0x8ACF) /* <CJK */
-MAP(0x3F, 0x5C, 0x9808) /* <CJK */
-MAP(0x3F, 0x5D, 0x9162) /* <CJK */
-MAP(0x3F, 0x5E, 0x56F3) /* <CJK */
-MAP(0x3F, 0x5F, 0x53A8) /* <CJK */
-MAP(0x3F, 0x60, 0x9017) /* <CJK */
-MAP(0x3F, 0x61, 0x5439) /* <CJK */
-MAP(0x3F, 0x62, 0x5782) /* <CJK */
-MAP(0x3F, 0x63, 0x5E25) /* <CJK */
-MAP(0x3F, 0x64, 0x63A8) /* <CJK */
-MAP(0x3F, 0x65, 0x6C34) /* <CJK */
-MAP(0x3F, 0x66, 0x708A) /* <CJK */
-MAP(0x3F, 0x67, 0x7761) /* <CJK */
-MAP(0x3F, 0x68, 0x7C8B) /* <CJK */
-MAP(0x3F, 0x69, 0x7FE0) /* <CJK */
-MAP(0x3F, 0x6A, 0x8870) /* <CJK */
-MAP(0x3F, 0x6B, 0x9042) /* <CJK */
-MAP(0x3F, 0x6C, 0x9154) /* <CJK */
-MAP(0x3F, 0x6D, 0x9310) /* <CJK */
-MAP(0x3F, 0x6E, 0x9318) /* <CJK */
-MAP(0x3F, 0x6F, 0x968F) /* <CJK */
-MAP(0x3F, 0x70, 0x745E) /* <CJK */
-MAP(0x3F, 0x71, 0x9AC4) /* <CJK */
-MAP(0x3F, 0x72, 0x5D07) /* <CJK */
-MAP(0x3F, 0x73, 0x5D69) /* <CJK */
-MAP(0x3F, 0x74, 0x6570) /* <CJK */
-MAP(0x3F, 0x75, 0x67A2) /* <CJK */
-MAP(0x3F, 0x76, 0x8DA8) /* <CJK */
-MAP(0x3F, 0x77, 0x96DB) /* <CJK */
-MAP(0x3F, 0x78, 0x636E) /* <CJK */
-MAP(0x3F, 0x79, 0x6749) /* <CJK */
-MAP(0x3F, 0x7A, 0x6919) /* <CJK */
-MAP(0x3F, 0x7B, 0x83C5) /* <CJK */
-MAP(0x3F, 0x7C, 0x9817) /* <CJK */
-MAP(0x3F, 0x7D, 0x96C0) /* <CJK */
-MAP(0x3F, 0x7E, 0x88FE) /* <CJK */
-MAP(0x40, 0x21, 0x6F84) /* <CJK */
-MAP(0x40, 0x22, 0x647A) /* <CJK */
-MAP(0x40, 0x23, 0x5BF8) /* <CJK */
-MAP(0x40, 0x24, 0x4E16) /* <CJK */
-MAP(0x40, 0x25, 0x702C) /* <CJK */
-MAP(0x40, 0x26, 0x755D) /* <CJK */
-MAP(0x40, 0x27, 0x662F) /* <CJK */
-MAP(0x40, 0x28, 0x51C4) /* <CJK */
-MAP(0x40, 0x29, 0x5236) /* <CJK */
-MAP(0x40, 0x2A, 0x52E2) /* <CJK */
-MAP(0x40, 0x2B, 0x59D3) /* <CJK */
-MAP(0x40, 0x2C, 0x5F81) /* <CJK */
-MAP(0x40, 0x2D, 0x6027) /* <CJK */
-MAP(0x40, 0x2E, 0x6210) /* <CJK */
-MAP(0x40, 0x2F, 0x653F) /* <CJK */
-MAP(0x40, 0x30, 0x6574) /* <CJK */
-MAP(0x40, 0x31, 0x661F) /* <CJK */
-MAP(0x40, 0x32, 0x6674) /* <CJK */
-MAP(0x40, 0x33, 0x68F2) /* <CJK */
-MAP(0x40, 0x34, 0x6816) /* <CJK */
-MAP(0x40, 0x35, 0x6B63) /* <CJK */
-MAP(0x40, 0x36, 0x6E05) /* <CJK */
-MAP(0x40, 0x37, 0x7272) /* <CJK */
-MAP(0x40, 0x38, 0x751F) /* <CJK */
-MAP(0x40, 0x39, 0x76DB) /* <CJK */
-MAP(0x40, 0x3A, 0x7CBE) /* <CJK */
-MAP(0x40, 0x3B, 0x8056) /* <CJK */
-MAP(0x40, 0x3C, 0x58F0) /* <CJK */
-MAP(0x40, 0x3D, 0x88FD) /* <CJK */
-MAP(0x40, 0x3E, 0x897F) /* <CJK */
-MAP(0x40, 0x3F, 0x8AA0) /* <CJK */
-MAP(0x40, 0x40, 0x8A93) /* <CJK */
-MAP(0x40, 0x41, 0x8ACB) /* <CJK */
-MAP(0x40, 0x42, 0x901D) /* <CJK */
-MAP(0x40, 0x43, 0x9192) /* <CJK */
-MAP(0x40, 0x44, 0x9752) /* <CJK */
-MAP(0x40, 0x45, 0x9759) /* <CJK */
-MAP(0x40, 0x46, 0x6589) /* <CJK */
-MAP(0x40, 0x47, 0x7A0E) /* <CJK */
-MAP(0x40, 0x48, 0x8106) /* <CJK */
-MAP(0x40, 0x49, 0x96BB) /* <CJK */
-MAP(0x40, 0x4A, 0x5E2D) /* <CJK */
-MAP(0x40, 0x4B, 0x60DC) /* <CJK */
-MAP(0x40, 0x4C, 0x621A) /* <CJK */
-MAP(0x40, 0x4D, 0x65A5) /* <CJK */
-MAP(0x40, 0x4E, 0x6614) /* <CJK */
-MAP(0x40, 0x4F, 0x6790) /* <CJK */
-MAP(0x40, 0x50, 0x77F3) /* <CJK */
-MAP(0x40, 0x51, 0x7A4D) /* <CJK */
-MAP(0x40, 0x52, 0x7C4D) /* <CJK */
-MAP(0x40, 0x53, 0x7E3E) /* <CJK */
-MAP(0x40, 0x54, 0x810A) /* <CJK */
-MAP(0x40, 0x55, 0x8CAC) /* <CJK */
-MAP(0x40, 0x56, 0x8D64) /* <CJK */
-MAP(0x40, 0x57, 0x8DE1) /* <CJK */
-MAP(0x40, 0x58, 0x8E5F) /* <CJK */
-MAP(0x40, 0x59, 0x78A9) /* <CJK */
-MAP(0x40, 0x5A, 0x5207) /* <CJK */
-MAP(0x40, 0x5B, 0x62D9) /* <CJK */
-MAP(0x40, 0x5C, 0x63A5) /* <CJK */
-MAP(0x40, 0x5D, 0x6442) /* <CJK */
-MAP(0x40, 0x5E, 0x6298) /* <CJK */
-MAP(0x40, 0x5F, 0x8A2D) /* <CJK */
-MAP(0x40, 0x60, 0x7A83) /* <CJK */
-MAP(0x40, 0x61, 0x7BC0) /* <CJK */
-MAP(0x40, 0x62, 0x8AAC) /* <CJK */
-MAP(0x40, 0x63, 0x96EA) /* <CJK */
-MAP(0x40, 0x64, 0x7D76) /* <CJK */
-MAP(0x40, 0x65, 0x820C) /* <CJK */
-MAP(0x40, 0x66, 0x8749) /* <CJK */
-MAP(0x40, 0x67, 0x4ED9) /* <CJK */
-MAP(0x40, 0x68, 0x5148) /* <CJK */
-MAP(0x40, 0x69, 0x5343) /* <CJK */
-MAP(0x40, 0x6A, 0x5360) /* <CJK */
-MAP(0x40, 0x6B, 0x5BA3) /* <CJK */
-MAP(0x40, 0x6C, 0x5C02) /* <CJK */
-MAP(0x40, 0x6D, 0x5C16) /* <CJK */
-MAP(0x40, 0x6E, 0x5DDD) /* <CJK */
-MAP(0x40, 0x6F, 0x6226) /* <CJK */
-MAP(0x40, 0x70, 0x6247) /* <CJK */
-MAP(0x40, 0x71, 0x64B0) /* <CJK */
-MAP(0x40, 0x72, 0x6813) /* <CJK */
-MAP(0x40, 0x73, 0x6834) /* <CJK */
-MAP(0x40, 0x74, 0x6CC9) /* <CJK */
-MAP(0x40, 0x75, 0x6D45) /* <CJK */
-MAP(0x40, 0x76, 0x6D17) /* <CJK */
-MAP(0x40, 0x77, 0x67D3) /* <CJK */
-MAP(0x40, 0x78, 0x6F5C) /* <CJK */
-MAP(0x40, 0x79, 0x714E) /* <CJK */
-MAP(0x40, 0x7A, 0x717D) /* <CJK */
-MAP(0x40, 0x7B, 0x65CB) /* <CJK */
-MAP(0x40, 0x7C, 0x7A7F) /* <CJK */
-MAP(0x40, 0x7D, 0x7BAD) /* <CJK */
-MAP(0x40, 0x7E, 0x7DDA) /* <CJK */
-MAP(0x41, 0x21, 0x7E4A) /* <CJK */
-MAP(0x41, 0x22, 0x7FA8) /* <CJK */
-MAP(0x41, 0x23, 0x817A) /* <CJK */
-MAP(0x41, 0x24, 0x821B) /* <CJK */
-MAP(0x41, 0x25, 0x8239) /* <CJK */
-MAP(0x41, 0x26, 0x85A6) /* <CJK */
-MAP(0x41, 0x27, 0x8A6E) /* <CJK */
-MAP(0x41, 0x28, 0x8CCE) /* <CJK */
-MAP(0x41, 0x29, 0x8DF5) /* <CJK */
-MAP(0x41, 0x2A, 0x9078) /* <CJK */
-MAP(0x41, 0x2B, 0x9077) /* <CJK */
-MAP(0x41, 0x2C, 0x92AD) /* <CJK */
-MAP(0x41, 0x2D, 0x9291) /* <CJK */
-MAP(0x41, 0x2E, 0x9583) /* <CJK */
-MAP(0x41, 0x2F, 0x9BAE) /* <CJK */
-MAP(0x41, 0x30, 0x524D) /* <CJK */
-MAP(0x41, 0x31, 0x5584) /* <CJK */
-MAP(0x41, 0x32, 0x6F38) /* <CJK */
-MAP(0x41, 0x33, 0x7136) /* <CJK */
-MAP(0x41, 0x34, 0x5168) /* <CJK */
-MAP(0x41, 0x35, 0x7985) /* <CJK */
-MAP(0x41, 0x36, 0x7E55) /* <CJK */
-MAP(0x41, 0x37, 0x81B3) /* <CJK */
-MAP(0x41, 0x38, 0x7CCE) /* <CJK */
-MAP(0x41, 0x39, 0x564C) /* <CJK */
-MAP(0x41, 0x3A, 0x5851) /* <CJK */
-MAP(0x41, 0x3B, 0x5CA8) /* <CJK */
-MAP(0x41, 0x3C, 0x63AA) /* <CJK */
-MAP(0x41, 0x3D, 0x66FE) /* <CJK */
-MAP(0x41, 0x3E, 0x66FD) /* <CJK */
-MAP(0x41, 0x3F, 0x695A) /* <CJK */
-MAP(0x41, 0x40, 0x72D9) /* <CJK */
-MAP(0x41, 0x41, 0x758F) /* <CJK */
-MAP(0x41, 0x42, 0x758E) /* <CJK */
-MAP(0x41, 0x43, 0x790E) /* <CJK */
-MAP(0x41, 0x44, 0x7956) /* <CJK */
-MAP(0x41, 0x45, 0x79DF) /* <CJK */
-MAP(0x41, 0x46, 0x7C97) /* <CJK */
-MAP(0x41, 0x47, 0x7D20) /* <CJK */
-MAP(0x41, 0x48, 0x7D44) /* <CJK */
-MAP(0x41, 0x49, 0x8607) /* <CJK */
-MAP(0x41, 0x4A, 0x8A34) /* <CJK */
-MAP(0x41, 0x4B, 0x963B) /* <CJK */
-MAP(0x41, 0x4C, 0x9061) /* <CJK */
-MAP(0x41, 0x4D, 0x9F20) /* <CJK */
-MAP(0x41, 0x4E, 0x50E7) /* <CJK */
-MAP(0x41, 0x4F, 0x5275) /* <CJK */
-MAP(0x41, 0x50, 0x53CC) /* <CJK */
-MAP(0x41, 0x51, 0x53E2) /* <CJK */
-MAP(0x41, 0x52, 0x5009) /* <CJK */
-MAP(0x41, 0x53, 0x55AA) /* <CJK */
-MAP(0x41, 0x54, 0x58EE) /* <CJK */
-MAP(0x41, 0x55, 0x594F) /* <CJK */
-MAP(0x41, 0x56, 0x723D) /* <CJK */
-MAP(0x41, 0x57, 0x5B8B) /* <CJK */
-MAP(0x41, 0x58, 0x5C64) /* <CJK */
-MAP(0x41, 0x59, 0x531D) /* <CJK */
-MAP(0x41, 0x5A, 0x60E3) /* <CJK */
-MAP(0x41, 0x5B, 0x60F3) /* <CJK */
-MAP(0x41, 0x5C, 0x635C) /* <CJK */
-MAP(0x41, 0x5D, 0x6383) /* <CJK */
-MAP(0x41, 0x5E, 0x633F) /* <CJK */
-MAP(0x41, 0x5F, 0x63BB) /* <CJK */
-MAP(0x41, 0x60, 0x64CD) /* <CJK */
-MAP(0x41, 0x61, 0x65E9) /* <CJK */
-MAP(0x41, 0x62, 0x66F9) /* <CJK */
-MAP(0x41, 0x63, 0x5DE3) /* <CJK */
-MAP(0x41, 0x64, 0x69CD) /* <CJK */
-MAP(0x41, 0x65, 0x69FD) /* <CJK */
-MAP(0x41, 0x66, 0x6F15) /* <CJK */
-MAP(0x41, 0x67, 0x71E5) /* <CJK */
-MAP(0x41, 0x68, 0x4E89) /* <CJK */
-MAP(0x41, 0x69, 0x75E9) /* <CJK */
-MAP(0x41, 0x6A, 0x76F8) /* <CJK */
-MAP(0x41, 0x6B, 0x7A93) /* <CJK */
-MAP(0x41, 0x6C, 0x7CDF) /* <CJK */
-MAP(0x41, 0x6D, 0x7DCF) /* <CJK */
-MAP(0x41, 0x6E, 0x7D9C) /* <CJK */
-MAP(0x41, 0x6F, 0x8061) /* <CJK */
-MAP(0x41, 0x70, 0x8349) /* <CJK */
-MAP(0x41, 0x71, 0x8358) /* <CJK */
-MAP(0x41, 0x72, 0x846C) /* <CJK */
-MAP(0x41, 0x73, 0x84BC) /* <CJK */
-MAP(0x41, 0x74, 0x85FB) /* <CJK */
-MAP(0x41, 0x75, 0x88C5) /* <CJK */
-MAP(0x41, 0x76, 0x8D70) /* <CJK */
-MAP(0x41, 0x77, 0x9001) /* <CJK */
-MAP(0x41, 0x78, 0x906D) /* <CJK */
-MAP(0x41, 0x79, 0x9397) /* <CJK */
-MAP(0x41, 0x7A, 0x971C) /* <CJK */
-MAP(0x41, 0x7B, 0x9A12) /* <CJK */
-MAP(0x41, 0x7C, 0x50CF) /* <CJK */
-MAP(0x41, 0x7D, 0x5897) /* <CJK */
-MAP(0x41, 0x7E, 0x618E) /* <CJK */
-MAP(0x42, 0x21, 0x81D3) /* <CJK */
-MAP(0x42, 0x22, 0x8535) /* <CJK */
-MAP(0x42, 0x23, 0x8D08) /* <CJK */
-MAP(0x42, 0x24, 0x9020) /* <CJK */
-MAP(0x42, 0x25, 0x4FC3) /* <CJK */
-MAP(0x42, 0x26, 0x5074) /* <CJK */
-MAP(0x42, 0x27, 0x5247) /* <CJK */
-MAP(0x42, 0x28, 0x5373) /* <CJK */
-MAP(0x42, 0x29, 0x606F) /* <CJK */
-MAP(0x42, 0x2A, 0x6349) /* <CJK */
-MAP(0x42, 0x2B, 0x675F) /* <CJK */
-MAP(0x42, 0x2C, 0x6E2C) /* <CJK */
-MAP(0x42, 0x2D, 0x8DB3) /* <CJK */
-MAP(0x42, 0x2E, 0x901F) /* <CJK */
-MAP(0x42, 0x2F, 0x4FD7) /* <CJK */
-MAP(0x42, 0x30, 0x5C5E) /* <CJK */
-MAP(0x42, 0x31, 0x8CCA) /* <CJK */
-MAP(0x42, 0x32, 0x65CF) /* <CJK */
-MAP(0x42, 0x33, 0x7D9A) /* <CJK */
-MAP(0x42, 0x34, 0x5352) /* <CJK */
-MAP(0x42, 0x35, 0x8896) /* <CJK */
-MAP(0x42, 0x36, 0x5176) /* <CJK */
-MAP(0x42, 0x37, 0x63C3) /* <CJK */
-MAP(0x42, 0x38, 0x5B58) /* <CJK */
-MAP(0x42, 0x39, 0x5B6B) /* <CJK */
-MAP(0x42, 0x3A, 0x5C0A) /* <CJK */
-MAP(0x42, 0x3B, 0x640D) /* <CJK */
-MAP(0x42, 0x3C, 0x6751) /* <CJK */
-MAP(0x42, 0x3D, 0x905C) /* <CJK */
-MAP(0x42, 0x3E, 0x4ED6) /* <CJK */
-MAP(0x42, 0x3F, 0x591A) /* <CJK */
-MAP(0x42, 0x40, 0x592A) /* <CJK */
-MAP(0x42, 0x41, 0x6C70) /* <CJK */
-MAP(0x42, 0x42, 0x8A51) /* <CJK */
-MAP(0x42, 0x43, 0x553E) /* <CJK */
-MAP(0x42, 0x44, 0x5815) /* <CJK */
-MAP(0x42, 0x45, 0x59A5) /* <CJK */
-MAP(0x42, 0x46, 0x60F0) /* <CJK */
-MAP(0x42, 0x47, 0x6253) /* <CJK */
-MAP(0x42, 0x48, 0x67C1) /* <CJK */
-MAP(0x42, 0x49, 0x8235) /* <CJK */
-MAP(0x42, 0x4A, 0x6955) /* <CJK */
-MAP(0x42, 0x4B, 0x9640) /* <CJK */
-MAP(0x42, 0x4C, 0x99C4) /* <CJK */
-MAP(0x42, 0x4D, 0x9A28) /* <CJK */
-MAP(0x42, 0x4E, 0x4F53) /* <CJK */
-MAP(0x42, 0x4F, 0x5806) /* <CJK */
-MAP(0x42, 0x50, 0x5BFE) /* <CJK */
-MAP(0x42, 0x51, 0x8010) /* <CJK */
-MAP(0x42, 0x52, 0x5CB1) /* <CJK */
-MAP(0x42, 0x53, 0x5E2F) /* <CJK */
-MAP(0x42, 0x54, 0x5F85) /* <CJK */
-MAP(0x42, 0x55, 0x6020) /* <CJK */
-MAP(0x42, 0x56, 0x614B) /* <CJK */
-MAP(0x42, 0x57, 0x6234) /* <CJK */
-MAP(0x42, 0x58, 0x66FF) /* <CJK */
-MAP(0x42, 0x59, 0x6CF0) /* <CJK */
-MAP(0x42, 0x5A, 0x6EDE) /* <CJK */
-MAP(0x42, 0x5B, 0x80CE) /* <CJK */
-MAP(0x42, 0x5C, 0x817F) /* <CJK */
-MAP(0x42, 0x5D, 0x82D4) /* <CJK */
-MAP(0x42, 0x5E, 0x888B) /* <CJK */
-MAP(0x42, 0x5F, 0x8CB8) /* <CJK */
-MAP(0x42, 0x60, 0x9000) /* <CJK */
-MAP(0x42, 0x61, 0x902E) /* <CJK */
-MAP(0x42, 0x62, 0x968A) /* <CJK */
-MAP(0x42, 0x63, 0x9EDB) /* <CJK */
-MAP(0x42, 0x64, 0x9BDB) /* <CJK */
-MAP(0x42, 0x65, 0x4EE3) /* <CJK */
-MAP(0x42, 0x66, 0x53F0) /* <CJK */
-MAP(0x42, 0x67, 0x5927) /* <CJK */
-MAP(0x42, 0x68, 0x7B2C) /* <CJK */
-MAP(0x42, 0x69, 0x918D) /* <CJK */
-MAP(0x42, 0x6A, 0x984C) /* <CJK */
-MAP(0x42, 0x6B, 0x9DF9) /* <CJK */
-MAP(0x42, 0x6C, 0x6EDD) /* <CJK */
-MAP(0x42, 0x6D, 0x7027) /* <CJK */
-MAP(0x42, 0x6E, 0x5353) /* <CJK */
-MAP(0x42, 0x6F, 0x5544) /* <CJK */
-MAP(0x42, 0x70, 0x5B85) /* <CJK */
-MAP(0x42, 0x71, 0x6258) /* <CJK */
-MAP(0x42, 0x72, 0x629E) /* <CJK */
-MAP(0x42, 0x73, 0x62D3) /* <CJK */
-MAP(0x42, 0x74, 0x6CA2) /* <CJK */
-MAP(0x42, 0x75, 0x6FEF) /* <CJK */
-MAP(0x42, 0x76, 0x7422) /* <CJK */
-MAP(0x42, 0x77, 0x8A17) /* <CJK */
-MAP(0x42, 0x78, 0x9438) /* <CJK */
-MAP(0x42, 0x79, 0x6FC1) /* <CJK */
-MAP(0x42, 0x7A, 0x8AFE) /* <CJK */
-MAP(0x42, 0x7B, 0x8338) /* <CJK */
-MAP(0x42, 0x7C, 0x51E7) /* <CJK */
-MAP(0x42, 0x7D, 0x86F8) /* <CJK */
-MAP(0x42, 0x7E, 0x53EA) /* <CJK */
-MAP(0x43, 0x21, 0x53E9) /* <CJK */
-MAP(0x43, 0x22, 0x4F46) /* <CJK */
-MAP(0x43, 0x23, 0x9054) /* <CJK */
-MAP(0x43, 0x24, 0x8FB0) /* <CJK */
-MAP(0x43, 0x25, 0x596A) /* <CJK */
-MAP(0x43, 0x26, 0x8131) /* <CJK */
-MAP(0x43, 0x27, 0x5DFD) /* <CJK */
-MAP(0x43, 0x28, 0x7AEA) /* <CJK */
-MAP(0x43, 0x29, 0x8FBF) /* <CJK */
-MAP(0x43, 0x2A, 0x68DA) /* <CJK */
-MAP(0x43, 0x2B, 0x8C37) /* <CJK */
-MAP(0x43, 0x2C, 0x72F8) /* <CJK */
-MAP(0x43, 0x2D, 0x9C48) /* <CJK */
-MAP(0x43, 0x2E, 0x6A3D) /* <CJK */
-MAP(0x43, 0x2F, 0x8AB0) /* <CJK */
-MAP(0x43, 0x30, 0x4E39) /* <CJK */
-MAP(0x43, 0x31, 0x5358) /* <CJK */
-MAP(0x43, 0x32, 0x5606) /* <CJK */
-MAP(0x43, 0x33, 0x5766) /* <CJK */
-MAP(0x43, 0x34, 0x62C5) /* <CJK */
-MAP(0x43, 0x35, 0x63A2) /* <CJK */
-MAP(0x43, 0x36, 0x65E6) /* <CJK */
-MAP(0x43, 0x37, 0x6B4E) /* <CJK */
-MAP(0x43, 0x38, 0x6DE1) /* <CJK */
-MAP(0x43, 0x39, 0x6E5B) /* <CJK */
-MAP(0x43, 0x3A, 0x70AD) /* <CJK */
-MAP(0x43, 0x3B, 0x77ED) /* <CJK */
-MAP(0x43, 0x3C, 0x7AEF) /* <CJK */
-MAP(0x43, 0x3D, 0x7BAA) /* <CJK */
-MAP(0x43, 0x3E, 0x7DBB) /* <CJK */
-MAP(0x43, 0x3F, 0x803D) /* <CJK */
-MAP(0x43, 0x40, 0x80C6) /* <CJK */
-MAP(0x43, 0x41, 0x86CB) /* <CJK */
-MAP(0x43, 0x42, 0x8A95) /* <CJK */
-MAP(0x43, 0x43, 0x935B) /* <CJK */
-MAP(0x43, 0x44, 0x56E3) /* <CJK */
-MAP(0x43, 0x45, 0x58C7) /* <CJK */
-MAP(0x43, 0x46, 0x5F3E) /* <CJK */
-MAP(0x43, 0x47, 0x65AD) /* <CJK */
-MAP(0x43, 0x48, 0x6696) /* <CJK */
-MAP(0x43, 0x49, 0x6A80) /* <CJK */
-MAP(0x43, 0x4A, 0x6BB5) /* <CJK */
-MAP(0x43, 0x4B, 0x7537) /* <CJK */
-MAP(0x43, 0x4C, 0x8AC7) /* <CJK */
-MAP(0x43, 0x4D, 0x5024) /* <CJK */
-MAP(0x43, 0x4E, 0x77E5) /* <CJK */
-MAP(0x43, 0x4F, 0x5730) /* <CJK */
-MAP(0x43, 0x50, 0x5F1B) /* <CJK */
-MAP(0x43, 0x51, 0x6065) /* <CJK */
-MAP(0x43, 0x52, 0x667A) /* <CJK */
-MAP(0x43, 0x53, 0x6C60) /* <CJK */
-MAP(0x43, 0x54, 0x75F4) /* <CJK */
-MAP(0x43, 0x55, 0x7A1A) /* <CJK */
-MAP(0x43, 0x56, 0x7F6E) /* <CJK */
-MAP(0x43, 0x57, 0x81F4) /* <CJK */
-MAP(0x43, 0x58, 0x8718) /* <CJK */
-MAP(0x43, 0x59, 0x9045) /* <CJK */
-MAP(0x43, 0x5A, 0x99B3) /* <CJK */
-MAP(0x43, 0x5B, 0x7BC9) /* <CJK */
-MAP(0x43, 0x5C, 0x755C) /* <CJK */
-MAP(0x43, 0x5D, 0x7AF9) /* <CJK */
-MAP(0x43, 0x5E, 0x7B51) /* <CJK */
-MAP(0x43, 0x5F, 0x84C4) /* <CJK */
-MAP(0x43, 0x60, 0x9010) /* <CJK */
-MAP(0x43, 0x61, 0x79E9) /* <CJK */
-MAP(0x43, 0x62, 0x7A92) /* <CJK */
-MAP(0x43, 0x63, 0x8336) /* <CJK */
-MAP(0x43, 0x64, 0x5AE1) /* <CJK */
-MAP(0x43, 0x65, 0x7740) /* <CJK */
-MAP(0x43, 0x66, 0x4E2D) /* <CJK */
-MAP(0x43, 0x67, 0x4EF2) /* <CJK */
-MAP(0x43, 0x68, 0x5B99) /* <CJK */
-MAP(0x43, 0x69, 0x5FE0) /* <CJK */
-MAP(0x43, 0x6A, 0x62BD) /* <CJK */
-MAP(0x43, 0x6B, 0x663C) /* <CJK */
-MAP(0x43, 0x6C, 0x67F1) /* <CJK */
-MAP(0x43, 0x6D, 0x6CE8) /* <CJK */
-MAP(0x43, 0x6E, 0x866B) /* <CJK */
-MAP(0x43, 0x6F, 0x8877) /* <CJK */
-MAP(0x43, 0x70, 0x8A3B) /* <CJK */
-MAP(0x43, 0x71, 0x914E) /* <CJK */
-MAP(0x43, 0x72, 0x92F3) /* <CJK */
-MAP(0x43, 0x73, 0x99D0) /* <CJK */
-MAP(0x43, 0x74, 0x6A17) /* <CJK */
-MAP(0x43, 0x75, 0x7026) /* <CJK */
-MAP(0x43, 0x76, 0x732A) /* <CJK */
-MAP(0x43, 0x77, 0x82E7) /* <CJK */
-MAP(0x43, 0x78, 0x8457) /* <CJK */
-MAP(0x43, 0x79, 0x8CAF) /* <CJK */
-MAP(0x43, 0x7A, 0x4E01) /* <CJK */
-MAP(0x43, 0x7B, 0x5146) /* <CJK */
-MAP(0x43, 0x7C, 0x51CB) /* <CJK */
-MAP(0x43, 0x7D, 0x558B) /* <CJK */
-MAP(0x43, 0x7E, 0x5BF5) /* <CJK */
-MAP(0x44, 0x21, 0x5E16) /* <CJK */
-MAP(0x44, 0x22, 0x5E33) /* <CJK */
-MAP(0x44, 0x23, 0x5E81) /* <CJK */
-MAP(0x44, 0x24, 0x5F14) /* <CJK */
-MAP(0x44, 0x25, 0x5F35) /* <CJK */
-MAP(0x44, 0x26, 0x5F6B) /* <CJK */
-MAP(0x44, 0x27, 0x5FB4) /* <CJK */
-MAP(0x44, 0x28, 0x61F2) /* <CJK */
-MAP(0x44, 0x29, 0x6311) /* <CJK */
-MAP(0x44, 0x2A, 0x66A2) /* <CJK */
-MAP(0x44, 0x2B, 0x671D) /* <CJK */
-MAP(0x44, 0x2C, 0x6F6E) /* <CJK */
-MAP(0x44, 0x2D, 0x7252) /* <CJK */
-MAP(0x44, 0x2E, 0x753A) /* <CJK */
-MAP(0x44, 0x2F, 0x773A) /* <CJK */
-MAP(0x44, 0x30, 0x8074) /* <CJK */
-MAP(0x44, 0x31, 0x8139) /* <CJK */
-MAP(0x44, 0x32, 0x8178) /* <CJK */
-MAP(0x44, 0x33, 0x8776) /* <CJK */
-MAP(0x44, 0x34, 0x8ABF) /* <CJK */
-MAP(0x44, 0x35, 0x8ADC) /* <CJK */
-MAP(0x44, 0x36, 0x8D85) /* <CJK */
-MAP(0x44, 0x37, 0x8DF3) /* <CJK */
-MAP(0x44, 0x38, 0x929A) /* <CJK */
-MAP(0x44, 0x39, 0x9577) /* <CJK */
-MAP(0x44, 0x3A, 0x9802) /* <CJK */
-MAP(0x44, 0x3B, 0x9CE5) /* <CJK */
-MAP(0x44, 0x3C, 0x52C5) /* <CJK */
-MAP(0x44, 0x3D, 0x6357) /* <CJK */
-MAP(0x44, 0x3E, 0x76F4) /* <CJK */
-MAP(0x44, 0x3F, 0x6715) /* <CJK */
-MAP(0x44, 0x40, 0x6C88) /* <CJK */
-MAP(0x44, 0x41, 0x73CD) /* <CJK */
-MAP(0x44, 0x42, 0x8CC3) /* <CJK */
-MAP(0x44, 0x43, 0x93AE) /* <CJK */
-MAP(0x44, 0x44, 0x9673) /* <CJK */
-MAP(0x44, 0x45, 0x6D25) /* <CJK */
-MAP(0x44, 0x46, 0x589C) /* <CJK */
-MAP(0x44, 0x47, 0x690E) /* <CJK */
-MAP(0x44, 0x48, 0x69CC) /* <CJK */
-MAP(0x44, 0x49, 0x8FFD) /* <CJK */
-MAP(0x44, 0x4A, 0x939A) /* <CJK */
-MAP(0x44, 0x4B, 0x75DB) /* <CJK */
-MAP(0x44, 0x4C, 0x901A) /* <CJK */
-MAP(0x44, 0x4D, 0x585A) /* <CJK */
-MAP(0x44, 0x4E, 0x6802) /* <CJK */
-MAP(0x44, 0x4F, 0x63B4) /* <CJK */
-MAP(0x44, 0x50, 0x69FB) /* <CJK */
-MAP(0x44, 0x51, 0x4F43) /* <CJK */
-MAP(0x44, 0x52, 0x6F2C) /* <CJK */
-MAP(0x44, 0x53, 0x67D8) /* <CJK */
-MAP(0x44, 0x54, 0x8FBB) /* <CJK */
-MAP(0x44, 0x55, 0x8526) /* <CJK */
-MAP(0x44, 0x56, 0x7DB4) /* <CJK */
-MAP(0x44, 0x57, 0x9354) /* <CJK */
-MAP(0x44, 0x58, 0x693F) /* <CJK */
-MAP(0x44, 0x59, 0x6F70) /* <CJK */
-MAP(0x44, 0x5A, 0x576A) /* <CJK */
-MAP(0x44, 0x5B, 0x58F7) /* <CJK */
-MAP(0x44, 0x5C, 0x5B2C) /* <CJK */
-MAP(0x44, 0x5D, 0x7D2C) /* <CJK */
-MAP(0x44, 0x5E, 0x722A) /* <CJK */
-MAP(0x44, 0x5F, 0x540A) /* <CJK */
-MAP(0x44, 0x60, 0x91E3) /* <CJK */
-MAP(0x44, 0x61, 0x9DB4) /* <CJK */
-MAP(0x44, 0x62, 0x4EAD) /* <CJK */
-MAP(0x44, 0x63, 0x4F4E) /* <CJK */
-MAP(0x44, 0x64, 0x505C) /* <CJK */
-MAP(0x44, 0x65, 0x5075) /* <CJK */
-MAP(0x44, 0x66, 0x5243) /* <CJK */
-MAP(0x44, 0x67, 0x8C9E) /* <CJK */
-MAP(0x44, 0x68, 0x5448) /* <CJK */
-MAP(0x44, 0x69, 0x5824) /* <CJK */
-MAP(0x44, 0x6A, 0x5B9A) /* <CJK */
-MAP(0x44, 0x6B, 0x5E1D) /* <CJK */
-MAP(0x44, 0x6C, 0x5E95) /* <CJK */
-MAP(0x44, 0x6D, 0x5EAD) /* <CJK */
-MAP(0x44, 0x6E, 0x5EF7) /* <CJK */
-MAP(0x44, 0x6F, 0x5F1F) /* <CJK */
-MAP(0x44, 0x70, 0x608C) /* <CJK */
-MAP(0x44, 0x71, 0x62B5) /* <CJK */
-MAP(0x44, 0x72, 0x633A) /* <CJK */
-MAP(0x44, 0x73, 0x63D0) /* <CJK */
-MAP(0x44, 0x74, 0x68AF) /* <CJK */
-MAP(0x44, 0x75, 0x6C40) /* <CJK */
-MAP(0x44, 0x76, 0x7887) /* <CJK */
-MAP(0x44, 0x77, 0x798E) /* <CJK */
-MAP(0x44, 0x78, 0x7A0B) /* <CJK */
-MAP(0x44, 0x79, 0x7DE0) /* <CJK */
-MAP(0x44, 0x7A, 0x8247) /* <CJK */
-MAP(0x44, 0x7B, 0x8A02) /* <CJK */
-MAP(0x44, 0x7C, 0x8AE6) /* <CJK */
-MAP(0x44, 0x7D, 0x8E44) /* <CJK */
-MAP(0x44, 0x7E, 0x9013) /* <CJK */
-MAP(0x45, 0x21, 0x90B8) /* <CJK */
-MAP(0x45, 0x22, 0x912D) /* <CJK */
-MAP(0x45, 0x23, 0x91D8) /* <CJK */
-MAP(0x45, 0x24, 0x9F0E) /* <CJK */
-MAP(0x45, 0x25, 0x6CE5) /* <CJK */
-MAP(0x45, 0x26, 0x6458) /* <CJK */
-MAP(0x45, 0x27, 0x64E2) /* <CJK */
-MAP(0x45, 0x28, 0x6575) /* <CJK */
-MAP(0x45, 0x29, 0x6EF4) /* <CJK */
-MAP(0x45, 0x2A, 0x7684) /* <CJK */
-MAP(0x45, 0x2B, 0x7B1B) /* <CJK */
-MAP(0x45, 0x2C, 0x9069) /* <CJK */
-MAP(0x45, 0x2D, 0x93D1) /* <CJK */
-MAP(0x45, 0x2E, 0x6EBA) /* <CJK */
-MAP(0x45, 0x2F, 0x54F2) /* <CJK */
-MAP(0x45, 0x30, 0x5FB9) /* <CJK */
-MAP(0x45, 0x31, 0x64A4) /* <CJK */
-MAP(0x45, 0x32, 0x8F4D) /* <CJK */
-MAP(0x45, 0x33, 0x8FED) /* <CJK */
-MAP(0x45, 0x34, 0x9244) /* <CJK */
-MAP(0x45, 0x35, 0x5178) /* <CJK */
-MAP(0x45, 0x36, 0x586B) /* <CJK */
-MAP(0x45, 0x37, 0x5929) /* <CJK */
-MAP(0x45, 0x38, 0x5C55) /* <CJK */
-MAP(0x45, 0x39, 0x5E97) /* <CJK */
-MAP(0x45, 0x3A, 0x6DFB) /* <CJK */
-MAP(0x45, 0x3B, 0x7E8F) /* <CJK */
-MAP(0x45, 0x3C, 0x751C) /* <CJK */
-MAP(0x45, 0x3D, 0x8CBC) /* <CJK */
-MAP(0x45, 0x3E, 0x8EE2) /* <CJK */
-MAP(0x45, 0x3F, 0x985B) /* <CJK */
-MAP(0x45, 0x40, 0x70B9) /* <CJK */
-MAP(0x45, 0x41, 0x4F1D) /* <CJK */
-MAP(0x45, 0x42, 0x6BBF) /* <CJK */
-MAP(0x45, 0x43, 0x6FB1) /* <CJK */
-MAP(0x45, 0x44, 0x7530) /* <CJK */
-MAP(0x45, 0x45, 0x96FB) /* <CJK */
-MAP(0x45, 0x46, 0x514E) /* <CJK */
-MAP(0x45, 0x47, 0x5410) /* <CJK */
-MAP(0x45, 0x48, 0x5835) /* <CJK */
-MAP(0x45, 0x49, 0x5857) /* <CJK */
-MAP(0x45, 0x4A, 0x59AC) /* <CJK */
-MAP(0x45, 0x4B, 0x5C60) /* <CJK */
-MAP(0x45, 0x4C, 0x5F92) /* <CJK */
-MAP(0x45, 0x4D, 0x6597) /* <CJK */
-MAP(0x45, 0x4E, 0x675C) /* <CJK */
-MAP(0x45, 0x4F, 0x6E21) /* <CJK */
-MAP(0x45, 0x50, 0x767B) /* <CJK */
-MAP(0x45, 0x51, 0x83DF) /* <CJK */
-MAP(0x45, 0x52, 0x8CED) /* <CJK */
-MAP(0x45, 0x53, 0x9014) /* <CJK */
-MAP(0x45, 0x54, 0x90FD) /* <CJK */
-MAP(0x45, 0x55, 0x934D) /* <CJK */
-MAP(0x45, 0x56, 0x7825) /* <CJK */
-MAP(0x45, 0x57, 0x783A) /* <CJK */
-MAP(0x45, 0x58, 0x52AA) /* <CJK */
-MAP(0x45, 0x59, 0x5EA6) /* <CJK */
-MAP(0x45, 0x5A, 0x571F) /* <CJK */
-MAP(0x45, 0x5B, 0x5974) /* <CJK */
-MAP(0x45, 0x5C, 0x6012) /* <CJK */
-MAP(0x45, 0x5D, 0x5012) /* <CJK */
-MAP(0x45, 0x5E, 0x515A) /* <CJK */
-MAP(0x45, 0x5F, 0x51AC) /* <CJK */
-MAP(0x45, 0x60, 0x51CD) /* <CJK */
-MAP(0x45, 0x61, 0x5200) /* <CJK */
-MAP(0x45, 0x62, 0x5510) /* <CJK */
-MAP(0x45, 0x63, 0x5854) /* <CJK */
-MAP(0x45, 0x64, 0x5858) /* <CJK */
-MAP(0x45, 0x65, 0x5957) /* <CJK */
-MAP(0x45, 0x66, 0x5B95) /* <CJK */
-MAP(0x45, 0x67, 0x5CF6) /* <CJK */
-MAP(0x45, 0x68, 0x5D8B) /* <CJK */
-MAP(0x45, 0x69, 0x60BC) /* <CJK */
-MAP(0x45, 0x6A, 0x6295) /* <CJK */
-MAP(0x45, 0x6B, 0x642D) /* <CJK */
-MAP(0x45, 0x6C, 0x6771) /* <CJK */
-MAP(0x45, 0x6D, 0x6843) /* <CJK */
-MAP(0x45, 0x6E, 0x68BC) /* <CJK */
-MAP(0x45, 0x6F, 0x68DF) /* <CJK */
-MAP(0x45, 0x70, 0x76D7) /* <CJK */
-MAP(0x45, 0x71, 0x6DD8) /* <CJK */
-MAP(0x45, 0x72, 0x6E6F) /* <CJK */
-MAP(0x45, 0x73, 0x6D9B) /* <CJK */
-MAP(0x45, 0x74, 0x706F) /* <CJK */
-MAP(0x45, 0x75, 0x71C8) /* <CJK */
-MAP(0x45, 0x76, 0x5F53) /* <CJK */
-MAP(0x45, 0x77, 0x75D8) /* <CJK */
-MAP(0x45, 0x78, 0x7977) /* <CJK */
-MAP(0x45, 0x79, 0x7B49) /* <CJK */
-MAP(0x45, 0x7A, 0x7B54) /* <CJK */
-MAP(0x45, 0x7B, 0x7B52) /* <CJK */
-MAP(0x45, 0x7C, 0x7CD6) /* <CJK */
-MAP(0x45, 0x7D, 0x7D71) /* <CJK */
-MAP(0x45, 0x7E, 0x5230) /* <CJK */
-MAP(0x46, 0x21, 0x8463) /* <CJK */
-MAP(0x46, 0x22, 0x8569) /* <CJK */
-MAP(0x46, 0x23, 0x85E4) /* <CJK */
-MAP(0x46, 0x24, 0x8A0E) /* <CJK */
-MAP(0x46, 0x25, 0x8B04) /* <CJK */
-MAP(0x46, 0x26, 0x8C46) /* <CJK */
-MAP(0x46, 0x27, 0x8E0F) /* <CJK */
-MAP(0x46, 0x28, 0x9003) /* <CJK */
-MAP(0x46, 0x29, 0x900F) /* <CJK */
-MAP(0x46, 0x2A, 0x9419) /* <CJK */
-MAP(0x46, 0x2B, 0x9676) /* <CJK */
-MAP(0x46, 0x2C, 0x982D) /* <CJK */
-MAP(0x46, 0x2D, 0x9A30) /* <CJK */
-MAP(0x46, 0x2E, 0x95D8) /* <CJK */
-MAP(0x46, 0x2F, 0x50CD) /* <CJK */
-MAP(0x46, 0x30, 0x52D5) /* <CJK */
-MAP(0x46, 0x31, 0x540C) /* <CJK */
-MAP(0x46, 0x32, 0x5802) /* <CJK */
-MAP(0x46, 0x33, 0x5C0E) /* <CJK */
-MAP(0x46, 0x34, 0x61A7) /* <CJK */
-MAP(0x46, 0x35, 0x649E) /* <CJK */
-MAP(0x46, 0x36, 0x6D1E) /* <CJK */
-MAP(0x46, 0x37, 0x77B3) /* <CJK */
-MAP(0x46, 0x38, 0x7AE5) /* <CJK */
-MAP(0x46, 0x39, 0x80F4) /* <CJK */
-MAP(0x46, 0x3A, 0x8404) /* <CJK */
-MAP(0x46, 0x3B, 0x9053) /* <CJK */
-MAP(0x46, 0x3C, 0x9285) /* <CJK */
-MAP(0x46, 0x3D, 0x5CE0) /* <CJK */
-MAP(0x46, 0x3E, 0x9D07) /* <CJK */
-MAP(0x46, 0x3F, 0x533F) /* <CJK */
-MAP(0x46, 0x40, 0x5F97) /* <CJK */
-MAP(0x46, 0x41, 0x5FB3) /* <CJK */
-MAP(0x46, 0x42, 0x6D9C) /* <CJK */
-MAP(0x46, 0x43, 0x7279) /* <CJK */
-MAP(0x46, 0x44, 0x7763) /* <CJK */
-MAP(0x46, 0x45, 0x79BF) /* <CJK */
-MAP(0x46, 0x46, 0x7BE4) /* <CJK */
-MAP(0x46, 0x47, 0x6BD2) /* <CJK */
-MAP(0x46, 0x48, 0x72EC) /* <CJK */
-MAP(0x46, 0x49, 0x8AAD) /* <CJK */
-MAP(0x46, 0x4A, 0x6803) /* <CJK */
-MAP(0x46, 0x4B, 0x6A61) /* <CJK */
-MAP(0x46, 0x4C, 0x51F8) /* <CJK */
-MAP(0x46, 0x4D, 0x7A81) /* <CJK */
-MAP(0x46, 0x4E, 0x6934) /* <CJK */
-MAP(0x46, 0x4F, 0x5C4A) /* <CJK */
-MAP(0x46, 0x50, 0x9CF6) /* <CJK */
-MAP(0x46, 0x51, 0x82EB) /* <CJK */
-MAP(0x46, 0x52, 0x5BC5) /* <CJK */
-MAP(0x46, 0x53, 0x9149) /* <CJK */
-MAP(0x46, 0x54, 0x701E) /* <CJK */
-MAP(0x46, 0x55, 0x5678) /* <CJK */
-MAP(0x46, 0x56, 0x5C6F) /* <CJK */
-MAP(0x46, 0x57, 0x60C7) /* <CJK */
-MAP(0x46, 0x58, 0x6566) /* <CJK */
-MAP(0x46, 0x59, 0x6C8C) /* <CJK */
-MAP(0x46, 0x5A, 0x8C5A) /* <CJK */
-MAP(0x46, 0x5B, 0x9041) /* <CJK */
-MAP(0x46, 0x5C, 0x9813) /* <CJK */
-MAP(0x46, 0x5D, 0x5451) /* <CJK */
-MAP(0x46, 0x5E, 0x66C7) /* <CJK */
-MAP(0x46, 0x5F, 0x920D) /* <CJK */
-MAP(0x46, 0x60, 0x5948) /* <CJK */
-MAP(0x46, 0x61, 0x90A3) /* <CJK */
-MAP(0x46, 0x62, 0x5185) /* <CJK */
-MAP(0x46, 0x63, 0x4E4D) /* <CJK */
-MAP(0x46, 0x64, 0x51EA) /* <CJK */
-MAP(0x46, 0x65, 0x8599) /* <CJK */
-MAP(0x46, 0x66, 0x8B0E) /* <CJK */
-MAP(0x46, 0x67, 0x7058) /* <CJK */
-MAP(0x46, 0x68, 0x637A) /* <CJK */
-MAP(0x46, 0x69, 0x934B) /* <CJK */
-MAP(0x46, 0x6A, 0x6962) /* <CJK */
-MAP(0x46, 0x6B, 0x99B4) /* <CJK */
-MAP(0x46, 0x6C, 0x7E04) /* <CJK */
-MAP(0x46, 0x6D, 0x7577) /* <CJK */
-MAP(0x46, 0x6E, 0x5357) /* <CJK */
-MAP(0x46, 0x6F, 0x6960) /* <CJK */
-MAP(0x46, 0x70, 0x8EDF) /* <CJK */
-MAP(0x46, 0x71, 0x96E3) /* <CJK */
-MAP(0x46, 0x72, 0x6C5D) /* <CJK */
-MAP(0x46, 0x73, 0x4E8C) /* <CJK */
-MAP(0x46, 0x74, 0x5C3C) /* <CJK */
-MAP(0x46, 0x75, 0x5F10) /* <CJK */
-MAP(0x46, 0x76, 0x8FE9) /* <CJK */
-MAP(0x46, 0x77, 0x5302) /* <CJK */
-MAP(0x46, 0x78, 0x8CD1) /* <CJK */
-MAP(0x46, 0x79, 0x8089) /* <CJK */
-MAP(0x46, 0x7A, 0x8679) /* <CJK */
-MAP(0x46, 0x7B, 0x5EFF) /* <CJK */
-MAP(0x46, 0x7C, 0x65E5) /* <CJK */
-MAP(0x46, 0x7D, 0x4E73) /* <CJK */
-MAP(0x46, 0x7E, 0x5165) /* <CJK */
-MAP(0x47, 0x21, 0x5982) /* <CJK */
-MAP(0x47, 0x22, 0x5C3F) /* <CJK */
-MAP(0x47, 0x23, 0x97EE) /* <CJK */
-MAP(0x47, 0x24, 0x4EFB) /* <CJK */
-MAP(0x47, 0x25, 0x598A) /* <CJK */
-MAP(0x47, 0x26, 0x5FCD) /* <CJK */
-MAP(0x47, 0x27, 0x8A8D) /* <CJK */
-MAP(0x47, 0x28, 0x6FE1) /* <CJK */
-MAP(0x47, 0x29, 0x79B0) /* <CJK */
-MAP(0x47, 0x2A, 0x7962) /* <CJK */
-MAP(0x47, 0x2B, 0x5BE7) /* <CJK */
-MAP(0x47, 0x2C, 0x8471) /* <CJK */
-MAP(0x47, 0x2D, 0x732B) /* <CJK */
-MAP(0x47, 0x2E, 0x71B1) /* <CJK */
-MAP(0x47, 0x2F, 0x5E74) /* <CJK */
-MAP(0x47, 0x30, 0x5FF5) /* <CJK */
-MAP(0x47, 0x31, 0x637B) /* <CJK */
-MAP(0x47, 0x32, 0x649A) /* <CJK */
-MAP(0x47, 0x33, 0x71C3) /* <CJK */
-MAP(0x47, 0x34, 0x7C98) /* <CJK */
-MAP(0x47, 0x35, 0x4E43) /* <CJK */
-MAP(0x47, 0x36, 0x5EFC) /* <CJK */
-MAP(0x47, 0x37, 0x4E4B) /* <CJK */
-MAP(0x47, 0x38, 0x57DC) /* <CJK */
-MAP(0x47, 0x39, 0x56A2) /* <CJK */
-MAP(0x47, 0x3A, 0x60A9) /* <CJK */
-MAP(0x47, 0x3B, 0x6FC3) /* <CJK */
-MAP(0x47, 0x3C, 0x7D0D) /* <CJK */
-MAP(0x47, 0x3D, 0x80FD) /* <CJK */
-MAP(0x47, 0x3E, 0x8133) /* <CJK */
-MAP(0x47, 0x3F, 0x81BF) /* <CJK */
-MAP(0x47, 0x40, 0x8FB2) /* <CJK */
-MAP(0x47, 0x41, 0x8997) /* <CJK */
-MAP(0x47, 0x42, 0x86A4) /* <CJK */
-MAP(0x47, 0x43, 0x5DF4) /* <CJK */
-MAP(0x47, 0x44, 0x628A) /* <CJK */
-MAP(0x47, 0x45, 0x64AD) /* <CJK */
-MAP(0x47, 0x46, 0x8987) /* <CJK */
-MAP(0x47, 0x47, 0x6777) /* <CJK */
-MAP(0x47, 0x48, 0x6CE2) /* <CJK */
-MAP(0x47, 0x49, 0x6D3E) /* <CJK */
-MAP(0x47, 0x4A, 0x7436) /* <CJK */
-MAP(0x47, 0x4B, 0x7834) /* <CJK */
-MAP(0x47, 0x4C, 0x5A46) /* <CJK */
-MAP(0x47, 0x4D, 0x7F75) /* <CJK */
-MAP(0x47, 0x4E, 0x82AD) /* <CJK */
-MAP(0x47, 0x4F, 0x99AC) /* <CJK */
-MAP(0x47, 0x50, 0x4FF3) /* <CJK */
-MAP(0x47, 0x51, 0x5EC3) /* <CJK */
-MAP(0x47, 0x52, 0x62DD) /* <CJK */
-MAP(0x47, 0x53, 0x6392) /* <CJK */
-MAP(0x47, 0x54, 0x6557) /* <CJK */
-MAP(0x47, 0x55, 0x676F) /* <CJK */
-MAP(0x47, 0x56, 0x76C3) /* <CJK */
-MAP(0x47, 0x57, 0x724C) /* <CJK */
-MAP(0x47, 0x58, 0x80CC) /* <CJK */
-MAP(0x47, 0x59, 0x80BA) /* <CJK */
-MAP(0x47, 0x5A, 0x8F29) /* <CJK */
-MAP(0x47, 0x5B, 0x914D) /* <CJK */
-MAP(0x47, 0x5C, 0x500D) /* <CJK */
-MAP(0x47, 0x5D, 0x57F9) /* <CJK */
-MAP(0x47, 0x5E, 0x5A92) /* <CJK */
-MAP(0x47, 0x5F, 0x6885) /* <CJK */
-MAP(0x47, 0x60, 0x6973) /* <CJK */
-MAP(0x47, 0x61, 0x7164) /* <CJK */
-MAP(0x47, 0x62, 0x72FD) /* <CJK */
-MAP(0x47, 0x63, 0x8CB7) /* <CJK */
-MAP(0x47, 0x64, 0x58F2) /* <CJK */
-MAP(0x47, 0x65, 0x8CE0) /* <CJK */
-MAP(0x47, 0x66, 0x966A) /* <CJK */
-MAP(0x47, 0x67, 0x9019) /* <CJK */
-MAP(0x47, 0x68, 0x877F) /* <CJK */
-MAP(0x47, 0x69, 0x79E4) /* <CJK */
-MAP(0x47, 0x6A, 0x77E7) /* <CJK */
-MAP(0x47, 0x6B, 0x8429) /* <CJK */
-MAP(0x47, 0x6C, 0x4F2F) /* <CJK */
-MAP(0x47, 0x6D, 0x5265) /* <CJK */
-MAP(0x47, 0x6E, 0x535A) /* <CJK */
-MAP(0x47, 0x6F, 0x62CD) /* <CJK */
-MAP(0x47, 0x70, 0x67CF) /* <CJK */
-MAP(0x47, 0x71, 0x6CCA) /* <CJK */
-MAP(0x47, 0x72, 0x767D) /* <CJK */
-MAP(0x47, 0x73, 0x7B94) /* <CJK */
-MAP(0x47, 0x74, 0x7C95) /* <CJK */
-MAP(0x47, 0x75, 0x8236) /* <CJK */
-MAP(0x47, 0x76, 0x8584) /* <CJK */
-MAP(0x47, 0x77, 0x8FEB) /* <CJK */
-MAP(0x47, 0x78, 0x66DD) /* <CJK */
-MAP(0x47, 0x79, 0x6F20) /* <CJK */
-MAP(0x47, 0x7A, 0x7206) /* <CJK */
-MAP(0x47, 0x7B, 0x7E1B) /* <CJK */
-MAP(0x47, 0x7C, 0x83AB) /* <CJK */
-MAP(0x47, 0x7D, 0x99C1) /* <CJK */
-MAP(0x47, 0x7E, 0x9EA6) /* <CJK */
-MAP(0x48, 0x21, 0x51FD) /* <CJK */
-MAP(0x48, 0x22, 0x7BB1) /* <CJK */
-MAP(0x48, 0x23, 0x7872) /* <CJK */
-MAP(0x48, 0x24, 0x7BB8) /* <CJK */
-MAP(0x48, 0x25, 0x8087) /* <CJK */
-MAP(0x48, 0x26, 0x7B48) /* <CJK */
-MAP(0x48, 0x27, 0x6AE8) /* <CJK */
-MAP(0x48, 0x28, 0x5E61) /* <CJK */
-MAP(0x48, 0x29, 0x808C) /* <CJK */
-MAP(0x48, 0x2A, 0x7551) /* <CJK */
-MAP(0x48, 0x2B, 0x7560) /* <CJK */
-MAP(0x48, 0x2C, 0x516B) /* <CJK */
-MAP(0x48, 0x2D, 0x9262) /* <CJK */
-MAP(0x48, 0x2E, 0x6E8C) /* <CJK */
-MAP(0x48, 0x2F, 0x767A) /* <CJK */
-MAP(0x48, 0x30, 0x9197) /* <CJK */
-MAP(0x48, 0x31, 0x9AEA) /* <CJK */
-MAP(0x48, 0x32, 0x4F10) /* <CJK */
-MAP(0x48, 0x33, 0x7F70) /* <CJK */
-MAP(0x48, 0x34, 0x629C) /* <CJK */
-MAP(0x48, 0x35, 0x7B4F) /* <CJK */
-MAP(0x48, 0x36, 0x95A5) /* <CJK */
-MAP(0x48, 0x37, 0x9CE9) /* <CJK */
-MAP(0x48, 0x38, 0x567A) /* <CJK */
-MAP(0x48, 0x39, 0x5859) /* <CJK */
-MAP(0x48, 0x3A, 0x86E4) /* <CJK */
-MAP(0x48, 0x3B, 0x96BC) /* <CJK */
-MAP(0x48, 0x3C, 0x4F34) /* <CJK */
-MAP(0x48, 0x3D, 0x5224) /* <CJK */
-MAP(0x48, 0x3E, 0x534A) /* <CJK */
-MAP(0x48, 0x3F, 0x53CD) /* <CJK */
-MAP(0x48, 0x40, 0x53DB) /* <CJK */
-MAP(0x48, 0x41, 0x5E06) /* <CJK */
-MAP(0x48, 0x42, 0x642C) /* <CJK */
-MAP(0x48, 0x43, 0x6591) /* <CJK */
-MAP(0x48, 0x44, 0x677F) /* <CJK */
-MAP(0x48, 0x45, 0x6C3E) /* <CJK */
-MAP(0x48, 0x46, 0x6C4E) /* <CJK */
-MAP(0x48, 0x47, 0x7248) /* <CJK */
-MAP(0x48, 0x48, 0x72AF) /* <CJK */
-MAP(0x48, 0x49, 0x73ED) /* <CJK */
-MAP(0x48, 0x4A, 0x7554) /* <CJK */
-MAP(0x48, 0x4B, 0x7E41) /* <CJK */
-MAP(0x48, 0x4C, 0x822C) /* <CJK */
-MAP(0x48, 0x4D, 0x85E9) /* <CJK */
-MAP(0x48, 0x4E, 0x8CA9) /* <CJK */
-MAP(0x48, 0x4F, 0x7BC4) /* <CJK */
-MAP(0x48, 0x50, 0x91C6) /* <CJK */
-MAP(0x48, 0x51, 0x7169) /* <CJK */
-MAP(0x48, 0x52, 0x9812) /* <CJK */
-MAP(0x48, 0x53, 0x98EF) /* <CJK */
-MAP(0x48, 0x54, 0x633D) /* <CJK */
-MAP(0x48, 0x55, 0x6669) /* <CJK */
-MAP(0x48, 0x56, 0x756A) /* <CJK */
-MAP(0x48, 0x57, 0x76E4) /* <CJK */
-MAP(0x48, 0x58, 0x78D0) /* <CJK */
-MAP(0x48, 0x59, 0x8543) /* <CJK */
-MAP(0x48, 0x5A, 0x86EE) /* <CJK */
-MAP(0x48, 0x5B, 0x532A) /* <CJK */
-MAP(0x48, 0x5C, 0x5351) /* <CJK */
-MAP(0x48, 0x5D, 0x5426) /* <CJK */
-MAP(0x48, 0x5E, 0x5983) /* <CJK */
-MAP(0x48, 0x5F, 0x5E87) /* <CJK */
-MAP(0x48, 0x60, 0x5F7C) /* <CJK */
-MAP(0x48, 0x61, 0x60B2) /* <CJK */
-MAP(0x48, 0x62, 0x6249) /* <CJK */
-MAP(0x48, 0x63, 0x6279) /* <CJK */
-MAP(0x48, 0x64, 0x62AB) /* <CJK */
-MAP(0x48, 0x65, 0x6590) /* <CJK */
-MAP(0x48, 0x66, 0x6BD4) /* <CJK */
-MAP(0x48, 0x67, 0x6CCC) /* <CJK */
-MAP(0x48, 0x68, 0x75B2) /* <CJK */
-MAP(0x48, 0x69, 0x76AE) /* <CJK */
-MAP(0x48, 0x6A, 0x7891) /* <CJK */
-MAP(0x48, 0x6B, 0x79D8) /* <CJK */
-MAP(0x48, 0x6C, 0x7DCB) /* <CJK */
-MAP(0x48, 0x6D, 0x7F77) /* <CJK */
-MAP(0x48, 0x6E, 0x80A5) /* <CJK */
-MAP(0x48, 0x6F, 0x88AB) /* <CJK */
-MAP(0x48, 0x70, 0x8AB9) /* <CJK */
-MAP(0x48, 0x71, 0x8CBB) /* <CJK */
-MAP(0x48, 0x72, 0x907F) /* <CJK */
-MAP(0x48, 0x73, 0x975E) /* <CJK */
-MAP(0x48, 0x74, 0x98DB) /* <CJK */
-MAP(0x48, 0x75, 0x6A0B) /* <CJK */
-MAP(0x48, 0x76, 0x7C38) /* <CJK */
-MAP(0x48, 0x77, 0x5099) /* <CJK */
-MAP(0x48, 0x78, 0x5C3E) /* <CJK */
-MAP(0x48, 0x79, 0x5FAE) /* <CJK */
-MAP(0x48, 0x7A, 0x6787) /* <CJK */
-MAP(0x48, 0x7B, 0x6BD8) /* <CJK */
-MAP(0x48, 0x7C, 0x7435) /* <CJK */
-MAP(0x48, 0x7D, 0x7709) /* <CJK */
-MAP(0x48, 0x7E, 0x7F8E) /* <CJK */
-MAP(0x49, 0x21, 0x9F3B) /* <CJK */
-MAP(0x49, 0x22, 0x67CA) /* <CJK */
-MAP(0x49, 0x23, 0x7A17) /* <CJK */
-MAP(0x49, 0x24, 0x5339) /* <CJK */
-MAP(0x49, 0x25, 0x758B) /* <CJK */
-MAP(0x49, 0x26, 0x9AED) /* <CJK */
-MAP(0x49, 0x27, 0x5F66) /* <CJK */
-MAP(0x49, 0x28, 0x819D) /* <CJK */
-MAP(0x49, 0x29, 0x83F1) /* <CJK */
-MAP(0x49, 0x2A, 0x8098) /* <CJK */
-MAP(0x49, 0x2B, 0x5F3C) /* <CJK */
-MAP(0x49, 0x2C, 0x5FC5) /* <CJK */
-MAP(0x49, 0x2D, 0x7562) /* <CJK */
-MAP(0x49, 0x2E, 0x7B46) /* <CJK */
-MAP(0x49, 0x2F, 0x903C) /* <CJK */
-MAP(0x49, 0x30, 0x6867) /* <CJK */
-MAP(0x49, 0x31, 0x59EB) /* <CJK */
-MAP(0x49, 0x32, 0x5A9B) /* <CJK */
-MAP(0x49, 0x33, 0x7D10) /* <CJK */
-MAP(0x49, 0x34, 0x767E) /* <CJK */
-MAP(0x49, 0x35, 0x8B2C) /* <CJK */
-MAP(0x49, 0x36, 0x4FF5) /* <CJK */
-MAP(0x49, 0x37, 0x5F6A) /* <CJK */
-MAP(0x49, 0x38, 0x6A19) /* <CJK */
-MAP(0x49, 0x39, 0x6C37) /* <CJK */
-MAP(0x49, 0x3A, 0x6F02) /* <CJK */
-MAP(0x49, 0x3B, 0x74E2) /* <CJK */
-MAP(0x49, 0x3C, 0x7968) /* <CJK */
-MAP(0x49, 0x3D, 0x8868) /* <CJK */
-MAP(0x49, 0x3E, 0x8A55) /* <CJK */
-MAP(0x49, 0x3F, 0x8C79) /* <CJK */
-MAP(0x49, 0x40, 0x5EDF) /* <CJK */
-MAP(0x49, 0x41, 0x63CF) /* <CJK */
-MAP(0x49, 0x42, 0x75C5) /* <CJK */
-MAP(0x49, 0x43, 0x79D2) /* <CJK */
-MAP(0x49, 0x44, 0x82D7) /* <CJK */
-MAP(0x49, 0x45, 0x9328) /* <CJK */
-MAP(0x49, 0x46, 0x92F2) /* <CJK */
-MAP(0x49, 0x47, 0x849C) /* <CJK */
-MAP(0x49, 0x48, 0x86ED) /* <CJK */
-MAP(0x49, 0x49, 0x9C2D) /* <CJK */
-MAP(0x49, 0x4A, 0x54C1) /* <CJK */
-MAP(0x49, 0x4B, 0x5F6C) /* <CJK */
-MAP(0x49, 0x4C, 0x658C) /* <CJK */
-MAP(0x49, 0x4D, 0x6D5C) /* <CJK */
-MAP(0x49, 0x4E, 0x7015) /* <CJK */
-MAP(0x49, 0x4F, 0x8CA7) /* <CJK */
-MAP(0x49, 0x50, 0x8CD3) /* <CJK */
-MAP(0x49, 0x51, 0x983B) /* <CJK */
-MAP(0x49, 0x52, 0x654F) /* <CJK */
-MAP(0x49, 0x53, 0x74F6) /* <CJK */
-MAP(0x49, 0x54, 0x4E0D) /* <CJK */
-MAP(0x49, 0x55, 0x4ED8) /* <CJK */
-MAP(0x49, 0x56, 0x57E0) /* <CJK */
-MAP(0x49, 0x57, 0x592B) /* <CJK */
-MAP(0x49, 0x58, 0x5A66) /* <CJK */
-MAP(0x49, 0x59, 0x5BCC) /* <CJK */
-MAP(0x49, 0x5A, 0x51A8) /* <CJK */
-MAP(0x49, 0x5B, 0x5E03) /* <CJK */
-MAP(0x49, 0x5C, 0x5E9C) /* <CJK */
-MAP(0x49, 0x5D, 0x6016) /* <CJK */
-MAP(0x49, 0x5E, 0x6276) /* <CJK */
-MAP(0x49, 0x5F, 0x6577) /* <CJK */
-MAP(0x49, 0x60, 0x65A7) /* <CJK */
-MAP(0x49, 0x61, 0x666E) /* <CJK */
-MAP(0x49, 0x62, 0x6D6E) /* <CJK */
-MAP(0x49, 0x63, 0x7236) /* <CJK */
-MAP(0x49, 0x64, 0x7B26) /* <CJK */
-MAP(0x49, 0x65, 0x8150) /* <CJK */
-MAP(0x49, 0x66, 0x819A) /* <CJK */
-MAP(0x49, 0x67, 0x8299) /* <CJK */
-MAP(0x49, 0x68, 0x8B5C) /* <CJK */
-MAP(0x49, 0x69, 0x8CA0) /* <CJK */
-MAP(0x49, 0x6A, 0x8CE6) /* <CJK */
-MAP(0x49, 0x6B, 0x8D74) /* <CJK */
-MAP(0x49, 0x6C, 0x961C) /* <CJK */
-MAP(0x49, 0x6D, 0x9644) /* <CJK */
-MAP(0x49, 0x6E, 0x4FAE) /* <CJK */
-MAP(0x49, 0x6F, 0x64AB) /* <CJK */
-MAP(0x49, 0x70, 0x6B66) /* <CJK */
-MAP(0x49, 0x71, 0x821E) /* <CJK */
-MAP(0x49, 0x72, 0x8461) /* <CJK */
-MAP(0x49, 0x73, 0x856A) /* <CJK */
-MAP(0x49, 0x74, 0x90E8) /* <CJK */
-MAP(0x49, 0x75, 0x5C01) /* <CJK */
-MAP(0x49, 0x76, 0x6953) /* <CJK */
-MAP(0x49, 0x77, 0x98A8) /* <CJK */
-MAP(0x49, 0x78, 0x847A) /* <CJK */
-MAP(0x49, 0x79, 0x8557) /* <CJK */
-MAP(0x49, 0x7A, 0x4F0F) /* <CJK */
-MAP(0x49, 0x7B, 0x526F) /* <CJK */
-MAP(0x49, 0x7C, 0x5FA9) /* <CJK */
-MAP(0x49, 0x7D, 0x5E45) /* <CJK */
-MAP(0x49, 0x7E, 0x670D) /* <CJK */
-MAP(0x4A, 0x21, 0x798F) /* <CJK */
-MAP(0x4A, 0x22, 0x8179) /* <CJK */
-MAP(0x4A, 0x23, 0x8907) /* <CJK */
-MAP(0x4A, 0x24, 0x8986) /* <CJK */
-MAP(0x4A, 0x25, 0x6DF5) /* <CJK */
-MAP(0x4A, 0x26, 0x5F17) /* <CJK */
-MAP(0x4A, 0x27, 0x6255) /* <CJK */
-MAP(0x4A, 0x28, 0x6CB8) /* <CJK */
-MAP(0x4A, 0x29, 0x4ECF) /* <CJK */
-MAP(0x4A, 0x2A, 0x7269) /* <CJK */
-MAP(0x4A, 0x2B, 0x9B92) /* <CJK */
-MAP(0x4A, 0x2C, 0x5206) /* <CJK */
-MAP(0x4A, 0x2D, 0x543B) /* <CJK */
-MAP(0x4A, 0x2E, 0x5674) /* <CJK */
-MAP(0x4A, 0x2F, 0x58B3) /* <CJK */
-MAP(0x4A, 0x30, 0x61A4) /* <CJK */
-MAP(0x4A, 0x31, 0x626E) /* <CJK */
-MAP(0x4A, 0x32, 0x711A) /* <CJK */
-MAP(0x4A, 0x33, 0x596E) /* <CJK */
-MAP(0x4A, 0x34, 0x7C89) /* <CJK */
-MAP(0x4A, 0x35, 0x7CDE) /* <CJK */
-MAP(0x4A, 0x36, 0x7D1B) /* <CJK */
-MAP(0x4A, 0x37, 0x96F0) /* <CJK */
-MAP(0x4A, 0x38, 0x6587) /* <CJK */
-MAP(0x4A, 0x39, 0x805E) /* <CJK */
-MAP(0x4A, 0x3A, 0x4E19) /* <CJK */
-MAP(0x4A, 0x3B, 0x4F75) /* <CJK */
-MAP(0x4A, 0x3C, 0x5175) /* <CJK */
-MAP(0x4A, 0x3D, 0x5840) /* <CJK */
-MAP(0x4A, 0x3E, 0x5E63) /* <CJK */
-MAP(0x4A, 0x3F, 0x5E73) /* <CJK */
-MAP(0x4A, 0x40, 0x5F0A) /* <CJK */
-MAP(0x4A, 0x41, 0x67C4) /* <CJK */
-MAP(0x4A, 0x42, 0x4E26) /* <CJK */
-MAP(0x4A, 0x43, 0x853D) /* <CJK */
-MAP(0x4A, 0x44, 0x9589) /* <CJK */
-MAP(0x4A, 0x45, 0x965B) /* <CJK */
-MAP(0x4A, 0x46, 0x7C73) /* <CJK */
-MAP(0x4A, 0x47, 0x9801) /* <CJK */
-MAP(0x4A, 0x48, 0x50FB) /* <CJK */
-MAP(0x4A, 0x49, 0x58C1) /* <CJK */
-MAP(0x4A, 0x4A, 0x7656) /* <CJK */
-MAP(0x4A, 0x4B, 0x78A7) /* <CJK */
-MAP(0x4A, 0x4C, 0x5225) /* <CJK */
-MAP(0x4A, 0x4D, 0x77A5) /* <CJK */
-MAP(0x4A, 0x4E, 0x8511) /* <CJK */
-MAP(0x4A, 0x4F, 0x7B86) /* <CJK */
-MAP(0x4A, 0x50, 0x504F) /* <CJK */
-MAP(0x4A, 0x51, 0x5909) /* <CJK */
-MAP(0x4A, 0x52, 0x7247) /* <CJK */
-MAP(0x4A, 0x53, 0x7BC7) /* <CJK */
-MAP(0x4A, 0x54, 0x7DE8) /* <CJK */
-MAP(0x4A, 0x55, 0x8FBA) /* <CJK */
-MAP(0x4A, 0x56, 0x8FD4) /* <CJK */
-MAP(0x4A, 0x57, 0x904D) /* <CJK */
-MAP(0x4A, 0x58, 0x4FBF) /* <CJK */
-MAP(0x4A, 0x59, 0x52C9) /* <CJK */
-MAP(0x4A, 0x5A, 0x5A29) /* <CJK */
-MAP(0x4A, 0x5B, 0x5F01) /* <CJK */
-MAP(0x4A, 0x5C, 0x97AD) /* <CJK */
-MAP(0x4A, 0x5D, 0x4FDD) /* <CJK */
-MAP(0x4A, 0x5E, 0x8217) /* <CJK */
-MAP(0x4A, 0x5F, 0x92EA) /* <CJK */
-MAP(0x4A, 0x60, 0x5703) /* <CJK */
-MAP(0x4A, 0x61, 0x6355) /* <CJK */
-MAP(0x4A, 0x62, 0x6B69) /* <CJK */
-MAP(0x4A, 0x63, 0x752B) /* <CJK */
-MAP(0x4A, 0x64, 0x88DC) /* <CJK */
-MAP(0x4A, 0x65, 0x8F14) /* <CJK */
-MAP(0x4A, 0x66, 0x7A42) /* <CJK */
-MAP(0x4A, 0x67, 0x52DF) /* <CJK */
-MAP(0x4A, 0x68, 0x5893) /* <CJK */
-MAP(0x4A, 0x69, 0x6155) /* <CJK */
-MAP(0x4A, 0x6A, 0x620A) /* <CJK */
-MAP(0x4A, 0x6B, 0x66AE) /* <CJK */
-MAP(0x4A, 0x6C, 0x6BCD) /* <CJK */
-MAP(0x4A, 0x6D, 0x7C3F) /* <CJK */
-MAP(0x4A, 0x6E, 0x83E9) /* <CJK */
-MAP(0x4A, 0x6F, 0x5023) /* <CJK */
-MAP(0x4A, 0x70, 0x4FF8) /* <CJK */
-MAP(0x4A, 0x71, 0x5305) /* <CJK */
-MAP(0x4A, 0x72, 0x5446) /* <CJK */
-MAP(0x4A, 0x73, 0x5831) /* <CJK */
-MAP(0x4A, 0x74, 0x5949) /* <CJK */
-MAP(0x4A, 0x75, 0x5B9D) /* <CJK */
-MAP(0x4A, 0x76, 0x5CF0) /* <CJK */
-MAP(0x4A, 0x77, 0x5CEF) /* <CJK */
-MAP(0x4A, 0x78, 0x5D29) /* <CJK */
-MAP(0x4A, 0x79, 0x5E96) /* <CJK */
-MAP(0x4A, 0x7A, 0x62B1) /* <CJK */
-MAP(0x4A, 0x7B, 0x6367) /* <CJK */
-MAP(0x4A, 0x7C, 0x653E) /* <CJK */
-MAP(0x4A, 0x7D, 0x65B9) /* <CJK */
-MAP(0x4A, 0x7E, 0x670B) /* <CJK */
-MAP(0x4B, 0x21, 0x6CD5) /* <CJK */
-MAP(0x4B, 0x22, 0x6CE1) /* <CJK */
-MAP(0x4B, 0x23, 0x70F9) /* <CJK */
-MAP(0x4B, 0x24, 0x7832) /* <CJK */
-MAP(0x4B, 0x25, 0x7E2B) /* <CJK */
-MAP(0x4B, 0x26, 0x80DE) /* <CJK */
-MAP(0x4B, 0x27, 0x82B3) /* <CJK */
-MAP(0x4B, 0x28, 0x840C) /* <CJK */
-MAP(0x4B, 0x29, 0x84EC) /* <CJK */
-MAP(0x4B, 0x2A, 0x8702) /* <CJK */
-MAP(0x4B, 0x2B, 0x8912) /* <CJK */
-MAP(0x4B, 0x2C, 0x8A2A) /* <CJK */
-MAP(0x4B, 0x2D, 0x8C4A) /* <CJK */
-MAP(0x4B, 0x2E, 0x90A6) /* <CJK */
-MAP(0x4B, 0x2F, 0x92D2) /* <CJK */
-MAP(0x4B, 0x30, 0x98FD) /* <CJK */
-MAP(0x4B, 0x31, 0x9CF3) /* <CJK */
-MAP(0x4B, 0x32, 0x9D6C) /* <CJK */
-MAP(0x4B, 0x33, 0x4E4F) /* <CJK */
-MAP(0x4B, 0x34, 0x4EA1) /* <CJK */
-MAP(0x4B, 0x35, 0x508D) /* <CJK */
-MAP(0x4B, 0x36, 0x5256) /* <CJK */
-MAP(0x4B, 0x37, 0x574A) /* <CJK */
-MAP(0x4B, 0x38, 0x59A8) /* <CJK */
-MAP(0x4B, 0x39, 0x5E3D) /* <CJK */
-MAP(0x4B, 0x3A, 0x5FD8) /* <CJK */
-MAP(0x4B, 0x3B, 0x5FD9) /* <CJK */
-MAP(0x4B, 0x3C, 0x623F) /* <CJK */
-MAP(0x4B, 0x3D, 0x66B4) /* <CJK */
-MAP(0x4B, 0x3E, 0x671B) /* <CJK */
-MAP(0x4B, 0x3F, 0x67D0) /* <CJK */
-MAP(0x4B, 0x40, 0x68D2) /* <CJK */
-MAP(0x4B, 0x41, 0x5192) /* <CJK */
-MAP(0x4B, 0x42, 0x7D21) /* <CJK */
-MAP(0x4B, 0x43, 0x80AA) /* <CJK */
-MAP(0x4B, 0x44, 0x81A8) /* <CJK */
-MAP(0x4B, 0x45, 0x8B00) /* <CJK */
-MAP(0x4B, 0x46, 0x8C8C) /* <CJK */
-MAP(0x4B, 0x47, 0x8CBF) /* <CJK */
-MAP(0x4B, 0x48, 0x927E) /* <CJK */
-MAP(0x4B, 0x49, 0x9632) /* <CJK */
-MAP(0x4B, 0x4A, 0x5420) /* <CJK */
-MAP(0x4B, 0x4B, 0x982C) /* <CJK */
-MAP(0x4B, 0x4C, 0x5317) /* <CJK */
-MAP(0x4B, 0x4D, 0x50D5) /* <CJK */
-MAP(0x4B, 0x4E, 0x535C) /* <CJK */
-MAP(0x4B, 0x4F, 0x58A8) /* <CJK */
-MAP(0x4B, 0x50, 0x64B2) /* <CJK */
-MAP(0x4B, 0x51, 0x6734) /* <CJK */
-MAP(0x4B, 0x52, 0x7267) /* <CJK */
-MAP(0x4B, 0x53, 0x7766) /* <CJK */
-MAP(0x4B, 0x54, 0x7A46) /* <CJK */
-MAP(0x4B, 0x55, 0x91E6) /* <CJK */
-MAP(0x4B, 0x56, 0x52C3) /* <CJK */
-MAP(0x4B, 0x57, 0x6CA1) /* <CJK */
-MAP(0x4B, 0x58, 0x6B86) /* <CJK */
-MAP(0x4B, 0x59, 0x5800) /* <CJK */
-MAP(0x4B, 0x5A, 0x5E4C) /* <CJK */
-MAP(0x4B, 0x5B, 0x5954) /* <CJK */
-MAP(0x4B, 0x5C, 0x672C) /* <CJK */
-MAP(0x4B, 0x5D, 0x7FFB) /* <CJK */
-MAP(0x4B, 0x5E, 0x51E1) /* <CJK */
-MAP(0x4B, 0x5F, 0x76C6) /* <CJK */
-MAP(0x4B, 0x60, 0x6469) /* <CJK */
-MAP(0x4B, 0x61, 0x78E8) /* <CJK */
-MAP(0x4B, 0x62, 0x9B54) /* <CJK */
-MAP(0x4B, 0x63, 0x9EBB) /* <CJK */
-MAP(0x4B, 0x64, 0x57CB) /* <CJK */
-MAP(0x4B, 0x65, 0x59B9) /* <CJK */
-MAP(0x4B, 0x66, 0x6627) /* <CJK */
-MAP(0x4B, 0x67, 0x679A) /* <CJK */
-MAP(0x4B, 0x68, 0x6BCE) /* <CJK */
-MAP(0x4B, 0x69, 0x54E9) /* <CJK */
-MAP(0x4B, 0x6A, 0x69D9) /* <CJK */
-MAP(0x4B, 0x6B, 0x5E55) /* <CJK */
-MAP(0x4B, 0x6C, 0x819C) /* <CJK */
-MAP(0x4B, 0x6D, 0x6795) /* <CJK */
-MAP(0x4B, 0x6E, 0x9BAA) /* <CJK */
-MAP(0x4B, 0x6F, 0x67FE) /* <CJK */
-MAP(0x4B, 0x70, 0x9C52) /* <CJK */
-MAP(0x4B, 0x71, 0x685D) /* <CJK */
-MAP(0x4B, 0x72, 0x4EA6) /* <CJK */
-MAP(0x4B, 0x73, 0x4FE3) /* <CJK */
-MAP(0x4B, 0x74, 0x53C8) /* <CJK */
-MAP(0x4B, 0x75, 0x62B9) /* <CJK */
-MAP(0x4B, 0x76, 0x672B) /* <CJK */
-MAP(0x4B, 0x77, 0x6CAB) /* <CJK */
-MAP(0x4B, 0x78, 0x8FC4) /* <CJK */
-MAP(0x4B, 0x79, 0x4FAD) /* <CJK */
-MAP(0x4B, 0x7A, 0x7E6D) /* <CJK */
-MAP(0x4B, 0x7B, 0x9EBF) /* <CJK */
-MAP(0x4B, 0x7C, 0x4E07) /* <CJK */
-MAP(0x4B, 0x7D, 0x6162) /* <CJK */
-MAP(0x4B, 0x7E, 0x6E80) /* <CJK */
-MAP(0x4C, 0x21, 0x6F2B) /* <CJK */
-MAP(0x4C, 0x22, 0x8513) /* <CJK */
-MAP(0x4C, 0x23, 0x5473) /* <CJK */
-MAP(0x4C, 0x24, 0x672A) /* <CJK */
-MAP(0x4C, 0x25, 0x9B45) /* <CJK */
-MAP(0x4C, 0x26, 0x5DF3) /* <CJK */
-MAP(0x4C, 0x27, 0x7B95) /* <CJK */
-MAP(0x4C, 0x28, 0x5CAC) /* <CJK */
-MAP(0x4C, 0x29, 0x5BC6) /* <CJK */
-MAP(0x4C, 0x2A, 0x871C) /* <CJK */
-MAP(0x4C, 0x2B, 0x6E4A) /* <CJK */
-MAP(0x4C, 0x2C, 0x84D1) /* <CJK */
-MAP(0x4C, 0x2D, 0x7A14) /* <CJK */
-MAP(0x4C, 0x2E, 0x8108) /* <CJK */
-MAP(0x4C, 0x2F, 0x5999) /* <CJK */
-MAP(0x4C, 0x30, 0x7C8D) /* <CJK */
-MAP(0x4C, 0x31, 0x6C11) /* <CJK */
-MAP(0x4C, 0x32, 0x7720) /* <CJK */
-MAP(0x4C, 0x33, 0x52D9) /* <CJK */
-MAP(0x4C, 0x34, 0x5922) /* <CJK */
-MAP(0x4C, 0x35, 0x7121) /* <CJK */
-MAP(0x4C, 0x36, 0x725F) /* <CJK */
-MAP(0x4C, 0x37, 0x77DB) /* <CJK */
-MAP(0x4C, 0x38, 0x9727) /* <CJK */
-MAP(0x4C, 0x39, 0x9D61) /* <CJK */
-MAP(0x4C, 0x3A, 0x690B) /* <CJK */
-MAP(0x4C, 0x3B, 0x5A7F) /* <CJK */
-MAP(0x4C, 0x3C, 0x5A18) /* <CJK */
-MAP(0x4C, 0x3D, 0x51A5) /* <CJK */
-MAP(0x4C, 0x3E, 0x540D) /* <CJK */
-MAP(0x4C, 0x3F, 0x547D) /* <CJK */
-MAP(0x4C, 0x40, 0x660E) /* <CJK */
-MAP(0x4C, 0x41, 0x76DF) /* <CJK */
-MAP(0x4C, 0x42, 0x8FF7) /* <CJK */
-MAP(0x4C, 0x43, 0x9298) /* <CJK */
-MAP(0x4C, 0x44, 0x9CF4) /* <CJK */
-MAP(0x4C, 0x45, 0x59EA) /* <CJK */
-MAP(0x4C, 0x46, 0x725D) /* <CJK */
-MAP(0x4C, 0x47, 0x6EC5) /* <CJK */
-MAP(0x4C, 0x48, 0x514D) /* <CJK */
-MAP(0x4C, 0x49, 0x68C9) /* <CJK */
-MAP(0x4C, 0x4A, 0x7DBF) /* <CJK */
-MAP(0x4C, 0x4B, 0x7DEC) /* <CJK */
-MAP(0x4C, 0x4C, 0x9762) /* <CJK */
-MAP(0x4C, 0x4D, 0x9EBA) /* <CJK */
-MAP(0x4C, 0x4E, 0x6478) /* <CJK */
-MAP(0x4C, 0x4F, 0x6A21) /* <CJK */
-MAP(0x4C, 0x50, 0x8302) /* <CJK */
-MAP(0x4C, 0x51, 0x5984) /* <CJK */
-MAP(0x4C, 0x52, 0x5B5F) /* <CJK */
-MAP(0x4C, 0x53, 0x6BDB) /* <CJK */
-MAP(0x4C, 0x54, 0x731B) /* <CJK */
-MAP(0x4C, 0x55, 0x76F2) /* <CJK */
-MAP(0x4C, 0x56, 0x7DB2) /* <CJK */
-MAP(0x4C, 0x57, 0x8017) /* <CJK */
-MAP(0x4C, 0x58, 0x8499) /* <CJK */
-MAP(0x4C, 0x59, 0x5132) /* <CJK */
-MAP(0x4C, 0x5A, 0x6728) /* <CJK */
-MAP(0x4C, 0x5B, 0x9ED9) /* <CJK */
-MAP(0x4C, 0x5C, 0x76EE) /* <CJK */
-MAP(0x4C, 0x5D, 0x6762) /* <CJK */
-MAP(0x4C, 0x5E, 0x52FF) /* <CJK */
-MAP(0x4C, 0x5F, 0x9905) /* <CJK */
-MAP(0x4C, 0x60, 0x5C24) /* <CJK */
-MAP(0x4C, 0x61, 0x623B) /* <CJK */
-MAP(0x4C, 0x62, 0x7C7E) /* <CJK */
-MAP(0x4C, 0x63, 0x8CB0) /* <CJK */
-MAP(0x4C, 0x64, 0x554F) /* <CJK */
-MAP(0x4C, 0x65, 0x60B6) /* <CJK */
-MAP(0x4C, 0x66, 0x7D0B) /* <CJK */
-MAP(0x4C, 0x67, 0x9580) /* <CJK */
-MAP(0x4C, 0x68, 0x5301) /* <CJK */
-MAP(0x4C, 0x69, 0x4E5F) /* <CJK */
-MAP(0x4C, 0x6A, 0x51B6) /* <CJK */
-MAP(0x4C, 0x6B, 0x591C) /* <CJK */
-MAP(0x4C, 0x6C, 0x723A) /* <CJK */
-MAP(0x4C, 0x6D, 0x8036) /* <CJK */
-MAP(0x4C, 0x6E, 0x91CE) /* <CJK */
-MAP(0x4C, 0x6F, 0x5F25) /* <CJK */
-MAP(0x4C, 0x70, 0x77E2) /* <CJK */
-MAP(0x4C, 0x71, 0x5384) /* <CJK */
-MAP(0x4C, 0x72, 0x5F79) /* <CJK */
-MAP(0x4C, 0x73, 0x7D04) /* <CJK */
-MAP(0x4C, 0x74, 0x85AC) /* <CJK */
-MAP(0x4C, 0x75, 0x8A33) /* <CJK */
-MAP(0x4C, 0x76, 0x8E8D) /* <CJK */
-MAP(0x4C, 0x77, 0x9756) /* <CJK */
-MAP(0x4C, 0x78, 0x67F3) /* <CJK */
-MAP(0x4C, 0x79, 0x85AE) /* <CJK */
-MAP(0x4C, 0x7A, 0x9453) /* <CJK */
-MAP(0x4C, 0x7B, 0x6109) /* <CJK */
-MAP(0x4C, 0x7C, 0x6108) /* <CJK */
-MAP(0x4C, 0x7D, 0x6CB9) /* <CJK */
-MAP(0x4C, 0x7E, 0x7652) /* <CJK */
-MAP(0x4D, 0x21, 0x8AED) /* <CJK */
-MAP(0x4D, 0x22, 0x8F38) /* <CJK */
-MAP(0x4D, 0x23, 0x552F) /* <CJK */
-MAP(0x4D, 0x24, 0x4F51) /* <CJK */
-MAP(0x4D, 0x25, 0x512A) /* <CJK */
-MAP(0x4D, 0x26, 0x52C7) /* <CJK */
-MAP(0x4D, 0x27, 0x53CB) /* <CJK */
-MAP(0x4D, 0x28, 0x5BA5) /* <CJK */
-MAP(0x4D, 0x29, 0x5E7D) /* <CJK */
-MAP(0x4D, 0x2A, 0x60A0) /* <CJK */
-MAP(0x4D, 0x2B, 0x6182) /* <CJK */
-MAP(0x4D, 0x2C, 0x63D6) /* <CJK */
-MAP(0x4D, 0x2D, 0x6709) /* <CJK */
-MAP(0x4D, 0x2E, 0x67DA) /* <CJK */
-MAP(0x4D, 0x2F, 0x6E67) /* <CJK */
-MAP(0x4D, 0x30, 0x6D8C) /* <CJK */
-MAP(0x4D, 0x31, 0x7336) /* <CJK */
-MAP(0x4D, 0x32, 0x7337) /* <CJK */
-MAP(0x4D, 0x33, 0x7531) /* <CJK */
-MAP(0x4D, 0x34, 0x7950) /* <CJK */
-MAP(0x4D, 0x35, 0x88D5) /* <CJK */
-MAP(0x4D, 0x36, 0x8A98) /* <CJK */
-MAP(0x4D, 0x37, 0x904A) /* <CJK */
-MAP(0x4D, 0x38, 0x9091) /* <CJK */
-MAP(0x4D, 0x39, 0x90F5) /* <CJK */
-MAP(0x4D, 0x3A, 0x96C4) /* <CJK */
-MAP(0x4D, 0x3B, 0x878D) /* <CJK */
-MAP(0x4D, 0x3C, 0x5915) /* <CJK */
-MAP(0x4D, 0x3D, 0x4E88) /* <CJK */
-MAP(0x4D, 0x3E, 0x4F59) /* <CJK */
-MAP(0x4D, 0x3F, 0x4E0E) /* <CJK */
-MAP(0x4D, 0x40, 0x8A89) /* <CJK */
-MAP(0x4D, 0x41, 0x8F3F) /* <CJK */
-MAP(0x4D, 0x42, 0x9810) /* <CJK */
-MAP(0x4D, 0x43, 0x50AD) /* <CJK */
-MAP(0x4D, 0x44, 0x5E7C) /* <CJK */
-MAP(0x4D, 0x45, 0x5996) /* <CJK */
-MAP(0x4D, 0x46, 0x5BB9) /* <CJK */
-MAP(0x4D, 0x47, 0x5EB8) /* <CJK */
-MAP(0x4D, 0x48, 0x63DA) /* <CJK */
-MAP(0x4D, 0x49, 0x63FA) /* <CJK */
-MAP(0x4D, 0x4A, 0x64C1) /* <CJK */
-MAP(0x4D, 0x4B, 0x66DC) /* <CJK */
-MAP(0x4D, 0x4C, 0x694A) /* <CJK */
-MAP(0x4D, 0x4D, 0x69D8) /* <CJK */
-MAP(0x4D, 0x4E, 0x6D0B) /* <CJK */
-MAP(0x4D, 0x4F, 0x6EB6) /* <CJK */
-MAP(0x4D, 0x50, 0x7194) /* <CJK */
-MAP(0x4D, 0x51, 0x7528) /* <CJK */
-MAP(0x4D, 0x52, 0x7AAF) /* <CJK */
-MAP(0x4D, 0x53, 0x7F8A) /* <CJK */
-MAP(0x4D, 0x54, 0x8000) /* <CJK */
-MAP(0x4D, 0x55, 0x8449) /* <CJK */
-MAP(0x4D, 0x56, 0x84C9) /* <CJK */
-MAP(0x4D, 0x57, 0x8981) /* <CJK */
-MAP(0x4D, 0x58, 0x8B21) /* <CJK */
-MAP(0x4D, 0x59, 0x8E0A) /* <CJK */
-MAP(0x4D, 0x5A, 0x9065) /* <CJK */
-MAP(0x4D, 0x5B, 0x967D) /* <CJK */
-MAP(0x4D, 0x5C, 0x990A) /* <CJK */
-MAP(0x4D, 0x5D, 0x617E) /* <CJK */
-MAP(0x4D, 0x5E, 0x6291) /* <CJK */
-MAP(0x4D, 0x5F, 0x6B32) /* <CJK */
-MAP(0x4D, 0x60, 0x6C83) /* <CJK */
-MAP(0x4D, 0x61, 0x6D74) /* <CJK */
-MAP(0x4D, 0x62, 0x7FCC) /* <CJK */
-MAP(0x4D, 0x63, 0x7FFC) /* <CJK */
-MAP(0x4D, 0x64, 0x6DC0) /* <CJK */
-MAP(0x4D, 0x65, 0x7F85) /* <CJK */
-MAP(0x4D, 0x66, 0x87BA) /* <CJK */
-MAP(0x4D, 0x67, 0x88F8) /* <CJK */
-MAP(0x4D, 0x68, 0x6765) /* <CJK */
-MAP(0x4D, 0x69, 0x83B1) /* <CJK */
-MAP(0x4D, 0x6A, 0x983C) /* <CJK */
-MAP(0x4D, 0x6B, 0x96F7) /* <CJK */
-MAP(0x4D, 0x6C, 0x6D1B) /* <CJK */
-MAP(0x4D, 0x6D, 0x7D61) /* <CJK */
-MAP(0x4D, 0x6E, 0x843D) /* <CJK */
-MAP(0x4D, 0x6F, 0x916A) /* <CJK */
-MAP(0x4D, 0x70, 0x4E71) /* <CJK */
-MAP(0x4D, 0x71, 0x5375) /* <CJK */
-MAP(0x4D, 0x72, 0x5D50) /* <CJK */
-MAP(0x4D, 0x73, 0x6B04) /* <CJK */
-MAP(0x4D, 0x74, 0x6FEB) /* <CJK */
-MAP(0x4D, 0x75, 0x85CD) /* <CJK */
-MAP(0x4D, 0x76, 0x862D) /* <CJK */
-MAP(0x4D, 0x77, 0x89A7) /* <CJK */
-MAP(0x4D, 0x78, 0x5229) /* <CJK */
-MAP(0x4D, 0x79, 0x540F) /* <CJK */
-MAP(0x4D, 0x7A, 0x5C65) /* <CJK */
-MAP(0x4D, 0x7B, 0x674E) /* <CJK */
-MAP(0x4D, 0x7C, 0x68A8) /* <CJK */
-MAP(0x4D, 0x7D, 0x7406) /* <CJK */
-MAP(0x4D, 0x7E, 0x7483) /* <CJK */
-MAP(0x4E, 0x21, 0x75E2) /* <CJK */
-MAP(0x4E, 0x22, 0x88CF) /* <CJK */
-MAP(0x4E, 0x23, 0x88E1) /* <CJK */
-MAP(0x4E, 0x24, 0x91CC) /* <CJK */
-MAP(0x4E, 0x25, 0x96E2) /* <CJK */
-MAP(0x4E, 0x26, 0x9678) /* <CJK */
-MAP(0x4E, 0x27, 0x5F8B) /* <CJK */
-MAP(0x4E, 0x28, 0x7387) /* <CJK */
-MAP(0x4E, 0x29, 0x7ACB) /* <CJK */
-MAP(0x4E, 0x2A, 0x844E) /* <CJK */
-MAP(0x4E, 0x2B, 0x63A0) /* <CJK */
-MAP(0x4E, 0x2C, 0x7565) /* <CJK */
-MAP(0x4E, 0x2D, 0x5289) /* <CJK */
-MAP(0x4E, 0x2E, 0x6D41) /* <CJK */
-MAP(0x4E, 0x2F, 0x6E9C) /* <CJK */
-MAP(0x4E, 0x30, 0x7409) /* <CJK */
-MAP(0x4E, 0x31, 0x7559) /* <CJK */
-MAP(0x4E, 0x32, 0x786B) /* <CJK */
-MAP(0x4E, 0x33, 0x7C92) /* <CJK */
-MAP(0x4E, 0x34, 0x9686) /* <CJK */
-MAP(0x4E, 0x35, 0x7ADC) /* <CJK */
-MAP(0x4E, 0x36, 0x9F8D) /* <CJK */
-MAP(0x4E, 0x37, 0x4FB6) /* <CJK */
-MAP(0x4E, 0x38, 0x616E) /* <CJK */
-MAP(0x4E, 0x39, 0x65C5) /* <CJK */
-MAP(0x4E, 0x3A, 0x865C) /* <CJK */
-MAP(0x4E, 0x3B, 0x4E86) /* <CJK */
-MAP(0x4E, 0x3C, 0x4EAE) /* <CJK */
-MAP(0x4E, 0x3D, 0x50DA) /* <CJK */
-MAP(0x4E, 0x3E, 0x4E21) /* <CJK */
-MAP(0x4E, 0x3F, 0x51CC) /* <CJK */
-MAP(0x4E, 0x40, 0x5BEE) /* <CJK */
-MAP(0x4E, 0x41, 0x6599) /* <CJK */
-MAP(0x4E, 0x42, 0x6881) /* <CJK */
-MAP(0x4E, 0x43, 0x6DBC) /* <CJK */
-MAP(0x4E, 0x44, 0x731F) /* <CJK */
-MAP(0x4E, 0x45, 0x7642) /* <CJK */
-MAP(0x4E, 0x46, 0x77AD) /* <CJK */
-MAP(0x4E, 0x47, 0x7A1C) /* <CJK */
-MAP(0x4E, 0x48, 0x7CE7) /* <CJK */
-MAP(0x4E, 0x49, 0x826F) /* <CJK */
-MAP(0x4E, 0x4A, 0x8AD2) /* <CJK */
-MAP(0x4E, 0x4B, 0x907C) /* <CJK */
-MAP(0x4E, 0x4C, 0x91CF) /* <CJK */
-MAP(0x4E, 0x4D, 0x9675) /* <CJK */
-MAP(0x4E, 0x4E, 0x9818) /* <CJK */
-MAP(0x4E, 0x4F, 0x529B) /* <CJK */
-MAP(0x4E, 0x50, 0x7DD1) /* <CJK */
-MAP(0x4E, 0x51, 0x502B) /* <CJK */
-MAP(0x4E, 0x52, 0x5398) /* <CJK */
-MAP(0x4E, 0x53, 0x6797) /* <CJK */
-MAP(0x4E, 0x54, 0x6DCB) /* <CJK */
-MAP(0x4E, 0x55, 0x71D0) /* <CJK */
-MAP(0x4E, 0x56, 0x7433) /* <CJK */
-MAP(0x4E, 0x57, 0x81E8) /* <CJK */
-MAP(0x4E, 0x58, 0x8F2A) /* <CJK */
-MAP(0x4E, 0x59, 0x96A3) /* <CJK */
-MAP(0x4E, 0x5A, 0x9C57) /* <CJK */
-MAP(0x4E, 0x5B, 0x9E9F) /* <CJK */
-MAP(0x4E, 0x5C, 0x7460) /* <CJK */
-MAP(0x4E, 0x5D, 0x5841) /* <CJK */
-MAP(0x4E, 0x5E, 0x6D99) /* <CJK */
-MAP(0x4E, 0x5F, 0x7D2F) /* <CJK */
-MAP(0x4E, 0x60, 0x985E) /* <CJK */
-MAP(0x4E, 0x61, 0x4EE4) /* <CJK */
-MAP(0x4E, 0x62, 0x4F36) /* <CJK */
-MAP(0x4E, 0x63, 0x4F8B) /* <CJK */
-MAP(0x4E, 0x64, 0x51B7) /* <CJK */
-MAP(0x4E, 0x65, 0x52B1) /* <CJK */
-MAP(0x4E, 0x66, 0x5DBA) /* <CJK */
-MAP(0x4E, 0x67, 0x601C) /* <CJK */
-MAP(0x4E, 0x68, 0x73B2) /* <CJK */
-MAP(0x4E, 0x69, 0x793C) /* <CJK */
-MAP(0x4E, 0x6A, 0x82D3) /* <CJK */
-MAP(0x4E, 0x6B, 0x9234) /* <CJK */
-MAP(0x4E, 0x6C, 0x96B7) /* <CJK */
-MAP(0x4E, 0x6D, 0x96F6) /* <CJK */
-MAP(0x4E, 0x6E, 0x970A) /* <CJK */
-MAP(0x4E, 0x6F, 0x9E97) /* <CJK */
-MAP(0x4E, 0x70, 0x9F62) /* <CJK */
-MAP(0x4E, 0x71, 0x66A6) /* <CJK */
-MAP(0x4E, 0x72, 0x6B74) /* <CJK */
-MAP(0x4E, 0x73, 0x5217) /* <CJK */
-MAP(0x4E, 0x74, 0x52A3) /* <CJK */
-MAP(0x4E, 0x75, 0x70C8) /* <CJK */
-MAP(0x4E, 0x76, 0x88C2) /* <CJK */
-MAP(0x4E, 0x77, 0x5EC9) /* <CJK */
-MAP(0x4E, 0x78, 0x604B) /* <CJK */
-MAP(0x4E, 0x79, 0x6190) /* <CJK */
-MAP(0x4E, 0x7A, 0x6F23) /* <CJK */
-MAP(0x4E, 0x7B, 0x7149) /* <CJK */
-MAP(0x4E, 0x7C, 0x7C3E) /* <CJK */
-MAP(0x4E, 0x7D, 0x7DF4) /* <CJK */
-MAP(0x4E, 0x7E, 0x806F) /* <CJK */
-MAP(0x4F, 0x21, 0x84EE) /* <CJK */
-MAP(0x4F, 0x22, 0x9023) /* <CJK */
-MAP(0x4F, 0x23, 0x932C) /* <CJK */
-MAP(0x4F, 0x24, 0x5442) /* <CJK */
-MAP(0x4F, 0x25, 0x9B6F) /* <CJK */
-MAP(0x4F, 0x26, 0x6AD3) /* <CJK */
-MAP(0x4F, 0x27, 0x7089) /* <CJK */
-MAP(0x4F, 0x28, 0x8CC2) /* <CJK */
-MAP(0x4F, 0x29, 0x8DEF) /* <CJK */
-MAP(0x4F, 0x2A, 0x9732) /* <CJK */
-MAP(0x4F, 0x2B, 0x52B4) /* <CJK */
-MAP(0x4F, 0x2C, 0x5A41) /* <CJK */
-MAP(0x4F, 0x2D, 0x5ECA) /* <CJK */
-MAP(0x4F, 0x2E, 0x5F04) /* <CJK */
-MAP(0x4F, 0x2F, 0x6717) /* <CJK */
-MAP(0x4F, 0x30, 0x697C) /* <CJK */
-MAP(0x4F, 0x31, 0x6994) /* <CJK */
-MAP(0x4F, 0x32, 0x6D6A) /* <CJK */
-MAP(0x4F, 0x33, 0x6F0F) /* <CJK */
-MAP(0x4F, 0x34, 0x7262) /* <CJK */
-MAP(0x4F, 0x35, 0x72FC) /* <CJK */
-MAP(0x4F, 0x36, 0x7BED) /* <CJK */
-MAP(0x4F, 0x37, 0x8001) /* <CJK */
-MAP(0x4F, 0x38, 0x807E) /* <CJK */
-MAP(0x4F, 0x39, 0x874B) /* <CJK */
-MAP(0x4F, 0x3A, 0x90CE) /* <CJK */
-MAP(0x4F, 0x3B, 0x516D) /* <CJK */
-MAP(0x4F, 0x3C, 0x9E93) /* <CJK */
-MAP(0x4F, 0x3D, 0x7984) /* <CJK */
-MAP(0x4F, 0x3E, 0x808B) /* <CJK */
-MAP(0x4F, 0x3F, 0x9332) /* <CJK */
-MAP(0x4F, 0x40, 0x8AD6) /* <CJK */
-MAP(0x4F, 0x41, 0x502D) /* <CJK */
-MAP(0x4F, 0x42, 0x548C) /* <CJK */
-MAP(0x4F, 0x43, 0x8A71) /* <CJK */
-MAP(0x4F, 0x44, 0x6B6A) /* <CJK */
-MAP(0x4F, 0x45, 0x8CC4) /* <CJK */
-MAP(0x4F, 0x46, 0x8107) /* <CJK */
-MAP(0x4F, 0x47, 0x60D1) /* <CJK */
-MAP(0x4F, 0x48, 0x67A0) /* <CJK */
-MAP(0x4F, 0x49, 0x9DF2) /* <CJK */
-MAP(0x4F, 0x4A, 0x4E99) /* <CJK */
-MAP(0x4F, 0x4B, 0x4E98) /* <CJK */
-MAP(0x4F, 0x4C, 0x9C10) /* <CJK */
-MAP(0x4F, 0x4D, 0x8A6B) /* <CJK */
-MAP(0x4F, 0x4E, 0x85C1) /* <CJK */
-MAP(0x4F, 0x4F, 0x8568) /* <CJK */
-MAP(0x4F, 0x50, 0x6900) /* <CJK */
-MAP(0x4F, 0x51, 0x6E7E) /* <CJK */
-MAP(0x4F, 0x52, 0x7897) /* <CJK */
-MAP(0x4F, 0x53, 0x8155) /* <CJK */
-MAP(0x50, 0x21, 0x5F0C) /* <CJK */
-MAP(0x50, 0x22, 0x4E10) /* <CJK */
-MAP(0x50, 0x23, 0x4E15) /* <CJK */
-MAP(0x50, 0x24, 0x4E2A) /* <CJK */
-MAP(0x50, 0x25, 0x4E31) /* <CJK */
-MAP(0x50, 0x26, 0x4E36) /* <CJK */
-MAP(0x50, 0x27, 0x4E3C) /* <CJK */
-MAP(0x50, 0x28, 0x4E3F) /* <CJK */
-MAP(0x50, 0x29, 0x4E42) /* <CJK */
-MAP(0x50, 0x2A, 0x4E56) /* <CJK */
-MAP(0x50, 0x2B, 0x4E58) /* <CJK */
-MAP(0x50, 0x2C, 0x4E82) /* <CJK */
-MAP(0x50, 0x2D, 0x4E85) /* <CJK */
-MAP(0x50, 0x2E, 0x8C6B) /* <CJK */
-MAP(0x50, 0x2F, 0x4E8A) /* <CJK */
-MAP(0x50, 0x30, 0x8212) /* <CJK */
-MAP(0x50, 0x31, 0x5F0D) /* <CJK */
-MAP(0x50, 0x32, 0x4E8E) /* <CJK */
-MAP(0x50, 0x33, 0x4E9E) /* <CJK */
-MAP(0x50, 0x34, 0x4E9F) /* <CJK */
-MAP(0x50, 0x35, 0x4EA0) /* <CJK */
-MAP(0x50, 0x36, 0x4EA2) /* <CJK */
-MAP(0x50, 0x37, 0x4EB0) /* <CJK */
-MAP(0x50, 0x38, 0x4EB3) /* <CJK */
-MAP(0x50, 0x39, 0x4EB6) /* <CJK */
-MAP(0x50, 0x3A, 0x4ECE) /* <CJK */
-MAP(0x50, 0x3B, 0x4ECD) /* <CJK */
-MAP(0x50, 0x3C, 0x4EC4) /* <CJK */
-MAP(0x50, 0x3D, 0x4EC6) /* <CJK */
-MAP(0x50, 0x3E, 0x4EC2) /* <CJK */
-MAP(0x50, 0x3F, 0x4ED7) /* <CJK */
-MAP(0x50, 0x40, 0x4EDE) /* <CJK */
-MAP(0x50, 0x41, 0x4EED) /* <CJK */
-MAP(0x50, 0x42, 0x4EDF) /* <CJK */
-MAP(0x50, 0x43, 0x4EF7) /* <CJK */
-MAP(0x50, 0x44, 0x4F09) /* <CJK */
-MAP(0x50, 0x45, 0x4F5A) /* <CJK */
-MAP(0x50, 0x46, 0x4F30) /* <CJK */
-MAP(0x50, 0x47, 0x4F5B) /* <CJK */
-MAP(0x50, 0x48, 0x4F5D) /* <CJK */
-MAP(0x50, 0x49, 0x4F57) /* <CJK */
-MAP(0x50, 0x4A, 0x4F47) /* <CJK */
-MAP(0x50, 0x4B, 0x4F76) /* <CJK */
-MAP(0x50, 0x4C, 0x4F88) /* <CJK */
-MAP(0x50, 0x4D, 0x4F8F) /* <CJK */
-MAP(0x50, 0x4E, 0x4F98) /* <CJK */
-MAP(0x50, 0x4F, 0x4F7B) /* <CJK */
-MAP(0x50, 0x50, 0x4F69) /* <CJK */
-MAP(0x50, 0x51, 0x4F70) /* <CJK */
-MAP(0x50, 0x52, 0x4F91) /* <CJK */
-MAP(0x50, 0x53, 0x4F6F) /* <CJK */
-MAP(0x50, 0x54, 0x4F86) /* <CJK */
-MAP(0x50, 0x55, 0x4F96) /* <CJK */
-MAP(0x50, 0x56, 0x5118) /* <CJK */
-MAP(0x50, 0x57, 0x4FD4) /* <CJK */
-MAP(0x50, 0x58, 0x4FDF) /* <CJK */
-MAP(0x50, 0x59, 0x4FCE) /* <CJK */
-MAP(0x50, 0x5A, 0x4FD8) /* <CJK */
-MAP(0x50, 0x5B, 0x4FDB) /* <CJK */
-MAP(0x50, 0x5C, 0x4FD1) /* <CJK */
-MAP(0x50, 0x5D, 0x4FDA) /* <CJK */
-MAP(0x50, 0x5E, 0x4FD0) /* <CJK */
-MAP(0x50, 0x5F, 0x4FE4) /* <CJK */
-MAP(0x50, 0x60, 0x4FE5) /* <CJK */
-MAP(0x50, 0x61, 0x501A) /* <CJK */
-MAP(0x50, 0x62, 0x5028) /* <CJK */
-MAP(0x50, 0x63, 0x5014) /* <CJK */
-MAP(0x50, 0x64, 0x502A) /* <CJK */
-MAP(0x50, 0x65, 0x5025) /* <CJK */
-MAP(0x50, 0x66, 0x5005) /* <CJK */
-MAP(0x50, 0x67, 0x4F1C) /* <CJK */
-MAP(0x50, 0x68, 0x4FF6) /* <CJK */
-MAP(0x50, 0x69, 0x5021) /* <CJK */
-MAP(0x50, 0x6A, 0x5029) /* <CJK */
-MAP(0x50, 0x6B, 0x502C) /* <CJK */
-MAP(0x50, 0x6C, 0x4FFE) /* <CJK */
-MAP(0x50, 0x6D, 0x4FEF) /* <CJK */
-MAP(0x50, 0x6E, 0x5011) /* <CJK */
-MAP(0x50, 0x6F, 0x5006) /* <CJK */
-MAP(0x50, 0x70, 0x5043) /* <CJK */
-MAP(0x50, 0x71, 0x5047) /* <CJK */
-MAP(0x50, 0x72, 0x6703) /* <CJK */
-MAP(0x50, 0x73, 0x5055) /* <CJK */
-MAP(0x50, 0x74, 0x5050) /* <CJK */
-MAP(0x50, 0x75, 0x5048) /* <CJK */
-MAP(0x50, 0x76, 0x505A) /* <CJK */
-MAP(0x50, 0x77, 0x5056) /* <CJK */
-MAP(0x50, 0x78, 0x506C) /* <CJK */
-MAP(0x50, 0x79, 0x5078) /* <CJK */
-MAP(0x50, 0x7A, 0x5080) /* <CJK */
-MAP(0x50, 0x7B, 0x509A) /* <CJK */
-MAP(0x50, 0x7C, 0x5085) /* <CJK */
-MAP(0x50, 0x7D, 0x50B4) /* <CJK */
-MAP(0x50, 0x7E, 0x50B2) /* <CJK */
-MAP(0x51, 0x21, 0x50C9) /* <CJK */
-MAP(0x51, 0x22, 0x50CA) /* <CJK */
-MAP(0x51, 0x23, 0x50B3) /* <CJK */
-MAP(0x51, 0x24, 0x50C2) /* <CJK */
-MAP(0x51, 0x25, 0x50D6) /* <CJK */
-MAP(0x51, 0x26, 0x50DE) /* <CJK */
-MAP(0x51, 0x27, 0x50E5) /* <CJK */
-MAP(0x51, 0x28, 0x50ED) /* <CJK */
-MAP(0x51, 0x29, 0x50E3) /* <CJK */
-MAP(0x51, 0x2A, 0x50EE) /* <CJK */
-MAP(0x51, 0x2B, 0x50F9) /* <CJK */
-MAP(0x51, 0x2C, 0x50F5) /* <CJK */
-MAP(0x51, 0x2D, 0x5109) /* <CJK */
-MAP(0x51, 0x2E, 0x5101) /* <CJK */
-MAP(0x51, 0x2F, 0x5102) /* <CJK */
-MAP(0x51, 0x30, 0x5116) /* <CJK */
-MAP(0x51, 0x31, 0x5115) /* <CJK */
-MAP(0x51, 0x32, 0x5114) /* <CJK */
-MAP(0x51, 0x33, 0x511A) /* <CJK */
-MAP(0x51, 0x34, 0x5121) /* <CJK */
-MAP(0x51, 0x35, 0x513A) /* <CJK */
-MAP(0x51, 0x36, 0x5137) /* <CJK */
-MAP(0x51, 0x37, 0x513C) /* <CJK */
-MAP(0x51, 0x38, 0x513B) /* <CJK */
-MAP(0x51, 0x39, 0x513F) /* <CJK */
-MAP(0x51, 0x3A, 0x5140) /* <CJK */
-MAP(0x51, 0x3B, 0x5152) /* <CJK */
-MAP(0x51, 0x3C, 0x514C) /* <CJK */
-MAP(0x51, 0x3D, 0x5154) /* <CJK */
-MAP(0x51, 0x3E, 0x5162) /* <CJK */
-MAP(0x51, 0x3F, 0x7AF8) /* <CJK */
-MAP(0x51, 0x40, 0x5169) /* <CJK */
-MAP(0x51, 0x41, 0x516A) /* <CJK */
-MAP(0x51, 0x42, 0x516E) /* <CJK */
-MAP(0x51, 0x43, 0x5180) /* <CJK */
-MAP(0x51, 0x44, 0x5182) /* <CJK */
-MAP(0x51, 0x45, 0x56D8) /* <CJK */
-MAP(0x51, 0x46, 0x518C) /* <CJK */
-MAP(0x51, 0x47, 0x5189) /* <CJK */
-MAP(0x51, 0x48, 0x518F) /* <CJK */
-MAP(0x51, 0x49, 0x5191) /* <CJK */
-MAP(0x51, 0x4A, 0x5193) /* <CJK */
-MAP(0x51, 0x4B, 0x5195) /* <CJK */
-MAP(0x51, 0x4C, 0x5196) /* <CJK */
-MAP(0x51, 0x4D, 0x51A4) /* <CJK */
-MAP(0x51, 0x4E, 0x51A6) /* <CJK */
-MAP(0x51, 0x4F, 0x51A2) /* <CJK */
-MAP(0x51, 0x50, 0x51A9) /* <CJK */
-MAP(0x51, 0x51, 0x51AA) /* <CJK */
-MAP(0x51, 0x52, 0x51AB) /* <CJK */
-MAP(0x51, 0x53, 0x51B3) /* <CJK */
-MAP(0x51, 0x54, 0x51B1) /* <CJK */
-MAP(0x51, 0x55, 0x51B2) /* <CJK */
-MAP(0x51, 0x56, 0x51B0) /* <CJK */
-MAP(0x51, 0x57, 0x51B5) /* <CJK */
-MAP(0x51, 0x58, 0x51BD) /* <CJK */
-MAP(0x51, 0x59, 0x51C5) /* <CJK */
-MAP(0x51, 0x5A, 0x51C9) /* <CJK */
-MAP(0x51, 0x5B, 0x51DB) /* <CJK */
-MAP(0x51, 0x5C, 0x51E0) /* <CJK */
-MAP(0x51, 0x5D, 0x8655) /* <CJK */
-MAP(0x51, 0x5E, 0x51E9) /* <CJK */
-MAP(0x51, 0x5F, 0x51ED) /* <CJK */
-MAP(0x51, 0x60, 0x51F0) /* <CJK */
-MAP(0x51, 0x61, 0x51F5) /* <CJK */
-MAP(0x51, 0x62, 0x51FE) /* <CJK */
-MAP(0x51, 0x63, 0x5204) /* <CJK */
-MAP(0x51, 0x64, 0x520B) /* <CJK */
-MAP(0x51, 0x65, 0x5214) /* <CJK */
-MAP(0x51, 0x66, 0x520E) /* <CJK */
-MAP(0x51, 0x67, 0x5227) /* <CJK */
-MAP(0x51, 0x68, 0x522A) /* <CJK */
-MAP(0x51, 0x69, 0x522E) /* <CJK */
-MAP(0x51, 0x6A, 0x5233) /* <CJK */
-MAP(0x51, 0x6B, 0x5239) /* <CJK */
-MAP(0x51, 0x6C, 0x524F) /* <CJK */
-MAP(0x51, 0x6D, 0x5244) /* <CJK */
-MAP(0x51, 0x6E, 0x524B) /* <CJK */
-MAP(0x51, 0x6F, 0x524C) /* <CJK */
-MAP(0x51, 0x70, 0x525E) /* <CJK */
-MAP(0x51, 0x71, 0x5254) /* <CJK */
-MAP(0x51, 0x72, 0x526A) /* <CJK */
-MAP(0x51, 0x73, 0x5274) /* <CJK */
-MAP(0x51, 0x74, 0x5269) /* <CJK */
-MAP(0x51, 0x75, 0x5273) /* <CJK */
-MAP(0x51, 0x76, 0x527F) /* <CJK */
-MAP(0x51, 0x77, 0x527D) /* <CJK */
-MAP(0x51, 0x78, 0x528D) /* <CJK */
-MAP(0x51, 0x79, 0x5294) /* <CJK */
-MAP(0x51, 0x7A, 0x5292) /* <CJK */
-MAP(0x51, 0x7B, 0x5271) /* <CJK */
-MAP(0x51, 0x7C, 0x5288) /* <CJK */
-MAP(0x51, 0x7D, 0x5291) /* <CJK */
-MAP(0x51, 0x7E, 0x8FA8) /* <CJK */
-MAP(0x52, 0x21, 0x8FA7) /* <CJK */
-MAP(0x52, 0x22, 0x52AC) /* <CJK */
-MAP(0x52, 0x23, 0x52AD) /* <CJK */
-MAP(0x52, 0x24, 0x52BC) /* <CJK */
-MAP(0x52, 0x25, 0x52B5) /* <CJK */
-MAP(0x52, 0x26, 0x52C1) /* <CJK */
-MAP(0x52, 0x27, 0x52CD) /* <CJK */
-MAP(0x52, 0x28, 0x52D7) /* <CJK */
-MAP(0x52, 0x29, 0x52DE) /* <CJK */
-MAP(0x52, 0x2A, 0x52E3) /* <CJK */
-MAP(0x52, 0x2B, 0x52E6) /* <CJK */
-MAP(0x52, 0x2C, 0x98ED) /* <CJK */
-MAP(0x52, 0x2D, 0x52E0) /* <CJK */
-MAP(0x52, 0x2E, 0x52F3) /* <CJK */
-MAP(0x52, 0x2F, 0x52F5) /* <CJK */
-MAP(0x52, 0x30, 0x52F8) /* <CJK */
-MAP(0x52, 0x31, 0x52F9) /* <CJK */
-MAP(0x52, 0x32, 0x5306) /* <CJK */
-MAP(0x52, 0x33, 0x5308) /* <CJK */
-MAP(0x52, 0x34, 0x7538) /* <CJK */
-MAP(0x52, 0x35, 0x530D) /* <CJK */
-MAP(0x52, 0x36, 0x5310) /* <CJK */
-MAP(0x52, 0x37, 0x530F) /* <CJK */
-MAP(0x52, 0x38, 0x5315) /* <CJK */
-MAP(0x52, 0x39, 0x531A) /* <CJK */
-MAP(0x52, 0x3A, 0x5323) /* <CJK */
-MAP(0x52, 0x3B, 0x532F) /* <CJK */
-MAP(0x52, 0x3C, 0x5331) /* <CJK */
-MAP(0x52, 0x3D, 0x5333) /* <CJK */
-MAP(0x52, 0x3E, 0x5338) /* <CJK */
-MAP(0x52, 0x3F, 0x5340) /* <CJK */
-MAP(0x52, 0x40, 0x5346) /* <CJK */
-MAP(0x52, 0x41, 0x5345) /* <CJK */
-MAP(0x52, 0x42, 0x4E17) /* <CJK */
-MAP(0x52, 0x43, 0x5349) /* <CJK */
-MAP(0x52, 0x44, 0x534D) /* <CJK */
-MAP(0x52, 0x45, 0x51D6) /* <CJK */
-MAP(0x52, 0x46, 0x535E) /* <CJK */
-MAP(0x52, 0x47, 0x5369) /* <CJK */
-MAP(0x52, 0x48, 0x536E) /* <CJK */
-MAP(0x52, 0x49, 0x5918) /* <CJK */
-MAP(0x52, 0x4A, 0x537B) /* <CJK */
-MAP(0x52, 0x4B, 0x5377) /* <CJK */
-MAP(0x52, 0x4C, 0x5382) /* <CJK */
-MAP(0x52, 0x4D, 0x5396) /* <CJK */
-MAP(0x52, 0x4E, 0x53A0) /* <CJK */
-MAP(0x52, 0x4F, 0x53A6) /* <CJK */
-MAP(0x52, 0x50, 0x53A5) /* <CJK */
-MAP(0x52, 0x51, 0x53AE) /* <CJK */
-MAP(0x52, 0x52, 0x53B0) /* <CJK */
-MAP(0x52, 0x53, 0x53B6) /* <CJK */
-MAP(0x52, 0x54, 0x53C3) /* <CJK */
-MAP(0x52, 0x55, 0x7C12) /* <CJK */
-MAP(0x52, 0x56, 0x96D9) /* <CJK */
-MAP(0x52, 0x57, 0x53DF) /* <CJK */
-MAP(0x52, 0x58, 0x66FC) /* <CJK */
-MAP(0x52, 0x59, 0x71EE) /* <CJK */
-MAP(0x52, 0x5A, 0x53EE) /* <CJK */
-MAP(0x52, 0x5B, 0x53E8) /* <CJK */
-MAP(0x52, 0x5C, 0x53ED) /* <CJK */
-MAP(0x52, 0x5D, 0x53FA) /* <CJK */
-MAP(0x52, 0x5E, 0x5401) /* <CJK */
-MAP(0x52, 0x5F, 0x543D) /* <CJK */
-MAP(0x52, 0x60, 0x5440) /* <CJK */
-MAP(0x52, 0x61, 0x542C) /* <CJK */
-MAP(0x52, 0x62, 0x542D) /* <CJK */
-MAP(0x52, 0x63, 0x543C) /* <CJK */
-MAP(0x52, 0x64, 0x542E) /* <CJK */
-MAP(0x52, 0x65, 0x5436) /* <CJK */
-MAP(0x52, 0x66, 0x5429) /* <CJK */
-MAP(0x52, 0x67, 0x541D) /* <CJK */
-MAP(0x52, 0x68, 0x544E) /* <CJK */
-MAP(0x52, 0x69, 0x548F) /* <CJK */
-MAP(0x52, 0x6A, 0x5475) /* <CJK */
-MAP(0x52, 0x6B, 0x548E) /* <CJK */
-MAP(0x52, 0x6C, 0x545F) /* <CJK */
-MAP(0x52, 0x6D, 0x5471) /* <CJK */
-MAP(0x52, 0x6E, 0x5477) /* <CJK */
-MAP(0x52, 0x6F, 0x5470) /* <CJK */
-MAP(0x52, 0x70, 0x5492) /* <CJK */
-MAP(0x52, 0x71, 0x547B) /* <CJK */
-MAP(0x52, 0x72, 0x5480) /* <CJK */
-MAP(0x52, 0x73, 0x5476) /* <CJK */
-MAP(0x52, 0x74, 0x5484) /* <CJK */
-MAP(0x52, 0x75, 0x5490) /* <CJK */
-MAP(0x52, 0x76, 0x5486) /* <CJK */
-MAP(0x52, 0x77, 0x54C7) /* <CJK */
-MAP(0x52, 0x78, 0x54A2) /* <CJK */
-MAP(0x52, 0x79, 0x54B8) /* <CJK */
-MAP(0x52, 0x7A, 0x54A5) /* <CJK */
-MAP(0x52, 0x7B, 0x54AC) /* <CJK */
-MAP(0x52, 0x7C, 0x54C4) /* <CJK */
-MAP(0x52, 0x7D, 0x54C8) /* <CJK */
-MAP(0x52, 0x7E, 0x54A8) /* <CJK */
-MAP(0x53, 0x21, 0x54AB) /* <CJK */
-MAP(0x53, 0x22, 0x54C2) /* <CJK */
-MAP(0x53, 0x23, 0x54A4) /* <CJK */
-MAP(0x53, 0x24, 0x54BE) /* <CJK */
-MAP(0x53, 0x25, 0x54BC) /* <CJK */
-MAP(0x53, 0x26, 0x54D8) /* <CJK */
-MAP(0x53, 0x27, 0x54E5) /* <CJK */
-MAP(0x53, 0x28, 0x54E6) /* <CJK */
-MAP(0x53, 0x29, 0x550F) /* <CJK */
-MAP(0x53, 0x2A, 0x5514) /* <CJK */
-MAP(0x53, 0x2B, 0x54FD) /* <CJK */
-MAP(0x53, 0x2C, 0x54EE) /* <CJK */
-MAP(0x53, 0x2D, 0x54ED) /* <CJK */
-MAP(0x53, 0x2E, 0x54FA) /* <CJK */
-MAP(0x53, 0x2F, 0x54E2) /* <CJK */
-MAP(0x53, 0x30, 0x5539) /* <CJK */
-MAP(0x53, 0x31, 0x5540) /* <CJK */
-MAP(0x53, 0x32, 0x5563) /* <CJK */
-MAP(0x53, 0x33, 0x554C) /* <CJK */
-MAP(0x53, 0x34, 0x552E) /* <CJK */
-MAP(0x53, 0x35, 0x555C) /* <CJK */
-MAP(0x53, 0x36, 0x5545) /* <CJK */
-MAP(0x53, 0x37, 0x5556) /* <CJK */
-MAP(0x53, 0x38, 0x5557) /* <CJK */
-MAP(0x53, 0x39, 0x5538) /* <CJK */
-MAP(0x53, 0x3A, 0x5533) /* <CJK */
-MAP(0x53, 0x3B, 0x555D) /* <CJK */
-MAP(0x53, 0x3C, 0x5599) /* <CJK */
-MAP(0x53, 0x3D, 0x5580) /* <CJK */
-MAP(0x53, 0x3E, 0x54AF) /* <CJK */
-MAP(0x53, 0x3F, 0x558A) /* <CJK */
-MAP(0x53, 0x40, 0x559F) /* <CJK */
-MAP(0x53, 0x41, 0x557B) /* <CJK */
-MAP(0x53, 0x42, 0x557E) /* <CJK */
-MAP(0x53, 0x43, 0x5598) /* <CJK */
-MAP(0x53, 0x44, 0x559E) /* <CJK */
-MAP(0x53, 0x45, 0x55AE) /* <CJK */
-MAP(0x53, 0x46, 0x557C) /* <CJK */
-MAP(0x53, 0x47, 0x5583) /* <CJK */
-MAP(0x53, 0x48, 0x55A9) /* <CJK */
-MAP(0x53, 0x49, 0x5587) /* <CJK */
-MAP(0x53, 0x4A, 0x55A8) /* <CJK */
-MAP(0x53, 0x4B, 0x55DA) /* <CJK */
-MAP(0x53, 0x4C, 0x55C5) /* <CJK */
-MAP(0x53, 0x4D, 0x55DF) /* <CJK */
-MAP(0x53, 0x4E, 0x55C4) /* <CJK */
-MAP(0x53, 0x4F, 0x55DC) /* <CJK */
-MAP(0x53, 0x50, 0x55E4) /* <CJK */
-MAP(0x53, 0x51, 0x55D4) /* <CJK */
-MAP(0x53, 0x52, 0x5614) /* <CJK */
-MAP(0x53, 0x53, 0x55F7) /* <CJK */
-MAP(0x53, 0x54, 0x5616) /* <CJK */
-MAP(0x53, 0x55, 0x55FE) /* <CJK */
-MAP(0x53, 0x56, 0x55FD) /* <CJK */
-MAP(0x53, 0x57, 0x561B) /* <CJK */
-MAP(0x53, 0x58, 0x55F9) /* <CJK */
-MAP(0x53, 0x59, 0x564E) /* <CJK */
-MAP(0x53, 0x5A, 0x5650) /* <CJK */
-MAP(0x53, 0x5B, 0x71DF) /* <CJK */
-MAP(0x53, 0x5C, 0x5634) /* <CJK */
-MAP(0x53, 0x5D, 0x5636) /* <CJK */
-MAP(0x53, 0x5E, 0x5632) /* <CJK */
-MAP(0x53, 0x5F, 0x5638) /* <CJK */
-MAP(0x53, 0x60, 0x566B) /* <CJK */
-MAP(0x53, 0x61, 0x5664) /* <CJK */
-MAP(0x53, 0x62, 0x562F) /* <CJK */
-MAP(0x53, 0x63, 0x566C) /* <CJK */
-MAP(0x53, 0x64, 0x566A) /* <CJK */
-MAP(0x53, 0x65, 0x5686) /* <CJK */
-MAP(0x53, 0x66, 0x5680) /* <CJK */
-MAP(0x53, 0x67, 0x568A) /* <CJK */
-MAP(0x53, 0x68, 0x56A0) /* <CJK */
-MAP(0x53, 0x69, 0x5694) /* <CJK */
-MAP(0x53, 0x6A, 0x568F) /* <CJK */
-MAP(0x53, 0x6B, 0x56A5) /* <CJK */
-MAP(0x53, 0x6C, 0x56AE) /* <CJK */
-MAP(0x53, 0x6D, 0x56B6) /* <CJK */
-MAP(0x53, 0x6E, 0x56B4) /* <CJK */
-MAP(0x53, 0x6F, 0x56C2) /* <CJK */
-MAP(0x53, 0x70, 0x56BC) /* <CJK */
-MAP(0x53, 0x71, 0x56C1) /* <CJK */
-MAP(0x53, 0x72, 0x56C3) /* <CJK */
-MAP(0x53, 0x73, 0x56C0) /* <CJK */
-MAP(0x53, 0x74, 0x56C8) /* <CJK */
-MAP(0x53, 0x75, 0x56CE) /* <CJK */
-MAP(0x53, 0x76, 0x56D1) /* <CJK */
-MAP(0x53, 0x77, 0x56D3) /* <CJK */
-MAP(0x53, 0x78, 0x56D7) /* <CJK */
-MAP(0x53, 0x79, 0x56EE) /* <CJK */
-MAP(0x53, 0x7A, 0x56F9) /* <CJK */
-MAP(0x53, 0x7B, 0x5700) /* <CJK */
-MAP(0x53, 0x7C, 0x56FF) /* <CJK */
-MAP(0x53, 0x7D, 0x5704) /* <CJK */
-MAP(0x53, 0x7E, 0x5709) /* <CJK */
-MAP(0x54, 0x21, 0x5708) /* <CJK */
-MAP(0x54, 0x22, 0x570B) /* <CJK */
-MAP(0x54, 0x23, 0x570D) /* <CJK */
-MAP(0x54, 0x24, 0x5713) /* <CJK */
-MAP(0x54, 0x25, 0x5718) /* <CJK */
-MAP(0x54, 0x26, 0x5716) /* <CJK */
-MAP(0x54, 0x27, 0x55C7) /* <CJK */
-MAP(0x54, 0x28, 0x571C) /* <CJK */
-MAP(0x54, 0x29, 0x5726) /* <CJK */
-MAP(0x54, 0x2A, 0x5737) /* <CJK */
-MAP(0x54, 0x2B, 0x5738) /* <CJK */
-MAP(0x54, 0x2C, 0x574E) /* <CJK */
-MAP(0x54, 0x2D, 0x573B) /* <CJK */
-MAP(0x54, 0x2E, 0x5740) /* <CJK */
-MAP(0x54, 0x2F, 0x574F) /* <CJK */
-MAP(0x54, 0x30, 0x5769) /* <CJK */
-MAP(0x54, 0x31, 0x57C0) /* <CJK */
-MAP(0x54, 0x32, 0x5788) /* <CJK */
-MAP(0x54, 0x33, 0x5761) /* <CJK */
-MAP(0x54, 0x34, 0x577F) /* <CJK */
-MAP(0x54, 0x35, 0x5789) /* <CJK */
-MAP(0x54, 0x36, 0x5793) /* <CJK */
-MAP(0x54, 0x37, 0x57A0) /* <CJK */
-MAP(0x54, 0x38, 0x57B3) /* <CJK */
-MAP(0x54, 0x39, 0x57A4) /* <CJK */
-MAP(0x54, 0x3A, 0x57AA) /* <CJK */
-MAP(0x54, 0x3B, 0x57B0) /* <CJK */
-MAP(0x54, 0x3C, 0x57C3) /* <CJK */
-MAP(0x54, 0x3D, 0x57C6) /* <CJK */
-MAP(0x54, 0x3E, 0x57D4) /* <CJK */
-MAP(0x54, 0x3F, 0x57D2) /* <CJK */
-MAP(0x54, 0x40, 0x57D3) /* <CJK */
-MAP(0x54, 0x41, 0x580A) /* <CJK */
-MAP(0x54, 0x42, 0x57D6) /* <CJK */
-MAP(0x54, 0x43, 0x57E3) /* <CJK */
-MAP(0x54, 0x44, 0x580B) /* <CJK */
-MAP(0x54, 0x45, 0x5819) /* <CJK */
-MAP(0x54, 0x46, 0x581D) /* <CJK */
-MAP(0x54, 0x47, 0x5872) /* <CJK */
-MAP(0x54, 0x48, 0x5821) /* <CJK */
-MAP(0x54, 0x49, 0x5862) /* <CJK */
-MAP(0x54, 0x4A, 0x584B) /* <CJK */
-MAP(0x54, 0x4B, 0x5870) /* <CJK */
-MAP(0x54, 0x4C, 0x6BC0) /* <CJK */
-MAP(0x54, 0x4D, 0x5852) /* <CJK */
-MAP(0x54, 0x4E, 0x583D) /* <CJK */
-MAP(0x54, 0x4F, 0x5879) /* <CJK */
-MAP(0x54, 0x50, 0x5885) /* <CJK */
-MAP(0x54, 0x51, 0x58B9) /* <CJK */
-MAP(0x54, 0x52, 0x589F) /* <CJK */
-MAP(0x54, 0x53, 0x58AB) /* <CJK */
-MAP(0x54, 0x54, 0x58BA) /* <CJK */
-MAP(0x54, 0x55, 0x58DE) /* <CJK */
-MAP(0x54, 0x56, 0x58BB) /* <CJK */
-MAP(0x54, 0x57, 0x58B8) /* <CJK */
-MAP(0x54, 0x58, 0x58AE) /* <CJK */
-MAP(0x54, 0x59, 0x58C5) /* <CJK */
-MAP(0x54, 0x5A, 0x58D3) /* <CJK */
-MAP(0x54, 0x5B, 0x58D1) /* <CJK */
-MAP(0x54, 0x5C, 0x58D7) /* <CJK */
-MAP(0x54, 0x5D, 0x58D9) /* <CJK */
-MAP(0x54, 0x5E, 0x58D8) /* <CJK */
-MAP(0x54, 0x5F, 0x58E5) /* <CJK */
-MAP(0x54, 0x60, 0x58DC) /* <CJK */
-MAP(0x54, 0x61, 0x58E4) /* <CJK */
-MAP(0x54, 0x62, 0x58DF) /* <CJK */
-MAP(0x54, 0x63, 0x58EF) /* <CJK */
-MAP(0x54, 0x64, 0x58FA) /* <CJK */
-MAP(0x54, 0x65, 0x58F9) /* <CJK */
-MAP(0x54, 0x66, 0x58FB) /* <CJK */
-MAP(0x54, 0x67, 0x58FC) /* <CJK */
-MAP(0x54, 0x68, 0x58FD) /* <CJK */
-MAP(0x54, 0x69, 0x5902) /* <CJK */
-MAP(0x54, 0x6A, 0x590A) /* <CJK */
-MAP(0x54, 0x6B, 0x5910) /* <CJK */
-MAP(0x54, 0x6C, 0x591B) /* <CJK */
-MAP(0x54, 0x6D, 0x68A6) /* <CJK */
-MAP(0x54, 0x6E, 0x5925) /* <CJK */
-MAP(0x54, 0x6F, 0x592C) /* <CJK */
-MAP(0x54, 0x70, 0x592D) /* <CJK */
-MAP(0x54, 0x71, 0x5932) /* <CJK */
-MAP(0x54, 0x72, 0x5938) /* <CJK */
-MAP(0x54, 0x73, 0x593E) /* <CJK */
-MAP(0x54, 0x74, 0x7AD2) /* <CJK */
-MAP(0x54, 0x75, 0x5955) /* <CJK */
-MAP(0x54, 0x76, 0x5950) /* <CJK */
-MAP(0x54, 0x77, 0x594E) /* <CJK */
-MAP(0x54, 0x78, 0x595A) /* <CJK */
-MAP(0x54, 0x79, 0x5958) /* <CJK */
-MAP(0x54, 0x7A, 0x5962) /* <CJK */
-MAP(0x54, 0x7B, 0x5960) /* <CJK */
-MAP(0x54, 0x7C, 0x5967) /* <CJK */
-MAP(0x54, 0x7D, 0x596C) /* <CJK */
-MAP(0x54, 0x7E, 0x5969) /* <CJK */
-MAP(0x55, 0x21, 0x5978) /* <CJK */
-MAP(0x55, 0x22, 0x5981) /* <CJK */
-MAP(0x55, 0x23, 0x599D) /* <CJK */
-MAP(0x55, 0x24, 0x4F5E) /* <CJK */
-MAP(0x55, 0x25, 0x4FAB) /* <CJK */
-MAP(0x55, 0x26, 0x59A3) /* <CJK */
-MAP(0x55, 0x27, 0x59B2) /* <CJK */
-MAP(0x55, 0x28, 0x59C6) /* <CJK */
-MAP(0x55, 0x29, 0x59E8) /* <CJK */
-MAP(0x55, 0x2A, 0x59DC) /* <CJK */
-MAP(0x55, 0x2B, 0x598D) /* <CJK */
-MAP(0x55, 0x2C, 0x59D9) /* <CJK */
-MAP(0x55, 0x2D, 0x59DA) /* <CJK */
-MAP(0x55, 0x2E, 0x5A25) /* <CJK */
-MAP(0x55, 0x2F, 0x5A1F) /* <CJK */
-MAP(0x55, 0x30, 0x5A11) /* <CJK */
-MAP(0x55, 0x31, 0x5A1C) /* <CJK */
-MAP(0x55, 0x32, 0x5A09) /* <CJK */
-MAP(0x55, 0x33, 0x5A1A) /* <CJK */
-MAP(0x55, 0x34, 0x5A40) /* <CJK */
-MAP(0x55, 0x35, 0x5A6C) /* <CJK */
-MAP(0x55, 0x36, 0x5A49) /* <CJK */
-MAP(0x55, 0x37, 0x5A35) /* <CJK */
-MAP(0x55, 0x38, 0x5A36) /* <CJK */
-MAP(0x55, 0x39, 0x5A62) /* <CJK */
-MAP(0x55, 0x3A, 0x5A6A) /* <CJK */
-MAP(0x55, 0x3B, 0x5A9A) /* <CJK */
-MAP(0x55, 0x3C, 0x5ABC) /* <CJK */
-MAP(0x55, 0x3D, 0x5ABE) /* <CJK */
-MAP(0x55, 0x3E, 0x5ACB) /* <CJK */
-MAP(0x55, 0x3F, 0x5AC2) /* <CJK */
-MAP(0x55, 0x40, 0x5ABD) /* <CJK */
-MAP(0x55, 0x41, 0x5AE3) /* <CJK */
-MAP(0x55, 0x42, 0x5AD7) /* <CJK */
-MAP(0x55, 0x43, 0x5AE6) /* <CJK */
-MAP(0x55, 0x44, 0x5AE9) /* <CJK */
-MAP(0x55, 0x45, 0x5AD6) /* <CJK */
-MAP(0x55, 0x46, 0x5AFA) /* <CJK */
-MAP(0x55, 0x47, 0x5AFB) /* <CJK */
-MAP(0x55, 0x48, 0x5B0C) /* <CJK */
-MAP(0x55, 0x49, 0x5B0B) /* <CJK */
-MAP(0x55, 0x4A, 0x5B16) /* <CJK */
-MAP(0x55, 0x4B, 0x5B32) /* <CJK */
-MAP(0x55, 0x4C, 0x5AD0) /* <CJK */
-MAP(0x55, 0x4D, 0x5B2A) /* <CJK */
-MAP(0x55, 0x4E, 0x5B36) /* <CJK */
-MAP(0x55, 0x4F, 0x5B3E) /* <CJK */
-MAP(0x55, 0x50, 0x5B43) /* <CJK */
-MAP(0x55, 0x51, 0x5B45) /* <CJK */
-MAP(0x55, 0x52, 0x5B40) /* <CJK */
-MAP(0x55, 0x53, 0x5B51) /* <CJK */
-MAP(0x55, 0x54, 0x5B55) /* <CJK */
-MAP(0x55, 0x55, 0x5B5A) /* <CJK */
-MAP(0x55, 0x56, 0x5B5B) /* <CJK */
-MAP(0x55, 0x57, 0x5B65) /* <CJK */
-MAP(0x55, 0x58, 0x5B69) /* <CJK */
-MAP(0x55, 0x59, 0x5B70) /* <CJK */
-MAP(0x55, 0x5A, 0x5B73) /* <CJK */
-MAP(0x55, 0x5B, 0x5B75) /* <CJK */
-MAP(0x55, 0x5C, 0x5B78) /* <CJK */
-MAP(0x55, 0x5D, 0x6588) /* <CJK */
-MAP(0x55, 0x5E, 0x5B7A) /* <CJK */
-MAP(0x55, 0x5F, 0x5B80) /* <CJK */
-MAP(0x55, 0x60, 0x5B83) /* <CJK */
-MAP(0x55, 0x61, 0x5BA6) /* <CJK */
-MAP(0x55, 0x62, 0x5BB8) /* <CJK */
-MAP(0x55, 0x63, 0x5BC3) /* <CJK */
-MAP(0x55, 0x64, 0x5BC7) /* <CJK */
-MAP(0x55, 0x65, 0x5BC9) /* <CJK */
-MAP(0x55, 0x66, 0x5BD4) /* <CJK */
-MAP(0x55, 0x67, 0x5BD0) /* <CJK */
-MAP(0x55, 0x68, 0x5BE4) /* <CJK */
-MAP(0x55, 0x69, 0x5BE6) /* <CJK */
-MAP(0x55, 0x6A, 0x5BE2) /* <CJK */
-MAP(0x55, 0x6B, 0x5BDE) /* <CJK */
-MAP(0x55, 0x6C, 0x5BE5) /* <CJK */
-MAP(0x55, 0x6D, 0x5BEB) /* <CJK */
-MAP(0x55, 0x6E, 0x5BF0) /* <CJK */
-MAP(0x55, 0x6F, 0x5BF6) /* <CJK */
-MAP(0x55, 0x70, 0x5BF3) /* <CJK */
-MAP(0x55, 0x71, 0x5C05) /* <CJK */
-MAP(0x55, 0x72, 0x5C07) /* <CJK */
-MAP(0x55, 0x73, 0x5C08) /* <CJK */
-MAP(0x55, 0x74, 0x5C0D) /* <CJK */
-MAP(0x55, 0x75, 0x5C13) /* <CJK */
-MAP(0x55, 0x76, 0x5C20) /* <CJK */
-MAP(0x55, 0x77, 0x5C22) /* <CJK */
-MAP(0x55, 0x78, 0x5C28) /* <CJK */
-MAP(0x55, 0x79, 0x5C38) /* <CJK */
-MAP(0x55, 0x7A, 0x5C39) /* <CJK */
-MAP(0x55, 0x7B, 0x5C41) /* <CJK */
-MAP(0x55, 0x7C, 0x5C46) /* <CJK */
-MAP(0x55, 0x7D, 0x5C4E) /* <CJK */
-MAP(0x55, 0x7E, 0x5C53) /* <CJK */
-MAP(0x56, 0x21, 0x5C50) /* <CJK */
-MAP(0x56, 0x22, 0x5C4F) /* <CJK */
-MAP(0x56, 0x23, 0x5B71) /* <CJK */
-MAP(0x56, 0x24, 0x5C6C) /* <CJK */
-MAP(0x56, 0x25, 0x5C6E) /* <CJK */
-MAP(0x56, 0x26, 0x4E62) /* <CJK */
-MAP(0x56, 0x27, 0x5C76) /* <CJK */
-MAP(0x56, 0x28, 0x5C79) /* <CJK */
-MAP(0x56, 0x29, 0x5C8C) /* <CJK */
-MAP(0x56, 0x2A, 0x5C91) /* <CJK */
-MAP(0x56, 0x2B, 0x5C94) /* <CJK */
-MAP(0x56, 0x2C, 0x599B) /* <CJK */
-MAP(0x56, 0x2D, 0x5CAB) /* <CJK */
-MAP(0x56, 0x2E, 0x5CBB) /* <CJK */
-MAP(0x56, 0x2F, 0x5CB6) /* <CJK */
-MAP(0x56, 0x30, 0x5CBC) /* <CJK */
-MAP(0x56, 0x31, 0x5CB7) /* <CJK */
-MAP(0x56, 0x32, 0x5CC5) /* <CJK */
-MAP(0x56, 0x33, 0x5CBE) /* <CJK */
-MAP(0x56, 0x34, 0x5CC7) /* <CJK */
-MAP(0x56, 0x35, 0x5CD9) /* <CJK */
-MAP(0x56, 0x36, 0x5CE9) /* <CJK */
-MAP(0x56, 0x37, 0x5CFD) /* <CJK */
-MAP(0x56, 0x38, 0x5CFA) /* <CJK */
-MAP(0x56, 0x39, 0x5CED) /* <CJK */
-MAP(0x56, 0x3A, 0x5D8C) /* <CJK */
-MAP(0x56, 0x3B, 0x5CEA) /* <CJK */
-MAP(0x56, 0x3C, 0x5D0B) /* <CJK */
-MAP(0x56, 0x3D, 0x5D15) /* <CJK */
-MAP(0x56, 0x3E, 0x5D17) /* <CJK */
-MAP(0x56, 0x3F, 0x5D5C) /* <CJK */
-MAP(0x56, 0x40, 0x5D1F) /* <CJK */
-MAP(0x56, 0x41, 0x5D1B) /* <CJK */
-MAP(0x56, 0x42, 0x5D11) /* <CJK */
-MAP(0x56, 0x43, 0x5D14) /* <CJK */
-MAP(0x56, 0x44, 0x5D22) /* <CJK */
-MAP(0x56, 0x45, 0x5D1A) /* <CJK */
-MAP(0x56, 0x46, 0x5D19) /* <CJK */
-MAP(0x56, 0x47, 0x5D18) /* <CJK */
-MAP(0x56, 0x48, 0x5D4C) /* <CJK */
-MAP(0x56, 0x49, 0x5D52) /* <CJK */
-MAP(0x56, 0x4A, 0x5D4E) /* <CJK */
-MAP(0x56, 0x4B, 0x5D4B) /* <CJK */
-MAP(0x56, 0x4C, 0x5D6C) /* <CJK */
-MAP(0x56, 0x4D, 0x5D73) /* <CJK */
-MAP(0x56, 0x4E, 0x5D76) /* <CJK */
-MAP(0x56, 0x4F, 0x5D87) /* <CJK */
-MAP(0x56, 0x50, 0x5D84) /* <CJK */
-MAP(0x56, 0x51, 0x5D82) /* <CJK */
-MAP(0x56, 0x52, 0x5DA2) /* <CJK */
-MAP(0x56, 0x53, 0x5D9D) /* <CJK */
-MAP(0x56, 0x54, 0x5DAC) /* <CJK */
-MAP(0x56, 0x55, 0x5DAE) /* <CJK */
-MAP(0x56, 0x56, 0x5DBD) /* <CJK */
-MAP(0x56, 0x57, 0x5D90) /* <CJK */
-MAP(0x56, 0x58, 0x5DB7) /* <CJK */
-MAP(0x56, 0x59, 0x5DBC) /* <CJK */
-MAP(0x56, 0x5A, 0x5DC9) /* <CJK */
-MAP(0x56, 0x5B, 0x5DCD) /* <CJK */
-MAP(0x56, 0x5C, 0x5DD3) /* <CJK */
-MAP(0x56, 0x5D, 0x5DD2) /* <CJK */
-MAP(0x56, 0x5E, 0x5DD6) /* <CJK */
-MAP(0x56, 0x5F, 0x5DDB) /* <CJK */
-MAP(0x56, 0x60, 0x5DEB) /* <CJK */
-MAP(0x56, 0x61, 0x5DF2) /* <CJK */
-MAP(0x56, 0x62, 0x5DF5) /* <CJK */
-MAP(0x56, 0x63, 0x5E0B) /* <CJK */
-MAP(0x56, 0x64, 0x5E1A) /* <CJK */
-MAP(0x56, 0x65, 0x5E19) /* <CJK */
-MAP(0x56, 0x66, 0x5E11) /* <CJK */
-MAP(0x56, 0x67, 0x5E1B) /* <CJK */
-MAP(0x56, 0x68, 0x5E36) /* <CJK */
-MAP(0x56, 0x69, 0x5E37) /* <CJK */
-MAP(0x56, 0x6A, 0x5E44) /* <CJK */
-MAP(0x56, 0x6B, 0x5E43) /* <CJK */
-MAP(0x56, 0x6C, 0x5E40) /* <CJK */
-MAP(0x56, 0x6D, 0x5E4E) /* <CJK */
-MAP(0x56, 0x6E, 0x5E57) /* <CJK */
-MAP(0x56, 0x6F, 0x5E54) /* <CJK */
-MAP(0x56, 0x70, 0x5E5F) /* <CJK */
-MAP(0x56, 0x71, 0x5E62) /* <CJK */
-MAP(0x56, 0x72, 0x5E64) /* <CJK */
-MAP(0x56, 0x73, 0x5E47) /* <CJK */
-MAP(0x56, 0x74, 0x5E75) /* <CJK */
-MAP(0x56, 0x75, 0x5E76) /* <CJK */
-MAP(0x56, 0x76, 0x5E7A) /* <CJK */
-MAP(0x56, 0x77, 0x9EBC) /* <CJK */
-MAP(0x56, 0x78, 0x5E7F) /* <CJK */
-MAP(0x56, 0x79, 0x5EA0) /* <CJK */
-MAP(0x56, 0x7A, 0x5EC1) /* <CJK */
-MAP(0x56, 0x7B, 0x5EC2) /* <CJK */
-MAP(0x56, 0x7C, 0x5EC8) /* <CJK */
-MAP(0x56, 0x7D, 0x5ED0) /* <CJK */
-MAP(0x56, 0x7E, 0x5ECF) /* <CJK */
-MAP(0x57, 0x21, 0x5ED6) /* <CJK */
-MAP(0x57, 0x22, 0x5EE3) /* <CJK */
-MAP(0x57, 0x23, 0x5EDD) /* <CJK */
-MAP(0x57, 0x24, 0x5EDA) /* <CJK */
-MAP(0x57, 0x25, 0x5EDB) /* <CJK */
-MAP(0x57, 0x26, 0x5EE2) /* <CJK */
-MAP(0x57, 0x27, 0x5EE1) /* <CJK */
-MAP(0x57, 0x28, 0x5EE8) /* <CJK */
-MAP(0x57, 0x29, 0x5EE9) /* <CJK */
-MAP(0x57, 0x2A, 0x5EEC) /* <CJK */
-MAP(0x57, 0x2B, 0x5EF1) /* <CJK */
-MAP(0x57, 0x2C, 0x5EF3) /* <CJK */
-MAP(0x57, 0x2D, 0x5EF0) /* <CJK */
-MAP(0x57, 0x2E, 0x5EF4) /* <CJK */
-MAP(0x57, 0x2F, 0x5EF8) /* <CJK */
-MAP(0x57, 0x30, 0x5EFE) /* <CJK */
-MAP(0x57, 0x31, 0x5F03) /* <CJK */
-MAP(0x57, 0x32, 0x5F09) /* <CJK */
-MAP(0x57, 0x33, 0x5F5D) /* <CJK */
-MAP(0x57, 0x34, 0x5F5C) /* <CJK */
-MAP(0x57, 0x35, 0x5F0B) /* <CJK */
-MAP(0x57, 0x36, 0x5F11) /* <CJK */
-MAP(0x57, 0x37, 0x5F16) /* <CJK */
-MAP(0x57, 0x38, 0x5F29) /* <CJK */
-MAP(0x57, 0x39, 0x5F2D) /* <CJK */
-MAP(0x57, 0x3A, 0x5F38) /* <CJK */
-MAP(0x57, 0x3B, 0x5F41) /* <CJK */
-MAP(0x57, 0x3C, 0x5F48) /* <CJK */
-MAP(0x57, 0x3D, 0x5F4C) /* <CJK */
-MAP(0x57, 0x3E, 0x5F4E) /* <CJK */
-MAP(0x57, 0x3F, 0x5F2F) /* <CJK */
-MAP(0x57, 0x40, 0x5F51) /* <CJK */
-MAP(0x57, 0x41, 0x5F56) /* <CJK */
-MAP(0x57, 0x42, 0x5F57) /* <CJK */
-MAP(0x57, 0x43, 0x5F59) /* <CJK */
-MAP(0x57, 0x44, 0x5F61) /* <CJK */
-MAP(0x57, 0x45, 0x5F6D) /* <CJK */
-MAP(0x57, 0x46, 0x5F73) /* <CJK */
-MAP(0x57, 0x47, 0x5F77) /* <CJK */
-MAP(0x57, 0x48, 0x5F83) /* <CJK */
-MAP(0x57, 0x49, 0x5F82) /* <CJK */
-MAP(0x57, 0x4A, 0x5F7F) /* <CJK */
-MAP(0x57, 0x4B, 0x5F8A) /* <CJK */
-MAP(0x57, 0x4C, 0x5F88) /* <CJK */
-MAP(0x57, 0x4D, 0x5F91) /* <CJK */
-MAP(0x57, 0x4E, 0x5F87) /* <CJK */
-MAP(0x57, 0x4F, 0x5F9E) /* <CJK */
-MAP(0x57, 0x50, 0x5F99) /* <CJK */
-MAP(0x57, 0x51, 0x5F98) /* <CJK */
-MAP(0x57, 0x52, 0x5FA0) /* <CJK */
-MAP(0x57, 0x53, 0x5FA8) /* <CJK */
-MAP(0x57, 0x54, 0x5FAD) /* <CJK */
-MAP(0x57, 0x55, 0x5FBC) /* <CJK */
-MAP(0x57, 0x56, 0x5FD6) /* <CJK */
-MAP(0x57, 0x57, 0x5FFB) /* <CJK */
-MAP(0x57, 0x58, 0x5FE4) /* <CJK */
-MAP(0x57, 0x59, 0x5FF8) /* <CJK */
-MAP(0x57, 0x5A, 0x5FF1) /* <CJK */
-MAP(0x57, 0x5B, 0x5FDD) /* <CJK */
-MAP(0x57, 0x5C, 0x60B3) /* <CJK */
-MAP(0x57, 0x5D, 0x5FFF) /* <CJK */
-MAP(0x57, 0x5E, 0x6021) /* <CJK */
-MAP(0x57, 0x5F, 0x6060) /* <CJK */
-MAP(0x57, 0x60, 0x6019) /* <CJK */
-MAP(0x57, 0x61, 0x6010) /* <CJK */
-MAP(0x57, 0x62, 0x6029) /* <CJK */
-MAP(0x57, 0x63, 0x600E) /* <CJK */
-MAP(0x57, 0x64, 0x6031) /* <CJK */
-MAP(0x57, 0x65, 0x601B) /* <CJK */
-MAP(0x57, 0x66, 0x6015) /* <CJK */
-MAP(0x57, 0x67, 0x602B) /* <CJK */
-MAP(0x57, 0x68, 0x6026) /* <CJK */
-MAP(0x57, 0x69, 0x600F) /* <CJK */
-MAP(0x57, 0x6A, 0x603A) /* <CJK */
-MAP(0x57, 0x6B, 0x605A) /* <CJK */
-MAP(0x57, 0x6C, 0x6041) /* <CJK */
-MAP(0x57, 0x6D, 0x606A) /* <CJK */
-MAP(0x57, 0x6E, 0x6077) /* <CJK */
-MAP(0x57, 0x6F, 0x605F) /* <CJK */
-MAP(0x57, 0x70, 0x604A) /* <CJK */
-MAP(0x57, 0x71, 0x6046) /* <CJK */
-MAP(0x57, 0x72, 0x604D) /* <CJK */
-MAP(0x57, 0x73, 0x6063) /* <CJK */
-MAP(0x57, 0x74, 0x6043) /* <CJK */
-MAP(0x57, 0x75, 0x6064) /* <CJK */
-MAP(0x57, 0x76, 0x6042) /* <CJK */
-MAP(0x57, 0x77, 0x606C) /* <CJK */
-MAP(0x57, 0x78, 0x606B) /* <CJK */
-MAP(0x57, 0x79, 0x6059) /* <CJK */
-MAP(0x57, 0x7A, 0x6081) /* <CJK */
-MAP(0x57, 0x7B, 0x608D) /* <CJK */
-MAP(0x57, 0x7C, 0x60E7) /* <CJK */
-MAP(0x57, 0x7D, 0x6083) /* <CJK */
-MAP(0x57, 0x7E, 0x609A) /* <CJK */
-MAP(0x58, 0x21, 0x6084) /* <CJK */
-MAP(0x58, 0x22, 0x609B) /* <CJK */
-MAP(0x58, 0x23, 0x6096) /* <CJK */
-MAP(0x58, 0x24, 0x6097) /* <CJK */
-MAP(0x58, 0x25, 0x6092) /* <CJK */
-MAP(0x58, 0x26, 0x60A7) /* <CJK */
-MAP(0x58, 0x27, 0x608B) /* <CJK */
-MAP(0x58, 0x28, 0x60E1) /* <CJK */
-MAP(0x58, 0x29, 0x60B8) /* <CJK */
-MAP(0x58, 0x2A, 0x60E0) /* <CJK */
-MAP(0x58, 0x2B, 0x60D3) /* <CJK */
-MAP(0x58, 0x2C, 0x60B4) /* <CJK */
-MAP(0x58, 0x2D, 0x5FF0) /* <CJK */
-MAP(0x58, 0x2E, 0x60BD) /* <CJK */
-MAP(0x58, 0x2F, 0x60C6) /* <CJK */
-MAP(0x58, 0x30, 0x60B5) /* <CJK */
-MAP(0x58, 0x31, 0x60D8) /* <CJK */
-MAP(0x58, 0x32, 0x614D) /* <CJK */
-MAP(0x58, 0x33, 0x6115) /* <CJK */
-MAP(0x58, 0x34, 0x6106) /* <CJK */
-MAP(0x58, 0x35, 0x60F6) /* <CJK */
-MAP(0x58, 0x36, 0x60F7) /* <CJK */
-MAP(0x58, 0x37, 0x6100) /* <CJK */
-MAP(0x58, 0x38, 0x60F4) /* <CJK */
-MAP(0x58, 0x39, 0x60FA) /* <CJK */
-MAP(0x58, 0x3A, 0x6103) /* <CJK */
-MAP(0x58, 0x3B, 0x6121) /* <CJK */
-MAP(0x58, 0x3C, 0x60FB) /* <CJK */
-MAP(0x58, 0x3D, 0x60F1) /* <CJK */
-MAP(0x58, 0x3E, 0x610D) /* <CJK */
-MAP(0x58, 0x3F, 0x610E) /* <CJK */
-MAP(0x58, 0x40, 0x6147) /* <CJK */
-MAP(0x58, 0x41, 0x613E) /* <CJK */
-MAP(0x58, 0x42, 0x6128) /* <CJK */
-MAP(0x58, 0x43, 0x6127) /* <CJK */
-MAP(0x58, 0x44, 0x614A) /* <CJK */
-MAP(0x58, 0x45, 0x613F) /* <CJK */
-MAP(0x58, 0x46, 0x613C) /* <CJK */
-MAP(0x58, 0x47, 0x612C) /* <CJK */
-MAP(0x58, 0x48, 0x6134) /* <CJK */
-MAP(0x58, 0x49, 0x613D) /* <CJK */
-MAP(0x58, 0x4A, 0x6142) /* <CJK */
-MAP(0x58, 0x4B, 0x6144) /* <CJK */
-MAP(0x58, 0x4C, 0x6173) /* <CJK */
-MAP(0x58, 0x4D, 0x6177) /* <CJK */
-MAP(0x58, 0x4E, 0x6158) /* <CJK */
-MAP(0x58, 0x4F, 0x6159) /* <CJK */
-MAP(0x58, 0x50, 0x615A) /* <CJK */
-MAP(0x58, 0x51, 0x616B) /* <CJK */
-MAP(0x58, 0x52, 0x6174) /* <CJK */
-MAP(0x58, 0x53, 0x616F) /* <CJK */
-MAP(0x58, 0x54, 0x6165) /* <CJK */
-MAP(0x58, 0x55, 0x6171) /* <CJK */
-MAP(0x58, 0x56, 0x615F) /* <CJK */
-MAP(0x58, 0x57, 0x615D) /* <CJK */
-MAP(0x58, 0x58, 0x6153) /* <CJK */
-MAP(0x58, 0x59, 0x6175) /* <CJK */
-MAP(0x58, 0x5A, 0x6199) /* <CJK */
-MAP(0x58, 0x5B, 0x6196) /* <CJK */
-MAP(0x58, 0x5C, 0x6187) /* <CJK */
-MAP(0x58, 0x5D, 0x61AC) /* <CJK */
-MAP(0x58, 0x5E, 0x6194) /* <CJK */
-MAP(0x58, 0x5F, 0x619A) /* <CJK */
-MAP(0x58, 0x60, 0x618A) /* <CJK */
-MAP(0x58, 0x61, 0x6191) /* <CJK */
-MAP(0x58, 0x62, 0x61AB) /* <CJK */
-MAP(0x58, 0x63, 0x61AE) /* <CJK */
-MAP(0x58, 0x64, 0x61CC) /* <CJK */
-MAP(0x58, 0x65, 0x61CA) /* <CJK */
-MAP(0x58, 0x66, 0x61C9) /* <CJK */
-MAP(0x58, 0x67, 0x61F7) /* <CJK */
-MAP(0x58, 0x68, 0x61C8) /* <CJK */
-MAP(0x58, 0x69, 0x61C3) /* <CJK */
-MAP(0x58, 0x6A, 0x61C6) /* <CJK */
-MAP(0x58, 0x6B, 0x61BA) /* <CJK */
-MAP(0x58, 0x6C, 0x61CB) /* <CJK */
-MAP(0x58, 0x6D, 0x7F79) /* <CJK */
-MAP(0x58, 0x6E, 0x61CD) /* <CJK */
-MAP(0x58, 0x6F, 0x61E6) /* <CJK */
-MAP(0x58, 0x70, 0x61E3) /* <CJK */
-MAP(0x58, 0x71, 0x61F6) /* <CJK */
-MAP(0x58, 0x72, 0x61FA) /* <CJK */
-MAP(0x58, 0x73, 0x61F4) /* <CJK */
-MAP(0x58, 0x74, 0x61FF) /* <CJK */
-MAP(0x58, 0x75, 0x61FD) /* <CJK */
-MAP(0x58, 0x76, 0x61FC) /* <CJK */
-MAP(0x58, 0x77, 0x61FE) /* <CJK */
-MAP(0x58, 0x78, 0x6200) /* <CJK */
-MAP(0x58, 0x79, 0x6208) /* <CJK */
-MAP(0x58, 0x7A, 0x6209) /* <CJK */
-MAP(0x58, 0x7B, 0x620D) /* <CJK */
-MAP(0x58, 0x7C, 0x620C) /* <CJK */
-MAP(0x58, 0x7D, 0x6214) /* <CJK */
-MAP(0x58, 0x7E, 0x621B) /* <CJK */
-MAP(0x59, 0x21, 0x621E) /* <CJK */
-MAP(0x59, 0x22, 0x6221) /* <CJK */
-MAP(0x59, 0x23, 0x622A) /* <CJK */
-MAP(0x59, 0x24, 0x622E) /* <CJK */
-MAP(0x59, 0x25, 0x6230) /* <CJK */
-MAP(0x59, 0x26, 0x6232) /* <CJK */
-MAP(0x59, 0x27, 0x6233) /* <CJK */
-MAP(0x59, 0x28, 0x6241) /* <CJK */
-MAP(0x59, 0x29, 0x624E) /* <CJK */
-MAP(0x59, 0x2A, 0x625E) /* <CJK */
-MAP(0x59, 0x2B, 0x6263) /* <CJK */
-MAP(0x59, 0x2C, 0x625B) /* <CJK */
-MAP(0x59, 0x2D, 0x6260) /* <CJK */
-MAP(0x59, 0x2E, 0x6268) /* <CJK */
-MAP(0x59, 0x2F, 0x627C) /* <CJK */
-MAP(0x59, 0x30, 0x6282) /* <CJK */
-MAP(0x59, 0x31, 0x6289) /* <CJK */
-MAP(0x59, 0x32, 0x627E) /* <CJK */
-MAP(0x59, 0x33, 0x6292) /* <CJK */
-MAP(0x59, 0x34, 0x6293) /* <CJK */
-MAP(0x59, 0x35, 0x6296) /* <CJK */
-MAP(0x59, 0x36, 0x62D4) /* <CJK */
-MAP(0x59, 0x37, 0x6283) /* <CJK */
-MAP(0x59, 0x38, 0x6294) /* <CJK */
-MAP(0x59, 0x39, 0x62D7) /* <CJK */
-MAP(0x59, 0x3A, 0x62D1) /* <CJK */
-MAP(0x59, 0x3B, 0x62BB) /* <CJK */
-MAP(0x59, 0x3C, 0x62CF) /* <CJK */
-MAP(0x59, 0x3D, 0x62FF) /* <CJK */
-MAP(0x59, 0x3E, 0x62C6) /* <CJK */
-MAP(0x59, 0x3F, 0x64D4) /* <CJK */
-MAP(0x59, 0x40, 0x62C8) /* <CJK */
-MAP(0x59, 0x41, 0x62DC) /* <CJK */
-MAP(0x59, 0x42, 0x62CC) /* <CJK */
-MAP(0x59, 0x43, 0x62CA) /* <CJK */
-MAP(0x59, 0x44, 0x62C2) /* <CJK */
-MAP(0x59, 0x45, 0x62C7) /* <CJK */
-MAP(0x59, 0x46, 0x629B) /* <CJK */
-MAP(0x59, 0x47, 0x62C9) /* <CJK */
-MAP(0x59, 0x48, 0x630C) /* <CJK */
-MAP(0x59, 0x49, 0x62EE) /* <CJK */
-MAP(0x59, 0x4A, 0x62F1) /* <CJK */
-MAP(0x59, 0x4B, 0x6327) /* <CJK */
-MAP(0x59, 0x4C, 0x6302) /* <CJK */
-MAP(0x59, 0x4D, 0x6308) /* <CJK */
-MAP(0x59, 0x4E, 0x62EF) /* <CJK */
-MAP(0x59, 0x4F, 0x62F5) /* <CJK */
-MAP(0x59, 0x50, 0x6350) /* <CJK */
-MAP(0x59, 0x51, 0x633E) /* <CJK */
-MAP(0x59, 0x52, 0x634D) /* <CJK */
-MAP(0x59, 0x53, 0x641C) /* <CJK */
-MAP(0x59, 0x54, 0x634F) /* <CJK */
-MAP(0x59, 0x55, 0x6396) /* <CJK */
-MAP(0x59, 0x56, 0x638E) /* <CJK */
-MAP(0x59, 0x57, 0x6380) /* <CJK */
-MAP(0x59, 0x58, 0x63AB) /* <CJK */
-MAP(0x59, 0x59, 0x6376) /* <CJK */
-MAP(0x59, 0x5A, 0x63A3) /* <CJK */
-MAP(0x59, 0x5B, 0x638F) /* <CJK */
-MAP(0x59, 0x5C, 0x6389) /* <CJK */
-MAP(0x59, 0x5D, 0x639F) /* <CJK */
-MAP(0x59, 0x5E, 0x63B5) /* <CJK */
-MAP(0x59, 0x5F, 0x636B) /* <CJK */
-MAP(0x59, 0x60, 0x6369) /* <CJK */
-MAP(0x59, 0x61, 0x63BE) /* <CJK */
-MAP(0x59, 0x62, 0x63E9) /* <CJK */
-MAP(0x59, 0x63, 0x63C0) /* <CJK */
-MAP(0x59, 0x64, 0x63C6) /* <CJK */
-MAP(0x59, 0x65, 0x63E3) /* <CJK */
-MAP(0x59, 0x66, 0x63C9) /* <CJK */
-MAP(0x59, 0x67, 0x63D2) /* <CJK */
-MAP(0x59, 0x68, 0x63F6) /* <CJK */
-MAP(0x59, 0x69, 0x63C4) /* <CJK */
-MAP(0x59, 0x6A, 0x6416) /* <CJK */
-MAP(0x59, 0x6B, 0x6434) /* <CJK */
-MAP(0x59, 0x6C, 0x6406) /* <CJK */
-MAP(0x59, 0x6D, 0x6413) /* <CJK */
-MAP(0x59, 0x6E, 0x6426) /* <CJK */
-MAP(0x59, 0x6F, 0x6436) /* <CJK */
-MAP(0x59, 0x70, 0x651D) /* <CJK */
-MAP(0x59, 0x71, 0x6417) /* <CJK */
-MAP(0x59, 0x72, 0x6428) /* <CJK */
-MAP(0x59, 0x73, 0x640F) /* <CJK */
-MAP(0x59, 0x74, 0x6467) /* <CJK */
-MAP(0x59, 0x75, 0x646F) /* <CJK */
-MAP(0x59, 0x76, 0x6476) /* <CJK */
-MAP(0x59, 0x77, 0x644E) /* <CJK */
-MAP(0x59, 0x78, 0x652A) /* <CJK */
-MAP(0x59, 0x79, 0x6495) /* <CJK */
-MAP(0x59, 0x7A, 0x6493) /* <CJK */
-MAP(0x59, 0x7B, 0x64A5) /* <CJK */
-MAP(0x59, 0x7C, 0x64A9) /* <CJK */
-MAP(0x59, 0x7D, 0x6488) /* <CJK */
-MAP(0x59, 0x7E, 0x64BC) /* <CJK */
-MAP(0x5A, 0x21, 0x64DA) /* <CJK */
-MAP(0x5A, 0x22, 0x64D2) /* <CJK */
-MAP(0x5A, 0x23, 0x64C5) /* <CJK */
-MAP(0x5A, 0x24, 0x64C7) /* <CJK */
-MAP(0x5A, 0x25, 0x64BB) /* <CJK */
-MAP(0x5A, 0x26, 0x64D8) /* <CJK */
-MAP(0x5A, 0x27, 0x64C2) /* <CJK */
-MAP(0x5A, 0x28, 0x64F1) /* <CJK */
-MAP(0x5A, 0x29, 0x64E7) /* <CJK */
-MAP(0x5A, 0x2A, 0x8209) /* <CJK */
-MAP(0x5A, 0x2B, 0x64E0) /* <CJK */
-MAP(0x5A, 0x2C, 0x64E1) /* <CJK */
-MAP(0x5A, 0x2D, 0x62AC) /* <CJK */
-MAP(0x5A, 0x2E, 0x64E3) /* <CJK */
-MAP(0x5A, 0x2F, 0x64EF) /* <CJK */
-MAP(0x5A, 0x30, 0x652C) /* <CJK */
-MAP(0x5A, 0x31, 0x64F6) /* <CJK */
-MAP(0x5A, 0x32, 0x64F4) /* <CJK */
-MAP(0x5A, 0x33, 0x64F2) /* <CJK */
-MAP(0x5A, 0x34, 0x64FA) /* <CJK */
-MAP(0x5A, 0x35, 0x6500) /* <CJK */
-MAP(0x5A, 0x36, 0x64FD) /* <CJK */
-MAP(0x5A, 0x37, 0x6518) /* <CJK */
-MAP(0x5A, 0x38, 0x651C) /* <CJK */
-MAP(0x5A, 0x39, 0x6505) /* <CJK */
-MAP(0x5A, 0x3A, 0x6524) /* <CJK */
-MAP(0x5A, 0x3B, 0x6523) /* <CJK */
-MAP(0x5A, 0x3C, 0x652B) /* <CJK */
-MAP(0x5A, 0x3D, 0x6534) /* <CJK */
-MAP(0x5A, 0x3E, 0x6535) /* <CJK */
-MAP(0x5A, 0x3F, 0x6537) /* <CJK */
-MAP(0x5A, 0x40, 0x6536) /* <CJK */
-MAP(0x5A, 0x41, 0x6538) /* <CJK */
-MAP(0x5A, 0x42, 0x754B) /* <CJK */
-MAP(0x5A, 0x43, 0x6548) /* <CJK */
-MAP(0x5A, 0x44, 0x6556) /* <CJK */
-MAP(0x5A, 0x45, 0x6555) /* <CJK */
-MAP(0x5A, 0x46, 0x654D) /* <CJK */
-MAP(0x5A, 0x47, 0x6558) /* <CJK */
-MAP(0x5A, 0x48, 0x655E) /* <CJK */
-MAP(0x5A, 0x49, 0x655D) /* <CJK */
-MAP(0x5A, 0x4A, 0x6572) /* <CJK */
-MAP(0x5A, 0x4B, 0x6578) /* <CJK */
-MAP(0x5A, 0x4C, 0x6582) /* <CJK */
-MAP(0x5A, 0x4D, 0x6583) /* <CJK */
-MAP(0x5A, 0x4E, 0x8B8A) /* <CJK */
-MAP(0x5A, 0x4F, 0x659B) /* <CJK */
-MAP(0x5A, 0x50, 0x659F) /* <CJK */
-MAP(0x5A, 0x51, 0x65AB) /* <CJK */
-MAP(0x5A, 0x52, 0x65B7) /* <CJK */
-MAP(0x5A, 0x53, 0x65C3) /* <CJK */
-MAP(0x5A, 0x54, 0x65C6) /* <CJK */
-MAP(0x5A, 0x55, 0x65C1) /* <CJK */
-MAP(0x5A, 0x56, 0x65C4) /* <CJK */
-MAP(0x5A, 0x57, 0x65CC) /* <CJK */
-MAP(0x5A, 0x58, 0x65D2) /* <CJK */
-MAP(0x5A, 0x59, 0x65DB) /* <CJK */
-MAP(0x5A, 0x5A, 0x65D9) /* <CJK */
-MAP(0x5A, 0x5B, 0x65E0) /* <CJK */
-MAP(0x5A, 0x5C, 0x65E1) /* <CJK */
-MAP(0x5A, 0x5D, 0x65F1) /* <CJK */
-MAP(0x5A, 0x5E, 0x6772) /* <CJK */
-MAP(0x5A, 0x5F, 0x660A) /* <CJK */
-MAP(0x5A, 0x60, 0x6603) /* <CJK */
-MAP(0x5A, 0x61, 0x65FB) /* <CJK */
-MAP(0x5A, 0x62, 0x6773) /* <CJK */
-MAP(0x5A, 0x63, 0x6635) /* <CJK */
-MAP(0x5A, 0x64, 0x6636) /* <CJK */
-MAP(0x5A, 0x65, 0x6634) /* <CJK */
-MAP(0x5A, 0x66, 0x661C) /* <CJK */
-MAP(0x5A, 0x67, 0x664F) /* <CJK */
-MAP(0x5A, 0x68, 0x6644) /* <CJK */
-MAP(0x5A, 0x69, 0x6649) /* <CJK */
-MAP(0x5A, 0x6A, 0x6641) /* <CJK */
-MAP(0x5A, 0x6B, 0x665E) /* <CJK */
-MAP(0x5A, 0x6C, 0x665D) /* <CJK */
-MAP(0x5A, 0x6D, 0x6664) /* <CJK */
-MAP(0x5A, 0x6E, 0x6667) /* <CJK */
-MAP(0x5A, 0x6F, 0x6668) /* <CJK */
-MAP(0x5A, 0x70, 0x665F) /* <CJK */
-MAP(0x5A, 0x71, 0x6662) /* <CJK */
-MAP(0x5A, 0x72, 0x6670) /* <CJK */
-MAP(0x5A, 0x73, 0x6683) /* <CJK */
-MAP(0x5A, 0x74, 0x6688) /* <CJK */
-MAP(0x5A, 0x75, 0x668E) /* <CJK */
-MAP(0x5A, 0x76, 0x6689) /* <CJK */
-MAP(0x5A, 0x77, 0x6684) /* <CJK */
-MAP(0x5A, 0x78, 0x6698) /* <CJK */
-MAP(0x5A, 0x79, 0x669D) /* <CJK */
-MAP(0x5A, 0x7A, 0x66C1) /* <CJK */
-MAP(0x5A, 0x7B, 0x66B9) /* <CJK */
-MAP(0x5A, 0x7C, 0x66C9) /* <CJK */
-MAP(0x5A, 0x7D, 0x66BE) /* <CJK */
-MAP(0x5A, 0x7E, 0x66BC) /* <CJK */
-MAP(0x5B, 0x21, 0x66C4) /* <CJK */
-MAP(0x5B, 0x22, 0x66B8) /* <CJK */
-MAP(0x5B, 0x23, 0x66D6) /* <CJK */
-MAP(0x5B, 0x24, 0x66DA) /* <CJK */
-MAP(0x5B, 0x25, 0x66E0) /* <CJK */
-MAP(0x5B, 0x26, 0x663F) /* <CJK */
-MAP(0x5B, 0x27, 0x66E6) /* <CJK */
-MAP(0x5B, 0x28, 0x66E9) /* <CJK */
-MAP(0x5B, 0x29, 0x66F0) /* <CJK */
-MAP(0x5B, 0x2A, 0x66F5) /* <CJK */
-MAP(0x5B, 0x2B, 0x66F7) /* <CJK */
-MAP(0x5B, 0x2C, 0x670F) /* <CJK */
-MAP(0x5B, 0x2D, 0x6716) /* <CJK */
-MAP(0x5B, 0x2E, 0x671E) /* <CJK */
-MAP(0x5B, 0x2F, 0x6726) /* <CJK */
-MAP(0x5B, 0x30, 0x6727) /* <CJK */
-MAP(0x5B, 0x31, 0x9738) /* <CJK */
-MAP(0x5B, 0x32, 0x672E) /* <CJK */
-MAP(0x5B, 0x33, 0x673F) /* <CJK */
-MAP(0x5B, 0x34, 0x6736) /* <CJK */
-MAP(0x5B, 0x35, 0x6741) /* <CJK */
-MAP(0x5B, 0x36, 0x6738) /* <CJK */
-MAP(0x5B, 0x37, 0x6737) /* <CJK */
-MAP(0x5B, 0x38, 0x6746) /* <CJK */
-MAP(0x5B, 0x39, 0x675E) /* <CJK */
-MAP(0x5B, 0x3A, 0x6760) /* <CJK */
-MAP(0x5B, 0x3B, 0x6759) /* <CJK */
-MAP(0x5B, 0x3C, 0x6763) /* <CJK */
-MAP(0x5B, 0x3D, 0x6764) /* <CJK */
-MAP(0x5B, 0x3E, 0x6789) /* <CJK */
-MAP(0x5B, 0x3F, 0x6770) /* <CJK */
-MAP(0x5B, 0x40, 0x67A9) /* <CJK */
-MAP(0x5B, 0x41, 0x677C) /* <CJK */
-MAP(0x5B, 0x42, 0x676A) /* <CJK */
-MAP(0x5B, 0x43, 0x678C) /* <CJK */
-MAP(0x5B, 0x44, 0x678B) /* <CJK */
-MAP(0x5B, 0x45, 0x67A6) /* <CJK */
-MAP(0x5B, 0x46, 0x67A1) /* <CJK */
-MAP(0x5B, 0x47, 0x6785) /* <CJK */
-MAP(0x5B, 0x48, 0x67B7) /* <CJK */
-MAP(0x5B, 0x49, 0x67EF) /* <CJK */
-MAP(0x5B, 0x4A, 0x67B4) /* <CJK */
-MAP(0x5B, 0x4B, 0x67EC) /* <CJK */
-MAP(0x5B, 0x4C, 0x67B3) /* <CJK */
-MAP(0x5B, 0x4D, 0x67E9) /* <CJK */
-MAP(0x5B, 0x4E, 0x67B8) /* <CJK */
-MAP(0x5B, 0x4F, 0x67E4) /* <CJK */
-MAP(0x5B, 0x50, 0x67DE) /* <CJK */
-MAP(0x5B, 0x51, 0x67DD) /* <CJK */
-MAP(0x5B, 0x52, 0x67E2) /* <CJK */
-MAP(0x5B, 0x53, 0x67EE) /* <CJK */
-MAP(0x5B, 0x54, 0x67B9) /* <CJK */
-MAP(0x5B, 0x55, 0x67CE) /* <CJK */
-MAP(0x5B, 0x56, 0x67C6) /* <CJK */
-MAP(0x5B, 0x57, 0x67E7) /* <CJK */
-MAP(0x5B, 0x58, 0x6A9C) /* <CJK */
-MAP(0x5B, 0x59, 0x681E) /* <CJK */
-MAP(0x5B, 0x5A, 0x6846) /* <CJK */
-MAP(0x5B, 0x5B, 0x6829) /* <CJK */
-MAP(0x5B, 0x5C, 0x6840) /* <CJK */
-MAP(0x5B, 0x5D, 0x684D) /* <CJK */
-MAP(0x5B, 0x5E, 0x6832) /* <CJK */
-MAP(0x5B, 0x5F, 0x684E) /* <CJK */
-MAP(0x5B, 0x60, 0x68B3) /* <CJK */
-MAP(0x5B, 0x61, 0x682B) /* <CJK */
-MAP(0x5B, 0x62, 0x6859) /* <CJK */
-MAP(0x5B, 0x63, 0x6863) /* <CJK */
-MAP(0x5B, 0x64, 0x6877) /* <CJK */
-MAP(0x5B, 0x65, 0x687F) /* <CJK */
-MAP(0x5B, 0x66, 0x689F) /* <CJK */
-MAP(0x5B, 0x67, 0x688F) /* <CJK */
-MAP(0x5B, 0x68, 0x68AD) /* <CJK */
-MAP(0x5B, 0x69, 0x6894) /* <CJK */
-MAP(0x5B, 0x6A, 0x689D) /* <CJK */
-MAP(0x5B, 0x6B, 0x689B) /* <CJK */
-MAP(0x5B, 0x6C, 0x6883) /* <CJK */
-MAP(0x5B, 0x6D, 0x6AAE) /* <CJK */
-MAP(0x5B, 0x6E, 0x68B9) /* <CJK */
-MAP(0x5B, 0x6F, 0x6874) /* <CJK */
-MAP(0x5B, 0x70, 0x68B5) /* <CJK */
-MAP(0x5B, 0x71, 0x68A0) /* <CJK */
-MAP(0x5B, 0x72, 0x68BA) /* <CJK */
-MAP(0x5B, 0x73, 0x690F) /* <CJK */
-MAP(0x5B, 0x74, 0x688D) /* <CJK */
-MAP(0x5B, 0x75, 0x687E) /* <CJK */
-MAP(0x5B, 0x76, 0x6901) /* <CJK */
-MAP(0x5B, 0x77, 0x68CA) /* <CJK */
-MAP(0x5B, 0x78, 0x6908) /* <CJK */
-MAP(0x5B, 0x79, 0x68D8) /* <CJK */
-MAP(0x5B, 0x7A, 0x6922) /* <CJK */
-MAP(0x5B, 0x7B, 0x6926) /* <CJK */
-MAP(0x5B, 0x7C, 0x68E1) /* <CJK */
-MAP(0x5B, 0x7D, 0x690C) /* <CJK */
-MAP(0x5B, 0x7E, 0x68CD) /* <CJK */
-MAP(0x5C, 0x21, 0x68D4) /* <CJK */
-MAP(0x5C, 0x22, 0x68E7) /* <CJK */
-MAP(0x5C, 0x23, 0x68D5) /* <CJK */
-MAP(0x5C, 0x24, 0x6936) /* <CJK */
-MAP(0x5C, 0x25, 0x6912) /* <CJK */
-MAP(0x5C, 0x26, 0x6904) /* <CJK */
-MAP(0x5C, 0x27, 0x68D7) /* <CJK */
-MAP(0x5C, 0x28, 0x68E3) /* <CJK */
-MAP(0x5C, 0x29, 0x6925) /* <CJK */
-MAP(0x5C, 0x2A, 0x68F9) /* <CJK */
-MAP(0x5C, 0x2B, 0x68E0) /* <CJK */
-MAP(0x5C, 0x2C, 0x68EF) /* <CJK */
-MAP(0x5C, 0x2D, 0x6928) /* <CJK */
-MAP(0x5C, 0x2E, 0x692A) /* <CJK */
-MAP(0x5C, 0x2F, 0x691A) /* <CJK */
-MAP(0x5C, 0x30, 0x6923) /* <CJK */
-MAP(0x5C, 0x31, 0x6921) /* <CJK */
-MAP(0x5C, 0x32, 0x68C6) /* <CJK */
-MAP(0x5C, 0x33, 0x6979) /* <CJK */
-MAP(0x5C, 0x34, 0x6977) /* <CJK */
-MAP(0x5C, 0x35, 0x695C) /* <CJK */
-MAP(0x5C, 0x36, 0x6978) /* <CJK */
-MAP(0x5C, 0x37, 0x696B) /* <CJK */
-MAP(0x5C, 0x38, 0x6954) /* <CJK */
-MAP(0x5C, 0x39, 0x697E) /* <CJK */
-MAP(0x5C, 0x3A, 0x696E) /* <CJK */
-MAP(0x5C, 0x3B, 0x6939) /* <CJK */
-MAP(0x5C, 0x3C, 0x6974) /* <CJK */
-MAP(0x5C, 0x3D, 0x693D) /* <CJK */
-MAP(0x5C, 0x3E, 0x6959) /* <CJK */
-MAP(0x5C, 0x3F, 0x6930) /* <CJK */
-MAP(0x5C, 0x40, 0x6961) /* <CJK */
-MAP(0x5C, 0x41, 0x695E) /* <CJK */
-MAP(0x5C, 0x42, 0x695D) /* <CJK */
-MAP(0x5C, 0x43, 0x6981) /* <CJK */
-MAP(0x5C, 0x44, 0x696A) /* <CJK */
-MAP(0x5C, 0x45, 0x69B2) /* <CJK */
-MAP(0x5C, 0x46, 0x69AE) /* <CJK */
-MAP(0x5C, 0x47, 0x69D0) /* <CJK */
-MAP(0x5C, 0x48, 0x69BF) /* <CJK */
-MAP(0x5C, 0x49, 0x69C1) /* <CJK */
-MAP(0x5C, 0x4A, 0x69D3) /* <CJK */
-MAP(0x5C, 0x4B, 0x69BE) /* <CJK */
-MAP(0x5C, 0x4C, 0x69CE) /* <CJK */
-MAP(0x5C, 0x4D, 0x5BE8) /* <CJK */
-MAP(0x5C, 0x4E, 0x69CA) /* <CJK */
-MAP(0x5C, 0x4F, 0x69DD) /* <CJK */
-MAP(0x5C, 0x50, 0x69BB) /* <CJK */
-MAP(0x5C, 0x51, 0x69C3) /* <CJK */
-MAP(0x5C, 0x52, 0x69A7) /* <CJK */
-MAP(0x5C, 0x53, 0x6A2E) /* <CJK */
-MAP(0x5C, 0x54, 0x6991) /* <CJK */
-MAP(0x5C, 0x55, 0x69A0) /* <CJK */
-MAP(0x5C, 0x56, 0x699C) /* <CJK */
-MAP(0x5C, 0x57, 0x6995) /* <CJK */
-MAP(0x5C, 0x58, 0x69B4) /* <CJK */
-MAP(0x5C, 0x59, 0x69DE) /* <CJK */
-MAP(0x5C, 0x5A, 0x69E8) /* <CJK */
-MAP(0x5C, 0x5B, 0x6A02) /* <CJK */
-MAP(0x5C, 0x5C, 0x6A1B) /* <CJK */
-MAP(0x5C, 0x5D, 0x69FF) /* <CJK */
-MAP(0x5C, 0x5E, 0x6B0A) /* <CJK */
-MAP(0x5C, 0x5F, 0x69F9) /* <CJK */
-MAP(0x5C, 0x60, 0x69F2) /* <CJK */
-MAP(0x5C, 0x61, 0x69E7) /* <CJK */
-MAP(0x5C, 0x62, 0x6A05) /* <CJK */
-MAP(0x5C, 0x63, 0x69B1) /* <CJK */
-MAP(0x5C, 0x64, 0x6A1E) /* <CJK */
-MAP(0x5C, 0x65, 0x69ED) /* <CJK */
-MAP(0x5C, 0x66, 0x6A14) /* <CJK */
-MAP(0x5C, 0x67, 0x69EB) /* <CJK */
-MAP(0x5C, 0x68, 0x6A0A) /* <CJK */
-MAP(0x5C, 0x69, 0x6A12) /* <CJK */
-MAP(0x5C, 0x6A, 0x6AC1) /* <CJK */
-MAP(0x5C, 0x6B, 0x6A23) /* <CJK */
-MAP(0x5C, 0x6C, 0x6A13) /* <CJK */
-MAP(0x5C, 0x6D, 0x6A44) /* <CJK */
-MAP(0x5C, 0x6E, 0x6A0C) /* <CJK */
-MAP(0x5C, 0x6F, 0x6A72) /* <CJK */
-MAP(0x5C, 0x70, 0x6A36) /* <CJK */
-MAP(0x5C, 0x71, 0x6A78) /* <CJK */
-MAP(0x5C, 0x72, 0x6A47) /* <CJK */
-MAP(0x5C, 0x73, 0x6A62) /* <CJK */
-MAP(0x5C, 0x74, 0x6A59) /* <CJK */
-MAP(0x5C, 0x75, 0x6A66) /* <CJK */
-MAP(0x5C, 0x76, 0x6A48) /* <CJK */
-MAP(0x5C, 0x77, 0x6A38) /* <CJK */
-MAP(0x5C, 0x78, 0x6A22) /* <CJK */
-MAP(0x5C, 0x79, 0x6A90) /* <CJK */
-MAP(0x5C, 0x7A, 0x6A8D) /* <CJK */
-MAP(0x5C, 0x7B, 0x6AA0) /* <CJK */
-MAP(0x5C, 0x7C, 0x6A84) /* <CJK */
-MAP(0x5C, 0x7D, 0x6AA2) /* <CJK */
-MAP(0x5C, 0x7E, 0x6AA3) /* <CJK */
-MAP(0x5D, 0x21, 0x6A97) /* <CJK */
-MAP(0x5D, 0x22, 0x8617) /* <CJK */
-MAP(0x5D, 0x23, 0x6ABB) /* <CJK */
-MAP(0x5D, 0x24, 0x6AC3) /* <CJK */
-MAP(0x5D, 0x25, 0x6AC2) /* <CJK */
-MAP(0x5D, 0x26, 0x6AB8) /* <CJK */
-MAP(0x5D, 0x27, 0x6AB3) /* <CJK */
-MAP(0x5D, 0x28, 0x6AAC) /* <CJK */
-MAP(0x5D, 0x29, 0x6ADE) /* <CJK */
-MAP(0x5D, 0x2A, 0x6AD1) /* <CJK */
-MAP(0x5D, 0x2B, 0x6ADF) /* <CJK */
-MAP(0x5D, 0x2C, 0x6AAA) /* <CJK */
-MAP(0x5D, 0x2D, 0x6ADA) /* <CJK */
-MAP(0x5D, 0x2E, 0x6AEA) /* <CJK */
-MAP(0x5D, 0x2F, 0x6AFB) /* <CJK */
-MAP(0x5D, 0x30, 0x6B05) /* <CJK */
-MAP(0x5D, 0x31, 0x8616) /* <CJK */
-MAP(0x5D, 0x32, 0x6AFA) /* <CJK */
-MAP(0x5D, 0x33, 0x6B12) /* <CJK */
-MAP(0x5D, 0x34, 0x6B16) /* <CJK */
-MAP(0x5D, 0x35, 0x9B31) /* <CJK */
-MAP(0x5D, 0x36, 0x6B1F) /* <CJK */
-MAP(0x5D, 0x37, 0x6B38) /* <CJK */
-MAP(0x5D, 0x38, 0x6B37) /* <CJK */
-MAP(0x5D, 0x39, 0x76DC) /* <CJK */
-MAP(0x5D, 0x3A, 0x6B39) /* <CJK */
-MAP(0x5D, 0x3B, 0x98EE) /* <CJK */
-MAP(0x5D, 0x3C, 0x6B47) /* <CJK */
-MAP(0x5D, 0x3D, 0x6B43) /* <CJK */
-MAP(0x5D, 0x3E, 0x6B49) /* <CJK */
-MAP(0x5D, 0x3F, 0x6B50) /* <CJK */
-MAP(0x5D, 0x40, 0x6B59) /* <CJK */
-MAP(0x5D, 0x41, 0x6B54) /* <CJK */
-MAP(0x5D, 0x42, 0x6B5B) /* <CJK */
-MAP(0x5D, 0x43, 0x6B5F) /* <CJK */
-MAP(0x5D, 0x44, 0x6B61) /* <CJK */
-MAP(0x5D, 0x45, 0x6B78) /* <CJK */
-MAP(0x5D, 0x46, 0x6B79) /* <CJK */
-MAP(0x5D, 0x47, 0x6B7F) /* <CJK */
-MAP(0x5D, 0x48, 0x6B80) /* <CJK */
-MAP(0x5D, 0x49, 0x6B84) /* <CJK */
-MAP(0x5D, 0x4A, 0x6B83) /* <CJK */
-MAP(0x5D, 0x4B, 0x6B8D) /* <CJK */
-MAP(0x5D, 0x4C, 0x6B98) /* <CJK */
-MAP(0x5D, 0x4D, 0x6B95) /* <CJK */
-MAP(0x5D, 0x4E, 0x6B9E) /* <CJK */
-MAP(0x5D, 0x4F, 0x6BA4) /* <CJK */
-MAP(0x5D, 0x50, 0x6BAA) /* <CJK */
-MAP(0x5D, 0x51, 0x6BAB) /* <CJK */
-MAP(0x5D, 0x52, 0x6BAF) /* <CJK */
-MAP(0x5D, 0x53, 0x6BB2) /* <CJK */
-MAP(0x5D, 0x54, 0x6BB1) /* <CJK */
-MAP(0x5D, 0x55, 0x6BB3) /* <CJK */
-MAP(0x5D, 0x56, 0x6BB7) /* <CJK */
-MAP(0x5D, 0x57, 0x6BBC) /* <CJK */
-MAP(0x5D, 0x58, 0x6BC6) /* <CJK */
-MAP(0x5D, 0x59, 0x6BCB) /* <CJK */
-MAP(0x5D, 0x5A, 0x6BD3) /* <CJK */
-MAP(0x5D, 0x5B, 0x6BDF) /* <CJK */
-MAP(0x5D, 0x5C, 0x6BEC) /* <CJK */
-MAP(0x5D, 0x5D, 0x6BEB) /* <CJK */
-MAP(0x5D, 0x5E, 0x6BF3) /* <CJK */
-MAP(0x5D, 0x5F, 0x6BEF) /* <CJK */
-MAP(0x5D, 0x60, 0x9EBE) /* <CJK */
-MAP(0x5D, 0x61, 0x6C08) /* <CJK */
-MAP(0x5D, 0x62, 0x6C13) /* <CJK */
-MAP(0x5D, 0x63, 0x6C14) /* <CJK */
-MAP(0x5D, 0x64, 0x6C1B) /* <CJK */
-MAP(0x5D, 0x65, 0x6C24) /* <CJK */
-MAP(0x5D, 0x66, 0x6C23) /* <CJK */
-MAP(0x5D, 0x67, 0x6C5E) /* <CJK */
-MAP(0x5D, 0x68, 0x6C55) /* <CJK */
-MAP(0x5D, 0x69, 0x6C62) /* <CJK */
-MAP(0x5D, 0x6A, 0x6C6A) /* <CJK */
-MAP(0x5D, 0x6B, 0x6C82) /* <CJK */
-MAP(0x5D, 0x6C, 0x6C8D) /* <CJK */
-MAP(0x5D, 0x6D, 0x6C9A) /* <CJK */
-MAP(0x5D, 0x6E, 0x6C81) /* <CJK */
-MAP(0x5D, 0x6F, 0x6C9B) /* <CJK */
-MAP(0x5D, 0x70, 0x6C7E) /* <CJK */
-MAP(0x5D, 0x71, 0x6C68) /* <CJK */
-MAP(0x5D, 0x72, 0x6C73) /* <CJK */
-MAP(0x5D, 0x73, 0x6C92) /* <CJK */
-MAP(0x5D, 0x74, 0x6C90) /* <CJK */
-MAP(0x5D, 0x75, 0x6CC4) /* <CJK */
-MAP(0x5D, 0x76, 0x6CF1) /* <CJK */
-MAP(0x5D, 0x77, 0x6CD3) /* <CJK */
-MAP(0x5D, 0x78, 0x6CBD) /* <CJK */
-MAP(0x5D, 0x79, 0x6CD7) /* <CJK */
-MAP(0x5D, 0x7A, 0x6CC5) /* <CJK */
-MAP(0x5D, 0x7B, 0x6CDD) /* <CJK */
-MAP(0x5D, 0x7C, 0x6CAE) /* <CJK */
-MAP(0x5D, 0x7D, 0x6CB1) /* <CJK */
-MAP(0x5D, 0x7E, 0x6CBE) /* <CJK */
-MAP(0x5E, 0x21, 0x6CBA) /* <CJK */
-MAP(0x5E, 0x22, 0x6CDB) /* <CJK */
-MAP(0x5E, 0x23, 0x6CEF) /* <CJK */
-MAP(0x5E, 0x24, 0x6CD9) /* <CJK */
-MAP(0x5E, 0x25, 0x6CEA) /* <CJK */
-MAP(0x5E, 0x26, 0x6D1F) /* <CJK */
-MAP(0x5E, 0x27, 0x884D) /* <CJK */
-MAP(0x5E, 0x28, 0x6D36) /* <CJK */
-MAP(0x5E, 0x29, 0x6D2B) /* <CJK */
-MAP(0x5E, 0x2A, 0x6D3D) /* <CJK */
-MAP(0x5E, 0x2B, 0x6D38) /* <CJK */
-MAP(0x5E, 0x2C, 0x6D19) /* <CJK */
-MAP(0x5E, 0x2D, 0x6D35) /* <CJK */
-MAP(0x5E, 0x2E, 0x6D33) /* <CJK */
-MAP(0x5E, 0x2F, 0x6D12) /* <CJK */
-MAP(0x5E, 0x30, 0x6D0C) /* <CJK */
-MAP(0x5E, 0x31, 0x6D63) /* <CJK */
-MAP(0x5E, 0x32, 0x6D93) /* <CJK */
-MAP(0x5E, 0x33, 0x6D64) /* <CJK */
-MAP(0x5E, 0x34, 0x6D5A) /* <CJK */
-MAP(0x5E, 0x35, 0x6D79) /* <CJK */
-MAP(0x5E, 0x36, 0x6D59) /* <CJK */
-MAP(0x5E, 0x37, 0x6D8E) /* <CJK */
-MAP(0x5E, 0x38, 0x6D95) /* <CJK */
-MAP(0x5E, 0x39, 0x6FE4) /* <CJK */
-MAP(0x5E, 0x3A, 0x6D85) /* <CJK */
-MAP(0x5E, 0x3B, 0x6DF9) /* <CJK */
-MAP(0x5E, 0x3C, 0x6E15) /* <CJK */
-MAP(0x5E, 0x3D, 0x6E0A) /* <CJK */
-MAP(0x5E, 0x3E, 0x6DB5) /* <CJK */
-MAP(0x5E, 0x3F, 0x6DC7) /* <CJK */
-MAP(0x5E, 0x40, 0x6DE6) /* <CJK */
-MAP(0x5E, 0x41, 0x6DB8) /* <CJK */
-MAP(0x5E, 0x42, 0x6DC6) /* <CJK */
-MAP(0x5E, 0x43, 0x6DEC) /* <CJK */
-MAP(0x5E, 0x44, 0x6DDE) /* <CJK */
-MAP(0x5E, 0x45, 0x6DCC) /* <CJK */
-MAP(0x5E, 0x46, 0x6DE8) /* <CJK */
-MAP(0x5E, 0x47, 0x6DD2) /* <CJK */
-MAP(0x5E, 0x48, 0x6DC5) /* <CJK */
-MAP(0x5E, 0x49, 0x6DFA) /* <CJK */
-MAP(0x5E, 0x4A, 0x6DD9) /* <CJK */
-MAP(0x5E, 0x4B, 0x6DE4) /* <CJK */
-MAP(0x5E, 0x4C, 0x6DD5) /* <CJK */
-MAP(0x5E, 0x4D, 0x6DEA) /* <CJK */
-MAP(0x5E, 0x4E, 0x6DEE) /* <CJK */
-MAP(0x5E, 0x4F, 0x6E2D) /* <CJK */
-MAP(0x5E, 0x50, 0x6E6E) /* <CJK */
-MAP(0x5E, 0x51, 0x6E2E) /* <CJK */
-MAP(0x5E, 0x52, 0x6E19) /* <CJK */
-MAP(0x5E, 0x53, 0x6E72) /* <CJK */
-MAP(0x5E, 0x54, 0x6E5F) /* <CJK */
-MAP(0x5E, 0x55, 0x6E3E) /* <CJK */
-MAP(0x5E, 0x56, 0x6E23) /* <CJK */
-MAP(0x5E, 0x57, 0x6E6B) /* <CJK */
-MAP(0x5E, 0x58, 0x6E2B) /* <CJK */
-MAP(0x5E, 0x59, 0x6E76) /* <CJK */
-MAP(0x5E, 0x5A, 0x6E4D) /* <CJK */
-MAP(0x5E, 0x5B, 0x6E1F) /* <CJK */
-MAP(0x5E, 0x5C, 0x6E43) /* <CJK */
-MAP(0x5E, 0x5D, 0x6E3A) /* <CJK */
-MAP(0x5E, 0x5E, 0x6E4E) /* <CJK */
-MAP(0x5E, 0x5F, 0x6E24) /* <CJK */
-MAP(0x5E, 0x60, 0x6EFF) /* <CJK */
-MAP(0x5E, 0x61, 0x6E1D) /* <CJK */
-MAP(0x5E, 0x62, 0x6E38) /* <CJK */
-MAP(0x5E, 0x63, 0x6E82) /* <CJK */
-MAP(0x5E, 0x64, 0x6EAA) /* <CJK */
-MAP(0x5E, 0x65, 0x6E98) /* <CJK */
-MAP(0x5E, 0x66, 0x6EC9) /* <CJK */
-MAP(0x5E, 0x67, 0x6EB7) /* <CJK */
-MAP(0x5E, 0x68, 0x6ED3) /* <CJK */
-MAP(0x5E, 0x69, 0x6EBD) /* <CJK */
-MAP(0x5E, 0x6A, 0x6EAF) /* <CJK */
-MAP(0x5E, 0x6B, 0x6EC4) /* <CJK */
-MAP(0x5E, 0x6C, 0x6EB2) /* <CJK */
-MAP(0x5E, 0x6D, 0x6ED4) /* <CJK */
-MAP(0x5E, 0x6E, 0x6ED5) /* <CJK */
-MAP(0x5E, 0x6F, 0x6E8F) /* <CJK */
-MAP(0x5E, 0x70, 0x6EA5) /* <CJK */
-MAP(0x5E, 0x71, 0x6EC2) /* <CJK */
-MAP(0x5E, 0x72, 0x6E9F) /* <CJK */
-MAP(0x5E, 0x73, 0x6F41) /* <CJK */
-MAP(0x5E, 0x74, 0x6F11) /* <CJK */
-MAP(0x5E, 0x75, 0x704C) /* <CJK */
-MAP(0x5E, 0x76, 0x6EEC) /* <CJK */
-MAP(0x5E, 0x77, 0x6EF8) /* <CJK */
-MAP(0x5E, 0x78, 0x6EFE) /* <CJK */
-MAP(0x5E, 0x79, 0x6F3F) /* <CJK */
-MAP(0x5E, 0x7A, 0x6EF2) /* <CJK */
-MAP(0x5E, 0x7B, 0x6F31) /* <CJK */
-MAP(0x5E, 0x7C, 0x6EEF) /* <CJK */
-MAP(0x5E, 0x7D, 0x6F32) /* <CJK */
-MAP(0x5E, 0x7E, 0x6ECC) /* <CJK */
-MAP(0x5F, 0x21, 0x6F3E) /* <CJK */
-MAP(0x5F, 0x22, 0x6F13) /* <CJK */
-MAP(0x5F, 0x23, 0x6EF7) /* <CJK */
-MAP(0x5F, 0x24, 0x6F86) /* <CJK */
-MAP(0x5F, 0x25, 0x6F7A) /* <CJK */
-MAP(0x5F, 0x26, 0x6F78) /* <CJK */
-MAP(0x5F, 0x27, 0x6F81) /* <CJK */
-MAP(0x5F, 0x28, 0x6F80) /* <CJK */
-MAP(0x5F, 0x29, 0x6F6F) /* <CJK */
-MAP(0x5F, 0x2A, 0x6F5B) /* <CJK */
-MAP(0x5F, 0x2B, 0x6FF3) /* <CJK */
-MAP(0x5F, 0x2C, 0x6F6D) /* <CJK */
-MAP(0x5F, 0x2D, 0x6F82) /* <CJK */
-MAP(0x5F, 0x2E, 0x6F7C) /* <CJK */
-MAP(0x5F, 0x2F, 0x6F58) /* <CJK */
-MAP(0x5F, 0x30, 0x6F8E) /* <CJK */
-MAP(0x5F, 0x31, 0x6F91) /* <CJK */
-MAP(0x5F, 0x32, 0x6FC2) /* <CJK */
-MAP(0x5F, 0x33, 0x6F66) /* <CJK */
-MAP(0x5F, 0x34, 0x6FB3) /* <CJK */
-MAP(0x5F, 0x35, 0x6FA3) /* <CJK */
-MAP(0x5F, 0x36, 0x6FA1) /* <CJK */
-MAP(0x5F, 0x37, 0x6FA4) /* <CJK */
-MAP(0x5F, 0x38, 0x6FB9) /* <CJK */
-MAP(0x5F, 0x39, 0x6FC6) /* <CJK */
-MAP(0x5F, 0x3A, 0x6FAA) /* <CJK */
-MAP(0x5F, 0x3B, 0x6FDF) /* <CJK */
-MAP(0x5F, 0x3C, 0x6FD5) /* <CJK */
-MAP(0x5F, 0x3D, 0x6FEC) /* <CJK */
-MAP(0x5F, 0x3E, 0x6FD4) /* <CJK */
-MAP(0x5F, 0x3F, 0x6FD8) /* <CJK */
-MAP(0x5F, 0x40, 0x6FF1) /* <CJK */
-MAP(0x5F, 0x41, 0x6FEE) /* <CJK */
-MAP(0x5F, 0x42, 0x6FDB) /* <CJK */
-MAP(0x5F, 0x43, 0x7009) /* <CJK */
-MAP(0x5F, 0x44, 0x700B) /* <CJK */
-MAP(0x5F, 0x45, 0x6FFA) /* <CJK */
-MAP(0x5F, 0x46, 0x7011) /* <CJK */
-MAP(0x5F, 0x47, 0x7001) /* <CJK */
-MAP(0x5F, 0x48, 0x700F) /* <CJK */
-MAP(0x5F, 0x49, 0x6FFE) /* <CJK */
-MAP(0x5F, 0x4A, 0x701B) /* <CJK */
-MAP(0x5F, 0x4B, 0x701A) /* <CJK */
-MAP(0x5F, 0x4C, 0x6F74) /* <CJK */
-MAP(0x5F, 0x4D, 0x701D) /* <CJK */
-MAP(0x5F, 0x4E, 0x7018) /* <CJK */
-MAP(0x5F, 0x4F, 0x701F) /* <CJK */
-MAP(0x5F, 0x50, 0x7030) /* <CJK */
-MAP(0x5F, 0x51, 0x703E) /* <CJK */
-MAP(0x5F, 0x52, 0x7032) /* <CJK */
-MAP(0x5F, 0x53, 0x7051) /* <CJK */
-MAP(0x5F, 0x54, 0x7063) /* <CJK */
-MAP(0x5F, 0x55, 0x7099) /* <CJK */
-MAP(0x5F, 0x56, 0x7092) /* <CJK */
-MAP(0x5F, 0x57, 0x70AF) /* <CJK */
-MAP(0x5F, 0x58, 0x70F1) /* <CJK */
-MAP(0x5F, 0x59, 0x70AC) /* <CJK */
-MAP(0x5F, 0x5A, 0x70B8) /* <CJK */
-MAP(0x5F, 0x5B, 0x70B3) /* <CJK */
-MAP(0x5F, 0x5C, 0x70AE) /* <CJK */
-MAP(0x5F, 0x5D, 0x70DF) /* <CJK */
-MAP(0x5F, 0x5E, 0x70CB) /* <CJK */
-MAP(0x5F, 0x5F, 0x70DD) /* <CJK */
-MAP(0x5F, 0x60, 0x70D9) /* <CJK */
-MAP(0x5F, 0x61, 0x7109) /* <CJK */
-MAP(0x5F, 0x62, 0x70FD) /* <CJK */
-MAP(0x5F, 0x63, 0x711C) /* <CJK */
-MAP(0x5F, 0x64, 0x7119) /* <CJK */
-MAP(0x5F, 0x65, 0x7165) /* <CJK */
-MAP(0x5F, 0x66, 0x7155) /* <CJK */
-MAP(0x5F, 0x67, 0x7188) /* <CJK */
-MAP(0x5F, 0x68, 0x7166) /* <CJK */
-MAP(0x5F, 0x69, 0x7162) /* <CJK */
-MAP(0x5F, 0x6A, 0x714C) /* <CJK */
-MAP(0x5F, 0x6B, 0x7156) /* <CJK */
-MAP(0x5F, 0x6C, 0x716C) /* <CJK */
-MAP(0x5F, 0x6D, 0x718F) /* <CJK */
-MAP(0x5F, 0x6E, 0x71FB) /* <CJK */
-MAP(0x5F, 0x6F, 0x7184) /* <CJK */
-MAP(0x5F, 0x70, 0x7195) /* <CJK */
-MAP(0x5F, 0x71, 0x71A8) /* <CJK */
-MAP(0x5F, 0x72, 0x71AC) /* <CJK */
-MAP(0x5F, 0x73, 0x71D7) /* <CJK */
-MAP(0x5F, 0x74, 0x71B9) /* <CJK */
-MAP(0x5F, 0x75, 0x71BE) /* <CJK */
-MAP(0x5F, 0x76, 0x71D2) /* <CJK */
-MAP(0x5F, 0x77, 0x71C9) /* <CJK */
-MAP(0x5F, 0x78, 0x71D4) /* <CJK */
-MAP(0x5F, 0x79, 0x71CE) /* <CJK */
-MAP(0x5F, 0x7A, 0x71E0) /* <CJK */
-MAP(0x5F, 0x7B, 0x71EC) /* <CJK */
-MAP(0x5F, 0x7C, 0x71E7) /* <CJK */
-MAP(0x5F, 0x7D, 0x71F5) /* <CJK */
-MAP(0x5F, 0x7E, 0x71FC) /* <CJK */
-MAP(0x60, 0x21, 0x71F9) /* <CJK */
-MAP(0x60, 0x22, 0x71FF) /* <CJK */
-MAP(0x60, 0x23, 0x720D) /* <CJK */
-MAP(0x60, 0x24, 0x7210) /* <CJK */
-MAP(0x60, 0x25, 0x721B) /* <CJK */
-MAP(0x60, 0x26, 0x7228) /* <CJK */
-MAP(0x60, 0x27, 0x722D) /* <CJK */
-MAP(0x60, 0x28, 0x722C) /* <CJK */
-MAP(0x60, 0x29, 0x7230) /* <CJK */
-MAP(0x60, 0x2A, 0x7232) /* <CJK */
-MAP(0x60, 0x2B, 0x723B) /* <CJK */
-MAP(0x60, 0x2C, 0x723C) /* <CJK */
-MAP(0x60, 0x2D, 0x723F) /* <CJK */
-MAP(0x60, 0x2E, 0x7240) /* <CJK */
-MAP(0x60, 0x2F, 0x7246) /* <CJK */
-MAP(0x60, 0x30, 0x724B) /* <CJK */
-MAP(0x60, 0x31, 0x7258) /* <CJK */
-MAP(0x60, 0x32, 0x7274) /* <CJK */
-MAP(0x60, 0x33, 0x727E) /* <CJK */
-MAP(0x60, 0x34, 0x7282) /* <CJK */
-MAP(0x60, 0x35, 0x7281) /* <CJK */
-MAP(0x60, 0x36, 0x7287) /* <CJK */
-MAP(0x60, 0x37, 0x7292) /* <CJK */
-MAP(0x60, 0x38, 0x7296) /* <CJK */
-MAP(0x60, 0x39, 0x72A2) /* <CJK */
-MAP(0x60, 0x3A, 0x72A7) /* <CJK */
-MAP(0x60, 0x3B, 0x72B9) /* <CJK */
-MAP(0x60, 0x3C, 0x72B2) /* <CJK */
-MAP(0x60, 0x3D, 0x72C3) /* <CJK */
-MAP(0x60, 0x3E, 0x72C6) /* <CJK */
-MAP(0x60, 0x3F, 0x72C4) /* <CJK */
-MAP(0x60, 0x40, 0x72CE) /* <CJK */
-MAP(0x60, 0x41, 0x72D2) /* <CJK */
-MAP(0x60, 0x42, 0x72E2) /* <CJK */
-MAP(0x60, 0x43, 0x72E0) /* <CJK */
-MAP(0x60, 0x44, 0x72E1) /* <CJK */
-MAP(0x60, 0x45, 0x72F9) /* <CJK */
-MAP(0x60, 0x46, 0x72F7) /* <CJK */
-MAP(0x60, 0x47, 0x500F) /* <CJK */
-MAP(0x60, 0x48, 0x7317) /* <CJK */
-MAP(0x60, 0x49, 0x730A) /* <CJK */
-MAP(0x60, 0x4A, 0x731C) /* <CJK */
-MAP(0x60, 0x4B, 0x7316) /* <CJK */
-MAP(0x60, 0x4C, 0x731D) /* <CJK */
-MAP(0x60, 0x4D, 0x7334) /* <CJK */
-MAP(0x60, 0x4E, 0x732F) /* <CJK */
-MAP(0x60, 0x4F, 0x7329) /* <CJK */
-MAP(0x60, 0x50, 0x7325) /* <CJK */
-MAP(0x60, 0x51, 0x733E) /* <CJK */
-MAP(0x60, 0x52, 0x734E) /* <CJK */
-MAP(0x60, 0x53, 0x734F) /* <CJK */
-MAP(0x60, 0x54, 0x9ED8) /* <CJK */
-MAP(0x60, 0x55, 0x7357) /* <CJK */
-MAP(0x60, 0x56, 0x736A) /* <CJK */
-MAP(0x60, 0x57, 0x7368) /* <CJK */
-MAP(0x60, 0x58, 0x7370) /* <CJK */
-MAP(0x60, 0x59, 0x7378) /* <CJK */
-MAP(0x60, 0x5A, 0x7375) /* <CJK */
-MAP(0x60, 0x5B, 0x737B) /* <CJK */
-MAP(0x60, 0x5C, 0x737A) /* <CJK */
-MAP(0x60, 0x5D, 0x73C8) /* <CJK */
-MAP(0x60, 0x5E, 0x73B3) /* <CJK */
-MAP(0x60, 0x5F, 0x73CE) /* <CJK */
-MAP(0x60, 0x60, 0x73BB) /* <CJK */
-MAP(0x60, 0x61, 0x73C0) /* <CJK */
-MAP(0x60, 0x62, 0x73E5) /* <CJK */
-MAP(0x60, 0x63, 0x73EE) /* <CJK */
-MAP(0x60, 0x64, 0x73DE) /* <CJK */
-MAP(0x60, 0x65, 0x74A2) /* <CJK */
-MAP(0x60, 0x66, 0x7405) /* <CJK */
-MAP(0x60, 0x67, 0x746F) /* <CJK */
-MAP(0x60, 0x68, 0x7425) /* <CJK */
-MAP(0x60, 0x69, 0x73F8) /* <CJK */
-MAP(0x60, 0x6A, 0x7432) /* <CJK */
-MAP(0x60, 0x6B, 0x743A) /* <CJK */
-MAP(0x60, 0x6C, 0x7455) /* <CJK */
-MAP(0x60, 0x6D, 0x743F) /* <CJK */
-MAP(0x60, 0x6E, 0x745F) /* <CJK */
-MAP(0x60, 0x6F, 0x7459) /* <CJK */
-MAP(0x60, 0x70, 0x7441) /* <CJK */
-MAP(0x60, 0x71, 0x745C) /* <CJK */
-MAP(0x60, 0x72, 0x7469) /* <CJK */
-MAP(0x60, 0x73, 0x7470) /* <CJK */
-MAP(0x60, 0x74, 0x7463) /* <CJK */
-MAP(0x60, 0x75, 0x746A) /* <CJK */
-MAP(0x60, 0x76, 0x7476) /* <CJK */
-MAP(0x60, 0x77, 0x747E) /* <CJK */
-MAP(0x60, 0x78, 0x748B) /* <CJK */
-MAP(0x60, 0x79, 0x749E) /* <CJK */
-MAP(0x60, 0x7A, 0x74A7) /* <CJK */
-MAP(0x60, 0x7B, 0x74CA) /* <CJK */
-MAP(0x60, 0x7C, 0x74CF) /* <CJK */
-MAP(0x60, 0x7D, 0x74D4) /* <CJK */
-MAP(0x60, 0x7E, 0x73F1) /* <CJK */
-MAP(0x61, 0x21, 0x74E0) /* <CJK */
-MAP(0x61, 0x22, 0x74E3) /* <CJK */
-MAP(0x61, 0x23, 0x74E7) /* <CJK */
-MAP(0x61, 0x24, 0x74E9) /* <CJK */
-MAP(0x61, 0x25, 0x74EE) /* <CJK */
-MAP(0x61, 0x26, 0x74F2) /* <CJK */
-MAP(0x61, 0x27, 0x74F0) /* <CJK */
-MAP(0x61, 0x28, 0x74F1) /* <CJK */
-MAP(0x61, 0x29, 0x74F8) /* <CJK */
-MAP(0x61, 0x2A, 0x74F7) /* <CJK */
-MAP(0x61, 0x2B, 0x7504) /* <CJK */
-MAP(0x61, 0x2C, 0x7503) /* <CJK */
-MAP(0x61, 0x2D, 0x7505) /* <CJK */
-MAP(0x61, 0x2E, 0x750C) /* <CJK */
-MAP(0x61, 0x2F, 0x750E) /* <CJK */
-MAP(0x61, 0x30, 0x750D) /* <CJK */
-MAP(0x61, 0x31, 0x7515) /* <CJK */
-MAP(0x61, 0x32, 0x7513) /* <CJK */
-MAP(0x61, 0x33, 0x751E) /* <CJK */
-MAP(0x61, 0x34, 0x7526) /* <CJK */
-MAP(0x61, 0x35, 0x752C) /* <CJK */
-MAP(0x61, 0x36, 0x753C) /* <CJK */
-MAP(0x61, 0x37, 0x7544) /* <CJK */
-MAP(0x61, 0x38, 0x754D) /* <CJK */
-MAP(0x61, 0x39, 0x754A) /* <CJK */
-MAP(0x61, 0x3A, 0x7549) /* <CJK */
-MAP(0x61, 0x3B, 0x755B) /* <CJK */
-MAP(0x61, 0x3C, 0x7546) /* <CJK */
-MAP(0x61, 0x3D, 0x755A) /* <CJK */
-MAP(0x61, 0x3E, 0x7569) /* <CJK */
-MAP(0x61, 0x3F, 0x7564) /* <CJK */
-MAP(0x61, 0x40, 0x7567) /* <CJK */
-MAP(0x61, 0x41, 0x756B) /* <CJK */
-MAP(0x61, 0x42, 0x756D) /* <CJK */
-MAP(0x61, 0x43, 0x7578) /* <CJK */
-MAP(0x61, 0x44, 0x7576) /* <CJK */
-MAP(0x61, 0x45, 0x7586) /* <CJK */
-MAP(0x61, 0x46, 0x7587) /* <CJK */
-MAP(0x61, 0x47, 0x7574) /* <CJK */
-MAP(0x61, 0x48, 0x758A) /* <CJK */
-MAP(0x61, 0x49, 0x7589) /* <CJK */
-MAP(0x61, 0x4A, 0x7582) /* <CJK */
-MAP(0x61, 0x4B, 0x7594) /* <CJK */
-MAP(0x61, 0x4C, 0x759A) /* <CJK */
-MAP(0x61, 0x4D, 0x759D) /* <CJK */
-MAP(0x61, 0x4E, 0x75A5) /* <CJK */
-MAP(0x61, 0x4F, 0x75A3) /* <CJK */
-MAP(0x61, 0x50, 0x75C2) /* <CJK */
-MAP(0x61, 0x51, 0x75B3) /* <CJK */
-MAP(0x61, 0x52, 0x75C3) /* <CJK */
-MAP(0x61, 0x53, 0x75B5) /* <CJK */
-MAP(0x61, 0x54, 0x75BD) /* <CJK */
-MAP(0x61, 0x55, 0x75B8) /* <CJK */
-MAP(0x61, 0x56, 0x75BC) /* <CJK */
-MAP(0x61, 0x57, 0x75B1) /* <CJK */
-MAP(0x61, 0x58, 0x75CD) /* <CJK */
-MAP(0x61, 0x59, 0x75CA) /* <CJK */
-MAP(0x61, 0x5A, 0x75D2) /* <CJK */
-MAP(0x61, 0x5B, 0x75D9) /* <CJK */
-MAP(0x61, 0x5C, 0x75E3) /* <CJK */
-MAP(0x61, 0x5D, 0x75DE) /* <CJK */
-MAP(0x61, 0x5E, 0x75FE) /* <CJK */
-MAP(0x61, 0x5F, 0x75FF) /* <CJK */
-MAP(0x61, 0x60, 0x75FC) /* <CJK */
-MAP(0x61, 0x61, 0x7601) /* <CJK */
-MAP(0x61, 0x62, 0x75F0) /* <CJK */
-MAP(0x61, 0x63, 0x75FA) /* <CJK */
-MAP(0x61, 0x64, 0x75F2) /* <CJK */
-MAP(0x61, 0x65, 0x75F3) /* <CJK */
-MAP(0x61, 0x66, 0x760B) /* <CJK */
-MAP(0x61, 0x67, 0x760D) /* <CJK */
-MAP(0x61, 0x68, 0x7609) /* <CJK */
-MAP(0x61, 0x69, 0x761F) /* <CJK */
-MAP(0x61, 0x6A, 0x7627) /* <CJK */
-MAP(0x61, 0x6B, 0x7620) /* <CJK */
-MAP(0x61, 0x6C, 0x7621) /* <CJK */
-MAP(0x61, 0x6D, 0x7622) /* <CJK */
-MAP(0x61, 0x6E, 0x7624) /* <CJK */
-MAP(0x61, 0x6F, 0x7634) /* <CJK */
-MAP(0x61, 0x70, 0x7630) /* <CJK */
-MAP(0x61, 0x71, 0x763B) /* <CJK */
-MAP(0x61, 0x72, 0x7647) /* <CJK */
-MAP(0x61, 0x73, 0x7648) /* <CJK */
-MAP(0x61, 0x74, 0x7646) /* <CJK */
-MAP(0x61, 0x75, 0x765C) /* <CJK */
-MAP(0x61, 0x76, 0x7658) /* <CJK */
-MAP(0x61, 0x77, 0x7661) /* <CJK */
-MAP(0x61, 0x78, 0x7662) /* <CJK */
-MAP(0x61, 0x79, 0x7668) /* <CJK */
-MAP(0x61, 0x7A, 0x7669) /* <CJK */
-MAP(0x61, 0x7B, 0x766A) /* <CJK */
-MAP(0x61, 0x7C, 0x7667) /* <CJK */
-MAP(0x61, 0x7D, 0x766C) /* <CJK */
-MAP(0x61, 0x7E, 0x7670) /* <CJK */
-MAP(0x62, 0x21, 0x7672) /* <CJK */
-MAP(0x62, 0x22, 0x7676) /* <CJK */
-MAP(0x62, 0x23, 0x7678) /* <CJK */
-MAP(0x62, 0x24, 0x767C) /* <CJK */
-MAP(0x62, 0x25, 0x7680) /* <CJK */
-MAP(0x62, 0x26, 0x7683) /* <CJK */
-MAP(0x62, 0x27, 0x7688) /* <CJK */
-MAP(0x62, 0x28, 0x768B) /* <CJK */
-MAP(0x62, 0x29, 0x768E) /* <CJK */
-MAP(0x62, 0x2A, 0x7696) /* <CJK */
-MAP(0x62, 0x2B, 0x7693) /* <CJK */
-MAP(0x62, 0x2C, 0x7699) /* <CJK */
-MAP(0x62, 0x2D, 0x769A) /* <CJK */
-MAP(0x62, 0x2E, 0x76B0) /* <CJK */
-MAP(0x62, 0x2F, 0x76B4) /* <CJK */
-MAP(0x62, 0x30, 0x76B8) /* <CJK */
-MAP(0x62, 0x31, 0x76B9) /* <CJK */
-MAP(0x62, 0x32, 0x76BA) /* <CJK */
-MAP(0x62, 0x33, 0x76C2) /* <CJK */
-MAP(0x62, 0x34, 0x76CD) /* <CJK */
-MAP(0x62, 0x35, 0x76D6) /* <CJK */
-MAP(0x62, 0x36, 0x76D2) /* <CJK */
-MAP(0x62, 0x37, 0x76DE) /* <CJK */
-MAP(0x62, 0x38, 0x76E1) /* <CJK */
-MAP(0x62, 0x39, 0x76E5) /* <CJK */
-MAP(0x62, 0x3A, 0x76E7) /* <CJK */
-MAP(0x62, 0x3B, 0x76EA) /* <CJK */
-MAP(0x62, 0x3C, 0x862F) /* <CJK */
-MAP(0x62, 0x3D, 0x76FB) /* <CJK */
-MAP(0x62, 0x3E, 0x7708) /* <CJK */
-MAP(0x62, 0x3F, 0x7707) /* <CJK */
-MAP(0x62, 0x40, 0x7704) /* <CJK */
-MAP(0x62, 0x41, 0x7729) /* <CJK */
-MAP(0x62, 0x42, 0x7724) /* <CJK */
-MAP(0x62, 0x43, 0x771E) /* <CJK */
-MAP(0x62, 0x44, 0x7725) /* <CJK */
-MAP(0x62, 0x45, 0x7726) /* <CJK */
-MAP(0x62, 0x46, 0x771B) /* <CJK */
-MAP(0x62, 0x47, 0x7737) /* <CJK */
-MAP(0x62, 0x48, 0x7738) /* <CJK */
-MAP(0x62, 0x49, 0x7747) /* <CJK */
-MAP(0x62, 0x4A, 0x775A) /* <CJK */
-MAP(0x62, 0x4B, 0x7768) /* <CJK */
-MAP(0x62, 0x4C, 0x776B) /* <CJK */
-MAP(0x62, 0x4D, 0x775B) /* <CJK */
-MAP(0x62, 0x4E, 0x7765) /* <CJK */
-MAP(0x62, 0x4F, 0x777F) /* <CJK */
-MAP(0x62, 0x50, 0x777E) /* <CJK */
-MAP(0x62, 0x51, 0x7779) /* <CJK */
-MAP(0x62, 0x52, 0x778E) /* <CJK */
-MAP(0x62, 0x53, 0x778B) /* <CJK */
-MAP(0x62, 0x54, 0x7791) /* <CJK */
-MAP(0x62, 0x55, 0x77A0) /* <CJK */
-MAP(0x62, 0x56, 0x779E) /* <CJK */
-MAP(0x62, 0x57, 0x77B0) /* <CJK */
-MAP(0x62, 0x58, 0x77B6) /* <CJK */
-MAP(0x62, 0x59, 0x77B9) /* <CJK */
-MAP(0x62, 0x5A, 0x77BF) /* <CJK */
-MAP(0x62, 0x5B, 0x77BC) /* <CJK */
-MAP(0x62, 0x5C, 0x77BD) /* <CJK */
-MAP(0x62, 0x5D, 0x77BB) /* <CJK */
-MAP(0x62, 0x5E, 0x77C7) /* <CJK */
-MAP(0x62, 0x5F, 0x77CD) /* <CJK */
-MAP(0x62, 0x60, 0x77D7) /* <CJK */
-MAP(0x62, 0x61, 0x77DA) /* <CJK */
-MAP(0x62, 0x62, 0x77DC) /* <CJK */
-MAP(0x62, 0x63, 0x77E3) /* <CJK */
-MAP(0x62, 0x64, 0x77EE) /* <CJK */
-MAP(0x62, 0x65, 0x77FC) /* <CJK */
-MAP(0x62, 0x66, 0x780C) /* <CJK */
-MAP(0x62, 0x67, 0x7812) /* <CJK */
-MAP(0x62, 0x68, 0x7926) /* <CJK */
-MAP(0x62, 0x69, 0x7820) /* <CJK */
-MAP(0x62, 0x6A, 0x792A) /* <CJK */
-MAP(0x62, 0x6B, 0x7845) /* <CJK */
-MAP(0x62, 0x6C, 0x788E) /* <CJK */
-MAP(0x62, 0x6D, 0x7874) /* <CJK */
-MAP(0x62, 0x6E, 0x7886) /* <CJK */
-MAP(0x62, 0x6F, 0x787C) /* <CJK */
-MAP(0x62, 0x70, 0x789A) /* <CJK */
-MAP(0x62, 0x71, 0x788C) /* <CJK */
-MAP(0x62, 0x72, 0x78A3) /* <CJK */
-MAP(0x62, 0x73, 0x78B5) /* <CJK */
-MAP(0x62, 0x74, 0x78AA) /* <CJK */
-MAP(0x62, 0x75, 0x78AF) /* <CJK */
-MAP(0x62, 0x76, 0x78D1) /* <CJK */
-MAP(0x62, 0x77, 0x78C6) /* <CJK */
-MAP(0x62, 0x78, 0x78CB) /* <CJK */
-MAP(0x62, 0x79, 0x78D4) /* <CJK */
-MAP(0x62, 0x7A, 0x78BE) /* <CJK */
-MAP(0x62, 0x7B, 0x78BC) /* <CJK */
-MAP(0x62, 0x7C, 0x78C5) /* <CJK */
-MAP(0x62, 0x7D, 0x78CA) /* <CJK */
-MAP(0x62, 0x7E, 0x78EC) /* <CJK */
-MAP(0x63, 0x21, 0x78E7) /* <CJK */
-MAP(0x63, 0x22, 0x78DA) /* <CJK */
-MAP(0x63, 0x23, 0x78FD) /* <CJK */
-MAP(0x63, 0x24, 0x78F4) /* <CJK */
-MAP(0x63, 0x25, 0x7907) /* <CJK */
-MAP(0x63, 0x26, 0x7912) /* <CJK */
-MAP(0x63, 0x27, 0x7911) /* <CJK */
-MAP(0x63, 0x28, 0x7919) /* <CJK */
-MAP(0x63, 0x29, 0x792C) /* <CJK */
-MAP(0x63, 0x2A, 0x792B) /* <CJK */
-MAP(0x63, 0x2B, 0x7940) /* <CJK */
-MAP(0x63, 0x2C, 0x7960) /* <CJK */
-MAP(0x63, 0x2D, 0x7957) /* <CJK */
-MAP(0x63, 0x2E, 0x795F) /* <CJK */
-MAP(0x63, 0x2F, 0x795A) /* <CJK */
-MAP(0x63, 0x30, 0x7955) /* <CJK */
-MAP(0x63, 0x31, 0x7953) /* <CJK */
-MAP(0x63, 0x32, 0x797A) /* <CJK */
-MAP(0x63, 0x33, 0x797F) /* <CJK */
-MAP(0x63, 0x34, 0x798A) /* <CJK */
-MAP(0x63, 0x35, 0x799D) /* <CJK */
-MAP(0x63, 0x36, 0x79A7) /* <CJK */
-MAP(0x63, 0x37, 0x9F4B) /* <CJK */
-MAP(0x63, 0x38, 0x79AA) /* <CJK */
-MAP(0x63, 0x39, 0x79AE) /* <CJK */
-MAP(0x63, 0x3A, 0x79B3) /* <CJK */
-MAP(0x63, 0x3B, 0x79B9) /* <CJK */
-MAP(0x63, 0x3C, 0x79BA) /* <CJK */
-MAP(0x63, 0x3D, 0x79C9) /* <CJK */
-MAP(0x63, 0x3E, 0x79D5) /* <CJK */
-MAP(0x63, 0x3F, 0x79E7) /* <CJK */
-MAP(0x63, 0x40, 0x79EC) /* <CJK */
-MAP(0x63, 0x41, 0x79E1) /* <CJK */
-MAP(0x63, 0x42, 0x79E3) /* <CJK */
-MAP(0x63, 0x43, 0x7A08) /* <CJK */
-MAP(0x63, 0x44, 0x7A0D) /* <CJK */
-MAP(0x63, 0x45, 0x7A18) /* <CJK */
-MAP(0x63, 0x46, 0x7A19) /* <CJK */
-MAP(0x63, 0x47, 0x7A20) /* <CJK */
-MAP(0x63, 0x48, 0x7A1F) /* <CJK */
-MAP(0x63, 0x49, 0x7980) /* <CJK */
-MAP(0x63, 0x4A, 0x7A31) /* <CJK */
-MAP(0x63, 0x4B, 0x7A3B) /* <CJK */
-MAP(0x63, 0x4C, 0x7A3E) /* <CJK */
-MAP(0x63, 0x4D, 0x7A37) /* <CJK */
-MAP(0x63, 0x4E, 0x7A43) /* <CJK */
-MAP(0x63, 0x4F, 0x7A57) /* <CJK */
-MAP(0x63, 0x50, 0x7A49) /* <CJK */
-MAP(0x63, 0x51, 0x7A61) /* <CJK */
-MAP(0x63, 0x52, 0x7A62) /* <CJK */
-MAP(0x63, 0x53, 0x7A69) /* <CJK */
-MAP(0x63, 0x54, 0x9F9D) /* <CJK */
-MAP(0x63, 0x55, 0x7A70) /* <CJK */
-MAP(0x63, 0x56, 0x7A79) /* <CJK */
-MAP(0x63, 0x57, 0x7A7D) /* <CJK */
-MAP(0x63, 0x58, 0x7A88) /* <CJK */
-MAP(0x63, 0x59, 0x7A97) /* <CJK */
-MAP(0x63, 0x5A, 0x7A95) /* <CJK */
-MAP(0x63, 0x5B, 0x7A98) /* <CJK */
-MAP(0x63, 0x5C, 0x7A96) /* <CJK */
-MAP(0x63, 0x5D, 0x7AA9) /* <CJK */
-MAP(0x63, 0x5E, 0x7AC8) /* <CJK */
-MAP(0x63, 0x5F, 0x7AB0) /* <CJK */
-MAP(0x63, 0x60, 0x7AB6) /* <CJK */
-MAP(0x63, 0x61, 0x7AC5) /* <CJK */
-MAP(0x63, 0x62, 0x7AC4) /* <CJK */
-MAP(0x63, 0x63, 0x7ABF) /* <CJK */
-MAP(0x63, 0x64, 0x9083) /* <CJK */
-MAP(0x63, 0x65, 0x7AC7) /* <CJK */
-MAP(0x63, 0x66, 0x7ACA) /* <CJK */
-MAP(0x63, 0x67, 0x7ACD) /* <CJK */
-MAP(0x63, 0x68, 0x7ACF) /* <CJK */
-MAP(0x63, 0x69, 0x7AD5) /* <CJK */
-MAP(0x63, 0x6A, 0x7AD3) /* <CJK */
-MAP(0x63, 0x6B, 0x7AD9) /* <CJK */
-MAP(0x63, 0x6C, 0x7ADA) /* <CJK */
-MAP(0x63, 0x6D, 0x7ADD) /* <CJK */
-MAP(0x63, 0x6E, 0x7AE1) /* <CJK */
-MAP(0x63, 0x6F, 0x7AE2) /* <CJK */
-MAP(0x63, 0x70, 0x7AE6) /* <CJK */
-MAP(0x63, 0x71, 0x7AED) /* <CJK */
-MAP(0x63, 0x72, 0x7AF0) /* <CJK */
-MAP(0x63, 0x73, 0x7B02) /* <CJK */
-MAP(0x63, 0x74, 0x7B0F) /* <CJK */
-MAP(0x63, 0x75, 0x7B0A) /* <CJK */
-MAP(0x63, 0x76, 0x7B06) /* <CJK */
-MAP(0x63, 0x77, 0x7B33) /* <CJK */
-MAP(0x63, 0x78, 0x7B18) /* <CJK */
-MAP(0x63, 0x79, 0x7B19) /* <CJK */
-MAP(0x63, 0x7A, 0x7B1E) /* <CJK */
-MAP(0x63, 0x7B, 0x7B35) /* <CJK */
-MAP(0x63, 0x7C, 0x7B28) /* <CJK */
-MAP(0x63, 0x7D, 0x7B36) /* <CJK */
-MAP(0x63, 0x7E, 0x7B50) /* <CJK */
-MAP(0x64, 0x21, 0x7B7A) /* <CJK */
-MAP(0x64, 0x22, 0x7B04) /* <CJK */
-MAP(0x64, 0x23, 0x7B4D) /* <CJK */
-MAP(0x64, 0x24, 0x7B0B) /* <CJK */
-MAP(0x64, 0x25, 0x7B4C) /* <CJK */
-MAP(0x64, 0x26, 0x7B45) /* <CJK */
-MAP(0x64, 0x27, 0x7B75) /* <CJK */
-MAP(0x64, 0x28, 0x7B65) /* <CJK */
-MAP(0x64, 0x29, 0x7B74) /* <CJK */
-MAP(0x64, 0x2A, 0x7B67) /* <CJK */
-MAP(0x64, 0x2B, 0x7B70) /* <CJK */
-MAP(0x64, 0x2C, 0x7B71) /* <CJK */
-MAP(0x64, 0x2D, 0x7B6C) /* <CJK */
-MAP(0x64, 0x2E, 0x7B6E) /* <CJK */
-MAP(0x64, 0x2F, 0x7B9D) /* <CJK */
-MAP(0x64, 0x30, 0x7B98) /* <CJK */
-MAP(0x64, 0x31, 0x7B9F) /* <CJK */
-MAP(0x64, 0x32, 0x7B8D) /* <CJK */
-MAP(0x64, 0x33, 0x7B9C) /* <CJK */
-MAP(0x64, 0x34, 0x7B9A) /* <CJK */
-MAP(0x64, 0x35, 0x7B8B) /* <CJK */
-MAP(0x64, 0x36, 0x7B92) /* <CJK */
-MAP(0x64, 0x37, 0x7B8F) /* <CJK */
-MAP(0x64, 0x38, 0x7B5D) /* <CJK */
-MAP(0x64, 0x39, 0x7B99) /* <CJK */
-MAP(0x64, 0x3A, 0x7BCB) /* <CJK */
-MAP(0x64, 0x3B, 0x7BC1) /* <CJK */
-MAP(0x64, 0x3C, 0x7BCC) /* <CJK */
-MAP(0x64, 0x3D, 0x7BCF) /* <CJK */
-MAP(0x64, 0x3E, 0x7BB4) /* <CJK */
-MAP(0x64, 0x3F, 0x7BC6) /* <CJK */
-MAP(0x64, 0x40, 0x7BDD) /* <CJK */
-MAP(0x64, 0x41, 0x7BE9) /* <CJK */
-MAP(0x64, 0x42, 0x7C11) /* <CJK */
-MAP(0x64, 0x43, 0x7C14) /* <CJK */
-MAP(0x64, 0x44, 0x7BE6) /* <CJK */
-MAP(0x64, 0x45, 0x7BE5) /* <CJK */
-MAP(0x64, 0x46, 0x7C60) /* <CJK */
-MAP(0x64, 0x47, 0x7C00) /* <CJK */
-MAP(0x64, 0x48, 0x7C07) /* <CJK */
-MAP(0x64, 0x49, 0x7C13) /* <CJK */
-MAP(0x64, 0x4A, 0x7BF3) /* <CJK */
-MAP(0x64, 0x4B, 0x7BF7) /* <CJK */
-MAP(0x64, 0x4C, 0x7C17) /* <CJK */
-MAP(0x64, 0x4D, 0x7C0D) /* <CJK */
-MAP(0x64, 0x4E, 0x7BF6) /* <CJK */
-MAP(0x64, 0x4F, 0x7C23) /* <CJK */
-MAP(0x64, 0x50, 0x7C27) /* <CJK */
-MAP(0x64, 0x51, 0x7C2A) /* <CJK */
-MAP(0x64, 0x52, 0x7C1F) /* <CJK */
-MAP(0x64, 0x53, 0x7C37) /* <CJK */
-MAP(0x64, 0x54, 0x7C2B) /* <CJK */
-MAP(0x64, 0x55, 0x7C3D) /* <CJK */
-MAP(0x64, 0x56, 0x7C4C) /* <CJK */
-MAP(0x64, 0x57, 0x7C43) /* <CJK */
-MAP(0x64, 0x58, 0x7C54) /* <CJK */
-MAP(0x64, 0x59, 0x7C4F) /* <CJK */
-MAP(0x64, 0x5A, 0x7C40) /* <CJK */
-MAP(0x64, 0x5B, 0x7C50) /* <CJK */
-MAP(0x64, 0x5C, 0x7C58) /* <CJK */
-MAP(0x64, 0x5D, 0x7C5F) /* <CJK */
-MAP(0x64, 0x5E, 0x7C64) /* <CJK */
-MAP(0x64, 0x5F, 0x7C56) /* <CJK */
-MAP(0x64, 0x60, 0x7C65) /* <CJK */
-MAP(0x64, 0x61, 0x7C6C) /* <CJK */
-MAP(0x64, 0x62, 0x7C75) /* <CJK */
-MAP(0x64, 0x63, 0x7C83) /* <CJK */
-MAP(0x64, 0x64, 0x7C90) /* <CJK */
-MAP(0x64, 0x65, 0x7CA4) /* <CJK */
-MAP(0x64, 0x66, 0x7CAD) /* <CJK */
-MAP(0x64, 0x67, 0x7CA2) /* <CJK */
-MAP(0x64, 0x68, 0x7CAB) /* <CJK */
-MAP(0x64, 0x69, 0x7CA1) /* <CJK */
-MAP(0x64, 0x6A, 0x7CA8) /* <CJK */
-MAP(0x64, 0x6B, 0x7CB3) /* <CJK */
-MAP(0x64, 0x6C, 0x7CB2) /* <CJK */
-MAP(0x64, 0x6D, 0x7CB1) /* <CJK */
-MAP(0x64, 0x6E, 0x7CAE) /* <CJK */
-MAP(0x64, 0x6F, 0x7CB9) /* <CJK */
-MAP(0x64, 0x70, 0x7CBD) /* <CJK */
-MAP(0x64, 0x71, 0x7CC0) /* <CJK */
-MAP(0x64, 0x72, 0x7CC5) /* <CJK */
-MAP(0x64, 0x73, 0x7CC2) /* <CJK */
-MAP(0x64, 0x74, 0x7CD8) /* <CJK */
-MAP(0x64, 0x75, 0x7CD2) /* <CJK */
-MAP(0x64, 0x76, 0x7CDC) /* <CJK */
-MAP(0x64, 0x77, 0x7CE2) /* <CJK */
-MAP(0x64, 0x78, 0x9B3B) /* <CJK */
-MAP(0x64, 0x79, 0x7CEF) /* <CJK */
-MAP(0x64, 0x7A, 0x7CF2) /* <CJK */
-MAP(0x64, 0x7B, 0x7CF4) /* <CJK */
-MAP(0x64, 0x7C, 0x7CF6) /* <CJK */
-MAP(0x64, 0x7D, 0x7CFA) /* <CJK */
-MAP(0x64, 0x7E, 0x7D06) /* <CJK */
-MAP(0x65, 0x21, 0x7D02) /* <CJK */
-MAP(0x65, 0x22, 0x7D1C) /* <CJK */
-MAP(0x65, 0x23, 0x7D15) /* <CJK */
-MAP(0x65, 0x24, 0x7D0A) /* <CJK */
-MAP(0x65, 0x25, 0x7D45) /* <CJK */
-MAP(0x65, 0x26, 0x7D4B) /* <CJK */
-MAP(0x65, 0x27, 0x7D2E) /* <CJK */
-MAP(0x65, 0x28, 0x7D32) /* <CJK */
-MAP(0x65, 0x29, 0x7D3F) /* <CJK */
-MAP(0x65, 0x2A, 0x7D35) /* <CJK */
-MAP(0x65, 0x2B, 0x7D46) /* <CJK */
-MAP(0x65, 0x2C, 0x7D73) /* <CJK */
-MAP(0x65, 0x2D, 0x7D56) /* <CJK */
-MAP(0x65, 0x2E, 0x7D4E) /* <CJK */
-MAP(0x65, 0x2F, 0x7D72) /* <CJK */
-MAP(0x65, 0x30, 0x7D68) /* <CJK */
-MAP(0x65, 0x31, 0x7D6E) /* <CJK */
-MAP(0x65, 0x32, 0x7D4F) /* <CJK */
-MAP(0x65, 0x33, 0x7D63) /* <CJK */
-MAP(0x65, 0x34, 0x7D93) /* <CJK */
-MAP(0x65, 0x35, 0x7D89) /* <CJK */
-MAP(0x65, 0x36, 0x7D5B) /* <CJK */
-MAP(0x65, 0x37, 0x7D8F) /* <CJK */
-MAP(0x65, 0x38, 0x7D7D) /* <CJK */
-MAP(0x65, 0x39, 0x7D9B) /* <CJK */
-MAP(0x65, 0x3A, 0x7DBA) /* <CJK */
-MAP(0x65, 0x3B, 0x7DAE) /* <CJK */
-MAP(0x65, 0x3C, 0x7DA3) /* <CJK */
-MAP(0x65, 0x3D, 0x7DB5) /* <CJK */
-MAP(0x65, 0x3E, 0x7DC7) /* <CJK */
-MAP(0x65, 0x3F, 0x7DBD) /* <CJK */
-MAP(0x65, 0x40, 0x7DAB) /* <CJK */
-MAP(0x65, 0x41, 0x7E3D) /* <CJK */
-MAP(0x65, 0x42, 0x7DA2) /* <CJK */
-MAP(0x65, 0x43, 0x7DAF) /* <CJK */
-MAP(0x65, 0x44, 0x7DDC) /* <CJK */
-MAP(0x65, 0x45, 0x7DB8) /* <CJK */
-MAP(0x65, 0x46, 0x7D9F) /* <CJK */
-MAP(0x65, 0x47, 0x7DB0) /* <CJK */
-MAP(0x65, 0x48, 0x7DD8) /* <CJK */
-MAP(0x65, 0x49, 0x7DDD) /* <CJK */
-MAP(0x65, 0x4A, 0x7DE4) /* <CJK */
-MAP(0x65, 0x4B, 0x7DDE) /* <CJK */
-MAP(0x65, 0x4C, 0x7DFB) /* <CJK */
-MAP(0x65, 0x4D, 0x7DF2) /* <CJK */
-MAP(0x65, 0x4E, 0x7DE1) /* <CJK */
-MAP(0x65, 0x4F, 0x7E05) /* <CJK */
-MAP(0x65, 0x50, 0x7E0A) /* <CJK */
-MAP(0x65, 0x51, 0x7E23) /* <CJK */
-MAP(0x65, 0x52, 0x7E21) /* <CJK */
-MAP(0x65, 0x53, 0x7E12) /* <CJK */
-MAP(0x65, 0x54, 0x7E31) /* <CJK */
-MAP(0x65, 0x55, 0x7E1F) /* <CJK */
-MAP(0x65, 0x56, 0x7E09) /* <CJK */
-MAP(0x65, 0x57, 0x7E0B) /* <CJK */
-MAP(0x65, 0x58, 0x7E22) /* <CJK */
-MAP(0x65, 0x59, 0x7E46) /* <CJK */
-MAP(0x65, 0x5A, 0x7E66) /* <CJK */
-MAP(0x65, 0x5B, 0x7E3B) /* <CJK */
-MAP(0x65, 0x5C, 0x7E35) /* <CJK */
-MAP(0x65, 0x5D, 0x7E39) /* <CJK */
-MAP(0x65, 0x5E, 0x7E43) /* <CJK */
-MAP(0x65, 0x5F, 0x7E37) /* <CJK */
-MAP(0x65, 0x60, 0x7E32) /* <CJK */
-MAP(0x65, 0x61, 0x7E3A) /* <CJK */
-MAP(0x65, 0x62, 0x7E67) /* <CJK */
-MAP(0x65, 0x63, 0x7E5D) /* <CJK */
-MAP(0x65, 0x64, 0x7E56) /* <CJK */
-MAP(0x65, 0x65, 0x7E5E) /* <CJK */
-MAP(0x65, 0x66, 0x7E59) /* <CJK */
-MAP(0x65, 0x67, 0x7E5A) /* <CJK */
-MAP(0x65, 0x68, 0x7E79) /* <CJK */
-MAP(0x65, 0x69, 0x7E6A) /* <CJK */
-MAP(0x65, 0x6A, 0x7E69) /* <CJK */
-MAP(0x65, 0x6B, 0x7E7C) /* <CJK */
-MAP(0x65, 0x6C, 0x7E7B) /* <CJK */
-MAP(0x65, 0x6D, 0x7E83) /* <CJK */
-MAP(0x65, 0x6E, 0x7DD5) /* <CJK */
-MAP(0x65, 0x6F, 0x7E7D) /* <CJK */
-MAP(0x65, 0x70, 0x8FAE) /* <CJK */
-MAP(0x65, 0x71, 0x7E7F) /* <CJK */
-MAP(0x65, 0x72, 0x7E88) /* <CJK */
-MAP(0x65, 0x73, 0x7E89) /* <CJK */
-MAP(0x65, 0x74, 0x7E8C) /* <CJK */
-MAP(0x65, 0x75, 0x7E92) /* <CJK */
-MAP(0x65, 0x76, 0x7E90) /* <CJK */
-MAP(0x65, 0x77, 0x7E93) /* <CJK */
-MAP(0x65, 0x78, 0x7E94) /* <CJK */
-MAP(0x65, 0x79, 0x7E96) /* <CJK */
-MAP(0x65, 0x7A, 0x7E8E) /* <CJK */
-MAP(0x65, 0x7B, 0x7E9B) /* <CJK */
-MAP(0x65, 0x7C, 0x7E9C) /* <CJK */
-MAP(0x65, 0x7D, 0x7F38) /* <CJK */
-MAP(0x65, 0x7E, 0x7F3A) /* <CJK */
-MAP(0x66, 0x21, 0x7F45) /* <CJK */
-MAP(0x66, 0x22, 0x7F4C) /* <CJK */
-MAP(0x66, 0x23, 0x7F4D) /* <CJK */
-MAP(0x66, 0x24, 0x7F4E) /* <CJK */
-MAP(0x66, 0x25, 0x7F50) /* <CJK */
-MAP(0x66, 0x26, 0x7F51) /* <CJK */
-MAP(0x66, 0x27, 0x7F55) /* <CJK */
-MAP(0x66, 0x28, 0x7F54) /* <CJK */
-MAP(0x66, 0x29, 0x7F58) /* <CJK */
-MAP(0x66, 0x2A, 0x7F5F) /* <CJK */
-MAP(0x66, 0x2B, 0x7F60) /* <CJK */
-MAP(0x66, 0x2C, 0x7F68) /* <CJK */
-MAP(0x66, 0x2D, 0x7F69) /* <CJK */
-MAP(0x66, 0x2E, 0x7F67) /* <CJK */
-MAP(0x66, 0x2F, 0x7F78) /* <CJK */
-MAP(0x66, 0x30, 0x7F82) /* <CJK */
-MAP(0x66, 0x31, 0x7F86) /* <CJK */
-MAP(0x66, 0x32, 0x7F83) /* <CJK */
-MAP(0x66, 0x33, 0x7F88) /* <CJK */
-MAP(0x66, 0x34, 0x7F87) /* <CJK */
-MAP(0x66, 0x35, 0x7F8C) /* <CJK */
-MAP(0x66, 0x36, 0x7F94) /* <CJK */
-MAP(0x66, 0x37, 0x7F9E) /* <CJK */
-MAP(0x66, 0x38, 0x7F9D) /* <CJK */
-MAP(0x66, 0x39, 0x7F9A) /* <CJK */
-MAP(0x66, 0x3A, 0x7FA3) /* <CJK */
-MAP(0x66, 0x3B, 0x7FAF) /* <CJK */
-MAP(0x66, 0x3C, 0x7FB2) /* <CJK */
-MAP(0x66, 0x3D, 0x7FB9) /* <CJK */
-MAP(0x66, 0x3E, 0x7FAE) /* <CJK */
-MAP(0x66, 0x3F, 0x7FB6) /* <CJK */
-MAP(0x66, 0x40, 0x7FB8) /* <CJK */
-MAP(0x66, 0x41, 0x8B71) /* <CJK */
-MAP(0x66, 0x42, 0x7FC5) /* <CJK */
-MAP(0x66, 0x43, 0x7FC6) /* <CJK */
-MAP(0x66, 0x44, 0x7FCA) /* <CJK */
-MAP(0x66, 0x45, 0x7FD5) /* <CJK */
-MAP(0x66, 0x46, 0x7FD4) /* <CJK */
-MAP(0x66, 0x47, 0x7FE1) /* <CJK */
-MAP(0x66, 0x48, 0x7FE6) /* <CJK */
-MAP(0x66, 0x49, 0x7FE9) /* <CJK */
-MAP(0x66, 0x4A, 0x7FF3) /* <CJK */
-MAP(0x66, 0x4B, 0x7FF9) /* <CJK */
-MAP(0x66, 0x4C, 0x98DC) /* <CJK */
-MAP(0x66, 0x4D, 0x8006) /* <CJK */
-MAP(0x66, 0x4E, 0x8004) /* <CJK */
-MAP(0x66, 0x4F, 0x800B) /* <CJK */
-MAP(0x66, 0x50, 0x8012) /* <CJK */
-MAP(0x66, 0x51, 0x8018) /* <CJK */
-MAP(0x66, 0x52, 0x8019) /* <CJK */
-MAP(0x66, 0x53, 0x801C) /* <CJK */
-MAP(0x66, 0x54, 0x8021) /* <CJK */
-MAP(0x66, 0x55, 0x8028) /* <CJK */
-MAP(0x66, 0x56, 0x803F) /* <CJK */
-MAP(0x66, 0x57, 0x803B) /* <CJK */
-MAP(0x66, 0x58, 0x804A) /* <CJK */
-MAP(0x66, 0x59, 0x8046) /* <CJK */
-MAP(0x66, 0x5A, 0x8052) /* <CJK */
-MAP(0x66, 0x5B, 0x8058) /* <CJK */
-MAP(0x66, 0x5C, 0x805A) /* <CJK */
-MAP(0x66, 0x5D, 0x805F) /* <CJK */
-MAP(0x66, 0x5E, 0x8062) /* <CJK */
-MAP(0x66, 0x5F, 0x8068) /* <CJK */
-MAP(0x66, 0x60, 0x8073) /* <CJK */
-MAP(0x66, 0x61, 0x8072) /* <CJK */
-MAP(0x66, 0x62, 0x8070) /* <CJK */
-MAP(0x66, 0x63, 0x8076) /* <CJK */
-MAP(0x66, 0x64, 0x8079) /* <CJK */
-MAP(0x66, 0x65, 0x807D) /* <CJK */
-MAP(0x66, 0x66, 0x807F) /* <CJK */
-MAP(0x66, 0x67, 0x8084) /* <CJK */
-MAP(0x66, 0x68, 0x8086) /* <CJK */
-MAP(0x66, 0x69, 0x8085) /* <CJK */
-MAP(0x66, 0x6A, 0x809B) /* <CJK */
-MAP(0x66, 0x6B, 0x8093) /* <CJK */
-MAP(0x66, 0x6C, 0x809A) /* <CJK */
-MAP(0x66, 0x6D, 0x80AD) /* <CJK */
-MAP(0x66, 0x6E, 0x5190) /* <CJK */
-MAP(0x66, 0x6F, 0x80AC) /* <CJK */
-MAP(0x66, 0x70, 0x80DB) /* <CJK */
-MAP(0x66, 0x71, 0x80E5) /* <CJK */
-MAP(0x66, 0x72, 0x80D9) /* <CJK */
-MAP(0x66, 0x73, 0x80DD) /* <CJK */
-MAP(0x66, 0x74, 0x80C4) /* <CJK */
-MAP(0x66, 0x75, 0x80DA) /* <CJK */
-MAP(0x66, 0x76, 0x80D6) /* <CJK */
-MAP(0x66, 0x77, 0x8109) /* <CJK */
-MAP(0x66, 0x78, 0x80EF) /* <CJK */
-MAP(0x66, 0x79, 0x80F1) /* <CJK */
-MAP(0x66, 0x7A, 0x811B) /* <CJK */
-MAP(0x66, 0x7B, 0x8129) /* <CJK */
-MAP(0x66, 0x7C, 0x8123) /* <CJK */
-MAP(0x66, 0x7D, 0x812F) /* <CJK */
-MAP(0x66, 0x7E, 0x814B) /* <CJK */
-MAP(0x67, 0x21, 0x968B) /* <CJK */
-MAP(0x67, 0x22, 0x8146) /* <CJK */
-MAP(0x67, 0x23, 0x813E) /* <CJK */
-MAP(0x67, 0x24, 0x8153) /* <CJK */
-MAP(0x67, 0x25, 0x8151) /* <CJK */
-MAP(0x67, 0x26, 0x80FC) /* <CJK */
-MAP(0x67, 0x27, 0x8171) /* <CJK */
-MAP(0x67, 0x28, 0x816E) /* <CJK */
-MAP(0x67, 0x29, 0x8165) /* <CJK */
-MAP(0x67, 0x2A, 0x8166) /* <CJK */
-MAP(0x67, 0x2B, 0x8174) /* <CJK */
-MAP(0x67, 0x2C, 0x8183) /* <CJK */
-MAP(0x67, 0x2D, 0x8188) /* <CJK */
-MAP(0x67, 0x2E, 0x818A) /* <CJK */
-MAP(0x67, 0x2F, 0x8180) /* <CJK */
-MAP(0x67, 0x30, 0x8182) /* <CJK */
-MAP(0x67, 0x31, 0x81A0) /* <CJK */
-MAP(0x67, 0x32, 0x8195) /* <CJK */
-MAP(0x67, 0x33, 0x81A4) /* <CJK */
-MAP(0x67, 0x34, 0x81A3) /* <CJK */
-MAP(0x67, 0x35, 0x815F) /* <CJK */
-MAP(0x67, 0x36, 0x8193) /* <CJK */
-MAP(0x67, 0x37, 0x81A9) /* <CJK */
-MAP(0x67, 0x38, 0x81B0) /* <CJK */
-MAP(0x67, 0x39, 0x81B5) /* <CJK */
-MAP(0x67, 0x3A, 0x81BE) /* <CJK */
-MAP(0x67, 0x3B, 0x81B8) /* <CJK */
-MAP(0x67, 0x3C, 0x81BD) /* <CJK */
-MAP(0x67, 0x3D, 0x81C0) /* <CJK */
-MAP(0x67, 0x3E, 0x81C2) /* <CJK */
-MAP(0x67, 0x3F, 0x81BA) /* <CJK */
-MAP(0x67, 0x40, 0x81C9) /* <CJK */
-MAP(0x67, 0x41, 0x81CD) /* <CJK */
-MAP(0x67, 0x42, 0x81D1) /* <CJK */
-MAP(0x67, 0x43, 0x81D9) /* <CJK */
-MAP(0x67, 0x44, 0x81D8) /* <CJK */
-MAP(0x67, 0x45, 0x81C8) /* <CJK */
-MAP(0x67, 0x46, 0x81DA) /* <CJK */
-MAP(0x67, 0x47, 0x81DF) /* <CJK */
-MAP(0x67, 0x48, 0x81E0) /* <CJK */
-MAP(0x67, 0x49, 0x81E7) /* <CJK */
-MAP(0x67, 0x4A, 0x81FA) /* <CJK */
-MAP(0x67, 0x4B, 0x81FB) /* <CJK */
-MAP(0x67, 0x4C, 0x81FE) /* <CJK */
-MAP(0x67, 0x4D, 0x8201) /* <CJK */
-MAP(0x67, 0x4E, 0x8202) /* <CJK */
-MAP(0x67, 0x4F, 0x8205) /* <CJK */
-MAP(0x67, 0x50, 0x8207) /* <CJK */
-MAP(0x67, 0x51, 0x820A) /* <CJK */
-MAP(0x67, 0x52, 0x820D) /* <CJK */
-MAP(0x67, 0x53, 0x8210) /* <CJK */
-MAP(0x67, 0x54, 0x8216) /* <CJK */
-MAP(0x67, 0x55, 0x8229) /* <CJK */
-MAP(0x67, 0x56, 0x822B) /* <CJK */
-MAP(0x67, 0x57, 0x8238) /* <CJK */
-MAP(0x67, 0x58, 0x8233) /* <CJK */
-MAP(0x67, 0x59, 0x8240) /* <CJK */
-MAP(0x67, 0x5A, 0x8259) /* <CJK */
-MAP(0x67, 0x5B, 0x8258) /* <CJK */
-MAP(0x67, 0x5C, 0x825D) /* <CJK */
-MAP(0x67, 0x5D, 0x825A) /* <CJK */
-MAP(0x67, 0x5E, 0x825F) /* <CJK */
-MAP(0x67, 0x5F, 0x8264) /* <CJK */
-MAP(0x67, 0x60, 0x8262) /* <CJK */
-MAP(0x67, 0x61, 0x8268) /* <CJK */
-MAP(0x67, 0x62, 0x826A) /* <CJK */
-MAP(0x67, 0x63, 0x826B) /* <CJK */
-MAP(0x67, 0x64, 0x822E) /* <CJK */
-MAP(0x67, 0x65, 0x8271) /* <CJK */
-MAP(0x67, 0x66, 0x8277) /* <CJK */
-MAP(0x67, 0x67, 0x8278) /* <CJK */
-MAP(0x67, 0x68, 0x827E) /* <CJK */
-MAP(0x67, 0x69, 0x828D) /* <CJK */
-MAP(0x67, 0x6A, 0x8292) /* <CJK */
-MAP(0x67, 0x6B, 0x82AB) /* <CJK */
-MAP(0x67, 0x6C, 0x829F) /* <CJK */
-MAP(0x67, 0x6D, 0x82BB) /* <CJK */
-MAP(0x67, 0x6E, 0x82AC) /* <CJK */
-MAP(0x67, 0x6F, 0x82E1) /* <CJK */
-MAP(0x67, 0x70, 0x82E3) /* <CJK */
-MAP(0x67, 0x71, 0x82DF) /* <CJK */
-MAP(0x67, 0x72, 0x82D2) /* <CJK */
-MAP(0x67, 0x73, 0x82F4) /* <CJK */
-MAP(0x67, 0x74, 0x82F3) /* <CJK */
-MAP(0x67, 0x75, 0x82FA) /* <CJK */
-MAP(0x67, 0x76, 0x8393) /* <CJK */
-MAP(0x67, 0x77, 0x8303) /* <CJK */
-MAP(0x67, 0x78, 0x82FB) /* <CJK */
-MAP(0x67, 0x79, 0x82F9) /* <CJK */
-MAP(0x67, 0x7A, 0x82DE) /* <CJK */
-MAP(0x67, 0x7B, 0x8306) /* <CJK */
-MAP(0x67, 0x7C, 0x82DC) /* <CJK */
-MAP(0x67, 0x7D, 0x8309) /* <CJK */
-MAP(0x67, 0x7E, 0x82D9) /* <CJK */
-MAP(0x68, 0x21, 0x8335) /* <CJK */
-MAP(0x68, 0x22, 0x8334) /* <CJK */
-MAP(0x68, 0x23, 0x8316) /* <CJK */
-MAP(0x68, 0x24, 0x8332) /* <CJK */
-MAP(0x68, 0x25, 0x8331) /* <CJK */
-MAP(0x68, 0x26, 0x8340) /* <CJK */
-MAP(0x68, 0x27, 0x8339) /* <CJK */
-MAP(0x68, 0x28, 0x8350) /* <CJK */
-MAP(0x68, 0x29, 0x8345) /* <CJK */
-MAP(0x68, 0x2A, 0x832F) /* <CJK */
-MAP(0x68, 0x2B, 0x832B) /* <CJK */
-MAP(0x68, 0x2C, 0x8317) /* <CJK */
-MAP(0x68, 0x2D, 0x8318) /* <CJK */
-MAP(0x68, 0x2E, 0x8385) /* <CJK */
-MAP(0x68, 0x2F, 0x839A) /* <CJK */
-MAP(0x68, 0x30, 0x83AA) /* <CJK */
-MAP(0x68, 0x31, 0x839F) /* <CJK */
-MAP(0x68, 0x32, 0x83A2) /* <CJK */
-MAP(0x68, 0x33, 0x8396) /* <CJK */
-MAP(0x68, 0x34, 0x8323) /* <CJK */
-MAP(0x68, 0x35, 0x838E) /* <CJK */
-MAP(0x68, 0x36, 0x8387) /* <CJK */
-MAP(0x68, 0x37, 0x838A) /* <CJK */
-MAP(0x68, 0x38, 0x837C) /* <CJK */
-MAP(0x68, 0x39, 0x83B5) /* <CJK */
-MAP(0x68, 0x3A, 0x8373) /* <CJK */
-MAP(0x68, 0x3B, 0x8375) /* <CJK */
-MAP(0x68, 0x3C, 0x83A0) /* <CJK */
-MAP(0x68, 0x3D, 0x8389) /* <CJK */
-MAP(0x68, 0x3E, 0x83A8) /* <CJK */
-MAP(0x68, 0x3F, 0x83F4) /* <CJK */
-MAP(0x68, 0x40, 0x8413) /* <CJK */
-MAP(0x68, 0x41, 0x83EB) /* <CJK */
-MAP(0x68, 0x42, 0x83CE) /* <CJK */
-MAP(0x68, 0x43, 0x83FD) /* <CJK */
-MAP(0x68, 0x44, 0x8403) /* <CJK */
-MAP(0x68, 0x45, 0x83D8) /* <CJK */
-MAP(0x68, 0x46, 0x840B) /* <CJK */
-MAP(0x68, 0x47, 0x83C1) /* <CJK */
-MAP(0x68, 0x48, 0x83F7) /* <CJK */
-MAP(0x68, 0x49, 0x8407) /* <CJK */
-MAP(0x68, 0x4A, 0x83E0) /* <CJK */
-MAP(0x68, 0x4B, 0x83F2) /* <CJK */
-MAP(0x68, 0x4C, 0x840D) /* <CJK */
-MAP(0x68, 0x4D, 0x8422) /* <CJK */
-MAP(0x68, 0x4E, 0x8420) /* <CJK */
-MAP(0x68, 0x4F, 0x83BD) /* <CJK */
-MAP(0x68, 0x50, 0x8438) /* <CJK */
-MAP(0x68, 0x51, 0x8506) /* <CJK */
-MAP(0x68, 0x52, 0x83FB) /* <CJK */
-MAP(0x68, 0x53, 0x846D) /* <CJK */
-MAP(0x68, 0x54, 0x842A) /* <CJK */
-MAP(0x68, 0x55, 0x843C) /* <CJK */
-MAP(0x68, 0x56, 0x855A) /* <CJK */
-MAP(0x68, 0x57, 0x8484) /* <CJK */
-MAP(0x68, 0x58, 0x8477) /* <CJK */
-MAP(0x68, 0x59, 0x846B) /* <CJK */
-MAP(0x68, 0x5A, 0x84AD) /* <CJK */
-MAP(0x68, 0x5B, 0x846E) /* <CJK */
-MAP(0x68, 0x5C, 0x8482) /* <CJK */
-MAP(0x68, 0x5D, 0x8469) /* <CJK */
-MAP(0x68, 0x5E, 0x8446) /* <CJK */
-MAP(0x68, 0x5F, 0x842C) /* <CJK */
-MAP(0x68, 0x60, 0x846F) /* <CJK */
-MAP(0x68, 0x61, 0x8479) /* <CJK */
-MAP(0x68, 0x62, 0x8435) /* <CJK */
-MAP(0x68, 0x63, 0x84CA) /* <CJK */
-MAP(0x68, 0x64, 0x8462) /* <CJK */
-MAP(0x68, 0x65, 0x84B9) /* <CJK */
-MAP(0x68, 0x66, 0x84BF) /* <CJK */
-MAP(0x68, 0x67, 0x849F) /* <CJK */
-MAP(0x68, 0x68, 0x84D9) /* <CJK */
-MAP(0x68, 0x69, 0x84CD) /* <CJK */
-MAP(0x68, 0x6A, 0x84BB) /* <CJK */
-MAP(0x68, 0x6B, 0x84DA) /* <CJK */
-MAP(0x68, 0x6C, 0x84D0) /* <CJK */
-MAP(0x68, 0x6D, 0x84C1) /* <CJK */
-MAP(0x68, 0x6E, 0x84C6) /* <CJK */
-MAP(0x68, 0x6F, 0x84D6) /* <CJK */
-MAP(0x68, 0x70, 0x84A1) /* <CJK */
-MAP(0x68, 0x71, 0x8521) /* <CJK */
-MAP(0x68, 0x72, 0x84FF) /* <CJK */
-MAP(0x68, 0x73, 0x84F4) /* <CJK */
-MAP(0x68, 0x74, 0x8517) /* <CJK */
-MAP(0x68, 0x75, 0x8518) /* <CJK */
-MAP(0x68, 0x76, 0x852C) /* <CJK */
-MAP(0x68, 0x77, 0x851F) /* <CJK */
-MAP(0x68, 0x78, 0x8515) /* <CJK */
-MAP(0x68, 0x79, 0x8514) /* <CJK */
-MAP(0x68, 0x7A, 0x84FC) /* <CJK */
-MAP(0x68, 0x7B, 0x8540) /* <CJK */
-MAP(0x68, 0x7C, 0x8563) /* <CJK */
-MAP(0x68, 0x7D, 0x8558) /* <CJK */
-MAP(0x68, 0x7E, 0x8548) /* <CJK */
-MAP(0x69, 0x21, 0x8541) /* <CJK */
-MAP(0x69, 0x22, 0x8602) /* <CJK */
-MAP(0x69, 0x23, 0x854B) /* <CJK */
-MAP(0x69, 0x24, 0x8555) /* <CJK */
-MAP(0x69, 0x25, 0x8580) /* <CJK */
-MAP(0x69, 0x26, 0x85A4) /* <CJK */
-MAP(0x69, 0x27, 0x8588) /* <CJK */
-MAP(0x69, 0x28, 0x8591) /* <CJK */
-MAP(0x69, 0x29, 0x858A) /* <CJK */
-MAP(0x69, 0x2A, 0x85A8) /* <CJK */
-MAP(0x69, 0x2B, 0x856D) /* <CJK */
-MAP(0x69, 0x2C, 0x8594) /* <CJK */
-MAP(0x69, 0x2D, 0x859B) /* <CJK */
-MAP(0x69, 0x2E, 0x85EA) /* <CJK */
-MAP(0x69, 0x2F, 0x8587) /* <CJK */
-MAP(0x69, 0x30, 0x859C) /* <CJK */
-MAP(0x69, 0x31, 0x8577) /* <CJK */
-MAP(0x69, 0x32, 0x857E) /* <CJK */
-MAP(0x69, 0x33, 0x8590) /* <CJK */
-MAP(0x69, 0x34, 0x85C9) /* <CJK */
-MAP(0x69, 0x35, 0x85BA) /* <CJK */
-MAP(0x69, 0x36, 0x85CF) /* <CJK */
-MAP(0x69, 0x37, 0x85B9) /* <CJK */
-MAP(0x69, 0x38, 0x85D0) /* <CJK */
-MAP(0x69, 0x39, 0x85D5) /* <CJK */
-MAP(0x69, 0x3A, 0x85DD) /* <CJK */
-MAP(0x69, 0x3B, 0x85E5) /* <CJK */
-MAP(0x69, 0x3C, 0x85DC) /* <CJK */
-MAP(0x69, 0x3D, 0x85F9) /* <CJK */
-MAP(0x69, 0x3E, 0x860A) /* <CJK */
-MAP(0x69, 0x3F, 0x8613) /* <CJK */
-MAP(0x69, 0x40, 0x860B) /* <CJK */
-MAP(0x69, 0x41, 0x85FE) /* <CJK */
-MAP(0x69, 0x42, 0x85FA) /* <CJK */
-MAP(0x69, 0x43, 0x8606) /* <CJK */
-MAP(0x69, 0x44, 0x8622) /* <CJK */
-MAP(0x69, 0x45, 0x861A) /* <CJK */
-MAP(0x69, 0x46, 0x8630) /* <CJK */
-MAP(0x69, 0x47, 0x863F) /* <CJK */
-MAP(0x69, 0x48, 0x864D) /* <CJK */
-MAP(0x69, 0x49, 0x4E55) /* <CJK */
-MAP(0x69, 0x4A, 0x8654) /* <CJK */
-MAP(0x69, 0x4B, 0x865F) /* <CJK */
-MAP(0x69, 0x4C, 0x8667) /* <CJK */
-MAP(0x69, 0x4D, 0x8671) /* <CJK */
-MAP(0x69, 0x4E, 0x8693) /* <CJK */
-MAP(0x69, 0x4F, 0x86A3) /* <CJK */
-MAP(0x69, 0x50, 0x86A9) /* <CJK */
-MAP(0x69, 0x51, 0x86AA) /* <CJK */
-MAP(0x69, 0x52, 0x868B) /* <CJK */
-MAP(0x69, 0x53, 0x868C) /* <CJK */
-MAP(0x69, 0x54, 0x86B6) /* <CJK */
-MAP(0x69, 0x55, 0x86AF) /* <CJK */
-MAP(0x69, 0x56, 0x86C4) /* <CJK */
-MAP(0x69, 0x57, 0x86C6) /* <CJK */
-MAP(0x69, 0x58, 0x86B0) /* <CJK */
-MAP(0x69, 0x59, 0x86C9) /* <CJK */
-MAP(0x69, 0x5A, 0x8823) /* <CJK */
-MAP(0x69, 0x5B, 0x86AB) /* <CJK */
-MAP(0x69, 0x5C, 0x86D4) /* <CJK */
-MAP(0x69, 0x5D, 0x86DE) /* <CJK */
-MAP(0x69, 0x5E, 0x86E9) /* <CJK */
-MAP(0x69, 0x5F, 0x86EC) /* <CJK */
-MAP(0x69, 0x60, 0x86DF) /* <CJK */
-MAP(0x69, 0x61, 0x86DB) /* <CJK */
-MAP(0x69, 0x62, 0x86EF) /* <CJK */
-MAP(0x69, 0x63, 0x8712) /* <CJK */
-MAP(0x69, 0x64, 0x8706) /* <CJK */
-MAP(0x69, 0x65, 0x8708) /* <CJK */
-MAP(0x69, 0x66, 0x8700) /* <CJK */
-MAP(0x69, 0x67, 0x8703) /* <CJK */
-MAP(0x69, 0x68, 0x86FB) /* <CJK */
-MAP(0x69, 0x69, 0x8711) /* <CJK */
-MAP(0x69, 0x6A, 0x8709) /* <CJK */
-MAP(0x69, 0x6B, 0x870D) /* <CJK */
-MAP(0x69, 0x6C, 0x86F9) /* <CJK */
-MAP(0x69, 0x6D, 0x870A) /* <CJK */
-MAP(0x69, 0x6E, 0x8734) /* <CJK */
-MAP(0x69, 0x6F, 0x873F) /* <CJK */
-MAP(0x69, 0x70, 0x8737) /* <CJK */
-MAP(0x69, 0x71, 0x873B) /* <CJK */
-MAP(0x69, 0x72, 0x8725) /* <CJK */
-MAP(0x69, 0x73, 0x8729) /* <CJK */
-MAP(0x69, 0x74, 0x871A) /* <CJK */
-MAP(0x69, 0x75, 0x8760) /* <CJK */
-MAP(0x69, 0x76, 0x875F) /* <CJK */
-MAP(0x69, 0x77, 0x8778) /* <CJK */
-MAP(0x69, 0x78, 0x874C) /* <CJK */
-MAP(0x69, 0x79, 0x874E) /* <CJK */
-MAP(0x69, 0x7A, 0x8774) /* <CJK */
-MAP(0x69, 0x7B, 0x8757) /* <CJK */
-MAP(0x69, 0x7C, 0x8768) /* <CJK */
-MAP(0x69, 0x7D, 0x876E) /* <CJK */
-MAP(0x69, 0x7E, 0x8759) /* <CJK */
-MAP(0x6A, 0x21, 0x8753) /* <CJK */
-MAP(0x6A, 0x22, 0x8763) /* <CJK */
-MAP(0x6A, 0x23, 0x876A) /* <CJK */
-MAP(0x6A, 0x24, 0x8805) /* <CJK */
-MAP(0x6A, 0x25, 0x87A2) /* <CJK */
-MAP(0x6A, 0x26, 0x879F) /* <CJK */
-MAP(0x6A, 0x27, 0x8782) /* <CJK */
-MAP(0x6A, 0x28, 0x87AF) /* <CJK */
-MAP(0x6A, 0x29, 0x87CB) /* <CJK */
-MAP(0x6A, 0x2A, 0x87BD) /* <CJK */
-MAP(0x6A, 0x2B, 0x87C0) /* <CJK */
-MAP(0x6A, 0x2C, 0x87D0) /* <CJK */
-MAP(0x6A, 0x2D, 0x96D6) /* <CJK */
-MAP(0x6A, 0x2E, 0x87AB) /* <CJK */
-MAP(0x6A, 0x2F, 0x87C4) /* <CJK */
-MAP(0x6A, 0x30, 0x87B3) /* <CJK */
-MAP(0x6A, 0x31, 0x87C7) /* <CJK */
-MAP(0x6A, 0x32, 0x87C6) /* <CJK */
-MAP(0x6A, 0x33, 0x87BB) /* <CJK */
-MAP(0x6A, 0x34, 0x87EF) /* <CJK */
-MAP(0x6A, 0x35, 0x87F2) /* <CJK */
-MAP(0x6A, 0x36, 0x87E0) /* <CJK */
-MAP(0x6A, 0x37, 0x880F) /* <CJK */
-MAP(0x6A, 0x38, 0x880D) /* <CJK */
-MAP(0x6A, 0x39, 0x87FE) /* <CJK */
-MAP(0x6A, 0x3A, 0x87F6) /* <CJK */
-MAP(0x6A, 0x3B, 0x87F7) /* <CJK */
-MAP(0x6A, 0x3C, 0x880E) /* <CJK */
-MAP(0x6A, 0x3D, 0x87D2) /* <CJK */
-MAP(0x6A, 0x3E, 0x8811) /* <CJK */
-MAP(0x6A, 0x3F, 0x8816) /* <CJK */
-MAP(0x6A, 0x40, 0x8815) /* <CJK */
-MAP(0x6A, 0x41, 0x8822) /* <CJK */
-MAP(0x6A, 0x42, 0x8821) /* <CJK */
-MAP(0x6A, 0x43, 0x8831) /* <CJK */
-MAP(0x6A, 0x44, 0x8836) /* <CJK */
-MAP(0x6A, 0x45, 0x8839) /* <CJK */
-MAP(0x6A, 0x46, 0x8827) /* <CJK */
-MAP(0x6A, 0x47, 0x883B) /* <CJK */
-MAP(0x6A, 0x48, 0x8844) /* <CJK */
-MAP(0x6A, 0x49, 0x8842) /* <CJK */
-MAP(0x6A, 0x4A, 0x8852) /* <CJK */
-MAP(0x6A, 0x4B, 0x8859) /* <CJK */
-MAP(0x6A, 0x4C, 0x885E) /* <CJK */
-MAP(0x6A, 0x4D, 0x8862) /* <CJK */
-MAP(0x6A, 0x4E, 0x886B) /* <CJK */
-MAP(0x6A, 0x4F, 0x8881) /* <CJK */
-MAP(0x6A, 0x50, 0x887E) /* <CJK */
-MAP(0x6A, 0x51, 0x889E) /* <CJK */
-MAP(0x6A, 0x52, 0x8875) /* <CJK */
-MAP(0x6A, 0x53, 0x887D) /* <CJK */
-MAP(0x6A, 0x54, 0x88B5) /* <CJK */
-MAP(0x6A, 0x55, 0x8872) /* <CJK */
-MAP(0x6A, 0x56, 0x8882) /* <CJK */
-MAP(0x6A, 0x57, 0x8897) /* <CJK */
-MAP(0x6A, 0x58, 0x8892) /* <CJK */
-MAP(0x6A, 0x59, 0x88AE) /* <CJK */
-MAP(0x6A, 0x5A, 0x8899) /* <CJK */
-MAP(0x6A, 0x5B, 0x88A2) /* <CJK */
-MAP(0x6A, 0x5C, 0x888D) /* <CJK */
-MAP(0x6A, 0x5D, 0x88A4) /* <CJK */
-MAP(0x6A, 0x5E, 0x88B0) /* <CJK */
-MAP(0x6A, 0x5F, 0x88BF) /* <CJK */
-MAP(0x6A, 0x60, 0x88B1) /* <CJK */
-MAP(0x6A, 0x61, 0x88C3) /* <CJK */
-MAP(0x6A, 0x62, 0x88C4) /* <CJK */
-MAP(0x6A, 0x63, 0x88D4) /* <CJK */
-MAP(0x6A, 0x64, 0x88D8) /* <CJK */
-MAP(0x6A, 0x65, 0x88D9) /* <CJK */
-MAP(0x6A, 0x66, 0x88DD) /* <CJK */
-MAP(0x6A, 0x67, 0x88F9) /* <CJK */
-MAP(0x6A, 0x68, 0x8902) /* <CJK */
-MAP(0x6A, 0x69, 0x88FC) /* <CJK */
-MAP(0x6A, 0x6A, 0x88F4) /* <CJK */
-MAP(0x6A, 0x6B, 0x88E8) /* <CJK */
-MAP(0x6A, 0x6C, 0x88F2) /* <CJK */
-MAP(0x6A, 0x6D, 0x8904) /* <CJK */
-MAP(0x6A, 0x6E, 0x890C) /* <CJK */
-MAP(0x6A, 0x6F, 0x890A) /* <CJK */
-MAP(0x6A, 0x70, 0x8913) /* <CJK */
-MAP(0x6A, 0x71, 0x8943) /* <CJK */
-MAP(0x6A, 0x72, 0x891E) /* <CJK */
-MAP(0x6A, 0x73, 0x8925) /* <CJK */
-MAP(0x6A, 0x74, 0x892A) /* <CJK */
-MAP(0x6A, 0x75, 0x892B) /* <CJK */
-MAP(0x6A, 0x76, 0x8941) /* <CJK */
-MAP(0x6A, 0x77, 0x8944) /* <CJK */
-MAP(0x6A, 0x78, 0x893B) /* <CJK */
-MAP(0x6A, 0x79, 0x8936) /* <CJK */
-MAP(0x6A, 0x7A, 0x8938) /* <CJK */
-MAP(0x6A, 0x7B, 0x894C) /* <CJK */
-MAP(0x6A, 0x7C, 0x891D) /* <CJK */
-MAP(0x6A, 0x7D, 0x8960) /* <CJK */
-MAP(0x6A, 0x7E, 0x895E) /* <CJK */
-MAP(0x6B, 0x21, 0x8966) /* <CJK */
-MAP(0x6B, 0x22, 0x8964) /* <CJK */
-MAP(0x6B, 0x23, 0x896D) /* <CJK */
-MAP(0x6B, 0x24, 0x896A) /* <CJK */
-MAP(0x6B, 0x25, 0x896F) /* <CJK */
-MAP(0x6B, 0x26, 0x8974) /* <CJK */
-MAP(0x6B, 0x27, 0x8977) /* <CJK */
-MAP(0x6B, 0x28, 0x897E) /* <CJK */
-MAP(0x6B, 0x29, 0x8983) /* <CJK */
-MAP(0x6B, 0x2A, 0x8988) /* <CJK */
-MAP(0x6B, 0x2B, 0x898A) /* <CJK */
-MAP(0x6B, 0x2C, 0x8993) /* <CJK */
-MAP(0x6B, 0x2D, 0x8998) /* <CJK */
-MAP(0x6B, 0x2E, 0x89A1) /* <CJK */
-MAP(0x6B, 0x2F, 0x89A9) /* <CJK */
-MAP(0x6B, 0x30, 0x89A6) /* <CJK */
-MAP(0x6B, 0x31, 0x89AC) /* <CJK */
-MAP(0x6B, 0x32, 0x89AF) /* <CJK */
-MAP(0x6B, 0x33, 0x89B2) /* <CJK */
-MAP(0x6B, 0x34, 0x89BA) /* <CJK */
-MAP(0x6B, 0x35, 0x89BD) /* <CJK */
-MAP(0x6B, 0x36, 0x89BF) /* <CJK */
-MAP(0x6B, 0x37, 0x89C0) /* <CJK */
-MAP(0x6B, 0x38, 0x89DA) /* <CJK */
-MAP(0x6B, 0x39, 0x89DC) /* <CJK */
-MAP(0x6B, 0x3A, 0x89DD) /* <CJK */
-MAP(0x6B, 0x3B, 0x89E7) /* <CJK */
-MAP(0x6B, 0x3C, 0x89F4) /* <CJK */
-MAP(0x6B, 0x3D, 0x89F8) /* <CJK */
-MAP(0x6B, 0x3E, 0x8A03) /* <CJK */
-MAP(0x6B, 0x3F, 0x8A16) /* <CJK */
-MAP(0x6B, 0x40, 0x8A10) /* <CJK */
-MAP(0x6B, 0x41, 0x8A0C) /* <CJK */
-MAP(0x6B, 0x42, 0x8A1B) /* <CJK */
-MAP(0x6B, 0x43, 0x8A1D) /* <CJK */
-MAP(0x6B, 0x44, 0x8A25) /* <CJK */
-MAP(0x6B, 0x45, 0x8A36) /* <CJK */
-MAP(0x6B, 0x46, 0x8A41) /* <CJK */
-MAP(0x6B, 0x47, 0x8A5B) /* <CJK */
-MAP(0x6B, 0x48, 0x8A52) /* <CJK */
-MAP(0x6B, 0x49, 0x8A46) /* <CJK */
-MAP(0x6B, 0x4A, 0x8A48) /* <CJK */
-MAP(0x6B, 0x4B, 0x8A7C) /* <CJK */
-MAP(0x6B, 0x4C, 0x8A6D) /* <CJK */
-MAP(0x6B, 0x4D, 0x8A6C) /* <CJK */
-MAP(0x6B, 0x4E, 0x8A62) /* <CJK */
-MAP(0x6B, 0x4F, 0x8A85) /* <CJK */
-MAP(0x6B, 0x50, 0x8A82) /* <CJK */
-MAP(0x6B, 0x51, 0x8A84) /* <CJK */
-MAP(0x6B, 0x52, 0x8AA8) /* <CJK */
-MAP(0x6B, 0x53, 0x8AA1) /* <CJK */
-MAP(0x6B, 0x54, 0x8A91) /* <CJK */
-MAP(0x6B, 0x55, 0x8AA5) /* <CJK */
-MAP(0x6B, 0x56, 0x8AA6) /* <CJK */
-MAP(0x6B, 0x57, 0x8A9A) /* <CJK */
-MAP(0x6B, 0x58, 0x8AA3) /* <CJK */
-MAP(0x6B, 0x59, 0x8AC4) /* <CJK */
-MAP(0x6B, 0x5A, 0x8ACD) /* <CJK */
-MAP(0x6B, 0x5B, 0x8AC2) /* <CJK */
-MAP(0x6B, 0x5C, 0x8ADA) /* <CJK */
-MAP(0x6B, 0x5D, 0x8AEB) /* <CJK */
-MAP(0x6B, 0x5E, 0x8AF3) /* <CJK */
-MAP(0x6B, 0x5F, 0x8AE7) /* <CJK */
-MAP(0x6B, 0x60, 0x8AE4) /* <CJK */
-MAP(0x6B, 0x61, 0x8AF1) /* <CJK */
-MAP(0x6B, 0x62, 0x8B14) /* <CJK */
-MAP(0x6B, 0x63, 0x8AE0) /* <CJK */
-MAP(0x6B, 0x64, 0x8AE2) /* <CJK */
-MAP(0x6B, 0x65, 0x8AF7) /* <CJK */
-MAP(0x6B, 0x66, 0x8ADE) /* <CJK */
-MAP(0x6B, 0x67, 0x8ADB) /* <CJK */
-MAP(0x6B, 0x68, 0x8B0C) /* <CJK */
-MAP(0x6B, 0x69, 0x8B07) /* <CJK */
-MAP(0x6B, 0x6A, 0x8B1A) /* <CJK */
-MAP(0x6B, 0x6B, 0x8AE1) /* <CJK */
-MAP(0x6B, 0x6C, 0x8B16) /* <CJK */
-MAP(0x6B, 0x6D, 0x8B10) /* <CJK */
-MAP(0x6B, 0x6E, 0x8B17) /* <CJK */
-MAP(0x6B, 0x6F, 0x8B20) /* <CJK */
-MAP(0x6B, 0x70, 0x8B33) /* <CJK */
-MAP(0x6B, 0x71, 0x97AB) /* <CJK */
-MAP(0x6B, 0x72, 0x8B26) /* <CJK */
-MAP(0x6B, 0x73, 0x8B2B) /* <CJK */
-MAP(0x6B, 0x74, 0x8B3E) /* <CJK */
-MAP(0x6B, 0x75, 0x8B28) /* <CJK */
-MAP(0x6B, 0x76, 0x8B41) /* <CJK */
-MAP(0x6B, 0x77, 0x8B4C) /* <CJK */
-MAP(0x6B, 0x78, 0x8B4F) /* <CJK */
-MAP(0x6B, 0x79, 0x8B4E) /* <CJK */
-MAP(0x6B, 0x7A, 0x8B49) /* <CJK */
-MAP(0x6B, 0x7B, 0x8B56) /* <CJK */
-MAP(0x6B, 0x7C, 0x8B5B) /* <CJK */
-MAP(0x6B, 0x7D, 0x8B5A) /* <CJK */
-MAP(0x6B, 0x7E, 0x8B6B) /* <CJK */
-MAP(0x6C, 0x21, 0x8B5F) /* <CJK */
-MAP(0x6C, 0x22, 0x8B6C) /* <CJK */
-MAP(0x6C, 0x23, 0x8B6F) /* <CJK */
-MAP(0x6C, 0x24, 0x8B74) /* <CJK */
-MAP(0x6C, 0x25, 0x8B7D) /* <CJK */
-MAP(0x6C, 0x26, 0x8B80) /* <CJK */
-MAP(0x6C, 0x27, 0x8B8C) /* <CJK */
-MAP(0x6C, 0x28, 0x8B8E) /* <CJK */
-MAP(0x6C, 0x29, 0x8B92) /* <CJK */
-MAP(0x6C, 0x2A, 0x8B93) /* <CJK */
-MAP(0x6C, 0x2B, 0x8B96) /* <CJK */
-MAP(0x6C, 0x2C, 0x8B99) /* <CJK */
-MAP(0x6C, 0x2D, 0x8B9A) /* <CJK */
-MAP(0x6C, 0x2E, 0x8C3A) /* <CJK */
-MAP(0x6C, 0x2F, 0x8C41) /* <CJK */
-MAP(0x6C, 0x30, 0x8C3F) /* <CJK */
-MAP(0x6C, 0x31, 0x8C48) /* <CJK */
-MAP(0x6C, 0x32, 0x8C4C) /* <CJK */
-MAP(0x6C, 0x33, 0x8C4E) /* <CJK */
-MAP(0x6C, 0x34, 0x8C50) /* <CJK */
-MAP(0x6C, 0x35, 0x8C55) /* <CJK */
-MAP(0x6C, 0x36, 0x8C62) /* <CJK */
-MAP(0x6C, 0x37, 0x8C6C) /* <CJK */
-MAP(0x6C, 0x38, 0x8C78) /* <CJK */
-MAP(0x6C, 0x39, 0x8C7A) /* <CJK */
-MAP(0x6C, 0x3A, 0x8C82) /* <CJK */
-MAP(0x6C, 0x3B, 0x8C89) /* <CJK */
-MAP(0x6C, 0x3C, 0x8C85) /* <CJK */
-MAP(0x6C, 0x3D, 0x8C8A) /* <CJK */
-MAP(0x6C, 0x3E, 0x8C8D) /* <CJK */
-MAP(0x6C, 0x3F, 0x8C8E) /* <CJK */
-MAP(0x6C, 0x40, 0x8C94) /* <CJK */
-MAP(0x6C, 0x41, 0x8C7C) /* <CJK */
-MAP(0x6C, 0x42, 0x8C98) /* <CJK */
-MAP(0x6C, 0x43, 0x621D) /* <CJK */
-MAP(0x6C, 0x44, 0x8CAD) /* <CJK */
-MAP(0x6C, 0x45, 0x8CAA) /* <CJK */
-MAP(0x6C, 0x46, 0x8CBD) /* <CJK */
-MAP(0x6C, 0x47, 0x8CB2) /* <CJK */
-MAP(0x6C, 0x48, 0x8CB3) /* <CJK */
-MAP(0x6C, 0x49, 0x8CAE) /* <CJK */
-MAP(0x6C, 0x4A, 0x8CB6) /* <CJK */
-MAP(0x6C, 0x4B, 0x8CC8) /* <CJK */
-MAP(0x6C, 0x4C, 0x8CC1) /* <CJK */
-MAP(0x6C, 0x4D, 0x8CE4) /* <CJK */
-MAP(0x6C, 0x4E, 0x8CE3) /* <CJK */
-MAP(0x6C, 0x4F, 0x8CDA) /* <CJK */
-MAP(0x6C, 0x50, 0x8CFD) /* <CJK */
-MAP(0x6C, 0x51, 0x8CFA) /* <CJK */
-MAP(0x6C, 0x52, 0x8CFB) /* <CJK */
-MAP(0x6C, 0x53, 0x8D04) /* <CJK */
-MAP(0x6C, 0x54, 0x8D05) /* <CJK */
-MAP(0x6C, 0x55, 0x8D0A) /* <CJK */
-MAP(0x6C, 0x56, 0x8D07) /* <CJK */
-MAP(0x6C, 0x57, 0x8D0F) /* <CJK */
-MAP(0x6C, 0x58, 0x8D0D) /* <CJK */
-MAP(0x6C, 0x59, 0x8D10) /* <CJK */
-MAP(0x6C, 0x5A, 0x9F4E) /* <CJK */
-MAP(0x6C, 0x5B, 0x8D13) /* <CJK */
-MAP(0x6C, 0x5C, 0x8CCD) /* <CJK */
-MAP(0x6C, 0x5D, 0x8D14) /* <CJK */
-MAP(0x6C, 0x5E, 0x8D16) /* <CJK */
-MAP(0x6C, 0x5F, 0x8D67) /* <CJK */
-MAP(0x6C, 0x60, 0x8D6D) /* <CJK */
-MAP(0x6C, 0x61, 0x8D71) /* <CJK */
-MAP(0x6C, 0x62, 0x8D73) /* <CJK */
-MAP(0x6C, 0x63, 0x8D81) /* <CJK */
-MAP(0x6C, 0x64, 0x8D99) /* <CJK */
-MAP(0x6C, 0x65, 0x8DC2) /* <CJK */
-MAP(0x6C, 0x66, 0x8DBE) /* <CJK */
-MAP(0x6C, 0x67, 0x8DBA) /* <CJK */
-MAP(0x6C, 0x68, 0x8DCF) /* <CJK */
-MAP(0x6C, 0x69, 0x8DDA) /* <CJK */
-MAP(0x6C, 0x6A, 0x8DD6) /* <CJK */
-MAP(0x6C, 0x6B, 0x8DCC) /* <CJK */
-MAP(0x6C, 0x6C, 0x8DDB) /* <CJK */
-MAP(0x6C, 0x6D, 0x8DCB) /* <CJK */
-MAP(0x6C, 0x6E, 0x8DEA) /* <CJK */
-MAP(0x6C, 0x6F, 0x8DEB) /* <CJK */
-MAP(0x6C, 0x70, 0x8DDF) /* <CJK */
-MAP(0x6C, 0x71, 0x8DE3) /* <CJK */
-MAP(0x6C, 0x72, 0x8DFC) /* <CJK */
-MAP(0x6C, 0x73, 0x8E08) /* <CJK */
-MAP(0x6C, 0x74, 0x8E09) /* <CJK */
-MAP(0x6C, 0x75, 0x8DFF) /* <CJK */
-MAP(0x6C, 0x76, 0x8E1D) /* <CJK */
-MAP(0x6C, 0x77, 0x8E1E) /* <CJK */
-MAP(0x6C, 0x78, 0x8E10) /* <CJK */
-MAP(0x6C, 0x79, 0x8E1F) /* <CJK */
-MAP(0x6C, 0x7A, 0x8E42) /* <CJK */
-MAP(0x6C, 0x7B, 0x8E35) /* <CJK */
-MAP(0x6C, 0x7C, 0x8E30) /* <CJK */
-MAP(0x6C, 0x7D, 0x8E34) /* <CJK */
-MAP(0x6C, 0x7E, 0x8E4A) /* <CJK */
-MAP(0x6D, 0x21, 0x8E47) /* <CJK */
-MAP(0x6D, 0x22, 0x8E49) /* <CJK */
-MAP(0x6D, 0x23, 0x8E4C) /* <CJK */
-MAP(0x6D, 0x24, 0x8E50) /* <CJK */
-MAP(0x6D, 0x25, 0x8E48) /* <CJK */
-MAP(0x6D, 0x26, 0x8E59) /* <CJK */
-MAP(0x6D, 0x27, 0x8E64) /* <CJK */
-MAP(0x6D, 0x28, 0x8E60) /* <CJK */
-MAP(0x6D, 0x29, 0x8E2A) /* <CJK */
-MAP(0x6D, 0x2A, 0x8E63) /* <CJK */
-MAP(0x6D, 0x2B, 0x8E55) /* <CJK */
-MAP(0x6D, 0x2C, 0x8E76) /* <CJK */
-MAP(0x6D, 0x2D, 0x8E72) /* <CJK */
-MAP(0x6D, 0x2E, 0x8E7C) /* <CJK */
-MAP(0x6D, 0x2F, 0x8E81) /* <CJK */
-MAP(0x6D, 0x30, 0x8E87) /* <CJK */
-MAP(0x6D, 0x31, 0x8E85) /* <CJK */
-MAP(0x6D, 0x32, 0x8E84) /* <CJK */
-MAP(0x6D, 0x33, 0x8E8B) /* <CJK */
-MAP(0x6D, 0x34, 0x8E8A) /* <CJK */
-MAP(0x6D, 0x35, 0x8E93) /* <CJK */
-MAP(0x6D, 0x36, 0x8E91) /* <CJK */
-MAP(0x6D, 0x37, 0x8E94) /* <CJK */
-MAP(0x6D, 0x38, 0x8E99) /* <CJK */
-MAP(0x6D, 0x39, 0x8EAA) /* <CJK */
-MAP(0x6D, 0x3A, 0x8EA1) /* <CJK */
-MAP(0x6D, 0x3B, 0x8EAC) /* <CJK */
-MAP(0x6D, 0x3C, 0x8EB0) /* <CJK */
-MAP(0x6D, 0x3D, 0x8EC6) /* <CJK */
-MAP(0x6D, 0x3E, 0x8EB1) /* <CJK */
-MAP(0x6D, 0x3F, 0x8EBE) /* <CJK */
-MAP(0x6D, 0x40, 0x8EC5) /* <CJK */
-MAP(0x6D, 0x41, 0x8EC8) /* <CJK */
-MAP(0x6D, 0x42, 0x8ECB) /* <CJK */
-MAP(0x6D, 0x43, 0x8EDB) /* <CJK */
-MAP(0x6D, 0x44, 0x8EE3) /* <CJK */
-MAP(0x6D, 0x45, 0x8EFC) /* <CJK */
-MAP(0x6D, 0x46, 0x8EFB) /* <CJK */
-MAP(0x6D, 0x47, 0x8EEB) /* <CJK */
-MAP(0x6D, 0x48, 0x8EFE) /* <CJK */
-MAP(0x6D, 0x49, 0x8F0A) /* <CJK */
-MAP(0x6D, 0x4A, 0x8F05) /* <CJK */
-MAP(0x6D, 0x4B, 0x8F15) /* <CJK */
-MAP(0x6D, 0x4C, 0x8F12) /* <CJK */
-MAP(0x6D, 0x4D, 0x8F19) /* <CJK */
-MAP(0x6D, 0x4E, 0x8F13) /* <CJK */
-MAP(0x6D, 0x4F, 0x8F1C) /* <CJK */
-MAP(0x6D, 0x50, 0x8F1F) /* <CJK */
-MAP(0x6D, 0x51, 0x8F1B) /* <CJK */
-MAP(0x6D, 0x52, 0x8F0C) /* <CJK */
-MAP(0x6D, 0x53, 0x8F26) /* <CJK */
-MAP(0x6D, 0x54, 0x8F33) /* <CJK */
-MAP(0x6D, 0x55, 0x8F3B) /* <CJK */
-MAP(0x6D, 0x56, 0x8F39) /* <CJK */
-MAP(0x6D, 0x57, 0x8F45) /* <CJK */
-MAP(0x6D, 0x58, 0x8F42) /* <CJK */
-MAP(0x6D, 0x59, 0x8F3E) /* <CJK */
-MAP(0x6D, 0x5A, 0x8F4C) /* <CJK */
-MAP(0x6D, 0x5B, 0x8F49) /* <CJK */
-MAP(0x6D, 0x5C, 0x8F46) /* <CJK */
-MAP(0x6D, 0x5D, 0x8F4E) /* <CJK */
-MAP(0x6D, 0x5E, 0x8F57) /* <CJK */
-MAP(0x6D, 0x5F, 0x8F5C) /* <CJK */
-MAP(0x6D, 0x60, 0x8F62) /* <CJK */
-MAP(0x6D, 0x61, 0x8F63) /* <CJK */
-MAP(0x6D, 0x62, 0x8F64) /* <CJK */
-MAP(0x6D, 0x63, 0x8F9C) /* <CJK */
-MAP(0x6D, 0x64, 0x8F9F) /* <CJK */
-MAP(0x6D, 0x65, 0x8FA3) /* <CJK */
-MAP(0x6D, 0x66, 0x8FAD) /* <CJK */
-MAP(0x6D, 0x67, 0x8FAF) /* <CJK */
-MAP(0x6D, 0x68, 0x8FB7) /* <CJK */
-MAP(0x6D, 0x69, 0x8FDA) /* <CJK */
-MAP(0x6D, 0x6A, 0x8FE5) /* <CJK */
-MAP(0x6D, 0x6B, 0x8FE2) /* <CJK */
-MAP(0x6D, 0x6C, 0x8FEA) /* <CJK */
-MAP(0x6D, 0x6D, 0x8FEF) /* <CJK */
-MAP(0x6D, 0x6E, 0x9087) /* <CJK */
-MAP(0x6D, 0x6F, 0x8FF4) /* <CJK */
-MAP(0x6D, 0x70, 0x9005) /* <CJK */
-MAP(0x6D, 0x71, 0x8FF9) /* <CJK */
-MAP(0x6D, 0x72, 0x8FFA) /* <CJK */
-MAP(0x6D, 0x73, 0x9011) /* <CJK */
-MAP(0x6D, 0x74, 0x9015) /* <CJK */
-MAP(0x6D, 0x75, 0x9021) /* <CJK */
-MAP(0x6D, 0x76, 0x900D) /* <CJK */
-MAP(0x6D, 0x77, 0x901E) /* <CJK */
-MAP(0x6D, 0x78, 0x9016) /* <CJK */
-MAP(0x6D, 0x79, 0x900B) /* <CJK */
-MAP(0x6D, 0x7A, 0x9027) /* <CJK */
-MAP(0x6D, 0x7B, 0x9036) /* <CJK */
-MAP(0x6D, 0x7C, 0x9035) /* <CJK */
-MAP(0x6D, 0x7D, 0x9039) /* <CJK */
-MAP(0x6D, 0x7E, 0x8FF8) /* <CJK */
-MAP(0x6E, 0x21, 0x904F) /* <CJK */
-MAP(0x6E, 0x22, 0x9050) /* <CJK */
-MAP(0x6E, 0x23, 0x9051) /* <CJK */
-MAP(0x6E, 0x24, 0x9052) /* <CJK */
-MAP(0x6E, 0x25, 0x900E) /* <CJK */
-MAP(0x6E, 0x26, 0x9049) /* <CJK */
-MAP(0x6E, 0x27, 0x903E) /* <CJK */
-MAP(0x6E, 0x28, 0x9056) /* <CJK */
-MAP(0x6E, 0x29, 0x9058) /* <CJK */
-MAP(0x6E, 0x2A, 0x905E) /* <CJK */
-MAP(0x6E, 0x2B, 0x9068) /* <CJK */
-MAP(0x6E, 0x2C, 0x906F) /* <CJK */
-MAP(0x6E, 0x2D, 0x9076) /* <CJK */
-MAP(0x6E, 0x2E, 0x96A8) /* <CJK */
-MAP(0x6E, 0x2F, 0x9072) /* <CJK */
-MAP(0x6E, 0x30, 0x9082) /* <CJK */
-MAP(0x6E, 0x31, 0x907D) /* <CJK */
-MAP(0x6E, 0x32, 0x9081) /* <CJK */
-MAP(0x6E, 0x33, 0x9080) /* <CJK */
-MAP(0x6E, 0x34, 0x908A) /* <CJK */
-MAP(0x6E, 0x35, 0x9089) /* <CJK */
-MAP(0x6E, 0x36, 0x908F) /* <CJK */
-MAP(0x6E, 0x37, 0x90A8) /* <CJK */
-MAP(0x6E, 0x38, 0x90AF) /* <CJK */
-MAP(0x6E, 0x39, 0x90B1) /* <CJK */
-MAP(0x6E, 0x3A, 0x90B5) /* <CJK */
-MAP(0x6E, 0x3B, 0x90E2) /* <CJK */
-MAP(0x6E, 0x3C, 0x90E4) /* <CJK */
-MAP(0x6E, 0x3D, 0x6248) /* <CJK */
-MAP(0x6E, 0x3E, 0x90DB) /* <CJK */
-MAP(0x6E, 0x3F, 0x9102) /* <CJK */
-MAP(0x6E, 0x40, 0x9112) /* <CJK */
-MAP(0x6E, 0x41, 0x9119) /* <CJK */
-MAP(0x6E, 0x42, 0x9132) /* <CJK */
-MAP(0x6E, 0x43, 0x9130) /* <CJK */
-MAP(0x6E, 0x44, 0x914A) /* <CJK */
-MAP(0x6E, 0x45, 0x9156) /* <CJK */
-MAP(0x6E, 0x46, 0x9158) /* <CJK */
-MAP(0x6E, 0x47, 0x9163) /* <CJK */
-MAP(0x6E, 0x48, 0x9165) /* <CJK */
-MAP(0x6E, 0x49, 0x9169) /* <CJK */
-MAP(0x6E, 0x4A, 0x9173) /* <CJK */
-MAP(0x6E, 0x4B, 0x9172) /* <CJK */
-MAP(0x6E, 0x4C, 0x918B) /* <CJK */
-MAP(0x6E, 0x4D, 0x9189) /* <CJK */
-MAP(0x6E, 0x4E, 0x9182) /* <CJK */
-MAP(0x6E, 0x4F, 0x91A2) /* <CJK */
-MAP(0x6E, 0x50, 0x91AB) /* <CJK */
-MAP(0x6E, 0x51, 0x91AF) /* <CJK */
-MAP(0x6E, 0x52, 0x91AA) /* <CJK */
-MAP(0x6E, 0x53, 0x91B5) /* <CJK */
-MAP(0x6E, 0x54, 0x91B4) /* <CJK */
-MAP(0x6E, 0x55, 0x91BA) /* <CJK */
-MAP(0x6E, 0x56, 0x91C0) /* <CJK */
-MAP(0x6E, 0x57, 0x91C1) /* <CJK */
-MAP(0x6E, 0x58, 0x91C9) /* <CJK */
-MAP(0x6E, 0x59, 0x91CB) /* <CJK */
-MAP(0x6E, 0x5A, 0x91D0) /* <CJK */
-MAP(0x6E, 0x5B, 0x91D6) /* <CJK */
-MAP(0x6E, 0x5C, 0x91DF) /* <CJK */
-MAP(0x6E, 0x5D, 0x91E1) /* <CJK */
-MAP(0x6E, 0x5E, 0x91DB) /* <CJK */
-MAP(0x6E, 0x5F, 0x91FC) /* <CJK */
-MAP(0x6E, 0x60, 0x91F5) /* <CJK */
-MAP(0x6E, 0x61, 0x91F6) /* <CJK */
-MAP(0x6E, 0x62, 0x921E) /* <CJK */
-MAP(0x6E, 0x63, 0x91FF) /* <CJK */
-MAP(0x6E, 0x64, 0x9214) /* <CJK */
-MAP(0x6E, 0x65, 0x922C) /* <CJK */
-MAP(0x6E, 0x66, 0x9215) /* <CJK */
-MAP(0x6E, 0x67, 0x9211) /* <CJK */
-MAP(0x6E, 0x68, 0x925E) /* <CJK */
-MAP(0x6E, 0x69, 0x9257) /* <CJK */
-MAP(0x6E, 0x6A, 0x9245) /* <CJK */
-MAP(0x6E, 0x6B, 0x9249) /* <CJK */
-MAP(0x6E, 0x6C, 0x9264) /* <CJK */
-MAP(0x6E, 0x6D, 0x9248) /* <CJK */
-MAP(0x6E, 0x6E, 0x9295) /* <CJK */
-MAP(0x6E, 0x6F, 0x923F) /* <CJK */
-MAP(0x6E, 0x70, 0x924B) /* <CJK */
-MAP(0x6E, 0x71, 0x9250) /* <CJK */
-MAP(0x6E, 0x72, 0x929C) /* <CJK */
-MAP(0x6E, 0x73, 0x9296) /* <CJK */
-MAP(0x6E, 0x74, 0x9293) /* <CJK */
-MAP(0x6E, 0x75, 0x929B) /* <CJK */
-MAP(0x6E, 0x76, 0x925A) /* <CJK */
-MAP(0x6E, 0x77, 0x92CF) /* <CJK */
-MAP(0x6E, 0x78, 0x92B9) /* <CJK */
-MAP(0x6E, 0x79, 0x92B7) /* <CJK */
-MAP(0x6E, 0x7A, 0x92E9) /* <CJK */
-MAP(0x6E, 0x7B, 0x930F) /* <CJK */
-MAP(0x6E, 0x7C, 0x92FA) /* <CJK */
-MAP(0x6E, 0x7D, 0x9344) /* <CJK */
-MAP(0x6E, 0x7E, 0x932E) /* <CJK */
-MAP(0x6F, 0x21, 0x9319) /* <CJK */
-MAP(0x6F, 0x22, 0x9322) /* <CJK */
-MAP(0x6F, 0x23, 0x931A) /* <CJK */
-MAP(0x6F, 0x24, 0x9323) /* <CJK */
-MAP(0x6F, 0x25, 0x933A) /* <CJK */
-MAP(0x6F, 0x26, 0x9335) /* <CJK */
-MAP(0x6F, 0x27, 0x933B) /* <CJK */
-MAP(0x6F, 0x28, 0x935C) /* <CJK */
-MAP(0x6F, 0x29, 0x9360) /* <CJK */
-MAP(0x6F, 0x2A, 0x937C) /* <CJK */
-MAP(0x6F, 0x2B, 0x936E) /* <CJK */
-MAP(0x6F, 0x2C, 0x9356) /* <CJK */
-MAP(0x6F, 0x2D, 0x93B0) /* <CJK */
-MAP(0x6F, 0x2E, 0x93AC) /* <CJK */
-MAP(0x6F, 0x2F, 0x93AD) /* <CJK */
-MAP(0x6F, 0x30, 0x9394) /* <CJK */
-MAP(0x6F, 0x31, 0x93B9) /* <CJK */
-MAP(0x6F, 0x32, 0x93D6) /* <CJK */
-MAP(0x6F, 0x33, 0x93D7) /* <CJK */
-MAP(0x6F, 0x34, 0x93E8) /* <CJK */
-MAP(0x6F, 0x35, 0x93E5) /* <CJK */
-MAP(0x6F, 0x36, 0x93D8) /* <CJK */
-MAP(0x6F, 0x37, 0x93C3) /* <CJK */
-MAP(0x6F, 0x38, 0x93DD) /* <CJK */
-MAP(0x6F, 0x39, 0x93D0) /* <CJK */
-MAP(0x6F, 0x3A, 0x93C8) /* <CJK */
-MAP(0x6F, 0x3B, 0x93E4) /* <CJK */
-MAP(0x6F, 0x3C, 0x941A) /* <CJK */
-MAP(0x6F, 0x3D, 0x9414) /* <CJK */
-MAP(0x6F, 0x3E, 0x9413) /* <CJK */
-MAP(0x6F, 0x3F, 0x9403) /* <CJK */
-MAP(0x6F, 0x40, 0x9407) /* <CJK */
-MAP(0x6F, 0x41, 0x9410) /* <CJK */
-MAP(0x6F, 0x42, 0x9436) /* <CJK */
-MAP(0x6F, 0x43, 0x942B) /* <CJK */
-MAP(0x6F, 0x44, 0x9435) /* <CJK */
-MAP(0x6F, 0x45, 0x9421) /* <CJK */
-MAP(0x6F, 0x46, 0x943A) /* <CJK */
-MAP(0x6F, 0x47, 0x9441) /* <CJK */
-MAP(0x6F, 0x48, 0x9452) /* <CJK */
-MAP(0x6F, 0x49, 0x9444) /* <CJK */
-MAP(0x6F, 0x4A, 0x945B) /* <CJK */
-MAP(0x6F, 0x4B, 0x9460) /* <CJK */
-MAP(0x6F, 0x4C, 0x9462) /* <CJK */
-MAP(0x6F, 0x4D, 0x945E) /* <CJK */
-MAP(0x6F, 0x4E, 0x946A) /* <CJK */
-MAP(0x6F, 0x4F, 0x9229) /* <CJK */
-MAP(0x6F, 0x50, 0x9470) /* <CJK */
-MAP(0x6F, 0x51, 0x9475) /* <CJK */
-MAP(0x6F, 0x52, 0x9477) /* <CJK */
-MAP(0x6F, 0x53, 0x947D) /* <CJK */
-MAP(0x6F, 0x54, 0x945A) /* <CJK */
-MAP(0x6F, 0x55, 0x947C) /* <CJK */
-MAP(0x6F, 0x56, 0x947E) /* <CJK */
-MAP(0x6F, 0x57, 0x9481) /* <CJK */
-MAP(0x6F, 0x58, 0x947F) /* <CJK */
-MAP(0x6F, 0x59, 0x9582) /* <CJK */
-MAP(0x6F, 0x5A, 0x9587) /* <CJK */
-MAP(0x6F, 0x5B, 0x958A) /* <CJK */
-MAP(0x6F, 0x5C, 0x9594) /* <CJK */
-MAP(0x6F, 0x5D, 0x9596) /* <CJK */
-MAP(0x6F, 0x5E, 0x9598) /* <CJK */
-MAP(0x6F, 0x5F, 0x9599) /* <CJK */
-MAP(0x6F, 0x60, 0x95A0) /* <CJK */
-MAP(0x6F, 0x61, 0x95A8) /* <CJK */
-MAP(0x6F, 0x62, 0x95A7) /* <CJK */
-MAP(0x6F, 0x63, 0x95AD) /* <CJK */
-MAP(0x6F, 0x64, 0x95BC) /* <CJK */
-MAP(0x6F, 0x65, 0x95BB) /* <CJK */
-MAP(0x6F, 0x66, 0x95B9) /* <CJK */
-MAP(0x6F, 0x67, 0x95BE) /* <CJK */
-MAP(0x6F, 0x68, 0x95CA) /* <CJK */
-MAP(0x6F, 0x69, 0x6FF6) /* <CJK */
-MAP(0x6F, 0x6A, 0x95C3) /* <CJK */
-MAP(0x6F, 0x6B, 0x95CD) /* <CJK */
-MAP(0x6F, 0x6C, 0x95CC) /* <CJK */
-MAP(0x6F, 0x6D, 0x95D5) /* <CJK */
-MAP(0x6F, 0x6E, 0x95D4) /* <CJK */
-MAP(0x6F, 0x6F, 0x95D6) /* <CJK */
-MAP(0x6F, 0x70, 0x95DC) /* <CJK */
-MAP(0x6F, 0x71, 0x95E1) /* <CJK */
-MAP(0x6F, 0x72, 0x95E5) /* <CJK */
-MAP(0x6F, 0x73, 0x95E2) /* <CJK */
-MAP(0x6F, 0x74, 0x9621) /* <CJK */
-MAP(0x6F, 0x75, 0x9628) /* <CJK */
-MAP(0x6F, 0x76, 0x962E) /* <CJK */
-MAP(0x6F, 0x77, 0x962F) /* <CJK */
-MAP(0x6F, 0x78, 0x9642) /* <CJK */
-MAP(0x6F, 0x79, 0x964C) /* <CJK */
-MAP(0x6F, 0x7A, 0x964F) /* <CJK */
-MAP(0x6F, 0x7B, 0x964B) /* <CJK */
-MAP(0x6F, 0x7C, 0x9677) /* <CJK */
-MAP(0x6F, 0x7D, 0x965C) /* <CJK */
-MAP(0x6F, 0x7E, 0x965E) /* <CJK */
-MAP(0x70, 0x21, 0x965D) /* <CJK */
-MAP(0x70, 0x22, 0x965F) /* <CJK */
-MAP(0x70, 0x23, 0x9666) /* <CJK */
-MAP(0x70, 0x24, 0x9672) /* <CJK */
-MAP(0x70, 0x25, 0x966C) /* <CJK */
-MAP(0x70, 0x26, 0x968D) /* <CJK */
-MAP(0x70, 0x27, 0x9698) /* <CJK */
-MAP(0x70, 0x28, 0x9695) /* <CJK */
-MAP(0x70, 0x29, 0x9697) /* <CJK */
-MAP(0x70, 0x2A, 0x96AA) /* <CJK */
-MAP(0x70, 0x2B, 0x96A7) /* <CJK */
-MAP(0x70, 0x2C, 0x96B1) /* <CJK */
-MAP(0x70, 0x2D, 0x96B2) /* <CJK */
-MAP(0x70, 0x2E, 0x96B0) /* <CJK */
-MAP(0x70, 0x2F, 0x96B4) /* <CJK */
-MAP(0x70, 0x30, 0x96B6) /* <CJK */
-MAP(0x70, 0x31, 0x96B8) /* <CJK */
-MAP(0x70, 0x32, 0x96B9) /* <CJK */
-MAP(0x70, 0x33, 0x96CE) /* <CJK */
-MAP(0x70, 0x34, 0x96CB) /* <CJK */
-MAP(0x70, 0x35, 0x96C9) /* <CJK */
-MAP(0x70, 0x36, 0x96CD) /* <CJK */
-MAP(0x70, 0x37, 0x894D) /* <CJK */
-MAP(0x70, 0x38, 0x96DC) /* <CJK */
-MAP(0x70, 0x39, 0x970D) /* <CJK */
-MAP(0x70, 0x3A, 0x96D5) /* <CJK */
-MAP(0x70, 0x3B, 0x96F9) /* <CJK */
-MAP(0x70, 0x3C, 0x9704) /* <CJK */
-MAP(0x70, 0x3D, 0x9706) /* <CJK */
-MAP(0x70, 0x3E, 0x9708) /* <CJK */
-MAP(0x70, 0x3F, 0x9713) /* <CJK */
-MAP(0x70, 0x40, 0x970E) /* <CJK */
-MAP(0x70, 0x41, 0x9711) /* <CJK */
-MAP(0x70, 0x42, 0x970F) /* <CJK */
-MAP(0x70, 0x43, 0x9716) /* <CJK */
-MAP(0x70, 0x44, 0x9719) /* <CJK */
-MAP(0x70, 0x45, 0x9724) /* <CJK */
-MAP(0x70, 0x46, 0x972A) /* <CJK */
-MAP(0x70, 0x47, 0x9730) /* <CJK */
-MAP(0x70, 0x48, 0x9739) /* <CJK */
-MAP(0x70, 0x49, 0x973D) /* <CJK */
-MAP(0x70, 0x4A, 0x973E) /* <CJK */
-MAP(0x70, 0x4B, 0x9744) /* <CJK */
-MAP(0x70, 0x4C, 0x9746) /* <CJK */
-MAP(0x70, 0x4D, 0x9748) /* <CJK */
-MAP(0x70, 0x4E, 0x9742) /* <CJK */
-MAP(0x70, 0x4F, 0x9749) /* <CJK */
-MAP(0x70, 0x50, 0x975C) /* <CJK */
-MAP(0x70, 0x51, 0x9760) /* <CJK */
-MAP(0x70, 0x52, 0x9764) /* <CJK */
-MAP(0x70, 0x53, 0x9766) /* <CJK */
-MAP(0x70, 0x54, 0x9768) /* <CJK */
-MAP(0x70, 0x55, 0x52D2) /* <CJK */
-MAP(0x70, 0x56, 0x976B) /* <CJK */
-MAP(0x70, 0x57, 0x9771) /* <CJK */
-MAP(0x70, 0x58, 0x9779) /* <CJK */
-MAP(0x70, 0x59, 0x9785) /* <CJK */
-MAP(0x70, 0x5A, 0x977C) /* <CJK */
-MAP(0x70, 0x5B, 0x9781) /* <CJK */
-MAP(0x70, 0x5C, 0x977A) /* <CJK */
-MAP(0x70, 0x5D, 0x9786) /* <CJK */
-MAP(0x70, 0x5E, 0x978B) /* <CJK */
-MAP(0x70, 0x5F, 0x978F) /* <CJK */
-MAP(0x70, 0x60, 0x9790) /* <CJK */
-MAP(0x70, 0x61, 0x979C) /* <CJK */
-MAP(0x70, 0x62, 0x97A8) /* <CJK */
-MAP(0x70, 0x63, 0x97A6) /* <CJK */
-MAP(0x70, 0x64, 0x97A3) /* <CJK */
-MAP(0x70, 0x65, 0x97B3) /* <CJK */
-MAP(0x70, 0x66, 0x97B4) /* <CJK */
-MAP(0x70, 0x67, 0x97C3) /* <CJK */
-MAP(0x70, 0x68, 0x97C6) /* <CJK */
-MAP(0x70, 0x69, 0x97C8) /* <CJK */
-MAP(0x70, 0x6A, 0x97CB) /* <CJK */
-MAP(0x70, 0x6B, 0x97DC) /* <CJK */
-MAP(0x70, 0x6C, 0x97ED) /* <CJK */
-MAP(0x70, 0x6D, 0x9F4F) /* <CJK */
-MAP(0x70, 0x6E, 0x97F2) /* <CJK */
-MAP(0x70, 0x6F, 0x7ADF) /* <CJK */
-MAP(0x70, 0x70, 0x97F6) /* <CJK */
-MAP(0x70, 0x71, 0x97F5) /* <CJK */
-MAP(0x70, 0x72, 0x980F) /* <CJK */
-MAP(0x70, 0x73, 0x980C) /* <CJK */
-MAP(0x70, 0x74, 0x9838) /* <CJK */
-MAP(0x70, 0x75, 0x9824) /* <CJK */
-MAP(0x70, 0x76, 0x9821) /* <CJK */
-MAP(0x70, 0x77, 0x9837) /* <CJK */
-MAP(0x70, 0x78, 0x983D) /* <CJK */
-MAP(0x70, 0x79, 0x9846) /* <CJK */
-MAP(0x70, 0x7A, 0x984F) /* <CJK */
-MAP(0x70, 0x7B, 0x984B) /* <CJK */
-MAP(0x70, 0x7C, 0x986B) /* <CJK */
-MAP(0x70, 0x7D, 0x986F) /* <CJK */
-MAP(0x70, 0x7E, 0x9870) /* <CJK */
-MAP(0x71, 0x21, 0x9871) /* <CJK */
-MAP(0x71, 0x22, 0x9874) /* <CJK */
-MAP(0x71, 0x23, 0x9873) /* <CJK */
-MAP(0x71, 0x24, 0x98AA) /* <CJK */
-MAP(0x71, 0x25, 0x98AF) /* <CJK */
-MAP(0x71, 0x26, 0x98B1) /* <CJK */
-MAP(0x71, 0x27, 0x98B6) /* <CJK */
-MAP(0x71, 0x28, 0x98C4) /* <CJK */
-MAP(0x71, 0x29, 0x98C3) /* <CJK */
-MAP(0x71, 0x2A, 0x98C6) /* <CJK */
-MAP(0x71, 0x2B, 0x98E9) /* <CJK */
-MAP(0x71, 0x2C, 0x98EB) /* <CJK */
-MAP(0x71, 0x2D, 0x9903) /* <CJK */
-MAP(0x71, 0x2E, 0x9909) /* <CJK */
-MAP(0x71, 0x2F, 0x9912) /* <CJK */
-MAP(0x71, 0x30, 0x9914) /* <CJK */
-MAP(0x71, 0x31, 0x9918) /* <CJK */
-MAP(0x71, 0x32, 0x9921) /* <CJK */
-MAP(0x71, 0x33, 0x991D) /* <CJK */
-MAP(0x71, 0x34, 0x991E) /* <CJK */
-MAP(0x71, 0x35, 0x9924) /* <CJK */
-MAP(0x71, 0x36, 0x9920) /* <CJK */
-MAP(0x71, 0x37, 0x992C) /* <CJK */
-MAP(0x71, 0x38, 0x992E) /* <CJK */
-MAP(0x71, 0x39, 0x993D) /* <CJK */
-MAP(0x71, 0x3A, 0x993E) /* <CJK */
-MAP(0x71, 0x3B, 0x9942) /* <CJK */
-MAP(0x71, 0x3C, 0x9949) /* <CJK */
-MAP(0x71, 0x3D, 0x9945) /* <CJK */
-MAP(0x71, 0x3E, 0x9950) /* <CJK */
-MAP(0x71, 0x3F, 0x994B) /* <CJK */
-MAP(0x71, 0x40, 0x9951) /* <CJK */
-MAP(0x71, 0x41, 0x9952) /* <CJK */
-MAP(0x71, 0x42, 0x994C) /* <CJK */
-MAP(0x71, 0x43, 0x9955) /* <CJK */
-MAP(0x71, 0x44, 0x9997) /* <CJK */
-MAP(0x71, 0x45, 0x9998) /* <CJK */
-MAP(0x71, 0x46, 0x99A5) /* <CJK */
-MAP(0x71, 0x47, 0x99AD) /* <CJK */
-MAP(0x71, 0x48, 0x99AE) /* <CJK */
-MAP(0x71, 0x49, 0x99BC) /* <CJK */
-MAP(0x71, 0x4A, 0x99DF) /* <CJK */
-MAP(0x71, 0x4B, 0x99DB) /* <CJK */
-MAP(0x71, 0x4C, 0x99DD) /* <CJK */
-MAP(0x71, 0x4D, 0x99D8) /* <CJK */
-MAP(0x71, 0x4E, 0x99D1) /* <CJK */
-MAP(0x71, 0x4F, 0x99ED) /* <CJK */
-MAP(0x71, 0x50, 0x99EE) /* <CJK */
-MAP(0x71, 0x51, 0x99F1) /* <CJK */
-MAP(0x71, 0x52, 0x99F2) /* <CJK */
-MAP(0x71, 0x53, 0x99FB) /* <CJK */
-MAP(0x71, 0x54, 0x99F8) /* <CJK */
-MAP(0x71, 0x55, 0x9A01) /* <CJK */
-MAP(0x71, 0x56, 0x9A0F) /* <CJK */
-MAP(0x71, 0x57, 0x9A05) /* <CJK */
-MAP(0x71, 0x58, 0x99E2) /* <CJK */
-MAP(0x71, 0x59, 0x9A19) /* <CJK */
-MAP(0x71, 0x5A, 0x9A2B) /* <CJK */
-MAP(0x71, 0x5B, 0x9A37) /* <CJK */
-MAP(0x71, 0x5C, 0x9A45) /* <CJK */
-MAP(0x71, 0x5D, 0x9A42) /* <CJK */
-MAP(0x71, 0x5E, 0x9A40) /* <CJK */
-MAP(0x71, 0x5F, 0x9A43) /* <CJK */
-MAP(0x71, 0x60, 0x9A3E) /* <CJK */
-MAP(0x71, 0x61, 0x9A55) /* <CJK */
-MAP(0x71, 0x62, 0x9A4D) /* <CJK */
-MAP(0x71, 0x63, 0x9A5B) /* <CJK */
-MAP(0x71, 0x64, 0x9A57) /* <CJK */
-MAP(0x71, 0x65, 0x9A5F) /* <CJK */
-MAP(0x71, 0x66, 0x9A62) /* <CJK */
-MAP(0x71, 0x67, 0x9A65) /* <CJK */
-MAP(0x71, 0x68, 0x9A64) /* <CJK */
-MAP(0x71, 0x69, 0x9A69) /* <CJK */
-MAP(0x71, 0x6A, 0x9A6B) /* <CJK */
-MAP(0x71, 0x6B, 0x9A6A) /* <CJK */
-MAP(0x71, 0x6C, 0x9AAD) /* <CJK */
-MAP(0x71, 0x6D, 0x9AB0) /* <CJK */
-MAP(0x71, 0x6E, 0x9ABC) /* <CJK */
-MAP(0x71, 0x6F, 0x9AC0) /* <CJK */
-MAP(0x71, 0x70, 0x9ACF) /* <CJK */
-MAP(0x71, 0x71, 0x9AD1) /* <CJK */
-MAP(0x71, 0x72, 0x9AD3) /* <CJK */
-MAP(0x71, 0x73, 0x9AD4) /* <CJK */
-MAP(0x71, 0x74, 0x9ADE) /* <CJK */
-MAP(0x71, 0x75, 0x9ADF) /* <CJK */
-MAP(0x71, 0x76, 0x9AE2) /* <CJK */
-MAP(0x71, 0x77, 0x9AE3) /* <CJK */
-MAP(0x71, 0x78, 0x9AE6) /* <CJK */
-MAP(0x71, 0x79, 0x9AEF) /* <CJK */
-MAP(0x71, 0x7A, 0x9AEB) /* <CJK */
-MAP(0x71, 0x7B, 0x9AEE) /* <CJK */
-MAP(0x71, 0x7C, 0x9AF4) /* <CJK */
-MAP(0x71, 0x7D, 0x9AF1) /* <CJK */
-MAP(0x71, 0x7E, 0x9AF7) /* <CJK */
-MAP(0x72, 0x21, 0x9AFB) /* <CJK */
-MAP(0x72, 0x22, 0x9B06) /* <CJK */
-MAP(0x72, 0x23, 0x9B18) /* <CJK */
-MAP(0x72, 0x24, 0x9B1A) /* <CJK */
-MAP(0x72, 0x25, 0x9B1F) /* <CJK */
-MAP(0x72, 0x26, 0x9B22) /* <CJK */
-MAP(0x72, 0x27, 0x9B23) /* <CJK */
-MAP(0x72, 0x28, 0x9B25) /* <CJK */
-MAP(0x72, 0x29, 0x9B27) /* <CJK */
-MAP(0x72, 0x2A, 0x9B28) /* <CJK */
-MAP(0x72, 0x2B, 0x9B29) /* <CJK */
-MAP(0x72, 0x2C, 0x9B2A) /* <CJK */
-MAP(0x72, 0x2D, 0x9B2E) /* <CJK */
-MAP(0x72, 0x2E, 0x9B2F) /* <CJK */
-MAP(0x72, 0x2F, 0x9B32) /* <CJK */
-MAP(0x72, 0x30, 0x9B44) /* <CJK */
-MAP(0x72, 0x31, 0x9B43) /* <CJK */
-MAP(0x72, 0x32, 0x9B4F) /* <CJK */
-MAP(0x72, 0x33, 0x9B4D) /* <CJK */
-MAP(0x72, 0x34, 0x9B4E) /* <CJK */
-MAP(0x72, 0x35, 0x9B51) /* <CJK */
-MAP(0x72, 0x36, 0x9B58) /* <CJK */
-MAP(0x72, 0x37, 0x9B74) /* <CJK */
-MAP(0x72, 0x38, 0x9B93) /* <CJK */
-MAP(0x72, 0x39, 0x9B83) /* <CJK */
-MAP(0x72, 0x3A, 0x9B91) /* <CJK */
-MAP(0x72, 0x3B, 0x9B96) /* <CJK */
-MAP(0x72, 0x3C, 0x9B97) /* <CJK */
-MAP(0x72, 0x3D, 0x9B9F) /* <CJK */
-MAP(0x72, 0x3E, 0x9BA0) /* <CJK */
-MAP(0x72, 0x3F, 0x9BA8) /* <CJK */
-MAP(0x72, 0x40, 0x9BB4) /* <CJK */
-MAP(0x72, 0x41, 0x9BC0) /* <CJK */
-MAP(0x72, 0x42, 0x9BCA) /* <CJK */
-MAP(0x72, 0x43, 0x9BB9) /* <CJK */
-MAP(0x72, 0x44, 0x9BC6) /* <CJK */
-MAP(0x72, 0x45, 0x9BCF) /* <CJK */
-MAP(0x72, 0x46, 0x9BD1) /* <CJK */
-MAP(0x72, 0x47, 0x9BD2) /* <CJK */
-MAP(0x72, 0x48, 0x9BE3) /* <CJK */
-MAP(0x72, 0x49, 0x9BE2) /* <CJK */
-MAP(0x72, 0x4A, 0x9BE4) /* <CJK */
-MAP(0x72, 0x4B, 0x9BD4) /* <CJK */
-MAP(0x72, 0x4C, 0x9BE1) /* <CJK */
-MAP(0x72, 0x4D, 0x9C3A) /* <CJK */
-MAP(0x72, 0x4E, 0x9BF2) /* <CJK */
-MAP(0x72, 0x4F, 0x9BF1) /* <CJK */
-MAP(0x72, 0x50, 0x9BF0) /* <CJK */
-MAP(0x72, 0x51, 0x9C15) /* <CJK */
-MAP(0x72, 0x52, 0x9C14) /* <CJK */
-MAP(0x72, 0x53, 0x9C09) /* <CJK */
-MAP(0x72, 0x54, 0x9C13) /* <CJK */
-MAP(0x72, 0x55, 0x9C0C) /* <CJK */
-MAP(0x72, 0x56, 0x9C06) /* <CJK */
-MAP(0x72, 0x57, 0x9C08) /* <CJK */
-MAP(0x72, 0x58, 0x9C12) /* <CJK */
-MAP(0x72, 0x59, 0x9C0A) /* <CJK */
-MAP(0x72, 0x5A, 0x9C04) /* <CJK */
-MAP(0x72, 0x5B, 0x9C2E) /* <CJK */
-MAP(0x72, 0x5C, 0x9C1B) /* <CJK */
-MAP(0x72, 0x5D, 0x9C25) /* <CJK */
-MAP(0x72, 0x5E, 0x9C24) /* <CJK */
-MAP(0x72, 0x5F, 0x9C21) /* <CJK */
-MAP(0x72, 0x60, 0x9C30) /* <CJK */
-MAP(0x72, 0x61, 0x9C47) /* <CJK */
-MAP(0x72, 0x62, 0x9C32) /* <CJK */
-MAP(0x72, 0x63, 0x9C46) /* <CJK */
-MAP(0x72, 0x64, 0x9C3E) /* <CJK */
-MAP(0x72, 0x65, 0x9C5A) /* <CJK */
-MAP(0x72, 0x66, 0x9C60) /* <CJK */
-MAP(0x72, 0x67, 0x9C67) /* <CJK */
-MAP(0x72, 0x68, 0x9C76) /* <CJK */
-MAP(0x72, 0x69, 0x9C78) /* <CJK */
-MAP(0x72, 0x6A, 0x9CE7) /* <CJK */
-MAP(0x72, 0x6B, 0x9CEC) /* <CJK */
-MAP(0x72, 0x6C, 0x9CF0) /* <CJK */
-MAP(0x72, 0x6D, 0x9D09) /* <CJK */
-MAP(0x72, 0x6E, 0x9D08) /* <CJK */
-MAP(0x72, 0x6F, 0x9CEB) /* <CJK */
-MAP(0x72, 0x70, 0x9D03) /* <CJK */
-MAP(0x72, 0x71, 0x9D06) /* <CJK */
-MAP(0x72, 0x72, 0x9D2A) /* <CJK */
-MAP(0x72, 0x73, 0x9D26) /* <CJK */
-MAP(0x72, 0x74, 0x9DAF) /* <CJK */
-MAP(0x72, 0x75, 0x9D23) /* <CJK */
-MAP(0x72, 0x76, 0x9D1F) /* <CJK */
-MAP(0x72, 0x77, 0x9D44) /* <CJK */
-MAP(0x72, 0x78, 0x9D15) /* <CJK */
-MAP(0x72, 0x79, 0x9D12) /* <CJK */
-MAP(0x72, 0x7A, 0x9D41) /* <CJK */
-MAP(0x72, 0x7B, 0x9D3F) /* <CJK */
-MAP(0x72, 0x7C, 0x9D3E) /* <CJK */
-MAP(0x72, 0x7D, 0x9D46) /* <CJK */
-MAP(0x72, 0x7E, 0x9D48) /* <CJK */
-MAP(0x73, 0x21, 0x9D5D) /* <CJK */
-MAP(0x73, 0x22, 0x9D5E) /* <CJK */
-MAP(0x73, 0x23, 0x9D64) /* <CJK */
-MAP(0x73, 0x24, 0x9D51) /* <CJK */
-MAP(0x73, 0x25, 0x9D50) /* <CJK */
-MAP(0x73, 0x26, 0x9D59) /* <CJK */
-MAP(0x73, 0x27, 0x9D72) /* <CJK */
-MAP(0x73, 0x28, 0x9D89) /* <CJK */
-MAP(0x73, 0x29, 0x9D87) /* <CJK */
-MAP(0x73, 0x2A, 0x9DAB) /* <CJK */
-MAP(0x73, 0x2B, 0x9D6F) /* <CJK */
-MAP(0x73, 0x2C, 0x9D7A) /* <CJK */
-MAP(0x73, 0x2D, 0x9D9A) /* <CJK */
-MAP(0x73, 0x2E, 0x9DA4) /* <CJK */
-MAP(0x73, 0x2F, 0x9DA9) /* <CJK */
-MAP(0x73, 0x30, 0x9DB2) /* <CJK */
-MAP(0x73, 0x31, 0x9DC4) /* <CJK */
-MAP(0x73, 0x32, 0x9DC1) /* <CJK */
-MAP(0x73, 0x33, 0x9DBB) /* <CJK */
-MAP(0x73, 0x34, 0x9DB8) /* <CJK */
-MAP(0x73, 0x35, 0x9DBA) /* <CJK */
-MAP(0x73, 0x36, 0x9DC6) /* <CJK */
-MAP(0x73, 0x37, 0x9DCF) /* <CJK */
-MAP(0x73, 0x38, 0x9DC2) /* <CJK */
-MAP(0x73, 0x39, 0x9DD9) /* <CJK */
-MAP(0x73, 0x3A, 0x9DD3) /* <CJK */
-MAP(0x73, 0x3B, 0x9DF8) /* <CJK */
-MAP(0x73, 0x3C, 0x9DE6) /* <CJK */
-MAP(0x73, 0x3D, 0x9DED) /* <CJK */
-MAP(0x73, 0x3E, 0x9DEF) /* <CJK */
-MAP(0x73, 0x3F, 0x9DFD) /* <CJK */
-MAP(0x73, 0x40, 0x9E1A) /* <CJK */
-MAP(0x73, 0x41, 0x9E1B) /* <CJK */
-MAP(0x73, 0x42, 0x9E1E) /* <CJK */
-MAP(0x73, 0x43, 0x9E75) /* <CJK */
-MAP(0x73, 0x44, 0x9E79) /* <CJK */
-MAP(0x73, 0x45, 0x9E7D) /* <CJK */
-MAP(0x73, 0x46, 0x9E81) /* <CJK */
-MAP(0x73, 0x47, 0x9E88) /* <CJK */
-MAP(0x73, 0x48, 0x9E8B) /* <CJK */
-MAP(0x73, 0x49, 0x9E8C) /* <CJK */
-MAP(0x73, 0x4A, 0x9E92) /* <CJK */
-MAP(0x73, 0x4B, 0x9E95) /* <CJK */
-MAP(0x73, 0x4C, 0x9E91) /* <CJK */
-MAP(0x73, 0x4D, 0x9E9D) /* <CJK */
-MAP(0x73, 0x4E, 0x9EA5) /* <CJK */
-MAP(0x73, 0x4F, 0x9EA9) /* <CJK */
-MAP(0x73, 0x50, 0x9EB8) /* <CJK */
-MAP(0x73, 0x51, 0x9EAA) /* <CJK */
-MAP(0x73, 0x52, 0x9EAD) /* <CJK */
-MAP(0x73, 0x53, 0x9761) /* <CJK */
-MAP(0x73, 0x54, 0x9ECC) /* <CJK */
-MAP(0x73, 0x55, 0x9ECE) /* <CJK */
-MAP(0x73, 0x56, 0x9ECF) /* <CJK */
-MAP(0x73, 0x57, 0x9ED0) /* <CJK */
-MAP(0x73, 0x58, 0x9ED4) /* <CJK */
-MAP(0x73, 0x59, 0x9EDC) /* <CJK */
-MAP(0x73, 0x5A, 0x9EDE) /* <CJK */
-MAP(0x73, 0x5B, 0x9EDD) /* <CJK */
-MAP(0x73, 0x5C, 0x9EE0) /* <CJK */
-MAP(0x73, 0x5D, 0x9EE5) /* <CJK */
-MAP(0x73, 0x5E, 0x9EE8) /* <CJK */
-MAP(0x73, 0x5F, 0x9EEF) /* <CJK */
-MAP(0x73, 0x60, 0x9EF4) /* <CJK */
-MAP(0x73, 0x61, 0x9EF6) /* <CJK */
-MAP(0x73, 0x62, 0x9EF7) /* <CJK */
-MAP(0x73, 0x63, 0x9EF9) /* <CJK */
-MAP(0x73, 0x64, 0x9EFB) /* <CJK */
-MAP(0x73, 0x65, 0x9EFC) /* <CJK */
-MAP(0x73, 0x66, 0x9EFD) /* <CJK */
-MAP(0x73, 0x67, 0x9F07) /* <CJK */
-MAP(0x73, 0x68, 0x9F08) /* <CJK */
-MAP(0x73, 0x69, 0x76B7) /* <CJK */
-MAP(0x73, 0x6A, 0x9F15) /* <CJK */
-MAP(0x73, 0x6B, 0x9F21) /* <CJK */
-MAP(0x73, 0x6C, 0x9F2C) /* <CJK */
-MAP(0x73, 0x6D, 0x9F3E) /* <CJK */
-MAP(0x73, 0x6E, 0x9F4A) /* <CJK */
-MAP(0x73, 0x6F, 0x9F52) /* <CJK */
-MAP(0x73, 0x70, 0x9F54) /* <CJK */
-MAP(0x73, 0x71, 0x9F63) /* <CJK */
-MAP(0x73, 0x72, 0x9F5F) /* <CJK */
-MAP(0x73, 0x73, 0x9F60) /* <CJK */
-MAP(0x73, 0x74, 0x9F61) /* <CJK */
-MAP(0x73, 0x75, 0x9F66) /* <CJK */
-MAP(0x73, 0x76, 0x9F67) /* <CJK */
-MAP(0x73, 0x77, 0x9F6C) /* <CJK */
-MAP(0x73, 0x78, 0x9F6A) /* <CJK */
-MAP(0x73, 0x79, 0x9F77) /* <CJK */
-MAP(0x73, 0x7A, 0x9F72) /* <CJK */
-MAP(0x73, 0x7B, 0x9F76) /* <CJK */
-MAP(0x73, 0x7C, 0x9F95) /* <CJK */
-MAP(0x73, 0x7D, 0x9F9C) /* <CJK */
-MAP(0x73, 0x7E, 0x9FA0) /* <CJK */
-MAP(0x74, 0x21, 0x582F) /* <CJK */
-MAP(0x74, 0x22, 0x69C7) /* <CJK */
-MAP(0x74, 0x23, 0x9059) /* <CJK */
-MAP(0x74, 0x24, 0x7464) /* <CJK */
-MAP(0x74, 0x25, 0x51DC) /* <CJK */
-MAP(0x74, 0x26, 0x7199) /* <CJK */
+/* This file is automatically generated from Unicode tables */
+MAP(0x21, 0x21, 0x3000) /* IDEOGRAPHIC SPACE */
+MAP(0x21, 0x22, 0x3001) /* IDEOGRAPHIC COMMA */
+MAP(0x21, 0x23, 0x3002) /* IDEOGRAPHIC FULL STOP */
+MAP(0x21, 0x24, 0xFF0C) /* FULLWIDTH COMMA */
+MAP(0x21, 0x25, 0xFF0E) /* FULLWIDTH FULL STOP */
+MAP(0x21, 0x26, 0x30FB) /* KATAKANA MIDDLE DOT */
+MAP(0x21, 0x27, 0xFF1A) /* FULLWIDTH COLON */
+MAP(0x21, 0x28, 0xFF1B) /* FULLWIDTH SEMICOLON */
+MAP(0x21, 0x29, 0xFF1F) /* FULLWIDTH QUESTION MARK */
+MAP(0x21, 0x2A, 0xFF01) /* FULLWIDTH EXCLAMATION MARK */
+MAP(0x21, 0x2B, 0x309B) /* KATAKANA-HIRAGANA VOICED SOUND MARK */
+MAP(0x21, 0x2C, 0x309C) /* KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK */
+MAP(0x21, 0x2D, 0x00B4) /* ACUTE ACCENT */
+MAP(0x21, 0x2E, 0xFF40) /* FULLWIDTH GRAVE ACCENT */
+MAP(0x21, 0x2F, 0x00A8) /* DIAERESIS */
+MAP(0x21, 0x30, 0xFF3E) /* FULLWIDTH CIRCUMFLEX ACCENT */
+MAP(0x21, 0x31, 0xFFE3) /* FULLWIDTH MACRON */
+MAP(0x21, 0x32, 0xFF3F) /* FULLWIDTH LOW LINE */
+MAP(0x21, 0x33, 0x30FD) /* KATAKANA ITERATION MARK */
+MAP(0x21, 0x34, 0x30FE) /* KATAKANA VOICED ITERATION MARK */
+MAP(0x21, 0x35, 0x309D) /* HIRAGANA ITERATION MARK */
+MAP(0x21, 0x36, 0x309E) /* HIRAGANA VOICED ITERATION MARK */
+MAP(0x21, 0x37, 0x3003) /* DITTO MARK */
+MAP(0x21, 0x38, 0x4EDD) /* <CJK> */
+MAP(0x21, 0x39, 0x3005) /* IDEOGRAPHIC ITERATION MARK */
+MAP(0x21, 0x3A, 0x3006) /* IDEOGRAPHIC CLOSING MARK */
+MAP(0x21, 0x3B, 0x3007) /* IDEOGRAPHIC NUMBER ZERO */
+MAP(0x21, 0x3C, 0x30FC) /* KATAKANA-HIRAGANA PROLONGED SOUND MARK */
+MAP(0x21, 0x3D, 0x2015) /* HORIZONTAL BAR */
+MAP(0x21, 0x3E, 0x2010) /* HYPHEN */
+MAP(0x21, 0x3F, 0xFF0F) /* FULLWIDTH SOLIDUS */
+MAP(0x21, 0x40, 0x005C) /* REVERSE SOLIDUS */
+MAP(0x21, 0x41, 0x301C) /* WAVE DASH */
+MAP(0x21, 0x42, 0x2016) /* DOUBLE VERTICAL LINE */
+MAP(0x21, 0x43, 0xFF5C) /* FULLWIDTH VERTICAL LINE */
+MAP(0x21, 0x44, 0x2026) /* HORIZONTAL ELLIPSIS */
+MAP(0x21, 0x45, 0x2025) /* TWO DOT LEADER */
+MAP(0x21, 0x46, 0x2018) /* LEFT SINGLE QUOTATION MARK */
+MAP(0x21, 0x47, 0x2019) /* RIGHT SINGLE QUOTATION MARK */
+MAP(0x21, 0x48, 0x201C) /* LEFT DOUBLE QUOTATION MARK */
+MAP(0x21, 0x49, 0x201D) /* RIGHT DOUBLE QUOTATION MARK */
+MAP(0x21, 0x4A, 0xFF08) /* FULLWIDTH LEFT PARENTHESIS */
+MAP(0x21, 0x4B, 0xFF09) /* FULLWIDTH RIGHT PARENTHESIS */
+MAP(0x21, 0x4C, 0x3014) /* LEFT TORTOISE SHELL BRACKET */
+MAP(0x21, 0x4D, 0x3015) /* RIGHT TORTOISE SHELL BRACKET */
+MAP(0x21, 0x4E, 0xFF3B) /* FULLWIDTH LEFT SQUARE BRACKET */
+MAP(0x21, 0x4F, 0xFF3D) /* FULLWIDTH RIGHT SQUARE BRACKET */
+MAP(0x21, 0x50, 0xFF5B) /* FULLWIDTH LEFT CURLY BRACKET */
+MAP(0x21, 0x51, 0xFF5D) /* FULLWIDTH RIGHT CURLY BRACKET */
+MAP(0x21, 0x52, 0x3008) /* LEFT ANGLE BRACKET */
+MAP(0x21, 0x53, 0x3009) /* RIGHT ANGLE BRACKET */
+MAP(0x21, 0x54, 0x300A) /* LEFT DOUBLE ANGLE BRACKET */
+MAP(0x21, 0x55, 0x300B) /* RIGHT DOUBLE ANGLE BRACKET */
+MAP(0x21, 0x56, 0x300C) /* LEFT CORNER BRACKET */
+MAP(0x21, 0x57, 0x300D) /* RIGHT CORNER BRACKET */
+MAP(0x21, 0x58, 0x300E) /* LEFT WHITE CORNER BRACKET */
+MAP(0x21, 0x59, 0x300F) /* RIGHT WHITE CORNER BRACKET */
+MAP(0x21, 0x5A, 0x3010) /* LEFT BLACK LENTICULAR BRACKET */
+MAP(0x21, 0x5B, 0x3011) /* RIGHT BLACK LENTICULAR BRACKET */
+MAP(0x21, 0x5C, 0xFF0B) /* FULLWIDTH PLUS SIGN */
+MAP(0x21, 0x5D, 0x2212) /* MINUS SIGN */
+MAP(0x21, 0x5E, 0x00B1) /* PLUS-MINUS SIGN */
+MAP(0x21, 0x5F, 0x00D7) /* MULTIPLICATION SIGN */
+MAP(0x21, 0x60, 0x00F7) /* DIVISION SIGN */
+MAP(0x21, 0x61, 0xFF1D) /* FULLWIDTH EQUALS SIGN */
+MAP(0x21, 0x62, 0x2260) /* NOT EQUAL TO */
+MAP(0x21, 0x63, 0xFF1C) /* FULLWIDTH LESS-THAN SIGN */
+MAP(0x21, 0x64, 0xFF1E) /* FULLWIDTH GREATER-THAN SIGN */
+MAP(0x21, 0x65, 0x2266) /* LESS-THAN OVER EQUAL TO */
+MAP(0x21, 0x66, 0x2267) /* GREATER-THAN OVER EQUAL TO */
+MAP(0x21, 0x67, 0x221E) /* INFINITY */
+MAP(0x21, 0x68, 0x2234) /* THEREFORE */
+MAP(0x21, 0x69, 0x2642) /* MALE SIGN */
+MAP(0x21, 0x6A, 0x2640) /* FEMALE SIGN */
+MAP(0x21, 0x6B, 0x00B0) /* DEGREE SIGN */
+MAP(0x21, 0x6C, 0x2032) /* PRIME */
+MAP(0x21, 0x6D, 0x2033) /* DOUBLE PRIME */
+MAP(0x21, 0x6E, 0x2103) /* DEGREE CELSIUS */
+MAP(0x21, 0x6F, 0xFFE5) /* FULLWIDTH YEN SIGN */
+MAP(0x21, 0x70, 0xFF04) /* FULLWIDTH DOLLAR SIGN */
+MAP(0x21, 0x71, 0x00A2) /* CENT SIGN */
+MAP(0x21, 0x72, 0x00A3) /* POUND SIGN */
+MAP(0x21, 0x73, 0xFF05) /* FULLWIDTH PERCENT SIGN */
+MAP(0x21, 0x74, 0xFF03) /* FULLWIDTH NUMBER SIGN */
+MAP(0x21, 0x75, 0xFF06) /* FULLWIDTH AMPERSAND */
+MAP(0x21, 0x76, 0xFF0A) /* FULLWIDTH ASTERISK */
+MAP(0x21, 0x77, 0xFF20) /* FULLWIDTH COMMERCIAL AT */
+MAP(0x21, 0x78, 0x00A7) /* SECTION SIGN */
+MAP(0x21, 0x79, 0x2606) /* WHITE STAR */
+MAP(0x21, 0x7A, 0x2605) /* BLACK STAR */
+MAP(0x21, 0x7B, 0x25CB) /* WHITE CIRCLE */
+MAP(0x21, 0x7C, 0x25CF) /* BLACK CIRCLE */
+MAP(0x21, 0x7D, 0x25CE) /* BULLSEYE */
+MAP(0x21, 0x7E, 0x25C7) /* WHITE DIAMOND */
+MAP(0x22, 0x21, 0x25C6) /* BLACK DIAMOND */
+MAP(0x22, 0x22, 0x25A1) /* WHITE SQUARE */
+MAP(0x22, 0x23, 0x25A0) /* BLACK SQUARE */
+MAP(0x22, 0x24, 0x25B3) /* WHITE UP-POINTING TRIANGLE */
+MAP(0x22, 0x25, 0x25B2) /* BLACK UP-POINTING TRIANGLE */
+MAP(0x22, 0x26, 0x25BD) /* WHITE DOWN-POINTING TRIANGLE */
+MAP(0x22, 0x27, 0x25BC) /* BLACK DOWN-POINTING TRIANGLE */
+MAP(0x22, 0x28, 0x203B) /* REFERENCE MARK */
+MAP(0x22, 0x29, 0x3012) /* POSTAL MARK */
+MAP(0x22, 0x2A, 0x2192) /* RIGHTWARDS ARROW */
+MAP(0x22, 0x2B, 0x2190) /* LEFTWARDS ARROW */
+MAP(0x22, 0x2C, 0x2191) /* UPWARDS ARROW */
+MAP(0x22, 0x2D, 0x2193) /* DOWNWARDS ARROW */
+MAP(0x22, 0x2E, 0x3013) /* GETA MARK */
+MAP(0x22, 0x3A, 0x2208) /* ELEMENT OF */
+MAP(0x22, 0x3B, 0x220B) /* CONTAINS AS MEMBER */
+MAP(0x22, 0x3C, 0x2286) /* SUBSET OF OR EQUAL TO */
+MAP(0x22, 0x3D, 0x2287) /* SUPERSET OF OR EQUAL TO */
+MAP(0x22, 0x3E, 0x2282) /* SUBSET OF */
+MAP(0x22, 0x3F, 0x2283) /* SUPERSET OF */
+MAP(0x22, 0x40, 0x222A) /* UNION */
+MAP(0x22, 0x41, 0x2229) /* INTERSECTION */
+MAP(0x22, 0x4A, 0x2227) /* LOGICAL AND */
+MAP(0x22, 0x4B, 0x2228) /* LOGICAL OR */
+MAP(0x22, 0x4C, 0x00AC) /* NOT SIGN */
+MAP(0x22, 0x4D, 0x21D2) /* RIGHTWARDS DOUBLE ARROW */
+MAP(0x22, 0x4E, 0x21D4) /* LEFT RIGHT DOUBLE ARROW */
+MAP(0x22, 0x4F, 0x2200) /* FOR ALL */
+MAP(0x22, 0x50, 0x2203) /* THERE EXISTS */
+MAP(0x22, 0x5C, 0x2220) /* ANGLE */
+MAP(0x22, 0x5D, 0x22A5) /* UP TACK */
+MAP(0x22, 0x5E, 0x2312) /* ARC */
+MAP(0x22, 0x5F, 0x2202) /* PARTIAL DIFFERENTIAL */
+MAP(0x22, 0x60, 0x2207) /* NABLA */
+MAP(0x22, 0x61, 0x2261) /* IDENTICAL TO */
+MAP(0x22, 0x62, 0x2252) /* APPROXIMATELY EQUAL TO OR THE IMAGE OF */
+MAP(0x22, 0x63, 0x226A) /* MUCH LESS-THAN */
+MAP(0x22, 0x64, 0x226B) /* MUCH GREATER-THAN */
+MAP(0x22, 0x65, 0x221A) /* SQUARE ROOT */
+MAP(0x22, 0x66, 0x223D) /* REVERSED TILDE */
+MAP(0x22, 0x67, 0x221D) /* PROPORTIONAL TO */
+MAP(0x22, 0x68, 0x2235) /* BECAUSE */
+MAP(0x22, 0x69, 0x222B) /* INTEGRAL */
+MAP(0x22, 0x6A, 0x222C) /* DOUBLE INTEGRAL */
+MAP(0x22, 0x72, 0x212B) /* ANGSTROM SIGN */
+MAP(0x22, 0x73, 0x2030) /* PER MILLE SIGN */
+MAP(0x22, 0x74, 0x266F) /* MUSIC SHARP SIGN */
+MAP(0x22, 0x75, 0x266D) /* MUSIC FLAT SIGN */
+MAP(0x22, 0x76, 0x266A) /* EIGHTH NOTE */
+MAP(0x22, 0x77, 0x2020) /* DAGGER */
+MAP(0x22, 0x78, 0x2021) /* DOUBLE DAGGER */
+MAP(0x22, 0x79, 0x00B6) /* PILCROW SIGN */
+MAP(0x22, 0x7E, 0x25EF) /* LARGE CIRCLE */
+MAP(0x23, 0x30, 0xFF10) /* FULLWIDTH DIGIT ZERO */
+MAP(0x23, 0x31, 0xFF11) /* FULLWIDTH DIGIT ONE */
+MAP(0x23, 0x32, 0xFF12) /* FULLWIDTH DIGIT TWO */
+MAP(0x23, 0x33, 0xFF13) /* FULLWIDTH DIGIT THREE */
+MAP(0x23, 0x34, 0xFF14) /* FULLWIDTH DIGIT FOUR */
+MAP(0x23, 0x35, 0xFF15) /* FULLWIDTH DIGIT FIVE */
+MAP(0x23, 0x36, 0xFF16) /* FULLWIDTH DIGIT SIX */
+MAP(0x23, 0x37, 0xFF17) /* FULLWIDTH DIGIT SEVEN */
+MAP(0x23, 0x38, 0xFF18) /* FULLWIDTH DIGIT EIGHT */
+MAP(0x23, 0x39, 0xFF19) /* FULLWIDTH DIGIT NINE */
+MAP(0x23, 0x41, 0xFF21) /* FULLWIDTH LATIN CAPITAL LETTER A */
+MAP(0x23, 0x42, 0xFF22) /* FULLWIDTH LATIN CAPITAL LETTER B */
+MAP(0x23, 0x43, 0xFF23) /* FULLWIDTH LATIN CAPITAL LETTER C */
+MAP(0x23, 0x44, 0xFF24) /* FULLWIDTH LATIN CAPITAL LETTER D */
+MAP(0x23, 0x45, 0xFF25) /* FULLWIDTH LATIN CAPITAL LETTER E */
+MAP(0x23, 0x46, 0xFF26) /* FULLWIDTH LATIN CAPITAL LETTER F */
+MAP(0x23, 0x47, 0xFF27) /* FULLWIDTH LATIN CAPITAL LETTER G */
+MAP(0x23, 0x48, 0xFF28) /* FULLWIDTH LATIN CAPITAL LETTER H */
+MAP(0x23, 0x49, 0xFF29) /* FULLWIDTH LATIN CAPITAL LETTER I */
+MAP(0x23, 0x4A, 0xFF2A) /* FULLWIDTH LATIN CAPITAL LETTER J */
+MAP(0x23, 0x4B, 0xFF2B) /* FULLWIDTH LATIN CAPITAL LETTER K */
+MAP(0x23, 0x4C, 0xFF2C) /* FULLWIDTH LATIN CAPITAL LETTER L */
+MAP(0x23, 0x4D, 0xFF2D) /* FULLWIDTH LATIN CAPITAL LETTER M */
+MAP(0x23, 0x4E, 0xFF2E) /* FULLWIDTH LATIN CAPITAL LETTER N */
+MAP(0x23, 0x4F, 0xFF2F) /* FULLWIDTH LATIN CAPITAL LETTER O */
+MAP(0x23, 0x50, 0xFF30) /* FULLWIDTH LATIN CAPITAL LETTER P */
+MAP(0x23, 0x51, 0xFF31) /* FULLWIDTH LATIN CAPITAL LETTER Q */
+MAP(0x23, 0x52, 0xFF32) /* FULLWIDTH LATIN CAPITAL LETTER R */
+MAP(0x23, 0x53, 0xFF33) /* FULLWIDTH LATIN CAPITAL LETTER S */
+MAP(0x23, 0x54, 0xFF34) /* FULLWIDTH LATIN CAPITAL LETTER T */
+MAP(0x23, 0x55, 0xFF35) /* FULLWIDTH LATIN CAPITAL LETTER U */
+MAP(0x23, 0x56, 0xFF36) /* FULLWIDTH LATIN CAPITAL LETTER V */
+MAP(0x23, 0x57, 0xFF37) /* FULLWIDTH LATIN CAPITAL LETTER W */
+MAP(0x23, 0x58, 0xFF38) /* FULLWIDTH LATIN CAPITAL LETTER X */
+MAP(0x23, 0x59, 0xFF39) /* FULLWIDTH LATIN CAPITAL LETTER Y */
+MAP(0x23, 0x5A, 0xFF3A) /* FULLWIDTH LATIN CAPITAL LETTER Z */
+MAP(0x23, 0x61, 0xFF41) /* FULLWIDTH LATIN SMALL LETTER A */
+MAP(0x23, 0x62, 0xFF42) /* FULLWIDTH LATIN SMALL LETTER B */
+MAP(0x23, 0x63, 0xFF43) /* FULLWIDTH LATIN SMALL LETTER C */
+MAP(0x23, 0x64, 0xFF44) /* FULLWIDTH LATIN SMALL LETTER D */
+MAP(0x23, 0x65, 0xFF45) /* FULLWIDTH LATIN SMALL LETTER E */
+MAP(0x23, 0x66, 0xFF46) /* FULLWIDTH LATIN SMALL LETTER F */
+MAP(0x23, 0x67, 0xFF47) /* FULLWIDTH LATIN SMALL LETTER G */
+MAP(0x23, 0x68, 0xFF48) /* FULLWIDTH LATIN SMALL LETTER H */
+MAP(0x23, 0x69, 0xFF49) /* FULLWIDTH LATIN SMALL LETTER I */
+MAP(0x23, 0x6A, 0xFF4A) /* FULLWIDTH LATIN SMALL LETTER J */
+MAP(0x23, 0x6B, 0xFF4B) /* FULLWIDTH LATIN SMALL LETTER K */
+MAP(0x23, 0x6C, 0xFF4C) /* FULLWIDTH LATIN SMALL LETTER L */
+MAP(0x23, 0x6D, 0xFF4D) /* FULLWIDTH LATIN SMALL LETTER M */
+MAP(0x23, 0x6E, 0xFF4E) /* FULLWIDTH LATIN SMALL LETTER N */
+MAP(0x23, 0x6F, 0xFF4F) /* FULLWIDTH LATIN SMALL LETTER O */
+MAP(0x23, 0x70, 0xFF50) /* FULLWIDTH LATIN SMALL LETTER P */
+MAP(0x23, 0x71, 0xFF51) /* FULLWIDTH LATIN SMALL LETTER Q */
+MAP(0x23, 0x72, 0xFF52) /* FULLWIDTH LATIN SMALL LETTER R */
+MAP(0x23, 0x73, 0xFF53) /* FULLWIDTH LATIN SMALL LETTER S */
+MAP(0x23, 0x74, 0xFF54) /* FULLWIDTH LATIN SMALL LETTER T */
+MAP(0x23, 0x75, 0xFF55) /* FULLWIDTH LATIN SMALL LETTER U */
+MAP(0x23, 0x76, 0xFF56) /* FULLWIDTH LATIN SMALL LETTER V */
+MAP(0x23, 0x77, 0xFF57) /* FULLWIDTH LATIN SMALL LETTER W */
+MAP(0x23, 0x78, 0xFF58) /* FULLWIDTH LATIN SMALL LETTER X */
+MAP(0x23, 0x79, 0xFF59) /* FULLWIDTH LATIN SMALL LETTER Y */
+MAP(0x23, 0x7A, 0xFF5A) /* FULLWIDTH LATIN SMALL LETTER Z */
+MAP(0x24, 0x21, 0x3041) /* HIRAGANA LETTER SMALL A */
+MAP(0x24, 0x22, 0x3042) /* HIRAGANA LETTER A */
+MAP(0x24, 0x23, 0x3043) /* HIRAGANA LETTER SMALL I */
+MAP(0x24, 0x24, 0x3044) /* HIRAGANA LETTER I */
+MAP(0x24, 0x25, 0x3045) /* HIRAGANA LETTER SMALL U */
+MAP(0x24, 0x26, 0x3046) /* HIRAGANA LETTER U */
+MAP(0x24, 0x27, 0x3047) /* HIRAGANA LETTER SMALL E */
+MAP(0x24, 0x28, 0x3048) /* HIRAGANA LETTER E */
+MAP(0x24, 0x29, 0x3049) /* HIRAGANA LETTER SMALL O */
+MAP(0x24, 0x2A, 0x304A) /* HIRAGANA LETTER O */
+MAP(0x24, 0x2B, 0x304B) /* HIRAGANA LETTER KA */
+MAP(0x24, 0x2C, 0x304C) /* HIRAGANA LETTER GA */
+MAP(0x24, 0x2D, 0x304D) /* HIRAGANA LETTER KI */
+MAP(0x24, 0x2E, 0x304E) /* HIRAGANA LETTER GI */
+MAP(0x24, 0x2F, 0x304F) /* HIRAGANA LETTER KU */
+MAP(0x24, 0x30, 0x3050) /* HIRAGANA LETTER GU */
+MAP(0x24, 0x31, 0x3051) /* HIRAGANA LETTER KE */
+MAP(0x24, 0x32, 0x3052) /* HIRAGANA LETTER GE */
+MAP(0x24, 0x33, 0x3053) /* HIRAGANA LETTER KO */
+MAP(0x24, 0x34, 0x3054) /* HIRAGANA LETTER GO */
+MAP(0x24, 0x35, 0x3055) /* HIRAGANA LETTER SA */
+MAP(0x24, 0x36, 0x3056) /* HIRAGANA LETTER ZA */
+MAP(0x24, 0x37, 0x3057) /* HIRAGANA LETTER SI */
+MAP(0x24, 0x38, 0x3058) /* HIRAGANA LETTER ZI */
+MAP(0x24, 0x39, 0x3059) /* HIRAGANA LETTER SU */
+MAP(0x24, 0x3A, 0x305A) /* HIRAGANA LETTER ZU */
+MAP(0x24, 0x3B, 0x305B) /* HIRAGANA LETTER SE */
+MAP(0x24, 0x3C, 0x305C) /* HIRAGANA LETTER ZE */
+MAP(0x24, 0x3D, 0x305D) /* HIRAGANA LETTER SO */
+MAP(0x24, 0x3E, 0x305E) /* HIRAGANA LETTER ZO */
+MAP(0x24, 0x3F, 0x305F) /* HIRAGANA LETTER TA */
+MAP(0x24, 0x40, 0x3060) /* HIRAGANA LETTER DA */
+MAP(0x24, 0x41, 0x3061) /* HIRAGANA LETTER TI */
+MAP(0x24, 0x42, 0x3062) /* HIRAGANA LETTER DI */
+MAP(0x24, 0x43, 0x3063) /* HIRAGANA LETTER SMALL TU */
+MAP(0x24, 0x44, 0x3064) /* HIRAGANA LETTER TU */
+MAP(0x24, 0x45, 0x3065) /* HIRAGANA LETTER DU */
+MAP(0x24, 0x46, 0x3066) /* HIRAGANA LETTER TE */
+MAP(0x24, 0x47, 0x3067) /* HIRAGANA LETTER DE */
+MAP(0x24, 0x48, 0x3068) /* HIRAGANA LETTER TO */
+MAP(0x24, 0x49, 0x3069) /* HIRAGANA LETTER DO */
+MAP(0x24, 0x4A, 0x306A) /* HIRAGANA LETTER NA */
+MAP(0x24, 0x4B, 0x306B) /* HIRAGANA LETTER NI */
+MAP(0x24, 0x4C, 0x306C) /* HIRAGANA LETTER NU */
+MAP(0x24, 0x4D, 0x306D) /* HIRAGANA LETTER NE */
+MAP(0x24, 0x4E, 0x306E) /* HIRAGANA LETTER NO */
+MAP(0x24, 0x4F, 0x306F) /* HIRAGANA LETTER HA */
+MAP(0x24, 0x50, 0x3070) /* HIRAGANA LETTER BA */
+MAP(0x24, 0x51, 0x3071) /* HIRAGANA LETTER PA */
+MAP(0x24, 0x52, 0x3072) /* HIRAGANA LETTER HI */
+MAP(0x24, 0x53, 0x3073) /* HIRAGANA LETTER BI */
+MAP(0x24, 0x54, 0x3074) /* HIRAGANA LETTER PI */
+MAP(0x24, 0x55, 0x3075) /* HIRAGANA LETTER HU */
+MAP(0x24, 0x56, 0x3076) /* HIRAGANA LETTER BU */
+MAP(0x24, 0x57, 0x3077) /* HIRAGANA LETTER PU */
+MAP(0x24, 0x58, 0x3078) /* HIRAGANA LETTER HE */
+MAP(0x24, 0x59, 0x3079) /* HIRAGANA LETTER BE */
+MAP(0x24, 0x5A, 0x307A) /* HIRAGANA LETTER PE */
+MAP(0x24, 0x5B, 0x307B) /* HIRAGANA LETTER HO */
+MAP(0x24, 0x5C, 0x307C) /* HIRAGANA LETTER BO */
+MAP(0x24, 0x5D, 0x307D) /* HIRAGANA LETTER PO */
+MAP(0x24, 0x5E, 0x307E) /* HIRAGANA LETTER MA */
+MAP(0x24, 0x5F, 0x307F) /* HIRAGANA LETTER MI */
+MAP(0x24, 0x60, 0x3080) /* HIRAGANA LETTER MU */
+MAP(0x24, 0x61, 0x3081) /* HIRAGANA LETTER ME */
+MAP(0x24, 0x62, 0x3082) /* HIRAGANA LETTER MO */
+MAP(0x24, 0x63, 0x3083) /* HIRAGANA LETTER SMALL YA */
+MAP(0x24, 0x64, 0x3084) /* HIRAGANA LETTER YA */
+MAP(0x24, 0x65, 0x3085) /* HIRAGANA LETTER SMALL YU */
+MAP(0x24, 0x66, 0x3086) /* HIRAGANA LETTER YU */
+MAP(0x24, 0x67, 0x3087) /* HIRAGANA LETTER SMALL YO */
+MAP(0x24, 0x68, 0x3088) /* HIRAGANA LETTER YO */
+MAP(0x24, 0x69, 0x3089) /* HIRAGANA LETTER RA */
+MAP(0x24, 0x6A, 0x308A) /* HIRAGANA LETTER RI */
+MAP(0x24, 0x6B, 0x308B) /* HIRAGANA LETTER RU */
+MAP(0x24, 0x6C, 0x308C) /* HIRAGANA LETTER RE */
+MAP(0x24, 0x6D, 0x308D) /* HIRAGANA LETTER RO */
+MAP(0x24, 0x6E, 0x308E) /* HIRAGANA LETTER SMALL WA */
+MAP(0x24, 0x6F, 0x308F) /* HIRAGANA LETTER WA */
+MAP(0x24, 0x70, 0x3090) /* HIRAGANA LETTER WI */
+MAP(0x24, 0x71, 0x3091) /* HIRAGANA LETTER WE */
+MAP(0x24, 0x72, 0x3092) /* HIRAGANA LETTER WO */
+MAP(0x24, 0x73, 0x3093) /* HIRAGANA LETTER N */
+MAP(0x25, 0x21, 0x30A1) /* KATAKANA LETTER SMALL A */
+MAP(0x25, 0x22, 0x30A2) /* KATAKANA LETTER A */
+MAP(0x25, 0x23, 0x30A3) /* KATAKANA LETTER SMALL I */
+MAP(0x25, 0x24, 0x30A4) /* KATAKANA LETTER I */
+MAP(0x25, 0x25, 0x30A5) /* KATAKANA LETTER SMALL U */
+MAP(0x25, 0x26, 0x30A6) /* KATAKANA LETTER U */
+MAP(0x25, 0x27, 0x30A7) /* KATAKANA LETTER SMALL E */
+MAP(0x25, 0x28, 0x30A8) /* KATAKANA LETTER E */
+MAP(0x25, 0x29, 0x30A9) /* KATAKANA LETTER SMALL O */
+MAP(0x25, 0x2A, 0x30AA) /* KATAKANA LETTER O */
+MAP(0x25, 0x2B, 0x30AB) /* KATAKANA LETTER KA */
+MAP(0x25, 0x2C, 0x30AC) /* KATAKANA LETTER GA */
+MAP(0x25, 0x2D, 0x30AD) /* KATAKANA LETTER KI */
+MAP(0x25, 0x2E, 0x30AE) /* KATAKANA LETTER GI */
+MAP(0x25, 0x2F, 0x30AF) /* KATAKANA LETTER KU */
+MAP(0x25, 0x30, 0x30B0) /* KATAKANA LETTER GU */
+MAP(0x25, 0x31, 0x30B1) /* KATAKANA LETTER KE */
+MAP(0x25, 0x32, 0x30B2) /* KATAKANA LETTER GE */
+MAP(0x25, 0x33, 0x30B3) /* KATAKANA LETTER KO */
+MAP(0x25, 0x34, 0x30B4) /* KATAKANA LETTER GO */
+MAP(0x25, 0x35, 0x30B5) /* KATAKANA LETTER SA */
+MAP(0x25, 0x36, 0x30B6) /* KATAKANA LETTER ZA */
+MAP(0x25, 0x37, 0x30B7) /* KATAKANA LETTER SI */
+MAP(0x25, 0x38, 0x30B8) /* KATAKANA LETTER ZI */
+MAP(0x25, 0x39, 0x30B9) /* KATAKANA LETTER SU */
+MAP(0x25, 0x3A, 0x30BA) /* KATAKANA LETTER ZU */
+MAP(0x25, 0x3B, 0x30BB) /* KATAKANA LETTER SE */
+MAP(0x25, 0x3C, 0x30BC) /* KATAKANA LETTER ZE */
+MAP(0x25, 0x3D, 0x30BD) /* KATAKANA LETTER SO */
+MAP(0x25, 0x3E, 0x30BE) /* KATAKANA LETTER ZO */
+MAP(0x25, 0x3F, 0x30BF) /* KATAKANA LETTER TA */
+MAP(0x25, 0x40, 0x30C0) /* KATAKANA LETTER DA */
+MAP(0x25, 0x41, 0x30C1) /* KATAKANA LETTER TI */
+MAP(0x25, 0x42, 0x30C2) /* KATAKANA LETTER DI */
+MAP(0x25, 0x43, 0x30C3) /* KATAKANA LETTER SMALL TU */
+MAP(0x25, 0x44, 0x30C4) /* KATAKANA LETTER TU */
+MAP(0x25, 0x45, 0x30C5) /* KATAKANA LETTER DU */
+MAP(0x25, 0x46, 0x30C6) /* KATAKANA LETTER TE */
+MAP(0x25, 0x47, 0x30C7) /* KATAKANA LETTER DE */
+MAP(0x25, 0x48, 0x30C8) /* KATAKANA LETTER TO */
+MAP(0x25, 0x49, 0x30C9) /* KATAKANA LETTER DO */
+MAP(0x25, 0x4A, 0x30CA) /* KATAKANA LETTER NA */
+MAP(0x25, 0x4B, 0x30CB) /* KATAKANA LETTER NI */
+MAP(0x25, 0x4C, 0x30CC) /* KATAKANA LETTER NU */
+MAP(0x25, 0x4D, 0x30CD) /* KATAKANA LETTER NE */
+MAP(0x25, 0x4E, 0x30CE) /* KATAKANA LETTER NO */
+MAP(0x25, 0x4F, 0x30CF) /* KATAKANA LETTER HA */
+MAP(0x25, 0x50, 0x30D0) /* KATAKANA LETTER BA */
+MAP(0x25, 0x51, 0x30D1) /* KATAKANA LETTER PA */
+MAP(0x25, 0x52, 0x30D2) /* KATAKANA LETTER HI */
+MAP(0x25, 0x53, 0x30D3) /* KATAKANA LETTER BI */
+MAP(0x25, 0x54, 0x30D4) /* KATAKANA LETTER PI */
+MAP(0x25, 0x55, 0x30D5) /* KATAKANA LETTER HU */
+MAP(0x25, 0x56, 0x30D6) /* KATAKANA LETTER BU */
+MAP(0x25, 0x57, 0x30D7) /* KATAKANA LETTER PU */
+MAP(0x25, 0x58, 0x30D8) /* KATAKANA LETTER HE */
+MAP(0x25, 0x59, 0x30D9) /* KATAKANA LETTER BE */
+MAP(0x25, 0x5A, 0x30DA) /* KATAKANA LETTER PE */
+MAP(0x25, 0x5B, 0x30DB) /* KATAKANA LETTER HO */
+MAP(0x25, 0x5C, 0x30DC) /* KATAKANA LETTER BO */
+MAP(0x25, 0x5D, 0x30DD) /* KATAKANA LETTER PO */
+MAP(0x25, 0x5E, 0x30DE) /* KATAKANA LETTER MA */
+MAP(0x25, 0x5F, 0x30DF) /* KATAKANA LETTER MI */
+MAP(0x25, 0x60, 0x30E0) /* KATAKANA LETTER MU */
+MAP(0x25, 0x61, 0x30E1) /* KATAKANA LETTER ME */
+MAP(0x25, 0x62, 0x30E2) /* KATAKANA LETTER MO */
+MAP(0x25, 0x63, 0x30E3) /* KATAKANA LETTER SMALL YA */
+MAP(0x25, 0x64, 0x30E4) /* KATAKANA LETTER YA */
+MAP(0x25, 0x65, 0x30E5) /* KATAKANA LETTER SMALL YU */
+MAP(0x25, 0x66, 0x30E6) /* KATAKANA LETTER YU */
+MAP(0x25, 0x67, 0x30E7) /* KATAKANA LETTER SMALL YO */
+MAP(0x25, 0x68, 0x30E8) /* KATAKANA LETTER YO */
+MAP(0x25, 0x69, 0x30E9) /* KATAKANA LETTER RA */
+MAP(0x25, 0x6A, 0x30EA) /* KATAKANA LETTER RI */
+MAP(0x25, 0x6B, 0x30EB) /* KATAKANA LETTER RU */
+MAP(0x25, 0x6C, 0x30EC) /* KATAKANA LETTER RE */
+MAP(0x25, 0x6D, 0x30ED) /* KATAKANA LETTER RO */
+MAP(0x25, 0x6E, 0x30EE) /* KATAKANA LETTER SMALL WA */
+MAP(0x25, 0x6F, 0x30EF) /* KATAKANA LETTER WA */
+MAP(0x25, 0x70, 0x30F0) /* KATAKANA LETTER WI */
+MAP(0x25, 0x71, 0x30F1) /* KATAKANA LETTER WE */
+MAP(0x25, 0x72, 0x30F2) /* KATAKANA LETTER WO */
+MAP(0x25, 0x73, 0x30F3) /* KATAKANA LETTER N */
+MAP(0x25, 0x74, 0x30F4) /* KATAKANA LETTER VU */
+MAP(0x25, 0x75, 0x30F5) /* KATAKANA LETTER SMALL KA */
+MAP(0x25, 0x76, 0x30F6) /* KATAKANA LETTER SMALL KE */
+MAP(0x26, 0x21, 0x0391) /* GREEK CAPITAL LETTER ALPHA */
+MAP(0x26, 0x22, 0x0392) /* GREEK CAPITAL LETTER BETA */
+MAP(0x26, 0x23, 0x0393) /* GREEK CAPITAL LETTER GAMMA */
+MAP(0x26, 0x24, 0x0394) /* GREEK CAPITAL LETTER DELTA */
+MAP(0x26, 0x25, 0x0395) /* GREEK CAPITAL LETTER EPSILON */
+MAP(0x26, 0x26, 0x0396) /* GREEK CAPITAL LETTER ZETA */
+MAP(0x26, 0x27, 0x0397) /* GREEK CAPITAL LETTER ETA */
+MAP(0x26, 0x28, 0x0398) /* GREEK CAPITAL LETTER THETA */
+MAP(0x26, 0x29, 0x0399) /* GREEK CAPITAL LETTER IOTA */
+MAP(0x26, 0x2A, 0x039A) /* GREEK CAPITAL LETTER KAPPA */
+MAP(0x26, 0x2B, 0x039B) /* GREEK CAPITAL LETTER LAMDA */
+MAP(0x26, 0x2C, 0x039C) /* GREEK CAPITAL LETTER MU */
+MAP(0x26, 0x2D, 0x039D) /* GREEK CAPITAL LETTER NU */
+MAP(0x26, 0x2E, 0x039E) /* GREEK CAPITAL LETTER XI */
+MAP(0x26, 0x2F, 0x039F) /* GREEK CAPITAL LETTER OMICRON */
+MAP(0x26, 0x30, 0x03A0) /* GREEK CAPITAL LETTER PI */
+MAP(0x26, 0x31, 0x03A1) /* GREEK CAPITAL LETTER RHO */
+MAP(0x26, 0x32, 0x03A3) /* GREEK CAPITAL LETTER SIGMA */
+MAP(0x26, 0x33, 0x03A4) /* GREEK CAPITAL LETTER TAU */
+MAP(0x26, 0x34, 0x03A5) /* GREEK CAPITAL LETTER UPSILON */
+MAP(0x26, 0x35, 0x03A6) /* GREEK CAPITAL LETTER PHI */
+MAP(0x26, 0x36, 0x03A7) /* GREEK CAPITAL LETTER CHI */
+MAP(0x26, 0x37, 0x03A8) /* GREEK CAPITAL LETTER PSI */
+MAP(0x26, 0x38, 0x03A9) /* GREEK CAPITAL LETTER OMEGA */
+MAP(0x26, 0x41, 0x03B1) /* GREEK SMALL LETTER ALPHA */
+MAP(0x26, 0x42, 0x03B2) /* GREEK SMALL LETTER BETA */
+MAP(0x26, 0x43, 0x03B3) /* GREEK SMALL LETTER GAMMA */
+MAP(0x26, 0x44, 0x03B4) /* GREEK SMALL LETTER DELTA */
+MAP(0x26, 0x45, 0x03B5) /* GREEK SMALL LETTER EPSILON */
+MAP(0x26, 0x46, 0x03B6) /* GREEK SMALL LETTER ZETA */
+MAP(0x26, 0x47, 0x03B7) /* GREEK SMALL LETTER ETA */
+MAP(0x26, 0x48, 0x03B8) /* GREEK SMALL LETTER THETA */
+MAP(0x26, 0x49, 0x03B9) /* GREEK SMALL LETTER IOTA */
+MAP(0x26, 0x4A, 0x03BA) /* GREEK SMALL LETTER KAPPA */
+MAP(0x26, 0x4B, 0x03BB) /* GREEK SMALL LETTER LAMDA */
+MAP(0x26, 0x4C, 0x03BC) /* GREEK SMALL LETTER MU */
+MAP(0x26, 0x4D, 0x03BD) /* GREEK SMALL LETTER NU */
+MAP(0x26, 0x4E, 0x03BE) /* GREEK SMALL LETTER XI */
+MAP(0x26, 0x4F, 0x03BF) /* GREEK SMALL LETTER OMICRON */
+MAP(0x26, 0x50, 0x03C0) /* GREEK SMALL LETTER PI */
+MAP(0x26, 0x51, 0x03C1) /* GREEK SMALL LETTER RHO */
+MAP(0x26, 0x52, 0x03C3) /* GREEK SMALL LETTER SIGMA */
+MAP(0x26, 0x53, 0x03C4) /* GREEK SMALL LETTER TAU */
+MAP(0x26, 0x54, 0x03C5) /* GREEK SMALL LETTER UPSILON */
+MAP(0x26, 0x55, 0x03C6) /* GREEK SMALL LETTER PHI */
+MAP(0x26, 0x56, 0x03C7) /* GREEK SMALL LETTER CHI */
+MAP(0x26, 0x57, 0x03C8) /* GREEK SMALL LETTER PSI */
+MAP(0x26, 0x58, 0x03C9) /* GREEK SMALL LETTER OMEGA */
+MAP(0x27, 0x21, 0x0410) /* CYRILLIC CAPITAL LETTER A */
+MAP(0x27, 0x22, 0x0411) /* CYRILLIC CAPITAL LETTER BE */
+MAP(0x27, 0x23, 0x0412) /* CYRILLIC CAPITAL LETTER VE */
+MAP(0x27, 0x24, 0x0413) /* CYRILLIC CAPITAL LETTER GHE */
+MAP(0x27, 0x25, 0x0414) /* CYRILLIC CAPITAL LETTER DE */
+MAP(0x27, 0x26, 0x0415) /* CYRILLIC CAPITAL LETTER IE */
+MAP(0x27, 0x27, 0x0401) /* CYRILLIC CAPITAL LETTER IO */
+MAP(0x27, 0x28, 0x0416) /* CYRILLIC CAPITAL LETTER ZHE */
+MAP(0x27, 0x29, 0x0417) /* CYRILLIC CAPITAL LETTER ZE */
+MAP(0x27, 0x2A, 0x0418) /* CYRILLIC CAPITAL LETTER I */
+MAP(0x27, 0x2B, 0x0419) /* CYRILLIC CAPITAL LETTER SHORT I */
+MAP(0x27, 0x2C, 0x041A) /* CYRILLIC CAPITAL LETTER KA */
+MAP(0x27, 0x2D, 0x041B) /* CYRILLIC CAPITAL LETTER EL */
+MAP(0x27, 0x2E, 0x041C) /* CYRILLIC CAPITAL LETTER EM */
+MAP(0x27, 0x2F, 0x041D) /* CYRILLIC CAPITAL LETTER EN */
+MAP(0x27, 0x30, 0x041E) /* CYRILLIC CAPITAL LETTER O */
+MAP(0x27, 0x31, 0x041F) /* CYRILLIC CAPITAL LETTER PE */
+MAP(0x27, 0x32, 0x0420) /* CYRILLIC CAPITAL LETTER ER */
+MAP(0x27, 0x33, 0x0421) /* CYRILLIC CAPITAL LETTER ES */
+MAP(0x27, 0x34, 0x0422) /* CYRILLIC CAPITAL LETTER TE */
+MAP(0x27, 0x35, 0x0423) /* CYRILLIC CAPITAL LETTER U */
+MAP(0x27, 0x36, 0x0424) /* CYRILLIC CAPITAL LETTER EF */
+MAP(0x27, 0x37, 0x0425) /* CYRILLIC CAPITAL LETTER HA */
+MAP(0x27, 0x38, 0x0426) /* CYRILLIC CAPITAL LETTER TSE */
+MAP(0x27, 0x39, 0x0427) /* CYRILLIC CAPITAL LETTER CHE */
+MAP(0x27, 0x3A, 0x0428) /* CYRILLIC CAPITAL LETTER SHA */
+MAP(0x27, 0x3B, 0x0429) /* CYRILLIC CAPITAL LETTER SHCHA */
+MAP(0x27, 0x3C, 0x042A) /* CYRILLIC CAPITAL LETTER HARD SIGN */
+MAP(0x27, 0x3D, 0x042B) /* CYRILLIC CAPITAL LETTER YERU */
+MAP(0x27, 0x3E, 0x042C) /* CYRILLIC CAPITAL LETTER SOFT SIGN */
+MAP(0x27, 0x3F, 0x042D) /* CYRILLIC CAPITAL LETTER E */
+MAP(0x27, 0x40, 0x042E) /* CYRILLIC CAPITAL LETTER YU */
+MAP(0x27, 0x41, 0x042F) /* CYRILLIC CAPITAL LETTER YA */
+MAP(0x27, 0x51, 0x0430) /* CYRILLIC SMALL LETTER A */
+MAP(0x27, 0x52, 0x0431) /* CYRILLIC SMALL LETTER BE */
+MAP(0x27, 0x53, 0x0432) /* CYRILLIC SMALL LETTER VE */
+MAP(0x27, 0x54, 0x0433) /* CYRILLIC SMALL LETTER GHE */
+MAP(0x27, 0x55, 0x0434) /* CYRILLIC SMALL LETTER DE */
+MAP(0x27, 0x56, 0x0435) /* CYRILLIC SMALL LETTER IE */
+MAP(0x27, 0x57, 0x0451) /* CYRILLIC SMALL LETTER IO */
+MAP(0x27, 0x58, 0x0436) /* CYRILLIC SMALL LETTER ZHE */
+MAP(0x27, 0x59, 0x0437) /* CYRILLIC SMALL LETTER ZE */
+MAP(0x27, 0x5A, 0x0438) /* CYRILLIC SMALL LETTER I */
+MAP(0x27, 0x5B, 0x0439) /* CYRILLIC SMALL LETTER SHORT I */
+MAP(0x27, 0x5C, 0x043A) /* CYRILLIC SMALL LETTER KA */
+MAP(0x27, 0x5D, 0x043B) /* CYRILLIC SMALL LETTER EL */
+MAP(0x27, 0x5E, 0x043C) /* CYRILLIC SMALL LETTER EM */
+MAP(0x27, 0x5F, 0x043D) /* CYRILLIC SMALL LETTER EN */
+MAP(0x27, 0x60, 0x043E) /* CYRILLIC SMALL LETTER O */
+MAP(0x27, 0x61, 0x043F) /* CYRILLIC SMALL LETTER PE */
+MAP(0x27, 0x62, 0x0440) /* CYRILLIC SMALL LETTER ER */
+MAP(0x27, 0x63, 0x0441) /* CYRILLIC SMALL LETTER ES */
+MAP(0x27, 0x64, 0x0442) /* CYRILLIC SMALL LETTER TE */
+MAP(0x27, 0x65, 0x0443) /* CYRILLIC SMALL LETTER U */
+MAP(0x27, 0x66, 0x0444) /* CYRILLIC SMALL LETTER EF */
+MAP(0x27, 0x67, 0x0445) /* CYRILLIC SMALL LETTER HA */
+MAP(0x27, 0x68, 0x0446) /* CYRILLIC SMALL LETTER TSE */
+MAP(0x27, 0x69, 0x0447) /* CYRILLIC SMALL LETTER CHE */
+MAP(0x27, 0x6A, 0x0448) /* CYRILLIC SMALL LETTER SHA */
+MAP(0x27, 0x6B, 0x0449) /* CYRILLIC SMALL LETTER SHCHA */
+MAP(0x27, 0x6C, 0x044A) /* CYRILLIC SMALL LETTER HARD SIGN */
+MAP(0x27, 0x6D, 0x044B) /* CYRILLIC SMALL LETTER YERU */
+MAP(0x27, 0x6E, 0x044C) /* CYRILLIC SMALL LETTER SOFT SIGN */
+MAP(0x27, 0x6F, 0x044D) /* CYRILLIC SMALL LETTER E */
+MAP(0x27, 0x70, 0x044E) /* CYRILLIC SMALL LETTER YU */
+MAP(0x27, 0x71, 0x044F) /* CYRILLIC SMALL LETTER YA */
+MAP(0x28, 0x21, 0x2500) /* BOX DRAWINGS LIGHT HORIZONTAL */
+MAP(0x28, 0x22, 0x2502) /* BOX DRAWINGS LIGHT VERTICAL */
+MAP(0x28, 0x23, 0x250C) /* BOX DRAWINGS LIGHT DOWN AND RIGHT */
+MAP(0x28, 0x24, 0x2510) /* BOX DRAWINGS LIGHT DOWN AND LEFT */
+MAP(0x28, 0x25, 0x2518) /* BOX DRAWINGS LIGHT UP AND LEFT */
+MAP(0x28, 0x26, 0x2514) /* BOX DRAWINGS LIGHT UP AND RIGHT */
+MAP(0x28, 0x27, 0x251C) /* BOX DRAWINGS LIGHT VERTICAL AND RIGHT */
+MAP(0x28, 0x28, 0x252C) /* BOX DRAWINGS LIGHT DOWN AND HORIZONTAL */
+MAP(0x28, 0x29, 0x2524) /* BOX DRAWINGS LIGHT VERTICAL AND LEFT */
+MAP(0x28, 0x2A, 0x2534) /* BOX DRAWINGS LIGHT UP AND HORIZONTAL */
+MAP(0x28, 0x2B, 0x253C) /* BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL */
+MAP(0x28, 0x2C, 0x2501) /* BOX DRAWINGS HEAVY HORIZONTAL */
+MAP(0x28, 0x2D, 0x2503) /* BOX DRAWINGS HEAVY VERTICAL */
+MAP(0x28, 0x2E, 0x250F) /* BOX DRAWINGS HEAVY DOWN AND RIGHT */
+MAP(0x28, 0x2F, 0x2513) /* BOX DRAWINGS HEAVY DOWN AND LEFT */
+MAP(0x28, 0x30, 0x251B) /* BOX DRAWINGS HEAVY UP AND LEFT */
+MAP(0x28, 0x31, 0x2517) /* BOX DRAWINGS HEAVY UP AND RIGHT */
+MAP(0x28, 0x32, 0x2523) /* BOX DRAWINGS HEAVY VERTICAL AND RIGHT */
+MAP(0x28, 0x33, 0x2533) /* BOX DRAWINGS HEAVY DOWN AND HORIZONTAL */
+MAP(0x28, 0x34, 0x252B) /* BOX DRAWINGS HEAVY VERTICAL AND LEFT */
+MAP(0x28, 0x35, 0x253B) /* BOX DRAWINGS HEAVY UP AND HORIZONTAL */
+MAP(0x28, 0x36, 0x254B) /* BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL */
+MAP(0x28, 0x37, 0x2520) /* BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT */
+MAP(0x28, 0x38, 0x252F) /* BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY */
+MAP(0x28, 0x39, 0x2528) /* BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT */
+MAP(0x28, 0x3A, 0x2537) /* BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY */
+MAP(0x28, 0x3B, 0x253F) /* BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY */
+MAP(0x28, 0x3C, 0x251D) /* BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY */
+MAP(0x28, 0x3D, 0x2530) /* BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT */
+MAP(0x28, 0x3E, 0x2525) /* BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY */
+MAP(0x28, 0x3F, 0x2538) /* BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT */
+MAP(0x28, 0x40, 0x2542) /* BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT */
+MAP(0x30, 0x21, 0x4E9C) /* <CJK> */
+MAP(0x30, 0x22, 0x5516) /* <CJK> */
+MAP(0x30, 0x23, 0x5A03) /* <CJK> */
+MAP(0x30, 0x24, 0x963F) /* <CJK> */
+MAP(0x30, 0x25, 0x54C0) /* <CJK> */
+MAP(0x30, 0x26, 0x611B) /* <CJK> */
+MAP(0x30, 0x27, 0x6328) /* <CJK> */
+MAP(0x30, 0x28, 0x59F6) /* <CJK> */
+MAP(0x30, 0x29, 0x9022) /* <CJK> */
+MAP(0x30, 0x2A, 0x8475) /* <CJK> */
+MAP(0x30, 0x2B, 0x831C) /* <CJK> */
+MAP(0x30, 0x2C, 0x7A50) /* <CJK> */
+MAP(0x30, 0x2D, 0x60AA) /* <CJK> */
+MAP(0x30, 0x2E, 0x63E1) /* <CJK> */
+MAP(0x30, 0x2F, 0x6E25) /* <CJK> */
+MAP(0x30, 0x30, 0x65ED) /* <CJK> */
+MAP(0x30, 0x31, 0x8466) /* <CJK> */
+MAP(0x30, 0x32, 0x82A6) /* <CJK> */
+MAP(0x30, 0x33, 0x9BF5) /* <CJK> */
+MAP(0x30, 0x34, 0x6893) /* <CJK> */
+MAP(0x30, 0x35, 0x5727) /* <CJK> */
+MAP(0x30, 0x36, 0x65A1) /* <CJK> */
+MAP(0x30, 0x37, 0x6271) /* <CJK> */
+MAP(0x30, 0x38, 0x5B9B) /* <CJK> */
+MAP(0x30, 0x39, 0x59D0) /* <CJK> */
+MAP(0x30, 0x3A, 0x867B) /* <CJK> */
+MAP(0x30, 0x3B, 0x98F4) /* <CJK> */
+MAP(0x30, 0x3C, 0x7D62) /* <CJK> */
+MAP(0x30, 0x3D, 0x7DBE) /* <CJK> */
+MAP(0x30, 0x3E, 0x9B8E) /* <CJK> */
+MAP(0x30, 0x3F, 0x6216) /* <CJK> */
+MAP(0x30, 0x40, 0x7C9F) /* <CJK> */
+MAP(0x30, 0x41, 0x88B7) /* <CJK> */
+MAP(0x30, 0x42, 0x5B89) /* <CJK> */
+MAP(0x30, 0x43, 0x5EB5) /* <CJK> */
+MAP(0x30, 0x44, 0x6309) /* <CJK> */
+MAP(0x30, 0x45, 0x6697) /* <CJK> */
+MAP(0x30, 0x46, 0x6848) /* <CJK> */
+MAP(0x30, 0x47, 0x95C7) /* <CJK> */
+MAP(0x30, 0x48, 0x978D) /* <CJK> */
+MAP(0x30, 0x49, 0x674F) /* <CJK> */
+MAP(0x30, 0x4A, 0x4EE5) /* <CJK> */
+MAP(0x30, 0x4B, 0x4F0A) /* <CJK> */
+MAP(0x30, 0x4C, 0x4F4D) /* <CJK> */
+MAP(0x30, 0x4D, 0x4F9D) /* <CJK> */
+MAP(0x30, 0x4E, 0x5049) /* <CJK> */
+MAP(0x30, 0x4F, 0x56F2) /* <CJK> */
+MAP(0x30, 0x50, 0x5937) /* <CJK> */
+MAP(0x30, 0x51, 0x59D4) /* <CJK> */
+MAP(0x30, 0x52, 0x5A01) /* <CJK> */
+MAP(0x30, 0x53, 0x5C09) /* <CJK> */
+MAP(0x30, 0x54, 0x60DF) /* <CJK> */
+MAP(0x30, 0x55, 0x610F) /* <CJK> */
+MAP(0x30, 0x56, 0x6170) /* <CJK> */
+MAP(0x30, 0x57, 0x6613) /* <CJK> */
+MAP(0x30, 0x58, 0x6905) /* <CJK> */
+MAP(0x30, 0x59, 0x70BA) /* <CJK> */
+MAP(0x30, 0x5A, 0x754F) /* <CJK> */
+MAP(0x30, 0x5B, 0x7570) /* <CJK> */
+MAP(0x30, 0x5C, 0x79FB) /* <CJK> */
+MAP(0x30, 0x5D, 0x7DAD) /* <CJK> */
+MAP(0x30, 0x5E, 0x7DEF) /* <CJK> */
+MAP(0x30, 0x5F, 0x80C3) /* <CJK> */
+MAP(0x30, 0x60, 0x840E) /* <CJK> */
+MAP(0x30, 0x61, 0x8863) /* <CJK> */
+MAP(0x30, 0x62, 0x8B02) /* <CJK> */
+MAP(0x30, 0x63, 0x9055) /* <CJK> */
+MAP(0x30, 0x64, 0x907A) /* <CJK> */
+MAP(0x30, 0x65, 0x533B) /* <CJK> */
+MAP(0x30, 0x66, 0x4E95) /* <CJK> */
+MAP(0x30, 0x67, 0x4EA5) /* <CJK> */
+MAP(0x30, 0x68, 0x57DF) /* <CJK> */
+MAP(0x30, 0x69, 0x80B2) /* <CJK> */
+MAP(0x30, 0x6A, 0x90C1) /* <CJK> */
+MAP(0x30, 0x6B, 0x78EF) /* <CJK> */
+MAP(0x30, 0x6C, 0x4E00) /* <CJK> */
+MAP(0x30, 0x6D, 0x58F1) /* <CJK> */
+MAP(0x30, 0x6E, 0x6EA2) /* <CJK> */
+MAP(0x30, 0x6F, 0x9038) /* <CJK> */
+MAP(0x30, 0x70, 0x7A32) /* <CJK> */
+MAP(0x30, 0x71, 0x8328) /* <CJK> */
+MAP(0x30, 0x72, 0x828B) /* <CJK> */
+MAP(0x30, 0x73, 0x9C2F) /* <CJK> */
+MAP(0x30, 0x74, 0x5141) /* <CJK> */
+MAP(0x30, 0x75, 0x5370) /* <CJK> */
+MAP(0x30, 0x76, 0x54BD) /* <CJK> */
+MAP(0x30, 0x77, 0x54E1) /* <CJK> */
+MAP(0x30, 0x78, 0x56E0) /* <CJK> */
+MAP(0x30, 0x79, 0x59FB) /* <CJK> */
+MAP(0x30, 0x7A, 0x5F15) /* <CJK> */
+MAP(0x30, 0x7B, 0x98F2) /* <CJK> */
+MAP(0x30, 0x7C, 0x6DEB) /* <CJK> */
+MAP(0x30, 0x7D, 0x80E4) /* <CJK> */
+MAP(0x30, 0x7E, 0x852D) /* <CJK> */
+MAP(0x31, 0x21, 0x9662) /* <CJK> */
+MAP(0x31, 0x22, 0x9670) /* <CJK> */
+MAP(0x31, 0x23, 0x96A0) /* <CJK> */
+MAP(0x31, 0x24, 0x97FB) /* <CJK> */
+MAP(0x31, 0x25, 0x540B) /* <CJK> */
+MAP(0x31, 0x26, 0x53F3) /* <CJK> */
+MAP(0x31, 0x27, 0x5B87) /* <CJK> */
+MAP(0x31, 0x28, 0x70CF) /* <CJK> */
+MAP(0x31, 0x29, 0x7FBD) /* <CJK> */
+MAP(0x31, 0x2A, 0x8FC2) /* <CJK> */
+MAP(0x31, 0x2B, 0x96E8) /* <CJK> */
+MAP(0x31, 0x2C, 0x536F) /* <CJK> */
+MAP(0x31, 0x2D, 0x9D5C) /* <CJK> */
+MAP(0x31, 0x2E, 0x7ABA) /* <CJK> */
+MAP(0x31, 0x2F, 0x4E11) /* <CJK> */
+MAP(0x31, 0x30, 0x7893) /* <CJK> */
+MAP(0x31, 0x31, 0x81FC) /* <CJK> */
+MAP(0x31, 0x32, 0x6E26) /* <CJK> */
+MAP(0x31, 0x33, 0x5618) /* <CJK> */
+MAP(0x31, 0x34, 0x5504) /* <CJK> */
+MAP(0x31, 0x35, 0x6B1D) /* <CJK> */
+MAP(0x31, 0x36, 0x851A) /* <CJK> */
+MAP(0x31, 0x37, 0x9C3B) /* <CJK> */
+MAP(0x31, 0x38, 0x59E5) /* <CJK> */
+MAP(0x31, 0x39, 0x53A9) /* <CJK> */
+MAP(0x31, 0x3A, 0x6D66) /* <CJK> */
+MAP(0x31, 0x3B, 0x74DC) /* <CJK> */
+MAP(0x31, 0x3C, 0x958F) /* <CJK> */
+MAP(0x31, 0x3D, 0x5642) /* <CJK> */
+MAP(0x31, 0x3E, 0x4E91) /* <CJK> */
+MAP(0x31, 0x3F, 0x904B) /* <CJK> */
+MAP(0x31, 0x40, 0x96F2) /* <CJK> */
+MAP(0x31, 0x41, 0x834F) /* <CJK> */
+MAP(0x31, 0x42, 0x990C) /* <CJK> */
+MAP(0x31, 0x43, 0x53E1) /* <CJK> */
+MAP(0x31, 0x44, 0x55B6) /* <CJK> */
+MAP(0x31, 0x45, 0x5B30) /* <CJK> */
+MAP(0x31, 0x46, 0x5F71) /* <CJK> */
+MAP(0x31, 0x47, 0x6620) /* <CJK> */
+MAP(0x31, 0x48, 0x66F3) /* <CJK> */
+MAP(0x31, 0x49, 0x6804) /* <CJK> */
+MAP(0x31, 0x4A, 0x6C38) /* <CJK> */
+MAP(0x31, 0x4B, 0x6CF3) /* <CJK> */
+MAP(0x31, 0x4C, 0x6D29) /* <CJK> */
+MAP(0x31, 0x4D, 0x745B) /* <CJK> */
+MAP(0x31, 0x4E, 0x76C8) /* <CJK> */
+MAP(0x31, 0x4F, 0x7A4E) /* <CJK> */
+MAP(0x31, 0x50, 0x9834) /* <CJK> */
+MAP(0x31, 0x51, 0x82F1) /* <CJK> */
+MAP(0x31, 0x52, 0x885B) /* <CJK> */
+MAP(0x31, 0x53, 0x8A60) /* <CJK> */
+MAP(0x31, 0x54, 0x92ED) /* <CJK> */
+MAP(0x31, 0x55, 0x6DB2) /* <CJK> */
+MAP(0x31, 0x56, 0x75AB) /* <CJK> */
+MAP(0x31, 0x57, 0x76CA) /* <CJK> */
+MAP(0x31, 0x58, 0x99C5) /* <CJK> */
+MAP(0x31, 0x59, 0x60A6) /* <CJK> */
+MAP(0x31, 0x5A, 0x8B01) /* <CJK> */
+MAP(0x31, 0x5B, 0x8D8A) /* <CJK> */
+MAP(0x31, 0x5C, 0x95B2) /* <CJK> */
+MAP(0x31, 0x5D, 0x698E) /* <CJK> */
+MAP(0x31, 0x5E, 0x53AD) /* <CJK> */
+MAP(0x31, 0x5F, 0x5186) /* <CJK> */
+MAP(0x31, 0x60, 0x5712) /* <CJK> */
+MAP(0x31, 0x61, 0x5830) /* <CJK> */
+MAP(0x31, 0x62, 0x5944) /* <CJK> */
+MAP(0x31, 0x63, 0x5BB4) /* <CJK> */
+MAP(0x31, 0x64, 0x5EF6) /* <CJK> */
+MAP(0x31, 0x65, 0x6028) /* <CJK> */
+MAP(0x31, 0x66, 0x63A9) /* <CJK> */
+MAP(0x31, 0x67, 0x63F4) /* <CJK> */
+MAP(0x31, 0x68, 0x6CBF) /* <CJK> */
+MAP(0x31, 0x69, 0x6F14) /* <CJK> */
+MAP(0x31, 0x6A, 0x708E) /* <CJK> */
+MAP(0x31, 0x6B, 0x7114) /* <CJK> */
+MAP(0x31, 0x6C, 0x7159) /* <CJK> */
+MAP(0x31, 0x6D, 0x71D5) /* <CJK> */
+MAP(0x31, 0x6E, 0x733F) /* <CJK> */
+MAP(0x31, 0x6F, 0x7E01) /* <CJK> */
+MAP(0x31, 0x70, 0x8276) /* <CJK> */
+MAP(0x31, 0x71, 0x82D1) /* <CJK> */
+MAP(0x31, 0x72, 0x8597) /* <CJK> */
+MAP(0x31, 0x73, 0x9060) /* <CJK> */
+MAP(0x31, 0x74, 0x925B) /* <CJK> */
+MAP(0x31, 0x75, 0x9D1B) /* <CJK> */
+MAP(0x31, 0x76, 0x5869) /* <CJK> */
+MAP(0x31, 0x77, 0x65BC) /* <CJK> */
+MAP(0x31, 0x78, 0x6C5A) /* <CJK> */
+MAP(0x31, 0x79, 0x7525) /* <CJK> */
+MAP(0x31, 0x7A, 0x51F9) /* <CJK> */
+MAP(0x31, 0x7B, 0x592E) /* <CJK> */
+MAP(0x31, 0x7C, 0x5965) /* <CJK> */
+MAP(0x31, 0x7D, 0x5F80) /* <CJK> */
+MAP(0x31, 0x7E, 0x5FDC) /* <CJK> */
+MAP(0x32, 0x21, 0x62BC) /* <CJK> */
+MAP(0x32, 0x22, 0x65FA) /* <CJK> */
+MAP(0x32, 0x23, 0x6A2A) /* <CJK> */
+MAP(0x32, 0x24, 0x6B27) /* <CJK> */
+MAP(0x32, 0x25, 0x6BB4) /* <CJK> */
+MAP(0x32, 0x26, 0x738B) /* <CJK> */
+MAP(0x32, 0x27, 0x7FC1) /* <CJK> */
+MAP(0x32, 0x28, 0x8956) /* <CJK> */
+MAP(0x32, 0x29, 0x9D2C) /* <CJK> */
+MAP(0x32, 0x2A, 0x9D0E) /* <CJK> */
+MAP(0x32, 0x2B, 0x9EC4) /* <CJK> */
+MAP(0x32, 0x2C, 0x5CA1) /* <CJK> */
+MAP(0x32, 0x2D, 0x6C96) /* <CJK> */
+MAP(0x32, 0x2E, 0x837B) /* <CJK> */
+MAP(0x32, 0x2F, 0x5104) /* <CJK> */
+MAP(0x32, 0x30, 0x5C4B) /* <CJK> */
+MAP(0x32, 0x31, 0x61B6) /* <CJK> */
+MAP(0x32, 0x32, 0x81C6) /* <CJK> */
+MAP(0x32, 0x33, 0x6876) /* <CJK> */
+MAP(0x32, 0x34, 0x7261) /* <CJK> */
+MAP(0x32, 0x35, 0x4E59) /* <CJK> */
+MAP(0x32, 0x36, 0x4FFA) /* <CJK> */
+MAP(0x32, 0x37, 0x5378) /* <CJK> */
+MAP(0x32, 0x38, 0x6069) /* <CJK> */
+MAP(0x32, 0x39, 0x6E29) /* <CJK> */
+MAP(0x32, 0x3A, 0x7A4F) /* <CJK> */
+MAP(0x32, 0x3B, 0x97F3) /* <CJK> */
+MAP(0x32, 0x3C, 0x4E0B) /* <CJK> */
+MAP(0x32, 0x3D, 0x5316) /* <CJK> */
+MAP(0x32, 0x3E, 0x4EEE) /* <CJK> */
+MAP(0x32, 0x3F, 0x4F55) /* <CJK> */
+MAP(0x32, 0x40, 0x4F3D) /* <CJK> */
+MAP(0x32, 0x41, 0x4FA1) /* <CJK> */
+MAP(0x32, 0x42, 0x4F73) /* <CJK> */
+MAP(0x32, 0x43, 0x52A0) /* <CJK> */
+MAP(0x32, 0x44, 0x53EF) /* <CJK> */
+MAP(0x32, 0x45, 0x5609) /* <CJK> */
+MAP(0x32, 0x46, 0x590F) /* <CJK> */
+MAP(0x32, 0x47, 0x5AC1) /* <CJK> */
+MAP(0x32, 0x48, 0x5BB6) /* <CJK> */
+MAP(0x32, 0x49, 0x5BE1) /* <CJK> */
+MAP(0x32, 0x4A, 0x79D1) /* <CJK> */
+MAP(0x32, 0x4B, 0x6687) /* <CJK> */
+MAP(0x32, 0x4C, 0x679C) /* <CJK> */
+MAP(0x32, 0x4D, 0x67B6) /* <CJK> */
+MAP(0x32, 0x4E, 0x6B4C) /* <CJK> */
+MAP(0x32, 0x4F, 0x6CB3) /* <CJK> */
+MAP(0x32, 0x50, 0x706B) /* <CJK> */
+MAP(0x32, 0x51, 0x73C2) /* <CJK> */
+MAP(0x32, 0x52, 0x798D) /* <CJK> */
+MAP(0x32, 0x53, 0x79BE) /* <CJK> */
+MAP(0x32, 0x54, 0x7A3C) /* <CJK> */
+MAP(0x32, 0x55, 0x7B87) /* <CJK> */
+MAP(0x32, 0x56, 0x82B1) /* <CJK> */
+MAP(0x32, 0x57, 0x82DB) /* <CJK> */
+MAP(0x32, 0x58, 0x8304) /* <CJK> */
+MAP(0x32, 0x59, 0x8377) /* <CJK> */
+MAP(0x32, 0x5A, 0x83EF) /* <CJK> */
+MAP(0x32, 0x5B, 0x83D3) /* <CJK> */
+MAP(0x32, 0x5C, 0x8766) /* <CJK> */
+MAP(0x32, 0x5D, 0x8AB2) /* <CJK> */
+MAP(0x32, 0x5E, 0x5629) /* <CJK> */
+MAP(0x32, 0x5F, 0x8CA8) /* <CJK> */
+MAP(0x32, 0x60, 0x8FE6) /* <CJK> */
+MAP(0x32, 0x61, 0x904E) /* <CJK> */
+MAP(0x32, 0x62, 0x971E) /* <CJK> */
+MAP(0x32, 0x63, 0x868A) /* <CJK> */
+MAP(0x32, 0x64, 0x4FC4) /* <CJK> */
+MAP(0x32, 0x65, 0x5CE8) /* <CJK> */
+MAP(0x32, 0x66, 0x6211) /* <CJK> */
+MAP(0x32, 0x67, 0x7259) /* <CJK> */
+MAP(0x32, 0x68, 0x753B) /* <CJK> */
+MAP(0x32, 0x69, 0x81E5) /* <CJK> */
+MAP(0x32, 0x6A, 0x82BD) /* <CJK> */
+MAP(0x32, 0x6B, 0x86FE) /* <CJK> */
+MAP(0x32, 0x6C, 0x8CC0) /* <CJK> */
+MAP(0x32, 0x6D, 0x96C5) /* <CJK> */
+MAP(0x32, 0x6E, 0x9913) /* <CJK> */
+MAP(0x32, 0x6F, 0x99D5) /* <CJK> */
+MAP(0x32, 0x70, 0x4ECB) /* <CJK> */
+MAP(0x32, 0x71, 0x4F1A) /* <CJK> */
+MAP(0x32, 0x72, 0x89E3) /* <CJK> */
+MAP(0x32, 0x73, 0x56DE) /* <CJK> */
+MAP(0x32, 0x74, 0x584A) /* <CJK> */
+MAP(0x32, 0x75, 0x58CA) /* <CJK> */
+MAP(0x32, 0x76, 0x5EFB) /* <CJK> */
+MAP(0x32, 0x77, 0x5FEB) /* <CJK> */
+MAP(0x32, 0x78, 0x602A) /* <CJK> */
+MAP(0x32, 0x79, 0x6094) /* <CJK> */
+MAP(0x32, 0x7A, 0x6062) /* <CJK> */
+MAP(0x32, 0x7B, 0x61D0) /* <CJK> */
+MAP(0x32, 0x7C, 0x6212) /* <CJK> */
+MAP(0x32, 0x7D, 0x62D0) /* <CJK> */
+MAP(0x32, 0x7E, 0x6539) /* <CJK> */
+MAP(0x33, 0x21, 0x9B41) /* <CJK> */
+MAP(0x33, 0x22, 0x6666) /* <CJK> */
+MAP(0x33, 0x23, 0x68B0) /* <CJK> */
+MAP(0x33, 0x24, 0x6D77) /* <CJK> */
+MAP(0x33, 0x25, 0x7070) /* <CJK> */
+MAP(0x33, 0x26, 0x754C) /* <CJK> */
+MAP(0x33, 0x27, 0x7686) /* <CJK> */
+MAP(0x33, 0x28, 0x7D75) /* <CJK> */
+MAP(0x33, 0x29, 0x82A5) /* <CJK> */
+MAP(0x33, 0x2A, 0x87F9) /* <CJK> */
+MAP(0x33, 0x2B, 0x958B) /* <CJK> */
+MAP(0x33, 0x2C, 0x968E) /* <CJK> */
+MAP(0x33, 0x2D, 0x8C9D) /* <CJK> */
+MAP(0x33, 0x2E, 0x51F1) /* <CJK> */
+MAP(0x33, 0x2F, 0x52BE) /* <CJK> */
+MAP(0x33, 0x30, 0x5916) /* <CJK> */
+MAP(0x33, 0x31, 0x54B3) /* <CJK> */
+MAP(0x33, 0x32, 0x5BB3) /* <CJK> */
+MAP(0x33, 0x33, 0x5D16) /* <CJK> */
+MAP(0x33, 0x34, 0x6168) /* <CJK> */
+MAP(0x33, 0x35, 0x6982) /* <CJK> */
+MAP(0x33, 0x36, 0x6DAF) /* <CJK> */
+MAP(0x33, 0x37, 0x788D) /* <CJK> */
+MAP(0x33, 0x38, 0x84CB) /* <CJK> */
+MAP(0x33, 0x39, 0x8857) /* <CJK> */
+MAP(0x33, 0x3A, 0x8A72) /* <CJK> */
+MAP(0x33, 0x3B, 0x93A7) /* <CJK> */
+MAP(0x33, 0x3C, 0x9AB8) /* <CJK> */
+MAP(0x33, 0x3D, 0x6D6C) /* <CJK> */
+MAP(0x33, 0x3E, 0x99A8) /* <CJK> */
+MAP(0x33, 0x3F, 0x86D9) /* <CJK> */
+MAP(0x33, 0x40, 0x57A3) /* <CJK> */
+MAP(0x33, 0x41, 0x67FF) /* <CJK> */
+MAP(0x33, 0x42, 0x86CE) /* <CJK> */
+MAP(0x33, 0x43, 0x920E) /* <CJK> */
+MAP(0x33, 0x44, 0x5283) /* <CJK> */
+MAP(0x33, 0x45, 0x5687) /* <CJK> */
+MAP(0x33, 0x46, 0x5404) /* <CJK> */
+MAP(0x33, 0x47, 0x5ED3) /* <CJK> */
+MAP(0x33, 0x48, 0x62E1) /* <CJK> */
+MAP(0x33, 0x49, 0x64B9) /* <CJK> */
+MAP(0x33, 0x4A, 0x683C) /* <CJK> */
+MAP(0x33, 0x4B, 0x6838) /* <CJK> */
+MAP(0x33, 0x4C, 0x6BBB) /* <CJK> */
+MAP(0x33, 0x4D, 0x7372) /* <CJK> */
+MAP(0x33, 0x4E, 0x78BA) /* <CJK> */
+MAP(0x33, 0x4F, 0x7A6B) /* <CJK> */
+MAP(0x33, 0x50, 0x899A) /* <CJK> */
+MAP(0x33, 0x51, 0x89D2) /* <CJK> */
+MAP(0x33, 0x52, 0x8D6B) /* <CJK> */
+MAP(0x33, 0x53, 0x8F03) /* <CJK> */
+MAP(0x33, 0x54, 0x90ED) /* <CJK> */
+MAP(0x33, 0x55, 0x95A3) /* <CJK> */
+MAP(0x33, 0x56, 0x9694) /* <CJK> */
+MAP(0x33, 0x57, 0x9769) /* <CJK> */
+MAP(0x33, 0x58, 0x5B66) /* <CJK> */
+MAP(0x33, 0x59, 0x5CB3) /* <CJK> */
+MAP(0x33, 0x5A, 0x697D) /* <CJK> */
+MAP(0x33, 0x5B, 0x984D) /* <CJK> */
+MAP(0x33, 0x5C, 0x984E) /* <CJK> */
+MAP(0x33, 0x5D, 0x639B) /* <CJK> */
+MAP(0x33, 0x5E, 0x7B20) /* <CJK> */
+MAP(0x33, 0x5F, 0x6A2B) /* <CJK> */
+MAP(0x33, 0x60, 0x6A7F) /* <CJK> */
+MAP(0x33, 0x61, 0x68B6) /* <CJK> */
+MAP(0x33, 0x62, 0x9C0D) /* <CJK> */
+MAP(0x33, 0x63, 0x6F5F) /* <CJK> */
+MAP(0x33, 0x64, 0x5272) /* <CJK> */
+MAP(0x33, 0x65, 0x559D) /* <CJK> */
+MAP(0x33, 0x66, 0x6070) /* <CJK> */
+MAP(0x33, 0x67, 0x62EC) /* <CJK> */
+MAP(0x33, 0x68, 0x6D3B) /* <CJK> */
+MAP(0x33, 0x69, 0x6E07) /* <CJK> */
+MAP(0x33, 0x6A, 0x6ED1) /* <CJK> */
+MAP(0x33, 0x6B, 0x845B) /* <CJK> */
+MAP(0x33, 0x6C, 0x8910) /* <CJK> */
+MAP(0x33, 0x6D, 0x8F44) /* <CJK> */
+MAP(0x33, 0x6E, 0x4E14) /* <CJK> */
+MAP(0x33, 0x6F, 0x9C39) /* <CJK> */
+MAP(0x33, 0x70, 0x53F6) /* <CJK> */
+MAP(0x33, 0x71, 0x691B) /* <CJK> */
+MAP(0x33, 0x72, 0x6A3A) /* <CJK> */
+MAP(0x33, 0x73, 0x9784) /* <CJK> */
+MAP(0x33, 0x74, 0x682A) /* <CJK> */
+MAP(0x33, 0x75, 0x515C) /* <CJK> */
+MAP(0x33, 0x76, 0x7AC3) /* <CJK> */
+MAP(0x33, 0x77, 0x84B2) /* <CJK> */
+MAP(0x33, 0x78, 0x91DC) /* <CJK> */
+MAP(0x33, 0x79, 0x938C) /* <CJK> */
+MAP(0x33, 0x7A, 0x565B) /* <CJK> */
+MAP(0x33, 0x7B, 0x9D28) /* <CJK> */
+MAP(0x33, 0x7C, 0x6822) /* <CJK> */
+MAP(0x33, 0x7D, 0x8305) /* <CJK> */
+MAP(0x33, 0x7E, 0x8431) /* <CJK> */
+MAP(0x34, 0x21, 0x7CA5) /* <CJK> */
+MAP(0x34, 0x22, 0x5208) /* <CJK> */
+MAP(0x34, 0x23, 0x82C5) /* <CJK> */
+MAP(0x34, 0x24, 0x74E6) /* <CJK> */
+MAP(0x34, 0x25, 0x4E7E) /* <CJK> */
+MAP(0x34, 0x26, 0x4F83) /* <CJK> */
+MAP(0x34, 0x27, 0x51A0) /* <CJK> */
+MAP(0x34, 0x28, 0x5BD2) /* <CJK> */
+MAP(0x34, 0x29, 0x520A) /* <CJK> */
+MAP(0x34, 0x2A, 0x52D8) /* <CJK> */
+MAP(0x34, 0x2B, 0x52E7) /* <CJK> */
+MAP(0x34, 0x2C, 0x5DFB) /* <CJK> */
+MAP(0x34, 0x2D, 0x559A) /* <CJK> */
+MAP(0x34, 0x2E, 0x582A) /* <CJK> */
+MAP(0x34, 0x2F, 0x59E6) /* <CJK> */
+MAP(0x34, 0x30, 0x5B8C) /* <CJK> */
+MAP(0x34, 0x31, 0x5B98) /* <CJK> */
+MAP(0x34, 0x32, 0x5BDB) /* <CJK> */
+MAP(0x34, 0x33, 0x5E72) /* <CJK> */
+MAP(0x34, 0x34, 0x5E79) /* <CJK> */
+MAP(0x34, 0x35, 0x60A3) /* <CJK> */
+MAP(0x34, 0x36, 0x611F) /* <CJK> */
+MAP(0x34, 0x37, 0x6163) /* <CJK> */
+MAP(0x34, 0x38, 0x61BE) /* <CJK> */
+MAP(0x34, 0x39, 0x63DB) /* <CJK> */
+MAP(0x34, 0x3A, 0x6562) /* <CJK> */
+MAP(0x34, 0x3B, 0x67D1) /* <CJK> */
+MAP(0x34, 0x3C, 0x6853) /* <CJK> */
+MAP(0x34, 0x3D, 0x68FA) /* <CJK> */
+MAP(0x34, 0x3E, 0x6B3E) /* <CJK> */
+MAP(0x34, 0x3F, 0x6B53) /* <CJK> */
+MAP(0x34, 0x40, 0x6C57) /* <CJK> */
+MAP(0x34, 0x41, 0x6F22) /* <CJK> */
+MAP(0x34, 0x42, 0x6F97) /* <CJK> */
+MAP(0x34, 0x43, 0x6F45) /* <CJK> */
+MAP(0x34, 0x44, 0x74B0) /* <CJK> */
+MAP(0x34, 0x45, 0x7518) /* <CJK> */
+MAP(0x34, 0x46, 0x76E3) /* <CJK> */
+MAP(0x34, 0x47, 0x770B) /* <CJK> */
+MAP(0x34, 0x48, 0x7AFF) /* <CJK> */
+MAP(0x34, 0x49, 0x7BA1) /* <CJK> */
+MAP(0x34, 0x4A, 0x7C21) /* <CJK> */
+MAP(0x34, 0x4B, 0x7DE9) /* <CJK> */
+MAP(0x34, 0x4C, 0x7F36) /* <CJK> */
+MAP(0x34, 0x4D, 0x7FF0) /* <CJK> */
+MAP(0x34, 0x4E, 0x809D) /* <CJK> */
+MAP(0x34, 0x4F, 0x8266) /* <CJK> */
+MAP(0x34, 0x50, 0x839E) /* <CJK> */
+MAP(0x34, 0x51, 0x89B3) /* <CJK> */
+MAP(0x34, 0x52, 0x8ACC) /* <CJK> */
+MAP(0x34, 0x53, 0x8CAB) /* <CJK> */
+MAP(0x34, 0x54, 0x9084) /* <CJK> */
+MAP(0x34, 0x55, 0x9451) /* <CJK> */
+MAP(0x34, 0x56, 0x9593) /* <CJK> */
+MAP(0x34, 0x57, 0x9591) /* <CJK> */
+MAP(0x34, 0x58, 0x95A2) /* <CJK> */
+MAP(0x34, 0x59, 0x9665) /* <CJK> */
+MAP(0x34, 0x5A, 0x97D3) /* <CJK> */
+MAP(0x34, 0x5B, 0x9928) /* <CJK> */
+MAP(0x34, 0x5C, 0x8218) /* <CJK> */
+MAP(0x34, 0x5D, 0x4E38) /* <CJK> */
+MAP(0x34, 0x5E, 0x542B) /* <CJK> */
+MAP(0x34, 0x5F, 0x5CB8) /* <CJK> */
+MAP(0x34, 0x60, 0x5DCC) /* <CJK> */
+MAP(0x34, 0x61, 0x73A9) /* <CJK> */
+MAP(0x34, 0x62, 0x764C) /* <CJK> */
+MAP(0x34, 0x63, 0x773C) /* <CJK> */
+MAP(0x34, 0x64, 0x5CA9) /* <CJK> */
+MAP(0x34, 0x65, 0x7FEB) /* <CJK> */
+MAP(0x34, 0x66, 0x8D0B) /* <CJK> */
+MAP(0x34, 0x67, 0x96C1) /* <CJK> */
+MAP(0x34, 0x68, 0x9811) /* <CJK> */
+MAP(0x34, 0x69, 0x9854) /* <CJK> */
+MAP(0x34, 0x6A, 0x9858) /* <CJK> */
+MAP(0x34, 0x6B, 0x4F01) /* <CJK> */
+MAP(0x34, 0x6C, 0x4F0E) /* <CJK> */
+MAP(0x34, 0x6D, 0x5371) /* <CJK> */
+MAP(0x34, 0x6E, 0x559C) /* <CJK> */
+MAP(0x34, 0x6F, 0x5668) /* <CJK> */
+MAP(0x34, 0x70, 0x57FA) /* <CJK> */
+MAP(0x34, 0x71, 0x5947) /* <CJK> */
+MAP(0x34, 0x72, 0x5B09) /* <CJK> */
+MAP(0x34, 0x73, 0x5BC4) /* <CJK> */
+MAP(0x34, 0x74, 0x5C90) /* <CJK> */
+MAP(0x34, 0x75, 0x5E0C) /* <CJK> */
+MAP(0x34, 0x76, 0x5E7E) /* <CJK> */
+MAP(0x34, 0x77, 0x5FCC) /* <CJK> */
+MAP(0x34, 0x78, 0x63EE) /* <CJK> */
+MAP(0x34, 0x79, 0x673A) /* <CJK> */
+MAP(0x34, 0x7A, 0x65D7) /* <CJK> */
+MAP(0x34, 0x7B, 0x65E2) /* <CJK> */
+MAP(0x34, 0x7C, 0x671F) /* <CJK> */
+MAP(0x34, 0x7D, 0x68CB) /* <CJK> */
+MAP(0x34, 0x7E, 0x68C4) /* <CJK> */
+MAP(0x35, 0x21, 0x6A5F) /* <CJK> */
+MAP(0x35, 0x22, 0x5E30) /* <CJK> */
+MAP(0x35, 0x23, 0x6BC5) /* <CJK> */
+MAP(0x35, 0x24, 0x6C17) /* <CJK> */
+MAP(0x35, 0x25, 0x6C7D) /* <CJK> */
+MAP(0x35, 0x26, 0x757F) /* <CJK> */
+MAP(0x35, 0x27, 0x7948) /* <CJK> */
+MAP(0x35, 0x28, 0x5B63) /* <CJK> */
+MAP(0x35, 0x29, 0x7A00) /* <CJK> */
+MAP(0x35, 0x2A, 0x7D00) /* <CJK> */
+MAP(0x35, 0x2B, 0x5FBD) /* <CJK> */
+MAP(0x35, 0x2C, 0x898F) /* <CJK> */
+MAP(0x35, 0x2D, 0x8A18) /* <CJK> */
+MAP(0x35, 0x2E, 0x8CB4) /* <CJK> */
+MAP(0x35, 0x2F, 0x8D77) /* <CJK> */
+MAP(0x35, 0x30, 0x8ECC) /* <CJK> */
+MAP(0x35, 0x31, 0x8F1D) /* <CJK> */
+MAP(0x35, 0x32, 0x98E2) /* <CJK> */
+MAP(0x35, 0x33, 0x9A0E) /* <CJK> */
+MAP(0x35, 0x34, 0x9B3C) /* <CJK> */
+MAP(0x35, 0x35, 0x4E80) /* <CJK> */
+MAP(0x35, 0x36, 0x507D) /* <CJK> */
+MAP(0x35, 0x37, 0x5100) /* <CJK> */
+MAP(0x35, 0x38, 0x5993) /* <CJK> */
+MAP(0x35, 0x39, 0x5B9C) /* <CJK> */
+MAP(0x35, 0x3A, 0x622F) /* <CJK> */
+MAP(0x35, 0x3B, 0x6280) /* <CJK> */
+MAP(0x35, 0x3C, 0x64EC) /* <CJK> */
+MAP(0x35, 0x3D, 0x6B3A) /* <CJK> */
+MAP(0x35, 0x3E, 0x72A0) /* <CJK> */
+MAP(0x35, 0x3F, 0x7591) /* <CJK> */
+MAP(0x35, 0x40, 0x7947) /* <CJK> */
+MAP(0x35, 0x41, 0x7FA9) /* <CJK> */
+MAP(0x35, 0x42, 0x87FB) /* <CJK> */
+MAP(0x35, 0x43, 0x8ABC) /* <CJK> */
+MAP(0x35, 0x44, 0x8B70) /* <CJK> */
+MAP(0x35, 0x45, 0x63AC) /* <CJK> */
+MAP(0x35, 0x46, 0x83CA) /* <CJK> */
+MAP(0x35, 0x47, 0x97A0) /* <CJK> */
+MAP(0x35, 0x48, 0x5409) /* <CJK> */
+MAP(0x35, 0x49, 0x5403) /* <CJK> */
+MAP(0x35, 0x4A, 0x55AB) /* <CJK> */
+MAP(0x35, 0x4B, 0x6854) /* <CJK> */
+MAP(0x35, 0x4C, 0x6A58) /* <CJK> */
+MAP(0x35, 0x4D, 0x8A70) /* <CJK> */
+MAP(0x35, 0x4E, 0x7827) /* <CJK> */
+MAP(0x35, 0x4F, 0x6775) /* <CJK> */
+MAP(0x35, 0x50, 0x9ECD) /* <CJK> */
+MAP(0x35, 0x51, 0x5374) /* <CJK> */
+MAP(0x35, 0x52, 0x5BA2) /* <CJK> */
+MAP(0x35, 0x53, 0x811A) /* <CJK> */
+MAP(0x35, 0x54, 0x8650) /* <CJK> */
+MAP(0x35, 0x55, 0x9006) /* <CJK> */
+MAP(0x35, 0x56, 0x4E18) /* <CJK> */
+MAP(0x35, 0x57, 0x4E45) /* <CJK> */
+MAP(0x35, 0x58, 0x4EC7) /* <CJK> */
+MAP(0x35, 0x59, 0x4F11) /* <CJK> */
+MAP(0x35, 0x5A, 0x53CA) /* <CJK> */
+MAP(0x35, 0x5B, 0x5438) /* <CJK> */
+MAP(0x35, 0x5C, 0x5BAE) /* <CJK> */
+MAP(0x35, 0x5D, 0x5F13) /* <CJK> */
+MAP(0x35, 0x5E, 0x6025) /* <CJK> */
+MAP(0x35, 0x5F, 0x6551) /* <CJK> */
+MAP(0x35, 0x60, 0x673D) /* <CJK> */
+MAP(0x35, 0x61, 0x6C42) /* <CJK> */
+MAP(0x35, 0x62, 0x6C72) /* <CJK> */
+MAP(0x35, 0x63, 0x6CE3) /* <CJK> */
+MAP(0x35, 0x64, 0x7078) /* <CJK> */
+MAP(0x35, 0x65, 0x7403) /* <CJK> */
+MAP(0x35, 0x66, 0x7A76) /* <CJK> */
+MAP(0x35, 0x67, 0x7AAE) /* <CJK> */
+MAP(0x35, 0x68, 0x7B08) /* <CJK> */
+MAP(0x35, 0x69, 0x7D1A) /* <CJK> */
+MAP(0x35, 0x6A, 0x7CFE) /* <CJK> */
+MAP(0x35, 0x6B, 0x7D66) /* <CJK> */
+MAP(0x35, 0x6C, 0x65E7) /* <CJK> */
+MAP(0x35, 0x6D, 0x725B) /* <CJK> */
+MAP(0x35, 0x6E, 0x53BB) /* <CJK> */
+MAP(0x35, 0x6F, 0x5C45) /* <CJK> */
+MAP(0x35, 0x70, 0x5DE8) /* <CJK> */
+MAP(0x35, 0x71, 0x62D2) /* <CJK> */
+MAP(0x35, 0x72, 0x62E0) /* <CJK> */
+MAP(0x35, 0x73, 0x6319) /* <CJK> */
+MAP(0x35, 0x74, 0x6E20) /* <CJK> */
+MAP(0x35, 0x75, 0x865A) /* <CJK> */
+MAP(0x35, 0x76, 0x8A31) /* <CJK> */
+MAP(0x35, 0x77, 0x8DDD) /* <CJK> */
+MAP(0x35, 0x78, 0x92F8) /* <CJK> */
+MAP(0x35, 0x79, 0x6F01) /* <CJK> */
+MAP(0x35, 0x7A, 0x79A6) /* <CJK> */
+MAP(0x35, 0x7B, 0x9B5A) /* <CJK> */
+MAP(0x35, 0x7C, 0x4EA8) /* <CJK> */
+MAP(0x35, 0x7D, 0x4EAB) /* <CJK> */
+MAP(0x35, 0x7E, 0x4EAC) /* <CJK> */
+MAP(0x36, 0x21, 0x4F9B) /* <CJK> */
+MAP(0x36, 0x22, 0x4FA0) /* <CJK> */
+MAP(0x36, 0x23, 0x50D1) /* <CJK> */
+MAP(0x36, 0x24, 0x5147) /* <CJK> */
+MAP(0x36, 0x25, 0x7AF6) /* <CJK> */
+MAP(0x36, 0x26, 0x5171) /* <CJK> */
+MAP(0x36, 0x27, 0x51F6) /* <CJK> */
+MAP(0x36, 0x28, 0x5354) /* <CJK> */
+MAP(0x36, 0x29, 0x5321) /* <CJK> */
+MAP(0x36, 0x2A, 0x537F) /* <CJK> */
+MAP(0x36, 0x2B, 0x53EB) /* <CJK> */
+MAP(0x36, 0x2C, 0x55AC) /* <CJK> */
+MAP(0x36, 0x2D, 0x5883) /* <CJK> */
+MAP(0x36, 0x2E, 0x5CE1) /* <CJK> */
+MAP(0x36, 0x2F, 0x5F37) /* <CJK> */
+MAP(0x36, 0x30, 0x5F4A) /* <CJK> */
+MAP(0x36, 0x31, 0x602F) /* <CJK> */
+MAP(0x36, 0x32, 0x6050) /* <CJK> */
+MAP(0x36, 0x33, 0x606D) /* <CJK> */
+MAP(0x36, 0x34, 0x631F) /* <CJK> */
+MAP(0x36, 0x35, 0x6559) /* <CJK> */
+MAP(0x36, 0x36, 0x6A4B) /* <CJK> */
+MAP(0x36, 0x37, 0x6CC1) /* <CJK> */
+MAP(0x36, 0x38, 0x72C2) /* <CJK> */
+MAP(0x36, 0x39, 0x72ED) /* <CJK> */
+MAP(0x36, 0x3A, 0x77EF) /* <CJK> */
+MAP(0x36, 0x3B, 0x80F8) /* <CJK> */
+MAP(0x36, 0x3C, 0x8105) /* <CJK> */
+MAP(0x36, 0x3D, 0x8208) /* <CJK> */
+MAP(0x36, 0x3E, 0x854E) /* <CJK> */
+MAP(0x36, 0x3F, 0x90F7) /* <CJK> */
+MAP(0x36, 0x40, 0x93E1) /* <CJK> */
+MAP(0x36, 0x41, 0x97FF) /* <CJK> */
+MAP(0x36, 0x42, 0x9957) /* <CJK> */
+MAP(0x36, 0x43, 0x9A5A) /* <CJK> */
+MAP(0x36, 0x44, 0x4EF0) /* <CJK> */
+MAP(0x36, 0x45, 0x51DD) /* <CJK> */
+MAP(0x36, 0x46, 0x5C2D) /* <CJK> */
+MAP(0x36, 0x47, 0x6681) /* <CJK> */
+MAP(0x36, 0x48, 0x696D) /* <CJK> */
+MAP(0x36, 0x49, 0x5C40) /* <CJK> */
+MAP(0x36, 0x4A, 0x66F2) /* <CJK> */
+MAP(0x36, 0x4B, 0x6975) /* <CJK> */
+MAP(0x36, 0x4C, 0x7389) /* <CJK> */
+MAP(0x36, 0x4D, 0x6850) /* <CJK> */
+MAP(0x36, 0x4E, 0x7C81) /* <CJK> */
+MAP(0x36, 0x4F, 0x50C5) /* <CJK> */
+MAP(0x36, 0x50, 0x52E4) /* <CJK> */
+MAP(0x36, 0x51, 0x5747) /* <CJK> */
+MAP(0x36, 0x52, 0x5DFE) /* <CJK> */
+MAP(0x36, 0x53, 0x9326) /* <CJK> */
+MAP(0x36, 0x54, 0x65A4) /* <CJK> */
+MAP(0x36, 0x55, 0x6B23) /* <CJK> */
+MAP(0x36, 0x56, 0x6B3D) /* <CJK> */
+MAP(0x36, 0x57, 0x7434) /* <CJK> */
+MAP(0x36, 0x58, 0x7981) /* <CJK> */
+MAP(0x36, 0x59, 0x79BD) /* <CJK> */
+MAP(0x36, 0x5A, 0x7B4B) /* <CJK> */
+MAP(0x36, 0x5B, 0x7DCA) /* <CJK> */
+MAP(0x36, 0x5C, 0x82B9) /* <CJK> */
+MAP(0x36, 0x5D, 0x83CC) /* <CJK> */
+MAP(0x36, 0x5E, 0x887F) /* <CJK> */
+MAP(0x36, 0x5F, 0x895F) /* <CJK> */
+MAP(0x36, 0x60, 0x8B39) /* <CJK> */
+MAP(0x36, 0x61, 0x8FD1) /* <CJK> */
+MAP(0x36, 0x62, 0x91D1) /* <CJK> */
+MAP(0x36, 0x63, 0x541F) /* <CJK> */
+MAP(0x36, 0x64, 0x9280) /* <CJK> */
+MAP(0x36, 0x65, 0x4E5D) /* <CJK> */
+MAP(0x36, 0x66, 0x5036) /* <CJK> */
+MAP(0x36, 0x67, 0x53E5) /* <CJK> */
+MAP(0x36, 0x68, 0x533A) /* <CJK> */
+MAP(0x36, 0x69, 0x72D7) /* <CJK> */
+MAP(0x36, 0x6A, 0x7396) /* <CJK> */
+MAP(0x36, 0x6B, 0x77E9) /* <CJK> */
+MAP(0x36, 0x6C, 0x82E6) /* <CJK> */
+MAP(0x36, 0x6D, 0x8EAF) /* <CJK> */
+MAP(0x36, 0x6E, 0x99C6) /* <CJK> */
+MAP(0x36, 0x6F, 0x99C8) /* <CJK> */
+MAP(0x36, 0x70, 0x99D2) /* <CJK> */
+MAP(0x36, 0x71, 0x5177) /* <CJK> */
+MAP(0x36, 0x72, 0x611A) /* <CJK> */
+MAP(0x36, 0x73, 0x865E) /* <CJK> */
+MAP(0x36, 0x74, 0x55B0) /* <CJK> */
+MAP(0x36, 0x75, 0x7A7A) /* <CJK> */
+MAP(0x36, 0x76, 0x5076) /* <CJK> */
+MAP(0x36, 0x77, 0x5BD3) /* <CJK> */
+MAP(0x36, 0x78, 0x9047) /* <CJK> */
+MAP(0x36, 0x79, 0x9685) /* <CJK> */
+MAP(0x36, 0x7A, 0x4E32) /* <CJK> */
+MAP(0x36, 0x7B, 0x6ADB) /* <CJK> */
+MAP(0x36, 0x7C, 0x91E7) /* <CJK> */
+MAP(0x36, 0x7D, 0x5C51) /* <CJK> */
+MAP(0x36, 0x7E, 0x5C48) /* <CJK> */
+MAP(0x37, 0x21, 0x6398) /* <CJK> */
+MAP(0x37, 0x22, 0x7A9F) /* <CJK> */
+MAP(0x37, 0x23, 0x6C93) /* <CJK> */
+MAP(0x37, 0x24, 0x9774) /* <CJK> */
+MAP(0x37, 0x25, 0x8F61) /* <CJK> */
+MAP(0x37, 0x26, 0x7AAA) /* <CJK> */
+MAP(0x37, 0x27, 0x718A) /* <CJK> */
+MAP(0x37, 0x28, 0x9688) /* <CJK> */
+MAP(0x37, 0x29, 0x7C82) /* <CJK> */
+MAP(0x37, 0x2A, 0x6817) /* <CJK> */
+MAP(0x37, 0x2B, 0x7E70) /* <CJK> */
+MAP(0x37, 0x2C, 0x6851) /* <CJK> */
+MAP(0x37, 0x2D, 0x936C) /* <CJK> */
+MAP(0x37, 0x2E, 0x52F2) /* <CJK> */
+MAP(0x37, 0x2F, 0x541B) /* <CJK> */
+MAP(0x37, 0x30, 0x85AB) /* <CJK> */
+MAP(0x37, 0x31, 0x8A13) /* <CJK> */
+MAP(0x37, 0x32, 0x7FA4) /* <CJK> */
+MAP(0x37, 0x33, 0x8ECD) /* <CJK> */
+MAP(0x37, 0x34, 0x90E1) /* <CJK> */
+MAP(0x37, 0x35, 0x5366) /* <CJK> */
+MAP(0x37, 0x36, 0x8888) /* <CJK> */
+MAP(0x37, 0x37, 0x7941) /* <CJK> */
+MAP(0x37, 0x38, 0x4FC2) /* <CJK> */
+MAP(0x37, 0x39, 0x50BE) /* <CJK> */
+MAP(0x37, 0x3A, 0x5211) /* <CJK> */
+MAP(0x37, 0x3B, 0x5144) /* <CJK> */
+MAP(0x37, 0x3C, 0x5553) /* <CJK> */
+MAP(0x37, 0x3D, 0x572D) /* <CJK> */
+MAP(0x37, 0x3E, 0x73EA) /* <CJK> */
+MAP(0x37, 0x3F, 0x578B) /* <CJK> */
+MAP(0x37, 0x40, 0x5951) /* <CJK> */
+MAP(0x37, 0x41, 0x5F62) /* <CJK> */
+MAP(0x37, 0x42, 0x5F84) /* <CJK> */
+MAP(0x37, 0x43, 0x6075) /* <CJK> */
+MAP(0x37, 0x44, 0x6176) /* <CJK> */
+MAP(0x37, 0x45, 0x6167) /* <CJK> */
+MAP(0x37, 0x46, 0x61A9) /* <CJK> */
+MAP(0x37, 0x47, 0x63B2) /* <CJK> */
+MAP(0x37, 0x48, 0x643A) /* <CJK> */
+MAP(0x37, 0x49, 0x656C) /* <CJK> */
+MAP(0x37, 0x4A, 0x666F) /* <CJK> */
+MAP(0x37, 0x4B, 0x6842) /* <CJK> */
+MAP(0x37, 0x4C, 0x6E13) /* <CJK> */
+MAP(0x37, 0x4D, 0x7566) /* <CJK> */
+MAP(0x37, 0x4E, 0x7A3D) /* <CJK> */
+MAP(0x37, 0x4F, 0x7CFB) /* <CJK> */
+MAP(0x37, 0x50, 0x7D4C) /* <CJK> */
+MAP(0x37, 0x51, 0x7D99) /* <CJK> */
+MAP(0x37, 0x52, 0x7E4B) /* <CJK> */
+MAP(0x37, 0x53, 0x7F6B) /* <CJK> */
+MAP(0x37, 0x54, 0x830E) /* <CJK> */
+MAP(0x37, 0x55, 0x834A) /* <CJK> */
+MAP(0x37, 0x56, 0x86CD) /* <CJK> */
+MAP(0x37, 0x57, 0x8A08) /* <CJK> */
+MAP(0x37, 0x58, 0x8A63) /* <CJK> */
+MAP(0x37, 0x59, 0x8B66) /* <CJK> */
+MAP(0x37, 0x5A, 0x8EFD) /* <CJK> */
+MAP(0x37, 0x5B, 0x981A) /* <CJK> */
+MAP(0x37, 0x5C, 0x9D8F) /* <CJK> */
+MAP(0x37, 0x5D, 0x82B8) /* <CJK> */
+MAP(0x37, 0x5E, 0x8FCE) /* <CJK> */
+MAP(0x37, 0x5F, 0x9BE8) /* <CJK> */
+MAP(0x37, 0x60, 0x5287) /* <CJK> */
+MAP(0x37, 0x61, 0x621F) /* <CJK> */
+MAP(0x37, 0x62, 0x6483) /* <CJK> */
+MAP(0x37, 0x63, 0x6FC0) /* <CJK> */
+MAP(0x37, 0x64, 0x9699) /* <CJK> */
+MAP(0x37, 0x65, 0x6841) /* <CJK> */
+MAP(0x37, 0x66, 0x5091) /* <CJK> */
+MAP(0x37, 0x67, 0x6B20) /* <CJK> */
+MAP(0x37, 0x68, 0x6C7A) /* <CJK> */
+MAP(0x37, 0x69, 0x6F54) /* <CJK> */
+MAP(0x37, 0x6A, 0x7A74) /* <CJK> */
+MAP(0x37, 0x6B, 0x7D50) /* <CJK> */
+MAP(0x37, 0x6C, 0x8840) /* <CJK> */
+MAP(0x37, 0x6D, 0x8A23) /* <CJK> */
+MAP(0x37, 0x6E, 0x6708) /* <CJK> */
+MAP(0x37, 0x6F, 0x4EF6) /* <CJK> */
+MAP(0x37, 0x70, 0x5039) /* <CJK> */
+MAP(0x37, 0x71, 0x5026) /* <CJK> */
+MAP(0x37, 0x72, 0x5065) /* <CJK> */
+MAP(0x37, 0x73, 0x517C) /* <CJK> */
+MAP(0x37, 0x74, 0x5238) /* <CJK> */
+MAP(0x37, 0x75, 0x5263) /* <CJK> */
+MAP(0x37, 0x76, 0x55A7) /* <CJK> */
+MAP(0x37, 0x77, 0x570F) /* <CJK> */
+MAP(0x37, 0x78, 0x5805) /* <CJK> */
+MAP(0x37, 0x79, 0x5ACC) /* <CJK> */
+MAP(0x37, 0x7A, 0x5EFA) /* <CJK> */
+MAP(0x37, 0x7B, 0x61B2) /* <CJK> */
+MAP(0x37, 0x7C, 0x61F8) /* <CJK> */
+MAP(0x37, 0x7D, 0x62F3) /* <CJK> */
+MAP(0x37, 0x7E, 0x6372) /* <CJK> */
+MAP(0x38, 0x21, 0x691C) /* <CJK> */
+MAP(0x38, 0x22, 0x6A29) /* <CJK> */
+MAP(0x38, 0x23, 0x727D) /* <CJK> */
+MAP(0x38, 0x24, 0x72AC) /* <CJK> */
+MAP(0x38, 0x25, 0x732E) /* <CJK> */
+MAP(0x38, 0x26, 0x7814) /* <CJK> */
+MAP(0x38, 0x27, 0x786F) /* <CJK> */
+MAP(0x38, 0x28, 0x7D79) /* <CJK> */
+MAP(0x38, 0x29, 0x770C) /* <CJK> */
+MAP(0x38, 0x2A, 0x80A9) /* <CJK> */
+MAP(0x38, 0x2B, 0x898B) /* <CJK> */
+MAP(0x38, 0x2C, 0x8B19) /* <CJK> */
+MAP(0x38, 0x2D, 0x8CE2) /* <CJK> */
+MAP(0x38, 0x2E, 0x8ED2) /* <CJK> */
+MAP(0x38, 0x2F, 0x9063) /* <CJK> */
+MAP(0x38, 0x30, 0x9375) /* <CJK> */
+MAP(0x38, 0x31, 0x967A) /* <CJK> */
+MAP(0x38, 0x32, 0x9855) /* <CJK> */
+MAP(0x38, 0x33, 0x9A13) /* <CJK> */
+MAP(0x38, 0x34, 0x9E78) /* <CJK> */
+MAP(0x38, 0x35, 0x5143) /* <CJK> */
+MAP(0x38, 0x36, 0x539F) /* <CJK> */
+MAP(0x38, 0x37, 0x53B3) /* <CJK> */
+MAP(0x38, 0x38, 0x5E7B) /* <CJK> */
+MAP(0x38, 0x39, 0x5F26) /* <CJK> */
+MAP(0x38, 0x3A, 0x6E1B) /* <CJK> */
+MAP(0x38, 0x3B, 0x6E90) /* <CJK> */
+MAP(0x38, 0x3C, 0x7384) /* <CJK> */
+MAP(0x38, 0x3D, 0x73FE) /* <CJK> */
+MAP(0x38, 0x3E, 0x7D43) /* <CJK> */
+MAP(0x38, 0x3F, 0x8237) /* <CJK> */
+MAP(0x38, 0x40, 0x8A00) /* <CJK> */
+MAP(0x38, 0x41, 0x8AFA) /* <CJK> */
+MAP(0x38, 0x42, 0x9650) /* <CJK> */
+MAP(0x38, 0x43, 0x4E4E) /* <CJK> */
+MAP(0x38, 0x44, 0x500B) /* <CJK> */
+MAP(0x38, 0x45, 0x53E4) /* <CJK> */
+MAP(0x38, 0x46, 0x547C) /* <CJK> */
+MAP(0x38, 0x47, 0x56FA) /* <CJK> */
+MAP(0x38, 0x48, 0x59D1) /* <CJK> */
+MAP(0x38, 0x49, 0x5B64) /* <CJK> */
+MAP(0x38, 0x4A, 0x5DF1) /* <CJK> */
+MAP(0x38, 0x4B, 0x5EAB) /* <CJK> */
+MAP(0x38, 0x4C, 0x5F27) /* <CJK> */
+MAP(0x38, 0x4D, 0x6238) /* <CJK> */
+MAP(0x38, 0x4E, 0x6545) /* <CJK> */
+MAP(0x38, 0x4F, 0x67AF) /* <CJK> */
+MAP(0x38, 0x50, 0x6E56) /* <CJK> */
+MAP(0x38, 0x51, 0x72D0) /* <CJK> */
+MAP(0x38, 0x52, 0x7CCA) /* <CJK> */
+MAP(0x38, 0x53, 0x88B4) /* <CJK> */
+MAP(0x38, 0x54, 0x80A1) /* <CJK> */
+MAP(0x38, 0x55, 0x80E1) /* <CJK> */
+MAP(0x38, 0x56, 0x83F0) /* <CJK> */
+MAP(0x38, 0x57, 0x864E) /* <CJK> */
+MAP(0x38, 0x58, 0x8A87) /* <CJK> */
+MAP(0x38, 0x59, 0x8DE8) /* <CJK> */
+MAP(0x38, 0x5A, 0x9237) /* <CJK> */
+MAP(0x38, 0x5B, 0x96C7) /* <CJK> */
+MAP(0x38, 0x5C, 0x9867) /* <CJK> */
+MAP(0x38, 0x5D, 0x9F13) /* <CJK> */
+MAP(0x38, 0x5E, 0x4E94) /* <CJK> */
+MAP(0x38, 0x5F, 0x4E92) /* <CJK> */
+MAP(0x38, 0x60, 0x4F0D) /* <CJK> */
+MAP(0x38, 0x61, 0x5348) /* <CJK> */
+MAP(0x38, 0x62, 0x5449) /* <CJK> */
+MAP(0x38, 0x63, 0x543E) /* <CJK> */
+MAP(0x38, 0x64, 0x5A2F) /* <CJK> */
+MAP(0x38, 0x65, 0x5F8C) /* <CJK> */
+MAP(0x38, 0x66, 0x5FA1) /* <CJK> */
+MAP(0x38, 0x67, 0x609F) /* <CJK> */
+MAP(0x38, 0x68, 0x68A7) /* <CJK> */
+MAP(0x38, 0x69, 0x6A8E) /* <CJK> */
+MAP(0x38, 0x6A, 0x745A) /* <CJK> */
+MAP(0x38, 0x6B, 0x7881) /* <CJK> */
+MAP(0x38, 0x6C, 0x8A9E) /* <CJK> */
+MAP(0x38, 0x6D, 0x8AA4) /* <CJK> */
+MAP(0x38, 0x6E, 0x8B77) /* <CJK> */
+MAP(0x38, 0x6F, 0x9190) /* <CJK> */
+MAP(0x38, 0x70, 0x4E5E) /* <CJK> */
+MAP(0x38, 0x71, 0x9BC9) /* <CJK> */
+MAP(0x38, 0x72, 0x4EA4) /* <CJK> */
+MAP(0x38, 0x73, 0x4F7C) /* <CJK> */
+MAP(0x38, 0x74, 0x4FAF) /* <CJK> */
+MAP(0x38, 0x75, 0x5019) /* <CJK> */
+MAP(0x38, 0x76, 0x5016) /* <CJK> */
+MAP(0x38, 0x77, 0x5149) /* <CJK> */
+MAP(0x38, 0x78, 0x516C) /* <CJK> */
+MAP(0x38, 0x79, 0x529F) /* <CJK> */
+MAP(0x38, 0x7A, 0x52B9) /* <CJK> */
+MAP(0x38, 0x7B, 0x52FE) /* <CJK> */
+MAP(0x38, 0x7C, 0x539A) /* <CJK> */
+MAP(0x38, 0x7D, 0x53E3) /* <CJK> */
+MAP(0x38, 0x7E, 0x5411) /* <CJK> */
+MAP(0x39, 0x21, 0x540E) /* <CJK> */
+MAP(0x39, 0x22, 0x5589) /* <CJK> */
+MAP(0x39, 0x23, 0x5751) /* <CJK> */
+MAP(0x39, 0x24, 0x57A2) /* <CJK> */
+MAP(0x39, 0x25, 0x597D) /* <CJK> */
+MAP(0x39, 0x26, 0x5B54) /* <CJK> */
+MAP(0x39, 0x27, 0x5B5D) /* <CJK> */
+MAP(0x39, 0x28, 0x5B8F) /* <CJK> */
+MAP(0x39, 0x29, 0x5DE5) /* <CJK> */
+MAP(0x39, 0x2A, 0x5DE7) /* <CJK> */
+MAP(0x39, 0x2B, 0x5DF7) /* <CJK> */
+MAP(0x39, 0x2C, 0x5E78) /* <CJK> */
+MAP(0x39, 0x2D, 0x5E83) /* <CJK> */
+MAP(0x39, 0x2E, 0x5E9A) /* <CJK> */
+MAP(0x39, 0x2F, 0x5EB7) /* <CJK> */
+MAP(0x39, 0x30, 0x5F18) /* <CJK> */
+MAP(0x39, 0x31, 0x6052) /* <CJK> */
+MAP(0x39, 0x32, 0x614C) /* <CJK> */
+MAP(0x39, 0x33, 0x6297) /* <CJK> */
+MAP(0x39, 0x34, 0x62D8) /* <CJK> */
+MAP(0x39, 0x35, 0x63A7) /* <CJK> */
+MAP(0x39, 0x36, 0x653B) /* <CJK> */
+MAP(0x39, 0x37, 0x6602) /* <CJK> */
+MAP(0x39, 0x38, 0x6643) /* <CJK> */
+MAP(0x39, 0x39, 0x66F4) /* <CJK> */
+MAP(0x39, 0x3A, 0x676D) /* <CJK> */
+MAP(0x39, 0x3B, 0x6821) /* <CJK> */
+MAP(0x39, 0x3C, 0x6897) /* <CJK> */
+MAP(0x39, 0x3D, 0x69CB) /* <CJK> */
+MAP(0x39, 0x3E, 0x6C5F) /* <CJK> */
+MAP(0x39, 0x3F, 0x6D2A) /* <CJK> */
+MAP(0x39, 0x40, 0x6D69) /* <CJK> */
+MAP(0x39, 0x41, 0x6E2F) /* <CJK> */
+MAP(0x39, 0x42, 0x6E9D) /* <CJK> */
+MAP(0x39, 0x43, 0x7532) /* <CJK> */
+MAP(0x39, 0x44, 0x7687) /* <CJK> */
+MAP(0x39, 0x45, 0x786C) /* <CJK> */
+MAP(0x39, 0x46, 0x7A3F) /* <CJK> */
+MAP(0x39, 0x47, 0x7CE0) /* <CJK> */
+MAP(0x39, 0x48, 0x7D05) /* <CJK> */
+MAP(0x39, 0x49, 0x7D18) /* <CJK> */
+MAP(0x39, 0x4A, 0x7D5E) /* <CJK> */
+MAP(0x39, 0x4B, 0x7DB1) /* <CJK> */
+MAP(0x39, 0x4C, 0x8015) /* <CJK> */
+MAP(0x39, 0x4D, 0x8003) /* <CJK> */
+MAP(0x39, 0x4E, 0x80AF) /* <CJK> */
+MAP(0x39, 0x4F, 0x80B1) /* <CJK> */
+MAP(0x39, 0x50, 0x8154) /* <CJK> */
+MAP(0x39, 0x51, 0x818F) /* <CJK> */
+MAP(0x39, 0x52, 0x822A) /* <CJK> */
+MAP(0x39, 0x53, 0x8352) /* <CJK> */
+MAP(0x39, 0x54, 0x884C) /* <CJK> */
+MAP(0x39, 0x55, 0x8861) /* <CJK> */
+MAP(0x39, 0x56, 0x8B1B) /* <CJK> */
+MAP(0x39, 0x57, 0x8CA2) /* <CJK> */
+MAP(0x39, 0x58, 0x8CFC) /* <CJK> */
+MAP(0x39, 0x59, 0x90CA) /* <CJK> */
+MAP(0x39, 0x5A, 0x9175) /* <CJK> */
+MAP(0x39, 0x5B, 0x9271) /* <CJK> */
+MAP(0x39, 0x5C, 0x783F) /* <CJK> */
+MAP(0x39, 0x5D, 0x92FC) /* <CJK> */
+MAP(0x39, 0x5E, 0x95A4) /* <CJK> */
+MAP(0x39, 0x5F, 0x964D) /* <CJK> */
+MAP(0x39, 0x60, 0x9805) /* <CJK> */
+MAP(0x39, 0x61, 0x9999) /* <CJK> */
+MAP(0x39, 0x62, 0x9AD8) /* <CJK> */
+MAP(0x39, 0x63, 0x9D3B) /* <CJK> */
+MAP(0x39, 0x64, 0x525B) /* <CJK> */
+MAP(0x39, 0x65, 0x52AB) /* <CJK> */
+MAP(0x39, 0x66, 0x53F7) /* <CJK> */
+MAP(0x39, 0x67, 0x5408) /* <CJK> */
+MAP(0x39, 0x68, 0x58D5) /* <CJK> */
+MAP(0x39, 0x69, 0x62F7) /* <CJK> */
+MAP(0x39, 0x6A, 0x6FE0) /* <CJK> */
+MAP(0x39, 0x6B, 0x8C6A) /* <CJK> */
+MAP(0x39, 0x6C, 0x8F5F) /* <CJK> */
+MAP(0x39, 0x6D, 0x9EB9) /* <CJK> */
+MAP(0x39, 0x6E, 0x514B) /* <CJK> */
+MAP(0x39, 0x6F, 0x523B) /* <CJK> */
+MAP(0x39, 0x70, 0x544A) /* <CJK> */
+MAP(0x39, 0x71, 0x56FD) /* <CJK> */
+MAP(0x39, 0x72, 0x7A40) /* <CJK> */
+MAP(0x39, 0x73, 0x9177) /* <CJK> */
+MAP(0x39, 0x74, 0x9D60) /* <CJK> */
+MAP(0x39, 0x75, 0x9ED2) /* <CJK> */
+MAP(0x39, 0x76, 0x7344) /* <CJK> */
+MAP(0x39, 0x77, 0x6F09) /* <CJK> */
+MAP(0x39, 0x78, 0x8170) /* <CJK> */
+MAP(0x39, 0x79, 0x7511) /* <CJK> */
+MAP(0x39, 0x7A, 0x5FFD) /* <CJK> */
+MAP(0x39, 0x7B, 0x60DA) /* <CJK> */
+MAP(0x39, 0x7C, 0x9AA8) /* <CJK> */
+MAP(0x39, 0x7D, 0x72DB) /* <CJK> */
+MAP(0x39, 0x7E, 0x8FBC) /* <CJK> */
+MAP(0x3A, 0x21, 0x6B64) /* <CJK> */
+MAP(0x3A, 0x22, 0x9803) /* <CJK> */
+MAP(0x3A, 0x23, 0x4ECA) /* <CJK> */
+MAP(0x3A, 0x24, 0x56F0) /* <CJK> */
+MAP(0x3A, 0x25, 0x5764) /* <CJK> */
+MAP(0x3A, 0x26, 0x58BE) /* <CJK> */
+MAP(0x3A, 0x27, 0x5A5A) /* <CJK> */
+MAP(0x3A, 0x28, 0x6068) /* <CJK> */
+MAP(0x3A, 0x29, 0x61C7) /* <CJK> */
+MAP(0x3A, 0x2A, 0x660F) /* <CJK> */
+MAP(0x3A, 0x2B, 0x6606) /* <CJK> */
+MAP(0x3A, 0x2C, 0x6839) /* <CJK> */
+MAP(0x3A, 0x2D, 0x68B1) /* <CJK> */
+MAP(0x3A, 0x2E, 0x6DF7) /* <CJK> */
+MAP(0x3A, 0x2F, 0x75D5) /* <CJK> */
+MAP(0x3A, 0x30, 0x7D3A) /* <CJK> */
+MAP(0x3A, 0x31, 0x826E) /* <CJK> */
+MAP(0x3A, 0x32, 0x9B42) /* <CJK> */
+MAP(0x3A, 0x33, 0x4E9B) /* <CJK> */
+MAP(0x3A, 0x34, 0x4F50) /* <CJK> */
+MAP(0x3A, 0x35, 0x53C9) /* <CJK> */
+MAP(0x3A, 0x36, 0x5506) /* <CJK> */
+MAP(0x3A, 0x37, 0x5D6F) /* <CJK> */
+MAP(0x3A, 0x38, 0x5DE6) /* <CJK> */
+MAP(0x3A, 0x39, 0x5DEE) /* <CJK> */
+MAP(0x3A, 0x3A, 0x67FB) /* <CJK> */
+MAP(0x3A, 0x3B, 0x6C99) /* <CJK> */
+MAP(0x3A, 0x3C, 0x7473) /* <CJK> */
+MAP(0x3A, 0x3D, 0x7802) /* <CJK> */
+MAP(0x3A, 0x3E, 0x8A50) /* <CJK> */
+MAP(0x3A, 0x3F, 0x9396) /* <CJK> */
+MAP(0x3A, 0x40, 0x88DF) /* <CJK> */
+MAP(0x3A, 0x41, 0x5750) /* <CJK> */
+MAP(0x3A, 0x42, 0x5EA7) /* <CJK> */
+MAP(0x3A, 0x43, 0x632B) /* <CJK> */
+MAP(0x3A, 0x44, 0x50B5) /* <CJK> */
+MAP(0x3A, 0x45, 0x50AC) /* <CJK> */
+MAP(0x3A, 0x46, 0x518D) /* <CJK> */
+MAP(0x3A, 0x47, 0x6700) /* <CJK> */
+MAP(0x3A, 0x48, 0x54C9) /* <CJK> */
+MAP(0x3A, 0x49, 0x585E) /* <CJK> */
+MAP(0x3A, 0x4A, 0x59BB) /* <CJK> */
+MAP(0x3A, 0x4B, 0x5BB0) /* <CJK> */
+MAP(0x3A, 0x4C, 0x5F69) /* <CJK> */
+MAP(0x3A, 0x4D, 0x624D) /* <CJK> */
+MAP(0x3A, 0x4E, 0x63A1) /* <CJK> */
+MAP(0x3A, 0x4F, 0x683D) /* <CJK> */
+MAP(0x3A, 0x50, 0x6B73) /* <CJK> */
+MAP(0x3A, 0x51, 0x6E08) /* <CJK> */
+MAP(0x3A, 0x52, 0x707D) /* <CJK> */
+MAP(0x3A, 0x53, 0x91C7) /* <CJK> */
+MAP(0x3A, 0x54, 0x7280) /* <CJK> */
+MAP(0x3A, 0x55, 0x7815) /* <CJK> */
+MAP(0x3A, 0x56, 0x7826) /* <CJK> */
+MAP(0x3A, 0x57, 0x796D) /* <CJK> */
+MAP(0x3A, 0x58, 0x658E) /* <CJK> */
+MAP(0x3A, 0x59, 0x7D30) /* <CJK> */
+MAP(0x3A, 0x5A, 0x83DC) /* <CJK> */
+MAP(0x3A, 0x5B, 0x88C1) /* <CJK> */
+MAP(0x3A, 0x5C, 0x8F09) /* <CJK> */
+MAP(0x3A, 0x5D, 0x969B) /* <CJK> */
+MAP(0x3A, 0x5E, 0x5264) /* <CJK> */
+MAP(0x3A, 0x5F, 0x5728) /* <CJK> */
+MAP(0x3A, 0x60, 0x6750) /* <CJK> */
+MAP(0x3A, 0x61, 0x7F6A) /* <CJK> */
+MAP(0x3A, 0x62, 0x8CA1) /* <CJK> */
+MAP(0x3A, 0x63, 0x51B4) /* <CJK> */
+MAP(0x3A, 0x64, 0x5742) /* <CJK> */
+MAP(0x3A, 0x65, 0x962A) /* <CJK> */
+MAP(0x3A, 0x66, 0x583A) /* <CJK> */
+MAP(0x3A, 0x67, 0x698A) /* <CJK> */
+MAP(0x3A, 0x68, 0x80B4) /* <CJK> */
+MAP(0x3A, 0x69, 0x54B2) /* <CJK> */
+MAP(0x3A, 0x6A, 0x5D0E) /* <CJK> */
+MAP(0x3A, 0x6B, 0x57FC) /* <CJK> */
+MAP(0x3A, 0x6C, 0x7895) /* <CJK> */
+MAP(0x3A, 0x6D, 0x9DFA) /* <CJK> */
+MAP(0x3A, 0x6E, 0x4F5C) /* <CJK> */
+MAP(0x3A, 0x6F, 0x524A) /* <CJK> */
+MAP(0x3A, 0x70, 0x548B) /* <CJK> */
+MAP(0x3A, 0x71, 0x643E) /* <CJK> */
+MAP(0x3A, 0x72, 0x6628) /* <CJK> */
+MAP(0x3A, 0x73, 0x6714) /* <CJK> */
+MAP(0x3A, 0x74, 0x67F5) /* <CJK> */
+MAP(0x3A, 0x75, 0x7A84) /* <CJK> */
+MAP(0x3A, 0x76, 0x7B56) /* <CJK> */
+MAP(0x3A, 0x77, 0x7D22) /* <CJK> */
+MAP(0x3A, 0x78, 0x932F) /* <CJK> */
+MAP(0x3A, 0x79, 0x685C) /* <CJK> */
+MAP(0x3A, 0x7A, 0x9BAD) /* <CJK> */
+MAP(0x3A, 0x7B, 0x7B39) /* <CJK> */
+MAP(0x3A, 0x7C, 0x5319) /* <CJK> */
+MAP(0x3A, 0x7D, 0x518A) /* <CJK> */
+MAP(0x3A, 0x7E, 0x5237) /* <CJK> */
+MAP(0x3B, 0x21, 0x5BDF) /* <CJK> */
+MAP(0x3B, 0x22, 0x62F6) /* <CJK> */
+MAP(0x3B, 0x23, 0x64AE) /* <CJK> */
+MAP(0x3B, 0x24, 0x64E6) /* <CJK> */
+MAP(0x3B, 0x25, 0x672D) /* <CJK> */
+MAP(0x3B, 0x26, 0x6BBA) /* <CJK> */
+MAP(0x3B, 0x27, 0x85A9) /* <CJK> */
+MAP(0x3B, 0x28, 0x96D1) /* <CJK> */
+MAP(0x3B, 0x29, 0x7690) /* <CJK> */
+MAP(0x3B, 0x2A, 0x9BD6) /* <CJK> */
+MAP(0x3B, 0x2B, 0x634C) /* <CJK> */
+MAP(0x3B, 0x2C, 0x9306) /* <CJK> */
+MAP(0x3B, 0x2D, 0x9BAB) /* <CJK> */
+MAP(0x3B, 0x2E, 0x76BF) /* <CJK> */
+MAP(0x3B, 0x2F, 0x6652) /* <CJK> */
+MAP(0x3B, 0x30, 0x4E09) /* <CJK> */
+MAP(0x3B, 0x31, 0x5098) /* <CJK> */
+MAP(0x3B, 0x32, 0x53C2) /* <CJK> */
+MAP(0x3B, 0x33, 0x5C71) /* <CJK> */
+MAP(0x3B, 0x34, 0x60E8) /* <CJK> */
+MAP(0x3B, 0x35, 0x6492) /* <CJK> */
+MAP(0x3B, 0x36, 0x6563) /* <CJK> */
+MAP(0x3B, 0x37, 0x685F) /* <CJK> */
+MAP(0x3B, 0x38, 0x71E6) /* <CJK> */
+MAP(0x3B, 0x39, 0x73CA) /* <CJK> */
+MAP(0x3B, 0x3A, 0x7523) /* <CJK> */
+MAP(0x3B, 0x3B, 0x7B97) /* <CJK> */
+MAP(0x3B, 0x3C, 0x7E82) /* <CJK> */
+MAP(0x3B, 0x3D, 0x8695) /* <CJK> */
+MAP(0x3B, 0x3E, 0x8B83) /* <CJK> */
+MAP(0x3B, 0x3F, 0x8CDB) /* <CJK> */
+MAP(0x3B, 0x40, 0x9178) /* <CJK> */
+MAP(0x3B, 0x41, 0x9910) /* <CJK> */
+MAP(0x3B, 0x42, 0x65AC) /* <CJK> */
+MAP(0x3B, 0x43, 0x66AB) /* <CJK> */
+MAP(0x3B, 0x44, 0x6B8B) /* <CJK> */
+MAP(0x3B, 0x45, 0x4ED5) /* <CJK> */
+MAP(0x3B, 0x46, 0x4ED4) /* <CJK> */
+MAP(0x3B, 0x47, 0x4F3A) /* <CJK> */
+MAP(0x3B, 0x48, 0x4F7F) /* <CJK> */
+MAP(0x3B, 0x49, 0x523A) /* <CJK> */
+MAP(0x3B, 0x4A, 0x53F8) /* <CJK> */
+MAP(0x3B, 0x4B, 0x53F2) /* <CJK> */
+MAP(0x3B, 0x4C, 0x55E3) /* <CJK> */
+MAP(0x3B, 0x4D, 0x56DB) /* <CJK> */
+MAP(0x3B, 0x4E, 0x58EB) /* <CJK> */
+MAP(0x3B, 0x4F, 0x59CB) /* <CJK> */
+MAP(0x3B, 0x50, 0x59C9) /* <CJK> */
+MAP(0x3B, 0x51, 0x59FF) /* <CJK> */
+MAP(0x3B, 0x52, 0x5B50) /* <CJK> */
+MAP(0x3B, 0x53, 0x5C4D) /* <CJK> */
+MAP(0x3B, 0x54, 0x5E02) /* <CJK> */
+MAP(0x3B, 0x55, 0x5E2B) /* <CJK> */
+MAP(0x3B, 0x56, 0x5FD7) /* <CJK> */
+MAP(0x3B, 0x57, 0x601D) /* <CJK> */
+MAP(0x3B, 0x58, 0x6307) /* <CJK> */
+MAP(0x3B, 0x59, 0x652F) /* <CJK> */
+MAP(0x3B, 0x5A, 0x5B5C) /* <CJK> */
+MAP(0x3B, 0x5B, 0x65AF) /* <CJK> */
+MAP(0x3B, 0x5C, 0x65BD) /* <CJK> */
+MAP(0x3B, 0x5D, 0x65E8) /* <CJK> */
+MAP(0x3B, 0x5E, 0x679D) /* <CJK> */
+MAP(0x3B, 0x5F, 0x6B62) /* <CJK> */
+MAP(0x3B, 0x60, 0x6B7B) /* <CJK> */
+MAP(0x3B, 0x61, 0x6C0F) /* <CJK> */
+MAP(0x3B, 0x62, 0x7345) /* <CJK> */
+MAP(0x3B, 0x63, 0x7949) /* <CJK> */
+MAP(0x3B, 0x64, 0x79C1) /* <CJK> */
+MAP(0x3B, 0x65, 0x7CF8) /* <CJK> */
+MAP(0x3B, 0x66, 0x7D19) /* <CJK> */
+MAP(0x3B, 0x67, 0x7D2B) /* <CJK> */
+MAP(0x3B, 0x68, 0x80A2) /* <CJK> */
+MAP(0x3B, 0x69, 0x8102) /* <CJK> */
+MAP(0x3B, 0x6A, 0x81F3) /* <CJK> */
+MAP(0x3B, 0x6B, 0x8996) /* <CJK> */
+MAP(0x3B, 0x6C, 0x8A5E) /* <CJK> */
+MAP(0x3B, 0x6D, 0x8A69) /* <CJK> */
+MAP(0x3B, 0x6E, 0x8A66) /* <CJK> */
+MAP(0x3B, 0x6F, 0x8A8C) /* <CJK> */
+MAP(0x3B, 0x70, 0x8AEE) /* <CJK> */
+MAP(0x3B, 0x71, 0x8CC7) /* <CJK> */
+MAP(0x3B, 0x72, 0x8CDC) /* <CJK> */
+MAP(0x3B, 0x73, 0x96CC) /* <CJK> */
+MAP(0x3B, 0x74, 0x98FC) /* <CJK> */
+MAP(0x3B, 0x75, 0x6B6F) /* <CJK> */
+MAP(0x3B, 0x76, 0x4E8B) /* <CJK> */
+MAP(0x3B, 0x77, 0x4F3C) /* <CJK> */
+MAP(0x3B, 0x78, 0x4F8D) /* <CJK> */
+MAP(0x3B, 0x79, 0x5150) /* <CJK> */
+MAP(0x3B, 0x7A, 0x5B57) /* <CJK> */
+MAP(0x3B, 0x7B, 0x5BFA) /* <CJK> */
+MAP(0x3B, 0x7C, 0x6148) /* <CJK> */
+MAP(0x3B, 0x7D, 0x6301) /* <CJK> */
+MAP(0x3B, 0x7E, 0x6642) /* <CJK> */
+MAP(0x3C, 0x21, 0x6B21) /* <CJK> */
+MAP(0x3C, 0x22, 0x6ECB) /* <CJK> */
+MAP(0x3C, 0x23, 0x6CBB) /* <CJK> */
+MAP(0x3C, 0x24, 0x723E) /* <CJK> */
+MAP(0x3C, 0x25, 0x74BD) /* <CJK> */
+MAP(0x3C, 0x26, 0x75D4) /* <CJK> */
+MAP(0x3C, 0x27, 0x78C1) /* <CJK> */
+MAP(0x3C, 0x28, 0x793A) /* <CJK> */
+MAP(0x3C, 0x29, 0x800C) /* <CJK> */
+MAP(0x3C, 0x2A, 0x8033) /* <CJK> */
+MAP(0x3C, 0x2B, 0x81EA) /* <CJK> */
+MAP(0x3C, 0x2C, 0x8494) /* <CJK> */
+MAP(0x3C, 0x2D, 0x8F9E) /* <CJK> */
+MAP(0x3C, 0x2E, 0x6C50) /* <CJK> */
+MAP(0x3C, 0x2F, 0x9E7F) /* <CJK> */
+MAP(0x3C, 0x30, 0x5F0F) /* <CJK> */
+MAP(0x3C, 0x31, 0x8B58) /* <CJK> */
+MAP(0x3C, 0x32, 0x9D2B) /* <CJK> */
+MAP(0x3C, 0x33, 0x7AFA) /* <CJK> */
+MAP(0x3C, 0x34, 0x8EF8) /* <CJK> */
+MAP(0x3C, 0x35, 0x5B8D) /* <CJK> */
+MAP(0x3C, 0x36, 0x96EB) /* <CJK> */
+MAP(0x3C, 0x37, 0x4E03) /* <CJK> */
+MAP(0x3C, 0x38, 0x53F1) /* <CJK> */
+MAP(0x3C, 0x39, 0x57F7) /* <CJK> */
+MAP(0x3C, 0x3A, 0x5931) /* <CJK> */
+MAP(0x3C, 0x3B, 0x5AC9) /* <CJK> */
+MAP(0x3C, 0x3C, 0x5BA4) /* <CJK> */
+MAP(0x3C, 0x3D, 0x6089) /* <CJK> */
+MAP(0x3C, 0x3E, 0x6E7F) /* <CJK> */
+MAP(0x3C, 0x3F, 0x6F06) /* <CJK> */
+MAP(0x3C, 0x40, 0x75BE) /* <CJK> */
+MAP(0x3C, 0x41, 0x8CEA) /* <CJK> */
+MAP(0x3C, 0x42, 0x5B9F) /* <CJK> */
+MAP(0x3C, 0x43, 0x8500) /* <CJK> */
+MAP(0x3C, 0x44, 0x7BE0) /* <CJK> */
+MAP(0x3C, 0x45, 0x5072) /* <CJK> */
+MAP(0x3C, 0x46, 0x67F4) /* <CJK> */
+MAP(0x3C, 0x47, 0x829D) /* <CJK> */
+MAP(0x3C, 0x48, 0x5C61) /* <CJK> */
+MAP(0x3C, 0x49, 0x854A) /* <CJK> */
+MAP(0x3C, 0x4A, 0x7E1E) /* <CJK> */
+MAP(0x3C, 0x4B, 0x820E) /* <CJK> */
+MAP(0x3C, 0x4C, 0x5199) /* <CJK> */
+MAP(0x3C, 0x4D, 0x5C04) /* <CJK> */
+MAP(0x3C, 0x4E, 0x6368) /* <CJK> */
+MAP(0x3C, 0x4F, 0x8D66) /* <CJK> */
+MAP(0x3C, 0x50, 0x659C) /* <CJK> */
+MAP(0x3C, 0x51, 0x716E) /* <CJK> */
+MAP(0x3C, 0x52, 0x793E) /* <CJK> */
+MAP(0x3C, 0x53, 0x7D17) /* <CJK> */
+MAP(0x3C, 0x54, 0x8005) /* <CJK> */
+MAP(0x3C, 0x55, 0x8B1D) /* <CJK> */
+MAP(0x3C, 0x56, 0x8ECA) /* <CJK> */
+MAP(0x3C, 0x57, 0x906E) /* <CJK> */
+MAP(0x3C, 0x58, 0x86C7) /* <CJK> */
+MAP(0x3C, 0x59, 0x90AA) /* <CJK> */
+MAP(0x3C, 0x5A, 0x501F) /* <CJK> */
+MAP(0x3C, 0x5B, 0x52FA) /* <CJK> */
+MAP(0x3C, 0x5C, 0x5C3A) /* <CJK> */
+MAP(0x3C, 0x5D, 0x6753) /* <CJK> */
+MAP(0x3C, 0x5E, 0x707C) /* <CJK> */
+MAP(0x3C, 0x5F, 0x7235) /* <CJK> */
+MAP(0x3C, 0x60, 0x914C) /* <CJK> */
+MAP(0x3C, 0x61, 0x91C8) /* <CJK> */
+MAP(0x3C, 0x62, 0x932B) /* <CJK> */
+MAP(0x3C, 0x63, 0x82E5) /* <CJK> */
+MAP(0x3C, 0x64, 0x5BC2) /* <CJK> */
+MAP(0x3C, 0x65, 0x5F31) /* <CJK> */
+MAP(0x3C, 0x66, 0x60F9) /* <CJK> */
+MAP(0x3C, 0x67, 0x4E3B) /* <CJK> */
+MAP(0x3C, 0x68, 0x53D6) /* <CJK> */
+MAP(0x3C, 0x69, 0x5B88) /* <CJK> */
+MAP(0x3C, 0x6A, 0x624B) /* <CJK> */
+MAP(0x3C, 0x6B, 0x6731) /* <CJK> */
+MAP(0x3C, 0x6C, 0x6B8A) /* <CJK> */
+MAP(0x3C, 0x6D, 0x72E9) /* <CJK> */
+MAP(0x3C, 0x6E, 0x73E0) /* <CJK> */
+MAP(0x3C, 0x6F, 0x7A2E) /* <CJK> */
+MAP(0x3C, 0x70, 0x816B) /* <CJK> */
+MAP(0x3C, 0x71, 0x8DA3) /* <CJK> */
+MAP(0x3C, 0x72, 0x9152) /* <CJK> */
+MAP(0x3C, 0x73, 0x9996) /* <CJK> */
+MAP(0x3C, 0x74, 0x5112) /* <CJK> */
+MAP(0x3C, 0x75, 0x53D7) /* <CJK> */
+MAP(0x3C, 0x76, 0x546A) /* <CJK> */
+MAP(0x3C, 0x77, 0x5BFF) /* <CJK> */
+MAP(0x3C, 0x78, 0x6388) /* <CJK> */
+MAP(0x3C, 0x79, 0x6A39) /* <CJK> */
+MAP(0x3C, 0x7A, 0x7DAC) /* <CJK> */
+MAP(0x3C, 0x7B, 0x9700) /* <CJK> */
+MAP(0x3C, 0x7C, 0x56DA) /* <CJK> */
+MAP(0x3C, 0x7D, 0x53CE) /* <CJK> */
+MAP(0x3C, 0x7E, 0x5468) /* <CJK> */
+MAP(0x3D, 0x21, 0x5B97) /* <CJK> */
+MAP(0x3D, 0x22, 0x5C31) /* <CJK> */
+MAP(0x3D, 0x23, 0x5DDE) /* <CJK> */
+MAP(0x3D, 0x24, 0x4FEE) /* <CJK> */
+MAP(0x3D, 0x25, 0x6101) /* <CJK> */
+MAP(0x3D, 0x26, 0x62FE) /* <CJK> */
+MAP(0x3D, 0x27, 0x6D32) /* <CJK> */
+MAP(0x3D, 0x28, 0x79C0) /* <CJK> */
+MAP(0x3D, 0x29, 0x79CB) /* <CJK> */
+MAP(0x3D, 0x2A, 0x7D42) /* <CJK> */
+MAP(0x3D, 0x2B, 0x7E4D) /* <CJK> */
+MAP(0x3D, 0x2C, 0x7FD2) /* <CJK> */
+MAP(0x3D, 0x2D, 0x81ED) /* <CJK> */
+MAP(0x3D, 0x2E, 0x821F) /* <CJK> */
+MAP(0x3D, 0x2F, 0x8490) /* <CJK> */
+MAP(0x3D, 0x30, 0x8846) /* <CJK> */
+MAP(0x3D, 0x31, 0x8972) /* <CJK> */
+MAP(0x3D, 0x32, 0x8B90) /* <CJK> */
+MAP(0x3D, 0x33, 0x8E74) /* <CJK> */
+MAP(0x3D, 0x34, 0x8F2F) /* <CJK> */
+MAP(0x3D, 0x35, 0x9031) /* <CJK> */
+MAP(0x3D, 0x36, 0x914B) /* <CJK> */
+MAP(0x3D, 0x37, 0x916C) /* <CJK> */
+MAP(0x3D, 0x38, 0x96C6) /* <CJK> */
+MAP(0x3D, 0x39, 0x919C) /* <CJK> */
+MAP(0x3D, 0x3A, 0x4EC0) /* <CJK> */
+MAP(0x3D, 0x3B, 0x4F4F) /* <CJK> */
+MAP(0x3D, 0x3C, 0x5145) /* <CJK> */
+MAP(0x3D, 0x3D, 0x5341) /* <CJK> */
+MAP(0x3D, 0x3E, 0x5F93) /* <CJK> */
+MAP(0x3D, 0x3F, 0x620E) /* <CJK> */
+MAP(0x3D, 0x40, 0x67D4) /* <CJK> */
+MAP(0x3D, 0x41, 0x6C41) /* <CJK> */
+MAP(0x3D, 0x42, 0x6E0B) /* <CJK> */
+MAP(0x3D, 0x43, 0x7363) /* <CJK> */
+MAP(0x3D, 0x44, 0x7E26) /* <CJK> */
+MAP(0x3D, 0x45, 0x91CD) /* <CJK> */
+MAP(0x3D, 0x46, 0x9283) /* <CJK> */
+MAP(0x3D, 0x47, 0x53D4) /* <CJK> */
+MAP(0x3D, 0x48, 0x5919) /* <CJK> */
+MAP(0x3D, 0x49, 0x5BBF) /* <CJK> */
+MAP(0x3D, 0x4A, 0x6DD1) /* <CJK> */
+MAP(0x3D, 0x4B, 0x795D) /* <CJK> */
+MAP(0x3D, 0x4C, 0x7E2E) /* <CJK> */
+MAP(0x3D, 0x4D, 0x7C9B) /* <CJK> */
+MAP(0x3D, 0x4E, 0x587E) /* <CJK> */
+MAP(0x3D, 0x4F, 0x719F) /* <CJK> */
+MAP(0x3D, 0x50, 0x51FA) /* <CJK> */
+MAP(0x3D, 0x51, 0x8853) /* <CJK> */
+MAP(0x3D, 0x52, 0x8FF0) /* <CJK> */
+MAP(0x3D, 0x53, 0x4FCA) /* <CJK> */
+MAP(0x3D, 0x54, 0x5CFB) /* <CJK> */
+MAP(0x3D, 0x55, 0x6625) /* <CJK> */
+MAP(0x3D, 0x56, 0x77AC) /* <CJK> */
+MAP(0x3D, 0x57, 0x7AE3) /* <CJK> */
+MAP(0x3D, 0x58, 0x821C) /* <CJK> */
+MAP(0x3D, 0x59, 0x99FF) /* <CJK> */
+MAP(0x3D, 0x5A, 0x51C6) /* <CJK> */
+MAP(0x3D, 0x5B, 0x5FAA) /* <CJK> */
+MAP(0x3D, 0x5C, 0x65EC) /* <CJK> */
+MAP(0x3D, 0x5D, 0x696F) /* <CJK> */
+MAP(0x3D, 0x5E, 0x6B89) /* <CJK> */
+MAP(0x3D, 0x5F, 0x6DF3) /* <CJK> */
+MAP(0x3D, 0x60, 0x6E96) /* <CJK> */
+MAP(0x3D, 0x61, 0x6F64) /* <CJK> */
+MAP(0x3D, 0x62, 0x76FE) /* <CJK> */
+MAP(0x3D, 0x63, 0x7D14) /* <CJK> */
+MAP(0x3D, 0x64, 0x5DE1) /* <CJK> */
+MAP(0x3D, 0x65, 0x9075) /* <CJK> */
+MAP(0x3D, 0x66, 0x9187) /* <CJK> */
+MAP(0x3D, 0x67, 0x9806) /* <CJK> */
+MAP(0x3D, 0x68, 0x51E6) /* <CJK> */
+MAP(0x3D, 0x69, 0x521D) /* <CJK> */
+MAP(0x3D, 0x6A, 0x6240) /* <CJK> */
+MAP(0x3D, 0x6B, 0x6691) /* <CJK> */
+MAP(0x3D, 0x6C, 0x66D9) /* <CJK> */
+MAP(0x3D, 0x6D, 0x6E1A) /* <CJK> */
+MAP(0x3D, 0x6E, 0x5EB6) /* <CJK> */
+MAP(0x3D, 0x6F, 0x7DD2) /* <CJK> */
+MAP(0x3D, 0x70, 0x7F72) /* <CJK> */
+MAP(0x3D, 0x71, 0x66F8) /* <CJK> */
+MAP(0x3D, 0x72, 0x85AF) /* <CJK> */
+MAP(0x3D, 0x73, 0x85F7) /* <CJK> */
+MAP(0x3D, 0x74, 0x8AF8) /* <CJK> */
+MAP(0x3D, 0x75, 0x52A9) /* <CJK> */
+MAP(0x3D, 0x76, 0x53D9) /* <CJK> */
+MAP(0x3D, 0x77, 0x5973) /* <CJK> */
+MAP(0x3D, 0x78, 0x5E8F) /* <CJK> */
+MAP(0x3D, 0x79, 0x5F90) /* <CJK> */
+MAP(0x3D, 0x7A, 0x6055) /* <CJK> */
+MAP(0x3D, 0x7B, 0x92E4) /* <CJK> */
+MAP(0x3D, 0x7C, 0x9664) /* <CJK> */
+MAP(0x3D, 0x7D, 0x50B7) /* <CJK> */
+MAP(0x3D, 0x7E, 0x511F) /* <CJK> */
+MAP(0x3E, 0x21, 0x52DD) /* <CJK> */
+MAP(0x3E, 0x22, 0x5320) /* <CJK> */
+MAP(0x3E, 0x23, 0x5347) /* <CJK> */
+MAP(0x3E, 0x24, 0x53EC) /* <CJK> */
+MAP(0x3E, 0x25, 0x54E8) /* <CJK> */
+MAP(0x3E, 0x26, 0x5546) /* <CJK> */
+MAP(0x3E, 0x27, 0x5531) /* <CJK> */
+MAP(0x3E, 0x28, 0x5617) /* <CJK> */
+MAP(0x3E, 0x29, 0x5968) /* <CJK> */
+MAP(0x3E, 0x2A, 0x59BE) /* <CJK> */
+MAP(0x3E, 0x2B, 0x5A3C) /* <CJK> */
+MAP(0x3E, 0x2C, 0x5BB5) /* <CJK> */
+MAP(0x3E, 0x2D, 0x5C06) /* <CJK> */
+MAP(0x3E, 0x2E, 0x5C0F) /* <CJK> */
+MAP(0x3E, 0x2F, 0x5C11) /* <CJK> */
+MAP(0x3E, 0x30, 0x5C1A) /* <CJK> */
+MAP(0x3E, 0x31, 0x5E84) /* <CJK> */
+MAP(0x3E, 0x32, 0x5E8A) /* <CJK> */
+MAP(0x3E, 0x33, 0x5EE0) /* <CJK> */
+MAP(0x3E, 0x34, 0x5F70) /* <CJK> */
+MAP(0x3E, 0x35, 0x627F) /* <CJK> */
+MAP(0x3E, 0x36, 0x6284) /* <CJK> */
+MAP(0x3E, 0x37, 0x62DB) /* <CJK> */
+MAP(0x3E, 0x38, 0x638C) /* <CJK> */
+MAP(0x3E, 0x39, 0x6377) /* <CJK> */
+MAP(0x3E, 0x3A, 0x6607) /* <CJK> */
+MAP(0x3E, 0x3B, 0x660C) /* <CJK> */
+MAP(0x3E, 0x3C, 0x662D) /* <CJK> */
+MAP(0x3E, 0x3D, 0x6676) /* <CJK> */
+MAP(0x3E, 0x3E, 0x677E) /* <CJK> */
+MAP(0x3E, 0x3F, 0x68A2) /* <CJK> */
+MAP(0x3E, 0x40, 0x6A1F) /* <CJK> */
+MAP(0x3E, 0x41, 0x6A35) /* <CJK> */
+MAP(0x3E, 0x42, 0x6CBC) /* <CJK> */
+MAP(0x3E, 0x43, 0x6D88) /* <CJK> */
+MAP(0x3E, 0x44, 0x6E09) /* <CJK> */
+MAP(0x3E, 0x45, 0x6E58) /* <CJK> */
+MAP(0x3E, 0x46, 0x713C) /* <CJK> */
+MAP(0x3E, 0x47, 0x7126) /* <CJK> */
+MAP(0x3E, 0x48, 0x7167) /* <CJK> */
+MAP(0x3E, 0x49, 0x75C7) /* <CJK> */
+MAP(0x3E, 0x4A, 0x7701) /* <CJK> */
+MAP(0x3E, 0x4B, 0x785D) /* <CJK> */
+MAP(0x3E, 0x4C, 0x7901) /* <CJK> */
+MAP(0x3E, 0x4D, 0x7965) /* <CJK> */
+MAP(0x3E, 0x4E, 0x79F0) /* <CJK> */
+MAP(0x3E, 0x4F, 0x7AE0) /* <CJK> */
+MAP(0x3E, 0x50, 0x7B11) /* <CJK> */
+MAP(0x3E, 0x51, 0x7CA7) /* <CJK> */
+MAP(0x3E, 0x52, 0x7D39) /* <CJK> */
+MAP(0x3E, 0x53, 0x8096) /* <CJK> */
+MAP(0x3E, 0x54, 0x83D6) /* <CJK> */
+MAP(0x3E, 0x55, 0x848B) /* <CJK> */
+MAP(0x3E, 0x56, 0x8549) /* <CJK> */
+MAP(0x3E, 0x57, 0x885D) /* <CJK> */
+MAP(0x3E, 0x58, 0x88F3) /* <CJK> */
+MAP(0x3E, 0x59, 0x8A1F) /* <CJK> */
+MAP(0x3E, 0x5A, 0x8A3C) /* <CJK> */
+MAP(0x3E, 0x5B, 0x8A54) /* <CJK> */
+MAP(0x3E, 0x5C, 0x8A73) /* <CJK> */
+MAP(0x3E, 0x5D, 0x8C61) /* <CJK> */
+MAP(0x3E, 0x5E, 0x8CDE) /* <CJK> */
+MAP(0x3E, 0x5F, 0x91A4) /* <CJK> */
+MAP(0x3E, 0x60, 0x9266) /* <CJK> */
+MAP(0x3E, 0x61, 0x937E) /* <CJK> */
+MAP(0x3E, 0x62, 0x9418) /* <CJK> */
+MAP(0x3E, 0x63, 0x969C) /* <CJK> */
+MAP(0x3E, 0x64, 0x9798) /* <CJK> */
+MAP(0x3E, 0x65, 0x4E0A) /* <CJK> */
+MAP(0x3E, 0x66, 0x4E08) /* <CJK> */
+MAP(0x3E, 0x67, 0x4E1E) /* <CJK> */
+MAP(0x3E, 0x68, 0x4E57) /* <CJK> */
+MAP(0x3E, 0x69, 0x5197) /* <CJK> */
+MAP(0x3E, 0x6A, 0x5270) /* <CJK> */
+MAP(0x3E, 0x6B, 0x57CE) /* <CJK> */
+MAP(0x3E, 0x6C, 0x5834) /* <CJK> */
+MAP(0x3E, 0x6D, 0x58CC) /* <CJK> */
+MAP(0x3E, 0x6E, 0x5B22) /* <CJK> */
+MAP(0x3E, 0x6F, 0x5E38) /* <CJK> */
+MAP(0x3E, 0x70, 0x60C5) /* <CJK> */
+MAP(0x3E, 0x71, 0x64FE) /* <CJK> */
+MAP(0x3E, 0x72, 0x6761) /* <CJK> */
+MAP(0x3E, 0x73, 0x6756) /* <CJK> */
+MAP(0x3E, 0x74, 0x6D44) /* <CJK> */
+MAP(0x3E, 0x75, 0x72B6) /* <CJK> */
+MAP(0x3E, 0x76, 0x7573) /* <CJK> */
+MAP(0x3E, 0x77, 0x7A63) /* <CJK> */
+MAP(0x3E, 0x78, 0x84B8) /* <CJK> */
+MAP(0x3E, 0x79, 0x8B72) /* <CJK> */
+MAP(0x3E, 0x7A, 0x91B8) /* <CJK> */
+MAP(0x3E, 0x7B, 0x9320) /* <CJK> */
+MAP(0x3E, 0x7C, 0x5631) /* <CJK> */
+MAP(0x3E, 0x7D, 0x57F4) /* <CJK> */
+MAP(0x3E, 0x7E, 0x98FE) /* <CJK> */
+MAP(0x3F, 0x21, 0x62ED) /* <CJK> */
+MAP(0x3F, 0x22, 0x690D) /* <CJK> */
+MAP(0x3F, 0x23, 0x6B96) /* <CJK> */
+MAP(0x3F, 0x24, 0x71ED) /* <CJK> */
+MAP(0x3F, 0x25, 0x7E54) /* <CJK> */
+MAP(0x3F, 0x26, 0x8077) /* <CJK> */
+MAP(0x3F, 0x27, 0x8272) /* <CJK> */
+MAP(0x3F, 0x28, 0x89E6) /* <CJK> */
+MAP(0x3F, 0x29, 0x98DF) /* <CJK> */
+MAP(0x3F, 0x2A, 0x8755) /* <CJK> */
+MAP(0x3F, 0x2B, 0x8FB1) /* <CJK> */
+MAP(0x3F, 0x2C, 0x5C3B) /* <CJK> */
+MAP(0x3F, 0x2D, 0x4F38) /* <CJK> */
+MAP(0x3F, 0x2E, 0x4FE1) /* <CJK> */
+MAP(0x3F, 0x2F, 0x4FB5) /* <CJK> */
+MAP(0x3F, 0x30, 0x5507) /* <CJK> */
+MAP(0x3F, 0x31, 0x5A20) /* <CJK> */
+MAP(0x3F, 0x32, 0x5BDD) /* <CJK> */
+MAP(0x3F, 0x33, 0x5BE9) /* <CJK> */
+MAP(0x3F, 0x34, 0x5FC3) /* <CJK> */
+MAP(0x3F, 0x35, 0x614E) /* <CJK> */
+MAP(0x3F, 0x36, 0x632F) /* <CJK> */
+MAP(0x3F, 0x37, 0x65B0) /* <CJK> */
+MAP(0x3F, 0x38, 0x664B) /* <CJK> */
+MAP(0x3F, 0x39, 0x68EE) /* <CJK> */
+MAP(0x3F, 0x3A, 0x699B) /* <CJK> */
+MAP(0x3F, 0x3B, 0x6D78) /* <CJK> */
+MAP(0x3F, 0x3C, 0x6DF1) /* <CJK> */
+MAP(0x3F, 0x3D, 0x7533) /* <CJK> */
+MAP(0x3F, 0x3E, 0x75B9) /* <CJK> */
+MAP(0x3F, 0x3F, 0x771F) /* <CJK> */
+MAP(0x3F, 0x40, 0x795E) /* <CJK> */
+MAP(0x3F, 0x41, 0x79E6) /* <CJK> */
+MAP(0x3F, 0x42, 0x7D33) /* <CJK> */
+MAP(0x3F, 0x43, 0x81E3) /* <CJK> */
+MAP(0x3F, 0x44, 0x82AF) /* <CJK> */
+MAP(0x3F, 0x45, 0x85AA) /* <CJK> */
+MAP(0x3F, 0x46, 0x89AA) /* <CJK> */
+MAP(0x3F, 0x47, 0x8A3A) /* <CJK> */
+MAP(0x3F, 0x48, 0x8EAB) /* <CJK> */
+MAP(0x3F, 0x49, 0x8F9B) /* <CJK> */
+MAP(0x3F, 0x4A, 0x9032) /* <CJK> */
+MAP(0x3F, 0x4B, 0x91DD) /* <CJK> */
+MAP(0x3F, 0x4C, 0x9707) /* <CJK> */
+MAP(0x3F, 0x4D, 0x4EBA) /* <CJK> */
+MAP(0x3F, 0x4E, 0x4EC1) /* <CJK> */
+MAP(0x3F, 0x4F, 0x5203) /* <CJK> */
+MAP(0x3F, 0x50, 0x5875) /* <CJK> */
+MAP(0x3F, 0x51, 0x58EC) /* <CJK> */
+MAP(0x3F, 0x52, 0x5C0B) /* <CJK> */
+MAP(0x3F, 0x53, 0x751A) /* <CJK> */
+MAP(0x3F, 0x54, 0x5C3D) /* <CJK> */
+MAP(0x3F, 0x55, 0x814E) /* <CJK> */
+MAP(0x3F, 0x56, 0x8A0A) /* <CJK> */
+MAP(0x3F, 0x57, 0x8FC5) /* <CJK> */
+MAP(0x3F, 0x58, 0x9663) /* <CJK> */
+MAP(0x3F, 0x59, 0x976D) /* <CJK> */
+MAP(0x3F, 0x5A, 0x7B25) /* <CJK> */
+MAP(0x3F, 0x5B, 0x8ACF) /* <CJK> */
+MAP(0x3F, 0x5C, 0x9808) /* <CJK> */
+MAP(0x3F, 0x5D, 0x9162) /* <CJK> */
+MAP(0x3F, 0x5E, 0x56F3) /* <CJK> */
+MAP(0x3F, 0x5F, 0x53A8) /* <CJK> */
+MAP(0x3F, 0x60, 0x9017) /* <CJK> */
+MAP(0x3F, 0x61, 0x5439) /* <CJK> */
+MAP(0x3F, 0x62, 0x5782) /* <CJK> */
+MAP(0x3F, 0x63, 0x5E25) /* <CJK> */
+MAP(0x3F, 0x64, 0x63A8) /* <CJK> */
+MAP(0x3F, 0x65, 0x6C34) /* <CJK> */
+MAP(0x3F, 0x66, 0x708A) /* <CJK> */
+MAP(0x3F, 0x67, 0x7761) /* <CJK> */
+MAP(0x3F, 0x68, 0x7C8B) /* <CJK> */
+MAP(0x3F, 0x69, 0x7FE0) /* <CJK> */
+MAP(0x3F, 0x6A, 0x8870) /* <CJK> */
+MAP(0x3F, 0x6B, 0x9042) /* <CJK> */
+MAP(0x3F, 0x6C, 0x9154) /* <CJK> */
+MAP(0x3F, 0x6D, 0x9310) /* <CJK> */
+MAP(0x3F, 0x6E, 0x9318) /* <CJK> */
+MAP(0x3F, 0x6F, 0x968F) /* <CJK> */
+MAP(0x3F, 0x70, 0x745E) /* <CJK> */
+MAP(0x3F, 0x71, 0x9AC4) /* <CJK> */
+MAP(0x3F, 0x72, 0x5D07) /* <CJK> */
+MAP(0x3F, 0x73, 0x5D69) /* <CJK> */
+MAP(0x3F, 0x74, 0x6570) /* <CJK> */
+MAP(0x3F, 0x75, 0x67A2) /* <CJK> */
+MAP(0x3F, 0x76, 0x8DA8) /* <CJK> */
+MAP(0x3F, 0x77, 0x96DB) /* <CJK> */
+MAP(0x3F, 0x78, 0x636E) /* <CJK> */
+MAP(0x3F, 0x79, 0x6749) /* <CJK> */
+MAP(0x3F, 0x7A, 0x6919) /* <CJK> */
+MAP(0x3F, 0x7B, 0x83C5) /* <CJK> */
+MAP(0x3F, 0x7C, 0x9817) /* <CJK> */
+MAP(0x3F, 0x7D, 0x96C0) /* <CJK> */
+MAP(0x3F, 0x7E, 0x88FE) /* <CJK> */
+MAP(0x40, 0x21, 0x6F84) /* <CJK> */
+MAP(0x40, 0x22, 0x647A) /* <CJK> */
+MAP(0x40, 0x23, 0x5BF8) /* <CJK> */
+MAP(0x40, 0x24, 0x4E16) /* <CJK> */
+MAP(0x40, 0x25, 0x702C) /* <CJK> */
+MAP(0x40, 0x26, 0x755D) /* <CJK> */
+MAP(0x40, 0x27, 0x662F) /* <CJK> */
+MAP(0x40, 0x28, 0x51C4) /* <CJK> */
+MAP(0x40, 0x29, 0x5236) /* <CJK> */
+MAP(0x40, 0x2A, 0x52E2) /* <CJK> */
+MAP(0x40, 0x2B, 0x59D3) /* <CJK> */
+MAP(0x40, 0x2C, 0x5F81) /* <CJK> */
+MAP(0x40, 0x2D, 0x6027) /* <CJK> */
+MAP(0x40, 0x2E, 0x6210) /* <CJK> */
+MAP(0x40, 0x2F, 0x653F) /* <CJK> */
+MAP(0x40, 0x30, 0x6574) /* <CJK> */
+MAP(0x40, 0x31, 0x661F) /* <CJK> */
+MAP(0x40, 0x32, 0x6674) /* <CJK> */
+MAP(0x40, 0x33, 0x68F2) /* <CJK> */
+MAP(0x40, 0x34, 0x6816) /* <CJK> */
+MAP(0x40, 0x35, 0x6B63) /* <CJK> */
+MAP(0x40, 0x36, 0x6E05) /* <CJK> */
+MAP(0x40, 0x37, 0x7272) /* <CJK> */
+MAP(0x40, 0x38, 0x751F) /* <CJK> */
+MAP(0x40, 0x39, 0x76DB) /* <CJK> */
+MAP(0x40, 0x3A, 0x7CBE) /* <CJK> */
+MAP(0x40, 0x3B, 0x8056) /* <CJK> */
+MAP(0x40, 0x3C, 0x58F0) /* <CJK> */
+MAP(0x40, 0x3D, 0x88FD) /* <CJK> */
+MAP(0x40, 0x3E, 0x897F) /* <CJK> */
+MAP(0x40, 0x3F, 0x8AA0) /* <CJK> */
+MAP(0x40, 0x40, 0x8A93) /* <CJK> */
+MAP(0x40, 0x41, 0x8ACB) /* <CJK> */
+MAP(0x40, 0x42, 0x901D) /* <CJK> */
+MAP(0x40, 0x43, 0x9192) /* <CJK> */
+MAP(0x40, 0x44, 0x9752) /* <CJK> */
+MAP(0x40, 0x45, 0x9759) /* <CJK> */
+MAP(0x40, 0x46, 0x6589) /* <CJK> */
+MAP(0x40, 0x47, 0x7A0E) /* <CJK> */
+MAP(0x40, 0x48, 0x8106) /* <CJK> */
+MAP(0x40, 0x49, 0x96BB) /* <CJK> */
+MAP(0x40, 0x4A, 0x5E2D) /* <CJK> */
+MAP(0x40, 0x4B, 0x60DC) /* <CJK> */
+MAP(0x40, 0x4C, 0x621A) /* <CJK> */
+MAP(0x40, 0x4D, 0x65A5) /* <CJK> */
+MAP(0x40, 0x4E, 0x6614) /* <CJK> */
+MAP(0x40, 0x4F, 0x6790) /* <CJK> */
+MAP(0x40, 0x50, 0x77F3) /* <CJK> */
+MAP(0x40, 0x51, 0x7A4D) /* <CJK> */
+MAP(0x40, 0x52, 0x7C4D) /* <CJK> */
+MAP(0x40, 0x53, 0x7E3E) /* <CJK> */
+MAP(0x40, 0x54, 0x810A) /* <CJK> */
+MAP(0x40, 0x55, 0x8CAC) /* <CJK> */
+MAP(0x40, 0x56, 0x8D64) /* <CJK> */
+MAP(0x40, 0x57, 0x8DE1) /* <CJK> */
+MAP(0x40, 0x58, 0x8E5F) /* <CJK> */
+MAP(0x40, 0x59, 0x78A9) /* <CJK> */
+MAP(0x40, 0x5A, 0x5207) /* <CJK> */
+MAP(0x40, 0x5B, 0x62D9) /* <CJK> */
+MAP(0x40, 0x5C, 0x63A5) /* <CJK> */
+MAP(0x40, 0x5D, 0x6442) /* <CJK> */
+MAP(0x40, 0x5E, 0x6298) /* <CJK> */
+MAP(0x40, 0x5F, 0x8A2D) /* <CJK> */
+MAP(0x40, 0x60, 0x7A83) /* <CJK> */
+MAP(0x40, 0x61, 0x7BC0) /* <CJK> */
+MAP(0x40, 0x62, 0x8AAC) /* <CJK> */
+MAP(0x40, 0x63, 0x96EA) /* <CJK> */
+MAP(0x40, 0x64, 0x7D76) /* <CJK> */
+MAP(0x40, 0x65, 0x820C) /* <CJK> */
+MAP(0x40, 0x66, 0x8749) /* <CJK> */
+MAP(0x40, 0x67, 0x4ED9) /* <CJK> */
+MAP(0x40, 0x68, 0x5148) /* <CJK> */
+MAP(0x40, 0x69, 0x5343) /* <CJK> */
+MAP(0x40, 0x6A, 0x5360) /* <CJK> */
+MAP(0x40, 0x6B, 0x5BA3) /* <CJK> */
+MAP(0x40, 0x6C, 0x5C02) /* <CJK> */
+MAP(0x40, 0x6D, 0x5C16) /* <CJK> */
+MAP(0x40, 0x6E, 0x5DDD) /* <CJK> */
+MAP(0x40, 0x6F, 0x6226) /* <CJK> */
+MAP(0x40, 0x70, 0x6247) /* <CJK> */
+MAP(0x40, 0x71, 0x64B0) /* <CJK> */
+MAP(0x40, 0x72, 0x6813) /* <CJK> */
+MAP(0x40, 0x73, 0x6834) /* <CJK> */
+MAP(0x40, 0x74, 0x6CC9) /* <CJK> */
+MAP(0x40, 0x75, 0x6D45) /* <CJK> */
+MAP(0x40, 0x76, 0x6D17) /* <CJK> */
+MAP(0x40, 0x77, 0x67D3) /* <CJK> */
+MAP(0x40, 0x78, 0x6F5C) /* <CJK> */
+MAP(0x40, 0x79, 0x714E) /* <CJK> */
+MAP(0x40, 0x7A, 0x717D) /* <CJK> */
+MAP(0x40, 0x7B, 0x65CB) /* <CJK> */
+MAP(0x40, 0x7C, 0x7A7F) /* <CJK> */
+MAP(0x40, 0x7D, 0x7BAD) /* <CJK> */
+MAP(0x40, 0x7E, 0x7DDA) /* <CJK> */
+MAP(0x41, 0x21, 0x7E4A) /* <CJK> */
+MAP(0x41, 0x22, 0x7FA8) /* <CJK> */
+MAP(0x41, 0x23, 0x817A) /* <CJK> */
+MAP(0x41, 0x24, 0x821B) /* <CJK> */
+MAP(0x41, 0x25, 0x8239) /* <CJK> */
+MAP(0x41, 0x26, 0x85A6) /* <CJK> */
+MAP(0x41, 0x27, 0x8A6E) /* <CJK> */
+MAP(0x41, 0x28, 0x8CCE) /* <CJK> */
+MAP(0x41, 0x29, 0x8DF5) /* <CJK> */
+MAP(0x41, 0x2A, 0x9078) /* <CJK> */
+MAP(0x41, 0x2B, 0x9077) /* <CJK> */
+MAP(0x41, 0x2C, 0x92AD) /* <CJK> */
+MAP(0x41, 0x2D, 0x9291) /* <CJK> */
+MAP(0x41, 0x2E, 0x9583) /* <CJK> */
+MAP(0x41, 0x2F, 0x9BAE) /* <CJK> */
+MAP(0x41, 0x30, 0x524D) /* <CJK> */
+MAP(0x41, 0x31, 0x5584) /* <CJK> */
+MAP(0x41, 0x32, 0x6F38) /* <CJK> */
+MAP(0x41, 0x33, 0x7136) /* <CJK> */
+MAP(0x41, 0x34, 0x5168) /* <CJK> */
+MAP(0x41, 0x35, 0x7985) /* <CJK> */
+MAP(0x41, 0x36, 0x7E55) /* <CJK> */
+MAP(0x41, 0x37, 0x81B3) /* <CJK> */
+MAP(0x41, 0x38, 0x7CCE) /* <CJK> */
+MAP(0x41, 0x39, 0x564C) /* <CJK> */
+MAP(0x41, 0x3A, 0x5851) /* <CJK> */
+MAP(0x41, 0x3B, 0x5CA8) /* <CJK> */
+MAP(0x41, 0x3C, 0x63AA) /* <CJK> */
+MAP(0x41, 0x3D, 0x66FE) /* <CJK> */
+MAP(0x41, 0x3E, 0x66FD) /* <CJK> */
+MAP(0x41, 0x3F, 0x695A) /* <CJK> */
+MAP(0x41, 0x40, 0x72D9) /* <CJK> */
+MAP(0x41, 0x41, 0x758F) /* <CJK> */
+MAP(0x41, 0x42, 0x758E) /* <CJK> */
+MAP(0x41, 0x43, 0x790E) /* <CJK> */
+MAP(0x41, 0x44, 0x7956) /* <CJK> */
+MAP(0x41, 0x45, 0x79DF) /* <CJK> */
+MAP(0x41, 0x46, 0x7C97) /* <CJK> */
+MAP(0x41, 0x47, 0x7D20) /* <CJK> */
+MAP(0x41, 0x48, 0x7D44) /* <CJK> */
+MAP(0x41, 0x49, 0x8607) /* <CJK> */
+MAP(0x41, 0x4A, 0x8A34) /* <CJK> */
+MAP(0x41, 0x4B, 0x963B) /* <CJK> */
+MAP(0x41, 0x4C, 0x9061) /* <CJK> */
+MAP(0x41, 0x4D, 0x9F20) /* <CJK> */
+MAP(0x41, 0x4E, 0x50E7) /* <CJK> */
+MAP(0x41, 0x4F, 0x5275) /* <CJK> */
+MAP(0x41, 0x50, 0x53CC) /* <CJK> */
+MAP(0x41, 0x51, 0x53E2) /* <CJK> */
+MAP(0x41, 0x52, 0x5009) /* <CJK> */
+MAP(0x41, 0x53, 0x55AA) /* <CJK> */
+MAP(0x41, 0x54, 0x58EE) /* <CJK> */
+MAP(0x41, 0x55, 0x594F) /* <CJK> */
+MAP(0x41, 0x56, 0x723D) /* <CJK> */
+MAP(0x41, 0x57, 0x5B8B) /* <CJK> */
+MAP(0x41, 0x58, 0x5C64) /* <CJK> */
+MAP(0x41, 0x59, 0x531D) /* <CJK> */
+MAP(0x41, 0x5A, 0x60E3) /* <CJK> */
+MAP(0x41, 0x5B, 0x60F3) /* <CJK> */
+MAP(0x41, 0x5C, 0x635C) /* <CJK> */
+MAP(0x41, 0x5D, 0x6383) /* <CJK> */
+MAP(0x41, 0x5E, 0x633F) /* <CJK> */
+MAP(0x41, 0x5F, 0x63BB) /* <CJK> */
+MAP(0x41, 0x60, 0x64CD) /* <CJK> */
+MAP(0x41, 0x61, 0x65E9) /* <CJK> */
+MAP(0x41, 0x62, 0x66F9) /* <CJK> */
+MAP(0x41, 0x63, 0x5DE3) /* <CJK> */
+MAP(0x41, 0x64, 0x69CD) /* <CJK> */
+MAP(0x41, 0x65, 0x69FD) /* <CJK> */
+MAP(0x41, 0x66, 0x6F15) /* <CJK> */
+MAP(0x41, 0x67, 0x71E5) /* <CJK> */
+MAP(0x41, 0x68, 0x4E89) /* <CJK> */
+MAP(0x41, 0x69, 0x75E9) /* <CJK> */
+MAP(0x41, 0x6A, 0x76F8) /* <CJK> */
+MAP(0x41, 0x6B, 0x7A93) /* <CJK> */
+MAP(0x41, 0x6C, 0x7CDF) /* <CJK> */
+MAP(0x41, 0x6D, 0x7DCF) /* <CJK> */
+MAP(0x41, 0x6E, 0x7D9C) /* <CJK> */
+MAP(0x41, 0x6F, 0x8061) /* <CJK> */
+MAP(0x41, 0x70, 0x8349) /* <CJK> */
+MAP(0x41, 0x71, 0x8358) /* <CJK> */
+MAP(0x41, 0x72, 0x846C) /* <CJK> */
+MAP(0x41, 0x73, 0x84BC) /* <CJK> */
+MAP(0x41, 0x74, 0x85FB) /* <CJK> */
+MAP(0x41, 0x75, 0x88C5) /* <CJK> */
+MAP(0x41, 0x76, 0x8D70) /* <CJK> */
+MAP(0x41, 0x77, 0x9001) /* <CJK> */
+MAP(0x41, 0x78, 0x906D) /* <CJK> */
+MAP(0x41, 0x79, 0x9397) /* <CJK> */
+MAP(0x41, 0x7A, 0x971C) /* <CJK> */
+MAP(0x41, 0x7B, 0x9A12) /* <CJK> */
+MAP(0x41, 0x7C, 0x50CF) /* <CJK> */
+MAP(0x41, 0x7D, 0x5897) /* <CJK> */
+MAP(0x41, 0x7E, 0x618E) /* <CJK> */
+MAP(0x42, 0x21, 0x81D3) /* <CJK> */
+MAP(0x42, 0x22, 0x8535) /* <CJK> */
+MAP(0x42, 0x23, 0x8D08) /* <CJK> */
+MAP(0x42, 0x24, 0x9020) /* <CJK> */
+MAP(0x42, 0x25, 0x4FC3) /* <CJK> */
+MAP(0x42, 0x26, 0x5074) /* <CJK> */
+MAP(0x42, 0x27, 0x5247) /* <CJK> */
+MAP(0x42, 0x28, 0x5373) /* <CJK> */
+MAP(0x42, 0x29, 0x606F) /* <CJK> */
+MAP(0x42, 0x2A, 0x6349) /* <CJK> */
+MAP(0x42, 0x2B, 0x675F) /* <CJK> */
+MAP(0x42, 0x2C, 0x6E2C) /* <CJK> */
+MAP(0x42, 0x2D, 0x8DB3) /* <CJK> */
+MAP(0x42, 0x2E, 0x901F) /* <CJK> */
+MAP(0x42, 0x2F, 0x4FD7) /* <CJK> */
+MAP(0x42, 0x30, 0x5C5E) /* <CJK> */
+MAP(0x42, 0x31, 0x8CCA) /* <CJK> */
+MAP(0x42, 0x32, 0x65CF) /* <CJK> */
+MAP(0x42, 0x33, 0x7D9A) /* <CJK> */
+MAP(0x42, 0x34, 0x5352) /* <CJK> */
+MAP(0x42, 0x35, 0x8896) /* <CJK> */
+MAP(0x42, 0x36, 0x5176) /* <CJK> */
+MAP(0x42, 0x37, 0x63C3) /* <CJK> */
+MAP(0x42, 0x38, 0x5B58) /* <CJK> */
+MAP(0x42, 0x39, 0x5B6B) /* <CJK> */
+MAP(0x42, 0x3A, 0x5C0A) /* <CJK> */
+MAP(0x42, 0x3B, 0x640D) /* <CJK> */
+MAP(0x42, 0x3C, 0x6751) /* <CJK> */
+MAP(0x42, 0x3D, 0x905C) /* <CJK> */
+MAP(0x42, 0x3E, 0x4ED6) /* <CJK> */
+MAP(0x42, 0x3F, 0x591A) /* <CJK> */
+MAP(0x42, 0x40, 0x592A) /* <CJK> */
+MAP(0x42, 0x41, 0x6C70) /* <CJK> */
+MAP(0x42, 0x42, 0x8A51) /* <CJK> */
+MAP(0x42, 0x43, 0x553E) /* <CJK> */
+MAP(0x42, 0x44, 0x5815) /* <CJK> */
+MAP(0x42, 0x45, 0x59A5) /* <CJK> */
+MAP(0x42, 0x46, 0x60F0) /* <CJK> */
+MAP(0x42, 0x47, 0x6253) /* <CJK> */
+MAP(0x42, 0x48, 0x67C1) /* <CJK> */
+MAP(0x42, 0x49, 0x8235) /* <CJK> */
+MAP(0x42, 0x4A, 0x6955) /* <CJK> */
+MAP(0x42, 0x4B, 0x9640) /* <CJK> */
+MAP(0x42, 0x4C, 0x99C4) /* <CJK> */
+MAP(0x42, 0x4D, 0x9A28) /* <CJK> */
+MAP(0x42, 0x4E, 0x4F53) /* <CJK> */
+MAP(0x42, 0x4F, 0x5806) /* <CJK> */
+MAP(0x42, 0x50, 0x5BFE) /* <CJK> */
+MAP(0x42, 0x51, 0x8010) /* <CJK> */
+MAP(0x42, 0x52, 0x5CB1) /* <CJK> */
+MAP(0x42, 0x53, 0x5E2F) /* <CJK> */
+MAP(0x42, 0x54, 0x5F85) /* <CJK> */
+MAP(0x42, 0x55, 0x6020) /* <CJK> */
+MAP(0x42, 0x56, 0x614B) /* <CJK> */
+MAP(0x42, 0x57, 0x6234) /* <CJK> */
+MAP(0x42, 0x58, 0x66FF) /* <CJK> */
+MAP(0x42, 0x59, 0x6CF0) /* <CJK> */
+MAP(0x42, 0x5A, 0x6EDE) /* <CJK> */
+MAP(0x42, 0x5B, 0x80CE) /* <CJK> */
+MAP(0x42, 0x5C, 0x817F) /* <CJK> */
+MAP(0x42, 0x5D, 0x82D4) /* <CJK> */
+MAP(0x42, 0x5E, 0x888B) /* <CJK> */
+MAP(0x42, 0x5F, 0x8CB8) /* <CJK> */
+MAP(0x42, 0x60, 0x9000) /* <CJK> */
+MAP(0x42, 0x61, 0x902E) /* <CJK> */
+MAP(0x42, 0x62, 0x968A) /* <CJK> */
+MAP(0x42, 0x63, 0x9EDB) /* <CJK> */
+MAP(0x42, 0x64, 0x9BDB) /* <CJK> */
+MAP(0x42, 0x65, 0x4EE3) /* <CJK> */
+MAP(0x42, 0x66, 0x53F0) /* <CJK> */
+MAP(0x42, 0x67, 0x5927) /* <CJK> */
+MAP(0x42, 0x68, 0x7B2C) /* <CJK> */
+MAP(0x42, 0x69, 0x918D) /* <CJK> */
+MAP(0x42, 0x6A, 0x984C) /* <CJK> */
+MAP(0x42, 0x6B, 0x9DF9) /* <CJK> */
+MAP(0x42, 0x6C, 0x6EDD) /* <CJK> */
+MAP(0x42, 0x6D, 0x7027) /* <CJK> */
+MAP(0x42, 0x6E, 0x5353) /* <CJK> */
+MAP(0x42, 0x6F, 0x5544) /* <CJK> */
+MAP(0x42, 0x70, 0x5B85) /* <CJK> */
+MAP(0x42, 0x71, 0x6258) /* <CJK> */
+MAP(0x42, 0x72, 0x629E) /* <CJK> */
+MAP(0x42, 0x73, 0x62D3) /* <CJK> */
+MAP(0x42, 0x74, 0x6CA2) /* <CJK> */
+MAP(0x42, 0x75, 0x6FEF) /* <CJK> */
+MAP(0x42, 0x76, 0x7422) /* <CJK> */
+MAP(0x42, 0x77, 0x8A17) /* <CJK> */
+MAP(0x42, 0x78, 0x9438) /* <CJK> */
+MAP(0x42, 0x79, 0x6FC1) /* <CJK> */
+MAP(0x42, 0x7A, 0x8AFE) /* <CJK> */
+MAP(0x42, 0x7B, 0x8338) /* <CJK> */
+MAP(0x42, 0x7C, 0x51E7) /* <CJK> */
+MAP(0x42, 0x7D, 0x86F8) /* <CJK> */
+MAP(0x42, 0x7E, 0x53EA) /* <CJK> */
+MAP(0x43, 0x21, 0x53E9) /* <CJK> */
+MAP(0x43, 0x22, 0x4F46) /* <CJK> */
+MAP(0x43, 0x23, 0x9054) /* <CJK> */
+MAP(0x43, 0x24, 0x8FB0) /* <CJK> */
+MAP(0x43, 0x25, 0x596A) /* <CJK> */
+MAP(0x43, 0x26, 0x8131) /* <CJK> */
+MAP(0x43, 0x27, 0x5DFD) /* <CJK> */
+MAP(0x43, 0x28, 0x7AEA) /* <CJK> */
+MAP(0x43, 0x29, 0x8FBF) /* <CJK> */
+MAP(0x43, 0x2A, 0x68DA) /* <CJK> */
+MAP(0x43, 0x2B, 0x8C37) /* <CJK> */
+MAP(0x43, 0x2C, 0x72F8) /* <CJK> */
+MAP(0x43, 0x2D, 0x9C48) /* <CJK> */
+MAP(0x43, 0x2E, 0x6A3D) /* <CJK> */
+MAP(0x43, 0x2F, 0x8AB0) /* <CJK> */
+MAP(0x43, 0x30, 0x4E39) /* <CJK> */
+MAP(0x43, 0x31, 0x5358) /* <CJK> */
+MAP(0x43, 0x32, 0x5606) /* <CJK> */
+MAP(0x43, 0x33, 0x5766) /* <CJK> */
+MAP(0x43, 0x34, 0x62C5) /* <CJK> */
+MAP(0x43, 0x35, 0x63A2) /* <CJK> */
+MAP(0x43, 0x36, 0x65E6) /* <CJK> */
+MAP(0x43, 0x37, 0x6B4E) /* <CJK> */
+MAP(0x43, 0x38, 0x6DE1) /* <CJK> */
+MAP(0x43, 0x39, 0x6E5B) /* <CJK> */
+MAP(0x43, 0x3A, 0x70AD) /* <CJK> */
+MAP(0x43, 0x3B, 0x77ED) /* <CJK> */
+MAP(0x43, 0x3C, 0x7AEF) /* <CJK> */
+MAP(0x43, 0x3D, 0x7BAA) /* <CJK> */
+MAP(0x43, 0x3E, 0x7DBB) /* <CJK> */
+MAP(0x43, 0x3F, 0x803D) /* <CJK> */
+MAP(0x43, 0x40, 0x80C6) /* <CJK> */
+MAP(0x43, 0x41, 0x86CB) /* <CJK> */
+MAP(0x43, 0x42, 0x8A95) /* <CJK> */
+MAP(0x43, 0x43, 0x935B) /* <CJK> */
+MAP(0x43, 0x44, 0x56E3) /* <CJK> */
+MAP(0x43, 0x45, 0x58C7) /* <CJK> */
+MAP(0x43, 0x46, 0x5F3E) /* <CJK> */
+MAP(0x43, 0x47, 0x65AD) /* <CJK> */
+MAP(0x43, 0x48, 0x6696) /* <CJK> */
+MAP(0x43, 0x49, 0x6A80) /* <CJK> */
+MAP(0x43, 0x4A, 0x6BB5) /* <CJK> */
+MAP(0x43, 0x4B, 0x7537) /* <CJK> */
+MAP(0x43, 0x4C, 0x8AC7) /* <CJK> */
+MAP(0x43, 0x4D, 0x5024) /* <CJK> */
+MAP(0x43, 0x4E, 0x77E5) /* <CJK> */
+MAP(0x43, 0x4F, 0x5730) /* <CJK> */
+MAP(0x43, 0x50, 0x5F1B) /* <CJK> */
+MAP(0x43, 0x51, 0x6065) /* <CJK> */
+MAP(0x43, 0x52, 0x667A) /* <CJK> */
+MAP(0x43, 0x53, 0x6C60) /* <CJK> */
+MAP(0x43, 0x54, 0x75F4) /* <CJK> */
+MAP(0x43, 0x55, 0x7A1A) /* <CJK> */
+MAP(0x43, 0x56, 0x7F6E) /* <CJK> */
+MAP(0x43, 0x57, 0x81F4) /* <CJK> */
+MAP(0x43, 0x58, 0x8718) /* <CJK> */
+MAP(0x43, 0x59, 0x9045) /* <CJK> */
+MAP(0x43, 0x5A, 0x99B3) /* <CJK> */
+MAP(0x43, 0x5B, 0x7BC9) /* <CJK> */
+MAP(0x43, 0x5C, 0x755C) /* <CJK> */
+MAP(0x43, 0x5D, 0x7AF9) /* <CJK> */
+MAP(0x43, 0x5E, 0x7B51) /* <CJK> */
+MAP(0x43, 0x5F, 0x84C4) /* <CJK> */
+MAP(0x43, 0x60, 0x9010) /* <CJK> */
+MAP(0x43, 0x61, 0x79E9) /* <CJK> */
+MAP(0x43, 0x62, 0x7A92) /* <CJK> */
+MAP(0x43, 0x63, 0x8336) /* <CJK> */
+MAP(0x43, 0x64, 0x5AE1) /* <CJK> */
+MAP(0x43, 0x65, 0x7740) /* <CJK> */
+MAP(0x43, 0x66, 0x4E2D) /* <CJK> */
+MAP(0x43, 0x67, 0x4EF2) /* <CJK> */
+MAP(0x43, 0x68, 0x5B99) /* <CJK> */
+MAP(0x43, 0x69, 0x5FE0) /* <CJK> */
+MAP(0x43, 0x6A, 0x62BD) /* <CJK> */
+MAP(0x43, 0x6B, 0x663C) /* <CJK> */
+MAP(0x43, 0x6C, 0x67F1) /* <CJK> */
+MAP(0x43, 0x6D, 0x6CE8) /* <CJK> */
+MAP(0x43, 0x6E, 0x866B) /* <CJK> */
+MAP(0x43, 0x6F, 0x8877) /* <CJK> */
+MAP(0x43, 0x70, 0x8A3B) /* <CJK> */
+MAP(0x43, 0x71, 0x914E) /* <CJK> */
+MAP(0x43, 0x72, 0x92F3) /* <CJK> */
+MAP(0x43, 0x73, 0x99D0) /* <CJK> */
+MAP(0x43, 0x74, 0x6A17) /* <CJK> */
+MAP(0x43, 0x75, 0x7026) /* <CJK> */
+MAP(0x43, 0x76, 0x732A) /* <CJK> */
+MAP(0x43, 0x77, 0x82E7) /* <CJK> */
+MAP(0x43, 0x78, 0x8457) /* <CJK> */
+MAP(0x43, 0x79, 0x8CAF) /* <CJK> */
+MAP(0x43, 0x7A, 0x4E01) /* <CJK> */
+MAP(0x43, 0x7B, 0x5146) /* <CJK> */
+MAP(0x43, 0x7C, 0x51CB) /* <CJK> */
+MAP(0x43, 0x7D, 0x558B) /* <CJK> */
+MAP(0x43, 0x7E, 0x5BF5) /* <CJK> */
+MAP(0x44, 0x21, 0x5E16) /* <CJK> */
+MAP(0x44, 0x22, 0x5E33) /* <CJK> */
+MAP(0x44, 0x23, 0x5E81) /* <CJK> */
+MAP(0x44, 0x24, 0x5F14) /* <CJK> */
+MAP(0x44, 0x25, 0x5F35) /* <CJK> */
+MAP(0x44, 0x26, 0x5F6B) /* <CJK> */
+MAP(0x44, 0x27, 0x5FB4) /* <CJK> */
+MAP(0x44, 0x28, 0x61F2) /* <CJK> */
+MAP(0x44, 0x29, 0x6311) /* <CJK> */
+MAP(0x44, 0x2A, 0x66A2) /* <CJK> */
+MAP(0x44, 0x2B, 0x671D) /* <CJK> */
+MAP(0x44, 0x2C, 0x6F6E) /* <CJK> */
+MAP(0x44, 0x2D, 0x7252) /* <CJK> */
+MAP(0x44, 0x2E, 0x753A) /* <CJK> */
+MAP(0x44, 0x2F, 0x773A) /* <CJK> */
+MAP(0x44, 0x30, 0x8074) /* <CJK> */
+MAP(0x44, 0x31, 0x8139) /* <CJK> */
+MAP(0x44, 0x32, 0x8178) /* <CJK> */
+MAP(0x44, 0x33, 0x8776) /* <CJK> */
+MAP(0x44, 0x34, 0x8ABF) /* <CJK> */
+MAP(0x44, 0x35, 0x8ADC) /* <CJK> */
+MAP(0x44, 0x36, 0x8D85) /* <CJK> */
+MAP(0x44, 0x37, 0x8DF3) /* <CJK> */
+MAP(0x44, 0x38, 0x929A) /* <CJK> */
+MAP(0x44, 0x39, 0x9577) /* <CJK> */
+MAP(0x44, 0x3A, 0x9802) /* <CJK> */
+MAP(0x44, 0x3B, 0x9CE5) /* <CJK> */
+MAP(0x44, 0x3C, 0x52C5) /* <CJK> */
+MAP(0x44, 0x3D, 0x6357) /* <CJK> */
+MAP(0x44, 0x3E, 0x76F4) /* <CJK> */
+MAP(0x44, 0x3F, 0x6715) /* <CJK> */
+MAP(0x44, 0x40, 0x6C88) /* <CJK> */
+MAP(0x44, 0x41, 0x73CD) /* <CJK> */
+MAP(0x44, 0x42, 0x8CC3) /* <CJK> */
+MAP(0x44, 0x43, 0x93AE) /* <CJK> */
+MAP(0x44, 0x44, 0x9673) /* <CJK> */
+MAP(0x44, 0x45, 0x6D25) /* <CJK> */
+MAP(0x44, 0x46, 0x589C) /* <CJK> */
+MAP(0x44, 0x47, 0x690E) /* <CJK> */
+MAP(0x44, 0x48, 0x69CC) /* <CJK> */
+MAP(0x44, 0x49, 0x8FFD) /* <CJK> */
+MAP(0x44, 0x4A, 0x939A) /* <CJK> */
+MAP(0x44, 0x4B, 0x75DB) /* <CJK> */
+MAP(0x44, 0x4C, 0x901A) /* <CJK> */
+MAP(0x44, 0x4D, 0x585A) /* <CJK> */
+MAP(0x44, 0x4E, 0x6802) /* <CJK> */
+MAP(0x44, 0x4F, 0x63B4) /* <CJK> */
+MAP(0x44, 0x50, 0x69FB) /* <CJK> */
+MAP(0x44, 0x51, 0x4F43) /* <CJK> */
+MAP(0x44, 0x52, 0x6F2C) /* <CJK> */
+MAP(0x44, 0x53, 0x67D8) /* <CJK> */
+MAP(0x44, 0x54, 0x8FBB) /* <CJK> */
+MAP(0x44, 0x55, 0x8526) /* <CJK> */
+MAP(0x44, 0x56, 0x7DB4) /* <CJK> */
+MAP(0x44, 0x57, 0x9354) /* <CJK> */
+MAP(0x44, 0x58, 0x693F) /* <CJK> */
+MAP(0x44, 0x59, 0x6F70) /* <CJK> */
+MAP(0x44, 0x5A, 0x576A) /* <CJK> */
+MAP(0x44, 0x5B, 0x58F7) /* <CJK> */
+MAP(0x44, 0x5C, 0x5B2C) /* <CJK> */
+MAP(0x44, 0x5D, 0x7D2C) /* <CJK> */
+MAP(0x44, 0x5E, 0x722A) /* <CJK> */
+MAP(0x44, 0x5F, 0x540A) /* <CJK> */
+MAP(0x44, 0x60, 0x91E3) /* <CJK> */
+MAP(0x44, 0x61, 0x9DB4) /* <CJK> */
+MAP(0x44, 0x62, 0x4EAD) /* <CJK> */
+MAP(0x44, 0x63, 0x4F4E) /* <CJK> */
+MAP(0x44, 0x64, 0x505C) /* <CJK> */
+MAP(0x44, 0x65, 0x5075) /* <CJK> */
+MAP(0x44, 0x66, 0x5243) /* <CJK> */
+MAP(0x44, 0x67, 0x8C9E) /* <CJK> */
+MAP(0x44, 0x68, 0x5448) /* <CJK> */
+MAP(0x44, 0x69, 0x5824) /* <CJK> */
+MAP(0x44, 0x6A, 0x5B9A) /* <CJK> */
+MAP(0x44, 0x6B, 0x5E1D) /* <CJK> */
+MAP(0x44, 0x6C, 0x5E95) /* <CJK> */
+MAP(0x44, 0x6D, 0x5EAD) /* <CJK> */
+MAP(0x44, 0x6E, 0x5EF7) /* <CJK> */
+MAP(0x44, 0x6F, 0x5F1F) /* <CJK> */
+MAP(0x44, 0x70, 0x608C) /* <CJK> */
+MAP(0x44, 0x71, 0x62B5) /* <CJK> */
+MAP(0x44, 0x72, 0x633A) /* <CJK> */
+MAP(0x44, 0x73, 0x63D0) /* <CJK> */
+MAP(0x44, 0x74, 0x68AF) /* <CJK> */
+MAP(0x44, 0x75, 0x6C40) /* <CJK> */
+MAP(0x44, 0x76, 0x7887) /* <CJK> */
+MAP(0x44, 0x77, 0x798E) /* <CJK> */
+MAP(0x44, 0x78, 0x7A0B) /* <CJK> */
+MAP(0x44, 0x79, 0x7DE0) /* <CJK> */
+MAP(0x44, 0x7A, 0x8247) /* <CJK> */
+MAP(0x44, 0x7B, 0x8A02) /* <CJK> */
+MAP(0x44, 0x7C, 0x8AE6) /* <CJK> */
+MAP(0x44, 0x7D, 0x8E44) /* <CJK> */
+MAP(0x44, 0x7E, 0x9013) /* <CJK> */
+MAP(0x45, 0x21, 0x90B8) /* <CJK> */
+MAP(0x45, 0x22, 0x912D) /* <CJK> */
+MAP(0x45, 0x23, 0x91D8) /* <CJK> */
+MAP(0x45, 0x24, 0x9F0E) /* <CJK> */
+MAP(0x45, 0x25, 0x6CE5) /* <CJK> */
+MAP(0x45, 0x26, 0x6458) /* <CJK> */
+MAP(0x45, 0x27, 0x64E2) /* <CJK> */
+MAP(0x45, 0x28, 0x6575) /* <CJK> */
+MAP(0x45, 0x29, 0x6EF4) /* <CJK> */
+MAP(0x45, 0x2A, 0x7684) /* <CJK> */
+MAP(0x45, 0x2B, 0x7B1B) /* <CJK> */
+MAP(0x45, 0x2C, 0x9069) /* <CJK> */
+MAP(0x45, 0x2D, 0x93D1) /* <CJK> */
+MAP(0x45, 0x2E, 0x6EBA) /* <CJK> */
+MAP(0x45, 0x2F, 0x54F2) /* <CJK> */
+MAP(0x45, 0x30, 0x5FB9) /* <CJK> */
+MAP(0x45, 0x31, 0x64A4) /* <CJK> */
+MAP(0x45, 0x32, 0x8F4D) /* <CJK> */
+MAP(0x45, 0x33, 0x8FED) /* <CJK> */
+MAP(0x45, 0x34, 0x9244) /* <CJK> */
+MAP(0x45, 0x35, 0x5178) /* <CJK> */
+MAP(0x45, 0x36, 0x586B) /* <CJK> */
+MAP(0x45, 0x37, 0x5929) /* <CJK> */
+MAP(0x45, 0x38, 0x5C55) /* <CJK> */
+MAP(0x45, 0x39, 0x5E97) /* <CJK> */
+MAP(0x45, 0x3A, 0x6DFB) /* <CJK> */
+MAP(0x45, 0x3B, 0x7E8F) /* <CJK> */
+MAP(0x45, 0x3C, 0x751C) /* <CJK> */
+MAP(0x45, 0x3D, 0x8CBC) /* <CJK> */
+MAP(0x45, 0x3E, 0x8EE2) /* <CJK> */
+MAP(0x45, 0x3F, 0x985B) /* <CJK> */
+MAP(0x45, 0x40, 0x70B9) /* <CJK> */
+MAP(0x45, 0x41, 0x4F1D) /* <CJK> */
+MAP(0x45, 0x42, 0x6BBF) /* <CJK> */
+MAP(0x45, 0x43, 0x6FB1) /* <CJK> */
+MAP(0x45, 0x44, 0x7530) /* <CJK> */
+MAP(0x45, 0x45, 0x96FB) /* <CJK> */
+MAP(0x45, 0x46, 0x514E) /* <CJK> */
+MAP(0x45, 0x47, 0x5410) /* <CJK> */
+MAP(0x45, 0x48, 0x5835) /* <CJK> */
+MAP(0x45, 0x49, 0x5857) /* <CJK> */
+MAP(0x45, 0x4A, 0x59AC) /* <CJK> */
+MAP(0x45, 0x4B, 0x5C60) /* <CJK> */
+MAP(0x45, 0x4C, 0x5F92) /* <CJK> */
+MAP(0x45, 0x4D, 0x6597) /* <CJK> */
+MAP(0x45, 0x4E, 0x675C) /* <CJK> */
+MAP(0x45, 0x4F, 0x6E21) /* <CJK> */
+MAP(0x45, 0x50, 0x767B) /* <CJK> */
+MAP(0x45, 0x51, 0x83DF) /* <CJK> */
+MAP(0x45, 0x52, 0x8CED) /* <CJK> */
+MAP(0x45, 0x53, 0x9014) /* <CJK> */
+MAP(0x45, 0x54, 0x90FD) /* <CJK> */
+MAP(0x45, 0x55, 0x934D) /* <CJK> */
+MAP(0x45, 0x56, 0x7825) /* <CJK> */
+MAP(0x45, 0x57, 0x783A) /* <CJK> */
+MAP(0x45, 0x58, 0x52AA) /* <CJK> */
+MAP(0x45, 0x59, 0x5EA6) /* <CJK> */
+MAP(0x45, 0x5A, 0x571F) /* <CJK> */
+MAP(0x45, 0x5B, 0x5974) /* <CJK> */
+MAP(0x45, 0x5C, 0x6012) /* <CJK> */
+MAP(0x45, 0x5D, 0x5012) /* <CJK> */
+MAP(0x45, 0x5E, 0x515A) /* <CJK> */
+MAP(0x45, 0x5F, 0x51AC) /* <CJK> */
+MAP(0x45, 0x60, 0x51CD) /* <CJK> */
+MAP(0x45, 0x61, 0x5200) /* <CJK> */
+MAP(0x45, 0x62, 0x5510) /* <CJK> */
+MAP(0x45, 0x63, 0x5854) /* <CJK> */
+MAP(0x45, 0x64, 0x5858) /* <CJK> */
+MAP(0x45, 0x65, 0x5957) /* <CJK> */
+MAP(0x45, 0x66, 0x5B95) /* <CJK> */
+MAP(0x45, 0x67, 0x5CF6) /* <CJK> */
+MAP(0x45, 0x68, 0x5D8B) /* <CJK> */
+MAP(0x45, 0x69, 0x60BC) /* <CJK> */
+MAP(0x45, 0x6A, 0x6295) /* <CJK> */
+MAP(0x45, 0x6B, 0x642D) /* <CJK> */
+MAP(0x45, 0x6C, 0x6771) /* <CJK> */
+MAP(0x45, 0x6D, 0x6843) /* <CJK> */
+MAP(0x45, 0x6E, 0x68BC) /* <CJK> */
+MAP(0x45, 0x6F, 0x68DF) /* <CJK> */
+MAP(0x45, 0x70, 0x76D7) /* <CJK> */
+MAP(0x45, 0x71, 0x6DD8) /* <CJK> */
+MAP(0x45, 0x72, 0x6E6F) /* <CJK> */
+MAP(0x45, 0x73, 0x6D9B) /* <CJK> */
+MAP(0x45, 0x74, 0x706F) /* <CJK> */
+MAP(0x45, 0x75, 0x71C8) /* <CJK> */
+MAP(0x45, 0x76, 0x5F53) /* <CJK> */
+MAP(0x45, 0x77, 0x75D8) /* <CJK> */
+MAP(0x45, 0x78, 0x7977) /* <CJK> */
+MAP(0x45, 0x79, 0x7B49) /* <CJK> */
+MAP(0x45, 0x7A, 0x7B54) /* <CJK> */
+MAP(0x45, 0x7B, 0x7B52) /* <CJK> */
+MAP(0x45, 0x7C, 0x7CD6) /* <CJK> */
+MAP(0x45, 0x7D, 0x7D71) /* <CJK> */
+MAP(0x45, 0x7E, 0x5230) /* <CJK> */
+MAP(0x46, 0x21, 0x8463) /* <CJK> */
+MAP(0x46, 0x22, 0x8569) /* <CJK> */
+MAP(0x46, 0x23, 0x85E4) /* <CJK> */
+MAP(0x46, 0x24, 0x8A0E) /* <CJK> */
+MAP(0x46, 0x25, 0x8B04) /* <CJK> */
+MAP(0x46, 0x26, 0x8C46) /* <CJK> */
+MAP(0x46, 0x27, 0x8E0F) /* <CJK> */
+MAP(0x46, 0x28, 0x9003) /* <CJK> */
+MAP(0x46, 0x29, 0x900F) /* <CJK> */
+MAP(0x46, 0x2A, 0x9419) /* <CJK> */
+MAP(0x46, 0x2B, 0x9676) /* <CJK> */
+MAP(0x46, 0x2C, 0x982D) /* <CJK> */
+MAP(0x46, 0x2D, 0x9A30) /* <CJK> */
+MAP(0x46, 0x2E, 0x95D8) /* <CJK> */
+MAP(0x46, 0x2F, 0x50CD) /* <CJK> */
+MAP(0x46, 0x30, 0x52D5) /* <CJK> */
+MAP(0x46, 0x31, 0x540C) /* <CJK> */
+MAP(0x46, 0x32, 0x5802) /* <CJK> */
+MAP(0x46, 0x33, 0x5C0E) /* <CJK> */
+MAP(0x46, 0x34, 0x61A7) /* <CJK> */
+MAP(0x46, 0x35, 0x649E) /* <CJK> */
+MAP(0x46, 0x36, 0x6D1E) /* <CJK> */
+MAP(0x46, 0x37, 0x77B3) /* <CJK> */
+MAP(0x46, 0x38, 0x7AE5) /* <CJK> */
+MAP(0x46, 0x39, 0x80F4) /* <CJK> */
+MAP(0x46, 0x3A, 0x8404) /* <CJK> */
+MAP(0x46, 0x3B, 0x9053) /* <CJK> */
+MAP(0x46, 0x3C, 0x9285) /* <CJK> */
+MAP(0x46, 0x3D, 0x5CE0) /* <CJK> */
+MAP(0x46, 0x3E, 0x9D07) /* <CJK> */
+MAP(0x46, 0x3F, 0x533F) /* <CJK> */
+MAP(0x46, 0x40, 0x5F97) /* <CJK> */
+MAP(0x46, 0x41, 0x5FB3) /* <CJK> */
+MAP(0x46, 0x42, 0x6D9C) /* <CJK> */
+MAP(0x46, 0x43, 0x7279) /* <CJK> */
+MAP(0x46, 0x44, 0x7763) /* <CJK> */
+MAP(0x46, 0x45, 0x79BF) /* <CJK> */
+MAP(0x46, 0x46, 0x7BE4) /* <CJK> */
+MAP(0x46, 0x47, 0x6BD2) /* <CJK> */
+MAP(0x46, 0x48, 0x72EC) /* <CJK> */
+MAP(0x46, 0x49, 0x8AAD) /* <CJK> */
+MAP(0x46, 0x4A, 0x6803) /* <CJK> */
+MAP(0x46, 0x4B, 0x6A61) /* <CJK> */
+MAP(0x46, 0x4C, 0x51F8) /* <CJK> */
+MAP(0x46, 0x4D, 0x7A81) /* <CJK> */
+MAP(0x46, 0x4E, 0x6934) /* <CJK> */
+MAP(0x46, 0x4F, 0x5C4A) /* <CJK> */
+MAP(0x46, 0x50, 0x9CF6) /* <CJK> */
+MAP(0x46, 0x51, 0x82EB) /* <CJK> */
+MAP(0x46, 0x52, 0x5BC5) /* <CJK> */
+MAP(0x46, 0x53, 0x9149) /* <CJK> */
+MAP(0x46, 0x54, 0x701E) /* <CJK> */
+MAP(0x46, 0x55, 0x5678) /* <CJK> */
+MAP(0x46, 0x56, 0x5C6F) /* <CJK> */
+MAP(0x46, 0x57, 0x60C7) /* <CJK> */
+MAP(0x46, 0x58, 0x6566) /* <CJK> */
+MAP(0x46, 0x59, 0x6C8C) /* <CJK> */
+MAP(0x46, 0x5A, 0x8C5A) /* <CJK> */
+MAP(0x46, 0x5B, 0x9041) /* <CJK> */
+MAP(0x46, 0x5C, 0x9813) /* <CJK> */
+MAP(0x46, 0x5D, 0x5451) /* <CJK> */
+MAP(0x46, 0x5E, 0x66C7) /* <CJK> */
+MAP(0x46, 0x5F, 0x920D) /* <CJK> */
+MAP(0x46, 0x60, 0x5948) /* <CJK> */
+MAP(0x46, 0x61, 0x90A3) /* <CJK> */
+MAP(0x46, 0x62, 0x5185) /* <CJK> */
+MAP(0x46, 0x63, 0x4E4D) /* <CJK> */
+MAP(0x46, 0x64, 0x51EA) /* <CJK> */
+MAP(0x46, 0x65, 0x8599) /* <CJK> */
+MAP(0x46, 0x66, 0x8B0E) /* <CJK> */
+MAP(0x46, 0x67, 0x7058) /* <CJK> */
+MAP(0x46, 0x68, 0x637A) /* <CJK> */
+MAP(0x46, 0x69, 0x934B) /* <CJK> */
+MAP(0x46, 0x6A, 0x6962) /* <CJK> */
+MAP(0x46, 0x6B, 0x99B4) /* <CJK> */
+MAP(0x46, 0x6C, 0x7E04) /* <CJK> */
+MAP(0x46, 0x6D, 0x7577) /* <CJK> */
+MAP(0x46, 0x6E, 0x5357) /* <CJK> */
+MAP(0x46, 0x6F, 0x6960) /* <CJK> */
+MAP(0x46, 0x70, 0x8EDF) /* <CJK> */
+MAP(0x46, 0x71, 0x96E3) /* <CJK> */
+MAP(0x46, 0x72, 0x6C5D) /* <CJK> */
+MAP(0x46, 0x73, 0x4E8C) /* <CJK> */
+MAP(0x46, 0x74, 0x5C3C) /* <CJK> */
+MAP(0x46, 0x75, 0x5F10) /* <CJK> */
+MAP(0x46, 0x76, 0x8FE9) /* <CJK> */
+MAP(0x46, 0x77, 0x5302) /* <CJK> */
+MAP(0x46, 0x78, 0x8CD1) /* <CJK> */
+MAP(0x46, 0x79, 0x8089) /* <CJK> */
+MAP(0x46, 0x7A, 0x8679) /* <CJK> */
+MAP(0x46, 0x7B, 0x5EFF) /* <CJK> */
+MAP(0x46, 0x7C, 0x65E5) /* <CJK> */
+MAP(0x46, 0x7D, 0x4E73) /* <CJK> */
+MAP(0x46, 0x7E, 0x5165) /* <CJK> */
+MAP(0x47, 0x21, 0x5982) /* <CJK> */
+MAP(0x47, 0x22, 0x5C3F) /* <CJK> */
+MAP(0x47, 0x23, 0x97EE) /* <CJK> */
+MAP(0x47, 0x24, 0x4EFB) /* <CJK> */
+MAP(0x47, 0x25, 0x598A) /* <CJK> */
+MAP(0x47, 0x26, 0x5FCD) /* <CJK> */
+MAP(0x47, 0x27, 0x8A8D) /* <CJK> */
+MAP(0x47, 0x28, 0x6FE1) /* <CJK> */
+MAP(0x47, 0x29, 0x79B0) /* <CJK> */
+MAP(0x47, 0x2A, 0x7962) /* <CJK> */
+MAP(0x47, 0x2B, 0x5BE7) /* <CJK> */
+MAP(0x47, 0x2C, 0x8471) /* <CJK> */
+MAP(0x47, 0x2D, 0x732B) /* <CJK> */
+MAP(0x47, 0x2E, 0x71B1) /* <CJK> */
+MAP(0x47, 0x2F, 0x5E74) /* <CJK> */
+MAP(0x47, 0x30, 0x5FF5) /* <CJK> */
+MAP(0x47, 0x31, 0x637B) /* <CJK> */
+MAP(0x47, 0x32, 0x649A) /* <CJK> */
+MAP(0x47, 0x33, 0x71C3) /* <CJK> */
+MAP(0x47, 0x34, 0x7C98) /* <CJK> */
+MAP(0x47, 0x35, 0x4E43) /* <CJK> */
+MAP(0x47, 0x36, 0x5EFC) /* <CJK> */
+MAP(0x47, 0x37, 0x4E4B) /* <CJK> */
+MAP(0x47, 0x38, 0x57DC) /* <CJK> */
+MAP(0x47, 0x39, 0x56A2) /* <CJK> */
+MAP(0x47, 0x3A, 0x60A9) /* <CJK> */
+MAP(0x47, 0x3B, 0x6FC3) /* <CJK> */
+MAP(0x47, 0x3C, 0x7D0D) /* <CJK> */
+MAP(0x47, 0x3D, 0x80FD) /* <CJK> */
+MAP(0x47, 0x3E, 0x8133) /* <CJK> */
+MAP(0x47, 0x3F, 0x81BF) /* <CJK> */
+MAP(0x47, 0x40, 0x8FB2) /* <CJK> */
+MAP(0x47, 0x41, 0x8997) /* <CJK> */
+MAP(0x47, 0x42, 0x86A4) /* <CJK> */
+MAP(0x47, 0x43, 0x5DF4) /* <CJK> */
+MAP(0x47, 0x44, 0x628A) /* <CJK> */
+MAP(0x47, 0x45, 0x64AD) /* <CJK> */
+MAP(0x47, 0x46, 0x8987) /* <CJK> */
+MAP(0x47, 0x47, 0x6777) /* <CJK> */
+MAP(0x47, 0x48, 0x6CE2) /* <CJK> */
+MAP(0x47, 0x49, 0x6D3E) /* <CJK> */
+MAP(0x47, 0x4A, 0x7436) /* <CJK> */
+MAP(0x47, 0x4B, 0x7834) /* <CJK> */
+MAP(0x47, 0x4C, 0x5A46) /* <CJK> */
+MAP(0x47, 0x4D, 0x7F75) /* <CJK> */
+MAP(0x47, 0x4E, 0x82AD) /* <CJK> */
+MAP(0x47, 0x4F, 0x99AC) /* <CJK> */
+MAP(0x47, 0x50, 0x4FF3) /* <CJK> */
+MAP(0x47, 0x51, 0x5EC3) /* <CJK> */
+MAP(0x47, 0x52, 0x62DD) /* <CJK> */
+MAP(0x47, 0x53, 0x6392) /* <CJK> */
+MAP(0x47, 0x54, 0x6557) /* <CJK> */
+MAP(0x47, 0x55, 0x676F) /* <CJK> */
+MAP(0x47, 0x56, 0x76C3) /* <CJK> */
+MAP(0x47, 0x57, 0x724C) /* <CJK> */
+MAP(0x47, 0x58, 0x80CC) /* <CJK> */
+MAP(0x47, 0x59, 0x80BA) /* <CJK> */
+MAP(0x47, 0x5A, 0x8F29) /* <CJK> */
+MAP(0x47, 0x5B, 0x914D) /* <CJK> */
+MAP(0x47, 0x5C, 0x500D) /* <CJK> */
+MAP(0x47, 0x5D, 0x57F9) /* <CJK> */
+MAP(0x47, 0x5E, 0x5A92) /* <CJK> */
+MAP(0x47, 0x5F, 0x6885) /* <CJK> */
+MAP(0x47, 0x60, 0x6973) /* <CJK> */
+MAP(0x47, 0x61, 0x7164) /* <CJK> */
+MAP(0x47, 0x62, 0x72FD) /* <CJK> */
+MAP(0x47, 0x63, 0x8CB7) /* <CJK> */
+MAP(0x47, 0x64, 0x58F2) /* <CJK> */
+MAP(0x47, 0x65, 0x8CE0) /* <CJK> */
+MAP(0x47, 0x66, 0x966A) /* <CJK> */
+MAP(0x47, 0x67, 0x9019) /* <CJK> */
+MAP(0x47, 0x68, 0x877F) /* <CJK> */
+MAP(0x47, 0x69, 0x79E4) /* <CJK> */
+MAP(0x47, 0x6A, 0x77E7) /* <CJK> */
+MAP(0x47, 0x6B, 0x8429) /* <CJK> */
+MAP(0x47, 0x6C, 0x4F2F) /* <CJK> */
+MAP(0x47, 0x6D, 0x5265) /* <CJK> */
+MAP(0x47, 0x6E, 0x535A) /* <CJK> */
+MAP(0x47, 0x6F, 0x62CD) /* <CJK> */
+MAP(0x47, 0x70, 0x67CF) /* <CJK> */
+MAP(0x47, 0x71, 0x6CCA) /* <CJK> */
+MAP(0x47, 0x72, 0x767D) /* <CJK> */
+MAP(0x47, 0x73, 0x7B94) /* <CJK> */
+MAP(0x47, 0x74, 0x7C95) /* <CJK> */
+MAP(0x47, 0x75, 0x8236) /* <CJK> */
+MAP(0x47, 0x76, 0x8584) /* <CJK> */
+MAP(0x47, 0x77, 0x8FEB) /* <CJK> */
+MAP(0x47, 0x78, 0x66DD) /* <CJK> */
+MAP(0x47, 0x79, 0x6F20) /* <CJK> */
+MAP(0x47, 0x7A, 0x7206) /* <CJK> */
+MAP(0x47, 0x7B, 0x7E1B) /* <CJK> */
+MAP(0x47, 0x7C, 0x83AB) /* <CJK> */
+MAP(0x47, 0x7D, 0x99C1) /* <CJK> */
+MAP(0x47, 0x7E, 0x9EA6) /* <CJK> */
+MAP(0x48, 0x21, 0x51FD) /* <CJK> */
+MAP(0x48, 0x22, 0x7BB1) /* <CJK> */
+MAP(0x48, 0x23, 0x7872) /* <CJK> */
+MAP(0x48, 0x24, 0x7BB8) /* <CJK> */
+MAP(0x48, 0x25, 0x8087) /* <CJK> */
+MAP(0x48, 0x26, 0x7B48) /* <CJK> */
+MAP(0x48, 0x27, 0x6AE8) /* <CJK> */
+MAP(0x48, 0x28, 0x5E61) /* <CJK> */
+MAP(0x48, 0x29, 0x808C) /* <CJK> */
+MAP(0x48, 0x2A, 0x7551) /* <CJK> */
+MAP(0x48, 0x2B, 0x7560) /* <CJK> */
+MAP(0x48, 0x2C, 0x516B) /* <CJK> */
+MAP(0x48, 0x2D, 0x9262) /* <CJK> */
+MAP(0x48, 0x2E, 0x6E8C) /* <CJK> */
+MAP(0x48, 0x2F, 0x767A) /* <CJK> */
+MAP(0x48, 0x30, 0x9197) /* <CJK> */
+MAP(0x48, 0x31, 0x9AEA) /* <CJK> */
+MAP(0x48, 0x32, 0x4F10) /* <CJK> */
+MAP(0x48, 0x33, 0x7F70) /* <CJK> */
+MAP(0x48, 0x34, 0x629C) /* <CJK> */
+MAP(0x48, 0x35, 0x7B4F) /* <CJK> */
+MAP(0x48, 0x36, 0x95A5) /* <CJK> */
+MAP(0x48, 0x37, 0x9CE9) /* <CJK> */
+MAP(0x48, 0x38, 0x567A) /* <CJK> */
+MAP(0x48, 0x39, 0x5859) /* <CJK> */
+MAP(0x48, 0x3A, 0x86E4) /* <CJK> */
+MAP(0x48, 0x3B, 0x96BC) /* <CJK> */
+MAP(0x48, 0x3C, 0x4F34) /* <CJK> */
+MAP(0x48, 0x3D, 0x5224) /* <CJK> */
+MAP(0x48, 0x3E, 0x534A) /* <CJK> */
+MAP(0x48, 0x3F, 0x53CD) /* <CJK> */
+MAP(0x48, 0x40, 0x53DB) /* <CJK> */
+MAP(0x48, 0x41, 0x5E06) /* <CJK> */
+MAP(0x48, 0x42, 0x642C) /* <CJK> */
+MAP(0x48, 0x43, 0x6591) /* <CJK> */
+MAP(0x48, 0x44, 0x677F) /* <CJK> */
+MAP(0x48, 0x45, 0x6C3E) /* <CJK> */
+MAP(0x48, 0x46, 0x6C4E) /* <CJK> */
+MAP(0x48, 0x47, 0x7248) /* <CJK> */
+MAP(0x48, 0x48, 0x72AF) /* <CJK> */
+MAP(0x48, 0x49, 0x73ED) /* <CJK> */
+MAP(0x48, 0x4A, 0x7554) /* <CJK> */
+MAP(0x48, 0x4B, 0x7E41) /* <CJK> */
+MAP(0x48, 0x4C, 0x822C) /* <CJK> */
+MAP(0x48, 0x4D, 0x85E9) /* <CJK> */
+MAP(0x48, 0x4E, 0x8CA9) /* <CJK> */
+MAP(0x48, 0x4F, 0x7BC4) /* <CJK> */
+MAP(0x48, 0x50, 0x91C6) /* <CJK> */
+MAP(0x48, 0x51, 0x7169) /* <CJK> */
+MAP(0x48, 0x52, 0x9812) /* <CJK> */
+MAP(0x48, 0x53, 0x98EF) /* <CJK> */
+MAP(0x48, 0x54, 0x633D) /* <CJK> */
+MAP(0x48, 0x55, 0x6669) /* <CJK> */
+MAP(0x48, 0x56, 0x756A) /* <CJK> */
+MAP(0x48, 0x57, 0x76E4) /* <CJK> */
+MAP(0x48, 0x58, 0x78D0) /* <CJK> */
+MAP(0x48, 0x59, 0x8543) /* <CJK> */
+MAP(0x48, 0x5A, 0x86EE) /* <CJK> */
+MAP(0x48, 0x5B, 0x532A) /* <CJK> */
+MAP(0x48, 0x5C, 0x5351) /* <CJK> */
+MAP(0x48, 0x5D, 0x5426) /* <CJK> */
+MAP(0x48, 0x5E, 0x5983) /* <CJK> */
+MAP(0x48, 0x5F, 0x5E87) /* <CJK> */
+MAP(0x48, 0x60, 0x5F7C) /* <CJK> */
+MAP(0x48, 0x61, 0x60B2) /* <CJK> */
+MAP(0x48, 0x62, 0x6249) /* <CJK> */
+MAP(0x48, 0x63, 0x6279) /* <CJK> */
+MAP(0x48, 0x64, 0x62AB) /* <CJK> */
+MAP(0x48, 0x65, 0x6590) /* <CJK> */
+MAP(0x48, 0x66, 0x6BD4) /* <CJK> */
+MAP(0x48, 0x67, 0x6CCC) /* <CJK> */
+MAP(0x48, 0x68, 0x75B2) /* <CJK> */
+MAP(0x48, 0x69, 0x76AE) /* <CJK> */
+MAP(0x48, 0x6A, 0x7891) /* <CJK> */
+MAP(0x48, 0x6B, 0x79D8) /* <CJK> */
+MAP(0x48, 0x6C, 0x7DCB) /* <CJK> */
+MAP(0x48, 0x6D, 0x7F77) /* <CJK> */
+MAP(0x48, 0x6E, 0x80A5) /* <CJK> */
+MAP(0x48, 0x6F, 0x88AB) /* <CJK> */
+MAP(0x48, 0x70, 0x8AB9) /* <CJK> */
+MAP(0x48, 0x71, 0x8CBB) /* <CJK> */
+MAP(0x48, 0x72, 0x907F) /* <CJK> */
+MAP(0x48, 0x73, 0x975E) /* <CJK> */
+MAP(0x48, 0x74, 0x98DB) /* <CJK> */
+MAP(0x48, 0x75, 0x6A0B) /* <CJK> */
+MAP(0x48, 0x76, 0x7C38) /* <CJK> */
+MAP(0x48, 0x77, 0x5099) /* <CJK> */
+MAP(0x48, 0x78, 0x5C3E) /* <CJK> */
+MAP(0x48, 0x79, 0x5FAE) /* <CJK> */
+MAP(0x48, 0x7A, 0x6787) /* <CJK> */
+MAP(0x48, 0x7B, 0x6BD8) /* <CJK> */
+MAP(0x48, 0x7C, 0x7435) /* <CJK> */
+MAP(0x48, 0x7D, 0x7709) /* <CJK> */
+MAP(0x48, 0x7E, 0x7F8E) /* <CJK> */
+MAP(0x49, 0x21, 0x9F3B) /* <CJK> */
+MAP(0x49, 0x22, 0x67CA) /* <CJK> */
+MAP(0x49, 0x23, 0x7A17) /* <CJK> */
+MAP(0x49, 0x24, 0x5339) /* <CJK> */
+MAP(0x49, 0x25, 0x758B) /* <CJK> */
+MAP(0x49, 0x26, 0x9AED) /* <CJK> */
+MAP(0x49, 0x27, 0x5F66) /* <CJK> */
+MAP(0x49, 0x28, 0x819D) /* <CJK> */
+MAP(0x49, 0x29, 0x83F1) /* <CJK> */
+MAP(0x49, 0x2A, 0x8098) /* <CJK> */
+MAP(0x49, 0x2B, 0x5F3C) /* <CJK> */
+MAP(0x49, 0x2C, 0x5FC5) /* <CJK> */
+MAP(0x49, 0x2D, 0x7562) /* <CJK> */
+MAP(0x49, 0x2E, 0x7B46) /* <CJK> */
+MAP(0x49, 0x2F, 0x903C) /* <CJK> */
+MAP(0x49, 0x30, 0x6867) /* <CJK> */
+MAP(0x49, 0x31, 0x59EB) /* <CJK> */
+MAP(0x49, 0x32, 0x5A9B) /* <CJK> */
+MAP(0x49, 0x33, 0x7D10) /* <CJK> */
+MAP(0x49, 0x34, 0x767E) /* <CJK> */
+MAP(0x49, 0x35, 0x8B2C) /* <CJK> */
+MAP(0x49, 0x36, 0x4FF5) /* <CJK> */
+MAP(0x49, 0x37, 0x5F6A) /* <CJK> */
+MAP(0x49, 0x38, 0x6A19) /* <CJK> */
+MAP(0x49, 0x39, 0x6C37) /* <CJK> */
+MAP(0x49, 0x3A, 0x6F02) /* <CJK> */
+MAP(0x49, 0x3B, 0x74E2) /* <CJK> */
+MAP(0x49, 0x3C, 0x7968) /* <CJK> */
+MAP(0x49, 0x3D, 0x8868) /* <CJK> */
+MAP(0x49, 0x3E, 0x8A55) /* <CJK> */
+MAP(0x49, 0x3F, 0x8C79) /* <CJK> */
+MAP(0x49, 0x40, 0x5EDF) /* <CJK> */
+MAP(0x49, 0x41, 0x63CF) /* <CJK> */
+MAP(0x49, 0x42, 0x75C5) /* <CJK> */
+MAP(0x49, 0x43, 0x79D2) /* <CJK> */
+MAP(0x49, 0x44, 0x82D7) /* <CJK> */
+MAP(0x49, 0x45, 0x9328) /* <CJK> */
+MAP(0x49, 0x46, 0x92F2) /* <CJK> */
+MAP(0x49, 0x47, 0x849C) /* <CJK> */
+MAP(0x49, 0x48, 0x86ED) /* <CJK> */
+MAP(0x49, 0x49, 0x9C2D) /* <CJK> */
+MAP(0x49, 0x4A, 0x54C1) /* <CJK> */
+MAP(0x49, 0x4B, 0x5F6C) /* <CJK> */
+MAP(0x49, 0x4C, 0x658C) /* <CJK> */
+MAP(0x49, 0x4D, 0x6D5C) /* <CJK> */
+MAP(0x49, 0x4E, 0x7015) /* <CJK> */
+MAP(0x49, 0x4F, 0x8CA7) /* <CJK> */
+MAP(0x49, 0x50, 0x8CD3) /* <CJK> */
+MAP(0x49, 0x51, 0x983B) /* <CJK> */
+MAP(0x49, 0x52, 0x654F) /* <CJK> */
+MAP(0x49, 0x53, 0x74F6) /* <CJK> */
+MAP(0x49, 0x54, 0x4E0D) /* <CJK> */
+MAP(0x49, 0x55, 0x4ED8) /* <CJK> */
+MAP(0x49, 0x56, 0x57E0) /* <CJK> */
+MAP(0x49, 0x57, 0x592B) /* <CJK> */
+MAP(0x49, 0x58, 0x5A66) /* <CJK> */
+MAP(0x49, 0x59, 0x5BCC) /* <CJK> */
+MAP(0x49, 0x5A, 0x51A8) /* <CJK> */
+MAP(0x49, 0x5B, 0x5E03) /* <CJK> */
+MAP(0x49, 0x5C, 0x5E9C) /* <CJK> */
+MAP(0x49, 0x5D, 0x6016) /* <CJK> */
+MAP(0x49, 0x5E, 0x6276) /* <CJK> */
+MAP(0x49, 0x5F, 0x6577) /* <CJK> */
+MAP(0x49, 0x60, 0x65A7) /* <CJK> */
+MAP(0x49, 0x61, 0x666E) /* <CJK> */
+MAP(0x49, 0x62, 0x6D6E) /* <CJK> */
+MAP(0x49, 0x63, 0x7236) /* <CJK> */
+MAP(0x49, 0x64, 0x7B26) /* <CJK> */
+MAP(0x49, 0x65, 0x8150) /* <CJK> */
+MAP(0x49, 0x66, 0x819A) /* <CJK> */
+MAP(0x49, 0x67, 0x8299) /* <CJK> */
+MAP(0x49, 0x68, 0x8B5C) /* <CJK> */
+MAP(0x49, 0x69, 0x8CA0) /* <CJK> */
+MAP(0x49, 0x6A, 0x8CE6) /* <CJK> */
+MAP(0x49, 0x6B, 0x8D74) /* <CJK> */
+MAP(0x49, 0x6C, 0x961C) /* <CJK> */
+MAP(0x49, 0x6D, 0x9644) /* <CJK> */
+MAP(0x49, 0x6E, 0x4FAE) /* <CJK> */
+MAP(0x49, 0x6F, 0x64AB) /* <CJK> */
+MAP(0x49, 0x70, 0x6B66) /* <CJK> */
+MAP(0x49, 0x71, 0x821E) /* <CJK> */
+MAP(0x49, 0x72, 0x8461) /* <CJK> */
+MAP(0x49, 0x73, 0x856A) /* <CJK> */
+MAP(0x49, 0x74, 0x90E8) /* <CJK> */
+MAP(0x49, 0x75, 0x5C01) /* <CJK> */
+MAP(0x49, 0x76, 0x6953) /* <CJK> */
+MAP(0x49, 0x77, 0x98A8) /* <CJK> */
+MAP(0x49, 0x78, 0x847A) /* <CJK> */
+MAP(0x49, 0x79, 0x8557) /* <CJK> */
+MAP(0x49, 0x7A, 0x4F0F) /* <CJK> */
+MAP(0x49, 0x7B, 0x526F) /* <CJK> */
+MAP(0x49, 0x7C, 0x5FA9) /* <CJK> */
+MAP(0x49, 0x7D, 0x5E45) /* <CJK> */
+MAP(0x49, 0x7E, 0x670D) /* <CJK> */
+MAP(0x4A, 0x21, 0x798F) /* <CJK> */
+MAP(0x4A, 0x22, 0x8179) /* <CJK> */
+MAP(0x4A, 0x23, 0x8907) /* <CJK> */
+MAP(0x4A, 0x24, 0x8986) /* <CJK> */
+MAP(0x4A, 0x25, 0x6DF5) /* <CJK> */
+MAP(0x4A, 0x26, 0x5F17) /* <CJK> */
+MAP(0x4A, 0x27, 0x6255) /* <CJK> */
+MAP(0x4A, 0x28, 0x6CB8) /* <CJK> */
+MAP(0x4A, 0x29, 0x4ECF) /* <CJK> */
+MAP(0x4A, 0x2A, 0x7269) /* <CJK> */
+MAP(0x4A, 0x2B, 0x9B92) /* <CJK> */
+MAP(0x4A, 0x2C, 0x5206) /* <CJK> */
+MAP(0x4A, 0x2D, 0x543B) /* <CJK> */
+MAP(0x4A, 0x2E, 0x5674) /* <CJK> */
+MAP(0x4A, 0x2F, 0x58B3) /* <CJK> */
+MAP(0x4A, 0x30, 0x61A4) /* <CJK> */
+MAP(0x4A, 0x31, 0x626E) /* <CJK> */
+MAP(0x4A, 0x32, 0x711A) /* <CJK> */
+MAP(0x4A, 0x33, 0x596E) /* <CJK> */
+MAP(0x4A, 0x34, 0x7C89) /* <CJK> */
+MAP(0x4A, 0x35, 0x7CDE) /* <CJK> */
+MAP(0x4A, 0x36, 0x7D1B) /* <CJK> */
+MAP(0x4A, 0x37, 0x96F0) /* <CJK> */
+MAP(0x4A, 0x38, 0x6587) /* <CJK> */
+MAP(0x4A, 0x39, 0x805E) /* <CJK> */
+MAP(0x4A, 0x3A, 0x4E19) /* <CJK> */
+MAP(0x4A, 0x3B, 0x4F75) /* <CJK> */
+MAP(0x4A, 0x3C, 0x5175) /* <CJK> */
+MAP(0x4A, 0x3D, 0x5840) /* <CJK> */
+MAP(0x4A, 0x3E, 0x5E63) /* <CJK> */
+MAP(0x4A, 0x3F, 0x5E73) /* <CJK> */
+MAP(0x4A, 0x40, 0x5F0A) /* <CJK> */
+MAP(0x4A, 0x41, 0x67C4) /* <CJK> */
+MAP(0x4A, 0x42, 0x4E26) /* <CJK> */
+MAP(0x4A, 0x43, 0x853D) /* <CJK> */
+MAP(0x4A, 0x44, 0x9589) /* <CJK> */
+MAP(0x4A, 0x45, 0x965B) /* <CJK> */
+MAP(0x4A, 0x46, 0x7C73) /* <CJK> */
+MAP(0x4A, 0x47, 0x9801) /* <CJK> */
+MAP(0x4A, 0x48, 0x50FB) /* <CJK> */
+MAP(0x4A, 0x49, 0x58C1) /* <CJK> */
+MAP(0x4A, 0x4A, 0x7656) /* <CJK> */
+MAP(0x4A, 0x4B, 0x78A7) /* <CJK> */
+MAP(0x4A, 0x4C, 0x5225) /* <CJK> */
+MAP(0x4A, 0x4D, 0x77A5) /* <CJK> */
+MAP(0x4A, 0x4E, 0x8511) /* <CJK> */
+MAP(0x4A, 0x4F, 0x7B86) /* <CJK> */
+MAP(0x4A, 0x50, 0x504F) /* <CJK> */
+MAP(0x4A, 0x51, 0x5909) /* <CJK> */
+MAP(0x4A, 0x52, 0x7247) /* <CJK> */
+MAP(0x4A, 0x53, 0x7BC7) /* <CJK> */
+MAP(0x4A, 0x54, 0x7DE8) /* <CJK> */
+MAP(0x4A, 0x55, 0x8FBA) /* <CJK> */
+MAP(0x4A, 0x56, 0x8FD4) /* <CJK> */
+MAP(0x4A, 0x57, 0x904D) /* <CJK> */
+MAP(0x4A, 0x58, 0x4FBF) /* <CJK> */
+MAP(0x4A, 0x59, 0x52C9) /* <CJK> */
+MAP(0x4A, 0x5A, 0x5A29) /* <CJK> */
+MAP(0x4A, 0x5B, 0x5F01) /* <CJK> */
+MAP(0x4A, 0x5C, 0x97AD) /* <CJK> */
+MAP(0x4A, 0x5D, 0x4FDD) /* <CJK> */
+MAP(0x4A, 0x5E, 0x8217) /* <CJK> */
+MAP(0x4A, 0x5F, 0x92EA) /* <CJK> */
+MAP(0x4A, 0x60, 0x5703) /* <CJK> */
+MAP(0x4A, 0x61, 0x6355) /* <CJK> */
+MAP(0x4A, 0x62, 0x6B69) /* <CJK> */
+MAP(0x4A, 0x63, 0x752B) /* <CJK> */
+MAP(0x4A, 0x64, 0x88DC) /* <CJK> */
+MAP(0x4A, 0x65, 0x8F14) /* <CJK> */
+MAP(0x4A, 0x66, 0x7A42) /* <CJK> */
+MAP(0x4A, 0x67, 0x52DF) /* <CJK> */
+MAP(0x4A, 0x68, 0x5893) /* <CJK> */
+MAP(0x4A, 0x69, 0x6155) /* <CJK> */
+MAP(0x4A, 0x6A, 0x620A) /* <CJK> */
+MAP(0x4A, 0x6B, 0x66AE) /* <CJK> */
+MAP(0x4A, 0x6C, 0x6BCD) /* <CJK> */
+MAP(0x4A, 0x6D, 0x7C3F) /* <CJK> */
+MAP(0x4A, 0x6E, 0x83E9) /* <CJK> */
+MAP(0x4A, 0x6F, 0x5023) /* <CJK> */
+MAP(0x4A, 0x70, 0x4FF8) /* <CJK> */
+MAP(0x4A, 0x71, 0x5305) /* <CJK> */
+MAP(0x4A, 0x72, 0x5446) /* <CJK> */
+MAP(0x4A, 0x73, 0x5831) /* <CJK> */
+MAP(0x4A, 0x74, 0x5949) /* <CJK> */
+MAP(0x4A, 0x75, 0x5B9D) /* <CJK> */
+MAP(0x4A, 0x76, 0x5CF0) /* <CJK> */
+MAP(0x4A, 0x77, 0x5CEF) /* <CJK> */
+MAP(0x4A, 0x78, 0x5D29) /* <CJK> */
+MAP(0x4A, 0x79, 0x5E96) /* <CJK> */
+MAP(0x4A, 0x7A, 0x62B1) /* <CJK> */
+MAP(0x4A, 0x7B, 0x6367) /* <CJK> */
+MAP(0x4A, 0x7C, 0x653E) /* <CJK> */
+MAP(0x4A, 0x7D, 0x65B9) /* <CJK> */
+MAP(0x4A, 0x7E, 0x670B) /* <CJK> */
+MAP(0x4B, 0x21, 0x6CD5) /* <CJK> */
+MAP(0x4B, 0x22, 0x6CE1) /* <CJK> */
+MAP(0x4B, 0x23, 0x70F9) /* <CJK> */
+MAP(0x4B, 0x24, 0x7832) /* <CJK> */
+MAP(0x4B, 0x25, 0x7E2B) /* <CJK> */
+MAP(0x4B, 0x26, 0x80DE) /* <CJK> */
+MAP(0x4B, 0x27, 0x82B3) /* <CJK> */
+MAP(0x4B, 0x28, 0x840C) /* <CJK> */
+MAP(0x4B, 0x29, 0x84EC) /* <CJK> */
+MAP(0x4B, 0x2A, 0x8702) /* <CJK> */
+MAP(0x4B, 0x2B, 0x8912) /* <CJK> */
+MAP(0x4B, 0x2C, 0x8A2A) /* <CJK> */
+MAP(0x4B, 0x2D, 0x8C4A) /* <CJK> */
+MAP(0x4B, 0x2E, 0x90A6) /* <CJK> */
+MAP(0x4B, 0x2F, 0x92D2) /* <CJK> */
+MAP(0x4B, 0x30, 0x98FD) /* <CJK> */
+MAP(0x4B, 0x31, 0x9CF3) /* <CJK> */
+MAP(0x4B, 0x32, 0x9D6C) /* <CJK> */
+MAP(0x4B, 0x33, 0x4E4F) /* <CJK> */
+MAP(0x4B, 0x34, 0x4EA1) /* <CJK> */
+MAP(0x4B, 0x35, 0x508D) /* <CJK> */
+MAP(0x4B, 0x36, 0x5256) /* <CJK> */
+MAP(0x4B, 0x37, 0x574A) /* <CJK> */
+MAP(0x4B, 0x38, 0x59A8) /* <CJK> */
+MAP(0x4B, 0x39, 0x5E3D) /* <CJK> */
+MAP(0x4B, 0x3A, 0x5FD8) /* <CJK> */
+MAP(0x4B, 0x3B, 0x5FD9) /* <CJK> */
+MAP(0x4B, 0x3C, 0x623F) /* <CJK> */
+MAP(0x4B, 0x3D, 0x66B4) /* <CJK> */
+MAP(0x4B, 0x3E, 0x671B) /* <CJK> */
+MAP(0x4B, 0x3F, 0x67D0) /* <CJK> */
+MAP(0x4B, 0x40, 0x68D2) /* <CJK> */
+MAP(0x4B, 0x41, 0x5192) /* <CJK> */
+MAP(0x4B, 0x42, 0x7D21) /* <CJK> */
+MAP(0x4B, 0x43, 0x80AA) /* <CJK> */
+MAP(0x4B, 0x44, 0x81A8) /* <CJK> */
+MAP(0x4B, 0x45, 0x8B00) /* <CJK> */
+MAP(0x4B, 0x46, 0x8C8C) /* <CJK> */
+MAP(0x4B, 0x47, 0x8CBF) /* <CJK> */
+MAP(0x4B, 0x48, 0x927E) /* <CJK> */
+MAP(0x4B, 0x49, 0x9632) /* <CJK> */
+MAP(0x4B, 0x4A, 0x5420) /* <CJK> */
+MAP(0x4B, 0x4B, 0x982C) /* <CJK> */
+MAP(0x4B, 0x4C, 0x5317) /* <CJK> */
+MAP(0x4B, 0x4D, 0x50D5) /* <CJK> */
+MAP(0x4B, 0x4E, 0x535C) /* <CJK> */
+MAP(0x4B, 0x4F, 0x58A8) /* <CJK> */
+MAP(0x4B, 0x50, 0x64B2) /* <CJK> */
+MAP(0x4B, 0x51, 0x6734) /* <CJK> */
+MAP(0x4B, 0x52, 0x7267) /* <CJK> */
+MAP(0x4B, 0x53, 0x7766) /* <CJK> */
+MAP(0x4B, 0x54, 0x7A46) /* <CJK> */
+MAP(0x4B, 0x55, 0x91E6) /* <CJK> */
+MAP(0x4B, 0x56, 0x52C3) /* <CJK> */
+MAP(0x4B, 0x57, 0x6CA1) /* <CJK> */
+MAP(0x4B, 0x58, 0x6B86) /* <CJK> */
+MAP(0x4B, 0x59, 0x5800) /* <CJK> */
+MAP(0x4B, 0x5A, 0x5E4C) /* <CJK> */
+MAP(0x4B, 0x5B, 0x5954) /* <CJK> */
+MAP(0x4B, 0x5C, 0x672C) /* <CJK> */
+MAP(0x4B, 0x5D, 0x7FFB) /* <CJK> */
+MAP(0x4B, 0x5E, 0x51E1) /* <CJK> */
+MAP(0x4B, 0x5F, 0x76C6) /* <CJK> */
+MAP(0x4B, 0x60, 0x6469) /* <CJK> */
+MAP(0x4B, 0x61, 0x78E8) /* <CJK> */
+MAP(0x4B, 0x62, 0x9B54) /* <CJK> */
+MAP(0x4B, 0x63, 0x9EBB) /* <CJK> */
+MAP(0x4B, 0x64, 0x57CB) /* <CJK> */
+MAP(0x4B, 0x65, 0x59B9) /* <CJK> */
+MAP(0x4B, 0x66, 0x6627) /* <CJK> */
+MAP(0x4B, 0x67, 0x679A) /* <CJK> */
+MAP(0x4B, 0x68, 0x6BCE) /* <CJK> */
+MAP(0x4B, 0x69, 0x54E9) /* <CJK> */
+MAP(0x4B, 0x6A, 0x69D9) /* <CJK> */
+MAP(0x4B, 0x6B, 0x5E55) /* <CJK> */
+MAP(0x4B, 0x6C, 0x819C) /* <CJK> */
+MAP(0x4B, 0x6D, 0x6795) /* <CJK> */
+MAP(0x4B, 0x6E, 0x9BAA) /* <CJK> */
+MAP(0x4B, 0x6F, 0x67FE) /* <CJK> */
+MAP(0x4B, 0x70, 0x9C52) /* <CJK> */
+MAP(0x4B, 0x71, 0x685D) /* <CJK> */
+MAP(0x4B, 0x72, 0x4EA6) /* <CJK> */
+MAP(0x4B, 0x73, 0x4FE3) /* <CJK> */
+MAP(0x4B, 0x74, 0x53C8) /* <CJK> */
+MAP(0x4B, 0x75, 0x62B9) /* <CJK> */
+MAP(0x4B, 0x76, 0x672B) /* <CJK> */
+MAP(0x4B, 0x77, 0x6CAB) /* <CJK> */
+MAP(0x4B, 0x78, 0x8FC4) /* <CJK> */
+MAP(0x4B, 0x79, 0x4FAD) /* <CJK> */
+MAP(0x4B, 0x7A, 0x7E6D) /* <CJK> */
+MAP(0x4B, 0x7B, 0x9EBF) /* <CJK> */
+MAP(0x4B, 0x7C, 0x4E07) /* <CJK> */
+MAP(0x4B, 0x7D, 0x6162) /* <CJK> */
+MAP(0x4B, 0x7E, 0x6E80) /* <CJK> */
+MAP(0x4C, 0x21, 0x6F2B) /* <CJK> */
+MAP(0x4C, 0x22, 0x8513) /* <CJK> */
+MAP(0x4C, 0x23, 0x5473) /* <CJK> */
+MAP(0x4C, 0x24, 0x672A) /* <CJK> */
+MAP(0x4C, 0x25, 0x9B45) /* <CJK> */
+MAP(0x4C, 0x26, 0x5DF3) /* <CJK> */
+MAP(0x4C, 0x27, 0x7B95) /* <CJK> */
+MAP(0x4C, 0x28, 0x5CAC) /* <CJK> */
+MAP(0x4C, 0x29, 0x5BC6) /* <CJK> */
+MAP(0x4C, 0x2A, 0x871C) /* <CJK> */
+MAP(0x4C, 0x2B, 0x6E4A) /* <CJK> */
+MAP(0x4C, 0x2C, 0x84D1) /* <CJK> */
+MAP(0x4C, 0x2D, 0x7A14) /* <CJK> */
+MAP(0x4C, 0x2E, 0x8108) /* <CJK> */
+MAP(0x4C, 0x2F, 0x5999) /* <CJK> */
+MAP(0x4C, 0x30, 0x7C8D) /* <CJK> */
+MAP(0x4C, 0x31, 0x6C11) /* <CJK> */
+MAP(0x4C, 0x32, 0x7720) /* <CJK> */
+MAP(0x4C, 0x33, 0x52D9) /* <CJK> */
+MAP(0x4C, 0x34, 0x5922) /* <CJK> */
+MAP(0x4C, 0x35, 0x7121) /* <CJK> */
+MAP(0x4C, 0x36, 0x725F) /* <CJK> */
+MAP(0x4C, 0x37, 0x77DB) /* <CJK> */
+MAP(0x4C, 0x38, 0x9727) /* <CJK> */
+MAP(0x4C, 0x39, 0x9D61) /* <CJK> */
+MAP(0x4C, 0x3A, 0x690B) /* <CJK> */
+MAP(0x4C, 0x3B, 0x5A7F) /* <CJK> */
+MAP(0x4C, 0x3C, 0x5A18) /* <CJK> */
+MAP(0x4C, 0x3D, 0x51A5) /* <CJK> */
+MAP(0x4C, 0x3E, 0x540D) /* <CJK> */
+MAP(0x4C, 0x3F, 0x547D) /* <CJK> */
+MAP(0x4C, 0x40, 0x660E) /* <CJK> */
+MAP(0x4C, 0x41, 0x76DF) /* <CJK> */
+MAP(0x4C, 0x42, 0x8FF7) /* <CJK> */
+MAP(0x4C, 0x43, 0x9298) /* <CJK> */
+MAP(0x4C, 0x44, 0x9CF4) /* <CJK> */
+MAP(0x4C, 0x45, 0x59EA) /* <CJK> */
+MAP(0x4C, 0x46, 0x725D) /* <CJK> */
+MAP(0x4C, 0x47, 0x6EC5) /* <CJK> */
+MAP(0x4C, 0x48, 0x514D) /* <CJK> */
+MAP(0x4C, 0x49, 0x68C9) /* <CJK> */
+MAP(0x4C, 0x4A, 0x7DBF) /* <CJK> */
+MAP(0x4C, 0x4B, 0x7DEC) /* <CJK> */
+MAP(0x4C, 0x4C, 0x9762) /* <CJK> */
+MAP(0x4C, 0x4D, 0x9EBA) /* <CJK> */
+MAP(0x4C, 0x4E, 0x6478) /* <CJK> */
+MAP(0x4C, 0x4F, 0x6A21) /* <CJK> */
+MAP(0x4C, 0x50, 0x8302) /* <CJK> */
+MAP(0x4C, 0x51, 0x5984) /* <CJK> */
+MAP(0x4C, 0x52, 0x5B5F) /* <CJK> */
+MAP(0x4C, 0x53, 0x6BDB) /* <CJK> */
+MAP(0x4C, 0x54, 0x731B) /* <CJK> */
+MAP(0x4C, 0x55, 0x76F2) /* <CJK> */
+MAP(0x4C, 0x56, 0x7DB2) /* <CJK> */
+MAP(0x4C, 0x57, 0x8017) /* <CJK> */
+MAP(0x4C, 0x58, 0x8499) /* <CJK> */
+MAP(0x4C, 0x59, 0x5132) /* <CJK> */
+MAP(0x4C, 0x5A, 0x6728) /* <CJK> */
+MAP(0x4C, 0x5B, 0x9ED9) /* <CJK> */
+MAP(0x4C, 0x5C, 0x76EE) /* <CJK> */
+MAP(0x4C, 0x5D, 0x6762) /* <CJK> */
+MAP(0x4C, 0x5E, 0x52FF) /* <CJK> */
+MAP(0x4C, 0x5F, 0x9905) /* <CJK> */
+MAP(0x4C, 0x60, 0x5C24) /* <CJK> */
+MAP(0x4C, 0x61, 0x623B) /* <CJK> */
+MAP(0x4C, 0x62, 0x7C7E) /* <CJK> */
+MAP(0x4C, 0x63, 0x8CB0) /* <CJK> */
+MAP(0x4C, 0x64, 0x554F) /* <CJK> */
+MAP(0x4C, 0x65, 0x60B6) /* <CJK> */
+MAP(0x4C, 0x66, 0x7D0B) /* <CJK> */
+MAP(0x4C, 0x67, 0x9580) /* <CJK> */
+MAP(0x4C, 0x68, 0x5301) /* <CJK> */
+MAP(0x4C, 0x69, 0x4E5F) /* <CJK> */
+MAP(0x4C, 0x6A, 0x51B6) /* <CJK> */
+MAP(0x4C, 0x6B, 0x591C) /* <CJK> */
+MAP(0x4C, 0x6C, 0x723A) /* <CJK> */
+MAP(0x4C, 0x6D, 0x8036) /* <CJK> */
+MAP(0x4C, 0x6E, 0x91CE) /* <CJK> */
+MAP(0x4C, 0x6F, 0x5F25) /* <CJK> */
+MAP(0x4C, 0x70, 0x77E2) /* <CJK> */
+MAP(0x4C, 0x71, 0x5384) /* <CJK> */
+MAP(0x4C, 0x72, 0x5F79) /* <CJK> */
+MAP(0x4C, 0x73, 0x7D04) /* <CJK> */
+MAP(0x4C, 0x74, 0x85AC) /* <CJK> */
+MAP(0x4C, 0x75, 0x8A33) /* <CJK> */
+MAP(0x4C, 0x76, 0x8E8D) /* <CJK> */
+MAP(0x4C, 0x77, 0x9756) /* <CJK> */
+MAP(0x4C, 0x78, 0x67F3) /* <CJK> */
+MAP(0x4C, 0x79, 0x85AE) /* <CJK> */
+MAP(0x4C, 0x7A, 0x9453) /* <CJK> */
+MAP(0x4C, 0x7B, 0x6109) /* <CJK> */
+MAP(0x4C, 0x7C, 0x6108) /* <CJK> */
+MAP(0x4C, 0x7D, 0x6CB9) /* <CJK> */
+MAP(0x4C, 0x7E, 0x7652) /* <CJK> */
+MAP(0x4D, 0x21, 0x8AED) /* <CJK> */
+MAP(0x4D, 0x22, 0x8F38) /* <CJK> */
+MAP(0x4D, 0x23, 0x552F) /* <CJK> */
+MAP(0x4D, 0x24, 0x4F51) /* <CJK> */
+MAP(0x4D, 0x25, 0x512A) /* <CJK> */
+MAP(0x4D, 0x26, 0x52C7) /* <CJK> */
+MAP(0x4D, 0x27, 0x53CB) /* <CJK> */
+MAP(0x4D, 0x28, 0x5BA5) /* <CJK> */
+MAP(0x4D, 0x29, 0x5E7D) /* <CJK> */
+MAP(0x4D, 0x2A, 0x60A0) /* <CJK> */
+MAP(0x4D, 0x2B, 0x6182) /* <CJK> */
+MAP(0x4D, 0x2C, 0x63D6) /* <CJK> */
+MAP(0x4D, 0x2D, 0x6709) /* <CJK> */
+MAP(0x4D, 0x2E, 0x67DA) /* <CJK> */
+MAP(0x4D, 0x2F, 0x6E67) /* <CJK> */
+MAP(0x4D, 0x30, 0x6D8C) /* <CJK> */
+MAP(0x4D, 0x31, 0x7336) /* <CJK> */
+MAP(0x4D, 0x32, 0x7337) /* <CJK> */
+MAP(0x4D, 0x33, 0x7531) /* <CJK> */
+MAP(0x4D, 0x34, 0x7950) /* <CJK> */
+MAP(0x4D, 0x35, 0x88D5) /* <CJK> */
+MAP(0x4D, 0x36, 0x8A98) /* <CJK> */
+MAP(0x4D, 0x37, 0x904A) /* <CJK> */
+MAP(0x4D, 0x38, 0x9091) /* <CJK> */
+MAP(0x4D, 0x39, 0x90F5) /* <CJK> */
+MAP(0x4D, 0x3A, 0x96C4) /* <CJK> */
+MAP(0x4D, 0x3B, 0x878D) /* <CJK> */
+MAP(0x4D, 0x3C, 0x5915) /* <CJK> */
+MAP(0x4D, 0x3D, 0x4E88) /* <CJK> */
+MAP(0x4D, 0x3E, 0x4F59) /* <CJK> */
+MAP(0x4D, 0x3F, 0x4E0E) /* <CJK> */
+MAP(0x4D, 0x40, 0x8A89) /* <CJK> */
+MAP(0x4D, 0x41, 0x8F3F) /* <CJK> */
+MAP(0x4D, 0x42, 0x9810) /* <CJK> */
+MAP(0x4D, 0x43, 0x50AD) /* <CJK> */
+MAP(0x4D, 0x44, 0x5E7C) /* <CJK> */
+MAP(0x4D, 0x45, 0x5996) /* <CJK> */
+MAP(0x4D, 0x46, 0x5BB9) /* <CJK> */
+MAP(0x4D, 0x47, 0x5EB8) /* <CJK> */
+MAP(0x4D, 0x48, 0x63DA) /* <CJK> */
+MAP(0x4D, 0x49, 0x63FA) /* <CJK> */
+MAP(0x4D, 0x4A, 0x64C1) /* <CJK> */
+MAP(0x4D, 0x4B, 0x66DC) /* <CJK> */
+MAP(0x4D, 0x4C, 0x694A) /* <CJK> */
+MAP(0x4D, 0x4D, 0x69D8) /* <CJK> */
+MAP(0x4D, 0x4E, 0x6D0B) /* <CJK> */
+MAP(0x4D, 0x4F, 0x6EB6) /* <CJK> */
+MAP(0x4D, 0x50, 0x7194) /* <CJK> */
+MAP(0x4D, 0x51, 0x7528) /* <CJK> */
+MAP(0x4D, 0x52, 0x7AAF) /* <CJK> */
+MAP(0x4D, 0x53, 0x7F8A) /* <CJK> */
+MAP(0x4D, 0x54, 0x8000) /* <CJK> */
+MAP(0x4D, 0x55, 0x8449) /* <CJK> */
+MAP(0x4D, 0x56, 0x84C9) /* <CJK> */
+MAP(0x4D, 0x57, 0x8981) /* <CJK> */
+MAP(0x4D, 0x58, 0x8B21) /* <CJK> */
+MAP(0x4D, 0x59, 0x8E0A) /* <CJK> */
+MAP(0x4D, 0x5A, 0x9065) /* <CJK> */
+MAP(0x4D, 0x5B, 0x967D) /* <CJK> */
+MAP(0x4D, 0x5C, 0x990A) /* <CJK> */
+MAP(0x4D, 0x5D, 0x617E) /* <CJK> */
+MAP(0x4D, 0x5E, 0x6291) /* <CJK> */
+MAP(0x4D, 0x5F, 0x6B32) /* <CJK> */
+MAP(0x4D, 0x60, 0x6C83) /* <CJK> */
+MAP(0x4D, 0x61, 0x6D74) /* <CJK> */
+MAP(0x4D, 0x62, 0x7FCC) /* <CJK> */
+MAP(0x4D, 0x63, 0x7FFC) /* <CJK> */
+MAP(0x4D, 0x64, 0x6DC0) /* <CJK> */
+MAP(0x4D, 0x65, 0x7F85) /* <CJK> */
+MAP(0x4D, 0x66, 0x87BA) /* <CJK> */
+MAP(0x4D, 0x67, 0x88F8) /* <CJK> */
+MAP(0x4D, 0x68, 0x6765) /* <CJK> */
+MAP(0x4D, 0x69, 0x83B1) /* <CJK> */
+MAP(0x4D, 0x6A, 0x983C) /* <CJK> */
+MAP(0x4D, 0x6B, 0x96F7) /* <CJK> */
+MAP(0x4D, 0x6C, 0x6D1B) /* <CJK> */
+MAP(0x4D, 0x6D, 0x7D61) /* <CJK> */
+MAP(0x4D, 0x6E, 0x843D) /* <CJK> */
+MAP(0x4D, 0x6F, 0x916A) /* <CJK> */
+MAP(0x4D, 0x70, 0x4E71) /* <CJK> */
+MAP(0x4D, 0x71, 0x5375) /* <CJK> */
+MAP(0x4D, 0x72, 0x5D50) /* <CJK> */
+MAP(0x4D, 0x73, 0x6B04) /* <CJK> */
+MAP(0x4D, 0x74, 0x6FEB) /* <CJK> */
+MAP(0x4D, 0x75, 0x85CD) /* <CJK> */
+MAP(0x4D, 0x76, 0x862D) /* <CJK> */
+MAP(0x4D, 0x77, 0x89A7) /* <CJK> */
+MAP(0x4D, 0x78, 0x5229) /* <CJK> */
+MAP(0x4D, 0x79, 0x540F) /* <CJK> */
+MAP(0x4D, 0x7A, 0x5C65) /* <CJK> */
+MAP(0x4D, 0x7B, 0x674E) /* <CJK> */
+MAP(0x4D, 0x7C, 0x68A8) /* <CJK> */
+MAP(0x4D, 0x7D, 0x7406) /* <CJK> */
+MAP(0x4D, 0x7E, 0x7483) /* <CJK> */
+MAP(0x4E, 0x21, 0x75E2) /* <CJK> */
+MAP(0x4E, 0x22, 0x88CF) /* <CJK> */
+MAP(0x4E, 0x23, 0x88E1) /* <CJK> */
+MAP(0x4E, 0x24, 0x91CC) /* <CJK> */
+MAP(0x4E, 0x25, 0x96E2) /* <CJK> */
+MAP(0x4E, 0x26, 0x9678) /* <CJK> */
+MAP(0x4E, 0x27, 0x5F8B) /* <CJK> */
+MAP(0x4E, 0x28, 0x7387) /* <CJK> */
+MAP(0x4E, 0x29, 0x7ACB) /* <CJK> */
+MAP(0x4E, 0x2A, 0x844E) /* <CJK> */
+MAP(0x4E, 0x2B, 0x63A0) /* <CJK> */
+MAP(0x4E, 0x2C, 0x7565) /* <CJK> */
+MAP(0x4E, 0x2D, 0x5289) /* <CJK> */
+MAP(0x4E, 0x2E, 0x6D41) /* <CJK> */
+MAP(0x4E, 0x2F, 0x6E9C) /* <CJK> */
+MAP(0x4E, 0x30, 0x7409) /* <CJK> */
+MAP(0x4E, 0x31, 0x7559) /* <CJK> */
+MAP(0x4E, 0x32, 0x786B) /* <CJK> */
+MAP(0x4E, 0x33, 0x7C92) /* <CJK> */
+MAP(0x4E, 0x34, 0x9686) /* <CJK> */
+MAP(0x4E, 0x35, 0x7ADC) /* <CJK> */
+MAP(0x4E, 0x36, 0x9F8D) /* <CJK> */
+MAP(0x4E, 0x37, 0x4FB6) /* <CJK> */
+MAP(0x4E, 0x38, 0x616E) /* <CJK> */
+MAP(0x4E, 0x39, 0x65C5) /* <CJK> */
+MAP(0x4E, 0x3A, 0x865C) /* <CJK> */
+MAP(0x4E, 0x3B, 0x4E86) /* <CJK> */
+MAP(0x4E, 0x3C, 0x4EAE) /* <CJK> */
+MAP(0x4E, 0x3D, 0x50DA) /* <CJK> */
+MAP(0x4E, 0x3E, 0x4E21) /* <CJK> */
+MAP(0x4E, 0x3F, 0x51CC) /* <CJK> */
+MAP(0x4E, 0x40, 0x5BEE) /* <CJK> */
+MAP(0x4E, 0x41, 0x6599) /* <CJK> */
+MAP(0x4E, 0x42, 0x6881) /* <CJK> */
+MAP(0x4E, 0x43, 0x6DBC) /* <CJK> */
+MAP(0x4E, 0x44, 0x731F) /* <CJK> */
+MAP(0x4E, 0x45, 0x7642) /* <CJK> */
+MAP(0x4E, 0x46, 0x77AD) /* <CJK> */
+MAP(0x4E, 0x47, 0x7A1C) /* <CJK> */
+MAP(0x4E, 0x48, 0x7CE7) /* <CJK> */
+MAP(0x4E, 0x49, 0x826F) /* <CJK> */
+MAP(0x4E, 0x4A, 0x8AD2) /* <CJK> */
+MAP(0x4E, 0x4B, 0x907C) /* <CJK> */
+MAP(0x4E, 0x4C, 0x91CF) /* <CJK> */
+MAP(0x4E, 0x4D, 0x9675) /* <CJK> */
+MAP(0x4E, 0x4E, 0x9818) /* <CJK> */
+MAP(0x4E, 0x4F, 0x529B) /* <CJK> */
+MAP(0x4E, 0x50, 0x7DD1) /* <CJK> */
+MAP(0x4E, 0x51, 0x502B) /* <CJK> */
+MAP(0x4E, 0x52, 0x5398) /* <CJK> */
+MAP(0x4E, 0x53, 0x6797) /* <CJK> */
+MAP(0x4E, 0x54, 0x6DCB) /* <CJK> */
+MAP(0x4E, 0x55, 0x71D0) /* <CJK> */
+MAP(0x4E, 0x56, 0x7433) /* <CJK> */
+MAP(0x4E, 0x57, 0x81E8) /* <CJK> */
+MAP(0x4E, 0x58, 0x8F2A) /* <CJK> */
+MAP(0x4E, 0x59, 0x96A3) /* <CJK> */
+MAP(0x4E, 0x5A, 0x9C57) /* <CJK> */
+MAP(0x4E, 0x5B, 0x9E9F) /* <CJK> */
+MAP(0x4E, 0x5C, 0x7460) /* <CJK> */
+MAP(0x4E, 0x5D, 0x5841) /* <CJK> */
+MAP(0x4E, 0x5E, 0x6D99) /* <CJK> */
+MAP(0x4E, 0x5F, 0x7D2F) /* <CJK> */
+MAP(0x4E, 0x60, 0x985E) /* <CJK> */
+MAP(0x4E, 0x61, 0x4EE4) /* <CJK> */
+MAP(0x4E, 0x62, 0x4F36) /* <CJK> */
+MAP(0x4E, 0x63, 0x4F8B) /* <CJK> */
+MAP(0x4E, 0x64, 0x51B7) /* <CJK> */
+MAP(0x4E, 0x65, 0x52B1) /* <CJK> */
+MAP(0x4E, 0x66, 0x5DBA) /* <CJK> */
+MAP(0x4E, 0x67, 0x601C) /* <CJK> */
+MAP(0x4E, 0x68, 0x73B2) /* <CJK> */
+MAP(0x4E, 0x69, 0x793C) /* <CJK> */
+MAP(0x4E, 0x6A, 0x82D3) /* <CJK> */
+MAP(0x4E, 0x6B, 0x9234) /* <CJK> */
+MAP(0x4E, 0x6C, 0x96B7) /* <CJK> */
+MAP(0x4E, 0x6D, 0x96F6) /* <CJK> */
+MAP(0x4E, 0x6E, 0x970A) /* <CJK> */
+MAP(0x4E, 0x6F, 0x9E97) /* <CJK> */
+MAP(0x4E, 0x70, 0x9F62) /* <CJK> */
+MAP(0x4E, 0x71, 0x66A6) /* <CJK> */
+MAP(0x4E, 0x72, 0x6B74) /* <CJK> */
+MAP(0x4E, 0x73, 0x5217) /* <CJK> */
+MAP(0x4E, 0x74, 0x52A3) /* <CJK> */
+MAP(0x4E, 0x75, 0x70C8) /* <CJK> */
+MAP(0x4E, 0x76, 0x88C2) /* <CJK> */
+MAP(0x4E, 0x77, 0x5EC9) /* <CJK> */
+MAP(0x4E, 0x78, 0x604B) /* <CJK> */
+MAP(0x4E, 0x79, 0x6190) /* <CJK> */
+MAP(0x4E, 0x7A, 0x6F23) /* <CJK> */
+MAP(0x4E, 0x7B, 0x7149) /* <CJK> */
+MAP(0x4E, 0x7C, 0x7C3E) /* <CJK> */
+MAP(0x4E, 0x7D, 0x7DF4) /* <CJK> */
+MAP(0x4E, 0x7E, 0x806F) /* <CJK> */
+MAP(0x4F, 0x21, 0x84EE) /* <CJK> */
+MAP(0x4F, 0x22, 0x9023) /* <CJK> */
+MAP(0x4F, 0x23, 0x932C) /* <CJK> */
+MAP(0x4F, 0x24, 0x5442) /* <CJK> */
+MAP(0x4F, 0x25, 0x9B6F) /* <CJK> */
+MAP(0x4F, 0x26, 0x6AD3) /* <CJK> */
+MAP(0x4F, 0x27, 0x7089) /* <CJK> */
+MAP(0x4F, 0x28, 0x8CC2) /* <CJK> */
+MAP(0x4F, 0x29, 0x8DEF) /* <CJK> */
+MAP(0x4F, 0x2A, 0x9732) /* <CJK> */
+MAP(0x4F, 0x2B, 0x52B4) /* <CJK> */
+MAP(0x4F, 0x2C, 0x5A41) /* <CJK> */
+MAP(0x4F, 0x2D, 0x5ECA) /* <CJK> */
+MAP(0x4F, 0x2E, 0x5F04) /* <CJK> */
+MAP(0x4F, 0x2F, 0x6717) /* <CJK> */
+MAP(0x4F, 0x30, 0x697C) /* <CJK> */
+MAP(0x4F, 0x31, 0x6994) /* <CJK> */
+MAP(0x4F, 0x32, 0x6D6A) /* <CJK> */
+MAP(0x4F, 0x33, 0x6F0F) /* <CJK> */
+MAP(0x4F, 0x34, 0x7262) /* <CJK> */
+MAP(0x4F, 0x35, 0x72FC) /* <CJK> */
+MAP(0x4F, 0x36, 0x7BED) /* <CJK> */
+MAP(0x4F, 0x37, 0x8001) /* <CJK> */
+MAP(0x4F, 0x38, 0x807E) /* <CJK> */
+MAP(0x4F, 0x39, 0x874B) /* <CJK> */
+MAP(0x4F, 0x3A, 0x90CE) /* <CJK> */
+MAP(0x4F, 0x3B, 0x516D) /* <CJK> */
+MAP(0x4F, 0x3C, 0x9E93) /* <CJK> */
+MAP(0x4F, 0x3D, 0x7984) /* <CJK> */
+MAP(0x4F, 0x3E, 0x808B) /* <CJK> */
+MAP(0x4F, 0x3F, 0x9332) /* <CJK> */
+MAP(0x4F, 0x40, 0x8AD6) /* <CJK> */
+MAP(0x4F, 0x41, 0x502D) /* <CJK> */
+MAP(0x4F, 0x42, 0x548C) /* <CJK> */
+MAP(0x4F, 0x43, 0x8A71) /* <CJK> */
+MAP(0x4F, 0x44, 0x6B6A) /* <CJK> */
+MAP(0x4F, 0x45, 0x8CC4) /* <CJK> */
+MAP(0x4F, 0x46, 0x8107) /* <CJK> */
+MAP(0x4F, 0x47, 0x60D1) /* <CJK> */
+MAP(0x4F, 0x48, 0x67A0) /* <CJK> */
+MAP(0x4F, 0x49, 0x9DF2) /* <CJK> */
+MAP(0x4F, 0x4A, 0x4E99) /* <CJK> */
+MAP(0x4F, 0x4B, 0x4E98) /* <CJK> */
+MAP(0x4F, 0x4C, 0x9C10) /* <CJK> */
+MAP(0x4F, 0x4D, 0x8A6B) /* <CJK> */
+MAP(0x4F, 0x4E, 0x85C1) /* <CJK> */
+MAP(0x4F, 0x4F, 0x8568) /* <CJK> */
+MAP(0x4F, 0x50, 0x6900) /* <CJK> */
+MAP(0x4F, 0x51, 0x6E7E) /* <CJK> */
+MAP(0x4F, 0x52, 0x7897) /* <CJK> */
+MAP(0x4F, 0x53, 0x8155) /* <CJK> */
+MAP(0x50, 0x21, 0x5F0C) /* <CJK> */
+MAP(0x50, 0x22, 0x4E10) /* <CJK> */
+MAP(0x50, 0x23, 0x4E15) /* <CJK> */
+MAP(0x50, 0x24, 0x4E2A) /* <CJK> */
+MAP(0x50, 0x25, 0x4E31) /* <CJK> */
+MAP(0x50, 0x26, 0x4E36) /* <CJK> */
+MAP(0x50, 0x27, 0x4E3C) /* <CJK> */
+MAP(0x50, 0x28, 0x4E3F) /* <CJK> */
+MAP(0x50, 0x29, 0x4E42) /* <CJK> */
+MAP(0x50, 0x2A, 0x4E56) /* <CJK> */
+MAP(0x50, 0x2B, 0x4E58) /* <CJK> */
+MAP(0x50, 0x2C, 0x4E82) /* <CJK> */
+MAP(0x50, 0x2D, 0x4E85) /* <CJK> */
+MAP(0x50, 0x2E, 0x8C6B) /* <CJK> */
+MAP(0x50, 0x2F, 0x4E8A) /* <CJK> */
+MAP(0x50, 0x30, 0x8212) /* <CJK> */
+MAP(0x50, 0x31, 0x5F0D) /* <CJK> */
+MAP(0x50, 0x32, 0x4E8E) /* <CJK> */
+MAP(0x50, 0x33, 0x4E9E) /* <CJK> */
+MAP(0x50, 0x34, 0x4E9F) /* <CJK> */
+MAP(0x50, 0x35, 0x4EA0) /* <CJK> */
+MAP(0x50, 0x36, 0x4EA2) /* <CJK> */
+MAP(0x50, 0x37, 0x4EB0) /* <CJK> */
+MAP(0x50, 0x38, 0x4EB3) /* <CJK> */
+MAP(0x50, 0x39, 0x4EB6) /* <CJK> */
+MAP(0x50, 0x3A, 0x4ECE) /* <CJK> */
+MAP(0x50, 0x3B, 0x4ECD) /* <CJK> */
+MAP(0x50, 0x3C, 0x4EC4) /* <CJK> */
+MAP(0x50, 0x3D, 0x4EC6) /* <CJK> */
+MAP(0x50, 0x3E, 0x4EC2) /* <CJK> */
+MAP(0x50, 0x3F, 0x4ED7) /* <CJK> */
+MAP(0x50, 0x40, 0x4EDE) /* <CJK> */
+MAP(0x50, 0x41, 0x4EED) /* <CJK> */
+MAP(0x50, 0x42, 0x4EDF) /* <CJK> */
+MAP(0x50, 0x43, 0x4EF7) /* <CJK> */
+MAP(0x50, 0x44, 0x4F09) /* <CJK> */
+MAP(0x50, 0x45, 0x4F5A) /* <CJK> */
+MAP(0x50, 0x46, 0x4F30) /* <CJK> */
+MAP(0x50, 0x47, 0x4F5B) /* <CJK> */
+MAP(0x50, 0x48, 0x4F5D) /* <CJK> */
+MAP(0x50, 0x49, 0x4F57) /* <CJK> */
+MAP(0x50, 0x4A, 0x4F47) /* <CJK> */
+MAP(0x50, 0x4B, 0x4F76) /* <CJK> */
+MAP(0x50, 0x4C, 0x4F88) /* <CJK> */
+MAP(0x50, 0x4D, 0x4F8F) /* <CJK> */
+MAP(0x50, 0x4E, 0x4F98) /* <CJK> */
+MAP(0x50, 0x4F, 0x4F7B) /* <CJK> */
+MAP(0x50, 0x50, 0x4F69) /* <CJK> */
+MAP(0x50, 0x51, 0x4F70) /* <CJK> */
+MAP(0x50, 0x52, 0x4F91) /* <CJK> */
+MAP(0x50, 0x53, 0x4F6F) /* <CJK> */
+MAP(0x50, 0x54, 0x4F86) /* <CJK> */
+MAP(0x50, 0x55, 0x4F96) /* <CJK> */
+MAP(0x50, 0x56, 0x5118) /* <CJK> */
+MAP(0x50, 0x57, 0x4FD4) /* <CJK> */
+MAP(0x50, 0x58, 0x4FDF) /* <CJK> */
+MAP(0x50, 0x59, 0x4FCE) /* <CJK> */
+MAP(0x50, 0x5A, 0x4FD8) /* <CJK> */
+MAP(0x50, 0x5B, 0x4FDB) /* <CJK> */
+MAP(0x50, 0x5C, 0x4FD1) /* <CJK> */
+MAP(0x50, 0x5D, 0x4FDA) /* <CJK> */
+MAP(0x50, 0x5E, 0x4FD0) /* <CJK> */
+MAP(0x50, 0x5F, 0x4FE4) /* <CJK> */
+MAP(0x50, 0x60, 0x4FE5) /* <CJK> */
+MAP(0x50, 0x61, 0x501A) /* <CJK> */
+MAP(0x50, 0x62, 0x5028) /* <CJK> */
+MAP(0x50, 0x63, 0x5014) /* <CJK> */
+MAP(0x50, 0x64, 0x502A) /* <CJK> */
+MAP(0x50, 0x65, 0x5025) /* <CJK> */
+MAP(0x50, 0x66, 0x5005) /* <CJK> */
+MAP(0x50, 0x67, 0x4F1C) /* <CJK> */
+MAP(0x50, 0x68, 0x4FF6) /* <CJK> */
+MAP(0x50, 0x69, 0x5021) /* <CJK> */
+MAP(0x50, 0x6A, 0x5029) /* <CJK> */
+MAP(0x50, 0x6B, 0x502C) /* <CJK> */
+MAP(0x50, 0x6C, 0x4FFE) /* <CJK> */
+MAP(0x50, 0x6D, 0x4FEF) /* <CJK> */
+MAP(0x50, 0x6E, 0x5011) /* <CJK> */
+MAP(0x50, 0x6F, 0x5006) /* <CJK> */
+MAP(0x50, 0x70, 0x5043) /* <CJK> */
+MAP(0x50, 0x71, 0x5047) /* <CJK> */
+MAP(0x50, 0x72, 0x6703) /* <CJK> */
+MAP(0x50, 0x73, 0x5055) /* <CJK> */
+MAP(0x50, 0x74, 0x5050) /* <CJK> */
+MAP(0x50, 0x75, 0x5048) /* <CJK> */
+MAP(0x50, 0x76, 0x505A) /* <CJK> */
+MAP(0x50, 0x77, 0x5056) /* <CJK> */
+MAP(0x50, 0x78, 0x506C) /* <CJK> */
+MAP(0x50, 0x79, 0x5078) /* <CJK> */
+MAP(0x50, 0x7A, 0x5080) /* <CJK> */
+MAP(0x50, 0x7B, 0x509A) /* <CJK> */
+MAP(0x50, 0x7C, 0x5085) /* <CJK> */
+MAP(0x50, 0x7D, 0x50B4) /* <CJK> */
+MAP(0x50, 0x7E, 0x50B2) /* <CJK> */
+MAP(0x51, 0x21, 0x50C9) /* <CJK> */
+MAP(0x51, 0x22, 0x50CA) /* <CJK> */
+MAP(0x51, 0x23, 0x50B3) /* <CJK> */
+MAP(0x51, 0x24, 0x50C2) /* <CJK> */
+MAP(0x51, 0x25, 0x50D6) /* <CJK> */
+MAP(0x51, 0x26, 0x50DE) /* <CJK> */
+MAP(0x51, 0x27, 0x50E5) /* <CJK> */
+MAP(0x51, 0x28, 0x50ED) /* <CJK> */
+MAP(0x51, 0x29, 0x50E3) /* <CJK> */
+MAP(0x51, 0x2A, 0x50EE) /* <CJK> */
+MAP(0x51, 0x2B, 0x50F9) /* <CJK> */
+MAP(0x51, 0x2C, 0x50F5) /* <CJK> */
+MAP(0x51, 0x2D, 0x5109) /* <CJK> */
+MAP(0x51, 0x2E, 0x5101) /* <CJK> */
+MAP(0x51, 0x2F, 0x5102) /* <CJK> */
+MAP(0x51, 0x30, 0x5116) /* <CJK> */
+MAP(0x51, 0x31, 0x5115) /* <CJK> */
+MAP(0x51, 0x32, 0x5114) /* <CJK> */
+MAP(0x51, 0x33, 0x511A) /* <CJK> */
+MAP(0x51, 0x34, 0x5121) /* <CJK> */
+MAP(0x51, 0x35, 0x513A) /* <CJK> */
+MAP(0x51, 0x36, 0x5137) /* <CJK> */
+MAP(0x51, 0x37, 0x513C) /* <CJK> */
+MAP(0x51, 0x38, 0x513B) /* <CJK> */
+MAP(0x51, 0x39, 0x513F) /* <CJK> */
+MAP(0x51, 0x3A, 0x5140) /* <CJK> */
+MAP(0x51, 0x3B, 0x5152) /* <CJK> */
+MAP(0x51, 0x3C, 0x514C) /* <CJK> */
+MAP(0x51, 0x3D, 0x5154) /* <CJK> */
+MAP(0x51, 0x3E, 0x5162) /* <CJK> */
+MAP(0x51, 0x3F, 0x7AF8) /* <CJK> */
+MAP(0x51, 0x40, 0x5169) /* <CJK> */
+MAP(0x51, 0x41, 0x516A) /* <CJK> */
+MAP(0x51, 0x42, 0x516E) /* <CJK> */
+MAP(0x51, 0x43, 0x5180) /* <CJK> */
+MAP(0x51, 0x44, 0x5182) /* <CJK> */
+MAP(0x51, 0x45, 0x56D8) /* <CJK> */
+MAP(0x51, 0x46, 0x518C) /* <CJK> */
+MAP(0x51, 0x47, 0x5189) /* <CJK> */
+MAP(0x51, 0x48, 0x518F) /* <CJK> */
+MAP(0x51, 0x49, 0x5191) /* <CJK> */
+MAP(0x51, 0x4A, 0x5193) /* <CJK> */
+MAP(0x51, 0x4B, 0x5195) /* <CJK> */
+MAP(0x51, 0x4C, 0x5196) /* <CJK> */
+MAP(0x51, 0x4D, 0x51A4) /* <CJK> */
+MAP(0x51, 0x4E, 0x51A6) /* <CJK> */
+MAP(0x51, 0x4F, 0x51A2) /* <CJK> */
+MAP(0x51, 0x50, 0x51A9) /* <CJK> */
+MAP(0x51, 0x51, 0x51AA) /* <CJK> */
+MAP(0x51, 0x52, 0x51AB) /* <CJK> */
+MAP(0x51, 0x53, 0x51B3) /* <CJK> */
+MAP(0x51, 0x54, 0x51B1) /* <CJK> */
+MAP(0x51, 0x55, 0x51B2) /* <CJK> */
+MAP(0x51, 0x56, 0x51B0) /* <CJK> */
+MAP(0x51, 0x57, 0x51B5) /* <CJK> */
+MAP(0x51, 0x58, 0x51BD) /* <CJK> */
+MAP(0x51, 0x59, 0x51C5) /* <CJK> */
+MAP(0x51, 0x5A, 0x51C9) /* <CJK> */
+MAP(0x51, 0x5B, 0x51DB) /* <CJK> */
+MAP(0x51, 0x5C, 0x51E0) /* <CJK> */
+MAP(0x51, 0x5D, 0x8655) /* <CJK> */
+MAP(0x51, 0x5E, 0x51E9) /* <CJK> */
+MAP(0x51, 0x5F, 0x51ED) /* <CJK> */
+MAP(0x51, 0x60, 0x51F0) /* <CJK> */
+MAP(0x51, 0x61, 0x51F5) /* <CJK> */
+MAP(0x51, 0x62, 0x51FE) /* <CJK> */
+MAP(0x51, 0x63, 0x5204) /* <CJK> */
+MAP(0x51, 0x64, 0x520B) /* <CJK> */
+MAP(0x51, 0x65, 0x5214) /* <CJK> */
+MAP(0x51, 0x66, 0x520E) /* <CJK> */
+MAP(0x51, 0x67, 0x5227) /* <CJK> */
+MAP(0x51, 0x68, 0x522A) /* <CJK> */
+MAP(0x51, 0x69, 0x522E) /* <CJK> */
+MAP(0x51, 0x6A, 0x5233) /* <CJK> */
+MAP(0x51, 0x6B, 0x5239) /* <CJK> */
+MAP(0x51, 0x6C, 0x524F) /* <CJK> */
+MAP(0x51, 0x6D, 0x5244) /* <CJK> */
+MAP(0x51, 0x6E, 0x524B) /* <CJK> */
+MAP(0x51, 0x6F, 0x524C) /* <CJK> */
+MAP(0x51, 0x70, 0x525E) /* <CJK> */
+MAP(0x51, 0x71, 0x5254) /* <CJK> */
+MAP(0x51, 0x72, 0x526A) /* <CJK> */
+MAP(0x51, 0x73, 0x5274) /* <CJK> */
+MAP(0x51, 0x74, 0x5269) /* <CJK> */
+MAP(0x51, 0x75, 0x5273) /* <CJK> */
+MAP(0x51, 0x76, 0x527F) /* <CJK> */
+MAP(0x51, 0x77, 0x527D) /* <CJK> */
+MAP(0x51, 0x78, 0x528D) /* <CJK> */
+MAP(0x51, 0x79, 0x5294) /* <CJK> */
+MAP(0x51, 0x7A, 0x5292) /* <CJK> */
+MAP(0x51, 0x7B, 0x5271) /* <CJK> */
+MAP(0x51, 0x7C, 0x5288) /* <CJK> */
+MAP(0x51, 0x7D, 0x5291) /* <CJK> */
+MAP(0x51, 0x7E, 0x8FA8) /* <CJK> */
+MAP(0x52, 0x21, 0x8FA7) /* <CJK> */
+MAP(0x52, 0x22, 0x52AC) /* <CJK> */
+MAP(0x52, 0x23, 0x52AD) /* <CJK> */
+MAP(0x52, 0x24, 0x52BC) /* <CJK> */
+MAP(0x52, 0x25, 0x52B5) /* <CJK> */
+MAP(0x52, 0x26, 0x52C1) /* <CJK> */
+MAP(0x52, 0x27, 0x52CD) /* <CJK> */
+MAP(0x52, 0x28, 0x52D7) /* <CJK> */
+MAP(0x52, 0x29, 0x52DE) /* <CJK> */
+MAP(0x52, 0x2A, 0x52E3) /* <CJK> */
+MAP(0x52, 0x2B, 0x52E6) /* <CJK> */
+MAP(0x52, 0x2C, 0x98ED) /* <CJK> */
+MAP(0x52, 0x2D, 0x52E0) /* <CJK> */
+MAP(0x52, 0x2E, 0x52F3) /* <CJK> */
+MAP(0x52, 0x2F, 0x52F5) /* <CJK> */
+MAP(0x52, 0x30, 0x52F8) /* <CJK> */
+MAP(0x52, 0x31, 0x52F9) /* <CJK> */
+MAP(0x52, 0x32, 0x5306) /* <CJK> */
+MAP(0x52, 0x33, 0x5308) /* <CJK> */
+MAP(0x52, 0x34, 0x7538) /* <CJK> */
+MAP(0x52, 0x35, 0x530D) /* <CJK> */
+MAP(0x52, 0x36, 0x5310) /* <CJK> */
+MAP(0x52, 0x37, 0x530F) /* <CJK> */
+MAP(0x52, 0x38, 0x5315) /* <CJK> */
+MAP(0x52, 0x39, 0x531A) /* <CJK> */
+MAP(0x52, 0x3A, 0x5323) /* <CJK> */
+MAP(0x52, 0x3B, 0x532F) /* <CJK> */
+MAP(0x52, 0x3C, 0x5331) /* <CJK> */
+MAP(0x52, 0x3D, 0x5333) /* <CJK> */
+MAP(0x52, 0x3E, 0x5338) /* <CJK> */
+MAP(0x52, 0x3F, 0x5340) /* <CJK> */
+MAP(0x52, 0x40, 0x5346) /* <CJK> */
+MAP(0x52, 0x41, 0x5345) /* <CJK> */
+MAP(0x52, 0x42, 0x4E17) /* <CJK> */
+MAP(0x52, 0x43, 0x5349) /* <CJK> */
+MAP(0x52, 0x44, 0x534D) /* <CJK> */
+MAP(0x52, 0x45, 0x51D6) /* <CJK> */
+MAP(0x52, 0x46, 0x535E) /* <CJK> */
+MAP(0x52, 0x47, 0x5369) /* <CJK> */
+MAP(0x52, 0x48, 0x536E) /* <CJK> */
+MAP(0x52, 0x49, 0x5918) /* <CJK> */
+MAP(0x52, 0x4A, 0x537B) /* <CJK> */
+MAP(0x52, 0x4B, 0x5377) /* <CJK> */
+MAP(0x52, 0x4C, 0x5382) /* <CJK> */
+MAP(0x52, 0x4D, 0x5396) /* <CJK> */
+MAP(0x52, 0x4E, 0x53A0) /* <CJK> */
+MAP(0x52, 0x4F, 0x53A6) /* <CJK> */
+MAP(0x52, 0x50, 0x53A5) /* <CJK> */
+MAP(0x52, 0x51, 0x53AE) /* <CJK> */
+MAP(0x52, 0x52, 0x53B0) /* <CJK> */
+MAP(0x52, 0x53, 0x53B6) /* <CJK> */
+MAP(0x52, 0x54, 0x53C3) /* <CJK> */
+MAP(0x52, 0x55, 0x7C12) /* <CJK> */
+MAP(0x52, 0x56, 0x96D9) /* <CJK> */
+MAP(0x52, 0x57, 0x53DF) /* <CJK> */
+MAP(0x52, 0x58, 0x66FC) /* <CJK> */
+MAP(0x52, 0x59, 0x71EE) /* <CJK> */
+MAP(0x52, 0x5A, 0x53EE) /* <CJK> */
+MAP(0x52, 0x5B, 0x53E8) /* <CJK> */
+MAP(0x52, 0x5C, 0x53ED) /* <CJK> */
+MAP(0x52, 0x5D, 0x53FA) /* <CJK> */
+MAP(0x52, 0x5E, 0x5401) /* <CJK> */
+MAP(0x52, 0x5F, 0x543D) /* <CJK> */
+MAP(0x52, 0x60, 0x5440) /* <CJK> */
+MAP(0x52, 0x61, 0x542C) /* <CJK> */
+MAP(0x52, 0x62, 0x542D) /* <CJK> */
+MAP(0x52, 0x63, 0x543C) /* <CJK> */
+MAP(0x52, 0x64, 0x542E) /* <CJK> */
+MAP(0x52, 0x65, 0x5436) /* <CJK> */
+MAP(0x52, 0x66, 0x5429) /* <CJK> */
+MAP(0x52, 0x67, 0x541D) /* <CJK> */
+MAP(0x52, 0x68, 0x544E) /* <CJK> */
+MAP(0x52, 0x69, 0x548F) /* <CJK> */
+MAP(0x52, 0x6A, 0x5475) /* <CJK> */
+MAP(0x52, 0x6B, 0x548E) /* <CJK> */
+MAP(0x52, 0x6C, 0x545F) /* <CJK> */
+MAP(0x52, 0x6D, 0x5471) /* <CJK> */
+MAP(0x52, 0x6E, 0x5477) /* <CJK> */
+MAP(0x52, 0x6F, 0x5470) /* <CJK> */
+MAP(0x52, 0x70, 0x5492) /* <CJK> */
+MAP(0x52, 0x71, 0x547B) /* <CJK> */
+MAP(0x52, 0x72, 0x5480) /* <CJK> */
+MAP(0x52, 0x73, 0x5476) /* <CJK> */
+MAP(0x52, 0x74, 0x5484) /* <CJK> */
+MAP(0x52, 0x75, 0x5490) /* <CJK> */
+MAP(0x52, 0x76, 0x5486) /* <CJK> */
+MAP(0x52, 0x77, 0x54C7) /* <CJK> */
+MAP(0x52, 0x78, 0x54A2) /* <CJK> */
+MAP(0x52, 0x79, 0x54B8) /* <CJK> */
+MAP(0x52, 0x7A, 0x54A5) /* <CJK> */
+MAP(0x52, 0x7B, 0x54AC) /* <CJK> */
+MAP(0x52, 0x7C, 0x54C4) /* <CJK> */
+MAP(0x52, 0x7D, 0x54C8) /* <CJK> */
+MAP(0x52, 0x7E, 0x54A8) /* <CJK> */
+MAP(0x53, 0x21, 0x54AB) /* <CJK> */
+MAP(0x53, 0x22, 0x54C2) /* <CJK> */
+MAP(0x53, 0x23, 0x54A4) /* <CJK> */
+MAP(0x53, 0x24, 0x54BE) /* <CJK> */
+MAP(0x53, 0x25, 0x54BC) /* <CJK> */
+MAP(0x53, 0x26, 0x54D8) /* <CJK> */
+MAP(0x53, 0x27, 0x54E5) /* <CJK> */
+MAP(0x53, 0x28, 0x54E6) /* <CJK> */
+MAP(0x53, 0x29, 0x550F) /* <CJK> */
+MAP(0x53, 0x2A, 0x5514) /* <CJK> */
+MAP(0x53, 0x2B, 0x54FD) /* <CJK> */
+MAP(0x53, 0x2C, 0x54EE) /* <CJK> */
+MAP(0x53, 0x2D, 0x54ED) /* <CJK> */
+MAP(0x53, 0x2E, 0x54FA) /* <CJK> */
+MAP(0x53, 0x2F, 0x54E2) /* <CJK> */
+MAP(0x53, 0x30, 0x5539) /* <CJK> */
+MAP(0x53, 0x31, 0x5540) /* <CJK> */
+MAP(0x53, 0x32, 0x5563) /* <CJK> */
+MAP(0x53, 0x33, 0x554C) /* <CJK> */
+MAP(0x53, 0x34, 0x552E) /* <CJK> */
+MAP(0x53, 0x35, 0x555C) /* <CJK> */
+MAP(0x53, 0x36, 0x5545) /* <CJK> */
+MAP(0x53, 0x37, 0x5556) /* <CJK> */
+MAP(0x53, 0x38, 0x5557) /* <CJK> */
+MAP(0x53, 0x39, 0x5538) /* <CJK> */
+MAP(0x53, 0x3A, 0x5533) /* <CJK> */
+MAP(0x53, 0x3B, 0x555D) /* <CJK> */
+MAP(0x53, 0x3C, 0x5599) /* <CJK> */
+MAP(0x53, 0x3D, 0x5580) /* <CJK> */
+MAP(0x53, 0x3E, 0x54AF) /* <CJK> */
+MAP(0x53, 0x3F, 0x558A) /* <CJK> */
+MAP(0x53, 0x40, 0x559F) /* <CJK> */
+MAP(0x53, 0x41, 0x557B) /* <CJK> */
+MAP(0x53, 0x42, 0x557E) /* <CJK> */
+MAP(0x53, 0x43, 0x5598) /* <CJK> */
+MAP(0x53, 0x44, 0x559E) /* <CJK> */
+MAP(0x53, 0x45, 0x55AE) /* <CJK> */
+MAP(0x53, 0x46, 0x557C) /* <CJK> */
+MAP(0x53, 0x47, 0x5583) /* <CJK> */
+MAP(0x53, 0x48, 0x55A9) /* <CJK> */
+MAP(0x53, 0x49, 0x5587) /* <CJK> */
+MAP(0x53, 0x4A, 0x55A8) /* <CJK> */
+MAP(0x53, 0x4B, 0x55DA) /* <CJK> */
+MAP(0x53, 0x4C, 0x55C5) /* <CJK> */
+MAP(0x53, 0x4D, 0x55DF) /* <CJK> */
+MAP(0x53, 0x4E, 0x55C4) /* <CJK> */
+MAP(0x53, 0x4F, 0x55DC) /* <CJK> */
+MAP(0x53, 0x50, 0x55E4) /* <CJK> */
+MAP(0x53, 0x51, 0x55D4) /* <CJK> */
+MAP(0x53, 0x52, 0x5614) /* <CJK> */
+MAP(0x53, 0x53, 0x55F7) /* <CJK> */
+MAP(0x53, 0x54, 0x5616) /* <CJK> */
+MAP(0x53, 0x55, 0x55FE) /* <CJK> */
+MAP(0x53, 0x56, 0x55FD) /* <CJK> */
+MAP(0x53, 0x57, 0x561B) /* <CJK> */
+MAP(0x53, 0x58, 0x55F9) /* <CJK> */
+MAP(0x53, 0x59, 0x564E) /* <CJK> */
+MAP(0x53, 0x5A, 0x5650) /* <CJK> */
+MAP(0x53, 0x5B, 0x71DF) /* <CJK> */
+MAP(0x53, 0x5C, 0x5634) /* <CJK> */
+MAP(0x53, 0x5D, 0x5636) /* <CJK> */
+MAP(0x53, 0x5E, 0x5632) /* <CJK> */
+MAP(0x53, 0x5F, 0x5638) /* <CJK> */
+MAP(0x53, 0x60, 0x566B) /* <CJK> */
+MAP(0x53, 0x61, 0x5664) /* <CJK> */
+MAP(0x53, 0x62, 0x562F) /* <CJK> */
+MAP(0x53, 0x63, 0x566C) /* <CJK> */
+MAP(0x53, 0x64, 0x566A) /* <CJK> */
+MAP(0x53, 0x65, 0x5686) /* <CJK> */
+MAP(0x53, 0x66, 0x5680) /* <CJK> */
+MAP(0x53, 0x67, 0x568A) /* <CJK> */
+MAP(0x53, 0x68, 0x56A0) /* <CJK> */
+MAP(0x53, 0x69, 0x5694) /* <CJK> */
+MAP(0x53, 0x6A, 0x568F) /* <CJK> */
+MAP(0x53, 0x6B, 0x56A5) /* <CJK> */
+MAP(0x53, 0x6C, 0x56AE) /* <CJK> */
+MAP(0x53, 0x6D, 0x56B6) /* <CJK> */
+MAP(0x53, 0x6E, 0x56B4) /* <CJK> */
+MAP(0x53, 0x6F, 0x56C2) /* <CJK> */
+MAP(0x53, 0x70, 0x56BC) /* <CJK> */
+MAP(0x53, 0x71, 0x56C1) /* <CJK> */
+MAP(0x53, 0x72, 0x56C3) /* <CJK> */
+MAP(0x53, 0x73, 0x56C0) /* <CJK> */
+MAP(0x53, 0x74, 0x56C8) /* <CJK> */
+MAP(0x53, 0x75, 0x56CE) /* <CJK> */
+MAP(0x53, 0x76, 0x56D1) /* <CJK> */
+MAP(0x53, 0x77, 0x56D3) /* <CJK> */
+MAP(0x53, 0x78, 0x56D7) /* <CJK> */
+MAP(0x53, 0x79, 0x56EE) /* <CJK> */
+MAP(0x53, 0x7A, 0x56F9) /* <CJK> */
+MAP(0x53, 0x7B, 0x5700) /* <CJK> */
+MAP(0x53, 0x7C, 0x56FF) /* <CJK> */
+MAP(0x53, 0x7D, 0x5704) /* <CJK> */
+MAP(0x53, 0x7E, 0x5709) /* <CJK> */
+MAP(0x54, 0x21, 0x5708) /* <CJK> */
+MAP(0x54, 0x22, 0x570B) /* <CJK> */
+MAP(0x54, 0x23, 0x570D) /* <CJK> */
+MAP(0x54, 0x24, 0x5713) /* <CJK> */
+MAP(0x54, 0x25, 0x5718) /* <CJK> */
+MAP(0x54, 0x26, 0x5716) /* <CJK> */
+MAP(0x54, 0x27, 0x55C7) /* <CJK> */
+MAP(0x54, 0x28, 0x571C) /* <CJK> */
+MAP(0x54, 0x29, 0x5726) /* <CJK> */
+MAP(0x54, 0x2A, 0x5737) /* <CJK> */
+MAP(0x54, 0x2B, 0x5738) /* <CJK> */
+MAP(0x54, 0x2C, 0x574E) /* <CJK> */
+MAP(0x54, 0x2D, 0x573B) /* <CJK> */
+MAP(0x54, 0x2E, 0x5740) /* <CJK> */
+MAP(0x54, 0x2F, 0x574F) /* <CJK> */
+MAP(0x54, 0x30, 0x5769) /* <CJK> */
+MAP(0x54, 0x31, 0x57C0) /* <CJK> */
+MAP(0x54, 0x32, 0x5788) /* <CJK> */
+MAP(0x54, 0x33, 0x5761) /* <CJK> */
+MAP(0x54, 0x34, 0x577F) /* <CJK> */
+MAP(0x54, 0x35, 0x5789) /* <CJK> */
+MAP(0x54, 0x36, 0x5793) /* <CJK> */
+MAP(0x54, 0x37, 0x57A0) /* <CJK> */
+MAP(0x54, 0x38, 0x57B3) /* <CJK> */
+MAP(0x54, 0x39, 0x57A4) /* <CJK> */
+MAP(0x54, 0x3A, 0x57AA) /* <CJK> */
+MAP(0x54, 0x3B, 0x57B0) /* <CJK> */
+MAP(0x54, 0x3C, 0x57C3) /* <CJK> */
+MAP(0x54, 0x3D, 0x57C6) /* <CJK> */
+MAP(0x54, 0x3E, 0x57D4) /* <CJK> */
+MAP(0x54, 0x3F, 0x57D2) /* <CJK> */
+MAP(0x54, 0x40, 0x57D3) /* <CJK> */
+MAP(0x54, 0x41, 0x580A) /* <CJK> */
+MAP(0x54, 0x42, 0x57D6) /* <CJK> */
+MAP(0x54, 0x43, 0x57E3) /* <CJK> */
+MAP(0x54, 0x44, 0x580B) /* <CJK> */
+MAP(0x54, 0x45, 0x5819) /* <CJK> */
+MAP(0x54, 0x46, 0x581D) /* <CJK> */
+MAP(0x54, 0x47, 0x5872) /* <CJK> */
+MAP(0x54, 0x48, 0x5821) /* <CJK> */
+MAP(0x54, 0x49, 0x5862) /* <CJK> */
+MAP(0x54, 0x4A, 0x584B) /* <CJK> */
+MAP(0x54, 0x4B, 0x5870) /* <CJK> */
+MAP(0x54, 0x4C, 0x6BC0) /* <CJK> */
+MAP(0x54, 0x4D, 0x5852) /* <CJK> */
+MAP(0x54, 0x4E, 0x583D) /* <CJK> */
+MAP(0x54, 0x4F, 0x5879) /* <CJK> */
+MAP(0x54, 0x50, 0x5885) /* <CJK> */
+MAP(0x54, 0x51, 0x58B9) /* <CJK> */
+MAP(0x54, 0x52, 0x589F) /* <CJK> */
+MAP(0x54, 0x53, 0x58AB) /* <CJK> */
+MAP(0x54, 0x54, 0x58BA) /* <CJK> */
+MAP(0x54, 0x55, 0x58DE) /* <CJK> */
+MAP(0x54, 0x56, 0x58BB) /* <CJK> */
+MAP(0x54, 0x57, 0x58B8) /* <CJK> */
+MAP(0x54, 0x58, 0x58AE) /* <CJK> */
+MAP(0x54, 0x59, 0x58C5) /* <CJK> */
+MAP(0x54, 0x5A, 0x58D3) /* <CJK> */
+MAP(0x54, 0x5B, 0x58D1) /* <CJK> */
+MAP(0x54, 0x5C, 0x58D7) /* <CJK> */
+MAP(0x54, 0x5D, 0x58D9) /* <CJK> */
+MAP(0x54, 0x5E, 0x58D8) /* <CJK> */
+MAP(0x54, 0x5F, 0x58E5) /* <CJK> */
+MAP(0x54, 0x60, 0x58DC) /* <CJK> */
+MAP(0x54, 0x61, 0x58E4) /* <CJK> */
+MAP(0x54, 0x62, 0x58DF) /* <CJK> */
+MAP(0x54, 0x63, 0x58EF) /* <CJK> */
+MAP(0x54, 0x64, 0x58FA) /* <CJK> */
+MAP(0x54, 0x65, 0x58F9) /* <CJK> */
+MAP(0x54, 0x66, 0x58FB) /* <CJK> */
+MAP(0x54, 0x67, 0x58FC) /* <CJK> */
+MAP(0x54, 0x68, 0x58FD) /* <CJK> */
+MAP(0x54, 0x69, 0x5902) /* <CJK> */
+MAP(0x54, 0x6A, 0x590A) /* <CJK> */
+MAP(0x54, 0x6B, 0x5910) /* <CJK> */
+MAP(0x54, 0x6C, 0x591B) /* <CJK> */
+MAP(0x54, 0x6D, 0x68A6) /* <CJK> */
+MAP(0x54, 0x6E, 0x5925) /* <CJK> */
+MAP(0x54, 0x6F, 0x592C) /* <CJK> */
+MAP(0x54, 0x70, 0x592D) /* <CJK> */
+MAP(0x54, 0x71, 0x5932) /* <CJK> */
+MAP(0x54, 0x72, 0x5938) /* <CJK> */
+MAP(0x54, 0x73, 0x593E) /* <CJK> */
+MAP(0x54, 0x74, 0x7AD2) /* <CJK> */
+MAP(0x54, 0x75, 0x5955) /* <CJK> */
+MAP(0x54, 0x76, 0x5950) /* <CJK> */
+MAP(0x54, 0x77, 0x594E) /* <CJK> */
+MAP(0x54, 0x78, 0x595A) /* <CJK> */
+MAP(0x54, 0x79, 0x5958) /* <CJK> */
+MAP(0x54, 0x7A, 0x5962) /* <CJK> */
+MAP(0x54, 0x7B, 0x5960) /* <CJK> */
+MAP(0x54, 0x7C, 0x5967) /* <CJK> */
+MAP(0x54, 0x7D, 0x596C) /* <CJK> */
+MAP(0x54, 0x7E, 0x5969) /* <CJK> */
+MAP(0x55, 0x21, 0x5978) /* <CJK> */
+MAP(0x55, 0x22, 0x5981) /* <CJK> */
+MAP(0x55, 0x23, 0x599D) /* <CJK> */
+MAP(0x55, 0x24, 0x4F5E) /* <CJK> */
+MAP(0x55, 0x25, 0x4FAB) /* <CJK> */
+MAP(0x55, 0x26, 0x59A3) /* <CJK> */
+MAP(0x55, 0x27, 0x59B2) /* <CJK> */
+MAP(0x55, 0x28, 0x59C6) /* <CJK> */
+MAP(0x55, 0x29, 0x59E8) /* <CJK> */
+MAP(0x55, 0x2A, 0x59DC) /* <CJK> */
+MAP(0x55, 0x2B, 0x598D) /* <CJK> */
+MAP(0x55, 0x2C, 0x59D9) /* <CJK> */
+MAP(0x55, 0x2D, 0x59DA) /* <CJK> */
+MAP(0x55, 0x2E, 0x5A25) /* <CJK> */
+MAP(0x55, 0x2F, 0x5A1F) /* <CJK> */
+MAP(0x55, 0x30, 0x5A11) /* <CJK> */
+MAP(0x55, 0x31, 0x5A1C) /* <CJK> */
+MAP(0x55, 0x32, 0x5A09) /* <CJK> */
+MAP(0x55, 0x33, 0x5A1A) /* <CJK> */
+MAP(0x55, 0x34, 0x5A40) /* <CJK> */
+MAP(0x55, 0x35, 0x5A6C) /* <CJK> */
+MAP(0x55, 0x36, 0x5A49) /* <CJK> */
+MAP(0x55, 0x37, 0x5A35) /* <CJK> */
+MAP(0x55, 0x38, 0x5A36) /* <CJK> */
+MAP(0x55, 0x39, 0x5A62) /* <CJK> */
+MAP(0x55, 0x3A, 0x5A6A) /* <CJK> */
+MAP(0x55, 0x3B, 0x5A9A) /* <CJK> */
+MAP(0x55, 0x3C, 0x5ABC) /* <CJK> */
+MAP(0x55, 0x3D, 0x5ABE) /* <CJK> */
+MAP(0x55, 0x3E, 0x5ACB) /* <CJK> */
+MAP(0x55, 0x3F, 0x5AC2) /* <CJK> */
+MAP(0x55, 0x40, 0x5ABD) /* <CJK> */
+MAP(0x55, 0x41, 0x5AE3) /* <CJK> */
+MAP(0x55, 0x42, 0x5AD7) /* <CJK> */
+MAP(0x55, 0x43, 0x5AE6) /* <CJK> */
+MAP(0x55, 0x44, 0x5AE9) /* <CJK> */
+MAP(0x55, 0x45, 0x5AD6) /* <CJK> */
+MAP(0x55, 0x46, 0x5AFA) /* <CJK> */
+MAP(0x55, 0x47, 0x5AFB) /* <CJK> */
+MAP(0x55, 0x48, 0x5B0C) /* <CJK> */
+MAP(0x55, 0x49, 0x5B0B) /* <CJK> */
+MAP(0x55, 0x4A, 0x5B16) /* <CJK> */
+MAP(0x55, 0x4B, 0x5B32) /* <CJK> */
+MAP(0x55, 0x4C, 0x5AD0) /* <CJK> */
+MAP(0x55, 0x4D, 0x5B2A) /* <CJK> */
+MAP(0x55, 0x4E, 0x5B36) /* <CJK> */
+MAP(0x55, 0x4F, 0x5B3E) /* <CJK> */
+MAP(0x55, 0x50, 0x5B43) /* <CJK> */
+MAP(0x55, 0x51, 0x5B45) /* <CJK> */
+MAP(0x55, 0x52, 0x5B40) /* <CJK> */
+MAP(0x55, 0x53, 0x5B51) /* <CJK> */
+MAP(0x55, 0x54, 0x5B55) /* <CJK> */
+MAP(0x55, 0x55, 0x5B5A) /* <CJK> */
+MAP(0x55, 0x56, 0x5B5B) /* <CJK> */
+MAP(0x55, 0x57, 0x5B65) /* <CJK> */
+MAP(0x55, 0x58, 0x5B69) /* <CJK> */
+MAP(0x55, 0x59, 0x5B70) /* <CJK> */
+MAP(0x55, 0x5A, 0x5B73) /* <CJK> */
+MAP(0x55, 0x5B, 0x5B75) /* <CJK> */
+MAP(0x55, 0x5C, 0x5B78) /* <CJK> */
+MAP(0x55, 0x5D, 0x6588) /* <CJK> */
+MAP(0x55, 0x5E, 0x5B7A) /* <CJK> */
+MAP(0x55, 0x5F, 0x5B80) /* <CJK> */
+MAP(0x55, 0x60, 0x5B83) /* <CJK> */
+MAP(0x55, 0x61, 0x5BA6) /* <CJK> */
+MAP(0x55, 0x62, 0x5BB8) /* <CJK> */
+MAP(0x55, 0x63, 0x5BC3) /* <CJK> */
+MAP(0x55, 0x64, 0x5BC7) /* <CJK> */
+MAP(0x55, 0x65, 0x5BC9) /* <CJK> */
+MAP(0x55, 0x66, 0x5BD4) /* <CJK> */
+MAP(0x55, 0x67, 0x5BD0) /* <CJK> */
+MAP(0x55, 0x68, 0x5BE4) /* <CJK> */
+MAP(0x55, 0x69, 0x5BE6) /* <CJK> */
+MAP(0x55, 0x6A, 0x5BE2) /* <CJK> */
+MAP(0x55, 0x6B, 0x5BDE) /* <CJK> */
+MAP(0x55, 0x6C, 0x5BE5) /* <CJK> */
+MAP(0x55, 0x6D, 0x5BEB) /* <CJK> */
+MAP(0x55, 0x6E, 0x5BF0) /* <CJK> */
+MAP(0x55, 0x6F, 0x5BF6) /* <CJK> */
+MAP(0x55, 0x70, 0x5BF3) /* <CJK> */
+MAP(0x55, 0x71, 0x5C05) /* <CJK> */
+MAP(0x55, 0x72, 0x5C07) /* <CJK> */
+MAP(0x55, 0x73, 0x5C08) /* <CJK> */
+MAP(0x55, 0x74, 0x5C0D) /* <CJK> */
+MAP(0x55, 0x75, 0x5C13) /* <CJK> */
+MAP(0x55, 0x76, 0x5C20) /* <CJK> */
+MAP(0x55, 0x77, 0x5C22) /* <CJK> */
+MAP(0x55, 0x78, 0x5C28) /* <CJK> */
+MAP(0x55, 0x79, 0x5C38) /* <CJK> */
+MAP(0x55, 0x7A, 0x5C39) /* <CJK> */
+MAP(0x55, 0x7B, 0x5C41) /* <CJK> */
+MAP(0x55, 0x7C, 0x5C46) /* <CJK> */
+MAP(0x55, 0x7D, 0x5C4E) /* <CJK> */
+MAP(0x55, 0x7E, 0x5C53) /* <CJK> */
+MAP(0x56, 0x21, 0x5C50) /* <CJK> */
+MAP(0x56, 0x22, 0x5C4F) /* <CJK> */
+MAP(0x56, 0x23, 0x5B71) /* <CJK> */
+MAP(0x56, 0x24, 0x5C6C) /* <CJK> */
+MAP(0x56, 0x25, 0x5C6E) /* <CJK> */
+MAP(0x56, 0x26, 0x4E62) /* <CJK> */
+MAP(0x56, 0x27, 0x5C76) /* <CJK> */
+MAP(0x56, 0x28, 0x5C79) /* <CJK> */
+MAP(0x56, 0x29, 0x5C8C) /* <CJK> */
+MAP(0x56, 0x2A, 0x5C91) /* <CJK> */
+MAP(0x56, 0x2B, 0x5C94) /* <CJK> */
+MAP(0x56, 0x2C, 0x599B) /* <CJK> */
+MAP(0x56, 0x2D, 0x5CAB) /* <CJK> */
+MAP(0x56, 0x2E, 0x5CBB) /* <CJK> */
+MAP(0x56, 0x2F, 0x5CB6) /* <CJK> */
+MAP(0x56, 0x30, 0x5CBC) /* <CJK> */
+MAP(0x56, 0x31, 0x5CB7) /* <CJK> */
+MAP(0x56, 0x32, 0x5CC5) /* <CJK> */
+MAP(0x56, 0x33, 0x5CBE) /* <CJK> */
+MAP(0x56, 0x34, 0x5CC7) /* <CJK> */
+MAP(0x56, 0x35, 0x5CD9) /* <CJK> */
+MAP(0x56, 0x36, 0x5CE9) /* <CJK> */
+MAP(0x56, 0x37, 0x5CFD) /* <CJK> */
+MAP(0x56, 0x38, 0x5CFA) /* <CJK> */
+MAP(0x56, 0x39, 0x5CED) /* <CJK> */
+MAP(0x56, 0x3A, 0x5D8C) /* <CJK> */
+MAP(0x56, 0x3B, 0x5CEA) /* <CJK> */
+MAP(0x56, 0x3C, 0x5D0B) /* <CJK> */
+MAP(0x56, 0x3D, 0x5D15) /* <CJK> */
+MAP(0x56, 0x3E, 0x5D17) /* <CJK> */
+MAP(0x56, 0x3F, 0x5D5C) /* <CJK> */
+MAP(0x56, 0x40, 0x5D1F) /* <CJK> */
+MAP(0x56, 0x41, 0x5D1B) /* <CJK> */
+MAP(0x56, 0x42, 0x5D11) /* <CJK> */
+MAP(0x56, 0x43, 0x5D14) /* <CJK> */
+MAP(0x56, 0x44, 0x5D22) /* <CJK> */
+MAP(0x56, 0x45, 0x5D1A) /* <CJK> */
+MAP(0x56, 0x46, 0x5D19) /* <CJK> */
+MAP(0x56, 0x47, 0x5D18) /* <CJK> */
+MAP(0x56, 0x48, 0x5D4C) /* <CJK> */
+MAP(0x56, 0x49, 0x5D52) /* <CJK> */
+MAP(0x56, 0x4A, 0x5D4E) /* <CJK> */
+MAP(0x56, 0x4B, 0x5D4B) /* <CJK> */
+MAP(0x56, 0x4C, 0x5D6C) /* <CJK> */
+MAP(0x56, 0x4D, 0x5D73) /* <CJK> */
+MAP(0x56, 0x4E, 0x5D76) /* <CJK> */
+MAP(0x56, 0x4F, 0x5D87) /* <CJK> */
+MAP(0x56, 0x50, 0x5D84) /* <CJK> */
+MAP(0x56, 0x51, 0x5D82) /* <CJK> */
+MAP(0x56, 0x52, 0x5DA2) /* <CJK> */
+MAP(0x56, 0x53, 0x5D9D) /* <CJK> */
+MAP(0x56, 0x54, 0x5DAC) /* <CJK> */
+MAP(0x56, 0x55, 0x5DAE) /* <CJK> */
+MAP(0x56, 0x56, 0x5DBD) /* <CJK> */
+MAP(0x56, 0x57, 0x5D90) /* <CJK> */
+MAP(0x56, 0x58, 0x5DB7) /* <CJK> */
+MAP(0x56, 0x59, 0x5DBC) /* <CJK> */
+MAP(0x56, 0x5A, 0x5DC9) /* <CJK> */
+MAP(0x56, 0x5B, 0x5DCD) /* <CJK> */
+MAP(0x56, 0x5C, 0x5DD3) /* <CJK> */
+MAP(0x56, 0x5D, 0x5DD2) /* <CJK> */
+MAP(0x56, 0x5E, 0x5DD6) /* <CJK> */
+MAP(0x56, 0x5F, 0x5DDB) /* <CJK> */
+MAP(0x56, 0x60, 0x5DEB) /* <CJK> */
+MAP(0x56, 0x61, 0x5DF2) /* <CJK> */
+MAP(0x56, 0x62, 0x5DF5) /* <CJK> */
+MAP(0x56, 0x63, 0x5E0B) /* <CJK> */
+MAP(0x56, 0x64, 0x5E1A) /* <CJK> */
+MAP(0x56, 0x65, 0x5E19) /* <CJK> */
+MAP(0x56, 0x66, 0x5E11) /* <CJK> */
+MAP(0x56, 0x67, 0x5E1B) /* <CJK> */
+MAP(0x56, 0x68, 0x5E36) /* <CJK> */
+MAP(0x56, 0x69, 0x5E37) /* <CJK> */
+MAP(0x56, 0x6A, 0x5E44) /* <CJK> */
+MAP(0x56, 0x6B, 0x5E43) /* <CJK> */
+MAP(0x56, 0x6C, 0x5E40) /* <CJK> */
+MAP(0x56, 0x6D, 0x5E4E) /* <CJK> */
+MAP(0x56, 0x6E, 0x5E57) /* <CJK> */
+MAP(0x56, 0x6F, 0x5E54) /* <CJK> */
+MAP(0x56, 0x70, 0x5E5F) /* <CJK> */
+MAP(0x56, 0x71, 0x5E62) /* <CJK> */
+MAP(0x56, 0x72, 0x5E64) /* <CJK> */
+MAP(0x56, 0x73, 0x5E47) /* <CJK> */
+MAP(0x56, 0x74, 0x5E75) /* <CJK> */
+MAP(0x56, 0x75, 0x5E76) /* <CJK> */
+MAP(0x56, 0x76, 0x5E7A) /* <CJK> */
+MAP(0x56, 0x77, 0x9EBC) /* <CJK> */
+MAP(0x56, 0x78, 0x5E7F) /* <CJK> */
+MAP(0x56, 0x79, 0x5EA0) /* <CJK> */
+MAP(0x56, 0x7A, 0x5EC1) /* <CJK> */
+MAP(0x56, 0x7B, 0x5EC2) /* <CJK> */
+MAP(0x56, 0x7C, 0x5EC8) /* <CJK> */
+MAP(0x56, 0x7D, 0x5ED0) /* <CJK> */
+MAP(0x56, 0x7E, 0x5ECF) /* <CJK> */
+MAP(0x57, 0x21, 0x5ED6) /* <CJK> */
+MAP(0x57, 0x22, 0x5EE3) /* <CJK> */
+MAP(0x57, 0x23, 0x5EDD) /* <CJK> */
+MAP(0x57, 0x24, 0x5EDA) /* <CJK> */
+MAP(0x57, 0x25, 0x5EDB) /* <CJK> */
+MAP(0x57, 0x26, 0x5EE2) /* <CJK> */
+MAP(0x57, 0x27, 0x5EE1) /* <CJK> */
+MAP(0x57, 0x28, 0x5EE8) /* <CJK> */
+MAP(0x57, 0x29, 0x5EE9) /* <CJK> */
+MAP(0x57, 0x2A, 0x5EEC) /* <CJK> */
+MAP(0x57, 0x2B, 0x5EF1) /* <CJK> */
+MAP(0x57, 0x2C, 0x5EF3) /* <CJK> */
+MAP(0x57, 0x2D, 0x5EF0) /* <CJK> */
+MAP(0x57, 0x2E, 0x5EF4) /* <CJK> */
+MAP(0x57, 0x2F, 0x5EF8) /* <CJK> */
+MAP(0x57, 0x30, 0x5EFE) /* <CJK> */
+MAP(0x57, 0x31, 0x5F03) /* <CJK> */
+MAP(0x57, 0x32, 0x5F09) /* <CJK> */
+MAP(0x57, 0x33, 0x5F5D) /* <CJK> */
+MAP(0x57, 0x34, 0x5F5C) /* <CJK> */
+MAP(0x57, 0x35, 0x5F0B) /* <CJK> */
+MAP(0x57, 0x36, 0x5F11) /* <CJK> */
+MAP(0x57, 0x37, 0x5F16) /* <CJK> */
+MAP(0x57, 0x38, 0x5F29) /* <CJK> */
+MAP(0x57, 0x39, 0x5F2D) /* <CJK> */
+MAP(0x57, 0x3A, 0x5F38) /* <CJK> */
+MAP(0x57, 0x3B, 0x5F41) /* <CJK> */
+MAP(0x57, 0x3C, 0x5F48) /* <CJK> */
+MAP(0x57, 0x3D, 0x5F4C) /* <CJK> */
+MAP(0x57, 0x3E, 0x5F4E) /* <CJK> */
+MAP(0x57, 0x3F, 0x5F2F) /* <CJK> */
+MAP(0x57, 0x40, 0x5F51) /* <CJK> */
+MAP(0x57, 0x41, 0x5F56) /* <CJK> */
+MAP(0x57, 0x42, 0x5F57) /* <CJK> */
+MAP(0x57, 0x43, 0x5F59) /* <CJK> */
+MAP(0x57, 0x44, 0x5F61) /* <CJK> */
+MAP(0x57, 0x45, 0x5F6D) /* <CJK> */
+MAP(0x57, 0x46, 0x5F73) /* <CJK> */
+MAP(0x57, 0x47, 0x5F77) /* <CJK> */
+MAP(0x57, 0x48, 0x5F83) /* <CJK> */
+MAP(0x57, 0x49, 0x5F82) /* <CJK> */
+MAP(0x57, 0x4A, 0x5F7F) /* <CJK> */
+MAP(0x57, 0x4B, 0x5F8A) /* <CJK> */
+MAP(0x57, 0x4C, 0x5F88) /* <CJK> */
+MAP(0x57, 0x4D, 0x5F91) /* <CJK> */
+MAP(0x57, 0x4E, 0x5F87) /* <CJK> */
+MAP(0x57, 0x4F, 0x5F9E) /* <CJK> */
+MAP(0x57, 0x50, 0x5F99) /* <CJK> */
+MAP(0x57, 0x51, 0x5F98) /* <CJK> */
+MAP(0x57, 0x52, 0x5FA0) /* <CJK> */
+MAP(0x57, 0x53, 0x5FA8) /* <CJK> */
+MAP(0x57, 0x54, 0x5FAD) /* <CJK> */
+MAP(0x57, 0x55, 0x5FBC) /* <CJK> */
+MAP(0x57, 0x56, 0x5FD6) /* <CJK> */
+MAP(0x57, 0x57, 0x5FFB) /* <CJK> */
+MAP(0x57, 0x58, 0x5FE4) /* <CJK> */
+MAP(0x57, 0x59, 0x5FF8) /* <CJK> */
+MAP(0x57, 0x5A, 0x5FF1) /* <CJK> */
+MAP(0x57, 0x5B, 0x5FDD) /* <CJK> */
+MAP(0x57, 0x5C, 0x60B3) /* <CJK> */
+MAP(0x57, 0x5D, 0x5FFF) /* <CJK> */
+MAP(0x57, 0x5E, 0x6021) /* <CJK> */
+MAP(0x57, 0x5F, 0x6060) /* <CJK> */
+MAP(0x57, 0x60, 0x6019) /* <CJK> */
+MAP(0x57, 0x61, 0x6010) /* <CJK> */
+MAP(0x57, 0x62, 0x6029) /* <CJK> */
+MAP(0x57, 0x63, 0x600E) /* <CJK> */
+MAP(0x57, 0x64, 0x6031) /* <CJK> */
+MAP(0x57, 0x65, 0x601B) /* <CJK> */
+MAP(0x57, 0x66, 0x6015) /* <CJK> */
+MAP(0x57, 0x67, 0x602B) /* <CJK> */
+MAP(0x57, 0x68, 0x6026) /* <CJK> */
+MAP(0x57, 0x69, 0x600F) /* <CJK> */
+MAP(0x57, 0x6A, 0x603A) /* <CJK> */
+MAP(0x57, 0x6B, 0x605A) /* <CJK> */
+MAP(0x57, 0x6C, 0x6041) /* <CJK> */
+MAP(0x57, 0x6D, 0x606A) /* <CJK> */
+MAP(0x57, 0x6E, 0x6077) /* <CJK> */
+MAP(0x57, 0x6F, 0x605F) /* <CJK> */
+MAP(0x57, 0x70, 0x604A) /* <CJK> */
+MAP(0x57, 0x71, 0x6046) /* <CJK> */
+MAP(0x57, 0x72, 0x604D) /* <CJK> */
+MAP(0x57, 0x73, 0x6063) /* <CJK> */
+MAP(0x57, 0x74, 0x6043) /* <CJK> */
+MAP(0x57, 0x75, 0x6064) /* <CJK> */
+MAP(0x57, 0x76, 0x6042) /* <CJK> */
+MAP(0x57, 0x77, 0x606C) /* <CJK> */
+MAP(0x57, 0x78, 0x606B) /* <CJK> */
+MAP(0x57, 0x79, 0x6059) /* <CJK> */
+MAP(0x57, 0x7A, 0x6081) /* <CJK> */
+MAP(0x57, 0x7B, 0x608D) /* <CJK> */
+MAP(0x57, 0x7C, 0x60E7) /* <CJK> */
+MAP(0x57, 0x7D, 0x6083) /* <CJK> */
+MAP(0x57, 0x7E, 0x609A) /* <CJK> */
+MAP(0x58, 0x21, 0x6084) /* <CJK> */
+MAP(0x58, 0x22, 0x609B) /* <CJK> */
+MAP(0x58, 0x23, 0x6096) /* <CJK> */
+MAP(0x58, 0x24, 0x6097) /* <CJK> */
+MAP(0x58, 0x25, 0x6092) /* <CJK> */
+MAP(0x58, 0x26, 0x60A7) /* <CJK> */
+MAP(0x58, 0x27, 0x608B) /* <CJK> */
+MAP(0x58, 0x28, 0x60E1) /* <CJK> */
+MAP(0x58, 0x29, 0x60B8) /* <CJK> */
+MAP(0x58, 0x2A, 0x60E0) /* <CJK> */
+MAP(0x58, 0x2B, 0x60D3) /* <CJK> */
+MAP(0x58, 0x2C, 0x60B4) /* <CJK> */
+MAP(0x58, 0x2D, 0x5FF0) /* <CJK> */
+MAP(0x58, 0x2E, 0x60BD) /* <CJK> */
+MAP(0x58, 0x2F, 0x60C6) /* <CJK> */
+MAP(0x58, 0x30, 0x60B5) /* <CJK> */
+MAP(0x58, 0x31, 0x60D8) /* <CJK> */
+MAP(0x58, 0x32, 0x614D) /* <CJK> */
+MAP(0x58, 0x33, 0x6115) /* <CJK> */
+MAP(0x58, 0x34, 0x6106) /* <CJK> */
+MAP(0x58, 0x35, 0x60F6) /* <CJK> */
+MAP(0x58, 0x36, 0x60F7) /* <CJK> */
+MAP(0x58, 0x37, 0x6100) /* <CJK> */
+MAP(0x58, 0x38, 0x60F4) /* <CJK> */
+MAP(0x58, 0x39, 0x60FA) /* <CJK> */
+MAP(0x58, 0x3A, 0x6103) /* <CJK> */
+MAP(0x58, 0x3B, 0x6121) /* <CJK> */
+MAP(0x58, 0x3C, 0x60FB) /* <CJK> */
+MAP(0x58, 0x3D, 0x60F1) /* <CJK> */
+MAP(0x58, 0x3E, 0x610D) /* <CJK> */
+MAP(0x58, 0x3F, 0x610E) /* <CJK> */
+MAP(0x58, 0x40, 0x6147) /* <CJK> */
+MAP(0x58, 0x41, 0x613E) /* <CJK> */
+MAP(0x58, 0x42, 0x6128) /* <CJK> */
+MAP(0x58, 0x43, 0x6127) /* <CJK> */
+MAP(0x58, 0x44, 0x614A) /* <CJK> */
+MAP(0x58, 0x45, 0x613F) /* <CJK> */
+MAP(0x58, 0x46, 0x613C) /* <CJK> */
+MAP(0x58, 0x47, 0x612C) /* <CJK> */
+MAP(0x58, 0x48, 0x6134) /* <CJK> */
+MAP(0x58, 0x49, 0x613D) /* <CJK> */
+MAP(0x58, 0x4A, 0x6142) /* <CJK> */
+MAP(0x58, 0x4B, 0x6144) /* <CJK> */
+MAP(0x58, 0x4C, 0x6173) /* <CJK> */
+MAP(0x58, 0x4D, 0x6177) /* <CJK> */
+MAP(0x58, 0x4E, 0x6158) /* <CJK> */
+MAP(0x58, 0x4F, 0x6159) /* <CJK> */
+MAP(0x58, 0x50, 0x615A) /* <CJK> */
+MAP(0x58, 0x51, 0x616B) /* <CJK> */
+MAP(0x58, 0x52, 0x6174) /* <CJK> */
+MAP(0x58, 0x53, 0x616F) /* <CJK> */
+MAP(0x58, 0x54, 0x6165) /* <CJK> */
+MAP(0x58, 0x55, 0x6171) /* <CJK> */
+MAP(0x58, 0x56, 0x615F) /* <CJK> */
+MAP(0x58, 0x57, 0x615D) /* <CJK> */
+MAP(0x58, 0x58, 0x6153) /* <CJK> */
+MAP(0x58, 0x59, 0x6175) /* <CJK> */
+MAP(0x58, 0x5A, 0x6199) /* <CJK> */
+MAP(0x58, 0x5B, 0x6196) /* <CJK> */
+MAP(0x58, 0x5C, 0x6187) /* <CJK> */
+MAP(0x58, 0x5D, 0x61AC) /* <CJK> */
+MAP(0x58, 0x5E, 0x6194) /* <CJK> */
+MAP(0x58, 0x5F, 0x619A) /* <CJK> */
+MAP(0x58, 0x60, 0x618A) /* <CJK> */
+MAP(0x58, 0x61, 0x6191) /* <CJK> */
+MAP(0x58, 0x62, 0x61AB) /* <CJK> */
+MAP(0x58, 0x63, 0x61AE) /* <CJK> */
+MAP(0x58, 0x64, 0x61CC) /* <CJK> */
+MAP(0x58, 0x65, 0x61CA) /* <CJK> */
+MAP(0x58, 0x66, 0x61C9) /* <CJK> */
+MAP(0x58, 0x67, 0x61F7) /* <CJK> */
+MAP(0x58, 0x68, 0x61C8) /* <CJK> */
+MAP(0x58, 0x69, 0x61C3) /* <CJK> */
+MAP(0x58, 0x6A, 0x61C6) /* <CJK> */
+MAP(0x58, 0x6B, 0x61BA) /* <CJK> */
+MAP(0x58, 0x6C, 0x61CB) /* <CJK> */
+MAP(0x58, 0x6D, 0x7F79) /* <CJK> */
+MAP(0x58, 0x6E, 0x61CD) /* <CJK> */
+MAP(0x58, 0x6F, 0x61E6) /* <CJK> */
+MAP(0x58, 0x70, 0x61E3) /* <CJK> */
+MAP(0x58, 0x71, 0x61F6) /* <CJK> */
+MAP(0x58, 0x72, 0x61FA) /* <CJK> */
+MAP(0x58, 0x73, 0x61F4) /* <CJK> */
+MAP(0x58, 0x74, 0x61FF) /* <CJK> */
+MAP(0x58, 0x75, 0x61FD) /* <CJK> */
+MAP(0x58, 0x76, 0x61FC) /* <CJK> */
+MAP(0x58, 0x77, 0x61FE) /* <CJK> */
+MAP(0x58, 0x78, 0x6200) /* <CJK> */
+MAP(0x58, 0x79, 0x6208) /* <CJK> */
+MAP(0x58, 0x7A, 0x6209) /* <CJK> */
+MAP(0x58, 0x7B, 0x620D) /* <CJK> */
+MAP(0x58, 0x7C, 0x620C) /* <CJK> */
+MAP(0x58, 0x7D, 0x6214) /* <CJK> */
+MAP(0x58, 0x7E, 0x621B) /* <CJK> */
+MAP(0x59, 0x21, 0x621E) /* <CJK> */
+MAP(0x59, 0x22, 0x6221) /* <CJK> */
+MAP(0x59, 0x23, 0x622A) /* <CJK> */
+MAP(0x59, 0x24, 0x622E) /* <CJK> */
+MAP(0x59, 0x25, 0x6230) /* <CJK> */
+MAP(0x59, 0x26, 0x6232) /* <CJK> */
+MAP(0x59, 0x27, 0x6233) /* <CJK> */
+MAP(0x59, 0x28, 0x6241) /* <CJK> */
+MAP(0x59, 0x29, 0x624E) /* <CJK> */
+MAP(0x59, 0x2A, 0x625E) /* <CJK> */
+MAP(0x59, 0x2B, 0x6263) /* <CJK> */
+MAP(0x59, 0x2C, 0x625B) /* <CJK> */
+MAP(0x59, 0x2D, 0x6260) /* <CJK> */
+MAP(0x59, 0x2E, 0x6268) /* <CJK> */
+MAP(0x59, 0x2F, 0x627C) /* <CJK> */
+MAP(0x59, 0x30, 0x6282) /* <CJK> */
+MAP(0x59, 0x31, 0x6289) /* <CJK> */
+MAP(0x59, 0x32, 0x627E) /* <CJK> */
+MAP(0x59, 0x33, 0x6292) /* <CJK> */
+MAP(0x59, 0x34, 0x6293) /* <CJK> */
+MAP(0x59, 0x35, 0x6296) /* <CJK> */
+MAP(0x59, 0x36, 0x62D4) /* <CJK> */
+MAP(0x59, 0x37, 0x6283) /* <CJK> */
+MAP(0x59, 0x38, 0x6294) /* <CJK> */
+MAP(0x59, 0x39, 0x62D7) /* <CJK> */
+MAP(0x59, 0x3A, 0x62D1) /* <CJK> */
+MAP(0x59, 0x3B, 0x62BB) /* <CJK> */
+MAP(0x59, 0x3C, 0x62CF) /* <CJK> */
+MAP(0x59, 0x3D, 0x62FF) /* <CJK> */
+MAP(0x59, 0x3E, 0x62C6) /* <CJK> */
+MAP(0x59, 0x3F, 0x64D4) /* <CJK> */
+MAP(0x59, 0x40, 0x62C8) /* <CJK> */
+MAP(0x59, 0x41, 0x62DC) /* <CJK> */
+MAP(0x59, 0x42, 0x62CC) /* <CJK> */
+MAP(0x59, 0x43, 0x62CA) /* <CJK> */
+MAP(0x59, 0x44, 0x62C2) /* <CJK> */
+MAP(0x59, 0x45, 0x62C7) /* <CJK> */
+MAP(0x59, 0x46, 0x629B) /* <CJK> */
+MAP(0x59, 0x47, 0x62C9) /* <CJK> */
+MAP(0x59, 0x48, 0x630C) /* <CJK> */
+MAP(0x59, 0x49, 0x62EE) /* <CJK> */
+MAP(0x59, 0x4A, 0x62F1) /* <CJK> */
+MAP(0x59, 0x4B, 0x6327) /* <CJK> */
+MAP(0x59, 0x4C, 0x6302) /* <CJK> */
+MAP(0x59, 0x4D, 0x6308) /* <CJK> */
+MAP(0x59, 0x4E, 0x62EF) /* <CJK> */
+MAP(0x59, 0x4F, 0x62F5) /* <CJK> */
+MAP(0x59, 0x50, 0x6350) /* <CJK> */
+MAP(0x59, 0x51, 0x633E) /* <CJK> */
+MAP(0x59, 0x52, 0x634D) /* <CJK> */
+MAP(0x59, 0x53, 0x641C) /* <CJK> */
+MAP(0x59, 0x54, 0x634F) /* <CJK> */
+MAP(0x59, 0x55, 0x6396) /* <CJK> */
+MAP(0x59, 0x56, 0x638E) /* <CJK> */
+MAP(0x59, 0x57, 0x6380) /* <CJK> */
+MAP(0x59, 0x58, 0x63AB) /* <CJK> */
+MAP(0x59, 0x59, 0x6376) /* <CJK> */
+MAP(0x59, 0x5A, 0x63A3) /* <CJK> */
+MAP(0x59, 0x5B, 0x638F) /* <CJK> */
+MAP(0x59, 0x5C, 0x6389) /* <CJK> */
+MAP(0x59, 0x5D, 0x639F) /* <CJK> */
+MAP(0x59, 0x5E, 0x63B5) /* <CJK> */
+MAP(0x59, 0x5F, 0x636B) /* <CJK> */
+MAP(0x59, 0x60, 0x6369) /* <CJK> */
+MAP(0x59, 0x61, 0x63BE) /* <CJK> */
+MAP(0x59, 0x62, 0x63E9) /* <CJK> */
+MAP(0x59, 0x63, 0x63C0) /* <CJK> */
+MAP(0x59, 0x64, 0x63C6) /* <CJK> */
+MAP(0x59, 0x65, 0x63E3) /* <CJK> */
+MAP(0x59, 0x66, 0x63C9) /* <CJK> */
+MAP(0x59, 0x67, 0x63D2) /* <CJK> */
+MAP(0x59, 0x68, 0x63F6) /* <CJK> */
+MAP(0x59, 0x69, 0x63C4) /* <CJK> */
+MAP(0x59, 0x6A, 0x6416) /* <CJK> */
+MAP(0x59, 0x6B, 0x6434) /* <CJK> */
+MAP(0x59, 0x6C, 0x6406) /* <CJK> */
+MAP(0x59, 0x6D, 0x6413) /* <CJK> */
+MAP(0x59, 0x6E, 0x6426) /* <CJK> */
+MAP(0x59, 0x6F, 0x6436) /* <CJK> */
+MAP(0x59, 0x70, 0x651D) /* <CJK> */
+MAP(0x59, 0x71, 0x6417) /* <CJK> */
+MAP(0x59, 0x72, 0x6428) /* <CJK> */
+MAP(0x59, 0x73, 0x640F) /* <CJK> */
+MAP(0x59, 0x74, 0x6467) /* <CJK> */
+MAP(0x59, 0x75, 0x646F) /* <CJK> */
+MAP(0x59, 0x76, 0x6476) /* <CJK> */
+MAP(0x59, 0x77, 0x644E) /* <CJK> */
+MAP(0x59, 0x78, 0x652A) /* <CJK> */
+MAP(0x59, 0x79, 0x6495) /* <CJK> */
+MAP(0x59, 0x7A, 0x6493) /* <CJK> */
+MAP(0x59, 0x7B, 0x64A5) /* <CJK> */
+MAP(0x59, 0x7C, 0x64A9) /* <CJK> */
+MAP(0x59, 0x7D, 0x6488) /* <CJK> */
+MAP(0x59, 0x7E, 0x64BC) /* <CJK> */
+MAP(0x5A, 0x21, 0x64DA) /* <CJK> */
+MAP(0x5A, 0x22, 0x64D2) /* <CJK> */
+MAP(0x5A, 0x23, 0x64C5) /* <CJK> */
+MAP(0x5A, 0x24, 0x64C7) /* <CJK> */
+MAP(0x5A, 0x25, 0x64BB) /* <CJK> */
+MAP(0x5A, 0x26, 0x64D8) /* <CJK> */
+MAP(0x5A, 0x27, 0x64C2) /* <CJK> */
+MAP(0x5A, 0x28, 0x64F1) /* <CJK> */
+MAP(0x5A, 0x29, 0x64E7) /* <CJK> */
+MAP(0x5A, 0x2A, 0x8209) /* <CJK> */
+MAP(0x5A, 0x2B, 0x64E0) /* <CJK> */
+MAP(0x5A, 0x2C, 0x64E1) /* <CJK> */
+MAP(0x5A, 0x2D, 0x62AC) /* <CJK> */
+MAP(0x5A, 0x2E, 0x64E3) /* <CJK> */
+MAP(0x5A, 0x2F, 0x64EF) /* <CJK> */
+MAP(0x5A, 0x30, 0x652C) /* <CJK> */
+MAP(0x5A, 0x31, 0x64F6) /* <CJK> */
+MAP(0x5A, 0x32, 0x64F4) /* <CJK> */
+MAP(0x5A, 0x33, 0x64F2) /* <CJK> */
+MAP(0x5A, 0x34, 0x64FA) /* <CJK> */
+MAP(0x5A, 0x35, 0x6500) /* <CJK> */
+MAP(0x5A, 0x36, 0x64FD) /* <CJK> */
+MAP(0x5A, 0x37, 0x6518) /* <CJK> */
+MAP(0x5A, 0x38, 0x651C) /* <CJK> */
+MAP(0x5A, 0x39, 0x6505) /* <CJK> */
+MAP(0x5A, 0x3A, 0x6524) /* <CJK> */
+MAP(0x5A, 0x3B, 0x6523) /* <CJK> */
+MAP(0x5A, 0x3C, 0x652B) /* <CJK> */
+MAP(0x5A, 0x3D, 0x6534) /* <CJK> */
+MAP(0x5A, 0x3E, 0x6535) /* <CJK> */
+MAP(0x5A, 0x3F, 0x6537) /* <CJK> */
+MAP(0x5A, 0x40, 0x6536) /* <CJK> */
+MAP(0x5A, 0x41, 0x6538) /* <CJK> */
+MAP(0x5A, 0x42, 0x754B) /* <CJK> */
+MAP(0x5A, 0x43, 0x6548) /* <CJK> */
+MAP(0x5A, 0x44, 0x6556) /* <CJK> */
+MAP(0x5A, 0x45, 0x6555) /* <CJK> */
+MAP(0x5A, 0x46, 0x654D) /* <CJK> */
+MAP(0x5A, 0x47, 0x6558) /* <CJK> */
+MAP(0x5A, 0x48, 0x655E) /* <CJK> */
+MAP(0x5A, 0x49, 0x655D) /* <CJK> */
+MAP(0x5A, 0x4A, 0x6572) /* <CJK> */
+MAP(0x5A, 0x4B, 0x6578) /* <CJK> */
+MAP(0x5A, 0x4C, 0x6582) /* <CJK> */
+MAP(0x5A, 0x4D, 0x6583) /* <CJK> */
+MAP(0x5A, 0x4E, 0x8B8A) /* <CJK> */
+MAP(0x5A, 0x4F, 0x659B) /* <CJK> */
+MAP(0x5A, 0x50, 0x659F) /* <CJK> */
+MAP(0x5A, 0x51, 0x65AB) /* <CJK> */
+MAP(0x5A, 0x52, 0x65B7) /* <CJK> */
+MAP(0x5A, 0x53, 0x65C3) /* <CJK> */
+MAP(0x5A, 0x54, 0x65C6) /* <CJK> */
+MAP(0x5A, 0x55, 0x65C1) /* <CJK> */
+MAP(0x5A, 0x56, 0x65C4) /* <CJK> */
+MAP(0x5A, 0x57, 0x65CC) /* <CJK> */
+MAP(0x5A, 0x58, 0x65D2) /* <CJK> */
+MAP(0x5A, 0x59, 0x65DB) /* <CJK> */
+MAP(0x5A, 0x5A, 0x65D9) /* <CJK> */
+MAP(0x5A, 0x5B, 0x65E0) /* <CJK> */
+MAP(0x5A, 0x5C, 0x65E1) /* <CJK> */
+MAP(0x5A, 0x5D, 0x65F1) /* <CJK> */
+MAP(0x5A, 0x5E, 0x6772) /* <CJK> */
+MAP(0x5A, 0x5F, 0x660A) /* <CJK> */
+MAP(0x5A, 0x60, 0x6603) /* <CJK> */
+MAP(0x5A, 0x61, 0x65FB) /* <CJK> */
+MAP(0x5A, 0x62, 0x6773) /* <CJK> */
+MAP(0x5A, 0x63, 0x6635) /* <CJK> */
+MAP(0x5A, 0x64, 0x6636) /* <CJK> */
+MAP(0x5A, 0x65, 0x6634) /* <CJK> */
+MAP(0x5A, 0x66, 0x661C) /* <CJK> */
+MAP(0x5A, 0x67, 0x664F) /* <CJK> */
+MAP(0x5A, 0x68, 0x6644) /* <CJK> */
+MAP(0x5A, 0x69, 0x6649) /* <CJK> */
+MAP(0x5A, 0x6A, 0x6641) /* <CJK> */
+MAP(0x5A, 0x6B, 0x665E) /* <CJK> */
+MAP(0x5A, 0x6C, 0x665D) /* <CJK> */
+MAP(0x5A, 0x6D, 0x6664) /* <CJK> */
+MAP(0x5A, 0x6E, 0x6667) /* <CJK> */
+MAP(0x5A, 0x6F, 0x6668) /* <CJK> */
+MAP(0x5A, 0x70, 0x665F) /* <CJK> */
+MAP(0x5A, 0x71, 0x6662) /* <CJK> */
+MAP(0x5A, 0x72, 0x6670) /* <CJK> */
+MAP(0x5A, 0x73, 0x6683) /* <CJK> */
+MAP(0x5A, 0x74, 0x6688) /* <CJK> */
+MAP(0x5A, 0x75, 0x668E) /* <CJK> */
+MAP(0x5A, 0x76, 0x6689) /* <CJK> */
+MAP(0x5A, 0x77, 0x6684) /* <CJK> */
+MAP(0x5A, 0x78, 0x6698) /* <CJK> */
+MAP(0x5A, 0x79, 0x669D) /* <CJK> */
+MAP(0x5A, 0x7A, 0x66C1) /* <CJK> */
+MAP(0x5A, 0x7B, 0x66B9) /* <CJK> */
+MAP(0x5A, 0x7C, 0x66C9) /* <CJK> */
+MAP(0x5A, 0x7D, 0x66BE) /* <CJK> */
+MAP(0x5A, 0x7E, 0x66BC) /* <CJK> */
+MAP(0x5B, 0x21, 0x66C4) /* <CJK> */
+MAP(0x5B, 0x22, 0x66B8) /* <CJK> */
+MAP(0x5B, 0x23, 0x66D6) /* <CJK> */
+MAP(0x5B, 0x24, 0x66DA) /* <CJK> */
+MAP(0x5B, 0x25, 0x66E0) /* <CJK> */
+MAP(0x5B, 0x26, 0x663F) /* <CJK> */
+MAP(0x5B, 0x27, 0x66E6) /* <CJK> */
+MAP(0x5B, 0x28, 0x66E9) /* <CJK> */
+MAP(0x5B, 0x29, 0x66F0) /* <CJK> */
+MAP(0x5B, 0x2A, 0x66F5) /* <CJK> */
+MAP(0x5B, 0x2B, 0x66F7) /* <CJK> */
+MAP(0x5B, 0x2C, 0x670F) /* <CJK> */
+MAP(0x5B, 0x2D, 0x6716) /* <CJK> */
+MAP(0x5B, 0x2E, 0x671E) /* <CJK> */
+MAP(0x5B, 0x2F, 0x6726) /* <CJK> */
+MAP(0x5B, 0x30, 0x6727) /* <CJK> */
+MAP(0x5B, 0x31, 0x9738) /* <CJK> */
+MAP(0x5B, 0x32, 0x672E) /* <CJK> */
+MAP(0x5B, 0x33, 0x673F) /* <CJK> */
+MAP(0x5B, 0x34, 0x6736) /* <CJK> */
+MAP(0x5B, 0x35, 0x6741) /* <CJK> */
+MAP(0x5B, 0x36, 0x6738) /* <CJK> */
+MAP(0x5B, 0x37, 0x6737) /* <CJK> */
+MAP(0x5B, 0x38, 0x6746) /* <CJK> */
+MAP(0x5B, 0x39, 0x675E) /* <CJK> */
+MAP(0x5B, 0x3A, 0x6760) /* <CJK> */
+MAP(0x5B, 0x3B, 0x6759) /* <CJK> */
+MAP(0x5B, 0x3C, 0x6763) /* <CJK> */
+MAP(0x5B, 0x3D, 0x6764) /* <CJK> */
+MAP(0x5B, 0x3E, 0x6789) /* <CJK> */
+MAP(0x5B, 0x3F, 0x6770) /* <CJK> */
+MAP(0x5B, 0x40, 0x67A9) /* <CJK> */
+MAP(0x5B, 0x41, 0x677C) /* <CJK> */
+MAP(0x5B, 0x42, 0x676A) /* <CJK> */
+MAP(0x5B, 0x43, 0x678C) /* <CJK> */
+MAP(0x5B, 0x44, 0x678B) /* <CJK> */
+MAP(0x5B, 0x45, 0x67A6) /* <CJK> */
+MAP(0x5B, 0x46, 0x67A1) /* <CJK> */
+MAP(0x5B, 0x47, 0x6785) /* <CJK> */
+MAP(0x5B, 0x48, 0x67B7) /* <CJK> */
+MAP(0x5B, 0x49, 0x67EF) /* <CJK> */
+MAP(0x5B, 0x4A, 0x67B4) /* <CJK> */
+MAP(0x5B, 0x4B, 0x67EC) /* <CJK> */
+MAP(0x5B, 0x4C, 0x67B3) /* <CJK> */
+MAP(0x5B, 0x4D, 0x67E9) /* <CJK> */
+MAP(0x5B, 0x4E, 0x67B8) /* <CJK> */
+MAP(0x5B, 0x4F, 0x67E4) /* <CJK> */
+MAP(0x5B, 0x50, 0x67DE) /* <CJK> */
+MAP(0x5B, 0x51, 0x67DD) /* <CJK> */
+MAP(0x5B, 0x52, 0x67E2) /* <CJK> */
+MAP(0x5B, 0x53, 0x67EE) /* <CJK> */
+MAP(0x5B, 0x54, 0x67B9) /* <CJK> */
+MAP(0x5B, 0x55, 0x67CE) /* <CJK> */
+MAP(0x5B, 0x56, 0x67C6) /* <CJK> */
+MAP(0x5B, 0x57, 0x67E7) /* <CJK> */
+MAP(0x5B, 0x58, 0x6A9C) /* <CJK> */
+MAP(0x5B, 0x59, 0x681E) /* <CJK> */
+MAP(0x5B, 0x5A, 0x6846) /* <CJK> */
+MAP(0x5B, 0x5B, 0x6829) /* <CJK> */
+MAP(0x5B, 0x5C, 0x6840) /* <CJK> */
+MAP(0x5B, 0x5D, 0x684D) /* <CJK> */
+MAP(0x5B, 0x5E, 0x6832) /* <CJK> */
+MAP(0x5B, 0x5F, 0x684E) /* <CJK> */
+MAP(0x5B, 0x60, 0x68B3) /* <CJK> */
+MAP(0x5B, 0x61, 0x682B) /* <CJK> */
+MAP(0x5B, 0x62, 0x6859) /* <CJK> */
+MAP(0x5B, 0x63, 0x6863) /* <CJK> */
+MAP(0x5B, 0x64, 0x6877) /* <CJK> */
+MAP(0x5B, 0x65, 0x687F) /* <CJK> */
+MAP(0x5B, 0x66, 0x689F) /* <CJK> */
+MAP(0x5B, 0x67, 0x688F) /* <CJK> */
+MAP(0x5B, 0x68, 0x68AD) /* <CJK> */
+MAP(0x5B, 0x69, 0x6894) /* <CJK> */
+MAP(0x5B, 0x6A, 0x689D) /* <CJK> */
+MAP(0x5B, 0x6B, 0x689B) /* <CJK> */
+MAP(0x5B, 0x6C, 0x6883) /* <CJK> */
+MAP(0x5B, 0x6D, 0x6AAE) /* <CJK> */
+MAP(0x5B, 0x6E, 0x68B9) /* <CJK> */
+MAP(0x5B, 0x6F, 0x6874) /* <CJK> */
+MAP(0x5B, 0x70, 0x68B5) /* <CJK> */
+MAP(0x5B, 0x71, 0x68A0) /* <CJK> */
+MAP(0x5B, 0x72, 0x68BA) /* <CJK> */
+MAP(0x5B, 0x73, 0x690F) /* <CJK> */
+MAP(0x5B, 0x74, 0x688D) /* <CJK> */
+MAP(0x5B, 0x75, 0x687E) /* <CJK> */
+MAP(0x5B, 0x76, 0x6901) /* <CJK> */
+MAP(0x5B, 0x77, 0x68CA) /* <CJK> */
+MAP(0x5B, 0x78, 0x6908) /* <CJK> */
+MAP(0x5B, 0x79, 0x68D8) /* <CJK> */
+MAP(0x5B, 0x7A, 0x6922) /* <CJK> */
+MAP(0x5B, 0x7B, 0x6926) /* <CJK> */
+MAP(0x5B, 0x7C, 0x68E1) /* <CJK> */
+MAP(0x5B, 0x7D, 0x690C) /* <CJK> */
+MAP(0x5B, 0x7E, 0x68CD) /* <CJK> */
+MAP(0x5C, 0x21, 0x68D4) /* <CJK> */
+MAP(0x5C, 0x22, 0x68E7) /* <CJK> */
+MAP(0x5C, 0x23, 0x68D5) /* <CJK> */
+MAP(0x5C, 0x24, 0x6936) /* <CJK> */
+MAP(0x5C, 0x25, 0x6912) /* <CJK> */
+MAP(0x5C, 0x26, 0x6904) /* <CJK> */
+MAP(0x5C, 0x27, 0x68D7) /* <CJK> */
+MAP(0x5C, 0x28, 0x68E3) /* <CJK> */
+MAP(0x5C, 0x29, 0x6925) /* <CJK> */
+MAP(0x5C, 0x2A, 0x68F9) /* <CJK> */
+MAP(0x5C, 0x2B, 0x68E0) /* <CJK> */
+MAP(0x5C, 0x2C, 0x68EF) /* <CJK> */
+MAP(0x5C, 0x2D, 0x6928) /* <CJK> */
+MAP(0x5C, 0x2E, 0x692A) /* <CJK> */
+MAP(0x5C, 0x2F, 0x691A) /* <CJK> */
+MAP(0x5C, 0x30, 0x6923) /* <CJK> */
+MAP(0x5C, 0x31, 0x6921) /* <CJK> */
+MAP(0x5C, 0x32, 0x68C6) /* <CJK> */
+MAP(0x5C, 0x33, 0x6979) /* <CJK> */
+MAP(0x5C, 0x34, 0x6977) /* <CJK> */
+MAP(0x5C, 0x35, 0x695C) /* <CJK> */
+MAP(0x5C, 0x36, 0x6978) /* <CJK> */
+MAP(0x5C, 0x37, 0x696B) /* <CJK> */
+MAP(0x5C, 0x38, 0x6954) /* <CJK> */
+MAP(0x5C, 0x39, 0x697E) /* <CJK> */
+MAP(0x5C, 0x3A, 0x696E) /* <CJK> */
+MAP(0x5C, 0x3B, 0x6939) /* <CJK> */
+MAP(0x5C, 0x3C, 0x6974) /* <CJK> */
+MAP(0x5C, 0x3D, 0x693D) /* <CJK> */
+MAP(0x5C, 0x3E, 0x6959) /* <CJK> */
+MAP(0x5C, 0x3F, 0x6930) /* <CJK> */
+MAP(0x5C, 0x40, 0x6961) /* <CJK> */
+MAP(0x5C, 0x41, 0x695E) /* <CJK> */
+MAP(0x5C, 0x42, 0x695D) /* <CJK> */
+MAP(0x5C, 0x43, 0x6981) /* <CJK> */
+MAP(0x5C, 0x44, 0x696A) /* <CJK> */
+MAP(0x5C, 0x45, 0x69B2) /* <CJK> */
+MAP(0x5C, 0x46, 0x69AE) /* <CJK> */
+MAP(0x5C, 0x47, 0x69D0) /* <CJK> */
+MAP(0x5C, 0x48, 0x69BF) /* <CJK> */
+MAP(0x5C, 0x49, 0x69C1) /* <CJK> */
+MAP(0x5C, 0x4A, 0x69D3) /* <CJK> */
+MAP(0x5C, 0x4B, 0x69BE) /* <CJK> */
+MAP(0x5C, 0x4C, 0x69CE) /* <CJK> */
+MAP(0x5C, 0x4D, 0x5BE8) /* <CJK> */
+MAP(0x5C, 0x4E, 0x69CA) /* <CJK> */
+MAP(0x5C, 0x4F, 0x69DD) /* <CJK> */
+MAP(0x5C, 0x50, 0x69BB) /* <CJK> */
+MAP(0x5C, 0x51, 0x69C3) /* <CJK> */
+MAP(0x5C, 0x52, 0x69A7) /* <CJK> */
+MAP(0x5C, 0x53, 0x6A2E) /* <CJK> */
+MAP(0x5C, 0x54, 0x6991) /* <CJK> */
+MAP(0x5C, 0x55, 0x69A0) /* <CJK> */
+MAP(0x5C, 0x56, 0x699C) /* <CJK> */
+MAP(0x5C, 0x57, 0x6995) /* <CJK> */
+MAP(0x5C, 0x58, 0x69B4) /* <CJK> */
+MAP(0x5C, 0x59, 0x69DE) /* <CJK> */
+MAP(0x5C, 0x5A, 0x69E8) /* <CJK> */
+MAP(0x5C, 0x5B, 0x6A02) /* <CJK> */
+MAP(0x5C, 0x5C, 0x6A1B) /* <CJK> */
+MAP(0x5C, 0x5D, 0x69FF) /* <CJK> */
+MAP(0x5C, 0x5E, 0x6B0A) /* <CJK> */
+MAP(0x5C, 0x5F, 0x69F9) /* <CJK> */
+MAP(0x5C, 0x60, 0x69F2) /* <CJK> */
+MAP(0x5C, 0x61, 0x69E7) /* <CJK> */
+MAP(0x5C, 0x62, 0x6A05) /* <CJK> */
+MAP(0x5C, 0x63, 0x69B1) /* <CJK> */
+MAP(0x5C, 0x64, 0x6A1E) /* <CJK> */
+MAP(0x5C, 0x65, 0x69ED) /* <CJK> */
+MAP(0x5C, 0x66, 0x6A14) /* <CJK> */
+MAP(0x5C, 0x67, 0x69EB) /* <CJK> */
+MAP(0x5C, 0x68, 0x6A0A) /* <CJK> */
+MAP(0x5C, 0x69, 0x6A12) /* <CJK> */
+MAP(0x5C, 0x6A, 0x6AC1) /* <CJK> */
+MAP(0x5C, 0x6B, 0x6A23) /* <CJK> */
+MAP(0x5C, 0x6C, 0x6A13) /* <CJK> */
+MAP(0x5C, 0x6D, 0x6A44) /* <CJK> */
+MAP(0x5C, 0x6E, 0x6A0C) /* <CJK> */
+MAP(0x5C, 0x6F, 0x6A72) /* <CJK> */
+MAP(0x5C, 0x70, 0x6A36) /* <CJK> */
+MAP(0x5C, 0x71, 0x6A78) /* <CJK> */
+MAP(0x5C, 0x72, 0x6A47) /* <CJK> */
+MAP(0x5C, 0x73, 0x6A62) /* <CJK> */
+MAP(0x5C, 0x74, 0x6A59) /* <CJK> */
+MAP(0x5C, 0x75, 0x6A66) /* <CJK> */
+MAP(0x5C, 0x76, 0x6A48) /* <CJK> */
+MAP(0x5C, 0x77, 0x6A38) /* <CJK> */
+MAP(0x5C, 0x78, 0x6A22) /* <CJK> */
+MAP(0x5C, 0x79, 0x6A90) /* <CJK> */
+MAP(0x5C, 0x7A, 0x6A8D) /* <CJK> */
+MAP(0x5C, 0x7B, 0x6AA0) /* <CJK> */
+MAP(0x5C, 0x7C, 0x6A84) /* <CJK> */
+MAP(0x5C, 0x7D, 0x6AA2) /* <CJK> */
+MAP(0x5C, 0x7E, 0x6AA3) /* <CJK> */
+MAP(0x5D, 0x21, 0x6A97) /* <CJK> */
+MAP(0x5D, 0x22, 0x8617) /* <CJK> */
+MAP(0x5D, 0x23, 0x6ABB) /* <CJK> */
+MAP(0x5D, 0x24, 0x6AC3) /* <CJK> */
+MAP(0x5D, 0x25, 0x6AC2) /* <CJK> */
+MAP(0x5D, 0x26, 0x6AB8) /* <CJK> */
+MAP(0x5D, 0x27, 0x6AB3) /* <CJK> */
+MAP(0x5D, 0x28, 0x6AAC) /* <CJK> */
+MAP(0x5D, 0x29, 0x6ADE) /* <CJK> */
+MAP(0x5D, 0x2A, 0x6AD1) /* <CJK> */
+MAP(0x5D, 0x2B, 0x6ADF) /* <CJK> */
+MAP(0x5D, 0x2C, 0x6AAA) /* <CJK> */
+MAP(0x5D, 0x2D, 0x6ADA) /* <CJK> */
+MAP(0x5D, 0x2E, 0x6AEA) /* <CJK> */
+MAP(0x5D, 0x2F, 0x6AFB) /* <CJK> */
+MAP(0x5D, 0x30, 0x6B05) /* <CJK> */
+MAP(0x5D, 0x31, 0x8616) /* <CJK> */
+MAP(0x5D, 0x32, 0x6AFA) /* <CJK> */
+MAP(0x5D, 0x33, 0x6B12) /* <CJK> */
+MAP(0x5D, 0x34, 0x6B16) /* <CJK> */
+MAP(0x5D, 0x35, 0x9B31) /* <CJK> */
+MAP(0x5D, 0x36, 0x6B1F) /* <CJK> */
+MAP(0x5D, 0x37, 0x6B38) /* <CJK> */
+MAP(0x5D, 0x38, 0x6B37) /* <CJK> */
+MAP(0x5D, 0x39, 0x76DC) /* <CJK> */
+MAP(0x5D, 0x3A, 0x6B39) /* <CJK> */
+MAP(0x5D, 0x3B, 0x98EE) /* <CJK> */
+MAP(0x5D, 0x3C, 0x6B47) /* <CJK> */
+MAP(0x5D, 0x3D, 0x6B43) /* <CJK> */
+MAP(0x5D, 0x3E, 0x6B49) /* <CJK> */
+MAP(0x5D, 0x3F, 0x6B50) /* <CJK> */
+MAP(0x5D, 0x40, 0x6B59) /* <CJK> */
+MAP(0x5D, 0x41, 0x6B54) /* <CJK> */
+MAP(0x5D, 0x42, 0x6B5B) /* <CJK> */
+MAP(0x5D, 0x43, 0x6B5F) /* <CJK> */
+MAP(0x5D, 0x44, 0x6B61) /* <CJK> */
+MAP(0x5D, 0x45, 0x6B78) /* <CJK> */
+MAP(0x5D, 0x46, 0x6B79) /* <CJK> */
+MAP(0x5D, 0x47, 0x6B7F) /* <CJK> */
+MAP(0x5D, 0x48, 0x6B80) /* <CJK> */
+MAP(0x5D, 0x49, 0x6B84) /* <CJK> */
+MAP(0x5D, 0x4A, 0x6B83) /* <CJK> */
+MAP(0x5D, 0x4B, 0x6B8D) /* <CJK> */
+MAP(0x5D, 0x4C, 0x6B98) /* <CJK> */
+MAP(0x5D, 0x4D, 0x6B95) /* <CJK> */
+MAP(0x5D, 0x4E, 0x6B9E) /* <CJK> */
+MAP(0x5D, 0x4F, 0x6BA4) /* <CJK> */
+MAP(0x5D, 0x50, 0x6BAA) /* <CJK> */
+MAP(0x5D, 0x51, 0x6BAB) /* <CJK> */
+MAP(0x5D, 0x52, 0x6BAF) /* <CJK> */
+MAP(0x5D, 0x53, 0x6BB2) /* <CJK> */
+MAP(0x5D, 0x54, 0x6BB1) /* <CJK> */
+MAP(0x5D, 0x55, 0x6BB3) /* <CJK> */
+MAP(0x5D, 0x56, 0x6BB7) /* <CJK> */
+MAP(0x5D, 0x57, 0x6BBC) /* <CJK> */
+MAP(0x5D, 0x58, 0x6BC6) /* <CJK> */
+MAP(0x5D, 0x59, 0x6BCB) /* <CJK> */
+MAP(0x5D, 0x5A, 0x6BD3) /* <CJK> */
+MAP(0x5D, 0x5B, 0x6BDF) /* <CJK> */
+MAP(0x5D, 0x5C, 0x6BEC) /* <CJK> */
+MAP(0x5D, 0x5D, 0x6BEB) /* <CJK> */
+MAP(0x5D, 0x5E, 0x6BF3) /* <CJK> */
+MAP(0x5D, 0x5F, 0x6BEF) /* <CJK> */
+MAP(0x5D, 0x60, 0x9EBE) /* <CJK> */
+MAP(0x5D, 0x61, 0x6C08) /* <CJK> */
+MAP(0x5D, 0x62, 0x6C13) /* <CJK> */
+MAP(0x5D, 0x63, 0x6C14) /* <CJK> */
+MAP(0x5D, 0x64, 0x6C1B) /* <CJK> */
+MAP(0x5D, 0x65, 0x6C24) /* <CJK> */
+MAP(0x5D, 0x66, 0x6C23) /* <CJK> */
+MAP(0x5D, 0x67, 0x6C5E) /* <CJK> */
+MAP(0x5D, 0x68, 0x6C55) /* <CJK> */
+MAP(0x5D, 0x69, 0x6C62) /* <CJK> */
+MAP(0x5D, 0x6A, 0x6C6A) /* <CJK> */
+MAP(0x5D, 0x6B, 0x6C82) /* <CJK> */
+MAP(0x5D, 0x6C, 0x6C8D) /* <CJK> */
+MAP(0x5D, 0x6D, 0x6C9A) /* <CJK> */
+MAP(0x5D, 0x6E, 0x6C81) /* <CJK> */
+MAP(0x5D, 0x6F, 0x6C9B) /* <CJK> */
+MAP(0x5D, 0x70, 0x6C7E) /* <CJK> */
+MAP(0x5D, 0x71, 0x6C68) /* <CJK> */
+MAP(0x5D, 0x72, 0x6C73) /* <CJK> */
+MAP(0x5D, 0x73, 0x6C92) /* <CJK> */
+MAP(0x5D, 0x74, 0x6C90) /* <CJK> */
+MAP(0x5D, 0x75, 0x6CC4) /* <CJK> */
+MAP(0x5D, 0x76, 0x6CF1) /* <CJK> */
+MAP(0x5D, 0x77, 0x6CD3) /* <CJK> */
+MAP(0x5D, 0x78, 0x6CBD) /* <CJK> */
+MAP(0x5D, 0x79, 0x6CD7) /* <CJK> */
+MAP(0x5D, 0x7A, 0x6CC5) /* <CJK> */
+MAP(0x5D, 0x7B, 0x6CDD) /* <CJK> */
+MAP(0x5D, 0x7C, 0x6CAE) /* <CJK> */
+MAP(0x5D, 0x7D, 0x6CB1) /* <CJK> */
+MAP(0x5D, 0x7E, 0x6CBE) /* <CJK> */
+MAP(0x5E, 0x21, 0x6CBA) /* <CJK> */
+MAP(0x5E, 0x22, 0x6CDB) /* <CJK> */
+MAP(0x5E, 0x23, 0x6CEF) /* <CJK> */
+MAP(0x5E, 0x24, 0x6CD9) /* <CJK> */
+MAP(0x5E, 0x25, 0x6CEA) /* <CJK> */
+MAP(0x5E, 0x26, 0x6D1F) /* <CJK> */
+MAP(0x5E, 0x27, 0x884D) /* <CJK> */
+MAP(0x5E, 0x28, 0x6D36) /* <CJK> */
+MAP(0x5E, 0x29, 0x6D2B) /* <CJK> */
+MAP(0x5E, 0x2A, 0x6D3D) /* <CJK> */
+MAP(0x5E, 0x2B, 0x6D38) /* <CJK> */
+MAP(0x5E, 0x2C, 0x6D19) /* <CJK> */
+MAP(0x5E, 0x2D, 0x6D35) /* <CJK> */
+MAP(0x5E, 0x2E, 0x6D33) /* <CJK> */
+MAP(0x5E, 0x2F, 0x6D12) /* <CJK> */
+MAP(0x5E, 0x30, 0x6D0C) /* <CJK> */
+MAP(0x5E, 0x31, 0x6D63) /* <CJK> */
+MAP(0x5E, 0x32, 0x6D93) /* <CJK> */
+MAP(0x5E, 0x33, 0x6D64) /* <CJK> */
+MAP(0x5E, 0x34, 0x6D5A) /* <CJK> */
+MAP(0x5E, 0x35, 0x6D79) /* <CJK> */
+MAP(0x5E, 0x36, 0x6D59) /* <CJK> */
+MAP(0x5E, 0x37, 0x6D8E) /* <CJK> */
+MAP(0x5E, 0x38, 0x6D95) /* <CJK> */
+MAP(0x5E, 0x39, 0x6FE4) /* <CJK> */
+MAP(0x5E, 0x3A, 0x6D85) /* <CJK> */
+MAP(0x5E, 0x3B, 0x6DF9) /* <CJK> */
+MAP(0x5E, 0x3C, 0x6E15) /* <CJK> */
+MAP(0x5E, 0x3D, 0x6E0A) /* <CJK> */
+MAP(0x5E, 0x3E, 0x6DB5) /* <CJK> */
+MAP(0x5E, 0x3F, 0x6DC7) /* <CJK> */
+MAP(0x5E, 0x40, 0x6DE6) /* <CJK> */
+MAP(0x5E, 0x41, 0x6DB8) /* <CJK> */
+MAP(0x5E, 0x42, 0x6DC6) /* <CJK> */
+MAP(0x5E, 0x43, 0x6DEC) /* <CJK> */
+MAP(0x5E, 0x44, 0x6DDE) /* <CJK> */
+MAP(0x5E, 0x45, 0x6DCC) /* <CJK> */
+MAP(0x5E, 0x46, 0x6DE8) /* <CJK> */
+MAP(0x5E, 0x47, 0x6DD2) /* <CJK> */
+MAP(0x5E, 0x48, 0x6DC5) /* <CJK> */
+MAP(0x5E, 0x49, 0x6DFA) /* <CJK> */
+MAP(0x5E, 0x4A, 0x6DD9) /* <CJK> */
+MAP(0x5E, 0x4B, 0x6DE4) /* <CJK> */
+MAP(0x5E, 0x4C, 0x6DD5) /* <CJK> */
+MAP(0x5E, 0x4D, 0x6DEA) /* <CJK> */
+MAP(0x5E, 0x4E, 0x6DEE) /* <CJK> */
+MAP(0x5E, 0x4F, 0x6E2D) /* <CJK> */
+MAP(0x5E, 0x50, 0x6E6E) /* <CJK> */
+MAP(0x5E, 0x51, 0x6E2E) /* <CJK> */
+MAP(0x5E, 0x52, 0x6E19) /* <CJK> */
+MAP(0x5E, 0x53, 0x6E72) /* <CJK> */
+MAP(0x5E, 0x54, 0x6E5F) /* <CJK> */
+MAP(0x5E, 0x55, 0x6E3E) /* <CJK> */
+MAP(0x5E, 0x56, 0x6E23) /* <CJK> */
+MAP(0x5E, 0x57, 0x6E6B) /* <CJK> */
+MAP(0x5E, 0x58, 0x6E2B) /* <CJK> */
+MAP(0x5E, 0x59, 0x6E76) /* <CJK> */
+MAP(0x5E, 0x5A, 0x6E4D) /* <CJK> */
+MAP(0x5E, 0x5B, 0x6E1F) /* <CJK> */
+MAP(0x5E, 0x5C, 0x6E43) /* <CJK> */
+MAP(0x5E, 0x5D, 0x6E3A) /* <CJK> */
+MAP(0x5E, 0x5E, 0x6E4E) /* <CJK> */
+MAP(0x5E, 0x5F, 0x6E24) /* <CJK> */
+MAP(0x5E, 0x60, 0x6EFF) /* <CJK> */
+MAP(0x5E, 0x61, 0x6E1D) /* <CJK> */
+MAP(0x5E, 0x62, 0x6E38) /* <CJK> */
+MAP(0x5E, 0x63, 0x6E82) /* <CJK> */
+MAP(0x5E, 0x64, 0x6EAA) /* <CJK> */
+MAP(0x5E, 0x65, 0x6E98) /* <CJK> */
+MAP(0x5E, 0x66, 0x6EC9) /* <CJK> */
+MAP(0x5E, 0x67, 0x6EB7) /* <CJK> */
+MAP(0x5E, 0x68, 0x6ED3) /* <CJK> */
+MAP(0x5E, 0x69, 0x6EBD) /* <CJK> */
+MAP(0x5E, 0x6A, 0x6EAF) /* <CJK> */
+MAP(0x5E, 0x6B, 0x6EC4) /* <CJK> */
+MAP(0x5E, 0x6C, 0x6EB2) /* <CJK> */
+MAP(0x5E, 0x6D, 0x6ED4) /* <CJK> */
+MAP(0x5E, 0x6E, 0x6ED5) /* <CJK> */
+MAP(0x5E, 0x6F, 0x6E8F) /* <CJK> */
+MAP(0x5E, 0x70, 0x6EA5) /* <CJK> */
+MAP(0x5E, 0x71, 0x6EC2) /* <CJK> */
+MAP(0x5E, 0x72, 0x6E9F) /* <CJK> */
+MAP(0x5E, 0x73, 0x6F41) /* <CJK> */
+MAP(0x5E, 0x74, 0x6F11) /* <CJK> */
+MAP(0x5E, 0x75, 0x704C) /* <CJK> */
+MAP(0x5E, 0x76, 0x6EEC) /* <CJK> */
+MAP(0x5E, 0x77, 0x6EF8) /* <CJK> */
+MAP(0x5E, 0x78, 0x6EFE) /* <CJK> */
+MAP(0x5E, 0x79, 0x6F3F) /* <CJK> */
+MAP(0x5E, 0x7A, 0x6EF2) /* <CJK> */
+MAP(0x5E, 0x7B, 0x6F31) /* <CJK> */
+MAP(0x5E, 0x7C, 0x6EEF) /* <CJK> */
+MAP(0x5E, 0x7D, 0x6F32) /* <CJK> */
+MAP(0x5E, 0x7E, 0x6ECC) /* <CJK> */
+MAP(0x5F, 0x21, 0x6F3E) /* <CJK> */
+MAP(0x5F, 0x22, 0x6F13) /* <CJK> */
+MAP(0x5F, 0x23, 0x6EF7) /* <CJK> */
+MAP(0x5F, 0x24, 0x6F86) /* <CJK> */
+MAP(0x5F, 0x25, 0x6F7A) /* <CJK> */
+MAP(0x5F, 0x26, 0x6F78) /* <CJK> */
+MAP(0x5F, 0x27, 0x6F81) /* <CJK> */
+MAP(0x5F, 0x28, 0x6F80) /* <CJK> */
+MAP(0x5F, 0x29, 0x6F6F) /* <CJK> */
+MAP(0x5F, 0x2A, 0x6F5B) /* <CJK> */
+MAP(0x5F, 0x2B, 0x6FF3) /* <CJK> */
+MAP(0x5F, 0x2C, 0x6F6D) /* <CJK> */
+MAP(0x5F, 0x2D, 0x6F82) /* <CJK> */
+MAP(0x5F, 0x2E, 0x6F7C) /* <CJK> */
+MAP(0x5F, 0x2F, 0x6F58) /* <CJK> */
+MAP(0x5F, 0x30, 0x6F8E) /* <CJK> */
+MAP(0x5F, 0x31, 0x6F91) /* <CJK> */
+MAP(0x5F, 0x32, 0x6FC2) /* <CJK> */
+MAP(0x5F, 0x33, 0x6F66) /* <CJK> */
+MAP(0x5F, 0x34, 0x6FB3) /* <CJK> */
+MAP(0x5F, 0x35, 0x6FA3) /* <CJK> */
+MAP(0x5F, 0x36, 0x6FA1) /* <CJK> */
+MAP(0x5F, 0x37, 0x6FA4) /* <CJK> */
+MAP(0x5F, 0x38, 0x6FB9) /* <CJK> */
+MAP(0x5F, 0x39, 0x6FC6) /* <CJK> */
+MAP(0x5F, 0x3A, 0x6FAA) /* <CJK> */
+MAP(0x5F, 0x3B, 0x6FDF) /* <CJK> */
+MAP(0x5F, 0x3C, 0x6FD5) /* <CJK> */
+MAP(0x5F, 0x3D, 0x6FEC) /* <CJK> */
+MAP(0x5F, 0x3E, 0x6FD4) /* <CJK> */
+MAP(0x5F, 0x3F, 0x6FD8) /* <CJK> */
+MAP(0x5F, 0x40, 0x6FF1) /* <CJK> */
+MAP(0x5F, 0x41, 0x6FEE) /* <CJK> */
+MAP(0x5F, 0x42, 0x6FDB) /* <CJK> */
+MAP(0x5F, 0x43, 0x7009) /* <CJK> */
+MAP(0x5F, 0x44, 0x700B) /* <CJK> */
+MAP(0x5F, 0x45, 0x6FFA) /* <CJK> */
+MAP(0x5F, 0x46, 0x7011) /* <CJK> */
+MAP(0x5F, 0x47, 0x7001) /* <CJK> */
+MAP(0x5F, 0x48, 0x700F) /* <CJK> */
+MAP(0x5F, 0x49, 0x6FFE) /* <CJK> */
+MAP(0x5F, 0x4A, 0x701B) /* <CJK> */
+MAP(0x5F, 0x4B, 0x701A) /* <CJK> */
+MAP(0x5F, 0x4C, 0x6F74) /* <CJK> */
+MAP(0x5F, 0x4D, 0x701D) /* <CJK> */
+MAP(0x5F, 0x4E, 0x7018) /* <CJK> */
+MAP(0x5F, 0x4F, 0x701F) /* <CJK> */
+MAP(0x5F, 0x50, 0x7030) /* <CJK> */
+MAP(0x5F, 0x51, 0x703E) /* <CJK> */
+MAP(0x5F, 0x52, 0x7032) /* <CJK> */
+MAP(0x5F, 0x53, 0x7051) /* <CJK> */
+MAP(0x5F, 0x54, 0x7063) /* <CJK> */
+MAP(0x5F, 0x55, 0x7099) /* <CJK> */
+MAP(0x5F, 0x56, 0x7092) /* <CJK> */
+MAP(0x5F, 0x57, 0x70AF) /* <CJK> */
+MAP(0x5F, 0x58, 0x70F1) /* <CJK> */
+MAP(0x5F, 0x59, 0x70AC) /* <CJK> */
+MAP(0x5F, 0x5A, 0x70B8) /* <CJK> */
+MAP(0x5F, 0x5B, 0x70B3) /* <CJK> */
+MAP(0x5F, 0x5C, 0x70AE) /* <CJK> */
+MAP(0x5F, 0x5D, 0x70DF) /* <CJK> */
+MAP(0x5F, 0x5E, 0x70CB) /* <CJK> */
+MAP(0x5F, 0x5F, 0x70DD) /* <CJK> */
+MAP(0x5F, 0x60, 0x70D9) /* <CJK> */
+MAP(0x5F, 0x61, 0x7109) /* <CJK> */
+MAP(0x5F, 0x62, 0x70FD) /* <CJK> */
+MAP(0x5F, 0x63, 0x711C) /* <CJK> */
+MAP(0x5F, 0x64, 0x7119) /* <CJK> */
+MAP(0x5F, 0x65, 0x7165) /* <CJK> */
+MAP(0x5F, 0x66, 0x7155) /* <CJK> */
+MAP(0x5F, 0x67, 0x7188) /* <CJK> */
+MAP(0x5F, 0x68, 0x7166) /* <CJK> */
+MAP(0x5F, 0x69, 0x7162) /* <CJK> */
+MAP(0x5F, 0x6A, 0x714C) /* <CJK> */
+MAP(0x5F, 0x6B, 0x7156) /* <CJK> */
+MAP(0x5F, 0x6C, 0x716C) /* <CJK> */
+MAP(0x5F, 0x6D, 0x718F) /* <CJK> */
+MAP(0x5F, 0x6E, 0x71FB) /* <CJK> */
+MAP(0x5F, 0x6F, 0x7184) /* <CJK> */
+MAP(0x5F, 0x70, 0x7195) /* <CJK> */
+MAP(0x5F, 0x71, 0x71A8) /* <CJK> */
+MAP(0x5F, 0x72, 0x71AC) /* <CJK> */
+MAP(0x5F, 0x73, 0x71D7) /* <CJK> */
+MAP(0x5F, 0x74, 0x71B9) /* <CJK> */
+MAP(0x5F, 0x75, 0x71BE) /* <CJK> */
+MAP(0x5F, 0x76, 0x71D2) /* <CJK> */
+MAP(0x5F, 0x77, 0x71C9) /* <CJK> */
+MAP(0x5F, 0x78, 0x71D4) /* <CJK> */
+MAP(0x5F, 0x79, 0x71CE) /* <CJK> */
+MAP(0x5F, 0x7A, 0x71E0) /* <CJK> */
+MAP(0x5F, 0x7B, 0x71EC) /* <CJK> */
+MAP(0x5F, 0x7C, 0x71E7) /* <CJK> */
+MAP(0x5F, 0x7D, 0x71F5) /* <CJK> */
+MAP(0x5F, 0x7E, 0x71FC) /* <CJK> */
+MAP(0x60, 0x21, 0x71F9) /* <CJK> */
+MAP(0x60, 0x22, 0x71FF) /* <CJK> */
+MAP(0x60, 0x23, 0x720D) /* <CJK> */
+MAP(0x60, 0x24, 0x7210) /* <CJK> */
+MAP(0x60, 0x25, 0x721B) /* <CJK> */
+MAP(0x60, 0x26, 0x7228) /* <CJK> */
+MAP(0x60, 0x27, 0x722D) /* <CJK> */
+MAP(0x60, 0x28, 0x722C) /* <CJK> */
+MAP(0x60, 0x29, 0x7230) /* <CJK> */
+MAP(0x60, 0x2A, 0x7232) /* <CJK> */
+MAP(0x60, 0x2B, 0x723B) /* <CJK> */
+MAP(0x60, 0x2C, 0x723C) /* <CJK> */
+MAP(0x60, 0x2D, 0x723F) /* <CJK> */
+MAP(0x60, 0x2E, 0x7240) /* <CJK> */
+MAP(0x60, 0x2F, 0x7246) /* <CJK> */
+MAP(0x60, 0x30, 0x724B) /* <CJK> */
+MAP(0x60, 0x31, 0x7258) /* <CJK> */
+MAP(0x60, 0x32, 0x7274) /* <CJK> */
+MAP(0x60, 0x33, 0x727E) /* <CJK> */
+MAP(0x60, 0x34, 0x7282) /* <CJK> */
+MAP(0x60, 0x35, 0x7281) /* <CJK> */
+MAP(0x60, 0x36, 0x7287) /* <CJK> */
+MAP(0x60, 0x37, 0x7292) /* <CJK> */
+MAP(0x60, 0x38, 0x7296) /* <CJK> */
+MAP(0x60, 0x39, 0x72A2) /* <CJK> */
+MAP(0x60, 0x3A, 0x72A7) /* <CJK> */
+MAP(0x60, 0x3B, 0x72B9) /* <CJK> */
+MAP(0x60, 0x3C, 0x72B2) /* <CJK> */
+MAP(0x60, 0x3D, 0x72C3) /* <CJK> */
+MAP(0x60, 0x3E, 0x72C6) /* <CJK> */
+MAP(0x60, 0x3F, 0x72C4) /* <CJK> */
+MAP(0x60, 0x40, 0x72CE) /* <CJK> */
+MAP(0x60, 0x41, 0x72D2) /* <CJK> */
+MAP(0x60, 0x42, 0x72E2) /* <CJK> */
+MAP(0x60, 0x43, 0x72E0) /* <CJK> */
+MAP(0x60, 0x44, 0x72E1) /* <CJK> */
+MAP(0x60, 0x45, 0x72F9) /* <CJK> */
+MAP(0x60, 0x46, 0x72F7) /* <CJK> */
+MAP(0x60, 0x47, 0x500F) /* <CJK> */
+MAP(0x60, 0x48, 0x7317) /* <CJK> */
+MAP(0x60, 0x49, 0x730A) /* <CJK> */
+MAP(0x60, 0x4A, 0x731C) /* <CJK> */
+MAP(0x60, 0x4B, 0x7316) /* <CJK> */
+MAP(0x60, 0x4C, 0x731D) /* <CJK> */
+MAP(0x60, 0x4D, 0x7334) /* <CJK> */
+MAP(0x60, 0x4E, 0x732F) /* <CJK> */
+MAP(0x60, 0x4F, 0x7329) /* <CJK> */
+MAP(0x60, 0x50, 0x7325) /* <CJK> */
+MAP(0x60, 0x51, 0x733E) /* <CJK> */
+MAP(0x60, 0x52, 0x734E) /* <CJK> */
+MAP(0x60, 0x53, 0x734F) /* <CJK> */
+MAP(0x60, 0x54, 0x9ED8) /* <CJK> */
+MAP(0x60, 0x55, 0x7357) /* <CJK> */
+MAP(0x60, 0x56, 0x736A) /* <CJK> */
+MAP(0x60, 0x57, 0x7368) /* <CJK> */
+MAP(0x60, 0x58, 0x7370) /* <CJK> */
+MAP(0x60, 0x59, 0x7378) /* <CJK> */
+MAP(0x60, 0x5A, 0x7375) /* <CJK> */
+MAP(0x60, 0x5B, 0x737B) /* <CJK> */
+MAP(0x60, 0x5C, 0x737A) /* <CJK> */
+MAP(0x60, 0x5D, 0x73C8) /* <CJK> */
+MAP(0x60, 0x5E, 0x73B3) /* <CJK> */
+MAP(0x60, 0x5F, 0x73CE) /* <CJK> */
+MAP(0x60, 0x60, 0x73BB) /* <CJK> */
+MAP(0x60, 0x61, 0x73C0) /* <CJK> */
+MAP(0x60, 0x62, 0x73E5) /* <CJK> */
+MAP(0x60, 0x63, 0x73EE) /* <CJK> */
+MAP(0x60, 0x64, 0x73DE) /* <CJK> */
+MAP(0x60, 0x65, 0x74A2) /* <CJK> */
+MAP(0x60, 0x66, 0x7405) /* <CJK> */
+MAP(0x60, 0x67, 0x746F) /* <CJK> */
+MAP(0x60, 0x68, 0x7425) /* <CJK> */
+MAP(0x60, 0x69, 0x73F8) /* <CJK> */
+MAP(0x60, 0x6A, 0x7432) /* <CJK> */
+MAP(0x60, 0x6B, 0x743A) /* <CJK> */
+MAP(0x60, 0x6C, 0x7455) /* <CJK> */
+MAP(0x60, 0x6D, 0x743F) /* <CJK> */
+MAP(0x60, 0x6E, 0x745F) /* <CJK> */
+MAP(0x60, 0x6F, 0x7459) /* <CJK> */
+MAP(0x60, 0x70, 0x7441) /* <CJK> */
+MAP(0x60, 0x71, 0x745C) /* <CJK> */
+MAP(0x60, 0x72, 0x7469) /* <CJK> */
+MAP(0x60, 0x73, 0x7470) /* <CJK> */
+MAP(0x60, 0x74, 0x7463) /* <CJK> */
+MAP(0x60, 0x75, 0x746A) /* <CJK> */
+MAP(0x60, 0x76, 0x7476) /* <CJK> */
+MAP(0x60, 0x77, 0x747E) /* <CJK> */
+MAP(0x60, 0x78, 0x748B) /* <CJK> */
+MAP(0x60, 0x79, 0x749E) /* <CJK> */
+MAP(0x60, 0x7A, 0x74A7) /* <CJK> */
+MAP(0x60, 0x7B, 0x74CA) /* <CJK> */
+MAP(0x60, 0x7C, 0x74CF) /* <CJK> */
+MAP(0x60, 0x7D, 0x74D4) /* <CJK> */
+MAP(0x60, 0x7E, 0x73F1) /* <CJK> */
+MAP(0x61, 0x21, 0x74E0) /* <CJK> */
+MAP(0x61, 0x22, 0x74E3) /* <CJK> */
+MAP(0x61, 0x23, 0x74E7) /* <CJK> */
+MAP(0x61, 0x24, 0x74E9) /* <CJK> */
+MAP(0x61, 0x25, 0x74EE) /* <CJK> */
+MAP(0x61, 0x26, 0x74F2) /* <CJK> */
+MAP(0x61, 0x27, 0x74F0) /* <CJK> */
+MAP(0x61, 0x28, 0x74F1) /* <CJK> */
+MAP(0x61, 0x29, 0x74F8) /* <CJK> */
+MAP(0x61, 0x2A, 0x74F7) /* <CJK> */
+MAP(0x61, 0x2B, 0x7504) /* <CJK> */
+MAP(0x61, 0x2C, 0x7503) /* <CJK> */
+MAP(0x61, 0x2D, 0x7505) /* <CJK> */
+MAP(0x61, 0x2E, 0x750C) /* <CJK> */
+MAP(0x61, 0x2F, 0x750E) /* <CJK> */
+MAP(0x61, 0x30, 0x750D) /* <CJK> */
+MAP(0x61, 0x31, 0x7515) /* <CJK> */
+MAP(0x61, 0x32, 0x7513) /* <CJK> */
+MAP(0x61, 0x33, 0x751E) /* <CJK> */
+MAP(0x61, 0x34, 0x7526) /* <CJK> */
+MAP(0x61, 0x35, 0x752C) /* <CJK> */
+MAP(0x61, 0x36, 0x753C) /* <CJK> */
+MAP(0x61, 0x37, 0x7544) /* <CJK> */
+MAP(0x61, 0x38, 0x754D) /* <CJK> */
+MAP(0x61, 0x39, 0x754A) /* <CJK> */
+MAP(0x61, 0x3A, 0x7549) /* <CJK> */
+MAP(0x61, 0x3B, 0x755B) /* <CJK> */
+MAP(0x61, 0x3C, 0x7546) /* <CJK> */
+MAP(0x61, 0x3D, 0x755A) /* <CJK> */
+MAP(0x61, 0x3E, 0x7569) /* <CJK> */
+MAP(0x61, 0x3F, 0x7564) /* <CJK> */
+MAP(0x61, 0x40, 0x7567) /* <CJK> */
+MAP(0x61, 0x41, 0x756B) /* <CJK> */
+MAP(0x61, 0x42, 0x756D) /* <CJK> */
+MAP(0x61, 0x43, 0x7578) /* <CJK> */
+MAP(0x61, 0x44, 0x7576) /* <CJK> */
+MAP(0x61, 0x45, 0x7586) /* <CJK> */
+MAP(0x61, 0x46, 0x7587) /* <CJK> */
+MAP(0x61, 0x47, 0x7574) /* <CJK> */
+MAP(0x61, 0x48, 0x758A) /* <CJK> */
+MAP(0x61, 0x49, 0x7589) /* <CJK> */
+MAP(0x61, 0x4A, 0x7582) /* <CJK> */
+MAP(0x61, 0x4B, 0x7594) /* <CJK> */
+MAP(0x61, 0x4C, 0x759A) /* <CJK> */
+MAP(0x61, 0x4D, 0x759D) /* <CJK> */
+MAP(0x61, 0x4E, 0x75A5) /* <CJK> */
+MAP(0x61, 0x4F, 0x75A3) /* <CJK> */
+MAP(0x61, 0x50, 0x75C2) /* <CJK> */
+MAP(0x61, 0x51, 0x75B3) /* <CJK> */
+MAP(0x61, 0x52, 0x75C3) /* <CJK> */
+MAP(0x61, 0x53, 0x75B5) /* <CJK> */
+MAP(0x61, 0x54, 0x75BD) /* <CJK> */
+MAP(0x61, 0x55, 0x75B8) /* <CJK> */
+MAP(0x61, 0x56, 0x75BC) /* <CJK> */
+MAP(0x61, 0x57, 0x75B1) /* <CJK> */
+MAP(0x61, 0x58, 0x75CD) /* <CJK> */
+MAP(0x61, 0x59, 0x75CA) /* <CJK> */
+MAP(0x61, 0x5A, 0x75D2) /* <CJK> */
+MAP(0x61, 0x5B, 0x75D9) /* <CJK> */
+MAP(0x61, 0x5C, 0x75E3) /* <CJK> */
+MAP(0x61, 0x5D, 0x75DE) /* <CJK> */
+MAP(0x61, 0x5E, 0x75FE) /* <CJK> */
+MAP(0x61, 0x5F, 0x75FF) /* <CJK> */
+MAP(0x61, 0x60, 0x75FC) /* <CJK> */
+MAP(0x61, 0x61, 0x7601) /* <CJK> */
+MAP(0x61, 0x62, 0x75F0) /* <CJK> */
+MAP(0x61, 0x63, 0x75FA) /* <CJK> */
+MAP(0x61, 0x64, 0x75F2) /* <CJK> */
+MAP(0x61, 0x65, 0x75F3) /* <CJK> */
+MAP(0x61, 0x66, 0x760B) /* <CJK> */
+MAP(0x61, 0x67, 0x760D) /* <CJK> */
+MAP(0x61, 0x68, 0x7609) /* <CJK> */
+MAP(0x61, 0x69, 0x761F) /* <CJK> */
+MAP(0x61, 0x6A, 0x7627) /* <CJK> */
+MAP(0x61, 0x6B, 0x7620) /* <CJK> */
+MAP(0x61, 0x6C, 0x7621) /* <CJK> */
+MAP(0x61, 0x6D, 0x7622) /* <CJK> */
+MAP(0x61, 0x6E, 0x7624) /* <CJK> */
+MAP(0x61, 0x6F, 0x7634) /* <CJK> */
+MAP(0x61, 0x70, 0x7630) /* <CJK> */
+MAP(0x61, 0x71, 0x763B) /* <CJK> */
+MAP(0x61, 0x72, 0x7647) /* <CJK> */
+MAP(0x61, 0x73, 0x7648) /* <CJK> */
+MAP(0x61, 0x74, 0x7646) /* <CJK> */
+MAP(0x61, 0x75, 0x765C) /* <CJK> */
+MAP(0x61, 0x76, 0x7658) /* <CJK> */
+MAP(0x61, 0x77, 0x7661) /* <CJK> */
+MAP(0x61, 0x78, 0x7662) /* <CJK> */
+MAP(0x61, 0x79, 0x7668) /* <CJK> */
+MAP(0x61, 0x7A, 0x7669) /* <CJK> */
+MAP(0x61, 0x7B, 0x766A) /* <CJK> */
+MAP(0x61, 0x7C, 0x7667) /* <CJK> */
+MAP(0x61, 0x7D, 0x766C) /* <CJK> */
+MAP(0x61, 0x7E, 0x7670) /* <CJK> */
+MAP(0x62, 0x21, 0x7672) /* <CJK> */
+MAP(0x62, 0x22, 0x7676) /* <CJK> */
+MAP(0x62, 0x23, 0x7678) /* <CJK> */
+MAP(0x62, 0x24, 0x767C) /* <CJK> */
+MAP(0x62, 0x25, 0x7680) /* <CJK> */
+MAP(0x62, 0x26, 0x7683) /* <CJK> */
+MAP(0x62, 0x27, 0x7688) /* <CJK> */
+MAP(0x62, 0x28, 0x768B) /* <CJK> */
+MAP(0x62, 0x29, 0x768E) /* <CJK> */
+MAP(0x62, 0x2A, 0x7696) /* <CJK> */
+MAP(0x62, 0x2B, 0x7693) /* <CJK> */
+MAP(0x62, 0x2C, 0x7699) /* <CJK> */
+MAP(0x62, 0x2D, 0x769A) /* <CJK> */
+MAP(0x62, 0x2E, 0x76B0) /* <CJK> */
+MAP(0x62, 0x2F, 0x76B4) /* <CJK> */
+MAP(0x62, 0x30, 0x76B8) /* <CJK> */
+MAP(0x62, 0x31, 0x76B9) /* <CJK> */
+MAP(0x62, 0x32, 0x76BA) /* <CJK> */
+MAP(0x62, 0x33, 0x76C2) /* <CJK> */
+MAP(0x62, 0x34, 0x76CD) /* <CJK> */
+MAP(0x62, 0x35, 0x76D6) /* <CJK> */
+MAP(0x62, 0x36, 0x76D2) /* <CJK> */
+MAP(0x62, 0x37, 0x76DE) /* <CJK> */
+MAP(0x62, 0x38, 0x76E1) /* <CJK> */
+MAP(0x62, 0x39, 0x76E5) /* <CJK> */
+MAP(0x62, 0x3A, 0x76E7) /* <CJK> */
+MAP(0x62, 0x3B, 0x76EA) /* <CJK> */
+MAP(0x62, 0x3C, 0x862F) /* <CJK> */
+MAP(0x62, 0x3D, 0x76FB) /* <CJK> */
+MAP(0x62, 0x3E, 0x7708) /* <CJK> */
+MAP(0x62, 0x3F, 0x7707) /* <CJK> */
+MAP(0x62, 0x40, 0x7704) /* <CJK> */
+MAP(0x62, 0x41, 0x7729) /* <CJK> */
+MAP(0x62, 0x42, 0x7724) /* <CJK> */
+MAP(0x62, 0x43, 0x771E) /* <CJK> */
+MAP(0x62, 0x44, 0x7725) /* <CJK> */
+MAP(0x62, 0x45, 0x7726) /* <CJK> */
+MAP(0x62, 0x46, 0x771B) /* <CJK> */
+MAP(0x62, 0x47, 0x7737) /* <CJK> */
+MAP(0x62, 0x48, 0x7738) /* <CJK> */
+MAP(0x62, 0x49, 0x7747) /* <CJK> */
+MAP(0x62, 0x4A, 0x775A) /* <CJK> */
+MAP(0x62, 0x4B, 0x7768) /* <CJK> */
+MAP(0x62, 0x4C, 0x776B) /* <CJK> */
+MAP(0x62, 0x4D, 0x775B) /* <CJK> */
+MAP(0x62, 0x4E, 0x7765) /* <CJK> */
+MAP(0x62, 0x4F, 0x777F) /* <CJK> */
+MAP(0x62, 0x50, 0x777E) /* <CJK> */
+MAP(0x62, 0x51, 0x7779) /* <CJK> */
+MAP(0x62, 0x52, 0x778E) /* <CJK> */
+MAP(0x62, 0x53, 0x778B) /* <CJK> */
+MAP(0x62, 0x54, 0x7791) /* <CJK> */
+MAP(0x62, 0x55, 0x77A0) /* <CJK> */
+MAP(0x62, 0x56, 0x779E) /* <CJK> */
+MAP(0x62, 0x57, 0x77B0) /* <CJK> */
+MAP(0x62, 0x58, 0x77B6) /* <CJK> */
+MAP(0x62, 0x59, 0x77B9) /* <CJK> */
+MAP(0x62, 0x5A, 0x77BF) /* <CJK> */
+MAP(0x62, 0x5B, 0x77BC) /* <CJK> */
+MAP(0x62, 0x5C, 0x77BD) /* <CJK> */
+MAP(0x62, 0x5D, 0x77BB) /* <CJK> */
+MAP(0x62, 0x5E, 0x77C7) /* <CJK> */
+MAP(0x62, 0x5F, 0x77CD) /* <CJK> */
+MAP(0x62, 0x60, 0x77D7) /* <CJK> */
+MAP(0x62, 0x61, 0x77DA) /* <CJK> */
+MAP(0x62, 0x62, 0x77DC) /* <CJK> */
+MAP(0x62, 0x63, 0x77E3) /* <CJK> */
+MAP(0x62, 0x64, 0x77EE) /* <CJK> */
+MAP(0x62, 0x65, 0x77FC) /* <CJK> */
+MAP(0x62, 0x66, 0x780C) /* <CJK> */
+MAP(0x62, 0x67, 0x7812) /* <CJK> */
+MAP(0x62, 0x68, 0x7926) /* <CJK> */
+MAP(0x62, 0x69, 0x7820) /* <CJK> */
+MAP(0x62, 0x6A, 0x792A) /* <CJK> */
+MAP(0x62, 0x6B, 0x7845) /* <CJK> */
+MAP(0x62, 0x6C, 0x788E) /* <CJK> */
+MAP(0x62, 0x6D, 0x7874) /* <CJK> */
+MAP(0x62, 0x6E, 0x7886) /* <CJK> */
+MAP(0x62, 0x6F, 0x787C) /* <CJK> */
+MAP(0x62, 0x70, 0x789A) /* <CJK> */
+MAP(0x62, 0x71, 0x788C) /* <CJK> */
+MAP(0x62, 0x72, 0x78A3) /* <CJK> */
+MAP(0x62, 0x73, 0x78B5) /* <CJK> */
+MAP(0x62, 0x74, 0x78AA) /* <CJK> */
+MAP(0x62, 0x75, 0x78AF) /* <CJK> */
+MAP(0x62, 0x76, 0x78D1) /* <CJK> */
+MAP(0x62, 0x77, 0x78C6) /* <CJK> */
+MAP(0x62, 0x78, 0x78CB) /* <CJK> */
+MAP(0x62, 0x79, 0x78D4) /* <CJK> */
+MAP(0x62, 0x7A, 0x78BE) /* <CJK> */
+MAP(0x62, 0x7B, 0x78BC) /* <CJK> */
+MAP(0x62, 0x7C, 0x78C5) /* <CJK> */
+MAP(0x62, 0x7D, 0x78CA) /* <CJK> */
+MAP(0x62, 0x7E, 0x78EC) /* <CJK> */
+MAP(0x63, 0x21, 0x78E7) /* <CJK> */
+MAP(0x63, 0x22, 0x78DA) /* <CJK> */
+MAP(0x63, 0x23, 0x78FD) /* <CJK> */
+MAP(0x63, 0x24, 0x78F4) /* <CJK> */
+MAP(0x63, 0x25, 0x7907) /* <CJK> */
+MAP(0x63, 0x26, 0x7912) /* <CJK> */
+MAP(0x63, 0x27, 0x7911) /* <CJK> */
+MAP(0x63, 0x28, 0x7919) /* <CJK> */
+MAP(0x63, 0x29, 0x792C) /* <CJK> */
+MAP(0x63, 0x2A, 0x792B) /* <CJK> */
+MAP(0x63, 0x2B, 0x7940) /* <CJK> */
+MAP(0x63, 0x2C, 0x7960) /* <CJK> */
+MAP(0x63, 0x2D, 0x7957) /* <CJK> */
+MAP(0x63, 0x2E, 0x795F) /* <CJK> */
+MAP(0x63, 0x2F, 0x795A) /* <CJK> */
+MAP(0x63, 0x30, 0x7955) /* <CJK> */
+MAP(0x63, 0x31, 0x7953) /* <CJK> */
+MAP(0x63, 0x32, 0x797A) /* <CJK> */
+MAP(0x63, 0x33, 0x797F) /* <CJK> */
+MAP(0x63, 0x34, 0x798A) /* <CJK> */
+MAP(0x63, 0x35, 0x799D) /* <CJK> */
+MAP(0x63, 0x36, 0x79A7) /* <CJK> */
+MAP(0x63, 0x37, 0x9F4B) /* <CJK> */
+MAP(0x63, 0x38, 0x79AA) /* <CJK> */
+MAP(0x63, 0x39, 0x79AE) /* <CJK> */
+MAP(0x63, 0x3A, 0x79B3) /* <CJK> */
+MAP(0x63, 0x3B, 0x79B9) /* <CJK> */
+MAP(0x63, 0x3C, 0x79BA) /* <CJK> */
+MAP(0x63, 0x3D, 0x79C9) /* <CJK> */
+MAP(0x63, 0x3E, 0x79D5) /* <CJK> */
+MAP(0x63, 0x3F, 0x79E7) /* <CJK> */
+MAP(0x63, 0x40, 0x79EC) /* <CJK> */
+MAP(0x63, 0x41, 0x79E1) /* <CJK> */
+MAP(0x63, 0x42, 0x79E3) /* <CJK> */
+MAP(0x63, 0x43, 0x7A08) /* <CJK> */
+MAP(0x63, 0x44, 0x7A0D) /* <CJK> */
+MAP(0x63, 0x45, 0x7A18) /* <CJK> */
+MAP(0x63, 0x46, 0x7A19) /* <CJK> */
+MAP(0x63, 0x47, 0x7A20) /* <CJK> */
+MAP(0x63, 0x48, 0x7A1F) /* <CJK> */
+MAP(0x63, 0x49, 0x7980) /* <CJK> */
+MAP(0x63, 0x4A, 0x7A31) /* <CJK> */
+MAP(0x63, 0x4B, 0x7A3B) /* <CJK> */
+MAP(0x63, 0x4C, 0x7A3E) /* <CJK> */
+MAP(0x63, 0x4D, 0x7A37) /* <CJK> */
+MAP(0x63, 0x4E, 0x7A43) /* <CJK> */
+MAP(0x63, 0x4F, 0x7A57) /* <CJK> */
+MAP(0x63, 0x50, 0x7A49) /* <CJK> */
+MAP(0x63, 0x51, 0x7A61) /* <CJK> */
+MAP(0x63, 0x52, 0x7A62) /* <CJK> */
+MAP(0x63, 0x53, 0x7A69) /* <CJK> */
+MAP(0x63, 0x54, 0x9F9D) /* <CJK> */
+MAP(0x63, 0x55, 0x7A70) /* <CJK> */
+MAP(0x63, 0x56, 0x7A79) /* <CJK> */
+MAP(0x63, 0x57, 0x7A7D) /* <CJK> */
+MAP(0x63, 0x58, 0x7A88) /* <CJK> */
+MAP(0x63, 0x59, 0x7A97) /* <CJK> */
+MAP(0x63, 0x5A, 0x7A95) /* <CJK> */
+MAP(0x63, 0x5B, 0x7A98) /* <CJK> */
+MAP(0x63, 0x5C, 0x7A96) /* <CJK> */
+MAP(0x63, 0x5D, 0x7AA9) /* <CJK> */
+MAP(0x63, 0x5E, 0x7AC8) /* <CJK> */
+MAP(0x63, 0x5F, 0x7AB0) /* <CJK> */
+MAP(0x63, 0x60, 0x7AB6) /* <CJK> */
+MAP(0x63, 0x61, 0x7AC5) /* <CJK> */
+MAP(0x63, 0x62, 0x7AC4) /* <CJK> */
+MAP(0x63, 0x63, 0x7ABF) /* <CJK> */
+MAP(0x63, 0x64, 0x9083) /* <CJK> */
+MAP(0x63, 0x65, 0x7AC7) /* <CJK> */
+MAP(0x63, 0x66, 0x7ACA) /* <CJK> */
+MAP(0x63, 0x67, 0x7ACD) /* <CJK> */
+MAP(0x63, 0x68, 0x7ACF) /* <CJK> */
+MAP(0x63, 0x69, 0x7AD5) /* <CJK> */
+MAP(0x63, 0x6A, 0x7AD3) /* <CJK> */
+MAP(0x63, 0x6B, 0x7AD9) /* <CJK> */
+MAP(0x63, 0x6C, 0x7ADA) /* <CJK> */
+MAP(0x63, 0x6D, 0x7ADD) /* <CJK> */
+MAP(0x63, 0x6E, 0x7AE1) /* <CJK> */
+MAP(0x63, 0x6F, 0x7AE2) /* <CJK> */
+MAP(0x63, 0x70, 0x7AE6) /* <CJK> */
+MAP(0x63, 0x71, 0x7AED) /* <CJK> */
+MAP(0x63, 0x72, 0x7AF0) /* <CJK> */
+MAP(0x63, 0x73, 0x7B02) /* <CJK> */
+MAP(0x63, 0x74, 0x7B0F) /* <CJK> */
+MAP(0x63, 0x75, 0x7B0A) /* <CJK> */
+MAP(0x63, 0x76, 0x7B06) /* <CJK> */
+MAP(0x63, 0x77, 0x7B33) /* <CJK> */
+MAP(0x63, 0x78, 0x7B18) /* <CJK> */
+MAP(0x63, 0x79, 0x7B19) /* <CJK> */
+MAP(0x63, 0x7A, 0x7B1E) /* <CJK> */
+MAP(0x63, 0x7B, 0x7B35) /* <CJK> */
+MAP(0x63, 0x7C, 0x7B28) /* <CJK> */
+MAP(0x63, 0x7D, 0x7B36) /* <CJK> */
+MAP(0x63, 0x7E, 0x7B50) /* <CJK> */
+MAP(0x64, 0x21, 0x7B7A) /* <CJK> */
+MAP(0x64, 0x22, 0x7B04) /* <CJK> */
+MAP(0x64, 0x23, 0x7B4D) /* <CJK> */
+MAP(0x64, 0x24, 0x7B0B) /* <CJK> */
+MAP(0x64, 0x25, 0x7B4C) /* <CJK> */
+MAP(0x64, 0x26, 0x7B45) /* <CJK> */
+MAP(0x64, 0x27, 0x7B75) /* <CJK> */
+MAP(0x64, 0x28, 0x7B65) /* <CJK> */
+MAP(0x64, 0x29, 0x7B74) /* <CJK> */
+MAP(0x64, 0x2A, 0x7B67) /* <CJK> */
+MAP(0x64, 0x2B, 0x7B70) /* <CJK> */
+MAP(0x64, 0x2C, 0x7B71) /* <CJK> */
+MAP(0x64, 0x2D, 0x7B6C) /* <CJK> */
+MAP(0x64, 0x2E, 0x7B6E) /* <CJK> */
+MAP(0x64, 0x2F, 0x7B9D) /* <CJK> */
+MAP(0x64, 0x30, 0x7B98) /* <CJK> */
+MAP(0x64, 0x31, 0x7B9F) /* <CJK> */
+MAP(0x64, 0x32, 0x7B8D) /* <CJK> */
+MAP(0x64, 0x33, 0x7B9C) /* <CJK> */
+MAP(0x64, 0x34, 0x7B9A) /* <CJK> */
+MAP(0x64, 0x35, 0x7B8B) /* <CJK> */
+MAP(0x64, 0x36, 0x7B92) /* <CJK> */
+MAP(0x64, 0x37, 0x7B8F) /* <CJK> */
+MAP(0x64, 0x38, 0x7B5D) /* <CJK> */
+MAP(0x64, 0x39, 0x7B99) /* <CJK> */
+MAP(0x64, 0x3A, 0x7BCB) /* <CJK> */
+MAP(0x64, 0x3B, 0x7BC1) /* <CJK> */
+MAP(0x64, 0x3C, 0x7BCC) /* <CJK> */
+MAP(0x64, 0x3D, 0x7BCF) /* <CJK> */
+MAP(0x64, 0x3E, 0x7BB4) /* <CJK> */
+MAP(0x64, 0x3F, 0x7BC6) /* <CJK> */
+MAP(0x64, 0x40, 0x7BDD) /* <CJK> */
+MAP(0x64, 0x41, 0x7BE9) /* <CJK> */
+MAP(0x64, 0x42, 0x7C11) /* <CJK> */
+MAP(0x64, 0x43, 0x7C14) /* <CJK> */
+MAP(0x64, 0x44, 0x7BE6) /* <CJK> */
+MAP(0x64, 0x45, 0x7BE5) /* <CJK> */
+MAP(0x64, 0x46, 0x7C60) /* <CJK> */
+MAP(0x64, 0x47, 0x7C00) /* <CJK> */
+MAP(0x64, 0x48, 0x7C07) /* <CJK> */
+MAP(0x64, 0x49, 0x7C13) /* <CJK> */
+MAP(0x64, 0x4A, 0x7BF3) /* <CJK> */
+MAP(0x64, 0x4B, 0x7BF7) /* <CJK> */
+MAP(0x64, 0x4C, 0x7C17) /* <CJK> */
+MAP(0x64, 0x4D, 0x7C0D) /* <CJK> */
+MAP(0x64, 0x4E, 0x7BF6) /* <CJK> */
+MAP(0x64, 0x4F, 0x7C23) /* <CJK> */
+MAP(0x64, 0x50, 0x7C27) /* <CJK> */
+MAP(0x64, 0x51, 0x7C2A) /* <CJK> */
+MAP(0x64, 0x52, 0x7C1F) /* <CJK> */
+MAP(0x64, 0x53, 0x7C37) /* <CJK> */
+MAP(0x64, 0x54, 0x7C2B) /* <CJK> */
+MAP(0x64, 0x55, 0x7C3D) /* <CJK> */
+MAP(0x64, 0x56, 0x7C4C) /* <CJK> */
+MAP(0x64, 0x57, 0x7C43) /* <CJK> */
+MAP(0x64, 0x58, 0x7C54) /* <CJK> */
+MAP(0x64, 0x59, 0x7C4F) /* <CJK> */
+MAP(0x64, 0x5A, 0x7C40) /* <CJK> */
+MAP(0x64, 0x5B, 0x7C50) /* <CJK> */
+MAP(0x64, 0x5C, 0x7C58) /* <CJK> */
+MAP(0x64, 0x5D, 0x7C5F) /* <CJK> */
+MAP(0x64, 0x5E, 0x7C64) /* <CJK> */
+MAP(0x64, 0x5F, 0x7C56) /* <CJK> */
+MAP(0x64, 0x60, 0x7C65) /* <CJK> */
+MAP(0x64, 0x61, 0x7C6C) /* <CJK> */
+MAP(0x64, 0x62, 0x7C75) /* <CJK> */
+MAP(0x64, 0x63, 0x7C83) /* <CJK> */
+MAP(0x64, 0x64, 0x7C90) /* <CJK> */
+MAP(0x64, 0x65, 0x7CA4) /* <CJK> */
+MAP(0x64, 0x66, 0x7CAD) /* <CJK> */
+MAP(0x64, 0x67, 0x7CA2) /* <CJK> */
+MAP(0x64, 0x68, 0x7CAB) /* <CJK> */
+MAP(0x64, 0x69, 0x7CA1) /* <CJK> */
+MAP(0x64, 0x6A, 0x7CA8) /* <CJK> */
+MAP(0x64, 0x6B, 0x7CB3) /* <CJK> */
+MAP(0x64, 0x6C, 0x7CB2) /* <CJK> */
+MAP(0x64, 0x6D, 0x7CB1) /* <CJK> */
+MAP(0x64, 0x6E, 0x7CAE) /* <CJK> */
+MAP(0x64, 0x6F, 0x7CB9) /* <CJK> */
+MAP(0x64, 0x70, 0x7CBD) /* <CJK> */
+MAP(0x64, 0x71, 0x7CC0) /* <CJK> */
+MAP(0x64, 0x72, 0x7CC5) /* <CJK> */
+MAP(0x64, 0x73, 0x7CC2) /* <CJK> */
+MAP(0x64, 0x74, 0x7CD8) /* <CJK> */
+MAP(0x64, 0x75, 0x7CD2) /* <CJK> */
+MAP(0x64, 0x76, 0x7CDC) /* <CJK> */
+MAP(0x64, 0x77, 0x7CE2) /* <CJK> */
+MAP(0x64, 0x78, 0x9B3B) /* <CJK> */
+MAP(0x64, 0x79, 0x7CEF) /* <CJK> */
+MAP(0x64, 0x7A, 0x7CF2) /* <CJK> */
+MAP(0x64, 0x7B, 0x7CF4) /* <CJK> */
+MAP(0x64, 0x7C, 0x7CF6) /* <CJK> */
+MAP(0x64, 0x7D, 0x7CFA) /* <CJK> */
+MAP(0x64, 0x7E, 0x7D06) /* <CJK> */
+MAP(0x65, 0x21, 0x7D02) /* <CJK> */
+MAP(0x65, 0x22, 0x7D1C) /* <CJK> */
+MAP(0x65, 0x23, 0x7D15) /* <CJK> */
+MAP(0x65, 0x24, 0x7D0A) /* <CJK> */
+MAP(0x65, 0x25, 0x7D45) /* <CJK> */
+MAP(0x65, 0x26, 0x7D4B) /* <CJK> */
+MAP(0x65, 0x27, 0x7D2E) /* <CJK> */
+MAP(0x65, 0x28, 0x7D32) /* <CJK> */
+MAP(0x65, 0x29, 0x7D3F) /* <CJK> */
+MAP(0x65, 0x2A, 0x7D35) /* <CJK> */
+MAP(0x65, 0x2B, 0x7D46) /* <CJK> */
+MAP(0x65, 0x2C, 0x7D73) /* <CJK> */
+MAP(0x65, 0x2D, 0x7D56) /* <CJK> */
+MAP(0x65, 0x2E, 0x7D4E) /* <CJK> */
+MAP(0x65, 0x2F, 0x7D72) /* <CJK> */
+MAP(0x65, 0x30, 0x7D68) /* <CJK> */
+MAP(0x65, 0x31, 0x7D6E) /* <CJK> */
+MAP(0x65, 0x32, 0x7D4F) /* <CJK> */
+MAP(0x65, 0x33, 0x7D63) /* <CJK> */
+MAP(0x65, 0x34, 0x7D93) /* <CJK> */
+MAP(0x65, 0x35, 0x7D89) /* <CJK> */
+MAP(0x65, 0x36, 0x7D5B) /* <CJK> */
+MAP(0x65, 0x37, 0x7D8F) /* <CJK> */
+MAP(0x65, 0x38, 0x7D7D) /* <CJK> */
+MAP(0x65, 0x39, 0x7D9B) /* <CJK> */
+MAP(0x65, 0x3A, 0x7DBA) /* <CJK> */
+MAP(0x65, 0x3B, 0x7DAE) /* <CJK> */
+MAP(0x65, 0x3C, 0x7DA3) /* <CJK> */
+MAP(0x65, 0x3D, 0x7DB5) /* <CJK> */
+MAP(0x65, 0x3E, 0x7DC7) /* <CJK> */
+MAP(0x65, 0x3F, 0x7DBD) /* <CJK> */
+MAP(0x65, 0x40, 0x7DAB) /* <CJK> */
+MAP(0x65, 0x41, 0x7E3D) /* <CJK> */
+MAP(0x65, 0x42, 0x7DA2) /* <CJK> */
+MAP(0x65, 0x43, 0x7DAF) /* <CJK> */
+MAP(0x65, 0x44, 0x7DDC) /* <CJK> */
+MAP(0x65, 0x45, 0x7DB8) /* <CJK> */
+MAP(0x65, 0x46, 0x7D9F) /* <CJK> */
+MAP(0x65, 0x47, 0x7DB0) /* <CJK> */
+MAP(0x65, 0x48, 0x7DD8) /* <CJK> */
+MAP(0x65, 0x49, 0x7DDD) /* <CJK> */
+MAP(0x65, 0x4A, 0x7DE4) /* <CJK> */
+MAP(0x65, 0x4B, 0x7DDE) /* <CJK> */
+MAP(0x65, 0x4C, 0x7DFB) /* <CJK> */
+MAP(0x65, 0x4D, 0x7DF2) /* <CJK> */
+MAP(0x65, 0x4E, 0x7DE1) /* <CJK> */
+MAP(0x65, 0x4F, 0x7E05) /* <CJK> */
+MAP(0x65, 0x50, 0x7E0A) /* <CJK> */
+MAP(0x65, 0x51, 0x7E23) /* <CJK> */
+MAP(0x65, 0x52, 0x7E21) /* <CJK> */
+MAP(0x65, 0x53, 0x7E12) /* <CJK> */
+MAP(0x65, 0x54, 0x7E31) /* <CJK> */
+MAP(0x65, 0x55, 0x7E1F) /* <CJK> */
+MAP(0x65, 0x56, 0x7E09) /* <CJK> */
+MAP(0x65, 0x57, 0x7E0B) /* <CJK> */
+MAP(0x65, 0x58, 0x7E22) /* <CJK> */
+MAP(0x65, 0x59, 0x7E46) /* <CJK> */
+MAP(0x65, 0x5A, 0x7E66) /* <CJK> */
+MAP(0x65, 0x5B, 0x7E3B) /* <CJK> */
+MAP(0x65, 0x5C, 0x7E35) /* <CJK> */
+MAP(0x65, 0x5D, 0x7E39) /* <CJK> */
+MAP(0x65, 0x5E, 0x7E43) /* <CJK> */
+MAP(0x65, 0x5F, 0x7E37) /* <CJK> */
+MAP(0x65, 0x60, 0x7E32) /* <CJK> */
+MAP(0x65, 0x61, 0x7E3A) /* <CJK> */
+MAP(0x65, 0x62, 0x7E67) /* <CJK> */
+MAP(0x65, 0x63, 0x7E5D) /* <CJK> */
+MAP(0x65, 0x64, 0x7E56) /* <CJK> */
+MAP(0x65, 0x65, 0x7E5E) /* <CJK> */
+MAP(0x65, 0x66, 0x7E59) /* <CJK> */
+MAP(0x65, 0x67, 0x7E5A) /* <CJK> */
+MAP(0x65, 0x68, 0x7E79) /* <CJK> */
+MAP(0x65, 0x69, 0x7E6A) /* <CJK> */
+MAP(0x65, 0x6A, 0x7E69) /* <CJK> */
+MAP(0x65, 0x6B, 0x7E7C) /* <CJK> */
+MAP(0x65, 0x6C, 0x7E7B) /* <CJK> */
+MAP(0x65, 0x6D, 0x7E83) /* <CJK> */
+MAP(0x65, 0x6E, 0x7DD5) /* <CJK> */
+MAP(0x65, 0x6F, 0x7E7D) /* <CJK> */
+MAP(0x65, 0x70, 0x8FAE) /* <CJK> */
+MAP(0x65, 0x71, 0x7E7F) /* <CJK> */
+MAP(0x65, 0x72, 0x7E88) /* <CJK> */
+MAP(0x65, 0x73, 0x7E89) /* <CJK> */
+MAP(0x65, 0x74, 0x7E8C) /* <CJK> */
+MAP(0x65, 0x75, 0x7E92) /* <CJK> */
+MAP(0x65, 0x76, 0x7E90) /* <CJK> */
+MAP(0x65, 0x77, 0x7E93) /* <CJK> */
+MAP(0x65, 0x78, 0x7E94) /* <CJK> */
+MAP(0x65, 0x79, 0x7E96) /* <CJK> */
+MAP(0x65, 0x7A, 0x7E8E) /* <CJK> */
+MAP(0x65, 0x7B, 0x7E9B) /* <CJK> */
+MAP(0x65, 0x7C, 0x7E9C) /* <CJK> */
+MAP(0x65, 0x7D, 0x7F38) /* <CJK> */
+MAP(0x65, 0x7E, 0x7F3A) /* <CJK> */
+MAP(0x66, 0x21, 0x7F45) /* <CJK> */
+MAP(0x66, 0x22, 0x7F4C) /* <CJK> */
+MAP(0x66, 0x23, 0x7F4D) /* <CJK> */
+MAP(0x66, 0x24, 0x7F4E) /* <CJK> */
+MAP(0x66, 0x25, 0x7F50) /* <CJK> */
+MAP(0x66, 0x26, 0x7F51) /* <CJK> */
+MAP(0x66, 0x27, 0x7F55) /* <CJK> */
+MAP(0x66, 0x28, 0x7F54) /* <CJK> */
+MAP(0x66, 0x29, 0x7F58) /* <CJK> */
+MAP(0x66, 0x2A, 0x7F5F) /* <CJK> */
+MAP(0x66, 0x2B, 0x7F60) /* <CJK> */
+MAP(0x66, 0x2C, 0x7F68) /* <CJK> */
+MAP(0x66, 0x2D, 0x7F69) /* <CJK> */
+MAP(0x66, 0x2E, 0x7F67) /* <CJK> */
+MAP(0x66, 0x2F, 0x7F78) /* <CJK> */
+MAP(0x66, 0x30, 0x7F82) /* <CJK> */
+MAP(0x66, 0x31, 0x7F86) /* <CJK> */
+MAP(0x66, 0x32, 0x7F83) /* <CJK> */
+MAP(0x66, 0x33, 0x7F88) /* <CJK> */
+MAP(0x66, 0x34, 0x7F87) /* <CJK> */
+MAP(0x66, 0x35, 0x7F8C) /* <CJK> */
+MAP(0x66, 0x36, 0x7F94) /* <CJK> */
+MAP(0x66, 0x37, 0x7F9E) /* <CJK> */
+MAP(0x66, 0x38, 0x7F9D) /* <CJK> */
+MAP(0x66, 0x39, 0x7F9A) /* <CJK> */
+MAP(0x66, 0x3A, 0x7FA3) /* <CJK> */
+MAP(0x66, 0x3B, 0x7FAF) /* <CJK> */
+MAP(0x66, 0x3C, 0x7FB2) /* <CJK> */
+MAP(0x66, 0x3D, 0x7FB9) /* <CJK> */
+MAP(0x66, 0x3E, 0x7FAE) /* <CJK> */
+MAP(0x66, 0x3F, 0x7FB6) /* <CJK> */
+MAP(0x66, 0x40, 0x7FB8) /* <CJK> */
+MAP(0x66, 0x41, 0x8B71) /* <CJK> */
+MAP(0x66, 0x42, 0x7FC5) /* <CJK> */
+MAP(0x66, 0x43, 0x7FC6) /* <CJK> */
+MAP(0x66, 0x44, 0x7FCA) /* <CJK> */
+MAP(0x66, 0x45, 0x7FD5) /* <CJK> */
+MAP(0x66, 0x46, 0x7FD4) /* <CJK> */
+MAP(0x66, 0x47, 0x7FE1) /* <CJK> */
+MAP(0x66, 0x48, 0x7FE6) /* <CJK> */
+MAP(0x66, 0x49, 0x7FE9) /* <CJK> */
+MAP(0x66, 0x4A, 0x7FF3) /* <CJK> */
+MAP(0x66, 0x4B, 0x7FF9) /* <CJK> */
+MAP(0x66, 0x4C, 0x98DC) /* <CJK> */
+MAP(0x66, 0x4D, 0x8006) /* <CJK> */
+MAP(0x66, 0x4E, 0x8004) /* <CJK> */
+MAP(0x66, 0x4F, 0x800B) /* <CJK> */
+MAP(0x66, 0x50, 0x8012) /* <CJK> */
+MAP(0x66, 0x51, 0x8018) /* <CJK> */
+MAP(0x66, 0x52, 0x8019) /* <CJK> */
+MAP(0x66, 0x53, 0x801C) /* <CJK> */
+MAP(0x66, 0x54, 0x8021) /* <CJK> */
+MAP(0x66, 0x55, 0x8028) /* <CJK> */
+MAP(0x66, 0x56, 0x803F) /* <CJK> */
+MAP(0x66, 0x57, 0x803B) /* <CJK> */
+MAP(0x66, 0x58, 0x804A) /* <CJK> */
+MAP(0x66, 0x59, 0x8046) /* <CJK> */
+MAP(0x66, 0x5A, 0x8052) /* <CJK> */
+MAP(0x66, 0x5B, 0x8058) /* <CJK> */
+MAP(0x66, 0x5C, 0x805A) /* <CJK> */
+MAP(0x66, 0x5D, 0x805F) /* <CJK> */
+MAP(0x66, 0x5E, 0x8062) /* <CJK> */
+MAP(0x66, 0x5F, 0x8068) /* <CJK> */
+MAP(0x66, 0x60, 0x8073) /* <CJK> */
+MAP(0x66, 0x61, 0x8072) /* <CJK> */
+MAP(0x66, 0x62, 0x8070) /* <CJK> */
+MAP(0x66, 0x63, 0x8076) /* <CJK> */
+MAP(0x66, 0x64, 0x8079) /* <CJK> */
+MAP(0x66, 0x65, 0x807D) /* <CJK> */
+MAP(0x66, 0x66, 0x807F) /* <CJK> */
+MAP(0x66, 0x67, 0x8084) /* <CJK> */
+MAP(0x66, 0x68, 0x8086) /* <CJK> */
+MAP(0x66, 0x69, 0x8085) /* <CJK> */
+MAP(0x66, 0x6A, 0x809B) /* <CJK> */
+MAP(0x66, 0x6B, 0x8093) /* <CJK> */
+MAP(0x66, 0x6C, 0x809A) /* <CJK> */
+MAP(0x66, 0x6D, 0x80AD) /* <CJK> */
+MAP(0x66, 0x6E, 0x5190) /* <CJK> */
+MAP(0x66, 0x6F, 0x80AC) /* <CJK> */
+MAP(0x66, 0x70, 0x80DB) /* <CJK> */
+MAP(0x66, 0x71, 0x80E5) /* <CJK> */
+MAP(0x66, 0x72, 0x80D9) /* <CJK> */
+MAP(0x66, 0x73, 0x80DD) /* <CJK> */
+MAP(0x66, 0x74, 0x80C4) /* <CJK> */
+MAP(0x66, 0x75, 0x80DA) /* <CJK> */
+MAP(0x66, 0x76, 0x80D6) /* <CJK> */
+MAP(0x66, 0x77, 0x8109) /* <CJK> */
+MAP(0x66, 0x78, 0x80EF) /* <CJK> */
+MAP(0x66, 0x79, 0x80F1) /* <CJK> */
+MAP(0x66, 0x7A, 0x811B) /* <CJK> */
+MAP(0x66, 0x7B, 0x8129) /* <CJK> */
+MAP(0x66, 0x7C, 0x8123) /* <CJK> */
+MAP(0x66, 0x7D, 0x812F) /* <CJK> */
+MAP(0x66, 0x7E, 0x814B) /* <CJK> */
+MAP(0x67, 0x21, 0x968B) /* <CJK> */
+MAP(0x67, 0x22, 0x8146) /* <CJK> */
+MAP(0x67, 0x23, 0x813E) /* <CJK> */
+MAP(0x67, 0x24, 0x8153) /* <CJK> */
+MAP(0x67, 0x25, 0x8151) /* <CJK> */
+MAP(0x67, 0x26, 0x80FC) /* <CJK> */
+MAP(0x67, 0x27, 0x8171) /* <CJK> */
+MAP(0x67, 0x28, 0x816E) /* <CJK> */
+MAP(0x67, 0x29, 0x8165) /* <CJK> */
+MAP(0x67, 0x2A, 0x8166) /* <CJK> */
+MAP(0x67, 0x2B, 0x8174) /* <CJK> */
+MAP(0x67, 0x2C, 0x8183) /* <CJK> */
+MAP(0x67, 0x2D, 0x8188) /* <CJK> */
+MAP(0x67, 0x2E, 0x818A) /* <CJK> */
+MAP(0x67, 0x2F, 0x8180) /* <CJK> */
+MAP(0x67, 0x30, 0x8182) /* <CJK> */
+MAP(0x67, 0x31, 0x81A0) /* <CJK> */
+MAP(0x67, 0x32, 0x8195) /* <CJK> */
+MAP(0x67, 0x33, 0x81A4) /* <CJK> */
+MAP(0x67, 0x34, 0x81A3) /* <CJK> */
+MAP(0x67, 0x35, 0x815F) /* <CJK> */
+MAP(0x67, 0x36, 0x8193) /* <CJK> */
+MAP(0x67, 0x37, 0x81A9) /* <CJK> */
+MAP(0x67, 0x38, 0x81B0) /* <CJK> */
+MAP(0x67, 0x39, 0x81B5) /* <CJK> */
+MAP(0x67, 0x3A, 0x81BE) /* <CJK> */
+MAP(0x67, 0x3B, 0x81B8) /* <CJK> */
+MAP(0x67, 0x3C, 0x81BD) /* <CJK> */
+MAP(0x67, 0x3D, 0x81C0) /* <CJK> */
+MAP(0x67, 0x3E, 0x81C2) /* <CJK> */
+MAP(0x67, 0x3F, 0x81BA) /* <CJK> */
+MAP(0x67, 0x40, 0x81C9) /* <CJK> */
+MAP(0x67, 0x41, 0x81CD) /* <CJK> */
+MAP(0x67, 0x42, 0x81D1) /* <CJK> */
+MAP(0x67, 0x43, 0x81D9) /* <CJK> */
+MAP(0x67, 0x44, 0x81D8) /* <CJK> */
+MAP(0x67, 0x45, 0x81C8) /* <CJK> */
+MAP(0x67, 0x46, 0x81DA) /* <CJK> */
+MAP(0x67, 0x47, 0x81DF) /* <CJK> */
+MAP(0x67, 0x48, 0x81E0) /* <CJK> */
+MAP(0x67, 0x49, 0x81E7) /* <CJK> */
+MAP(0x67, 0x4A, 0x81FA) /* <CJK> */
+MAP(0x67, 0x4B, 0x81FB) /* <CJK> */
+MAP(0x67, 0x4C, 0x81FE) /* <CJK> */
+MAP(0x67, 0x4D, 0x8201) /* <CJK> */
+MAP(0x67, 0x4E, 0x8202) /* <CJK> */
+MAP(0x67, 0x4F, 0x8205) /* <CJK> */
+MAP(0x67, 0x50, 0x8207) /* <CJK> */
+MAP(0x67, 0x51, 0x820A) /* <CJK> */
+MAP(0x67, 0x52, 0x820D) /* <CJK> */
+MAP(0x67, 0x53, 0x8210) /* <CJK> */
+MAP(0x67, 0x54, 0x8216) /* <CJK> */
+MAP(0x67, 0x55, 0x8229) /* <CJK> */
+MAP(0x67, 0x56, 0x822B) /* <CJK> */
+MAP(0x67, 0x57, 0x8238) /* <CJK> */
+MAP(0x67, 0x58, 0x8233) /* <CJK> */
+MAP(0x67, 0x59, 0x8240) /* <CJK> */
+MAP(0x67, 0x5A, 0x8259) /* <CJK> */
+MAP(0x67, 0x5B, 0x8258) /* <CJK> */
+MAP(0x67, 0x5C, 0x825D) /* <CJK> */
+MAP(0x67, 0x5D, 0x825A) /* <CJK> */
+MAP(0x67, 0x5E, 0x825F) /* <CJK> */
+MAP(0x67, 0x5F, 0x8264) /* <CJK> */
+MAP(0x67, 0x60, 0x8262) /* <CJK> */
+MAP(0x67, 0x61, 0x8268) /* <CJK> */
+MAP(0x67, 0x62, 0x826A) /* <CJK> */
+MAP(0x67, 0x63, 0x826B) /* <CJK> */
+MAP(0x67, 0x64, 0x822E) /* <CJK> */
+MAP(0x67, 0x65, 0x8271) /* <CJK> */
+MAP(0x67, 0x66, 0x8277) /* <CJK> */
+MAP(0x67, 0x67, 0x8278) /* <CJK> */
+MAP(0x67, 0x68, 0x827E) /* <CJK> */
+MAP(0x67, 0x69, 0x828D) /* <CJK> */
+MAP(0x67, 0x6A, 0x8292) /* <CJK> */
+MAP(0x67, 0x6B, 0x82AB) /* <CJK> */
+MAP(0x67, 0x6C, 0x829F) /* <CJK> */
+MAP(0x67, 0x6D, 0x82BB) /* <CJK> */
+MAP(0x67, 0x6E, 0x82AC) /* <CJK> */
+MAP(0x67, 0x6F, 0x82E1) /* <CJK> */
+MAP(0x67, 0x70, 0x82E3) /* <CJK> */
+MAP(0x67, 0x71, 0x82DF) /* <CJK> */
+MAP(0x67, 0x72, 0x82D2) /* <CJK> */
+MAP(0x67, 0x73, 0x82F4) /* <CJK> */
+MAP(0x67, 0x74, 0x82F3) /* <CJK> */
+MAP(0x67, 0x75, 0x82FA) /* <CJK> */
+MAP(0x67, 0x76, 0x8393) /* <CJK> */
+MAP(0x67, 0x77, 0x8303) /* <CJK> */
+MAP(0x67, 0x78, 0x82FB) /* <CJK> */
+MAP(0x67, 0x79, 0x82F9) /* <CJK> */
+MAP(0x67, 0x7A, 0x82DE) /* <CJK> */
+MAP(0x67, 0x7B, 0x8306) /* <CJK> */
+MAP(0x67, 0x7C, 0x82DC) /* <CJK> */
+MAP(0x67, 0x7D, 0x8309) /* <CJK> */
+MAP(0x67, 0x7E, 0x82D9) /* <CJK> */
+MAP(0x68, 0x21, 0x8335) /* <CJK> */
+MAP(0x68, 0x22, 0x8334) /* <CJK> */
+MAP(0x68, 0x23, 0x8316) /* <CJK> */
+MAP(0x68, 0x24, 0x8332) /* <CJK> */
+MAP(0x68, 0x25, 0x8331) /* <CJK> */
+MAP(0x68, 0x26, 0x8340) /* <CJK> */
+MAP(0x68, 0x27, 0x8339) /* <CJK> */
+MAP(0x68, 0x28, 0x8350) /* <CJK> */
+MAP(0x68, 0x29, 0x8345) /* <CJK> */
+MAP(0x68, 0x2A, 0x832F) /* <CJK> */
+MAP(0x68, 0x2B, 0x832B) /* <CJK> */
+MAP(0x68, 0x2C, 0x8317) /* <CJK> */
+MAP(0x68, 0x2D, 0x8318) /* <CJK> */
+MAP(0x68, 0x2E, 0x8385) /* <CJK> */
+MAP(0x68, 0x2F, 0x839A) /* <CJK> */
+MAP(0x68, 0x30, 0x83AA) /* <CJK> */
+MAP(0x68, 0x31, 0x839F) /* <CJK> */
+MAP(0x68, 0x32, 0x83A2) /* <CJK> */
+MAP(0x68, 0x33, 0x8396) /* <CJK> */
+MAP(0x68, 0x34, 0x8323) /* <CJK> */
+MAP(0x68, 0x35, 0x838E) /* <CJK> */
+MAP(0x68, 0x36, 0x8387) /* <CJK> */
+MAP(0x68, 0x37, 0x838A) /* <CJK> */
+MAP(0x68, 0x38, 0x837C) /* <CJK> */
+MAP(0x68, 0x39, 0x83B5) /* <CJK> */
+MAP(0x68, 0x3A, 0x8373) /* <CJK> */
+MAP(0x68, 0x3B, 0x8375) /* <CJK> */
+MAP(0x68, 0x3C, 0x83A0) /* <CJK> */
+MAP(0x68, 0x3D, 0x8389) /* <CJK> */
+MAP(0x68, 0x3E, 0x83A8) /* <CJK> */
+MAP(0x68, 0x3F, 0x83F4) /* <CJK> */
+MAP(0x68, 0x40, 0x8413) /* <CJK> */
+MAP(0x68, 0x41, 0x83EB) /* <CJK> */
+MAP(0x68, 0x42, 0x83CE) /* <CJK> */
+MAP(0x68, 0x43, 0x83FD) /* <CJK> */
+MAP(0x68, 0x44, 0x8403) /* <CJK> */
+MAP(0x68, 0x45, 0x83D8) /* <CJK> */
+MAP(0x68, 0x46, 0x840B) /* <CJK> */
+MAP(0x68, 0x47, 0x83C1) /* <CJK> */
+MAP(0x68, 0x48, 0x83F7) /* <CJK> */
+MAP(0x68, 0x49, 0x8407) /* <CJK> */
+MAP(0x68, 0x4A, 0x83E0) /* <CJK> */
+MAP(0x68, 0x4B, 0x83F2) /* <CJK> */
+MAP(0x68, 0x4C, 0x840D) /* <CJK> */
+MAP(0x68, 0x4D, 0x8422) /* <CJK> */
+MAP(0x68, 0x4E, 0x8420) /* <CJK> */
+MAP(0x68, 0x4F, 0x83BD) /* <CJK> */
+MAP(0x68, 0x50, 0x8438) /* <CJK> */
+MAP(0x68, 0x51, 0x8506) /* <CJK> */
+MAP(0x68, 0x52, 0x83FB) /* <CJK> */
+MAP(0x68, 0x53, 0x846D) /* <CJK> */
+MAP(0x68, 0x54, 0x842A) /* <CJK> */
+MAP(0x68, 0x55, 0x843C) /* <CJK> */
+MAP(0x68, 0x56, 0x855A) /* <CJK> */
+MAP(0x68, 0x57, 0x8484) /* <CJK> */
+MAP(0x68, 0x58, 0x8477) /* <CJK> */
+MAP(0x68, 0x59, 0x846B) /* <CJK> */
+MAP(0x68, 0x5A, 0x84AD) /* <CJK> */
+MAP(0x68, 0x5B, 0x846E) /* <CJK> */
+MAP(0x68, 0x5C, 0x8482) /* <CJK> */
+MAP(0x68, 0x5D, 0x8469) /* <CJK> */
+MAP(0x68, 0x5E, 0x8446) /* <CJK> */
+MAP(0x68, 0x5F, 0x842C) /* <CJK> */
+MAP(0x68, 0x60, 0x846F) /* <CJK> */
+MAP(0x68, 0x61, 0x8479) /* <CJK> */
+MAP(0x68, 0x62, 0x8435) /* <CJK> */
+MAP(0x68, 0x63, 0x84CA) /* <CJK> */
+MAP(0x68, 0x64, 0x8462) /* <CJK> */
+MAP(0x68, 0x65, 0x84B9) /* <CJK> */
+MAP(0x68, 0x66, 0x84BF) /* <CJK> */
+MAP(0x68, 0x67, 0x849F) /* <CJK> */
+MAP(0x68, 0x68, 0x84D9) /* <CJK> */
+MAP(0x68, 0x69, 0x84CD) /* <CJK> */
+MAP(0x68, 0x6A, 0x84BB) /* <CJK> */
+MAP(0x68, 0x6B, 0x84DA) /* <CJK> */
+MAP(0x68, 0x6C, 0x84D0) /* <CJK> */
+MAP(0x68, 0x6D, 0x84C1) /* <CJK> */
+MAP(0x68, 0x6E, 0x84C6) /* <CJK> */
+MAP(0x68, 0x6F, 0x84D6) /* <CJK> */
+MAP(0x68, 0x70, 0x84A1) /* <CJK> */
+MAP(0x68, 0x71, 0x8521) /* <CJK> */
+MAP(0x68, 0x72, 0x84FF) /* <CJK> */
+MAP(0x68, 0x73, 0x84F4) /* <CJK> */
+MAP(0x68, 0x74, 0x8517) /* <CJK> */
+MAP(0x68, 0x75, 0x8518) /* <CJK> */
+MAP(0x68, 0x76, 0x852C) /* <CJK> */
+MAP(0x68, 0x77, 0x851F) /* <CJK> */
+MAP(0x68, 0x78, 0x8515) /* <CJK> */
+MAP(0x68, 0x79, 0x8514) /* <CJK> */
+MAP(0x68, 0x7A, 0x84FC) /* <CJK> */
+MAP(0x68, 0x7B, 0x8540) /* <CJK> */
+MAP(0x68, 0x7C, 0x8563) /* <CJK> */
+MAP(0x68, 0x7D, 0x8558) /* <CJK> */
+MAP(0x68, 0x7E, 0x8548) /* <CJK> */
+MAP(0x69, 0x21, 0x8541) /* <CJK> */
+MAP(0x69, 0x22, 0x8602) /* <CJK> */
+MAP(0x69, 0x23, 0x854B) /* <CJK> */
+MAP(0x69, 0x24, 0x8555) /* <CJK> */
+MAP(0x69, 0x25, 0x8580) /* <CJK> */
+MAP(0x69, 0x26, 0x85A4) /* <CJK> */
+MAP(0x69, 0x27, 0x8588) /* <CJK> */
+MAP(0x69, 0x28, 0x8591) /* <CJK> */
+MAP(0x69, 0x29, 0x858A) /* <CJK> */
+MAP(0x69, 0x2A, 0x85A8) /* <CJK> */
+MAP(0x69, 0x2B, 0x856D) /* <CJK> */
+MAP(0x69, 0x2C, 0x8594) /* <CJK> */
+MAP(0x69, 0x2D, 0x859B) /* <CJK> */
+MAP(0x69, 0x2E, 0x85EA) /* <CJK> */
+MAP(0x69, 0x2F, 0x8587) /* <CJK> */
+MAP(0x69, 0x30, 0x859C) /* <CJK> */
+MAP(0x69, 0x31, 0x8577) /* <CJK> */
+MAP(0x69, 0x32, 0x857E) /* <CJK> */
+MAP(0x69, 0x33, 0x8590) /* <CJK> */
+MAP(0x69, 0x34, 0x85C9) /* <CJK> */
+MAP(0x69, 0x35, 0x85BA) /* <CJK> */
+MAP(0x69, 0x36, 0x85CF) /* <CJK> */
+MAP(0x69, 0x37, 0x85B9) /* <CJK> */
+MAP(0x69, 0x38, 0x85D0) /* <CJK> */
+MAP(0x69, 0x39, 0x85D5) /* <CJK> */
+MAP(0x69, 0x3A, 0x85DD) /* <CJK> */
+MAP(0x69, 0x3B, 0x85E5) /* <CJK> */
+MAP(0x69, 0x3C, 0x85DC) /* <CJK> */
+MAP(0x69, 0x3D, 0x85F9) /* <CJK> */
+MAP(0x69, 0x3E, 0x860A) /* <CJK> */
+MAP(0x69, 0x3F, 0x8613) /* <CJK> */
+MAP(0x69, 0x40, 0x860B) /* <CJK> */
+MAP(0x69, 0x41, 0x85FE) /* <CJK> */
+MAP(0x69, 0x42, 0x85FA) /* <CJK> */
+MAP(0x69, 0x43, 0x8606) /* <CJK> */
+MAP(0x69, 0x44, 0x8622) /* <CJK> */
+MAP(0x69, 0x45, 0x861A) /* <CJK> */
+MAP(0x69, 0x46, 0x8630) /* <CJK> */
+MAP(0x69, 0x47, 0x863F) /* <CJK> */
+MAP(0x69, 0x48, 0x864D) /* <CJK> */
+MAP(0x69, 0x49, 0x4E55) /* <CJK> */
+MAP(0x69, 0x4A, 0x8654) /* <CJK> */
+MAP(0x69, 0x4B, 0x865F) /* <CJK> */
+MAP(0x69, 0x4C, 0x8667) /* <CJK> */
+MAP(0x69, 0x4D, 0x8671) /* <CJK> */
+MAP(0x69, 0x4E, 0x8693) /* <CJK> */
+MAP(0x69, 0x4F, 0x86A3) /* <CJK> */
+MAP(0x69, 0x50, 0x86A9) /* <CJK> */
+MAP(0x69, 0x51, 0x86AA) /* <CJK> */
+MAP(0x69, 0x52, 0x868B) /* <CJK> */
+MAP(0x69, 0x53, 0x868C) /* <CJK> */
+MAP(0x69, 0x54, 0x86B6) /* <CJK> */
+MAP(0x69, 0x55, 0x86AF) /* <CJK> */
+MAP(0x69, 0x56, 0x86C4) /* <CJK> */
+MAP(0x69, 0x57, 0x86C6) /* <CJK> */
+MAP(0x69, 0x58, 0x86B0) /* <CJK> */
+MAP(0x69, 0x59, 0x86C9) /* <CJK> */
+MAP(0x69, 0x5A, 0x8823) /* <CJK> */
+MAP(0x69, 0x5B, 0x86AB) /* <CJK> */
+MAP(0x69, 0x5C, 0x86D4) /* <CJK> */
+MAP(0x69, 0x5D, 0x86DE) /* <CJK> */
+MAP(0x69, 0x5E, 0x86E9) /* <CJK> */
+MAP(0x69, 0x5F, 0x86EC) /* <CJK> */
+MAP(0x69, 0x60, 0x86DF) /* <CJK> */
+MAP(0x69, 0x61, 0x86DB) /* <CJK> */
+MAP(0x69, 0x62, 0x86EF) /* <CJK> */
+MAP(0x69, 0x63, 0x8712) /* <CJK> */
+MAP(0x69, 0x64, 0x8706) /* <CJK> */
+MAP(0x69, 0x65, 0x8708) /* <CJK> */
+MAP(0x69, 0x66, 0x8700) /* <CJK> */
+MAP(0x69, 0x67, 0x8703) /* <CJK> */
+MAP(0x69, 0x68, 0x86FB) /* <CJK> */
+MAP(0x69, 0x69, 0x8711) /* <CJK> */
+MAP(0x69, 0x6A, 0x8709) /* <CJK> */
+MAP(0x69, 0x6B, 0x870D) /* <CJK> */
+MAP(0x69, 0x6C, 0x86F9) /* <CJK> */
+MAP(0x69, 0x6D, 0x870A) /* <CJK> */
+MAP(0x69, 0x6E, 0x8734) /* <CJK> */
+MAP(0x69, 0x6F, 0x873F) /* <CJK> */
+MAP(0x69, 0x70, 0x8737) /* <CJK> */
+MAP(0x69, 0x71, 0x873B) /* <CJK> */
+MAP(0x69, 0x72, 0x8725) /* <CJK> */
+MAP(0x69, 0x73, 0x8729) /* <CJK> */
+MAP(0x69, 0x74, 0x871A) /* <CJK> */
+MAP(0x69, 0x75, 0x8760) /* <CJK> */
+MAP(0x69, 0x76, 0x875F) /* <CJK> */
+MAP(0x69, 0x77, 0x8778) /* <CJK> */
+MAP(0x69, 0x78, 0x874C) /* <CJK> */
+MAP(0x69, 0x79, 0x874E) /* <CJK> */
+MAP(0x69, 0x7A, 0x8774) /* <CJK> */
+MAP(0x69, 0x7B, 0x8757) /* <CJK> */
+MAP(0x69, 0x7C, 0x8768) /* <CJK> */
+MAP(0x69, 0x7D, 0x876E) /* <CJK> */
+MAP(0x69, 0x7E, 0x8759) /* <CJK> */
+MAP(0x6A, 0x21, 0x8753) /* <CJK> */
+MAP(0x6A, 0x22, 0x8763) /* <CJK> */
+MAP(0x6A, 0x23, 0x876A) /* <CJK> */
+MAP(0x6A, 0x24, 0x8805) /* <CJK> */
+MAP(0x6A, 0x25, 0x87A2) /* <CJK> */
+MAP(0x6A, 0x26, 0x879F) /* <CJK> */
+MAP(0x6A, 0x27, 0x8782) /* <CJK> */
+MAP(0x6A, 0x28, 0x87AF) /* <CJK> */
+MAP(0x6A, 0x29, 0x87CB) /* <CJK> */
+MAP(0x6A, 0x2A, 0x87BD) /* <CJK> */
+MAP(0x6A, 0x2B, 0x87C0) /* <CJK> */
+MAP(0x6A, 0x2C, 0x87D0) /* <CJK> */
+MAP(0x6A, 0x2D, 0x96D6) /* <CJK> */
+MAP(0x6A, 0x2E, 0x87AB) /* <CJK> */
+MAP(0x6A, 0x2F, 0x87C4) /* <CJK> */
+MAP(0x6A, 0x30, 0x87B3) /* <CJK> */
+MAP(0x6A, 0x31, 0x87C7) /* <CJK> */
+MAP(0x6A, 0x32, 0x87C6) /* <CJK> */
+MAP(0x6A, 0x33, 0x87BB) /* <CJK> */
+MAP(0x6A, 0x34, 0x87EF) /* <CJK> */
+MAP(0x6A, 0x35, 0x87F2) /* <CJK> */
+MAP(0x6A, 0x36, 0x87E0) /* <CJK> */
+MAP(0x6A, 0x37, 0x880F) /* <CJK> */
+MAP(0x6A, 0x38, 0x880D) /* <CJK> */
+MAP(0x6A, 0x39, 0x87FE) /* <CJK> */
+MAP(0x6A, 0x3A, 0x87F6) /* <CJK> */
+MAP(0x6A, 0x3B, 0x87F7) /* <CJK> */
+MAP(0x6A, 0x3C, 0x880E) /* <CJK> */
+MAP(0x6A, 0x3D, 0x87D2) /* <CJK> */
+MAP(0x6A, 0x3E, 0x8811) /* <CJK> */
+MAP(0x6A, 0x3F, 0x8816) /* <CJK> */
+MAP(0x6A, 0x40, 0x8815) /* <CJK> */
+MAP(0x6A, 0x41, 0x8822) /* <CJK> */
+MAP(0x6A, 0x42, 0x8821) /* <CJK> */
+MAP(0x6A, 0x43, 0x8831) /* <CJK> */
+MAP(0x6A, 0x44, 0x8836) /* <CJK> */
+MAP(0x6A, 0x45, 0x8839) /* <CJK> */
+MAP(0x6A, 0x46, 0x8827) /* <CJK> */
+MAP(0x6A, 0x47, 0x883B) /* <CJK> */
+MAP(0x6A, 0x48, 0x8844) /* <CJK> */
+MAP(0x6A, 0x49, 0x8842) /* <CJK> */
+MAP(0x6A, 0x4A, 0x8852) /* <CJK> */
+MAP(0x6A, 0x4B, 0x8859) /* <CJK> */
+MAP(0x6A, 0x4C, 0x885E) /* <CJK> */
+MAP(0x6A, 0x4D, 0x8862) /* <CJK> */
+MAP(0x6A, 0x4E, 0x886B) /* <CJK> */
+MAP(0x6A, 0x4F, 0x8881) /* <CJK> */
+MAP(0x6A, 0x50, 0x887E) /* <CJK> */
+MAP(0x6A, 0x51, 0x889E) /* <CJK> */
+MAP(0x6A, 0x52, 0x8875) /* <CJK> */
+MAP(0x6A, 0x53, 0x887D) /* <CJK> */
+MAP(0x6A, 0x54, 0x88B5) /* <CJK> */
+MAP(0x6A, 0x55, 0x8872) /* <CJK> */
+MAP(0x6A, 0x56, 0x8882) /* <CJK> */
+MAP(0x6A, 0x57, 0x8897) /* <CJK> */
+MAP(0x6A, 0x58, 0x8892) /* <CJK> */
+MAP(0x6A, 0x59, 0x88AE) /* <CJK> */
+MAP(0x6A, 0x5A, 0x8899) /* <CJK> */
+MAP(0x6A, 0x5B, 0x88A2) /* <CJK> */
+MAP(0x6A, 0x5C, 0x888D) /* <CJK> */
+MAP(0x6A, 0x5D, 0x88A4) /* <CJK> */
+MAP(0x6A, 0x5E, 0x88B0) /* <CJK> */
+MAP(0x6A, 0x5F, 0x88BF) /* <CJK> */
+MAP(0x6A, 0x60, 0x88B1) /* <CJK> */
+MAP(0x6A, 0x61, 0x88C3) /* <CJK> */
+MAP(0x6A, 0x62, 0x88C4) /* <CJK> */
+MAP(0x6A, 0x63, 0x88D4) /* <CJK> */
+MAP(0x6A, 0x64, 0x88D8) /* <CJK> */
+MAP(0x6A, 0x65, 0x88D9) /* <CJK> */
+MAP(0x6A, 0x66, 0x88DD) /* <CJK> */
+MAP(0x6A, 0x67, 0x88F9) /* <CJK> */
+MAP(0x6A, 0x68, 0x8902) /* <CJK> */
+MAP(0x6A, 0x69, 0x88FC) /* <CJK> */
+MAP(0x6A, 0x6A, 0x88F4) /* <CJK> */
+MAP(0x6A, 0x6B, 0x88E8) /* <CJK> */
+MAP(0x6A, 0x6C, 0x88F2) /* <CJK> */
+MAP(0x6A, 0x6D, 0x8904) /* <CJK> */
+MAP(0x6A, 0x6E, 0x890C) /* <CJK> */
+MAP(0x6A, 0x6F, 0x890A) /* <CJK> */
+MAP(0x6A, 0x70, 0x8913) /* <CJK> */
+MAP(0x6A, 0x71, 0x8943) /* <CJK> */
+MAP(0x6A, 0x72, 0x891E) /* <CJK> */
+MAP(0x6A, 0x73, 0x8925) /* <CJK> */
+MAP(0x6A, 0x74, 0x892A) /* <CJK> */
+MAP(0x6A, 0x75, 0x892B) /* <CJK> */
+MAP(0x6A, 0x76, 0x8941) /* <CJK> */
+MAP(0x6A, 0x77, 0x8944) /* <CJK> */
+MAP(0x6A, 0x78, 0x893B) /* <CJK> */
+MAP(0x6A, 0x79, 0x8936) /* <CJK> */
+MAP(0x6A, 0x7A, 0x8938) /* <CJK> */
+MAP(0x6A, 0x7B, 0x894C) /* <CJK> */
+MAP(0x6A, 0x7C, 0x891D) /* <CJK> */
+MAP(0x6A, 0x7D, 0x8960) /* <CJK> */
+MAP(0x6A, 0x7E, 0x895E) /* <CJK> */
+MAP(0x6B, 0x21, 0x8966) /* <CJK> */
+MAP(0x6B, 0x22, 0x8964) /* <CJK> */
+MAP(0x6B, 0x23, 0x896D) /* <CJK> */
+MAP(0x6B, 0x24, 0x896A) /* <CJK> */
+MAP(0x6B, 0x25, 0x896F) /* <CJK> */
+MAP(0x6B, 0x26, 0x8974) /* <CJK> */
+MAP(0x6B, 0x27, 0x8977) /* <CJK> */
+MAP(0x6B, 0x28, 0x897E) /* <CJK> */
+MAP(0x6B, 0x29, 0x8983) /* <CJK> */
+MAP(0x6B, 0x2A, 0x8988) /* <CJK> */
+MAP(0x6B, 0x2B, 0x898A) /* <CJK> */
+MAP(0x6B, 0x2C, 0x8993) /* <CJK> */
+MAP(0x6B, 0x2D, 0x8998) /* <CJK> */
+MAP(0x6B, 0x2E, 0x89A1) /* <CJK> */
+MAP(0x6B, 0x2F, 0x89A9) /* <CJK> */
+MAP(0x6B, 0x30, 0x89A6) /* <CJK> */
+MAP(0x6B, 0x31, 0x89AC) /* <CJK> */
+MAP(0x6B, 0x32, 0x89AF) /* <CJK> */
+MAP(0x6B, 0x33, 0x89B2) /* <CJK> */
+MAP(0x6B, 0x34, 0x89BA) /* <CJK> */
+MAP(0x6B, 0x35, 0x89BD) /* <CJK> */
+MAP(0x6B, 0x36, 0x89BF) /* <CJK> */
+MAP(0x6B, 0x37, 0x89C0) /* <CJK> */
+MAP(0x6B, 0x38, 0x89DA) /* <CJK> */
+MAP(0x6B, 0x39, 0x89DC) /* <CJK> */
+MAP(0x6B, 0x3A, 0x89DD) /* <CJK> */
+MAP(0x6B, 0x3B, 0x89E7) /* <CJK> */
+MAP(0x6B, 0x3C, 0x89F4) /* <CJK> */
+MAP(0x6B, 0x3D, 0x89F8) /* <CJK> */
+MAP(0x6B, 0x3E, 0x8A03) /* <CJK> */
+MAP(0x6B, 0x3F, 0x8A16) /* <CJK> */
+MAP(0x6B, 0x40, 0x8A10) /* <CJK> */
+MAP(0x6B, 0x41, 0x8A0C) /* <CJK> */
+MAP(0x6B, 0x42, 0x8A1B) /* <CJK> */
+MAP(0x6B, 0x43, 0x8A1D) /* <CJK> */
+MAP(0x6B, 0x44, 0x8A25) /* <CJK> */
+MAP(0x6B, 0x45, 0x8A36) /* <CJK> */
+MAP(0x6B, 0x46, 0x8A41) /* <CJK> */
+MAP(0x6B, 0x47, 0x8A5B) /* <CJK> */
+MAP(0x6B, 0x48, 0x8A52) /* <CJK> */
+MAP(0x6B, 0x49, 0x8A46) /* <CJK> */
+MAP(0x6B, 0x4A, 0x8A48) /* <CJK> */
+MAP(0x6B, 0x4B, 0x8A7C) /* <CJK> */
+MAP(0x6B, 0x4C, 0x8A6D) /* <CJK> */
+MAP(0x6B, 0x4D, 0x8A6C) /* <CJK> */
+MAP(0x6B, 0x4E, 0x8A62) /* <CJK> */
+MAP(0x6B, 0x4F, 0x8A85) /* <CJK> */
+MAP(0x6B, 0x50, 0x8A82) /* <CJK> */
+MAP(0x6B, 0x51, 0x8A84) /* <CJK> */
+MAP(0x6B, 0x52, 0x8AA8) /* <CJK> */
+MAP(0x6B, 0x53, 0x8AA1) /* <CJK> */
+MAP(0x6B, 0x54, 0x8A91) /* <CJK> */
+MAP(0x6B, 0x55, 0x8AA5) /* <CJK> */
+MAP(0x6B, 0x56, 0x8AA6) /* <CJK> */
+MAP(0x6B, 0x57, 0x8A9A) /* <CJK> */
+MAP(0x6B, 0x58, 0x8AA3) /* <CJK> */
+MAP(0x6B, 0x59, 0x8AC4) /* <CJK> */
+MAP(0x6B, 0x5A, 0x8ACD) /* <CJK> */
+MAP(0x6B, 0x5B, 0x8AC2) /* <CJK> */
+MAP(0x6B, 0x5C, 0x8ADA) /* <CJK> */
+MAP(0x6B, 0x5D, 0x8AEB) /* <CJK> */
+MAP(0x6B, 0x5E, 0x8AF3) /* <CJK> */
+MAP(0x6B, 0x5F, 0x8AE7) /* <CJK> */
+MAP(0x6B, 0x60, 0x8AE4) /* <CJK> */
+MAP(0x6B, 0x61, 0x8AF1) /* <CJK> */
+MAP(0x6B, 0x62, 0x8B14) /* <CJK> */
+MAP(0x6B, 0x63, 0x8AE0) /* <CJK> */
+MAP(0x6B, 0x64, 0x8AE2) /* <CJK> */
+MAP(0x6B, 0x65, 0x8AF7) /* <CJK> */
+MAP(0x6B, 0x66, 0x8ADE) /* <CJK> */
+MAP(0x6B, 0x67, 0x8ADB) /* <CJK> */
+MAP(0x6B, 0x68, 0x8B0C) /* <CJK> */
+MAP(0x6B, 0x69, 0x8B07) /* <CJK> */
+MAP(0x6B, 0x6A, 0x8B1A) /* <CJK> */
+MAP(0x6B, 0x6B, 0x8AE1) /* <CJK> */
+MAP(0x6B, 0x6C, 0x8B16) /* <CJK> */
+MAP(0x6B, 0x6D, 0x8B10) /* <CJK> */
+MAP(0x6B, 0x6E, 0x8B17) /* <CJK> */
+MAP(0x6B, 0x6F, 0x8B20) /* <CJK> */
+MAP(0x6B, 0x70, 0x8B33) /* <CJK> */
+MAP(0x6B, 0x71, 0x97AB) /* <CJK> */
+MAP(0x6B, 0x72, 0x8B26) /* <CJK> */
+MAP(0x6B, 0x73, 0x8B2B) /* <CJK> */
+MAP(0x6B, 0x74, 0x8B3E) /* <CJK> */
+MAP(0x6B, 0x75, 0x8B28) /* <CJK> */
+MAP(0x6B, 0x76, 0x8B41) /* <CJK> */
+MAP(0x6B, 0x77, 0x8B4C) /* <CJK> */
+MAP(0x6B, 0x78, 0x8B4F) /* <CJK> */
+MAP(0x6B, 0x79, 0x8B4E) /* <CJK> */
+MAP(0x6B, 0x7A, 0x8B49) /* <CJK> */
+MAP(0x6B, 0x7B, 0x8B56) /* <CJK> */
+MAP(0x6B, 0x7C, 0x8B5B) /* <CJK> */
+MAP(0x6B, 0x7D, 0x8B5A) /* <CJK> */
+MAP(0x6B, 0x7E, 0x8B6B) /* <CJK> */
+MAP(0x6C, 0x21, 0x8B5F) /* <CJK> */
+MAP(0x6C, 0x22, 0x8B6C) /* <CJK> */
+MAP(0x6C, 0x23, 0x8B6F) /* <CJK> */
+MAP(0x6C, 0x24, 0x8B74) /* <CJK> */
+MAP(0x6C, 0x25, 0x8B7D) /* <CJK> */
+MAP(0x6C, 0x26, 0x8B80) /* <CJK> */
+MAP(0x6C, 0x27, 0x8B8C) /* <CJK> */
+MAP(0x6C, 0x28, 0x8B8E) /* <CJK> */
+MAP(0x6C, 0x29, 0x8B92) /* <CJK> */
+MAP(0x6C, 0x2A, 0x8B93) /* <CJK> */
+MAP(0x6C, 0x2B, 0x8B96) /* <CJK> */
+MAP(0x6C, 0x2C, 0x8B99) /* <CJK> */
+MAP(0x6C, 0x2D, 0x8B9A) /* <CJK> */
+MAP(0x6C, 0x2E, 0x8C3A) /* <CJK> */
+MAP(0x6C, 0x2F, 0x8C41) /* <CJK> */
+MAP(0x6C, 0x30, 0x8C3F) /* <CJK> */
+MAP(0x6C, 0x31, 0x8C48) /* <CJK> */
+MAP(0x6C, 0x32, 0x8C4C) /* <CJK> */
+MAP(0x6C, 0x33, 0x8C4E) /* <CJK> */
+MAP(0x6C, 0x34, 0x8C50) /* <CJK> */
+MAP(0x6C, 0x35, 0x8C55) /* <CJK> */
+MAP(0x6C, 0x36, 0x8C62) /* <CJK> */
+MAP(0x6C, 0x37, 0x8C6C) /* <CJK> */
+MAP(0x6C, 0x38, 0x8C78) /* <CJK> */
+MAP(0x6C, 0x39, 0x8C7A) /* <CJK> */
+MAP(0x6C, 0x3A, 0x8C82) /* <CJK> */
+MAP(0x6C, 0x3B, 0x8C89) /* <CJK> */
+MAP(0x6C, 0x3C, 0x8C85) /* <CJK> */
+MAP(0x6C, 0x3D, 0x8C8A) /* <CJK> */
+MAP(0x6C, 0x3E, 0x8C8D) /* <CJK> */
+MAP(0x6C, 0x3F, 0x8C8E) /* <CJK> */
+MAP(0x6C, 0x40, 0x8C94) /* <CJK> */
+MAP(0x6C, 0x41, 0x8C7C) /* <CJK> */
+MAP(0x6C, 0x42, 0x8C98) /* <CJK> */
+MAP(0x6C, 0x43, 0x621D) /* <CJK> */
+MAP(0x6C, 0x44, 0x8CAD) /* <CJK> */
+MAP(0x6C, 0x45, 0x8CAA) /* <CJK> */
+MAP(0x6C, 0x46, 0x8CBD) /* <CJK> */
+MAP(0x6C, 0x47, 0x8CB2) /* <CJK> */
+MAP(0x6C, 0x48, 0x8CB3) /* <CJK> */
+MAP(0x6C, 0x49, 0x8CAE) /* <CJK> */
+MAP(0x6C, 0x4A, 0x8CB6) /* <CJK> */
+MAP(0x6C, 0x4B, 0x8CC8) /* <CJK> */
+MAP(0x6C, 0x4C, 0x8CC1) /* <CJK> */
+MAP(0x6C, 0x4D, 0x8CE4) /* <CJK> */
+MAP(0x6C, 0x4E, 0x8CE3) /* <CJK> */
+MAP(0x6C, 0x4F, 0x8CDA) /* <CJK> */
+MAP(0x6C, 0x50, 0x8CFD) /* <CJK> */
+MAP(0x6C, 0x51, 0x8CFA) /* <CJK> */
+MAP(0x6C, 0x52, 0x8CFB) /* <CJK> */
+MAP(0x6C, 0x53, 0x8D04) /* <CJK> */
+MAP(0x6C, 0x54, 0x8D05) /* <CJK> */
+MAP(0x6C, 0x55, 0x8D0A) /* <CJK> */
+MAP(0x6C, 0x56, 0x8D07) /* <CJK> */
+MAP(0x6C, 0x57, 0x8D0F) /* <CJK> */
+MAP(0x6C, 0x58, 0x8D0D) /* <CJK> */
+MAP(0x6C, 0x59, 0x8D10) /* <CJK> */
+MAP(0x6C, 0x5A, 0x9F4E) /* <CJK> */
+MAP(0x6C, 0x5B, 0x8D13) /* <CJK> */
+MAP(0x6C, 0x5C, 0x8CCD) /* <CJK> */
+MAP(0x6C, 0x5D, 0x8D14) /* <CJK> */
+MAP(0x6C, 0x5E, 0x8D16) /* <CJK> */
+MAP(0x6C, 0x5F, 0x8D67) /* <CJK> */
+MAP(0x6C, 0x60, 0x8D6D) /* <CJK> */
+MAP(0x6C, 0x61, 0x8D71) /* <CJK> */
+MAP(0x6C, 0x62, 0x8D73) /* <CJK> */
+MAP(0x6C, 0x63, 0x8D81) /* <CJK> */
+MAP(0x6C, 0x64, 0x8D99) /* <CJK> */
+MAP(0x6C, 0x65, 0x8DC2) /* <CJK> */
+MAP(0x6C, 0x66, 0x8DBE) /* <CJK> */
+MAP(0x6C, 0x67, 0x8DBA) /* <CJK> */
+MAP(0x6C, 0x68, 0x8DCF) /* <CJK> */
+MAP(0x6C, 0x69, 0x8DDA) /* <CJK> */
+MAP(0x6C, 0x6A, 0x8DD6) /* <CJK> */
+MAP(0x6C, 0x6B, 0x8DCC) /* <CJK> */
+MAP(0x6C, 0x6C, 0x8DDB) /* <CJK> */
+MAP(0x6C, 0x6D, 0x8DCB) /* <CJK> */
+MAP(0x6C, 0x6E, 0x8DEA) /* <CJK> */
+MAP(0x6C, 0x6F, 0x8DEB) /* <CJK> */
+MAP(0x6C, 0x70, 0x8DDF) /* <CJK> */
+MAP(0x6C, 0x71, 0x8DE3) /* <CJK> */
+MAP(0x6C, 0x72, 0x8DFC) /* <CJK> */
+MAP(0x6C, 0x73, 0x8E08) /* <CJK> */
+MAP(0x6C, 0x74, 0x8E09) /* <CJK> */
+MAP(0x6C, 0x75, 0x8DFF) /* <CJK> */
+MAP(0x6C, 0x76, 0x8E1D) /* <CJK> */
+MAP(0x6C, 0x77, 0x8E1E) /* <CJK> */
+MAP(0x6C, 0x78, 0x8E10) /* <CJK> */
+MAP(0x6C, 0x79, 0x8E1F) /* <CJK> */
+MAP(0x6C, 0x7A, 0x8E42) /* <CJK> */
+MAP(0x6C, 0x7B, 0x8E35) /* <CJK> */
+MAP(0x6C, 0x7C, 0x8E30) /* <CJK> */
+MAP(0x6C, 0x7D, 0x8E34) /* <CJK> */
+MAP(0x6C, 0x7E, 0x8E4A) /* <CJK> */
+MAP(0x6D, 0x21, 0x8E47) /* <CJK> */
+MAP(0x6D, 0x22, 0x8E49) /* <CJK> */
+MAP(0x6D, 0x23, 0x8E4C) /* <CJK> */
+MAP(0x6D, 0x24, 0x8E50) /* <CJK> */
+MAP(0x6D, 0x25, 0x8E48) /* <CJK> */
+MAP(0x6D, 0x26, 0x8E59) /* <CJK> */
+MAP(0x6D, 0x27, 0x8E64) /* <CJK> */
+MAP(0x6D, 0x28, 0x8E60) /* <CJK> */
+MAP(0x6D, 0x29, 0x8E2A) /* <CJK> */
+MAP(0x6D, 0x2A, 0x8E63) /* <CJK> */
+MAP(0x6D, 0x2B, 0x8E55) /* <CJK> */
+MAP(0x6D, 0x2C, 0x8E76) /* <CJK> */
+MAP(0x6D, 0x2D, 0x8E72) /* <CJK> */
+MAP(0x6D, 0x2E, 0x8E7C) /* <CJK> */
+MAP(0x6D, 0x2F, 0x8E81) /* <CJK> */
+MAP(0x6D, 0x30, 0x8E87) /* <CJK> */
+MAP(0x6D, 0x31, 0x8E85) /* <CJK> */
+MAP(0x6D, 0x32, 0x8E84) /* <CJK> */
+MAP(0x6D, 0x33, 0x8E8B) /* <CJK> */
+MAP(0x6D, 0x34, 0x8E8A) /* <CJK> */
+MAP(0x6D, 0x35, 0x8E93) /* <CJK> */
+MAP(0x6D, 0x36, 0x8E91) /* <CJK> */
+MAP(0x6D, 0x37, 0x8E94) /* <CJK> */
+MAP(0x6D, 0x38, 0x8E99) /* <CJK> */
+MAP(0x6D, 0x39, 0x8EAA) /* <CJK> */
+MAP(0x6D, 0x3A, 0x8EA1) /* <CJK> */
+MAP(0x6D, 0x3B, 0x8EAC) /* <CJK> */
+MAP(0x6D, 0x3C, 0x8EB0) /* <CJK> */
+MAP(0x6D, 0x3D, 0x8EC6) /* <CJK> */
+MAP(0x6D, 0x3E, 0x8EB1) /* <CJK> */
+MAP(0x6D, 0x3F, 0x8EBE) /* <CJK> */
+MAP(0x6D, 0x40, 0x8EC5) /* <CJK> */
+MAP(0x6D, 0x41, 0x8EC8) /* <CJK> */
+MAP(0x6D, 0x42, 0x8ECB) /* <CJK> */
+MAP(0x6D, 0x43, 0x8EDB) /* <CJK> */
+MAP(0x6D, 0x44, 0x8EE3) /* <CJK> */
+MAP(0x6D, 0x45, 0x8EFC) /* <CJK> */
+MAP(0x6D, 0x46, 0x8EFB) /* <CJK> */
+MAP(0x6D, 0x47, 0x8EEB) /* <CJK> */
+MAP(0x6D, 0x48, 0x8EFE) /* <CJK> */
+MAP(0x6D, 0x49, 0x8F0A) /* <CJK> */
+MAP(0x6D, 0x4A, 0x8F05) /* <CJK> */
+MAP(0x6D, 0x4B, 0x8F15) /* <CJK> */
+MAP(0x6D, 0x4C, 0x8F12) /* <CJK> */
+MAP(0x6D, 0x4D, 0x8F19) /* <CJK> */
+MAP(0x6D, 0x4E, 0x8F13) /* <CJK> */
+MAP(0x6D, 0x4F, 0x8F1C) /* <CJK> */
+MAP(0x6D, 0x50, 0x8F1F) /* <CJK> */
+MAP(0x6D, 0x51, 0x8F1B) /* <CJK> */
+MAP(0x6D, 0x52, 0x8F0C) /* <CJK> */
+MAP(0x6D, 0x53, 0x8F26) /* <CJK> */
+MAP(0x6D, 0x54, 0x8F33) /* <CJK> */
+MAP(0x6D, 0x55, 0x8F3B) /* <CJK> */
+MAP(0x6D, 0x56, 0x8F39) /* <CJK> */
+MAP(0x6D, 0x57, 0x8F45) /* <CJK> */
+MAP(0x6D, 0x58, 0x8F42) /* <CJK> */
+MAP(0x6D, 0x59, 0x8F3E) /* <CJK> */
+MAP(0x6D, 0x5A, 0x8F4C) /* <CJK> */
+MAP(0x6D, 0x5B, 0x8F49) /* <CJK> */
+MAP(0x6D, 0x5C, 0x8F46) /* <CJK> */
+MAP(0x6D, 0x5D, 0x8F4E) /* <CJK> */
+MAP(0x6D, 0x5E, 0x8F57) /* <CJK> */
+MAP(0x6D, 0x5F, 0x8F5C) /* <CJK> */
+MAP(0x6D, 0x60, 0x8F62) /* <CJK> */
+MAP(0x6D, 0x61, 0x8F63) /* <CJK> */
+MAP(0x6D, 0x62, 0x8F64) /* <CJK> */
+MAP(0x6D, 0x63, 0x8F9C) /* <CJK> */
+MAP(0x6D, 0x64, 0x8F9F) /* <CJK> */
+MAP(0x6D, 0x65, 0x8FA3) /* <CJK> */
+MAP(0x6D, 0x66, 0x8FAD) /* <CJK> */
+MAP(0x6D, 0x67, 0x8FAF) /* <CJK> */
+MAP(0x6D, 0x68, 0x8FB7) /* <CJK> */
+MAP(0x6D, 0x69, 0x8FDA) /* <CJK> */
+MAP(0x6D, 0x6A, 0x8FE5) /* <CJK> */
+MAP(0x6D, 0x6B, 0x8FE2) /* <CJK> */
+MAP(0x6D, 0x6C, 0x8FEA) /* <CJK> */
+MAP(0x6D, 0x6D, 0x8FEF) /* <CJK> */
+MAP(0x6D, 0x6E, 0x9087) /* <CJK> */
+MAP(0x6D, 0x6F, 0x8FF4) /* <CJK> */
+MAP(0x6D, 0x70, 0x9005) /* <CJK> */
+MAP(0x6D, 0x71, 0x8FF9) /* <CJK> */
+MAP(0x6D, 0x72, 0x8FFA) /* <CJK> */
+MAP(0x6D, 0x73, 0x9011) /* <CJK> */
+MAP(0x6D, 0x74, 0x9015) /* <CJK> */
+MAP(0x6D, 0x75, 0x9021) /* <CJK> */
+MAP(0x6D, 0x76, 0x900D) /* <CJK> */
+MAP(0x6D, 0x77, 0x901E) /* <CJK> */
+MAP(0x6D, 0x78, 0x9016) /* <CJK> */
+MAP(0x6D, 0x79, 0x900B) /* <CJK> */
+MAP(0x6D, 0x7A, 0x9027) /* <CJK> */
+MAP(0x6D, 0x7B, 0x9036) /* <CJK> */
+MAP(0x6D, 0x7C, 0x9035) /* <CJK> */
+MAP(0x6D, 0x7D, 0x9039) /* <CJK> */
+MAP(0x6D, 0x7E, 0x8FF8) /* <CJK> */
+MAP(0x6E, 0x21, 0x904F) /* <CJK> */
+MAP(0x6E, 0x22, 0x9050) /* <CJK> */
+MAP(0x6E, 0x23, 0x9051) /* <CJK> */
+MAP(0x6E, 0x24, 0x9052) /* <CJK> */
+MAP(0x6E, 0x25, 0x900E) /* <CJK> */
+MAP(0x6E, 0x26, 0x9049) /* <CJK> */
+MAP(0x6E, 0x27, 0x903E) /* <CJK> */
+MAP(0x6E, 0x28, 0x9056) /* <CJK> */
+MAP(0x6E, 0x29, 0x9058) /* <CJK> */
+MAP(0x6E, 0x2A, 0x905E) /* <CJK> */
+MAP(0x6E, 0x2B, 0x9068) /* <CJK> */
+MAP(0x6E, 0x2C, 0x906F) /* <CJK> */
+MAP(0x6E, 0x2D, 0x9076) /* <CJK> */
+MAP(0x6E, 0x2E, 0x96A8) /* <CJK> */
+MAP(0x6E, 0x2F, 0x9072) /* <CJK> */
+MAP(0x6E, 0x30, 0x9082) /* <CJK> */
+MAP(0x6E, 0x31, 0x907D) /* <CJK> */
+MAP(0x6E, 0x32, 0x9081) /* <CJK> */
+MAP(0x6E, 0x33, 0x9080) /* <CJK> */
+MAP(0x6E, 0x34, 0x908A) /* <CJK> */
+MAP(0x6E, 0x35, 0x9089) /* <CJK> */
+MAP(0x6E, 0x36, 0x908F) /* <CJK> */
+MAP(0x6E, 0x37, 0x90A8) /* <CJK> */
+MAP(0x6E, 0x38, 0x90AF) /* <CJK> */
+MAP(0x6E, 0x39, 0x90B1) /* <CJK> */
+MAP(0x6E, 0x3A, 0x90B5) /* <CJK> */
+MAP(0x6E, 0x3B, 0x90E2) /* <CJK> */
+MAP(0x6E, 0x3C, 0x90E4) /* <CJK> */
+MAP(0x6E, 0x3D, 0x6248) /* <CJK> */
+MAP(0x6E, 0x3E, 0x90DB) /* <CJK> */
+MAP(0x6E, 0x3F, 0x9102) /* <CJK> */
+MAP(0x6E, 0x40, 0x9112) /* <CJK> */
+MAP(0x6E, 0x41, 0x9119) /* <CJK> */
+MAP(0x6E, 0x42, 0x9132) /* <CJK> */
+MAP(0x6E, 0x43, 0x9130) /* <CJK> */
+MAP(0x6E, 0x44, 0x914A) /* <CJK> */
+MAP(0x6E, 0x45, 0x9156) /* <CJK> */
+MAP(0x6E, 0x46, 0x9158) /* <CJK> */
+MAP(0x6E, 0x47, 0x9163) /* <CJK> */
+MAP(0x6E, 0x48, 0x9165) /* <CJK> */
+MAP(0x6E, 0x49, 0x9169) /* <CJK> */
+MAP(0x6E, 0x4A, 0x9173) /* <CJK> */
+MAP(0x6E, 0x4B, 0x9172) /* <CJK> */
+MAP(0x6E, 0x4C, 0x918B) /* <CJK> */
+MAP(0x6E, 0x4D, 0x9189) /* <CJK> */
+MAP(0x6E, 0x4E, 0x9182) /* <CJK> */
+MAP(0x6E, 0x4F, 0x91A2) /* <CJK> */
+MAP(0x6E, 0x50, 0x91AB) /* <CJK> */
+MAP(0x6E, 0x51, 0x91AF) /* <CJK> */
+MAP(0x6E, 0x52, 0x91AA) /* <CJK> */
+MAP(0x6E, 0x53, 0x91B5) /* <CJK> */
+MAP(0x6E, 0x54, 0x91B4) /* <CJK> */
+MAP(0x6E, 0x55, 0x91BA) /* <CJK> */
+MAP(0x6E, 0x56, 0x91C0) /* <CJK> */
+MAP(0x6E, 0x57, 0x91C1) /* <CJK> */
+MAP(0x6E, 0x58, 0x91C9) /* <CJK> */
+MAP(0x6E, 0x59, 0x91CB) /* <CJK> */
+MAP(0x6E, 0x5A, 0x91D0) /* <CJK> */
+MAP(0x6E, 0x5B, 0x91D6) /* <CJK> */
+MAP(0x6E, 0x5C, 0x91DF) /* <CJK> */
+MAP(0x6E, 0x5D, 0x91E1) /* <CJK> */
+MAP(0x6E, 0x5E, 0x91DB) /* <CJK> */
+MAP(0x6E, 0x5F, 0x91FC) /* <CJK> */
+MAP(0x6E, 0x60, 0x91F5) /* <CJK> */
+MAP(0x6E, 0x61, 0x91F6) /* <CJK> */
+MAP(0x6E, 0x62, 0x921E) /* <CJK> */
+MAP(0x6E, 0x63, 0x91FF) /* <CJK> */
+MAP(0x6E, 0x64, 0x9214) /* <CJK> */
+MAP(0x6E, 0x65, 0x922C) /* <CJK> */
+MAP(0x6E, 0x66, 0x9215) /* <CJK> */
+MAP(0x6E, 0x67, 0x9211) /* <CJK> */
+MAP(0x6E, 0x68, 0x925E) /* <CJK> */
+MAP(0x6E, 0x69, 0x9257) /* <CJK> */
+MAP(0x6E, 0x6A, 0x9245) /* <CJK> */
+MAP(0x6E, 0x6B, 0x9249) /* <CJK> */
+MAP(0x6E, 0x6C, 0x9264) /* <CJK> */
+MAP(0x6E, 0x6D, 0x9248) /* <CJK> */
+MAP(0x6E, 0x6E, 0x9295) /* <CJK> */
+MAP(0x6E, 0x6F, 0x923F) /* <CJK> */
+MAP(0x6E, 0x70, 0x924B) /* <CJK> */
+MAP(0x6E, 0x71, 0x9250) /* <CJK> */
+MAP(0x6E, 0x72, 0x929C) /* <CJK> */
+MAP(0x6E, 0x73, 0x9296) /* <CJK> */
+MAP(0x6E, 0x74, 0x9293) /* <CJK> */
+MAP(0x6E, 0x75, 0x929B) /* <CJK> */
+MAP(0x6E, 0x76, 0x925A) /* <CJK> */
+MAP(0x6E, 0x77, 0x92CF) /* <CJK> */
+MAP(0x6E, 0x78, 0x92B9) /* <CJK> */
+MAP(0x6E, 0x79, 0x92B7) /* <CJK> */
+MAP(0x6E, 0x7A, 0x92E9) /* <CJK> */
+MAP(0x6E, 0x7B, 0x930F) /* <CJK> */
+MAP(0x6E, 0x7C, 0x92FA) /* <CJK> */
+MAP(0x6E, 0x7D, 0x9344) /* <CJK> */
+MAP(0x6E, 0x7E, 0x932E) /* <CJK> */
+MAP(0x6F, 0x21, 0x9319) /* <CJK> */
+MAP(0x6F, 0x22, 0x9322) /* <CJK> */
+MAP(0x6F, 0x23, 0x931A) /* <CJK> */
+MAP(0x6F, 0x24, 0x9323) /* <CJK> */
+MAP(0x6F, 0x25, 0x933A) /* <CJK> */
+MAP(0x6F, 0x26, 0x9335) /* <CJK> */
+MAP(0x6F, 0x27, 0x933B) /* <CJK> */
+MAP(0x6F, 0x28, 0x935C) /* <CJK> */
+MAP(0x6F, 0x29, 0x9360) /* <CJK> */
+MAP(0x6F, 0x2A, 0x937C) /* <CJK> */
+MAP(0x6F, 0x2B, 0x936E) /* <CJK> */
+MAP(0x6F, 0x2C, 0x9356) /* <CJK> */
+MAP(0x6F, 0x2D, 0x93B0) /* <CJK> */
+MAP(0x6F, 0x2E, 0x93AC) /* <CJK> */
+MAP(0x6F, 0x2F, 0x93AD) /* <CJK> */
+MAP(0x6F, 0x30, 0x9394) /* <CJK> */
+MAP(0x6F, 0x31, 0x93B9) /* <CJK> */
+MAP(0x6F, 0x32, 0x93D6) /* <CJK> */
+MAP(0x6F, 0x33, 0x93D7) /* <CJK> */
+MAP(0x6F, 0x34, 0x93E8) /* <CJK> */
+MAP(0x6F, 0x35, 0x93E5) /* <CJK> */
+MAP(0x6F, 0x36, 0x93D8) /* <CJK> */
+MAP(0x6F, 0x37, 0x93C3) /* <CJK> */
+MAP(0x6F, 0x38, 0x93DD) /* <CJK> */
+MAP(0x6F, 0x39, 0x93D0) /* <CJK> */
+MAP(0x6F, 0x3A, 0x93C8) /* <CJK> */
+MAP(0x6F, 0x3B, 0x93E4) /* <CJK> */
+MAP(0x6F, 0x3C, 0x941A) /* <CJK> */
+MAP(0x6F, 0x3D, 0x9414) /* <CJK> */
+MAP(0x6F, 0x3E, 0x9413) /* <CJK> */
+MAP(0x6F, 0x3F, 0x9403) /* <CJK> */
+MAP(0x6F, 0x40, 0x9407) /* <CJK> */
+MAP(0x6F, 0x41, 0x9410) /* <CJK> */
+MAP(0x6F, 0x42, 0x9436) /* <CJK> */
+MAP(0x6F, 0x43, 0x942B) /* <CJK> */
+MAP(0x6F, 0x44, 0x9435) /* <CJK> */
+MAP(0x6F, 0x45, 0x9421) /* <CJK> */
+MAP(0x6F, 0x46, 0x943A) /* <CJK> */
+MAP(0x6F, 0x47, 0x9441) /* <CJK> */
+MAP(0x6F, 0x48, 0x9452) /* <CJK> */
+MAP(0x6F, 0x49, 0x9444) /* <CJK> */
+MAP(0x6F, 0x4A, 0x945B) /* <CJK> */
+MAP(0x6F, 0x4B, 0x9460) /* <CJK> */
+MAP(0x6F, 0x4C, 0x9462) /* <CJK> */
+MAP(0x6F, 0x4D, 0x945E) /* <CJK> */
+MAP(0x6F, 0x4E, 0x946A) /* <CJK> */
+MAP(0x6F, 0x4F, 0x9229) /* <CJK> */
+MAP(0x6F, 0x50, 0x9470) /* <CJK> */
+MAP(0x6F, 0x51, 0x9475) /* <CJK> */
+MAP(0x6F, 0x52, 0x9477) /* <CJK> */
+MAP(0x6F, 0x53, 0x947D) /* <CJK> */
+MAP(0x6F, 0x54, 0x945A) /* <CJK> */
+MAP(0x6F, 0x55, 0x947C) /* <CJK> */
+MAP(0x6F, 0x56, 0x947E) /* <CJK> */
+MAP(0x6F, 0x57, 0x9481) /* <CJK> */
+MAP(0x6F, 0x58, 0x947F) /* <CJK> */
+MAP(0x6F, 0x59, 0x9582) /* <CJK> */
+MAP(0x6F, 0x5A, 0x9587) /* <CJK> */
+MAP(0x6F, 0x5B, 0x958A) /* <CJK> */
+MAP(0x6F, 0x5C, 0x9594) /* <CJK> */
+MAP(0x6F, 0x5D, 0x9596) /* <CJK> */
+MAP(0x6F, 0x5E, 0x9598) /* <CJK> */
+MAP(0x6F, 0x5F, 0x9599) /* <CJK> */
+MAP(0x6F, 0x60, 0x95A0) /* <CJK> */
+MAP(0x6F, 0x61, 0x95A8) /* <CJK> */
+MAP(0x6F, 0x62, 0x95A7) /* <CJK> */
+MAP(0x6F, 0x63, 0x95AD) /* <CJK> */
+MAP(0x6F, 0x64, 0x95BC) /* <CJK> */
+MAP(0x6F, 0x65, 0x95BB) /* <CJK> */
+MAP(0x6F, 0x66, 0x95B9) /* <CJK> */
+MAP(0x6F, 0x67, 0x95BE) /* <CJK> */
+MAP(0x6F, 0x68, 0x95CA) /* <CJK> */
+MAP(0x6F, 0x69, 0x6FF6) /* <CJK> */
+MAP(0x6F, 0x6A, 0x95C3) /* <CJK> */
+MAP(0x6F, 0x6B, 0x95CD) /* <CJK> */
+MAP(0x6F, 0x6C, 0x95CC) /* <CJK> */
+MAP(0x6F, 0x6D, 0x95D5) /* <CJK> */
+MAP(0x6F, 0x6E, 0x95D4) /* <CJK> */
+MAP(0x6F, 0x6F, 0x95D6) /* <CJK> */
+MAP(0x6F, 0x70, 0x95DC) /* <CJK> */
+MAP(0x6F, 0x71, 0x95E1) /* <CJK> */
+MAP(0x6F, 0x72, 0x95E5) /* <CJK> */
+MAP(0x6F, 0x73, 0x95E2) /* <CJK> */
+MAP(0x6F, 0x74, 0x9621) /* <CJK> */
+MAP(0x6F, 0x75, 0x9628) /* <CJK> */
+MAP(0x6F, 0x76, 0x962E) /* <CJK> */
+MAP(0x6F, 0x77, 0x962F) /* <CJK> */
+MAP(0x6F, 0x78, 0x9642) /* <CJK> */
+MAP(0x6F, 0x79, 0x964C) /* <CJK> */
+MAP(0x6F, 0x7A, 0x964F) /* <CJK> */
+MAP(0x6F, 0x7B, 0x964B) /* <CJK> */
+MAP(0x6F, 0x7C, 0x9677) /* <CJK> */
+MAP(0x6F, 0x7D, 0x965C) /* <CJK> */
+MAP(0x6F, 0x7E, 0x965E) /* <CJK> */
+MAP(0x70, 0x21, 0x965D) /* <CJK> */
+MAP(0x70, 0x22, 0x965F) /* <CJK> */
+MAP(0x70, 0x23, 0x9666) /* <CJK> */
+MAP(0x70, 0x24, 0x9672) /* <CJK> */
+MAP(0x70, 0x25, 0x966C) /* <CJK> */
+MAP(0x70, 0x26, 0x968D) /* <CJK> */
+MAP(0x70, 0x27, 0x9698) /* <CJK> */
+MAP(0x70, 0x28, 0x9695) /* <CJK> */
+MAP(0x70, 0x29, 0x9697) /* <CJK> */
+MAP(0x70, 0x2A, 0x96AA) /* <CJK> */
+MAP(0x70, 0x2B, 0x96A7) /* <CJK> */
+MAP(0x70, 0x2C, 0x96B1) /* <CJK> */
+MAP(0x70, 0x2D, 0x96B2) /* <CJK> */
+MAP(0x70, 0x2E, 0x96B0) /* <CJK> */
+MAP(0x70, 0x2F, 0x96B4) /* <CJK> */
+MAP(0x70, 0x30, 0x96B6) /* <CJK> */
+MAP(0x70, 0x31, 0x96B8) /* <CJK> */
+MAP(0x70, 0x32, 0x96B9) /* <CJK> */
+MAP(0x70, 0x33, 0x96CE) /* <CJK> */
+MAP(0x70, 0x34, 0x96CB) /* <CJK> */
+MAP(0x70, 0x35, 0x96C9) /* <CJK> */
+MAP(0x70, 0x36, 0x96CD) /* <CJK> */
+MAP(0x70, 0x37, 0x894D) /* <CJK> */
+MAP(0x70, 0x38, 0x96DC) /* <CJK> */
+MAP(0x70, 0x39, 0x970D) /* <CJK> */
+MAP(0x70, 0x3A, 0x96D5) /* <CJK> */
+MAP(0x70, 0x3B, 0x96F9) /* <CJK> */
+MAP(0x70, 0x3C, 0x9704) /* <CJK> */
+MAP(0x70, 0x3D, 0x9706) /* <CJK> */
+MAP(0x70, 0x3E, 0x9708) /* <CJK> */
+MAP(0x70, 0x3F, 0x9713) /* <CJK> */
+MAP(0x70, 0x40, 0x970E) /* <CJK> */
+MAP(0x70, 0x41, 0x9711) /* <CJK> */
+MAP(0x70, 0x42, 0x970F) /* <CJK> */
+MAP(0x70, 0x43, 0x9716) /* <CJK> */
+MAP(0x70, 0x44, 0x9719) /* <CJK> */
+MAP(0x70, 0x45, 0x9724) /* <CJK> */
+MAP(0x70, 0x46, 0x972A) /* <CJK> */
+MAP(0x70, 0x47, 0x9730) /* <CJK> */
+MAP(0x70, 0x48, 0x9739) /* <CJK> */
+MAP(0x70, 0x49, 0x973D) /* <CJK> */
+MAP(0x70, 0x4A, 0x973E) /* <CJK> */
+MAP(0x70, 0x4B, 0x9744) /* <CJK> */
+MAP(0x70, 0x4C, 0x9746) /* <CJK> */
+MAP(0x70, 0x4D, 0x9748) /* <CJK> */
+MAP(0x70, 0x4E, 0x9742) /* <CJK> */
+MAP(0x70, 0x4F, 0x9749) /* <CJK> */
+MAP(0x70, 0x50, 0x975C) /* <CJK> */
+MAP(0x70, 0x51, 0x9760) /* <CJK> */
+MAP(0x70, 0x52, 0x9764) /* <CJK> */
+MAP(0x70, 0x53, 0x9766) /* <CJK> */
+MAP(0x70, 0x54, 0x9768) /* <CJK> */
+MAP(0x70, 0x55, 0x52D2) /* <CJK> */
+MAP(0x70, 0x56, 0x976B) /* <CJK> */
+MAP(0x70, 0x57, 0x9771) /* <CJK> */
+MAP(0x70, 0x58, 0x9779) /* <CJK> */
+MAP(0x70, 0x59, 0x9785) /* <CJK> */
+MAP(0x70, 0x5A, 0x977C) /* <CJK> */
+MAP(0x70, 0x5B, 0x9781) /* <CJK> */
+MAP(0x70, 0x5C, 0x977A) /* <CJK> */
+MAP(0x70, 0x5D, 0x9786) /* <CJK> */
+MAP(0x70, 0x5E, 0x978B) /* <CJK> */
+MAP(0x70, 0x5F, 0x978F) /* <CJK> */
+MAP(0x70, 0x60, 0x9790) /* <CJK> */
+MAP(0x70, 0x61, 0x979C) /* <CJK> */
+MAP(0x70, 0x62, 0x97A8) /* <CJK> */
+MAP(0x70, 0x63, 0x97A6) /* <CJK> */
+MAP(0x70, 0x64, 0x97A3) /* <CJK> */
+MAP(0x70, 0x65, 0x97B3) /* <CJK> */
+MAP(0x70, 0x66, 0x97B4) /* <CJK> */
+MAP(0x70, 0x67, 0x97C3) /* <CJK> */
+MAP(0x70, 0x68, 0x97C6) /* <CJK> */
+MAP(0x70, 0x69, 0x97C8) /* <CJK> */
+MAP(0x70, 0x6A, 0x97CB) /* <CJK> */
+MAP(0x70, 0x6B, 0x97DC) /* <CJK> */
+MAP(0x70, 0x6C, 0x97ED) /* <CJK> */
+MAP(0x70, 0x6D, 0x9F4F) /* <CJK> */
+MAP(0x70, 0x6E, 0x97F2) /* <CJK> */
+MAP(0x70, 0x6F, 0x7ADF) /* <CJK> */
+MAP(0x70, 0x70, 0x97F6) /* <CJK> */
+MAP(0x70, 0x71, 0x97F5) /* <CJK> */
+MAP(0x70, 0x72, 0x980F) /* <CJK> */
+MAP(0x70, 0x73, 0x980C) /* <CJK> */
+MAP(0x70, 0x74, 0x9838) /* <CJK> */
+MAP(0x70, 0x75, 0x9824) /* <CJK> */
+MAP(0x70, 0x76, 0x9821) /* <CJK> */
+MAP(0x70, 0x77, 0x9837) /* <CJK> */
+MAP(0x70, 0x78, 0x983D) /* <CJK> */
+MAP(0x70, 0x79, 0x9846) /* <CJK> */
+MAP(0x70, 0x7A, 0x984F) /* <CJK> */
+MAP(0x70, 0x7B, 0x984B) /* <CJK> */
+MAP(0x70, 0x7C, 0x986B) /* <CJK> */
+MAP(0x70, 0x7D, 0x986F) /* <CJK> */
+MAP(0x70, 0x7E, 0x9870) /* <CJK> */
+MAP(0x71, 0x21, 0x9871) /* <CJK> */
+MAP(0x71, 0x22, 0x9874) /* <CJK> */
+MAP(0x71, 0x23, 0x9873) /* <CJK> */
+MAP(0x71, 0x24, 0x98AA) /* <CJK> */
+MAP(0x71, 0x25, 0x98AF) /* <CJK> */
+MAP(0x71, 0x26, 0x98B1) /* <CJK> */
+MAP(0x71, 0x27, 0x98B6) /* <CJK> */
+MAP(0x71, 0x28, 0x98C4) /* <CJK> */
+MAP(0x71, 0x29, 0x98C3) /* <CJK> */
+MAP(0x71, 0x2A, 0x98C6) /* <CJK> */
+MAP(0x71, 0x2B, 0x98E9) /* <CJK> */
+MAP(0x71, 0x2C, 0x98EB) /* <CJK> */
+MAP(0x71, 0x2D, 0x9903) /* <CJK> */
+MAP(0x71, 0x2E, 0x9909) /* <CJK> */
+MAP(0x71, 0x2F, 0x9912) /* <CJK> */
+MAP(0x71, 0x30, 0x9914) /* <CJK> */
+MAP(0x71, 0x31, 0x9918) /* <CJK> */
+MAP(0x71, 0x32, 0x9921) /* <CJK> */
+MAP(0x71, 0x33, 0x991D) /* <CJK> */
+MAP(0x71, 0x34, 0x991E) /* <CJK> */
+MAP(0x71, 0x35, 0x9924) /* <CJK> */
+MAP(0x71, 0x36, 0x9920) /* <CJK> */
+MAP(0x71, 0x37, 0x992C) /* <CJK> */
+MAP(0x71, 0x38, 0x992E) /* <CJK> */
+MAP(0x71, 0x39, 0x993D) /* <CJK> */
+MAP(0x71, 0x3A, 0x993E) /* <CJK> */
+MAP(0x71, 0x3B, 0x9942) /* <CJK> */
+MAP(0x71, 0x3C, 0x9949) /* <CJK> */
+MAP(0x71, 0x3D, 0x9945) /* <CJK> */
+MAP(0x71, 0x3E, 0x9950) /* <CJK> */
+MAP(0x71, 0x3F, 0x994B) /* <CJK> */
+MAP(0x71, 0x40, 0x9951) /* <CJK> */
+MAP(0x71, 0x41, 0x9952) /* <CJK> */
+MAP(0x71, 0x42, 0x994C) /* <CJK> */
+MAP(0x71, 0x43, 0x9955) /* <CJK> */
+MAP(0x71, 0x44, 0x9997) /* <CJK> */
+MAP(0x71, 0x45, 0x9998) /* <CJK> */
+MAP(0x71, 0x46, 0x99A5) /* <CJK> */
+MAP(0x71, 0x47, 0x99AD) /* <CJK> */
+MAP(0x71, 0x48, 0x99AE) /* <CJK> */
+MAP(0x71, 0x49, 0x99BC) /* <CJK> */
+MAP(0x71, 0x4A, 0x99DF) /* <CJK> */
+MAP(0x71, 0x4B, 0x99DB) /* <CJK> */
+MAP(0x71, 0x4C, 0x99DD) /* <CJK> */
+MAP(0x71, 0x4D, 0x99D8) /* <CJK> */
+MAP(0x71, 0x4E, 0x99D1) /* <CJK> */
+MAP(0x71, 0x4F, 0x99ED) /* <CJK> */
+MAP(0x71, 0x50, 0x99EE) /* <CJK> */
+MAP(0x71, 0x51, 0x99F1) /* <CJK> */
+MAP(0x71, 0x52, 0x99F2) /* <CJK> */
+MAP(0x71, 0x53, 0x99FB) /* <CJK> */
+MAP(0x71, 0x54, 0x99F8) /* <CJK> */
+MAP(0x71, 0x55, 0x9A01) /* <CJK> */
+MAP(0x71, 0x56, 0x9A0F) /* <CJK> */
+MAP(0x71, 0x57, 0x9A05) /* <CJK> */
+MAP(0x71, 0x58, 0x99E2) /* <CJK> */
+MAP(0x71, 0x59, 0x9A19) /* <CJK> */
+MAP(0x71, 0x5A, 0x9A2B) /* <CJK> */
+MAP(0x71, 0x5B, 0x9A37) /* <CJK> */
+MAP(0x71, 0x5C, 0x9A45) /* <CJK> */
+MAP(0x71, 0x5D, 0x9A42) /* <CJK> */
+MAP(0x71, 0x5E, 0x9A40) /* <CJK> */
+MAP(0x71, 0x5F, 0x9A43) /* <CJK> */
+MAP(0x71, 0x60, 0x9A3E) /* <CJK> */
+MAP(0x71, 0x61, 0x9A55) /* <CJK> */
+MAP(0x71, 0x62, 0x9A4D) /* <CJK> */
+MAP(0x71, 0x63, 0x9A5B) /* <CJK> */
+MAP(0x71, 0x64, 0x9A57) /* <CJK> */
+MAP(0x71, 0x65, 0x9A5F) /* <CJK> */
+MAP(0x71, 0x66, 0x9A62) /* <CJK> */
+MAP(0x71, 0x67, 0x9A65) /* <CJK> */
+MAP(0x71, 0x68, 0x9A64) /* <CJK> */
+MAP(0x71, 0x69, 0x9A69) /* <CJK> */
+MAP(0x71, 0x6A, 0x9A6B) /* <CJK> */
+MAP(0x71, 0x6B, 0x9A6A) /* <CJK> */
+MAP(0x71, 0x6C, 0x9AAD) /* <CJK> */
+MAP(0x71, 0x6D, 0x9AB0) /* <CJK> */
+MAP(0x71, 0x6E, 0x9ABC) /* <CJK> */
+MAP(0x71, 0x6F, 0x9AC0) /* <CJK> */
+MAP(0x71, 0x70, 0x9ACF) /* <CJK> */
+MAP(0x71, 0x71, 0x9AD1) /* <CJK> */
+MAP(0x71, 0x72, 0x9AD3) /* <CJK> */
+MAP(0x71, 0x73, 0x9AD4) /* <CJK> */
+MAP(0x71, 0x74, 0x9ADE) /* <CJK> */
+MAP(0x71, 0x75, 0x9ADF) /* <CJK> */
+MAP(0x71, 0x76, 0x9AE2) /* <CJK> */
+MAP(0x71, 0x77, 0x9AE3) /* <CJK> */
+MAP(0x71, 0x78, 0x9AE6) /* <CJK> */
+MAP(0x71, 0x79, 0x9AEF) /* <CJK> */
+MAP(0x71, 0x7A, 0x9AEB) /* <CJK> */
+MAP(0x71, 0x7B, 0x9AEE) /* <CJK> */
+MAP(0x71, 0x7C, 0x9AF4) /* <CJK> */
+MAP(0x71, 0x7D, 0x9AF1) /* <CJK> */
+MAP(0x71, 0x7E, 0x9AF7) /* <CJK> */
+MAP(0x72, 0x21, 0x9AFB) /* <CJK> */
+MAP(0x72, 0x22, 0x9B06) /* <CJK> */
+MAP(0x72, 0x23, 0x9B18) /* <CJK> */
+MAP(0x72, 0x24, 0x9B1A) /* <CJK> */
+MAP(0x72, 0x25, 0x9B1F) /* <CJK> */
+MAP(0x72, 0x26, 0x9B22) /* <CJK> */
+MAP(0x72, 0x27, 0x9B23) /* <CJK> */
+MAP(0x72, 0x28, 0x9B25) /* <CJK> */
+MAP(0x72, 0x29, 0x9B27) /* <CJK> */
+MAP(0x72, 0x2A, 0x9B28) /* <CJK> */
+MAP(0x72, 0x2B, 0x9B29) /* <CJK> */
+MAP(0x72, 0x2C, 0x9B2A) /* <CJK> */
+MAP(0x72, 0x2D, 0x9B2E) /* <CJK> */
+MAP(0x72, 0x2E, 0x9B2F) /* <CJK> */
+MAP(0x72, 0x2F, 0x9B32) /* <CJK> */
+MAP(0x72, 0x30, 0x9B44) /* <CJK> */
+MAP(0x72, 0x31, 0x9B43) /* <CJK> */
+MAP(0x72, 0x32, 0x9B4F) /* <CJK> */
+MAP(0x72, 0x33, 0x9B4D) /* <CJK> */
+MAP(0x72, 0x34, 0x9B4E) /* <CJK> */
+MAP(0x72, 0x35, 0x9B51) /* <CJK> */
+MAP(0x72, 0x36, 0x9B58) /* <CJK> */
+MAP(0x72, 0x37, 0x9B74) /* <CJK> */
+MAP(0x72, 0x38, 0x9B93) /* <CJK> */
+MAP(0x72, 0x39, 0x9B83) /* <CJK> */
+MAP(0x72, 0x3A, 0x9B91) /* <CJK> */
+MAP(0x72, 0x3B, 0x9B96) /* <CJK> */
+MAP(0x72, 0x3C, 0x9B97) /* <CJK> */
+MAP(0x72, 0x3D, 0x9B9F) /* <CJK> */
+MAP(0x72, 0x3E, 0x9BA0) /* <CJK> */
+MAP(0x72, 0x3F, 0x9BA8) /* <CJK> */
+MAP(0x72, 0x40, 0x9BB4) /* <CJK> */
+MAP(0x72, 0x41, 0x9BC0) /* <CJK> */
+MAP(0x72, 0x42, 0x9BCA) /* <CJK> */
+MAP(0x72, 0x43, 0x9BB9) /* <CJK> */
+MAP(0x72, 0x44, 0x9BC6) /* <CJK> */
+MAP(0x72, 0x45, 0x9BCF) /* <CJK> */
+MAP(0x72, 0x46, 0x9BD1) /* <CJK> */
+MAP(0x72, 0x47, 0x9BD2) /* <CJK> */
+MAP(0x72, 0x48, 0x9BE3) /* <CJK> */
+MAP(0x72, 0x49, 0x9BE2) /* <CJK> */
+MAP(0x72, 0x4A, 0x9BE4) /* <CJK> */
+MAP(0x72, 0x4B, 0x9BD4) /* <CJK> */
+MAP(0x72, 0x4C, 0x9BE1) /* <CJK> */
+MAP(0x72, 0x4D, 0x9C3A) /* <CJK> */
+MAP(0x72, 0x4E, 0x9BF2) /* <CJK> */
+MAP(0x72, 0x4F, 0x9BF1) /* <CJK> */
+MAP(0x72, 0x50, 0x9BF0) /* <CJK> */
+MAP(0x72, 0x51, 0x9C15) /* <CJK> */
+MAP(0x72, 0x52, 0x9C14) /* <CJK> */
+MAP(0x72, 0x53, 0x9C09) /* <CJK> */
+MAP(0x72, 0x54, 0x9C13) /* <CJK> */
+MAP(0x72, 0x55, 0x9C0C) /* <CJK> */
+MAP(0x72, 0x56, 0x9C06) /* <CJK> */
+MAP(0x72, 0x57, 0x9C08) /* <CJK> */
+MAP(0x72, 0x58, 0x9C12) /* <CJK> */
+MAP(0x72, 0x59, 0x9C0A) /* <CJK> */
+MAP(0x72, 0x5A, 0x9C04) /* <CJK> */
+MAP(0x72, 0x5B, 0x9C2E) /* <CJK> */
+MAP(0x72, 0x5C, 0x9C1B) /* <CJK> */
+MAP(0x72, 0x5D, 0x9C25) /* <CJK> */
+MAP(0x72, 0x5E, 0x9C24) /* <CJK> */
+MAP(0x72, 0x5F, 0x9C21) /* <CJK> */
+MAP(0x72, 0x60, 0x9C30) /* <CJK> */
+MAP(0x72, 0x61, 0x9C47) /* <CJK> */
+MAP(0x72, 0x62, 0x9C32) /* <CJK> */
+MAP(0x72, 0x63, 0x9C46) /* <CJK> */
+MAP(0x72, 0x64, 0x9C3E) /* <CJK> */
+MAP(0x72, 0x65, 0x9C5A) /* <CJK> */
+MAP(0x72, 0x66, 0x9C60) /* <CJK> */
+MAP(0x72, 0x67, 0x9C67) /* <CJK> */
+MAP(0x72, 0x68, 0x9C76) /* <CJK> */
+MAP(0x72, 0x69, 0x9C78) /* <CJK> */
+MAP(0x72, 0x6A, 0x9CE7) /* <CJK> */
+MAP(0x72, 0x6B, 0x9CEC) /* <CJK> */
+MAP(0x72, 0x6C, 0x9CF0) /* <CJK> */
+MAP(0x72, 0x6D, 0x9D09) /* <CJK> */
+MAP(0x72, 0x6E, 0x9D08) /* <CJK> */
+MAP(0x72, 0x6F, 0x9CEB) /* <CJK> */
+MAP(0x72, 0x70, 0x9D03) /* <CJK> */
+MAP(0x72, 0x71, 0x9D06) /* <CJK> */
+MAP(0x72, 0x72, 0x9D2A) /* <CJK> */
+MAP(0x72, 0x73, 0x9D26) /* <CJK> */
+MAP(0x72, 0x74, 0x9DAF) /* <CJK> */
+MAP(0x72, 0x75, 0x9D23) /* <CJK> */
+MAP(0x72, 0x76, 0x9D1F) /* <CJK> */
+MAP(0x72, 0x77, 0x9D44) /* <CJK> */
+MAP(0x72, 0x78, 0x9D15) /* <CJK> */
+MAP(0x72, 0x79, 0x9D12) /* <CJK> */
+MAP(0x72, 0x7A, 0x9D41) /* <CJK> */
+MAP(0x72, 0x7B, 0x9D3F) /* <CJK> */
+MAP(0x72, 0x7C, 0x9D3E) /* <CJK> */
+MAP(0x72, 0x7D, 0x9D46) /* <CJK> */
+MAP(0x72, 0x7E, 0x9D48) /* <CJK> */
+MAP(0x73, 0x21, 0x9D5D) /* <CJK> */
+MAP(0x73, 0x22, 0x9D5E) /* <CJK> */
+MAP(0x73, 0x23, 0x9D64) /* <CJK> */
+MAP(0x73, 0x24, 0x9D51) /* <CJK> */
+MAP(0x73, 0x25, 0x9D50) /* <CJK> */
+MAP(0x73, 0x26, 0x9D59) /* <CJK> */
+MAP(0x73, 0x27, 0x9D72) /* <CJK> */
+MAP(0x73, 0x28, 0x9D89) /* <CJK> */
+MAP(0x73, 0x29, 0x9D87) /* <CJK> */
+MAP(0x73, 0x2A, 0x9DAB) /* <CJK> */
+MAP(0x73, 0x2B, 0x9D6F) /* <CJK> */
+MAP(0x73, 0x2C, 0x9D7A) /* <CJK> */
+MAP(0x73, 0x2D, 0x9D9A) /* <CJK> */
+MAP(0x73, 0x2E, 0x9DA4) /* <CJK> */
+MAP(0x73, 0x2F, 0x9DA9) /* <CJK> */
+MAP(0x73, 0x30, 0x9DB2) /* <CJK> */
+MAP(0x73, 0x31, 0x9DC4) /* <CJK> */
+MAP(0x73, 0x32, 0x9DC1) /* <CJK> */
+MAP(0x73, 0x33, 0x9DBB) /* <CJK> */
+MAP(0x73, 0x34, 0x9DB8) /* <CJK> */
+MAP(0x73, 0x35, 0x9DBA) /* <CJK> */
+MAP(0x73, 0x36, 0x9DC6) /* <CJK> */
+MAP(0x73, 0x37, 0x9DCF) /* <CJK> */
+MAP(0x73, 0x38, 0x9DC2) /* <CJK> */
+MAP(0x73, 0x39, 0x9DD9) /* <CJK> */
+MAP(0x73, 0x3A, 0x9DD3) /* <CJK> */
+MAP(0x73, 0x3B, 0x9DF8) /* <CJK> */
+MAP(0x73, 0x3C, 0x9DE6) /* <CJK> */
+MAP(0x73, 0x3D, 0x9DED) /* <CJK> */
+MAP(0x73, 0x3E, 0x9DEF) /* <CJK> */
+MAP(0x73, 0x3F, 0x9DFD) /* <CJK> */
+MAP(0x73, 0x40, 0x9E1A) /* <CJK> */
+MAP(0x73, 0x41, 0x9E1B) /* <CJK> */
+MAP(0x73, 0x42, 0x9E1E) /* <CJK> */
+MAP(0x73, 0x43, 0x9E75) /* <CJK> */
+MAP(0x73, 0x44, 0x9E79) /* <CJK> */
+MAP(0x73, 0x45, 0x9E7D) /* <CJK> */
+MAP(0x73, 0x46, 0x9E81) /* <CJK> */
+MAP(0x73, 0x47, 0x9E88) /* <CJK> */
+MAP(0x73, 0x48, 0x9E8B) /* <CJK> */
+MAP(0x73, 0x49, 0x9E8C) /* <CJK> */
+MAP(0x73, 0x4A, 0x9E92) /* <CJK> */
+MAP(0x73, 0x4B, 0x9E95) /* <CJK> */
+MAP(0x73, 0x4C, 0x9E91) /* <CJK> */
+MAP(0x73, 0x4D, 0x9E9D) /* <CJK> */
+MAP(0x73, 0x4E, 0x9EA5) /* <CJK> */
+MAP(0x73, 0x4F, 0x9EA9) /* <CJK> */
+MAP(0x73, 0x50, 0x9EB8) /* <CJK> */
+MAP(0x73, 0x51, 0x9EAA) /* <CJK> */
+MAP(0x73, 0x52, 0x9EAD) /* <CJK> */
+MAP(0x73, 0x53, 0x9761) /* <CJK> */
+MAP(0x73, 0x54, 0x9ECC) /* <CJK> */
+MAP(0x73, 0x55, 0x9ECE) /* <CJK> */
+MAP(0x73, 0x56, 0x9ECF) /* <CJK> */
+MAP(0x73, 0x57, 0x9ED0) /* <CJK> */
+MAP(0x73, 0x58, 0x9ED4) /* <CJK> */
+MAP(0x73, 0x59, 0x9EDC) /* <CJK> */
+MAP(0x73, 0x5A, 0x9EDE) /* <CJK> */
+MAP(0x73, 0x5B, 0x9EDD) /* <CJK> */
+MAP(0x73, 0x5C, 0x9EE0) /* <CJK> */
+MAP(0x73, 0x5D, 0x9EE5) /* <CJK> */
+MAP(0x73, 0x5E, 0x9EE8) /* <CJK> */
+MAP(0x73, 0x5F, 0x9EEF) /* <CJK> */
+MAP(0x73, 0x60, 0x9EF4) /* <CJK> */
+MAP(0x73, 0x61, 0x9EF6) /* <CJK> */
+MAP(0x73, 0x62, 0x9EF7) /* <CJK> */
+MAP(0x73, 0x63, 0x9EF9) /* <CJK> */
+MAP(0x73, 0x64, 0x9EFB) /* <CJK> */
+MAP(0x73, 0x65, 0x9EFC) /* <CJK> */
+MAP(0x73, 0x66, 0x9EFD) /* <CJK> */
+MAP(0x73, 0x67, 0x9F07) /* <CJK> */
+MAP(0x73, 0x68, 0x9F08) /* <CJK> */
+MAP(0x73, 0x69, 0x76B7) /* <CJK> */
+MAP(0x73, 0x6A, 0x9F15) /* <CJK> */
+MAP(0x73, 0x6B, 0x9F21) /* <CJK> */
+MAP(0x73, 0x6C, 0x9F2C) /* <CJK> */
+MAP(0x73, 0x6D, 0x9F3E) /* <CJK> */
+MAP(0x73, 0x6E, 0x9F4A) /* <CJK> */
+MAP(0x73, 0x6F, 0x9F52) /* <CJK> */
+MAP(0x73, 0x70, 0x9F54) /* <CJK> */
+MAP(0x73, 0x71, 0x9F63) /* <CJK> */
+MAP(0x73, 0x72, 0x9F5F) /* <CJK> */
+MAP(0x73, 0x73, 0x9F60) /* <CJK> */
+MAP(0x73, 0x74, 0x9F61) /* <CJK> */
+MAP(0x73, 0x75, 0x9F66) /* <CJK> */
+MAP(0x73, 0x76, 0x9F67) /* <CJK> */
+MAP(0x73, 0x77, 0x9F6C) /* <CJK> */
+MAP(0x73, 0x78, 0x9F6A) /* <CJK> */
+MAP(0x73, 0x79, 0x9F77) /* <CJK> */
+MAP(0x73, 0x7A, 0x9F72) /* <CJK> */
+MAP(0x73, 0x7B, 0x9F76) /* <CJK> */
+MAP(0x73, 0x7C, 0x9F95) /* <CJK> */
+MAP(0x73, 0x7D, 0x9F9C) /* <CJK> */
+MAP(0x73, 0x7E, 0x9FA0) /* <CJK> */
+MAP(0x74, 0x21, 0x582F) /* <CJK> */
+MAP(0x74, 0x22, 0x69C7) /* <CJK> */
+MAP(0x74, 0x23, 0x9059) /* <CJK> */
+MAP(0x74, 0x24, 0x7464) /* <CJK> */
+MAP(0x74, 0x25, 0x51DC) /* <CJK> */
+MAP(0x74, 0x26, 0x7199) /* <CJK> */
diff --git a/libjava/gnu/gcj/convert/JIS0212.h b/libjava/gnu/gcj/convert/JIS0212.h
index d79c2599e64..215567074bb 100644
--- a/libjava/gnu/gcj/convert/JIS0212.h
+++ b/libjava/gnu/gcj/convert/JIS0212.h
@@ -1,6068 +1,6068 @@
-/* This file is autoamtically generated from Unicode tables */
-MAP(0x22, 0x2F, 0x02D8) /* BREV */
-MAP(0x22, 0x30, 0x02C7) /* CARON (Mandarin Chinese third tone */
-MAP(0x22, 0x31, 0x00B8) /* CEDILL */
-MAP(0x22, 0x32, 0x02D9) /* DOT ABOVE (Mandarin Chinese light tone */
-MAP(0x22, 0x33, 0x02DD) /* DOUBLE ACUTE ACCEN */
-MAP(0x22, 0x34, 0x00AF) /* MACRO */
-MAP(0x22, 0x35, 0x02DB) /* OGONE */
-MAP(0x22, 0x36, 0x02DA) /* RING ABOV */
-MAP(0x22, 0x37, 0x007E) /* TILD */
-MAP(0x22, 0x38, 0x0384) /* GREEK TONO */
-MAP(0x22, 0x39, 0x0385) /* GREEK DIALYTIKA TONO */
-MAP(0x22, 0x42, 0x00A1) /* INVERTED EXCLAMATION MAR */
-MAP(0x22, 0x43, 0x00A6) /* BROKEN BA */
-MAP(0x22, 0x44, 0x00BF) /* INVERTED QUESTION MAR */
-MAP(0x22, 0x6B, 0x00BA) /* MASCULINE ORDINAL INDICATO */
-MAP(0x22, 0x6C, 0x00AA) /* FEMININE ORDINAL INDICATO */
-MAP(0x22, 0x6D, 0x00A9) /* COPYRIGHT SIG */
-MAP(0x22, 0x6E, 0x00AE) /* REGISTERED SIG */
-MAP(0x22, 0x6F, 0x2122) /* TRADE MARK SIG */
-MAP(0x22, 0x70, 0x00A4) /* CURRENCY SIG */
-MAP(0x22, 0x71, 0x2116) /* NUMERO SIG */
-MAP(0x26, 0x61, 0x0386) /* GREEK CAPITAL LETTER ALPHA WITH TONO */
-MAP(0x26, 0x62, 0x0388) /* GREEK CAPITAL LETTER EPSILON WITH TONO */
-MAP(0x26, 0x63, 0x0389) /* GREEK CAPITAL LETTER ETA WITH TONO */
-MAP(0x26, 0x64, 0x038A) /* GREEK CAPITAL LETTER IOTA WITH TONO */
-MAP(0x26, 0x65, 0x03AA) /* GREEK CAPITAL LETTER IOTA WITH DIALYTIK */
-MAP(0x26, 0x67, 0x038C) /* GREEK CAPITAL LETTER OMICRON WITH TONO */
-MAP(0x26, 0x69, 0x038E) /* GREEK CAPITAL LETTER UPSILON WITH TONO */
-MAP(0x26, 0x6A, 0x03AB) /* GREEK CAPITAL LETTER UPSILON WITH DIALYTIK */
-MAP(0x26, 0x6C, 0x038F) /* GREEK CAPITAL LETTER OMEGA WITH TONO */
-MAP(0x26, 0x71, 0x03AC) /* GREEK SMALL LETTER ALPHA WITH TONO */
-MAP(0x26, 0x72, 0x03AD) /* GREEK SMALL LETTER EPSILON WITH TONO */
-MAP(0x26, 0x73, 0x03AE) /* GREEK SMALL LETTER ETA WITH TONO */
-MAP(0x26, 0x74, 0x03AF) /* GREEK SMALL LETTER IOTA WITH TONO */
-MAP(0x26, 0x75, 0x03CA) /* GREEK SMALL LETTER IOTA WITH DIALYTIK */
-MAP(0x26, 0x76, 0x0390) /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONO */
-MAP(0x26, 0x77, 0x03CC) /* GREEK SMALL LETTER OMICRON WITH TONO */
-MAP(0x26, 0x78, 0x03C2) /* GREEK SMALL LETTER FINAL SIGM */
-MAP(0x26, 0x79, 0x03CD) /* GREEK SMALL LETTER UPSILON WITH TONO */
-MAP(0x26, 0x7A, 0x03CB) /* GREEK SMALL LETTER UPSILON WITH DIALYTIK */
-MAP(0x26, 0x7B, 0x03B0) /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONO */
-MAP(0x26, 0x7C, 0x03CE) /* GREEK SMALL LETTER OMEGA WITH TONO */
-MAP(0x27, 0x42, 0x0402) /* CYRILLIC CAPITAL LETTER DJ */
-MAP(0x27, 0x43, 0x0403) /* CYRILLIC CAPITAL LETTER GJ */
-MAP(0x27, 0x44, 0x0404) /* CYRILLIC CAPITAL LETTER UKRAINIAN I */
-MAP(0x27, 0x45, 0x0405) /* CYRILLIC CAPITAL LETTER DZ */
-MAP(0x27, 0x46, 0x0406) /* CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN */
-MAP(0x27, 0x47, 0x0407) /* CYRILLIC CAPITAL LETTER Y */
-MAP(0x27, 0x48, 0x0408) /* CYRILLIC CAPITAL LETTER J */
-MAP(0x27, 0x49, 0x0409) /* CYRILLIC CAPITAL LETTER LJ */
-MAP(0x27, 0x4A, 0x040A) /* CYRILLIC CAPITAL LETTER NJ */
-MAP(0x27, 0x4B, 0x040B) /* CYRILLIC CAPITAL LETTER TSH */
-MAP(0x27, 0x4C, 0x040C) /* CYRILLIC CAPITAL LETTER KJ */
-MAP(0x27, 0x4D, 0x040E) /* CYRILLIC CAPITAL LETTER SHORT */
-MAP(0x27, 0x4E, 0x040F) /* CYRILLIC CAPITAL LETTER DZH */
-MAP(0x27, 0x72, 0x0452) /* CYRILLIC SMALL LETTER DJ */
-MAP(0x27, 0x73, 0x0453) /* CYRILLIC SMALL LETTER GJ */
-MAP(0x27, 0x74, 0x0454) /* CYRILLIC SMALL LETTER UKRAINIAN I */
-MAP(0x27, 0x75, 0x0455) /* CYRILLIC SMALL LETTER DZ */
-MAP(0x27, 0x76, 0x0456) /* CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN */
-MAP(0x27, 0x77, 0x0457) /* CYRILLIC SMALL LETTER Y */
-MAP(0x27, 0x78, 0x0458) /* CYRILLIC SMALL LETTER J */
-MAP(0x27, 0x79, 0x0459) /* CYRILLIC SMALL LETTER LJ */
-MAP(0x27, 0x7A, 0x045A) /* CYRILLIC SMALL LETTER NJ */
-MAP(0x27, 0x7B, 0x045B) /* CYRILLIC SMALL LETTER TSH */
-MAP(0x27, 0x7C, 0x045C) /* CYRILLIC SMALL LETTER KJ */
-MAP(0x27, 0x7D, 0x045E) /* CYRILLIC SMALL LETTER SHORT */
-MAP(0x27, 0x7E, 0x045F) /* CYRILLIC SMALL LETTER DZH */
-MAP(0x29, 0x21, 0x00C6) /* LATIN CAPITAL LIGATURE A */
-MAP(0x29, 0x22, 0x0110) /* LATIN CAPITAL LETTER D WITH STROK */
-MAP(0x29, 0x24, 0x0126) /* LATIN CAPITAL LETTER H WITH STROK */
-MAP(0x29, 0x26, 0x0132) /* LATIN CAPITAL LIGATURE I */
-MAP(0x29, 0x28, 0x0141) /* LATIN CAPITAL LETTER L WITH STROK */
-MAP(0x29, 0x29, 0x013F) /* LATIN CAPITAL LETTER L WITH MIDDLE DO */
-MAP(0x29, 0x2B, 0x014A) /* LATIN CAPITAL LETTER EN */
-MAP(0x29, 0x2C, 0x00D8) /* LATIN CAPITAL LETTER O WITH STROK */
-MAP(0x29, 0x2D, 0x0152) /* LATIN CAPITAL LIGATURE O */
-MAP(0x29, 0x2F, 0x0166) /* LATIN CAPITAL LETTER T WITH STROK */
-MAP(0x29, 0x30, 0x00DE) /* LATIN CAPITAL LETTER THOR */
-MAP(0x29, 0x41, 0x00E6) /* LATIN SMALL LIGATURE A */
-MAP(0x29, 0x42, 0x0111) /* LATIN SMALL LETTER D WITH STROK */
-MAP(0x29, 0x43, 0x00F0) /* LATIN SMALL LETTER ET */
-MAP(0x29, 0x44, 0x0127) /* LATIN SMALL LETTER H WITH STROK */
-MAP(0x29, 0x45, 0x0131) /* LATIN SMALL LETTER DOTLESS */
-MAP(0x29, 0x46, 0x0133) /* LATIN SMALL LIGATURE I */
-MAP(0x29, 0x47, 0x0138) /* LATIN SMALL LETTER KR */
-MAP(0x29, 0x48, 0x0142) /* LATIN SMALL LETTER L WITH STROK */
-MAP(0x29, 0x49, 0x0140) /* LATIN SMALL LETTER L WITH MIDDLE DO */
-MAP(0x29, 0x4A, 0x0149) /* LATIN SMALL LETTER N PRECEDED BY APOSTROPH */
-MAP(0x29, 0x4B, 0x014B) /* LATIN SMALL LETTER EN */
-MAP(0x29, 0x4C, 0x00F8) /* LATIN SMALL LETTER O WITH STROK */
-MAP(0x29, 0x4D, 0x0153) /* LATIN SMALL LIGATURE O */
-MAP(0x29, 0x4E, 0x00DF) /* LATIN SMALL LETTER SHARP */
-MAP(0x29, 0x4F, 0x0167) /* LATIN SMALL LETTER T WITH STROK */
-MAP(0x29, 0x50, 0x00FE) /* LATIN SMALL LETTER THOR */
-MAP(0x2A, 0x21, 0x00C1) /* LATIN CAPITAL LETTER A WITH ACUT */
-MAP(0x2A, 0x22, 0x00C0) /* LATIN CAPITAL LETTER A WITH GRAV */
-MAP(0x2A, 0x23, 0x00C4) /* LATIN CAPITAL LETTER A WITH DIAERESI */
-MAP(0x2A, 0x24, 0x00C2) /* LATIN CAPITAL LETTER A WITH CIRCUMFLE */
-MAP(0x2A, 0x25, 0x0102) /* LATIN CAPITAL LETTER A WITH BREV */
-MAP(0x2A, 0x26, 0x01CD) /* LATIN CAPITAL LETTER A WITH CARO */
-MAP(0x2A, 0x27, 0x0100) /* LATIN CAPITAL LETTER A WITH MACRO */
-MAP(0x2A, 0x28, 0x0104) /* LATIN CAPITAL LETTER A WITH OGONE */
-MAP(0x2A, 0x29, 0x00C5) /* LATIN CAPITAL LETTER A WITH RING ABOV */
-MAP(0x2A, 0x2A, 0x00C3) /* LATIN CAPITAL LETTER A WITH TILD */
-MAP(0x2A, 0x2B, 0x0106) /* LATIN CAPITAL LETTER C WITH ACUT */
-MAP(0x2A, 0x2C, 0x0108) /* LATIN CAPITAL LETTER C WITH CIRCUMFLE */
-MAP(0x2A, 0x2D, 0x010C) /* LATIN CAPITAL LETTER C WITH CARO */
-MAP(0x2A, 0x2E, 0x00C7) /* LATIN CAPITAL LETTER C WITH CEDILL */
-MAP(0x2A, 0x2F, 0x010A) /* LATIN CAPITAL LETTER C WITH DOT ABOV */
-MAP(0x2A, 0x30, 0x010E) /* LATIN CAPITAL LETTER D WITH CARO */
-MAP(0x2A, 0x31, 0x00C9) /* LATIN CAPITAL LETTER E WITH ACUT */
-MAP(0x2A, 0x32, 0x00C8) /* LATIN CAPITAL LETTER E WITH GRAV */
-MAP(0x2A, 0x33, 0x00CB) /* LATIN CAPITAL LETTER E WITH DIAERESI */
-MAP(0x2A, 0x34, 0x00CA) /* LATIN CAPITAL LETTER E WITH CIRCUMFLE */
-MAP(0x2A, 0x35, 0x011A) /* LATIN CAPITAL LETTER E WITH CARO */
-MAP(0x2A, 0x36, 0x0116) /* LATIN CAPITAL LETTER E WITH DOT ABOV */
-MAP(0x2A, 0x37, 0x0112) /* LATIN CAPITAL LETTER E WITH MACRO */
-MAP(0x2A, 0x38, 0x0118) /* LATIN CAPITAL LETTER E WITH OGONE */
-MAP(0x2A, 0x3A, 0x011C) /* LATIN CAPITAL LETTER G WITH CIRCUMFLE */
-MAP(0x2A, 0x3B, 0x011E) /* LATIN CAPITAL LETTER G WITH BREV */
-MAP(0x2A, 0x3C, 0x0122) /* LATIN CAPITAL LETTER G WITH CEDILL */
-MAP(0x2A, 0x3D, 0x0120) /* LATIN CAPITAL LETTER G WITH DOT ABOV */
-MAP(0x2A, 0x3E, 0x0124) /* LATIN CAPITAL LETTER H WITH CIRCUMFLE */
-MAP(0x2A, 0x3F, 0x00CD) /* LATIN CAPITAL LETTER I WITH ACUT */
-MAP(0x2A, 0x40, 0x00CC) /* LATIN CAPITAL LETTER I WITH GRAV */
-MAP(0x2A, 0x41, 0x00CF) /* LATIN CAPITAL LETTER I WITH DIAERESI */
-MAP(0x2A, 0x42, 0x00CE) /* LATIN CAPITAL LETTER I WITH CIRCUMFLE */
-MAP(0x2A, 0x43, 0x01CF) /* LATIN CAPITAL LETTER I WITH CARO */
-MAP(0x2A, 0x44, 0x0130) /* LATIN CAPITAL LETTER I WITH DOT ABOV */
-MAP(0x2A, 0x45, 0x012A) /* LATIN CAPITAL LETTER I WITH MACRO */
-MAP(0x2A, 0x46, 0x012E) /* LATIN CAPITAL LETTER I WITH OGONE */
-MAP(0x2A, 0x47, 0x0128) /* LATIN CAPITAL LETTER I WITH TILD */
-MAP(0x2A, 0x48, 0x0134) /* LATIN CAPITAL LETTER J WITH CIRCUMFLE */
-MAP(0x2A, 0x49, 0x0136) /* LATIN CAPITAL LETTER K WITH CEDILL */
-MAP(0x2A, 0x4A, 0x0139) /* LATIN CAPITAL LETTER L WITH ACUT */
-MAP(0x2A, 0x4B, 0x013D) /* LATIN CAPITAL LETTER L WITH CARO */
-MAP(0x2A, 0x4C, 0x013B) /* LATIN CAPITAL LETTER L WITH CEDILL */
-MAP(0x2A, 0x4D, 0x0143) /* LATIN CAPITAL LETTER N WITH ACUT */
-MAP(0x2A, 0x4E, 0x0147) /* LATIN CAPITAL LETTER N WITH CARO */
-MAP(0x2A, 0x4F, 0x0145) /* LATIN CAPITAL LETTER N WITH CEDILL */
-MAP(0x2A, 0x50, 0x00D1) /* LATIN CAPITAL LETTER N WITH TILD */
-MAP(0x2A, 0x51, 0x00D3) /* LATIN CAPITAL LETTER O WITH ACUT */
-MAP(0x2A, 0x52, 0x00D2) /* LATIN CAPITAL LETTER O WITH GRAV */
-MAP(0x2A, 0x53, 0x00D6) /* LATIN CAPITAL LETTER O WITH DIAERESI */
-MAP(0x2A, 0x54, 0x00D4) /* LATIN CAPITAL LETTER O WITH CIRCUMFLE */
-MAP(0x2A, 0x55, 0x01D1) /* LATIN CAPITAL LETTER O WITH CARO */
-MAP(0x2A, 0x56, 0x0150) /* LATIN CAPITAL LETTER O WITH DOUBLE ACUT */
-MAP(0x2A, 0x57, 0x014C) /* LATIN CAPITAL LETTER O WITH MACRO */
-MAP(0x2A, 0x58, 0x00D5) /* LATIN CAPITAL LETTER O WITH TILD */
-MAP(0x2A, 0x59, 0x0154) /* LATIN CAPITAL LETTER R WITH ACUT */
-MAP(0x2A, 0x5A, 0x0158) /* LATIN CAPITAL LETTER R WITH CARO */
-MAP(0x2A, 0x5B, 0x0156) /* LATIN CAPITAL LETTER R WITH CEDILL */
-MAP(0x2A, 0x5C, 0x015A) /* LATIN CAPITAL LETTER S WITH ACUT */
-MAP(0x2A, 0x5D, 0x015C) /* LATIN CAPITAL LETTER S WITH CIRCUMFLE */
-MAP(0x2A, 0x5E, 0x0160) /* LATIN CAPITAL LETTER S WITH CARO */
-MAP(0x2A, 0x5F, 0x015E) /* LATIN CAPITAL LETTER S WITH CEDILL */
-MAP(0x2A, 0x60, 0x0164) /* LATIN CAPITAL LETTER T WITH CARO */
-MAP(0x2A, 0x61, 0x0162) /* LATIN CAPITAL LETTER T WITH CEDILL */
-MAP(0x2A, 0x62, 0x00DA) /* LATIN CAPITAL LETTER U WITH ACUT */
-MAP(0x2A, 0x63, 0x00D9) /* LATIN CAPITAL LETTER U WITH GRAV */
-MAP(0x2A, 0x64, 0x00DC) /* LATIN CAPITAL LETTER U WITH DIAERESI */
-MAP(0x2A, 0x65, 0x00DB) /* LATIN CAPITAL LETTER U WITH CIRCUMFLE */
-MAP(0x2A, 0x66, 0x016C) /* LATIN CAPITAL LETTER U WITH BREV */
-MAP(0x2A, 0x67, 0x01D3) /* LATIN CAPITAL LETTER U WITH CARO */
-MAP(0x2A, 0x68, 0x0170) /* LATIN CAPITAL LETTER U WITH DOUBLE ACUT */
-MAP(0x2A, 0x69, 0x016A) /* LATIN CAPITAL LETTER U WITH MACRO */
-MAP(0x2A, 0x6A, 0x0172) /* LATIN CAPITAL LETTER U WITH OGONE */
-MAP(0x2A, 0x6B, 0x016E) /* LATIN CAPITAL LETTER U WITH RING ABOV */
-MAP(0x2A, 0x6C, 0x0168) /* LATIN CAPITAL LETTER U WITH TILD */
-MAP(0x2A, 0x6D, 0x01D7) /* LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUT */
-MAP(0x2A, 0x6E, 0x01DB) /* LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAV */
-MAP(0x2A, 0x6F, 0x01D9) /* LATIN CAPITAL LETTER U WITH DIAERESIS AND CARO */
-MAP(0x2A, 0x70, 0x01D5) /* LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRO */
-MAP(0x2A, 0x71, 0x0174) /* LATIN CAPITAL LETTER W WITH CIRCUMFLE */
-MAP(0x2A, 0x72, 0x00DD) /* LATIN CAPITAL LETTER Y WITH ACUT */
-MAP(0x2A, 0x73, 0x0178) /* LATIN CAPITAL LETTER Y WITH DIAERESI */
-MAP(0x2A, 0x74, 0x0176) /* LATIN CAPITAL LETTER Y WITH CIRCUMFLE */
-MAP(0x2A, 0x75, 0x0179) /* LATIN CAPITAL LETTER Z WITH ACUT */
-MAP(0x2A, 0x76, 0x017D) /* LATIN CAPITAL LETTER Z WITH CARO */
-MAP(0x2A, 0x77, 0x017B) /* LATIN CAPITAL LETTER Z WITH DOT ABOV */
-MAP(0x2B, 0x21, 0x00E1) /* LATIN SMALL LETTER A WITH ACUT */
-MAP(0x2B, 0x22, 0x00E0) /* LATIN SMALL LETTER A WITH GRAV */
-MAP(0x2B, 0x23, 0x00E4) /* LATIN SMALL LETTER A WITH DIAERESI */
-MAP(0x2B, 0x24, 0x00E2) /* LATIN SMALL LETTER A WITH CIRCUMFLE */
-MAP(0x2B, 0x25, 0x0103) /* LATIN SMALL LETTER A WITH BREV */
-MAP(0x2B, 0x26, 0x01CE) /* LATIN SMALL LETTER A WITH CARO */
-MAP(0x2B, 0x27, 0x0101) /* LATIN SMALL LETTER A WITH MACRO */
-MAP(0x2B, 0x28, 0x0105) /* LATIN SMALL LETTER A WITH OGONE */
-MAP(0x2B, 0x29, 0x00E5) /* LATIN SMALL LETTER A WITH RING ABOV */
-MAP(0x2B, 0x2A, 0x00E3) /* LATIN SMALL LETTER A WITH TILD */
-MAP(0x2B, 0x2B, 0x0107) /* LATIN SMALL LETTER C WITH ACUT */
-MAP(0x2B, 0x2C, 0x0109) /* LATIN SMALL LETTER C WITH CIRCUMFLE */
-MAP(0x2B, 0x2D, 0x010D) /* LATIN SMALL LETTER C WITH CARO */
-MAP(0x2B, 0x2E, 0x00E7) /* LATIN SMALL LETTER C WITH CEDILL */
-MAP(0x2B, 0x2F, 0x010B) /* LATIN SMALL LETTER C WITH DOT ABOV */
-MAP(0x2B, 0x30, 0x010F) /* LATIN SMALL LETTER D WITH CARO */
-MAP(0x2B, 0x31, 0x00E9) /* LATIN SMALL LETTER E WITH ACUT */
-MAP(0x2B, 0x32, 0x00E8) /* LATIN SMALL LETTER E WITH GRAV */
-MAP(0x2B, 0x33, 0x00EB) /* LATIN SMALL LETTER E WITH DIAERESI */
-MAP(0x2B, 0x34, 0x00EA) /* LATIN SMALL LETTER E WITH CIRCUMFLE */
-MAP(0x2B, 0x35, 0x011B) /* LATIN SMALL LETTER E WITH CARO */
-MAP(0x2B, 0x36, 0x0117) /* LATIN SMALL LETTER E WITH DOT ABOV */
-MAP(0x2B, 0x37, 0x0113) /* LATIN SMALL LETTER E WITH MACRO */
-MAP(0x2B, 0x38, 0x0119) /* LATIN SMALL LETTER E WITH OGONE */
-MAP(0x2B, 0x39, 0x01F5) /* LATIN SMALL LETTER G WITH ACUT */
-MAP(0x2B, 0x3A, 0x011D) /* LATIN SMALL LETTER G WITH CIRCUMFLE */
-MAP(0x2B, 0x3B, 0x011F) /* LATIN SMALL LETTER G WITH BREV */
-MAP(0x2B, 0x3D, 0x0121) /* LATIN SMALL LETTER G WITH DOT ABOV */
-MAP(0x2B, 0x3E, 0x0125) /* LATIN SMALL LETTER H WITH CIRCUMFLE */
-MAP(0x2B, 0x3F, 0x00ED) /* LATIN SMALL LETTER I WITH ACUT */
-MAP(0x2B, 0x40, 0x00EC) /* LATIN SMALL LETTER I WITH GRAV */
-MAP(0x2B, 0x41, 0x00EF) /* LATIN SMALL LETTER I WITH DIAERESI */
-MAP(0x2B, 0x42, 0x00EE) /* LATIN SMALL LETTER I WITH CIRCUMFLE */
-MAP(0x2B, 0x43, 0x01D0) /* LATIN SMALL LETTER I WITH CARO */
-MAP(0x2B, 0x45, 0x012B) /* LATIN SMALL LETTER I WITH MACRO */
-MAP(0x2B, 0x46, 0x012F) /* LATIN SMALL LETTER I WITH OGONE */
-MAP(0x2B, 0x47, 0x0129) /* LATIN SMALL LETTER I WITH TILD */
-MAP(0x2B, 0x48, 0x0135) /* LATIN SMALL LETTER J WITH CIRCUMFLE */
-MAP(0x2B, 0x49, 0x0137) /* LATIN SMALL LETTER K WITH CEDILL */
-MAP(0x2B, 0x4A, 0x013A) /* LATIN SMALL LETTER L WITH ACUT */
-MAP(0x2B, 0x4B, 0x013E) /* LATIN SMALL LETTER L WITH CARO */
-MAP(0x2B, 0x4C, 0x013C) /* LATIN SMALL LETTER L WITH CEDILL */
-MAP(0x2B, 0x4D, 0x0144) /* LATIN SMALL LETTER N WITH ACUT */
-MAP(0x2B, 0x4E, 0x0148) /* LATIN SMALL LETTER N WITH CARO */
-MAP(0x2B, 0x4F, 0x0146) /* LATIN SMALL LETTER N WITH CEDILL */
-MAP(0x2B, 0x50, 0x00F1) /* LATIN SMALL LETTER N WITH TILD */
-MAP(0x2B, 0x51, 0x00F3) /* LATIN SMALL LETTER O WITH ACUT */
-MAP(0x2B, 0x52, 0x00F2) /* LATIN SMALL LETTER O WITH GRAV */
-MAP(0x2B, 0x53, 0x00F6) /* LATIN SMALL LETTER O WITH DIAERESI */
-MAP(0x2B, 0x54, 0x00F4) /* LATIN SMALL LETTER O WITH CIRCUMFLE */
-MAP(0x2B, 0x55, 0x01D2) /* LATIN SMALL LETTER O WITH CARO */
-MAP(0x2B, 0x56, 0x0151) /* LATIN SMALL LETTER O WITH DOUBLE ACUT */
-MAP(0x2B, 0x57, 0x014D) /* LATIN SMALL LETTER O WITH MACRO */
-MAP(0x2B, 0x58, 0x00F5) /* LATIN SMALL LETTER O WITH TILD */
-MAP(0x2B, 0x59, 0x0155) /* LATIN SMALL LETTER R WITH ACUT */
-MAP(0x2B, 0x5A, 0x0159) /* LATIN SMALL LETTER R WITH CARO */
-MAP(0x2B, 0x5B, 0x0157) /* LATIN SMALL LETTER R WITH CEDILL */
-MAP(0x2B, 0x5C, 0x015B) /* LATIN SMALL LETTER S WITH ACUT */
-MAP(0x2B, 0x5D, 0x015D) /* LATIN SMALL LETTER S WITH CIRCUMFLE */
-MAP(0x2B, 0x5E, 0x0161) /* LATIN SMALL LETTER S WITH CARO */
-MAP(0x2B, 0x5F, 0x015F) /* LATIN SMALL LETTER S WITH CEDILL */
-MAP(0x2B, 0x60, 0x0165) /* LATIN SMALL LETTER T WITH CARO */
-MAP(0x2B, 0x61, 0x0163) /* LATIN SMALL LETTER T WITH CEDILL */
-MAP(0x2B, 0x62, 0x00FA) /* LATIN SMALL LETTER U WITH ACUT */
-MAP(0x2B, 0x63, 0x00F9) /* LATIN SMALL LETTER U WITH GRAV */
-MAP(0x2B, 0x64, 0x00FC) /* LATIN SMALL LETTER U WITH DIAERESI */
-MAP(0x2B, 0x65, 0x00FB) /* LATIN SMALL LETTER U WITH CIRCUMFLE */
-MAP(0x2B, 0x66, 0x016D) /* LATIN SMALL LETTER U WITH BREV */
-MAP(0x2B, 0x67, 0x01D4) /* LATIN SMALL LETTER U WITH CARO */
-MAP(0x2B, 0x68, 0x0171) /* LATIN SMALL LETTER U WITH DOUBLE ACUT */
-MAP(0x2B, 0x69, 0x016B) /* LATIN SMALL LETTER U WITH MACRO */
-MAP(0x2B, 0x6A, 0x0173) /* LATIN SMALL LETTER U WITH OGONE */
-MAP(0x2B, 0x6B, 0x016F) /* LATIN SMALL LETTER U WITH RING ABOV */
-MAP(0x2B, 0x6C, 0x0169) /* LATIN SMALL LETTER U WITH TILD */
-MAP(0x2B, 0x6D, 0x01D8) /* LATIN SMALL LETTER U WITH DIAERESIS AND ACUT */
-MAP(0x2B, 0x6E, 0x01DC) /* LATIN SMALL LETTER U WITH DIAERESIS AND GRAV */
-MAP(0x2B, 0x6F, 0x01DA) /* LATIN SMALL LETTER U WITH DIAERESIS AND CARO */
-MAP(0x2B, 0x70, 0x01D6) /* LATIN SMALL LETTER U WITH DIAERESIS AND MACRO */
-MAP(0x2B, 0x71, 0x0175) /* LATIN SMALL LETTER W WITH CIRCUMFLE */
-MAP(0x2B, 0x72, 0x00FD) /* LATIN SMALL LETTER Y WITH ACUT */
-MAP(0x2B, 0x73, 0x00FF) /* LATIN SMALL LETTER Y WITH DIAERESI */
-MAP(0x2B, 0x74, 0x0177) /* LATIN SMALL LETTER Y WITH CIRCUMFLE */
-MAP(0x2B, 0x75, 0x017A) /* LATIN SMALL LETTER Z WITH ACUT */
-MAP(0x2B, 0x76, 0x017E) /* LATIN SMALL LETTER Z WITH CARO */
-MAP(0x2B, 0x77, 0x017C) /* LATIN SMALL LETTER Z WITH DOT ABOV */
-MAP(0x30, 0x21, 0x4E02) /* <CJK */
-MAP(0x30, 0x22, 0x4E04) /* <CJK */
-MAP(0x30, 0x23, 0x4E05) /* <CJK */
-MAP(0x30, 0x24, 0x4E0C) /* <CJK */
-MAP(0x30, 0x25, 0x4E12) /* <CJK */
-MAP(0x30, 0x26, 0x4E1F) /* <CJK */
-MAP(0x30, 0x27, 0x4E23) /* <CJK */
-MAP(0x30, 0x28, 0x4E24) /* <CJK */
-MAP(0x30, 0x29, 0x4E28) /* <CJK */
-MAP(0x30, 0x2A, 0x4E2B) /* <CJK */
-MAP(0x30, 0x2B, 0x4E2E) /* <CJK */
-MAP(0x30, 0x2C, 0x4E2F) /* <CJK */
-MAP(0x30, 0x2D, 0x4E30) /* <CJK */
-MAP(0x30, 0x2E, 0x4E35) /* <CJK */
-MAP(0x30, 0x2F, 0x4E40) /* <CJK */
-MAP(0x30, 0x30, 0x4E41) /* <CJK */
-MAP(0x30, 0x31, 0x4E44) /* <CJK */
-MAP(0x30, 0x32, 0x4E47) /* <CJK */
-MAP(0x30, 0x33, 0x4E51) /* <CJK */
-MAP(0x30, 0x34, 0x4E5A) /* <CJK */
-MAP(0x30, 0x35, 0x4E5C) /* <CJK */
-MAP(0x30, 0x36, 0x4E63) /* <CJK */
-MAP(0x30, 0x37, 0x4E68) /* <CJK */
-MAP(0x30, 0x38, 0x4E69) /* <CJK */
-MAP(0x30, 0x39, 0x4E74) /* <CJK */
-MAP(0x30, 0x3A, 0x4E75) /* <CJK */
-MAP(0x30, 0x3B, 0x4E79) /* <CJK */
-MAP(0x30, 0x3C, 0x4E7F) /* <CJK */
-MAP(0x30, 0x3D, 0x4E8D) /* <CJK */
-MAP(0x30, 0x3E, 0x4E96) /* <CJK */
-MAP(0x30, 0x3F, 0x4E97) /* <CJK */
-MAP(0x30, 0x40, 0x4E9D) /* <CJK */
-MAP(0x30, 0x41, 0x4EAF) /* <CJK */
-MAP(0x30, 0x42, 0x4EB9) /* <CJK */
-MAP(0x30, 0x43, 0x4EC3) /* <CJK */
-MAP(0x30, 0x44, 0x4ED0) /* <CJK */
-MAP(0x30, 0x45, 0x4EDA) /* <CJK */
-MAP(0x30, 0x46, 0x4EDB) /* <CJK */
-MAP(0x30, 0x47, 0x4EE0) /* <CJK */
-MAP(0x30, 0x48, 0x4EE1) /* <CJK */
-MAP(0x30, 0x49, 0x4EE2) /* <CJK */
-MAP(0x30, 0x4A, 0x4EE8) /* <CJK */
-MAP(0x30, 0x4B, 0x4EEF) /* <CJK */
-MAP(0x30, 0x4C, 0x4EF1) /* <CJK */
-MAP(0x30, 0x4D, 0x4EF3) /* <CJK */
-MAP(0x30, 0x4E, 0x4EF5) /* <CJK */
-MAP(0x30, 0x4F, 0x4EFD) /* <CJK */
-MAP(0x30, 0x50, 0x4EFE) /* <CJK */
-MAP(0x30, 0x51, 0x4EFF) /* <CJK */
-MAP(0x30, 0x52, 0x4F00) /* <CJK */
-MAP(0x30, 0x53, 0x4F02) /* <CJK */
-MAP(0x30, 0x54, 0x4F03) /* <CJK */
-MAP(0x30, 0x55, 0x4F08) /* <CJK */
-MAP(0x30, 0x56, 0x4F0B) /* <CJK */
-MAP(0x30, 0x57, 0x4F0C) /* <CJK */
-MAP(0x30, 0x58, 0x4F12) /* <CJK */
-MAP(0x30, 0x59, 0x4F15) /* <CJK */
-MAP(0x30, 0x5A, 0x4F16) /* <CJK */
-MAP(0x30, 0x5B, 0x4F17) /* <CJK */
-MAP(0x30, 0x5C, 0x4F19) /* <CJK */
-MAP(0x30, 0x5D, 0x4F2E) /* <CJK */
-MAP(0x30, 0x5E, 0x4F31) /* <CJK */
-MAP(0x30, 0x5F, 0x4F60) /* <CJK */
-MAP(0x30, 0x60, 0x4F33) /* <CJK */
-MAP(0x30, 0x61, 0x4F35) /* <CJK */
-MAP(0x30, 0x62, 0x4F37) /* <CJK */
-MAP(0x30, 0x63, 0x4F39) /* <CJK */
-MAP(0x30, 0x64, 0x4F3B) /* <CJK */
-MAP(0x30, 0x65, 0x4F3E) /* <CJK */
-MAP(0x30, 0x66, 0x4F40) /* <CJK */
-MAP(0x30, 0x67, 0x4F42) /* <CJK */
-MAP(0x30, 0x68, 0x4F48) /* <CJK */
-MAP(0x30, 0x69, 0x4F49) /* <CJK */
-MAP(0x30, 0x6A, 0x4F4B) /* <CJK */
-MAP(0x30, 0x6B, 0x4F4C) /* <CJK */
-MAP(0x30, 0x6C, 0x4F52) /* <CJK */
-MAP(0x30, 0x6D, 0x4F54) /* <CJK */
-MAP(0x30, 0x6E, 0x4F56) /* <CJK */
-MAP(0x30, 0x6F, 0x4F58) /* <CJK */
-MAP(0x30, 0x70, 0x4F5F) /* <CJK */
-MAP(0x30, 0x71, 0x4F63) /* <CJK */
-MAP(0x30, 0x72, 0x4F6A) /* <CJK */
-MAP(0x30, 0x73, 0x4F6C) /* <CJK */
-MAP(0x30, 0x74, 0x4F6E) /* <CJK */
-MAP(0x30, 0x75, 0x4F71) /* <CJK */
-MAP(0x30, 0x76, 0x4F77) /* <CJK */
-MAP(0x30, 0x77, 0x4F78) /* <CJK */
-MAP(0x30, 0x78, 0x4F79) /* <CJK */
-MAP(0x30, 0x79, 0x4F7A) /* <CJK */
-MAP(0x30, 0x7A, 0x4F7D) /* <CJK */
-MAP(0x30, 0x7B, 0x4F7E) /* <CJK */
-MAP(0x30, 0x7C, 0x4F81) /* <CJK */
-MAP(0x30, 0x7D, 0x4F82) /* <CJK */
-MAP(0x30, 0x7E, 0x4F84) /* <CJK */
-MAP(0x31, 0x21, 0x4F85) /* <CJK */
-MAP(0x31, 0x22, 0x4F89) /* <CJK */
-MAP(0x31, 0x23, 0x4F8A) /* <CJK */
-MAP(0x31, 0x24, 0x4F8C) /* <CJK */
-MAP(0x31, 0x25, 0x4F8E) /* <CJK */
-MAP(0x31, 0x26, 0x4F90) /* <CJK */
-MAP(0x31, 0x27, 0x4F92) /* <CJK */
-MAP(0x31, 0x28, 0x4F93) /* <CJK */
-MAP(0x31, 0x29, 0x4F94) /* <CJK */
-MAP(0x31, 0x2A, 0x4F97) /* <CJK */
-MAP(0x31, 0x2B, 0x4F99) /* <CJK */
-MAP(0x31, 0x2C, 0x4F9A) /* <CJK */
-MAP(0x31, 0x2D, 0x4F9E) /* <CJK */
-MAP(0x31, 0x2E, 0x4F9F) /* <CJK */
-MAP(0x31, 0x2F, 0x4FB2) /* <CJK */
-MAP(0x31, 0x30, 0x4FB7) /* <CJK */
-MAP(0x31, 0x31, 0x4FB9) /* <CJK */
-MAP(0x31, 0x32, 0x4FBB) /* <CJK */
-MAP(0x31, 0x33, 0x4FBC) /* <CJK */
-MAP(0x31, 0x34, 0x4FBD) /* <CJK */
-MAP(0x31, 0x35, 0x4FBE) /* <CJK */
-MAP(0x31, 0x36, 0x4FC0) /* <CJK */
-MAP(0x31, 0x37, 0x4FC1) /* <CJK */
-MAP(0x31, 0x38, 0x4FC5) /* <CJK */
-MAP(0x31, 0x39, 0x4FC6) /* <CJK */
-MAP(0x31, 0x3A, 0x4FC8) /* <CJK */
-MAP(0x31, 0x3B, 0x4FC9) /* <CJK */
-MAP(0x31, 0x3C, 0x4FCB) /* <CJK */
-MAP(0x31, 0x3D, 0x4FCC) /* <CJK */
-MAP(0x31, 0x3E, 0x4FCD) /* <CJK */
-MAP(0x31, 0x3F, 0x4FCF) /* <CJK */
-MAP(0x31, 0x40, 0x4FD2) /* <CJK */
-MAP(0x31, 0x41, 0x4FDC) /* <CJK */
-MAP(0x31, 0x42, 0x4FE0) /* <CJK */
-MAP(0x31, 0x43, 0x4FE2) /* <CJK */
-MAP(0x31, 0x44, 0x4FF0) /* <CJK */
-MAP(0x31, 0x45, 0x4FF2) /* <CJK */
-MAP(0x31, 0x46, 0x4FFC) /* <CJK */
-MAP(0x31, 0x47, 0x4FFD) /* <CJK */
-MAP(0x31, 0x48, 0x4FFF) /* <CJK */
-MAP(0x31, 0x49, 0x5000) /* <CJK */
-MAP(0x31, 0x4A, 0x5001) /* <CJK */
-MAP(0x31, 0x4B, 0x5004) /* <CJK */
-MAP(0x31, 0x4C, 0x5007) /* <CJK */
-MAP(0x31, 0x4D, 0x500A) /* <CJK */
-MAP(0x31, 0x4E, 0x500C) /* <CJK */
-MAP(0x31, 0x4F, 0x500E) /* <CJK */
-MAP(0x31, 0x50, 0x5010) /* <CJK */
-MAP(0x31, 0x51, 0x5013) /* <CJK */
-MAP(0x31, 0x52, 0x5017) /* <CJK */
-MAP(0x31, 0x53, 0x5018) /* <CJK */
-MAP(0x31, 0x54, 0x501B) /* <CJK */
-MAP(0x31, 0x55, 0x501C) /* <CJK */
-MAP(0x31, 0x56, 0x501D) /* <CJK */
-MAP(0x31, 0x57, 0x501E) /* <CJK */
-MAP(0x31, 0x58, 0x5022) /* <CJK */
-MAP(0x31, 0x59, 0x5027) /* <CJK */
-MAP(0x31, 0x5A, 0x502E) /* <CJK */
-MAP(0x31, 0x5B, 0x5030) /* <CJK */
-MAP(0x31, 0x5C, 0x5032) /* <CJK */
-MAP(0x31, 0x5D, 0x5033) /* <CJK */
-MAP(0x31, 0x5E, 0x5035) /* <CJK */
-MAP(0x31, 0x5F, 0x5040) /* <CJK */
-MAP(0x31, 0x60, 0x5041) /* <CJK */
-MAP(0x31, 0x61, 0x5042) /* <CJK */
-MAP(0x31, 0x62, 0x5045) /* <CJK */
-MAP(0x31, 0x63, 0x5046) /* <CJK */
-MAP(0x31, 0x64, 0x504A) /* <CJK */
-MAP(0x31, 0x65, 0x504C) /* <CJK */
-MAP(0x31, 0x66, 0x504E) /* <CJK */
-MAP(0x31, 0x67, 0x5051) /* <CJK */
-MAP(0x31, 0x68, 0x5052) /* <CJK */
-MAP(0x31, 0x69, 0x5053) /* <CJK */
-MAP(0x31, 0x6A, 0x5057) /* <CJK */
-MAP(0x31, 0x6B, 0x5059) /* <CJK */
-MAP(0x31, 0x6C, 0x505F) /* <CJK */
-MAP(0x31, 0x6D, 0x5060) /* <CJK */
-MAP(0x31, 0x6E, 0x5062) /* <CJK */
-MAP(0x31, 0x6F, 0x5063) /* <CJK */
-MAP(0x31, 0x70, 0x5066) /* <CJK */
-MAP(0x31, 0x71, 0x5067) /* <CJK */
-MAP(0x31, 0x72, 0x506A) /* <CJK */
-MAP(0x31, 0x73, 0x506D) /* <CJK */
-MAP(0x31, 0x74, 0x5070) /* <CJK */
-MAP(0x31, 0x75, 0x5071) /* <CJK */
-MAP(0x31, 0x76, 0x503B) /* <CJK */
-MAP(0x31, 0x77, 0x5081) /* <CJK */
-MAP(0x31, 0x78, 0x5083) /* <CJK */
-MAP(0x31, 0x79, 0x5084) /* <CJK */
-MAP(0x31, 0x7A, 0x5086) /* <CJK */
-MAP(0x31, 0x7B, 0x508A) /* <CJK */
-MAP(0x31, 0x7C, 0x508E) /* <CJK */
-MAP(0x31, 0x7D, 0x508F) /* <CJK */
-MAP(0x31, 0x7E, 0x5090) /* <CJK */
-MAP(0x32, 0x21, 0x5092) /* <CJK */
-MAP(0x32, 0x22, 0x5093) /* <CJK */
-MAP(0x32, 0x23, 0x5094) /* <CJK */
-MAP(0x32, 0x24, 0x5096) /* <CJK */
-MAP(0x32, 0x25, 0x509B) /* <CJK */
-MAP(0x32, 0x26, 0x509C) /* <CJK */
-MAP(0x32, 0x27, 0x509E) /* <CJK */
-MAP(0x32, 0x28, 0x509F) /* <CJK */
-MAP(0x32, 0x29, 0x50A0) /* <CJK */
-MAP(0x32, 0x2A, 0x50A1) /* <CJK */
-MAP(0x32, 0x2B, 0x50A2) /* <CJK */
-MAP(0x32, 0x2C, 0x50AA) /* <CJK */
-MAP(0x32, 0x2D, 0x50AF) /* <CJK */
-MAP(0x32, 0x2E, 0x50B0) /* <CJK */
-MAP(0x32, 0x2F, 0x50B9) /* <CJK */
-MAP(0x32, 0x30, 0x50BA) /* <CJK */
-MAP(0x32, 0x31, 0x50BD) /* <CJK */
-MAP(0x32, 0x32, 0x50C0) /* <CJK */
-MAP(0x32, 0x33, 0x50C3) /* <CJK */
-MAP(0x32, 0x34, 0x50C4) /* <CJK */
-MAP(0x32, 0x35, 0x50C7) /* <CJK */
-MAP(0x32, 0x36, 0x50CC) /* <CJK */
-MAP(0x32, 0x37, 0x50CE) /* <CJK */
-MAP(0x32, 0x38, 0x50D0) /* <CJK */
-MAP(0x32, 0x39, 0x50D3) /* <CJK */
-MAP(0x32, 0x3A, 0x50D4) /* <CJK */
-MAP(0x32, 0x3B, 0x50D8) /* <CJK */
-MAP(0x32, 0x3C, 0x50DC) /* <CJK */
-MAP(0x32, 0x3D, 0x50DD) /* <CJK */
-MAP(0x32, 0x3E, 0x50DF) /* <CJK */
-MAP(0x32, 0x3F, 0x50E2) /* <CJK */
-MAP(0x32, 0x40, 0x50E4) /* <CJK */
-MAP(0x32, 0x41, 0x50E6) /* <CJK */
-MAP(0x32, 0x42, 0x50E8) /* <CJK */
-MAP(0x32, 0x43, 0x50E9) /* <CJK */
-MAP(0x32, 0x44, 0x50EF) /* <CJK */
-MAP(0x32, 0x45, 0x50F1) /* <CJK */
-MAP(0x32, 0x46, 0x50F6) /* <CJK */
-MAP(0x32, 0x47, 0x50FA) /* <CJK */
-MAP(0x32, 0x48, 0x50FE) /* <CJK */
-MAP(0x32, 0x49, 0x5103) /* <CJK */
-MAP(0x32, 0x4A, 0x5106) /* <CJK */
-MAP(0x32, 0x4B, 0x5107) /* <CJK */
-MAP(0x32, 0x4C, 0x5108) /* <CJK */
-MAP(0x32, 0x4D, 0x510B) /* <CJK */
-MAP(0x32, 0x4E, 0x510C) /* <CJK */
-MAP(0x32, 0x4F, 0x510D) /* <CJK */
-MAP(0x32, 0x50, 0x510E) /* <CJK */
-MAP(0x32, 0x51, 0x50F2) /* <CJK */
-MAP(0x32, 0x52, 0x5110) /* <CJK */
-MAP(0x32, 0x53, 0x5117) /* <CJK */
-MAP(0x32, 0x54, 0x5119) /* <CJK */
-MAP(0x32, 0x55, 0x511B) /* <CJK */
-MAP(0x32, 0x56, 0x511C) /* <CJK */
-MAP(0x32, 0x57, 0x511D) /* <CJK */
-MAP(0x32, 0x58, 0x511E) /* <CJK */
-MAP(0x32, 0x59, 0x5123) /* <CJK */
-MAP(0x32, 0x5A, 0x5127) /* <CJK */
-MAP(0x32, 0x5B, 0x5128) /* <CJK */
-MAP(0x32, 0x5C, 0x512C) /* <CJK */
-MAP(0x32, 0x5D, 0x512D) /* <CJK */
-MAP(0x32, 0x5E, 0x512F) /* <CJK */
-MAP(0x32, 0x5F, 0x5131) /* <CJK */
-MAP(0x32, 0x60, 0x5133) /* <CJK */
-MAP(0x32, 0x61, 0x5134) /* <CJK */
-MAP(0x32, 0x62, 0x5135) /* <CJK */
-MAP(0x32, 0x63, 0x5138) /* <CJK */
-MAP(0x32, 0x64, 0x5139) /* <CJK */
-MAP(0x32, 0x65, 0x5142) /* <CJK */
-MAP(0x32, 0x66, 0x514A) /* <CJK */
-MAP(0x32, 0x67, 0x514F) /* <CJK */
-MAP(0x32, 0x68, 0x5153) /* <CJK */
-MAP(0x32, 0x69, 0x5155) /* <CJK */
-MAP(0x32, 0x6A, 0x5157) /* <CJK */
-MAP(0x32, 0x6B, 0x5158) /* <CJK */
-MAP(0x32, 0x6C, 0x515F) /* <CJK */
-MAP(0x32, 0x6D, 0x5164) /* <CJK */
-MAP(0x32, 0x6E, 0x5166) /* <CJK */
-MAP(0x32, 0x6F, 0x517E) /* <CJK */
-MAP(0x32, 0x70, 0x5183) /* <CJK */
-MAP(0x32, 0x71, 0x5184) /* <CJK */
-MAP(0x32, 0x72, 0x518B) /* <CJK */
-MAP(0x32, 0x73, 0x518E) /* <CJK */
-MAP(0x32, 0x74, 0x5198) /* <CJK */
-MAP(0x32, 0x75, 0x519D) /* <CJK */
-MAP(0x32, 0x76, 0x51A1) /* <CJK */
-MAP(0x32, 0x77, 0x51A3) /* <CJK */
-MAP(0x32, 0x78, 0x51AD) /* <CJK */
-MAP(0x32, 0x79, 0x51B8) /* <CJK */
-MAP(0x32, 0x7A, 0x51BA) /* <CJK */
-MAP(0x32, 0x7B, 0x51BC) /* <CJK */
-MAP(0x32, 0x7C, 0x51BE) /* <CJK */
-MAP(0x32, 0x7D, 0x51BF) /* <CJK */
-MAP(0x32, 0x7E, 0x51C2) /* <CJK */
-MAP(0x33, 0x21, 0x51C8) /* <CJK */
-MAP(0x33, 0x22, 0x51CF) /* <CJK */
-MAP(0x33, 0x23, 0x51D1) /* <CJK */
-MAP(0x33, 0x24, 0x51D2) /* <CJK */
-MAP(0x33, 0x25, 0x51D3) /* <CJK */
-MAP(0x33, 0x26, 0x51D5) /* <CJK */
-MAP(0x33, 0x27, 0x51D8) /* <CJK */
-MAP(0x33, 0x28, 0x51DE) /* <CJK */
-MAP(0x33, 0x29, 0x51E2) /* <CJK */
-MAP(0x33, 0x2A, 0x51E5) /* <CJK */
-MAP(0x33, 0x2B, 0x51EE) /* <CJK */
-MAP(0x33, 0x2C, 0x51F2) /* <CJK */
-MAP(0x33, 0x2D, 0x51F3) /* <CJK */
-MAP(0x33, 0x2E, 0x51F4) /* <CJK */
-MAP(0x33, 0x2F, 0x51F7) /* <CJK */
-MAP(0x33, 0x30, 0x5201) /* <CJK */
-MAP(0x33, 0x31, 0x5202) /* <CJK */
-MAP(0x33, 0x32, 0x5205) /* <CJK */
-MAP(0x33, 0x33, 0x5212) /* <CJK */
-MAP(0x33, 0x34, 0x5213) /* <CJK */
-MAP(0x33, 0x35, 0x5215) /* <CJK */
-MAP(0x33, 0x36, 0x5216) /* <CJK */
-MAP(0x33, 0x37, 0x5218) /* <CJK */
-MAP(0x33, 0x38, 0x5222) /* <CJK */
-MAP(0x33, 0x39, 0x5228) /* <CJK */
-MAP(0x33, 0x3A, 0x5231) /* <CJK */
-MAP(0x33, 0x3B, 0x5232) /* <CJK */
-MAP(0x33, 0x3C, 0x5235) /* <CJK */
-MAP(0x33, 0x3D, 0x523C) /* <CJK */
-MAP(0x33, 0x3E, 0x5245) /* <CJK */
-MAP(0x33, 0x3F, 0x5249) /* <CJK */
-MAP(0x33, 0x40, 0x5255) /* <CJK */
-MAP(0x33, 0x41, 0x5257) /* <CJK */
-MAP(0x33, 0x42, 0x5258) /* <CJK */
-MAP(0x33, 0x43, 0x525A) /* <CJK */
-MAP(0x33, 0x44, 0x525C) /* <CJK */
-MAP(0x33, 0x45, 0x525F) /* <CJK */
-MAP(0x33, 0x46, 0x5260) /* <CJK */
-MAP(0x33, 0x47, 0x5261) /* <CJK */
-MAP(0x33, 0x48, 0x5266) /* <CJK */
-MAP(0x33, 0x49, 0x526E) /* <CJK */
-MAP(0x33, 0x4A, 0x5277) /* <CJK */
-MAP(0x33, 0x4B, 0x5278) /* <CJK */
-MAP(0x33, 0x4C, 0x5279) /* <CJK */
-MAP(0x33, 0x4D, 0x5280) /* <CJK */
-MAP(0x33, 0x4E, 0x5282) /* <CJK */
-MAP(0x33, 0x4F, 0x5285) /* <CJK */
-MAP(0x33, 0x50, 0x528A) /* <CJK */
-MAP(0x33, 0x51, 0x528C) /* <CJK */
-MAP(0x33, 0x52, 0x5293) /* <CJK */
-MAP(0x33, 0x53, 0x5295) /* <CJK */
-MAP(0x33, 0x54, 0x5296) /* <CJK */
-MAP(0x33, 0x55, 0x5297) /* <CJK */
-MAP(0x33, 0x56, 0x5298) /* <CJK */
-MAP(0x33, 0x57, 0x529A) /* <CJK */
-MAP(0x33, 0x58, 0x529C) /* <CJK */
-MAP(0x33, 0x59, 0x52A4) /* <CJK */
-MAP(0x33, 0x5A, 0x52A5) /* <CJK */
-MAP(0x33, 0x5B, 0x52A6) /* <CJK */
-MAP(0x33, 0x5C, 0x52A7) /* <CJK */
-MAP(0x33, 0x5D, 0x52AF) /* <CJK */
-MAP(0x33, 0x5E, 0x52B0) /* <CJK */
-MAP(0x33, 0x5F, 0x52B6) /* <CJK */
-MAP(0x33, 0x60, 0x52B7) /* <CJK */
-MAP(0x33, 0x61, 0x52B8) /* <CJK */
-MAP(0x33, 0x62, 0x52BA) /* <CJK */
-MAP(0x33, 0x63, 0x52BB) /* <CJK */
-MAP(0x33, 0x64, 0x52BD) /* <CJK */
-MAP(0x33, 0x65, 0x52C0) /* <CJK */
-MAP(0x33, 0x66, 0x52C4) /* <CJK */
-MAP(0x33, 0x67, 0x52C6) /* <CJK */
-MAP(0x33, 0x68, 0x52C8) /* <CJK */
-MAP(0x33, 0x69, 0x52CC) /* <CJK */
-MAP(0x33, 0x6A, 0x52CF) /* <CJK */
-MAP(0x33, 0x6B, 0x52D1) /* <CJK */
-MAP(0x33, 0x6C, 0x52D4) /* <CJK */
-MAP(0x33, 0x6D, 0x52D6) /* <CJK */
-MAP(0x33, 0x6E, 0x52DB) /* <CJK */
-MAP(0x33, 0x6F, 0x52DC) /* <CJK */
-MAP(0x33, 0x70, 0x52E1) /* <CJK */
-MAP(0x33, 0x71, 0x52E5) /* <CJK */
-MAP(0x33, 0x72, 0x52E8) /* <CJK */
-MAP(0x33, 0x73, 0x52E9) /* <CJK */
-MAP(0x33, 0x74, 0x52EA) /* <CJK */
-MAP(0x33, 0x75, 0x52EC) /* <CJK */
-MAP(0x33, 0x76, 0x52F0) /* <CJK */
-MAP(0x33, 0x77, 0x52F1) /* <CJK */
-MAP(0x33, 0x78, 0x52F4) /* <CJK */
-MAP(0x33, 0x79, 0x52F6) /* <CJK */
-MAP(0x33, 0x7A, 0x52F7) /* <CJK */
-MAP(0x33, 0x7B, 0x5300) /* <CJK */
-MAP(0x33, 0x7C, 0x5303) /* <CJK */
-MAP(0x33, 0x7D, 0x530A) /* <CJK */
-MAP(0x33, 0x7E, 0x530B) /* <CJK */
-MAP(0x34, 0x21, 0x530C) /* <CJK */
-MAP(0x34, 0x22, 0x5311) /* <CJK */
-MAP(0x34, 0x23, 0x5313) /* <CJK */
-MAP(0x34, 0x24, 0x5318) /* <CJK */
-MAP(0x34, 0x25, 0x531B) /* <CJK */
-MAP(0x34, 0x26, 0x531C) /* <CJK */
-MAP(0x34, 0x27, 0x531E) /* <CJK */
-MAP(0x34, 0x28, 0x531F) /* <CJK */
-MAP(0x34, 0x29, 0x5325) /* <CJK */
-MAP(0x34, 0x2A, 0x5327) /* <CJK */
-MAP(0x34, 0x2B, 0x5328) /* <CJK */
-MAP(0x34, 0x2C, 0x5329) /* <CJK */
-MAP(0x34, 0x2D, 0x532B) /* <CJK */
-MAP(0x34, 0x2E, 0x532C) /* <CJK */
-MAP(0x34, 0x2F, 0x532D) /* <CJK */
-MAP(0x34, 0x30, 0x5330) /* <CJK */
-MAP(0x34, 0x31, 0x5332) /* <CJK */
-MAP(0x34, 0x32, 0x5335) /* <CJK */
-MAP(0x34, 0x33, 0x533C) /* <CJK */
-MAP(0x34, 0x34, 0x533D) /* <CJK */
-MAP(0x34, 0x35, 0x533E) /* <CJK */
-MAP(0x34, 0x36, 0x5342) /* <CJK */
-MAP(0x34, 0x37, 0x534C) /* <CJK */
-MAP(0x34, 0x38, 0x534B) /* <CJK */
-MAP(0x34, 0x39, 0x5359) /* <CJK */
-MAP(0x34, 0x3A, 0x535B) /* <CJK */
-MAP(0x34, 0x3B, 0x5361) /* <CJK */
-MAP(0x34, 0x3C, 0x5363) /* <CJK */
-MAP(0x34, 0x3D, 0x5365) /* <CJK */
-MAP(0x34, 0x3E, 0x536C) /* <CJK */
-MAP(0x34, 0x3F, 0x536D) /* <CJK */
-MAP(0x34, 0x40, 0x5372) /* <CJK */
-MAP(0x34, 0x41, 0x5379) /* <CJK */
-MAP(0x34, 0x42, 0x537E) /* <CJK */
-MAP(0x34, 0x43, 0x5383) /* <CJK */
-MAP(0x34, 0x44, 0x5387) /* <CJK */
-MAP(0x34, 0x45, 0x5388) /* <CJK */
-MAP(0x34, 0x46, 0x538E) /* <CJK */
-MAP(0x34, 0x47, 0x5393) /* <CJK */
-MAP(0x34, 0x48, 0x5394) /* <CJK */
-MAP(0x34, 0x49, 0x5399) /* <CJK */
-MAP(0x34, 0x4A, 0x539D) /* <CJK */
-MAP(0x34, 0x4B, 0x53A1) /* <CJK */
-MAP(0x34, 0x4C, 0x53A4) /* <CJK */
-MAP(0x34, 0x4D, 0x53AA) /* <CJK */
-MAP(0x34, 0x4E, 0x53AB) /* <CJK */
-MAP(0x34, 0x4F, 0x53AF) /* <CJK */
-MAP(0x34, 0x50, 0x53B2) /* <CJK */
-MAP(0x34, 0x51, 0x53B4) /* <CJK */
-MAP(0x34, 0x52, 0x53B5) /* <CJK */
-MAP(0x34, 0x53, 0x53B7) /* <CJK */
-MAP(0x34, 0x54, 0x53B8) /* <CJK */
-MAP(0x34, 0x55, 0x53BA) /* <CJK */
-MAP(0x34, 0x56, 0x53BD) /* <CJK */
-MAP(0x34, 0x57, 0x53C0) /* <CJK */
-MAP(0x34, 0x58, 0x53C5) /* <CJK */
-MAP(0x34, 0x59, 0x53CF) /* <CJK */
-MAP(0x34, 0x5A, 0x53D2) /* <CJK */
-MAP(0x34, 0x5B, 0x53D3) /* <CJK */
-MAP(0x34, 0x5C, 0x53D5) /* <CJK */
-MAP(0x34, 0x5D, 0x53DA) /* <CJK */
-MAP(0x34, 0x5E, 0x53DD) /* <CJK */
-MAP(0x34, 0x5F, 0x53DE) /* <CJK */
-MAP(0x34, 0x60, 0x53E0) /* <CJK */
-MAP(0x34, 0x61, 0x53E6) /* <CJK */
-MAP(0x34, 0x62, 0x53E7) /* <CJK */
-MAP(0x34, 0x63, 0x53F5) /* <CJK */
-MAP(0x34, 0x64, 0x5402) /* <CJK */
-MAP(0x34, 0x65, 0x5413) /* <CJK */
-MAP(0x34, 0x66, 0x541A) /* <CJK */
-MAP(0x34, 0x67, 0x5421) /* <CJK */
-MAP(0x34, 0x68, 0x5427) /* <CJK */
-MAP(0x34, 0x69, 0x5428) /* <CJK */
-MAP(0x34, 0x6A, 0x542A) /* <CJK */
-MAP(0x34, 0x6B, 0x542F) /* <CJK */
-MAP(0x34, 0x6C, 0x5431) /* <CJK */
-MAP(0x34, 0x6D, 0x5434) /* <CJK */
-MAP(0x34, 0x6E, 0x5435) /* <CJK */
-MAP(0x34, 0x6F, 0x5443) /* <CJK */
-MAP(0x34, 0x70, 0x5444) /* <CJK */
-MAP(0x34, 0x71, 0x5447) /* <CJK */
-MAP(0x34, 0x72, 0x544D) /* <CJK */
-MAP(0x34, 0x73, 0x544F) /* <CJK */
-MAP(0x34, 0x74, 0x545E) /* <CJK */
-MAP(0x34, 0x75, 0x5462) /* <CJK */
-MAP(0x34, 0x76, 0x5464) /* <CJK */
-MAP(0x34, 0x77, 0x5466) /* <CJK */
-MAP(0x34, 0x78, 0x5467) /* <CJK */
-MAP(0x34, 0x79, 0x5469) /* <CJK */
-MAP(0x34, 0x7A, 0x546B) /* <CJK */
-MAP(0x34, 0x7B, 0x546D) /* <CJK */
-MAP(0x34, 0x7C, 0x546E) /* <CJK */
-MAP(0x34, 0x7D, 0x5474) /* <CJK */
-MAP(0x34, 0x7E, 0x547F) /* <CJK */
-MAP(0x35, 0x21, 0x5481) /* <CJK */
-MAP(0x35, 0x22, 0x5483) /* <CJK */
-MAP(0x35, 0x23, 0x5485) /* <CJK */
-MAP(0x35, 0x24, 0x5488) /* <CJK */
-MAP(0x35, 0x25, 0x5489) /* <CJK */
-MAP(0x35, 0x26, 0x548D) /* <CJK */
-MAP(0x35, 0x27, 0x5491) /* <CJK */
-MAP(0x35, 0x28, 0x5495) /* <CJK */
-MAP(0x35, 0x29, 0x5496) /* <CJK */
-MAP(0x35, 0x2A, 0x549C) /* <CJK */
-MAP(0x35, 0x2B, 0x549F) /* <CJK */
-MAP(0x35, 0x2C, 0x54A1) /* <CJK */
-MAP(0x35, 0x2D, 0x54A6) /* <CJK */
-MAP(0x35, 0x2E, 0x54A7) /* <CJK */
-MAP(0x35, 0x2F, 0x54A9) /* <CJK */
-MAP(0x35, 0x30, 0x54AA) /* <CJK */
-MAP(0x35, 0x31, 0x54AD) /* <CJK */
-MAP(0x35, 0x32, 0x54AE) /* <CJK */
-MAP(0x35, 0x33, 0x54B1) /* <CJK */
-MAP(0x35, 0x34, 0x54B7) /* <CJK */
-MAP(0x35, 0x35, 0x54B9) /* <CJK */
-MAP(0x35, 0x36, 0x54BA) /* <CJK */
-MAP(0x35, 0x37, 0x54BB) /* <CJK */
-MAP(0x35, 0x38, 0x54BF) /* <CJK */
-MAP(0x35, 0x39, 0x54C6) /* <CJK */
-MAP(0x35, 0x3A, 0x54CA) /* <CJK */
-MAP(0x35, 0x3B, 0x54CD) /* <CJK */
-MAP(0x35, 0x3C, 0x54CE) /* <CJK */
-MAP(0x35, 0x3D, 0x54E0) /* <CJK */
-MAP(0x35, 0x3E, 0x54EA) /* <CJK */
-MAP(0x35, 0x3F, 0x54EC) /* <CJK */
-MAP(0x35, 0x40, 0x54EF) /* <CJK */
-MAP(0x35, 0x41, 0x54F6) /* <CJK */
-MAP(0x35, 0x42, 0x54FC) /* <CJK */
-MAP(0x35, 0x43, 0x54FE) /* <CJK */
-MAP(0x35, 0x44, 0x54FF) /* <CJK */
-MAP(0x35, 0x45, 0x5500) /* <CJK */
-MAP(0x35, 0x46, 0x5501) /* <CJK */
-MAP(0x35, 0x47, 0x5505) /* <CJK */
-MAP(0x35, 0x48, 0x5508) /* <CJK */
-MAP(0x35, 0x49, 0x5509) /* <CJK */
-MAP(0x35, 0x4A, 0x550C) /* <CJK */
-MAP(0x35, 0x4B, 0x550D) /* <CJK */
-MAP(0x35, 0x4C, 0x550E) /* <CJK */
-MAP(0x35, 0x4D, 0x5515) /* <CJK */
-MAP(0x35, 0x4E, 0x552A) /* <CJK */
-MAP(0x35, 0x4F, 0x552B) /* <CJK */
-MAP(0x35, 0x50, 0x5532) /* <CJK */
-MAP(0x35, 0x51, 0x5535) /* <CJK */
-MAP(0x35, 0x52, 0x5536) /* <CJK */
-MAP(0x35, 0x53, 0x553B) /* <CJK */
-MAP(0x35, 0x54, 0x553C) /* <CJK */
-MAP(0x35, 0x55, 0x553D) /* <CJK */
-MAP(0x35, 0x56, 0x5541) /* <CJK */
-MAP(0x35, 0x57, 0x5547) /* <CJK */
-MAP(0x35, 0x58, 0x5549) /* <CJK */
-MAP(0x35, 0x59, 0x554A) /* <CJK */
-MAP(0x35, 0x5A, 0x554D) /* <CJK */
-MAP(0x35, 0x5B, 0x5550) /* <CJK */
-MAP(0x35, 0x5C, 0x5551) /* <CJK */
-MAP(0x35, 0x5D, 0x5558) /* <CJK */
-MAP(0x35, 0x5E, 0x555A) /* <CJK */
-MAP(0x35, 0x5F, 0x555B) /* <CJK */
-MAP(0x35, 0x60, 0x555E) /* <CJK */
-MAP(0x35, 0x61, 0x5560) /* <CJK */
-MAP(0x35, 0x62, 0x5561) /* <CJK */
-MAP(0x35, 0x63, 0x5564) /* <CJK */
-MAP(0x35, 0x64, 0x5566) /* <CJK */
-MAP(0x35, 0x65, 0x557F) /* <CJK */
-MAP(0x35, 0x66, 0x5581) /* <CJK */
-MAP(0x35, 0x67, 0x5582) /* <CJK */
-MAP(0x35, 0x68, 0x5586) /* <CJK */
-MAP(0x35, 0x69, 0x5588) /* <CJK */
-MAP(0x35, 0x6A, 0x558E) /* <CJK */
-MAP(0x35, 0x6B, 0x558F) /* <CJK */
-MAP(0x35, 0x6C, 0x5591) /* <CJK */
-MAP(0x35, 0x6D, 0x5592) /* <CJK */
-MAP(0x35, 0x6E, 0x5593) /* <CJK */
-MAP(0x35, 0x6F, 0x5594) /* <CJK */
-MAP(0x35, 0x70, 0x5597) /* <CJK */
-MAP(0x35, 0x71, 0x55A3) /* <CJK */
-MAP(0x35, 0x72, 0x55A4) /* <CJK */
-MAP(0x35, 0x73, 0x55AD) /* <CJK */
-MAP(0x35, 0x74, 0x55B2) /* <CJK */
-MAP(0x35, 0x75, 0x55BF) /* <CJK */
-MAP(0x35, 0x76, 0x55C1) /* <CJK */
-MAP(0x35, 0x77, 0x55C3) /* <CJK */
-MAP(0x35, 0x78, 0x55C6) /* <CJK */
-MAP(0x35, 0x79, 0x55C9) /* <CJK */
-MAP(0x35, 0x7A, 0x55CB) /* <CJK */
-MAP(0x35, 0x7B, 0x55CC) /* <CJK */
-MAP(0x35, 0x7C, 0x55CE) /* <CJK */
-MAP(0x35, 0x7D, 0x55D1) /* <CJK */
-MAP(0x35, 0x7E, 0x55D2) /* <CJK */
-MAP(0x36, 0x21, 0x55D3) /* <CJK */
-MAP(0x36, 0x22, 0x55D7) /* <CJK */
-MAP(0x36, 0x23, 0x55D8) /* <CJK */
-MAP(0x36, 0x24, 0x55DB) /* <CJK */
-MAP(0x36, 0x25, 0x55DE) /* <CJK */
-MAP(0x36, 0x26, 0x55E2) /* <CJK */
-MAP(0x36, 0x27, 0x55E9) /* <CJK */
-MAP(0x36, 0x28, 0x55F6) /* <CJK */
-MAP(0x36, 0x29, 0x55FF) /* <CJK */
-MAP(0x36, 0x2A, 0x5605) /* <CJK */
-MAP(0x36, 0x2B, 0x5608) /* <CJK */
-MAP(0x36, 0x2C, 0x560A) /* <CJK */
-MAP(0x36, 0x2D, 0x560D) /* <CJK */
-MAP(0x36, 0x2E, 0x560E) /* <CJK */
-MAP(0x36, 0x2F, 0x560F) /* <CJK */
-MAP(0x36, 0x30, 0x5610) /* <CJK */
-MAP(0x36, 0x31, 0x5611) /* <CJK */
-MAP(0x36, 0x32, 0x5612) /* <CJK */
-MAP(0x36, 0x33, 0x5619) /* <CJK */
-MAP(0x36, 0x34, 0x562C) /* <CJK */
-MAP(0x36, 0x35, 0x5630) /* <CJK */
-MAP(0x36, 0x36, 0x5633) /* <CJK */
-MAP(0x36, 0x37, 0x5635) /* <CJK */
-MAP(0x36, 0x38, 0x5637) /* <CJK */
-MAP(0x36, 0x39, 0x5639) /* <CJK */
-MAP(0x36, 0x3A, 0x563B) /* <CJK */
-MAP(0x36, 0x3B, 0x563C) /* <CJK */
-MAP(0x36, 0x3C, 0x563D) /* <CJK */
-MAP(0x36, 0x3D, 0x563F) /* <CJK */
-MAP(0x36, 0x3E, 0x5640) /* <CJK */
-MAP(0x36, 0x3F, 0x5641) /* <CJK */
-MAP(0x36, 0x40, 0x5643) /* <CJK */
-MAP(0x36, 0x41, 0x5644) /* <CJK */
-MAP(0x36, 0x42, 0x5646) /* <CJK */
-MAP(0x36, 0x43, 0x5649) /* <CJK */
-MAP(0x36, 0x44, 0x564B) /* <CJK */
-MAP(0x36, 0x45, 0x564D) /* <CJK */
-MAP(0x36, 0x46, 0x564F) /* <CJK */
-MAP(0x36, 0x47, 0x5654) /* <CJK */
-MAP(0x36, 0x48, 0x565E) /* <CJK */
-MAP(0x36, 0x49, 0x5660) /* <CJK */
-MAP(0x36, 0x4A, 0x5661) /* <CJK */
-MAP(0x36, 0x4B, 0x5662) /* <CJK */
-MAP(0x36, 0x4C, 0x5663) /* <CJK */
-MAP(0x36, 0x4D, 0x5666) /* <CJK */
-MAP(0x36, 0x4E, 0x5669) /* <CJK */
-MAP(0x36, 0x4F, 0x566D) /* <CJK */
-MAP(0x36, 0x50, 0x566F) /* <CJK */
-MAP(0x36, 0x51, 0x5671) /* <CJK */
-MAP(0x36, 0x52, 0x5672) /* <CJK */
-MAP(0x36, 0x53, 0x5675) /* <CJK */
-MAP(0x36, 0x54, 0x5684) /* <CJK */
-MAP(0x36, 0x55, 0x5685) /* <CJK */
-MAP(0x36, 0x56, 0x5688) /* <CJK */
-MAP(0x36, 0x57, 0x568B) /* <CJK */
-MAP(0x36, 0x58, 0x568C) /* <CJK */
-MAP(0x36, 0x59, 0x5695) /* <CJK */
-MAP(0x36, 0x5A, 0x5699) /* <CJK */
-MAP(0x36, 0x5B, 0x569A) /* <CJK */
-MAP(0x36, 0x5C, 0x569D) /* <CJK */
-MAP(0x36, 0x5D, 0x569E) /* <CJK */
-MAP(0x36, 0x5E, 0x569F) /* <CJK */
-MAP(0x36, 0x5F, 0x56A6) /* <CJK */
-MAP(0x36, 0x60, 0x56A7) /* <CJK */
-MAP(0x36, 0x61, 0x56A8) /* <CJK */
-MAP(0x36, 0x62, 0x56A9) /* <CJK */
-MAP(0x36, 0x63, 0x56AB) /* <CJK */
-MAP(0x36, 0x64, 0x56AC) /* <CJK */
-MAP(0x36, 0x65, 0x56AD) /* <CJK */
-MAP(0x36, 0x66, 0x56B1) /* <CJK */
-MAP(0x36, 0x67, 0x56B3) /* <CJK */
-MAP(0x36, 0x68, 0x56B7) /* <CJK */
-MAP(0x36, 0x69, 0x56BE) /* <CJK */
-MAP(0x36, 0x6A, 0x56C5) /* <CJK */
-MAP(0x36, 0x6B, 0x56C9) /* <CJK */
-MAP(0x36, 0x6C, 0x56CA) /* <CJK */
-MAP(0x36, 0x6D, 0x56CB) /* <CJK */
-MAP(0x36, 0x6E, 0x56CF) /* <CJK */
-MAP(0x36, 0x6F, 0x56D0) /* <CJK */
-MAP(0x36, 0x70, 0x56CC) /* <CJK */
-MAP(0x36, 0x71, 0x56CD) /* <CJK */
-MAP(0x36, 0x72, 0x56D9) /* <CJK */
-MAP(0x36, 0x73, 0x56DC) /* <CJK */
-MAP(0x36, 0x74, 0x56DD) /* <CJK */
-MAP(0x36, 0x75, 0x56DF) /* <CJK */
-MAP(0x36, 0x76, 0x56E1) /* <CJK */
-MAP(0x36, 0x77, 0x56E4) /* <CJK */
-MAP(0x36, 0x78, 0x56E5) /* <CJK */
-MAP(0x36, 0x79, 0x56E6) /* <CJK */
-MAP(0x36, 0x7A, 0x56E7) /* <CJK */
-MAP(0x36, 0x7B, 0x56E8) /* <CJK */
-MAP(0x36, 0x7C, 0x56F1) /* <CJK */
-MAP(0x36, 0x7D, 0x56EB) /* <CJK */
-MAP(0x36, 0x7E, 0x56ED) /* <CJK */
-MAP(0x37, 0x21, 0x56F6) /* <CJK */
-MAP(0x37, 0x22, 0x56F7) /* <CJK */
-MAP(0x37, 0x23, 0x5701) /* <CJK */
-MAP(0x37, 0x24, 0x5702) /* <CJK */
-MAP(0x37, 0x25, 0x5707) /* <CJK */
-MAP(0x37, 0x26, 0x570A) /* <CJK */
-MAP(0x37, 0x27, 0x570C) /* <CJK */
-MAP(0x37, 0x28, 0x5711) /* <CJK */
-MAP(0x37, 0x29, 0x5715) /* <CJK */
-MAP(0x37, 0x2A, 0x571A) /* <CJK */
-MAP(0x37, 0x2B, 0x571B) /* <CJK */
-MAP(0x37, 0x2C, 0x571D) /* <CJK */
-MAP(0x37, 0x2D, 0x5720) /* <CJK */
-MAP(0x37, 0x2E, 0x5722) /* <CJK */
-MAP(0x37, 0x2F, 0x5723) /* <CJK */
-MAP(0x37, 0x30, 0x5724) /* <CJK */
-MAP(0x37, 0x31, 0x5725) /* <CJK */
-MAP(0x37, 0x32, 0x5729) /* <CJK */
-MAP(0x37, 0x33, 0x572A) /* <CJK */
-MAP(0x37, 0x34, 0x572C) /* <CJK */
-MAP(0x37, 0x35, 0x572E) /* <CJK */
-MAP(0x37, 0x36, 0x572F) /* <CJK */
-MAP(0x37, 0x37, 0x5733) /* <CJK */
-MAP(0x37, 0x38, 0x5734) /* <CJK */
-MAP(0x37, 0x39, 0x573D) /* <CJK */
-MAP(0x37, 0x3A, 0x573E) /* <CJK */
-MAP(0x37, 0x3B, 0x573F) /* <CJK */
-MAP(0x37, 0x3C, 0x5745) /* <CJK */
-MAP(0x37, 0x3D, 0x5746) /* <CJK */
-MAP(0x37, 0x3E, 0x574C) /* <CJK */
-MAP(0x37, 0x3F, 0x574D) /* <CJK */
-MAP(0x37, 0x40, 0x5752) /* <CJK */
-MAP(0x37, 0x41, 0x5762) /* <CJK */
-MAP(0x37, 0x42, 0x5765) /* <CJK */
-MAP(0x37, 0x43, 0x5767) /* <CJK */
-MAP(0x37, 0x44, 0x5768) /* <CJK */
-MAP(0x37, 0x45, 0x576B) /* <CJK */
-MAP(0x37, 0x46, 0x576D) /* <CJK */
-MAP(0x37, 0x47, 0x576E) /* <CJK */
-MAP(0x37, 0x48, 0x576F) /* <CJK */
-MAP(0x37, 0x49, 0x5770) /* <CJK */
-MAP(0x37, 0x4A, 0x5771) /* <CJK */
-MAP(0x37, 0x4B, 0x5773) /* <CJK */
-MAP(0x37, 0x4C, 0x5774) /* <CJK */
-MAP(0x37, 0x4D, 0x5775) /* <CJK */
-MAP(0x37, 0x4E, 0x5777) /* <CJK */
-MAP(0x37, 0x4F, 0x5779) /* <CJK */
-MAP(0x37, 0x50, 0x577A) /* <CJK */
-MAP(0x37, 0x51, 0x577B) /* <CJK */
-MAP(0x37, 0x52, 0x577C) /* <CJK */
-MAP(0x37, 0x53, 0x577E) /* <CJK */
-MAP(0x37, 0x54, 0x5781) /* <CJK */
-MAP(0x37, 0x55, 0x5783) /* <CJK */
-MAP(0x37, 0x56, 0x578C) /* <CJK */
-MAP(0x37, 0x57, 0x5794) /* <CJK */
-MAP(0x37, 0x58, 0x5797) /* <CJK */
-MAP(0x37, 0x59, 0x5799) /* <CJK */
-MAP(0x37, 0x5A, 0x579A) /* <CJK */
-MAP(0x37, 0x5B, 0x579C) /* <CJK */
-MAP(0x37, 0x5C, 0x579D) /* <CJK */
-MAP(0x37, 0x5D, 0x579E) /* <CJK */
-MAP(0x37, 0x5E, 0x579F) /* <CJK */
-MAP(0x37, 0x5F, 0x57A1) /* <CJK */
-MAP(0x37, 0x60, 0x5795) /* <CJK */
-MAP(0x37, 0x61, 0x57A7) /* <CJK */
-MAP(0x37, 0x62, 0x57A8) /* <CJK */
-MAP(0x37, 0x63, 0x57A9) /* <CJK */
-MAP(0x37, 0x64, 0x57AC) /* <CJK */
-MAP(0x37, 0x65, 0x57B8) /* <CJK */
-MAP(0x37, 0x66, 0x57BD) /* <CJK */
-MAP(0x37, 0x67, 0x57C7) /* <CJK */
-MAP(0x37, 0x68, 0x57C8) /* <CJK */
-MAP(0x37, 0x69, 0x57CC) /* <CJK */
-MAP(0x37, 0x6A, 0x57CF) /* <CJK */
-MAP(0x37, 0x6B, 0x57D5) /* <CJK */
-MAP(0x37, 0x6C, 0x57DD) /* <CJK */
-MAP(0x37, 0x6D, 0x57DE) /* <CJK */
-MAP(0x37, 0x6E, 0x57E4) /* <CJK */
-MAP(0x37, 0x6F, 0x57E6) /* <CJK */
-MAP(0x37, 0x70, 0x57E7) /* <CJK */
-MAP(0x37, 0x71, 0x57E9) /* <CJK */
-MAP(0x37, 0x72, 0x57ED) /* <CJK */
-MAP(0x37, 0x73, 0x57F0) /* <CJK */
-MAP(0x37, 0x74, 0x57F5) /* <CJK */
-MAP(0x37, 0x75, 0x57F6) /* <CJK */
-MAP(0x37, 0x76, 0x57F8) /* <CJK */
-MAP(0x37, 0x77, 0x57FD) /* <CJK */
-MAP(0x37, 0x78, 0x57FE) /* <CJK */
-MAP(0x37, 0x79, 0x57FF) /* <CJK */
-MAP(0x37, 0x7A, 0x5803) /* <CJK */
-MAP(0x37, 0x7B, 0x5804) /* <CJK */
-MAP(0x37, 0x7C, 0x5808) /* <CJK */
-MAP(0x37, 0x7D, 0x5809) /* <CJK */
-MAP(0x37, 0x7E, 0x57E1) /* <CJK */
-MAP(0x38, 0x21, 0x580C) /* <CJK */
-MAP(0x38, 0x22, 0x580D) /* <CJK */
-MAP(0x38, 0x23, 0x581B) /* <CJK */
-MAP(0x38, 0x24, 0x581E) /* <CJK */
-MAP(0x38, 0x25, 0x581F) /* <CJK */
-MAP(0x38, 0x26, 0x5820) /* <CJK */
-MAP(0x38, 0x27, 0x5826) /* <CJK */
-MAP(0x38, 0x28, 0x5827) /* <CJK */
-MAP(0x38, 0x29, 0x582D) /* <CJK */
-MAP(0x38, 0x2A, 0x5832) /* <CJK */
-MAP(0x38, 0x2B, 0x5839) /* <CJK */
-MAP(0x38, 0x2C, 0x583F) /* <CJK */
-MAP(0x38, 0x2D, 0x5849) /* <CJK */
-MAP(0x38, 0x2E, 0x584C) /* <CJK */
-MAP(0x38, 0x2F, 0x584D) /* <CJK */
-MAP(0x38, 0x30, 0x584F) /* <CJK */
-MAP(0x38, 0x31, 0x5850) /* <CJK */
-MAP(0x38, 0x32, 0x5855) /* <CJK */
-MAP(0x38, 0x33, 0x585F) /* <CJK */
-MAP(0x38, 0x34, 0x5861) /* <CJK */
-MAP(0x38, 0x35, 0x5864) /* <CJK */
-MAP(0x38, 0x36, 0x5867) /* <CJK */
-MAP(0x38, 0x37, 0x5868) /* <CJK */
-MAP(0x38, 0x38, 0x5878) /* <CJK */
-MAP(0x38, 0x39, 0x587C) /* <CJK */
-MAP(0x38, 0x3A, 0x587F) /* <CJK */
-MAP(0x38, 0x3B, 0x5880) /* <CJK */
-MAP(0x38, 0x3C, 0x5881) /* <CJK */
-MAP(0x38, 0x3D, 0x5887) /* <CJK */
-MAP(0x38, 0x3E, 0x5888) /* <CJK */
-MAP(0x38, 0x3F, 0x5889) /* <CJK */
-MAP(0x38, 0x40, 0x588A) /* <CJK */
-MAP(0x38, 0x41, 0x588C) /* <CJK */
-MAP(0x38, 0x42, 0x588D) /* <CJK */
-MAP(0x38, 0x43, 0x588F) /* <CJK */
-MAP(0x38, 0x44, 0x5890) /* <CJK */
-MAP(0x38, 0x45, 0x5894) /* <CJK */
-MAP(0x38, 0x46, 0x5896) /* <CJK */
-MAP(0x38, 0x47, 0x589D) /* <CJK */
-MAP(0x38, 0x48, 0x58A0) /* <CJK */
-MAP(0x38, 0x49, 0x58A1) /* <CJK */
-MAP(0x38, 0x4A, 0x58A2) /* <CJK */
-MAP(0x38, 0x4B, 0x58A6) /* <CJK */
-MAP(0x38, 0x4C, 0x58A9) /* <CJK */
-MAP(0x38, 0x4D, 0x58B1) /* <CJK */
-MAP(0x38, 0x4E, 0x58B2) /* <CJK */
-MAP(0x38, 0x4F, 0x58C4) /* <CJK */
-MAP(0x38, 0x50, 0x58BC) /* <CJK */
-MAP(0x38, 0x51, 0x58C2) /* <CJK */
-MAP(0x38, 0x52, 0x58C8) /* <CJK */
-MAP(0x38, 0x53, 0x58CD) /* <CJK */
-MAP(0x38, 0x54, 0x58CE) /* <CJK */
-MAP(0x38, 0x55, 0x58D0) /* <CJK */
-MAP(0x38, 0x56, 0x58D2) /* <CJK */
-MAP(0x38, 0x57, 0x58D4) /* <CJK */
-MAP(0x38, 0x58, 0x58D6) /* <CJK */
-MAP(0x38, 0x59, 0x58DA) /* <CJK */
-MAP(0x38, 0x5A, 0x58DD) /* <CJK */
-MAP(0x38, 0x5B, 0x58E1) /* <CJK */
-MAP(0x38, 0x5C, 0x58E2) /* <CJK */
-MAP(0x38, 0x5D, 0x58E9) /* <CJK */
-MAP(0x38, 0x5E, 0x58F3) /* <CJK */
-MAP(0x38, 0x5F, 0x5905) /* <CJK */
-MAP(0x38, 0x60, 0x5906) /* <CJK */
-MAP(0x38, 0x61, 0x590B) /* <CJK */
-MAP(0x38, 0x62, 0x590C) /* <CJK */
-MAP(0x38, 0x63, 0x5912) /* <CJK */
-MAP(0x38, 0x64, 0x5913) /* <CJK */
-MAP(0x38, 0x65, 0x5914) /* <CJK */
-MAP(0x38, 0x66, 0x8641) /* <CJK */
-MAP(0x38, 0x67, 0x591D) /* <CJK */
-MAP(0x38, 0x68, 0x5921) /* <CJK */
-MAP(0x38, 0x69, 0x5923) /* <CJK */
-MAP(0x38, 0x6A, 0x5924) /* <CJK */
-MAP(0x38, 0x6B, 0x5928) /* <CJK */
-MAP(0x38, 0x6C, 0x592F) /* <CJK */
-MAP(0x38, 0x6D, 0x5930) /* <CJK */
-MAP(0x38, 0x6E, 0x5933) /* <CJK */
-MAP(0x38, 0x6F, 0x5935) /* <CJK */
-MAP(0x38, 0x70, 0x5936) /* <CJK */
-MAP(0x38, 0x71, 0x593F) /* <CJK */
-MAP(0x38, 0x72, 0x5943) /* <CJK */
-MAP(0x38, 0x73, 0x5946) /* <CJK */
-MAP(0x38, 0x74, 0x5952) /* <CJK */
-MAP(0x38, 0x75, 0x5953) /* <CJK */
-MAP(0x38, 0x76, 0x5959) /* <CJK */
-MAP(0x38, 0x77, 0x595B) /* <CJK */
-MAP(0x38, 0x78, 0x595D) /* <CJK */
-MAP(0x38, 0x79, 0x595E) /* <CJK */
-MAP(0x38, 0x7A, 0x595F) /* <CJK */
-MAP(0x38, 0x7B, 0x5961) /* <CJK */
-MAP(0x38, 0x7C, 0x5963) /* <CJK */
-MAP(0x38, 0x7D, 0x596B) /* <CJK */
-MAP(0x38, 0x7E, 0x596D) /* <CJK */
-MAP(0x39, 0x21, 0x596F) /* <CJK */
-MAP(0x39, 0x22, 0x5972) /* <CJK */
-MAP(0x39, 0x23, 0x5975) /* <CJK */
-MAP(0x39, 0x24, 0x5976) /* <CJK */
-MAP(0x39, 0x25, 0x5979) /* <CJK */
-MAP(0x39, 0x26, 0x597B) /* <CJK */
-MAP(0x39, 0x27, 0x597C) /* <CJK */
-MAP(0x39, 0x28, 0x598B) /* <CJK */
-MAP(0x39, 0x29, 0x598C) /* <CJK */
-MAP(0x39, 0x2A, 0x598E) /* <CJK */
-MAP(0x39, 0x2B, 0x5992) /* <CJK */
-MAP(0x39, 0x2C, 0x5995) /* <CJK */
-MAP(0x39, 0x2D, 0x5997) /* <CJK */
-MAP(0x39, 0x2E, 0x599F) /* <CJK */
-MAP(0x39, 0x2F, 0x59A4) /* <CJK */
-MAP(0x39, 0x30, 0x59A7) /* <CJK */
-MAP(0x39, 0x31, 0x59AD) /* <CJK */
-MAP(0x39, 0x32, 0x59AE) /* <CJK */
-MAP(0x39, 0x33, 0x59AF) /* <CJK */
-MAP(0x39, 0x34, 0x59B0) /* <CJK */
-MAP(0x39, 0x35, 0x59B3) /* <CJK */
-MAP(0x39, 0x36, 0x59B7) /* <CJK */
-MAP(0x39, 0x37, 0x59BA) /* <CJK */
-MAP(0x39, 0x38, 0x59BC) /* <CJK */
-MAP(0x39, 0x39, 0x59C1) /* <CJK */
-MAP(0x39, 0x3A, 0x59C3) /* <CJK */
-MAP(0x39, 0x3B, 0x59C4) /* <CJK */
-MAP(0x39, 0x3C, 0x59C8) /* <CJK */
-MAP(0x39, 0x3D, 0x59CA) /* <CJK */
-MAP(0x39, 0x3E, 0x59CD) /* <CJK */
-MAP(0x39, 0x3F, 0x59D2) /* <CJK */
-MAP(0x39, 0x40, 0x59DD) /* <CJK */
-MAP(0x39, 0x41, 0x59DE) /* <CJK */
-MAP(0x39, 0x42, 0x59DF) /* <CJK */
-MAP(0x39, 0x43, 0x59E3) /* <CJK */
-MAP(0x39, 0x44, 0x59E4) /* <CJK */
-MAP(0x39, 0x45, 0x59E7) /* <CJK */
-MAP(0x39, 0x46, 0x59EE) /* <CJK */
-MAP(0x39, 0x47, 0x59EF) /* <CJK */
-MAP(0x39, 0x48, 0x59F1) /* <CJK */
-MAP(0x39, 0x49, 0x59F2) /* <CJK */
-MAP(0x39, 0x4A, 0x59F4) /* <CJK */
-MAP(0x39, 0x4B, 0x59F7) /* <CJK */
-MAP(0x39, 0x4C, 0x5A00) /* <CJK */
-MAP(0x39, 0x4D, 0x5A04) /* <CJK */
-MAP(0x39, 0x4E, 0x5A0C) /* <CJK */
-MAP(0x39, 0x4F, 0x5A0D) /* <CJK */
-MAP(0x39, 0x50, 0x5A0E) /* <CJK */
-MAP(0x39, 0x51, 0x5A12) /* <CJK */
-MAP(0x39, 0x52, 0x5A13) /* <CJK */
-MAP(0x39, 0x53, 0x5A1E) /* <CJK */
-MAP(0x39, 0x54, 0x5A23) /* <CJK */
-MAP(0x39, 0x55, 0x5A24) /* <CJK */
-MAP(0x39, 0x56, 0x5A27) /* <CJK */
-MAP(0x39, 0x57, 0x5A28) /* <CJK */
-MAP(0x39, 0x58, 0x5A2A) /* <CJK */
-MAP(0x39, 0x59, 0x5A2D) /* <CJK */
-MAP(0x39, 0x5A, 0x5A30) /* <CJK */
-MAP(0x39, 0x5B, 0x5A44) /* <CJK */
-MAP(0x39, 0x5C, 0x5A45) /* <CJK */
-MAP(0x39, 0x5D, 0x5A47) /* <CJK */
-MAP(0x39, 0x5E, 0x5A48) /* <CJK */
-MAP(0x39, 0x5F, 0x5A4C) /* <CJK */
-MAP(0x39, 0x60, 0x5A50) /* <CJK */
-MAP(0x39, 0x61, 0x5A55) /* <CJK */
-MAP(0x39, 0x62, 0x5A5E) /* <CJK */
-MAP(0x39, 0x63, 0x5A63) /* <CJK */
-MAP(0x39, 0x64, 0x5A65) /* <CJK */
-MAP(0x39, 0x65, 0x5A67) /* <CJK */
-MAP(0x39, 0x66, 0x5A6D) /* <CJK */
-MAP(0x39, 0x67, 0x5A77) /* <CJK */
-MAP(0x39, 0x68, 0x5A7A) /* <CJK */
-MAP(0x39, 0x69, 0x5A7B) /* <CJK */
-MAP(0x39, 0x6A, 0x5A7E) /* <CJK */
-MAP(0x39, 0x6B, 0x5A8B) /* <CJK */
-MAP(0x39, 0x6C, 0x5A90) /* <CJK */
-MAP(0x39, 0x6D, 0x5A93) /* <CJK */
-MAP(0x39, 0x6E, 0x5A96) /* <CJK */
-MAP(0x39, 0x6F, 0x5A99) /* <CJK */
-MAP(0x39, 0x70, 0x5A9C) /* <CJK */
-MAP(0x39, 0x71, 0x5A9E) /* <CJK */
-MAP(0x39, 0x72, 0x5A9F) /* <CJK */
-MAP(0x39, 0x73, 0x5AA0) /* <CJK */
-MAP(0x39, 0x74, 0x5AA2) /* <CJK */
-MAP(0x39, 0x75, 0x5AA7) /* <CJK */
-MAP(0x39, 0x76, 0x5AAC) /* <CJK */
-MAP(0x39, 0x77, 0x5AB1) /* <CJK */
-MAP(0x39, 0x78, 0x5AB2) /* <CJK */
-MAP(0x39, 0x79, 0x5AB3) /* <CJK */
-MAP(0x39, 0x7A, 0x5AB5) /* <CJK */
-MAP(0x39, 0x7B, 0x5AB8) /* <CJK */
-MAP(0x39, 0x7C, 0x5ABA) /* <CJK */
-MAP(0x39, 0x7D, 0x5ABB) /* <CJK */
-MAP(0x39, 0x7E, 0x5ABF) /* <CJK */
-MAP(0x3A, 0x21, 0x5AC4) /* <CJK */
-MAP(0x3A, 0x22, 0x5AC6) /* <CJK */
-MAP(0x3A, 0x23, 0x5AC8) /* <CJK */
-MAP(0x3A, 0x24, 0x5ACF) /* <CJK */
-MAP(0x3A, 0x25, 0x5ADA) /* <CJK */
-MAP(0x3A, 0x26, 0x5ADC) /* <CJK */
-MAP(0x3A, 0x27, 0x5AE0) /* <CJK */
-MAP(0x3A, 0x28, 0x5AE5) /* <CJK */
-MAP(0x3A, 0x29, 0x5AEA) /* <CJK */
-MAP(0x3A, 0x2A, 0x5AEE) /* <CJK */
-MAP(0x3A, 0x2B, 0x5AF5) /* <CJK */
-MAP(0x3A, 0x2C, 0x5AF6) /* <CJK */
-MAP(0x3A, 0x2D, 0x5AFD) /* <CJK */
-MAP(0x3A, 0x2E, 0x5B00) /* <CJK */
-MAP(0x3A, 0x2F, 0x5B01) /* <CJK */
-MAP(0x3A, 0x30, 0x5B08) /* <CJK */
-MAP(0x3A, 0x31, 0x5B17) /* <CJK */
-MAP(0x3A, 0x32, 0x5B34) /* <CJK */
-MAP(0x3A, 0x33, 0x5B19) /* <CJK */
-MAP(0x3A, 0x34, 0x5B1B) /* <CJK */
-MAP(0x3A, 0x35, 0x5B1D) /* <CJK */
-MAP(0x3A, 0x36, 0x5B21) /* <CJK */
-MAP(0x3A, 0x37, 0x5B25) /* <CJK */
-MAP(0x3A, 0x38, 0x5B2D) /* <CJK */
-MAP(0x3A, 0x39, 0x5B38) /* <CJK */
-MAP(0x3A, 0x3A, 0x5B41) /* <CJK */
-MAP(0x3A, 0x3B, 0x5B4B) /* <CJK */
-MAP(0x3A, 0x3C, 0x5B4C) /* <CJK */
-MAP(0x3A, 0x3D, 0x5B52) /* <CJK */
-MAP(0x3A, 0x3E, 0x5B56) /* <CJK */
-MAP(0x3A, 0x3F, 0x5B5E) /* <CJK */
-MAP(0x3A, 0x40, 0x5B68) /* <CJK */
-MAP(0x3A, 0x41, 0x5B6E) /* <CJK */
-MAP(0x3A, 0x42, 0x5B6F) /* <CJK */
-MAP(0x3A, 0x43, 0x5B7C) /* <CJK */
-MAP(0x3A, 0x44, 0x5B7D) /* <CJK */
-MAP(0x3A, 0x45, 0x5B7E) /* <CJK */
-MAP(0x3A, 0x46, 0x5B7F) /* <CJK */
-MAP(0x3A, 0x47, 0x5B81) /* <CJK */
-MAP(0x3A, 0x48, 0x5B84) /* <CJK */
-MAP(0x3A, 0x49, 0x5B86) /* <CJK */
-MAP(0x3A, 0x4A, 0x5B8A) /* <CJK */
-MAP(0x3A, 0x4B, 0x5B8E) /* <CJK */
-MAP(0x3A, 0x4C, 0x5B90) /* <CJK */
-MAP(0x3A, 0x4D, 0x5B91) /* <CJK */
-MAP(0x3A, 0x4E, 0x5B93) /* <CJK */
-MAP(0x3A, 0x4F, 0x5B94) /* <CJK */
-MAP(0x3A, 0x50, 0x5B96) /* <CJK */
-MAP(0x3A, 0x51, 0x5BA8) /* <CJK */
-MAP(0x3A, 0x52, 0x5BA9) /* <CJK */
-MAP(0x3A, 0x53, 0x5BAC) /* <CJK */
-MAP(0x3A, 0x54, 0x5BAD) /* <CJK */
-MAP(0x3A, 0x55, 0x5BAF) /* <CJK */
-MAP(0x3A, 0x56, 0x5BB1) /* <CJK */
-MAP(0x3A, 0x57, 0x5BB2) /* <CJK */
-MAP(0x3A, 0x58, 0x5BB7) /* <CJK */
-MAP(0x3A, 0x59, 0x5BBA) /* <CJK */
-MAP(0x3A, 0x5A, 0x5BBC) /* <CJK */
-MAP(0x3A, 0x5B, 0x5BC0) /* <CJK */
-MAP(0x3A, 0x5C, 0x5BC1) /* <CJK */
-MAP(0x3A, 0x5D, 0x5BCD) /* <CJK */
-MAP(0x3A, 0x5E, 0x5BCF) /* <CJK */
-MAP(0x3A, 0x5F, 0x5BD6) /* <CJK */
-MAP(0x3A, 0x60, 0x5BD7) /* <CJK */
-MAP(0x3A, 0x61, 0x5BD8) /* <CJK */
-MAP(0x3A, 0x62, 0x5BD9) /* <CJK */
-MAP(0x3A, 0x63, 0x5BDA) /* <CJK */
-MAP(0x3A, 0x64, 0x5BE0) /* <CJK */
-MAP(0x3A, 0x65, 0x5BEF) /* <CJK */
-MAP(0x3A, 0x66, 0x5BF1) /* <CJK */
-MAP(0x3A, 0x67, 0x5BF4) /* <CJK */
-MAP(0x3A, 0x68, 0x5BFD) /* <CJK */
-MAP(0x3A, 0x69, 0x5C0C) /* <CJK */
-MAP(0x3A, 0x6A, 0x5C17) /* <CJK */
-MAP(0x3A, 0x6B, 0x5C1E) /* <CJK */
-MAP(0x3A, 0x6C, 0x5C1F) /* <CJK */
-MAP(0x3A, 0x6D, 0x5C23) /* <CJK */
-MAP(0x3A, 0x6E, 0x5C26) /* <CJK */
-MAP(0x3A, 0x6F, 0x5C29) /* <CJK */
-MAP(0x3A, 0x70, 0x5C2B) /* <CJK */
-MAP(0x3A, 0x71, 0x5C2C) /* <CJK */
-MAP(0x3A, 0x72, 0x5C2E) /* <CJK */
-MAP(0x3A, 0x73, 0x5C30) /* <CJK */
-MAP(0x3A, 0x74, 0x5C32) /* <CJK */
-MAP(0x3A, 0x75, 0x5C35) /* <CJK */
-MAP(0x3A, 0x76, 0x5C36) /* <CJK */
-MAP(0x3A, 0x77, 0x5C59) /* <CJK */
-MAP(0x3A, 0x78, 0x5C5A) /* <CJK */
-MAP(0x3A, 0x79, 0x5C5C) /* <CJK */
-MAP(0x3A, 0x7A, 0x5C62) /* <CJK */
-MAP(0x3A, 0x7B, 0x5C63) /* <CJK */
-MAP(0x3A, 0x7C, 0x5C67) /* <CJK */
-MAP(0x3A, 0x7D, 0x5C68) /* <CJK */
-MAP(0x3A, 0x7E, 0x5C69) /* <CJK */
-MAP(0x3B, 0x21, 0x5C6D) /* <CJK */
-MAP(0x3B, 0x22, 0x5C70) /* <CJK */
-MAP(0x3B, 0x23, 0x5C74) /* <CJK */
-MAP(0x3B, 0x24, 0x5C75) /* <CJK */
-MAP(0x3B, 0x25, 0x5C7A) /* <CJK */
-MAP(0x3B, 0x26, 0x5C7B) /* <CJK */
-MAP(0x3B, 0x27, 0x5C7C) /* <CJK */
-MAP(0x3B, 0x28, 0x5C7D) /* <CJK */
-MAP(0x3B, 0x29, 0x5C87) /* <CJK */
-MAP(0x3B, 0x2A, 0x5C88) /* <CJK */
-MAP(0x3B, 0x2B, 0x5C8A) /* <CJK */
-MAP(0x3B, 0x2C, 0x5C8F) /* <CJK */
-MAP(0x3B, 0x2D, 0x5C92) /* <CJK */
-MAP(0x3B, 0x2E, 0x5C9D) /* <CJK */
-MAP(0x3B, 0x2F, 0x5C9F) /* <CJK */
-MAP(0x3B, 0x30, 0x5CA0) /* <CJK */
-MAP(0x3B, 0x31, 0x5CA2) /* <CJK */
-MAP(0x3B, 0x32, 0x5CA3) /* <CJK */
-MAP(0x3B, 0x33, 0x5CA6) /* <CJK */
-MAP(0x3B, 0x34, 0x5CAA) /* <CJK */
-MAP(0x3B, 0x35, 0x5CB2) /* <CJK */
-MAP(0x3B, 0x36, 0x5CB4) /* <CJK */
-MAP(0x3B, 0x37, 0x5CB5) /* <CJK */
-MAP(0x3B, 0x38, 0x5CBA) /* <CJK */
-MAP(0x3B, 0x39, 0x5CC9) /* <CJK */
-MAP(0x3B, 0x3A, 0x5CCB) /* <CJK */
-MAP(0x3B, 0x3B, 0x5CD2) /* <CJK */
-MAP(0x3B, 0x3C, 0x5CDD) /* <CJK */
-MAP(0x3B, 0x3D, 0x5CD7) /* <CJK */
-MAP(0x3B, 0x3E, 0x5CEE) /* <CJK */
-MAP(0x3B, 0x3F, 0x5CF1) /* <CJK */
-MAP(0x3B, 0x40, 0x5CF2) /* <CJK */
-MAP(0x3B, 0x41, 0x5CF4) /* <CJK */
-MAP(0x3B, 0x42, 0x5D01) /* <CJK */
-MAP(0x3B, 0x43, 0x5D06) /* <CJK */
-MAP(0x3B, 0x44, 0x5D0D) /* <CJK */
-MAP(0x3B, 0x45, 0x5D12) /* <CJK */
-MAP(0x3B, 0x46, 0x5D2B) /* <CJK */
-MAP(0x3B, 0x47, 0x5D23) /* <CJK */
-MAP(0x3B, 0x48, 0x5D24) /* <CJK */
-MAP(0x3B, 0x49, 0x5D26) /* <CJK */
-MAP(0x3B, 0x4A, 0x5D27) /* <CJK */
-MAP(0x3B, 0x4B, 0x5D31) /* <CJK */
-MAP(0x3B, 0x4C, 0x5D34) /* <CJK */
-MAP(0x3B, 0x4D, 0x5D39) /* <CJK */
-MAP(0x3B, 0x4E, 0x5D3D) /* <CJK */
-MAP(0x3B, 0x4F, 0x5D3F) /* <CJK */
-MAP(0x3B, 0x50, 0x5D42) /* <CJK */
-MAP(0x3B, 0x51, 0x5D43) /* <CJK */
-MAP(0x3B, 0x52, 0x5D46) /* <CJK */
-MAP(0x3B, 0x53, 0x5D48) /* <CJK */
-MAP(0x3B, 0x54, 0x5D55) /* <CJK */
-MAP(0x3B, 0x55, 0x5D51) /* <CJK */
-MAP(0x3B, 0x56, 0x5D59) /* <CJK */
-MAP(0x3B, 0x57, 0x5D4A) /* <CJK */
-MAP(0x3B, 0x58, 0x5D5F) /* <CJK */
-MAP(0x3B, 0x59, 0x5D60) /* <CJK */
-MAP(0x3B, 0x5A, 0x5D61) /* <CJK */
-MAP(0x3B, 0x5B, 0x5D62) /* <CJK */
-MAP(0x3B, 0x5C, 0x5D64) /* <CJK */
-MAP(0x3B, 0x5D, 0x5D6A) /* <CJK */
-MAP(0x3B, 0x5E, 0x5D6D) /* <CJK */
-MAP(0x3B, 0x5F, 0x5D70) /* <CJK */
-MAP(0x3B, 0x60, 0x5D79) /* <CJK */
-MAP(0x3B, 0x61, 0x5D7A) /* <CJK */
-MAP(0x3B, 0x62, 0x5D7E) /* <CJK */
-MAP(0x3B, 0x63, 0x5D7F) /* <CJK */
-MAP(0x3B, 0x64, 0x5D81) /* <CJK */
-MAP(0x3B, 0x65, 0x5D83) /* <CJK */
-MAP(0x3B, 0x66, 0x5D88) /* <CJK */
-MAP(0x3B, 0x67, 0x5D8A) /* <CJK */
-MAP(0x3B, 0x68, 0x5D92) /* <CJK */
-MAP(0x3B, 0x69, 0x5D93) /* <CJK */
-MAP(0x3B, 0x6A, 0x5D94) /* <CJK */
-MAP(0x3B, 0x6B, 0x5D95) /* <CJK */
-MAP(0x3B, 0x6C, 0x5D99) /* <CJK */
-MAP(0x3B, 0x6D, 0x5D9B) /* <CJK */
-MAP(0x3B, 0x6E, 0x5D9F) /* <CJK */
-MAP(0x3B, 0x6F, 0x5DA0) /* <CJK */
-MAP(0x3B, 0x70, 0x5DA7) /* <CJK */
-MAP(0x3B, 0x71, 0x5DAB) /* <CJK */
-MAP(0x3B, 0x72, 0x5DB0) /* <CJK */
-MAP(0x3B, 0x73, 0x5DB4) /* <CJK */
-MAP(0x3B, 0x74, 0x5DB8) /* <CJK */
-MAP(0x3B, 0x75, 0x5DB9) /* <CJK */
-MAP(0x3B, 0x76, 0x5DC3) /* <CJK */
-MAP(0x3B, 0x77, 0x5DC7) /* <CJK */
-MAP(0x3B, 0x78, 0x5DCB) /* <CJK */
-MAP(0x3B, 0x79, 0x5DD0) /* <CJK */
-MAP(0x3B, 0x7A, 0x5DCE) /* <CJK */
-MAP(0x3B, 0x7B, 0x5DD8) /* <CJK */
-MAP(0x3B, 0x7C, 0x5DD9) /* <CJK */
-MAP(0x3B, 0x7D, 0x5DE0) /* <CJK */
-MAP(0x3B, 0x7E, 0x5DE4) /* <CJK */
-MAP(0x3C, 0x21, 0x5DE9) /* <CJK */
-MAP(0x3C, 0x22, 0x5DF8) /* <CJK */
-MAP(0x3C, 0x23, 0x5DF9) /* <CJK */
-MAP(0x3C, 0x24, 0x5E00) /* <CJK */
-MAP(0x3C, 0x25, 0x5E07) /* <CJK */
-MAP(0x3C, 0x26, 0x5E0D) /* <CJK */
-MAP(0x3C, 0x27, 0x5E12) /* <CJK */
-MAP(0x3C, 0x28, 0x5E14) /* <CJK */
-MAP(0x3C, 0x29, 0x5E15) /* <CJK */
-MAP(0x3C, 0x2A, 0x5E18) /* <CJK */
-MAP(0x3C, 0x2B, 0x5E1F) /* <CJK */
-MAP(0x3C, 0x2C, 0x5E20) /* <CJK */
-MAP(0x3C, 0x2D, 0x5E2E) /* <CJK */
-MAP(0x3C, 0x2E, 0x5E28) /* <CJK */
-MAP(0x3C, 0x2F, 0x5E32) /* <CJK */
-MAP(0x3C, 0x30, 0x5E35) /* <CJK */
-MAP(0x3C, 0x31, 0x5E3E) /* <CJK */
-MAP(0x3C, 0x32, 0x5E4B) /* <CJK */
-MAP(0x3C, 0x33, 0x5E50) /* <CJK */
-MAP(0x3C, 0x34, 0x5E49) /* <CJK */
-MAP(0x3C, 0x35, 0x5E51) /* <CJK */
-MAP(0x3C, 0x36, 0x5E56) /* <CJK */
-MAP(0x3C, 0x37, 0x5E58) /* <CJK */
-MAP(0x3C, 0x38, 0x5E5B) /* <CJK */
-MAP(0x3C, 0x39, 0x5E5C) /* <CJK */
-MAP(0x3C, 0x3A, 0x5E5E) /* <CJK */
-MAP(0x3C, 0x3B, 0x5E68) /* <CJK */
-MAP(0x3C, 0x3C, 0x5E6A) /* <CJK */
-MAP(0x3C, 0x3D, 0x5E6B) /* <CJK */
-MAP(0x3C, 0x3E, 0x5E6C) /* <CJK */
-MAP(0x3C, 0x3F, 0x5E6D) /* <CJK */
-MAP(0x3C, 0x40, 0x5E6E) /* <CJK */
-MAP(0x3C, 0x41, 0x5E70) /* <CJK */
-MAP(0x3C, 0x42, 0x5E80) /* <CJK */
-MAP(0x3C, 0x43, 0x5E8B) /* <CJK */
-MAP(0x3C, 0x44, 0x5E8E) /* <CJK */
-MAP(0x3C, 0x45, 0x5EA2) /* <CJK */
-MAP(0x3C, 0x46, 0x5EA4) /* <CJK */
-MAP(0x3C, 0x47, 0x5EA5) /* <CJK */
-MAP(0x3C, 0x48, 0x5EA8) /* <CJK */
-MAP(0x3C, 0x49, 0x5EAA) /* <CJK */
-MAP(0x3C, 0x4A, 0x5EAC) /* <CJK */
-MAP(0x3C, 0x4B, 0x5EB1) /* <CJK */
-MAP(0x3C, 0x4C, 0x5EB3) /* <CJK */
-MAP(0x3C, 0x4D, 0x5EBD) /* <CJK */
-MAP(0x3C, 0x4E, 0x5EBE) /* <CJK */
-MAP(0x3C, 0x4F, 0x5EBF) /* <CJK */
-MAP(0x3C, 0x50, 0x5EC6) /* <CJK */
-MAP(0x3C, 0x51, 0x5ECC) /* <CJK */
-MAP(0x3C, 0x52, 0x5ECB) /* <CJK */
-MAP(0x3C, 0x53, 0x5ECE) /* <CJK */
-MAP(0x3C, 0x54, 0x5ED1) /* <CJK */
-MAP(0x3C, 0x55, 0x5ED2) /* <CJK */
-MAP(0x3C, 0x56, 0x5ED4) /* <CJK */
-MAP(0x3C, 0x57, 0x5ED5) /* <CJK */
-MAP(0x3C, 0x58, 0x5EDC) /* <CJK */
-MAP(0x3C, 0x59, 0x5EDE) /* <CJK */
-MAP(0x3C, 0x5A, 0x5EE5) /* <CJK */
-MAP(0x3C, 0x5B, 0x5EEB) /* <CJK */
-MAP(0x3C, 0x5C, 0x5F02) /* <CJK */
-MAP(0x3C, 0x5D, 0x5F06) /* <CJK */
-MAP(0x3C, 0x5E, 0x5F07) /* <CJK */
-MAP(0x3C, 0x5F, 0x5F08) /* <CJK */
-MAP(0x3C, 0x60, 0x5F0E) /* <CJK */
-MAP(0x3C, 0x61, 0x5F19) /* <CJK */
-MAP(0x3C, 0x62, 0x5F1C) /* <CJK */
-MAP(0x3C, 0x63, 0x5F1D) /* <CJK */
-MAP(0x3C, 0x64, 0x5F21) /* <CJK */
-MAP(0x3C, 0x65, 0x5F22) /* <CJK */
-MAP(0x3C, 0x66, 0x5F23) /* <CJK */
-MAP(0x3C, 0x67, 0x5F24) /* <CJK */
-MAP(0x3C, 0x68, 0x5F28) /* <CJK */
-MAP(0x3C, 0x69, 0x5F2B) /* <CJK */
-MAP(0x3C, 0x6A, 0x5F2C) /* <CJK */
-MAP(0x3C, 0x6B, 0x5F2E) /* <CJK */
-MAP(0x3C, 0x6C, 0x5F30) /* <CJK */
-MAP(0x3C, 0x6D, 0x5F34) /* <CJK */
-MAP(0x3C, 0x6E, 0x5F36) /* <CJK */
-MAP(0x3C, 0x6F, 0x5F3B) /* <CJK */
-MAP(0x3C, 0x70, 0x5F3D) /* <CJK */
-MAP(0x3C, 0x71, 0x5F3F) /* <CJK */
-MAP(0x3C, 0x72, 0x5F40) /* <CJK */
-MAP(0x3C, 0x73, 0x5F44) /* <CJK */
-MAP(0x3C, 0x74, 0x5F45) /* <CJK */
-MAP(0x3C, 0x75, 0x5F47) /* <CJK */
-MAP(0x3C, 0x76, 0x5F4D) /* <CJK */
-MAP(0x3C, 0x77, 0x5F50) /* <CJK */
-MAP(0x3C, 0x78, 0x5F54) /* <CJK */
-MAP(0x3C, 0x79, 0x5F58) /* <CJK */
-MAP(0x3C, 0x7A, 0x5F5B) /* <CJK */
-MAP(0x3C, 0x7B, 0x5F60) /* <CJK */
-MAP(0x3C, 0x7C, 0x5F63) /* <CJK */
-MAP(0x3C, 0x7D, 0x5F64) /* <CJK */
-MAP(0x3C, 0x7E, 0x5F67) /* <CJK */
-MAP(0x3D, 0x21, 0x5F6F) /* <CJK */
-MAP(0x3D, 0x22, 0x5F72) /* <CJK */
-MAP(0x3D, 0x23, 0x5F74) /* <CJK */
-MAP(0x3D, 0x24, 0x5F75) /* <CJK */
-MAP(0x3D, 0x25, 0x5F78) /* <CJK */
-MAP(0x3D, 0x26, 0x5F7A) /* <CJK */
-MAP(0x3D, 0x27, 0x5F7D) /* <CJK */
-MAP(0x3D, 0x28, 0x5F7E) /* <CJK */
-MAP(0x3D, 0x29, 0x5F89) /* <CJK */
-MAP(0x3D, 0x2A, 0x5F8D) /* <CJK */
-MAP(0x3D, 0x2B, 0x5F8F) /* <CJK */
-MAP(0x3D, 0x2C, 0x5F96) /* <CJK */
-MAP(0x3D, 0x2D, 0x5F9C) /* <CJK */
-MAP(0x3D, 0x2E, 0x5F9D) /* <CJK */
-MAP(0x3D, 0x2F, 0x5FA2) /* <CJK */
-MAP(0x3D, 0x30, 0x5FA7) /* <CJK */
-MAP(0x3D, 0x31, 0x5FAB) /* <CJK */
-MAP(0x3D, 0x32, 0x5FA4) /* <CJK */
-MAP(0x3D, 0x33, 0x5FAC) /* <CJK */
-MAP(0x3D, 0x34, 0x5FAF) /* <CJK */
-MAP(0x3D, 0x35, 0x5FB0) /* <CJK */
-MAP(0x3D, 0x36, 0x5FB1) /* <CJK */
-MAP(0x3D, 0x37, 0x5FB8) /* <CJK */
-MAP(0x3D, 0x38, 0x5FC4) /* <CJK */
-MAP(0x3D, 0x39, 0x5FC7) /* <CJK */
-MAP(0x3D, 0x3A, 0x5FC8) /* <CJK */
-MAP(0x3D, 0x3B, 0x5FC9) /* <CJK */
-MAP(0x3D, 0x3C, 0x5FCB) /* <CJK */
-MAP(0x3D, 0x3D, 0x5FD0) /* <CJK */
-MAP(0x3D, 0x3E, 0x5FD1) /* <CJK */
-MAP(0x3D, 0x3F, 0x5FD2) /* <CJK */
-MAP(0x3D, 0x40, 0x5FD3) /* <CJK */
-MAP(0x3D, 0x41, 0x5FD4) /* <CJK */
-MAP(0x3D, 0x42, 0x5FDE) /* <CJK */
-MAP(0x3D, 0x43, 0x5FE1) /* <CJK */
-MAP(0x3D, 0x44, 0x5FE2) /* <CJK */
-MAP(0x3D, 0x45, 0x5FE8) /* <CJK */
-MAP(0x3D, 0x46, 0x5FE9) /* <CJK */
-MAP(0x3D, 0x47, 0x5FEA) /* <CJK */
-MAP(0x3D, 0x48, 0x5FEC) /* <CJK */
-MAP(0x3D, 0x49, 0x5FED) /* <CJK */
-MAP(0x3D, 0x4A, 0x5FEE) /* <CJK */
-MAP(0x3D, 0x4B, 0x5FEF) /* <CJK */
-MAP(0x3D, 0x4C, 0x5FF2) /* <CJK */
-MAP(0x3D, 0x4D, 0x5FF3) /* <CJK */
-MAP(0x3D, 0x4E, 0x5FF6) /* <CJK */
-MAP(0x3D, 0x4F, 0x5FFA) /* <CJK */
-MAP(0x3D, 0x50, 0x5FFC) /* <CJK */
-MAP(0x3D, 0x51, 0x6007) /* <CJK */
-MAP(0x3D, 0x52, 0x600A) /* <CJK */
-MAP(0x3D, 0x53, 0x600D) /* <CJK */
-MAP(0x3D, 0x54, 0x6013) /* <CJK */
-MAP(0x3D, 0x55, 0x6014) /* <CJK */
-MAP(0x3D, 0x56, 0x6017) /* <CJK */
-MAP(0x3D, 0x57, 0x6018) /* <CJK */
-MAP(0x3D, 0x58, 0x601A) /* <CJK */
-MAP(0x3D, 0x59, 0x601F) /* <CJK */
-MAP(0x3D, 0x5A, 0x6024) /* <CJK */
-MAP(0x3D, 0x5B, 0x602D) /* <CJK */
-MAP(0x3D, 0x5C, 0x6033) /* <CJK */
-MAP(0x3D, 0x5D, 0x6035) /* <CJK */
-MAP(0x3D, 0x5E, 0x6040) /* <CJK */
-MAP(0x3D, 0x5F, 0x6047) /* <CJK */
-MAP(0x3D, 0x60, 0x6048) /* <CJK */
-MAP(0x3D, 0x61, 0x6049) /* <CJK */
-MAP(0x3D, 0x62, 0x604C) /* <CJK */
-MAP(0x3D, 0x63, 0x6051) /* <CJK */
-MAP(0x3D, 0x64, 0x6054) /* <CJK */
-MAP(0x3D, 0x65, 0x6056) /* <CJK */
-MAP(0x3D, 0x66, 0x6057) /* <CJK */
-MAP(0x3D, 0x67, 0x605D) /* <CJK */
-MAP(0x3D, 0x68, 0x6061) /* <CJK */
-MAP(0x3D, 0x69, 0x6067) /* <CJK */
-MAP(0x3D, 0x6A, 0x6071) /* <CJK */
-MAP(0x3D, 0x6B, 0x607E) /* <CJK */
-MAP(0x3D, 0x6C, 0x607F) /* <CJK */
-MAP(0x3D, 0x6D, 0x6082) /* <CJK */
-MAP(0x3D, 0x6E, 0x6086) /* <CJK */
-MAP(0x3D, 0x6F, 0x6088) /* <CJK */
-MAP(0x3D, 0x70, 0x608A) /* <CJK */
-MAP(0x3D, 0x71, 0x608E) /* <CJK */
-MAP(0x3D, 0x72, 0x6091) /* <CJK */
-MAP(0x3D, 0x73, 0x6093) /* <CJK */
-MAP(0x3D, 0x74, 0x6095) /* <CJK */
-MAP(0x3D, 0x75, 0x6098) /* <CJK */
-MAP(0x3D, 0x76, 0x609D) /* <CJK */
-MAP(0x3D, 0x77, 0x609E) /* <CJK */
-MAP(0x3D, 0x78, 0x60A2) /* <CJK */
-MAP(0x3D, 0x79, 0x60A4) /* <CJK */
-MAP(0x3D, 0x7A, 0x60A5) /* <CJK */
-MAP(0x3D, 0x7B, 0x60A8) /* <CJK */
-MAP(0x3D, 0x7C, 0x60B0) /* <CJK */
-MAP(0x3D, 0x7D, 0x60B1) /* <CJK */
-MAP(0x3D, 0x7E, 0x60B7) /* <CJK */
-MAP(0x3E, 0x21, 0x60BB) /* <CJK */
-MAP(0x3E, 0x22, 0x60BE) /* <CJK */
-MAP(0x3E, 0x23, 0x60C2) /* <CJK */
-MAP(0x3E, 0x24, 0x60C4) /* <CJK */
-MAP(0x3E, 0x25, 0x60C8) /* <CJK */
-MAP(0x3E, 0x26, 0x60C9) /* <CJK */
-MAP(0x3E, 0x27, 0x60CA) /* <CJK */
-MAP(0x3E, 0x28, 0x60CB) /* <CJK */
-MAP(0x3E, 0x29, 0x60CE) /* <CJK */
-MAP(0x3E, 0x2A, 0x60CF) /* <CJK */
-MAP(0x3E, 0x2B, 0x60D4) /* <CJK */
-MAP(0x3E, 0x2C, 0x60D5) /* <CJK */
-MAP(0x3E, 0x2D, 0x60D9) /* <CJK */
-MAP(0x3E, 0x2E, 0x60DB) /* <CJK */
-MAP(0x3E, 0x2F, 0x60DD) /* <CJK */
-MAP(0x3E, 0x30, 0x60DE) /* <CJK */
-MAP(0x3E, 0x31, 0x60E2) /* <CJK */
-MAP(0x3E, 0x32, 0x60E5) /* <CJK */
-MAP(0x3E, 0x33, 0x60F2) /* <CJK */
-MAP(0x3E, 0x34, 0x60F5) /* <CJK */
-MAP(0x3E, 0x35, 0x60F8) /* <CJK */
-MAP(0x3E, 0x36, 0x60FC) /* <CJK */
-MAP(0x3E, 0x37, 0x60FD) /* <CJK */
-MAP(0x3E, 0x38, 0x6102) /* <CJK */
-MAP(0x3E, 0x39, 0x6107) /* <CJK */
-MAP(0x3E, 0x3A, 0x610A) /* <CJK */
-MAP(0x3E, 0x3B, 0x610C) /* <CJK */
-MAP(0x3E, 0x3C, 0x6110) /* <CJK */
-MAP(0x3E, 0x3D, 0x6111) /* <CJK */
-MAP(0x3E, 0x3E, 0x6112) /* <CJK */
-MAP(0x3E, 0x3F, 0x6113) /* <CJK */
-MAP(0x3E, 0x40, 0x6114) /* <CJK */
-MAP(0x3E, 0x41, 0x6116) /* <CJK */
-MAP(0x3E, 0x42, 0x6117) /* <CJK */
-MAP(0x3E, 0x43, 0x6119) /* <CJK */
-MAP(0x3E, 0x44, 0x611C) /* <CJK */
-MAP(0x3E, 0x45, 0x611E) /* <CJK */
-MAP(0x3E, 0x46, 0x6122) /* <CJK */
-MAP(0x3E, 0x47, 0x612A) /* <CJK */
-MAP(0x3E, 0x48, 0x612B) /* <CJK */
-MAP(0x3E, 0x49, 0x6130) /* <CJK */
-MAP(0x3E, 0x4A, 0x6131) /* <CJK */
-MAP(0x3E, 0x4B, 0x6135) /* <CJK */
-MAP(0x3E, 0x4C, 0x6136) /* <CJK */
-MAP(0x3E, 0x4D, 0x6137) /* <CJK */
-MAP(0x3E, 0x4E, 0x6139) /* <CJK */
-MAP(0x3E, 0x4F, 0x6141) /* <CJK */
-MAP(0x3E, 0x50, 0x6145) /* <CJK */
-MAP(0x3E, 0x51, 0x6146) /* <CJK */
-MAP(0x3E, 0x52, 0x6149) /* <CJK */
-MAP(0x3E, 0x53, 0x615E) /* <CJK */
-MAP(0x3E, 0x54, 0x6160) /* <CJK */
-MAP(0x3E, 0x55, 0x616C) /* <CJK */
-MAP(0x3E, 0x56, 0x6172) /* <CJK */
-MAP(0x3E, 0x57, 0x6178) /* <CJK */
-MAP(0x3E, 0x58, 0x617B) /* <CJK */
-MAP(0x3E, 0x59, 0x617C) /* <CJK */
-MAP(0x3E, 0x5A, 0x617F) /* <CJK */
-MAP(0x3E, 0x5B, 0x6180) /* <CJK */
-MAP(0x3E, 0x5C, 0x6181) /* <CJK */
-MAP(0x3E, 0x5D, 0x6183) /* <CJK */
-MAP(0x3E, 0x5E, 0x6184) /* <CJK */
-MAP(0x3E, 0x5F, 0x618B) /* <CJK */
-MAP(0x3E, 0x60, 0x618D) /* <CJK */
-MAP(0x3E, 0x61, 0x6192) /* <CJK */
-MAP(0x3E, 0x62, 0x6193) /* <CJK */
-MAP(0x3E, 0x63, 0x6197) /* <CJK */
-MAP(0x3E, 0x64, 0x6198) /* <CJK */
-MAP(0x3E, 0x65, 0x619C) /* <CJK */
-MAP(0x3E, 0x66, 0x619D) /* <CJK */
-MAP(0x3E, 0x67, 0x619F) /* <CJK */
-MAP(0x3E, 0x68, 0x61A0) /* <CJK */
-MAP(0x3E, 0x69, 0x61A5) /* <CJK */
-MAP(0x3E, 0x6A, 0x61A8) /* <CJK */
-MAP(0x3E, 0x6B, 0x61AA) /* <CJK */
-MAP(0x3E, 0x6C, 0x61AD) /* <CJK */
-MAP(0x3E, 0x6D, 0x61B8) /* <CJK */
-MAP(0x3E, 0x6E, 0x61B9) /* <CJK */
-MAP(0x3E, 0x6F, 0x61BC) /* <CJK */
-MAP(0x3E, 0x70, 0x61C0) /* <CJK */
-MAP(0x3E, 0x71, 0x61C1) /* <CJK */
-MAP(0x3E, 0x72, 0x61C2) /* <CJK */
-MAP(0x3E, 0x73, 0x61CE) /* <CJK */
-MAP(0x3E, 0x74, 0x61CF) /* <CJK */
-MAP(0x3E, 0x75, 0x61D5) /* <CJK */
-MAP(0x3E, 0x76, 0x61DC) /* <CJK */
-MAP(0x3E, 0x77, 0x61DD) /* <CJK */
-MAP(0x3E, 0x78, 0x61DE) /* <CJK */
-MAP(0x3E, 0x79, 0x61DF) /* <CJK */
-MAP(0x3E, 0x7A, 0x61E1) /* <CJK */
-MAP(0x3E, 0x7B, 0x61E2) /* <CJK */
-MAP(0x3E, 0x7C, 0x61E7) /* <CJK */
-MAP(0x3E, 0x7D, 0x61E9) /* <CJK */
-MAP(0x3E, 0x7E, 0x61E5) /* <CJK */
-MAP(0x3F, 0x21, 0x61EC) /* <CJK */
-MAP(0x3F, 0x22, 0x61ED) /* <CJK */
-MAP(0x3F, 0x23, 0x61EF) /* <CJK */
-MAP(0x3F, 0x24, 0x6201) /* <CJK */
-MAP(0x3F, 0x25, 0x6203) /* <CJK */
-MAP(0x3F, 0x26, 0x6204) /* <CJK */
-MAP(0x3F, 0x27, 0x6207) /* <CJK */
-MAP(0x3F, 0x28, 0x6213) /* <CJK */
-MAP(0x3F, 0x29, 0x6215) /* <CJK */
-MAP(0x3F, 0x2A, 0x621C) /* <CJK */
-MAP(0x3F, 0x2B, 0x6220) /* <CJK */
-MAP(0x3F, 0x2C, 0x6222) /* <CJK */
-MAP(0x3F, 0x2D, 0x6223) /* <CJK */
-MAP(0x3F, 0x2E, 0x6227) /* <CJK */
-MAP(0x3F, 0x2F, 0x6229) /* <CJK */
-MAP(0x3F, 0x30, 0x622B) /* <CJK */
-MAP(0x3F, 0x31, 0x6239) /* <CJK */
-MAP(0x3F, 0x32, 0x623D) /* <CJK */
-MAP(0x3F, 0x33, 0x6242) /* <CJK */
-MAP(0x3F, 0x34, 0x6243) /* <CJK */
-MAP(0x3F, 0x35, 0x6244) /* <CJK */
-MAP(0x3F, 0x36, 0x6246) /* <CJK */
-MAP(0x3F, 0x37, 0x624C) /* <CJK */
-MAP(0x3F, 0x38, 0x6250) /* <CJK */
-MAP(0x3F, 0x39, 0x6251) /* <CJK */
-MAP(0x3F, 0x3A, 0x6252) /* <CJK */
-MAP(0x3F, 0x3B, 0x6254) /* <CJK */
-MAP(0x3F, 0x3C, 0x6256) /* <CJK */
-MAP(0x3F, 0x3D, 0x625A) /* <CJK */
-MAP(0x3F, 0x3E, 0x625C) /* <CJK */
-MAP(0x3F, 0x3F, 0x6264) /* <CJK */
-MAP(0x3F, 0x40, 0x626D) /* <CJK */
-MAP(0x3F, 0x41, 0x626F) /* <CJK */
-MAP(0x3F, 0x42, 0x6273) /* <CJK */
-MAP(0x3F, 0x43, 0x627A) /* <CJK */
-MAP(0x3F, 0x44, 0x627D) /* <CJK */
-MAP(0x3F, 0x45, 0x628D) /* <CJK */
-MAP(0x3F, 0x46, 0x628E) /* <CJK */
-MAP(0x3F, 0x47, 0x628F) /* <CJK */
-MAP(0x3F, 0x48, 0x6290) /* <CJK */
-MAP(0x3F, 0x49, 0x62A6) /* <CJK */
-MAP(0x3F, 0x4A, 0x62A8) /* <CJK */
-MAP(0x3F, 0x4B, 0x62B3) /* <CJK */
-MAP(0x3F, 0x4C, 0x62B6) /* <CJK */
-MAP(0x3F, 0x4D, 0x62B7) /* <CJK */
-MAP(0x3F, 0x4E, 0x62BA) /* <CJK */
-MAP(0x3F, 0x4F, 0x62BE) /* <CJK */
-MAP(0x3F, 0x50, 0x62BF) /* <CJK */
-MAP(0x3F, 0x51, 0x62C4) /* <CJK */
-MAP(0x3F, 0x52, 0x62CE) /* <CJK */
-MAP(0x3F, 0x53, 0x62D5) /* <CJK */
-MAP(0x3F, 0x54, 0x62D6) /* <CJK */
-MAP(0x3F, 0x55, 0x62DA) /* <CJK */
-MAP(0x3F, 0x56, 0x62EA) /* <CJK */
-MAP(0x3F, 0x57, 0x62F2) /* <CJK */
-MAP(0x3F, 0x58, 0x62F4) /* <CJK */
-MAP(0x3F, 0x59, 0x62FC) /* <CJK */
-MAP(0x3F, 0x5A, 0x62FD) /* <CJK */
-MAP(0x3F, 0x5B, 0x6303) /* <CJK */
-MAP(0x3F, 0x5C, 0x6304) /* <CJK */
-MAP(0x3F, 0x5D, 0x630A) /* <CJK */
-MAP(0x3F, 0x5E, 0x630B) /* <CJK */
-MAP(0x3F, 0x5F, 0x630D) /* <CJK */
-MAP(0x3F, 0x60, 0x6310) /* <CJK */
-MAP(0x3F, 0x61, 0x6313) /* <CJK */
-MAP(0x3F, 0x62, 0x6316) /* <CJK */
-MAP(0x3F, 0x63, 0x6318) /* <CJK */
-MAP(0x3F, 0x64, 0x6329) /* <CJK */
-MAP(0x3F, 0x65, 0x632A) /* <CJK */
-MAP(0x3F, 0x66, 0x632D) /* <CJK */
-MAP(0x3F, 0x67, 0x6335) /* <CJK */
-MAP(0x3F, 0x68, 0x6336) /* <CJK */
-MAP(0x3F, 0x69, 0x6339) /* <CJK */
-MAP(0x3F, 0x6A, 0x633C) /* <CJK */
-MAP(0x3F, 0x6B, 0x6341) /* <CJK */
-MAP(0x3F, 0x6C, 0x6342) /* <CJK */
-MAP(0x3F, 0x6D, 0x6343) /* <CJK */
-MAP(0x3F, 0x6E, 0x6344) /* <CJK */
-MAP(0x3F, 0x6F, 0x6346) /* <CJK */
-MAP(0x3F, 0x70, 0x634A) /* <CJK */
-MAP(0x3F, 0x71, 0x634B) /* <CJK */
-MAP(0x3F, 0x72, 0x634E) /* <CJK */
-MAP(0x3F, 0x73, 0x6352) /* <CJK */
-MAP(0x3F, 0x74, 0x6353) /* <CJK */
-MAP(0x3F, 0x75, 0x6354) /* <CJK */
-MAP(0x3F, 0x76, 0x6358) /* <CJK */
-MAP(0x3F, 0x77, 0x635B) /* <CJK */
-MAP(0x3F, 0x78, 0x6365) /* <CJK */
-MAP(0x3F, 0x79, 0x6366) /* <CJK */
-MAP(0x3F, 0x7A, 0x636C) /* <CJK */
-MAP(0x3F, 0x7B, 0x636D) /* <CJK */
-MAP(0x3F, 0x7C, 0x6371) /* <CJK */
-MAP(0x3F, 0x7D, 0x6374) /* <CJK */
-MAP(0x3F, 0x7E, 0x6375) /* <CJK */
-MAP(0x40, 0x21, 0x6378) /* <CJK */
-MAP(0x40, 0x22, 0x637C) /* <CJK */
-MAP(0x40, 0x23, 0x637D) /* <CJK */
-MAP(0x40, 0x24, 0x637F) /* <CJK */
-MAP(0x40, 0x25, 0x6382) /* <CJK */
-MAP(0x40, 0x26, 0x6384) /* <CJK */
-MAP(0x40, 0x27, 0x6387) /* <CJK */
-MAP(0x40, 0x28, 0x638A) /* <CJK */
-MAP(0x40, 0x29, 0x6390) /* <CJK */
-MAP(0x40, 0x2A, 0x6394) /* <CJK */
-MAP(0x40, 0x2B, 0x6395) /* <CJK */
-MAP(0x40, 0x2C, 0x6399) /* <CJK */
-MAP(0x40, 0x2D, 0x639A) /* <CJK */
-MAP(0x40, 0x2E, 0x639E) /* <CJK */
-MAP(0x40, 0x2F, 0x63A4) /* <CJK */
-MAP(0x40, 0x30, 0x63A6) /* <CJK */
-MAP(0x40, 0x31, 0x63AD) /* <CJK */
-MAP(0x40, 0x32, 0x63AE) /* <CJK */
-MAP(0x40, 0x33, 0x63AF) /* <CJK */
-MAP(0x40, 0x34, 0x63BD) /* <CJK */
-MAP(0x40, 0x35, 0x63C1) /* <CJK */
-MAP(0x40, 0x36, 0x63C5) /* <CJK */
-MAP(0x40, 0x37, 0x63C8) /* <CJK */
-MAP(0x40, 0x38, 0x63CE) /* <CJK */
-MAP(0x40, 0x39, 0x63D1) /* <CJK */
-MAP(0x40, 0x3A, 0x63D3) /* <CJK */
-MAP(0x40, 0x3B, 0x63D4) /* <CJK */
-MAP(0x40, 0x3C, 0x63D5) /* <CJK */
-MAP(0x40, 0x3D, 0x63DC) /* <CJK */
-MAP(0x40, 0x3E, 0x63E0) /* <CJK */
-MAP(0x40, 0x3F, 0x63E5) /* <CJK */
-MAP(0x40, 0x40, 0x63EA) /* <CJK */
-MAP(0x40, 0x41, 0x63EC) /* <CJK */
-MAP(0x40, 0x42, 0x63F2) /* <CJK */
-MAP(0x40, 0x43, 0x63F3) /* <CJK */
-MAP(0x40, 0x44, 0x63F5) /* <CJK */
-MAP(0x40, 0x45, 0x63F8) /* <CJK */
-MAP(0x40, 0x46, 0x63F9) /* <CJK */
-MAP(0x40, 0x47, 0x6409) /* <CJK */
-MAP(0x40, 0x48, 0x640A) /* <CJK */
-MAP(0x40, 0x49, 0x6410) /* <CJK */
-MAP(0x40, 0x4A, 0x6412) /* <CJK */
-MAP(0x40, 0x4B, 0x6414) /* <CJK */
-MAP(0x40, 0x4C, 0x6418) /* <CJK */
-MAP(0x40, 0x4D, 0x641E) /* <CJK */
-MAP(0x40, 0x4E, 0x6420) /* <CJK */
-MAP(0x40, 0x4F, 0x6422) /* <CJK */
-MAP(0x40, 0x50, 0x6424) /* <CJK */
-MAP(0x40, 0x51, 0x6425) /* <CJK */
-MAP(0x40, 0x52, 0x6429) /* <CJK */
-MAP(0x40, 0x53, 0x642A) /* <CJK */
-MAP(0x40, 0x54, 0x642F) /* <CJK */
-MAP(0x40, 0x55, 0x6430) /* <CJK */
-MAP(0x40, 0x56, 0x6435) /* <CJK */
-MAP(0x40, 0x57, 0x643D) /* <CJK */
-MAP(0x40, 0x58, 0x643F) /* <CJK */
-MAP(0x40, 0x59, 0x644B) /* <CJK */
-MAP(0x40, 0x5A, 0x644F) /* <CJK */
-MAP(0x40, 0x5B, 0x6451) /* <CJK */
-MAP(0x40, 0x5C, 0x6452) /* <CJK */
-MAP(0x40, 0x5D, 0x6453) /* <CJK */
-MAP(0x40, 0x5E, 0x6454) /* <CJK */
-MAP(0x40, 0x5F, 0x645A) /* <CJK */
-MAP(0x40, 0x60, 0x645B) /* <CJK */
-MAP(0x40, 0x61, 0x645C) /* <CJK */
-MAP(0x40, 0x62, 0x645D) /* <CJK */
-MAP(0x40, 0x63, 0x645F) /* <CJK */
-MAP(0x40, 0x64, 0x6460) /* <CJK */
-MAP(0x40, 0x65, 0x6461) /* <CJK */
-MAP(0x40, 0x66, 0x6463) /* <CJK */
-MAP(0x40, 0x67, 0x646D) /* <CJK */
-MAP(0x40, 0x68, 0x6473) /* <CJK */
-MAP(0x40, 0x69, 0x6474) /* <CJK */
-MAP(0x40, 0x6A, 0x647B) /* <CJK */
-MAP(0x40, 0x6B, 0x647D) /* <CJK */
-MAP(0x40, 0x6C, 0x6485) /* <CJK */
-MAP(0x40, 0x6D, 0x6487) /* <CJK */
-MAP(0x40, 0x6E, 0x648F) /* <CJK */
-MAP(0x40, 0x6F, 0x6490) /* <CJK */
-MAP(0x40, 0x70, 0x6491) /* <CJK */
-MAP(0x40, 0x71, 0x6498) /* <CJK */
-MAP(0x40, 0x72, 0x6499) /* <CJK */
-MAP(0x40, 0x73, 0x649B) /* <CJK */
-MAP(0x40, 0x74, 0x649D) /* <CJK */
-MAP(0x40, 0x75, 0x649F) /* <CJK */
-MAP(0x40, 0x76, 0x64A1) /* <CJK */
-MAP(0x40, 0x77, 0x64A3) /* <CJK */
-MAP(0x40, 0x78, 0x64A6) /* <CJK */
-MAP(0x40, 0x79, 0x64A8) /* <CJK */
-MAP(0x40, 0x7A, 0x64AC) /* <CJK */
-MAP(0x40, 0x7B, 0x64B3) /* <CJK */
-MAP(0x40, 0x7C, 0x64BD) /* <CJK */
-MAP(0x40, 0x7D, 0x64BE) /* <CJK */
-MAP(0x40, 0x7E, 0x64BF) /* <CJK */
-MAP(0x41, 0x21, 0x64C4) /* <CJK */
-MAP(0x41, 0x22, 0x64C9) /* <CJK */
-MAP(0x41, 0x23, 0x64CA) /* <CJK */
-MAP(0x41, 0x24, 0x64CB) /* <CJK */
-MAP(0x41, 0x25, 0x64CC) /* <CJK */
-MAP(0x41, 0x26, 0x64CE) /* <CJK */
-MAP(0x41, 0x27, 0x64D0) /* <CJK */
-MAP(0x41, 0x28, 0x64D1) /* <CJK */
-MAP(0x41, 0x29, 0x64D5) /* <CJK */
-MAP(0x41, 0x2A, 0x64D7) /* <CJK */
-MAP(0x41, 0x2B, 0x64E4) /* <CJK */
-MAP(0x41, 0x2C, 0x64E5) /* <CJK */
-MAP(0x41, 0x2D, 0x64E9) /* <CJK */
-MAP(0x41, 0x2E, 0x64EA) /* <CJK */
-MAP(0x41, 0x2F, 0x64ED) /* <CJK */
-MAP(0x41, 0x30, 0x64F0) /* <CJK */
-MAP(0x41, 0x31, 0x64F5) /* <CJK */
-MAP(0x41, 0x32, 0x64F7) /* <CJK */
-MAP(0x41, 0x33, 0x64FB) /* <CJK */
-MAP(0x41, 0x34, 0x64FF) /* <CJK */
-MAP(0x41, 0x35, 0x6501) /* <CJK */
-MAP(0x41, 0x36, 0x6504) /* <CJK */
-MAP(0x41, 0x37, 0x6508) /* <CJK */
-MAP(0x41, 0x38, 0x6509) /* <CJK */
-MAP(0x41, 0x39, 0x650A) /* <CJK */
-MAP(0x41, 0x3A, 0x650F) /* <CJK */
-MAP(0x41, 0x3B, 0x6513) /* <CJK */
-MAP(0x41, 0x3C, 0x6514) /* <CJK */
-MAP(0x41, 0x3D, 0x6516) /* <CJK */
-MAP(0x41, 0x3E, 0x6519) /* <CJK */
-MAP(0x41, 0x3F, 0x651B) /* <CJK */
-MAP(0x41, 0x40, 0x651E) /* <CJK */
-MAP(0x41, 0x41, 0x651F) /* <CJK */
-MAP(0x41, 0x42, 0x6522) /* <CJK */
-MAP(0x41, 0x43, 0x6526) /* <CJK */
-MAP(0x41, 0x44, 0x6529) /* <CJK */
-MAP(0x41, 0x45, 0x652E) /* <CJK */
-MAP(0x41, 0x46, 0x6531) /* <CJK */
-MAP(0x41, 0x47, 0x653A) /* <CJK */
-MAP(0x41, 0x48, 0x653C) /* <CJK */
-MAP(0x41, 0x49, 0x653D) /* <CJK */
-MAP(0x41, 0x4A, 0x6543) /* <CJK */
-MAP(0x41, 0x4B, 0x6547) /* <CJK */
-MAP(0x41, 0x4C, 0x6549) /* <CJK */
-MAP(0x41, 0x4D, 0x6550) /* <CJK */
-MAP(0x41, 0x4E, 0x6552) /* <CJK */
-MAP(0x41, 0x4F, 0x6554) /* <CJK */
-MAP(0x41, 0x50, 0x655F) /* <CJK */
-MAP(0x41, 0x51, 0x6560) /* <CJK */
-MAP(0x41, 0x52, 0x6567) /* <CJK */
-MAP(0x41, 0x53, 0x656B) /* <CJK */
-MAP(0x41, 0x54, 0x657A) /* <CJK */
-MAP(0x41, 0x55, 0x657D) /* <CJK */
-MAP(0x41, 0x56, 0x6581) /* <CJK */
-MAP(0x41, 0x57, 0x6585) /* <CJK */
-MAP(0x41, 0x58, 0x658A) /* <CJK */
-MAP(0x41, 0x59, 0x6592) /* <CJK */
-MAP(0x41, 0x5A, 0x6595) /* <CJK */
-MAP(0x41, 0x5B, 0x6598) /* <CJK */
-MAP(0x41, 0x5C, 0x659D) /* <CJK */
-MAP(0x41, 0x5D, 0x65A0) /* <CJK */
-MAP(0x41, 0x5E, 0x65A3) /* <CJK */
-MAP(0x41, 0x5F, 0x65A6) /* <CJK */
-MAP(0x41, 0x60, 0x65AE) /* <CJK */
-MAP(0x41, 0x61, 0x65B2) /* <CJK */
-MAP(0x41, 0x62, 0x65B3) /* <CJK */
-MAP(0x41, 0x63, 0x65B4) /* <CJK */
-MAP(0x41, 0x64, 0x65BF) /* <CJK */
-MAP(0x41, 0x65, 0x65C2) /* <CJK */
-MAP(0x41, 0x66, 0x65C8) /* <CJK */
-MAP(0x41, 0x67, 0x65C9) /* <CJK */
-MAP(0x41, 0x68, 0x65CE) /* <CJK */
-MAP(0x41, 0x69, 0x65D0) /* <CJK */
-MAP(0x41, 0x6A, 0x65D4) /* <CJK */
-MAP(0x41, 0x6B, 0x65D6) /* <CJK */
-MAP(0x41, 0x6C, 0x65D8) /* <CJK */
-MAP(0x41, 0x6D, 0x65DF) /* <CJK */
-MAP(0x41, 0x6E, 0x65F0) /* <CJK */
-MAP(0x41, 0x6F, 0x65F2) /* <CJK */
-MAP(0x41, 0x70, 0x65F4) /* <CJK */
-MAP(0x41, 0x71, 0x65F5) /* <CJK */
-MAP(0x41, 0x72, 0x65F9) /* <CJK */
-MAP(0x41, 0x73, 0x65FE) /* <CJK */
-MAP(0x41, 0x74, 0x65FF) /* <CJK */
-MAP(0x41, 0x75, 0x6600) /* <CJK */
-MAP(0x41, 0x76, 0x6604) /* <CJK */
-MAP(0x41, 0x77, 0x6608) /* <CJK */
-MAP(0x41, 0x78, 0x6609) /* <CJK */
-MAP(0x41, 0x79, 0x660D) /* <CJK */
-MAP(0x41, 0x7A, 0x6611) /* <CJK */
-MAP(0x41, 0x7B, 0x6612) /* <CJK */
-MAP(0x41, 0x7C, 0x6615) /* <CJK */
-MAP(0x41, 0x7D, 0x6616) /* <CJK */
-MAP(0x41, 0x7E, 0x661D) /* <CJK */
-MAP(0x42, 0x21, 0x661E) /* <CJK */
-MAP(0x42, 0x22, 0x6621) /* <CJK */
-MAP(0x42, 0x23, 0x6622) /* <CJK */
-MAP(0x42, 0x24, 0x6623) /* <CJK */
-MAP(0x42, 0x25, 0x6624) /* <CJK */
-MAP(0x42, 0x26, 0x6626) /* <CJK */
-MAP(0x42, 0x27, 0x6629) /* <CJK */
-MAP(0x42, 0x28, 0x662A) /* <CJK */
-MAP(0x42, 0x29, 0x662B) /* <CJK */
-MAP(0x42, 0x2A, 0x662C) /* <CJK */
-MAP(0x42, 0x2B, 0x662E) /* <CJK */
-MAP(0x42, 0x2C, 0x6630) /* <CJK */
-MAP(0x42, 0x2D, 0x6631) /* <CJK */
-MAP(0x42, 0x2E, 0x6633) /* <CJK */
-MAP(0x42, 0x2F, 0x6639) /* <CJK */
-MAP(0x42, 0x30, 0x6637) /* <CJK */
-MAP(0x42, 0x31, 0x6640) /* <CJK */
-MAP(0x42, 0x32, 0x6645) /* <CJK */
-MAP(0x42, 0x33, 0x6646) /* <CJK */
-MAP(0x42, 0x34, 0x664A) /* <CJK */
-MAP(0x42, 0x35, 0x664C) /* <CJK */
-MAP(0x42, 0x36, 0x6651) /* <CJK */
-MAP(0x42, 0x37, 0x664E) /* <CJK */
-MAP(0x42, 0x38, 0x6657) /* <CJK */
-MAP(0x42, 0x39, 0x6658) /* <CJK */
-MAP(0x42, 0x3A, 0x6659) /* <CJK */
-MAP(0x42, 0x3B, 0x665B) /* <CJK */
-MAP(0x42, 0x3C, 0x665C) /* <CJK */
-MAP(0x42, 0x3D, 0x6660) /* <CJK */
-MAP(0x42, 0x3E, 0x6661) /* <CJK */
-MAP(0x42, 0x3F, 0x66FB) /* <CJK */
-MAP(0x42, 0x40, 0x666A) /* <CJK */
-MAP(0x42, 0x41, 0x666B) /* <CJK */
-MAP(0x42, 0x42, 0x666C) /* <CJK */
-MAP(0x42, 0x43, 0x667E) /* <CJK */
-MAP(0x42, 0x44, 0x6673) /* <CJK */
-MAP(0x42, 0x45, 0x6675) /* <CJK */
-MAP(0x42, 0x46, 0x667F) /* <CJK */
-MAP(0x42, 0x47, 0x6677) /* <CJK */
-MAP(0x42, 0x48, 0x6678) /* <CJK */
-MAP(0x42, 0x49, 0x6679) /* <CJK */
-MAP(0x42, 0x4A, 0x667B) /* <CJK */
-MAP(0x42, 0x4B, 0x6680) /* <CJK */
-MAP(0x42, 0x4C, 0x667C) /* <CJK */
-MAP(0x42, 0x4D, 0x668B) /* <CJK */
-MAP(0x42, 0x4E, 0x668C) /* <CJK */
-MAP(0x42, 0x4F, 0x668D) /* <CJK */
-MAP(0x42, 0x50, 0x6690) /* <CJK */
-MAP(0x42, 0x51, 0x6692) /* <CJK */
-MAP(0x42, 0x52, 0x6699) /* <CJK */
-MAP(0x42, 0x53, 0x669A) /* <CJK */
-MAP(0x42, 0x54, 0x669B) /* <CJK */
-MAP(0x42, 0x55, 0x669C) /* <CJK */
-MAP(0x42, 0x56, 0x669F) /* <CJK */
-MAP(0x42, 0x57, 0x66A0) /* <CJK */
-MAP(0x42, 0x58, 0x66A4) /* <CJK */
-MAP(0x42, 0x59, 0x66AD) /* <CJK */
-MAP(0x42, 0x5A, 0x66B1) /* <CJK */
-MAP(0x42, 0x5B, 0x66B2) /* <CJK */
-MAP(0x42, 0x5C, 0x66B5) /* <CJK */
-MAP(0x42, 0x5D, 0x66BB) /* <CJK */
-MAP(0x42, 0x5E, 0x66BF) /* <CJK */
-MAP(0x42, 0x5F, 0x66C0) /* <CJK */
-MAP(0x42, 0x60, 0x66C2) /* <CJK */
-MAP(0x42, 0x61, 0x66C3) /* <CJK */
-MAP(0x42, 0x62, 0x66C8) /* <CJK */
-MAP(0x42, 0x63, 0x66CC) /* <CJK */
-MAP(0x42, 0x64, 0x66CE) /* <CJK */
-MAP(0x42, 0x65, 0x66CF) /* <CJK */
-MAP(0x42, 0x66, 0x66D4) /* <CJK */
-MAP(0x42, 0x67, 0x66DB) /* <CJK */
-MAP(0x42, 0x68, 0x66DF) /* <CJK */
-MAP(0x42, 0x69, 0x66E8) /* <CJK */
-MAP(0x42, 0x6A, 0x66EB) /* <CJK */
-MAP(0x42, 0x6B, 0x66EC) /* <CJK */
-MAP(0x42, 0x6C, 0x66EE) /* <CJK */
-MAP(0x42, 0x6D, 0x66FA) /* <CJK */
-MAP(0x42, 0x6E, 0x6705) /* <CJK */
-MAP(0x42, 0x6F, 0x6707) /* <CJK */
-MAP(0x42, 0x70, 0x670E) /* <CJK */
-MAP(0x42, 0x71, 0x6713) /* <CJK */
-MAP(0x42, 0x72, 0x6719) /* <CJK */
-MAP(0x42, 0x73, 0x671C) /* <CJK */
-MAP(0x42, 0x74, 0x6720) /* <CJK */
-MAP(0x42, 0x75, 0x6722) /* <CJK */
-MAP(0x42, 0x76, 0x6733) /* <CJK */
-MAP(0x42, 0x77, 0x673E) /* <CJK */
-MAP(0x42, 0x78, 0x6745) /* <CJK */
-MAP(0x42, 0x79, 0x6747) /* <CJK */
-MAP(0x42, 0x7A, 0x6748) /* <CJK */
-MAP(0x42, 0x7B, 0x674C) /* <CJK */
-MAP(0x42, 0x7C, 0x6754) /* <CJK */
-MAP(0x42, 0x7D, 0x6755) /* <CJK */
-MAP(0x42, 0x7E, 0x675D) /* <CJK */
-MAP(0x43, 0x21, 0x6766) /* <CJK */
-MAP(0x43, 0x22, 0x676C) /* <CJK */
-MAP(0x43, 0x23, 0x676E) /* <CJK */
-MAP(0x43, 0x24, 0x6774) /* <CJK */
-MAP(0x43, 0x25, 0x6776) /* <CJK */
-MAP(0x43, 0x26, 0x677B) /* <CJK */
-MAP(0x43, 0x27, 0x6781) /* <CJK */
-MAP(0x43, 0x28, 0x6784) /* <CJK */
-MAP(0x43, 0x29, 0x678E) /* <CJK */
-MAP(0x43, 0x2A, 0x678F) /* <CJK */
-MAP(0x43, 0x2B, 0x6791) /* <CJK */
-MAP(0x43, 0x2C, 0x6793) /* <CJK */
-MAP(0x43, 0x2D, 0x6796) /* <CJK */
-MAP(0x43, 0x2E, 0x6798) /* <CJK */
-MAP(0x43, 0x2F, 0x6799) /* <CJK */
-MAP(0x43, 0x30, 0x679B) /* <CJK */
-MAP(0x43, 0x31, 0x67B0) /* <CJK */
-MAP(0x43, 0x32, 0x67B1) /* <CJK */
-MAP(0x43, 0x33, 0x67B2) /* <CJK */
-MAP(0x43, 0x34, 0x67B5) /* <CJK */
-MAP(0x43, 0x35, 0x67BB) /* <CJK */
-MAP(0x43, 0x36, 0x67BC) /* <CJK */
-MAP(0x43, 0x37, 0x67BD) /* <CJK */
-MAP(0x43, 0x38, 0x67F9) /* <CJK */
-MAP(0x43, 0x39, 0x67C0) /* <CJK */
-MAP(0x43, 0x3A, 0x67C2) /* <CJK */
-MAP(0x43, 0x3B, 0x67C3) /* <CJK */
-MAP(0x43, 0x3C, 0x67C5) /* <CJK */
-MAP(0x43, 0x3D, 0x67C8) /* <CJK */
-MAP(0x43, 0x3E, 0x67C9) /* <CJK */
-MAP(0x43, 0x3F, 0x67D2) /* <CJK */
-MAP(0x43, 0x40, 0x67D7) /* <CJK */
-MAP(0x43, 0x41, 0x67D9) /* <CJK */
-MAP(0x43, 0x42, 0x67DC) /* <CJK */
-MAP(0x43, 0x43, 0x67E1) /* <CJK */
-MAP(0x43, 0x44, 0x67E6) /* <CJK */
-MAP(0x43, 0x45, 0x67F0) /* <CJK */
-MAP(0x43, 0x46, 0x67F2) /* <CJK */
-MAP(0x43, 0x47, 0x67F6) /* <CJK */
-MAP(0x43, 0x48, 0x67F7) /* <CJK */
-MAP(0x43, 0x49, 0x6852) /* <CJK */
-MAP(0x43, 0x4A, 0x6814) /* <CJK */
-MAP(0x43, 0x4B, 0x6819) /* <CJK */
-MAP(0x43, 0x4C, 0x681D) /* <CJK */
-MAP(0x43, 0x4D, 0x681F) /* <CJK */
-MAP(0x43, 0x4E, 0x6828) /* <CJK */
-MAP(0x43, 0x4F, 0x6827) /* <CJK */
-MAP(0x43, 0x50, 0x682C) /* <CJK */
-MAP(0x43, 0x51, 0x682D) /* <CJK */
-MAP(0x43, 0x52, 0x682F) /* <CJK */
-MAP(0x43, 0x53, 0x6830) /* <CJK */
-MAP(0x43, 0x54, 0x6831) /* <CJK */
-MAP(0x43, 0x55, 0x6833) /* <CJK */
-MAP(0x43, 0x56, 0x683B) /* <CJK */
-MAP(0x43, 0x57, 0x683F) /* <CJK */
-MAP(0x43, 0x58, 0x6844) /* <CJK */
-MAP(0x43, 0x59, 0x6845) /* <CJK */
-MAP(0x43, 0x5A, 0x684A) /* <CJK */
-MAP(0x43, 0x5B, 0x684C) /* <CJK */
-MAP(0x43, 0x5C, 0x6855) /* <CJK */
-MAP(0x43, 0x5D, 0x6857) /* <CJK */
-MAP(0x43, 0x5E, 0x6858) /* <CJK */
-MAP(0x43, 0x5F, 0x685B) /* <CJK */
-MAP(0x43, 0x60, 0x686B) /* <CJK */
-MAP(0x43, 0x61, 0x686E) /* <CJK */
-MAP(0x43, 0x62, 0x686F) /* <CJK */
-MAP(0x43, 0x63, 0x6870) /* <CJK */
-MAP(0x43, 0x64, 0x6871) /* <CJK */
-MAP(0x43, 0x65, 0x6872) /* <CJK */
-MAP(0x43, 0x66, 0x6875) /* <CJK */
-MAP(0x43, 0x67, 0x6879) /* <CJK */
-MAP(0x43, 0x68, 0x687A) /* <CJK */
-MAP(0x43, 0x69, 0x687B) /* <CJK */
-MAP(0x43, 0x6A, 0x687C) /* <CJK */
-MAP(0x43, 0x6B, 0x6882) /* <CJK */
-MAP(0x43, 0x6C, 0x6884) /* <CJK */
-MAP(0x43, 0x6D, 0x6886) /* <CJK */
-MAP(0x43, 0x6E, 0x6888) /* <CJK */
-MAP(0x43, 0x6F, 0x6896) /* <CJK */
-MAP(0x43, 0x70, 0x6898) /* <CJK */
-MAP(0x43, 0x71, 0x689A) /* <CJK */
-MAP(0x43, 0x72, 0x689C) /* <CJK */
-MAP(0x43, 0x73, 0x68A1) /* <CJK */
-MAP(0x43, 0x74, 0x68A3) /* <CJK */
-MAP(0x43, 0x75, 0x68A5) /* <CJK */
-MAP(0x43, 0x76, 0x68A9) /* <CJK */
-MAP(0x43, 0x77, 0x68AA) /* <CJK */
-MAP(0x43, 0x78, 0x68AE) /* <CJK */
-MAP(0x43, 0x79, 0x68B2) /* <CJK */
-MAP(0x43, 0x7A, 0x68BB) /* <CJK */
-MAP(0x43, 0x7B, 0x68C5) /* <CJK */
-MAP(0x43, 0x7C, 0x68C8) /* <CJK */
-MAP(0x43, 0x7D, 0x68CC) /* <CJK */
-MAP(0x43, 0x7E, 0x68CF) /* <CJK */
-MAP(0x44, 0x21, 0x68D0) /* <CJK */
-MAP(0x44, 0x22, 0x68D1) /* <CJK */
-MAP(0x44, 0x23, 0x68D3) /* <CJK */
-MAP(0x44, 0x24, 0x68D6) /* <CJK */
-MAP(0x44, 0x25, 0x68D9) /* <CJK */
-MAP(0x44, 0x26, 0x68DC) /* <CJK */
-MAP(0x44, 0x27, 0x68DD) /* <CJK */
-MAP(0x44, 0x28, 0x68E5) /* <CJK */
-MAP(0x44, 0x29, 0x68E8) /* <CJK */
-MAP(0x44, 0x2A, 0x68EA) /* <CJK */
-MAP(0x44, 0x2B, 0x68EB) /* <CJK */
-MAP(0x44, 0x2C, 0x68EC) /* <CJK */
-MAP(0x44, 0x2D, 0x68ED) /* <CJK */
-MAP(0x44, 0x2E, 0x68F0) /* <CJK */
-MAP(0x44, 0x2F, 0x68F1) /* <CJK */
-MAP(0x44, 0x30, 0x68F5) /* <CJK */
-MAP(0x44, 0x31, 0x68F6) /* <CJK */
-MAP(0x44, 0x32, 0x68FB) /* <CJK */
-MAP(0x44, 0x33, 0x68FC) /* <CJK */
-MAP(0x44, 0x34, 0x68FD) /* <CJK */
-MAP(0x44, 0x35, 0x6906) /* <CJK */
-MAP(0x44, 0x36, 0x6909) /* <CJK */
-MAP(0x44, 0x37, 0x690A) /* <CJK */
-MAP(0x44, 0x38, 0x6910) /* <CJK */
-MAP(0x44, 0x39, 0x6911) /* <CJK */
-MAP(0x44, 0x3A, 0x6913) /* <CJK */
-MAP(0x44, 0x3B, 0x6916) /* <CJK */
-MAP(0x44, 0x3C, 0x6917) /* <CJK */
-MAP(0x44, 0x3D, 0x6931) /* <CJK */
-MAP(0x44, 0x3E, 0x6933) /* <CJK */
-MAP(0x44, 0x3F, 0x6935) /* <CJK */
-MAP(0x44, 0x40, 0x6938) /* <CJK */
-MAP(0x44, 0x41, 0x693B) /* <CJK */
-MAP(0x44, 0x42, 0x6942) /* <CJK */
-MAP(0x44, 0x43, 0x6945) /* <CJK */
-MAP(0x44, 0x44, 0x6949) /* <CJK */
-MAP(0x44, 0x45, 0x694E) /* <CJK */
-MAP(0x44, 0x46, 0x6957) /* <CJK */
-MAP(0x44, 0x47, 0x695B) /* <CJK */
-MAP(0x44, 0x48, 0x6963) /* <CJK */
-MAP(0x44, 0x49, 0x6964) /* <CJK */
-MAP(0x44, 0x4A, 0x6965) /* <CJK */
-MAP(0x44, 0x4B, 0x6966) /* <CJK */
-MAP(0x44, 0x4C, 0x6968) /* <CJK */
-MAP(0x44, 0x4D, 0x6969) /* <CJK */
-MAP(0x44, 0x4E, 0x696C) /* <CJK */
-MAP(0x44, 0x4F, 0x6970) /* <CJK */
-MAP(0x44, 0x50, 0x6971) /* <CJK */
-MAP(0x44, 0x51, 0x6972) /* <CJK */
-MAP(0x44, 0x52, 0x697A) /* <CJK */
-MAP(0x44, 0x53, 0x697B) /* <CJK */
-MAP(0x44, 0x54, 0x697F) /* <CJK */
-MAP(0x44, 0x55, 0x6980) /* <CJK */
-MAP(0x44, 0x56, 0x698D) /* <CJK */
-MAP(0x44, 0x57, 0x6992) /* <CJK */
-MAP(0x44, 0x58, 0x6996) /* <CJK */
-MAP(0x44, 0x59, 0x6998) /* <CJK */
-MAP(0x44, 0x5A, 0x69A1) /* <CJK */
-MAP(0x44, 0x5B, 0x69A5) /* <CJK */
-MAP(0x44, 0x5C, 0x69A6) /* <CJK */
-MAP(0x44, 0x5D, 0x69A8) /* <CJK */
-MAP(0x44, 0x5E, 0x69AB) /* <CJK */
-MAP(0x44, 0x5F, 0x69AD) /* <CJK */
-MAP(0x44, 0x60, 0x69AF) /* <CJK */
-MAP(0x44, 0x61, 0x69B7) /* <CJK */
-MAP(0x44, 0x62, 0x69B8) /* <CJK */
-MAP(0x44, 0x63, 0x69BA) /* <CJK */
-MAP(0x44, 0x64, 0x69BC) /* <CJK */
-MAP(0x44, 0x65, 0x69C5) /* <CJK */
-MAP(0x44, 0x66, 0x69C8) /* <CJK */
-MAP(0x44, 0x67, 0x69D1) /* <CJK */
-MAP(0x44, 0x68, 0x69D6) /* <CJK */
-MAP(0x44, 0x69, 0x69D7) /* <CJK */
-MAP(0x44, 0x6A, 0x69E2) /* <CJK */
-MAP(0x44, 0x6B, 0x69E5) /* <CJK */
-MAP(0x44, 0x6C, 0x69EE) /* <CJK */
-MAP(0x44, 0x6D, 0x69EF) /* <CJK */
-MAP(0x44, 0x6E, 0x69F1) /* <CJK */
-MAP(0x44, 0x6F, 0x69F3) /* <CJK */
-MAP(0x44, 0x70, 0x69F5) /* <CJK */
-MAP(0x44, 0x71, 0x69FE) /* <CJK */
-MAP(0x44, 0x72, 0x6A00) /* <CJK */
-MAP(0x44, 0x73, 0x6A01) /* <CJK */
-MAP(0x44, 0x74, 0x6A03) /* <CJK */
-MAP(0x44, 0x75, 0x6A0F) /* <CJK */
-MAP(0x44, 0x76, 0x6A11) /* <CJK */
-MAP(0x44, 0x77, 0x6A15) /* <CJK */
-MAP(0x44, 0x78, 0x6A1A) /* <CJK */
-MAP(0x44, 0x79, 0x6A1D) /* <CJK */
-MAP(0x44, 0x7A, 0x6A20) /* <CJK */
-MAP(0x44, 0x7B, 0x6A24) /* <CJK */
-MAP(0x44, 0x7C, 0x6A28) /* <CJK */
-MAP(0x44, 0x7D, 0x6A30) /* <CJK */
-MAP(0x44, 0x7E, 0x6A32) /* <CJK */
-MAP(0x45, 0x21, 0x6A34) /* <CJK */
-MAP(0x45, 0x22, 0x6A37) /* <CJK */
-MAP(0x45, 0x23, 0x6A3B) /* <CJK */
-MAP(0x45, 0x24, 0x6A3E) /* <CJK */
-MAP(0x45, 0x25, 0x6A3F) /* <CJK */
-MAP(0x45, 0x26, 0x6A45) /* <CJK */
-MAP(0x45, 0x27, 0x6A46) /* <CJK */
-MAP(0x45, 0x28, 0x6A49) /* <CJK */
-MAP(0x45, 0x29, 0x6A4A) /* <CJK */
-MAP(0x45, 0x2A, 0x6A4E) /* <CJK */
-MAP(0x45, 0x2B, 0x6A50) /* <CJK */
-MAP(0x45, 0x2C, 0x6A51) /* <CJK */
-MAP(0x45, 0x2D, 0x6A52) /* <CJK */
-MAP(0x45, 0x2E, 0x6A55) /* <CJK */
-MAP(0x45, 0x2F, 0x6A56) /* <CJK */
-MAP(0x45, 0x30, 0x6A5B) /* <CJK */
-MAP(0x45, 0x31, 0x6A64) /* <CJK */
-MAP(0x45, 0x32, 0x6A67) /* <CJK */
-MAP(0x45, 0x33, 0x6A6A) /* <CJK */
-MAP(0x45, 0x34, 0x6A71) /* <CJK */
-MAP(0x45, 0x35, 0x6A73) /* <CJK */
-MAP(0x45, 0x36, 0x6A7E) /* <CJK */
-MAP(0x45, 0x37, 0x6A81) /* <CJK */
-MAP(0x45, 0x38, 0x6A83) /* <CJK */
-MAP(0x45, 0x39, 0x6A86) /* <CJK */
-MAP(0x45, 0x3A, 0x6A87) /* <CJK */
-MAP(0x45, 0x3B, 0x6A89) /* <CJK */
-MAP(0x45, 0x3C, 0x6A8B) /* <CJK */
-MAP(0x45, 0x3D, 0x6A91) /* <CJK */
-MAP(0x45, 0x3E, 0x6A9B) /* <CJK */
-MAP(0x45, 0x3F, 0x6A9D) /* <CJK */
-MAP(0x45, 0x40, 0x6A9E) /* <CJK */
-MAP(0x45, 0x41, 0x6A9F) /* <CJK */
-MAP(0x45, 0x42, 0x6AA5) /* <CJK */
-MAP(0x45, 0x43, 0x6AAB) /* <CJK */
-MAP(0x45, 0x44, 0x6AAF) /* <CJK */
-MAP(0x45, 0x45, 0x6AB0) /* <CJK */
-MAP(0x45, 0x46, 0x6AB1) /* <CJK */
-MAP(0x45, 0x47, 0x6AB4) /* <CJK */
-MAP(0x45, 0x48, 0x6ABD) /* <CJK */
-MAP(0x45, 0x49, 0x6ABE) /* <CJK */
-MAP(0x45, 0x4A, 0x6ABF) /* <CJK */
-MAP(0x45, 0x4B, 0x6AC6) /* <CJK */
-MAP(0x45, 0x4C, 0x6AC9) /* <CJK */
-MAP(0x45, 0x4D, 0x6AC8) /* <CJK */
-MAP(0x45, 0x4E, 0x6ACC) /* <CJK */
-MAP(0x45, 0x4F, 0x6AD0) /* <CJK */
-MAP(0x45, 0x50, 0x6AD4) /* <CJK */
-MAP(0x45, 0x51, 0x6AD5) /* <CJK */
-MAP(0x45, 0x52, 0x6AD6) /* <CJK */
-MAP(0x45, 0x53, 0x6ADC) /* <CJK */
-MAP(0x45, 0x54, 0x6ADD) /* <CJK */
-MAP(0x45, 0x55, 0x6AE4) /* <CJK */
-MAP(0x45, 0x56, 0x6AE7) /* <CJK */
-MAP(0x45, 0x57, 0x6AEC) /* <CJK */
-MAP(0x45, 0x58, 0x6AF0) /* <CJK */
-MAP(0x45, 0x59, 0x6AF1) /* <CJK */
-MAP(0x45, 0x5A, 0x6AF2) /* <CJK */
-MAP(0x45, 0x5B, 0x6AFC) /* <CJK */
-MAP(0x45, 0x5C, 0x6AFD) /* <CJK */
-MAP(0x45, 0x5D, 0x6B02) /* <CJK */
-MAP(0x45, 0x5E, 0x6B03) /* <CJK */
-MAP(0x45, 0x5F, 0x6B06) /* <CJK */
-MAP(0x45, 0x60, 0x6B07) /* <CJK */
-MAP(0x45, 0x61, 0x6B09) /* <CJK */
-MAP(0x45, 0x62, 0x6B0F) /* <CJK */
-MAP(0x45, 0x63, 0x6B10) /* <CJK */
-MAP(0x45, 0x64, 0x6B11) /* <CJK */
-MAP(0x45, 0x65, 0x6B17) /* <CJK */
-MAP(0x45, 0x66, 0x6B1B) /* <CJK */
-MAP(0x45, 0x67, 0x6B1E) /* <CJK */
-MAP(0x45, 0x68, 0x6B24) /* <CJK */
-MAP(0x45, 0x69, 0x6B28) /* <CJK */
-MAP(0x45, 0x6A, 0x6B2B) /* <CJK */
-MAP(0x45, 0x6B, 0x6B2C) /* <CJK */
-MAP(0x45, 0x6C, 0x6B2F) /* <CJK */
-MAP(0x45, 0x6D, 0x6B35) /* <CJK */
-MAP(0x45, 0x6E, 0x6B36) /* <CJK */
-MAP(0x45, 0x6F, 0x6B3B) /* <CJK */
-MAP(0x45, 0x70, 0x6B3F) /* <CJK */
-MAP(0x45, 0x71, 0x6B46) /* <CJK */
-MAP(0x45, 0x72, 0x6B4A) /* <CJK */
-MAP(0x45, 0x73, 0x6B4D) /* <CJK */
-MAP(0x45, 0x74, 0x6B52) /* <CJK */
-MAP(0x45, 0x75, 0x6B56) /* <CJK */
-MAP(0x45, 0x76, 0x6B58) /* <CJK */
-MAP(0x45, 0x77, 0x6B5D) /* <CJK */
-MAP(0x45, 0x78, 0x6B60) /* <CJK */
-MAP(0x45, 0x79, 0x6B67) /* <CJK */
-MAP(0x45, 0x7A, 0x6B6B) /* <CJK */
-MAP(0x45, 0x7B, 0x6B6E) /* <CJK */
-MAP(0x45, 0x7C, 0x6B70) /* <CJK */
-MAP(0x45, 0x7D, 0x6B75) /* <CJK */
-MAP(0x45, 0x7E, 0x6B7D) /* <CJK */
-MAP(0x46, 0x21, 0x6B7E) /* <CJK */
-MAP(0x46, 0x22, 0x6B82) /* <CJK */
-MAP(0x46, 0x23, 0x6B85) /* <CJK */
-MAP(0x46, 0x24, 0x6B97) /* <CJK */
-MAP(0x46, 0x25, 0x6B9B) /* <CJK */
-MAP(0x46, 0x26, 0x6B9F) /* <CJK */
-MAP(0x46, 0x27, 0x6BA0) /* <CJK */
-MAP(0x46, 0x28, 0x6BA2) /* <CJK */
-MAP(0x46, 0x29, 0x6BA3) /* <CJK */
-MAP(0x46, 0x2A, 0x6BA8) /* <CJK */
-MAP(0x46, 0x2B, 0x6BA9) /* <CJK */
-MAP(0x46, 0x2C, 0x6BAC) /* <CJK */
-MAP(0x46, 0x2D, 0x6BAD) /* <CJK */
-MAP(0x46, 0x2E, 0x6BAE) /* <CJK */
-MAP(0x46, 0x2F, 0x6BB0) /* <CJK */
-MAP(0x46, 0x30, 0x6BB8) /* <CJK */
-MAP(0x46, 0x31, 0x6BB9) /* <CJK */
-MAP(0x46, 0x32, 0x6BBD) /* <CJK */
-MAP(0x46, 0x33, 0x6BBE) /* <CJK */
-MAP(0x46, 0x34, 0x6BC3) /* <CJK */
-MAP(0x46, 0x35, 0x6BC4) /* <CJK */
-MAP(0x46, 0x36, 0x6BC9) /* <CJK */
-MAP(0x46, 0x37, 0x6BCC) /* <CJK */
-MAP(0x46, 0x38, 0x6BD6) /* <CJK */
-MAP(0x46, 0x39, 0x6BDA) /* <CJK */
-MAP(0x46, 0x3A, 0x6BE1) /* <CJK */
-MAP(0x46, 0x3B, 0x6BE3) /* <CJK */
-MAP(0x46, 0x3C, 0x6BE6) /* <CJK */
-MAP(0x46, 0x3D, 0x6BE7) /* <CJK */
-MAP(0x46, 0x3E, 0x6BEE) /* <CJK */
-MAP(0x46, 0x3F, 0x6BF1) /* <CJK */
-MAP(0x46, 0x40, 0x6BF7) /* <CJK */
-MAP(0x46, 0x41, 0x6BF9) /* <CJK */
-MAP(0x46, 0x42, 0x6BFF) /* <CJK */
-MAP(0x46, 0x43, 0x6C02) /* <CJK */
-MAP(0x46, 0x44, 0x6C04) /* <CJK */
-MAP(0x46, 0x45, 0x6C05) /* <CJK */
-MAP(0x46, 0x46, 0x6C09) /* <CJK */
-MAP(0x46, 0x47, 0x6C0D) /* <CJK */
-MAP(0x46, 0x48, 0x6C0E) /* <CJK */
-MAP(0x46, 0x49, 0x6C10) /* <CJK */
-MAP(0x46, 0x4A, 0x6C12) /* <CJK */
-MAP(0x46, 0x4B, 0x6C19) /* <CJK */
-MAP(0x46, 0x4C, 0x6C1F) /* <CJK */
-MAP(0x46, 0x4D, 0x6C26) /* <CJK */
-MAP(0x46, 0x4E, 0x6C27) /* <CJK */
-MAP(0x46, 0x4F, 0x6C28) /* <CJK */
-MAP(0x46, 0x50, 0x6C2C) /* <CJK */
-MAP(0x46, 0x51, 0x6C2E) /* <CJK */
-MAP(0x46, 0x52, 0x6C33) /* <CJK */
-MAP(0x46, 0x53, 0x6C35) /* <CJK */
-MAP(0x46, 0x54, 0x6C36) /* <CJK */
-MAP(0x46, 0x55, 0x6C3A) /* <CJK */
-MAP(0x46, 0x56, 0x6C3B) /* <CJK */
-MAP(0x46, 0x57, 0x6C3F) /* <CJK */
-MAP(0x46, 0x58, 0x6C4A) /* <CJK */
-MAP(0x46, 0x59, 0x6C4B) /* <CJK */
-MAP(0x46, 0x5A, 0x6C4D) /* <CJK */
-MAP(0x46, 0x5B, 0x6C4F) /* <CJK */
-MAP(0x46, 0x5C, 0x6C52) /* <CJK */
-MAP(0x46, 0x5D, 0x6C54) /* <CJK */
-MAP(0x46, 0x5E, 0x6C59) /* <CJK */
-MAP(0x46, 0x5F, 0x6C5B) /* <CJK */
-MAP(0x46, 0x60, 0x6C5C) /* <CJK */
-MAP(0x46, 0x61, 0x6C6B) /* <CJK */
-MAP(0x46, 0x62, 0x6C6D) /* <CJK */
-MAP(0x46, 0x63, 0x6C6F) /* <CJK */
-MAP(0x46, 0x64, 0x6C74) /* <CJK */
-MAP(0x46, 0x65, 0x6C76) /* <CJK */
-MAP(0x46, 0x66, 0x6C78) /* <CJK */
-MAP(0x46, 0x67, 0x6C79) /* <CJK */
-MAP(0x46, 0x68, 0x6C7B) /* <CJK */
-MAP(0x46, 0x69, 0x6C85) /* <CJK */
-MAP(0x46, 0x6A, 0x6C86) /* <CJK */
-MAP(0x46, 0x6B, 0x6C87) /* <CJK */
-MAP(0x46, 0x6C, 0x6C89) /* <CJK */
-MAP(0x46, 0x6D, 0x6C94) /* <CJK */
-MAP(0x46, 0x6E, 0x6C95) /* <CJK */
-MAP(0x46, 0x6F, 0x6C97) /* <CJK */
-MAP(0x46, 0x70, 0x6C98) /* <CJK */
-MAP(0x46, 0x71, 0x6C9C) /* <CJK */
-MAP(0x46, 0x72, 0x6C9F) /* <CJK */
-MAP(0x46, 0x73, 0x6CB0) /* <CJK */
-MAP(0x46, 0x74, 0x6CB2) /* <CJK */
-MAP(0x46, 0x75, 0x6CB4) /* <CJK */
-MAP(0x46, 0x76, 0x6CC2) /* <CJK */
-MAP(0x46, 0x77, 0x6CC6) /* <CJK */
-MAP(0x46, 0x78, 0x6CCD) /* <CJK */
-MAP(0x46, 0x79, 0x6CCF) /* <CJK */
-MAP(0x46, 0x7A, 0x6CD0) /* <CJK */
-MAP(0x46, 0x7B, 0x6CD1) /* <CJK */
-MAP(0x46, 0x7C, 0x6CD2) /* <CJK */
-MAP(0x46, 0x7D, 0x6CD4) /* <CJK */
-MAP(0x46, 0x7E, 0x6CD6) /* <CJK */
-MAP(0x47, 0x21, 0x6CDA) /* <CJK */
-MAP(0x47, 0x22, 0x6CDC) /* <CJK */
-MAP(0x47, 0x23, 0x6CE0) /* <CJK */
-MAP(0x47, 0x24, 0x6CE7) /* <CJK */
-MAP(0x47, 0x25, 0x6CE9) /* <CJK */
-MAP(0x47, 0x26, 0x6CEB) /* <CJK */
-MAP(0x47, 0x27, 0x6CEC) /* <CJK */
-MAP(0x47, 0x28, 0x6CEE) /* <CJK */
-MAP(0x47, 0x29, 0x6CF2) /* <CJK */
-MAP(0x47, 0x2A, 0x6CF4) /* <CJK */
-MAP(0x47, 0x2B, 0x6D04) /* <CJK */
-MAP(0x47, 0x2C, 0x6D07) /* <CJK */
-MAP(0x47, 0x2D, 0x6D0A) /* <CJK */
-MAP(0x47, 0x2E, 0x6D0E) /* <CJK */
-MAP(0x47, 0x2F, 0x6D0F) /* <CJK */
-MAP(0x47, 0x30, 0x6D11) /* <CJK */
-MAP(0x47, 0x31, 0x6D13) /* <CJK */
-MAP(0x47, 0x32, 0x6D1A) /* <CJK */
-MAP(0x47, 0x33, 0x6D26) /* <CJK */
-MAP(0x47, 0x34, 0x6D27) /* <CJK */
-MAP(0x47, 0x35, 0x6D28) /* <CJK */
-MAP(0x47, 0x36, 0x6C67) /* <CJK */
-MAP(0x47, 0x37, 0x6D2E) /* <CJK */
-MAP(0x47, 0x38, 0x6D2F) /* <CJK */
-MAP(0x47, 0x39, 0x6D31) /* <CJK */
-MAP(0x47, 0x3A, 0x6D39) /* <CJK */
-MAP(0x47, 0x3B, 0x6D3C) /* <CJK */
-MAP(0x47, 0x3C, 0x6D3F) /* <CJK */
-MAP(0x47, 0x3D, 0x6D57) /* <CJK */
-MAP(0x47, 0x3E, 0x6D5E) /* <CJK */
-MAP(0x47, 0x3F, 0x6D5F) /* <CJK */
-MAP(0x47, 0x40, 0x6D61) /* <CJK */
-MAP(0x47, 0x41, 0x6D65) /* <CJK */
-MAP(0x47, 0x42, 0x6D67) /* <CJK */
-MAP(0x47, 0x43, 0x6D6F) /* <CJK */
-MAP(0x47, 0x44, 0x6D70) /* <CJK */
-MAP(0x47, 0x45, 0x6D7C) /* <CJK */
-MAP(0x47, 0x46, 0x6D82) /* <CJK */
-MAP(0x47, 0x47, 0x6D87) /* <CJK */
-MAP(0x47, 0x48, 0x6D91) /* <CJK */
-MAP(0x47, 0x49, 0x6D92) /* <CJK */
-MAP(0x47, 0x4A, 0x6D94) /* <CJK */
-MAP(0x47, 0x4B, 0x6D96) /* <CJK */
-MAP(0x47, 0x4C, 0x6D97) /* <CJK */
-MAP(0x47, 0x4D, 0x6D98) /* <CJK */
-MAP(0x47, 0x4E, 0x6DAA) /* <CJK */
-MAP(0x47, 0x4F, 0x6DAC) /* <CJK */
-MAP(0x47, 0x50, 0x6DB4) /* <CJK */
-MAP(0x47, 0x51, 0x6DB7) /* <CJK */
-MAP(0x47, 0x52, 0x6DB9) /* <CJK */
-MAP(0x47, 0x53, 0x6DBD) /* <CJK */
-MAP(0x47, 0x54, 0x6DBF) /* <CJK */
-MAP(0x47, 0x55, 0x6DC4) /* <CJK */
-MAP(0x47, 0x56, 0x6DC8) /* <CJK */
-MAP(0x47, 0x57, 0x6DCA) /* <CJK */
-MAP(0x47, 0x58, 0x6DCE) /* <CJK */
-MAP(0x47, 0x59, 0x6DCF) /* <CJK */
-MAP(0x47, 0x5A, 0x6DD6) /* <CJK */
-MAP(0x47, 0x5B, 0x6DDB) /* <CJK */
-MAP(0x47, 0x5C, 0x6DDD) /* <CJK */
-MAP(0x47, 0x5D, 0x6DDF) /* <CJK */
-MAP(0x47, 0x5E, 0x6DE0) /* <CJK */
-MAP(0x47, 0x5F, 0x6DE2) /* <CJK */
-MAP(0x47, 0x60, 0x6DE5) /* <CJK */
-MAP(0x47, 0x61, 0x6DE9) /* <CJK */
-MAP(0x47, 0x62, 0x6DEF) /* <CJK */
-MAP(0x47, 0x63, 0x6DF0) /* <CJK */
-MAP(0x47, 0x64, 0x6DF4) /* <CJK */
-MAP(0x47, 0x65, 0x6DF6) /* <CJK */
-MAP(0x47, 0x66, 0x6DFC) /* <CJK */
-MAP(0x47, 0x67, 0x6E00) /* <CJK */
-MAP(0x47, 0x68, 0x6E04) /* <CJK */
-MAP(0x47, 0x69, 0x6E1E) /* <CJK */
-MAP(0x47, 0x6A, 0x6E22) /* <CJK */
-MAP(0x47, 0x6B, 0x6E27) /* <CJK */
-MAP(0x47, 0x6C, 0x6E32) /* <CJK */
-MAP(0x47, 0x6D, 0x6E36) /* <CJK */
-MAP(0x47, 0x6E, 0x6E39) /* <CJK */
-MAP(0x47, 0x6F, 0x6E3B) /* <CJK */
-MAP(0x47, 0x70, 0x6E3C) /* <CJK */
-MAP(0x47, 0x71, 0x6E44) /* <CJK */
-MAP(0x47, 0x72, 0x6E45) /* <CJK */
-MAP(0x47, 0x73, 0x6E48) /* <CJK */
-MAP(0x47, 0x74, 0x6E49) /* <CJK */
-MAP(0x47, 0x75, 0x6E4B) /* <CJK */
-MAP(0x47, 0x76, 0x6E4F) /* <CJK */
-MAP(0x47, 0x77, 0x6E51) /* <CJK */
-MAP(0x47, 0x78, 0x6E52) /* <CJK */
-MAP(0x47, 0x79, 0x6E53) /* <CJK */
-MAP(0x47, 0x7A, 0x6E54) /* <CJK */
-MAP(0x47, 0x7B, 0x6E57) /* <CJK */
-MAP(0x47, 0x7C, 0x6E5C) /* <CJK */
-MAP(0x47, 0x7D, 0x6E5D) /* <CJK */
-MAP(0x47, 0x7E, 0x6E5E) /* <CJK */
-MAP(0x48, 0x21, 0x6E62) /* <CJK */
-MAP(0x48, 0x22, 0x6E63) /* <CJK */
-MAP(0x48, 0x23, 0x6E68) /* <CJK */
-MAP(0x48, 0x24, 0x6E73) /* <CJK */
-MAP(0x48, 0x25, 0x6E7B) /* <CJK */
-MAP(0x48, 0x26, 0x6E7D) /* <CJK */
-MAP(0x48, 0x27, 0x6E8D) /* <CJK */
-MAP(0x48, 0x28, 0x6E93) /* <CJK */
-MAP(0x48, 0x29, 0x6E99) /* <CJK */
-MAP(0x48, 0x2A, 0x6EA0) /* <CJK */
-MAP(0x48, 0x2B, 0x6EA7) /* <CJK */
-MAP(0x48, 0x2C, 0x6EAD) /* <CJK */
-MAP(0x48, 0x2D, 0x6EAE) /* <CJK */
-MAP(0x48, 0x2E, 0x6EB1) /* <CJK */
-MAP(0x48, 0x2F, 0x6EB3) /* <CJK */
-MAP(0x48, 0x30, 0x6EBB) /* <CJK */
-MAP(0x48, 0x31, 0x6EBF) /* <CJK */
-MAP(0x48, 0x32, 0x6EC0) /* <CJK */
-MAP(0x48, 0x33, 0x6EC1) /* <CJK */
-MAP(0x48, 0x34, 0x6EC3) /* <CJK */
-MAP(0x48, 0x35, 0x6EC7) /* <CJK */
-MAP(0x48, 0x36, 0x6EC8) /* <CJK */
-MAP(0x48, 0x37, 0x6ECA) /* <CJK */
-MAP(0x48, 0x38, 0x6ECD) /* <CJK */
-MAP(0x48, 0x39, 0x6ECE) /* <CJK */
-MAP(0x48, 0x3A, 0x6ECF) /* <CJK */
-MAP(0x48, 0x3B, 0x6EEB) /* <CJK */
-MAP(0x48, 0x3C, 0x6EED) /* <CJK */
-MAP(0x48, 0x3D, 0x6EEE) /* <CJK */
-MAP(0x48, 0x3E, 0x6EF9) /* <CJK */
-MAP(0x48, 0x3F, 0x6EFB) /* <CJK */
-MAP(0x48, 0x40, 0x6EFD) /* <CJK */
-MAP(0x48, 0x41, 0x6F04) /* <CJK */
-MAP(0x48, 0x42, 0x6F08) /* <CJK */
-MAP(0x48, 0x43, 0x6F0A) /* <CJK */
-MAP(0x48, 0x44, 0x6F0C) /* <CJK */
-MAP(0x48, 0x45, 0x6F0D) /* <CJK */
-MAP(0x48, 0x46, 0x6F16) /* <CJK */
-MAP(0x48, 0x47, 0x6F18) /* <CJK */
-MAP(0x48, 0x48, 0x6F1A) /* <CJK */
-MAP(0x48, 0x49, 0x6F1B) /* <CJK */
-MAP(0x48, 0x4A, 0x6F26) /* <CJK */
-MAP(0x48, 0x4B, 0x6F29) /* <CJK */
-MAP(0x48, 0x4C, 0x6F2A) /* <CJK */
-MAP(0x48, 0x4D, 0x6F2F) /* <CJK */
-MAP(0x48, 0x4E, 0x6F30) /* <CJK */
-MAP(0x48, 0x4F, 0x6F33) /* <CJK */
-MAP(0x48, 0x50, 0x6F36) /* <CJK */
-MAP(0x48, 0x51, 0x6F3B) /* <CJK */
-MAP(0x48, 0x52, 0x6F3C) /* <CJK */
-MAP(0x48, 0x53, 0x6F2D) /* <CJK */
-MAP(0x48, 0x54, 0x6F4F) /* <CJK */
-MAP(0x48, 0x55, 0x6F51) /* <CJK */
-MAP(0x48, 0x56, 0x6F52) /* <CJK */
-MAP(0x48, 0x57, 0x6F53) /* <CJK */
-MAP(0x48, 0x58, 0x6F57) /* <CJK */
-MAP(0x48, 0x59, 0x6F59) /* <CJK */
-MAP(0x48, 0x5A, 0x6F5A) /* <CJK */
-MAP(0x48, 0x5B, 0x6F5D) /* <CJK */
-MAP(0x48, 0x5C, 0x6F5E) /* <CJK */
-MAP(0x48, 0x5D, 0x6F61) /* <CJK */
-MAP(0x48, 0x5E, 0x6F62) /* <CJK */
-MAP(0x48, 0x5F, 0x6F68) /* <CJK */
-MAP(0x48, 0x60, 0x6F6C) /* <CJK */
-MAP(0x48, 0x61, 0x6F7D) /* <CJK */
-MAP(0x48, 0x62, 0x6F7E) /* <CJK */
-MAP(0x48, 0x63, 0x6F83) /* <CJK */
-MAP(0x48, 0x64, 0x6F87) /* <CJK */
-MAP(0x48, 0x65, 0x6F88) /* <CJK */
-MAP(0x48, 0x66, 0x6F8B) /* <CJK */
-MAP(0x48, 0x67, 0x6F8C) /* <CJK */
-MAP(0x48, 0x68, 0x6F8D) /* <CJK */
-MAP(0x48, 0x69, 0x6F90) /* <CJK */
-MAP(0x48, 0x6A, 0x6F92) /* <CJK */
-MAP(0x48, 0x6B, 0x6F93) /* <CJK */
-MAP(0x48, 0x6C, 0x6F94) /* <CJK */
-MAP(0x48, 0x6D, 0x6F96) /* <CJK */
-MAP(0x48, 0x6E, 0x6F9A) /* <CJK */
-MAP(0x48, 0x6F, 0x6F9F) /* <CJK */
-MAP(0x48, 0x70, 0x6FA0) /* <CJK */
-MAP(0x48, 0x71, 0x6FA5) /* <CJK */
-MAP(0x48, 0x72, 0x6FA6) /* <CJK */
-MAP(0x48, 0x73, 0x6FA7) /* <CJK */
-MAP(0x48, 0x74, 0x6FA8) /* <CJK */
-MAP(0x48, 0x75, 0x6FAE) /* <CJK */
-MAP(0x48, 0x76, 0x6FAF) /* <CJK */
-MAP(0x48, 0x77, 0x6FB0) /* <CJK */
-MAP(0x48, 0x78, 0x6FB5) /* <CJK */
-MAP(0x48, 0x79, 0x6FB6) /* <CJK */
-MAP(0x48, 0x7A, 0x6FBC) /* <CJK */
-MAP(0x48, 0x7B, 0x6FC5) /* <CJK */
-MAP(0x48, 0x7C, 0x6FC7) /* <CJK */
-MAP(0x48, 0x7D, 0x6FC8) /* <CJK */
-MAP(0x48, 0x7E, 0x6FCA) /* <CJK */
-MAP(0x49, 0x21, 0x6FDA) /* <CJK */
-MAP(0x49, 0x22, 0x6FDE) /* <CJK */
-MAP(0x49, 0x23, 0x6FE8) /* <CJK */
-MAP(0x49, 0x24, 0x6FE9) /* <CJK */
-MAP(0x49, 0x25, 0x6FF0) /* <CJK */
-MAP(0x49, 0x26, 0x6FF5) /* <CJK */
-MAP(0x49, 0x27, 0x6FF9) /* <CJK */
-MAP(0x49, 0x28, 0x6FFC) /* <CJK */
-MAP(0x49, 0x29, 0x6FFD) /* <CJK */
-MAP(0x49, 0x2A, 0x7000) /* <CJK */
-MAP(0x49, 0x2B, 0x7005) /* <CJK */
-MAP(0x49, 0x2C, 0x7006) /* <CJK */
-MAP(0x49, 0x2D, 0x7007) /* <CJK */
-MAP(0x49, 0x2E, 0x700D) /* <CJK */
-MAP(0x49, 0x2F, 0x7017) /* <CJK */
-MAP(0x49, 0x30, 0x7020) /* <CJK */
-MAP(0x49, 0x31, 0x7023) /* <CJK */
-MAP(0x49, 0x32, 0x702F) /* <CJK */
-MAP(0x49, 0x33, 0x7034) /* <CJK */
-MAP(0x49, 0x34, 0x7037) /* <CJK */
-MAP(0x49, 0x35, 0x7039) /* <CJK */
-MAP(0x49, 0x36, 0x703C) /* <CJK */
-MAP(0x49, 0x37, 0x7043) /* <CJK */
-MAP(0x49, 0x38, 0x7044) /* <CJK */
-MAP(0x49, 0x39, 0x7048) /* <CJK */
-MAP(0x49, 0x3A, 0x7049) /* <CJK */
-MAP(0x49, 0x3B, 0x704A) /* <CJK */
-MAP(0x49, 0x3C, 0x704B) /* <CJK */
-MAP(0x49, 0x3D, 0x7054) /* <CJK */
-MAP(0x49, 0x3E, 0x7055) /* <CJK */
-MAP(0x49, 0x3F, 0x705D) /* <CJK */
-MAP(0x49, 0x40, 0x705E) /* <CJK */
-MAP(0x49, 0x41, 0x704E) /* <CJK */
-MAP(0x49, 0x42, 0x7064) /* <CJK */
-MAP(0x49, 0x43, 0x7065) /* <CJK */
-MAP(0x49, 0x44, 0x706C) /* <CJK */
-MAP(0x49, 0x45, 0x706E) /* <CJK */
-MAP(0x49, 0x46, 0x7075) /* <CJK */
-MAP(0x49, 0x47, 0x7076) /* <CJK */
-MAP(0x49, 0x48, 0x707E) /* <CJK */
-MAP(0x49, 0x49, 0x7081) /* <CJK */
-MAP(0x49, 0x4A, 0x7085) /* <CJK */
-MAP(0x49, 0x4B, 0x7086) /* <CJK */
-MAP(0x49, 0x4C, 0x7094) /* <CJK */
-MAP(0x49, 0x4D, 0x7095) /* <CJK */
-MAP(0x49, 0x4E, 0x7096) /* <CJK */
-MAP(0x49, 0x4F, 0x7097) /* <CJK */
-MAP(0x49, 0x50, 0x7098) /* <CJK */
-MAP(0x49, 0x51, 0x709B) /* <CJK */
-MAP(0x49, 0x52, 0x70A4) /* <CJK */
-MAP(0x49, 0x53, 0x70AB) /* <CJK */
-MAP(0x49, 0x54, 0x70B0) /* <CJK */
-MAP(0x49, 0x55, 0x70B1) /* <CJK */
-MAP(0x49, 0x56, 0x70B4) /* <CJK */
-MAP(0x49, 0x57, 0x70B7) /* <CJK */
-MAP(0x49, 0x58, 0x70CA) /* <CJK */
-MAP(0x49, 0x59, 0x70D1) /* <CJK */
-MAP(0x49, 0x5A, 0x70D3) /* <CJK */
-MAP(0x49, 0x5B, 0x70D4) /* <CJK */
-MAP(0x49, 0x5C, 0x70D5) /* <CJK */
-MAP(0x49, 0x5D, 0x70D6) /* <CJK */
-MAP(0x49, 0x5E, 0x70D8) /* <CJK */
-MAP(0x49, 0x5F, 0x70DC) /* <CJK */
-MAP(0x49, 0x60, 0x70E4) /* <CJK */
-MAP(0x49, 0x61, 0x70FA) /* <CJK */
-MAP(0x49, 0x62, 0x7103) /* <CJK */
-MAP(0x49, 0x63, 0x7104) /* <CJK */
-MAP(0x49, 0x64, 0x7105) /* <CJK */
-MAP(0x49, 0x65, 0x7106) /* <CJK */
-MAP(0x49, 0x66, 0x7107) /* <CJK */
-MAP(0x49, 0x67, 0x710B) /* <CJK */
-MAP(0x49, 0x68, 0x710C) /* <CJK */
-MAP(0x49, 0x69, 0x710F) /* <CJK */
-MAP(0x49, 0x6A, 0x711E) /* <CJK */
-MAP(0x49, 0x6B, 0x7120) /* <CJK */
-MAP(0x49, 0x6C, 0x712B) /* <CJK */
-MAP(0x49, 0x6D, 0x712D) /* <CJK */
-MAP(0x49, 0x6E, 0x712F) /* <CJK */
-MAP(0x49, 0x6F, 0x7130) /* <CJK */
-MAP(0x49, 0x70, 0x7131) /* <CJK */
-MAP(0x49, 0x71, 0x7138) /* <CJK */
-MAP(0x49, 0x72, 0x7141) /* <CJK */
-MAP(0x49, 0x73, 0x7145) /* <CJK */
-MAP(0x49, 0x74, 0x7146) /* <CJK */
-MAP(0x49, 0x75, 0x7147) /* <CJK */
-MAP(0x49, 0x76, 0x714A) /* <CJK */
-MAP(0x49, 0x77, 0x714B) /* <CJK */
-MAP(0x49, 0x78, 0x7150) /* <CJK */
-MAP(0x49, 0x79, 0x7152) /* <CJK */
-MAP(0x49, 0x7A, 0x7157) /* <CJK */
-MAP(0x49, 0x7B, 0x715A) /* <CJK */
-MAP(0x49, 0x7C, 0x715C) /* <CJK */
-MAP(0x49, 0x7D, 0x715E) /* <CJK */
-MAP(0x49, 0x7E, 0x7160) /* <CJK */
-MAP(0x4A, 0x21, 0x7168) /* <CJK */
-MAP(0x4A, 0x22, 0x7179) /* <CJK */
-MAP(0x4A, 0x23, 0x7180) /* <CJK */
-MAP(0x4A, 0x24, 0x7185) /* <CJK */
-MAP(0x4A, 0x25, 0x7187) /* <CJK */
-MAP(0x4A, 0x26, 0x718C) /* <CJK */
-MAP(0x4A, 0x27, 0x7192) /* <CJK */
-MAP(0x4A, 0x28, 0x719A) /* <CJK */
-MAP(0x4A, 0x29, 0x719B) /* <CJK */
-MAP(0x4A, 0x2A, 0x71A0) /* <CJK */
-MAP(0x4A, 0x2B, 0x71A2) /* <CJK */
-MAP(0x4A, 0x2C, 0x71AF) /* <CJK */
-MAP(0x4A, 0x2D, 0x71B0) /* <CJK */
-MAP(0x4A, 0x2E, 0x71B2) /* <CJK */
-MAP(0x4A, 0x2F, 0x71B3) /* <CJK */
-MAP(0x4A, 0x30, 0x71BA) /* <CJK */
-MAP(0x4A, 0x31, 0x71BF) /* <CJK */
-MAP(0x4A, 0x32, 0x71C0) /* <CJK */
-MAP(0x4A, 0x33, 0x71C1) /* <CJK */
-MAP(0x4A, 0x34, 0x71C4) /* <CJK */
-MAP(0x4A, 0x35, 0x71CB) /* <CJK */
-MAP(0x4A, 0x36, 0x71CC) /* <CJK */
-MAP(0x4A, 0x37, 0x71D3) /* <CJK */
-MAP(0x4A, 0x38, 0x71D6) /* <CJK */
-MAP(0x4A, 0x39, 0x71D9) /* <CJK */
-MAP(0x4A, 0x3A, 0x71DA) /* <CJK */
-MAP(0x4A, 0x3B, 0x71DC) /* <CJK */
-MAP(0x4A, 0x3C, 0x71F8) /* <CJK */
-MAP(0x4A, 0x3D, 0x71FE) /* <CJK */
-MAP(0x4A, 0x3E, 0x7200) /* <CJK */
-MAP(0x4A, 0x3F, 0x7207) /* <CJK */
-MAP(0x4A, 0x40, 0x7208) /* <CJK */
-MAP(0x4A, 0x41, 0x7209) /* <CJK */
-MAP(0x4A, 0x42, 0x7213) /* <CJK */
-MAP(0x4A, 0x43, 0x7217) /* <CJK */
-MAP(0x4A, 0x44, 0x721A) /* <CJK */
-MAP(0x4A, 0x45, 0x721D) /* <CJK */
-MAP(0x4A, 0x46, 0x721F) /* <CJK */
-MAP(0x4A, 0x47, 0x7224) /* <CJK */
-MAP(0x4A, 0x48, 0x722B) /* <CJK */
-MAP(0x4A, 0x49, 0x722F) /* <CJK */
-MAP(0x4A, 0x4A, 0x7234) /* <CJK */
-MAP(0x4A, 0x4B, 0x7238) /* <CJK */
-MAP(0x4A, 0x4C, 0x7239) /* <CJK */
-MAP(0x4A, 0x4D, 0x7241) /* <CJK */
-MAP(0x4A, 0x4E, 0x7242) /* <CJK */
-MAP(0x4A, 0x4F, 0x7243) /* <CJK */
-MAP(0x4A, 0x50, 0x7245) /* <CJK */
-MAP(0x4A, 0x51, 0x724E) /* <CJK */
-MAP(0x4A, 0x52, 0x724F) /* <CJK */
-MAP(0x4A, 0x53, 0x7250) /* <CJK */
-MAP(0x4A, 0x54, 0x7253) /* <CJK */
-MAP(0x4A, 0x55, 0x7255) /* <CJK */
-MAP(0x4A, 0x56, 0x7256) /* <CJK */
-MAP(0x4A, 0x57, 0x725A) /* <CJK */
-MAP(0x4A, 0x58, 0x725C) /* <CJK */
-MAP(0x4A, 0x59, 0x725E) /* <CJK */
-MAP(0x4A, 0x5A, 0x7260) /* <CJK */
-MAP(0x4A, 0x5B, 0x7263) /* <CJK */
-MAP(0x4A, 0x5C, 0x7268) /* <CJK */
-MAP(0x4A, 0x5D, 0x726B) /* <CJK */
-MAP(0x4A, 0x5E, 0x726E) /* <CJK */
-MAP(0x4A, 0x5F, 0x726F) /* <CJK */
-MAP(0x4A, 0x60, 0x7271) /* <CJK */
-MAP(0x4A, 0x61, 0x7277) /* <CJK */
-MAP(0x4A, 0x62, 0x7278) /* <CJK */
-MAP(0x4A, 0x63, 0x727B) /* <CJK */
-MAP(0x4A, 0x64, 0x727C) /* <CJK */
-MAP(0x4A, 0x65, 0x727F) /* <CJK */
-MAP(0x4A, 0x66, 0x7284) /* <CJK */
-MAP(0x4A, 0x67, 0x7289) /* <CJK */
-MAP(0x4A, 0x68, 0x728D) /* <CJK */
-MAP(0x4A, 0x69, 0x728E) /* <CJK */
-MAP(0x4A, 0x6A, 0x7293) /* <CJK */
-MAP(0x4A, 0x6B, 0x729B) /* <CJK */
-MAP(0x4A, 0x6C, 0x72A8) /* <CJK */
-MAP(0x4A, 0x6D, 0x72AD) /* <CJK */
-MAP(0x4A, 0x6E, 0x72AE) /* <CJK */
-MAP(0x4A, 0x6F, 0x72B1) /* <CJK */
-MAP(0x4A, 0x70, 0x72B4) /* <CJK */
-MAP(0x4A, 0x71, 0x72BE) /* <CJK */
-MAP(0x4A, 0x72, 0x72C1) /* <CJK */
-MAP(0x4A, 0x73, 0x72C7) /* <CJK */
-MAP(0x4A, 0x74, 0x72C9) /* <CJK */
-MAP(0x4A, 0x75, 0x72CC) /* <CJK */
-MAP(0x4A, 0x76, 0x72D5) /* <CJK */
-MAP(0x4A, 0x77, 0x72D6) /* <CJK */
-MAP(0x4A, 0x78, 0x72D8) /* <CJK */
-MAP(0x4A, 0x79, 0x72DF) /* <CJK */
-MAP(0x4A, 0x7A, 0x72E5) /* <CJK */
-MAP(0x4A, 0x7B, 0x72F3) /* <CJK */
-MAP(0x4A, 0x7C, 0x72F4) /* <CJK */
-MAP(0x4A, 0x7D, 0x72FA) /* <CJK */
-MAP(0x4A, 0x7E, 0x72FB) /* <CJK */
-MAP(0x4B, 0x21, 0x72FE) /* <CJK */
-MAP(0x4B, 0x22, 0x7302) /* <CJK */
-MAP(0x4B, 0x23, 0x7304) /* <CJK */
-MAP(0x4B, 0x24, 0x7305) /* <CJK */
-MAP(0x4B, 0x25, 0x7307) /* <CJK */
-MAP(0x4B, 0x26, 0x730B) /* <CJK */
-MAP(0x4B, 0x27, 0x730D) /* <CJK */
-MAP(0x4B, 0x28, 0x7312) /* <CJK */
-MAP(0x4B, 0x29, 0x7313) /* <CJK */
-MAP(0x4B, 0x2A, 0x7318) /* <CJK */
-MAP(0x4B, 0x2B, 0x7319) /* <CJK */
-MAP(0x4B, 0x2C, 0x731E) /* <CJK */
-MAP(0x4B, 0x2D, 0x7322) /* <CJK */
-MAP(0x4B, 0x2E, 0x7324) /* <CJK */
-MAP(0x4B, 0x2F, 0x7327) /* <CJK */
-MAP(0x4B, 0x30, 0x7328) /* <CJK */
-MAP(0x4B, 0x31, 0x732C) /* <CJK */
-MAP(0x4B, 0x32, 0x7331) /* <CJK */
-MAP(0x4B, 0x33, 0x7332) /* <CJK */
-MAP(0x4B, 0x34, 0x7335) /* <CJK */
-MAP(0x4B, 0x35, 0x733A) /* <CJK */
-MAP(0x4B, 0x36, 0x733B) /* <CJK */
-MAP(0x4B, 0x37, 0x733D) /* <CJK */
-MAP(0x4B, 0x38, 0x7343) /* <CJK */
-MAP(0x4B, 0x39, 0x734D) /* <CJK */
-MAP(0x4B, 0x3A, 0x7350) /* <CJK */
-MAP(0x4B, 0x3B, 0x7352) /* <CJK */
-MAP(0x4B, 0x3C, 0x7356) /* <CJK */
-MAP(0x4B, 0x3D, 0x7358) /* <CJK */
-MAP(0x4B, 0x3E, 0x735D) /* <CJK */
-MAP(0x4B, 0x3F, 0x735E) /* <CJK */
-MAP(0x4B, 0x40, 0x735F) /* <CJK */
-MAP(0x4B, 0x41, 0x7360) /* <CJK */
-MAP(0x4B, 0x42, 0x7366) /* <CJK */
-MAP(0x4B, 0x43, 0x7367) /* <CJK */
-MAP(0x4B, 0x44, 0x7369) /* <CJK */
-MAP(0x4B, 0x45, 0x736B) /* <CJK */
-MAP(0x4B, 0x46, 0x736C) /* <CJK */
-MAP(0x4B, 0x47, 0x736E) /* <CJK */
-MAP(0x4B, 0x48, 0x736F) /* <CJK */
-MAP(0x4B, 0x49, 0x7371) /* <CJK */
-MAP(0x4B, 0x4A, 0x7377) /* <CJK */
-MAP(0x4B, 0x4B, 0x7379) /* <CJK */
-MAP(0x4B, 0x4C, 0x737C) /* <CJK */
-MAP(0x4B, 0x4D, 0x7380) /* <CJK */
-MAP(0x4B, 0x4E, 0x7381) /* <CJK */
-MAP(0x4B, 0x4F, 0x7383) /* <CJK */
-MAP(0x4B, 0x50, 0x7385) /* <CJK */
-MAP(0x4B, 0x51, 0x7386) /* <CJK */
-MAP(0x4B, 0x52, 0x738E) /* <CJK */
-MAP(0x4B, 0x53, 0x7390) /* <CJK */
-MAP(0x4B, 0x54, 0x7393) /* <CJK */
-MAP(0x4B, 0x55, 0x7395) /* <CJK */
-MAP(0x4B, 0x56, 0x7397) /* <CJK */
-MAP(0x4B, 0x57, 0x7398) /* <CJK */
-MAP(0x4B, 0x58, 0x739C) /* <CJK */
-MAP(0x4B, 0x59, 0x739E) /* <CJK */
-MAP(0x4B, 0x5A, 0x739F) /* <CJK */
-MAP(0x4B, 0x5B, 0x73A0) /* <CJK */
-MAP(0x4B, 0x5C, 0x73A2) /* <CJK */
-MAP(0x4B, 0x5D, 0x73A5) /* <CJK */
-MAP(0x4B, 0x5E, 0x73A6) /* <CJK */
-MAP(0x4B, 0x5F, 0x73AA) /* <CJK */
-MAP(0x4B, 0x60, 0x73AB) /* <CJK */
-MAP(0x4B, 0x61, 0x73AD) /* <CJK */
-MAP(0x4B, 0x62, 0x73B5) /* <CJK */
-MAP(0x4B, 0x63, 0x73B7) /* <CJK */
-MAP(0x4B, 0x64, 0x73B9) /* <CJK */
-MAP(0x4B, 0x65, 0x73BC) /* <CJK */
-MAP(0x4B, 0x66, 0x73BD) /* <CJK */
-MAP(0x4B, 0x67, 0x73BF) /* <CJK */
-MAP(0x4B, 0x68, 0x73C5) /* <CJK */
-MAP(0x4B, 0x69, 0x73C6) /* <CJK */
-MAP(0x4B, 0x6A, 0x73C9) /* <CJK */
-MAP(0x4B, 0x6B, 0x73CB) /* <CJK */
-MAP(0x4B, 0x6C, 0x73CC) /* <CJK */
-MAP(0x4B, 0x6D, 0x73CF) /* <CJK */
-MAP(0x4B, 0x6E, 0x73D2) /* <CJK */
-MAP(0x4B, 0x6F, 0x73D3) /* <CJK */
-MAP(0x4B, 0x70, 0x73D6) /* <CJK */
-MAP(0x4B, 0x71, 0x73D9) /* <CJK */
-MAP(0x4B, 0x72, 0x73DD) /* <CJK */
-MAP(0x4B, 0x73, 0x73E1) /* <CJK */
-MAP(0x4B, 0x74, 0x73E3) /* <CJK */
-MAP(0x4B, 0x75, 0x73E6) /* <CJK */
-MAP(0x4B, 0x76, 0x73E7) /* <CJK */
-MAP(0x4B, 0x77, 0x73E9) /* <CJK */
-MAP(0x4B, 0x78, 0x73F4) /* <CJK */
-MAP(0x4B, 0x79, 0x73F5) /* <CJK */
-MAP(0x4B, 0x7A, 0x73F7) /* <CJK */
-MAP(0x4B, 0x7B, 0x73F9) /* <CJK */
-MAP(0x4B, 0x7C, 0x73FA) /* <CJK */
-MAP(0x4B, 0x7D, 0x73FB) /* <CJK */
-MAP(0x4B, 0x7E, 0x73FD) /* <CJK */
-MAP(0x4C, 0x21, 0x73FF) /* <CJK */
-MAP(0x4C, 0x22, 0x7400) /* <CJK */
-MAP(0x4C, 0x23, 0x7401) /* <CJK */
-MAP(0x4C, 0x24, 0x7404) /* <CJK */
-MAP(0x4C, 0x25, 0x7407) /* <CJK */
-MAP(0x4C, 0x26, 0x740A) /* <CJK */
-MAP(0x4C, 0x27, 0x7411) /* <CJK */
-MAP(0x4C, 0x28, 0x741A) /* <CJK */
-MAP(0x4C, 0x29, 0x741B) /* <CJK */
-MAP(0x4C, 0x2A, 0x7424) /* <CJK */
-MAP(0x4C, 0x2B, 0x7426) /* <CJK */
-MAP(0x4C, 0x2C, 0x7428) /* <CJK */
-MAP(0x4C, 0x2D, 0x7429) /* <CJK */
-MAP(0x4C, 0x2E, 0x742A) /* <CJK */
-MAP(0x4C, 0x2F, 0x742B) /* <CJK */
-MAP(0x4C, 0x30, 0x742C) /* <CJK */
-MAP(0x4C, 0x31, 0x742D) /* <CJK */
-MAP(0x4C, 0x32, 0x742E) /* <CJK */
-MAP(0x4C, 0x33, 0x742F) /* <CJK */
-MAP(0x4C, 0x34, 0x7430) /* <CJK */
-MAP(0x4C, 0x35, 0x7431) /* <CJK */
-MAP(0x4C, 0x36, 0x7439) /* <CJK */
-MAP(0x4C, 0x37, 0x7440) /* <CJK */
-MAP(0x4C, 0x38, 0x7443) /* <CJK */
-MAP(0x4C, 0x39, 0x7444) /* <CJK */
-MAP(0x4C, 0x3A, 0x7446) /* <CJK */
-MAP(0x4C, 0x3B, 0x7447) /* <CJK */
-MAP(0x4C, 0x3C, 0x744B) /* <CJK */
-MAP(0x4C, 0x3D, 0x744D) /* <CJK */
-MAP(0x4C, 0x3E, 0x7451) /* <CJK */
-MAP(0x4C, 0x3F, 0x7452) /* <CJK */
-MAP(0x4C, 0x40, 0x7457) /* <CJK */
-MAP(0x4C, 0x41, 0x745D) /* <CJK */
-MAP(0x4C, 0x42, 0x7462) /* <CJK */
-MAP(0x4C, 0x43, 0x7466) /* <CJK */
-MAP(0x4C, 0x44, 0x7467) /* <CJK */
-MAP(0x4C, 0x45, 0x7468) /* <CJK */
-MAP(0x4C, 0x46, 0x746B) /* <CJK */
-MAP(0x4C, 0x47, 0x746D) /* <CJK */
-MAP(0x4C, 0x48, 0x746E) /* <CJK */
-MAP(0x4C, 0x49, 0x7471) /* <CJK */
-MAP(0x4C, 0x4A, 0x7472) /* <CJK */
-MAP(0x4C, 0x4B, 0x7480) /* <CJK */
-MAP(0x4C, 0x4C, 0x7481) /* <CJK */
-MAP(0x4C, 0x4D, 0x7485) /* <CJK */
-MAP(0x4C, 0x4E, 0x7486) /* <CJK */
-MAP(0x4C, 0x4F, 0x7487) /* <CJK */
-MAP(0x4C, 0x50, 0x7489) /* <CJK */
-MAP(0x4C, 0x51, 0x748F) /* <CJK */
-MAP(0x4C, 0x52, 0x7490) /* <CJK */
-MAP(0x4C, 0x53, 0x7491) /* <CJK */
-MAP(0x4C, 0x54, 0x7492) /* <CJK */
-MAP(0x4C, 0x55, 0x7498) /* <CJK */
-MAP(0x4C, 0x56, 0x7499) /* <CJK */
-MAP(0x4C, 0x57, 0x749A) /* <CJK */
-MAP(0x4C, 0x58, 0x749C) /* <CJK */
-MAP(0x4C, 0x59, 0x749F) /* <CJK */
-MAP(0x4C, 0x5A, 0x74A0) /* <CJK */
-MAP(0x4C, 0x5B, 0x74A1) /* <CJK */
-MAP(0x4C, 0x5C, 0x74A3) /* <CJK */
-MAP(0x4C, 0x5D, 0x74A6) /* <CJK */
-MAP(0x4C, 0x5E, 0x74A8) /* <CJK */
-MAP(0x4C, 0x5F, 0x74A9) /* <CJK */
-MAP(0x4C, 0x60, 0x74AA) /* <CJK */
-MAP(0x4C, 0x61, 0x74AB) /* <CJK */
-MAP(0x4C, 0x62, 0x74AE) /* <CJK */
-MAP(0x4C, 0x63, 0x74AF) /* <CJK */
-MAP(0x4C, 0x64, 0x74B1) /* <CJK */
-MAP(0x4C, 0x65, 0x74B2) /* <CJK */
-MAP(0x4C, 0x66, 0x74B5) /* <CJK */
-MAP(0x4C, 0x67, 0x74B9) /* <CJK */
-MAP(0x4C, 0x68, 0x74BB) /* <CJK */
-MAP(0x4C, 0x69, 0x74BF) /* <CJK */
-MAP(0x4C, 0x6A, 0x74C8) /* <CJK */
-MAP(0x4C, 0x6B, 0x74C9) /* <CJK */
-MAP(0x4C, 0x6C, 0x74CC) /* <CJK */
-MAP(0x4C, 0x6D, 0x74D0) /* <CJK */
-MAP(0x4C, 0x6E, 0x74D3) /* <CJK */
-MAP(0x4C, 0x6F, 0x74D8) /* <CJK */
-MAP(0x4C, 0x70, 0x74DA) /* <CJK */
-MAP(0x4C, 0x71, 0x74DB) /* <CJK */
-MAP(0x4C, 0x72, 0x74DE) /* <CJK */
-MAP(0x4C, 0x73, 0x74DF) /* <CJK */
-MAP(0x4C, 0x74, 0x74E4) /* <CJK */
-MAP(0x4C, 0x75, 0x74E8) /* <CJK */
-MAP(0x4C, 0x76, 0x74EA) /* <CJK */
-MAP(0x4C, 0x77, 0x74EB) /* <CJK */
-MAP(0x4C, 0x78, 0x74EF) /* <CJK */
-MAP(0x4C, 0x79, 0x74F4) /* <CJK */
-MAP(0x4C, 0x7A, 0x74FA) /* <CJK */
-MAP(0x4C, 0x7B, 0x74FB) /* <CJK */
-MAP(0x4C, 0x7C, 0x74FC) /* <CJK */
-MAP(0x4C, 0x7D, 0x74FF) /* <CJK */
-MAP(0x4C, 0x7E, 0x7506) /* <CJK */
-MAP(0x4D, 0x21, 0x7512) /* <CJK */
-MAP(0x4D, 0x22, 0x7516) /* <CJK */
-MAP(0x4D, 0x23, 0x7517) /* <CJK */
-MAP(0x4D, 0x24, 0x7520) /* <CJK */
-MAP(0x4D, 0x25, 0x7521) /* <CJK */
-MAP(0x4D, 0x26, 0x7524) /* <CJK */
-MAP(0x4D, 0x27, 0x7527) /* <CJK */
-MAP(0x4D, 0x28, 0x7529) /* <CJK */
-MAP(0x4D, 0x29, 0x752A) /* <CJK */
-MAP(0x4D, 0x2A, 0x752F) /* <CJK */
-MAP(0x4D, 0x2B, 0x7536) /* <CJK */
-MAP(0x4D, 0x2C, 0x7539) /* <CJK */
-MAP(0x4D, 0x2D, 0x753D) /* <CJK */
-MAP(0x4D, 0x2E, 0x753E) /* <CJK */
-MAP(0x4D, 0x2F, 0x753F) /* <CJK */
-MAP(0x4D, 0x30, 0x7540) /* <CJK */
-MAP(0x4D, 0x31, 0x7543) /* <CJK */
-MAP(0x4D, 0x32, 0x7547) /* <CJK */
-MAP(0x4D, 0x33, 0x7548) /* <CJK */
-MAP(0x4D, 0x34, 0x754E) /* <CJK */
-MAP(0x4D, 0x35, 0x7550) /* <CJK */
-MAP(0x4D, 0x36, 0x7552) /* <CJK */
-MAP(0x4D, 0x37, 0x7557) /* <CJK */
-MAP(0x4D, 0x38, 0x755E) /* <CJK */
-MAP(0x4D, 0x39, 0x755F) /* <CJK */
-MAP(0x4D, 0x3A, 0x7561) /* <CJK */
-MAP(0x4D, 0x3B, 0x756F) /* <CJK */
-MAP(0x4D, 0x3C, 0x7571) /* <CJK */
-MAP(0x4D, 0x3D, 0x7579) /* <CJK */
-MAP(0x4D, 0x3E, 0x757A) /* <CJK */
-MAP(0x4D, 0x3F, 0x757B) /* <CJK */
-MAP(0x4D, 0x40, 0x757C) /* <CJK */
-MAP(0x4D, 0x41, 0x757D) /* <CJK */
-MAP(0x4D, 0x42, 0x757E) /* <CJK */
-MAP(0x4D, 0x43, 0x7581) /* <CJK */
-MAP(0x4D, 0x44, 0x7585) /* <CJK */
-MAP(0x4D, 0x45, 0x7590) /* <CJK */
-MAP(0x4D, 0x46, 0x7592) /* <CJK */
-MAP(0x4D, 0x47, 0x7593) /* <CJK */
-MAP(0x4D, 0x48, 0x7595) /* <CJK */
-MAP(0x4D, 0x49, 0x7599) /* <CJK */
-MAP(0x4D, 0x4A, 0x759C) /* <CJK */
-MAP(0x4D, 0x4B, 0x75A2) /* <CJK */
-MAP(0x4D, 0x4C, 0x75A4) /* <CJK */
-MAP(0x4D, 0x4D, 0x75B4) /* <CJK */
-MAP(0x4D, 0x4E, 0x75BA) /* <CJK */
-MAP(0x4D, 0x4F, 0x75BF) /* <CJK */
-MAP(0x4D, 0x50, 0x75C0) /* <CJK */
-MAP(0x4D, 0x51, 0x75C1) /* <CJK */
-MAP(0x4D, 0x52, 0x75C4) /* <CJK */
-MAP(0x4D, 0x53, 0x75C6) /* <CJK */
-MAP(0x4D, 0x54, 0x75CC) /* <CJK */
-MAP(0x4D, 0x55, 0x75CE) /* <CJK */
-MAP(0x4D, 0x56, 0x75CF) /* <CJK */
-MAP(0x4D, 0x57, 0x75D7) /* <CJK */
-MAP(0x4D, 0x58, 0x75DC) /* <CJK */
-MAP(0x4D, 0x59, 0x75DF) /* <CJK */
-MAP(0x4D, 0x5A, 0x75E0) /* <CJK */
-MAP(0x4D, 0x5B, 0x75E1) /* <CJK */
-MAP(0x4D, 0x5C, 0x75E4) /* <CJK */
-MAP(0x4D, 0x5D, 0x75E7) /* <CJK */
-MAP(0x4D, 0x5E, 0x75EC) /* <CJK */
-MAP(0x4D, 0x5F, 0x75EE) /* <CJK */
-MAP(0x4D, 0x60, 0x75EF) /* <CJK */
-MAP(0x4D, 0x61, 0x75F1) /* <CJK */
-MAP(0x4D, 0x62, 0x75F9) /* <CJK */
-MAP(0x4D, 0x63, 0x7600) /* <CJK */
-MAP(0x4D, 0x64, 0x7602) /* <CJK */
-MAP(0x4D, 0x65, 0x7603) /* <CJK */
-MAP(0x4D, 0x66, 0x7604) /* <CJK */
-MAP(0x4D, 0x67, 0x7607) /* <CJK */
-MAP(0x4D, 0x68, 0x7608) /* <CJK */
-MAP(0x4D, 0x69, 0x760A) /* <CJK */
-MAP(0x4D, 0x6A, 0x760C) /* <CJK */
-MAP(0x4D, 0x6B, 0x760F) /* <CJK */
-MAP(0x4D, 0x6C, 0x7612) /* <CJK */
-MAP(0x4D, 0x6D, 0x7613) /* <CJK */
-MAP(0x4D, 0x6E, 0x7615) /* <CJK */
-MAP(0x4D, 0x6F, 0x7616) /* <CJK */
-MAP(0x4D, 0x70, 0x7619) /* <CJK */
-MAP(0x4D, 0x71, 0x761B) /* <CJK */
-MAP(0x4D, 0x72, 0x761C) /* <CJK */
-MAP(0x4D, 0x73, 0x761D) /* <CJK */
-MAP(0x4D, 0x74, 0x761E) /* <CJK */
-MAP(0x4D, 0x75, 0x7623) /* <CJK */
-MAP(0x4D, 0x76, 0x7625) /* <CJK */
-MAP(0x4D, 0x77, 0x7626) /* <CJK */
-MAP(0x4D, 0x78, 0x7629) /* <CJK */
-MAP(0x4D, 0x79, 0x762D) /* <CJK */
-MAP(0x4D, 0x7A, 0x7632) /* <CJK */
-MAP(0x4D, 0x7B, 0x7633) /* <CJK */
-MAP(0x4D, 0x7C, 0x7635) /* <CJK */
-MAP(0x4D, 0x7D, 0x7638) /* <CJK */
-MAP(0x4D, 0x7E, 0x7639) /* <CJK */
-MAP(0x4E, 0x21, 0x763A) /* <CJK */
-MAP(0x4E, 0x22, 0x763C) /* <CJK */
-MAP(0x4E, 0x23, 0x764A) /* <CJK */
-MAP(0x4E, 0x24, 0x7640) /* <CJK */
-MAP(0x4E, 0x25, 0x7641) /* <CJK */
-MAP(0x4E, 0x26, 0x7643) /* <CJK */
-MAP(0x4E, 0x27, 0x7644) /* <CJK */
-MAP(0x4E, 0x28, 0x7645) /* <CJK */
-MAP(0x4E, 0x29, 0x7649) /* <CJK */
-MAP(0x4E, 0x2A, 0x764B) /* <CJK */
-MAP(0x4E, 0x2B, 0x7655) /* <CJK */
-MAP(0x4E, 0x2C, 0x7659) /* <CJK */
-MAP(0x4E, 0x2D, 0x765F) /* <CJK */
-MAP(0x4E, 0x2E, 0x7664) /* <CJK */
-MAP(0x4E, 0x2F, 0x7665) /* <CJK */
-MAP(0x4E, 0x30, 0x766D) /* <CJK */
-MAP(0x4E, 0x31, 0x766E) /* <CJK */
-MAP(0x4E, 0x32, 0x766F) /* <CJK */
-MAP(0x4E, 0x33, 0x7671) /* <CJK */
-MAP(0x4E, 0x34, 0x7674) /* <CJK */
-MAP(0x4E, 0x35, 0x7681) /* <CJK */
-MAP(0x4E, 0x36, 0x7685) /* <CJK */
-MAP(0x4E, 0x37, 0x768C) /* <CJK */
-MAP(0x4E, 0x38, 0x768D) /* <CJK */
-MAP(0x4E, 0x39, 0x7695) /* <CJK */
-MAP(0x4E, 0x3A, 0x769B) /* <CJK */
-MAP(0x4E, 0x3B, 0x769C) /* <CJK */
-MAP(0x4E, 0x3C, 0x769D) /* <CJK */
-MAP(0x4E, 0x3D, 0x769F) /* <CJK */
-MAP(0x4E, 0x3E, 0x76A0) /* <CJK */
-MAP(0x4E, 0x3F, 0x76A2) /* <CJK */
-MAP(0x4E, 0x40, 0x76A3) /* <CJK */
-MAP(0x4E, 0x41, 0x76A4) /* <CJK */
-MAP(0x4E, 0x42, 0x76A5) /* <CJK */
-MAP(0x4E, 0x43, 0x76A6) /* <CJK */
-MAP(0x4E, 0x44, 0x76A7) /* <CJK */
-MAP(0x4E, 0x45, 0x76A8) /* <CJK */
-MAP(0x4E, 0x46, 0x76AA) /* <CJK */
-MAP(0x4E, 0x47, 0x76AD) /* <CJK */
-MAP(0x4E, 0x48, 0x76BD) /* <CJK */
-MAP(0x4E, 0x49, 0x76C1) /* <CJK */
-MAP(0x4E, 0x4A, 0x76C5) /* <CJK */
-MAP(0x4E, 0x4B, 0x76C9) /* <CJK */
-MAP(0x4E, 0x4C, 0x76CB) /* <CJK */
-MAP(0x4E, 0x4D, 0x76CC) /* <CJK */
-MAP(0x4E, 0x4E, 0x76CE) /* <CJK */
-MAP(0x4E, 0x4F, 0x76D4) /* <CJK */
-MAP(0x4E, 0x50, 0x76D9) /* <CJK */
-MAP(0x4E, 0x51, 0x76E0) /* <CJK */
-MAP(0x4E, 0x52, 0x76E6) /* <CJK */
-MAP(0x4E, 0x53, 0x76E8) /* <CJK */
-MAP(0x4E, 0x54, 0x76EC) /* <CJK */
-MAP(0x4E, 0x55, 0x76F0) /* <CJK */
-MAP(0x4E, 0x56, 0x76F1) /* <CJK */
-MAP(0x4E, 0x57, 0x76F6) /* <CJK */
-MAP(0x4E, 0x58, 0x76F9) /* <CJK */
-MAP(0x4E, 0x59, 0x76FC) /* <CJK */
-MAP(0x4E, 0x5A, 0x7700) /* <CJK */
-MAP(0x4E, 0x5B, 0x7706) /* <CJK */
-MAP(0x4E, 0x5C, 0x770A) /* <CJK */
-MAP(0x4E, 0x5D, 0x770E) /* <CJK */
-MAP(0x4E, 0x5E, 0x7712) /* <CJK */
-MAP(0x4E, 0x5F, 0x7714) /* <CJK */
-MAP(0x4E, 0x60, 0x7715) /* <CJK */
-MAP(0x4E, 0x61, 0x7717) /* <CJK */
-MAP(0x4E, 0x62, 0x7719) /* <CJK */
-MAP(0x4E, 0x63, 0x771A) /* <CJK */
-MAP(0x4E, 0x64, 0x771C) /* <CJK */
-MAP(0x4E, 0x65, 0x7722) /* <CJK */
-MAP(0x4E, 0x66, 0x7728) /* <CJK */
-MAP(0x4E, 0x67, 0x772D) /* <CJK */
-MAP(0x4E, 0x68, 0x772E) /* <CJK */
-MAP(0x4E, 0x69, 0x772F) /* <CJK */
-MAP(0x4E, 0x6A, 0x7734) /* <CJK */
-MAP(0x4E, 0x6B, 0x7735) /* <CJK */
-MAP(0x4E, 0x6C, 0x7736) /* <CJK */
-MAP(0x4E, 0x6D, 0x7739) /* <CJK */
-MAP(0x4E, 0x6E, 0x773D) /* <CJK */
-MAP(0x4E, 0x6F, 0x773E) /* <CJK */
-MAP(0x4E, 0x70, 0x7742) /* <CJK */
-MAP(0x4E, 0x71, 0x7745) /* <CJK */
-MAP(0x4E, 0x72, 0x7746) /* <CJK */
-MAP(0x4E, 0x73, 0x774A) /* <CJK */
-MAP(0x4E, 0x74, 0x774D) /* <CJK */
-MAP(0x4E, 0x75, 0x774E) /* <CJK */
-MAP(0x4E, 0x76, 0x774F) /* <CJK */
-MAP(0x4E, 0x77, 0x7752) /* <CJK */
-MAP(0x4E, 0x78, 0x7756) /* <CJK */
-MAP(0x4E, 0x79, 0x7757) /* <CJK */
-MAP(0x4E, 0x7A, 0x775C) /* <CJK */
-MAP(0x4E, 0x7B, 0x775E) /* <CJK */
-MAP(0x4E, 0x7C, 0x775F) /* <CJK */
-MAP(0x4E, 0x7D, 0x7760) /* <CJK */
-MAP(0x4E, 0x7E, 0x7762) /* <CJK */
-MAP(0x4F, 0x21, 0x7764) /* <CJK */
-MAP(0x4F, 0x22, 0x7767) /* <CJK */
-MAP(0x4F, 0x23, 0x776A) /* <CJK */
-MAP(0x4F, 0x24, 0x776C) /* <CJK */
-MAP(0x4F, 0x25, 0x7770) /* <CJK */
-MAP(0x4F, 0x26, 0x7772) /* <CJK */
-MAP(0x4F, 0x27, 0x7773) /* <CJK */
-MAP(0x4F, 0x28, 0x7774) /* <CJK */
-MAP(0x4F, 0x29, 0x777A) /* <CJK */
-MAP(0x4F, 0x2A, 0x777D) /* <CJK */
-MAP(0x4F, 0x2B, 0x7780) /* <CJK */
-MAP(0x4F, 0x2C, 0x7784) /* <CJK */
-MAP(0x4F, 0x2D, 0x778C) /* <CJK */
-MAP(0x4F, 0x2E, 0x778D) /* <CJK */
-MAP(0x4F, 0x2F, 0x7794) /* <CJK */
-MAP(0x4F, 0x30, 0x7795) /* <CJK */
-MAP(0x4F, 0x31, 0x7796) /* <CJK */
-MAP(0x4F, 0x32, 0x779A) /* <CJK */
-MAP(0x4F, 0x33, 0x779F) /* <CJK */
-MAP(0x4F, 0x34, 0x77A2) /* <CJK */
-MAP(0x4F, 0x35, 0x77A7) /* <CJK */
-MAP(0x4F, 0x36, 0x77AA) /* <CJK */
-MAP(0x4F, 0x37, 0x77AE) /* <CJK */
-MAP(0x4F, 0x38, 0x77AF) /* <CJK */
-MAP(0x4F, 0x39, 0x77B1) /* <CJK */
-MAP(0x4F, 0x3A, 0x77B5) /* <CJK */
-MAP(0x4F, 0x3B, 0x77BE) /* <CJK */
-MAP(0x4F, 0x3C, 0x77C3) /* <CJK */
-MAP(0x4F, 0x3D, 0x77C9) /* <CJK */
-MAP(0x4F, 0x3E, 0x77D1) /* <CJK */
-MAP(0x4F, 0x3F, 0x77D2) /* <CJK */
-MAP(0x4F, 0x40, 0x77D5) /* <CJK */
-MAP(0x4F, 0x41, 0x77D9) /* <CJK */
-MAP(0x4F, 0x42, 0x77DE) /* <CJK */
-MAP(0x4F, 0x43, 0x77DF) /* <CJK */
-MAP(0x4F, 0x44, 0x77E0) /* <CJK */
-MAP(0x4F, 0x45, 0x77E4) /* <CJK */
-MAP(0x4F, 0x46, 0x77E6) /* <CJK */
-MAP(0x4F, 0x47, 0x77EA) /* <CJK */
-MAP(0x4F, 0x48, 0x77EC) /* <CJK */
-MAP(0x4F, 0x49, 0x77F0) /* <CJK */
-MAP(0x4F, 0x4A, 0x77F1) /* <CJK */
-MAP(0x4F, 0x4B, 0x77F4) /* <CJK */
-MAP(0x4F, 0x4C, 0x77F8) /* <CJK */
-MAP(0x4F, 0x4D, 0x77FB) /* <CJK */
-MAP(0x4F, 0x4E, 0x7805) /* <CJK */
-MAP(0x4F, 0x4F, 0x7806) /* <CJK */
-MAP(0x4F, 0x50, 0x7809) /* <CJK */
-MAP(0x4F, 0x51, 0x780D) /* <CJK */
-MAP(0x4F, 0x52, 0x780E) /* <CJK */
-MAP(0x4F, 0x53, 0x7811) /* <CJK */
-MAP(0x4F, 0x54, 0x781D) /* <CJK */
-MAP(0x4F, 0x55, 0x7821) /* <CJK */
-MAP(0x4F, 0x56, 0x7822) /* <CJK */
-MAP(0x4F, 0x57, 0x7823) /* <CJK */
-MAP(0x4F, 0x58, 0x782D) /* <CJK */
-MAP(0x4F, 0x59, 0x782E) /* <CJK */
-MAP(0x4F, 0x5A, 0x7830) /* <CJK */
-MAP(0x4F, 0x5B, 0x7835) /* <CJK */
-MAP(0x4F, 0x5C, 0x7837) /* <CJK */
-MAP(0x4F, 0x5D, 0x7843) /* <CJK */
-MAP(0x4F, 0x5E, 0x7844) /* <CJK */
-MAP(0x4F, 0x5F, 0x7847) /* <CJK */
-MAP(0x4F, 0x60, 0x7848) /* <CJK */
-MAP(0x4F, 0x61, 0x784C) /* <CJK */
-MAP(0x4F, 0x62, 0x784E) /* <CJK */
-MAP(0x4F, 0x63, 0x7852) /* <CJK */
-MAP(0x4F, 0x64, 0x785C) /* <CJK */
-MAP(0x4F, 0x65, 0x785E) /* <CJK */
-MAP(0x4F, 0x66, 0x7860) /* <CJK */
-MAP(0x4F, 0x67, 0x7861) /* <CJK */
-MAP(0x4F, 0x68, 0x7863) /* <CJK */
-MAP(0x4F, 0x69, 0x7864) /* <CJK */
-MAP(0x4F, 0x6A, 0x7868) /* <CJK */
-MAP(0x4F, 0x6B, 0x786A) /* <CJK */
-MAP(0x4F, 0x6C, 0x786E) /* <CJK */
-MAP(0x4F, 0x6D, 0x787A) /* <CJK */
-MAP(0x4F, 0x6E, 0x787E) /* <CJK */
-MAP(0x4F, 0x6F, 0x788A) /* <CJK */
-MAP(0x4F, 0x70, 0x788F) /* <CJK */
-MAP(0x4F, 0x71, 0x7894) /* <CJK */
-MAP(0x4F, 0x72, 0x7898) /* <CJK */
-MAP(0x4F, 0x73, 0x78A1) /* <CJK */
-MAP(0x4F, 0x74, 0x789D) /* <CJK */
-MAP(0x4F, 0x75, 0x789E) /* <CJK */
-MAP(0x4F, 0x76, 0x789F) /* <CJK */
-MAP(0x4F, 0x77, 0x78A4) /* <CJK */
-MAP(0x4F, 0x78, 0x78A8) /* <CJK */
-MAP(0x4F, 0x79, 0x78AC) /* <CJK */
-MAP(0x4F, 0x7A, 0x78AD) /* <CJK */
-MAP(0x4F, 0x7B, 0x78B0) /* <CJK */
-MAP(0x4F, 0x7C, 0x78B1) /* <CJK */
-MAP(0x4F, 0x7D, 0x78B2) /* <CJK */
-MAP(0x4F, 0x7E, 0x78B3) /* <CJK */
-MAP(0x50, 0x21, 0x78BB) /* <CJK */
-MAP(0x50, 0x22, 0x78BD) /* <CJK */
-MAP(0x50, 0x23, 0x78BF) /* <CJK */
-MAP(0x50, 0x24, 0x78C7) /* <CJK */
-MAP(0x50, 0x25, 0x78C8) /* <CJK */
-MAP(0x50, 0x26, 0x78C9) /* <CJK */
-MAP(0x50, 0x27, 0x78CC) /* <CJK */
-MAP(0x50, 0x28, 0x78CE) /* <CJK */
-MAP(0x50, 0x29, 0x78D2) /* <CJK */
-MAP(0x50, 0x2A, 0x78D3) /* <CJK */
-MAP(0x50, 0x2B, 0x78D5) /* <CJK */
-MAP(0x50, 0x2C, 0x78D6) /* <CJK */
-MAP(0x50, 0x2D, 0x78E4) /* <CJK */
-MAP(0x50, 0x2E, 0x78DB) /* <CJK */
-MAP(0x50, 0x2F, 0x78DF) /* <CJK */
-MAP(0x50, 0x30, 0x78E0) /* <CJK */
-MAP(0x50, 0x31, 0x78E1) /* <CJK */
-MAP(0x50, 0x32, 0x78E6) /* <CJK */
-MAP(0x50, 0x33, 0x78EA) /* <CJK */
-MAP(0x50, 0x34, 0x78F2) /* <CJK */
-MAP(0x50, 0x35, 0x78F3) /* <CJK */
-MAP(0x50, 0x36, 0x7900) /* <CJK */
-MAP(0x50, 0x37, 0x78F6) /* <CJK */
-MAP(0x50, 0x38, 0x78F7) /* <CJK */
-MAP(0x50, 0x39, 0x78FA) /* <CJK */
-MAP(0x50, 0x3A, 0x78FB) /* <CJK */
-MAP(0x50, 0x3B, 0x78FF) /* <CJK */
-MAP(0x50, 0x3C, 0x7906) /* <CJK */
-MAP(0x50, 0x3D, 0x790C) /* <CJK */
-MAP(0x50, 0x3E, 0x7910) /* <CJK */
-MAP(0x50, 0x3F, 0x791A) /* <CJK */
-MAP(0x50, 0x40, 0x791C) /* <CJK */
-MAP(0x50, 0x41, 0x791E) /* <CJK */
-MAP(0x50, 0x42, 0x791F) /* <CJK */
-MAP(0x50, 0x43, 0x7920) /* <CJK */
-MAP(0x50, 0x44, 0x7925) /* <CJK */
-MAP(0x50, 0x45, 0x7927) /* <CJK */
-MAP(0x50, 0x46, 0x7929) /* <CJK */
-MAP(0x50, 0x47, 0x792D) /* <CJK */
-MAP(0x50, 0x48, 0x7931) /* <CJK */
-MAP(0x50, 0x49, 0x7934) /* <CJK */
-MAP(0x50, 0x4A, 0x7935) /* <CJK */
-MAP(0x50, 0x4B, 0x793B) /* <CJK */
-MAP(0x50, 0x4C, 0x793D) /* <CJK */
-MAP(0x50, 0x4D, 0x793F) /* <CJK */
-MAP(0x50, 0x4E, 0x7944) /* <CJK */
-MAP(0x50, 0x4F, 0x7945) /* <CJK */
-MAP(0x50, 0x50, 0x7946) /* <CJK */
-MAP(0x50, 0x51, 0x794A) /* <CJK */
-MAP(0x50, 0x52, 0x794B) /* <CJK */
-MAP(0x50, 0x53, 0x794F) /* <CJK */
-MAP(0x50, 0x54, 0x7951) /* <CJK */
-MAP(0x50, 0x55, 0x7954) /* <CJK */
-MAP(0x50, 0x56, 0x7958) /* <CJK */
-MAP(0x50, 0x57, 0x795B) /* <CJK */
-MAP(0x50, 0x58, 0x795C) /* <CJK */
-MAP(0x50, 0x59, 0x7967) /* <CJK */
-MAP(0x50, 0x5A, 0x7969) /* <CJK */
-MAP(0x50, 0x5B, 0x796B) /* <CJK */
-MAP(0x50, 0x5C, 0x7972) /* <CJK */
-MAP(0x50, 0x5D, 0x7979) /* <CJK */
-MAP(0x50, 0x5E, 0x797B) /* <CJK */
-MAP(0x50, 0x5F, 0x797C) /* <CJK */
-MAP(0x50, 0x60, 0x797E) /* <CJK */
-MAP(0x50, 0x61, 0x798B) /* <CJK */
-MAP(0x50, 0x62, 0x798C) /* <CJK */
-MAP(0x50, 0x63, 0x7991) /* <CJK */
-MAP(0x50, 0x64, 0x7993) /* <CJK */
-MAP(0x50, 0x65, 0x7994) /* <CJK */
-MAP(0x50, 0x66, 0x7995) /* <CJK */
-MAP(0x50, 0x67, 0x7996) /* <CJK */
-MAP(0x50, 0x68, 0x7998) /* <CJK */
-MAP(0x50, 0x69, 0x799B) /* <CJK */
-MAP(0x50, 0x6A, 0x799C) /* <CJK */
-MAP(0x50, 0x6B, 0x79A1) /* <CJK */
-MAP(0x50, 0x6C, 0x79A8) /* <CJK */
-MAP(0x50, 0x6D, 0x79A9) /* <CJK */
-MAP(0x50, 0x6E, 0x79AB) /* <CJK */
-MAP(0x50, 0x6F, 0x79AF) /* <CJK */
-MAP(0x50, 0x70, 0x79B1) /* <CJK */
-MAP(0x50, 0x71, 0x79B4) /* <CJK */
-MAP(0x50, 0x72, 0x79B8) /* <CJK */
-MAP(0x50, 0x73, 0x79BB) /* <CJK */
-MAP(0x50, 0x74, 0x79C2) /* <CJK */
-MAP(0x50, 0x75, 0x79C4) /* <CJK */
-MAP(0x50, 0x76, 0x79C7) /* <CJK */
-MAP(0x50, 0x77, 0x79C8) /* <CJK */
-MAP(0x50, 0x78, 0x79CA) /* <CJK */
-MAP(0x50, 0x79, 0x79CF) /* <CJK */
-MAP(0x50, 0x7A, 0x79D4) /* <CJK */
-MAP(0x50, 0x7B, 0x79D6) /* <CJK */
-MAP(0x50, 0x7C, 0x79DA) /* <CJK */
-MAP(0x50, 0x7D, 0x79DD) /* <CJK */
-MAP(0x50, 0x7E, 0x79DE) /* <CJK */
-MAP(0x51, 0x21, 0x79E0) /* <CJK */
-MAP(0x51, 0x22, 0x79E2) /* <CJK */
-MAP(0x51, 0x23, 0x79E5) /* <CJK */
-MAP(0x51, 0x24, 0x79EA) /* <CJK */
-MAP(0x51, 0x25, 0x79EB) /* <CJK */
-MAP(0x51, 0x26, 0x79ED) /* <CJK */
-MAP(0x51, 0x27, 0x79F1) /* <CJK */
-MAP(0x51, 0x28, 0x79F8) /* <CJK */
-MAP(0x51, 0x29, 0x79FC) /* <CJK */
-MAP(0x51, 0x2A, 0x7A02) /* <CJK */
-MAP(0x51, 0x2B, 0x7A03) /* <CJK */
-MAP(0x51, 0x2C, 0x7A07) /* <CJK */
-MAP(0x51, 0x2D, 0x7A09) /* <CJK */
-MAP(0x51, 0x2E, 0x7A0A) /* <CJK */
-MAP(0x51, 0x2F, 0x7A0C) /* <CJK */
-MAP(0x51, 0x30, 0x7A11) /* <CJK */
-MAP(0x51, 0x31, 0x7A15) /* <CJK */
-MAP(0x51, 0x32, 0x7A1B) /* <CJK */
-MAP(0x51, 0x33, 0x7A1E) /* <CJK */
-MAP(0x51, 0x34, 0x7A21) /* <CJK */
-MAP(0x51, 0x35, 0x7A27) /* <CJK */
-MAP(0x51, 0x36, 0x7A2B) /* <CJK */
-MAP(0x51, 0x37, 0x7A2D) /* <CJK */
-MAP(0x51, 0x38, 0x7A2F) /* <CJK */
-MAP(0x51, 0x39, 0x7A30) /* <CJK */
-MAP(0x51, 0x3A, 0x7A34) /* <CJK */
-MAP(0x51, 0x3B, 0x7A35) /* <CJK */
-MAP(0x51, 0x3C, 0x7A38) /* <CJK */
-MAP(0x51, 0x3D, 0x7A39) /* <CJK */
-MAP(0x51, 0x3E, 0x7A3A) /* <CJK */
-MAP(0x51, 0x3F, 0x7A44) /* <CJK */
-MAP(0x51, 0x40, 0x7A45) /* <CJK */
-MAP(0x51, 0x41, 0x7A47) /* <CJK */
-MAP(0x51, 0x42, 0x7A48) /* <CJK */
-MAP(0x51, 0x43, 0x7A4C) /* <CJK */
-MAP(0x51, 0x44, 0x7A55) /* <CJK */
-MAP(0x51, 0x45, 0x7A56) /* <CJK */
-MAP(0x51, 0x46, 0x7A59) /* <CJK */
-MAP(0x51, 0x47, 0x7A5C) /* <CJK */
-MAP(0x51, 0x48, 0x7A5D) /* <CJK */
-MAP(0x51, 0x49, 0x7A5F) /* <CJK */
-MAP(0x51, 0x4A, 0x7A60) /* <CJK */
-MAP(0x51, 0x4B, 0x7A65) /* <CJK */
-MAP(0x51, 0x4C, 0x7A67) /* <CJK */
-MAP(0x51, 0x4D, 0x7A6A) /* <CJK */
-MAP(0x51, 0x4E, 0x7A6D) /* <CJK */
-MAP(0x51, 0x4F, 0x7A75) /* <CJK */
-MAP(0x51, 0x50, 0x7A78) /* <CJK */
-MAP(0x51, 0x51, 0x7A7E) /* <CJK */
-MAP(0x51, 0x52, 0x7A80) /* <CJK */
-MAP(0x51, 0x53, 0x7A82) /* <CJK */
-MAP(0x51, 0x54, 0x7A85) /* <CJK */
-MAP(0x51, 0x55, 0x7A86) /* <CJK */
-MAP(0x51, 0x56, 0x7A8A) /* <CJK */
-MAP(0x51, 0x57, 0x7A8B) /* <CJK */
-MAP(0x51, 0x58, 0x7A90) /* <CJK */
-MAP(0x51, 0x59, 0x7A91) /* <CJK */
-MAP(0x51, 0x5A, 0x7A94) /* <CJK */
-MAP(0x51, 0x5B, 0x7A9E) /* <CJK */
-MAP(0x51, 0x5C, 0x7AA0) /* <CJK */
-MAP(0x51, 0x5D, 0x7AA3) /* <CJK */
-MAP(0x51, 0x5E, 0x7AAC) /* <CJK */
-MAP(0x51, 0x5F, 0x7AB3) /* <CJK */
-MAP(0x51, 0x60, 0x7AB5) /* <CJK */
-MAP(0x51, 0x61, 0x7AB9) /* <CJK */
-MAP(0x51, 0x62, 0x7ABB) /* <CJK */
-MAP(0x51, 0x63, 0x7ABC) /* <CJK */
-MAP(0x51, 0x64, 0x7AC6) /* <CJK */
-MAP(0x51, 0x65, 0x7AC9) /* <CJK */
-MAP(0x51, 0x66, 0x7ACC) /* <CJK */
-MAP(0x51, 0x67, 0x7ACE) /* <CJK */
-MAP(0x51, 0x68, 0x7AD1) /* <CJK */
-MAP(0x51, 0x69, 0x7ADB) /* <CJK */
-MAP(0x51, 0x6A, 0x7AE8) /* <CJK */
-MAP(0x51, 0x6B, 0x7AE9) /* <CJK */
-MAP(0x51, 0x6C, 0x7AEB) /* <CJK */
-MAP(0x51, 0x6D, 0x7AEC) /* <CJK */
-MAP(0x51, 0x6E, 0x7AF1) /* <CJK */
-MAP(0x51, 0x6F, 0x7AF4) /* <CJK */
-MAP(0x51, 0x70, 0x7AFB) /* <CJK */
-MAP(0x51, 0x71, 0x7AFD) /* <CJK */
-MAP(0x51, 0x72, 0x7AFE) /* <CJK */
-MAP(0x51, 0x73, 0x7B07) /* <CJK */
-MAP(0x51, 0x74, 0x7B14) /* <CJK */
-MAP(0x51, 0x75, 0x7B1F) /* <CJK */
-MAP(0x51, 0x76, 0x7B23) /* <CJK */
-MAP(0x51, 0x77, 0x7B27) /* <CJK */
-MAP(0x51, 0x78, 0x7B29) /* <CJK */
-MAP(0x51, 0x79, 0x7B2A) /* <CJK */
-MAP(0x51, 0x7A, 0x7B2B) /* <CJK */
-MAP(0x51, 0x7B, 0x7B2D) /* <CJK */
-MAP(0x51, 0x7C, 0x7B2E) /* <CJK */
-MAP(0x51, 0x7D, 0x7B2F) /* <CJK */
-MAP(0x51, 0x7E, 0x7B30) /* <CJK */
-MAP(0x52, 0x21, 0x7B31) /* <CJK */
-MAP(0x52, 0x22, 0x7B34) /* <CJK */
-MAP(0x52, 0x23, 0x7B3D) /* <CJK */
-MAP(0x52, 0x24, 0x7B3F) /* <CJK */
-MAP(0x52, 0x25, 0x7B40) /* <CJK */
-MAP(0x52, 0x26, 0x7B41) /* <CJK */
-MAP(0x52, 0x27, 0x7B47) /* <CJK */
-MAP(0x52, 0x28, 0x7B4E) /* <CJK */
-MAP(0x52, 0x29, 0x7B55) /* <CJK */
-MAP(0x52, 0x2A, 0x7B60) /* <CJK */
-MAP(0x52, 0x2B, 0x7B64) /* <CJK */
-MAP(0x52, 0x2C, 0x7B66) /* <CJK */
-MAP(0x52, 0x2D, 0x7B69) /* <CJK */
-MAP(0x52, 0x2E, 0x7B6A) /* <CJK */
-MAP(0x52, 0x2F, 0x7B6D) /* <CJK */
-MAP(0x52, 0x30, 0x7B6F) /* <CJK */
-MAP(0x52, 0x31, 0x7B72) /* <CJK */
-MAP(0x52, 0x32, 0x7B73) /* <CJK */
-MAP(0x52, 0x33, 0x7B77) /* <CJK */
-MAP(0x52, 0x34, 0x7B84) /* <CJK */
-MAP(0x52, 0x35, 0x7B89) /* <CJK */
-MAP(0x52, 0x36, 0x7B8E) /* <CJK */
-MAP(0x52, 0x37, 0x7B90) /* <CJK */
-MAP(0x52, 0x38, 0x7B91) /* <CJK */
-MAP(0x52, 0x39, 0x7B96) /* <CJK */
-MAP(0x52, 0x3A, 0x7B9B) /* <CJK */
-MAP(0x52, 0x3B, 0x7B9E) /* <CJK */
-MAP(0x52, 0x3C, 0x7BA0) /* <CJK */
-MAP(0x52, 0x3D, 0x7BA5) /* <CJK */
-MAP(0x52, 0x3E, 0x7BAC) /* <CJK */
-MAP(0x52, 0x3F, 0x7BAF) /* <CJK */
-MAP(0x52, 0x40, 0x7BB0) /* <CJK */
-MAP(0x52, 0x41, 0x7BB2) /* <CJK */
-MAP(0x52, 0x42, 0x7BB5) /* <CJK */
-MAP(0x52, 0x43, 0x7BB6) /* <CJK */
-MAP(0x52, 0x44, 0x7BBA) /* <CJK */
-MAP(0x52, 0x45, 0x7BBB) /* <CJK */
-MAP(0x52, 0x46, 0x7BBC) /* <CJK */
-MAP(0x52, 0x47, 0x7BBD) /* <CJK */
-MAP(0x52, 0x48, 0x7BC2) /* <CJK */
-MAP(0x52, 0x49, 0x7BC5) /* <CJK */
-MAP(0x52, 0x4A, 0x7BC8) /* <CJK */
-MAP(0x52, 0x4B, 0x7BCA) /* <CJK */
-MAP(0x52, 0x4C, 0x7BD4) /* <CJK */
-MAP(0x52, 0x4D, 0x7BD6) /* <CJK */
-MAP(0x52, 0x4E, 0x7BD7) /* <CJK */
-MAP(0x52, 0x4F, 0x7BD9) /* <CJK */
-MAP(0x52, 0x50, 0x7BDA) /* <CJK */
-MAP(0x52, 0x51, 0x7BDB) /* <CJK */
-MAP(0x52, 0x52, 0x7BE8) /* <CJK */
-MAP(0x52, 0x53, 0x7BEA) /* <CJK */
-MAP(0x52, 0x54, 0x7BF2) /* <CJK */
-MAP(0x52, 0x55, 0x7BF4) /* <CJK */
-MAP(0x52, 0x56, 0x7BF5) /* <CJK */
-MAP(0x52, 0x57, 0x7BF8) /* <CJK */
-MAP(0x52, 0x58, 0x7BF9) /* <CJK */
-MAP(0x52, 0x59, 0x7BFA) /* <CJK */
-MAP(0x52, 0x5A, 0x7BFC) /* <CJK */
-MAP(0x52, 0x5B, 0x7BFE) /* <CJK */
-MAP(0x52, 0x5C, 0x7C01) /* <CJK */
-MAP(0x52, 0x5D, 0x7C02) /* <CJK */
-MAP(0x52, 0x5E, 0x7C03) /* <CJK */
-MAP(0x52, 0x5F, 0x7C04) /* <CJK */
-MAP(0x52, 0x60, 0x7C06) /* <CJK */
-MAP(0x52, 0x61, 0x7C09) /* <CJK */
-MAP(0x52, 0x62, 0x7C0B) /* <CJK */
-MAP(0x52, 0x63, 0x7C0C) /* <CJK */
-MAP(0x52, 0x64, 0x7C0E) /* <CJK */
-MAP(0x52, 0x65, 0x7C0F) /* <CJK */
-MAP(0x52, 0x66, 0x7C19) /* <CJK */
-MAP(0x52, 0x67, 0x7C1B) /* <CJK */
-MAP(0x52, 0x68, 0x7C20) /* <CJK */
-MAP(0x52, 0x69, 0x7C25) /* <CJK */
-MAP(0x52, 0x6A, 0x7C26) /* <CJK */
-MAP(0x52, 0x6B, 0x7C28) /* <CJK */
-MAP(0x52, 0x6C, 0x7C2C) /* <CJK */
-MAP(0x52, 0x6D, 0x7C31) /* <CJK */
-MAP(0x52, 0x6E, 0x7C33) /* <CJK */
-MAP(0x52, 0x6F, 0x7C34) /* <CJK */
-MAP(0x52, 0x70, 0x7C36) /* <CJK */
-MAP(0x52, 0x71, 0x7C39) /* <CJK */
-MAP(0x52, 0x72, 0x7C3A) /* <CJK */
-MAP(0x52, 0x73, 0x7C46) /* <CJK */
-MAP(0x52, 0x74, 0x7C4A) /* <CJK */
-MAP(0x52, 0x75, 0x7C55) /* <CJK */
-MAP(0x52, 0x76, 0x7C51) /* <CJK */
-MAP(0x52, 0x77, 0x7C52) /* <CJK */
-MAP(0x52, 0x78, 0x7C53) /* <CJK */
-MAP(0x52, 0x79, 0x7C59) /* <CJK */
-MAP(0x52, 0x7A, 0x7C5A) /* <CJK */
-MAP(0x52, 0x7B, 0x7C5B) /* <CJK */
-MAP(0x52, 0x7C, 0x7C5C) /* <CJK */
-MAP(0x52, 0x7D, 0x7C5D) /* <CJK */
-MAP(0x52, 0x7E, 0x7C5E) /* <CJK */
-MAP(0x53, 0x21, 0x7C61) /* <CJK */
-MAP(0x53, 0x22, 0x7C63) /* <CJK */
-MAP(0x53, 0x23, 0x7C67) /* <CJK */
-MAP(0x53, 0x24, 0x7C69) /* <CJK */
-MAP(0x53, 0x25, 0x7C6D) /* <CJK */
-MAP(0x53, 0x26, 0x7C6E) /* <CJK */
-MAP(0x53, 0x27, 0x7C70) /* <CJK */
-MAP(0x53, 0x28, 0x7C72) /* <CJK */
-MAP(0x53, 0x29, 0x7C79) /* <CJK */
-MAP(0x53, 0x2A, 0x7C7C) /* <CJK */
-MAP(0x53, 0x2B, 0x7C7D) /* <CJK */
-MAP(0x53, 0x2C, 0x7C86) /* <CJK */
-MAP(0x53, 0x2D, 0x7C87) /* <CJK */
-MAP(0x53, 0x2E, 0x7C8F) /* <CJK */
-MAP(0x53, 0x2F, 0x7C94) /* <CJK */
-MAP(0x53, 0x30, 0x7C9E) /* <CJK */
-MAP(0x53, 0x31, 0x7CA0) /* <CJK */
-MAP(0x53, 0x32, 0x7CA6) /* <CJK */
-MAP(0x53, 0x33, 0x7CB0) /* <CJK */
-MAP(0x53, 0x34, 0x7CB6) /* <CJK */
-MAP(0x53, 0x35, 0x7CB7) /* <CJK */
-MAP(0x53, 0x36, 0x7CBA) /* <CJK */
-MAP(0x53, 0x37, 0x7CBB) /* <CJK */
-MAP(0x53, 0x38, 0x7CBC) /* <CJK */
-MAP(0x53, 0x39, 0x7CBF) /* <CJK */
-MAP(0x53, 0x3A, 0x7CC4) /* <CJK */
-MAP(0x53, 0x3B, 0x7CC7) /* <CJK */
-MAP(0x53, 0x3C, 0x7CC8) /* <CJK */
-MAP(0x53, 0x3D, 0x7CC9) /* <CJK */
-MAP(0x53, 0x3E, 0x7CCD) /* <CJK */
-MAP(0x53, 0x3F, 0x7CCF) /* <CJK */
-MAP(0x53, 0x40, 0x7CD3) /* <CJK */
-MAP(0x53, 0x41, 0x7CD4) /* <CJK */
-MAP(0x53, 0x42, 0x7CD5) /* <CJK */
-MAP(0x53, 0x43, 0x7CD7) /* <CJK */
-MAP(0x53, 0x44, 0x7CD9) /* <CJK */
-MAP(0x53, 0x45, 0x7CDA) /* <CJK */
-MAP(0x53, 0x46, 0x7CDD) /* <CJK */
-MAP(0x53, 0x47, 0x7CE6) /* <CJK */
-MAP(0x53, 0x48, 0x7CE9) /* <CJK */
-MAP(0x53, 0x49, 0x7CEB) /* <CJK */
-MAP(0x53, 0x4A, 0x7CF5) /* <CJK */
-MAP(0x53, 0x4B, 0x7D03) /* <CJK */
-MAP(0x53, 0x4C, 0x7D07) /* <CJK */
-MAP(0x53, 0x4D, 0x7D08) /* <CJK */
-MAP(0x53, 0x4E, 0x7D09) /* <CJK */
-MAP(0x53, 0x4F, 0x7D0F) /* <CJK */
-MAP(0x53, 0x50, 0x7D11) /* <CJK */
-MAP(0x53, 0x51, 0x7D12) /* <CJK */
-MAP(0x53, 0x52, 0x7D13) /* <CJK */
-MAP(0x53, 0x53, 0x7D16) /* <CJK */
-MAP(0x53, 0x54, 0x7D1D) /* <CJK */
-MAP(0x53, 0x55, 0x7D1E) /* <CJK */
-MAP(0x53, 0x56, 0x7D23) /* <CJK */
-MAP(0x53, 0x57, 0x7D26) /* <CJK */
-MAP(0x53, 0x58, 0x7D2A) /* <CJK */
-MAP(0x53, 0x59, 0x7D2D) /* <CJK */
-MAP(0x53, 0x5A, 0x7D31) /* <CJK */
-MAP(0x53, 0x5B, 0x7D3C) /* <CJK */
-MAP(0x53, 0x5C, 0x7D3D) /* <CJK */
-MAP(0x53, 0x5D, 0x7D3E) /* <CJK */
-MAP(0x53, 0x5E, 0x7D40) /* <CJK */
-MAP(0x53, 0x5F, 0x7D41) /* <CJK */
-MAP(0x53, 0x60, 0x7D47) /* <CJK */
-MAP(0x53, 0x61, 0x7D48) /* <CJK */
-MAP(0x53, 0x62, 0x7D4D) /* <CJK */
-MAP(0x53, 0x63, 0x7D51) /* <CJK */
-MAP(0x53, 0x64, 0x7D53) /* <CJK */
-MAP(0x53, 0x65, 0x7D57) /* <CJK */
-MAP(0x53, 0x66, 0x7D59) /* <CJK */
-MAP(0x53, 0x67, 0x7D5A) /* <CJK */
-MAP(0x53, 0x68, 0x7D5C) /* <CJK */
-MAP(0x53, 0x69, 0x7D5D) /* <CJK */
-MAP(0x53, 0x6A, 0x7D65) /* <CJK */
-MAP(0x53, 0x6B, 0x7D67) /* <CJK */
-MAP(0x53, 0x6C, 0x7D6A) /* <CJK */
-MAP(0x53, 0x6D, 0x7D70) /* <CJK */
-MAP(0x53, 0x6E, 0x7D78) /* <CJK */
-MAP(0x53, 0x6F, 0x7D7A) /* <CJK */
-MAP(0x53, 0x70, 0x7D7B) /* <CJK */
-MAP(0x53, 0x71, 0x7D7F) /* <CJK */
-MAP(0x53, 0x72, 0x7D81) /* <CJK */
-MAP(0x53, 0x73, 0x7D82) /* <CJK */
-MAP(0x53, 0x74, 0x7D83) /* <CJK */
-MAP(0x53, 0x75, 0x7D85) /* <CJK */
-MAP(0x53, 0x76, 0x7D86) /* <CJK */
-MAP(0x53, 0x77, 0x7D88) /* <CJK */
-MAP(0x53, 0x78, 0x7D8B) /* <CJK */
-MAP(0x53, 0x79, 0x7D8C) /* <CJK */
-MAP(0x53, 0x7A, 0x7D8D) /* <CJK */
-MAP(0x53, 0x7B, 0x7D91) /* <CJK */
-MAP(0x53, 0x7C, 0x7D96) /* <CJK */
-MAP(0x53, 0x7D, 0x7D97) /* <CJK */
-MAP(0x53, 0x7E, 0x7D9D) /* <CJK */
-MAP(0x54, 0x21, 0x7D9E) /* <CJK */
-MAP(0x54, 0x22, 0x7DA6) /* <CJK */
-MAP(0x54, 0x23, 0x7DA7) /* <CJK */
-MAP(0x54, 0x24, 0x7DAA) /* <CJK */
-MAP(0x54, 0x25, 0x7DB3) /* <CJK */
-MAP(0x54, 0x26, 0x7DB6) /* <CJK */
-MAP(0x54, 0x27, 0x7DB7) /* <CJK */
-MAP(0x54, 0x28, 0x7DB9) /* <CJK */
-MAP(0x54, 0x29, 0x7DC2) /* <CJK */
-MAP(0x54, 0x2A, 0x7DC3) /* <CJK */
-MAP(0x54, 0x2B, 0x7DC4) /* <CJK */
-MAP(0x54, 0x2C, 0x7DC5) /* <CJK */
-MAP(0x54, 0x2D, 0x7DC6) /* <CJK */
-MAP(0x54, 0x2E, 0x7DCC) /* <CJK */
-MAP(0x54, 0x2F, 0x7DCD) /* <CJK */
-MAP(0x54, 0x30, 0x7DCE) /* <CJK */
-MAP(0x54, 0x31, 0x7DD7) /* <CJK */
-MAP(0x54, 0x32, 0x7DD9) /* <CJK */
-MAP(0x54, 0x33, 0x7E00) /* <CJK */
-MAP(0x54, 0x34, 0x7DE2) /* <CJK */
-MAP(0x54, 0x35, 0x7DE5) /* <CJK */
-MAP(0x54, 0x36, 0x7DE6) /* <CJK */
-MAP(0x54, 0x37, 0x7DEA) /* <CJK */
-MAP(0x54, 0x38, 0x7DEB) /* <CJK */
-MAP(0x54, 0x39, 0x7DED) /* <CJK */
-MAP(0x54, 0x3A, 0x7DF1) /* <CJK */
-MAP(0x54, 0x3B, 0x7DF5) /* <CJK */
-MAP(0x54, 0x3C, 0x7DF6) /* <CJK */
-MAP(0x54, 0x3D, 0x7DF9) /* <CJK */
-MAP(0x54, 0x3E, 0x7DFA) /* <CJK */
-MAP(0x54, 0x3F, 0x7E08) /* <CJK */
-MAP(0x54, 0x40, 0x7E10) /* <CJK */
-MAP(0x54, 0x41, 0x7E11) /* <CJK */
-MAP(0x54, 0x42, 0x7E15) /* <CJK */
-MAP(0x54, 0x43, 0x7E17) /* <CJK */
-MAP(0x54, 0x44, 0x7E1C) /* <CJK */
-MAP(0x54, 0x45, 0x7E1D) /* <CJK */
-MAP(0x54, 0x46, 0x7E20) /* <CJK */
-MAP(0x54, 0x47, 0x7E27) /* <CJK */
-MAP(0x54, 0x48, 0x7E28) /* <CJK */
-MAP(0x54, 0x49, 0x7E2C) /* <CJK */
-MAP(0x54, 0x4A, 0x7E2D) /* <CJK */
-MAP(0x54, 0x4B, 0x7E2F) /* <CJK */
-MAP(0x54, 0x4C, 0x7E33) /* <CJK */
-MAP(0x54, 0x4D, 0x7E36) /* <CJK */
-MAP(0x54, 0x4E, 0x7E3F) /* <CJK */
-MAP(0x54, 0x4F, 0x7E44) /* <CJK */
-MAP(0x54, 0x50, 0x7E45) /* <CJK */
-MAP(0x54, 0x51, 0x7E47) /* <CJK */
-MAP(0x54, 0x52, 0x7E4E) /* <CJK */
-MAP(0x54, 0x53, 0x7E50) /* <CJK */
-MAP(0x54, 0x54, 0x7E52) /* <CJK */
-MAP(0x54, 0x55, 0x7E58) /* <CJK */
-MAP(0x54, 0x56, 0x7E5F) /* <CJK */
-MAP(0x54, 0x57, 0x7E61) /* <CJK */
-MAP(0x54, 0x58, 0x7E62) /* <CJK */
-MAP(0x54, 0x59, 0x7E65) /* <CJK */
-MAP(0x54, 0x5A, 0x7E6B) /* <CJK */
-MAP(0x54, 0x5B, 0x7E6E) /* <CJK */
-MAP(0x54, 0x5C, 0x7E6F) /* <CJK */
-MAP(0x54, 0x5D, 0x7E73) /* <CJK */
-MAP(0x54, 0x5E, 0x7E78) /* <CJK */
-MAP(0x54, 0x5F, 0x7E7E) /* <CJK */
-MAP(0x54, 0x60, 0x7E81) /* <CJK */
-MAP(0x54, 0x61, 0x7E86) /* <CJK */
-MAP(0x54, 0x62, 0x7E87) /* <CJK */
-MAP(0x54, 0x63, 0x7E8A) /* <CJK */
-MAP(0x54, 0x64, 0x7E8D) /* <CJK */
-MAP(0x54, 0x65, 0x7E91) /* <CJK */
-MAP(0x54, 0x66, 0x7E95) /* <CJK */
-MAP(0x54, 0x67, 0x7E98) /* <CJK */
-MAP(0x54, 0x68, 0x7E9A) /* <CJK */
-MAP(0x54, 0x69, 0x7E9D) /* <CJK */
-MAP(0x54, 0x6A, 0x7E9E) /* <CJK */
-MAP(0x54, 0x6B, 0x7F3C) /* <CJK */
-MAP(0x54, 0x6C, 0x7F3B) /* <CJK */
-MAP(0x54, 0x6D, 0x7F3D) /* <CJK */
-MAP(0x54, 0x6E, 0x7F3E) /* <CJK */
-MAP(0x54, 0x6F, 0x7F3F) /* <CJK */
-MAP(0x54, 0x70, 0x7F43) /* <CJK */
-MAP(0x54, 0x71, 0x7F44) /* <CJK */
-MAP(0x54, 0x72, 0x7F47) /* <CJK */
-MAP(0x54, 0x73, 0x7F4F) /* <CJK */
-MAP(0x54, 0x74, 0x7F52) /* <CJK */
-MAP(0x54, 0x75, 0x7F53) /* <CJK */
-MAP(0x54, 0x76, 0x7F5B) /* <CJK */
-MAP(0x54, 0x77, 0x7F5C) /* <CJK */
-MAP(0x54, 0x78, 0x7F5D) /* <CJK */
-MAP(0x54, 0x79, 0x7F61) /* <CJK */
-MAP(0x54, 0x7A, 0x7F63) /* <CJK */
-MAP(0x54, 0x7B, 0x7F64) /* <CJK */
-MAP(0x54, 0x7C, 0x7F65) /* <CJK */
-MAP(0x54, 0x7D, 0x7F66) /* <CJK */
-MAP(0x54, 0x7E, 0x7F6D) /* <CJK */
-MAP(0x55, 0x21, 0x7F71) /* <CJK */
-MAP(0x55, 0x22, 0x7F7D) /* <CJK */
-MAP(0x55, 0x23, 0x7F7E) /* <CJK */
-MAP(0x55, 0x24, 0x7F7F) /* <CJK */
-MAP(0x55, 0x25, 0x7F80) /* <CJK */
-MAP(0x55, 0x26, 0x7F8B) /* <CJK */
-MAP(0x55, 0x27, 0x7F8D) /* <CJK */
-MAP(0x55, 0x28, 0x7F8F) /* <CJK */
-MAP(0x55, 0x29, 0x7F90) /* <CJK */
-MAP(0x55, 0x2A, 0x7F91) /* <CJK */
-MAP(0x55, 0x2B, 0x7F96) /* <CJK */
-MAP(0x55, 0x2C, 0x7F97) /* <CJK */
-MAP(0x55, 0x2D, 0x7F9C) /* <CJK */
-MAP(0x55, 0x2E, 0x7FA1) /* <CJK */
-MAP(0x55, 0x2F, 0x7FA2) /* <CJK */
-MAP(0x55, 0x30, 0x7FA6) /* <CJK */
-MAP(0x55, 0x31, 0x7FAA) /* <CJK */
-MAP(0x55, 0x32, 0x7FAD) /* <CJK */
-MAP(0x55, 0x33, 0x7FB4) /* <CJK */
-MAP(0x55, 0x34, 0x7FBC) /* <CJK */
-MAP(0x55, 0x35, 0x7FBF) /* <CJK */
-MAP(0x55, 0x36, 0x7FC0) /* <CJK */
-MAP(0x55, 0x37, 0x7FC3) /* <CJK */
-MAP(0x55, 0x38, 0x7FC8) /* <CJK */
-MAP(0x55, 0x39, 0x7FCE) /* <CJK */
-MAP(0x55, 0x3A, 0x7FCF) /* <CJK */
-MAP(0x55, 0x3B, 0x7FDB) /* <CJK */
-MAP(0x55, 0x3C, 0x7FDF) /* <CJK */
-MAP(0x55, 0x3D, 0x7FE3) /* <CJK */
-MAP(0x55, 0x3E, 0x7FE5) /* <CJK */
-MAP(0x55, 0x3F, 0x7FE8) /* <CJK */
-MAP(0x55, 0x40, 0x7FEC) /* <CJK */
-MAP(0x55, 0x41, 0x7FEE) /* <CJK */
-MAP(0x55, 0x42, 0x7FEF) /* <CJK */
-MAP(0x55, 0x43, 0x7FF2) /* <CJK */
-MAP(0x55, 0x44, 0x7FFA) /* <CJK */
-MAP(0x55, 0x45, 0x7FFD) /* <CJK */
-MAP(0x55, 0x46, 0x7FFE) /* <CJK */
-MAP(0x55, 0x47, 0x7FFF) /* <CJK */
-MAP(0x55, 0x48, 0x8007) /* <CJK */
-MAP(0x55, 0x49, 0x8008) /* <CJK */
-MAP(0x55, 0x4A, 0x800A) /* <CJK */
-MAP(0x55, 0x4B, 0x800D) /* <CJK */
-MAP(0x55, 0x4C, 0x800E) /* <CJK */
-MAP(0x55, 0x4D, 0x800F) /* <CJK */
-MAP(0x55, 0x4E, 0x8011) /* <CJK */
-MAP(0x55, 0x4F, 0x8013) /* <CJK */
-MAP(0x55, 0x50, 0x8014) /* <CJK */
-MAP(0x55, 0x51, 0x8016) /* <CJK */
-MAP(0x55, 0x52, 0x801D) /* <CJK */
-MAP(0x55, 0x53, 0x801E) /* <CJK */
-MAP(0x55, 0x54, 0x801F) /* <CJK */
-MAP(0x55, 0x55, 0x8020) /* <CJK */
-MAP(0x55, 0x56, 0x8024) /* <CJK */
-MAP(0x55, 0x57, 0x8026) /* <CJK */
-MAP(0x55, 0x58, 0x802C) /* <CJK */
-MAP(0x55, 0x59, 0x802E) /* <CJK */
-MAP(0x55, 0x5A, 0x8030) /* <CJK */
-MAP(0x55, 0x5B, 0x8034) /* <CJK */
-MAP(0x55, 0x5C, 0x8035) /* <CJK */
-MAP(0x55, 0x5D, 0x8037) /* <CJK */
-MAP(0x55, 0x5E, 0x8039) /* <CJK */
-MAP(0x55, 0x5F, 0x803A) /* <CJK */
-MAP(0x55, 0x60, 0x803C) /* <CJK */
-MAP(0x55, 0x61, 0x803E) /* <CJK */
-MAP(0x55, 0x62, 0x8040) /* <CJK */
-MAP(0x55, 0x63, 0x8044) /* <CJK */
-MAP(0x55, 0x64, 0x8060) /* <CJK */
-MAP(0x55, 0x65, 0x8064) /* <CJK */
-MAP(0x55, 0x66, 0x8066) /* <CJK */
-MAP(0x55, 0x67, 0x806D) /* <CJK */
-MAP(0x55, 0x68, 0x8071) /* <CJK */
-MAP(0x55, 0x69, 0x8075) /* <CJK */
-MAP(0x55, 0x6A, 0x8081) /* <CJK */
-MAP(0x55, 0x6B, 0x8088) /* <CJK */
-MAP(0x55, 0x6C, 0x808E) /* <CJK */
-MAP(0x55, 0x6D, 0x809C) /* <CJK */
-MAP(0x55, 0x6E, 0x809E) /* <CJK */
-MAP(0x55, 0x6F, 0x80A6) /* <CJK */
-MAP(0x55, 0x70, 0x80A7) /* <CJK */
-MAP(0x55, 0x71, 0x80AB) /* <CJK */
-MAP(0x55, 0x72, 0x80B8) /* <CJK */
-MAP(0x55, 0x73, 0x80B9) /* <CJK */
-MAP(0x55, 0x74, 0x80C8) /* <CJK */
-MAP(0x55, 0x75, 0x80CD) /* <CJK */
-MAP(0x55, 0x76, 0x80CF) /* <CJK */
-MAP(0x55, 0x77, 0x80D2) /* <CJK */
-MAP(0x55, 0x78, 0x80D4) /* <CJK */
-MAP(0x55, 0x79, 0x80D5) /* <CJK */
-MAP(0x55, 0x7A, 0x80D7) /* <CJK */
-MAP(0x55, 0x7B, 0x80D8) /* <CJK */
-MAP(0x55, 0x7C, 0x80E0) /* <CJK */
-MAP(0x55, 0x7D, 0x80ED) /* <CJK */
-MAP(0x55, 0x7E, 0x80EE) /* <CJK */
-MAP(0x56, 0x21, 0x80F0) /* <CJK */
-MAP(0x56, 0x22, 0x80F2) /* <CJK */
-MAP(0x56, 0x23, 0x80F3) /* <CJK */
-MAP(0x56, 0x24, 0x80F6) /* <CJK */
-MAP(0x56, 0x25, 0x80F9) /* <CJK */
-MAP(0x56, 0x26, 0x80FA) /* <CJK */
-MAP(0x56, 0x27, 0x80FE) /* <CJK */
-MAP(0x56, 0x28, 0x8103) /* <CJK */
-MAP(0x56, 0x29, 0x810B) /* <CJK */
-MAP(0x56, 0x2A, 0x8116) /* <CJK */
-MAP(0x56, 0x2B, 0x8117) /* <CJK */
-MAP(0x56, 0x2C, 0x8118) /* <CJK */
-MAP(0x56, 0x2D, 0x811C) /* <CJK */
-MAP(0x56, 0x2E, 0x811E) /* <CJK */
-MAP(0x56, 0x2F, 0x8120) /* <CJK */
-MAP(0x56, 0x30, 0x8124) /* <CJK */
-MAP(0x56, 0x31, 0x8127) /* <CJK */
-MAP(0x56, 0x32, 0x812C) /* <CJK */
-MAP(0x56, 0x33, 0x8130) /* <CJK */
-MAP(0x56, 0x34, 0x8135) /* <CJK */
-MAP(0x56, 0x35, 0x813A) /* <CJK */
-MAP(0x56, 0x36, 0x813C) /* <CJK */
-MAP(0x56, 0x37, 0x8145) /* <CJK */
-MAP(0x56, 0x38, 0x8147) /* <CJK */
-MAP(0x56, 0x39, 0x814A) /* <CJK */
-MAP(0x56, 0x3A, 0x814C) /* <CJK */
-MAP(0x56, 0x3B, 0x8152) /* <CJK */
-MAP(0x56, 0x3C, 0x8157) /* <CJK */
-MAP(0x56, 0x3D, 0x8160) /* <CJK */
-MAP(0x56, 0x3E, 0x8161) /* <CJK */
-MAP(0x56, 0x3F, 0x8167) /* <CJK */
-MAP(0x56, 0x40, 0x8168) /* <CJK */
-MAP(0x56, 0x41, 0x8169) /* <CJK */
-MAP(0x56, 0x42, 0x816D) /* <CJK */
-MAP(0x56, 0x43, 0x816F) /* <CJK */
-MAP(0x56, 0x44, 0x8177) /* <CJK */
-MAP(0x56, 0x45, 0x8181) /* <CJK */
-MAP(0x56, 0x46, 0x8190) /* <CJK */
-MAP(0x56, 0x47, 0x8184) /* <CJK */
-MAP(0x56, 0x48, 0x8185) /* <CJK */
-MAP(0x56, 0x49, 0x8186) /* <CJK */
-MAP(0x56, 0x4A, 0x818B) /* <CJK */
-MAP(0x56, 0x4B, 0x818E) /* <CJK */
-MAP(0x56, 0x4C, 0x8196) /* <CJK */
-MAP(0x56, 0x4D, 0x8198) /* <CJK */
-MAP(0x56, 0x4E, 0x819B) /* <CJK */
-MAP(0x56, 0x4F, 0x819E) /* <CJK */
-MAP(0x56, 0x50, 0x81A2) /* <CJK */
-MAP(0x56, 0x51, 0x81AE) /* <CJK */
-MAP(0x56, 0x52, 0x81B2) /* <CJK */
-MAP(0x56, 0x53, 0x81B4) /* <CJK */
-MAP(0x56, 0x54, 0x81BB) /* <CJK */
-MAP(0x56, 0x55, 0x81CB) /* <CJK */
-MAP(0x56, 0x56, 0x81C3) /* <CJK */
-MAP(0x56, 0x57, 0x81C5) /* <CJK */
-MAP(0x56, 0x58, 0x81CA) /* <CJK */
-MAP(0x56, 0x59, 0x81CE) /* <CJK */
-MAP(0x56, 0x5A, 0x81CF) /* <CJK */
-MAP(0x56, 0x5B, 0x81D5) /* <CJK */
-MAP(0x56, 0x5C, 0x81D7) /* <CJK */
-MAP(0x56, 0x5D, 0x81DB) /* <CJK */
-MAP(0x56, 0x5E, 0x81DD) /* <CJK */
-MAP(0x56, 0x5F, 0x81DE) /* <CJK */
-MAP(0x56, 0x60, 0x81E1) /* <CJK */
-MAP(0x56, 0x61, 0x81E4) /* <CJK */
-MAP(0x56, 0x62, 0x81EB) /* <CJK */
-MAP(0x56, 0x63, 0x81EC) /* <CJK */
-MAP(0x56, 0x64, 0x81F0) /* <CJK */
-MAP(0x56, 0x65, 0x81F1) /* <CJK */
-MAP(0x56, 0x66, 0x81F2) /* <CJK */
-MAP(0x56, 0x67, 0x81F5) /* <CJK */
-MAP(0x56, 0x68, 0x81F6) /* <CJK */
-MAP(0x56, 0x69, 0x81F8) /* <CJK */
-MAP(0x56, 0x6A, 0x81F9) /* <CJK */
-MAP(0x56, 0x6B, 0x81FD) /* <CJK */
-MAP(0x56, 0x6C, 0x81FF) /* <CJK */
-MAP(0x56, 0x6D, 0x8200) /* <CJK */
-MAP(0x56, 0x6E, 0x8203) /* <CJK */
-MAP(0x56, 0x6F, 0x820F) /* <CJK */
-MAP(0x56, 0x70, 0x8213) /* <CJK */
-MAP(0x56, 0x71, 0x8214) /* <CJK */
-MAP(0x56, 0x72, 0x8219) /* <CJK */
-MAP(0x56, 0x73, 0x821A) /* <CJK */
-MAP(0x56, 0x74, 0x821D) /* <CJK */
-MAP(0x56, 0x75, 0x8221) /* <CJK */
-MAP(0x56, 0x76, 0x8222) /* <CJK */
-MAP(0x56, 0x77, 0x8228) /* <CJK */
-MAP(0x56, 0x78, 0x8232) /* <CJK */
-MAP(0x56, 0x79, 0x8234) /* <CJK */
-MAP(0x56, 0x7A, 0x823A) /* <CJK */
-MAP(0x56, 0x7B, 0x8243) /* <CJK */
-MAP(0x56, 0x7C, 0x8244) /* <CJK */
-MAP(0x56, 0x7D, 0x8245) /* <CJK */
-MAP(0x56, 0x7E, 0x8246) /* <CJK */
-MAP(0x57, 0x21, 0x824B) /* <CJK */
-MAP(0x57, 0x22, 0x824E) /* <CJK */
-MAP(0x57, 0x23, 0x824F) /* <CJK */
-MAP(0x57, 0x24, 0x8251) /* <CJK */
-MAP(0x57, 0x25, 0x8256) /* <CJK */
-MAP(0x57, 0x26, 0x825C) /* <CJK */
-MAP(0x57, 0x27, 0x8260) /* <CJK */
-MAP(0x57, 0x28, 0x8263) /* <CJK */
-MAP(0x57, 0x29, 0x8267) /* <CJK */
-MAP(0x57, 0x2A, 0x826D) /* <CJK */
-MAP(0x57, 0x2B, 0x8274) /* <CJK */
-MAP(0x57, 0x2C, 0x827B) /* <CJK */
-MAP(0x57, 0x2D, 0x827D) /* <CJK */
-MAP(0x57, 0x2E, 0x827F) /* <CJK */
-MAP(0x57, 0x2F, 0x8280) /* <CJK */
-MAP(0x57, 0x30, 0x8281) /* <CJK */
-MAP(0x57, 0x31, 0x8283) /* <CJK */
-MAP(0x57, 0x32, 0x8284) /* <CJK */
-MAP(0x57, 0x33, 0x8287) /* <CJK */
-MAP(0x57, 0x34, 0x8289) /* <CJK */
-MAP(0x57, 0x35, 0x828A) /* <CJK */
-MAP(0x57, 0x36, 0x828E) /* <CJK */
-MAP(0x57, 0x37, 0x8291) /* <CJK */
-MAP(0x57, 0x38, 0x8294) /* <CJK */
-MAP(0x57, 0x39, 0x8296) /* <CJK */
-MAP(0x57, 0x3A, 0x8298) /* <CJK */
-MAP(0x57, 0x3B, 0x829A) /* <CJK */
-MAP(0x57, 0x3C, 0x829B) /* <CJK */
-MAP(0x57, 0x3D, 0x82A0) /* <CJK */
-MAP(0x57, 0x3E, 0x82A1) /* <CJK */
-MAP(0x57, 0x3F, 0x82A3) /* <CJK */
-MAP(0x57, 0x40, 0x82A4) /* <CJK */
-MAP(0x57, 0x41, 0x82A7) /* <CJK */
-MAP(0x57, 0x42, 0x82A8) /* <CJK */
-MAP(0x57, 0x43, 0x82A9) /* <CJK */
-MAP(0x57, 0x44, 0x82AA) /* <CJK */
-MAP(0x57, 0x45, 0x82AE) /* <CJK */
-MAP(0x57, 0x46, 0x82B0) /* <CJK */
-MAP(0x57, 0x47, 0x82B2) /* <CJK */
-MAP(0x57, 0x48, 0x82B4) /* <CJK */
-MAP(0x57, 0x49, 0x82B7) /* <CJK */
-MAP(0x57, 0x4A, 0x82BA) /* <CJK */
-MAP(0x57, 0x4B, 0x82BC) /* <CJK */
-MAP(0x57, 0x4C, 0x82BE) /* <CJK */
-MAP(0x57, 0x4D, 0x82BF) /* <CJK */
-MAP(0x57, 0x4E, 0x82C6) /* <CJK */
-MAP(0x57, 0x4F, 0x82D0) /* <CJK */
-MAP(0x57, 0x50, 0x82D5) /* <CJK */
-MAP(0x57, 0x51, 0x82DA) /* <CJK */
-MAP(0x57, 0x52, 0x82E0) /* <CJK */
-MAP(0x57, 0x53, 0x82E2) /* <CJK */
-MAP(0x57, 0x54, 0x82E4) /* <CJK */
-MAP(0x57, 0x55, 0x82E8) /* <CJK */
-MAP(0x57, 0x56, 0x82EA) /* <CJK */
-MAP(0x57, 0x57, 0x82ED) /* <CJK */
-MAP(0x57, 0x58, 0x82EF) /* <CJK */
-MAP(0x57, 0x59, 0x82F6) /* <CJK */
-MAP(0x57, 0x5A, 0x82F7) /* <CJK */
-MAP(0x57, 0x5B, 0x82FD) /* <CJK */
-MAP(0x57, 0x5C, 0x82FE) /* <CJK */
-MAP(0x57, 0x5D, 0x8300) /* <CJK */
-MAP(0x57, 0x5E, 0x8301) /* <CJK */
-MAP(0x57, 0x5F, 0x8307) /* <CJK */
-MAP(0x57, 0x60, 0x8308) /* <CJK */
-MAP(0x57, 0x61, 0x830A) /* <CJK */
-MAP(0x57, 0x62, 0x830B) /* <CJK */
-MAP(0x57, 0x63, 0x8354) /* <CJK */
-MAP(0x57, 0x64, 0x831B) /* <CJK */
-MAP(0x57, 0x65, 0x831D) /* <CJK */
-MAP(0x57, 0x66, 0x831E) /* <CJK */
-MAP(0x57, 0x67, 0x831F) /* <CJK */
-MAP(0x57, 0x68, 0x8321) /* <CJK */
-MAP(0x57, 0x69, 0x8322) /* <CJK */
-MAP(0x57, 0x6A, 0x832C) /* <CJK */
-MAP(0x57, 0x6B, 0x832D) /* <CJK */
-MAP(0x57, 0x6C, 0x832E) /* <CJK */
-MAP(0x57, 0x6D, 0x8330) /* <CJK */
-MAP(0x57, 0x6E, 0x8333) /* <CJK */
-MAP(0x57, 0x6F, 0x8337) /* <CJK */
-MAP(0x57, 0x70, 0x833A) /* <CJK */
-MAP(0x57, 0x71, 0x833C) /* <CJK */
-MAP(0x57, 0x72, 0x833D) /* <CJK */
-MAP(0x57, 0x73, 0x8342) /* <CJK */
-MAP(0x57, 0x74, 0x8343) /* <CJK */
-MAP(0x57, 0x75, 0x8344) /* <CJK */
-MAP(0x57, 0x76, 0x8347) /* <CJK */
-MAP(0x57, 0x77, 0x834D) /* <CJK */
-MAP(0x57, 0x78, 0x834E) /* <CJK */
-MAP(0x57, 0x79, 0x8351) /* <CJK */
-MAP(0x57, 0x7A, 0x8355) /* <CJK */
-MAP(0x57, 0x7B, 0x8356) /* <CJK */
-MAP(0x57, 0x7C, 0x8357) /* <CJK */
-MAP(0x57, 0x7D, 0x8370) /* <CJK */
-MAP(0x57, 0x7E, 0x8378) /* <CJK */
-MAP(0x58, 0x21, 0x837D) /* <CJK */
-MAP(0x58, 0x22, 0x837F) /* <CJK */
-MAP(0x58, 0x23, 0x8380) /* <CJK */
-MAP(0x58, 0x24, 0x8382) /* <CJK */
-MAP(0x58, 0x25, 0x8384) /* <CJK */
-MAP(0x58, 0x26, 0x8386) /* <CJK */
-MAP(0x58, 0x27, 0x838D) /* <CJK */
-MAP(0x58, 0x28, 0x8392) /* <CJK */
-MAP(0x58, 0x29, 0x8394) /* <CJK */
-MAP(0x58, 0x2A, 0x8395) /* <CJK */
-MAP(0x58, 0x2B, 0x8398) /* <CJK */
-MAP(0x58, 0x2C, 0x8399) /* <CJK */
-MAP(0x58, 0x2D, 0x839B) /* <CJK */
-MAP(0x58, 0x2E, 0x839C) /* <CJK */
-MAP(0x58, 0x2F, 0x839D) /* <CJK */
-MAP(0x58, 0x30, 0x83A6) /* <CJK */
-MAP(0x58, 0x31, 0x83A7) /* <CJK */
-MAP(0x58, 0x32, 0x83A9) /* <CJK */
-MAP(0x58, 0x33, 0x83AC) /* <CJK */
-MAP(0x58, 0x34, 0x83BE) /* <CJK */
-MAP(0x58, 0x35, 0x83BF) /* <CJK */
-MAP(0x58, 0x36, 0x83C0) /* <CJK */
-MAP(0x58, 0x37, 0x83C7) /* <CJK */
-MAP(0x58, 0x38, 0x83C9) /* <CJK */
-MAP(0x58, 0x39, 0x83CF) /* <CJK */
-MAP(0x58, 0x3A, 0x83D0) /* <CJK */
-MAP(0x58, 0x3B, 0x83D1) /* <CJK */
-MAP(0x58, 0x3C, 0x83D4) /* <CJK */
-MAP(0x58, 0x3D, 0x83DD) /* <CJK */
-MAP(0x58, 0x3E, 0x8353) /* <CJK */
-MAP(0x58, 0x3F, 0x83E8) /* <CJK */
-MAP(0x58, 0x40, 0x83EA) /* <CJK */
-MAP(0x58, 0x41, 0x83F6) /* <CJK */
-MAP(0x58, 0x42, 0x83F8) /* <CJK */
-MAP(0x58, 0x43, 0x83F9) /* <CJK */
-MAP(0x58, 0x44, 0x83FC) /* <CJK */
-MAP(0x58, 0x45, 0x8401) /* <CJK */
-MAP(0x58, 0x46, 0x8406) /* <CJK */
-MAP(0x58, 0x47, 0x840A) /* <CJK */
-MAP(0x58, 0x48, 0x840F) /* <CJK */
-MAP(0x58, 0x49, 0x8411) /* <CJK */
-MAP(0x58, 0x4A, 0x8415) /* <CJK */
-MAP(0x58, 0x4B, 0x8419) /* <CJK */
-MAP(0x58, 0x4C, 0x83AD) /* <CJK */
-MAP(0x58, 0x4D, 0x842F) /* <CJK */
-MAP(0x58, 0x4E, 0x8439) /* <CJK */
-MAP(0x58, 0x4F, 0x8445) /* <CJK */
-MAP(0x58, 0x50, 0x8447) /* <CJK */
-MAP(0x58, 0x51, 0x8448) /* <CJK */
-MAP(0x58, 0x52, 0x844A) /* <CJK */
-MAP(0x58, 0x53, 0x844D) /* <CJK */
-MAP(0x58, 0x54, 0x844F) /* <CJK */
-MAP(0x58, 0x55, 0x8451) /* <CJK */
-MAP(0x58, 0x56, 0x8452) /* <CJK */
-MAP(0x58, 0x57, 0x8456) /* <CJK */
-MAP(0x58, 0x58, 0x8458) /* <CJK */
-MAP(0x58, 0x59, 0x8459) /* <CJK */
-MAP(0x58, 0x5A, 0x845A) /* <CJK */
-MAP(0x58, 0x5B, 0x845C) /* <CJK */
-MAP(0x58, 0x5C, 0x8460) /* <CJK */
-MAP(0x58, 0x5D, 0x8464) /* <CJK */
-MAP(0x58, 0x5E, 0x8465) /* <CJK */
-MAP(0x58, 0x5F, 0x8467) /* <CJK */
-MAP(0x58, 0x60, 0x846A) /* <CJK */
-MAP(0x58, 0x61, 0x8470) /* <CJK */
-MAP(0x58, 0x62, 0x8473) /* <CJK */
-MAP(0x58, 0x63, 0x8474) /* <CJK */
-MAP(0x58, 0x64, 0x8476) /* <CJK */
-MAP(0x58, 0x65, 0x8478) /* <CJK */
-MAP(0x58, 0x66, 0x847C) /* <CJK */
-MAP(0x58, 0x67, 0x847D) /* <CJK */
-MAP(0x58, 0x68, 0x8481) /* <CJK */
-MAP(0x58, 0x69, 0x8485) /* <CJK */
-MAP(0x58, 0x6A, 0x8492) /* <CJK */
-MAP(0x58, 0x6B, 0x8493) /* <CJK */
-MAP(0x58, 0x6C, 0x8495) /* <CJK */
-MAP(0x58, 0x6D, 0x849E) /* <CJK */
-MAP(0x58, 0x6E, 0x84A6) /* <CJK */
-MAP(0x58, 0x6F, 0x84A8) /* <CJK */
-MAP(0x58, 0x70, 0x84A9) /* <CJK */
-MAP(0x58, 0x71, 0x84AA) /* <CJK */
-MAP(0x58, 0x72, 0x84AF) /* <CJK */
-MAP(0x58, 0x73, 0x84B1) /* <CJK */
-MAP(0x58, 0x74, 0x84B4) /* <CJK */
-MAP(0x58, 0x75, 0x84BA) /* <CJK */
-MAP(0x58, 0x76, 0x84BD) /* <CJK */
-MAP(0x58, 0x77, 0x84BE) /* <CJK */
-MAP(0x58, 0x78, 0x84C0) /* <CJK */
-MAP(0x58, 0x79, 0x84C2) /* <CJK */
-MAP(0x58, 0x7A, 0x84C7) /* <CJK */
-MAP(0x58, 0x7B, 0x84C8) /* <CJK */
-MAP(0x58, 0x7C, 0x84CC) /* <CJK */
-MAP(0x58, 0x7D, 0x84CF) /* <CJK */
-MAP(0x58, 0x7E, 0x84D3) /* <CJK */
-MAP(0x59, 0x21, 0x84DC) /* <CJK */
-MAP(0x59, 0x22, 0x84E7) /* <CJK */
-MAP(0x59, 0x23, 0x84EA) /* <CJK */
-MAP(0x59, 0x24, 0x84EF) /* <CJK */
-MAP(0x59, 0x25, 0x84F0) /* <CJK */
-MAP(0x59, 0x26, 0x84F1) /* <CJK */
-MAP(0x59, 0x27, 0x84F2) /* <CJK */
-MAP(0x59, 0x28, 0x84F7) /* <CJK */
-MAP(0x59, 0x29, 0x8532) /* <CJK */
-MAP(0x59, 0x2A, 0x84FA) /* <CJK */
-MAP(0x59, 0x2B, 0x84FB) /* <CJK */
-MAP(0x59, 0x2C, 0x84FD) /* <CJK */
-MAP(0x59, 0x2D, 0x8502) /* <CJK */
-MAP(0x59, 0x2E, 0x8503) /* <CJK */
-MAP(0x59, 0x2F, 0x8507) /* <CJK */
-MAP(0x59, 0x30, 0x850C) /* <CJK */
-MAP(0x59, 0x31, 0x850E) /* <CJK */
-MAP(0x59, 0x32, 0x8510) /* <CJK */
-MAP(0x59, 0x33, 0x851C) /* <CJK */
-MAP(0x59, 0x34, 0x851E) /* <CJK */
-MAP(0x59, 0x35, 0x8522) /* <CJK */
-MAP(0x59, 0x36, 0x8523) /* <CJK */
-MAP(0x59, 0x37, 0x8524) /* <CJK */
-MAP(0x59, 0x38, 0x8525) /* <CJK */
-MAP(0x59, 0x39, 0x8527) /* <CJK */
-MAP(0x59, 0x3A, 0x852A) /* <CJK */
-MAP(0x59, 0x3B, 0x852B) /* <CJK */
-MAP(0x59, 0x3C, 0x852F) /* <CJK */
-MAP(0x59, 0x3D, 0x8533) /* <CJK */
-MAP(0x59, 0x3E, 0x8534) /* <CJK */
-MAP(0x59, 0x3F, 0x8536) /* <CJK */
-MAP(0x59, 0x40, 0x853F) /* <CJK */
-MAP(0x59, 0x41, 0x8546) /* <CJK */
-MAP(0x59, 0x42, 0x854F) /* <CJK */
-MAP(0x59, 0x43, 0x8550) /* <CJK */
-MAP(0x59, 0x44, 0x8551) /* <CJK */
-MAP(0x59, 0x45, 0x8552) /* <CJK */
-MAP(0x59, 0x46, 0x8553) /* <CJK */
-MAP(0x59, 0x47, 0x8556) /* <CJK */
-MAP(0x59, 0x48, 0x8559) /* <CJK */
-MAP(0x59, 0x49, 0x855C) /* <CJK */
-MAP(0x59, 0x4A, 0x855D) /* <CJK */
-MAP(0x59, 0x4B, 0x855E) /* <CJK */
-MAP(0x59, 0x4C, 0x855F) /* <CJK */
-MAP(0x59, 0x4D, 0x8560) /* <CJK */
-MAP(0x59, 0x4E, 0x8561) /* <CJK */
-MAP(0x59, 0x4F, 0x8562) /* <CJK */
-MAP(0x59, 0x50, 0x8564) /* <CJK */
-MAP(0x59, 0x51, 0x856B) /* <CJK */
-MAP(0x59, 0x52, 0x856F) /* <CJK */
-MAP(0x59, 0x53, 0x8579) /* <CJK */
-MAP(0x59, 0x54, 0x857A) /* <CJK */
-MAP(0x59, 0x55, 0x857B) /* <CJK */
-MAP(0x59, 0x56, 0x857D) /* <CJK */
-MAP(0x59, 0x57, 0x857F) /* <CJK */
-MAP(0x59, 0x58, 0x8581) /* <CJK */
-MAP(0x59, 0x59, 0x8585) /* <CJK */
-MAP(0x59, 0x5A, 0x8586) /* <CJK */
-MAP(0x59, 0x5B, 0x8589) /* <CJK */
-MAP(0x59, 0x5C, 0x858B) /* <CJK */
-MAP(0x59, 0x5D, 0x858C) /* <CJK */
-MAP(0x59, 0x5E, 0x858F) /* <CJK */
-MAP(0x59, 0x5F, 0x8593) /* <CJK */
-MAP(0x59, 0x60, 0x8598) /* <CJK */
-MAP(0x59, 0x61, 0x859D) /* <CJK */
-MAP(0x59, 0x62, 0x859F) /* <CJK */
-MAP(0x59, 0x63, 0x85A0) /* <CJK */
-MAP(0x59, 0x64, 0x85A2) /* <CJK */
-MAP(0x59, 0x65, 0x85A5) /* <CJK */
-MAP(0x59, 0x66, 0x85A7) /* <CJK */
-MAP(0x59, 0x67, 0x85B4) /* <CJK */
-MAP(0x59, 0x68, 0x85B6) /* <CJK */
-MAP(0x59, 0x69, 0x85B7) /* <CJK */
-MAP(0x59, 0x6A, 0x85B8) /* <CJK */
-MAP(0x59, 0x6B, 0x85BC) /* <CJK */
-MAP(0x59, 0x6C, 0x85BD) /* <CJK */
-MAP(0x59, 0x6D, 0x85BE) /* <CJK */
-MAP(0x59, 0x6E, 0x85BF) /* <CJK */
-MAP(0x59, 0x6F, 0x85C2) /* <CJK */
-MAP(0x59, 0x70, 0x85C7) /* <CJK */
-MAP(0x59, 0x71, 0x85CA) /* <CJK */
-MAP(0x59, 0x72, 0x85CB) /* <CJK */
-MAP(0x59, 0x73, 0x85CE) /* <CJK */
-MAP(0x59, 0x74, 0x85AD) /* <CJK */
-MAP(0x59, 0x75, 0x85D8) /* <CJK */
-MAP(0x59, 0x76, 0x85DA) /* <CJK */
-MAP(0x59, 0x77, 0x85DF) /* <CJK */
-MAP(0x59, 0x78, 0x85E0) /* <CJK */
-MAP(0x59, 0x79, 0x85E6) /* <CJK */
-MAP(0x59, 0x7A, 0x85E8) /* <CJK */
-MAP(0x59, 0x7B, 0x85ED) /* <CJK */
-MAP(0x59, 0x7C, 0x85F3) /* <CJK */
-MAP(0x59, 0x7D, 0x85F6) /* <CJK */
-MAP(0x59, 0x7E, 0x85FC) /* <CJK */
-MAP(0x5A, 0x21, 0x85FF) /* <CJK */
-MAP(0x5A, 0x22, 0x8600) /* <CJK */
-MAP(0x5A, 0x23, 0x8604) /* <CJK */
-MAP(0x5A, 0x24, 0x8605) /* <CJK */
-MAP(0x5A, 0x25, 0x860D) /* <CJK */
-MAP(0x5A, 0x26, 0x860E) /* <CJK */
-MAP(0x5A, 0x27, 0x8610) /* <CJK */
-MAP(0x5A, 0x28, 0x8611) /* <CJK */
-MAP(0x5A, 0x29, 0x8612) /* <CJK */
-MAP(0x5A, 0x2A, 0x8618) /* <CJK */
-MAP(0x5A, 0x2B, 0x8619) /* <CJK */
-MAP(0x5A, 0x2C, 0x861B) /* <CJK */
-MAP(0x5A, 0x2D, 0x861E) /* <CJK */
-MAP(0x5A, 0x2E, 0x8621) /* <CJK */
-MAP(0x5A, 0x2F, 0x8627) /* <CJK */
-MAP(0x5A, 0x30, 0x8629) /* <CJK */
-MAP(0x5A, 0x31, 0x8636) /* <CJK */
-MAP(0x5A, 0x32, 0x8638) /* <CJK */
-MAP(0x5A, 0x33, 0x863A) /* <CJK */
-MAP(0x5A, 0x34, 0x863C) /* <CJK */
-MAP(0x5A, 0x35, 0x863D) /* <CJK */
-MAP(0x5A, 0x36, 0x8640) /* <CJK */
-MAP(0x5A, 0x37, 0x8642) /* <CJK */
-MAP(0x5A, 0x38, 0x8646) /* <CJK */
-MAP(0x5A, 0x39, 0x8652) /* <CJK */
-MAP(0x5A, 0x3A, 0x8653) /* <CJK */
-MAP(0x5A, 0x3B, 0x8656) /* <CJK */
-MAP(0x5A, 0x3C, 0x8657) /* <CJK */
-MAP(0x5A, 0x3D, 0x8658) /* <CJK */
-MAP(0x5A, 0x3E, 0x8659) /* <CJK */
-MAP(0x5A, 0x3F, 0x865D) /* <CJK */
-MAP(0x5A, 0x40, 0x8660) /* <CJK */
-MAP(0x5A, 0x41, 0x8661) /* <CJK */
-MAP(0x5A, 0x42, 0x8662) /* <CJK */
-MAP(0x5A, 0x43, 0x8663) /* <CJK */
-MAP(0x5A, 0x44, 0x8664) /* <CJK */
-MAP(0x5A, 0x45, 0x8669) /* <CJK */
-MAP(0x5A, 0x46, 0x866C) /* <CJK */
-MAP(0x5A, 0x47, 0x866F) /* <CJK */
-MAP(0x5A, 0x48, 0x8675) /* <CJK */
-MAP(0x5A, 0x49, 0x8676) /* <CJK */
-MAP(0x5A, 0x4A, 0x8677) /* <CJK */
-MAP(0x5A, 0x4B, 0x867A) /* <CJK */
-MAP(0x5A, 0x4C, 0x868D) /* <CJK */
-MAP(0x5A, 0x4D, 0x8691) /* <CJK */
-MAP(0x5A, 0x4E, 0x8696) /* <CJK */
-MAP(0x5A, 0x4F, 0x8698) /* <CJK */
-MAP(0x5A, 0x50, 0x869A) /* <CJK */
-MAP(0x5A, 0x51, 0x869C) /* <CJK */
-MAP(0x5A, 0x52, 0x86A1) /* <CJK */
-MAP(0x5A, 0x53, 0x86A6) /* <CJK */
-MAP(0x5A, 0x54, 0x86A7) /* <CJK */
-MAP(0x5A, 0x55, 0x86A8) /* <CJK */
-MAP(0x5A, 0x56, 0x86AD) /* <CJK */
-MAP(0x5A, 0x57, 0x86B1) /* <CJK */
-MAP(0x5A, 0x58, 0x86B3) /* <CJK */
-MAP(0x5A, 0x59, 0x86B4) /* <CJK */
-MAP(0x5A, 0x5A, 0x86B5) /* <CJK */
-MAP(0x5A, 0x5B, 0x86B7) /* <CJK */
-MAP(0x5A, 0x5C, 0x86B8) /* <CJK */
-MAP(0x5A, 0x5D, 0x86B9) /* <CJK */
-MAP(0x5A, 0x5E, 0x86BF) /* <CJK */
-MAP(0x5A, 0x5F, 0x86C0) /* <CJK */
-MAP(0x5A, 0x60, 0x86C1) /* <CJK */
-MAP(0x5A, 0x61, 0x86C3) /* <CJK */
-MAP(0x5A, 0x62, 0x86C5) /* <CJK */
-MAP(0x5A, 0x63, 0x86D1) /* <CJK */
-MAP(0x5A, 0x64, 0x86D2) /* <CJK */
-MAP(0x5A, 0x65, 0x86D5) /* <CJK */
-MAP(0x5A, 0x66, 0x86D7) /* <CJK */
-MAP(0x5A, 0x67, 0x86DA) /* <CJK */
-MAP(0x5A, 0x68, 0x86DC) /* <CJK */
-MAP(0x5A, 0x69, 0x86E0) /* <CJK */
-MAP(0x5A, 0x6A, 0x86E3) /* <CJK */
-MAP(0x5A, 0x6B, 0x86E5) /* <CJK */
-MAP(0x5A, 0x6C, 0x86E7) /* <CJK */
-MAP(0x5A, 0x6D, 0x8688) /* <CJK */
-MAP(0x5A, 0x6E, 0x86FA) /* <CJK */
-MAP(0x5A, 0x6F, 0x86FC) /* <CJK */
-MAP(0x5A, 0x70, 0x86FD) /* <CJK */
-MAP(0x5A, 0x71, 0x8704) /* <CJK */
-MAP(0x5A, 0x72, 0x8705) /* <CJK */
-MAP(0x5A, 0x73, 0x8707) /* <CJK */
-MAP(0x5A, 0x74, 0x870B) /* <CJK */
-MAP(0x5A, 0x75, 0x870E) /* <CJK */
-MAP(0x5A, 0x76, 0x870F) /* <CJK */
-MAP(0x5A, 0x77, 0x8710) /* <CJK */
-MAP(0x5A, 0x78, 0x8713) /* <CJK */
-MAP(0x5A, 0x79, 0x8714) /* <CJK */
-MAP(0x5A, 0x7A, 0x8719) /* <CJK */
-MAP(0x5A, 0x7B, 0x871E) /* <CJK */
-MAP(0x5A, 0x7C, 0x871F) /* <CJK */
-MAP(0x5A, 0x7D, 0x8721) /* <CJK */
-MAP(0x5A, 0x7E, 0x8723) /* <CJK */
-MAP(0x5B, 0x21, 0x8728) /* <CJK */
-MAP(0x5B, 0x22, 0x872E) /* <CJK */
-MAP(0x5B, 0x23, 0x872F) /* <CJK */
-MAP(0x5B, 0x24, 0x8731) /* <CJK */
-MAP(0x5B, 0x25, 0x8732) /* <CJK */
-MAP(0x5B, 0x26, 0x8739) /* <CJK */
-MAP(0x5B, 0x27, 0x873A) /* <CJK */
-MAP(0x5B, 0x28, 0x873C) /* <CJK */
-MAP(0x5B, 0x29, 0x873D) /* <CJK */
-MAP(0x5B, 0x2A, 0x873E) /* <CJK */
-MAP(0x5B, 0x2B, 0x8740) /* <CJK */
-MAP(0x5B, 0x2C, 0x8743) /* <CJK */
-MAP(0x5B, 0x2D, 0x8745) /* <CJK */
-MAP(0x5B, 0x2E, 0x874D) /* <CJK */
-MAP(0x5B, 0x2F, 0x8758) /* <CJK */
-MAP(0x5B, 0x30, 0x875D) /* <CJK */
-MAP(0x5B, 0x31, 0x8761) /* <CJK */
-MAP(0x5B, 0x32, 0x8764) /* <CJK */
-MAP(0x5B, 0x33, 0x8765) /* <CJK */
-MAP(0x5B, 0x34, 0x876F) /* <CJK */
-MAP(0x5B, 0x35, 0x8771) /* <CJK */
-MAP(0x5B, 0x36, 0x8772) /* <CJK */
-MAP(0x5B, 0x37, 0x877B) /* <CJK */
-MAP(0x5B, 0x38, 0x8783) /* <CJK */
-MAP(0x5B, 0x39, 0x8784) /* <CJK */
-MAP(0x5B, 0x3A, 0x8785) /* <CJK */
-MAP(0x5B, 0x3B, 0x8786) /* <CJK */
-MAP(0x5B, 0x3C, 0x8787) /* <CJK */
-MAP(0x5B, 0x3D, 0x8788) /* <CJK */
-MAP(0x5B, 0x3E, 0x8789) /* <CJK */
-MAP(0x5B, 0x3F, 0x878B) /* <CJK */
-MAP(0x5B, 0x40, 0x878C) /* <CJK */
-MAP(0x5B, 0x41, 0x8790) /* <CJK */
-MAP(0x5B, 0x42, 0x8793) /* <CJK */
-MAP(0x5B, 0x43, 0x8795) /* <CJK */
-MAP(0x5B, 0x44, 0x8797) /* <CJK */
-MAP(0x5B, 0x45, 0x8798) /* <CJK */
-MAP(0x5B, 0x46, 0x8799) /* <CJK */
-MAP(0x5B, 0x47, 0x879E) /* <CJK */
-MAP(0x5B, 0x48, 0x87A0) /* <CJK */
-MAP(0x5B, 0x49, 0x87A3) /* <CJK */
-MAP(0x5B, 0x4A, 0x87A7) /* <CJK */
-MAP(0x5B, 0x4B, 0x87AC) /* <CJK */
-MAP(0x5B, 0x4C, 0x87AD) /* <CJK */
-MAP(0x5B, 0x4D, 0x87AE) /* <CJK */
-MAP(0x5B, 0x4E, 0x87B1) /* <CJK */
-MAP(0x5B, 0x4F, 0x87B5) /* <CJK */
-MAP(0x5B, 0x50, 0x87BE) /* <CJK */
-MAP(0x5B, 0x51, 0x87BF) /* <CJK */
-MAP(0x5B, 0x52, 0x87C1) /* <CJK */
-MAP(0x5B, 0x53, 0x87C8) /* <CJK */
-MAP(0x5B, 0x54, 0x87C9) /* <CJK */
-MAP(0x5B, 0x55, 0x87CA) /* <CJK */
-MAP(0x5B, 0x56, 0x87CE) /* <CJK */
-MAP(0x5B, 0x57, 0x87D5) /* <CJK */
-MAP(0x5B, 0x58, 0x87D6) /* <CJK */
-MAP(0x5B, 0x59, 0x87D9) /* <CJK */
-MAP(0x5B, 0x5A, 0x87DA) /* <CJK */
-MAP(0x5B, 0x5B, 0x87DC) /* <CJK */
-MAP(0x5B, 0x5C, 0x87DF) /* <CJK */
-MAP(0x5B, 0x5D, 0x87E2) /* <CJK */
-MAP(0x5B, 0x5E, 0x87E3) /* <CJK */
-MAP(0x5B, 0x5F, 0x87E4) /* <CJK */
-MAP(0x5B, 0x60, 0x87EA) /* <CJK */
-MAP(0x5B, 0x61, 0x87EB) /* <CJK */
-MAP(0x5B, 0x62, 0x87ED) /* <CJK */
-MAP(0x5B, 0x63, 0x87F1) /* <CJK */
-MAP(0x5B, 0x64, 0x87F3) /* <CJK */
-MAP(0x5B, 0x65, 0x87F8) /* <CJK */
-MAP(0x5B, 0x66, 0x87FA) /* <CJK */
-MAP(0x5B, 0x67, 0x87FF) /* <CJK */
-MAP(0x5B, 0x68, 0x8801) /* <CJK */
-MAP(0x5B, 0x69, 0x8803) /* <CJK */
-MAP(0x5B, 0x6A, 0x8806) /* <CJK */
-MAP(0x5B, 0x6B, 0x8809) /* <CJK */
-MAP(0x5B, 0x6C, 0x880A) /* <CJK */
-MAP(0x5B, 0x6D, 0x880B) /* <CJK */
-MAP(0x5B, 0x6E, 0x8810) /* <CJK */
-MAP(0x5B, 0x6F, 0x8819) /* <CJK */
-MAP(0x5B, 0x70, 0x8812) /* <CJK */
-MAP(0x5B, 0x71, 0x8813) /* <CJK */
-MAP(0x5B, 0x72, 0x8814) /* <CJK */
-MAP(0x5B, 0x73, 0x8818) /* <CJK */
-MAP(0x5B, 0x74, 0x881A) /* <CJK */
-MAP(0x5B, 0x75, 0x881B) /* <CJK */
-MAP(0x5B, 0x76, 0x881C) /* <CJK */
-MAP(0x5B, 0x77, 0x881E) /* <CJK */
-MAP(0x5B, 0x78, 0x881F) /* <CJK */
-MAP(0x5B, 0x79, 0x8828) /* <CJK */
-MAP(0x5B, 0x7A, 0x882D) /* <CJK */
-MAP(0x5B, 0x7B, 0x882E) /* <CJK */
-MAP(0x5B, 0x7C, 0x8830) /* <CJK */
-MAP(0x5B, 0x7D, 0x8832) /* <CJK */
-MAP(0x5B, 0x7E, 0x8835) /* <CJK */
-MAP(0x5C, 0x21, 0x883A) /* <CJK */
-MAP(0x5C, 0x22, 0x883C) /* <CJK */
-MAP(0x5C, 0x23, 0x8841) /* <CJK */
-MAP(0x5C, 0x24, 0x8843) /* <CJK */
-MAP(0x5C, 0x25, 0x8845) /* <CJK */
-MAP(0x5C, 0x26, 0x8848) /* <CJK */
-MAP(0x5C, 0x27, 0x8849) /* <CJK */
-MAP(0x5C, 0x28, 0x884A) /* <CJK */
-MAP(0x5C, 0x29, 0x884B) /* <CJK */
-MAP(0x5C, 0x2A, 0x884E) /* <CJK */
-MAP(0x5C, 0x2B, 0x8851) /* <CJK */
-MAP(0x5C, 0x2C, 0x8855) /* <CJK */
-MAP(0x5C, 0x2D, 0x8856) /* <CJK */
-MAP(0x5C, 0x2E, 0x8858) /* <CJK */
-MAP(0x5C, 0x2F, 0x885A) /* <CJK */
-MAP(0x5C, 0x30, 0x885C) /* <CJK */
-MAP(0x5C, 0x31, 0x885F) /* <CJK */
-MAP(0x5C, 0x32, 0x8860) /* <CJK */
-MAP(0x5C, 0x33, 0x8864) /* <CJK */
-MAP(0x5C, 0x34, 0x8869) /* <CJK */
-MAP(0x5C, 0x35, 0x8871) /* <CJK */
-MAP(0x5C, 0x36, 0x8879) /* <CJK */
-MAP(0x5C, 0x37, 0x887B) /* <CJK */
-MAP(0x5C, 0x38, 0x8880) /* <CJK */
-MAP(0x5C, 0x39, 0x8898) /* <CJK */
-MAP(0x5C, 0x3A, 0x889A) /* <CJK */
-MAP(0x5C, 0x3B, 0x889B) /* <CJK */
-MAP(0x5C, 0x3C, 0x889C) /* <CJK */
-MAP(0x5C, 0x3D, 0x889F) /* <CJK */
-MAP(0x5C, 0x3E, 0x88A0) /* <CJK */
-MAP(0x5C, 0x3F, 0x88A8) /* <CJK */
-MAP(0x5C, 0x40, 0x88AA) /* <CJK */
-MAP(0x5C, 0x41, 0x88BA) /* <CJK */
-MAP(0x5C, 0x42, 0x88BD) /* <CJK */
-MAP(0x5C, 0x43, 0x88BE) /* <CJK */
-MAP(0x5C, 0x44, 0x88C0) /* <CJK */
-MAP(0x5C, 0x45, 0x88CA) /* <CJK */
-MAP(0x5C, 0x46, 0x88CB) /* <CJK */
-MAP(0x5C, 0x47, 0x88CC) /* <CJK */
-MAP(0x5C, 0x48, 0x88CD) /* <CJK */
-MAP(0x5C, 0x49, 0x88CE) /* <CJK */
-MAP(0x5C, 0x4A, 0x88D1) /* <CJK */
-MAP(0x5C, 0x4B, 0x88D2) /* <CJK */
-MAP(0x5C, 0x4C, 0x88D3) /* <CJK */
-MAP(0x5C, 0x4D, 0x88DB) /* <CJK */
-MAP(0x5C, 0x4E, 0x88DE) /* <CJK */
-MAP(0x5C, 0x4F, 0x88E7) /* <CJK */
-MAP(0x5C, 0x50, 0x88EF) /* <CJK */
-MAP(0x5C, 0x51, 0x88F0) /* <CJK */
-MAP(0x5C, 0x52, 0x88F1) /* <CJK */
-MAP(0x5C, 0x53, 0x88F5) /* <CJK */
-MAP(0x5C, 0x54, 0x88F7) /* <CJK */
-MAP(0x5C, 0x55, 0x8901) /* <CJK */
-MAP(0x5C, 0x56, 0x8906) /* <CJK */
-MAP(0x5C, 0x57, 0x890D) /* <CJK */
-MAP(0x5C, 0x58, 0x890E) /* <CJK */
-MAP(0x5C, 0x59, 0x890F) /* <CJK */
-MAP(0x5C, 0x5A, 0x8915) /* <CJK */
-MAP(0x5C, 0x5B, 0x8916) /* <CJK */
-MAP(0x5C, 0x5C, 0x8918) /* <CJK */
-MAP(0x5C, 0x5D, 0x8919) /* <CJK */
-MAP(0x5C, 0x5E, 0x891A) /* <CJK */
-MAP(0x5C, 0x5F, 0x891C) /* <CJK */
-MAP(0x5C, 0x60, 0x8920) /* <CJK */
-MAP(0x5C, 0x61, 0x8926) /* <CJK */
-MAP(0x5C, 0x62, 0x8927) /* <CJK */
-MAP(0x5C, 0x63, 0x8928) /* <CJK */
-MAP(0x5C, 0x64, 0x8930) /* <CJK */
-MAP(0x5C, 0x65, 0x8931) /* <CJK */
-MAP(0x5C, 0x66, 0x8932) /* <CJK */
-MAP(0x5C, 0x67, 0x8935) /* <CJK */
-MAP(0x5C, 0x68, 0x8939) /* <CJK */
-MAP(0x5C, 0x69, 0x893A) /* <CJK */
-MAP(0x5C, 0x6A, 0x893E) /* <CJK */
-MAP(0x5C, 0x6B, 0x8940) /* <CJK */
-MAP(0x5C, 0x6C, 0x8942) /* <CJK */
-MAP(0x5C, 0x6D, 0x8945) /* <CJK */
-MAP(0x5C, 0x6E, 0x8946) /* <CJK */
-MAP(0x5C, 0x6F, 0x8949) /* <CJK */
-MAP(0x5C, 0x70, 0x894F) /* <CJK */
-MAP(0x5C, 0x71, 0x8952) /* <CJK */
-MAP(0x5C, 0x72, 0x8957) /* <CJK */
-MAP(0x5C, 0x73, 0x895A) /* <CJK */
-MAP(0x5C, 0x74, 0x895B) /* <CJK */
-MAP(0x5C, 0x75, 0x895C) /* <CJK */
-MAP(0x5C, 0x76, 0x8961) /* <CJK */
-MAP(0x5C, 0x77, 0x8962) /* <CJK */
-MAP(0x5C, 0x78, 0x8963) /* <CJK */
-MAP(0x5C, 0x79, 0x896B) /* <CJK */
-MAP(0x5C, 0x7A, 0x896E) /* <CJK */
-MAP(0x5C, 0x7B, 0x8970) /* <CJK */
-MAP(0x5C, 0x7C, 0x8973) /* <CJK */
-MAP(0x5C, 0x7D, 0x8975) /* <CJK */
-MAP(0x5C, 0x7E, 0x897A) /* <CJK */
-MAP(0x5D, 0x21, 0x897B) /* <CJK */
-MAP(0x5D, 0x22, 0x897C) /* <CJK */
-MAP(0x5D, 0x23, 0x897D) /* <CJK */
-MAP(0x5D, 0x24, 0x8989) /* <CJK */
-MAP(0x5D, 0x25, 0x898D) /* <CJK */
-MAP(0x5D, 0x26, 0x8990) /* <CJK */
-MAP(0x5D, 0x27, 0x8994) /* <CJK */
-MAP(0x5D, 0x28, 0x8995) /* <CJK */
-MAP(0x5D, 0x29, 0x899B) /* <CJK */
-MAP(0x5D, 0x2A, 0x899C) /* <CJK */
-MAP(0x5D, 0x2B, 0x899F) /* <CJK */
-MAP(0x5D, 0x2C, 0x89A0) /* <CJK */
-MAP(0x5D, 0x2D, 0x89A5) /* <CJK */
-MAP(0x5D, 0x2E, 0x89B0) /* <CJK */
-MAP(0x5D, 0x2F, 0x89B4) /* <CJK */
-MAP(0x5D, 0x30, 0x89B5) /* <CJK */
-MAP(0x5D, 0x31, 0x89B6) /* <CJK */
-MAP(0x5D, 0x32, 0x89B7) /* <CJK */
-MAP(0x5D, 0x33, 0x89BC) /* <CJK */
-MAP(0x5D, 0x34, 0x89D4) /* <CJK */
-MAP(0x5D, 0x35, 0x89D5) /* <CJK */
-MAP(0x5D, 0x36, 0x89D6) /* <CJK */
-MAP(0x5D, 0x37, 0x89D7) /* <CJK */
-MAP(0x5D, 0x38, 0x89D8) /* <CJK */
-MAP(0x5D, 0x39, 0x89E5) /* <CJK */
-MAP(0x5D, 0x3A, 0x89E9) /* <CJK */
-MAP(0x5D, 0x3B, 0x89EB) /* <CJK */
-MAP(0x5D, 0x3C, 0x89ED) /* <CJK */
-MAP(0x5D, 0x3D, 0x89F1) /* <CJK */
-MAP(0x5D, 0x3E, 0x89F3) /* <CJK */
-MAP(0x5D, 0x3F, 0x89F6) /* <CJK */
-MAP(0x5D, 0x40, 0x89F9) /* <CJK */
-MAP(0x5D, 0x41, 0x89FD) /* <CJK */
-MAP(0x5D, 0x42, 0x89FF) /* <CJK */
-MAP(0x5D, 0x43, 0x8A04) /* <CJK */
-MAP(0x5D, 0x44, 0x8A05) /* <CJK */
-MAP(0x5D, 0x45, 0x8A07) /* <CJK */
-MAP(0x5D, 0x46, 0x8A0F) /* <CJK */
-MAP(0x5D, 0x47, 0x8A11) /* <CJK */
-MAP(0x5D, 0x48, 0x8A12) /* <CJK */
-MAP(0x5D, 0x49, 0x8A14) /* <CJK */
-MAP(0x5D, 0x4A, 0x8A15) /* <CJK */
-MAP(0x5D, 0x4B, 0x8A1E) /* <CJK */
-MAP(0x5D, 0x4C, 0x8A20) /* <CJK */
-MAP(0x5D, 0x4D, 0x8A22) /* <CJK */
-MAP(0x5D, 0x4E, 0x8A24) /* <CJK */
-MAP(0x5D, 0x4F, 0x8A26) /* <CJK */
-MAP(0x5D, 0x50, 0x8A2B) /* <CJK */
-MAP(0x5D, 0x51, 0x8A2C) /* <CJK */
-MAP(0x5D, 0x52, 0x8A2F) /* <CJK */
-MAP(0x5D, 0x53, 0x8A35) /* <CJK */
-MAP(0x5D, 0x54, 0x8A37) /* <CJK */
-MAP(0x5D, 0x55, 0x8A3D) /* <CJK */
-MAP(0x5D, 0x56, 0x8A3E) /* <CJK */
-MAP(0x5D, 0x57, 0x8A40) /* <CJK */
-MAP(0x5D, 0x58, 0x8A43) /* <CJK */
-MAP(0x5D, 0x59, 0x8A45) /* <CJK */
-MAP(0x5D, 0x5A, 0x8A47) /* <CJK */
-MAP(0x5D, 0x5B, 0x8A49) /* <CJK */
-MAP(0x5D, 0x5C, 0x8A4D) /* <CJK */
-MAP(0x5D, 0x5D, 0x8A4E) /* <CJK */
-MAP(0x5D, 0x5E, 0x8A53) /* <CJK */
-MAP(0x5D, 0x5F, 0x8A56) /* <CJK */
-MAP(0x5D, 0x60, 0x8A57) /* <CJK */
-MAP(0x5D, 0x61, 0x8A58) /* <CJK */
-MAP(0x5D, 0x62, 0x8A5C) /* <CJK */
-MAP(0x5D, 0x63, 0x8A5D) /* <CJK */
-MAP(0x5D, 0x64, 0x8A61) /* <CJK */
-MAP(0x5D, 0x65, 0x8A65) /* <CJK */
-MAP(0x5D, 0x66, 0x8A67) /* <CJK */
-MAP(0x5D, 0x67, 0x8A75) /* <CJK */
-MAP(0x5D, 0x68, 0x8A76) /* <CJK */
-MAP(0x5D, 0x69, 0x8A77) /* <CJK */
-MAP(0x5D, 0x6A, 0x8A79) /* <CJK */
-MAP(0x5D, 0x6B, 0x8A7A) /* <CJK */
-MAP(0x5D, 0x6C, 0x8A7B) /* <CJK */
-MAP(0x5D, 0x6D, 0x8A7E) /* <CJK */
-MAP(0x5D, 0x6E, 0x8A7F) /* <CJK */
-MAP(0x5D, 0x6F, 0x8A80) /* <CJK */
-MAP(0x5D, 0x70, 0x8A83) /* <CJK */
-MAP(0x5D, 0x71, 0x8A86) /* <CJK */
-MAP(0x5D, 0x72, 0x8A8B) /* <CJK */
-MAP(0x5D, 0x73, 0x8A8F) /* <CJK */
-MAP(0x5D, 0x74, 0x8A90) /* <CJK */
-MAP(0x5D, 0x75, 0x8A92) /* <CJK */
-MAP(0x5D, 0x76, 0x8A96) /* <CJK */
-MAP(0x5D, 0x77, 0x8A97) /* <CJK */
-MAP(0x5D, 0x78, 0x8A99) /* <CJK */
-MAP(0x5D, 0x79, 0x8A9F) /* <CJK */
-MAP(0x5D, 0x7A, 0x8AA7) /* <CJK */
-MAP(0x5D, 0x7B, 0x8AA9) /* <CJK */
-MAP(0x5D, 0x7C, 0x8AAE) /* <CJK */
-MAP(0x5D, 0x7D, 0x8AAF) /* <CJK */
-MAP(0x5D, 0x7E, 0x8AB3) /* <CJK */
-MAP(0x5E, 0x21, 0x8AB6) /* <CJK */
-MAP(0x5E, 0x22, 0x8AB7) /* <CJK */
-MAP(0x5E, 0x23, 0x8ABB) /* <CJK */
-MAP(0x5E, 0x24, 0x8ABE) /* <CJK */
-MAP(0x5E, 0x25, 0x8AC3) /* <CJK */
-MAP(0x5E, 0x26, 0x8AC6) /* <CJK */
-MAP(0x5E, 0x27, 0x8AC8) /* <CJK */
-MAP(0x5E, 0x28, 0x8AC9) /* <CJK */
-MAP(0x5E, 0x29, 0x8ACA) /* <CJK */
-MAP(0x5E, 0x2A, 0x8AD1) /* <CJK */
-MAP(0x5E, 0x2B, 0x8AD3) /* <CJK */
-MAP(0x5E, 0x2C, 0x8AD4) /* <CJK */
-MAP(0x5E, 0x2D, 0x8AD5) /* <CJK */
-MAP(0x5E, 0x2E, 0x8AD7) /* <CJK */
-MAP(0x5E, 0x2F, 0x8ADD) /* <CJK */
-MAP(0x5E, 0x30, 0x8ADF) /* <CJK */
-MAP(0x5E, 0x31, 0x8AEC) /* <CJK */
-MAP(0x5E, 0x32, 0x8AF0) /* <CJK */
-MAP(0x5E, 0x33, 0x8AF4) /* <CJK */
-MAP(0x5E, 0x34, 0x8AF5) /* <CJK */
-MAP(0x5E, 0x35, 0x8AF6) /* <CJK */
-MAP(0x5E, 0x36, 0x8AFC) /* <CJK */
-MAP(0x5E, 0x37, 0x8AFF) /* <CJK */
-MAP(0x5E, 0x38, 0x8B05) /* <CJK */
-MAP(0x5E, 0x39, 0x8B06) /* <CJK */
-MAP(0x5E, 0x3A, 0x8B0B) /* <CJK */
-MAP(0x5E, 0x3B, 0x8B11) /* <CJK */
-MAP(0x5E, 0x3C, 0x8B1C) /* <CJK */
-MAP(0x5E, 0x3D, 0x8B1E) /* <CJK */
-MAP(0x5E, 0x3E, 0x8B1F) /* <CJK */
-MAP(0x5E, 0x3F, 0x8B0A) /* <CJK */
-MAP(0x5E, 0x40, 0x8B2D) /* <CJK */
-MAP(0x5E, 0x41, 0x8B30) /* <CJK */
-MAP(0x5E, 0x42, 0x8B37) /* <CJK */
-MAP(0x5E, 0x43, 0x8B3C) /* <CJK */
-MAP(0x5E, 0x44, 0x8B42) /* <CJK */
-MAP(0x5E, 0x45, 0x8B43) /* <CJK */
-MAP(0x5E, 0x46, 0x8B44) /* <CJK */
-MAP(0x5E, 0x47, 0x8B45) /* <CJK */
-MAP(0x5E, 0x48, 0x8B46) /* <CJK */
-MAP(0x5E, 0x49, 0x8B48) /* <CJK */
-MAP(0x5E, 0x4A, 0x8B52) /* <CJK */
-MAP(0x5E, 0x4B, 0x8B53) /* <CJK */
-MAP(0x5E, 0x4C, 0x8B54) /* <CJK */
-MAP(0x5E, 0x4D, 0x8B59) /* <CJK */
-MAP(0x5E, 0x4E, 0x8B4D) /* <CJK */
-MAP(0x5E, 0x4F, 0x8B5E) /* <CJK */
-MAP(0x5E, 0x50, 0x8B63) /* <CJK */
-MAP(0x5E, 0x51, 0x8B6D) /* <CJK */
-MAP(0x5E, 0x52, 0x8B76) /* <CJK */
-MAP(0x5E, 0x53, 0x8B78) /* <CJK */
-MAP(0x5E, 0x54, 0x8B79) /* <CJK */
-MAP(0x5E, 0x55, 0x8B7C) /* <CJK */
-MAP(0x5E, 0x56, 0x8B7E) /* <CJK */
-MAP(0x5E, 0x57, 0x8B81) /* <CJK */
-MAP(0x5E, 0x58, 0x8B84) /* <CJK */
-MAP(0x5E, 0x59, 0x8B85) /* <CJK */
-MAP(0x5E, 0x5A, 0x8B8B) /* <CJK */
-MAP(0x5E, 0x5B, 0x8B8D) /* <CJK */
-MAP(0x5E, 0x5C, 0x8B8F) /* <CJK */
-MAP(0x5E, 0x5D, 0x8B94) /* <CJK */
-MAP(0x5E, 0x5E, 0x8B95) /* <CJK */
-MAP(0x5E, 0x5F, 0x8B9C) /* <CJK */
-MAP(0x5E, 0x60, 0x8B9E) /* <CJK */
-MAP(0x5E, 0x61, 0x8B9F) /* <CJK */
-MAP(0x5E, 0x62, 0x8C38) /* <CJK */
-MAP(0x5E, 0x63, 0x8C39) /* <CJK */
-MAP(0x5E, 0x64, 0x8C3D) /* <CJK */
-MAP(0x5E, 0x65, 0x8C3E) /* <CJK */
-MAP(0x5E, 0x66, 0x8C45) /* <CJK */
-MAP(0x5E, 0x67, 0x8C47) /* <CJK */
-MAP(0x5E, 0x68, 0x8C49) /* <CJK */
-MAP(0x5E, 0x69, 0x8C4B) /* <CJK */
-MAP(0x5E, 0x6A, 0x8C4F) /* <CJK */
-MAP(0x5E, 0x6B, 0x8C51) /* <CJK */
-MAP(0x5E, 0x6C, 0x8C53) /* <CJK */
-MAP(0x5E, 0x6D, 0x8C54) /* <CJK */
-MAP(0x5E, 0x6E, 0x8C57) /* <CJK */
-MAP(0x5E, 0x6F, 0x8C58) /* <CJK */
-MAP(0x5E, 0x70, 0x8C5B) /* <CJK */
-MAP(0x5E, 0x71, 0x8C5D) /* <CJK */
-MAP(0x5E, 0x72, 0x8C59) /* <CJK */
-MAP(0x5E, 0x73, 0x8C63) /* <CJK */
-MAP(0x5E, 0x74, 0x8C64) /* <CJK */
-MAP(0x5E, 0x75, 0x8C66) /* <CJK */
-MAP(0x5E, 0x76, 0x8C68) /* <CJK */
-MAP(0x5E, 0x77, 0x8C69) /* <CJK */
-MAP(0x5E, 0x78, 0x8C6D) /* <CJK */
-MAP(0x5E, 0x79, 0x8C73) /* <CJK */
-MAP(0x5E, 0x7A, 0x8C75) /* <CJK */
-MAP(0x5E, 0x7B, 0x8C76) /* <CJK */
-MAP(0x5E, 0x7C, 0x8C7B) /* <CJK */
-MAP(0x5E, 0x7D, 0x8C7E) /* <CJK */
-MAP(0x5E, 0x7E, 0x8C86) /* <CJK */
-MAP(0x5F, 0x21, 0x8C87) /* <CJK */
-MAP(0x5F, 0x22, 0x8C8B) /* <CJK */
-MAP(0x5F, 0x23, 0x8C90) /* <CJK */
-MAP(0x5F, 0x24, 0x8C92) /* <CJK */
-MAP(0x5F, 0x25, 0x8C93) /* <CJK */
-MAP(0x5F, 0x26, 0x8C99) /* <CJK */
-MAP(0x5F, 0x27, 0x8C9B) /* <CJK */
-MAP(0x5F, 0x28, 0x8C9C) /* <CJK */
-MAP(0x5F, 0x29, 0x8CA4) /* <CJK */
-MAP(0x5F, 0x2A, 0x8CB9) /* <CJK */
-MAP(0x5F, 0x2B, 0x8CBA) /* <CJK */
-MAP(0x5F, 0x2C, 0x8CC5) /* <CJK */
-MAP(0x5F, 0x2D, 0x8CC6) /* <CJK */
-MAP(0x5F, 0x2E, 0x8CC9) /* <CJK */
-MAP(0x5F, 0x2F, 0x8CCB) /* <CJK */
-MAP(0x5F, 0x30, 0x8CCF) /* <CJK */
-MAP(0x5F, 0x31, 0x8CD6) /* <CJK */
-MAP(0x5F, 0x32, 0x8CD5) /* <CJK */
-MAP(0x5F, 0x33, 0x8CD9) /* <CJK */
-MAP(0x5F, 0x34, 0x8CDD) /* <CJK */
-MAP(0x5F, 0x35, 0x8CE1) /* <CJK */
-MAP(0x5F, 0x36, 0x8CE8) /* <CJK */
-MAP(0x5F, 0x37, 0x8CEC) /* <CJK */
-MAP(0x5F, 0x38, 0x8CEF) /* <CJK */
-MAP(0x5F, 0x39, 0x8CF0) /* <CJK */
-MAP(0x5F, 0x3A, 0x8CF2) /* <CJK */
-MAP(0x5F, 0x3B, 0x8CF5) /* <CJK */
-MAP(0x5F, 0x3C, 0x8CF7) /* <CJK */
-MAP(0x5F, 0x3D, 0x8CF8) /* <CJK */
-MAP(0x5F, 0x3E, 0x8CFE) /* <CJK */
-MAP(0x5F, 0x3F, 0x8CFF) /* <CJK */
-MAP(0x5F, 0x40, 0x8D01) /* <CJK */
-MAP(0x5F, 0x41, 0x8D03) /* <CJK */
-MAP(0x5F, 0x42, 0x8D09) /* <CJK */
-MAP(0x5F, 0x43, 0x8D12) /* <CJK */
-MAP(0x5F, 0x44, 0x8D17) /* <CJK */
-MAP(0x5F, 0x45, 0x8D1B) /* <CJK */
-MAP(0x5F, 0x46, 0x8D65) /* <CJK */
-MAP(0x5F, 0x47, 0x8D69) /* <CJK */
-MAP(0x5F, 0x48, 0x8D6C) /* <CJK */
-MAP(0x5F, 0x49, 0x8D6E) /* <CJK */
-MAP(0x5F, 0x4A, 0x8D7F) /* <CJK */
-MAP(0x5F, 0x4B, 0x8D82) /* <CJK */
-MAP(0x5F, 0x4C, 0x8D84) /* <CJK */
-MAP(0x5F, 0x4D, 0x8D88) /* <CJK */
-MAP(0x5F, 0x4E, 0x8D8D) /* <CJK */
-MAP(0x5F, 0x4F, 0x8D90) /* <CJK */
-MAP(0x5F, 0x50, 0x8D91) /* <CJK */
-MAP(0x5F, 0x51, 0x8D95) /* <CJK */
-MAP(0x5F, 0x52, 0x8D9E) /* <CJK */
-MAP(0x5F, 0x53, 0x8D9F) /* <CJK */
-MAP(0x5F, 0x54, 0x8DA0) /* <CJK */
-MAP(0x5F, 0x55, 0x8DA6) /* <CJK */
-MAP(0x5F, 0x56, 0x8DAB) /* <CJK */
-MAP(0x5F, 0x57, 0x8DAC) /* <CJK */
-MAP(0x5F, 0x58, 0x8DAF) /* <CJK */
-MAP(0x5F, 0x59, 0x8DB2) /* <CJK */
-MAP(0x5F, 0x5A, 0x8DB5) /* <CJK */
-MAP(0x5F, 0x5B, 0x8DB7) /* <CJK */
-MAP(0x5F, 0x5C, 0x8DB9) /* <CJK */
-MAP(0x5F, 0x5D, 0x8DBB) /* <CJK */
-MAP(0x5F, 0x5E, 0x8DC0) /* <CJK */
-MAP(0x5F, 0x5F, 0x8DC5) /* <CJK */
-MAP(0x5F, 0x60, 0x8DC6) /* <CJK */
-MAP(0x5F, 0x61, 0x8DC7) /* <CJK */
-MAP(0x5F, 0x62, 0x8DC8) /* <CJK */
-MAP(0x5F, 0x63, 0x8DCA) /* <CJK */
-MAP(0x5F, 0x64, 0x8DCE) /* <CJK */
-MAP(0x5F, 0x65, 0x8DD1) /* <CJK */
-MAP(0x5F, 0x66, 0x8DD4) /* <CJK */
-MAP(0x5F, 0x67, 0x8DD5) /* <CJK */
-MAP(0x5F, 0x68, 0x8DD7) /* <CJK */
-MAP(0x5F, 0x69, 0x8DD9) /* <CJK */
-MAP(0x5F, 0x6A, 0x8DE4) /* <CJK */
-MAP(0x5F, 0x6B, 0x8DE5) /* <CJK */
-MAP(0x5F, 0x6C, 0x8DE7) /* <CJK */
-MAP(0x5F, 0x6D, 0x8DEC) /* <CJK */
-MAP(0x5F, 0x6E, 0x8DF0) /* <CJK */
-MAP(0x5F, 0x6F, 0x8DBC) /* <CJK */
-MAP(0x5F, 0x70, 0x8DF1) /* <CJK */
-MAP(0x5F, 0x71, 0x8DF2) /* <CJK */
-MAP(0x5F, 0x72, 0x8DF4) /* <CJK */
-MAP(0x5F, 0x73, 0x8DFD) /* <CJK */
-MAP(0x5F, 0x74, 0x8E01) /* <CJK */
-MAP(0x5F, 0x75, 0x8E04) /* <CJK */
-MAP(0x5F, 0x76, 0x8E05) /* <CJK */
-MAP(0x5F, 0x77, 0x8E06) /* <CJK */
-MAP(0x5F, 0x78, 0x8E0B) /* <CJK */
-MAP(0x5F, 0x79, 0x8E11) /* <CJK */
-MAP(0x5F, 0x7A, 0x8E14) /* <CJK */
-MAP(0x5F, 0x7B, 0x8E16) /* <CJK */
-MAP(0x5F, 0x7C, 0x8E20) /* <CJK */
-MAP(0x5F, 0x7D, 0x8E21) /* <CJK */
-MAP(0x5F, 0x7E, 0x8E22) /* <CJK */
-MAP(0x60, 0x21, 0x8E23) /* <CJK */
-MAP(0x60, 0x22, 0x8E26) /* <CJK */
-MAP(0x60, 0x23, 0x8E27) /* <CJK */
-MAP(0x60, 0x24, 0x8E31) /* <CJK */
-MAP(0x60, 0x25, 0x8E33) /* <CJK */
-MAP(0x60, 0x26, 0x8E36) /* <CJK */
-MAP(0x60, 0x27, 0x8E37) /* <CJK */
-MAP(0x60, 0x28, 0x8E38) /* <CJK */
-MAP(0x60, 0x29, 0x8E39) /* <CJK */
-MAP(0x60, 0x2A, 0x8E3D) /* <CJK */
-MAP(0x60, 0x2B, 0x8E40) /* <CJK */
-MAP(0x60, 0x2C, 0x8E41) /* <CJK */
-MAP(0x60, 0x2D, 0x8E4B) /* <CJK */
-MAP(0x60, 0x2E, 0x8E4D) /* <CJK */
-MAP(0x60, 0x2F, 0x8E4E) /* <CJK */
-MAP(0x60, 0x30, 0x8E4F) /* <CJK */
-MAP(0x60, 0x31, 0x8E54) /* <CJK */
-MAP(0x60, 0x32, 0x8E5B) /* <CJK */
-MAP(0x60, 0x33, 0x8E5C) /* <CJK */
-MAP(0x60, 0x34, 0x8E5D) /* <CJK */
-MAP(0x60, 0x35, 0x8E5E) /* <CJK */
-MAP(0x60, 0x36, 0x8E61) /* <CJK */
-MAP(0x60, 0x37, 0x8E62) /* <CJK */
-MAP(0x60, 0x38, 0x8E69) /* <CJK */
-MAP(0x60, 0x39, 0x8E6C) /* <CJK */
-MAP(0x60, 0x3A, 0x8E6D) /* <CJK */
-MAP(0x60, 0x3B, 0x8E6F) /* <CJK */
-MAP(0x60, 0x3C, 0x8E70) /* <CJK */
-MAP(0x60, 0x3D, 0x8E71) /* <CJK */
-MAP(0x60, 0x3E, 0x8E79) /* <CJK */
-MAP(0x60, 0x3F, 0x8E7A) /* <CJK */
-MAP(0x60, 0x40, 0x8E7B) /* <CJK */
-MAP(0x60, 0x41, 0x8E82) /* <CJK */
-MAP(0x60, 0x42, 0x8E83) /* <CJK */
-MAP(0x60, 0x43, 0x8E89) /* <CJK */
-MAP(0x60, 0x44, 0x8E90) /* <CJK */
-MAP(0x60, 0x45, 0x8E92) /* <CJK */
-MAP(0x60, 0x46, 0x8E95) /* <CJK */
-MAP(0x60, 0x47, 0x8E9A) /* <CJK */
-MAP(0x60, 0x48, 0x8E9B) /* <CJK */
-MAP(0x60, 0x49, 0x8E9D) /* <CJK */
-MAP(0x60, 0x4A, 0x8E9E) /* <CJK */
-MAP(0x60, 0x4B, 0x8EA2) /* <CJK */
-MAP(0x60, 0x4C, 0x8EA7) /* <CJK */
-MAP(0x60, 0x4D, 0x8EA9) /* <CJK */
-MAP(0x60, 0x4E, 0x8EAD) /* <CJK */
-MAP(0x60, 0x4F, 0x8EAE) /* <CJK */
-MAP(0x60, 0x50, 0x8EB3) /* <CJK */
-MAP(0x60, 0x51, 0x8EB5) /* <CJK */
-MAP(0x60, 0x52, 0x8EBA) /* <CJK */
-MAP(0x60, 0x53, 0x8EBB) /* <CJK */
-MAP(0x60, 0x54, 0x8EC0) /* <CJK */
-MAP(0x60, 0x55, 0x8EC1) /* <CJK */
-MAP(0x60, 0x56, 0x8EC3) /* <CJK */
-MAP(0x60, 0x57, 0x8EC4) /* <CJK */
-MAP(0x60, 0x58, 0x8EC7) /* <CJK */
-MAP(0x60, 0x59, 0x8ECF) /* <CJK */
-MAP(0x60, 0x5A, 0x8ED1) /* <CJK */
-MAP(0x60, 0x5B, 0x8ED4) /* <CJK */
-MAP(0x60, 0x5C, 0x8EDC) /* <CJK */
-MAP(0x60, 0x5D, 0x8EE8) /* <CJK */
-MAP(0x60, 0x5E, 0x8EEE) /* <CJK */
-MAP(0x60, 0x5F, 0x8EF0) /* <CJK */
-MAP(0x60, 0x60, 0x8EF1) /* <CJK */
-MAP(0x60, 0x61, 0x8EF7) /* <CJK */
-MAP(0x60, 0x62, 0x8EF9) /* <CJK */
-MAP(0x60, 0x63, 0x8EFA) /* <CJK */
-MAP(0x60, 0x64, 0x8EED) /* <CJK */
-MAP(0x60, 0x65, 0x8F00) /* <CJK */
-MAP(0x60, 0x66, 0x8F02) /* <CJK */
-MAP(0x60, 0x67, 0x8F07) /* <CJK */
-MAP(0x60, 0x68, 0x8F08) /* <CJK */
-MAP(0x60, 0x69, 0x8F0F) /* <CJK */
-MAP(0x60, 0x6A, 0x8F10) /* <CJK */
-MAP(0x60, 0x6B, 0x8F16) /* <CJK */
-MAP(0x60, 0x6C, 0x8F17) /* <CJK */
-MAP(0x60, 0x6D, 0x8F18) /* <CJK */
-MAP(0x60, 0x6E, 0x8F1E) /* <CJK */
-MAP(0x60, 0x6F, 0x8F20) /* <CJK */
-MAP(0x60, 0x70, 0x8F21) /* <CJK */
-MAP(0x60, 0x71, 0x8F23) /* <CJK */
-MAP(0x60, 0x72, 0x8F25) /* <CJK */
-MAP(0x60, 0x73, 0x8F27) /* <CJK */
-MAP(0x60, 0x74, 0x8F28) /* <CJK */
-MAP(0x60, 0x75, 0x8F2C) /* <CJK */
-MAP(0x60, 0x76, 0x8F2D) /* <CJK */
-MAP(0x60, 0x77, 0x8F2E) /* <CJK */
-MAP(0x60, 0x78, 0x8F34) /* <CJK */
-MAP(0x60, 0x79, 0x8F35) /* <CJK */
-MAP(0x60, 0x7A, 0x8F36) /* <CJK */
-MAP(0x60, 0x7B, 0x8F37) /* <CJK */
-MAP(0x60, 0x7C, 0x8F3A) /* <CJK */
-MAP(0x60, 0x7D, 0x8F40) /* <CJK */
-MAP(0x60, 0x7E, 0x8F41) /* <CJK */
-MAP(0x61, 0x21, 0x8F43) /* <CJK */
-MAP(0x61, 0x22, 0x8F47) /* <CJK */
-MAP(0x61, 0x23, 0x8F4F) /* <CJK */
-MAP(0x61, 0x24, 0x8F51) /* <CJK */
-MAP(0x61, 0x25, 0x8F52) /* <CJK */
-MAP(0x61, 0x26, 0x8F53) /* <CJK */
-MAP(0x61, 0x27, 0x8F54) /* <CJK */
-MAP(0x61, 0x28, 0x8F55) /* <CJK */
-MAP(0x61, 0x29, 0x8F58) /* <CJK */
-MAP(0x61, 0x2A, 0x8F5D) /* <CJK */
-MAP(0x61, 0x2B, 0x8F5E) /* <CJK */
-MAP(0x61, 0x2C, 0x8F65) /* <CJK */
-MAP(0x61, 0x2D, 0x8F9D) /* <CJK */
-MAP(0x61, 0x2E, 0x8FA0) /* <CJK */
-MAP(0x61, 0x2F, 0x8FA1) /* <CJK */
-MAP(0x61, 0x30, 0x8FA4) /* <CJK */
-MAP(0x61, 0x31, 0x8FA5) /* <CJK */
-MAP(0x61, 0x32, 0x8FA6) /* <CJK */
-MAP(0x61, 0x33, 0x8FB5) /* <CJK */
-MAP(0x61, 0x34, 0x8FB6) /* <CJK */
-MAP(0x61, 0x35, 0x8FB8) /* <CJK */
-MAP(0x61, 0x36, 0x8FBE) /* <CJK */
-MAP(0x61, 0x37, 0x8FC0) /* <CJK */
-MAP(0x61, 0x38, 0x8FC1) /* <CJK */
-MAP(0x61, 0x39, 0x8FC6) /* <CJK */
-MAP(0x61, 0x3A, 0x8FCA) /* <CJK */
-MAP(0x61, 0x3B, 0x8FCB) /* <CJK */
-MAP(0x61, 0x3C, 0x8FCD) /* <CJK */
-MAP(0x61, 0x3D, 0x8FD0) /* <CJK */
-MAP(0x61, 0x3E, 0x8FD2) /* <CJK */
-MAP(0x61, 0x3F, 0x8FD3) /* <CJK */
-MAP(0x61, 0x40, 0x8FD5) /* <CJK */
-MAP(0x61, 0x41, 0x8FE0) /* <CJK */
-MAP(0x61, 0x42, 0x8FE3) /* <CJK */
-MAP(0x61, 0x43, 0x8FE4) /* <CJK */
-MAP(0x61, 0x44, 0x8FE8) /* <CJK */
-MAP(0x61, 0x45, 0x8FEE) /* <CJK */
-MAP(0x61, 0x46, 0x8FF1) /* <CJK */
-MAP(0x61, 0x47, 0x8FF5) /* <CJK */
-MAP(0x61, 0x48, 0x8FF6) /* <CJK */
-MAP(0x61, 0x49, 0x8FFB) /* <CJK */
-MAP(0x61, 0x4A, 0x8FFE) /* <CJK */
-MAP(0x61, 0x4B, 0x9002) /* <CJK */
-MAP(0x61, 0x4C, 0x9004) /* <CJK */
-MAP(0x61, 0x4D, 0x9008) /* <CJK */
-MAP(0x61, 0x4E, 0x900C) /* <CJK */
-MAP(0x61, 0x4F, 0x9018) /* <CJK */
-MAP(0x61, 0x50, 0x901B) /* <CJK */
-MAP(0x61, 0x51, 0x9028) /* <CJK */
-MAP(0x61, 0x52, 0x9029) /* <CJK */
-MAP(0x61, 0x53, 0x902F) /* <CJK */
-MAP(0x61, 0x54, 0x902A) /* <CJK */
-MAP(0x61, 0x55, 0x902C) /* <CJK */
-MAP(0x61, 0x56, 0x902D) /* <CJK */
-MAP(0x61, 0x57, 0x9033) /* <CJK */
-MAP(0x61, 0x58, 0x9034) /* <CJK */
-MAP(0x61, 0x59, 0x9037) /* <CJK */
-MAP(0x61, 0x5A, 0x903F) /* <CJK */
-MAP(0x61, 0x5B, 0x9043) /* <CJK */
-MAP(0x61, 0x5C, 0x9044) /* <CJK */
-MAP(0x61, 0x5D, 0x904C) /* <CJK */
-MAP(0x61, 0x5E, 0x905B) /* <CJK */
-MAP(0x61, 0x5F, 0x905D) /* <CJK */
-MAP(0x61, 0x60, 0x9062) /* <CJK */
-MAP(0x61, 0x61, 0x9066) /* <CJK */
-MAP(0x61, 0x62, 0x9067) /* <CJK */
-MAP(0x61, 0x63, 0x906C) /* <CJK */
-MAP(0x61, 0x64, 0x9070) /* <CJK */
-MAP(0x61, 0x65, 0x9074) /* <CJK */
-MAP(0x61, 0x66, 0x9079) /* <CJK */
-MAP(0x61, 0x67, 0x9085) /* <CJK */
-MAP(0x61, 0x68, 0x9088) /* <CJK */
-MAP(0x61, 0x69, 0x908B) /* <CJK */
-MAP(0x61, 0x6A, 0x908C) /* <CJK */
-MAP(0x61, 0x6B, 0x908E) /* <CJK */
-MAP(0x61, 0x6C, 0x9090) /* <CJK */
-MAP(0x61, 0x6D, 0x9095) /* <CJK */
-MAP(0x61, 0x6E, 0x9097) /* <CJK */
-MAP(0x61, 0x6F, 0x9098) /* <CJK */
-MAP(0x61, 0x70, 0x9099) /* <CJK */
-MAP(0x61, 0x71, 0x909B) /* <CJK */
-MAP(0x61, 0x72, 0x90A0) /* <CJK */
-MAP(0x61, 0x73, 0x90A1) /* <CJK */
-MAP(0x61, 0x74, 0x90A2) /* <CJK */
-MAP(0x61, 0x75, 0x90A5) /* <CJK */
-MAP(0x61, 0x76, 0x90B0) /* <CJK */
-MAP(0x61, 0x77, 0x90B2) /* <CJK */
-MAP(0x61, 0x78, 0x90B3) /* <CJK */
-MAP(0x61, 0x79, 0x90B4) /* <CJK */
-MAP(0x61, 0x7A, 0x90B6) /* <CJK */
-MAP(0x61, 0x7B, 0x90BD) /* <CJK */
-MAP(0x61, 0x7C, 0x90CC) /* <CJK */
-MAP(0x61, 0x7D, 0x90BE) /* <CJK */
-MAP(0x61, 0x7E, 0x90C3) /* <CJK */
-MAP(0x62, 0x21, 0x90C4) /* <CJK */
-MAP(0x62, 0x22, 0x90C5) /* <CJK */
-MAP(0x62, 0x23, 0x90C7) /* <CJK */
-MAP(0x62, 0x24, 0x90C8) /* <CJK */
-MAP(0x62, 0x25, 0x90D5) /* <CJK */
-MAP(0x62, 0x26, 0x90D7) /* <CJK */
-MAP(0x62, 0x27, 0x90D8) /* <CJK */
-MAP(0x62, 0x28, 0x90D9) /* <CJK */
-MAP(0x62, 0x29, 0x90DC) /* <CJK */
-MAP(0x62, 0x2A, 0x90DD) /* <CJK */
-MAP(0x62, 0x2B, 0x90DF) /* <CJK */
-MAP(0x62, 0x2C, 0x90E5) /* <CJK */
-MAP(0x62, 0x2D, 0x90D2) /* <CJK */
-MAP(0x62, 0x2E, 0x90F6) /* <CJK */
-MAP(0x62, 0x2F, 0x90EB) /* <CJK */
-MAP(0x62, 0x30, 0x90EF) /* <CJK */
-MAP(0x62, 0x31, 0x90F0) /* <CJK */
-MAP(0x62, 0x32, 0x90F4) /* <CJK */
-MAP(0x62, 0x33, 0x90FE) /* <CJK */
-MAP(0x62, 0x34, 0x90FF) /* <CJK */
-MAP(0x62, 0x35, 0x9100) /* <CJK */
-MAP(0x62, 0x36, 0x9104) /* <CJK */
-MAP(0x62, 0x37, 0x9105) /* <CJK */
-MAP(0x62, 0x38, 0x9106) /* <CJK */
-MAP(0x62, 0x39, 0x9108) /* <CJK */
-MAP(0x62, 0x3A, 0x910D) /* <CJK */
-MAP(0x62, 0x3B, 0x9110) /* <CJK */
-MAP(0x62, 0x3C, 0x9114) /* <CJK */
-MAP(0x62, 0x3D, 0x9116) /* <CJK */
-MAP(0x62, 0x3E, 0x9117) /* <CJK */
-MAP(0x62, 0x3F, 0x9118) /* <CJK */
-MAP(0x62, 0x40, 0x911A) /* <CJK */
-MAP(0x62, 0x41, 0x911C) /* <CJK */
-MAP(0x62, 0x42, 0x911E) /* <CJK */
-MAP(0x62, 0x43, 0x9120) /* <CJK */
-MAP(0x62, 0x44, 0x9125) /* <CJK */
-MAP(0x62, 0x45, 0x9122) /* <CJK */
-MAP(0x62, 0x46, 0x9123) /* <CJK */
-MAP(0x62, 0x47, 0x9127) /* <CJK */
-MAP(0x62, 0x48, 0x9129) /* <CJK */
-MAP(0x62, 0x49, 0x912E) /* <CJK */
-MAP(0x62, 0x4A, 0x912F) /* <CJK */
-MAP(0x62, 0x4B, 0x9131) /* <CJK */
-MAP(0x62, 0x4C, 0x9134) /* <CJK */
-MAP(0x62, 0x4D, 0x9136) /* <CJK */
-MAP(0x62, 0x4E, 0x9137) /* <CJK */
-MAP(0x62, 0x4F, 0x9139) /* <CJK */
-MAP(0x62, 0x50, 0x913A) /* <CJK */
-MAP(0x62, 0x51, 0x913C) /* <CJK */
-MAP(0x62, 0x52, 0x913D) /* <CJK */
-MAP(0x62, 0x53, 0x9143) /* <CJK */
-MAP(0x62, 0x54, 0x9147) /* <CJK */
-MAP(0x62, 0x55, 0x9148) /* <CJK */
-MAP(0x62, 0x56, 0x914F) /* <CJK */
-MAP(0x62, 0x57, 0x9153) /* <CJK */
-MAP(0x62, 0x58, 0x9157) /* <CJK */
-MAP(0x62, 0x59, 0x9159) /* <CJK */
-MAP(0x62, 0x5A, 0x915A) /* <CJK */
-MAP(0x62, 0x5B, 0x915B) /* <CJK */
-MAP(0x62, 0x5C, 0x9161) /* <CJK */
-MAP(0x62, 0x5D, 0x9164) /* <CJK */
-MAP(0x62, 0x5E, 0x9167) /* <CJK */
-MAP(0x62, 0x5F, 0x916D) /* <CJK */
-MAP(0x62, 0x60, 0x9174) /* <CJK */
-MAP(0x62, 0x61, 0x9179) /* <CJK */
-MAP(0x62, 0x62, 0x917A) /* <CJK */
-MAP(0x62, 0x63, 0x917B) /* <CJK */
-MAP(0x62, 0x64, 0x9181) /* <CJK */
-MAP(0x62, 0x65, 0x9183) /* <CJK */
-MAP(0x62, 0x66, 0x9185) /* <CJK */
-MAP(0x62, 0x67, 0x9186) /* <CJK */
-MAP(0x62, 0x68, 0x918A) /* <CJK */
-MAP(0x62, 0x69, 0x918E) /* <CJK */
-MAP(0x62, 0x6A, 0x9191) /* <CJK */
-MAP(0x62, 0x6B, 0x9193) /* <CJK */
-MAP(0x62, 0x6C, 0x9194) /* <CJK */
-MAP(0x62, 0x6D, 0x9195) /* <CJK */
-MAP(0x62, 0x6E, 0x9198) /* <CJK */
-MAP(0x62, 0x6F, 0x919E) /* <CJK */
-MAP(0x62, 0x70, 0x91A1) /* <CJK */
-MAP(0x62, 0x71, 0x91A6) /* <CJK */
-MAP(0x62, 0x72, 0x91A8) /* <CJK */
-MAP(0x62, 0x73, 0x91AC) /* <CJK */
-MAP(0x62, 0x74, 0x91AD) /* <CJK */
-MAP(0x62, 0x75, 0x91AE) /* <CJK */
-MAP(0x62, 0x76, 0x91B0) /* <CJK */
-MAP(0x62, 0x77, 0x91B1) /* <CJK */
-MAP(0x62, 0x78, 0x91B2) /* <CJK */
-MAP(0x62, 0x79, 0x91B3) /* <CJK */
-MAP(0x62, 0x7A, 0x91B6) /* <CJK */
-MAP(0x62, 0x7B, 0x91BB) /* <CJK */
-MAP(0x62, 0x7C, 0x91BC) /* <CJK */
-MAP(0x62, 0x7D, 0x91BD) /* <CJK */
-MAP(0x62, 0x7E, 0x91BF) /* <CJK */
-MAP(0x63, 0x21, 0x91C2) /* <CJK */
-MAP(0x63, 0x22, 0x91C3) /* <CJK */
-MAP(0x63, 0x23, 0x91C5) /* <CJK */
-MAP(0x63, 0x24, 0x91D3) /* <CJK */
-MAP(0x63, 0x25, 0x91D4) /* <CJK */
-MAP(0x63, 0x26, 0x91D7) /* <CJK */
-MAP(0x63, 0x27, 0x91D9) /* <CJK */
-MAP(0x63, 0x28, 0x91DA) /* <CJK */
-MAP(0x63, 0x29, 0x91DE) /* <CJK */
-MAP(0x63, 0x2A, 0x91E4) /* <CJK */
-MAP(0x63, 0x2B, 0x91E5) /* <CJK */
-MAP(0x63, 0x2C, 0x91E9) /* <CJK */
-MAP(0x63, 0x2D, 0x91EA) /* <CJK */
-MAP(0x63, 0x2E, 0x91EC) /* <CJK */
-MAP(0x63, 0x2F, 0x91ED) /* <CJK */
-MAP(0x63, 0x30, 0x91EE) /* <CJK */
-MAP(0x63, 0x31, 0x91EF) /* <CJK */
-MAP(0x63, 0x32, 0x91F0) /* <CJK */
-MAP(0x63, 0x33, 0x91F1) /* <CJK */
-MAP(0x63, 0x34, 0x91F7) /* <CJK */
-MAP(0x63, 0x35, 0x91F9) /* <CJK */
-MAP(0x63, 0x36, 0x91FB) /* <CJK */
-MAP(0x63, 0x37, 0x91FD) /* <CJK */
-MAP(0x63, 0x38, 0x9200) /* <CJK */
-MAP(0x63, 0x39, 0x9201) /* <CJK */
-MAP(0x63, 0x3A, 0x9204) /* <CJK */
-MAP(0x63, 0x3B, 0x9205) /* <CJK */
-MAP(0x63, 0x3C, 0x9206) /* <CJK */
-MAP(0x63, 0x3D, 0x9207) /* <CJK */
-MAP(0x63, 0x3E, 0x9209) /* <CJK */
-MAP(0x63, 0x3F, 0x920A) /* <CJK */
-MAP(0x63, 0x40, 0x920C) /* <CJK */
-MAP(0x63, 0x41, 0x9210) /* <CJK */
-MAP(0x63, 0x42, 0x9212) /* <CJK */
-MAP(0x63, 0x43, 0x9213) /* <CJK */
-MAP(0x63, 0x44, 0x9216) /* <CJK */
-MAP(0x63, 0x45, 0x9218) /* <CJK */
-MAP(0x63, 0x46, 0x921C) /* <CJK */
-MAP(0x63, 0x47, 0x921D) /* <CJK */
-MAP(0x63, 0x48, 0x9223) /* <CJK */
-MAP(0x63, 0x49, 0x9224) /* <CJK */
-MAP(0x63, 0x4A, 0x9225) /* <CJK */
-MAP(0x63, 0x4B, 0x9226) /* <CJK */
-MAP(0x63, 0x4C, 0x9228) /* <CJK */
-MAP(0x63, 0x4D, 0x922E) /* <CJK */
-MAP(0x63, 0x4E, 0x922F) /* <CJK */
-MAP(0x63, 0x4F, 0x9230) /* <CJK */
-MAP(0x63, 0x50, 0x9233) /* <CJK */
-MAP(0x63, 0x51, 0x9235) /* <CJK */
-MAP(0x63, 0x52, 0x9236) /* <CJK */
-MAP(0x63, 0x53, 0x9238) /* <CJK */
-MAP(0x63, 0x54, 0x9239) /* <CJK */
-MAP(0x63, 0x55, 0x923A) /* <CJK */
-MAP(0x63, 0x56, 0x923C) /* <CJK */
-MAP(0x63, 0x57, 0x923E) /* <CJK */
-MAP(0x63, 0x58, 0x9240) /* <CJK */
-MAP(0x63, 0x59, 0x9242) /* <CJK */
-MAP(0x63, 0x5A, 0x9243) /* <CJK */
-MAP(0x63, 0x5B, 0x9246) /* <CJK */
-MAP(0x63, 0x5C, 0x9247) /* <CJK */
-MAP(0x63, 0x5D, 0x924A) /* <CJK */
-MAP(0x63, 0x5E, 0x924D) /* <CJK */
-MAP(0x63, 0x5F, 0x924E) /* <CJK */
-MAP(0x63, 0x60, 0x924F) /* <CJK */
-MAP(0x63, 0x61, 0x9251) /* <CJK */
-MAP(0x63, 0x62, 0x9258) /* <CJK */
-MAP(0x63, 0x63, 0x9259) /* <CJK */
-MAP(0x63, 0x64, 0x925C) /* <CJK */
-MAP(0x63, 0x65, 0x925D) /* <CJK */
-MAP(0x63, 0x66, 0x9260) /* <CJK */
-MAP(0x63, 0x67, 0x9261) /* <CJK */
-MAP(0x63, 0x68, 0x9265) /* <CJK */
-MAP(0x63, 0x69, 0x9267) /* <CJK */
-MAP(0x63, 0x6A, 0x9268) /* <CJK */
-MAP(0x63, 0x6B, 0x9269) /* <CJK */
-MAP(0x63, 0x6C, 0x926E) /* <CJK */
-MAP(0x63, 0x6D, 0x926F) /* <CJK */
-MAP(0x63, 0x6E, 0x9270) /* <CJK */
-MAP(0x63, 0x6F, 0x9275) /* <CJK */
-MAP(0x63, 0x70, 0x9276) /* <CJK */
-MAP(0x63, 0x71, 0x9277) /* <CJK */
-MAP(0x63, 0x72, 0x9278) /* <CJK */
-MAP(0x63, 0x73, 0x9279) /* <CJK */
-MAP(0x63, 0x74, 0x927B) /* <CJK */
-MAP(0x63, 0x75, 0x927C) /* <CJK */
-MAP(0x63, 0x76, 0x927D) /* <CJK */
-MAP(0x63, 0x77, 0x927F) /* <CJK */
-MAP(0x63, 0x78, 0x9288) /* <CJK */
-MAP(0x63, 0x79, 0x9289) /* <CJK */
-MAP(0x63, 0x7A, 0x928A) /* <CJK */
-MAP(0x63, 0x7B, 0x928D) /* <CJK */
-MAP(0x63, 0x7C, 0x928E) /* <CJK */
-MAP(0x63, 0x7D, 0x9292) /* <CJK */
-MAP(0x63, 0x7E, 0x9297) /* <CJK */
-MAP(0x64, 0x21, 0x9299) /* <CJK */
-MAP(0x64, 0x22, 0x929F) /* <CJK */
-MAP(0x64, 0x23, 0x92A0) /* <CJK */
-MAP(0x64, 0x24, 0x92A4) /* <CJK */
-MAP(0x64, 0x25, 0x92A5) /* <CJK */
-MAP(0x64, 0x26, 0x92A7) /* <CJK */
-MAP(0x64, 0x27, 0x92A8) /* <CJK */
-MAP(0x64, 0x28, 0x92AB) /* <CJK */
-MAP(0x64, 0x29, 0x92AF) /* <CJK */
-MAP(0x64, 0x2A, 0x92B2) /* <CJK */
-MAP(0x64, 0x2B, 0x92B6) /* <CJK */
-MAP(0x64, 0x2C, 0x92B8) /* <CJK */
-MAP(0x64, 0x2D, 0x92BA) /* <CJK */
-MAP(0x64, 0x2E, 0x92BB) /* <CJK */
-MAP(0x64, 0x2F, 0x92BC) /* <CJK */
-MAP(0x64, 0x30, 0x92BD) /* <CJK */
-MAP(0x64, 0x31, 0x92BF) /* <CJK */
-MAP(0x64, 0x32, 0x92C0) /* <CJK */
-MAP(0x64, 0x33, 0x92C1) /* <CJK */
-MAP(0x64, 0x34, 0x92C2) /* <CJK */
-MAP(0x64, 0x35, 0x92C3) /* <CJK */
-MAP(0x64, 0x36, 0x92C5) /* <CJK */
-MAP(0x64, 0x37, 0x92C6) /* <CJK */
-MAP(0x64, 0x38, 0x92C7) /* <CJK */
-MAP(0x64, 0x39, 0x92C8) /* <CJK */
-MAP(0x64, 0x3A, 0x92CB) /* <CJK */
-MAP(0x64, 0x3B, 0x92CC) /* <CJK */
-MAP(0x64, 0x3C, 0x92CD) /* <CJK */
-MAP(0x64, 0x3D, 0x92CE) /* <CJK */
-MAP(0x64, 0x3E, 0x92D0) /* <CJK */
-MAP(0x64, 0x3F, 0x92D3) /* <CJK */
-MAP(0x64, 0x40, 0x92D5) /* <CJK */
-MAP(0x64, 0x41, 0x92D7) /* <CJK */
-MAP(0x64, 0x42, 0x92D8) /* <CJK */
-MAP(0x64, 0x43, 0x92D9) /* <CJK */
-MAP(0x64, 0x44, 0x92DC) /* <CJK */
-MAP(0x64, 0x45, 0x92DD) /* <CJK */
-MAP(0x64, 0x46, 0x92DF) /* <CJK */
-MAP(0x64, 0x47, 0x92E0) /* <CJK */
-MAP(0x64, 0x48, 0x92E1) /* <CJK */
-MAP(0x64, 0x49, 0x92E3) /* <CJK */
-MAP(0x64, 0x4A, 0x92E5) /* <CJK */
-MAP(0x64, 0x4B, 0x92E7) /* <CJK */
-MAP(0x64, 0x4C, 0x92E8) /* <CJK */
-MAP(0x64, 0x4D, 0x92EC) /* <CJK */
-MAP(0x64, 0x4E, 0x92EE) /* <CJK */
-MAP(0x64, 0x4F, 0x92F0) /* <CJK */
-MAP(0x64, 0x50, 0x92F9) /* <CJK */
-MAP(0x64, 0x51, 0x92FB) /* <CJK */
-MAP(0x64, 0x52, 0x92FF) /* <CJK */
-MAP(0x64, 0x53, 0x9300) /* <CJK */
-MAP(0x64, 0x54, 0x9302) /* <CJK */
-MAP(0x64, 0x55, 0x9308) /* <CJK */
-MAP(0x64, 0x56, 0x930D) /* <CJK */
-MAP(0x64, 0x57, 0x9311) /* <CJK */
-MAP(0x64, 0x58, 0x9314) /* <CJK */
-MAP(0x64, 0x59, 0x9315) /* <CJK */
-MAP(0x64, 0x5A, 0x931C) /* <CJK */
-MAP(0x64, 0x5B, 0x931D) /* <CJK */
-MAP(0x64, 0x5C, 0x931E) /* <CJK */
-MAP(0x64, 0x5D, 0x931F) /* <CJK */
-MAP(0x64, 0x5E, 0x9321) /* <CJK */
-MAP(0x64, 0x5F, 0x9324) /* <CJK */
-MAP(0x64, 0x60, 0x9325) /* <CJK */
-MAP(0x64, 0x61, 0x9327) /* <CJK */
-MAP(0x64, 0x62, 0x9329) /* <CJK */
-MAP(0x64, 0x63, 0x932A) /* <CJK */
-MAP(0x64, 0x64, 0x9333) /* <CJK */
-MAP(0x64, 0x65, 0x9334) /* <CJK */
-MAP(0x64, 0x66, 0x9336) /* <CJK */
-MAP(0x64, 0x67, 0x9337) /* <CJK */
-MAP(0x64, 0x68, 0x9347) /* <CJK */
-MAP(0x64, 0x69, 0x9348) /* <CJK */
-MAP(0x64, 0x6A, 0x9349) /* <CJK */
-MAP(0x64, 0x6B, 0x9350) /* <CJK */
-MAP(0x64, 0x6C, 0x9351) /* <CJK */
-MAP(0x64, 0x6D, 0x9352) /* <CJK */
-MAP(0x64, 0x6E, 0x9355) /* <CJK */
-MAP(0x64, 0x6F, 0x9357) /* <CJK */
-MAP(0x64, 0x70, 0x9358) /* <CJK */
-MAP(0x64, 0x71, 0x935A) /* <CJK */
-MAP(0x64, 0x72, 0x935E) /* <CJK */
-MAP(0x64, 0x73, 0x9364) /* <CJK */
-MAP(0x64, 0x74, 0x9365) /* <CJK */
-MAP(0x64, 0x75, 0x9367) /* <CJK */
-MAP(0x64, 0x76, 0x9369) /* <CJK */
-MAP(0x64, 0x77, 0x936A) /* <CJK */
-MAP(0x64, 0x78, 0x936D) /* <CJK */
-MAP(0x64, 0x79, 0x936F) /* <CJK */
-MAP(0x64, 0x7A, 0x9370) /* <CJK */
-MAP(0x64, 0x7B, 0x9371) /* <CJK */
-MAP(0x64, 0x7C, 0x9373) /* <CJK */
-MAP(0x64, 0x7D, 0x9374) /* <CJK */
-MAP(0x64, 0x7E, 0x9376) /* <CJK */
-MAP(0x65, 0x21, 0x937A) /* <CJK */
-MAP(0x65, 0x22, 0x937D) /* <CJK */
-MAP(0x65, 0x23, 0x937F) /* <CJK */
-MAP(0x65, 0x24, 0x9380) /* <CJK */
-MAP(0x65, 0x25, 0x9381) /* <CJK */
-MAP(0x65, 0x26, 0x9382) /* <CJK */
-MAP(0x65, 0x27, 0x9388) /* <CJK */
-MAP(0x65, 0x28, 0x938A) /* <CJK */
-MAP(0x65, 0x29, 0x938B) /* <CJK */
-MAP(0x65, 0x2A, 0x938D) /* <CJK */
-MAP(0x65, 0x2B, 0x938F) /* <CJK */
-MAP(0x65, 0x2C, 0x9392) /* <CJK */
-MAP(0x65, 0x2D, 0x9395) /* <CJK */
-MAP(0x65, 0x2E, 0x9398) /* <CJK */
-MAP(0x65, 0x2F, 0x939B) /* <CJK */
-MAP(0x65, 0x30, 0x939E) /* <CJK */
-MAP(0x65, 0x31, 0x93A1) /* <CJK */
-MAP(0x65, 0x32, 0x93A3) /* <CJK */
-MAP(0x65, 0x33, 0x93A4) /* <CJK */
-MAP(0x65, 0x34, 0x93A6) /* <CJK */
-MAP(0x65, 0x35, 0x93A8) /* <CJK */
-MAP(0x65, 0x36, 0x93AB) /* <CJK */
-MAP(0x65, 0x37, 0x93B4) /* <CJK */
-MAP(0x65, 0x38, 0x93B5) /* <CJK */
-MAP(0x65, 0x39, 0x93B6) /* <CJK */
-MAP(0x65, 0x3A, 0x93BA) /* <CJK */
-MAP(0x65, 0x3B, 0x93A9) /* <CJK */
-MAP(0x65, 0x3C, 0x93C1) /* <CJK */
-MAP(0x65, 0x3D, 0x93C4) /* <CJK */
-MAP(0x65, 0x3E, 0x93C5) /* <CJK */
-MAP(0x65, 0x3F, 0x93C6) /* <CJK */
-MAP(0x65, 0x40, 0x93C7) /* <CJK */
-MAP(0x65, 0x41, 0x93C9) /* <CJK */
-MAP(0x65, 0x42, 0x93CA) /* <CJK */
-MAP(0x65, 0x43, 0x93CB) /* <CJK */
-MAP(0x65, 0x44, 0x93CC) /* <CJK */
-MAP(0x65, 0x45, 0x93CD) /* <CJK */
-MAP(0x65, 0x46, 0x93D3) /* <CJK */
-MAP(0x65, 0x47, 0x93D9) /* <CJK */
-MAP(0x65, 0x48, 0x93DC) /* <CJK */
-MAP(0x65, 0x49, 0x93DE) /* <CJK */
-MAP(0x65, 0x4A, 0x93DF) /* <CJK */
-MAP(0x65, 0x4B, 0x93E2) /* <CJK */
-MAP(0x65, 0x4C, 0x93E6) /* <CJK */
-MAP(0x65, 0x4D, 0x93E7) /* <CJK */
-MAP(0x65, 0x4E, 0x93F9) /* <CJK */
-MAP(0x65, 0x4F, 0x93F7) /* <CJK */
-MAP(0x65, 0x50, 0x93F8) /* <CJK */
-MAP(0x65, 0x51, 0x93FA) /* <CJK */
-MAP(0x65, 0x52, 0x93FB) /* <CJK */
-MAP(0x65, 0x53, 0x93FD) /* <CJK */
-MAP(0x65, 0x54, 0x9401) /* <CJK */
-MAP(0x65, 0x55, 0x9402) /* <CJK */
-MAP(0x65, 0x56, 0x9404) /* <CJK */
-MAP(0x65, 0x57, 0x9408) /* <CJK */
-MAP(0x65, 0x58, 0x9409) /* <CJK */
-MAP(0x65, 0x59, 0x940D) /* <CJK */
-MAP(0x65, 0x5A, 0x940E) /* <CJK */
-MAP(0x65, 0x5B, 0x940F) /* <CJK */
-MAP(0x65, 0x5C, 0x9415) /* <CJK */
-MAP(0x65, 0x5D, 0x9416) /* <CJK */
-MAP(0x65, 0x5E, 0x9417) /* <CJK */
-MAP(0x65, 0x5F, 0x941F) /* <CJK */
-MAP(0x65, 0x60, 0x942E) /* <CJK */
-MAP(0x65, 0x61, 0x942F) /* <CJK */
-MAP(0x65, 0x62, 0x9431) /* <CJK */
-MAP(0x65, 0x63, 0x9432) /* <CJK */
-MAP(0x65, 0x64, 0x9433) /* <CJK */
-MAP(0x65, 0x65, 0x9434) /* <CJK */
-MAP(0x65, 0x66, 0x943B) /* <CJK */
-MAP(0x65, 0x67, 0x943F) /* <CJK */
-MAP(0x65, 0x68, 0x943D) /* <CJK */
-MAP(0x65, 0x69, 0x9443) /* <CJK */
-MAP(0x65, 0x6A, 0x9445) /* <CJK */
-MAP(0x65, 0x6B, 0x9448) /* <CJK */
-MAP(0x65, 0x6C, 0x944A) /* <CJK */
-MAP(0x65, 0x6D, 0x944C) /* <CJK */
-MAP(0x65, 0x6E, 0x9455) /* <CJK */
-MAP(0x65, 0x6F, 0x9459) /* <CJK */
-MAP(0x65, 0x70, 0x945C) /* <CJK */
-MAP(0x65, 0x71, 0x945F) /* <CJK */
-MAP(0x65, 0x72, 0x9461) /* <CJK */
-MAP(0x65, 0x73, 0x9463) /* <CJK */
-MAP(0x65, 0x74, 0x9468) /* <CJK */
-MAP(0x65, 0x75, 0x946B) /* <CJK */
-MAP(0x65, 0x76, 0x946D) /* <CJK */
-MAP(0x65, 0x77, 0x946E) /* <CJK */
-MAP(0x65, 0x78, 0x946F) /* <CJK */
-MAP(0x65, 0x79, 0x9471) /* <CJK */
-MAP(0x65, 0x7A, 0x9472) /* <CJK */
-MAP(0x65, 0x7B, 0x9484) /* <CJK */
-MAP(0x65, 0x7C, 0x9483) /* <CJK */
-MAP(0x65, 0x7D, 0x9578) /* <CJK */
-MAP(0x65, 0x7E, 0x9579) /* <CJK */
-MAP(0x66, 0x21, 0x957E) /* <CJK */
-MAP(0x66, 0x22, 0x9584) /* <CJK */
-MAP(0x66, 0x23, 0x9588) /* <CJK */
-MAP(0x66, 0x24, 0x958C) /* <CJK */
-MAP(0x66, 0x25, 0x958D) /* <CJK */
-MAP(0x66, 0x26, 0x958E) /* <CJK */
-MAP(0x66, 0x27, 0x959D) /* <CJK */
-MAP(0x66, 0x28, 0x959E) /* <CJK */
-MAP(0x66, 0x29, 0x959F) /* <CJK */
-MAP(0x66, 0x2A, 0x95A1) /* <CJK */
-MAP(0x66, 0x2B, 0x95A6) /* <CJK */
-MAP(0x66, 0x2C, 0x95A9) /* <CJK */
-MAP(0x66, 0x2D, 0x95AB) /* <CJK */
-MAP(0x66, 0x2E, 0x95AC) /* <CJK */
-MAP(0x66, 0x2F, 0x95B4) /* <CJK */
-MAP(0x66, 0x30, 0x95B6) /* <CJK */
-MAP(0x66, 0x31, 0x95BA) /* <CJK */
-MAP(0x66, 0x32, 0x95BD) /* <CJK */
-MAP(0x66, 0x33, 0x95BF) /* <CJK */
-MAP(0x66, 0x34, 0x95C6) /* <CJK */
-MAP(0x66, 0x35, 0x95C8) /* <CJK */
-MAP(0x66, 0x36, 0x95C9) /* <CJK */
-MAP(0x66, 0x37, 0x95CB) /* <CJK */
-MAP(0x66, 0x38, 0x95D0) /* <CJK */
-MAP(0x66, 0x39, 0x95D1) /* <CJK */
-MAP(0x66, 0x3A, 0x95D2) /* <CJK */
-MAP(0x66, 0x3B, 0x95D3) /* <CJK */
-MAP(0x66, 0x3C, 0x95D9) /* <CJK */
-MAP(0x66, 0x3D, 0x95DA) /* <CJK */
-MAP(0x66, 0x3E, 0x95DD) /* <CJK */
-MAP(0x66, 0x3F, 0x95DE) /* <CJK */
-MAP(0x66, 0x40, 0x95DF) /* <CJK */
-MAP(0x66, 0x41, 0x95E0) /* <CJK */
-MAP(0x66, 0x42, 0x95E4) /* <CJK */
-MAP(0x66, 0x43, 0x95E6) /* <CJK */
-MAP(0x66, 0x44, 0x961D) /* <CJK */
-MAP(0x66, 0x45, 0x961E) /* <CJK */
-MAP(0x66, 0x46, 0x9622) /* <CJK */
-MAP(0x66, 0x47, 0x9624) /* <CJK */
-MAP(0x66, 0x48, 0x9625) /* <CJK */
-MAP(0x66, 0x49, 0x9626) /* <CJK */
-MAP(0x66, 0x4A, 0x962C) /* <CJK */
-MAP(0x66, 0x4B, 0x9631) /* <CJK */
-MAP(0x66, 0x4C, 0x9633) /* <CJK */
-MAP(0x66, 0x4D, 0x9637) /* <CJK */
-MAP(0x66, 0x4E, 0x9638) /* <CJK */
-MAP(0x66, 0x4F, 0x9639) /* <CJK */
-MAP(0x66, 0x50, 0x963A) /* <CJK */
-MAP(0x66, 0x51, 0x963C) /* <CJK */
-MAP(0x66, 0x52, 0x963D) /* <CJK */
-MAP(0x66, 0x53, 0x9641) /* <CJK */
-MAP(0x66, 0x54, 0x9652) /* <CJK */
-MAP(0x66, 0x55, 0x9654) /* <CJK */
-MAP(0x66, 0x56, 0x9656) /* <CJK */
-MAP(0x66, 0x57, 0x9657) /* <CJK */
-MAP(0x66, 0x58, 0x9658) /* <CJK */
-MAP(0x66, 0x59, 0x9661) /* <CJK */
-MAP(0x66, 0x5A, 0x966E) /* <CJK */
-MAP(0x66, 0x5B, 0x9674) /* <CJK */
-MAP(0x66, 0x5C, 0x967B) /* <CJK */
-MAP(0x66, 0x5D, 0x967C) /* <CJK */
-MAP(0x66, 0x5E, 0x967E) /* <CJK */
-MAP(0x66, 0x5F, 0x967F) /* <CJK */
-MAP(0x66, 0x60, 0x9681) /* <CJK */
-MAP(0x66, 0x61, 0x9682) /* <CJK */
-MAP(0x66, 0x62, 0x9683) /* <CJK */
-MAP(0x66, 0x63, 0x9684) /* <CJK */
-MAP(0x66, 0x64, 0x9689) /* <CJK */
-MAP(0x66, 0x65, 0x9691) /* <CJK */
-MAP(0x66, 0x66, 0x9696) /* <CJK */
-MAP(0x66, 0x67, 0x969A) /* <CJK */
-MAP(0x66, 0x68, 0x969D) /* <CJK */
-MAP(0x66, 0x69, 0x969F) /* <CJK */
-MAP(0x66, 0x6A, 0x96A4) /* <CJK */
-MAP(0x66, 0x6B, 0x96A5) /* <CJK */
-MAP(0x66, 0x6C, 0x96A6) /* <CJK */
-MAP(0x66, 0x6D, 0x96A9) /* <CJK */
-MAP(0x66, 0x6E, 0x96AE) /* <CJK */
-MAP(0x66, 0x6F, 0x96AF) /* <CJK */
-MAP(0x66, 0x70, 0x96B3) /* <CJK */
-MAP(0x66, 0x71, 0x96BA) /* <CJK */
-MAP(0x66, 0x72, 0x96CA) /* <CJK */
-MAP(0x66, 0x73, 0x96D2) /* <CJK */
-MAP(0x66, 0x74, 0x5DB2) /* <CJK */
-MAP(0x66, 0x75, 0x96D8) /* <CJK */
-MAP(0x66, 0x76, 0x96DA) /* <CJK */
-MAP(0x66, 0x77, 0x96DD) /* <CJK */
-MAP(0x66, 0x78, 0x96DE) /* <CJK */
-MAP(0x66, 0x79, 0x96DF) /* <CJK */
-MAP(0x66, 0x7A, 0x96E9) /* <CJK */
-MAP(0x66, 0x7B, 0x96EF) /* <CJK */
-MAP(0x66, 0x7C, 0x96F1) /* <CJK */
-MAP(0x66, 0x7D, 0x96FA) /* <CJK */
-MAP(0x66, 0x7E, 0x9702) /* <CJK */
-MAP(0x67, 0x21, 0x9703) /* <CJK */
-MAP(0x67, 0x22, 0x9705) /* <CJK */
-MAP(0x67, 0x23, 0x9709) /* <CJK */
-MAP(0x67, 0x24, 0x971A) /* <CJK */
-MAP(0x67, 0x25, 0x971B) /* <CJK */
-MAP(0x67, 0x26, 0x971D) /* <CJK */
-MAP(0x67, 0x27, 0x9721) /* <CJK */
-MAP(0x67, 0x28, 0x9722) /* <CJK */
-MAP(0x67, 0x29, 0x9723) /* <CJK */
-MAP(0x67, 0x2A, 0x9728) /* <CJK */
-MAP(0x67, 0x2B, 0x9731) /* <CJK */
-MAP(0x67, 0x2C, 0x9733) /* <CJK */
-MAP(0x67, 0x2D, 0x9741) /* <CJK */
-MAP(0x67, 0x2E, 0x9743) /* <CJK */
-MAP(0x67, 0x2F, 0x974A) /* <CJK */
-MAP(0x67, 0x30, 0x974E) /* <CJK */
-MAP(0x67, 0x31, 0x974F) /* <CJK */
-MAP(0x67, 0x32, 0x9755) /* <CJK */
-MAP(0x67, 0x33, 0x9757) /* <CJK */
-MAP(0x67, 0x34, 0x9758) /* <CJK */
-MAP(0x67, 0x35, 0x975A) /* <CJK */
-MAP(0x67, 0x36, 0x975B) /* <CJK */
-MAP(0x67, 0x37, 0x9763) /* <CJK */
-MAP(0x67, 0x38, 0x9767) /* <CJK */
-MAP(0x67, 0x39, 0x976A) /* <CJK */
-MAP(0x67, 0x3A, 0x976E) /* <CJK */
-MAP(0x67, 0x3B, 0x9773) /* <CJK */
-MAP(0x67, 0x3C, 0x9776) /* <CJK */
-MAP(0x67, 0x3D, 0x9777) /* <CJK */
-MAP(0x67, 0x3E, 0x9778) /* <CJK */
-MAP(0x67, 0x3F, 0x977B) /* <CJK */
-MAP(0x67, 0x40, 0x977D) /* <CJK */
-MAP(0x67, 0x41, 0x977F) /* <CJK */
-MAP(0x67, 0x42, 0x9780) /* <CJK */
-MAP(0x67, 0x43, 0x9789) /* <CJK */
-MAP(0x67, 0x44, 0x9795) /* <CJK */
-MAP(0x67, 0x45, 0x9796) /* <CJK */
-MAP(0x67, 0x46, 0x9797) /* <CJK */
-MAP(0x67, 0x47, 0x9799) /* <CJK */
-MAP(0x67, 0x48, 0x979A) /* <CJK */
-MAP(0x67, 0x49, 0x979E) /* <CJK */
-MAP(0x67, 0x4A, 0x979F) /* <CJK */
-MAP(0x67, 0x4B, 0x97A2) /* <CJK */
-MAP(0x67, 0x4C, 0x97AC) /* <CJK */
-MAP(0x67, 0x4D, 0x97AE) /* <CJK */
-MAP(0x67, 0x4E, 0x97B1) /* <CJK */
-MAP(0x67, 0x4F, 0x97B2) /* <CJK */
-MAP(0x67, 0x50, 0x97B5) /* <CJK */
-MAP(0x67, 0x51, 0x97B6) /* <CJK */
-MAP(0x67, 0x52, 0x97B8) /* <CJK */
-MAP(0x67, 0x53, 0x97B9) /* <CJK */
-MAP(0x67, 0x54, 0x97BA) /* <CJK */
-MAP(0x67, 0x55, 0x97BC) /* <CJK */
-MAP(0x67, 0x56, 0x97BE) /* <CJK */
-MAP(0x67, 0x57, 0x97BF) /* <CJK */
-MAP(0x67, 0x58, 0x97C1) /* <CJK */
-MAP(0x67, 0x59, 0x97C4) /* <CJK */
-MAP(0x67, 0x5A, 0x97C5) /* <CJK */
-MAP(0x67, 0x5B, 0x97C7) /* <CJK */
-MAP(0x67, 0x5C, 0x97C9) /* <CJK */
-MAP(0x67, 0x5D, 0x97CA) /* <CJK */
-MAP(0x67, 0x5E, 0x97CC) /* <CJK */
-MAP(0x67, 0x5F, 0x97CD) /* <CJK */
-MAP(0x67, 0x60, 0x97CE) /* <CJK */
-MAP(0x67, 0x61, 0x97D0) /* <CJK */
-MAP(0x67, 0x62, 0x97D1) /* <CJK */
-MAP(0x67, 0x63, 0x97D4) /* <CJK */
-MAP(0x67, 0x64, 0x97D7) /* <CJK */
-MAP(0x67, 0x65, 0x97D8) /* <CJK */
-MAP(0x67, 0x66, 0x97D9) /* <CJK */
-MAP(0x67, 0x67, 0x97DD) /* <CJK */
-MAP(0x67, 0x68, 0x97DE) /* <CJK */
-MAP(0x67, 0x69, 0x97E0) /* <CJK */
-MAP(0x67, 0x6A, 0x97DB) /* <CJK */
-MAP(0x67, 0x6B, 0x97E1) /* <CJK */
-MAP(0x67, 0x6C, 0x97E4) /* <CJK */
-MAP(0x67, 0x6D, 0x97EF) /* <CJK */
-MAP(0x67, 0x6E, 0x97F1) /* <CJK */
-MAP(0x67, 0x6F, 0x97F4) /* <CJK */
-MAP(0x67, 0x70, 0x97F7) /* <CJK */
-MAP(0x67, 0x71, 0x97F8) /* <CJK */
-MAP(0x67, 0x72, 0x97FA) /* <CJK */
-MAP(0x67, 0x73, 0x9807) /* <CJK */
-MAP(0x67, 0x74, 0x980A) /* <CJK */
-MAP(0x67, 0x75, 0x9819) /* <CJK */
-MAP(0x67, 0x76, 0x980D) /* <CJK */
-MAP(0x67, 0x77, 0x980E) /* <CJK */
-MAP(0x67, 0x78, 0x9814) /* <CJK */
-MAP(0x67, 0x79, 0x9816) /* <CJK */
-MAP(0x67, 0x7A, 0x981C) /* <CJK */
-MAP(0x67, 0x7B, 0x981E) /* <CJK */
-MAP(0x67, 0x7C, 0x9820) /* <CJK */
-MAP(0x67, 0x7D, 0x9823) /* <CJK */
-MAP(0x67, 0x7E, 0x9826) /* <CJK */
-MAP(0x68, 0x21, 0x982B) /* <CJK */
-MAP(0x68, 0x22, 0x982E) /* <CJK */
-MAP(0x68, 0x23, 0x982F) /* <CJK */
-MAP(0x68, 0x24, 0x9830) /* <CJK */
-MAP(0x68, 0x25, 0x9832) /* <CJK */
-MAP(0x68, 0x26, 0x9833) /* <CJK */
-MAP(0x68, 0x27, 0x9835) /* <CJK */
-MAP(0x68, 0x28, 0x9825) /* <CJK */
-MAP(0x68, 0x29, 0x983E) /* <CJK */
-MAP(0x68, 0x2A, 0x9844) /* <CJK */
-MAP(0x68, 0x2B, 0x9847) /* <CJK */
-MAP(0x68, 0x2C, 0x984A) /* <CJK */
-MAP(0x68, 0x2D, 0x9851) /* <CJK */
-MAP(0x68, 0x2E, 0x9852) /* <CJK */
-MAP(0x68, 0x2F, 0x9853) /* <CJK */
-MAP(0x68, 0x30, 0x9856) /* <CJK */
-MAP(0x68, 0x31, 0x9857) /* <CJK */
-MAP(0x68, 0x32, 0x9859) /* <CJK */
-MAP(0x68, 0x33, 0x985A) /* <CJK */
-MAP(0x68, 0x34, 0x9862) /* <CJK */
-MAP(0x68, 0x35, 0x9863) /* <CJK */
-MAP(0x68, 0x36, 0x9865) /* <CJK */
-MAP(0x68, 0x37, 0x9866) /* <CJK */
-MAP(0x68, 0x38, 0x986A) /* <CJK */
-MAP(0x68, 0x39, 0x986C) /* <CJK */
-MAP(0x68, 0x3A, 0x98AB) /* <CJK */
-MAP(0x68, 0x3B, 0x98AD) /* <CJK */
-MAP(0x68, 0x3C, 0x98AE) /* <CJK */
-MAP(0x68, 0x3D, 0x98B0) /* <CJK */
-MAP(0x68, 0x3E, 0x98B4) /* <CJK */
-MAP(0x68, 0x3F, 0x98B7) /* <CJK */
-MAP(0x68, 0x40, 0x98B8) /* <CJK */
-MAP(0x68, 0x41, 0x98BA) /* <CJK */
-MAP(0x68, 0x42, 0x98BB) /* <CJK */
-MAP(0x68, 0x43, 0x98BF) /* <CJK */
-MAP(0x68, 0x44, 0x98C2) /* <CJK */
-MAP(0x68, 0x45, 0x98C5) /* <CJK */
-MAP(0x68, 0x46, 0x98C8) /* <CJK */
-MAP(0x68, 0x47, 0x98CC) /* <CJK */
-MAP(0x68, 0x48, 0x98E1) /* <CJK */
-MAP(0x68, 0x49, 0x98E3) /* <CJK */
-MAP(0x68, 0x4A, 0x98E5) /* <CJK */
-MAP(0x68, 0x4B, 0x98E6) /* <CJK */
-MAP(0x68, 0x4C, 0x98E7) /* <CJK */
-MAP(0x68, 0x4D, 0x98EA) /* <CJK */
-MAP(0x68, 0x4E, 0x98F3) /* <CJK */
-MAP(0x68, 0x4F, 0x98F6) /* <CJK */
-MAP(0x68, 0x50, 0x9902) /* <CJK */
-MAP(0x68, 0x51, 0x9907) /* <CJK */
-MAP(0x68, 0x52, 0x9908) /* <CJK */
-MAP(0x68, 0x53, 0x9911) /* <CJK */
-MAP(0x68, 0x54, 0x9915) /* <CJK */
-MAP(0x68, 0x55, 0x9916) /* <CJK */
-MAP(0x68, 0x56, 0x9917) /* <CJK */
-MAP(0x68, 0x57, 0x991A) /* <CJK */
-MAP(0x68, 0x58, 0x991B) /* <CJK */
-MAP(0x68, 0x59, 0x991C) /* <CJK */
-MAP(0x68, 0x5A, 0x991F) /* <CJK */
-MAP(0x68, 0x5B, 0x9922) /* <CJK */
-MAP(0x68, 0x5C, 0x9926) /* <CJK */
-MAP(0x68, 0x5D, 0x9927) /* <CJK */
-MAP(0x68, 0x5E, 0x992B) /* <CJK */
-MAP(0x68, 0x5F, 0x9931) /* <CJK */
-MAP(0x68, 0x60, 0x9932) /* <CJK */
-MAP(0x68, 0x61, 0x9933) /* <CJK */
-MAP(0x68, 0x62, 0x9934) /* <CJK */
-MAP(0x68, 0x63, 0x9935) /* <CJK */
-MAP(0x68, 0x64, 0x9939) /* <CJK */
-MAP(0x68, 0x65, 0x993A) /* <CJK */
-MAP(0x68, 0x66, 0x993B) /* <CJK */
-MAP(0x68, 0x67, 0x993C) /* <CJK */
-MAP(0x68, 0x68, 0x9940) /* <CJK */
-MAP(0x68, 0x69, 0x9941) /* <CJK */
-MAP(0x68, 0x6A, 0x9946) /* <CJK */
-MAP(0x68, 0x6B, 0x9947) /* <CJK */
-MAP(0x68, 0x6C, 0x9948) /* <CJK */
-MAP(0x68, 0x6D, 0x994D) /* <CJK */
-MAP(0x68, 0x6E, 0x994E) /* <CJK */
-MAP(0x68, 0x6F, 0x9954) /* <CJK */
-MAP(0x68, 0x70, 0x9958) /* <CJK */
-MAP(0x68, 0x71, 0x9959) /* <CJK */
-MAP(0x68, 0x72, 0x995B) /* <CJK */
-MAP(0x68, 0x73, 0x995C) /* <CJK */
-MAP(0x68, 0x74, 0x995E) /* <CJK */
-MAP(0x68, 0x75, 0x995F) /* <CJK */
-MAP(0x68, 0x76, 0x9960) /* <CJK */
-MAP(0x68, 0x77, 0x999B) /* <CJK */
-MAP(0x68, 0x78, 0x999D) /* <CJK */
-MAP(0x68, 0x79, 0x999F) /* <CJK */
-MAP(0x68, 0x7A, 0x99A6) /* <CJK */
-MAP(0x68, 0x7B, 0x99B0) /* <CJK */
-MAP(0x68, 0x7C, 0x99B1) /* <CJK */
-MAP(0x68, 0x7D, 0x99B2) /* <CJK */
-MAP(0x68, 0x7E, 0x99B5) /* <CJK */
-MAP(0x69, 0x21, 0x99B9) /* <CJK */
-MAP(0x69, 0x22, 0x99BA) /* <CJK */
-MAP(0x69, 0x23, 0x99BD) /* <CJK */
-MAP(0x69, 0x24, 0x99BF) /* <CJK */
-MAP(0x69, 0x25, 0x99C3) /* <CJK */
-MAP(0x69, 0x26, 0x99C9) /* <CJK */
-MAP(0x69, 0x27, 0x99D3) /* <CJK */
-MAP(0x69, 0x28, 0x99D4) /* <CJK */
-MAP(0x69, 0x29, 0x99D9) /* <CJK */
-MAP(0x69, 0x2A, 0x99DA) /* <CJK */
-MAP(0x69, 0x2B, 0x99DC) /* <CJK */
-MAP(0x69, 0x2C, 0x99DE) /* <CJK */
-MAP(0x69, 0x2D, 0x99E7) /* <CJK */
-MAP(0x69, 0x2E, 0x99EA) /* <CJK */
-MAP(0x69, 0x2F, 0x99EB) /* <CJK */
-MAP(0x69, 0x30, 0x99EC) /* <CJK */
-MAP(0x69, 0x31, 0x99F0) /* <CJK */
-MAP(0x69, 0x32, 0x99F4) /* <CJK */
-MAP(0x69, 0x33, 0x99F5) /* <CJK */
-MAP(0x69, 0x34, 0x99F9) /* <CJK */
-MAP(0x69, 0x35, 0x99FD) /* <CJK */
-MAP(0x69, 0x36, 0x99FE) /* <CJK */
-MAP(0x69, 0x37, 0x9A02) /* <CJK */
-MAP(0x69, 0x38, 0x9A03) /* <CJK */
-MAP(0x69, 0x39, 0x9A04) /* <CJK */
-MAP(0x69, 0x3A, 0x9A0B) /* <CJK */
-MAP(0x69, 0x3B, 0x9A0C) /* <CJK */
-MAP(0x69, 0x3C, 0x9A10) /* <CJK */
-MAP(0x69, 0x3D, 0x9A11) /* <CJK */
-MAP(0x69, 0x3E, 0x9A16) /* <CJK */
-MAP(0x69, 0x3F, 0x9A1E) /* <CJK */
-MAP(0x69, 0x40, 0x9A20) /* <CJK */
-MAP(0x69, 0x41, 0x9A22) /* <CJK */
-MAP(0x69, 0x42, 0x9A23) /* <CJK */
-MAP(0x69, 0x43, 0x9A24) /* <CJK */
-MAP(0x69, 0x44, 0x9A27) /* <CJK */
-MAP(0x69, 0x45, 0x9A2D) /* <CJK */
-MAP(0x69, 0x46, 0x9A2E) /* <CJK */
-MAP(0x69, 0x47, 0x9A33) /* <CJK */
-MAP(0x69, 0x48, 0x9A35) /* <CJK */
-MAP(0x69, 0x49, 0x9A36) /* <CJK */
-MAP(0x69, 0x4A, 0x9A38) /* <CJK */
-MAP(0x69, 0x4B, 0x9A47) /* <CJK */
-MAP(0x69, 0x4C, 0x9A41) /* <CJK */
-MAP(0x69, 0x4D, 0x9A44) /* <CJK */
-MAP(0x69, 0x4E, 0x9A4A) /* <CJK */
-MAP(0x69, 0x4F, 0x9A4B) /* <CJK */
-MAP(0x69, 0x50, 0x9A4C) /* <CJK */
-MAP(0x69, 0x51, 0x9A4E) /* <CJK */
-MAP(0x69, 0x52, 0x9A51) /* <CJK */
-MAP(0x69, 0x53, 0x9A54) /* <CJK */
-MAP(0x69, 0x54, 0x9A56) /* <CJK */
-MAP(0x69, 0x55, 0x9A5D) /* <CJK */
-MAP(0x69, 0x56, 0x9AAA) /* <CJK */
-MAP(0x69, 0x57, 0x9AAC) /* <CJK */
-MAP(0x69, 0x58, 0x9AAE) /* <CJK */
-MAP(0x69, 0x59, 0x9AAF) /* <CJK */
-MAP(0x69, 0x5A, 0x9AB2) /* <CJK */
-MAP(0x69, 0x5B, 0x9AB4) /* <CJK */
-MAP(0x69, 0x5C, 0x9AB5) /* <CJK */
-MAP(0x69, 0x5D, 0x9AB6) /* <CJK */
-MAP(0x69, 0x5E, 0x9AB9) /* <CJK */
-MAP(0x69, 0x5F, 0x9ABB) /* <CJK */
-MAP(0x69, 0x60, 0x9ABE) /* <CJK */
-MAP(0x69, 0x61, 0x9ABF) /* <CJK */
-MAP(0x69, 0x62, 0x9AC1) /* <CJK */
-MAP(0x69, 0x63, 0x9AC3) /* <CJK */
-MAP(0x69, 0x64, 0x9AC6) /* <CJK */
-MAP(0x69, 0x65, 0x9AC8) /* <CJK */
-MAP(0x69, 0x66, 0x9ACE) /* <CJK */
-MAP(0x69, 0x67, 0x9AD0) /* <CJK */
-MAP(0x69, 0x68, 0x9AD2) /* <CJK */
-MAP(0x69, 0x69, 0x9AD5) /* <CJK */
-MAP(0x69, 0x6A, 0x9AD6) /* <CJK */
-MAP(0x69, 0x6B, 0x9AD7) /* <CJK */
-MAP(0x69, 0x6C, 0x9ADB) /* <CJK */
-MAP(0x69, 0x6D, 0x9ADC) /* <CJK */
-MAP(0x69, 0x6E, 0x9AE0) /* <CJK */
-MAP(0x69, 0x6F, 0x9AE4) /* <CJK */
-MAP(0x69, 0x70, 0x9AE5) /* <CJK */
-MAP(0x69, 0x71, 0x9AE7) /* <CJK */
-MAP(0x69, 0x72, 0x9AE9) /* <CJK */
-MAP(0x69, 0x73, 0x9AEC) /* <CJK */
-MAP(0x69, 0x74, 0x9AF2) /* <CJK */
-MAP(0x69, 0x75, 0x9AF3) /* <CJK */
-MAP(0x69, 0x76, 0x9AF5) /* <CJK */
-MAP(0x69, 0x77, 0x9AF9) /* <CJK */
-MAP(0x69, 0x78, 0x9AFA) /* <CJK */
-MAP(0x69, 0x79, 0x9AFD) /* <CJK */
-MAP(0x69, 0x7A, 0x9AFF) /* <CJK */
-MAP(0x69, 0x7B, 0x9B00) /* <CJK */
-MAP(0x69, 0x7C, 0x9B01) /* <CJK */
-MAP(0x69, 0x7D, 0x9B02) /* <CJK */
-MAP(0x69, 0x7E, 0x9B03) /* <CJK */
-MAP(0x6A, 0x21, 0x9B04) /* <CJK */
-MAP(0x6A, 0x22, 0x9B05) /* <CJK */
-MAP(0x6A, 0x23, 0x9B08) /* <CJK */
-MAP(0x6A, 0x24, 0x9B09) /* <CJK */
-MAP(0x6A, 0x25, 0x9B0B) /* <CJK */
-MAP(0x6A, 0x26, 0x9B0C) /* <CJK */
-MAP(0x6A, 0x27, 0x9B0D) /* <CJK */
-MAP(0x6A, 0x28, 0x9B0E) /* <CJK */
-MAP(0x6A, 0x29, 0x9B10) /* <CJK */
-MAP(0x6A, 0x2A, 0x9B12) /* <CJK */
-MAP(0x6A, 0x2B, 0x9B16) /* <CJK */
-MAP(0x6A, 0x2C, 0x9B19) /* <CJK */
-MAP(0x6A, 0x2D, 0x9B1B) /* <CJK */
-MAP(0x6A, 0x2E, 0x9B1C) /* <CJK */
-MAP(0x6A, 0x2F, 0x9B20) /* <CJK */
-MAP(0x6A, 0x30, 0x9B26) /* <CJK */
-MAP(0x6A, 0x31, 0x9B2B) /* <CJK */
-MAP(0x6A, 0x32, 0x9B2D) /* <CJK */
-MAP(0x6A, 0x33, 0x9B33) /* <CJK */
-MAP(0x6A, 0x34, 0x9B34) /* <CJK */
-MAP(0x6A, 0x35, 0x9B35) /* <CJK */
-MAP(0x6A, 0x36, 0x9B37) /* <CJK */
-MAP(0x6A, 0x37, 0x9B39) /* <CJK */
-MAP(0x6A, 0x38, 0x9B3A) /* <CJK */
-MAP(0x6A, 0x39, 0x9B3D) /* <CJK */
-MAP(0x6A, 0x3A, 0x9B48) /* <CJK */
-MAP(0x6A, 0x3B, 0x9B4B) /* <CJK */
-MAP(0x6A, 0x3C, 0x9B4C) /* <CJK */
-MAP(0x6A, 0x3D, 0x9B55) /* <CJK */
-MAP(0x6A, 0x3E, 0x9B56) /* <CJK */
-MAP(0x6A, 0x3F, 0x9B57) /* <CJK */
-MAP(0x6A, 0x40, 0x9B5B) /* <CJK */
-MAP(0x6A, 0x41, 0x9B5E) /* <CJK */
-MAP(0x6A, 0x42, 0x9B61) /* <CJK */
-MAP(0x6A, 0x43, 0x9B63) /* <CJK */
-MAP(0x6A, 0x44, 0x9B65) /* <CJK */
-MAP(0x6A, 0x45, 0x9B66) /* <CJK */
-MAP(0x6A, 0x46, 0x9B68) /* <CJK */
-MAP(0x6A, 0x47, 0x9B6A) /* <CJK */
-MAP(0x6A, 0x48, 0x9B6B) /* <CJK */
-MAP(0x6A, 0x49, 0x9B6C) /* <CJK */
-MAP(0x6A, 0x4A, 0x9B6D) /* <CJK */
-MAP(0x6A, 0x4B, 0x9B6E) /* <CJK */
-MAP(0x6A, 0x4C, 0x9B73) /* <CJK */
-MAP(0x6A, 0x4D, 0x9B75) /* <CJK */
-MAP(0x6A, 0x4E, 0x9B77) /* <CJK */
-MAP(0x6A, 0x4F, 0x9B78) /* <CJK */
-MAP(0x6A, 0x50, 0x9B79) /* <CJK */
-MAP(0x6A, 0x51, 0x9B7F) /* <CJK */
-MAP(0x6A, 0x52, 0x9B80) /* <CJK */
-MAP(0x6A, 0x53, 0x9B84) /* <CJK */
-MAP(0x6A, 0x54, 0x9B85) /* <CJK */
-MAP(0x6A, 0x55, 0x9B86) /* <CJK */
-MAP(0x6A, 0x56, 0x9B87) /* <CJK */
-MAP(0x6A, 0x57, 0x9B89) /* <CJK */
-MAP(0x6A, 0x58, 0x9B8A) /* <CJK */
-MAP(0x6A, 0x59, 0x9B8B) /* <CJK */
-MAP(0x6A, 0x5A, 0x9B8D) /* <CJK */
-MAP(0x6A, 0x5B, 0x9B8F) /* <CJK */
-MAP(0x6A, 0x5C, 0x9B90) /* <CJK */
-MAP(0x6A, 0x5D, 0x9B94) /* <CJK */
-MAP(0x6A, 0x5E, 0x9B9A) /* <CJK */
-MAP(0x6A, 0x5F, 0x9B9D) /* <CJK */
-MAP(0x6A, 0x60, 0x9B9E) /* <CJK */
-MAP(0x6A, 0x61, 0x9BA6) /* <CJK */
-MAP(0x6A, 0x62, 0x9BA7) /* <CJK */
-MAP(0x6A, 0x63, 0x9BA9) /* <CJK */
-MAP(0x6A, 0x64, 0x9BAC) /* <CJK */
-MAP(0x6A, 0x65, 0x9BB0) /* <CJK */
-MAP(0x6A, 0x66, 0x9BB1) /* <CJK */
-MAP(0x6A, 0x67, 0x9BB2) /* <CJK */
-MAP(0x6A, 0x68, 0x9BB7) /* <CJK */
-MAP(0x6A, 0x69, 0x9BB8) /* <CJK */
-MAP(0x6A, 0x6A, 0x9BBB) /* <CJK */
-MAP(0x6A, 0x6B, 0x9BBC) /* <CJK */
-MAP(0x6A, 0x6C, 0x9BBE) /* <CJK */
-MAP(0x6A, 0x6D, 0x9BBF) /* <CJK */
-MAP(0x6A, 0x6E, 0x9BC1) /* <CJK */
-MAP(0x6A, 0x6F, 0x9BC7) /* <CJK */
-MAP(0x6A, 0x70, 0x9BC8) /* <CJK */
-MAP(0x6A, 0x71, 0x9BCE) /* <CJK */
-MAP(0x6A, 0x72, 0x9BD0) /* <CJK */
-MAP(0x6A, 0x73, 0x9BD7) /* <CJK */
-MAP(0x6A, 0x74, 0x9BD8) /* <CJK */
-MAP(0x6A, 0x75, 0x9BDD) /* <CJK */
-MAP(0x6A, 0x76, 0x9BDF) /* <CJK */
-MAP(0x6A, 0x77, 0x9BE5) /* <CJK */
-MAP(0x6A, 0x78, 0x9BE7) /* <CJK */
-MAP(0x6A, 0x79, 0x9BEA) /* <CJK */
-MAP(0x6A, 0x7A, 0x9BEB) /* <CJK */
-MAP(0x6A, 0x7B, 0x9BEF) /* <CJK */
-MAP(0x6A, 0x7C, 0x9BF3) /* <CJK */
-MAP(0x6A, 0x7D, 0x9BF7) /* <CJK */
-MAP(0x6A, 0x7E, 0x9BF8) /* <CJK */
-MAP(0x6B, 0x21, 0x9BF9) /* <CJK */
-MAP(0x6B, 0x22, 0x9BFA) /* <CJK */
-MAP(0x6B, 0x23, 0x9BFD) /* <CJK */
-MAP(0x6B, 0x24, 0x9BFF) /* <CJK */
-MAP(0x6B, 0x25, 0x9C00) /* <CJK */
-MAP(0x6B, 0x26, 0x9C02) /* <CJK */
-MAP(0x6B, 0x27, 0x9C0B) /* <CJK */
-MAP(0x6B, 0x28, 0x9C0F) /* <CJK */
-MAP(0x6B, 0x29, 0x9C11) /* <CJK */
-MAP(0x6B, 0x2A, 0x9C16) /* <CJK */
-MAP(0x6B, 0x2B, 0x9C18) /* <CJK */
-MAP(0x6B, 0x2C, 0x9C19) /* <CJK */
-MAP(0x6B, 0x2D, 0x9C1A) /* <CJK */
-MAP(0x6B, 0x2E, 0x9C1C) /* <CJK */
-MAP(0x6B, 0x2F, 0x9C1E) /* <CJK */
-MAP(0x6B, 0x30, 0x9C22) /* <CJK */
-MAP(0x6B, 0x31, 0x9C23) /* <CJK */
-MAP(0x6B, 0x32, 0x9C26) /* <CJK */
-MAP(0x6B, 0x33, 0x9C27) /* <CJK */
-MAP(0x6B, 0x34, 0x9C28) /* <CJK */
-MAP(0x6B, 0x35, 0x9C29) /* <CJK */
-MAP(0x6B, 0x36, 0x9C2A) /* <CJK */
-MAP(0x6B, 0x37, 0x9C31) /* <CJK */
-MAP(0x6B, 0x38, 0x9C35) /* <CJK */
-MAP(0x6B, 0x39, 0x9C36) /* <CJK */
-MAP(0x6B, 0x3A, 0x9C37) /* <CJK */
-MAP(0x6B, 0x3B, 0x9C3D) /* <CJK */
-MAP(0x6B, 0x3C, 0x9C41) /* <CJK */
-MAP(0x6B, 0x3D, 0x9C43) /* <CJK */
-MAP(0x6B, 0x3E, 0x9C44) /* <CJK */
-MAP(0x6B, 0x3F, 0x9C45) /* <CJK */
-MAP(0x6B, 0x40, 0x9C49) /* <CJK */
-MAP(0x6B, 0x41, 0x9C4A) /* <CJK */
-MAP(0x6B, 0x42, 0x9C4E) /* <CJK */
-MAP(0x6B, 0x43, 0x9C4F) /* <CJK */
-MAP(0x6B, 0x44, 0x9C50) /* <CJK */
-MAP(0x6B, 0x45, 0x9C53) /* <CJK */
-MAP(0x6B, 0x46, 0x9C54) /* <CJK */
-MAP(0x6B, 0x47, 0x9C56) /* <CJK */
-MAP(0x6B, 0x48, 0x9C58) /* <CJK */
-MAP(0x6B, 0x49, 0x9C5B) /* <CJK */
-MAP(0x6B, 0x4A, 0x9C5D) /* <CJK */
-MAP(0x6B, 0x4B, 0x9C5E) /* <CJK */
-MAP(0x6B, 0x4C, 0x9C5F) /* <CJK */
-MAP(0x6B, 0x4D, 0x9C63) /* <CJK */
-MAP(0x6B, 0x4E, 0x9C69) /* <CJK */
-MAP(0x6B, 0x4F, 0x9C6A) /* <CJK */
-MAP(0x6B, 0x50, 0x9C5C) /* <CJK */
-MAP(0x6B, 0x51, 0x9C6B) /* <CJK */
-MAP(0x6B, 0x52, 0x9C68) /* <CJK */
-MAP(0x6B, 0x53, 0x9C6E) /* <CJK */
-MAP(0x6B, 0x54, 0x9C70) /* <CJK */
-MAP(0x6B, 0x55, 0x9C72) /* <CJK */
-MAP(0x6B, 0x56, 0x9C75) /* <CJK */
-MAP(0x6B, 0x57, 0x9C77) /* <CJK */
-MAP(0x6B, 0x58, 0x9C7B) /* <CJK */
-MAP(0x6B, 0x59, 0x9CE6) /* <CJK */
-MAP(0x6B, 0x5A, 0x9CF2) /* <CJK */
-MAP(0x6B, 0x5B, 0x9CF7) /* <CJK */
-MAP(0x6B, 0x5C, 0x9CF9) /* <CJK */
-MAP(0x6B, 0x5D, 0x9D0B) /* <CJK */
-MAP(0x6B, 0x5E, 0x9D02) /* <CJK */
-MAP(0x6B, 0x5F, 0x9D11) /* <CJK */
-MAP(0x6B, 0x60, 0x9D17) /* <CJK */
-MAP(0x6B, 0x61, 0x9D18) /* <CJK */
-MAP(0x6B, 0x62, 0x9D1C) /* <CJK */
-MAP(0x6B, 0x63, 0x9D1D) /* <CJK */
-MAP(0x6B, 0x64, 0x9D1E) /* <CJK */
-MAP(0x6B, 0x65, 0x9D2F) /* <CJK */
-MAP(0x6B, 0x66, 0x9D30) /* <CJK */
-MAP(0x6B, 0x67, 0x9D32) /* <CJK */
-MAP(0x6B, 0x68, 0x9D33) /* <CJK */
-MAP(0x6B, 0x69, 0x9D34) /* <CJK */
-MAP(0x6B, 0x6A, 0x9D3A) /* <CJK */
-MAP(0x6B, 0x6B, 0x9D3C) /* <CJK */
-MAP(0x6B, 0x6C, 0x9D45) /* <CJK */
-MAP(0x6B, 0x6D, 0x9D3D) /* <CJK */
-MAP(0x6B, 0x6E, 0x9D42) /* <CJK */
-MAP(0x6B, 0x6F, 0x9D43) /* <CJK */
-MAP(0x6B, 0x70, 0x9D47) /* <CJK */
-MAP(0x6B, 0x71, 0x9D4A) /* <CJK */
-MAP(0x6B, 0x72, 0x9D53) /* <CJK */
-MAP(0x6B, 0x73, 0x9D54) /* <CJK */
-MAP(0x6B, 0x74, 0x9D5F) /* <CJK */
-MAP(0x6B, 0x75, 0x9D63) /* <CJK */
-MAP(0x6B, 0x76, 0x9D62) /* <CJK */
-MAP(0x6B, 0x77, 0x9D65) /* <CJK */
-MAP(0x6B, 0x78, 0x9D69) /* <CJK */
-MAP(0x6B, 0x79, 0x9D6A) /* <CJK */
-MAP(0x6B, 0x7A, 0x9D6B) /* <CJK */
-MAP(0x6B, 0x7B, 0x9D70) /* <CJK */
-MAP(0x6B, 0x7C, 0x9D76) /* <CJK */
-MAP(0x6B, 0x7D, 0x9D77) /* <CJK */
-MAP(0x6B, 0x7E, 0x9D7B) /* <CJK */
-MAP(0x6C, 0x21, 0x9D7C) /* <CJK */
-MAP(0x6C, 0x22, 0x9D7E) /* <CJK */
-MAP(0x6C, 0x23, 0x9D83) /* <CJK */
-MAP(0x6C, 0x24, 0x9D84) /* <CJK */
-MAP(0x6C, 0x25, 0x9D86) /* <CJK */
-MAP(0x6C, 0x26, 0x9D8A) /* <CJK */
-MAP(0x6C, 0x27, 0x9D8D) /* <CJK */
-MAP(0x6C, 0x28, 0x9D8E) /* <CJK */
-MAP(0x6C, 0x29, 0x9D92) /* <CJK */
-MAP(0x6C, 0x2A, 0x9D93) /* <CJK */
-MAP(0x6C, 0x2B, 0x9D95) /* <CJK */
-MAP(0x6C, 0x2C, 0x9D96) /* <CJK */
-MAP(0x6C, 0x2D, 0x9D97) /* <CJK */
-MAP(0x6C, 0x2E, 0x9D98) /* <CJK */
-MAP(0x6C, 0x2F, 0x9DA1) /* <CJK */
-MAP(0x6C, 0x30, 0x9DAA) /* <CJK */
-MAP(0x6C, 0x31, 0x9DAC) /* <CJK */
-MAP(0x6C, 0x32, 0x9DAE) /* <CJK */
-MAP(0x6C, 0x33, 0x9DB1) /* <CJK */
-MAP(0x6C, 0x34, 0x9DB5) /* <CJK */
-MAP(0x6C, 0x35, 0x9DB9) /* <CJK */
-MAP(0x6C, 0x36, 0x9DBC) /* <CJK */
-MAP(0x6C, 0x37, 0x9DBF) /* <CJK */
-MAP(0x6C, 0x38, 0x9DC3) /* <CJK */
-MAP(0x6C, 0x39, 0x9DC7) /* <CJK */
-MAP(0x6C, 0x3A, 0x9DC9) /* <CJK */
-MAP(0x6C, 0x3B, 0x9DCA) /* <CJK */
-MAP(0x6C, 0x3C, 0x9DD4) /* <CJK */
-MAP(0x6C, 0x3D, 0x9DD5) /* <CJK */
-MAP(0x6C, 0x3E, 0x9DD6) /* <CJK */
-MAP(0x6C, 0x3F, 0x9DD7) /* <CJK */
-MAP(0x6C, 0x40, 0x9DDA) /* <CJK */
-MAP(0x6C, 0x41, 0x9DDE) /* <CJK */
-MAP(0x6C, 0x42, 0x9DDF) /* <CJK */
-MAP(0x6C, 0x43, 0x9DE0) /* <CJK */
-MAP(0x6C, 0x44, 0x9DE5) /* <CJK */
-MAP(0x6C, 0x45, 0x9DE7) /* <CJK */
-MAP(0x6C, 0x46, 0x9DE9) /* <CJK */
-MAP(0x6C, 0x47, 0x9DEB) /* <CJK */
-MAP(0x6C, 0x48, 0x9DEE) /* <CJK */
-MAP(0x6C, 0x49, 0x9DF0) /* <CJK */
-MAP(0x6C, 0x4A, 0x9DF3) /* <CJK */
-MAP(0x6C, 0x4B, 0x9DF4) /* <CJK */
-MAP(0x6C, 0x4C, 0x9DFE) /* <CJK */
-MAP(0x6C, 0x4D, 0x9E0A) /* <CJK */
-MAP(0x6C, 0x4E, 0x9E02) /* <CJK */
-MAP(0x6C, 0x4F, 0x9E07) /* <CJK */
-MAP(0x6C, 0x50, 0x9E0E) /* <CJK */
-MAP(0x6C, 0x51, 0x9E10) /* <CJK */
-MAP(0x6C, 0x52, 0x9E11) /* <CJK */
-MAP(0x6C, 0x53, 0x9E12) /* <CJK */
-MAP(0x6C, 0x54, 0x9E15) /* <CJK */
-MAP(0x6C, 0x55, 0x9E16) /* <CJK */
-MAP(0x6C, 0x56, 0x9E19) /* <CJK */
-MAP(0x6C, 0x57, 0x9E1C) /* <CJK */
-MAP(0x6C, 0x58, 0x9E1D) /* <CJK */
-MAP(0x6C, 0x59, 0x9E7A) /* <CJK */
-MAP(0x6C, 0x5A, 0x9E7B) /* <CJK */
-MAP(0x6C, 0x5B, 0x9E7C) /* <CJK */
-MAP(0x6C, 0x5C, 0x9E80) /* <CJK */
-MAP(0x6C, 0x5D, 0x9E82) /* <CJK */
-MAP(0x6C, 0x5E, 0x9E83) /* <CJK */
-MAP(0x6C, 0x5F, 0x9E84) /* <CJK */
-MAP(0x6C, 0x60, 0x9E85) /* <CJK */
-MAP(0x6C, 0x61, 0x9E87) /* <CJK */
-MAP(0x6C, 0x62, 0x9E8E) /* <CJK */
-MAP(0x6C, 0x63, 0x9E8F) /* <CJK */
-MAP(0x6C, 0x64, 0x9E96) /* <CJK */
-MAP(0x6C, 0x65, 0x9E98) /* <CJK */
-MAP(0x6C, 0x66, 0x9E9B) /* <CJK */
-MAP(0x6C, 0x67, 0x9E9E) /* <CJK */
-MAP(0x6C, 0x68, 0x9EA4) /* <CJK */
-MAP(0x6C, 0x69, 0x9EA8) /* <CJK */
-MAP(0x6C, 0x6A, 0x9EAC) /* <CJK */
-MAP(0x6C, 0x6B, 0x9EAE) /* <CJK */
-MAP(0x6C, 0x6C, 0x9EAF) /* <CJK */
-MAP(0x6C, 0x6D, 0x9EB0) /* <CJK */
-MAP(0x6C, 0x6E, 0x9EB3) /* <CJK */
-MAP(0x6C, 0x6F, 0x9EB4) /* <CJK */
-MAP(0x6C, 0x70, 0x9EB5) /* <CJK */
-MAP(0x6C, 0x71, 0x9EC6) /* <CJK */
-MAP(0x6C, 0x72, 0x9EC8) /* <CJK */
-MAP(0x6C, 0x73, 0x9ECB) /* <CJK */
-MAP(0x6C, 0x74, 0x9ED5) /* <CJK */
-MAP(0x6C, 0x75, 0x9EDF) /* <CJK */
-MAP(0x6C, 0x76, 0x9EE4) /* <CJK */
-MAP(0x6C, 0x77, 0x9EE7) /* <CJK */
-MAP(0x6C, 0x78, 0x9EEC) /* <CJK */
-MAP(0x6C, 0x79, 0x9EED) /* <CJK */
-MAP(0x6C, 0x7A, 0x9EEE) /* <CJK */
-MAP(0x6C, 0x7B, 0x9EF0) /* <CJK */
-MAP(0x6C, 0x7C, 0x9EF1) /* <CJK */
-MAP(0x6C, 0x7D, 0x9EF2) /* <CJK */
-MAP(0x6C, 0x7E, 0x9EF5) /* <CJK */
-MAP(0x6D, 0x21, 0x9EF8) /* <CJK */
-MAP(0x6D, 0x22, 0x9EFF) /* <CJK */
-MAP(0x6D, 0x23, 0x9F02) /* <CJK */
-MAP(0x6D, 0x24, 0x9F03) /* <CJK */
-MAP(0x6D, 0x25, 0x9F09) /* <CJK */
-MAP(0x6D, 0x26, 0x9F0F) /* <CJK */
-MAP(0x6D, 0x27, 0x9F10) /* <CJK */
-MAP(0x6D, 0x28, 0x9F11) /* <CJK */
-MAP(0x6D, 0x29, 0x9F12) /* <CJK */
-MAP(0x6D, 0x2A, 0x9F14) /* <CJK */
-MAP(0x6D, 0x2B, 0x9F16) /* <CJK */
-MAP(0x6D, 0x2C, 0x9F17) /* <CJK */
-MAP(0x6D, 0x2D, 0x9F19) /* <CJK */
-MAP(0x6D, 0x2E, 0x9F1A) /* <CJK */
-MAP(0x6D, 0x2F, 0x9F1B) /* <CJK */
-MAP(0x6D, 0x30, 0x9F1F) /* <CJK */
-MAP(0x6D, 0x31, 0x9F22) /* <CJK */
-MAP(0x6D, 0x32, 0x9F26) /* <CJK */
-MAP(0x6D, 0x33, 0x9F2A) /* <CJK */
-MAP(0x6D, 0x34, 0x9F2B) /* <CJK */
-MAP(0x6D, 0x35, 0x9F2F) /* <CJK */
-MAP(0x6D, 0x36, 0x9F31) /* <CJK */
-MAP(0x6D, 0x37, 0x9F32) /* <CJK */
-MAP(0x6D, 0x38, 0x9F34) /* <CJK */
-MAP(0x6D, 0x39, 0x9F37) /* <CJK */
-MAP(0x6D, 0x3A, 0x9F39) /* <CJK */
-MAP(0x6D, 0x3B, 0x9F3A) /* <CJK */
-MAP(0x6D, 0x3C, 0x9F3C) /* <CJK */
-MAP(0x6D, 0x3D, 0x9F3D) /* <CJK */
-MAP(0x6D, 0x3E, 0x9F3F) /* <CJK */
-MAP(0x6D, 0x3F, 0x9F41) /* <CJK */
-MAP(0x6D, 0x40, 0x9F43) /* <CJK */
-MAP(0x6D, 0x41, 0x9F44) /* <CJK */
-MAP(0x6D, 0x42, 0x9F45) /* <CJK */
-MAP(0x6D, 0x43, 0x9F46) /* <CJK */
-MAP(0x6D, 0x44, 0x9F47) /* <CJK */
-MAP(0x6D, 0x45, 0x9F53) /* <CJK */
-MAP(0x6D, 0x46, 0x9F55) /* <CJK */
-MAP(0x6D, 0x47, 0x9F56) /* <CJK */
-MAP(0x6D, 0x48, 0x9F57) /* <CJK */
-MAP(0x6D, 0x49, 0x9F58) /* <CJK */
-MAP(0x6D, 0x4A, 0x9F5A) /* <CJK */
-MAP(0x6D, 0x4B, 0x9F5D) /* <CJK */
-MAP(0x6D, 0x4C, 0x9F5E) /* <CJK */
-MAP(0x6D, 0x4D, 0x9F68) /* <CJK */
-MAP(0x6D, 0x4E, 0x9F69) /* <CJK */
-MAP(0x6D, 0x4F, 0x9F6D) /* <CJK */
-MAP(0x6D, 0x50, 0x9F6E) /* <CJK */
-MAP(0x6D, 0x51, 0x9F6F) /* <CJK */
-MAP(0x6D, 0x52, 0x9F70) /* <CJK */
-MAP(0x6D, 0x53, 0x9F71) /* <CJK */
-MAP(0x6D, 0x54, 0x9F73) /* <CJK */
-MAP(0x6D, 0x55, 0x9F75) /* <CJK */
-MAP(0x6D, 0x56, 0x9F7A) /* <CJK */
-MAP(0x6D, 0x57, 0x9F7D) /* <CJK */
-MAP(0x6D, 0x58, 0x9F8F) /* <CJK */
-MAP(0x6D, 0x59, 0x9F90) /* <CJK */
-MAP(0x6D, 0x5A, 0x9F91) /* <CJK */
-MAP(0x6D, 0x5B, 0x9F92) /* <CJK */
-MAP(0x6D, 0x5C, 0x9F94) /* <CJK */
-MAP(0x6D, 0x5D, 0x9F96) /* <CJK */
-MAP(0x6D, 0x5E, 0x9F97) /* <CJK */
-MAP(0x6D, 0x5F, 0x9F9E) /* <CJK */
-MAP(0x6D, 0x60, 0x9FA1) /* <CJK */
-MAP(0x6D, 0x61, 0x9FA2) /* <CJK */
-MAP(0x6D, 0x62, 0x9FA3) /* <CJK */
-MAP(0x6D, 0x63, 0x9FA5) /* <CJK */
+/* This file is automatically generated from Unicode tables */
+MAP(0x22, 0x2F, 0x02D8) /* BREVE */
+MAP(0x22, 0x30, 0x02C7) /* CARON (Mandarin Chinese third tone) */
+MAP(0x22, 0x31, 0x00B8) /* CEDILLA */
+MAP(0x22, 0x32, 0x02D9) /* DOT ABOVE (Mandarin Chinese light tone) */
+MAP(0x22, 0x33, 0x02DD) /* DOUBLE ACUTE ACCENT */
+MAP(0x22, 0x34, 0x00AF) /* MACRON */
+MAP(0x22, 0x35, 0x02DB) /* OGONEK */
+MAP(0x22, 0x36, 0x02DA) /* RING ABOVE */
+MAP(0x22, 0x37, 0x007E) /* TILDE */
+MAP(0x22, 0x38, 0x0384) /* GREEK TONOS */
+MAP(0x22, 0x39, 0x0385) /* GREEK DIALYTIKA TONOS */
+MAP(0x22, 0x42, 0x00A1) /* INVERTED EXCLAMATION MARK */
+MAP(0x22, 0x43, 0x00A6) /* BROKEN BAR */
+MAP(0x22, 0x44, 0x00BF) /* INVERTED QUESTION MARK */
+MAP(0x22, 0x6B, 0x00BA) /* MASCULINE ORDINAL INDICATOR */
+MAP(0x22, 0x6C, 0x00AA) /* FEMININE ORDINAL INDICATOR */
+MAP(0x22, 0x6D, 0x00A9) /* COPYRIGHT SIGN */
+MAP(0x22, 0x6E, 0x00AE) /* REGISTERED SIGN */
+MAP(0x22, 0x6F, 0x2122) /* TRADE MARK SIGN */
+MAP(0x22, 0x70, 0x00A4) /* CURRENCY SIGN */
+MAP(0x22, 0x71, 0x2116) /* NUMERO SIGN */
+MAP(0x26, 0x61, 0x0386) /* GREEK CAPITAL LETTER ALPHA WITH TONOS */
+MAP(0x26, 0x62, 0x0388) /* GREEK CAPITAL LETTER EPSILON WITH TONOS */
+MAP(0x26, 0x63, 0x0389) /* GREEK CAPITAL LETTER ETA WITH TONOS */
+MAP(0x26, 0x64, 0x038A) /* GREEK CAPITAL LETTER IOTA WITH TONOS */
+MAP(0x26, 0x65, 0x03AA) /* GREEK CAPITAL LETTER IOTA WITH DIALYTIKA */
+MAP(0x26, 0x67, 0x038C) /* GREEK CAPITAL LETTER OMICRON WITH TONOS */
+MAP(0x26, 0x69, 0x038E) /* GREEK CAPITAL LETTER UPSILON WITH TONOS */
+MAP(0x26, 0x6A, 0x03AB) /* GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA */
+MAP(0x26, 0x6C, 0x038F) /* GREEK CAPITAL LETTER OMEGA WITH TONOS */
+MAP(0x26, 0x71, 0x03AC) /* GREEK SMALL LETTER ALPHA WITH TONOS */
+MAP(0x26, 0x72, 0x03AD) /* GREEK SMALL LETTER EPSILON WITH TONOS */
+MAP(0x26, 0x73, 0x03AE) /* GREEK SMALL LETTER ETA WITH TONOS */
+MAP(0x26, 0x74, 0x03AF) /* GREEK SMALL LETTER IOTA WITH TONOS */
+MAP(0x26, 0x75, 0x03CA) /* GREEK SMALL LETTER IOTA WITH DIALYTIKA */
+MAP(0x26, 0x76, 0x0390) /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */
+MAP(0x26, 0x77, 0x03CC) /* GREEK SMALL LETTER OMICRON WITH TONOS */
+MAP(0x26, 0x78, 0x03C2) /* GREEK SMALL LETTER FINAL SIGMA */
+MAP(0x26, 0x79, 0x03CD) /* GREEK SMALL LETTER UPSILON WITH TONOS */
+MAP(0x26, 0x7A, 0x03CB) /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA */
+MAP(0x26, 0x7B, 0x03B0) /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS */
+MAP(0x26, 0x7C, 0x03CE) /* GREEK SMALL LETTER OMEGA WITH TONOS */
+MAP(0x27, 0x42, 0x0402) /* CYRILLIC CAPITAL LETTER DJE */
+MAP(0x27, 0x43, 0x0403) /* CYRILLIC CAPITAL LETTER GJE */
+MAP(0x27, 0x44, 0x0404) /* CYRILLIC CAPITAL LETTER UKRAINIAN IE */
+MAP(0x27, 0x45, 0x0405) /* CYRILLIC CAPITAL LETTER DZE */
+MAP(0x27, 0x46, 0x0406) /* CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I */
+MAP(0x27, 0x47, 0x0407) /* CYRILLIC CAPITAL LETTER YI */
+MAP(0x27, 0x48, 0x0408) /* CYRILLIC CAPITAL LETTER JE */
+MAP(0x27, 0x49, 0x0409) /* CYRILLIC CAPITAL LETTER LJE */
+MAP(0x27, 0x4A, 0x040A) /* CYRILLIC CAPITAL LETTER NJE */
+MAP(0x27, 0x4B, 0x040B) /* CYRILLIC CAPITAL LETTER TSHE */
+MAP(0x27, 0x4C, 0x040C) /* CYRILLIC CAPITAL LETTER KJE */
+MAP(0x27, 0x4D, 0x040E) /* CYRILLIC CAPITAL LETTER SHORT U */
+MAP(0x27, 0x4E, 0x040F) /* CYRILLIC CAPITAL LETTER DZHE */
+MAP(0x27, 0x72, 0x0452) /* CYRILLIC SMALL LETTER DJE */
+MAP(0x27, 0x73, 0x0453) /* CYRILLIC SMALL LETTER GJE */
+MAP(0x27, 0x74, 0x0454) /* CYRILLIC SMALL LETTER UKRAINIAN IE */
+MAP(0x27, 0x75, 0x0455) /* CYRILLIC SMALL LETTER DZE */
+MAP(0x27, 0x76, 0x0456) /* CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I */
+MAP(0x27, 0x77, 0x0457) /* CYRILLIC SMALL LETTER YI */
+MAP(0x27, 0x78, 0x0458) /* CYRILLIC SMALL LETTER JE */
+MAP(0x27, 0x79, 0x0459) /* CYRILLIC SMALL LETTER LJE */
+MAP(0x27, 0x7A, 0x045A) /* CYRILLIC SMALL LETTER NJE */
+MAP(0x27, 0x7B, 0x045B) /* CYRILLIC SMALL LETTER TSHE */
+MAP(0x27, 0x7C, 0x045C) /* CYRILLIC SMALL LETTER KJE */
+MAP(0x27, 0x7D, 0x045E) /* CYRILLIC SMALL LETTER SHORT U */
+MAP(0x27, 0x7E, 0x045F) /* CYRILLIC SMALL LETTER DZHE */
+MAP(0x29, 0x21, 0x00C6) /* LATIN CAPITAL LIGATURE AE */
+MAP(0x29, 0x22, 0x0110) /* LATIN CAPITAL LETTER D WITH STROKE */
+MAP(0x29, 0x24, 0x0126) /* LATIN CAPITAL LETTER H WITH STROKE */
+MAP(0x29, 0x26, 0x0132) /* LATIN CAPITAL LIGATURE IJ */
+MAP(0x29, 0x28, 0x0141) /* LATIN CAPITAL LETTER L WITH STROKE */
+MAP(0x29, 0x29, 0x013F) /* LATIN CAPITAL LETTER L WITH MIDDLE DOT */
+MAP(0x29, 0x2B, 0x014A) /* LATIN CAPITAL LETTER ENG */
+MAP(0x29, 0x2C, 0x00D8) /* LATIN CAPITAL LETTER O WITH STROKE */
+MAP(0x29, 0x2D, 0x0152) /* LATIN CAPITAL LIGATURE OE */
+MAP(0x29, 0x2F, 0x0166) /* LATIN CAPITAL LETTER T WITH STROKE */
+MAP(0x29, 0x30, 0x00DE) /* LATIN CAPITAL LETTER THORN */
+MAP(0x29, 0x41, 0x00E6) /* LATIN SMALL LIGATURE AE */
+MAP(0x29, 0x42, 0x0111) /* LATIN SMALL LETTER D WITH STROKE */
+MAP(0x29, 0x43, 0x00F0) /* LATIN SMALL LETTER ETH */
+MAP(0x29, 0x44, 0x0127) /* LATIN SMALL LETTER H WITH STROKE */
+MAP(0x29, 0x45, 0x0131) /* LATIN SMALL LETTER DOTLESS I */
+MAP(0x29, 0x46, 0x0133) /* LATIN SMALL LIGATURE IJ */
+MAP(0x29, 0x47, 0x0138) /* LATIN SMALL LETTER KRA */
+MAP(0x29, 0x48, 0x0142) /* LATIN SMALL LETTER L WITH STROKE */
+MAP(0x29, 0x49, 0x0140) /* LATIN SMALL LETTER L WITH MIDDLE DOT */
+MAP(0x29, 0x4A, 0x0149) /* LATIN SMALL LETTER N PRECEDED BY APOSTROPHE */
+MAP(0x29, 0x4B, 0x014B) /* LATIN SMALL LETTER ENG */
+MAP(0x29, 0x4C, 0x00F8) /* LATIN SMALL LETTER O WITH STROKE */
+MAP(0x29, 0x4D, 0x0153) /* LATIN SMALL LIGATURE OE */
+MAP(0x29, 0x4E, 0x00DF) /* LATIN SMALL LETTER SHARP S */
+MAP(0x29, 0x4F, 0x0167) /* LATIN SMALL LETTER T WITH STROKE */
+MAP(0x29, 0x50, 0x00FE) /* LATIN SMALL LETTER THORN */
+MAP(0x2A, 0x21, 0x00C1) /* LATIN CAPITAL LETTER A WITH ACUTE */
+MAP(0x2A, 0x22, 0x00C0) /* LATIN CAPITAL LETTER A WITH GRAVE */
+MAP(0x2A, 0x23, 0x00C4) /* LATIN CAPITAL LETTER A WITH DIAERESIS */
+MAP(0x2A, 0x24, 0x00C2) /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX */
+MAP(0x2A, 0x25, 0x0102) /* LATIN CAPITAL LETTER A WITH BREVE */
+MAP(0x2A, 0x26, 0x01CD) /* LATIN CAPITAL LETTER A WITH CARON */
+MAP(0x2A, 0x27, 0x0100) /* LATIN CAPITAL LETTER A WITH MACRON */
+MAP(0x2A, 0x28, 0x0104) /* LATIN CAPITAL LETTER A WITH OGONEK */
+MAP(0x2A, 0x29, 0x00C5) /* LATIN CAPITAL LETTER A WITH RING ABOVE */
+MAP(0x2A, 0x2A, 0x00C3) /* LATIN CAPITAL LETTER A WITH TILDE */
+MAP(0x2A, 0x2B, 0x0106) /* LATIN CAPITAL LETTER C WITH ACUTE */
+MAP(0x2A, 0x2C, 0x0108) /* LATIN CAPITAL LETTER C WITH CIRCUMFLEX */
+MAP(0x2A, 0x2D, 0x010C) /* LATIN CAPITAL LETTER C WITH CARON */
+MAP(0x2A, 0x2E, 0x00C7) /* LATIN CAPITAL LETTER C WITH CEDILLA */
+MAP(0x2A, 0x2F, 0x010A) /* LATIN CAPITAL LETTER C WITH DOT ABOVE */
+MAP(0x2A, 0x30, 0x010E) /* LATIN CAPITAL LETTER D WITH CARON */
+MAP(0x2A, 0x31, 0x00C9) /* LATIN CAPITAL LETTER E WITH ACUTE */
+MAP(0x2A, 0x32, 0x00C8) /* LATIN CAPITAL LETTER E WITH GRAVE */
+MAP(0x2A, 0x33, 0x00CB) /* LATIN CAPITAL LETTER E WITH DIAERESIS */
+MAP(0x2A, 0x34, 0x00CA) /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX */
+MAP(0x2A, 0x35, 0x011A) /* LATIN CAPITAL LETTER E WITH CARON */
+MAP(0x2A, 0x36, 0x0116) /* LATIN CAPITAL LETTER E WITH DOT ABOVE */
+MAP(0x2A, 0x37, 0x0112) /* LATIN CAPITAL LETTER E WITH MACRON */
+MAP(0x2A, 0x38, 0x0118) /* LATIN CAPITAL LETTER E WITH OGONEK */
+MAP(0x2A, 0x3A, 0x011C) /* LATIN CAPITAL LETTER G WITH CIRCUMFLEX */
+MAP(0x2A, 0x3B, 0x011E) /* LATIN CAPITAL LETTER G WITH BREVE */
+MAP(0x2A, 0x3C, 0x0122) /* LATIN CAPITAL LETTER G WITH CEDILLA */
+MAP(0x2A, 0x3D, 0x0120) /* LATIN CAPITAL LETTER G WITH DOT ABOVE */
+MAP(0x2A, 0x3E, 0x0124) /* LATIN CAPITAL LETTER H WITH CIRCUMFLEX */
+MAP(0x2A, 0x3F, 0x00CD) /* LATIN CAPITAL LETTER I WITH ACUTE */
+MAP(0x2A, 0x40, 0x00CC) /* LATIN CAPITAL LETTER I WITH GRAVE */
+MAP(0x2A, 0x41, 0x00CF) /* LATIN CAPITAL LETTER I WITH DIAERESIS */
+MAP(0x2A, 0x42, 0x00CE) /* LATIN CAPITAL LETTER I WITH CIRCUMFLEX */
+MAP(0x2A, 0x43, 0x01CF) /* LATIN CAPITAL LETTER I WITH CARON */
+MAP(0x2A, 0x44, 0x0130) /* LATIN CAPITAL LETTER I WITH DOT ABOVE */
+MAP(0x2A, 0x45, 0x012A) /* LATIN CAPITAL LETTER I WITH MACRON */
+MAP(0x2A, 0x46, 0x012E) /* LATIN CAPITAL LETTER I WITH OGONEK */
+MAP(0x2A, 0x47, 0x0128) /* LATIN CAPITAL LETTER I WITH TILDE */
+MAP(0x2A, 0x48, 0x0134) /* LATIN CAPITAL LETTER J WITH CIRCUMFLEX */
+MAP(0x2A, 0x49, 0x0136) /* LATIN CAPITAL LETTER K WITH CEDILLA */
+MAP(0x2A, 0x4A, 0x0139) /* LATIN CAPITAL LETTER L WITH ACUTE */
+MAP(0x2A, 0x4B, 0x013D) /* LATIN CAPITAL LETTER L WITH CARON */
+MAP(0x2A, 0x4C, 0x013B) /* LATIN CAPITAL LETTER L WITH CEDILLA */
+MAP(0x2A, 0x4D, 0x0143) /* LATIN CAPITAL LETTER N WITH ACUTE */
+MAP(0x2A, 0x4E, 0x0147) /* LATIN CAPITAL LETTER N WITH CARON */
+MAP(0x2A, 0x4F, 0x0145) /* LATIN CAPITAL LETTER N WITH CEDILLA */
+MAP(0x2A, 0x50, 0x00D1) /* LATIN CAPITAL LETTER N WITH TILDE */
+MAP(0x2A, 0x51, 0x00D3) /* LATIN CAPITAL LETTER O WITH ACUTE */
+MAP(0x2A, 0x52, 0x00D2) /* LATIN CAPITAL LETTER O WITH GRAVE */
+MAP(0x2A, 0x53, 0x00D6) /* LATIN CAPITAL LETTER O WITH DIAERESIS */
+MAP(0x2A, 0x54, 0x00D4) /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX */
+MAP(0x2A, 0x55, 0x01D1) /* LATIN CAPITAL LETTER O WITH CARON */
+MAP(0x2A, 0x56, 0x0150) /* LATIN CAPITAL LETTER O WITH DOUBLE ACUTE */
+MAP(0x2A, 0x57, 0x014C) /* LATIN CAPITAL LETTER O WITH MACRON */
+MAP(0x2A, 0x58, 0x00D5) /* LATIN CAPITAL LETTER O WITH TILDE */
+MAP(0x2A, 0x59, 0x0154) /* LATIN CAPITAL LETTER R WITH ACUTE */
+MAP(0x2A, 0x5A, 0x0158) /* LATIN CAPITAL LETTER R WITH CARON */
+MAP(0x2A, 0x5B, 0x0156) /* LATIN CAPITAL LETTER R WITH CEDILLA */
+MAP(0x2A, 0x5C, 0x015A) /* LATIN CAPITAL LETTER S WITH ACUTE */
+MAP(0x2A, 0x5D, 0x015C) /* LATIN CAPITAL LETTER S WITH CIRCUMFLEX */
+MAP(0x2A, 0x5E, 0x0160) /* LATIN CAPITAL LETTER S WITH CARON */
+MAP(0x2A, 0x5F, 0x015E) /* LATIN CAPITAL LETTER S WITH CEDILLA */
+MAP(0x2A, 0x60, 0x0164) /* LATIN CAPITAL LETTER T WITH CARON */
+MAP(0x2A, 0x61, 0x0162) /* LATIN CAPITAL LETTER T WITH CEDILLA */
+MAP(0x2A, 0x62, 0x00DA) /* LATIN CAPITAL LETTER U WITH ACUTE */
+MAP(0x2A, 0x63, 0x00D9) /* LATIN CAPITAL LETTER U WITH GRAVE */
+MAP(0x2A, 0x64, 0x00DC) /* LATIN CAPITAL LETTER U WITH DIAERESIS */
+MAP(0x2A, 0x65, 0x00DB) /* LATIN CAPITAL LETTER U WITH CIRCUMFLEX */
+MAP(0x2A, 0x66, 0x016C) /* LATIN CAPITAL LETTER U WITH BREVE */
+MAP(0x2A, 0x67, 0x01D3) /* LATIN CAPITAL LETTER U WITH CARON */
+MAP(0x2A, 0x68, 0x0170) /* LATIN CAPITAL LETTER U WITH DOUBLE ACUTE */
+MAP(0x2A, 0x69, 0x016A) /* LATIN CAPITAL LETTER U WITH MACRON */
+MAP(0x2A, 0x6A, 0x0172) /* LATIN CAPITAL LETTER U WITH OGONEK */
+MAP(0x2A, 0x6B, 0x016E) /* LATIN CAPITAL LETTER U WITH RING ABOVE */
+MAP(0x2A, 0x6C, 0x0168) /* LATIN CAPITAL LETTER U WITH TILDE */
+MAP(0x2A, 0x6D, 0x01D7) /* LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE */
+MAP(0x2A, 0x6E, 0x01DB) /* LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE */
+MAP(0x2A, 0x6F, 0x01D9) /* LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON */
+MAP(0x2A, 0x70, 0x01D5) /* LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON */
+MAP(0x2A, 0x71, 0x0174) /* LATIN CAPITAL LETTER W WITH CIRCUMFLEX */
+MAP(0x2A, 0x72, 0x00DD) /* LATIN CAPITAL LETTER Y WITH ACUTE */
+MAP(0x2A, 0x73, 0x0178) /* LATIN CAPITAL LETTER Y WITH DIAERESIS */
+MAP(0x2A, 0x74, 0x0176) /* LATIN CAPITAL LETTER Y WITH CIRCUMFLEX */
+MAP(0x2A, 0x75, 0x0179) /* LATIN CAPITAL LETTER Z WITH ACUTE */
+MAP(0x2A, 0x76, 0x017D) /* LATIN CAPITAL LETTER Z WITH CARON */
+MAP(0x2A, 0x77, 0x017B) /* LATIN CAPITAL LETTER Z WITH DOT ABOVE */
+MAP(0x2B, 0x21, 0x00E1) /* LATIN SMALL LETTER A WITH ACUTE */
+MAP(0x2B, 0x22, 0x00E0) /* LATIN SMALL LETTER A WITH GRAVE */
+MAP(0x2B, 0x23, 0x00E4) /* LATIN SMALL LETTER A WITH DIAERESIS */
+MAP(0x2B, 0x24, 0x00E2) /* LATIN SMALL LETTER A WITH CIRCUMFLEX */
+MAP(0x2B, 0x25, 0x0103) /* LATIN SMALL LETTER A WITH BREVE */
+MAP(0x2B, 0x26, 0x01CE) /* LATIN SMALL LETTER A WITH CARON */
+MAP(0x2B, 0x27, 0x0101) /* LATIN SMALL LETTER A WITH MACRON */
+MAP(0x2B, 0x28, 0x0105) /* LATIN SMALL LETTER A WITH OGONEK */
+MAP(0x2B, 0x29, 0x00E5) /* LATIN SMALL LETTER A WITH RING ABOVE */
+MAP(0x2B, 0x2A, 0x00E3) /* LATIN SMALL LETTER A WITH TILDE */
+MAP(0x2B, 0x2B, 0x0107) /* LATIN SMALL LETTER C WITH ACUTE */
+MAP(0x2B, 0x2C, 0x0109) /* LATIN SMALL LETTER C WITH CIRCUMFLEX */
+MAP(0x2B, 0x2D, 0x010D) /* LATIN SMALL LETTER C WITH CARON */
+MAP(0x2B, 0x2E, 0x00E7) /* LATIN SMALL LETTER C WITH CEDILLA */
+MAP(0x2B, 0x2F, 0x010B) /* LATIN SMALL LETTER C WITH DOT ABOVE */
+MAP(0x2B, 0x30, 0x010F) /* LATIN SMALL LETTER D WITH CARON */
+MAP(0x2B, 0x31, 0x00E9) /* LATIN SMALL LETTER E WITH ACUTE */
+MAP(0x2B, 0x32, 0x00E8) /* LATIN SMALL LETTER E WITH GRAVE */
+MAP(0x2B, 0x33, 0x00EB) /* LATIN SMALL LETTER E WITH DIAERESIS */
+MAP(0x2B, 0x34, 0x00EA) /* LATIN SMALL LETTER E WITH CIRCUMFLEX */
+MAP(0x2B, 0x35, 0x011B) /* LATIN SMALL LETTER E WITH CARON */
+MAP(0x2B, 0x36, 0x0117) /* LATIN SMALL LETTER E WITH DOT ABOVE */
+MAP(0x2B, 0x37, 0x0113) /* LATIN SMALL LETTER E WITH MACRON */
+MAP(0x2B, 0x38, 0x0119) /* LATIN SMALL LETTER E WITH OGONEK */
+MAP(0x2B, 0x39, 0x01F5) /* LATIN SMALL LETTER G WITH ACUTE */
+MAP(0x2B, 0x3A, 0x011D) /* LATIN SMALL LETTER G WITH CIRCUMFLEX */
+MAP(0x2B, 0x3B, 0x011F) /* LATIN SMALL LETTER G WITH BREVE */
+MAP(0x2B, 0x3D, 0x0121) /* LATIN SMALL LETTER G WITH DOT ABOVE */
+MAP(0x2B, 0x3E, 0x0125) /* LATIN SMALL LETTER H WITH CIRCUMFLEX */
+MAP(0x2B, 0x3F, 0x00ED) /* LATIN SMALL LETTER I WITH ACUTE */
+MAP(0x2B, 0x40, 0x00EC) /* LATIN SMALL LETTER I WITH GRAVE */
+MAP(0x2B, 0x41, 0x00EF) /* LATIN SMALL LETTER I WITH DIAERESIS */
+MAP(0x2B, 0x42, 0x00EE) /* LATIN SMALL LETTER I WITH CIRCUMFLEX */
+MAP(0x2B, 0x43, 0x01D0) /* LATIN SMALL LETTER I WITH CARON */
+MAP(0x2B, 0x45, 0x012B) /* LATIN SMALL LETTER I WITH MACRON */
+MAP(0x2B, 0x46, 0x012F) /* LATIN SMALL LETTER I WITH OGONEK */
+MAP(0x2B, 0x47, 0x0129) /* LATIN SMALL LETTER I WITH TILDE */
+MAP(0x2B, 0x48, 0x0135) /* LATIN SMALL LETTER J WITH CIRCUMFLEX */
+MAP(0x2B, 0x49, 0x0137) /* LATIN SMALL LETTER K WITH CEDILLA */
+MAP(0x2B, 0x4A, 0x013A) /* LATIN SMALL LETTER L WITH ACUTE */
+MAP(0x2B, 0x4B, 0x013E) /* LATIN SMALL LETTER L WITH CARON */
+MAP(0x2B, 0x4C, 0x013C) /* LATIN SMALL LETTER L WITH CEDILLA */
+MAP(0x2B, 0x4D, 0x0144) /* LATIN SMALL LETTER N WITH ACUTE */
+MAP(0x2B, 0x4E, 0x0148) /* LATIN SMALL LETTER N WITH CARON */
+MAP(0x2B, 0x4F, 0x0146) /* LATIN SMALL LETTER N WITH CEDILLA */
+MAP(0x2B, 0x50, 0x00F1) /* LATIN SMALL LETTER N WITH TILDE */
+MAP(0x2B, 0x51, 0x00F3) /* LATIN SMALL LETTER O WITH ACUTE */
+MAP(0x2B, 0x52, 0x00F2) /* LATIN SMALL LETTER O WITH GRAVE */
+MAP(0x2B, 0x53, 0x00F6) /* LATIN SMALL LETTER O WITH DIAERESIS */
+MAP(0x2B, 0x54, 0x00F4) /* LATIN SMALL LETTER O WITH CIRCUMFLEX */
+MAP(0x2B, 0x55, 0x01D2) /* LATIN SMALL LETTER O WITH CARON */
+MAP(0x2B, 0x56, 0x0151) /* LATIN SMALL LETTER O WITH DOUBLE ACUTE */
+MAP(0x2B, 0x57, 0x014D) /* LATIN SMALL LETTER O WITH MACRON */
+MAP(0x2B, 0x58, 0x00F5) /* LATIN SMALL LETTER O WITH TILDE */
+MAP(0x2B, 0x59, 0x0155) /* LATIN SMALL LETTER R WITH ACUTE */
+MAP(0x2B, 0x5A, 0x0159) /* LATIN SMALL LETTER R WITH CARON */
+MAP(0x2B, 0x5B, 0x0157) /* LATIN SMALL LETTER R WITH CEDILLA */
+MAP(0x2B, 0x5C, 0x015B) /* LATIN SMALL LETTER S WITH ACUTE */
+MAP(0x2B, 0x5D, 0x015D) /* LATIN SMALL LETTER S WITH CIRCUMFLEX */
+MAP(0x2B, 0x5E, 0x0161) /* LATIN SMALL LETTER S WITH CARON */
+MAP(0x2B, 0x5F, 0x015F) /* LATIN SMALL LETTER S WITH CEDILLA */
+MAP(0x2B, 0x60, 0x0165) /* LATIN SMALL LETTER T WITH CARON */
+MAP(0x2B, 0x61, 0x0163) /* LATIN SMALL LETTER T WITH CEDILLA */
+MAP(0x2B, 0x62, 0x00FA) /* LATIN SMALL LETTER U WITH ACUTE */
+MAP(0x2B, 0x63, 0x00F9) /* LATIN SMALL LETTER U WITH GRAVE */
+MAP(0x2B, 0x64, 0x00FC) /* LATIN SMALL LETTER U WITH DIAERESIS */
+MAP(0x2B, 0x65, 0x00FB) /* LATIN SMALL LETTER U WITH CIRCUMFLEX */
+MAP(0x2B, 0x66, 0x016D) /* LATIN SMALL LETTER U WITH BREVE */
+MAP(0x2B, 0x67, 0x01D4) /* LATIN SMALL LETTER U WITH CARON */
+MAP(0x2B, 0x68, 0x0171) /* LATIN SMALL LETTER U WITH DOUBLE ACUTE */
+MAP(0x2B, 0x69, 0x016B) /* LATIN SMALL LETTER U WITH MACRON */
+MAP(0x2B, 0x6A, 0x0173) /* LATIN SMALL LETTER U WITH OGONEK */
+MAP(0x2B, 0x6B, 0x016F) /* LATIN SMALL LETTER U WITH RING ABOVE */
+MAP(0x2B, 0x6C, 0x0169) /* LATIN SMALL LETTER U WITH TILDE */
+MAP(0x2B, 0x6D, 0x01D8) /* LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE */
+MAP(0x2B, 0x6E, 0x01DC) /* LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE */
+MAP(0x2B, 0x6F, 0x01DA) /* LATIN SMALL LETTER U WITH DIAERESIS AND CARON */
+MAP(0x2B, 0x70, 0x01D6) /* LATIN SMALL LETTER U WITH DIAERESIS AND MACRON */
+MAP(0x2B, 0x71, 0x0175) /* LATIN SMALL LETTER W WITH CIRCUMFLEX */
+MAP(0x2B, 0x72, 0x00FD) /* LATIN SMALL LETTER Y WITH ACUTE */
+MAP(0x2B, 0x73, 0x00FF) /* LATIN SMALL LETTER Y WITH DIAERESIS */
+MAP(0x2B, 0x74, 0x0177) /* LATIN SMALL LETTER Y WITH CIRCUMFLEX */
+MAP(0x2B, 0x75, 0x017A) /* LATIN SMALL LETTER Z WITH ACUTE */
+MAP(0x2B, 0x76, 0x017E) /* LATIN SMALL LETTER Z WITH CARON */
+MAP(0x2B, 0x77, 0x017C) /* LATIN SMALL LETTER Z WITH DOT ABOVE */
+MAP(0x30, 0x21, 0x4E02) /* <CJK> */
+MAP(0x30, 0x22, 0x4E04) /* <CJK> */
+MAP(0x30, 0x23, 0x4E05) /* <CJK> */
+MAP(0x30, 0x24, 0x4E0C) /* <CJK> */
+MAP(0x30, 0x25, 0x4E12) /* <CJK> */
+MAP(0x30, 0x26, 0x4E1F) /* <CJK> */
+MAP(0x30, 0x27, 0x4E23) /* <CJK> */
+MAP(0x30, 0x28, 0x4E24) /* <CJK> */
+MAP(0x30, 0x29, 0x4E28) /* <CJK> */
+MAP(0x30, 0x2A, 0x4E2B) /* <CJK> */
+MAP(0x30, 0x2B, 0x4E2E) /* <CJK> */
+MAP(0x30, 0x2C, 0x4E2F) /* <CJK> */
+MAP(0x30, 0x2D, 0x4E30) /* <CJK> */
+MAP(0x30, 0x2E, 0x4E35) /* <CJK> */
+MAP(0x30, 0x2F, 0x4E40) /* <CJK> */
+MAP(0x30, 0x30, 0x4E41) /* <CJK> */
+MAP(0x30, 0x31, 0x4E44) /* <CJK> */
+MAP(0x30, 0x32, 0x4E47) /* <CJK> */
+MAP(0x30, 0x33, 0x4E51) /* <CJK> */
+MAP(0x30, 0x34, 0x4E5A) /* <CJK> */
+MAP(0x30, 0x35, 0x4E5C) /* <CJK> */
+MAP(0x30, 0x36, 0x4E63) /* <CJK> */
+MAP(0x30, 0x37, 0x4E68) /* <CJK> */
+MAP(0x30, 0x38, 0x4E69) /* <CJK> */
+MAP(0x30, 0x39, 0x4E74) /* <CJK> */
+MAP(0x30, 0x3A, 0x4E75) /* <CJK> */
+MAP(0x30, 0x3B, 0x4E79) /* <CJK> */
+MAP(0x30, 0x3C, 0x4E7F) /* <CJK> */
+MAP(0x30, 0x3D, 0x4E8D) /* <CJK> */
+MAP(0x30, 0x3E, 0x4E96) /* <CJK> */
+MAP(0x30, 0x3F, 0x4E97) /* <CJK> */
+MAP(0x30, 0x40, 0x4E9D) /* <CJK> */
+MAP(0x30, 0x41, 0x4EAF) /* <CJK> */
+MAP(0x30, 0x42, 0x4EB9) /* <CJK> */
+MAP(0x30, 0x43, 0x4EC3) /* <CJK> */
+MAP(0x30, 0x44, 0x4ED0) /* <CJK> */
+MAP(0x30, 0x45, 0x4EDA) /* <CJK> */
+MAP(0x30, 0x46, 0x4EDB) /* <CJK> */
+MAP(0x30, 0x47, 0x4EE0) /* <CJK> */
+MAP(0x30, 0x48, 0x4EE1) /* <CJK> */
+MAP(0x30, 0x49, 0x4EE2) /* <CJK> */
+MAP(0x30, 0x4A, 0x4EE8) /* <CJK> */
+MAP(0x30, 0x4B, 0x4EEF) /* <CJK> */
+MAP(0x30, 0x4C, 0x4EF1) /* <CJK> */
+MAP(0x30, 0x4D, 0x4EF3) /* <CJK> */
+MAP(0x30, 0x4E, 0x4EF5) /* <CJK> */
+MAP(0x30, 0x4F, 0x4EFD) /* <CJK> */
+MAP(0x30, 0x50, 0x4EFE) /* <CJK> */
+MAP(0x30, 0x51, 0x4EFF) /* <CJK> */
+MAP(0x30, 0x52, 0x4F00) /* <CJK> */
+MAP(0x30, 0x53, 0x4F02) /* <CJK> */
+MAP(0x30, 0x54, 0x4F03) /* <CJK> */
+MAP(0x30, 0x55, 0x4F08) /* <CJK> */
+MAP(0x30, 0x56, 0x4F0B) /* <CJK> */
+MAP(0x30, 0x57, 0x4F0C) /* <CJK> */
+MAP(0x30, 0x58, 0x4F12) /* <CJK> */
+MAP(0x30, 0x59, 0x4F15) /* <CJK> */
+MAP(0x30, 0x5A, 0x4F16) /* <CJK> */
+MAP(0x30, 0x5B, 0x4F17) /* <CJK> */
+MAP(0x30, 0x5C, 0x4F19) /* <CJK> */
+MAP(0x30, 0x5D, 0x4F2E) /* <CJK> */
+MAP(0x30, 0x5E, 0x4F31) /* <CJK> */
+MAP(0x30, 0x5F, 0x4F60) /* <CJK> */
+MAP(0x30, 0x60, 0x4F33) /* <CJK> */
+MAP(0x30, 0x61, 0x4F35) /* <CJK> */
+MAP(0x30, 0x62, 0x4F37) /* <CJK> */
+MAP(0x30, 0x63, 0x4F39) /* <CJK> */
+MAP(0x30, 0x64, 0x4F3B) /* <CJK> */
+MAP(0x30, 0x65, 0x4F3E) /* <CJK> */
+MAP(0x30, 0x66, 0x4F40) /* <CJK> */
+MAP(0x30, 0x67, 0x4F42) /* <CJK> */
+MAP(0x30, 0x68, 0x4F48) /* <CJK> */
+MAP(0x30, 0x69, 0x4F49) /* <CJK> */
+MAP(0x30, 0x6A, 0x4F4B) /* <CJK> */
+MAP(0x30, 0x6B, 0x4F4C) /* <CJK> */
+MAP(0x30, 0x6C, 0x4F52) /* <CJK> */
+MAP(0x30, 0x6D, 0x4F54) /* <CJK> */
+MAP(0x30, 0x6E, 0x4F56) /* <CJK> */
+MAP(0x30, 0x6F, 0x4F58) /* <CJK> */
+MAP(0x30, 0x70, 0x4F5F) /* <CJK> */
+MAP(0x30, 0x71, 0x4F63) /* <CJK> */
+MAP(0x30, 0x72, 0x4F6A) /* <CJK> */
+MAP(0x30, 0x73, 0x4F6C) /* <CJK> */
+MAP(0x30, 0x74, 0x4F6E) /* <CJK> */
+MAP(0x30, 0x75, 0x4F71) /* <CJK> */
+MAP(0x30, 0x76, 0x4F77) /* <CJK> */
+MAP(0x30, 0x77, 0x4F78) /* <CJK> */
+MAP(0x30, 0x78, 0x4F79) /* <CJK> */
+MAP(0x30, 0x79, 0x4F7A) /* <CJK> */
+MAP(0x30, 0x7A, 0x4F7D) /* <CJK> */
+MAP(0x30, 0x7B, 0x4F7E) /* <CJK> */
+MAP(0x30, 0x7C, 0x4F81) /* <CJK> */
+MAP(0x30, 0x7D, 0x4F82) /* <CJK> */
+MAP(0x30, 0x7E, 0x4F84) /* <CJK> */
+MAP(0x31, 0x21, 0x4F85) /* <CJK> */
+MAP(0x31, 0x22, 0x4F89) /* <CJK> */
+MAP(0x31, 0x23, 0x4F8A) /* <CJK> */
+MAP(0x31, 0x24, 0x4F8C) /* <CJK> */
+MAP(0x31, 0x25, 0x4F8E) /* <CJK> */
+MAP(0x31, 0x26, 0x4F90) /* <CJK> */
+MAP(0x31, 0x27, 0x4F92) /* <CJK> */
+MAP(0x31, 0x28, 0x4F93) /* <CJK> */
+MAP(0x31, 0x29, 0x4F94) /* <CJK> */
+MAP(0x31, 0x2A, 0x4F97) /* <CJK> */
+MAP(0x31, 0x2B, 0x4F99) /* <CJK> */
+MAP(0x31, 0x2C, 0x4F9A) /* <CJK> */
+MAP(0x31, 0x2D, 0x4F9E) /* <CJK> */
+MAP(0x31, 0x2E, 0x4F9F) /* <CJK> */
+MAP(0x31, 0x2F, 0x4FB2) /* <CJK> */
+MAP(0x31, 0x30, 0x4FB7) /* <CJK> */
+MAP(0x31, 0x31, 0x4FB9) /* <CJK> */
+MAP(0x31, 0x32, 0x4FBB) /* <CJK> */
+MAP(0x31, 0x33, 0x4FBC) /* <CJK> */
+MAP(0x31, 0x34, 0x4FBD) /* <CJK> */
+MAP(0x31, 0x35, 0x4FBE) /* <CJK> */
+MAP(0x31, 0x36, 0x4FC0) /* <CJK> */
+MAP(0x31, 0x37, 0x4FC1) /* <CJK> */
+MAP(0x31, 0x38, 0x4FC5) /* <CJK> */
+MAP(0x31, 0x39, 0x4FC6) /* <CJK> */
+MAP(0x31, 0x3A, 0x4FC8) /* <CJK> */
+MAP(0x31, 0x3B, 0x4FC9) /* <CJK> */
+MAP(0x31, 0x3C, 0x4FCB) /* <CJK> */
+MAP(0x31, 0x3D, 0x4FCC) /* <CJK> */
+MAP(0x31, 0x3E, 0x4FCD) /* <CJK> */
+MAP(0x31, 0x3F, 0x4FCF) /* <CJK> */
+MAP(0x31, 0x40, 0x4FD2) /* <CJK> */
+MAP(0x31, 0x41, 0x4FDC) /* <CJK> */
+MAP(0x31, 0x42, 0x4FE0) /* <CJK> */
+MAP(0x31, 0x43, 0x4FE2) /* <CJK> */
+MAP(0x31, 0x44, 0x4FF0) /* <CJK> */
+MAP(0x31, 0x45, 0x4FF2) /* <CJK> */
+MAP(0x31, 0x46, 0x4FFC) /* <CJK> */
+MAP(0x31, 0x47, 0x4FFD) /* <CJK> */
+MAP(0x31, 0x48, 0x4FFF) /* <CJK> */
+MAP(0x31, 0x49, 0x5000) /* <CJK> */
+MAP(0x31, 0x4A, 0x5001) /* <CJK> */
+MAP(0x31, 0x4B, 0x5004) /* <CJK> */
+MAP(0x31, 0x4C, 0x5007) /* <CJK> */
+MAP(0x31, 0x4D, 0x500A) /* <CJK> */
+MAP(0x31, 0x4E, 0x500C) /* <CJK> */
+MAP(0x31, 0x4F, 0x500E) /* <CJK> */
+MAP(0x31, 0x50, 0x5010) /* <CJK> */
+MAP(0x31, 0x51, 0x5013) /* <CJK> */
+MAP(0x31, 0x52, 0x5017) /* <CJK> */
+MAP(0x31, 0x53, 0x5018) /* <CJK> */
+MAP(0x31, 0x54, 0x501B) /* <CJK> */
+MAP(0x31, 0x55, 0x501C) /* <CJK> */
+MAP(0x31, 0x56, 0x501D) /* <CJK> */
+MAP(0x31, 0x57, 0x501E) /* <CJK> */
+MAP(0x31, 0x58, 0x5022) /* <CJK> */
+MAP(0x31, 0x59, 0x5027) /* <CJK> */
+MAP(0x31, 0x5A, 0x502E) /* <CJK> */
+MAP(0x31, 0x5B, 0x5030) /* <CJK> */
+MAP(0x31, 0x5C, 0x5032) /* <CJK> */
+MAP(0x31, 0x5D, 0x5033) /* <CJK> */
+MAP(0x31, 0x5E, 0x5035) /* <CJK> */
+MAP(0x31, 0x5F, 0x5040) /* <CJK> */
+MAP(0x31, 0x60, 0x5041) /* <CJK> */
+MAP(0x31, 0x61, 0x5042) /* <CJK> */
+MAP(0x31, 0x62, 0x5045) /* <CJK> */
+MAP(0x31, 0x63, 0x5046) /* <CJK> */
+MAP(0x31, 0x64, 0x504A) /* <CJK> */
+MAP(0x31, 0x65, 0x504C) /* <CJK> */
+MAP(0x31, 0x66, 0x504E) /* <CJK> */
+MAP(0x31, 0x67, 0x5051) /* <CJK> */
+MAP(0x31, 0x68, 0x5052) /* <CJK> */
+MAP(0x31, 0x69, 0x5053) /* <CJK> */
+MAP(0x31, 0x6A, 0x5057) /* <CJK> */
+MAP(0x31, 0x6B, 0x5059) /* <CJK> */
+MAP(0x31, 0x6C, 0x505F) /* <CJK> */
+MAP(0x31, 0x6D, 0x5060) /* <CJK> */
+MAP(0x31, 0x6E, 0x5062) /* <CJK> */
+MAP(0x31, 0x6F, 0x5063) /* <CJK> */
+MAP(0x31, 0x70, 0x5066) /* <CJK> */
+MAP(0x31, 0x71, 0x5067) /* <CJK> */
+MAP(0x31, 0x72, 0x506A) /* <CJK> */
+MAP(0x31, 0x73, 0x506D) /* <CJK> */
+MAP(0x31, 0x74, 0x5070) /* <CJK> */
+MAP(0x31, 0x75, 0x5071) /* <CJK> */
+MAP(0x31, 0x76, 0x503B) /* <CJK> */
+MAP(0x31, 0x77, 0x5081) /* <CJK> */
+MAP(0x31, 0x78, 0x5083) /* <CJK> */
+MAP(0x31, 0x79, 0x5084) /* <CJK> */
+MAP(0x31, 0x7A, 0x5086) /* <CJK> */
+MAP(0x31, 0x7B, 0x508A) /* <CJK> */
+MAP(0x31, 0x7C, 0x508E) /* <CJK> */
+MAP(0x31, 0x7D, 0x508F) /* <CJK> */
+MAP(0x31, 0x7E, 0x5090) /* <CJK> */
+MAP(0x32, 0x21, 0x5092) /* <CJK> */
+MAP(0x32, 0x22, 0x5093) /* <CJK> */
+MAP(0x32, 0x23, 0x5094) /* <CJK> */
+MAP(0x32, 0x24, 0x5096) /* <CJK> */
+MAP(0x32, 0x25, 0x509B) /* <CJK> */
+MAP(0x32, 0x26, 0x509C) /* <CJK> */
+MAP(0x32, 0x27, 0x509E) /* <CJK> */
+MAP(0x32, 0x28, 0x509F) /* <CJK> */
+MAP(0x32, 0x29, 0x50A0) /* <CJK> */
+MAP(0x32, 0x2A, 0x50A1) /* <CJK> */
+MAP(0x32, 0x2B, 0x50A2) /* <CJK> */
+MAP(0x32, 0x2C, 0x50AA) /* <CJK> */
+MAP(0x32, 0x2D, 0x50AF) /* <CJK> */
+MAP(0x32, 0x2E, 0x50B0) /* <CJK> */
+MAP(0x32, 0x2F, 0x50B9) /* <CJK> */
+MAP(0x32, 0x30, 0x50BA) /* <CJK> */
+MAP(0x32, 0x31, 0x50BD) /* <CJK> */
+MAP(0x32, 0x32, 0x50C0) /* <CJK> */
+MAP(0x32, 0x33, 0x50C3) /* <CJK> */
+MAP(0x32, 0x34, 0x50C4) /* <CJK> */
+MAP(0x32, 0x35, 0x50C7) /* <CJK> */
+MAP(0x32, 0x36, 0x50CC) /* <CJK> */
+MAP(0x32, 0x37, 0x50CE) /* <CJK> */
+MAP(0x32, 0x38, 0x50D0) /* <CJK> */
+MAP(0x32, 0x39, 0x50D3) /* <CJK> */
+MAP(0x32, 0x3A, 0x50D4) /* <CJK> */
+MAP(0x32, 0x3B, 0x50D8) /* <CJK> */
+MAP(0x32, 0x3C, 0x50DC) /* <CJK> */
+MAP(0x32, 0x3D, 0x50DD) /* <CJK> */
+MAP(0x32, 0x3E, 0x50DF) /* <CJK> */
+MAP(0x32, 0x3F, 0x50E2) /* <CJK> */
+MAP(0x32, 0x40, 0x50E4) /* <CJK> */
+MAP(0x32, 0x41, 0x50E6) /* <CJK> */
+MAP(0x32, 0x42, 0x50E8) /* <CJK> */
+MAP(0x32, 0x43, 0x50E9) /* <CJK> */
+MAP(0x32, 0x44, 0x50EF) /* <CJK> */
+MAP(0x32, 0x45, 0x50F1) /* <CJK> */
+MAP(0x32, 0x46, 0x50F6) /* <CJK> */
+MAP(0x32, 0x47, 0x50FA) /* <CJK> */
+MAP(0x32, 0x48, 0x50FE) /* <CJK> */
+MAP(0x32, 0x49, 0x5103) /* <CJK> */
+MAP(0x32, 0x4A, 0x5106) /* <CJK> */
+MAP(0x32, 0x4B, 0x5107) /* <CJK> */
+MAP(0x32, 0x4C, 0x5108) /* <CJK> */
+MAP(0x32, 0x4D, 0x510B) /* <CJK> */
+MAP(0x32, 0x4E, 0x510C) /* <CJK> */
+MAP(0x32, 0x4F, 0x510D) /* <CJK> */
+MAP(0x32, 0x50, 0x510E) /* <CJK> */
+MAP(0x32, 0x51, 0x50F2) /* <CJK> */
+MAP(0x32, 0x52, 0x5110) /* <CJK> */
+MAP(0x32, 0x53, 0x5117) /* <CJK> */
+MAP(0x32, 0x54, 0x5119) /* <CJK> */
+MAP(0x32, 0x55, 0x511B) /* <CJK> */
+MAP(0x32, 0x56, 0x511C) /* <CJK> */
+MAP(0x32, 0x57, 0x511D) /* <CJK> */
+MAP(0x32, 0x58, 0x511E) /* <CJK> */
+MAP(0x32, 0x59, 0x5123) /* <CJK> */
+MAP(0x32, 0x5A, 0x5127) /* <CJK> */
+MAP(0x32, 0x5B, 0x5128) /* <CJK> */
+MAP(0x32, 0x5C, 0x512C) /* <CJK> */
+MAP(0x32, 0x5D, 0x512D) /* <CJK> */
+MAP(0x32, 0x5E, 0x512F) /* <CJK> */
+MAP(0x32, 0x5F, 0x5131) /* <CJK> */
+MAP(0x32, 0x60, 0x5133) /* <CJK> */
+MAP(0x32, 0x61, 0x5134) /* <CJK> */
+MAP(0x32, 0x62, 0x5135) /* <CJK> */
+MAP(0x32, 0x63, 0x5138) /* <CJK> */
+MAP(0x32, 0x64, 0x5139) /* <CJK> */
+MAP(0x32, 0x65, 0x5142) /* <CJK> */
+MAP(0x32, 0x66, 0x514A) /* <CJK> */
+MAP(0x32, 0x67, 0x514F) /* <CJK> */
+MAP(0x32, 0x68, 0x5153) /* <CJK> */
+MAP(0x32, 0x69, 0x5155) /* <CJK> */
+MAP(0x32, 0x6A, 0x5157) /* <CJK> */
+MAP(0x32, 0x6B, 0x5158) /* <CJK> */
+MAP(0x32, 0x6C, 0x515F) /* <CJK> */
+MAP(0x32, 0x6D, 0x5164) /* <CJK> */
+MAP(0x32, 0x6E, 0x5166) /* <CJK> */
+MAP(0x32, 0x6F, 0x517E) /* <CJK> */
+MAP(0x32, 0x70, 0x5183) /* <CJK> */
+MAP(0x32, 0x71, 0x5184) /* <CJK> */
+MAP(0x32, 0x72, 0x518B) /* <CJK> */
+MAP(0x32, 0x73, 0x518E) /* <CJK> */
+MAP(0x32, 0x74, 0x5198) /* <CJK> */
+MAP(0x32, 0x75, 0x519D) /* <CJK> */
+MAP(0x32, 0x76, 0x51A1) /* <CJK> */
+MAP(0x32, 0x77, 0x51A3) /* <CJK> */
+MAP(0x32, 0x78, 0x51AD) /* <CJK> */
+MAP(0x32, 0x79, 0x51B8) /* <CJK> */
+MAP(0x32, 0x7A, 0x51BA) /* <CJK> */
+MAP(0x32, 0x7B, 0x51BC) /* <CJK> */
+MAP(0x32, 0x7C, 0x51BE) /* <CJK> */
+MAP(0x32, 0x7D, 0x51BF) /* <CJK> */
+MAP(0x32, 0x7E, 0x51C2) /* <CJK> */
+MAP(0x33, 0x21, 0x51C8) /* <CJK> */
+MAP(0x33, 0x22, 0x51CF) /* <CJK> */
+MAP(0x33, 0x23, 0x51D1) /* <CJK> */
+MAP(0x33, 0x24, 0x51D2) /* <CJK> */
+MAP(0x33, 0x25, 0x51D3) /* <CJK> */
+MAP(0x33, 0x26, 0x51D5) /* <CJK> */
+MAP(0x33, 0x27, 0x51D8) /* <CJK> */
+MAP(0x33, 0x28, 0x51DE) /* <CJK> */
+MAP(0x33, 0x29, 0x51E2) /* <CJK> */
+MAP(0x33, 0x2A, 0x51E5) /* <CJK> */
+MAP(0x33, 0x2B, 0x51EE) /* <CJK> */
+MAP(0x33, 0x2C, 0x51F2) /* <CJK> */
+MAP(0x33, 0x2D, 0x51F3) /* <CJK> */
+MAP(0x33, 0x2E, 0x51F4) /* <CJK> */
+MAP(0x33, 0x2F, 0x51F7) /* <CJK> */
+MAP(0x33, 0x30, 0x5201) /* <CJK> */
+MAP(0x33, 0x31, 0x5202) /* <CJK> */
+MAP(0x33, 0x32, 0x5205) /* <CJK> */
+MAP(0x33, 0x33, 0x5212) /* <CJK> */
+MAP(0x33, 0x34, 0x5213) /* <CJK> */
+MAP(0x33, 0x35, 0x5215) /* <CJK> */
+MAP(0x33, 0x36, 0x5216) /* <CJK> */
+MAP(0x33, 0x37, 0x5218) /* <CJK> */
+MAP(0x33, 0x38, 0x5222) /* <CJK> */
+MAP(0x33, 0x39, 0x5228) /* <CJK> */
+MAP(0x33, 0x3A, 0x5231) /* <CJK> */
+MAP(0x33, 0x3B, 0x5232) /* <CJK> */
+MAP(0x33, 0x3C, 0x5235) /* <CJK> */
+MAP(0x33, 0x3D, 0x523C) /* <CJK> */
+MAP(0x33, 0x3E, 0x5245) /* <CJK> */
+MAP(0x33, 0x3F, 0x5249) /* <CJK> */
+MAP(0x33, 0x40, 0x5255) /* <CJK> */
+MAP(0x33, 0x41, 0x5257) /* <CJK> */
+MAP(0x33, 0x42, 0x5258) /* <CJK> */
+MAP(0x33, 0x43, 0x525A) /* <CJK> */
+MAP(0x33, 0x44, 0x525C) /* <CJK> */
+MAP(0x33, 0x45, 0x525F) /* <CJK> */
+MAP(0x33, 0x46, 0x5260) /* <CJK> */
+MAP(0x33, 0x47, 0x5261) /* <CJK> */
+MAP(0x33, 0x48, 0x5266) /* <CJK> */
+MAP(0x33, 0x49, 0x526E) /* <CJK> */
+MAP(0x33, 0x4A, 0x5277) /* <CJK> */
+MAP(0x33, 0x4B, 0x5278) /* <CJK> */
+MAP(0x33, 0x4C, 0x5279) /* <CJK> */
+MAP(0x33, 0x4D, 0x5280) /* <CJK> */
+MAP(0x33, 0x4E, 0x5282) /* <CJK> */
+MAP(0x33, 0x4F, 0x5285) /* <CJK> */
+MAP(0x33, 0x50, 0x528A) /* <CJK> */
+MAP(0x33, 0x51, 0x528C) /* <CJK> */
+MAP(0x33, 0x52, 0x5293) /* <CJK> */
+MAP(0x33, 0x53, 0x5295) /* <CJK> */
+MAP(0x33, 0x54, 0x5296) /* <CJK> */
+MAP(0x33, 0x55, 0x5297) /* <CJK> */
+MAP(0x33, 0x56, 0x5298) /* <CJK> */
+MAP(0x33, 0x57, 0x529A) /* <CJK> */
+MAP(0x33, 0x58, 0x529C) /* <CJK> */
+MAP(0x33, 0x59, 0x52A4) /* <CJK> */
+MAP(0x33, 0x5A, 0x52A5) /* <CJK> */
+MAP(0x33, 0x5B, 0x52A6) /* <CJK> */
+MAP(0x33, 0x5C, 0x52A7) /* <CJK> */
+MAP(0x33, 0x5D, 0x52AF) /* <CJK> */
+MAP(0x33, 0x5E, 0x52B0) /* <CJK> */
+MAP(0x33, 0x5F, 0x52B6) /* <CJK> */
+MAP(0x33, 0x60, 0x52B7) /* <CJK> */
+MAP(0x33, 0x61, 0x52B8) /* <CJK> */
+MAP(0x33, 0x62, 0x52BA) /* <CJK> */
+MAP(0x33, 0x63, 0x52BB) /* <CJK> */
+MAP(0x33, 0x64, 0x52BD) /* <CJK> */
+MAP(0x33, 0x65, 0x52C0) /* <CJK> */
+MAP(0x33, 0x66, 0x52C4) /* <CJK> */
+MAP(0x33, 0x67, 0x52C6) /* <CJK> */
+MAP(0x33, 0x68, 0x52C8) /* <CJK> */
+MAP(0x33, 0x69, 0x52CC) /* <CJK> */
+MAP(0x33, 0x6A, 0x52CF) /* <CJK> */
+MAP(0x33, 0x6B, 0x52D1) /* <CJK> */
+MAP(0x33, 0x6C, 0x52D4) /* <CJK> */
+MAP(0x33, 0x6D, 0x52D6) /* <CJK> */
+MAP(0x33, 0x6E, 0x52DB) /* <CJK> */
+MAP(0x33, 0x6F, 0x52DC) /* <CJK> */
+MAP(0x33, 0x70, 0x52E1) /* <CJK> */
+MAP(0x33, 0x71, 0x52E5) /* <CJK> */
+MAP(0x33, 0x72, 0x52E8) /* <CJK> */
+MAP(0x33, 0x73, 0x52E9) /* <CJK> */
+MAP(0x33, 0x74, 0x52EA) /* <CJK> */
+MAP(0x33, 0x75, 0x52EC) /* <CJK> */
+MAP(0x33, 0x76, 0x52F0) /* <CJK> */
+MAP(0x33, 0x77, 0x52F1) /* <CJK> */
+MAP(0x33, 0x78, 0x52F4) /* <CJK> */
+MAP(0x33, 0x79, 0x52F6) /* <CJK> */
+MAP(0x33, 0x7A, 0x52F7) /* <CJK> */
+MAP(0x33, 0x7B, 0x5300) /* <CJK> */
+MAP(0x33, 0x7C, 0x5303) /* <CJK> */
+MAP(0x33, 0x7D, 0x530A) /* <CJK> */
+MAP(0x33, 0x7E, 0x530B) /* <CJK> */
+MAP(0x34, 0x21, 0x530C) /* <CJK> */
+MAP(0x34, 0x22, 0x5311) /* <CJK> */
+MAP(0x34, 0x23, 0x5313) /* <CJK> */
+MAP(0x34, 0x24, 0x5318) /* <CJK> */
+MAP(0x34, 0x25, 0x531B) /* <CJK> */
+MAP(0x34, 0x26, 0x531C) /* <CJK> */
+MAP(0x34, 0x27, 0x531E) /* <CJK> */
+MAP(0x34, 0x28, 0x531F) /* <CJK> */
+MAP(0x34, 0x29, 0x5325) /* <CJK> */
+MAP(0x34, 0x2A, 0x5327) /* <CJK> */
+MAP(0x34, 0x2B, 0x5328) /* <CJK> */
+MAP(0x34, 0x2C, 0x5329) /* <CJK> */
+MAP(0x34, 0x2D, 0x532B) /* <CJK> */
+MAP(0x34, 0x2E, 0x532C) /* <CJK> */
+MAP(0x34, 0x2F, 0x532D) /* <CJK> */
+MAP(0x34, 0x30, 0x5330) /* <CJK> */
+MAP(0x34, 0x31, 0x5332) /* <CJK> */
+MAP(0x34, 0x32, 0x5335) /* <CJK> */
+MAP(0x34, 0x33, 0x533C) /* <CJK> */
+MAP(0x34, 0x34, 0x533D) /* <CJK> */
+MAP(0x34, 0x35, 0x533E) /* <CJK> */
+MAP(0x34, 0x36, 0x5342) /* <CJK> */
+MAP(0x34, 0x37, 0x534C) /* <CJK> */
+MAP(0x34, 0x38, 0x534B) /* <CJK> */
+MAP(0x34, 0x39, 0x5359) /* <CJK> */
+MAP(0x34, 0x3A, 0x535B) /* <CJK> */
+MAP(0x34, 0x3B, 0x5361) /* <CJK> */
+MAP(0x34, 0x3C, 0x5363) /* <CJK> */
+MAP(0x34, 0x3D, 0x5365) /* <CJK> */
+MAP(0x34, 0x3E, 0x536C) /* <CJK> */
+MAP(0x34, 0x3F, 0x536D) /* <CJK> */
+MAP(0x34, 0x40, 0x5372) /* <CJK> */
+MAP(0x34, 0x41, 0x5379) /* <CJK> */
+MAP(0x34, 0x42, 0x537E) /* <CJK> */
+MAP(0x34, 0x43, 0x5383) /* <CJK> */
+MAP(0x34, 0x44, 0x5387) /* <CJK> */
+MAP(0x34, 0x45, 0x5388) /* <CJK> */
+MAP(0x34, 0x46, 0x538E) /* <CJK> */
+MAP(0x34, 0x47, 0x5393) /* <CJK> */
+MAP(0x34, 0x48, 0x5394) /* <CJK> */
+MAP(0x34, 0x49, 0x5399) /* <CJK> */
+MAP(0x34, 0x4A, 0x539D) /* <CJK> */
+MAP(0x34, 0x4B, 0x53A1) /* <CJK> */
+MAP(0x34, 0x4C, 0x53A4) /* <CJK> */
+MAP(0x34, 0x4D, 0x53AA) /* <CJK> */
+MAP(0x34, 0x4E, 0x53AB) /* <CJK> */
+MAP(0x34, 0x4F, 0x53AF) /* <CJK> */
+MAP(0x34, 0x50, 0x53B2) /* <CJK> */
+MAP(0x34, 0x51, 0x53B4) /* <CJK> */
+MAP(0x34, 0x52, 0x53B5) /* <CJK> */
+MAP(0x34, 0x53, 0x53B7) /* <CJK> */
+MAP(0x34, 0x54, 0x53B8) /* <CJK> */
+MAP(0x34, 0x55, 0x53BA) /* <CJK> */
+MAP(0x34, 0x56, 0x53BD) /* <CJK> */
+MAP(0x34, 0x57, 0x53C0) /* <CJK> */
+MAP(0x34, 0x58, 0x53C5) /* <CJK> */
+MAP(0x34, 0x59, 0x53CF) /* <CJK> */
+MAP(0x34, 0x5A, 0x53D2) /* <CJK> */
+MAP(0x34, 0x5B, 0x53D3) /* <CJK> */
+MAP(0x34, 0x5C, 0x53D5) /* <CJK> */
+MAP(0x34, 0x5D, 0x53DA) /* <CJK> */
+MAP(0x34, 0x5E, 0x53DD) /* <CJK> */
+MAP(0x34, 0x5F, 0x53DE) /* <CJK> */
+MAP(0x34, 0x60, 0x53E0) /* <CJK> */
+MAP(0x34, 0x61, 0x53E6) /* <CJK> */
+MAP(0x34, 0x62, 0x53E7) /* <CJK> */
+MAP(0x34, 0x63, 0x53F5) /* <CJK> */
+MAP(0x34, 0x64, 0x5402) /* <CJK> */
+MAP(0x34, 0x65, 0x5413) /* <CJK> */
+MAP(0x34, 0x66, 0x541A) /* <CJK> */
+MAP(0x34, 0x67, 0x5421) /* <CJK> */
+MAP(0x34, 0x68, 0x5427) /* <CJK> */
+MAP(0x34, 0x69, 0x5428) /* <CJK> */
+MAP(0x34, 0x6A, 0x542A) /* <CJK> */
+MAP(0x34, 0x6B, 0x542F) /* <CJK> */
+MAP(0x34, 0x6C, 0x5431) /* <CJK> */
+MAP(0x34, 0x6D, 0x5434) /* <CJK> */
+MAP(0x34, 0x6E, 0x5435) /* <CJK> */
+MAP(0x34, 0x6F, 0x5443) /* <CJK> */
+MAP(0x34, 0x70, 0x5444) /* <CJK> */
+MAP(0x34, 0x71, 0x5447) /* <CJK> */
+MAP(0x34, 0x72, 0x544D) /* <CJK> */
+MAP(0x34, 0x73, 0x544F) /* <CJK> */
+MAP(0x34, 0x74, 0x545E) /* <CJK> */
+MAP(0x34, 0x75, 0x5462) /* <CJK> */
+MAP(0x34, 0x76, 0x5464) /* <CJK> */
+MAP(0x34, 0x77, 0x5466) /* <CJK> */
+MAP(0x34, 0x78, 0x5467) /* <CJK> */
+MAP(0x34, 0x79, 0x5469) /* <CJK> */
+MAP(0x34, 0x7A, 0x546B) /* <CJK> */
+MAP(0x34, 0x7B, 0x546D) /* <CJK> */
+MAP(0x34, 0x7C, 0x546E) /* <CJK> */
+MAP(0x34, 0x7D, 0x5474) /* <CJK> */
+MAP(0x34, 0x7E, 0x547F) /* <CJK> */
+MAP(0x35, 0x21, 0x5481) /* <CJK> */
+MAP(0x35, 0x22, 0x5483) /* <CJK> */
+MAP(0x35, 0x23, 0x5485) /* <CJK> */
+MAP(0x35, 0x24, 0x5488) /* <CJK> */
+MAP(0x35, 0x25, 0x5489) /* <CJK> */
+MAP(0x35, 0x26, 0x548D) /* <CJK> */
+MAP(0x35, 0x27, 0x5491) /* <CJK> */
+MAP(0x35, 0x28, 0x5495) /* <CJK> */
+MAP(0x35, 0x29, 0x5496) /* <CJK> */
+MAP(0x35, 0x2A, 0x549C) /* <CJK> */
+MAP(0x35, 0x2B, 0x549F) /* <CJK> */
+MAP(0x35, 0x2C, 0x54A1) /* <CJK> */
+MAP(0x35, 0x2D, 0x54A6) /* <CJK> */
+MAP(0x35, 0x2E, 0x54A7) /* <CJK> */
+MAP(0x35, 0x2F, 0x54A9) /* <CJK> */
+MAP(0x35, 0x30, 0x54AA) /* <CJK> */
+MAP(0x35, 0x31, 0x54AD) /* <CJK> */
+MAP(0x35, 0x32, 0x54AE) /* <CJK> */
+MAP(0x35, 0x33, 0x54B1) /* <CJK> */
+MAP(0x35, 0x34, 0x54B7) /* <CJK> */
+MAP(0x35, 0x35, 0x54B9) /* <CJK> */
+MAP(0x35, 0x36, 0x54BA) /* <CJK> */
+MAP(0x35, 0x37, 0x54BB) /* <CJK> */
+MAP(0x35, 0x38, 0x54BF) /* <CJK> */
+MAP(0x35, 0x39, 0x54C6) /* <CJK> */
+MAP(0x35, 0x3A, 0x54CA) /* <CJK> */
+MAP(0x35, 0x3B, 0x54CD) /* <CJK> */
+MAP(0x35, 0x3C, 0x54CE) /* <CJK> */
+MAP(0x35, 0x3D, 0x54E0) /* <CJK> */
+MAP(0x35, 0x3E, 0x54EA) /* <CJK> */
+MAP(0x35, 0x3F, 0x54EC) /* <CJK> */
+MAP(0x35, 0x40, 0x54EF) /* <CJK> */
+MAP(0x35, 0x41, 0x54F6) /* <CJK> */
+MAP(0x35, 0x42, 0x54FC) /* <CJK> */
+MAP(0x35, 0x43, 0x54FE) /* <CJK> */
+MAP(0x35, 0x44, 0x54FF) /* <CJK> */
+MAP(0x35, 0x45, 0x5500) /* <CJK> */
+MAP(0x35, 0x46, 0x5501) /* <CJK> */
+MAP(0x35, 0x47, 0x5505) /* <CJK> */
+MAP(0x35, 0x48, 0x5508) /* <CJK> */
+MAP(0x35, 0x49, 0x5509) /* <CJK> */
+MAP(0x35, 0x4A, 0x550C) /* <CJK> */
+MAP(0x35, 0x4B, 0x550D) /* <CJK> */
+MAP(0x35, 0x4C, 0x550E) /* <CJK> */
+MAP(0x35, 0x4D, 0x5515) /* <CJK> */
+MAP(0x35, 0x4E, 0x552A) /* <CJK> */
+MAP(0x35, 0x4F, 0x552B) /* <CJK> */
+MAP(0x35, 0x50, 0x5532) /* <CJK> */
+MAP(0x35, 0x51, 0x5535) /* <CJK> */
+MAP(0x35, 0x52, 0x5536) /* <CJK> */
+MAP(0x35, 0x53, 0x553B) /* <CJK> */
+MAP(0x35, 0x54, 0x553C) /* <CJK> */
+MAP(0x35, 0x55, 0x553D) /* <CJK> */
+MAP(0x35, 0x56, 0x5541) /* <CJK> */
+MAP(0x35, 0x57, 0x5547) /* <CJK> */
+MAP(0x35, 0x58, 0x5549) /* <CJK> */
+MAP(0x35, 0x59, 0x554A) /* <CJK> */
+MAP(0x35, 0x5A, 0x554D) /* <CJK> */
+MAP(0x35, 0x5B, 0x5550) /* <CJK> */
+MAP(0x35, 0x5C, 0x5551) /* <CJK> */
+MAP(0x35, 0x5D, 0x5558) /* <CJK> */
+MAP(0x35, 0x5E, 0x555A) /* <CJK> */
+MAP(0x35, 0x5F, 0x555B) /* <CJK> */
+MAP(0x35, 0x60, 0x555E) /* <CJK> */
+MAP(0x35, 0x61, 0x5560) /* <CJK> */
+MAP(0x35, 0x62, 0x5561) /* <CJK> */
+MAP(0x35, 0x63, 0x5564) /* <CJK> */
+MAP(0x35, 0x64, 0x5566) /* <CJK> */
+MAP(0x35, 0x65, 0x557F) /* <CJK> */
+MAP(0x35, 0x66, 0x5581) /* <CJK> */
+MAP(0x35, 0x67, 0x5582) /* <CJK> */
+MAP(0x35, 0x68, 0x5586) /* <CJK> */
+MAP(0x35, 0x69, 0x5588) /* <CJK> */
+MAP(0x35, 0x6A, 0x558E) /* <CJK> */
+MAP(0x35, 0x6B, 0x558F) /* <CJK> */
+MAP(0x35, 0x6C, 0x5591) /* <CJK> */
+MAP(0x35, 0x6D, 0x5592) /* <CJK> */
+MAP(0x35, 0x6E, 0x5593) /* <CJK> */
+MAP(0x35, 0x6F, 0x5594) /* <CJK> */
+MAP(0x35, 0x70, 0x5597) /* <CJK> */
+MAP(0x35, 0x71, 0x55A3) /* <CJK> */
+MAP(0x35, 0x72, 0x55A4) /* <CJK> */
+MAP(0x35, 0x73, 0x55AD) /* <CJK> */
+MAP(0x35, 0x74, 0x55B2) /* <CJK> */
+MAP(0x35, 0x75, 0x55BF) /* <CJK> */
+MAP(0x35, 0x76, 0x55C1) /* <CJK> */
+MAP(0x35, 0x77, 0x55C3) /* <CJK> */
+MAP(0x35, 0x78, 0x55C6) /* <CJK> */
+MAP(0x35, 0x79, 0x55C9) /* <CJK> */
+MAP(0x35, 0x7A, 0x55CB) /* <CJK> */
+MAP(0x35, 0x7B, 0x55CC) /* <CJK> */
+MAP(0x35, 0x7C, 0x55CE) /* <CJK> */
+MAP(0x35, 0x7D, 0x55D1) /* <CJK> */
+MAP(0x35, 0x7E, 0x55D2) /* <CJK> */
+MAP(0x36, 0x21, 0x55D3) /* <CJK> */
+MAP(0x36, 0x22, 0x55D7) /* <CJK> */
+MAP(0x36, 0x23, 0x55D8) /* <CJK> */
+MAP(0x36, 0x24, 0x55DB) /* <CJK> */
+MAP(0x36, 0x25, 0x55DE) /* <CJK> */
+MAP(0x36, 0x26, 0x55E2) /* <CJK> */
+MAP(0x36, 0x27, 0x55E9) /* <CJK> */
+MAP(0x36, 0x28, 0x55F6) /* <CJK> */
+MAP(0x36, 0x29, 0x55FF) /* <CJK> */
+MAP(0x36, 0x2A, 0x5605) /* <CJK> */
+MAP(0x36, 0x2B, 0x5608) /* <CJK> */
+MAP(0x36, 0x2C, 0x560A) /* <CJK> */
+MAP(0x36, 0x2D, 0x560D) /* <CJK> */
+MAP(0x36, 0x2E, 0x560E) /* <CJK> */
+MAP(0x36, 0x2F, 0x560F) /* <CJK> */
+MAP(0x36, 0x30, 0x5610) /* <CJK> */
+MAP(0x36, 0x31, 0x5611) /* <CJK> */
+MAP(0x36, 0x32, 0x5612) /* <CJK> */
+MAP(0x36, 0x33, 0x5619) /* <CJK> */
+MAP(0x36, 0x34, 0x562C) /* <CJK> */
+MAP(0x36, 0x35, 0x5630) /* <CJK> */
+MAP(0x36, 0x36, 0x5633) /* <CJK> */
+MAP(0x36, 0x37, 0x5635) /* <CJK> */
+MAP(0x36, 0x38, 0x5637) /* <CJK> */
+MAP(0x36, 0x39, 0x5639) /* <CJK> */
+MAP(0x36, 0x3A, 0x563B) /* <CJK> */
+MAP(0x36, 0x3B, 0x563C) /* <CJK> */
+MAP(0x36, 0x3C, 0x563D) /* <CJK> */
+MAP(0x36, 0x3D, 0x563F) /* <CJK> */
+MAP(0x36, 0x3E, 0x5640) /* <CJK> */
+MAP(0x36, 0x3F, 0x5641) /* <CJK> */
+MAP(0x36, 0x40, 0x5643) /* <CJK> */
+MAP(0x36, 0x41, 0x5644) /* <CJK> */
+MAP(0x36, 0x42, 0x5646) /* <CJK> */
+MAP(0x36, 0x43, 0x5649) /* <CJK> */
+MAP(0x36, 0x44, 0x564B) /* <CJK> */
+MAP(0x36, 0x45, 0x564D) /* <CJK> */
+MAP(0x36, 0x46, 0x564F) /* <CJK> */
+MAP(0x36, 0x47, 0x5654) /* <CJK> */
+MAP(0x36, 0x48, 0x565E) /* <CJK> */
+MAP(0x36, 0x49, 0x5660) /* <CJK> */
+MAP(0x36, 0x4A, 0x5661) /* <CJK> */
+MAP(0x36, 0x4B, 0x5662) /* <CJK> */
+MAP(0x36, 0x4C, 0x5663) /* <CJK> */
+MAP(0x36, 0x4D, 0x5666) /* <CJK> */
+MAP(0x36, 0x4E, 0x5669) /* <CJK> */
+MAP(0x36, 0x4F, 0x566D) /* <CJK> */
+MAP(0x36, 0x50, 0x566F) /* <CJK> */
+MAP(0x36, 0x51, 0x5671) /* <CJK> */
+MAP(0x36, 0x52, 0x5672) /* <CJK> */
+MAP(0x36, 0x53, 0x5675) /* <CJK> */
+MAP(0x36, 0x54, 0x5684) /* <CJK> */
+MAP(0x36, 0x55, 0x5685) /* <CJK> */
+MAP(0x36, 0x56, 0x5688) /* <CJK> */
+MAP(0x36, 0x57, 0x568B) /* <CJK> */
+MAP(0x36, 0x58, 0x568C) /* <CJK> */
+MAP(0x36, 0x59, 0x5695) /* <CJK> */
+MAP(0x36, 0x5A, 0x5699) /* <CJK> */
+MAP(0x36, 0x5B, 0x569A) /* <CJK> */
+MAP(0x36, 0x5C, 0x569D) /* <CJK> */
+MAP(0x36, 0x5D, 0x569E) /* <CJK> */
+MAP(0x36, 0x5E, 0x569F) /* <CJK> */
+MAP(0x36, 0x5F, 0x56A6) /* <CJK> */
+MAP(0x36, 0x60, 0x56A7) /* <CJK> */
+MAP(0x36, 0x61, 0x56A8) /* <CJK> */
+MAP(0x36, 0x62, 0x56A9) /* <CJK> */
+MAP(0x36, 0x63, 0x56AB) /* <CJK> */
+MAP(0x36, 0x64, 0x56AC) /* <CJK> */
+MAP(0x36, 0x65, 0x56AD) /* <CJK> */
+MAP(0x36, 0x66, 0x56B1) /* <CJK> */
+MAP(0x36, 0x67, 0x56B3) /* <CJK> */
+MAP(0x36, 0x68, 0x56B7) /* <CJK> */
+MAP(0x36, 0x69, 0x56BE) /* <CJK> */
+MAP(0x36, 0x6A, 0x56C5) /* <CJK> */
+MAP(0x36, 0x6B, 0x56C9) /* <CJK> */
+MAP(0x36, 0x6C, 0x56CA) /* <CJK> */
+MAP(0x36, 0x6D, 0x56CB) /* <CJK> */
+MAP(0x36, 0x6E, 0x56CF) /* <CJK> */
+MAP(0x36, 0x6F, 0x56D0) /* <CJK> */
+MAP(0x36, 0x70, 0x56CC) /* <CJK> */
+MAP(0x36, 0x71, 0x56CD) /* <CJK> */
+MAP(0x36, 0x72, 0x56D9) /* <CJK> */
+MAP(0x36, 0x73, 0x56DC) /* <CJK> */
+MAP(0x36, 0x74, 0x56DD) /* <CJK> */
+MAP(0x36, 0x75, 0x56DF) /* <CJK> */
+MAP(0x36, 0x76, 0x56E1) /* <CJK> */
+MAP(0x36, 0x77, 0x56E4) /* <CJK> */
+MAP(0x36, 0x78, 0x56E5) /* <CJK> */
+MAP(0x36, 0x79, 0x56E6) /* <CJK> */
+MAP(0x36, 0x7A, 0x56E7) /* <CJK> */
+MAP(0x36, 0x7B, 0x56E8) /* <CJK> */
+MAP(0x36, 0x7C, 0x56F1) /* <CJK> */
+MAP(0x36, 0x7D, 0x56EB) /* <CJK> */
+MAP(0x36, 0x7E, 0x56ED) /* <CJK> */
+MAP(0x37, 0x21, 0x56F6) /* <CJK> */
+MAP(0x37, 0x22, 0x56F7) /* <CJK> */
+MAP(0x37, 0x23, 0x5701) /* <CJK> */
+MAP(0x37, 0x24, 0x5702) /* <CJK> */
+MAP(0x37, 0x25, 0x5707) /* <CJK> */
+MAP(0x37, 0x26, 0x570A) /* <CJK> */
+MAP(0x37, 0x27, 0x570C) /* <CJK> */
+MAP(0x37, 0x28, 0x5711) /* <CJK> */
+MAP(0x37, 0x29, 0x5715) /* <CJK> */
+MAP(0x37, 0x2A, 0x571A) /* <CJK> */
+MAP(0x37, 0x2B, 0x571B) /* <CJK> */
+MAP(0x37, 0x2C, 0x571D) /* <CJK> */
+MAP(0x37, 0x2D, 0x5720) /* <CJK> */
+MAP(0x37, 0x2E, 0x5722) /* <CJK> */
+MAP(0x37, 0x2F, 0x5723) /* <CJK> */
+MAP(0x37, 0x30, 0x5724) /* <CJK> */
+MAP(0x37, 0x31, 0x5725) /* <CJK> */
+MAP(0x37, 0x32, 0x5729) /* <CJK> */
+MAP(0x37, 0x33, 0x572A) /* <CJK> */
+MAP(0x37, 0x34, 0x572C) /* <CJK> */
+MAP(0x37, 0x35, 0x572E) /* <CJK> */
+MAP(0x37, 0x36, 0x572F) /* <CJK> */
+MAP(0x37, 0x37, 0x5733) /* <CJK> */
+MAP(0x37, 0x38, 0x5734) /* <CJK> */
+MAP(0x37, 0x39, 0x573D) /* <CJK> */
+MAP(0x37, 0x3A, 0x573E) /* <CJK> */
+MAP(0x37, 0x3B, 0x573F) /* <CJK> */
+MAP(0x37, 0x3C, 0x5745) /* <CJK> */
+MAP(0x37, 0x3D, 0x5746) /* <CJK> */
+MAP(0x37, 0x3E, 0x574C) /* <CJK> */
+MAP(0x37, 0x3F, 0x574D) /* <CJK> */
+MAP(0x37, 0x40, 0x5752) /* <CJK> */
+MAP(0x37, 0x41, 0x5762) /* <CJK> */
+MAP(0x37, 0x42, 0x5765) /* <CJK> */
+MAP(0x37, 0x43, 0x5767) /* <CJK> */
+MAP(0x37, 0x44, 0x5768) /* <CJK> */
+MAP(0x37, 0x45, 0x576B) /* <CJK> */
+MAP(0x37, 0x46, 0x576D) /* <CJK> */
+MAP(0x37, 0x47, 0x576E) /* <CJK> */
+MAP(0x37, 0x48, 0x576F) /* <CJK> */
+MAP(0x37, 0x49, 0x5770) /* <CJK> */
+MAP(0x37, 0x4A, 0x5771) /* <CJK> */
+MAP(0x37, 0x4B, 0x5773) /* <CJK> */
+MAP(0x37, 0x4C, 0x5774) /* <CJK> */
+MAP(0x37, 0x4D, 0x5775) /* <CJK> */
+MAP(0x37, 0x4E, 0x5777) /* <CJK> */
+MAP(0x37, 0x4F, 0x5779) /* <CJK> */
+MAP(0x37, 0x50, 0x577A) /* <CJK> */
+MAP(0x37, 0x51, 0x577B) /* <CJK> */
+MAP(0x37, 0x52, 0x577C) /* <CJK> */
+MAP(0x37, 0x53, 0x577E) /* <CJK> */
+MAP(0x37, 0x54, 0x5781) /* <CJK> */
+MAP(0x37, 0x55, 0x5783) /* <CJK> */
+MAP(0x37, 0x56, 0x578C) /* <CJK> */
+MAP(0x37, 0x57, 0x5794) /* <CJK> */
+MAP(0x37, 0x58, 0x5797) /* <CJK> */
+MAP(0x37, 0x59, 0x5799) /* <CJK> */
+MAP(0x37, 0x5A, 0x579A) /* <CJK> */
+MAP(0x37, 0x5B, 0x579C) /* <CJK> */
+MAP(0x37, 0x5C, 0x579D) /* <CJK> */
+MAP(0x37, 0x5D, 0x579E) /* <CJK> */
+MAP(0x37, 0x5E, 0x579F) /* <CJK> */
+MAP(0x37, 0x5F, 0x57A1) /* <CJK> */
+MAP(0x37, 0x60, 0x5795) /* <CJK> */
+MAP(0x37, 0x61, 0x57A7) /* <CJK> */
+MAP(0x37, 0x62, 0x57A8) /* <CJK> */
+MAP(0x37, 0x63, 0x57A9) /* <CJK> */
+MAP(0x37, 0x64, 0x57AC) /* <CJK> */
+MAP(0x37, 0x65, 0x57B8) /* <CJK> */
+MAP(0x37, 0x66, 0x57BD) /* <CJK> */
+MAP(0x37, 0x67, 0x57C7) /* <CJK> */
+MAP(0x37, 0x68, 0x57C8) /* <CJK> */
+MAP(0x37, 0x69, 0x57CC) /* <CJK> */
+MAP(0x37, 0x6A, 0x57CF) /* <CJK> */
+MAP(0x37, 0x6B, 0x57D5) /* <CJK> */
+MAP(0x37, 0x6C, 0x57DD) /* <CJK> */
+MAP(0x37, 0x6D, 0x57DE) /* <CJK> */
+MAP(0x37, 0x6E, 0x57E4) /* <CJK> */
+MAP(0x37, 0x6F, 0x57E6) /* <CJK> */
+MAP(0x37, 0x70, 0x57E7) /* <CJK> */
+MAP(0x37, 0x71, 0x57E9) /* <CJK> */
+MAP(0x37, 0x72, 0x57ED) /* <CJK> */
+MAP(0x37, 0x73, 0x57F0) /* <CJK> */
+MAP(0x37, 0x74, 0x57F5) /* <CJK> */
+MAP(0x37, 0x75, 0x57F6) /* <CJK> */
+MAP(0x37, 0x76, 0x57F8) /* <CJK> */
+MAP(0x37, 0x77, 0x57FD) /* <CJK> */
+MAP(0x37, 0x78, 0x57FE) /* <CJK> */
+MAP(0x37, 0x79, 0x57FF) /* <CJK> */
+MAP(0x37, 0x7A, 0x5803) /* <CJK> */
+MAP(0x37, 0x7B, 0x5804) /* <CJK> */
+MAP(0x37, 0x7C, 0x5808) /* <CJK> */
+MAP(0x37, 0x7D, 0x5809) /* <CJK> */
+MAP(0x37, 0x7E, 0x57E1) /* <CJK> */
+MAP(0x38, 0x21, 0x580C) /* <CJK> */
+MAP(0x38, 0x22, 0x580D) /* <CJK> */
+MAP(0x38, 0x23, 0x581B) /* <CJK> */
+MAP(0x38, 0x24, 0x581E) /* <CJK> */
+MAP(0x38, 0x25, 0x581F) /* <CJK> */
+MAP(0x38, 0x26, 0x5820) /* <CJK> */
+MAP(0x38, 0x27, 0x5826) /* <CJK> */
+MAP(0x38, 0x28, 0x5827) /* <CJK> */
+MAP(0x38, 0x29, 0x582D) /* <CJK> */
+MAP(0x38, 0x2A, 0x5832) /* <CJK> */
+MAP(0x38, 0x2B, 0x5839) /* <CJK> */
+MAP(0x38, 0x2C, 0x583F) /* <CJK> */
+MAP(0x38, 0x2D, 0x5849) /* <CJK> */
+MAP(0x38, 0x2E, 0x584C) /* <CJK> */
+MAP(0x38, 0x2F, 0x584D) /* <CJK> */
+MAP(0x38, 0x30, 0x584F) /* <CJK> */
+MAP(0x38, 0x31, 0x5850) /* <CJK> */
+MAP(0x38, 0x32, 0x5855) /* <CJK> */
+MAP(0x38, 0x33, 0x585F) /* <CJK> */
+MAP(0x38, 0x34, 0x5861) /* <CJK> */
+MAP(0x38, 0x35, 0x5864) /* <CJK> */
+MAP(0x38, 0x36, 0x5867) /* <CJK> */
+MAP(0x38, 0x37, 0x5868) /* <CJK> */
+MAP(0x38, 0x38, 0x5878) /* <CJK> */
+MAP(0x38, 0x39, 0x587C) /* <CJK> */
+MAP(0x38, 0x3A, 0x587F) /* <CJK> */
+MAP(0x38, 0x3B, 0x5880) /* <CJK> */
+MAP(0x38, 0x3C, 0x5881) /* <CJK> */
+MAP(0x38, 0x3D, 0x5887) /* <CJK> */
+MAP(0x38, 0x3E, 0x5888) /* <CJK> */
+MAP(0x38, 0x3F, 0x5889) /* <CJK> */
+MAP(0x38, 0x40, 0x588A) /* <CJK> */
+MAP(0x38, 0x41, 0x588C) /* <CJK> */
+MAP(0x38, 0x42, 0x588D) /* <CJK> */
+MAP(0x38, 0x43, 0x588F) /* <CJK> */
+MAP(0x38, 0x44, 0x5890) /* <CJK> */
+MAP(0x38, 0x45, 0x5894) /* <CJK> */
+MAP(0x38, 0x46, 0x5896) /* <CJK> */
+MAP(0x38, 0x47, 0x589D) /* <CJK> */
+MAP(0x38, 0x48, 0x58A0) /* <CJK> */
+MAP(0x38, 0x49, 0x58A1) /* <CJK> */
+MAP(0x38, 0x4A, 0x58A2) /* <CJK> */
+MAP(0x38, 0x4B, 0x58A6) /* <CJK> */
+MAP(0x38, 0x4C, 0x58A9) /* <CJK> */
+MAP(0x38, 0x4D, 0x58B1) /* <CJK> */
+MAP(0x38, 0x4E, 0x58B2) /* <CJK> */
+MAP(0x38, 0x4F, 0x58C4) /* <CJK> */
+MAP(0x38, 0x50, 0x58BC) /* <CJK> */
+MAP(0x38, 0x51, 0x58C2) /* <CJK> */
+MAP(0x38, 0x52, 0x58C8) /* <CJK> */
+MAP(0x38, 0x53, 0x58CD) /* <CJK> */
+MAP(0x38, 0x54, 0x58CE) /* <CJK> */
+MAP(0x38, 0x55, 0x58D0) /* <CJK> */
+MAP(0x38, 0x56, 0x58D2) /* <CJK> */
+MAP(0x38, 0x57, 0x58D4) /* <CJK> */
+MAP(0x38, 0x58, 0x58D6) /* <CJK> */
+MAP(0x38, 0x59, 0x58DA) /* <CJK> */
+MAP(0x38, 0x5A, 0x58DD) /* <CJK> */
+MAP(0x38, 0x5B, 0x58E1) /* <CJK> */
+MAP(0x38, 0x5C, 0x58E2) /* <CJK> */
+MAP(0x38, 0x5D, 0x58E9) /* <CJK> */
+MAP(0x38, 0x5E, 0x58F3) /* <CJK> */
+MAP(0x38, 0x5F, 0x5905) /* <CJK> */
+MAP(0x38, 0x60, 0x5906) /* <CJK> */
+MAP(0x38, 0x61, 0x590B) /* <CJK> */
+MAP(0x38, 0x62, 0x590C) /* <CJK> */
+MAP(0x38, 0x63, 0x5912) /* <CJK> */
+MAP(0x38, 0x64, 0x5913) /* <CJK> */
+MAP(0x38, 0x65, 0x5914) /* <CJK> */
+MAP(0x38, 0x66, 0x8641) /* <CJK> */
+MAP(0x38, 0x67, 0x591D) /* <CJK> */
+MAP(0x38, 0x68, 0x5921) /* <CJK> */
+MAP(0x38, 0x69, 0x5923) /* <CJK> */
+MAP(0x38, 0x6A, 0x5924) /* <CJK> */
+MAP(0x38, 0x6B, 0x5928) /* <CJK> */
+MAP(0x38, 0x6C, 0x592F) /* <CJK> */
+MAP(0x38, 0x6D, 0x5930) /* <CJK> */
+MAP(0x38, 0x6E, 0x5933) /* <CJK> */
+MAP(0x38, 0x6F, 0x5935) /* <CJK> */
+MAP(0x38, 0x70, 0x5936) /* <CJK> */
+MAP(0x38, 0x71, 0x593F) /* <CJK> */
+MAP(0x38, 0x72, 0x5943) /* <CJK> */
+MAP(0x38, 0x73, 0x5946) /* <CJK> */
+MAP(0x38, 0x74, 0x5952) /* <CJK> */
+MAP(0x38, 0x75, 0x5953) /* <CJK> */
+MAP(0x38, 0x76, 0x5959) /* <CJK> */
+MAP(0x38, 0x77, 0x595B) /* <CJK> */
+MAP(0x38, 0x78, 0x595D) /* <CJK> */
+MAP(0x38, 0x79, 0x595E) /* <CJK> */
+MAP(0x38, 0x7A, 0x595F) /* <CJK> */
+MAP(0x38, 0x7B, 0x5961) /* <CJK> */
+MAP(0x38, 0x7C, 0x5963) /* <CJK> */
+MAP(0x38, 0x7D, 0x596B) /* <CJK> */
+MAP(0x38, 0x7E, 0x596D) /* <CJK> */
+MAP(0x39, 0x21, 0x596F) /* <CJK> */
+MAP(0x39, 0x22, 0x5972) /* <CJK> */
+MAP(0x39, 0x23, 0x5975) /* <CJK> */
+MAP(0x39, 0x24, 0x5976) /* <CJK> */
+MAP(0x39, 0x25, 0x5979) /* <CJK> */
+MAP(0x39, 0x26, 0x597B) /* <CJK> */
+MAP(0x39, 0x27, 0x597C) /* <CJK> */
+MAP(0x39, 0x28, 0x598B) /* <CJK> */
+MAP(0x39, 0x29, 0x598C) /* <CJK> */
+MAP(0x39, 0x2A, 0x598E) /* <CJK> */
+MAP(0x39, 0x2B, 0x5992) /* <CJK> */
+MAP(0x39, 0x2C, 0x5995) /* <CJK> */
+MAP(0x39, 0x2D, 0x5997) /* <CJK> */
+MAP(0x39, 0x2E, 0x599F) /* <CJK> */
+MAP(0x39, 0x2F, 0x59A4) /* <CJK> */
+MAP(0x39, 0x30, 0x59A7) /* <CJK> */
+MAP(0x39, 0x31, 0x59AD) /* <CJK> */
+MAP(0x39, 0x32, 0x59AE) /* <CJK> */
+MAP(0x39, 0x33, 0x59AF) /* <CJK> */
+MAP(0x39, 0x34, 0x59B0) /* <CJK> */
+MAP(0x39, 0x35, 0x59B3) /* <CJK> */
+MAP(0x39, 0x36, 0x59B7) /* <CJK> */
+MAP(0x39, 0x37, 0x59BA) /* <CJK> */
+MAP(0x39, 0x38, 0x59BC) /* <CJK> */
+MAP(0x39, 0x39, 0x59C1) /* <CJK> */
+MAP(0x39, 0x3A, 0x59C3) /* <CJK> */
+MAP(0x39, 0x3B, 0x59C4) /* <CJK> */
+MAP(0x39, 0x3C, 0x59C8) /* <CJK> */
+MAP(0x39, 0x3D, 0x59CA) /* <CJK> */
+MAP(0x39, 0x3E, 0x59CD) /* <CJK> */
+MAP(0x39, 0x3F, 0x59D2) /* <CJK> */
+MAP(0x39, 0x40, 0x59DD) /* <CJK> */
+MAP(0x39, 0x41, 0x59DE) /* <CJK> */
+MAP(0x39, 0x42, 0x59DF) /* <CJK> */
+MAP(0x39, 0x43, 0x59E3) /* <CJK> */
+MAP(0x39, 0x44, 0x59E4) /* <CJK> */
+MAP(0x39, 0x45, 0x59E7) /* <CJK> */
+MAP(0x39, 0x46, 0x59EE) /* <CJK> */
+MAP(0x39, 0x47, 0x59EF) /* <CJK> */
+MAP(0x39, 0x48, 0x59F1) /* <CJK> */
+MAP(0x39, 0x49, 0x59F2) /* <CJK> */
+MAP(0x39, 0x4A, 0x59F4) /* <CJK> */
+MAP(0x39, 0x4B, 0x59F7) /* <CJK> */
+MAP(0x39, 0x4C, 0x5A00) /* <CJK> */
+MAP(0x39, 0x4D, 0x5A04) /* <CJK> */
+MAP(0x39, 0x4E, 0x5A0C) /* <CJK> */
+MAP(0x39, 0x4F, 0x5A0D) /* <CJK> */
+MAP(0x39, 0x50, 0x5A0E) /* <CJK> */
+MAP(0x39, 0x51, 0x5A12) /* <CJK> */
+MAP(0x39, 0x52, 0x5A13) /* <CJK> */
+MAP(0x39, 0x53, 0x5A1E) /* <CJK> */
+MAP(0x39, 0x54, 0x5A23) /* <CJK> */
+MAP(0x39, 0x55, 0x5A24) /* <CJK> */
+MAP(0x39, 0x56, 0x5A27) /* <CJK> */
+MAP(0x39, 0x57, 0x5A28) /* <CJK> */
+MAP(0x39, 0x58, 0x5A2A) /* <CJK> */
+MAP(0x39, 0x59, 0x5A2D) /* <CJK> */
+MAP(0x39, 0x5A, 0x5A30) /* <CJK> */
+MAP(0x39, 0x5B, 0x5A44) /* <CJK> */
+MAP(0x39, 0x5C, 0x5A45) /* <CJK> */
+MAP(0x39, 0x5D, 0x5A47) /* <CJK> */
+MAP(0x39, 0x5E, 0x5A48) /* <CJK> */
+MAP(0x39, 0x5F, 0x5A4C) /* <CJK> */
+MAP(0x39, 0x60, 0x5A50) /* <CJK> */
+MAP(0x39, 0x61, 0x5A55) /* <CJK> */
+MAP(0x39, 0x62, 0x5A5E) /* <CJK> */
+MAP(0x39, 0x63, 0x5A63) /* <CJK> */
+MAP(0x39, 0x64, 0x5A65) /* <CJK> */
+MAP(0x39, 0x65, 0x5A67) /* <CJK> */
+MAP(0x39, 0x66, 0x5A6D) /* <CJK> */
+MAP(0x39, 0x67, 0x5A77) /* <CJK> */
+MAP(0x39, 0x68, 0x5A7A) /* <CJK> */
+MAP(0x39, 0x69, 0x5A7B) /* <CJK> */
+MAP(0x39, 0x6A, 0x5A7E) /* <CJK> */
+MAP(0x39, 0x6B, 0x5A8B) /* <CJK> */
+MAP(0x39, 0x6C, 0x5A90) /* <CJK> */
+MAP(0x39, 0x6D, 0x5A93) /* <CJK> */
+MAP(0x39, 0x6E, 0x5A96) /* <CJK> */
+MAP(0x39, 0x6F, 0x5A99) /* <CJK> */
+MAP(0x39, 0x70, 0x5A9C) /* <CJK> */
+MAP(0x39, 0x71, 0x5A9E) /* <CJK> */
+MAP(0x39, 0x72, 0x5A9F) /* <CJK> */
+MAP(0x39, 0x73, 0x5AA0) /* <CJK> */
+MAP(0x39, 0x74, 0x5AA2) /* <CJK> */
+MAP(0x39, 0x75, 0x5AA7) /* <CJK> */
+MAP(0x39, 0x76, 0x5AAC) /* <CJK> */
+MAP(0x39, 0x77, 0x5AB1) /* <CJK> */
+MAP(0x39, 0x78, 0x5AB2) /* <CJK> */
+MAP(0x39, 0x79, 0x5AB3) /* <CJK> */
+MAP(0x39, 0x7A, 0x5AB5) /* <CJK> */
+MAP(0x39, 0x7B, 0x5AB8) /* <CJK> */
+MAP(0x39, 0x7C, 0x5ABA) /* <CJK> */
+MAP(0x39, 0x7D, 0x5ABB) /* <CJK> */
+MAP(0x39, 0x7E, 0x5ABF) /* <CJK> */
+MAP(0x3A, 0x21, 0x5AC4) /* <CJK> */
+MAP(0x3A, 0x22, 0x5AC6) /* <CJK> */
+MAP(0x3A, 0x23, 0x5AC8) /* <CJK> */
+MAP(0x3A, 0x24, 0x5ACF) /* <CJK> */
+MAP(0x3A, 0x25, 0x5ADA) /* <CJK> */
+MAP(0x3A, 0x26, 0x5ADC) /* <CJK> */
+MAP(0x3A, 0x27, 0x5AE0) /* <CJK> */
+MAP(0x3A, 0x28, 0x5AE5) /* <CJK> */
+MAP(0x3A, 0x29, 0x5AEA) /* <CJK> */
+MAP(0x3A, 0x2A, 0x5AEE) /* <CJK> */
+MAP(0x3A, 0x2B, 0x5AF5) /* <CJK> */
+MAP(0x3A, 0x2C, 0x5AF6) /* <CJK> */
+MAP(0x3A, 0x2D, 0x5AFD) /* <CJK> */
+MAP(0x3A, 0x2E, 0x5B00) /* <CJK> */
+MAP(0x3A, 0x2F, 0x5B01) /* <CJK> */
+MAP(0x3A, 0x30, 0x5B08) /* <CJK> */
+MAP(0x3A, 0x31, 0x5B17) /* <CJK> */
+MAP(0x3A, 0x32, 0x5B34) /* <CJK> */
+MAP(0x3A, 0x33, 0x5B19) /* <CJK> */
+MAP(0x3A, 0x34, 0x5B1B) /* <CJK> */
+MAP(0x3A, 0x35, 0x5B1D) /* <CJK> */
+MAP(0x3A, 0x36, 0x5B21) /* <CJK> */
+MAP(0x3A, 0x37, 0x5B25) /* <CJK> */
+MAP(0x3A, 0x38, 0x5B2D) /* <CJK> */
+MAP(0x3A, 0x39, 0x5B38) /* <CJK> */
+MAP(0x3A, 0x3A, 0x5B41) /* <CJK> */
+MAP(0x3A, 0x3B, 0x5B4B) /* <CJK> */
+MAP(0x3A, 0x3C, 0x5B4C) /* <CJK> */
+MAP(0x3A, 0x3D, 0x5B52) /* <CJK> */
+MAP(0x3A, 0x3E, 0x5B56) /* <CJK> */
+MAP(0x3A, 0x3F, 0x5B5E) /* <CJK> */
+MAP(0x3A, 0x40, 0x5B68) /* <CJK> */
+MAP(0x3A, 0x41, 0x5B6E) /* <CJK> */
+MAP(0x3A, 0x42, 0x5B6F) /* <CJK> */
+MAP(0x3A, 0x43, 0x5B7C) /* <CJK> */
+MAP(0x3A, 0x44, 0x5B7D) /* <CJK> */
+MAP(0x3A, 0x45, 0x5B7E) /* <CJK> */
+MAP(0x3A, 0x46, 0x5B7F) /* <CJK> */
+MAP(0x3A, 0x47, 0x5B81) /* <CJK> */
+MAP(0x3A, 0x48, 0x5B84) /* <CJK> */
+MAP(0x3A, 0x49, 0x5B86) /* <CJK> */
+MAP(0x3A, 0x4A, 0x5B8A) /* <CJK> */
+MAP(0x3A, 0x4B, 0x5B8E) /* <CJK> */
+MAP(0x3A, 0x4C, 0x5B90) /* <CJK> */
+MAP(0x3A, 0x4D, 0x5B91) /* <CJK> */
+MAP(0x3A, 0x4E, 0x5B93) /* <CJK> */
+MAP(0x3A, 0x4F, 0x5B94) /* <CJK> */
+MAP(0x3A, 0x50, 0x5B96) /* <CJK> */
+MAP(0x3A, 0x51, 0x5BA8) /* <CJK> */
+MAP(0x3A, 0x52, 0x5BA9) /* <CJK> */
+MAP(0x3A, 0x53, 0x5BAC) /* <CJK> */
+MAP(0x3A, 0x54, 0x5BAD) /* <CJK> */
+MAP(0x3A, 0x55, 0x5BAF) /* <CJK> */
+MAP(0x3A, 0x56, 0x5BB1) /* <CJK> */
+MAP(0x3A, 0x57, 0x5BB2) /* <CJK> */
+MAP(0x3A, 0x58, 0x5BB7) /* <CJK> */
+MAP(0x3A, 0x59, 0x5BBA) /* <CJK> */
+MAP(0x3A, 0x5A, 0x5BBC) /* <CJK> */
+MAP(0x3A, 0x5B, 0x5BC0) /* <CJK> */
+MAP(0x3A, 0x5C, 0x5BC1) /* <CJK> */
+MAP(0x3A, 0x5D, 0x5BCD) /* <CJK> */
+MAP(0x3A, 0x5E, 0x5BCF) /* <CJK> */
+MAP(0x3A, 0x5F, 0x5BD6) /* <CJK> */
+MAP(0x3A, 0x60, 0x5BD7) /* <CJK> */
+MAP(0x3A, 0x61, 0x5BD8) /* <CJK> */
+MAP(0x3A, 0x62, 0x5BD9) /* <CJK> */
+MAP(0x3A, 0x63, 0x5BDA) /* <CJK> */
+MAP(0x3A, 0x64, 0x5BE0) /* <CJK> */
+MAP(0x3A, 0x65, 0x5BEF) /* <CJK> */
+MAP(0x3A, 0x66, 0x5BF1) /* <CJK> */
+MAP(0x3A, 0x67, 0x5BF4) /* <CJK> */
+MAP(0x3A, 0x68, 0x5BFD) /* <CJK> */
+MAP(0x3A, 0x69, 0x5C0C) /* <CJK> */
+MAP(0x3A, 0x6A, 0x5C17) /* <CJK> */
+MAP(0x3A, 0x6B, 0x5C1E) /* <CJK> */
+MAP(0x3A, 0x6C, 0x5C1F) /* <CJK> */
+MAP(0x3A, 0x6D, 0x5C23) /* <CJK> */
+MAP(0x3A, 0x6E, 0x5C26) /* <CJK> */
+MAP(0x3A, 0x6F, 0x5C29) /* <CJK> */
+MAP(0x3A, 0x70, 0x5C2B) /* <CJK> */
+MAP(0x3A, 0x71, 0x5C2C) /* <CJK> */
+MAP(0x3A, 0x72, 0x5C2E) /* <CJK> */
+MAP(0x3A, 0x73, 0x5C30) /* <CJK> */
+MAP(0x3A, 0x74, 0x5C32) /* <CJK> */
+MAP(0x3A, 0x75, 0x5C35) /* <CJK> */
+MAP(0x3A, 0x76, 0x5C36) /* <CJK> */
+MAP(0x3A, 0x77, 0x5C59) /* <CJK> */
+MAP(0x3A, 0x78, 0x5C5A) /* <CJK> */
+MAP(0x3A, 0x79, 0x5C5C) /* <CJK> */
+MAP(0x3A, 0x7A, 0x5C62) /* <CJK> */
+MAP(0x3A, 0x7B, 0x5C63) /* <CJK> */
+MAP(0x3A, 0x7C, 0x5C67) /* <CJK> */
+MAP(0x3A, 0x7D, 0x5C68) /* <CJK> */
+MAP(0x3A, 0x7E, 0x5C69) /* <CJK> */
+MAP(0x3B, 0x21, 0x5C6D) /* <CJK> */
+MAP(0x3B, 0x22, 0x5C70) /* <CJK> */
+MAP(0x3B, 0x23, 0x5C74) /* <CJK> */
+MAP(0x3B, 0x24, 0x5C75) /* <CJK> */
+MAP(0x3B, 0x25, 0x5C7A) /* <CJK> */
+MAP(0x3B, 0x26, 0x5C7B) /* <CJK> */
+MAP(0x3B, 0x27, 0x5C7C) /* <CJK> */
+MAP(0x3B, 0x28, 0x5C7D) /* <CJK> */
+MAP(0x3B, 0x29, 0x5C87) /* <CJK> */
+MAP(0x3B, 0x2A, 0x5C88) /* <CJK> */
+MAP(0x3B, 0x2B, 0x5C8A) /* <CJK> */
+MAP(0x3B, 0x2C, 0x5C8F) /* <CJK> */
+MAP(0x3B, 0x2D, 0x5C92) /* <CJK> */
+MAP(0x3B, 0x2E, 0x5C9D) /* <CJK> */
+MAP(0x3B, 0x2F, 0x5C9F) /* <CJK> */
+MAP(0x3B, 0x30, 0x5CA0) /* <CJK> */
+MAP(0x3B, 0x31, 0x5CA2) /* <CJK> */
+MAP(0x3B, 0x32, 0x5CA3) /* <CJK> */
+MAP(0x3B, 0x33, 0x5CA6) /* <CJK> */
+MAP(0x3B, 0x34, 0x5CAA) /* <CJK> */
+MAP(0x3B, 0x35, 0x5CB2) /* <CJK> */
+MAP(0x3B, 0x36, 0x5CB4) /* <CJK> */
+MAP(0x3B, 0x37, 0x5CB5) /* <CJK> */
+MAP(0x3B, 0x38, 0x5CBA) /* <CJK> */
+MAP(0x3B, 0x39, 0x5CC9) /* <CJK> */
+MAP(0x3B, 0x3A, 0x5CCB) /* <CJK> */
+MAP(0x3B, 0x3B, 0x5CD2) /* <CJK> */
+MAP(0x3B, 0x3C, 0x5CDD) /* <CJK> */
+MAP(0x3B, 0x3D, 0x5CD7) /* <CJK> */
+MAP(0x3B, 0x3E, 0x5CEE) /* <CJK> */
+MAP(0x3B, 0x3F, 0x5CF1) /* <CJK> */
+MAP(0x3B, 0x40, 0x5CF2) /* <CJK> */
+MAP(0x3B, 0x41, 0x5CF4) /* <CJK> */
+MAP(0x3B, 0x42, 0x5D01) /* <CJK> */
+MAP(0x3B, 0x43, 0x5D06) /* <CJK> */
+MAP(0x3B, 0x44, 0x5D0D) /* <CJK> */
+MAP(0x3B, 0x45, 0x5D12) /* <CJK> */
+MAP(0x3B, 0x46, 0x5D2B) /* <CJK> */
+MAP(0x3B, 0x47, 0x5D23) /* <CJK> */
+MAP(0x3B, 0x48, 0x5D24) /* <CJK> */
+MAP(0x3B, 0x49, 0x5D26) /* <CJK> */
+MAP(0x3B, 0x4A, 0x5D27) /* <CJK> */
+MAP(0x3B, 0x4B, 0x5D31) /* <CJK> */
+MAP(0x3B, 0x4C, 0x5D34) /* <CJK> */
+MAP(0x3B, 0x4D, 0x5D39) /* <CJK> */
+MAP(0x3B, 0x4E, 0x5D3D) /* <CJK> */
+MAP(0x3B, 0x4F, 0x5D3F) /* <CJK> */
+MAP(0x3B, 0x50, 0x5D42) /* <CJK> */
+MAP(0x3B, 0x51, 0x5D43) /* <CJK> */
+MAP(0x3B, 0x52, 0x5D46) /* <CJK> */
+MAP(0x3B, 0x53, 0x5D48) /* <CJK> */
+MAP(0x3B, 0x54, 0x5D55) /* <CJK> */
+MAP(0x3B, 0x55, 0x5D51) /* <CJK> */
+MAP(0x3B, 0x56, 0x5D59) /* <CJK> */
+MAP(0x3B, 0x57, 0x5D4A) /* <CJK> */
+MAP(0x3B, 0x58, 0x5D5F) /* <CJK> */
+MAP(0x3B, 0x59, 0x5D60) /* <CJK> */
+MAP(0x3B, 0x5A, 0x5D61) /* <CJK> */
+MAP(0x3B, 0x5B, 0x5D62) /* <CJK> */
+MAP(0x3B, 0x5C, 0x5D64) /* <CJK> */
+MAP(0x3B, 0x5D, 0x5D6A) /* <CJK> */
+MAP(0x3B, 0x5E, 0x5D6D) /* <CJK> */
+MAP(0x3B, 0x5F, 0x5D70) /* <CJK> */
+MAP(0x3B, 0x60, 0x5D79) /* <CJK> */
+MAP(0x3B, 0x61, 0x5D7A) /* <CJK> */
+MAP(0x3B, 0x62, 0x5D7E) /* <CJK> */
+MAP(0x3B, 0x63, 0x5D7F) /* <CJK> */
+MAP(0x3B, 0x64, 0x5D81) /* <CJK> */
+MAP(0x3B, 0x65, 0x5D83) /* <CJK> */
+MAP(0x3B, 0x66, 0x5D88) /* <CJK> */
+MAP(0x3B, 0x67, 0x5D8A) /* <CJK> */
+MAP(0x3B, 0x68, 0x5D92) /* <CJK> */
+MAP(0x3B, 0x69, 0x5D93) /* <CJK> */
+MAP(0x3B, 0x6A, 0x5D94) /* <CJK> */
+MAP(0x3B, 0x6B, 0x5D95) /* <CJK> */
+MAP(0x3B, 0x6C, 0x5D99) /* <CJK> */
+MAP(0x3B, 0x6D, 0x5D9B) /* <CJK> */
+MAP(0x3B, 0x6E, 0x5D9F) /* <CJK> */
+MAP(0x3B, 0x6F, 0x5DA0) /* <CJK> */
+MAP(0x3B, 0x70, 0x5DA7) /* <CJK> */
+MAP(0x3B, 0x71, 0x5DAB) /* <CJK> */
+MAP(0x3B, 0x72, 0x5DB0) /* <CJK> */
+MAP(0x3B, 0x73, 0x5DB4) /* <CJK> */
+MAP(0x3B, 0x74, 0x5DB8) /* <CJK> */
+MAP(0x3B, 0x75, 0x5DB9) /* <CJK> */
+MAP(0x3B, 0x76, 0x5DC3) /* <CJK> */
+MAP(0x3B, 0x77, 0x5DC7) /* <CJK> */
+MAP(0x3B, 0x78, 0x5DCB) /* <CJK> */
+MAP(0x3B, 0x79, 0x5DD0) /* <CJK> */
+MAP(0x3B, 0x7A, 0x5DCE) /* <CJK> */
+MAP(0x3B, 0x7B, 0x5DD8) /* <CJK> */
+MAP(0x3B, 0x7C, 0x5DD9) /* <CJK> */
+MAP(0x3B, 0x7D, 0x5DE0) /* <CJK> */
+MAP(0x3B, 0x7E, 0x5DE4) /* <CJK> */
+MAP(0x3C, 0x21, 0x5DE9) /* <CJK> */
+MAP(0x3C, 0x22, 0x5DF8) /* <CJK> */
+MAP(0x3C, 0x23, 0x5DF9) /* <CJK> */
+MAP(0x3C, 0x24, 0x5E00) /* <CJK> */
+MAP(0x3C, 0x25, 0x5E07) /* <CJK> */
+MAP(0x3C, 0x26, 0x5E0D) /* <CJK> */
+MAP(0x3C, 0x27, 0x5E12) /* <CJK> */
+MAP(0x3C, 0x28, 0x5E14) /* <CJK> */
+MAP(0x3C, 0x29, 0x5E15) /* <CJK> */
+MAP(0x3C, 0x2A, 0x5E18) /* <CJK> */
+MAP(0x3C, 0x2B, 0x5E1F) /* <CJK> */
+MAP(0x3C, 0x2C, 0x5E20) /* <CJK> */
+MAP(0x3C, 0x2D, 0x5E2E) /* <CJK> */
+MAP(0x3C, 0x2E, 0x5E28) /* <CJK> */
+MAP(0x3C, 0x2F, 0x5E32) /* <CJK> */
+MAP(0x3C, 0x30, 0x5E35) /* <CJK> */
+MAP(0x3C, 0x31, 0x5E3E) /* <CJK> */
+MAP(0x3C, 0x32, 0x5E4B) /* <CJK> */
+MAP(0x3C, 0x33, 0x5E50) /* <CJK> */
+MAP(0x3C, 0x34, 0x5E49) /* <CJK> */
+MAP(0x3C, 0x35, 0x5E51) /* <CJK> */
+MAP(0x3C, 0x36, 0x5E56) /* <CJK> */
+MAP(0x3C, 0x37, 0x5E58) /* <CJK> */
+MAP(0x3C, 0x38, 0x5E5B) /* <CJK> */
+MAP(0x3C, 0x39, 0x5E5C) /* <CJK> */
+MAP(0x3C, 0x3A, 0x5E5E) /* <CJK> */
+MAP(0x3C, 0x3B, 0x5E68) /* <CJK> */
+MAP(0x3C, 0x3C, 0x5E6A) /* <CJK> */
+MAP(0x3C, 0x3D, 0x5E6B) /* <CJK> */
+MAP(0x3C, 0x3E, 0x5E6C) /* <CJK> */
+MAP(0x3C, 0x3F, 0x5E6D) /* <CJK> */
+MAP(0x3C, 0x40, 0x5E6E) /* <CJK> */
+MAP(0x3C, 0x41, 0x5E70) /* <CJK> */
+MAP(0x3C, 0x42, 0x5E80) /* <CJK> */
+MAP(0x3C, 0x43, 0x5E8B) /* <CJK> */
+MAP(0x3C, 0x44, 0x5E8E) /* <CJK> */
+MAP(0x3C, 0x45, 0x5EA2) /* <CJK> */
+MAP(0x3C, 0x46, 0x5EA4) /* <CJK> */
+MAP(0x3C, 0x47, 0x5EA5) /* <CJK> */
+MAP(0x3C, 0x48, 0x5EA8) /* <CJK> */
+MAP(0x3C, 0x49, 0x5EAA) /* <CJK> */
+MAP(0x3C, 0x4A, 0x5EAC) /* <CJK> */
+MAP(0x3C, 0x4B, 0x5EB1) /* <CJK> */
+MAP(0x3C, 0x4C, 0x5EB3) /* <CJK> */
+MAP(0x3C, 0x4D, 0x5EBD) /* <CJK> */
+MAP(0x3C, 0x4E, 0x5EBE) /* <CJK> */
+MAP(0x3C, 0x4F, 0x5EBF) /* <CJK> */
+MAP(0x3C, 0x50, 0x5EC6) /* <CJK> */
+MAP(0x3C, 0x51, 0x5ECC) /* <CJK> */
+MAP(0x3C, 0x52, 0x5ECB) /* <CJK> */
+MAP(0x3C, 0x53, 0x5ECE) /* <CJK> */
+MAP(0x3C, 0x54, 0x5ED1) /* <CJK> */
+MAP(0x3C, 0x55, 0x5ED2) /* <CJK> */
+MAP(0x3C, 0x56, 0x5ED4) /* <CJK> */
+MAP(0x3C, 0x57, 0x5ED5) /* <CJK> */
+MAP(0x3C, 0x58, 0x5EDC) /* <CJK> */
+MAP(0x3C, 0x59, 0x5EDE) /* <CJK> */
+MAP(0x3C, 0x5A, 0x5EE5) /* <CJK> */
+MAP(0x3C, 0x5B, 0x5EEB) /* <CJK> */
+MAP(0x3C, 0x5C, 0x5F02) /* <CJK> */
+MAP(0x3C, 0x5D, 0x5F06) /* <CJK> */
+MAP(0x3C, 0x5E, 0x5F07) /* <CJK> */
+MAP(0x3C, 0x5F, 0x5F08) /* <CJK> */
+MAP(0x3C, 0x60, 0x5F0E) /* <CJK> */
+MAP(0x3C, 0x61, 0x5F19) /* <CJK> */
+MAP(0x3C, 0x62, 0x5F1C) /* <CJK> */
+MAP(0x3C, 0x63, 0x5F1D) /* <CJK> */
+MAP(0x3C, 0x64, 0x5F21) /* <CJK> */
+MAP(0x3C, 0x65, 0x5F22) /* <CJK> */
+MAP(0x3C, 0x66, 0x5F23) /* <CJK> */
+MAP(0x3C, 0x67, 0x5F24) /* <CJK> */
+MAP(0x3C, 0x68, 0x5F28) /* <CJK> */
+MAP(0x3C, 0x69, 0x5F2B) /* <CJK> */
+MAP(0x3C, 0x6A, 0x5F2C) /* <CJK> */
+MAP(0x3C, 0x6B, 0x5F2E) /* <CJK> */
+MAP(0x3C, 0x6C, 0x5F30) /* <CJK> */
+MAP(0x3C, 0x6D, 0x5F34) /* <CJK> */
+MAP(0x3C, 0x6E, 0x5F36) /* <CJK> */
+MAP(0x3C, 0x6F, 0x5F3B) /* <CJK> */
+MAP(0x3C, 0x70, 0x5F3D) /* <CJK> */
+MAP(0x3C, 0x71, 0x5F3F) /* <CJK> */
+MAP(0x3C, 0x72, 0x5F40) /* <CJK> */
+MAP(0x3C, 0x73, 0x5F44) /* <CJK> */
+MAP(0x3C, 0x74, 0x5F45) /* <CJK> */
+MAP(0x3C, 0x75, 0x5F47) /* <CJK> */
+MAP(0x3C, 0x76, 0x5F4D) /* <CJK> */
+MAP(0x3C, 0x77, 0x5F50) /* <CJK> */
+MAP(0x3C, 0x78, 0x5F54) /* <CJK> */
+MAP(0x3C, 0x79, 0x5F58) /* <CJK> */
+MAP(0x3C, 0x7A, 0x5F5B) /* <CJK> */
+MAP(0x3C, 0x7B, 0x5F60) /* <CJK> */
+MAP(0x3C, 0x7C, 0x5F63) /* <CJK> */
+MAP(0x3C, 0x7D, 0x5F64) /* <CJK> */
+MAP(0x3C, 0x7E, 0x5F67) /* <CJK> */
+MAP(0x3D, 0x21, 0x5F6F) /* <CJK> */
+MAP(0x3D, 0x22, 0x5F72) /* <CJK> */
+MAP(0x3D, 0x23, 0x5F74) /* <CJK> */
+MAP(0x3D, 0x24, 0x5F75) /* <CJK> */
+MAP(0x3D, 0x25, 0x5F78) /* <CJK> */
+MAP(0x3D, 0x26, 0x5F7A) /* <CJK> */
+MAP(0x3D, 0x27, 0x5F7D) /* <CJK> */
+MAP(0x3D, 0x28, 0x5F7E) /* <CJK> */
+MAP(0x3D, 0x29, 0x5F89) /* <CJK> */
+MAP(0x3D, 0x2A, 0x5F8D) /* <CJK> */
+MAP(0x3D, 0x2B, 0x5F8F) /* <CJK> */
+MAP(0x3D, 0x2C, 0x5F96) /* <CJK> */
+MAP(0x3D, 0x2D, 0x5F9C) /* <CJK> */
+MAP(0x3D, 0x2E, 0x5F9D) /* <CJK> */
+MAP(0x3D, 0x2F, 0x5FA2) /* <CJK> */
+MAP(0x3D, 0x30, 0x5FA7) /* <CJK> */
+MAP(0x3D, 0x31, 0x5FAB) /* <CJK> */
+MAP(0x3D, 0x32, 0x5FA4) /* <CJK> */
+MAP(0x3D, 0x33, 0x5FAC) /* <CJK> */
+MAP(0x3D, 0x34, 0x5FAF) /* <CJK> */
+MAP(0x3D, 0x35, 0x5FB0) /* <CJK> */
+MAP(0x3D, 0x36, 0x5FB1) /* <CJK> */
+MAP(0x3D, 0x37, 0x5FB8) /* <CJK> */
+MAP(0x3D, 0x38, 0x5FC4) /* <CJK> */
+MAP(0x3D, 0x39, 0x5FC7) /* <CJK> */
+MAP(0x3D, 0x3A, 0x5FC8) /* <CJK> */
+MAP(0x3D, 0x3B, 0x5FC9) /* <CJK> */
+MAP(0x3D, 0x3C, 0x5FCB) /* <CJK> */
+MAP(0x3D, 0x3D, 0x5FD0) /* <CJK> */
+MAP(0x3D, 0x3E, 0x5FD1) /* <CJK> */
+MAP(0x3D, 0x3F, 0x5FD2) /* <CJK> */
+MAP(0x3D, 0x40, 0x5FD3) /* <CJK> */
+MAP(0x3D, 0x41, 0x5FD4) /* <CJK> */
+MAP(0x3D, 0x42, 0x5FDE) /* <CJK> */
+MAP(0x3D, 0x43, 0x5FE1) /* <CJK> */
+MAP(0x3D, 0x44, 0x5FE2) /* <CJK> */
+MAP(0x3D, 0x45, 0x5FE8) /* <CJK> */
+MAP(0x3D, 0x46, 0x5FE9) /* <CJK> */
+MAP(0x3D, 0x47, 0x5FEA) /* <CJK> */
+MAP(0x3D, 0x48, 0x5FEC) /* <CJK> */
+MAP(0x3D, 0x49, 0x5FED) /* <CJK> */
+MAP(0x3D, 0x4A, 0x5FEE) /* <CJK> */
+MAP(0x3D, 0x4B, 0x5FEF) /* <CJK> */
+MAP(0x3D, 0x4C, 0x5FF2) /* <CJK> */
+MAP(0x3D, 0x4D, 0x5FF3) /* <CJK> */
+MAP(0x3D, 0x4E, 0x5FF6) /* <CJK> */
+MAP(0x3D, 0x4F, 0x5FFA) /* <CJK> */
+MAP(0x3D, 0x50, 0x5FFC) /* <CJK> */
+MAP(0x3D, 0x51, 0x6007) /* <CJK> */
+MAP(0x3D, 0x52, 0x600A) /* <CJK> */
+MAP(0x3D, 0x53, 0x600D) /* <CJK> */
+MAP(0x3D, 0x54, 0x6013) /* <CJK> */
+MAP(0x3D, 0x55, 0x6014) /* <CJK> */
+MAP(0x3D, 0x56, 0x6017) /* <CJK> */
+MAP(0x3D, 0x57, 0x6018) /* <CJK> */
+MAP(0x3D, 0x58, 0x601A) /* <CJK> */
+MAP(0x3D, 0x59, 0x601F) /* <CJK> */
+MAP(0x3D, 0x5A, 0x6024) /* <CJK> */
+MAP(0x3D, 0x5B, 0x602D) /* <CJK> */
+MAP(0x3D, 0x5C, 0x6033) /* <CJK> */
+MAP(0x3D, 0x5D, 0x6035) /* <CJK> */
+MAP(0x3D, 0x5E, 0x6040) /* <CJK> */
+MAP(0x3D, 0x5F, 0x6047) /* <CJK> */
+MAP(0x3D, 0x60, 0x6048) /* <CJK> */
+MAP(0x3D, 0x61, 0x6049) /* <CJK> */
+MAP(0x3D, 0x62, 0x604C) /* <CJK> */
+MAP(0x3D, 0x63, 0x6051) /* <CJK> */
+MAP(0x3D, 0x64, 0x6054) /* <CJK> */
+MAP(0x3D, 0x65, 0x6056) /* <CJK> */
+MAP(0x3D, 0x66, 0x6057) /* <CJK> */
+MAP(0x3D, 0x67, 0x605D) /* <CJK> */
+MAP(0x3D, 0x68, 0x6061) /* <CJK> */
+MAP(0x3D, 0x69, 0x6067) /* <CJK> */
+MAP(0x3D, 0x6A, 0x6071) /* <CJK> */
+MAP(0x3D, 0x6B, 0x607E) /* <CJK> */
+MAP(0x3D, 0x6C, 0x607F) /* <CJK> */
+MAP(0x3D, 0x6D, 0x6082) /* <CJK> */
+MAP(0x3D, 0x6E, 0x6086) /* <CJK> */
+MAP(0x3D, 0x6F, 0x6088) /* <CJK> */
+MAP(0x3D, 0x70, 0x608A) /* <CJK> */
+MAP(0x3D, 0x71, 0x608E) /* <CJK> */
+MAP(0x3D, 0x72, 0x6091) /* <CJK> */
+MAP(0x3D, 0x73, 0x6093) /* <CJK> */
+MAP(0x3D, 0x74, 0x6095) /* <CJK> */
+MAP(0x3D, 0x75, 0x6098) /* <CJK> */
+MAP(0x3D, 0x76, 0x609D) /* <CJK> */
+MAP(0x3D, 0x77, 0x609E) /* <CJK> */
+MAP(0x3D, 0x78, 0x60A2) /* <CJK> */
+MAP(0x3D, 0x79, 0x60A4) /* <CJK> */
+MAP(0x3D, 0x7A, 0x60A5) /* <CJK> */
+MAP(0x3D, 0x7B, 0x60A8) /* <CJK> */
+MAP(0x3D, 0x7C, 0x60B0) /* <CJK> */
+MAP(0x3D, 0x7D, 0x60B1) /* <CJK> */
+MAP(0x3D, 0x7E, 0x60B7) /* <CJK> */
+MAP(0x3E, 0x21, 0x60BB) /* <CJK> */
+MAP(0x3E, 0x22, 0x60BE) /* <CJK> */
+MAP(0x3E, 0x23, 0x60C2) /* <CJK> */
+MAP(0x3E, 0x24, 0x60C4) /* <CJK> */
+MAP(0x3E, 0x25, 0x60C8) /* <CJK> */
+MAP(0x3E, 0x26, 0x60C9) /* <CJK> */
+MAP(0x3E, 0x27, 0x60CA) /* <CJK> */
+MAP(0x3E, 0x28, 0x60CB) /* <CJK> */
+MAP(0x3E, 0x29, 0x60CE) /* <CJK> */
+MAP(0x3E, 0x2A, 0x60CF) /* <CJK> */
+MAP(0x3E, 0x2B, 0x60D4) /* <CJK> */
+MAP(0x3E, 0x2C, 0x60D5) /* <CJK> */
+MAP(0x3E, 0x2D, 0x60D9) /* <CJK> */
+MAP(0x3E, 0x2E, 0x60DB) /* <CJK> */
+MAP(0x3E, 0x2F, 0x60DD) /* <CJK> */
+MAP(0x3E, 0x30, 0x60DE) /* <CJK> */
+MAP(0x3E, 0x31, 0x60E2) /* <CJK> */
+MAP(0x3E, 0x32, 0x60E5) /* <CJK> */
+MAP(0x3E, 0x33, 0x60F2) /* <CJK> */
+MAP(0x3E, 0x34, 0x60F5) /* <CJK> */
+MAP(0x3E, 0x35, 0x60F8) /* <CJK> */
+MAP(0x3E, 0x36, 0x60FC) /* <CJK> */
+MAP(0x3E, 0x37, 0x60FD) /* <CJK> */
+MAP(0x3E, 0x38, 0x6102) /* <CJK> */
+MAP(0x3E, 0x39, 0x6107) /* <CJK> */
+MAP(0x3E, 0x3A, 0x610A) /* <CJK> */
+MAP(0x3E, 0x3B, 0x610C) /* <CJK> */
+MAP(0x3E, 0x3C, 0x6110) /* <CJK> */
+MAP(0x3E, 0x3D, 0x6111) /* <CJK> */
+MAP(0x3E, 0x3E, 0x6112) /* <CJK> */
+MAP(0x3E, 0x3F, 0x6113) /* <CJK> */
+MAP(0x3E, 0x40, 0x6114) /* <CJK> */
+MAP(0x3E, 0x41, 0x6116) /* <CJK> */
+MAP(0x3E, 0x42, 0x6117) /* <CJK> */
+MAP(0x3E, 0x43, 0x6119) /* <CJK> */
+MAP(0x3E, 0x44, 0x611C) /* <CJK> */
+MAP(0x3E, 0x45, 0x611E) /* <CJK> */
+MAP(0x3E, 0x46, 0x6122) /* <CJK> */
+MAP(0x3E, 0x47, 0x612A) /* <CJK> */
+MAP(0x3E, 0x48, 0x612B) /* <CJK> */
+MAP(0x3E, 0x49, 0x6130) /* <CJK> */
+MAP(0x3E, 0x4A, 0x6131) /* <CJK> */
+MAP(0x3E, 0x4B, 0x6135) /* <CJK> */
+MAP(0x3E, 0x4C, 0x6136) /* <CJK> */
+MAP(0x3E, 0x4D, 0x6137) /* <CJK> */
+MAP(0x3E, 0x4E, 0x6139) /* <CJK> */
+MAP(0x3E, 0x4F, 0x6141) /* <CJK> */
+MAP(0x3E, 0x50, 0x6145) /* <CJK> */
+MAP(0x3E, 0x51, 0x6146) /* <CJK> */
+MAP(0x3E, 0x52, 0x6149) /* <CJK> */
+MAP(0x3E, 0x53, 0x615E) /* <CJK> */
+MAP(0x3E, 0x54, 0x6160) /* <CJK> */
+MAP(0x3E, 0x55, 0x616C) /* <CJK> */
+MAP(0x3E, 0x56, 0x6172) /* <CJK> */
+MAP(0x3E, 0x57, 0x6178) /* <CJK> */
+MAP(0x3E, 0x58, 0x617B) /* <CJK> */
+MAP(0x3E, 0x59, 0x617C) /* <CJK> */
+MAP(0x3E, 0x5A, 0x617F) /* <CJK> */
+MAP(0x3E, 0x5B, 0x6180) /* <CJK> */
+MAP(0x3E, 0x5C, 0x6181) /* <CJK> */
+MAP(0x3E, 0x5D, 0x6183) /* <CJK> */
+MAP(0x3E, 0x5E, 0x6184) /* <CJK> */
+MAP(0x3E, 0x5F, 0x618B) /* <CJK> */
+MAP(0x3E, 0x60, 0x618D) /* <CJK> */
+MAP(0x3E, 0x61, 0x6192) /* <CJK> */
+MAP(0x3E, 0x62, 0x6193) /* <CJK> */
+MAP(0x3E, 0x63, 0x6197) /* <CJK> */
+MAP(0x3E, 0x64, 0x6198) /* <CJK> */
+MAP(0x3E, 0x65, 0x619C) /* <CJK> */
+MAP(0x3E, 0x66, 0x619D) /* <CJK> */
+MAP(0x3E, 0x67, 0x619F) /* <CJK> */
+MAP(0x3E, 0x68, 0x61A0) /* <CJK> */
+MAP(0x3E, 0x69, 0x61A5) /* <CJK> */
+MAP(0x3E, 0x6A, 0x61A8) /* <CJK> */
+MAP(0x3E, 0x6B, 0x61AA) /* <CJK> */
+MAP(0x3E, 0x6C, 0x61AD) /* <CJK> */
+MAP(0x3E, 0x6D, 0x61B8) /* <CJK> */
+MAP(0x3E, 0x6E, 0x61B9) /* <CJK> */
+MAP(0x3E, 0x6F, 0x61BC) /* <CJK> */
+MAP(0x3E, 0x70, 0x61C0) /* <CJK> */
+MAP(0x3E, 0x71, 0x61C1) /* <CJK> */
+MAP(0x3E, 0x72, 0x61C2) /* <CJK> */
+MAP(0x3E, 0x73, 0x61CE) /* <CJK> */
+MAP(0x3E, 0x74, 0x61CF) /* <CJK> */
+MAP(0x3E, 0x75, 0x61D5) /* <CJK> */
+MAP(0x3E, 0x76, 0x61DC) /* <CJK> */
+MAP(0x3E, 0x77, 0x61DD) /* <CJK> */
+MAP(0x3E, 0x78, 0x61DE) /* <CJK> */
+MAP(0x3E, 0x79, 0x61DF) /* <CJK> */
+MAP(0x3E, 0x7A, 0x61E1) /* <CJK> */
+MAP(0x3E, 0x7B, 0x61E2) /* <CJK> */
+MAP(0x3E, 0x7C, 0x61E7) /* <CJK> */
+MAP(0x3E, 0x7D, 0x61E9) /* <CJK> */
+MAP(0x3E, 0x7E, 0x61E5) /* <CJK> */
+MAP(0x3F, 0x21, 0x61EC) /* <CJK> */
+MAP(0x3F, 0x22, 0x61ED) /* <CJK> */
+MAP(0x3F, 0x23, 0x61EF) /* <CJK> */
+MAP(0x3F, 0x24, 0x6201) /* <CJK> */
+MAP(0x3F, 0x25, 0x6203) /* <CJK> */
+MAP(0x3F, 0x26, 0x6204) /* <CJK> */
+MAP(0x3F, 0x27, 0x6207) /* <CJK> */
+MAP(0x3F, 0x28, 0x6213) /* <CJK> */
+MAP(0x3F, 0x29, 0x6215) /* <CJK> */
+MAP(0x3F, 0x2A, 0x621C) /* <CJK> */
+MAP(0x3F, 0x2B, 0x6220) /* <CJK> */
+MAP(0x3F, 0x2C, 0x6222) /* <CJK> */
+MAP(0x3F, 0x2D, 0x6223) /* <CJK> */
+MAP(0x3F, 0x2E, 0x6227) /* <CJK> */
+MAP(0x3F, 0x2F, 0x6229) /* <CJK> */
+MAP(0x3F, 0x30, 0x622B) /* <CJK> */
+MAP(0x3F, 0x31, 0x6239) /* <CJK> */
+MAP(0x3F, 0x32, 0x623D) /* <CJK> */
+MAP(0x3F, 0x33, 0x6242) /* <CJK> */
+MAP(0x3F, 0x34, 0x6243) /* <CJK> */
+MAP(0x3F, 0x35, 0x6244) /* <CJK> */
+MAP(0x3F, 0x36, 0x6246) /* <CJK> */
+MAP(0x3F, 0x37, 0x624C) /* <CJK> */
+MAP(0x3F, 0x38, 0x6250) /* <CJK> */
+MAP(0x3F, 0x39, 0x6251) /* <CJK> */
+MAP(0x3F, 0x3A, 0x6252) /* <CJK> */
+MAP(0x3F, 0x3B, 0x6254) /* <CJK> */
+MAP(0x3F, 0x3C, 0x6256) /* <CJK> */
+MAP(0x3F, 0x3D, 0x625A) /* <CJK> */
+MAP(0x3F, 0x3E, 0x625C) /* <CJK> */
+MAP(0x3F, 0x3F, 0x6264) /* <CJK> */
+MAP(0x3F, 0x40, 0x626D) /* <CJK> */
+MAP(0x3F, 0x41, 0x626F) /* <CJK> */
+MAP(0x3F, 0x42, 0x6273) /* <CJK> */
+MAP(0x3F, 0x43, 0x627A) /* <CJK> */
+MAP(0x3F, 0x44, 0x627D) /* <CJK> */
+MAP(0x3F, 0x45, 0x628D) /* <CJK> */
+MAP(0x3F, 0x46, 0x628E) /* <CJK> */
+MAP(0x3F, 0x47, 0x628F) /* <CJK> */
+MAP(0x3F, 0x48, 0x6290) /* <CJK> */
+MAP(0x3F, 0x49, 0x62A6) /* <CJK> */
+MAP(0x3F, 0x4A, 0x62A8) /* <CJK> */
+MAP(0x3F, 0x4B, 0x62B3) /* <CJK> */
+MAP(0x3F, 0x4C, 0x62B6) /* <CJK> */
+MAP(0x3F, 0x4D, 0x62B7) /* <CJK> */
+MAP(0x3F, 0x4E, 0x62BA) /* <CJK> */
+MAP(0x3F, 0x4F, 0x62BE) /* <CJK> */
+MAP(0x3F, 0x50, 0x62BF) /* <CJK> */
+MAP(0x3F, 0x51, 0x62C4) /* <CJK> */
+MAP(0x3F, 0x52, 0x62CE) /* <CJK> */
+MAP(0x3F, 0x53, 0x62D5) /* <CJK> */
+MAP(0x3F, 0x54, 0x62D6) /* <CJK> */
+MAP(0x3F, 0x55, 0x62DA) /* <CJK> */
+MAP(0x3F, 0x56, 0x62EA) /* <CJK> */
+MAP(0x3F, 0x57, 0x62F2) /* <CJK> */
+MAP(0x3F, 0x58, 0x62F4) /* <CJK> */
+MAP(0x3F, 0x59, 0x62FC) /* <CJK> */
+MAP(0x3F, 0x5A, 0x62FD) /* <CJK> */
+MAP(0x3F, 0x5B, 0x6303) /* <CJK> */
+MAP(0x3F, 0x5C, 0x6304) /* <CJK> */
+MAP(0x3F, 0x5D, 0x630A) /* <CJK> */
+MAP(0x3F, 0x5E, 0x630B) /* <CJK> */
+MAP(0x3F, 0x5F, 0x630D) /* <CJK> */
+MAP(0x3F, 0x60, 0x6310) /* <CJK> */
+MAP(0x3F, 0x61, 0x6313) /* <CJK> */
+MAP(0x3F, 0x62, 0x6316) /* <CJK> */
+MAP(0x3F, 0x63, 0x6318) /* <CJK> */
+MAP(0x3F, 0x64, 0x6329) /* <CJK> */
+MAP(0x3F, 0x65, 0x632A) /* <CJK> */
+MAP(0x3F, 0x66, 0x632D) /* <CJK> */
+MAP(0x3F, 0x67, 0x6335) /* <CJK> */
+MAP(0x3F, 0x68, 0x6336) /* <CJK> */
+MAP(0x3F, 0x69, 0x6339) /* <CJK> */
+MAP(0x3F, 0x6A, 0x633C) /* <CJK> */
+MAP(0x3F, 0x6B, 0x6341) /* <CJK> */
+MAP(0x3F, 0x6C, 0x6342) /* <CJK> */
+MAP(0x3F, 0x6D, 0x6343) /* <CJK> */
+MAP(0x3F, 0x6E, 0x6344) /* <CJK> */
+MAP(0x3F, 0x6F, 0x6346) /* <CJK> */
+MAP(0x3F, 0x70, 0x634A) /* <CJK> */
+MAP(0x3F, 0x71, 0x634B) /* <CJK> */
+MAP(0x3F, 0x72, 0x634E) /* <CJK> */
+MAP(0x3F, 0x73, 0x6352) /* <CJK> */
+MAP(0x3F, 0x74, 0x6353) /* <CJK> */
+MAP(0x3F, 0x75, 0x6354) /* <CJK> */
+MAP(0x3F, 0x76, 0x6358) /* <CJK> */
+MAP(0x3F, 0x77, 0x635B) /* <CJK> */
+MAP(0x3F, 0x78, 0x6365) /* <CJK> */
+MAP(0x3F, 0x79, 0x6366) /* <CJK> */
+MAP(0x3F, 0x7A, 0x636C) /* <CJK> */
+MAP(0x3F, 0x7B, 0x636D) /* <CJK> */
+MAP(0x3F, 0x7C, 0x6371) /* <CJK> */
+MAP(0x3F, 0x7D, 0x6374) /* <CJK> */
+MAP(0x3F, 0x7E, 0x6375) /* <CJK> */
+MAP(0x40, 0x21, 0x6378) /* <CJK> */
+MAP(0x40, 0x22, 0x637C) /* <CJK> */
+MAP(0x40, 0x23, 0x637D) /* <CJK> */
+MAP(0x40, 0x24, 0x637F) /* <CJK> */
+MAP(0x40, 0x25, 0x6382) /* <CJK> */
+MAP(0x40, 0x26, 0x6384) /* <CJK> */
+MAP(0x40, 0x27, 0x6387) /* <CJK> */
+MAP(0x40, 0x28, 0x638A) /* <CJK> */
+MAP(0x40, 0x29, 0x6390) /* <CJK> */
+MAP(0x40, 0x2A, 0x6394) /* <CJK> */
+MAP(0x40, 0x2B, 0x6395) /* <CJK> */
+MAP(0x40, 0x2C, 0x6399) /* <CJK> */
+MAP(0x40, 0x2D, 0x639A) /* <CJK> */
+MAP(0x40, 0x2E, 0x639E) /* <CJK> */
+MAP(0x40, 0x2F, 0x63A4) /* <CJK> */
+MAP(0x40, 0x30, 0x63A6) /* <CJK> */
+MAP(0x40, 0x31, 0x63AD) /* <CJK> */
+MAP(0x40, 0x32, 0x63AE) /* <CJK> */
+MAP(0x40, 0x33, 0x63AF) /* <CJK> */
+MAP(0x40, 0x34, 0x63BD) /* <CJK> */
+MAP(0x40, 0x35, 0x63C1) /* <CJK> */
+MAP(0x40, 0x36, 0x63C5) /* <CJK> */
+MAP(0x40, 0x37, 0x63C8) /* <CJK> */
+MAP(0x40, 0x38, 0x63CE) /* <CJK> */
+MAP(0x40, 0x39, 0x63D1) /* <CJK> */
+MAP(0x40, 0x3A, 0x63D3) /* <CJK> */
+MAP(0x40, 0x3B, 0x63D4) /* <CJK> */
+MAP(0x40, 0x3C, 0x63D5) /* <CJK> */
+MAP(0x40, 0x3D, 0x63DC) /* <CJK> */
+MAP(0x40, 0x3E, 0x63E0) /* <CJK> */
+MAP(0x40, 0x3F, 0x63E5) /* <CJK> */
+MAP(0x40, 0x40, 0x63EA) /* <CJK> */
+MAP(0x40, 0x41, 0x63EC) /* <CJK> */
+MAP(0x40, 0x42, 0x63F2) /* <CJK> */
+MAP(0x40, 0x43, 0x63F3) /* <CJK> */
+MAP(0x40, 0x44, 0x63F5) /* <CJK> */
+MAP(0x40, 0x45, 0x63F8) /* <CJK> */
+MAP(0x40, 0x46, 0x63F9) /* <CJK> */
+MAP(0x40, 0x47, 0x6409) /* <CJK> */
+MAP(0x40, 0x48, 0x640A) /* <CJK> */
+MAP(0x40, 0x49, 0x6410) /* <CJK> */
+MAP(0x40, 0x4A, 0x6412) /* <CJK> */
+MAP(0x40, 0x4B, 0x6414) /* <CJK> */
+MAP(0x40, 0x4C, 0x6418) /* <CJK> */
+MAP(0x40, 0x4D, 0x641E) /* <CJK> */
+MAP(0x40, 0x4E, 0x6420) /* <CJK> */
+MAP(0x40, 0x4F, 0x6422) /* <CJK> */
+MAP(0x40, 0x50, 0x6424) /* <CJK> */
+MAP(0x40, 0x51, 0x6425) /* <CJK> */
+MAP(0x40, 0x52, 0x6429) /* <CJK> */
+MAP(0x40, 0x53, 0x642A) /* <CJK> */
+MAP(0x40, 0x54, 0x642F) /* <CJK> */
+MAP(0x40, 0x55, 0x6430) /* <CJK> */
+MAP(0x40, 0x56, 0x6435) /* <CJK> */
+MAP(0x40, 0x57, 0x643D) /* <CJK> */
+MAP(0x40, 0x58, 0x643F) /* <CJK> */
+MAP(0x40, 0x59, 0x644B) /* <CJK> */
+MAP(0x40, 0x5A, 0x644F) /* <CJK> */
+MAP(0x40, 0x5B, 0x6451) /* <CJK> */
+MAP(0x40, 0x5C, 0x6452) /* <CJK> */
+MAP(0x40, 0x5D, 0x6453) /* <CJK> */
+MAP(0x40, 0x5E, 0x6454) /* <CJK> */
+MAP(0x40, 0x5F, 0x645A) /* <CJK> */
+MAP(0x40, 0x60, 0x645B) /* <CJK> */
+MAP(0x40, 0x61, 0x645C) /* <CJK> */
+MAP(0x40, 0x62, 0x645D) /* <CJK> */
+MAP(0x40, 0x63, 0x645F) /* <CJK> */
+MAP(0x40, 0x64, 0x6460) /* <CJK> */
+MAP(0x40, 0x65, 0x6461) /* <CJK> */
+MAP(0x40, 0x66, 0x6463) /* <CJK> */
+MAP(0x40, 0x67, 0x646D) /* <CJK> */
+MAP(0x40, 0x68, 0x6473) /* <CJK> */
+MAP(0x40, 0x69, 0x6474) /* <CJK> */
+MAP(0x40, 0x6A, 0x647B) /* <CJK> */
+MAP(0x40, 0x6B, 0x647D) /* <CJK> */
+MAP(0x40, 0x6C, 0x6485) /* <CJK> */
+MAP(0x40, 0x6D, 0x6487) /* <CJK> */
+MAP(0x40, 0x6E, 0x648F) /* <CJK> */
+MAP(0x40, 0x6F, 0x6490) /* <CJK> */
+MAP(0x40, 0x70, 0x6491) /* <CJK> */
+MAP(0x40, 0x71, 0x6498) /* <CJK> */
+MAP(0x40, 0x72, 0x6499) /* <CJK> */
+MAP(0x40, 0x73, 0x649B) /* <CJK> */
+MAP(0x40, 0x74, 0x649D) /* <CJK> */
+MAP(0x40, 0x75, 0x649F) /* <CJK> */
+MAP(0x40, 0x76, 0x64A1) /* <CJK> */
+MAP(0x40, 0x77, 0x64A3) /* <CJK> */
+MAP(0x40, 0x78, 0x64A6) /* <CJK> */
+MAP(0x40, 0x79, 0x64A8) /* <CJK> */
+MAP(0x40, 0x7A, 0x64AC) /* <CJK> */
+MAP(0x40, 0x7B, 0x64B3) /* <CJK> */
+MAP(0x40, 0x7C, 0x64BD) /* <CJK> */
+MAP(0x40, 0x7D, 0x64BE) /* <CJK> */
+MAP(0x40, 0x7E, 0x64BF) /* <CJK> */
+MAP(0x41, 0x21, 0x64C4) /* <CJK> */
+MAP(0x41, 0x22, 0x64C9) /* <CJK> */
+MAP(0x41, 0x23, 0x64CA) /* <CJK> */
+MAP(0x41, 0x24, 0x64CB) /* <CJK> */
+MAP(0x41, 0x25, 0x64CC) /* <CJK> */
+MAP(0x41, 0x26, 0x64CE) /* <CJK> */
+MAP(0x41, 0x27, 0x64D0) /* <CJK> */
+MAP(0x41, 0x28, 0x64D1) /* <CJK> */
+MAP(0x41, 0x29, 0x64D5) /* <CJK> */
+MAP(0x41, 0x2A, 0x64D7) /* <CJK> */
+MAP(0x41, 0x2B, 0x64E4) /* <CJK> */
+MAP(0x41, 0x2C, 0x64E5) /* <CJK> */
+MAP(0x41, 0x2D, 0x64E9) /* <CJK> */
+MAP(0x41, 0x2E, 0x64EA) /* <CJK> */
+MAP(0x41, 0x2F, 0x64ED) /* <CJK> */
+MAP(0x41, 0x30, 0x64F0) /* <CJK> */
+MAP(0x41, 0x31, 0x64F5) /* <CJK> */
+MAP(0x41, 0x32, 0x64F7) /* <CJK> */
+MAP(0x41, 0x33, 0x64FB) /* <CJK> */
+MAP(0x41, 0x34, 0x64FF) /* <CJK> */
+MAP(0x41, 0x35, 0x6501) /* <CJK> */
+MAP(0x41, 0x36, 0x6504) /* <CJK> */
+MAP(0x41, 0x37, 0x6508) /* <CJK> */
+MAP(0x41, 0x38, 0x6509) /* <CJK> */
+MAP(0x41, 0x39, 0x650A) /* <CJK> */
+MAP(0x41, 0x3A, 0x650F) /* <CJK> */
+MAP(0x41, 0x3B, 0x6513) /* <CJK> */
+MAP(0x41, 0x3C, 0x6514) /* <CJK> */
+MAP(0x41, 0x3D, 0x6516) /* <CJK> */
+MAP(0x41, 0x3E, 0x6519) /* <CJK> */
+MAP(0x41, 0x3F, 0x651B) /* <CJK> */
+MAP(0x41, 0x40, 0x651E) /* <CJK> */
+MAP(0x41, 0x41, 0x651F) /* <CJK> */
+MAP(0x41, 0x42, 0x6522) /* <CJK> */
+MAP(0x41, 0x43, 0x6526) /* <CJK> */
+MAP(0x41, 0x44, 0x6529) /* <CJK> */
+MAP(0x41, 0x45, 0x652E) /* <CJK> */
+MAP(0x41, 0x46, 0x6531) /* <CJK> */
+MAP(0x41, 0x47, 0x653A) /* <CJK> */
+MAP(0x41, 0x48, 0x653C) /* <CJK> */
+MAP(0x41, 0x49, 0x653D) /* <CJK> */
+MAP(0x41, 0x4A, 0x6543) /* <CJK> */
+MAP(0x41, 0x4B, 0x6547) /* <CJK> */
+MAP(0x41, 0x4C, 0x6549) /* <CJK> */
+MAP(0x41, 0x4D, 0x6550) /* <CJK> */
+MAP(0x41, 0x4E, 0x6552) /* <CJK> */
+MAP(0x41, 0x4F, 0x6554) /* <CJK> */
+MAP(0x41, 0x50, 0x655F) /* <CJK> */
+MAP(0x41, 0x51, 0x6560) /* <CJK> */
+MAP(0x41, 0x52, 0x6567) /* <CJK> */
+MAP(0x41, 0x53, 0x656B) /* <CJK> */
+MAP(0x41, 0x54, 0x657A) /* <CJK> */
+MAP(0x41, 0x55, 0x657D) /* <CJK> */
+MAP(0x41, 0x56, 0x6581) /* <CJK> */
+MAP(0x41, 0x57, 0x6585) /* <CJK> */
+MAP(0x41, 0x58, 0x658A) /* <CJK> */
+MAP(0x41, 0x59, 0x6592) /* <CJK> */
+MAP(0x41, 0x5A, 0x6595) /* <CJK> */
+MAP(0x41, 0x5B, 0x6598) /* <CJK> */
+MAP(0x41, 0x5C, 0x659D) /* <CJK> */
+MAP(0x41, 0x5D, 0x65A0) /* <CJK> */
+MAP(0x41, 0x5E, 0x65A3) /* <CJK> */
+MAP(0x41, 0x5F, 0x65A6) /* <CJK> */
+MAP(0x41, 0x60, 0x65AE) /* <CJK> */
+MAP(0x41, 0x61, 0x65B2) /* <CJK> */
+MAP(0x41, 0x62, 0x65B3) /* <CJK> */
+MAP(0x41, 0x63, 0x65B4) /* <CJK> */
+MAP(0x41, 0x64, 0x65BF) /* <CJK> */
+MAP(0x41, 0x65, 0x65C2) /* <CJK> */
+MAP(0x41, 0x66, 0x65C8) /* <CJK> */
+MAP(0x41, 0x67, 0x65C9) /* <CJK> */
+MAP(0x41, 0x68, 0x65CE) /* <CJK> */
+MAP(0x41, 0x69, 0x65D0) /* <CJK> */
+MAP(0x41, 0x6A, 0x65D4) /* <CJK> */
+MAP(0x41, 0x6B, 0x65D6) /* <CJK> */
+MAP(0x41, 0x6C, 0x65D8) /* <CJK> */
+MAP(0x41, 0x6D, 0x65DF) /* <CJK> */
+MAP(0x41, 0x6E, 0x65F0) /* <CJK> */
+MAP(0x41, 0x6F, 0x65F2) /* <CJK> */
+MAP(0x41, 0x70, 0x65F4) /* <CJK> */
+MAP(0x41, 0x71, 0x65F5) /* <CJK> */
+MAP(0x41, 0x72, 0x65F9) /* <CJK> */
+MAP(0x41, 0x73, 0x65FE) /* <CJK> */
+MAP(0x41, 0x74, 0x65FF) /* <CJK> */
+MAP(0x41, 0x75, 0x6600) /* <CJK> */
+MAP(0x41, 0x76, 0x6604) /* <CJK> */
+MAP(0x41, 0x77, 0x6608) /* <CJK> */
+MAP(0x41, 0x78, 0x6609) /* <CJK> */
+MAP(0x41, 0x79, 0x660D) /* <CJK> */
+MAP(0x41, 0x7A, 0x6611) /* <CJK> */
+MAP(0x41, 0x7B, 0x6612) /* <CJK> */
+MAP(0x41, 0x7C, 0x6615) /* <CJK> */
+MAP(0x41, 0x7D, 0x6616) /* <CJK> */
+MAP(0x41, 0x7E, 0x661D) /* <CJK> */
+MAP(0x42, 0x21, 0x661E) /* <CJK> */
+MAP(0x42, 0x22, 0x6621) /* <CJK> */
+MAP(0x42, 0x23, 0x6622) /* <CJK> */
+MAP(0x42, 0x24, 0x6623) /* <CJK> */
+MAP(0x42, 0x25, 0x6624) /* <CJK> */
+MAP(0x42, 0x26, 0x6626) /* <CJK> */
+MAP(0x42, 0x27, 0x6629) /* <CJK> */
+MAP(0x42, 0x28, 0x662A) /* <CJK> */
+MAP(0x42, 0x29, 0x662B) /* <CJK> */
+MAP(0x42, 0x2A, 0x662C) /* <CJK> */
+MAP(0x42, 0x2B, 0x662E) /* <CJK> */
+MAP(0x42, 0x2C, 0x6630) /* <CJK> */
+MAP(0x42, 0x2D, 0x6631) /* <CJK> */
+MAP(0x42, 0x2E, 0x6633) /* <CJK> */
+MAP(0x42, 0x2F, 0x6639) /* <CJK> */
+MAP(0x42, 0x30, 0x6637) /* <CJK> */
+MAP(0x42, 0x31, 0x6640) /* <CJK> */
+MAP(0x42, 0x32, 0x6645) /* <CJK> */
+MAP(0x42, 0x33, 0x6646) /* <CJK> */
+MAP(0x42, 0x34, 0x664A) /* <CJK> */
+MAP(0x42, 0x35, 0x664C) /* <CJK> */
+MAP(0x42, 0x36, 0x6651) /* <CJK> */
+MAP(0x42, 0x37, 0x664E) /* <CJK> */
+MAP(0x42, 0x38, 0x6657) /* <CJK> */
+MAP(0x42, 0x39, 0x6658) /* <CJK> */
+MAP(0x42, 0x3A, 0x6659) /* <CJK> */
+MAP(0x42, 0x3B, 0x665B) /* <CJK> */
+MAP(0x42, 0x3C, 0x665C) /* <CJK> */
+MAP(0x42, 0x3D, 0x6660) /* <CJK> */
+MAP(0x42, 0x3E, 0x6661) /* <CJK> */
+MAP(0x42, 0x3F, 0x66FB) /* <CJK> */
+MAP(0x42, 0x40, 0x666A) /* <CJK> */
+MAP(0x42, 0x41, 0x666B) /* <CJK> */
+MAP(0x42, 0x42, 0x666C) /* <CJK> */
+MAP(0x42, 0x43, 0x667E) /* <CJK> */
+MAP(0x42, 0x44, 0x6673) /* <CJK> */
+MAP(0x42, 0x45, 0x6675) /* <CJK> */
+MAP(0x42, 0x46, 0x667F) /* <CJK> */
+MAP(0x42, 0x47, 0x6677) /* <CJK> */
+MAP(0x42, 0x48, 0x6678) /* <CJK> */
+MAP(0x42, 0x49, 0x6679) /* <CJK> */
+MAP(0x42, 0x4A, 0x667B) /* <CJK> */
+MAP(0x42, 0x4B, 0x6680) /* <CJK> */
+MAP(0x42, 0x4C, 0x667C) /* <CJK> */
+MAP(0x42, 0x4D, 0x668B) /* <CJK> */
+MAP(0x42, 0x4E, 0x668C) /* <CJK> */
+MAP(0x42, 0x4F, 0x668D) /* <CJK> */
+MAP(0x42, 0x50, 0x6690) /* <CJK> */
+MAP(0x42, 0x51, 0x6692) /* <CJK> */
+MAP(0x42, 0x52, 0x6699) /* <CJK> */
+MAP(0x42, 0x53, 0x669A) /* <CJK> */
+MAP(0x42, 0x54, 0x669B) /* <CJK> */
+MAP(0x42, 0x55, 0x669C) /* <CJK> */
+MAP(0x42, 0x56, 0x669F) /* <CJK> */
+MAP(0x42, 0x57, 0x66A0) /* <CJK> */
+MAP(0x42, 0x58, 0x66A4) /* <CJK> */
+MAP(0x42, 0x59, 0x66AD) /* <CJK> */
+MAP(0x42, 0x5A, 0x66B1) /* <CJK> */
+MAP(0x42, 0x5B, 0x66B2) /* <CJK> */
+MAP(0x42, 0x5C, 0x66B5) /* <CJK> */
+MAP(0x42, 0x5D, 0x66BB) /* <CJK> */
+MAP(0x42, 0x5E, 0x66BF) /* <CJK> */
+MAP(0x42, 0x5F, 0x66C0) /* <CJK> */
+MAP(0x42, 0x60, 0x66C2) /* <CJK> */
+MAP(0x42, 0x61, 0x66C3) /* <CJK> */
+MAP(0x42, 0x62, 0x66C8) /* <CJK> */
+MAP(0x42, 0x63, 0x66CC) /* <CJK> */
+MAP(0x42, 0x64, 0x66CE) /* <CJK> */
+MAP(0x42, 0x65, 0x66CF) /* <CJK> */
+MAP(0x42, 0x66, 0x66D4) /* <CJK> */
+MAP(0x42, 0x67, 0x66DB) /* <CJK> */
+MAP(0x42, 0x68, 0x66DF) /* <CJK> */
+MAP(0x42, 0x69, 0x66E8) /* <CJK> */
+MAP(0x42, 0x6A, 0x66EB) /* <CJK> */
+MAP(0x42, 0x6B, 0x66EC) /* <CJK> */
+MAP(0x42, 0x6C, 0x66EE) /* <CJK> */
+MAP(0x42, 0x6D, 0x66FA) /* <CJK> */
+MAP(0x42, 0x6E, 0x6705) /* <CJK> */
+MAP(0x42, 0x6F, 0x6707) /* <CJK> */
+MAP(0x42, 0x70, 0x670E) /* <CJK> */
+MAP(0x42, 0x71, 0x6713) /* <CJK> */
+MAP(0x42, 0x72, 0x6719) /* <CJK> */
+MAP(0x42, 0x73, 0x671C) /* <CJK> */
+MAP(0x42, 0x74, 0x6720) /* <CJK> */
+MAP(0x42, 0x75, 0x6722) /* <CJK> */
+MAP(0x42, 0x76, 0x6733) /* <CJK> */
+MAP(0x42, 0x77, 0x673E) /* <CJK> */
+MAP(0x42, 0x78, 0x6745) /* <CJK> */
+MAP(0x42, 0x79, 0x6747) /* <CJK> */
+MAP(0x42, 0x7A, 0x6748) /* <CJK> */
+MAP(0x42, 0x7B, 0x674C) /* <CJK> */
+MAP(0x42, 0x7C, 0x6754) /* <CJK> */
+MAP(0x42, 0x7D, 0x6755) /* <CJK> */
+MAP(0x42, 0x7E, 0x675D) /* <CJK> */
+MAP(0x43, 0x21, 0x6766) /* <CJK> */
+MAP(0x43, 0x22, 0x676C) /* <CJK> */
+MAP(0x43, 0x23, 0x676E) /* <CJK> */
+MAP(0x43, 0x24, 0x6774) /* <CJK> */
+MAP(0x43, 0x25, 0x6776) /* <CJK> */
+MAP(0x43, 0x26, 0x677B) /* <CJK> */
+MAP(0x43, 0x27, 0x6781) /* <CJK> */
+MAP(0x43, 0x28, 0x6784) /* <CJK> */
+MAP(0x43, 0x29, 0x678E) /* <CJK> */
+MAP(0x43, 0x2A, 0x678F) /* <CJK> */
+MAP(0x43, 0x2B, 0x6791) /* <CJK> */
+MAP(0x43, 0x2C, 0x6793) /* <CJK> */
+MAP(0x43, 0x2D, 0x6796) /* <CJK> */
+MAP(0x43, 0x2E, 0x6798) /* <CJK> */
+MAP(0x43, 0x2F, 0x6799) /* <CJK> */
+MAP(0x43, 0x30, 0x679B) /* <CJK> */
+MAP(0x43, 0x31, 0x67B0) /* <CJK> */
+MAP(0x43, 0x32, 0x67B1) /* <CJK> */
+MAP(0x43, 0x33, 0x67B2) /* <CJK> */
+MAP(0x43, 0x34, 0x67B5) /* <CJK> */
+MAP(0x43, 0x35, 0x67BB) /* <CJK> */
+MAP(0x43, 0x36, 0x67BC) /* <CJK> */
+MAP(0x43, 0x37, 0x67BD) /* <CJK> */
+MAP(0x43, 0x38, 0x67F9) /* <CJK> */
+MAP(0x43, 0x39, 0x67C0) /* <CJK> */
+MAP(0x43, 0x3A, 0x67C2) /* <CJK> */
+MAP(0x43, 0x3B, 0x67C3) /* <CJK> */
+MAP(0x43, 0x3C, 0x67C5) /* <CJK> */
+MAP(0x43, 0x3D, 0x67C8) /* <CJK> */
+MAP(0x43, 0x3E, 0x67C9) /* <CJK> */
+MAP(0x43, 0x3F, 0x67D2) /* <CJK> */
+MAP(0x43, 0x40, 0x67D7) /* <CJK> */
+MAP(0x43, 0x41, 0x67D9) /* <CJK> */
+MAP(0x43, 0x42, 0x67DC) /* <CJK> */
+MAP(0x43, 0x43, 0x67E1) /* <CJK> */
+MAP(0x43, 0x44, 0x67E6) /* <CJK> */
+MAP(0x43, 0x45, 0x67F0) /* <CJK> */
+MAP(0x43, 0x46, 0x67F2) /* <CJK> */
+MAP(0x43, 0x47, 0x67F6) /* <CJK> */
+MAP(0x43, 0x48, 0x67F7) /* <CJK> */
+MAP(0x43, 0x49, 0x6852) /* <CJK> */
+MAP(0x43, 0x4A, 0x6814) /* <CJK> */
+MAP(0x43, 0x4B, 0x6819) /* <CJK> */
+MAP(0x43, 0x4C, 0x681D) /* <CJK> */
+MAP(0x43, 0x4D, 0x681F) /* <CJK> */
+MAP(0x43, 0x4E, 0x6828) /* <CJK> */
+MAP(0x43, 0x4F, 0x6827) /* <CJK> */
+MAP(0x43, 0x50, 0x682C) /* <CJK> */
+MAP(0x43, 0x51, 0x682D) /* <CJK> */
+MAP(0x43, 0x52, 0x682F) /* <CJK> */
+MAP(0x43, 0x53, 0x6830) /* <CJK> */
+MAP(0x43, 0x54, 0x6831) /* <CJK> */
+MAP(0x43, 0x55, 0x6833) /* <CJK> */
+MAP(0x43, 0x56, 0x683B) /* <CJK> */
+MAP(0x43, 0x57, 0x683F) /* <CJK> */
+MAP(0x43, 0x58, 0x6844) /* <CJK> */
+MAP(0x43, 0x59, 0x6845) /* <CJK> */
+MAP(0x43, 0x5A, 0x684A) /* <CJK> */
+MAP(0x43, 0x5B, 0x684C) /* <CJK> */
+MAP(0x43, 0x5C, 0x6855) /* <CJK> */
+MAP(0x43, 0x5D, 0x6857) /* <CJK> */
+MAP(0x43, 0x5E, 0x6858) /* <CJK> */
+MAP(0x43, 0x5F, 0x685B) /* <CJK> */
+MAP(0x43, 0x60, 0x686B) /* <CJK> */
+MAP(0x43, 0x61, 0x686E) /* <CJK> */
+MAP(0x43, 0x62, 0x686F) /* <CJK> */
+MAP(0x43, 0x63, 0x6870) /* <CJK> */
+MAP(0x43, 0x64, 0x6871) /* <CJK> */
+MAP(0x43, 0x65, 0x6872) /* <CJK> */
+MAP(0x43, 0x66, 0x6875) /* <CJK> */
+MAP(0x43, 0x67, 0x6879) /* <CJK> */
+MAP(0x43, 0x68, 0x687A) /* <CJK> */
+MAP(0x43, 0x69, 0x687B) /* <CJK> */
+MAP(0x43, 0x6A, 0x687C) /* <CJK> */
+MAP(0x43, 0x6B, 0x6882) /* <CJK> */
+MAP(0x43, 0x6C, 0x6884) /* <CJK> */
+MAP(0x43, 0x6D, 0x6886) /* <CJK> */
+MAP(0x43, 0x6E, 0x6888) /* <CJK> */
+MAP(0x43, 0x6F, 0x6896) /* <CJK> */
+MAP(0x43, 0x70, 0x6898) /* <CJK> */
+MAP(0x43, 0x71, 0x689A) /* <CJK> */
+MAP(0x43, 0x72, 0x689C) /* <CJK> */
+MAP(0x43, 0x73, 0x68A1) /* <CJK> */
+MAP(0x43, 0x74, 0x68A3) /* <CJK> */
+MAP(0x43, 0x75, 0x68A5) /* <CJK> */
+MAP(0x43, 0x76, 0x68A9) /* <CJK> */
+MAP(0x43, 0x77, 0x68AA) /* <CJK> */
+MAP(0x43, 0x78, 0x68AE) /* <CJK> */
+MAP(0x43, 0x79, 0x68B2) /* <CJK> */
+MAP(0x43, 0x7A, 0x68BB) /* <CJK> */
+MAP(0x43, 0x7B, 0x68C5) /* <CJK> */
+MAP(0x43, 0x7C, 0x68C8) /* <CJK> */
+MAP(0x43, 0x7D, 0x68CC) /* <CJK> */
+MAP(0x43, 0x7E, 0x68CF) /* <CJK> */
+MAP(0x44, 0x21, 0x68D0) /* <CJK> */
+MAP(0x44, 0x22, 0x68D1) /* <CJK> */
+MAP(0x44, 0x23, 0x68D3) /* <CJK> */
+MAP(0x44, 0x24, 0x68D6) /* <CJK> */
+MAP(0x44, 0x25, 0x68D9) /* <CJK> */
+MAP(0x44, 0x26, 0x68DC) /* <CJK> */
+MAP(0x44, 0x27, 0x68DD) /* <CJK> */
+MAP(0x44, 0x28, 0x68E5) /* <CJK> */
+MAP(0x44, 0x29, 0x68E8) /* <CJK> */
+MAP(0x44, 0x2A, 0x68EA) /* <CJK> */
+MAP(0x44, 0x2B, 0x68EB) /* <CJK> */
+MAP(0x44, 0x2C, 0x68EC) /* <CJK> */
+MAP(0x44, 0x2D, 0x68ED) /* <CJK> */
+MAP(0x44, 0x2E, 0x68F0) /* <CJK> */
+MAP(0x44, 0x2F, 0x68F1) /* <CJK> */
+MAP(0x44, 0x30, 0x68F5) /* <CJK> */
+MAP(0x44, 0x31, 0x68F6) /* <CJK> */
+MAP(0x44, 0x32, 0x68FB) /* <CJK> */
+MAP(0x44, 0x33, 0x68FC) /* <CJK> */
+MAP(0x44, 0x34, 0x68FD) /* <CJK> */
+MAP(0x44, 0x35, 0x6906) /* <CJK> */
+MAP(0x44, 0x36, 0x6909) /* <CJK> */
+MAP(0x44, 0x37, 0x690A) /* <CJK> */
+MAP(0x44, 0x38, 0x6910) /* <CJK> */
+MAP(0x44, 0x39, 0x6911) /* <CJK> */
+MAP(0x44, 0x3A, 0x6913) /* <CJK> */
+MAP(0x44, 0x3B, 0x6916) /* <CJK> */
+MAP(0x44, 0x3C, 0x6917) /* <CJK> */
+MAP(0x44, 0x3D, 0x6931) /* <CJK> */
+MAP(0x44, 0x3E, 0x6933) /* <CJK> */
+MAP(0x44, 0x3F, 0x6935) /* <CJK> */
+MAP(0x44, 0x40, 0x6938) /* <CJK> */
+MAP(0x44, 0x41, 0x693B) /* <CJK> */
+MAP(0x44, 0x42, 0x6942) /* <CJK> */
+MAP(0x44, 0x43, 0x6945) /* <CJK> */
+MAP(0x44, 0x44, 0x6949) /* <CJK> */
+MAP(0x44, 0x45, 0x694E) /* <CJK> */
+MAP(0x44, 0x46, 0x6957) /* <CJK> */
+MAP(0x44, 0x47, 0x695B) /* <CJK> */
+MAP(0x44, 0x48, 0x6963) /* <CJK> */
+MAP(0x44, 0x49, 0x6964) /* <CJK> */
+MAP(0x44, 0x4A, 0x6965) /* <CJK> */
+MAP(0x44, 0x4B, 0x6966) /* <CJK> */
+MAP(0x44, 0x4C, 0x6968) /* <CJK> */
+MAP(0x44, 0x4D, 0x6969) /* <CJK> */
+MAP(0x44, 0x4E, 0x696C) /* <CJK> */
+MAP(0x44, 0x4F, 0x6970) /* <CJK> */
+MAP(0x44, 0x50, 0x6971) /* <CJK> */
+MAP(0x44, 0x51, 0x6972) /* <CJK> */
+MAP(0x44, 0x52, 0x697A) /* <CJK> */
+MAP(0x44, 0x53, 0x697B) /* <CJK> */
+MAP(0x44, 0x54, 0x697F) /* <CJK> */
+MAP(0x44, 0x55, 0x6980) /* <CJK> */
+MAP(0x44, 0x56, 0x698D) /* <CJK> */
+MAP(0x44, 0x57, 0x6992) /* <CJK> */
+MAP(0x44, 0x58, 0x6996) /* <CJK> */
+MAP(0x44, 0x59, 0x6998) /* <CJK> */
+MAP(0x44, 0x5A, 0x69A1) /* <CJK> */
+MAP(0x44, 0x5B, 0x69A5) /* <CJK> */
+MAP(0x44, 0x5C, 0x69A6) /* <CJK> */
+MAP(0x44, 0x5D, 0x69A8) /* <CJK> */
+MAP(0x44, 0x5E, 0x69AB) /* <CJK> */
+MAP(0x44, 0x5F, 0x69AD) /* <CJK> */
+MAP(0x44, 0x60, 0x69AF) /* <CJK> */
+MAP(0x44, 0x61, 0x69B7) /* <CJK> */
+MAP(0x44, 0x62, 0x69B8) /* <CJK> */
+MAP(0x44, 0x63, 0x69BA) /* <CJK> */
+MAP(0x44, 0x64, 0x69BC) /* <CJK> */
+MAP(0x44, 0x65, 0x69C5) /* <CJK> */
+MAP(0x44, 0x66, 0x69C8) /* <CJK> */
+MAP(0x44, 0x67, 0x69D1) /* <CJK> */
+MAP(0x44, 0x68, 0x69D6) /* <CJK> */
+MAP(0x44, 0x69, 0x69D7) /* <CJK> */
+MAP(0x44, 0x6A, 0x69E2) /* <CJK> */
+MAP(0x44, 0x6B, 0x69E5) /* <CJK> */
+MAP(0x44, 0x6C, 0x69EE) /* <CJK> */
+MAP(0x44, 0x6D, 0x69EF) /* <CJK> */
+MAP(0x44, 0x6E, 0x69F1) /* <CJK> */
+MAP(0x44, 0x6F, 0x69F3) /* <CJK> */
+MAP(0x44, 0x70, 0x69F5) /* <CJK> */
+MAP(0x44, 0x71, 0x69FE) /* <CJK> */
+MAP(0x44, 0x72, 0x6A00) /* <CJK> */
+MAP(0x44, 0x73, 0x6A01) /* <CJK> */
+MAP(0x44, 0x74, 0x6A03) /* <CJK> */
+MAP(0x44, 0x75, 0x6A0F) /* <CJK> */
+MAP(0x44, 0x76, 0x6A11) /* <CJK> */
+MAP(0x44, 0x77, 0x6A15) /* <CJK> */
+MAP(0x44, 0x78, 0x6A1A) /* <CJK> */
+MAP(0x44, 0x79, 0x6A1D) /* <CJK> */
+MAP(0x44, 0x7A, 0x6A20) /* <CJK> */
+MAP(0x44, 0x7B, 0x6A24) /* <CJK> */
+MAP(0x44, 0x7C, 0x6A28) /* <CJK> */
+MAP(0x44, 0x7D, 0x6A30) /* <CJK> */
+MAP(0x44, 0x7E, 0x6A32) /* <CJK> */
+MAP(0x45, 0x21, 0x6A34) /* <CJK> */
+MAP(0x45, 0x22, 0x6A37) /* <CJK> */
+MAP(0x45, 0x23, 0x6A3B) /* <CJK> */
+MAP(0x45, 0x24, 0x6A3E) /* <CJK> */
+MAP(0x45, 0x25, 0x6A3F) /* <CJK> */
+MAP(0x45, 0x26, 0x6A45) /* <CJK> */
+MAP(0x45, 0x27, 0x6A46) /* <CJK> */
+MAP(0x45, 0x28, 0x6A49) /* <CJK> */
+MAP(0x45, 0x29, 0x6A4A) /* <CJK> */
+MAP(0x45, 0x2A, 0x6A4E) /* <CJK> */
+MAP(0x45, 0x2B, 0x6A50) /* <CJK> */
+MAP(0x45, 0x2C, 0x6A51) /* <CJK> */
+MAP(0x45, 0x2D, 0x6A52) /* <CJK> */
+MAP(0x45, 0x2E, 0x6A55) /* <CJK> */
+MAP(0x45, 0x2F, 0x6A56) /* <CJK> */
+MAP(0x45, 0x30, 0x6A5B) /* <CJK> */
+MAP(0x45, 0x31, 0x6A64) /* <CJK> */
+MAP(0x45, 0x32, 0x6A67) /* <CJK> */
+MAP(0x45, 0x33, 0x6A6A) /* <CJK> */
+MAP(0x45, 0x34, 0x6A71) /* <CJK> */
+MAP(0x45, 0x35, 0x6A73) /* <CJK> */
+MAP(0x45, 0x36, 0x6A7E) /* <CJK> */
+MAP(0x45, 0x37, 0x6A81) /* <CJK> */
+MAP(0x45, 0x38, 0x6A83) /* <CJK> */
+MAP(0x45, 0x39, 0x6A86) /* <CJK> */
+MAP(0x45, 0x3A, 0x6A87) /* <CJK> */
+MAP(0x45, 0x3B, 0x6A89) /* <CJK> */
+MAP(0x45, 0x3C, 0x6A8B) /* <CJK> */
+MAP(0x45, 0x3D, 0x6A91) /* <CJK> */
+MAP(0x45, 0x3E, 0x6A9B) /* <CJK> */
+MAP(0x45, 0x3F, 0x6A9D) /* <CJK> */
+MAP(0x45, 0x40, 0x6A9E) /* <CJK> */
+MAP(0x45, 0x41, 0x6A9F) /* <CJK> */
+MAP(0x45, 0x42, 0x6AA5) /* <CJK> */
+MAP(0x45, 0x43, 0x6AAB) /* <CJK> */
+MAP(0x45, 0x44, 0x6AAF) /* <CJK> */
+MAP(0x45, 0x45, 0x6AB0) /* <CJK> */
+MAP(0x45, 0x46, 0x6AB1) /* <CJK> */
+MAP(0x45, 0x47, 0x6AB4) /* <CJK> */
+MAP(0x45, 0x48, 0x6ABD) /* <CJK> */
+MAP(0x45, 0x49, 0x6ABE) /* <CJK> */
+MAP(0x45, 0x4A, 0x6ABF) /* <CJK> */
+MAP(0x45, 0x4B, 0x6AC6) /* <CJK> */
+MAP(0x45, 0x4C, 0x6AC9) /* <CJK> */
+MAP(0x45, 0x4D, 0x6AC8) /* <CJK> */
+MAP(0x45, 0x4E, 0x6ACC) /* <CJK> */
+MAP(0x45, 0x4F, 0x6AD0) /* <CJK> */
+MAP(0x45, 0x50, 0x6AD4) /* <CJK> */
+MAP(0x45, 0x51, 0x6AD5) /* <CJK> */
+MAP(0x45, 0x52, 0x6AD6) /* <CJK> */
+MAP(0x45, 0x53, 0x6ADC) /* <CJK> */
+MAP(0x45, 0x54, 0x6ADD) /* <CJK> */
+MAP(0x45, 0x55, 0x6AE4) /* <CJK> */
+MAP(0x45, 0x56, 0x6AE7) /* <CJK> */
+MAP(0x45, 0x57, 0x6AEC) /* <CJK> */
+MAP(0x45, 0x58, 0x6AF0) /* <CJK> */
+MAP(0x45, 0x59, 0x6AF1) /* <CJK> */
+MAP(0x45, 0x5A, 0x6AF2) /* <CJK> */
+MAP(0x45, 0x5B, 0x6AFC) /* <CJK> */
+MAP(0x45, 0x5C, 0x6AFD) /* <CJK> */
+MAP(0x45, 0x5D, 0x6B02) /* <CJK> */
+MAP(0x45, 0x5E, 0x6B03) /* <CJK> */
+MAP(0x45, 0x5F, 0x6B06) /* <CJK> */
+MAP(0x45, 0x60, 0x6B07) /* <CJK> */
+MAP(0x45, 0x61, 0x6B09) /* <CJK> */
+MAP(0x45, 0x62, 0x6B0F) /* <CJK> */
+MAP(0x45, 0x63, 0x6B10) /* <CJK> */
+MAP(0x45, 0x64, 0x6B11) /* <CJK> */
+MAP(0x45, 0x65, 0x6B17) /* <CJK> */
+MAP(0x45, 0x66, 0x6B1B) /* <CJK> */
+MAP(0x45, 0x67, 0x6B1E) /* <CJK> */
+MAP(0x45, 0x68, 0x6B24) /* <CJK> */
+MAP(0x45, 0x69, 0x6B28) /* <CJK> */
+MAP(0x45, 0x6A, 0x6B2B) /* <CJK> */
+MAP(0x45, 0x6B, 0x6B2C) /* <CJK> */
+MAP(0x45, 0x6C, 0x6B2F) /* <CJK> */
+MAP(0x45, 0x6D, 0x6B35) /* <CJK> */
+MAP(0x45, 0x6E, 0x6B36) /* <CJK> */
+MAP(0x45, 0x6F, 0x6B3B) /* <CJK> */
+MAP(0x45, 0x70, 0x6B3F) /* <CJK> */
+MAP(0x45, 0x71, 0x6B46) /* <CJK> */
+MAP(0x45, 0x72, 0x6B4A) /* <CJK> */
+MAP(0x45, 0x73, 0x6B4D) /* <CJK> */
+MAP(0x45, 0x74, 0x6B52) /* <CJK> */
+MAP(0x45, 0x75, 0x6B56) /* <CJK> */
+MAP(0x45, 0x76, 0x6B58) /* <CJK> */
+MAP(0x45, 0x77, 0x6B5D) /* <CJK> */
+MAP(0x45, 0x78, 0x6B60) /* <CJK> */
+MAP(0x45, 0x79, 0x6B67) /* <CJK> */
+MAP(0x45, 0x7A, 0x6B6B) /* <CJK> */
+MAP(0x45, 0x7B, 0x6B6E) /* <CJK> */
+MAP(0x45, 0x7C, 0x6B70) /* <CJK> */
+MAP(0x45, 0x7D, 0x6B75) /* <CJK> */
+MAP(0x45, 0x7E, 0x6B7D) /* <CJK> */
+MAP(0x46, 0x21, 0x6B7E) /* <CJK> */
+MAP(0x46, 0x22, 0x6B82) /* <CJK> */
+MAP(0x46, 0x23, 0x6B85) /* <CJK> */
+MAP(0x46, 0x24, 0x6B97) /* <CJK> */
+MAP(0x46, 0x25, 0x6B9B) /* <CJK> */
+MAP(0x46, 0x26, 0x6B9F) /* <CJK> */
+MAP(0x46, 0x27, 0x6BA0) /* <CJK> */
+MAP(0x46, 0x28, 0x6BA2) /* <CJK> */
+MAP(0x46, 0x29, 0x6BA3) /* <CJK> */
+MAP(0x46, 0x2A, 0x6BA8) /* <CJK> */
+MAP(0x46, 0x2B, 0x6BA9) /* <CJK> */
+MAP(0x46, 0x2C, 0x6BAC) /* <CJK> */
+MAP(0x46, 0x2D, 0x6BAD) /* <CJK> */
+MAP(0x46, 0x2E, 0x6BAE) /* <CJK> */
+MAP(0x46, 0x2F, 0x6BB0) /* <CJK> */
+MAP(0x46, 0x30, 0x6BB8) /* <CJK> */
+MAP(0x46, 0x31, 0x6BB9) /* <CJK> */
+MAP(0x46, 0x32, 0x6BBD) /* <CJK> */
+MAP(0x46, 0x33, 0x6BBE) /* <CJK> */
+MAP(0x46, 0x34, 0x6BC3) /* <CJK> */
+MAP(0x46, 0x35, 0x6BC4) /* <CJK> */
+MAP(0x46, 0x36, 0x6BC9) /* <CJK> */
+MAP(0x46, 0x37, 0x6BCC) /* <CJK> */
+MAP(0x46, 0x38, 0x6BD6) /* <CJK> */
+MAP(0x46, 0x39, 0x6BDA) /* <CJK> */
+MAP(0x46, 0x3A, 0x6BE1) /* <CJK> */
+MAP(0x46, 0x3B, 0x6BE3) /* <CJK> */
+MAP(0x46, 0x3C, 0x6BE6) /* <CJK> */
+MAP(0x46, 0x3D, 0x6BE7) /* <CJK> */
+MAP(0x46, 0x3E, 0x6BEE) /* <CJK> */
+MAP(0x46, 0x3F, 0x6BF1) /* <CJK> */
+MAP(0x46, 0x40, 0x6BF7) /* <CJK> */
+MAP(0x46, 0x41, 0x6BF9) /* <CJK> */
+MAP(0x46, 0x42, 0x6BFF) /* <CJK> */
+MAP(0x46, 0x43, 0x6C02) /* <CJK> */
+MAP(0x46, 0x44, 0x6C04) /* <CJK> */
+MAP(0x46, 0x45, 0x6C05) /* <CJK> */
+MAP(0x46, 0x46, 0x6C09) /* <CJK> */
+MAP(0x46, 0x47, 0x6C0D) /* <CJK> */
+MAP(0x46, 0x48, 0x6C0E) /* <CJK> */
+MAP(0x46, 0x49, 0x6C10) /* <CJK> */
+MAP(0x46, 0x4A, 0x6C12) /* <CJK> */
+MAP(0x46, 0x4B, 0x6C19) /* <CJK> */
+MAP(0x46, 0x4C, 0x6C1F) /* <CJK> */
+MAP(0x46, 0x4D, 0x6C26) /* <CJK> */
+MAP(0x46, 0x4E, 0x6C27) /* <CJK> */
+MAP(0x46, 0x4F, 0x6C28) /* <CJK> */
+MAP(0x46, 0x50, 0x6C2C) /* <CJK> */
+MAP(0x46, 0x51, 0x6C2E) /* <CJK> */
+MAP(0x46, 0x52, 0x6C33) /* <CJK> */
+MAP(0x46, 0x53, 0x6C35) /* <CJK> */
+MAP(0x46, 0x54, 0x6C36) /* <CJK> */
+MAP(0x46, 0x55, 0x6C3A) /* <CJK> */
+MAP(0x46, 0x56, 0x6C3B) /* <CJK> */
+MAP(0x46, 0x57, 0x6C3F) /* <CJK> */
+MAP(0x46, 0x58, 0x6C4A) /* <CJK> */
+MAP(0x46, 0x59, 0x6C4B) /* <CJK> */
+MAP(0x46, 0x5A, 0x6C4D) /* <CJK> */
+MAP(0x46, 0x5B, 0x6C4F) /* <CJK> */
+MAP(0x46, 0x5C, 0x6C52) /* <CJK> */
+MAP(0x46, 0x5D, 0x6C54) /* <CJK> */
+MAP(0x46, 0x5E, 0x6C59) /* <CJK> */
+MAP(0x46, 0x5F, 0x6C5B) /* <CJK> */
+MAP(0x46, 0x60, 0x6C5C) /* <CJK> */
+MAP(0x46, 0x61, 0x6C6B) /* <CJK> */
+MAP(0x46, 0x62, 0x6C6D) /* <CJK> */
+MAP(0x46, 0x63, 0x6C6F) /* <CJK> */
+MAP(0x46, 0x64, 0x6C74) /* <CJK> */
+MAP(0x46, 0x65, 0x6C76) /* <CJK> */
+MAP(0x46, 0x66, 0x6C78) /* <CJK> */
+MAP(0x46, 0x67, 0x6C79) /* <CJK> */
+MAP(0x46, 0x68, 0x6C7B) /* <CJK> */
+MAP(0x46, 0x69, 0x6C85) /* <CJK> */
+MAP(0x46, 0x6A, 0x6C86) /* <CJK> */
+MAP(0x46, 0x6B, 0x6C87) /* <CJK> */
+MAP(0x46, 0x6C, 0x6C89) /* <CJK> */
+MAP(0x46, 0x6D, 0x6C94) /* <CJK> */
+MAP(0x46, 0x6E, 0x6C95) /* <CJK> */
+MAP(0x46, 0x6F, 0x6C97) /* <CJK> */
+MAP(0x46, 0x70, 0x6C98) /* <CJK> */
+MAP(0x46, 0x71, 0x6C9C) /* <CJK> */
+MAP(0x46, 0x72, 0x6C9F) /* <CJK> */
+MAP(0x46, 0x73, 0x6CB0) /* <CJK> */
+MAP(0x46, 0x74, 0x6CB2) /* <CJK> */
+MAP(0x46, 0x75, 0x6CB4) /* <CJK> */
+MAP(0x46, 0x76, 0x6CC2) /* <CJK> */
+MAP(0x46, 0x77, 0x6CC6) /* <CJK> */
+MAP(0x46, 0x78, 0x6CCD) /* <CJK> */
+MAP(0x46, 0x79, 0x6CCF) /* <CJK> */
+MAP(0x46, 0x7A, 0x6CD0) /* <CJK> */
+MAP(0x46, 0x7B, 0x6CD1) /* <CJK> */
+MAP(0x46, 0x7C, 0x6CD2) /* <CJK> */
+MAP(0x46, 0x7D, 0x6CD4) /* <CJK> */
+MAP(0x46, 0x7E, 0x6CD6) /* <CJK> */
+MAP(0x47, 0x21, 0x6CDA) /* <CJK> */
+MAP(0x47, 0x22, 0x6CDC) /* <CJK> */
+MAP(0x47, 0x23, 0x6CE0) /* <CJK> */
+MAP(0x47, 0x24, 0x6CE7) /* <CJK> */
+MAP(0x47, 0x25, 0x6CE9) /* <CJK> */
+MAP(0x47, 0x26, 0x6CEB) /* <CJK> */
+MAP(0x47, 0x27, 0x6CEC) /* <CJK> */
+MAP(0x47, 0x28, 0x6CEE) /* <CJK> */
+MAP(0x47, 0x29, 0x6CF2) /* <CJK> */
+MAP(0x47, 0x2A, 0x6CF4) /* <CJK> */
+MAP(0x47, 0x2B, 0x6D04) /* <CJK> */
+MAP(0x47, 0x2C, 0x6D07) /* <CJK> */
+MAP(0x47, 0x2D, 0x6D0A) /* <CJK> */
+MAP(0x47, 0x2E, 0x6D0E) /* <CJK> */
+MAP(0x47, 0x2F, 0x6D0F) /* <CJK> */
+MAP(0x47, 0x30, 0x6D11) /* <CJK> */
+MAP(0x47, 0x31, 0x6D13) /* <CJK> */
+MAP(0x47, 0x32, 0x6D1A) /* <CJK> */
+MAP(0x47, 0x33, 0x6D26) /* <CJK> */
+MAP(0x47, 0x34, 0x6D27) /* <CJK> */
+MAP(0x47, 0x35, 0x6D28) /* <CJK> */
+MAP(0x47, 0x36, 0x6C67) /* <CJK> */
+MAP(0x47, 0x37, 0x6D2E) /* <CJK> */
+MAP(0x47, 0x38, 0x6D2F) /* <CJK> */
+MAP(0x47, 0x39, 0x6D31) /* <CJK> */
+MAP(0x47, 0x3A, 0x6D39) /* <CJK> */
+MAP(0x47, 0x3B, 0x6D3C) /* <CJK> */
+MAP(0x47, 0x3C, 0x6D3F) /* <CJK> */
+MAP(0x47, 0x3D, 0x6D57) /* <CJK> */
+MAP(0x47, 0x3E, 0x6D5E) /* <CJK> */
+MAP(0x47, 0x3F, 0x6D5F) /* <CJK> */
+MAP(0x47, 0x40, 0x6D61) /* <CJK> */
+MAP(0x47, 0x41, 0x6D65) /* <CJK> */
+MAP(0x47, 0x42, 0x6D67) /* <CJK> */
+MAP(0x47, 0x43, 0x6D6F) /* <CJK> */
+MAP(0x47, 0x44, 0x6D70) /* <CJK> */
+MAP(0x47, 0x45, 0x6D7C) /* <CJK> */
+MAP(0x47, 0x46, 0x6D82) /* <CJK> */
+MAP(0x47, 0x47, 0x6D87) /* <CJK> */
+MAP(0x47, 0x48, 0x6D91) /* <CJK> */
+MAP(0x47, 0x49, 0x6D92) /* <CJK> */
+MAP(0x47, 0x4A, 0x6D94) /* <CJK> */
+MAP(0x47, 0x4B, 0x6D96) /* <CJK> */
+MAP(0x47, 0x4C, 0x6D97) /* <CJK> */
+MAP(0x47, 0x4D, 0x6D98) /* <CJK> */
+MAP(0x47, 0x4E, 0x6DAA) /* <CJK> */
+MAP(0x47, 0x4F, 0x6DAC) /* <CJK> */
+MAP(0x47, 0x50, 0x6DB4) /* <CJK> */
+MAP(0x47, 0x51, 0x6DB7) /* <CJK> */
+MAP(0x47, 0x52, 0x6DB9) /* <CJK> */
+MAP(0x47, 0x53, 0x6DBD) /* <CJK> */
+MAP(0x47, 0x54, 0x6DBF) /* <CJK> */
+MAP(0x47, 0x55, 0x6DC4) /* <CJK> */
+MAP(0x47, 0x56, 0x6DC8) /* <CJK> */
+MAP(0x47, 0x57, 0x6DCA) /* <CJK> */
+MAP(0x47, 0x58, 0x6DCE) /* <CJK> */
+MAP(0x47, 0x59, 0x6DCF) /* <CJK> */
+MAP(0x47, 0x5A, 0x6DD6) /* <CJK> */
+MAP(0x47, 0x5B, 0x6DDB) /* <CJK> */
+MAP(0x47, 0x5C, 0x6DDD) /* <CJK> */
+MAP(0x47, 0x5D, 0x6DDF) /* <CJK> */
+MAP(0x47, 0x5E, 0x6DE0) /* <CJK> */
+MAP(0x47, 0x5F, 0x6DE2) /* <CJK> */
+MAP(0x47, 0x60, 0x6DE5) /* <CJK> */
+MAP(0x47, 0x61, 0x6DE9) /* <CJK> */
+MAP(0x47, 0x62, 0x6DEF) /* <CJK> */
+MAP(0x47, 0x63, 0x6DF0) /* <CJK> */
+MAP(0x47, 0x64, 0x6DF4) /* <CJK> */
+MAP(0x47, 0x65, 0x6DF6) /* <CJK> */
+MAP(0x47, 0x66, 0x6DFC) /* <CJK> */
+MAP(0x47, 0x67, 0x6E00) /* <CJK> */
+MAP(0x47, 0x68, 0x6E04) /* <CJK> */
+MAP(0x47, 0x69, 0x6E1E) /* <CJK> */
+MAP(0x47, 0x6A, 0x6E22) /* <CJK> */
+MAP(0x47, 0x6B, 0x6E27) /* <CJK> */
+MAP(0x47, 0x6C, 0x6E32) /* <CJK> */
+MAP(0x47, 0x6D, 0x6E36) /* <CJK> */
+MAP(0x47, 0x6E, 0x6E39) /* <CJK> */
+MAP(0x47, 0x6F, 0x6E3B) /* <CJK> */
+MAP(0x47, 0x70, 0x6E3C) /* <CJK> */
+MAP(0x47, 0x71, 0x6E44) /* <CJK> */
+MAP(0x47, 0x72, 0x6E45) /* <CJK> */
+MAP(0x47, 0x73, 0x6E48) /* <CJK> */
+MAP(0x47, 0x74, 0x6E49) /* <CJK> */
+MAP(0x47, 0x75, 0x6E4B) /* <CJK> */
+MAP(0x47, 0x76, 0x6E4F) /* <CJK> */
+MAP(0x47, 0x77, 0x6E51) /* <CJK> */
+MAP(0x47, 0x78, 0x6E52) /* <CJK> */
+MAP(0x47, 0x79, 0x6E53) /* <CJK> */
+MAP(0x47, 0x7A, 0x6E54) /* <CJK> */
+MAP(0x47, 0x7B, 0x6E57) /* <CJK> */
+MAP(0x47, 0x7C, 0x6E5C) /* <CJK> */
+MAP(0x47, 0x7D, 0x6E5D) /* <CJK> */
+MAP(0x47, 0x7E, 0x6E5E) /* <CJK> */
+MAP(0x48, 0x21, 0x6E62) /* <CJK> */
+MAP(0x48, 0x22, 0x6E63) /* <CJK> */
+MAP(0x48, 0x23, 0x6E68) /* <CJK> */
+MAP(0x48, 0x24, 0x6E73) /* <CJK> */
+MAP(0x48, 0x25, 0x6E7B) /* <CJK> */
+MAP(0x48, 0x26, 0x6E7D) /* <CJK> */
+MAP(0x48, 0x27, 0x6E8D) /* <CJK> */
+MAP(0x48, 0x28, 0x6E93) /* <CJK> */
+MAP(0x48, 0x29, 0x6E99) /* <CJK> */
+MAP(0x48, 0x2A, 0x6EA0) /* <CJK> */
+MAP(0x48, 0x2B, 0x6EA7) /* <CJK> */
+MAP(0x48, 0x2C, 0x6EAD) /* <CJK> */
+MAP(0x48, 0x2D, 0x6EAE) /* <CJK> */
+MAP(0x48, 0x2E, 0x6EB1) /* <CJK> */
+MAP(0x48, 0x2F, 0x6EB3) /* <CJK> */
+MAP(0x48, 0x30, 0x6EBB) /* <CJK> */
+MAP(0x48, 0x31, 0x6EBF) /* <CJK> */
+MAP(0x48, 0x32, 0x6EC0) /* <CJK> */
+MAP(0x48, 0x33, 0x6EC1) /* <CJK> */
+MAP(0x48, 0x34, 0x6EC3) /* <CJK> */
+MAP(0x48, 0x35, 0x6EC7) /* <CJK> */
+MAP(0x48, 0x36, 0x6EC8) /* <CJK> */
+MAP(0x48, 0x37, 0x6ECA) /* <CJK> */
+MAP(0x48, 0x38, 0x6ECD) /* <CJK> */
+MAP(0x48, 0x39, 0x6ECE) /* <CJK> */
+MAP(0x48, 0x3A, 0x6ECF) /* <CJK> */
+MAP(0x48, 0x3B, 0x6EEB) /* <CJK> */
+MAP(0x48, 0x3C, 0x6EED) /* <CJK> */
+MAP(0x48, 0x3D, 0x6EEE) /* <CJK> */
+MAP(0x48, 0x3E, 0x6EF9) /* <CJK> */
+MAP(0x48, 0x3F, 0x6EFB) /* <CJK> */
+MAP(0x48, 0x40, 0x6EFD) /* <CJK> */
+MAP(0x48, 0x41, 0x6F04) /* <CJK> */
+MAP(0x48, 0x42, 0x6F08) /* <CJK> */
+MAP(0x48, 0x43, 0x6F0A) /* <CJK> */
+MAP(0x48, 0x44, 0x6F0C) /* <CJK> */
+MAP(0x48, 0x45, 0x6F0D) /* <CJK> */
+MAP(0x48, 0x46, 0x6F16) /* <CJK> */
+MAP(0x48, 0x47, 0x6F18) /* <CJK> */
+MAP(0x48, 0x48, 0x6F1A) /* <CJK> */
+MAP(0x48, 0x49, 0x6F1B) /* <CJK> */
+MAP(0x48, 0x4A, 0x6F26) /* <CJK> */
+MAP(0x48, 0x4B, 0x6F29) /* <CJK> */
+MAP(0x48, 0x4C, 0x6F2A) /* <CJK> */
+MAP(0x48, 0x4D, 0x6F2F) /* <CJK> */
+MAP(0x48, 0x4E, 0x6F30) /* <CJK> */
+MAP(0x48, 0x4F, 0x6F33) /* <CJK> */
+MAP(0x48, 0x50, 0x6F36) /* <CJK> */
+MAP(0x48, 0x51, 0x6F3B) /* <CJK> */
+MAP(0x48, 0x52, 0x6F3C) /* <CJK> */
+MAP(0x48, 0x53, 0x6F2D) /* <CJK> */
+MAP(0x48, 0x54, 0x6F4F) /* <CJK> */
+MAP(0x48, 0x55, 0x6F51) /* <CJK> */
+MAP(0x48, 0x56, 0x6F52) /* <CJK> */
+MAP(0x48, 0x57, 0x6F53) /* <CJK> */
+MAP(0x48, 0x58, 0x6F57) /* <CJK> */
+MAP(0x48, 0x59, 0x6F59) /* <CJK> */
+MAP(0x48, 0x5A, 0x6F5A) /* <CJK> */
+MAP(0x48, 0x5B, 0x6F5D) /* <CJK> */
+MAP(0x48, 0x5C, 0x6F5E) /* <CJK> */
+MAP(0x48, 0x5D, 0x6F61) /* <CJK> */
+MAP(0x48, 0x5E, 0x6F62) /* <CJK> */
+MAP(0x48, 0x5F, 0x6F68) /* <CJK> */
+MAP(0x48, 0x60, 0x6F6C) /* <CJK> */
+MAP(0x48, 0x61, 0x6F7D) /* <CJK> */
+MAP(0x48, 0x62, 0x6F7E) /* <CJK> */
+MAP(0x48, 0x63, 0x6F83) /* <CJK> */
+MAP(0x48, 0x64, 0x6F87) /* <CJK> */
+MAP(0x48, 0x65, 0x6F88) /* <CJK> */
+MAP(0x48, 0x66, 0x6F8B) /* <CJK> */
+MAP(0x48, 0x67, 0x6F8C) /* <CJK> */
+MAP(0x48, 0x68, 0x6F8D) /* <CJK> */
+MAP(0x48, 0x69, 0x6F90) /* <CJK> */
+MAP(0x48, 0x6A, 0x6F92) /* <CJK> */
+MAP(0x48, 0x6B, 0x6F93) /* <CJK> */
+MAP(0x48, 0x6C, 0x6F94) /* <CJK> */
+MAP(0x48, 0x6D, 0x6F96) /* <CJK> */
+MAP(0x48, 0x6E, 0x6F9A) /* <CJK> */
+MAP(0x48, 0x6F, 0x6F9F) /* <CJK> */
+MAP(0x48, 0x70, 0x6FA0) /* <CJK> */
+MAP(0x48, 0x71, 0x6FA5) /* <CJK> */
+MAP(0x48, 0x72, 0x6FA6) /* <CJK> */
+MAP(0x48, 0x73, 0x6FA7) /* <CJK> */
+MAP(0x48, 0x74, 0x6FA8) /* <CJK> */
+MAP(0x48, 0x75, 0x6FAE) /* <CJK> */
+MAP(0x48, 0x76, 0x6FAF) /* <CJK> */
+MAP(0x48, 0x77, 0x6FB0) /* <CJK> */
+MAP(0x48, 0x78, 0x6FB5) /* <CJK> */
+MAP(0x48, 0x79, 0x6FB6) /* <CJK> */
+MAP(0x48, 0x7A, 0x6FBC) /* <CJK> */
+MAP(0x48, 0x7B, 0x6FC5) /* <CJK> */
+MAP(0x48, 0x7C, 0x6FC7) /* <CJK> */
+MAP(0x48, 0x7D, 0x6FC8) /* <CJK> */
+MAP(0x48, 0x7E, 0x6FCA) /* <CJK> */
+MAP(0x49, 0x21, 0x6FDA) /* <CJK> */
+MAP(0x49, 0x22, 0x6FDE) /* <CJK> */
+MAP(0x49, 0x23, 0x6FE8) /* <CJK> */
+MAP(0x49, 0x24, 0x6FE9) /* <CJK> */
+MAP(0x49, 0x25, 0x6FF0) /* <CJK> */
+MAP(0x49, 0x26, 0x6FF5) /* <CJK> */
+MAP(0x49, 0x27, 0x6FF9) /* <CJK> */
+MAP(0x49, 0x28, 0x6FFC) /* <CJK> */
+MAP(0x49, 0x29, 0x6FFD) /* <CJK> */
+MAP(0x49, 0x2A, 0x7000) /* <CJK> */
+MAP(0x49, 0x2B, 0x7005) /* <CJK> */
+MAP(0x49, 0x2C, 0x7006) /* <CJK> */
+MAP(0x49, 0x2D, 0x7007) /* <CJK> */
+MAP(0x49, 0x2E, 0x700D) /* <CJK> */
+MAP(0x49, 0x2F, 0x7017) /* <CJK> */
+MAP(0x49, 0x30, 0x7020) /* <CJK> */
+MAP(0x49, 0x31, 0x7023) /* <CJK> */
+MAP(0x49, 0x32, 0x702F) /* <CJK> */
+MAP(0x49, 0x33, 0x7034) /* <CJK> */
+MAP(0x49, 0x34, 0x7037) /* <CJK> */
+MAP(0x49, 0x35, 0x7039) /* <CJK> */
+MAP(0x49, 0x36, 0x703C) /* <CJK> */
+MAP(0x49, 0x37, 0x7043) /* <CJK> */
+MAP(0x49, 0x38, 0x7044) /* <CJK> */
+MAP(0x49, 0x39, 0x7048) /* <CJK> */
+MAP(0x49, 0x3A, 0x7049) /* <CJK> */
+MAP(0x49, 0x3B, 0x704A) /* <CJK> */
+MAP(0x49, 0x3C, 0x704B) /* <CJK> */
+MAP(0x49, 0x3D, 0x7054) /* <CJK> */
+MAP(0x49, 0x3E, 0x7055) /* <CJK> */
+MAP(0x49, 0x3F, 0x705D) /* <CJK> */
+MAP(0x49, 0x40, 0x705E) /* <CJK> */
+MAP(0x49, 0x41, 0x704E) /* <CJK> */
+MAP(0x49, 0x42, 0x7064) /* <CJK> */
+MAP(0x49, 0x43, 0x7065) /* <CJK> */
+MAP(0x49, 0x44, 0x706C) /* <CJK> */
+MAP(0x49, 0x45, 0x706E) /* <CJK> */
+MAP(0x49, 0x46, 0x7075) /* <CJK> */
+MAP(0x49, 0x47, 0x7076) /* <CJK> */
+MAP(0x49, 0x48, 0x707E) /* <CJK> */
+MAP(0x49, 0x49, 0x7081) /* <CJK> */
+MAP(0x49, 0x4A, 0x7085) /* <CJK> */
+MAP(0x49, 0x4B, 0x7086) /* <CJK> */
+MAP(0x49, 0x4C, 0x7094) /* <CJK> */
+MAP(0x49, 0x4D, 0x7095) /* <CJK> */
+MAP(0x49, 0x4E, 0x7096) /* <CJK> */
+MAP(0x49, 0x4F, 0x7097) /* <CJK> */
+MAP(0x49, 0x50, 0x7098) /* <CJK> */
+MAP(0x49, 0x51, 0x709B) /* <CJK> */
+MAP(0x49, 0x52, 0x70A4) /* <CJK> */
+MAP(0x49, 0x53, 0x70AB) /* <CJK> */
+MAP(0x49, 0x54, 0x70B0) /* <CJK> */
+MAP(0x49, 0x55, 0x70B1) /* <CJK> */
+MAP(0x49, 0x56, 0x70B4) /* <CJK> */
+MAP(0x49, 0x57, 0x70B7) /* <CJK> */
+MAP(0x49, 0x58, 0x70CA) /* <CJK> */
+MAP(0x49, 0x59, 0x70D1) /* <CJK> */
+MAP(0x49, 0x5A, 0x70D3) /* <CJK> */
+MAP(0x49, 0x5B, 0x70D4) /* <CJK> */
+MAP(0x49, 0x5C, 0x70D5) /* <CJK> */
+MAP(0x49, 0x5D, 0x70D6) /* <CJK> */
+MAP(0x49, 0x5E, 0x70D8) /* <CJK> */
+MAP(0x49, 0x5F, 0x70DC) /* <CJK> */
+MAP(0x49, 0x60, 0x70E4) /* <CJK> */
+MAP(0x49, 0x61, 0x70FA) /* <CJK> */
+MAP(0x49, 0x62, 0x7103) /* <CJK> */
+MAP(0x49, 0x63, 0x7104) /* <CJK> */
+MAP(0x49, 0x64, 0x7105) /* <CJK> */
+MAP(0x49, 0x65, 0x7106) /* <CJK> */
+MAP(0x49, 0x66, 0x7107) /* <CJK> */
+MAP(0x49, 0x67, 0x710B) /* <CJK> */
+MAP(0x49, 0x68, 0x710C) /* <CJK> */
+MAP(0x49, 0x69, 0x710F) /* <CJK> */
+MAP(0x49, 0x6A, 0x711E) /* <CJK> */
+MAP(0x49, 0x6B, 0x7120) /* <CJK> */
+MAP(0x49, 0x6C, 0x712B) /* <CJK> */
+MAP(0x49, 0x6D, 0x712D) /* <CJK> */
+MAP(0x49, 0x6E, 0x712F) /* <CJK> */
+MAP(0x49, 0x6F, 0x7130) /* <CJK> */
+MAP(0x49, 0x70, 0x7131) /* <CJK> */
+MAP(0x49, 0x71, 0x7138) /* <CJK> */
+MAP(0x49, 0x72, 0x7141) /* <CJK> */
+MAP(0x49, 0x73, 0x7145) /* <CJK> */
+MAP(0x49, 0x74, 0x7146) /* <CJK> */
+MAP(0x49, 0x75, 0x7147) /* <CJK> */
+MAP(0x49, 0x76, 0x714A) /* <CJK> */
+MAP(0x49, 0x77, 0x714B) /* <CJK> */
+MAP(0x49, 0x78, 0x7150) /* <CJK> */
+MAP(0x49, 0x79, 0x7152) /* <CJK> */
+MAP(0x49, 0x7A, 0x7157) /* <CJK> */
+MAP(0x49, 0x7B, 0x715A) /* <CJK> */
+MAP(0x49, 0x7C, 0x715C) /* <CJK> */
+MAP(0x49, 0x7D, 0x715E) /* <CJK> */
+MAP(0x49, 0x7E, 0x7160) /* <CJK> */
+MAP(0x4A, 0x21, 0x7168) /* <CJK> */
+MAP(0x4A, 0x22, 0x7179) /* <CJK> */
+MAP(0x4A, 0x23, 0x7180) /* <CJK> */
+MAP(0x4A, 0x24, 0x7185) /* <CJK> */
+MAP(0x4A, 0x25, 0x7187) /* <CJK> */
+MAP(0x4A, 0x26, 0x718C) /* <CJK> */
+MAP(0x4A, 0x27, 0x7192) /* <CJK> */
+MAP(0x4A, 0x28, 0x719A) /* <CJK> */
+MAP(0x4A, 0x29, 0x719B) /* <CJK> */
+MAP(0x4A, 0x2A, 0x71A0) /* <CJK> */
+MAP(0x4A, 0x2B, 0x71A2) /* <CJK> */
+MAP(0x4A, 0x2C, 0x71AF) /* <CJK> */
+MAP(0x4A, 0x2D, 0x71B0) /* <CJK> */
+MAP(0x4A, 0x2E, 0x71B2) /* <CJK> */
+MAP(0x4A, 0x2F, 0x71B3) /* <CJK> */
+MAP(0x4A, 0x30, 0x71BA) /* <CJK> */
+MAP(0x4A, 0x31, 0x71BF) /* <CJK> */
+MAP(0x4A, 0x32, 0x71C0) /* <CJK> */
+MAP(0x4A, 0x33, 0x71C1) /* <CJK> */
+MAP(0x4A, 0x34, 0x71C4) /* <CJK> */
+MAP(0x4A, 0x35, 0x71CB) /* <CJK> */
+MAP(0x4A, 0x36, 0x71CC) /* <CJK> */
+MAP(0x4A, 0x37, 0x71D3) /* <CJK> */
+MAP(0x4A, 0x38, 0x71D6) /* <CJK> */
+MAP(0x4A, 0x39, 0x71D9) /* <CJK> */
+MAP(0x4A, 0x3A, 0x71DA) /* <CJK> */
+MAP(0x4A, 0x3B, 0x71DC) /* <CJK> */
+MAP(0x4A, 0x3C, 0x71F8) /* <CJK> */
+MAP(0x4A, 0x3D, 0x71FE) /* <CJK> */
+MAP(0x4A, 0x3E, 0x7200) /* <CJK> */
+MAP(0x4A, 0x3F, 0x7207) /* <CJK> */
+MAP(0x4A, 0x40, 0x7208) /* <CJK> */
+MAP(0x4A, 0x41, 0x7209) /* <CJK> */
+MAP(0x4A, 0x42, 0x7213) /* <CJK> */
+MAP(0x4A, 0x43, 0x7217) /* <CJK> */
+MAP(0x4A, 0x44, 0x721A) /* <CJK> */
+MAP(0x4A, 0x45, 0x721D) /* <CJK> */
+MAP(0x4A, 0x46, 0x721F) /* <CJK> */
+MAP(0x4A, 0x47, 0x7224) /* <CJK> */
+MAP(0x4A, 0x48, 0x722B) /* <CJK> */
+MAP(0x4A, 0x49, 0x722F) /* <CJK> */
+MAP(0x4A, 0x4A, 0x7234) /* <CJK> */
+MAP(0x4A, 0x4B, 0x7238) /* <CJK> */
+MAP(0x4A, 0x4C, 0x7239) /* <CJK> */
+MAP(0x4A, 0x4D, 0x7241) /* <CJK> */
+MAP(0x4A, 0x4E, 0x7242) /* <CJK> */
+MAP(0x4A, 0x4F, 0x7243) /* <CJK> */
+MAP(0x4A, 0x50, 0x7245) /* <CJK> */
+MAP(0x4A, 0x51, 0x724E) /* <CJK> */
+MAP(0x4A, 0x52, 0x724F) /* <CJK> */
+MAP(0x4A, 0x53, 0x7250) /* <CJK> */
+MAP(0x4A, 0x54, 0x7253) /* <CJK> */
+MAP(0x4A, 0x55, 0x7255) /* <CJK> */
+MAP(0x4A, 0x56, 0x7256) /* <CJK> */
+MAP(0x4A, 0x57, 0x725A) /* <CJK> */
+MAP(0x4A, 0x58, 0x725C) /* <CJK> */
+MAP(0x4A, 0x59, 0x725E) /* <CJK> */
+MAP(0x4A, 0x5A, 0x7260) /* <CJK> */
+MAP(0x4A, 0x5B, 0x7263) /* <CJK> */
+MAP(0x4A, 0x5C, 0x7268) /* <CJK> */
+MAP(0x4A, 0x5D, 0x726B) /* <CJK> */
+MAP(0x4A, 0x5E, 0x726E) /* <CJK> */
+MAP(0x4A, 0x5F, 0x726F) /* <CJK> */
+MAP(0x4A, 0x60, 0x7271) /* <CJK> */
+MAP(0x4A, 0x61, 0x7277) /* <CJK> */
+MAP(0x4A, 0x62, 0x7278) /* <CJK> */
+MAP(0x4A, 0x63, 0x727B) /* <CJK> */
+MAP(0x4A, 0x64, 0x727C) /* <CJK> */
+MAP(0x4A, 0x65, 0x727F) /* <CJK> */
+MAP(0x4A, 0x66, 0x7284) /* <CJK> */
+MAP(0x4A, 0x67, 0x7289) /* <CJK> */
+MAP(0x4A, 0x68, 0x728D) /* <CJK> */
+MAP(0x4A, 0x69, 0x728E) /* <CJK> */
+MAP(0x4A, 0x6A, 0x7293) /* <CJK> */
+MAP(0x4A, 0x6B, 0x729B) /* <CJK> */
+MAP(0x4A, 0x6C, 0x72A8) /* <CJK> */
+MAP(0x4A, 0x6D, 0x72AD) /* <CJK> */
+MAP(0x4A, 0x6E, 0x72AE) /* <CJK> */
+MAP(0x4A, 0x6F, 0x72B1) /* <CJK> */
+MAP(0x4A, 0x70, 0x72B4) /* <CJK> */
+MAP(0x4A, 0x71, 0x72BE) /* <CJK> */
+MAP(0x4A, 0x72, 0x72C1) /* <CJK> */
+MAP(0x4A, 0x73, 0x72C7) /* <CJK> */
+MAP(0x4A, 0x74, 0x72C9) /* <CJK> */
+MAP(0x4A, 0x75, 0x72CC) /* <CJK> */
+MAP(0x4A, 0x76, 0x72D5) /* <CJK> */
+MAP(0x4A, 0x77, 0x72D6) /* <CJK> */
+MAP(0x4A, 0x78, 0x72D8) /* <CJK> */
+MAP(0x4A, 0x79, 0x72DF) /* <CJK> */
+MAP(0x4A, 0x7A, 0x72E5) /* <CJK> */
+MAP(0x4A, 0x7B, 0x72F3) /* <CJK> */
+MAP(0x4A, 0x7C, 0x72F4) /* <CJK> */
+MAP(0x4A, 0x7D, 0x72FA) /* <CJK> */
+MAP(0x4A, 0x7E, 0x72FB) /* <CJK> */
+MAP(0x4B, 0x21, 0x72FE) /* <CJK> */
+MAP(0x4B, 0x22, 0x7302) /* <CJK> */
+MAP(0x4B, 0x23, 0x7304) /* <CJK> */
+MAP(0x4B, 0x24, 0x7305) /* <CJK> */
+MAP(0x4B, 0x25, 0x7307) /* <CJK> */
+MAP(0x4B, 0x26, 0x730B) /* <CJK> */
+MAP(0x4B, 0x27, 0x730D) /* <CJK> */
+MAP(0x4B, 0x28, 0x7312) /* <CJK> */
+MAP(0x4B, 0x29, 0x7313) /* <CJK> */
+MAP(0x4B, 0x2A, 0x7318) /* <CJK> */
+MAP(0x4B, 0x2B, 0x7319) /* <CJK> */
+MAP(0x4B, 0x2C, 0x731E) /* <CJK> */
+MAP(0x4B, 0x2D, 0x7322) /* <CJK> */
+MAP(0x4B, 0x2E, 0x7324) /* <CJK> */
+MAP(0x4B, 0x2F, 0x7327) /* <CJK> */
+MAP(0x4B, 0x30, 0x7328) /* <CJK> */
+MAP(0x4B, 0x31, 0x732C) /* <CJK> */
+MAP(0x4B, 0x32, 0x7331) /* <CJK> */
+MAP(0x4B, 0x33, 0x7332) /* <CJK> */
+MAP(0x4B, 0x34, 0x7335) /* <CJK> */
+MAP(0x4B, 0x35, 0x733A) /* <CJK> */
+MAP(0x4B, 0x36, 0x733B) /* <CJK> */
+MAP(0x4B, 0x37, 0x733D) /* <CJK> */
+MAP(0x4B, 0x38, 0x7343) /* <CJK> */
+MAP(0x4B, 0x39, 0x734D) /* <CJK> */
+MAP(0x4B, 0x3A, 0x7350) /* <CJK> */
+MAP(0x4B, 0x3B, 0x7352) /* <CJK> */
+MAP(0x4B, 0x3C, 0x7356) /* <CJK> */
+MAP(0x4B, 0x3D, 0x7358) /* <CJK> */
+MAP(0x4B, 0x3E, 0x735D) /* <CJK> */
+MAP(0x4B, 0x3F, 0x735E) /* <CJK> */
+MAP(0x4B, 0x40, 0x735F) /* <CJK> */
+MAP(0x4B, 0x41, 0x7360) /* <CJK> */
+MAP(0x4B, 0x42, 0x7366) /* <CJK> */
+MAP(0x4B, 0x43, 0x7367) /* <CJK> */
+MAP(0x4B, 0x44, 0x7369) /* <CJK> */
+MAP(0x4B, 0x45, 0x736B) /* <CJK> */
+MAP(0x4B, 0x46, 0x736C) /* <CJK> */
+MAP(0x4B, 0x47, 0x736E) /* <CJK> */
+MAP(0x4B, 0x48, 0x736F) /* <CJK> */
+MAP(0x4B, 0x49, 0x7371) /* <CJK> */
+MAP(0x4B, 0x4A, 0x7377) /* <CJK> */
+MAP(0x4B, 0x4B, 0x7379) /* <CJK> */
+MAP(0x4B, 0x4C, 0x737C) /* <CJK> */
+MAP(0x4B, 0x4D, 0x7380) /* <CJK> */
+MAP(0x4B, 0x4E, 0x7381) /* <CJK> */
+MAP(0x4B, 0x4F, 0x7383) /* <CJK> */
+MAP(0x4B, 0x50, 0x7385) /* <CJK> */
+MAP(0x4B, 0x51, 0x7386) /* <CJK> */
+MAP(0x4B, 0x52, 0x738E) /* <CJK> */
+MAP(0x4B, 0x53, 0x7390) /* <CJK> */
+MAP(0x4B, 0x54, 0x7393) /* <CJK> */
+MAP(0x4B, 0x55, 0x7395) /* <CJK> */
+MAP(0x4B, 0x56, 0x7397) /* <CJK> */
+MAP(0x4B, 0x57, 0x7398) /* <CJK> */
+MAP(0x4B, 0x58, 0x739C) /* <CJK> */
+MAP(0x4B, 0x59, 0x739E) /* <CJK> */
+MAP(0x4B, 0x5A, 0x739F) /* <CJK> */
+MAP(0x4B, 0x5B, 0x73A0) /* <CJK> */
+MAP(0x4B, 0x5C, 0x73A2) /* <CJK> */
+MAP(0x4B, 0x5D, 0x73A5) /* <CJK> */
+MAP(0x4B, 0x5E, 0x73A6) /* <CJK> */
+MAP(0x4B, 0x5F, 0x73AA) /* <CJK> */
+MAP(0x4B, 0x60, 0x73AB) /* <CJK> */
+MAP(0x4B, 0x61, 0x73AD) /* <CJK> */
+MAP(0x4B, 0x62, 0x73B5) /* <CJK> */
+MAP(0x4B, 0x63, 0x73B7) /* <CJK> */
+MAP(0x4B, 0x64, 0x73B9) /* <CJK> */
+MAP(0x4B, 0x65, 0x73BC) /* <CJK> */
+MAP(0x4B, 0x66, 0x73BD) /* <CJK> */
+MAP(0x4B, 0x67, 0x73BF) /* <CJK> */
+MAP(0x4B, 0x68, 0x73C5) /* <CJK> */
+MAP(0x4B, 0x69, 0x73C6) /* <CJK> */
+MAP(0x4B, 0x6A, 0x73C9) /* <CJK> */
+MAP(0x4B, 0x6B, 0x73CB) /* <CJK> */
+MAP(0x4B, 0x6C, 0x73CC) /* <CJK> */
+MAP(0x4B, 0x6D, 0x73CF) /* <CJK> */
+MAP(0x4B, 0x6E, 0x73D2) /* <CJK> */
+MAP(0x4B, 0x6F, 0x73D3) /* <CJK> */
+MAP(0x4B, 0x70, 0x73D6) /* <CJK> */
+MAP(0x4B, 0x71, 0x73D9) /* <CJK> */
+MAP(0x4B, 0x72, 0x73DD) /* <CJK> */
+MAP(0x4B, 0x73, 0x73E1) /* <CJK> */
+MAP(0x4B, 0x74, 0x73E3) /* <CJK> */
+MAP(0x4B, 0x75, 0x73E6) /* <CJK> */
+MAP(0x4B, 0x76, 0x73E7) /* <CJK> */
+MAP(0x4B, 0x77, 0x73E9) /* <CJK> */
+MAP(0x4B, 0x78, 0x73F4) /* <CJK> */
+MAP(0x4B, 0x79, 0x73F5) /* <CJK> */
+MAP(0x4B, 0x7A, 0x73F7) /* <CJK> */
+MAP(0x4B, 0x7B, 0x73F9) /* <CJK> */
+MAP(0x4B, 0x7C, 0x73FA) /* <CJK> */
+MAP(0x4B, 0x7D, 0x73FB) /* <CJK> */
+MAP(0x4B, 0x7E, 0x73FD) /* <CJK> */
+MAP(0x4C, 0x21, 0x73FF) /* <CJK> */
+MAP(0x4C, 0x22, 0x7400) /* <CJK> */
+MAP(0x4C, 0x23, 0x7401) /* <CJK> */
+MAP(0x4C, 0x24, 0x7404) /* <CJK> */
+MAP(0x4C, 0x25, 0x7407) /* <CJK> */
+MAP(0x4C, 0x26, 0x740A) /* <CJK> */
+MAP(0x4C, 0x27, 0x7411) /* <CJK> */
+MAP(0x4C, 0x28, 0x741A) /* <CJK> */
+MAP(0x4C, 0x29, 0x741B) /* <CJK> */
+MAP(0x4C, 0x2A, 0x7424) /* <CJK> */
+MAP(0x4C, 0x2B, 0x7426) /* <CJK> */
+MAP(0x4C, 0x2C, 0x7428) /* <CJK> */
+MAP(0x4C, 0x2D, 0x7429) /* <CJK> */
+MAP(0x4C, 0x2E, 0x742A) /* <CJK> */
+MAP(0x4C, 0x2F, 0x742B) /* <CJK> */
+MAP(0x4C, 0x30, 0x742C) /* <CJK> */
+MAP(0x4C, 0x31, 0x742D) /* <CJK> */
+MAP(0x4C, 0x32, 0x742E) /* <CJK> */
+MAP(0x4C, 0x33, 0x742F) /* <CJK> */
+MAP(0x4C, 0x34, 0x7430) /* <CJK> */
+MAP(0x4C, 0x35, 0x7431) /* <CJK> */
+MAP(0x4C, 0x36, 0x7439) /* <CJK> */
+MAP(0x4C, 0x37, 0x7440) /* <CJK> */
+MAP(0x4C, 0x38, 0x7443) /* <CJK> */
+MAP(0x4C, 0x39, 0x7444) /* <CJK> */
+MAP(0x4C, 0x3A, 0x7446) /* <CJK> */
+MAP(0x4C, 0x3B, 0x7447) /* <CJK> */
+MAP(0x4C, 0x3C, 0x744B) /* <CJK> */
+MAP(0x4C, 0x3D, 0x744D) /* <CJK> */
+MAP(0x4C, 0x3E, 0x7451) /* <CJK> */
+MAP(0x4C, 0x3F, 0x7452) /* <CJK> */
+MAP(0x4C, 0x40, 0x7457) /* <CJK> */
+MAP(0x4C, 0x41, 0x745D) /* <CJK> */
+MAP(0x4C, 0x42, 0x7462) /* <CJK> */
+MAP(0x4C, 0x43, 0x7466) /* <CJK> */
+MAP(0x4C, 0x44, 0x7467) /* <CJK> */
+MAP(0x4C, 0x45, 0x7468) /* <CJK> */
+MAP(0x4C, 0x46, 0x746B) /* <CJK> */
+MAP(0x4C, 0x47, 0x746D) /* <CJK> */
+MAP(0x4C, 0x48, 0x746E) /* <CJK> */
+MAP(0x4C, 0x49, 0x7471) /* <CJK> */
+MAP(0x4C, 0x4A, 0x7472) /* <CJK> */
+MAP(0x4C, 0x4B, 0x7480) /* <CJK> */
+MAP(0x4C, 0x4C, 0x7481) /* <CJK> */
+MAP(0x4C, 0x4D, 0x7485) /* <CJK> */
+MAP(0x4C, 0x4E, 0x7486) /* <CJK> */
+MAP(0x4C, 0x4F, 0x7487) /* <CJK> */
+MAP(0x4C, 0x50, 0x7489) /* <CJK> */
+MAP(0x4C, 0x51, 0x748F) /* <CJK> */
+MAP(0x4C, 0x52, 0x7490) /* <CJK> */
+MAP(0x4C, 0x53, 0x7491) /* <CJK> */
+MAP(0x4C, 0x54, 0x7492) /* <CJK> */
+MAP(0x4C, 0x55, 0x7498) /* <CJK> */
+MAP(0x4C, 0x56, 0x7499) /* <CJK> */
+MAP(0x4C, 0x57, 0x749A) /* <CJK> */
+MAP(0x4C, 0x58, 0x749C) /* <CJK> */
+MAP(0x4C, 0x59, 0x749F) /* <CJK> */
+MAP(0x4C, 0x5A, 0x74A0) /* <CJK> */
+MAP(0x4C, 0x5B, 0x74A1) /* <CJK> */
+MAP(0x4C, 0x5C, 0x74A3) /* <CJK> */
+MAP(0x4C, 0x5D, 0x74A6) /* <CJK> */
+MAP(0x4C, 0x5E, 0x74A8) /* <CJK> */
+MAP(0x4C, 0x5F, 0x74A9) /* <CJK> */
+MAP(0x4C, 0x60, 0x74AA) /* <CJK> */
+MAP(0x4C, 0x61, 0x74AB) /* <CJK> */
+MAP(0x4C, 0x62, 0x74AE) /* <CJK> */
+MAP(0x4C, 0x63, 0x74AF) /* <CJK> */
+MAP(0x4C, 0x64, 0x74B1) /* <CJK> */
+MAP(0x4C, 0x65, 0x74B2) /* <CJK> */
+MAP(0x4C, 0x66, 0x74B5) /* <CJK> */
+MAP(0x4C, 0x67, 0x74B9) /* <CJK> */
+MAP(0x4C, 0x68, 0x74BB) /* <CJK> */
+MAP(0x4C, 0x69, 0x74BF) /* <CJK> */
+MAP(0x4C, 0x6A, 0x74C8) /* <CJK> */
+MAP(0x4C, 0x6B, 0x74C9) /* <CJK> */
+MAP(0x4C, 0x6C, 0x74CC) /* <CJK> */
+MAP(0x4C, 0x6D, 0x74D0) /* <CJK> */
+MAP(0x4C, 0x6E, 0x74D3) /* <CJK> */
+MAP(0x4C, 0x6F, 0x74D8) /* <CJK> */
+MAP(0x4C, 0x70, 0x74DA) /* <CJK> */
+MAP(0x4C, 0x71, 0x74DB) /* <CJK> */
+MAP(0x4C, 0x72, 0x74DE) /* <CJK> */
+MAP(0x4C, 0x73, 0x74DF) /* <CJK> */
+MAP(0x4C, 0x74, 0x74E4) /* <CJK> */
+MAP(0x4C, 0x75, 0x74E8) /* <CJK> */
+MAP(0x4C, 0x76, 0x74EA) /* <CJK> */
+MAP(0x4C, 0x77, 0x74EB) /* <CJK> */
+MAP(0x4C, 0x78, 0x74EF) /* <CJK> */
+MAP(0x4C, 0x79, 0x74F4) /* <CJK> */
+MAP(0x4C, 0x7A, 0x74FA) /* <CJK> */
+MAP(0x4C, 0x7B, 0x74FB) /* <CJK> */
+MAP(0x4C, 0x7C, 0x74FC) /* <CJK> */
+MAP(0x4C, 0x7D, 0x74FF) /* <CJK> */
+MAP(0x4C, 0x7E, 0x7506) /* <CJK> */
+MAP(0x4D, 0x21, 0x7512) /* <CJK> */
+MAP(0x4D, 0x22, 0x7516) /* <CJK> */
+MAP(0x4D, 0x23, 0x7517) /* <CJK> */
+MAP(0x4D, 0x24, 0x7520) /* <CJK> */
+MAP(0x4D, 0x25, 0x7521) /* <CJK> */
+MAP(0x4D, 0x26, 0x7524) /* <CJK> */
+MAP(0x4D, 0x27, 0x7527) /* <CJK> */
+MAP(0x4D, 0x28, 0x7529) /* <CJK> */
+MAP(0x4D, 0x29, 0x752A) /* <CJK> */
+MAP(0x4D, 0x2A, 0x752F) /* <CJK> */
+MAP(0x4D, 0x2B, 0x7536) /* <CJK> */
+MAP(0x4D, 0x2C, 0x7539) /* <CJK> */
+MAP(0x4D, 0x2D, 0x753D) /* <CJK> */
+MAP(0x4D, 0x2E, 0x753E) /* <CJK> */
+MAP(0x4D, 0x2F, 0x753F) /* <CJK> */
+MAP(0x4D, 0x30, 0x7540) /* <CJK> */
+MAP(0x4D, 0x31, 0x7543) /* <CJK> */
+MAP(0x4D, 0x32, 0x7547) /* <CJK> */
+MAP(0x4D, 0x33, 0x7548) /* <CJK> */
+MAP(0x4D, 0x34, 0x754E) /* <CJK> */
+MAP(0x4D, 0x35, 0x7550) /* <CJK> */
+MAP(0x4D, 0x36, 0x7552) /* <CJK> */
+MAP(0x4D, 0x37, 0x7557) /* <CJK> */
+MAP(0x4D, 0x38, 0x755E) /* <CJK> */
+MAP(0x4D, 0x39, 0x755F) /* <CJK> */
+MAP(0x4D, 0x3A, 0x7561) /* <CJK> */
+MAP(0x4D, 0x3B, 0x756F) /* <CJK> */
+MAP(0x4D, 0x3C, 0x7571) /* <CJK> */
+MAP(0x4D, 0x3D, 0x7579) /* <CJK> */
+MAP(0x4D, 0x3E, 0x757A) /* <CJK> */
+MAP(0x4D, 0x3F, 0x757B) /* <CJK> */
+MAP(0x4D, 0x40, 0x757C) /* <CJK> */
+MAP(0x4D, 0x41, 0x757D) /* <CJK> */
+MAP(0x4D, 0x42, 0x757E) /* <CJK> */
+MAP(0x4D, 0x43, 0x7581) /* <CJK> */
+MAP(0x4D, 0x44, 0x7585) /* <CJK> */
+MAP(0x4D, 0x45, 0x7590) /* <CJK> */
+MAP(0x4D, 0x46, 0x7592) /* <CJK> */
+MAP(0x4D, 0x47, 0x7593) /* <CJK> */
+MAP(0x4D, 0x48, 0x7595) /* <CJK> */
+MAP(0x4D, 0x49, 0x7599) /* <CJK> */
+MAP(0x4D, 0x4A, 0x759C) /* <CJK> */
+MAP(0x4D, 0x4B, 0x75A2) /* <CJK> */
+MAP(0x4D, 0x4C, 0x75A4) /* <CJK> */
+MAP(0x4D, 0x4D, 0x75B4) /* <CJK> */
+MAP(0x4D, 0x4E, 0x75BA) /* <CJK> */
+MAP(0x4D, 0x4F, 0x75BF) /* <CJK> */
+MAP(0x4D, 0x50, 0x75C0) /* <CJK> */
+MAP(0x4D, 0x51, 0x75C1) /* <CJK> */
+MAP(0x4D, 0x52, 0x75C4) /* <CJK> */
+MAP(0x4D, 0x53, 0x75C6) /* <CJK> */
+MAP(0x4D, 0x54, 0x75CC) /* <CJK> */
+MAP(0x4D, 0x55, 0x75CE) /* <CJK> */
+MAP(0x4D, 0x56, 0x75CF) /* <CJK> */
+MAP(0x4D, 0x57, 0x75D7) /* <CJK> */
+MAP(0x4D, 0x58, 0x75DC) /* <CJK> */
+MAP(0x4D, 0x59, 0x75DF) /* <CJK> */
+MAP(0x4D, 0x5A, 0x75E0) /* <CJK> */
+MAP(0x4D, 0x5B, 0x75E1) /* <CJK> */
+MAP(0x4D, 0x5C, 0x75E4) /* <CJK> */
+MAP(0x4D, 0x5D, 0x75E7) /* <CJK> */
+MAP(0x4D, 0x5E, 0x75EC) /* <CJK> */
+MAP(0x4D, 0x5F, 0x75EE) /* <CJK> */
+MAP(0x4D, 0x60, 0x75EF) /* <CJK> */
+MAP(0x4D, 0x61, 0x75F1) /* <CJK> */
+MAP(0x4D, 0x62, 0x75F9) /* <CJK> */
+MAP(0x4D, 0x63, 0x7600) /* <CJK> */
+MAP(0x4D, 0x64, 0x7602) /* <CJK> */
+MAP(0x4D, 0x65, 0x7603) /* <CJK> */
+MAP(0x4D, 0x66, 0x7604) /* <CJK> */
+MAP(0x4D, 0x67, 0x7607) /* <CJK> */
+MAP(0x4D, 0x68, 0x7608) /* <CJK> */
+MAP(0x4D, 0x69, 0x760A) /* <CJK> */
+MAP(0x4D, 0x6A, 0x760C) /* <CJK> */
+MAP(0x4D, 0x6B, 0x760F) /* <CJK> */
+MAP(0x4D, 0x6C, 0x7612) /* <CJK> */
+MAP(0x4D, 0x6D, 0x7613) /* <CJK> */
+MAP(0x4D, 0x6E, 0x7615) /* <CJK> */
+MAP(0x4D, 0x6F, 0x7616) /* <CJK> */
+MAP(0x4D, 0x70, 0x7619) /* <CJK> */
+MAP(0x4D, 0x71, 0x761B) /* <CJK> */
+MAP(0x4D, 0x72, 0x761C) /* <CJK> */
+MAP(0x4D, 0x73, 0x761D) /* <CJK> */
+MAP(0x4D, 0x74, 0x761E) /* <CJK> */
+MAP(0x4D, 0x75, 0x7623) /* <CJK> */
+MAP(0x4D, 0x76, 0x7625) /* <CJK> */
+MAP(0x4D, 0x77, 0x7626) /* <CJK> */
+MAP(0x4D, 0x78, 0x7629) /* <CJK> */
+MAP(0x4D, 0x79, 0x762D) /* <CJK> */
+MAP(0x4D, 0x7A, 0x7632) /* <CJK> */
+MAP(0x4D, 0x7B, 0x7633) /* <CJK> */
+MAP(0x4D, 0x7C, 0x7635) /* <CJK> */
+MAP(0x4D, 0x7D, 0x7638) /* <CJK> */
+MAP(0x4D, 0x7E, 0x7639) /* <CJK> */
+MAP(0x4E, 0x21, 0x763A) /* <CJK> */
+MAP(0x4E, 0x22, 0x763C) /* <CJK> */
+MAP(0x4E, 0x23, 0x764A) /* <CJK> */
+MAP(0x4E, 0x24, 0x7640) /* <CJK> */
+MAP(0x4E, 0x25, 0x7641) /* <CJK> */
+MAP(0x4E, 0x26, 0x7643) /* <CJK> */
+MAP(0x4E, 0x27, 0x7644) /* <CJK> */
+MAP(0x4E, 0x28, 0x7645) /* <CJK> */
+MAP(0x4E, 0x29, 0x7649) /* <CJK> */
+MAP(0x4E, 0x2A, 0x764B) /* <CJK> */
+MAP(0x4E, 0x2B, 0x7655) /* <CJK> */
+MAP(0x4E, 0x2C, 0x7659) /* <CJK> */
+MAP(0x4E, 0x2D, 0x765F) /* <CJK> */
+MAP(0x4E, 0x2E, 0x7664) /* <CJK> */
+MAP(0x4E, 0x2F, 0x7665) /* <CJK> */
+MAP(0x4E, 0x30, 0x766D) /* <CJK> */
+MAP(0x4E, 0x31, 0x766E) /* <CJK> */
+MAP(0x4E, 0x32, 0x766F) /* <CJK> */
+MAP(0x4E, 0x33, 0x7671) /* <CJK> */
+MAP(0x4E, 0x34, 0x7674) /* <CJK> */
+MAP(0x4E, 0x35, 0x7681) /* <CJK> */
+MAP(0x4E, 0x36, 0x7685) /* <CJK> */
+MAP(0x4E, 0x37, 0x768C) /* <CJK> */
+MAP(0x4E, 0x38, 0x768D) /* <CJK> */
+MAP(0x4E, 0x39, 0x7695) /* <CJK> */
+MAP(0x4E, 0x3A, 0x769B) /* <CJK> */
+MAP(0x4E, 0x3B, 0x769C) /* <CJK> */
+MAP(0x4E, 0x3C, 0x769D) /* <CJK> */
+MAP(0x4E, 0x3D, 0x769F) /* <CJK> */
+MAP(0x4E, 0x3E, 0x76A0) /* <CJK> */
+MAP(0x4E, 0x3F, 0x76A2) /* <CJK> */
+MAP(0x4E, 0x40, 0x76A3) /* <CJK> */
+MAP(0x4E, 0x41, 0x76A4) /* <CJK> */
+MAP(0x4E, 0x42, 0x76A5) /* <CJK> */
+MAP(0x4E, 0x43, 0x76A6) /* <CJK> */
+MAP(0x4E, 0x44, 0x76A7) /* <CJK> */
+MAP(0x4E, 0x45, 0x76A8) /* <CJK> */
+MAP(0x4E, 0x46, 0x76AA) /* <CJK> */
+MAP(0x4E, 0x47, 0x76AD) /* <CJK> */
+MAP(0x4E, 0x48, 0x76BD) /* <CJK> */
+MAP(0x4E, 0x49, 0x76C1) /* <CJK> */
+MAP(0x4E, 0x4A, 0x76C5) /* <CJK> */
+MAP(0x4E, 0x4B, 0x76C9) /* <CJK> */
+MAP(0x4E, 0x4C, 0x76CB) /* <CJK> */
+MAP(0x4E, 0x4D, 0x76CC) /* <CJK> */
+MAP(0x4E, 0x4E, 0x76CE) /* <CJK> */
+MAP(0x4E, 0x4F, 0x76D4) /* <CJK> */
+MAP(0x4E, 0x50, 0x76D9) /* <CJK> */
+MAP(0x4E, 0x51, 0x76E0) /* <CJK> */
+MAP(0x4E, 0x52, 0x76E6) /* <CJK> */
+MAP(0x4E, 0x53, 0x76E8) /* <CJK> */
+MAP(0x4E, 0x54, 0x76EC) /* <CJK> */
+MAP(0x4E, 0x55, 0x76F0) /* <CJK> */
+MAP(0x4E, 0x56, 0x76F1) /* <CJK> */
+MAP(0x4E, 0x57, 0x76F6) /* <CJK> */
+MAP(0x4E, 0x58, 0x76F9) /* <CJK> */
+MAP(0x4E, 0x59, 0x76FC) /* <CJK> */
+MAP(0x4E, 0x5A, 0x7700) /* <CJK> */
+MAP(0x4E, 0x5B, 0x7706) /* <CJK> */
+MAP(0x4E, 0x5C, 0x770A) /* <CJK> */
+MAP(0x4E, 0x5D, 0x770E) /* <CJK> */
+MAP(0x4E, 0x5E, 0x7712) /* <CJK> */
+MAP(0x4E, 0x5F, 0x7714) /* <CJK> */
+MAP(0x4E, 0x60, 0x7715) /* <CJK> */
+MAP(0x4E, 0x61, 0x7717) /* <CJK> */
+MAP(0x4E, 0x62, 0x7719) /* <CJK> */
+MAP(0x4E, 0x63, 0x771A) /* <CJK> */
+MAP(0x4E, 0x64, 0x771C) /* <CJK> */
+MAP(0x4E, 0x65, 0x7722) /* <CJK> */
+MAP(0x4E, 0x66, 0x7728) /* <CJK> */
+MAP(0x4E, 0x67, 0x772D) /* <CJK> */
+MAP(0x4E, 0x68, 0x772E) /* <CJK> */
+MAP(0x4E, 0x69, 0x772F) /* <CJK> */
+MAP(0x4E, 0x6A, 0x7734) /* <CJK> */
+MAP(0x4E, 0x6B, 0x7735) /* <CJK> */
+MAP(0x4E, 0x6C, 0x7736) /* <CJK> */
+MAP(0x4E, 0x6D, 0x7739) /* <CJK> */
+MAP(0x4E, 0x6E, 0x773D) /* <CJK> */
+MAP(0x4E, 0x6F, 0x773E) /* <CJK> */
+MAP(0x4E, 0x70, 0x7742) /* <CJK> */
+MAP(0x4E, 0x71, 0x7745) /* <CJK> */
+MAP(0x4E, 0x72, 0x7746) /* <CJK> */
+MAP(0x4E, 0x73, 0x774A) /* <CJK> */
+MAP(0x4E, 0x74, 0x774D) /* <CJK> */
+MAP(0x4E, 0x75, 0x774E) /* <CJK> */
+MAP(0x4E, 0x76, 0x774F) /* <CJK> */
+MAP(0x4E, 0x77, 0x7752) /* <CJK> */
+MAP(0x4E, 0x78, 0x7756) /* <CJK> */
+MAP(0x4E, 0x79, 0x7757) /* <CJK> */
+MAP(0x4E, 0x7A, 0x775C) /* <CJK> */
+MAP(0x4E, 0x7B, 0x775E) /* <CJK> */
+MAP(0x4E, 0x7C, 0x775F) /* <CJK> */
+MAP(0x4E, 0x7D, 0x7760) /* <CJK> */
+MAP(0x4E, 0x7E, 0x7762) /* <CJK> */
+MAP(0x4F, 0x21, 0x7764) /* <CJK> */
+MAP(0x4F, 0x22, 0x7767) /* <CJK> */
+MAP(0x4F, 0x23, 0x776A) /* <CJK> */
+MAP(0x4F, 0x24, 0x776C) /* <CJK> */
+MAP(0x4F, 0x25, 0x7770) /* <CJK> */
+MAP(0x4F, 0x26, 0x7772) /* <CJK> */
+MAP(0x4F, 0x27, 0x7773) /* <CJK> */
+MAP(0x4F, 0x28, 0x7774) /* <CJK> */
+MAP(0x4F, 0x29, 0x777A) /* <CJK> */
+MAP(0x4F, 0x2A, 0x777D) /* <CJK> */
+MAP(0x4F, 0x2B, 0x7780) /* <CJK> */
+MAP(0x4F, 0x2C, 0x7784) /* <CJK> */
+MAP(0x4F, 0x2D, 0x778C) /* <CJK> */
+MAP(0x4F, 0x2E, 0x778D) /* <CJK> */
+MAP(0x4F, 0x2F, 0x7794) /* <CJK> */
+MAP(0x4F, 0x30, 0x7795) /* <CJK> */
+MAP(0x4F, 0x31, 0x7796) /* <CJK> */
+MAP(0x4F, 0x32, 0x779A) /* <CJK> */
+MAP(0x4F, 0x33, 0x779F) /* <CJK> */
+MAP(0x4F, 0x34, 0x77A2) /* <CJK> */
+MAP(0x4F, 0x35, 0x77A7) /* <CJK> */
+MAP(0x4F, 0x36, 0x77AA) /* <CJK> */
+MAP(0x4F, 0x37, 0x77AE) /* <CJK> */
+MAP(0x4F, 0x38, 0x77AF) /* <CJK> */
+MAP(0x4F, 0x39, 0x77B1) /* <CJK> */
+MAP(0x4F, 0x3A, 0x77B5) /* <CJK> */
+MAP(0x4F, 0x3B, 0x77BE) /* <CJK> */
+MAP(0x4F, 0x3C, 0x77C3) /* <CJK> */
+MAP(0x4F, 0x3D, 0x77C9) /* <CJK> */
+MAP(0x4F, 0x3E, 0x77D1) /* <CJK> */
+MAP(0x4F, 0x3F, 0x77D2) /* <CJK> */
+MAP(0x4F, 0x40, 0x77D5) /* <CJK> */
+MAP(0x4F, 0x41, 0x77D9) /* <CJK> */
+MAP(0x4F, 0x42, 0x77DE) /* <CJK> */
+MAP(0x4F, 0x43, 0x77DF) /* <CJK> */
+MAP(0x4F, 0x44, 0x77E0) /* <CJK> */
+MAP(0x4F, 0x45, 0x77E4) /* <CJK> */
+MAP(0x4F, 0x46, 0x77E6) /* <CJK> */
+MAP(0x4F, 0x47, 0x77EA) /* <CJK> */
+MAP(0x4F, 0x48, 0x77EC) /* <CJK> */
+MAP(0x4F, 0x49, 0x77F0) /* <CJK> */
+MAP(0x4F, 0x4A, 0x77F1) /* <CJK> */
+MAP(0x4F, 0x4B, 0x77F4) /* <CJK> */
+MAP(0x4F, 0x4C, 0x77F8) /* <CJK> */
+MAP(0x4F, 0x4D, 0x77FB) /* <CJK> */
+MAP(0x4F, 0x4E, 0x7805) /* <CJK> */
+MAP(0x4F, 0x4F, 0x7806) /* <CJK> */
+MAP(0x4F, 0x50, 0x7809) /* <CJK> */
+MAP(0x4F, 0x51, 0x780D) /* <CJK> */
+MAP(0x4F, 0x52, 0x780E) /* <CJK> */
+MAP(0x4F, 0x53, 0x7811) /* <CJK> */
+MAP(0x4F, 0x54, 0x781D) /* <CJK> */
+MAP(0x4F, 0x55, 0x7821) /* <CJK> */
+MAP(0x4F, 0x56, 0x7822) /* <CJK> */
+MAP(0x4F, 0x57, 0x7823) /* <CJK> */
+MAP(0x4F, 0x58, 0x782D) /* <CJK> */
+MAP(0x4F, 0x59, 0x782E) /* <CJK> */
+MAP(0x4F, 0x5A, 0x7830) /* <CJK> */
+MAP(0x4F, 0x5B, 0x7835) /* <CJK> */
+MAP(0x4F, 0x5C, 0x7837) /* <CJK> */
+MAP(0x4F, 0x5D, 0x7843) /* <CJK> */
+MAP(0x4F, 0x5E, 0x7844) /* <CJK> */
+MAP(0x4F, 0x5F, 0x7847) /* <CJK> */
+MAP(0x4F, 0x60, 0x7848) /* <CJK> */
+MAP(0x4F, 0x61, 0x784C) /* <CJK> */
+MAP(0x4F, 0x62, 0x784E) /* <CJK> */
+MAP(0x4F, 0x63, 0x7852) /* <CJK> */
+MAP(0x4F, 0x64, 0x785C) /* <CJK> */
+MAP(0x4F, 0x65, 0x785E) /* <CJK> */
+MAP(0x4F, 0x66, 0x7860) /* <CJK> */
+MAP(0x4F, 0x67, 0x7861) /* <CJK> */
+MAP(0x4F, 0x68, 0x7863) /* <CJK> */
+MAP(0x4F, 0x69, 0x7864) /* <CJK> */
+MAP(0x4F, 0x6A, 0x7868) /* <CJK> */
+MAP(0x4F, 0x6B, 0x786A) /* <CJK> */
+MAP(0x4F, 0x6C, 0x786E) /* <CJK> */
+MAP(0x4F, 0x6D, 0x787A) /* <CJK> */
+MAP(0x4F, 0x6E, 0x787E) /* <CJK> */
+MAP(0x4F, 0x6F, 0x788A) /* <CJK> */
+MAP(0x4F, 0x70, 0x788F) /* <CJK> */
+MAP(0x4F, 0x71, 0x7894) /* <CJK> */
+MAP(0x4F, 0x72, 0x7898) /* <CJK> */
+MAP(0x4F, 0x73, 0x78A1) /* <CJK> */
+MAP(0x4F, 0x74, 0x789D) /* <CJK> */
+MAP(0x4F, 0x75, 0x789E) /* <CJK> */
+MAP(0x4F, 0x76, 0x789F) /* <CJK> */
+MAP(0x4F, 0x77, 0x78A4) /* <CJK> */
+MAP(0x4F, 0x78, 0x78A8) /* <CJK> */
+MAP(0x4F, 0x79, 0x78AC) /* <CJK> */
+MAP(0x4F, 0x7A, 0x78AD) /* <CJK> */
+MAP(0x4F, 0x7B, 0x78B0) /* <CJK> */
+MAP(0x4F, 0x7C, 0x78B1) /* <CJK> */
+MAP(0x4F, 0x7D, 0x78B2) /* <CJK> */
+MAP(0x4F, 0x7E, 0x78B3) /* <CJK> */
+MAP(0x50, 0x21, 0x78BB) /* <CJK> */
+MAP(0x50, 0x22, 0x78BD) /* <CJK> */
+MAP(0x50, 0x23, 0x78BF) /* <CJK> */
+MAP(0x50, 0x24, 0x78C7) /* <CJK> */
+MAP(0x50, 0x25, 0x78C8) /* <CJK> */
+MAP(0x50, 0x26, 0x78C9) /* <CJK> */
+MAP(0x50, 0x27, 0x78CC) /* <CJK> */
+MAP(0x50, 0x28, 0x78CE) /* <CJK> */
+MAP(0x50, 0x29, 0x78D2) /* <CJK> */
+MAP(0x50, 0x2A, 0x78D3) /* <CJK> */
+MAP(0x50, 0x2B, 0x78D5) /* <CJK> */
+MAP(0x50, 0x2C, 0x78D6) /* <CJK> */
+MAP(0x50, 0x2D, 0x78E4) /* <CJK> */
+MAP(0x50, 0x2E, 0x78DB) /* <CJK> */
+MAP(0x50, 0x2F, 0x78DF) /* <CJK> */
+MAP(0x50, 0x30, 0x78E0) /* <CJK> */
+MAP(0x50, 0x31, 0x78E1) /* <CJK> */
+MAP(0x50, 0x32, 0x78E6) /* <CJK> */
+MAP(0x50, 0x33, 0x78EA) /* <CJK> */
+MAP(0x50, 0x34, 0x78F2) /* <CJK> */
+MAP(0x50, 0x35, 0x78F3) /* <CJK> */
+MAP(0x50, 0x36, 0x7900) /* <CJK> */
+MAP(0x50, 0x37, 0x78F6) /* <CJK> */
+MAP(0x50, 0x38, 0x78F7) /* <CJK> */
+MAP(0x50, 0x39, 0x78FA) /* <CJK> */
+MAP(0x50, 0x3A, 0x78FB) /* <CJK> */
+MAP(0x50, 0x3B, 0x78FF) /* <CJK> */
+MAP(0x50, 0x3C, 0x7906) /* <CJK> */
+MAP(0x50, 0x3D, 0x790C) /* <CJK> */
+MAP(0x50, 0x3E, 0x7910) /* <CJK> */
+MAP(0x50, 0x3F, 0x791A) /* <CJK> */
+MAP(0x50, 0x40, 0x791C) /* <CJK> */
+MAP(0x50, 0x41, 0x791E) /* <CJK> */
+MAP(0x50, 0x42, 0x791F) /* <CJK> */
+MAP(0x50, 0x43, 0x7920) /* <CJK> */
+MAP(0x50, 0x44, 0x7925) /* <CJK> */
+MAP(0x50, 0x45, 0x7927) /* <CJK> */
+MAP(0x50, 0x46, 0x7929) /* <CJK> */
+MAP(0x50, 0x47, 0x792D) /* <CJK> */
+MAP(0x50, 0x48, 0x7931) /* <CJK> */
+MAP(0x50, 0x49, 0x7934) /* <CJK> */
+MAP(0x50, 0x4A, 0x7935) /* <CJK> */
+MAP(0x50, 0x4B, 0x793B) /* <CJK> */
+MAP(0x50, 0x4C, 0x793D) /* <CJK> */
+MAP(0x50, 0x4D, 0x793F) /* <CJK> */
+MAP(0x50, 0x4E, 0x7944) /* <CJK> */
+MAP(0x50, 0x4F, 0x7945) /* <CJK> */
+MAP(0x50, 0x50, 0x7946) /* <CJK> */
+MAP(0x50, 0x51, 0x794A) /* <CJK> */
+MAP(0x50, 0x52, 0x794B) /* <CJK> */
+MAP(0x50, 0x53, 0x794F) /* <CJK> */
+MAP(0x50, 0x54, 0x7951) /* <CJK> */
+MAP(0x50, 0x55, 0x7954) /* <CJK> */
+MAP(0x50, 0x56, 0x7958) /* <CJK> */
+MAP(0x50, 0x57, 0x795B) /* <CJK> */
+MAP(0x50, 0x58, 0x795C) /* <CJK> */
+MAP(0x50, 0x59, 0x7967) /* <CJK> */
+MAP(0x50, 0x5A, 0x7969) /* <CJK> */
+MAP(0x50, 0x5B, 0x796B) /* <CJK> */
+MAP(0x50, 0x5C, 0x7972) /* <CJK> */
+MAP(0x50, 0x5D, 0x7979) /* <CJK> */
+MAP(0x50, 0x5E, 0x797B) /* <CJK> */
+MAP(0x50, 0x5F, 0x797C) /* <CJK> */
+MAP(0x50, 0x60, 0x797E) /* <CJK> */
+MAP(0x50, 0x61, 0x798B) /* <CJK> */
+MAP(0x50, 0x62, 0x798C) /* <CJK> */
+MAP(0x50, 0x63, 0x7991) /* <CJK> */
+MAP(0x50, 0x64, 0x7993) /* <CJK> */
+MAP(0x50, 0x65, 0x7994) /* <CJK> */
+MAP(0x50, 0x66, 0x7995) /* <CJK> */
+MAP(0x50, 0x67, 0x7996) /* <CJK> */
+MAP(0x50, 0x68, 0x7998) /* <CJK> */
+MAP(0x50, 0x69, 0x799B) /* <CJK> */
+MAP(0x50, 0x6A, 0x799C) /* <CJK> */
+MAP(0x50, 0x6B, 0x79A1) /* <CJK> */
+MAP(0x50, 0x6C, 0x79A8) /* <CJK> */
+MAP(0x50, 0x6D, 0x79A9) /* <CJK> */
+MAP(0x50, 0x6E, 0x79AB) /* <CJK> */
+MAP(0x50, 0x6F, 0x79AF) /* <CJK> */
+MAP(0x50, 0x70, 0x79B1) /* <CJK> */
+MAP(0x50, 0x71, 0x79B4) /* <CJK> */
+MAP(0x50, 0x72, 0x79B8) /* <CJK> */
+MAP(0x50, 0x73, 0x79BB) /* <CJK> */
+MAP(0x50, 0x74, 0x79C2) /* <CJK> */
+MAP(0x50, 0x75, 0x79C4) /* <CJK> */
+MAP(0x50, 0x76, 0x79C7) /* <CJK> */
+MAP(0x50, 0x77, 0x79C8) /* <CJK> */
+MAP(0x50, 0x78, 0x79CA) /* <CJK> */
+MAP(0x50, 0x79, 0x79CF) /* <CJK> */
+MAP(0x50, 0x7A, 0x79D4) /* <CJK> */
+MAP(0x50, 0x7B, 0x79D6) /* <CJK> */
+MAP(0x50, 0x7C, 0x79DA) /* <CJK> */
+MAP(0x50, 0x7D, 0x79DD) /* <CJK> */
+MAP(0x50, 0x7E, 0x79DE) /* <CJK> */
+MAP(0x51, 0x21, 0x79E0) /* <CJK> */
+MAP(0x51, 0x22, 0x79E2) /* <CJK> */
+MAP(0x51, 0x23, 0x79E5) /* <CJK> */
+MAP(0x51, 0x24, 0x79EA) /* <CJK> */
+MAP(0x51, 0x25, 0x79EB) /* <CJK> */
+MAP(0x51, 0x26, 0x79ED) /* <CJK> */
+MAP(0x51, 0x27, 0x79F1) /* <CJK> */
+MAP(0x51, 0x28, 0x79F8) /* <CJK> */
+MAP(0x51, 0x29, 0x79FC) /* <CJK> */
+MAP(0x51, 0x2A, 0x7A02) /* <CJK> */
+MAP(0x51, 0x2B, 0x7A03) /* <CJK> */
+MAP(0x51, 0x2C, 0x7A07) /* <CJK> */
+MAP(0x51, 0x2D, 0x7A09) /* <CJK> */
+MAP(0x51, 0x2E, 0x7A0A) /* <CJK> */
+MAP(0x51, 0x2F, 0x7A0C) /* <CJK> */
+MAP(0x51, 0x30, 0x7A11) /* <CJK> */
+MAP(0x51, 0x31, 0x7A15) /* <CJK> */
+MAP(0x51, 0x32, 0x7A1B) /* <CJK> */
+MAP(0x51, 0x33, 0x7A1E) /* <CJK> */
+MAP(0x51, 0x34, 0x7A21) /* <CJK> */
+MAP(0x51, 0x35, 0x7A27) /* <CJK> */
+MAP(0x51, 0x36, 0x7A2B) /* <CJK> */
+MAP(0x51, 0x37, 0x7A2D) /* <CJK> */
+MAP(0x51, 0x38, 0x7A2F) /* <CJK> */
+MAP(0x51, 0x39, 0x7A30) /* <CJK> */
+MAP(0x51, 0x3A, 0x7A34) /* <CJK> */
+MAP(0x51, 0x3B, 0x7A35) /* <CJK> */
+MAP(0x51, 0x3C, 0x7A38) /* <CJK> */
+MAP(0x51, 0x3D, 0x7A39) /* <CJK> */
+MAP(0x51, 0x3E, 0x7A3A) /* <CJK> */
+MAP(0x51, 0x3F, 0x7A44) /* <CJK> */
+MAP(0x51, 0x40, 0x7A45) /* <CJK> */
+MAP(0x51, 0x41, 0x7A47) /* <CJK> */
+MAP(0x51, 0x42, 0x7A48) /* <CJK> */
+MAP(0x51, 0x43, 0x7A4C) /* <CJK> */
+MAP(0x51, 0x44, 0x7A55) /* <CJK> */
+MAP(0x51, 0x45, 0x7A56) /* <CJK> */
+MAP(0x51, 0x46, 0x7A59) /* <CJK> */
+MAP(0x51, 0x47, 0x7A5C) /* <CJK> */
+MAP(0x51, 0x48, 0x7A5D) /* <CJK> */
+MAP(0x51, 0x49, 0x7A5F) /* <CJK> */
+MAP(0x51, 0x4A, 0x7A60) /* <CJK> */
+MAP(0x51, 0x4B, 0x7A65) /* <CJK> */
+MAP(0x51, 0x4C, 0x7A67) /* <CJK> */
+MAP(0x51, 0x4D, 0x7A6A) /* <CJK> */
+MAP(0x51, 0x4E, 0x7A6D) /* <CJK> */
+MAP(0x51, 0x4F, 0x7A75) /* <CJK> */
+MAP(0x51, 0x50, 0x7A78) /* <CJK> */
+MAP(0x51, 0x51, 0x7A7E) /* <CJK> */
+MAP(0x51, 0x52, 0x7A80) /* <CJK> */
+MAP(0x51, 0x53, 0x7A82) /* <CJK> */
+MAP(0x51, 0x54, 0x7A85) /* <CJK> */
+MAP(0x51, 0x55, 0x7A86) /* <CJK> */
+MAP(0x51, 0x56, 0x7A8A) /* <CJK> */
+MAP(0x51, 0x57, 0x7A8B) /* <CJK> */
+MAP(0x51, 0x58, 0x7A90) /* <CJK> */
+MAP(0x51, 0x59, 0x7A91) /* <CJK> */
+MAP(0x51, 0x5A, 0x7A94) /* <CJK> */
+MAP(0x51, 0x5B, 0x7A9E) /* <CJK> */
+MAP(0x51, 0x5C, 0x7AA0) /* <CJK> */
+MAP(0x51, 0x5D, 0x7AA3) /* <CJK> */
+MAP(0x51, 0x5E, 0x7AAC) /* <CJK> */
+MAP(0x51, 0x5F, 0x7AB3) /* <CJK> */
+MAP(0x51, 0x60, 0x7AB5) /* <CJK> */
+MAP(0x51, 0x61, 0x7AB9) /* <CJK> */
+MAP(0x51, 0x62, 0x7ABB) /* <CJK> */
+MAP(0x51, 0x63, 0x7ABC) /* <CJK> */
+MAP(0x51, 0x64, 0x7AC6) /* <CJK> */
+MAP(0x51, 0x65, 0x7AC9) /* <CJK> */
+MAP(0x51, 0x66, 0x7ACC) /* <CJK> */
+MAP(0x51, 0x67, 0x7ACE) /* <CJK> */
+MAP(0x51, 0x68, 0x7AD1) /* <CJK> */
+MAP(0x51, 0x69, 0x7ADB) /* <CJK> */
+MAP(0x51, 0x6A, 0x7AE8) /* <CJK> */
+MAP(0x51, 0x6B, 0x7AE9) /* <CJK> */
+MAP(0x51, 0x6C, 0x7AEB) /* <CJK> */
+MAP(0x51, 0x6D, 0x7AEC) /* <CJK> */
+MAP(0x51, 0x6E, 0x7AF1) /* <CJK> */
+MAP(0x51, 0x6F, 0x7AF4) /* <CJK> */
+MAP(0x51, 0x70, 0x7AFB) /* <CJK> */
+MAP(0x51, 0x71, 0x7AFD) /* <CJK> */
+MAP(0x51, 0x72, 0x7AFE) /* <CJK> */
+MAP(0x51, 0x73, 0x7B07) /* <CJK> */
+MAP(0x51, 0x74, 0x7B14) /* <CJK> */
+MAP(0x51, 0x75, 0x7B1F) /* <CJK> */
+MAP(0x51, 0x76, 0x7B23) /* <CJK> */
+MAP(0x51, 0x77, 0x7B27) /* <CJK> */
+MAP(0x51, 0x78, 0x7B29) /* <CJK> */
+MAP(0x51, 0x79, 0x7B2A) /* <CJK> */
+MAP(0x51, 0x7A, 0x7B2B) /* <CJK> */
+MAP(0x51, 0x7B, 0x7B2D) /* <CJK> */
+MAP(0x51, 0x7C, 0x7B2E) /* <CJK> */
+MAP(0x51, 0x7D, 0x7B2F) /* <CJK> */
+MAP(0x51, 0x7E, 0x7B30) /* <CJK> */
+MAP(0x52, 0x21, 0x7B31) /* <CJK> */
+MAP(0x52, 0x22, 0x7B34) /* <CJK> */
+MAP(0x52, 0x23, 0x7B3D) /* <CJK> */
+MAP(0x52, 0x24, 0x7B3F) /* <CJK> */
+MAP(0x52, 0x25, 0x7B40) /* <CJK> */
+MAP(0x52, 0x26, 0x7B41) /* <CJK> */
+MAP(0x52, 0x27, 0x7B47) /* <CJK> */
+MAP(0x52, 0x28, 0x7B4E) /* <CJK> */
+MAP(0x52, 0x29, 0x7B55) /* <CJK> */
+MAP(0x52, 0x2A, 0x7B60) /* <CJK> */
+MAP(0x52, 0x2B, 0x7B64) /* <CJK> */
+MAP(0x52, 0x2C, 0x7B66) /* <CJK> */
+MAP(0x52, 0x2D, 0x7B69) /* <CJK> */
+MAP(0x52, 0x2E, 0x7B6A) /* <CJK> */
+MAP(0x52, 0x2F, 0x7B6D) /* <CJK> */
+MAP(0x52, 0x30, 0x7B6F) /* <CJK> */
+MAP(0x52, 0x31, 0x7B72) /* <CJK> */
+MAP(0x52, 0x32, 0x7B73) /* <CJK> */
+MAP(0x52, 0x33, 0x7B77) /* <CJK> */
+MAP(0x52, 0x34, 0x7B84) /* <CJK> */
+MAP(0x52, 0x35, 0x7B89) /* <CJK> */
+MAP(0x52, 0x36, 0x7B8E) /* <CJK> */
+MAP(0x52, 0x37, 0x7B90) /* <CJK> */
+MAP(0x52, 0x38, 0x7B91) /* <CJK> */
+MAP(0x52, 0x39, 0x7B96) /* <CJK> */
+MAP(0x52, 0x3A, 0x7B9B) /* <CJK> */
+MAP(0x52, 0x3B, 0x7B9E) /* <CJK> */
+MAP(0x52, 0x3C, 0x7BA0) /* <CJK> */
+MAP(0x52, 0x3D, 0x7BA5) /* <CJK> */
+MAP(0x52, 0x3E, 0x7BAC) /* <CJK> */
+MAP(0x52, 0x3F, 0x7BAF) /* <CJK> */
+MAP(0x52, 0x40, 0x7BB0) /* <CJK> */
+MAP(0x52, 0x41, 0x7BB2) /* <CJK> */
+MAP(0x52, 0x42, 0x7BB5) /* <CJK> */
+MAP(0x52, 0x43, 0x7BB6) /* <CJK> */
+MAP(0x52, 0x44, 0x7BBA) /* <CJK> */
+MAP(0x52, 0x45, 0x7BBB) /* <CJK> */
+MAP(0x52, 0x46, 0x7BBC) /* <CJK> */
+MAP(0x52, 0x47, 0x7BBD) /* <CJK> */
+MAP(0x52, 0x48, 0x7BC2) /* <CJK> */
+MAP(0x52, 0x49, 0x7BC5) /* <CJK> */
+MAP(0x52, 0x4A, 0x7BC8) /* <CJK> */
+MAP(0x52, 0x4B, 0x7BCA) /* <CJK> */
+MAP(0x52, 0x4C, 0x7BD4) /* <CJK> */
+MAP(0x52, 0x4D, 0x7BD6) /* <CJK> */
+MAP(0x52, 0x4E, 0x7BD7) /* <CJK> */
+MAP(0x52, 0x4F, 0x7BD9) /* <CJK> */
+MAP(0x52, 0x50, 0x7BDA) /* <CJK> */
+MAP(0x52, 0x51, 0x7BDB) /* <CJK> */
+MAP(0x52, 0x52, 0x7BE8) /* <CJK> */
+MAP(0x52, 0x53, 0x7BEA) /* <CJK> */
+MAP(0x52, 0x54, 0x7BF2) /* <CJK> */
+MAP(0x52, 0x55, 0x7BF4) /* <CJK> */
+MAP(0x52, 0x56, 0x7BF5) /* <CJK> */
+MAP(0x52, 0x57, 0x7BF8) /* <CJK> */
+MAP(0x52, 0x58, 0x7BF9) /* <CJK> */
+MAP(0x52, 0x59, 0x7BFA) /* <CJK> */
+MAP(0x52, 0x5A, 0x7BFC) /* <CJK> */
+MAP(0x52, 0x5B, 0x7BFE) /* <CJK> */
+MAP(0x52, 0x5C, 0x7C01) /* <CJK> */
+MAP(0x52, 0x5D, 0x7C02) /* <CJK> */
+MAP(0x52, 0x5E, 0x7C03) /* <CJK> */
+MAP(0x52, 0x5F, 0x7C04) /* <CJK> */
+MAP(0x52, 0x60, 0x7C06) /* <CJK> */
+MAP(0x52, 0x61, 0x7C09) /* <CJK> */
+MAP(0x52, 0x62, 0x7C0B) /* <CJK> */
+MAP(0x52, 0x63, 0x7C0C) /* <CJK> */
+MAP(0x52, 0x64, 0x7C0E) /* <CJK> */
+MAP(0x52, 0x65, 0x7C0F) /* <CJK> */
+MAP(0x52, 0x66, 0x7C19) /* <CJK> */
+MAP(0x52, 0x67, 0x7C1B) /* <CJK> */
+MAP(0x52, 0x68, 0x7C20) /* <CJK> */
+MAP(0x52, 0x69, 0x7C25) /* <CJK> */
+MAP(0x52, 0x6A, 0x7C26) /* <CJK> */
+MAP(0x52, 0x6B, 0x7C28) /* <CJK> */
+MAP(0x52, 0x6C, 0x7C2C) /* <CJK> */
+MAP(0x52, 0x6D, 0x7C31) /* <CJK> */
+MAP(0x52, 0x6E, 0x7C33) /* <CJK> */
+MAP(0x52, 0x6F, 0x7C34) /* <CJK> */
+MAP(0x52, 0x70, 0x7C36) /* <CJK> */
+MAP(0x52, 0x71, 0x7C39) /* <CJK> */
+MAP(0x52, 0x72, 0x7C3A) /* <CJK> */
+MAP(0x52, 0x73, 0x7C46) /* <CJK> */
+MAP(0x52, 0x74, 0x7C4A) /* <CJK> */
+MAP(0x52, 0x75, 0x7C55) /* <CJK> */
+MAP(0x52, 0x76, 0x7C51) /* <CJK> */
+MAP(0x52, 0x77, 0x7C52) /* <CJK> */
+MAP(0x52, 0x78, 0x7C53) /* <CJK> */
+MAP(0x52, 0x79, 0x7C59) /* <CJK> */
+MAP(0x52, 0x7A, 0x7C5A) /* <CJK> */
+MAP(0x52, 0x7B, 0x7C5B) /* <CJK> */
+MAP(0x52, 0x7C, 0x7C5C) /* <CJK> */
+MAP(0x52, 0x7D, 0x7C5D) /* <CJK> */
+MAP(0x52, 0x7E, 0x7C5E) /* <CJK> */
+MAP(0x53, 0x21, 0x7C61) /* <CJK> */
+MAP(0x53, 0x22, 0x7C63) /* <CJK> */
+MAP(0x53, 0x23, 0x7C67) /* <CJK> */
+MAP(0x53, 0x24, 0x7C69) /* <CJK> */
+MAP(0x53, 0x25, 0x7C6D) /* <CJK> */
+MAP(0x53, 0x26, 0x7C6E) /* <CJK> */
+MAP(0x53, 0x27, 0x7C70) /* <CJK> */
+MAP(0x53, 0x28, 0x7C72) /* <CJK> */
+MAP(0x53, 0x29, 0x7C79) /* <CJK> */
+MAP(0x53, 0x2A, 0x7C7C) /* <CJK> */
+MAP(0x53, 0x2B, 0x7C7D) /* <CJK> */
+MAP(0x53, 0x2C, 0x7C86) /* <CJK> */
+MAP(0x53, 0x2D, 0x7C87) /* <CJK> */
+MAP(0x53, 0x2E, 0x7C8F) /* <CJK> */
+MAP(0x53, 0x2F, 0x7C94) /* <CJK> */
+MAP(0x53, 0x30, 0x7C9E) /* <CJK> */
+MAP(0x53, 0x31, 0x7CA0) /* <CJK> */
+MAP(0x53, 0x32, 0x7CA6) /* <CJK> */
+MAP(0x53, 0x33, 0x7CB0) /* <CJK> */
+MAP(0x53, 0x34, 0x7CB6) /* <CJK> */
+MAP(0x53, 0x35, 0x7CB7) /* <CJK> */
+MAP(0x53, 0x36, 0x7CBA) /* <CJK> */
+MAP(0x53, 0x37, 0x7CBB) /* <CJK> */
+MAP(0x53, 0x38, 0x7CBC) /* <CJK> */
+MAP(0x53, 0x39, 0x7CBF) /* <CJK> */
+MAP(0x53, 0x3A, 0x7CC4) /* <CJK> */
+MAP(0x53, 0x3B, 0x7CC7) /* <CJK> */
+MAP(0x53, 0x3C, 0x7CC8) /* <CJK> */
+MAP(0x53, 0x3D, 0x7CC9) /* <CJK> */
+MAP(0x53, 0x3E, 0x7CCD) /* <CJK> */
+MAP(0x53, 0x3F, 0x7CCF) /* <CJK> */
+MAP(0x53, 0x40, 0x7CD3) /* <CJK> */
+MAP(0x53, 0x41, 0x7CD4) /* <CJK> */
+MAP(0x53, 0x42, 0x7CD5) /* <CJK> */
+MAP(0x53, 0x43, 0x7CD7) /* <CJK> */
+MAP(0x53, 0x44, 0x7CD9) /* <CJK> */
+MAP(0x53, 0x45, 0x7CDA) /* <CJK> */
+MAP(0x53, 0x46, 0x7CDD) /* <CJK> */
+MAP(0x53, 0x47, 0x7CE6) /* <CJK> */
+MAP(0x53, 0x48, 0x7CE9) /* <CJK> */
+MAP(0x53, 0x49, 0x7CEB) /* <CJK> */
+MAP(0x53, 0x4A, 0x7CF5) /* <CJK> */
+MAP(0x53, 0x4B, 0x7D03) /* <CJK> */
+MAP(0x53, 0x4C, 0x7D07) /* <CJK> */
+MAP(0x53, 0x4D, 0x7D08) /* <CJK> */
+MAP(0x53, 0x4E, 0x7D09) /* <CJK> */
+MAP(0x53, 0x4F, 0x7D0F) /* <CJK> */
+MAP(0x53, 0x50, 0x7D11) /* <CJK> */
+MAP(0x53, 0x51, 0x7D12) /* <CJK> */
+MAP(0x53, 0x52, 0x7D13) /* <CJK> */
+MAP(0x53, 0x53, 0x7D16) /* <CJK> */
+MAP(0x53, 0x54, 0x7D1D) /* <CJK> */
+MAP(0x53, 0x55, 0x7D1E) /* <CJK> */
+MAP(0x53, 0x56, 0x7D23) /* <CJK> */
+MAP(0x53, 0x57, 0x7D26) /* <CJK> */
+MAP(0x53, 0x58, 0x7D2A) /* <CJK> */
+MAP(0x53, 0x59, 0x7D2D) /* <CJK> */
+MAP(0x53, 0x5A, 0x7D31) /* <CJK> */
+MAP(0x53, 0x5B, 0x7D3C) /* <CJK> */
+MAP(0x53, 0x5C, 0x7D3D) /* <CJK> */
+MAP(0x53, 0x5D, 0x7D3E) /* <CJK> */
+MAP(0x53, 0x5E, 0x7D40) /* <CJK> */
+MAP(0x53, 0x5F, 0x7D41) /* <CJK> */
+MAP(0x53, 0x60, 0x7D47) /* <CJK> */
+MAP(0x53, 0x61, 0x7D48) /* <CJK> */
+MAP(0x53, 0x62, 0x7D4D) /* <CJK> */
+MAP(0x53, 0x63, 0x7D51) /* <CJK> */
+MAP(0x53, 0x64, 0x7D53) /* <CJK> */
+MAP(0x53, 0x65, 0x7D57) /* <CJK> */
+MAP(0x53, 0x66, 0x7D59) /* <CJK> */
+MAP(0x53, 0x67, 0x7D5A) /* <CJK> */
+MAP(0x53, 0x68, 0x7D5C) /* <CJK> */
+MAP(0x53, 0x69, 0x7D5D) /* <CJK> */
+MAP(0x53, 0x6A, 0x7D65) /* <CJK> */
+MAP(0x53, 0x6B, 0x7D67) /* <CJK> */
+MAP(0x53, 0x6C, 0x7D6A) /* <CJK> */
+MAP(0x53, 0x6D, 0x7D70) /* <CJK> */
+MAP(0x53, 0x6E, 0x7D78) /* <CJK> */
+MAP(0x53, 0x6F, 0x7D7A) /* <CJK> */
+MAP(0x53, 0x70, 0x7D7B) /* <CJK> */
+MAP(0x53, 0x71, 0x7D7F) /* <CJK> */
+MAP(0x53, 0x72, 0x7D81) /* <CJK> */
+MAP(0x53, 0x73, 0x7D82) /* <CJK> */
+MAP(0x53, 0x74, 0x7D83) /* <CJK> */
+MAP(0x53, 0x75, 0x7D85) /* <CJK> */
+MAP(0x53, 0x76, 0x7D86) /* <CJK> */
+MAP(0x53, 0x77, 0x7D88) /* <CJK> */
+MAP(0x53, 0x78, 0x7D8B) /* <CJK> */
+MAP(0x53, 0x79, 0x7D8C) /* <CJK> */
+MAP(0x53, 0x7A, 0x7D8D) /* <CJK> */
+MAP(0x53, 0x7B, 0x7D91) /* <CJK> */
+MAP(0x53, 0x7C, 0x7D96) /* <CJK> */
+MAP(0x53, 0x7D, 0x7D97) /* <CJK> */
+MAP(0x53, 0x7E, 0x7D9D) /* <CJK> */
+MAP(0x54, 0x21, 0x7D9E) /* <CJK> */
+MAP(0x54, 0x22, 0x7DA6) /* <CJK> */
+MAP(0x54, 0x23, 0x7DA7) /* <CJK> */
+MAP(0x54, 0x24, 0x7DAA) /* <CJK> */
+MAP(0x54, 0x25, 0x7DB3) /* <CJK> */
+MAP(0x54, 0x26, 0x7DB6) /* <CJK> */
+MAP(0x54, 0x27, 0x7DB7) /* <CJK> */
+MAP(0x54, 0x28, 0x7DB9) /* <CJK> */
+MAP(0x54, 0x29, 0x7DC2) /* <CJK> */
+MAP(0x54, 0x2A, 0x7DC3) /* <CJK> */
+MAP(0x54, 0x2B, 0x7DC4) /* <CJK> */
+MAP(0x54, 0x2C, 0x7DC5) /* <CJK> */
+MAP(0x54, 0x2D, 0x7DC6) /* <CJK> */
+MAP(0x54, 0x2E, 0x7DCC) /* <CJK> */
+MAP(0x54, 0x2F, 0x7DCD) /* <CJK> */
+MAP(0x54, 0x30, 0x7DCE) /* <CJK> */
+MAP(0x54, 0x31, 0x7DD7) /* <CJK> */
+MAP(0x54, 0x32, 0x7DD9) /* <CJK> */
+MAP(0x54, 0x33, 0x7E00) /* <CJK> */
+MAP(0x54, 0x34, 0x7DE2) /* <CJK> */
+MAP(0x54, 0x35, 0x7DE5) /* <CJK> */
+MAP(0x54, 0x36, 0x7DE6) /* <CJK> */
+MAP(0x54, 0x37, 0x7DEA) /* <CJK> */
+MAP(0x54, 0x38, 0x7DEB) /* <CJK> */
+MAP(0x54, 0x39, 0x7DED) /* <CJK> */
+MAP(0x54, 0x3A, 0x7DF1) /* <CJK> */
+MAP(0x54, 0x3B, 0x7DF5) /* <CJK> */
+MAP(0x54, 0x3C, 0x7DF6) /* <CJK> */
+MAP(0x54, 0x3D, 0x7DF9) /* <CJK> */
+MAP(0x54, 0x3E, 0x7DFA) /* <CJK> */
+MAP(0x54, 0x3F, 0x7E08) /* <CJK> */
+MAP(0x54, 0x40, 0x7E10) /* <CJK> */
+MAP(0x54, 0x41, 0x7E11) /* <CJK> */
+MAP(0x54, 0x42, 0x7E15) /* <CJK> */
+MAP(0x54, 0x43, 0x7E17) /* <CJK> */
+MAP(0x54, 0x44, 0x7E1C) /* <CJK> */
+MAP(0x54, 0x45, 0x7E1D) /* <CJK> */
+MAP(0x54, 0x46, 0x7E20) /* <CJK> */
+MAP(0x54, 0x47, 0x7E27) /* <CJK> */
+MAP(0x54, 0x48, 0x7E28) /* <CJK> */
+MAP(0x54, 0x49, 0x7E2C) /* <CJK> */
+MAP(0x54, 0x4A, 0x7E2D) /* <CJK> */
+MAP(0x54, 0x4B, 0x7E2F) /* <CJK> */
+MAP(0x54, 0x4C, 0x7E33) /* <CJK> */
+MAP(0x54, 0x4D, 0x7E36) /* <CJK> */
+MAP(0x54, 0x4E, 0x7E3F) /* <CJK> */
+MAP(0x54, 0x4F, 0x7E44) /* <CJK> */
+MAP(0x54, 0x50, 0x7E45) /* <CJK> */
+MAP(0x54, 0x51, 0x7E47) /* <CJK> */
+MAP(0x54, 0x52, 0x7E4E) /* <CJK> */
+MAP(0x54, 0x53, 0x7E50) /* <CJK> */
+MAP(0x54, 0x54, 0x7E52) /* <CJK> */
+MAP(0x54, 0x55, 0x7E58) /* <CJK> */
+MAP(0x54, 0x56, 0x7E5F) /* <CJK> */
+MAP(0x54, 0x57, 0x7E61) /* <CJK> */
+MAP(0x54, 0x58, 0x7E62) /* <CJK> */
+MAP(0x54, 0x59, 0x7E65) /* <CJK> */
+MAP(0x54, 0x5A, 0x7E6B) /* <CJK> */
+MAP(0x54, 0x5B, 0x7E6E) /* <CJK> */
+MAP(0x54, 0x5C, 0x7E6F) /* <CJK> */
+MAP(0x54, 0x5D, 0x7E73) /* <CJK> */
+MAP(0x54, 0x5E, 0x7E78) /* <CJK> */
+MAP(0x54, 0x5F, 0x7E7E) /* <CJK> */
+MAP(0x54, 0x60, 0x7E81) /* <CJK> */
+MAP(0x54, 0x61, 0x7E86) /* <CJK> */
+MAP(0x54, 0x62, 0x7E87) /* <CJK> */
+MAP(0x54, 0x63, 0x7E8A) /* <CJK> */
+MAP(0x54, 0x64, 0x7E8D) /* <CJK> */
+MAP(0x54, 0x65, 0x7E91) /* <CJK> */
+MAP(0x54, 0x66, 0x7E95) /* <CJK> */
+MAP(0x54, 0x67, 0x7E98) /* <CJK> */
+MAP(0x54, 0x68, 0x7E9A) /* <CJK> */
+MAP(0x54, 0x69, 0x7E9D) /* <CJK> */
+MAP(0x54, 0x6A, 0x7E9E) /* <CJK> */
+MAP(0x54, 0x6B, 0x7F3C) /* <CJK> */
+MAP(0x54, 0x6C, 0x7F3B) /* <CJK> */
+MAP(0x54, 0x6D, 0x7F3D) /* <CJK> */
+MAP(0x54, 0x6E, 0x7F3E) /* <CJK> */
+MAP(0x54, 0x6F, 0x7F3F) /* <CJK> */
+MAP(0x54, 0x70, 0x7F43) /* <CJK> */
+MAP(0x54, 0x71, 0x7F44) /* <CJK> */
+MAP(0x54, 0x72, 0x7F47) /* <CJK> */
+MAP(0x54, 0x73, 0x7F4F) /* <CJK> */
+MAP(0x54, 0x74, 0x7F52) /* <CJK> */
+MAP(0x54, 0x75, 0x7F53) /* <CJK> */
+MAP(0x54, 0x76, 0x7F5B) /* <CJK> */
+MAP(0x54, 0x77, 0x7F5C) /* <CJK> */
+MAP(0x54, 0x78, 0x7F5D) /* <CJK> */
+MAP(0x54, 0x79, 0x7F61) /* <CJK> */
+MAP(0x54, 0x7A, 0x7F63) /* <CJK> */
+MAP(0x54, 0x7B, 0x7F64) /* <CJK> */
+MAP(0x54, 0x7C, 0x7F65) /* <CJK> */
+MAP(0x54, 0x7D, 0x7F66) /* <CJK> */
+MAP(0x54, 0x7E, 0x7F6D) /* <CJK> */
+MAP(0x55, 0x21, 0x7F71) /* <CJK> */
+MAP(0x55, 0x22, 0x7F7D) /* <CJK> */
+MAP(0x55, 0x23, 0x7F7E) /* <CJK> */
+MAP(0x55, 0x24, 0x7F7F) /* <CJK> */
+MAP(0x55, 0x25, 0x7F80) /* <CJK> */
+MAP(0x55, 0x26, 0x7F8B) /* <CJK> */
+MAP(0x55, 0x27, 0x7F8D) /* <CJK> */
+MAP(0x55, 0x28, 0x7F8F) /* <CJK> */
+MAP(0x55, 0x29, 0x7F90) /* <CJK> */
+MAP(0x55, 0x2A, 0x7F91) /* <CJK> */
+MAP(0x55, 0x2B, 0x7F96) /* <CJK> */
+MAP(0x55, 0x2C, 0x7F97) /* <CJK> */
+MAP(0x55, 0x2D, 0x7F9C) /* <CJK> */
+MAP(0x55, 0x2E, 0x7FA1) /* <CJK> */
+MAP(0x55, 0x2F, 0x7FA2) /* <CJK> */
+MAP(0x55, 0x30, 0x7FA6) /* <CJK> */
+MAP(0x55, 0x31, 0x7FAA) /* <CJK> */
+MAP(0x55, 0x32, 0x7FAD) /* <CJK> */
+MAP(0x55, 0x33, 0x7FB4) /* <CJK> */
+MAP(0x55, 0x34, 0x7FBC) /* <CJK> */
+MAP(0x55, 0x35, 0x7FBF) /* <CJK> */
+MAP(0x55, 0x36, 0x7FC0) /* <CJK> */
+MAP(0x55, 0x37, 0x7FC3) /* <CJK> */
+MAP(0x55, 0x38, 0x7FC8) /* <CJK> */
+MAP(0x55, 0x39, 0x7FCE) /* <CJK> */
+MAP(0x55, 0x3A, 0x7FCF) /* <CJK> */
+MAP(0x55, 0x3B, 0x7FDB) /* <CJK> */
+MAP(0x55, 0x3C, 0x7FDF) /* <CJK> */
+MAP(0x55, 0x3D, 0x7FE3) /* <CJK> */
+MAP(0x55, 0x3E, 0x7FE5) /* <CJK> */
+MAP(0x55, 0x3F, 0x7FE8) /* <CJK> */
+MAP(0x55, 0x40, 0x7FEC) /* <CJK> */
+MAP(0x55, 0x41, 0x7FEE) /* <CJK> */
+MAP(0x55, 0x42, 0x7FEF) /* <CJK> */
+MAP(0x55, 0x43, 0x7FF2) /* <CJK> */
+MAP(0x55, 0x44, 0x7FFA) /* <CJK> */
+MAP(0x55, 0x45, 0x7FFD) /* <CJK> */
+MAP(0x55, 0x46, 0x7FFE) /* <CJK> */
+MAP(0x55, 0x47, 0x7FFF) /* <CJK> */
+MAP(0x55, 0x48, 0x8007) /* <CJK> */
+MAP(0x55, 0x49, 0x8008) /* <CJK> */
+MAP(0x55, 0x4A, 0x800A) /* <CJK> */
+MAP(0x55, 0x4B, 0x800D) /* <CJK> */
+MAP(0x55, 0x4C, 0x800E) /* <CJK> */
+MAP(0x55, 0x4D, 0x800F) /* <CJK> */
+MAP(0x55, 0x4E, 0x8011) /* <CJK> */
+MAP(0x55, 0x4F, 0x8013) /* <CJK> */
+MAP(0x55, 0x50, 0x8014) /* <CJK> */
+MAP(0x55, 0x51, 0x8016) /* <CJK> */
+MAP(0x55, 0x52, 0x801D) /* <CJK> */
+MAP(0x55, 0x53, 0x801E) /* <CJK> */
+MAP(0x55, 0x54, 0x801F) /* <CJK> */
+MAP(0x55, 0x55, 0x8020) /* <CJK> */
+MAP(0x55, 0x56, 0x8024) /* <CJK> */
+MAP(0x55, 0x57, 0x8026) /* <CJK> */
+MAP(0x55, 0x58, 0x802C) /* <CJK> */
+MAP(0x55, 0x59, 0x802E) /* <CJK> */
+MAP(0x55, 0x5A, 0x8030) /* <CJK> */
+MAP(0x55, 0x5B, 0x8034) /* <CJK> */
+MAP(0x55, 0x5C, 0x8035) /* <CJK> */
+MAP(0x55, 0x5D, 0x8037) /* <CJK> */
+MAP(0x55, 0x5E, 0x8039) /* <CJK> */
+MAP(0x55, 0x5F, 0x803A) /* <CJK> */
+MAP(0x55, 0x60, 0x803C) /* <CJK> */
+MAP(0x55, 0x61, 0x803E) /* <CJK> */
+MAP(0x55, 0x62, 0x8040) /* <CJK> */
+MAP(0x55, 0x63, 0x8044) /* <CJK> */
+MAP(0x55, 0x64, 0x8060) /* <CJK> */
+MAP(0x55, 0x65, 0x8064) /* <CJK> */
+MAP(0x55, 0x66, 0x8066) /* <CJK> */
+MAP(0x55, 0x67, 0x806D) /* <CJK> */
+MAP(0x55, 0x68, 0x8071) /* <CJK> */
+MAP(0x55, 0x69, 0x8075) /* <CJK> */
+MAP(0x55, 0x6A, 0x8081) /* <CJK> */
+MAP(0x55, 0x6B, 0x8088) /* <CJK> */
+MAP(0x55, 0x6C, 0x808E) /* <CJK> */
+MAP(0x55, 0x6D, 0x809C) /* <CJK> */
+MAP(0x55, 0x6E, 0x809E) /* <CJK> */
+MAP(0x55, 0x6F, 0x80A6) /* <CJK> */
+MAP(0x55, 0x70, 0x80A7) /* <CJK> */
+MAP(0x55, 0x71, 0x80AB) /* <CJK> */
+MAP(0x55, 0x72, 0x80B8) /* <CJK> */
+MAP(0x55, 0x73, 0x80B9) /* <CJK> */
+MAP(0x55, 0x74, 0x80C8) /* <CJK> */
+MAP(0x55, 0x75, 0x80CD) /* <CJK> */
+MAP(0x55, 0x76, 0x80CF) /* <CJK> */
+MAP(0x55, 0x77, 0x80D2) /* <CJK> */
+MAP(0x55, 0x78, 0x80D4) /* <CJK> */
+MAP(0x55, 0x79, 0x80D5) /* <CJK> */
+MAP(0x55, 0x7A, 0x80D7) /* <CJK> */
+MAP(0x55, 0x7B, 0x80D8) /* <CJK> */
+MAP(0x55, 0x7C, 0x80E0) /* <CJK> */
+MAP(0x55, 0x7D, 0x80ED) /* <CJK> */
+MAP(0x55, 0x7E, 0x80EE) /* <CJK> */
+MAP(0x56, 0x21, 0x80F0) /* <CJK> */
+MAP(0x56, 0x22, 0x80F2) /* <CJK> */
+MAP(0x56, 0x23, 0x80F3) /* <CJK> */
+MAP(0x56, 0x24, 0x80F6) /* <CJK> */
+MAP(0x56, 0x25, 0x80F9) /* <CJK> */
+MAP(0x56, 0x26, 0x80FA) /* <CJK> */
+MAP(0x56, 0x27, 0x80FE) /* <CJK> */
+MAP(0x56, 0x28, 0x8103) /* <CJK> */
+MAP(0x56, 0x29, 0x810B) /* <CJK> */
+MAP(0x56, 0x2A, 0x8116) /* <CJK> */
+MAP(0x56, 0x2B, 0x8117) /* <CJK> */
+MAP(0x56, 0x2C, 0x8118) /* <CJK> */
+MAP(0x56, 0x2D, 0x811C) /* <CJK> */
+MAP(0x56, 0x2E, 0x811E) /* <CJK> */
+MAP(0x56, 0x2F, 0x8120) /* <CJK> */
+MAP(0x56, 0x30, 0x8124) /* <CJK> */
+MAP(0x56, 0x31, 0x8127) /* <CJK> */
+MAP(0x56, 0x32, 0x812C) /* <CJK> */
+MAP(0x56, 0x33, 0x8130) /* <CJK> */
+MAP(0x56, 0x34, 0x8135) /* <CJK> */
+MAP(0x56, 0x35, 0x813A) /* <CJK> */
+MAP(0x56, 0x36, 0x813C) /* <CJK> */
+MAP(0x56, 0x37, 0x8145) /* <CJK> */
+MAP(0x56, 0x38, 0x8147) /* <CJK> */
+MAP(0x56, 0x39, 0x814A) /* <CJK> */
+MAP(0x56, 0x3A, 0x814C) /* <CJK> */
+MAP(0x56, 0x3B, 0x8152) /* <CJK> */
+MAP(0x56, 0x3C, 0x8157) /* <CJK> */
+MAP(0x56, 0x3D, 0x8160) /* <CJK> */
+MAP(0x56, 0x3E, 0x8161) /* <CJK> */
+MAP(0x56, 0x3F, 0x8167) /* <CJK> */
+MAP(0x56, 0x40, 0x8168) /* <CJK> */
+MAP(0x56, 0x41, 0x8169) /* <CJK> */
+MAP(0x56, 0x42, 0x816D) /* <CJK> */
+MAP(0x56, 0x43, 0x816F) /* <CJK> */
+MAP(0x56, 0x44, 0x8177) /* <CJK> */
+MAP(0x56, 0x45, 0x8181) /* <CJK> */
+MAP(0x56, 0x46, 0x8190) /* <CJK> */
+MAP(0x56, 0x47, 0x8184) /* <CJK> */
+MAP(0x56, 0x48, 0x8185) /* <CJK> */
+MAP(0x56, 0x49, 0x8186) /* <CJK> */
+MAP(0x56, 0x4A, 0x818B) /* <CJK> */
+MAP(0x56, 0x4B, 0x818E) /* <CJK> */
+MAP(0x56, 0x4C, 0x8196) /* <CJK> */
+MAP(0x56, 0x4D, 0x8198) /* <CJK> */
+MAP(0x56, 0x4E, 0x819B) /* <CJK> */
+MAP(0x56, 0x4F, 0x819E) /* <CJK> */
+MAP(0x56, 0x50, 0x81A2) /* <CJK> */
+MAP(0x56, 0x51, 0x81AE) /* <CJK> */
+MAP(0x56, 0x52, 0x81B2) /* <CJK> */
+MAP(0x56, 0x53, 0x81B4) /* <CJK> */
+MAP(0x56, 0x54, 0x81BB) /* <CJK> */
+MAP(0x56, 0x55, 0x81CB) /* <CJK> */
+MAP(0x56, 0x56, 0x81C3) /* <CJK> */
+MAP(0x56, 0x57, 0x81C5) /* <CJK> */
+MAP(0x56, 0x58, 0x81CA) /* <CJK> */
+MAP(0x56, 0x59, 0x81CE) /* <CJK> */
+MAP(0x56, 0x5A, 0x81CF) /* <CJK> */
+MAP(0x56, 0x5B, 0x81D5) /* <CJK> */
+MAP(0x56, 0x5C, 0x81D7) /* <CJK> */
+MAP(0x56, 0x5D, 0x81DB) /* <CJK> */
+MAP(0x56, 0x5E, 0x81DD) /* <CJK> */
+MAP(0x56, 0x5F, 0x81DE) /* <CJK> */
+MAP(0x56, 0x60, 0x81E1) /* <CJK> */
+MAP(0x56, 0x61, 0x81E4) /* <CJK> */
+MAP(0x56, 0x62, 0x81EB) /* <CJK> */
+MAP(0x56, 0x63, 0x81EC) /* <CJK> */
+MAP(0x56, 0x64, 0x81F0) /* <CJK> */
+MAP(0x56, 0x65, 0x81F1) /* <CJK> */
+MAP(0x56, 0x66, 0x81F2) /* <CJK> */
+MAP(0x56, 0x67, 0x81F5) /* <CJK> */
+MAP(0x56, 0x68, 0x81F6) /* <CJK> */
+MAP(0x56, 0x69, 0x81F8) /* <CJK> */
+MAP(0x56, 0x6A, 0x81F9) /* <CJK> */
+MAP(0x56, 0x6B, 0x81FD) /* <CJK> */
+MAP(0x56, 0x6C, 0x81FF) /* <CJK> */
+MAP(0x56, 0x6D, 0x8200) /* <CJK> */
+MAP(0x56, 0x6E, 0x8203) /* <CJK> */
+MAP(0x56, 0x6F, 0x820F) /* <CJK> */
+MAP(0x56, 0x70, 0x8213) /* <CJK> */
+MAP(0x56, 0x71, 0x8214) /* <CJK> */
+MAP(0x56, 0x72, 0x8219) /* <CJK> */
+MAP(0x56, 0x73, 0x821A) /* <CJK> */
+MAP(0x56, 0x74, 0x821D) /* <CJK> */
+MAP(0x56, 0x75, 0x8221) /* <CJK> */
+MAP(0x56, 0x76, 0x8222) /* <CJK> */
+MAP(0x56, 0x77, 0x8228) /* <CJK> */
+MAP(0x56, 0x78, 0x8232) /* <CJK> */
+MAP(0x56, 0x79, 0x8234) /* <CJK> */
+MAP(0x56, 0x7A, 0x823A) /* <CJK> */
+MAP(0x56, 0x7B, 0x8243) /* <CJK> */
+MAP(0x56, 0x7C, 0x8244) /* <CJK> */
+MAP(0x56, 0x7D, 0x8245) /* <CJK> */
+MAP(0x56, 0x7E, 0x8246) /* <CJK> */
+MAP(0x57, 0x21, 0x824B) /* <CJK> */
+MAP(0x57, 0x22, 0x824E) /* <CJK> */
+MAP(0x57, 0x23, 0x824F) /* <CJK> */
+MAP(0x57, 0x24, 0x8251) /* <CJK> */
+MAP(0x57, 0x25, 0x8256) /* <CJK> */
+MAP(0x57, 0x26, 0x825C) /* <CJK> */
+MAP(0x57, 0x27, 0x8260) /* <CJK> */
+MAP(0x57, 0x28, 0x8263) /* <CJK> */
+MAP(0x57, 0x29, 0x8267) /* <CJK> */
+MAP(0x57, 0x2A, 0x826D) /* <CJK> */
+MAP(0x57, 0x2B, 0x8274) /* <CJK> */
+MAP(0x57, 0x2C, 0x827B) /* <CJK> */
+MAP(0x57, 0x2D, 0x827D) /* <CJK> */
+MAP(0x57, 0x2E, 0x827F) /* <CJK> */
+MAP(0x57, 0x2F, 0x8280) /* <CJK> */
+MAP(0x57, 0x30, 0x8281) /* <CJK> */
+MAP(0x57, 0x31, 0x8283) /* <CJK> */
+MAP(0x57, 0x32, 0x8284) /* <CJK> */
+MAP(0x57, 0x33, 0x8287) /* <CJK> */
+MAP(0x57, 0x34, 0x8289) /* <CJK> */
+MAP(0x57, 0x35, 0x828A) /* <CJK> */
+MAP(0x57, 0x36, 0x828E) /* <CJK> */
+MAP(0x57, 0x37, 0x8291) /* <CJK> */
+MAP(0x57, 0x38, 0x8294) /* <CJK> */
+MAP(0x57, 0x39, 0x8296) /* <CJK> */
+MAP(0x57, 0x3A, 0x8298) /* <CJK> */
+MAP(0x57, 0x3B, 0x829A) /* <CJK> */
+MAP(0x57, 0x3C, 0x829B) /* <CJK> */
+MAP(0x57, 0x3D, 0x82A0) /* <CJK> */
+MAP(0x57, 0x3E, 0x82A1) /* <CJK> */
+MAP(0x57, 0x3F, 0x82A3) /* <CJK> */
+MAP(0x57, 0x40, 0x82A4) /* <CJK> */
+MAP(0x57, 0x41, 0x82A7) /* <CJK> */
+MAP(0x57, 0x42, 0x82A8) /* <CJK> */
+MAP(0x57, 0x43, 0x82A9) /* <CJK> */
+MAP(0x57, 0x44, 0x82AA) /* <CJK> */
+MAP(0x57, 0x45, 0x82AE) /* <CJK> */
+MAP(0x57, 0x46, 0x82B0) /* <CJK> */
+MAP(0x57, 0x47, 0x82B2) /* <CJK> */
+MAP(0x57, 0x48, 0x82B4) /* <CJK> */
+MAP(0x57, 0x49, 0x82B7) /* <CJK> */
+MAP(0x57, 0x4A, 0x82BA) /* <CJK> */
+MAP(0x57, 0x4B, 0x82BC) /* <CJK> */
+MAP(0x57, 0x4C, 0x82BE) /* <CJK> */
+MAP(0x57, 0x4D, 0x82BF) /* <CJK> */
+MAP(0x57, 0x4E, 0x82C6) /* <CJK> */
+MAP(0x57, 0x4F, 0x82D0) /* <CJK> */
+MAP(0x57, 0x50, 0x82D5) /* <CJK> */
+MAP(0x57, 0x51, 0x82DA) /* <CJK> */
+MAP(0x57, 0x52, 0x82E0) /* <CJK> */
+MAP(0x57, 0x53, 0x82E2) /* <CJK> */
+MAP(0x57, 0x54, 0x82E4) /* <CJK> */
+MAP(0x57, 0x55, 0x82E8) /* <CJK> */
+MAP(0x57, 0x56, 0x82EA) /* <CJK> */
+MAP(0x57, 0x57, 0x82ED) /* <CJK> */
+MAP(0x57, 0x58, 0x82EF) /* <CJK> */
+MAP(0x57, 0x59, 0x82F6) /* <CJK> */
+MAP(0x57, 0x5A, 0x82F7) /* <CJK> */
+MAP(0x57, 0x5B, 0x82FD) /* <CJK> */
+MAP(0x57, 0x5C, 0x82FE) /* <CJK> */
+MAP(0x57, 0x5D, 0x8300) /* <CJK> */
+MAP(0x57, 0x5E, 0x8301) /* <CJK> */
+MAP(0x57, 0x5F, 0x8307) /* <CJK> */
+MAP(0x57, 0x60, 0x8308) /* <CJK> */
+MAP(0x57, 0x61, 0x830A) /* <CJK> */
+MAP(0x57, 0x62, 0x830B) /* <CJK> */
+MAP(0x57, 0x63, 0x8354) /* <CJK> */
+MAP(0x57, 0x64, 0x831B) /* <CJK> */
+MAP(0x57, 0x65, 0x831D) /* <CJK> */
+MAP(0x57, 0x66, 0x831E) /* <CJK> */
+MAP(0x57, 0x67, 0x831F) /* <CJK> */
+MAP(0x57, 0x68, 0x8321) /* <CJK> */
+MAP(0x57, 0x69, 0x8322) /* <CJK> */
+MAP(0x57, 0x6A, 0x832C) /* <CJK> */
+MAP(0x57, 0x6B, 0x832D) /* <CJK> */
+MAP(0x57, 0x6C, 0x832E) /* <CJK> */
+MAP(0x57, 0x6D, 0x8330) /* <CJK> */
+MAP(0x57, 0x6E, 0x8333) /* <CJK> */
+MAP(0x57, 0x6F, 0x8337) /* <CJK> */
+MAP(0x57, 0x70, 0x833A) /* <CJK> */
+MAP(0x57, 0x71, 0x833C) /* <CJK> */
+MAP(0x57, 0x72, 0x833D) /* <CJK> */
+MAP(0x57, 0x73, 0x8342) /* <CJK> */
+MAP(0x57, 0x74, 0x8343) /* <CJK> */
+MAP(0x57, 0x75, 0x8344) /* <CJK> */
+MAP(0x57, 0x76, 0x8347) /* <CJK> */
+MAP(0x57, 0x77, 0x834D) /* <CJK> */
+MAP(0x57, 0x78, 0x834E) /* <CJK> */
+MAP(0x57, 0x79, 0x8351) /* <CJK> */
+MAP(0x57, 0x7A, 0x8355) /* <CJK> */
+MAP(0x57, 0x7B, 0x8356) /* <CJK> */
+MAP(0x57, 0x7C, 0x8357) /* <CJK> */
+MAP(0x57, 0x7D, 0x8370) /* <CJK> */
+MAP(0x57, 0x7E, 0x8378) /* <CJK> */
+MAP(0x58, 0x21, 0x837D) /* <CJK> */
+MAP(0x58, 0x22, 0x837F) /* <CJK> */
+MAP(0x58, 0x23, 0x8380) /* <CJK> */
+MAP(0x58, 0x24, 0x8382) /* <CJK> */
+MAP(0x58, 0x25, 0x8384) /* <CJK> */
+MAP(0x58, 0x26, 0x8386) /* <CJK> */
+MAP(0x58, 0x27, 0x838D) /* <CJK> */
+MAP(0x58, 0x28, 0x8392) /* <CJK> */
+MAP(0x58, 0x29, 0x8394) /* <CJK> */
+MAP(0x58, 0x2A, 0x8395) /* <CJK> */
+MAP(0x58, 0x2B, 0x8398) /* <CJK> */
+MAP(0x58, 0x2C, 0x8399) /* <CJK> */
+MAP(0x58, 0x2D, 0x839B) /* <CJK> */
+MAP(0x58, 0x2E, 0x839C) /* <CJK> */
+MAP(0x58, 0x2F, 0x839D) /* <CJK> */
+MAP(0x58, 0x30, 0x83A6) /* <CJK> */
+MAP(0x58, 0x31, 0x83A7) /* <CJK> */
+MAP(0x58, 0x32, 0x83A9) /* <CJK> */
+MAP(0x58, 0x33, 0x83AC) /* <CJK> */
+MAP(0x58, 0x34, 0x83BE) /* <CJK> */
+MAP(0x58, 0x35, 0x83BF) /* <CJK> */
+MAP(0x58, 0x36, 0x83C0) /* <CJK> */
+MAP(0x58, 0x37, 0x83C7) /* <CJK> */
+MAP(0x58, 0x38, 0x83C9) /* <CJK> */
+MAP(0x58, 0x39, 0x83CF) /* <CJK> */
+MAP(0x58, 0x3A, 0x83D0) /* <CJK> */
+MAP(0x58, 0x3B, 0x83D1) /* <CJK> */
+MAP(0x58, 0x3C, 0x83D4) /* <CJK> */
+MAP(0x58, 0x3D, 0x83DD) /* <CJK> */
+MAP(0x58, 0x3E, 0x8353) /* <CJK> */
+MAP(0x58, 0x3F, 0x83E8) /* <CJK> */
+MAP(0x58, 0x40, 0x83EA) /* <CJK> */
+MAP(0x58, 0x41, 0x83F6) /* <CJK> */
+MAP(0x58, 0x42, 0x83F8) /* <CJK> */
+MAP(0x58, 0x43, 0x83F9) /* <CJK> */
+MAP(0x58, 0x44, 0x83FC) /* <CJK> */
+MAP(0x58, 0x45, 0x8401) /* <CJK> */
+MAP(0x58, 0x46, 0x8406) /* <CJK> */
+MAP(0x58, 0x47, 0x840A) /* <CJK> */
+MAP(0x58, 0x48, 0x840F) /* <CJK> */
+MAP(0x58, 0x49, 0x8411) /* <CJK> */
+MAP(0x58, 0x4A, 0x8415) /* <CJK> */
+MAP(0x58, 0x4B, 0x8419) /* <CJK> */
+MAP(0x58, 0x4C, 0x83AD) /* <CJK> */
+MAP(0x58, 0x4D, 0x842F) /* <CJK> */
+MAP(0x58, 0x4E, 0x8439) /* <CJK> */
+MAP(0x58, 0x4F, 0x8445) /* <CJK> */
+MAP(0x58, 0x50, 0x8447) /* <CJK> */
+MAP(0x58, 0x51, 0x8448) /* <CJK> */
+MAP(0x58, 0x52, 0x844A) /* <CJK> */
+MAP(0x58, 0x53, 0x844D) /* <CJK> */
+MAP(0x58, 0x54, 0x844F) /* <CJK> */
+MAP(0x58, 0x55, 0x8451) /* <CJK> */
+MAP(0x58, 0x56, 0x8452) /* <CJK> */
+MAP(0x58, 0x57, 0x8456) /* <CJK> */
+MAP(0x58, 0x58, 0x8458) /* <CJK> */
+MAP(0x58, 0x59, 0x8459) /* <CJK> */
+MAP(0x58, 0x5A, 0x845A) /* <CJK> */
+MAP(0x58, 0x5B, 0x845C) /* <CJK> */
+MAP(0x58, 0x5C, 0x8460) /* <CJK> */
+MAP(0x58, 0x5D, 0x8464) /* <CJK> */
+MAP(0x58, 0x5E, 0x8465) /* <CJK> */
+MAP(0x58, 0x5F, 0x8467) /* <CJK> */
+MAP(0x58, 0x60, 0x846A) /* <CJK> */
+MAP(0x58, 0x61, 0x8470) /* <CJK> */
+MAP(0x58, 0x62, 0x8473) /* <CJK> */
+MAP(0x58, 0x63, 0x8474) /* <CJK> */
+MAP(0x58, 0x64, 0x8476) /* <CJK> */
+MAP(0x58, 0x65, 0x8478) /* <CJK> */
+MAP(0x58, 0x66, 0x847C) /* <CJK> */
+MAP(0x58, 0x67, 0x847D) /* <CJK> */
+MAP(0x58, 0x68, 0x8481) /* <CJK> */
+MAP(0x58, 0x69, 0x8485) /* <CJK> */
+MAP(0x58, 0x6A, 0x8492) /* <CJK> */
+MAP(0x58, 0x6B, 0x8493) /* <CJK> */
+MAP(0x58, 0x6C, 0x8495) /* <CJK> */
+MAP(0x58, 0x6D, 0x849E) /* <CJK> */
+MAP(0x58, 0x6E, 0x84A6) /* <CJK> */
+MAP(0x58, 0x6F, 0x84A8) /* <CJK> */
+MAP(0x58, 0x70, 0x84A9) /* <CJK> */
+MAP(0x58, 0x71, 0x84AA) /* <CJK> */
+MAP(0x58, 0x72, 0x84AF) /* <CJK> */
+MAP(0x58, 0x73, 0x84B1) /* <CJK> */
+MAP(0x58, 0x74, 0x84B4) /* <CJK> */
+MAP(0x58, 0x75, 0x84BA) /* <CJK> */
+MAP(0x58, 0x76, 0x84BD) /* <CJK> */
+MAP(0x58, 0x77, 0x84BE) /* <CJK> */
+MAP(0x58, 0x78, 0x84C0) /* <CJK> */
+MAP(0x58, 0x79, 0x84C2) /* <CJK> */
+MAP(0x58, 0x7A, 0x84C7) /* <CJK> */
+MAP(0x58, 0x7B, 0x84C8) /* <CJK> */
+MAP(0x58, 0x7C, 0x84CC) /* <CJK> */
+MAP(0x58, 0x7D, 0x84CF) /* <CJK> */
+MAP(0x58, 0x7E, 0x84D3) /* <CJK> */
+MAP(0x59, 0x21, 0x84DC) /* <CJK> */
+MAP(0x59, 0x22, 0x84E7) /* <CJK> */
+MAP(0x59, 0x23, 0x84EA) /* <CJK> */
+MAP(0x59, 0x24, 0x84EF) /* <CJK> */
+MAP(0x59, 0x25, 0x84F0) /* <CJK> */
+MAP(0x59, 0x26, 0x84F1) /* <CJK> */
+MAP(0x59, 0x27, 0x84F2) /* <CJK> */
+MAP(0x59, 0x28, 0x84F7) /* <CJK> */
+MAP(0x59, 0x29, 0x8532) /* <CJK> */
+MAP(0x59, 0x2A, 0x84FA) /* <CJK> */
+MAP(0x59, 0x2B, 0x84FB) /* <CJK> */
+MAP(0x59, 0x2C, 0x84FD) /* <CJK> */
+MAP(0x59, 0x2D, 0x8502) /* <CJK> */
+MAP(0x59, 0x2E, 0x8503) /* <CJK> */
+MAP(0x59, 0x2F, 0x8507) /* <CJK> */
+MAP(0x59, 0x30, 0x850C) /* <CJK> */
+MAP(0x59, 0x31, 0x850E) /* <CJK> */
+MAP(0x59, 0x32, 0x8510) /* <CJK> */
+MAP(0x59, 0x33, 0x851C) /* <CJK> */
+MAP(0x59, 0x34, 0x851E) /* <CJK> */
+MAP(0x59, 0x35, 0x8522) /* <CJK> */
+MAP(0x59, 0x36, 0x8523) /* <CJK> */
+MAP(0x59, 0x37, 0x8524) /* <CJK> */
+MAP(0x59, 0x38, 0x8525) /* <CJK> */
+MAP(0x59, 0x39, 0x8527) /* <CJK> */
+MAP(0x59, 0x3A, 0x852A) /* <CJK> */
+MAP(0x59, 0x3B, 0x852B) /* <CJK> */
+MAP(0x59, 0x3C, 0x852F) /* <CJK> */
+MAP(0x59, 0x3D, 0x8533) /* <CJK> */
+MAP(0x59, 0x3E, 0x8534) /* <CJK> */
+MAP(0x59, 0x3F, 0x8536) /* <CJK> */
+MAP(0x59, 0x40, 0x853F) /* <CJK> */
+MAP(0x59, 0x41, 0x8546) /* <CJK> */
+MAP(0x59, 0x42, 0x854F) /* <CJK> */
+MAP(0x59, 0x43, 0x8550) /* <CJK> */
+MAP(0x59, 0x44, 0x8551) /* <CJK> */
+MAP(0x59, 0x45, 0x8552) /* <CJK> */
+MAP(0x59, 0x46, 0x8553) /* <CJK> */
+MAP(0x59, 0x47, 0x8556) /* <CJK> */
+MAP(0x59, 0x48, 0x8559) /* <CJK> */
+MAP(0x59, 0x49, 0x855C) /* <CJK> */
+MAP(0x59, 0x4A, 0x855D) /* <CJK> */
+MAP(0x59, 0x4B, 0x855E) /* <CJK> */
+MAP(0x59, 0x4C, 0x855F) /* <CJK> */
+MAP(0x59, 0x4D, 0x8560) /* <CJK> */
+MAP(0x59, 0x4E, 0x8561) /* <CJK> */
+MAP(0x59, 0x4F, 0x8562) /* <CJK> */
+MAP(0x59, 0x50, 0x8564) /* <CJK> */
+MAP(0x59, 0x51, 0x856B) /* <CJK> */
+MAP(0x59, 0x52, 0x856F) /* <CJK> */
+MAP(0x59, 0x53, 0x8579) /* <CJK> */
+MAP(0x59, 0x54, 0x857A) /* <CJK> */
+MAP(0x59, 0x55, 0x857B) /* <CJK> */
+MAP(0x59, 0x56, 0x857D) /* <CJK> */
+MAP(0x59, 0x57, 0x857F) /* <CJK> */
+MAP(0x59, 0x58, 0x8581) /* <CJK> */
+MAP(0x59, 0x59, 0x8585) /* <CJK> */
+MAP(0x59, 0x5A, 0x8586) /* <CJK> */
+MAP(0x59, 0x5B, 0x8589) /* <CJK> */
+MAP(0x59, 0x5C, 0x858B) /* <CJK> */
+MAP(0x59, 0x5D, 0x858C) /* <CJK> */
+MAP(0x59, 0x5E, 0x858F) /* <CJK> */
+MAP(0x59, 0x5F, 0x8593) /* <CJK> */
+MAP(0x59, 0x60, 0x8598) /* <CJK> */
+MAP(0x59, 0x61, 0x859D) /* <CJK> */
+MAP(0x59, 0x62, 0x859F) /* <CJK> */
+MAP(0x59, 0x63, 0x85A0) /* <CJK> */
+MAP(0x59, 0x64, 0x85A2) /* <CJK> */
+MAP(0x59, 0x65, 0x85A5) /* <CJK> */
+MAP(0x59, 0x66, 0x85A7) /* <CJK> */
+MAP(0x59, 0x67, 0x85B4) /* <CJK> */
+MAP(0x59, 0x68, 0x85B6) /* <CJK> */
+MAP(0x59, 0x69, 0x85B7) /* <CJK> */
+MAP(0x59, 0x6A, 0x85B8) /* <CJK> */
+MAP(0x59, 0x6B, 0x85BC) /* <CJK> */
+MAP(0x59, 0x6C, 0x85BD) /* <CJK> */
+MAP(0x59, 0x6D, 0x85BE) /* <CJK> */
+MAP(0x59, 0x6E, 0x85BF) /* <CJK> */
+MAP(0x59, 0x6F, 0x85C2) /* <CJK> */
+MAP(0x59, 0x70, 0x85C7) /* <CJK> */
+MAP(0x59, 0x71, 0x85CA) /* <CJK> */
+MAP(0x59, 0x72, 0x85CB) /* <CJK> */
+MAP(0x59, 0x73, 0x85CE) /* <CJK> */
+MAP(0x59, 0x74, 0x85AD) /* <CJK> */
+MAP(0x59, 0x75, 0x85D8) /* <CJK> */
+MAP(0x59, 0x76, 0x85DA) /* <CJK> */
+MAP(0x59, 0x77, 0x85DF) /* <CJK> */
+MAP(0x59, 0x78, 0x85E0) /* <CJK> */
+MAP(0x59, 0x79, 0x85E6) /* <CJK> */
+MAP(0x59, 0x7A, 0x85E8) /* <CJK> */
+MAP(0x59, 0x7B, 0x85ED) /* <CJK> */
+MAP(0x59, 0x7C, 0x85F3) /* <CJK> */
+MAP(0x59, 0x7D, 0x85F6) /* <CJK> */
+MAP(0x59, 0x7E, 0x85FC) /* <CJK> */
+MAP(0x5A, 0x21, 0x85FF) /* <CJK> */
+MAP(0x5A, 0x22, 0x8600) /* <CJK> */
+MAP(0x5A, 0x23, 0x8604) /* <CJK> */
+MAP(0x5A, 0x24, 0x8605) /* <CJK> */
+MAP(0x5A, 0x25, 0x860D) /* <CJK> */
+MAP(0x5A, 0x26, 0x860E) /* <CJK> */
+MAP(0x5A, 0x27, 0x8610) /* <CJK> */
+MAP(0x5A, 0x28, 0x8611) /* <CJK> */
+MAP(0x5A, 0x29, 0x8612) /* <CJK> */
+MAP(0x5A, 0x2A, 0x8618) /* <CJK> */
+MAP(0x5A, 0x2B, 0x8619) /* <CJK> */
+MAP(0x5A, 0x2C, 0x861B) /* <CJK> */
+MAP(0x5A, 0x2D, 0x861E) /* <CJK> */
+MAP(0x5A, 0x2E, 0x8621) /* <CJK> */
+MAP(0x5A, 0x2F, 0x8627) /* <CJK> */
+MAP(0x5A, 0x30, 0x8629) /* <CJK> */
+MAP(0x5A, 0x31, 0x8636) /* <CJK> */
+MAP(0x5A, 0x32, 0x8638) /* <CJK> */
+MAP(0x5A, 0x33, 0x863A) /* <CJK> */
+MAP(0x5A, 0x34, 0x863C) /* <CJK> */
+MAP(0x5A, 0x35, 0x863D) /* <CJK> */
+MAP(0x5A, 0x36, 0x8640) /* <CJK> */
+MAP(0x5A, 0x37, 0x8642) /* <CJK> */
+MAP(0x5A, 0x38, 0x8646) /* <CJK> */
+MAP(0x5A, 0x39, 0x8652) /* <CJK> */
+MAP(0x5A, 0x3A, 0x8653) /* <CJK> */
+MAP(0x5A, 0x3B, 0x8656) /* <CJK> */
+MAP(0x5A, 0x3C, 0x8657) /* <CJK> */
+MAP(0x5A, 0x3D, 0x8658) /* <CJK> */
+MAP(0x5A, 0x3E, 0x8659) /* <CJK> */
+MAP(0x5A, 0x3F, 0x865D) /* <CJK> */
+MAP(0x5A, 0x40, 0x8660) /* <CJK> */
+MAP(0x5A, 0x41, 0x8661) /* <CJK> */
+MAP(0x5A, 0x42, 0x8662) /* <CJK> */
+MAP(0x5A, 0x43, 0x8663) /* <CJK> */
+MAP(0x5A, 0x44, 0x8664) /* <CJK> */
+MAP(0x5A, 0x45, 0x8669) /* <CJK> */
+MAP(0x5A, 0x46, 0x866C) /* <CJK> */
+MAP(0x5A, 0x47, 0x866F) /* <CJK> */
+MAP(0x5A, 0x48, 0x8675) /* <CJK> */
+MAP(0x5A, 0x49, 0x8676) /* <CJK> */
+MAP(0x5A, 0x4A, 0x8677) /* <CJK> */
+MAP(0x5A, 0x4B, 0x867A) /* <CJK> */
+MAP(0x5A, 0x4C, 0x868D) /* <CJK> */
+MAP(0x5A, 0x4D, 0x8691) /* <CJK> */
+MAP(0x5A, 0x4E, 0x8696) /* <CJK> */
+MAP(0x5A, 0x4F, 0x8698) /* <CJK> */
+MAP(0x5A, 0x50, 0x869A) /* <CJK> */
+MAP(0x5A, 0x51, 0x869C) /* <CJK> */
+MAP(0x5A, 0x52, 0x86A1) /* <CJK> */
+MAP(0x5A, 0x53, 0x86A6) /* <CJK> */
+MAP(0x5A, 0x54, 0x86A7) /* <CJK> */
+MAP(0x5A, 0x55, 0x86A8) /* <CJK> */
+MAP(0x5A, 0x56, 0x86AD) /* <CJK> */
+MAP(0x5A, 0x57, 0x86B1) /* <CJK> */
+MAP(0x5A, 0x58, 0x86B3) /* <CJK> */
+MAP(0x5A, 0x59, 0x86B4) /* <CJK> */
+MAP(0x5A, 0x5A, 0x86B5) /* <CJK> */
+MAP(0x5A, 0x5B, 0x86B7) /* <CJK> */
+MAP(0x5A, 0x5C, 0x86B8) /* <CJK> */
+MAP(0x5A, 0x5D, 0x86B9) /* <CJK> */
+MAP(0x5A, 0x5E, 0x86BF) /* <CJK> */
+MAP(0x5A, 0x5F, 0x86C0) /* <CJK> */
+MAP(0x5A, 0x60, 0x86C1) /* <CJK> */
+MAP(0x5A, 0x61, 0x86C3) /* <CJK> */
+MAP(0x5A, 0x62, 0x86C5) /* <CJK> */
+MAP(0x5A, 0x63, 0x86D1) /* <CJK> */
+MAP(0x5A, 0x64, 0x86D2) /* <CJK> */
+MAP(0x5A, 0x65, 0x86D5) /* <CJK> */
+MAP(0x5A, 0x66, 0x86D7) /* <CJK> */
+MAP(0x5A, 0x67, 0x86DA) /* <CJK> */
+MAP(0x5A, 0x68, 0x86DC) /* <CJK> */
+MAP(0x5A, 0x69, 0x86E0) /* <CJK> */
+MAP(0x5A, 0x6A, 0x86E3) /* <CJK> */
+MAP(0x5A, 0x6B, 0x86E5) /* <CJK> */
+MAP(0x5A, 0x6C, 0x86E7) /* <CJK> */
+MAP(0x5A, 0x6D, 0x8688) /* <CJK> */
+MAP(0x5A, 0x6E, 0x86FA) /* <CJK> */
+MAP(0x5A, 0x6F, 0x86FC) /* <CJK> */
+MAP(0x5A, 0x70, 0x86FD) /* <CJK> */
+MAP(0x5A, 0x71, 0x8704) /* <CJK> */
+MAP(0x5A, 0x72, 0x8705) /* <CJK> */
+MAP(0x5A, 0x73, 0x8707) /* <CJK> */
+MAP(0x5A, 0x74, 0x870B) /* <CJK> */
+MAP(0x5A, 0x75, 0x870E) /* <CJK> */
+MAP(0x5A, 0x76, 0x870F) /* <CJK> */
+MAP(0x5A, 0x77, 0x8710) /* <CJK> */
+MAP(0x5A, 0x78, 0x8713) /* <CJK> */
+MAP(0x5A, 0x79, 0x8714) /* <CJK> */
+MAP(0x5A, 0x7A, 0x8719) /* <CJK> */
+MAP(0x5A, 0x7B, 0x871E) /* <CJK> */
+MAP(0x5A, 0x7C, 0x871F) /* <CJK> */
+MAP(0x5A, 0x7D, 0x8721) /* <CJK> */
+MAP(0x5A, 0x7E, 0x8723) /* <CJK> */
+MAP(0x5B, 0x21, 0x8728) /* <CJK> */
+MAP(0x5B, 0x22, 0x872E) /* <CJK> */
+MAP(0x5B, 0x23, 0x872F) /* <CJK> */
+MAP(0x5B, 0x24, 0x8731) /* <CJK> */
+MAP(0x5B, 0x25, 0x8732) /* <CJK> */
+MAP(0x5B, 0x26, 0x8739) /* <CJK> */
+MAP(0x5B, 0x27, 0x873A) /* <CJK> */
+MAP(0x5B, 0x28, 0x873C) /* <CJK> */
+MAP(0x5B, 0x29, 0x873D) /* <CJK> */
+MAP(0x5B, 0x2A, 0x873E) /* <CJK> */
+MAP(0x5B, 0x2B, 0x8740) /* <CJK> */
+MAP(0x5B, 0x2C, 0x8743) /* <CJK> */
+MAP(0x5B, 0x2D, 0x8745) /* <CJK> */
+MAP(0x5B, 0x2E, 0x874D) /* <CJK> */
+MAP(0x5B, 0x2F, 0x8758) /* <CJK> */
+MAP(0x5B, 0x30, 0x875D) /* <CJK> */
+MAP(0x5B, 0x31, 0x8761) /* <CJK> */
+MAP(0x5B, 0x32, 0x8764) /* <CJK> */
+MAP(0x5B, 0x33, 0x8765) /* <CJK> */
+MAP(0x5B, 0x34, 0x876F) /* <CJK> */
+MAP(0x5B, 0x35, 0x8771) /* <CJK> */
+MAP(0x5B, 0x36, 0x8772) /* <CJK> */
+MAP(0x5B, 0x37, 0x877B) /* <CJK> */
+MAP(0x5B, 0x38, 0x8783) /* <CJK> */
+MAP(0x5B, 0x39, 0x8784) /* <CJK> */
+MAP(0x5B, 0x3A, 0x8785) /* <CJK> */
+MAP(0x5B, 0x3B, 0x8786) /* <CJK> */
+MAP(0x5B, 0x3C, 0x8787) /* <CJK> */
+MAP(0x5B, 0x3D, 0x8788) /* <CJK> */
+MAP(0x5B, 0x3E, 0x8789) /* <CJK> */
+MAP(0x5B, 0x3F, 0x878B) /* <CJK> */
+MAP(0x5B, 0x40, 0x878C) /* <CJK> */
+MAP(0x5B, 0x41, 0x8790) /* <CJK> */
+MAP(0x5B, 0x42, 0x8793) /* <CJK> */
+MAP(0x5B, 0x43, 0x8795) /* <CJK> */
+MAP(0x5B, 0x44, 0x8797) /* <CJK> */
+MAP(0x5B, 0x45, 0x8798) /* <CJK> */
+MAP(0x5B, 0x46, 0x8799) /* <CJK> */
+MAP(0x5B, 0x47, 0x879E) /* <CJK> */
+MAP(0x5B, 0x48, 0x87A0) /* <CJK> */
+MAP(0x5B, 0x49, 0x87A3) /* <CJK> */
+MAP(0x5B, 0x4A, 0x87A7) /* <CJK> */
+MAP(0x5B, 0x4B, 0x87AC) /* <CJK> */
+MAP(0x5B, 0x4C, 0x87AD) /* <CJK> */
+MAP(0x5B, 0x4D, 0x87AE) /* <CJK> */
+MAP(0x5B, 0x4E, 0x87B1) /* <CJK> */
+MAP(0x5B, 0x4F, 0x87B5) /* <CJK> */
+MAP(0x5B, 0x50, 0x87BE) /* <CJK> */
+MAP(0x5B, 0x51, 0x87BF) /* <CJK> */
+MAP(0x5B, 0x52, 0x87C1) /* <CJK> */
+MAP(0x5B, 0x53, 0x87C8) /* <CJK> */
+MAP(0x5B, 0x54, 0x87C9) /* <CJK> */
+MAP(0x5B, 0x55, 0x87CA) /* <CJK> */
+MAP(0x5B, 0x56, 0x87CE) /* <CJK> */
+MAP(0x5B, 0x57, 0x87D5) /* <CJK> */
+MAP(0x5B, 0x58, 0x87D6) /* <CJK> */
+MAP(0x5B, 0x59, 0x87D9) /* <CJK> */
+MAP(0x5B, 0x5A, 0x87DA) /* <CJK> */
+MAP(0x5B, 0x5B, 0x87DC) /* <CJK> */
+MAP(0x5B, 0x5C, 0x87DF) /* <CJK> */
+MAP(0x5B, 0x5D, 0x87E2) /* <CJK> */
+MAP(0x5B, 0x5E, 0x87E3) /* <CJK> */
+MAP(0x5B, 0x5F, 0x87E4) /* <CJK> */
+MAP(0x5B, 0x60, 0x87EA) /* <CJK> */
+MAP(0x5B, 0x61, 0x87EB) /* <CJK> */
+MAP(0x5B, 0x62, 0x87ED) /* <CJK> */
+MAP(0x5B, 0x63, 0x87F1) /* <CJK> */
+MAP(0x5B, 0x64, 0x87F3) /* <CJK> */
+MAP(0x5B, 0x65, 0x87F8) /* <CJK> */
+MAP(0x5B, 0x66, 0x87FA) /* <CJK> */
+MAP(0x5B, 0x67, 0x87FF) /* <CJK> */
+MAP(0x5B, 0x68, 0x8801) /* <CJK> */
+MAP(0x5B, 0x69, 0x8803) /* <CJK> */
+MAP(0x5B, 0x6A, 0x8806) /* <CJK> */
+MAP(0x5B, 0x6B, 0x8809) /* <CJK> */
+MAP(0x5B, 0x6C, 0x880A) /* <CJK> */
+MAP(0x5B, 0x6D, 0x880B) /* <CJK> */
+MAP(0x5B, 0x6E, 0x8810) /* <CJK> */
+MAP(0x5B, 0x6F, 0x8819) /* <CJK> */
+MAP(0x5B, 0x70, 0x8812) /* <CJK> */
+MAP(0x5B, 0x71, 0x8813) /* <CJK> */
+MAP(0x5B, 0x72, 0x8814) /* <CJK> */
+MAP(0x5B, 0x73, 0x8818) /* <CJK> */
+MAP(0x5B, 0x74, 0x881A) /* <CJK> */
+MAP(0x5B, 0x75, 0x881B) /* <CJK> */
+MAP(0x5B, 0x76, 0x881C) /* <CJK> */
+MAP(0x5B, 0x77, 0x881E) /* <CJK> */
+MAP(0x5B, 0x78, 0x881F) /* <CJK> */
+MAP(0x5B, 0x79, 0x8828) /* <CJK> */
+MAP(0x5B, 0x7A, 0x882D) /* <CJK> */
+MAP(0x5B, 0x7B, 0x882E) /* <CJK> */
+MAP(0x5B, 0x7C, 0x8830) /* <CJK> */
+MAP(0x5B, 0x7D, 0x8832) /* <CJK> */
+MAP(0x5B, 0x7E, 0x8835) /* <CJK> */
+MAP(0x5C, 0x21, 0x883A) /* <CJK> */
+MAP(0x5C, 0x22, 0x883C) /* <CJK> */
+MAP(0x5C, 0x23, 0x8841) /* <CJK> */
+MAP(0x5C, 0x24, 0x8843) /* <CJK> */
+MAP(0x5C, 0x25, 0x8845) /* <CJK> */
+MAP(0x5C, 0x26, 0x8848) /* <CJK> */
+MAP(0x5C, 0x27, 0x8849) /* <CJK> */
+MAP(0x5C, 0x28, 0x884A) /* <CJK> */
+MAP(0x5C, 0x29, 0x884B) /* <CJK> */
+MAP(0x5C, 0x2A, 0x884E) /* <CJK> */
+MAP(0x5C, 0x2B, 0x8851) /* <CJK> */
+MAP(0x5C, 0x2C, 0x8855) /* <CJK> */
+MAP(0x5C, 0x2D, 0x8856) /* <CJK> */
+MAP(0x5C, 0x2E, 0x8858) /* <CJK> */
+MAP(0x5C, 0x2F, 0x885A) /* <CJK> */
+MAP(0x5C, 0x30, 0x885C) /* <CJK> */
+MAP(0x5C, 0x31, 0x885F) /* <CJK> */
+MAP(0x5C, 0x32, 0x8860) /* <CJK> */
+MAP(0x5C, 0x33, 0x8864) /* <CJK> */
+MAP(0x5C, 0x34, 0x8869) /* <CJK> */
+MAP(0x5C, 0x35, 0x8871) /* <CJK> */
+MAP(0x5C, 0x36, 0x8879) /* <CJK> */
+MAP(0x5C, 0x37, 0x887B) /* <CJK> */
+MAP(0x5C, 0x38, 0x8880) /* <CJK> */
+MAP(0x5C, 0x39, 0x8898) /* <CJK> */
+MAP(0x5C, 0x3A, 0x889A) /* <CJK> */
+MAP(0x5C, 0x3B, 0x889B) /* <CJK> */
+MAP(0x5C, 0x3C, 0x889C) /* <CJK> */
+MAP(0x5C, 0x3D, 0x889F) /* <CJK> */
+MAP(0x5C, 0x3E, 0x88A0) /* <CJK> */
+MAP(0x5C, 0x3F, 0x88A8) /* <CJK> */
+MAP(0x5C, 0x40, 0x88AA) /* <CJK> */
+MAP(0x5C, 0x41, 0x88BA) /* <CJK> */
+MAP(0x5C, 0x42, 0x88BD) /* <CJK> */
+MAP(0x5C, 0x43, 0x88BE) /* <CJK> */
+MAP(0x5C, 0x44, 0x88C0) /* <CJK> */
+MAP(0x5C, 0x45, 0x88CA) /* <CJK> */
+MAP(0x5C, 0x46, 0x88CB) /* <CJK> */
+MAP(0x5C, 0x47, 0x88CC) /* <CJK> */
+MAP(0x5C, 0x48, 0x88CD) /* <CJK> */
+MAP(0x5C, 0x49, 0x88CE) /* <CJK> */
+MAP(0x5C, 0x4A, 0x88D1) /* <CJK> */
+MAP(0x5C, 0x4B, 0x88D2) /* <CJK> */
+MAP(0x5C, 0x4C, 0x88D3) /* <CJK> */
+MAP(0x5C, 0x4D, 0x88DB) /* <CJK> */
+MAP(0x5C, 0x4E, 0x88DE) /* <CJK> */
+MAP(0x5C, 0x4F, 0x88E7) /* <CJK> */
+MAP(0x5C, 0x50, 0x88EF) /* <CJK> */
+MAP(0x5C, 0x51, 0x88F0) /* <CJK> */
+MAP(0x5C, 0x52, 0x88F1) /* <CJK> */
+MAP(0x5C, 0x53, 0x88F5) /* <CJK> */
+MAP(0x5C, 0x54, 0x88F7) /* <CJK> */
+MAP(0x5C, 0x55, 0x8901) /* <CJK> */
+MAP(0x5C, 0x56, 0x8906) /* <CJK> */
+MAP(0x5C, 0x57, 0x890D) /* <CJK> */
+MAP(0x5C, 0x58, 0x890E) /* <CJK> */
+MAP(0x5C, 0x59, 0x890F) /* <CJK> */
+MAP(0x5C, 0x5A, 0x8915) /* <CJK> */
+MAP(0x5C, 0x5B, 0x8916) /* <CJK> */
+MAP(0x5C, 0x5C, 0x8918) /* <CJK> */
+MAP(0x5C, 0x5D, 0x8919) /* <CJK> */
+MAP(0x5C, 0x5E, 0x891A) /* <CJK> */
+MAP(0x5C, 0x5F, 0x891C) /* <CJK> */
+MAP(0x5C, 0x60, 0x8920) /* <CJK> */
+MAP(0x5C, 0x61, 0x8926) /* <CJK> */
+MAP(0x5C, 0x62, 0x8927) /* <CJK> */
+MAP(0x5C, 0x63, 0x8928) /* <CJK> */
+MAP(0x5C, 0x64, 0x8930) /* <CJK> */
+MAP(0x5C, 0x65, 0x8931) /* <CJK> */
+MAP(0x5C, 0x66, 0x8932) /* <CJK> */
+MAP(0x5C, 0x67, 0x8935) /* <CJK> */
+MAP(0x5C, 0x68, 0x8939) /* <CJK> */
+MAP(0x5C, 0x69, 0x893A) /* <CJK> */
+MAP(0x5C, 0x6A, 0x893E) /* <CJK> */
+MAP(0x5C, 0x6B, 0x8940) /* <CJK> */
+MAP(0x5C, 0x6C, 0x8942) /* <CJK> */
+MAP(0x5C, 0x6D, 0x8945) /* <CJK> */
+MAP(0x5C, 0x6E, 0x8946) /* <CJK> */
+MAP(0x5C, 0x6F, 0x8949) /* <CJK> */
+MAP(0x5C, 0x70, 0x894F) /* <CJK> */
+MAP(0x5C, 0x71, 0x8952) /* <CJK> */
+MAP(0x5C, 0x72, 0x8957) /* <CJK> */
+MAP(0x5C, 0x73, 0x895A) /* <CJK> */
+MAP(0x5C, 0x74, 0x895B) /* <CJK> */
+MAP(0x5C, 0x75, 0x895C) /* <CJK> */
+MAP(0x5C, 0x76, 0x8961) /* <CJK> */
+MAP(0x5C, 0x77, 0x8962) /* <CJK> */
+MAP(0x5C, 0x78, 0x8963) /* <CJK> */
+MAP(0x5C, 0x79, 0x896B) /* <CJK> */
+MAP(0x5C, 0x7A, 0x896E) /* <CJK> */
+MAP(0x5C, 0x7B, 0x8970) /* <CJK> */
+MAP(0x5C, 0x7C, 0x8973) /* <CJK> */
+MAP(0x5C, 0x7D, 0x8975) /* <CJK> */
+MAP(0x5C, 0x7E, 0x897A) /* <CJK> */
+MAP(0x5D, 0x21, 0x897B) /* <CJK> */
+MAP(0x5D, 0x22, 0x897C) /* <CJK> */
+MAP(0x5D, 0x23, 0x897D) /* <CJK> */
+MAP(0x5D, 0x24, 0x8989) /* <CJK> */
+MAP(0x5D, 0x25, 0x898D) /* <CJK> */
+MAP(0x5D, 0x26, 0x8990) /* <CJK> */
+MAP(0x5D, 0x27, 0x8994) /* <CJK> */
+MAP(0x5D, 0x28, 0x8995) /* <CJK> */
+MAP(0x5D, 0x29, 0x899B) /* <CJK> */
+MAP(0x5D, 0x2A, 0x899C) /* <CJK> */
+MAP(0x5D, 0x2B, 0x899F) /* <CJK> */
+MAP(0x5D, 0x2C, 0x89A0) /* <CJK> */
+MAP(0x5D, 0x2D, 0x89A5) /* <CJK> */
+MAP(0x5D, 0x2E, 0x89B0) /* <CJK> */
+MAP(0x5D, 0x2F, 0x89B4) /* <CJK> */
+MAP(0x5D, 0x30, 0x89B5) /* <CJK> */
+MAP(0x5D, 0x31, 0x89B6) /* <CJK> */
+MAP(0x5D, 0x32, 0x89B7) /* <CJK> */
+MAP(0x5D, 0x33, 0x89BC) /* <CJK> */
+MAP(0x5D, 0x34, 0x89D4) /* <CJK> */
+MAP(0x5D, 0x35, 0x89D5) /* <CJK> */
+MAP(0x5D, 0x36, 0x89D6) /* <CJK> */
+MAP(0x5D, 0x37, 0x89D7) /* <CJK> */
+MAP(0x5D, 0x38, 0x89D8) /* <CJK> */
+MAP(0x5D, 0x39, 0x89E5) /* <CJK> */
+MAP(0x5D, 0x3A, 0x89E9) /* <CJK> */
+MAP(0x5D, 0x3B, 0x89EB) /* <CJK> */
+MAP(0x5D, 0x3C, 0x89ED) /* <CJK> */
+MAP(0x5D, 0x3D, 0x89F1) /* <CJK> */
+MAP(0x5D, 0x3E, 0x89F3) /* <CJK> */
+MAP(0x5D, 0x3F, 0x89F6) /* <CJK> */
+MAP(0x5D, 0x40, 0x89F9) /* <CJK> */
+MAP(0x5D, 0x41, 0x89FD) /* <CJK> */
+MAP(0x5D, 0x42, 0x89FF) /* <CJK> */
+MAP(0x5D, 0x43, 0x8A04) /* <CJK> */
+MAP(0x5D, 0x44, 0x8A05) /* <CJK> */
+MAP(0x5D, 0x45, 0x8A07) /* <CJK> */
+MAP(0x5D, 0x46, 0x8A0F) /* <CJK> */
+MAP(0x5D, 0x47, 0x8A11) /* <CJK> */
+MAP(0x5D, 0x48, 0x8A12) /* <CJK> */
+MAP(0x5D, 0x49, 0x8A14) /* <CJK> */
+MAP(0x5D, 0x4A, 0x8A15) /* <CJK> */
+MAP(0x5D, 0x4B, 0x8A1E) /* <CJK> */
+MAP(0x5D, 0x4C, 0x8A20) /* <CJK> */
+MAP(0x5D, 0x4D, 0x8A22) /* <CJK> */
+MAP(0x5D, 0x4E, 0x8A24) /* <CJK> */
+MAP(0x5D, 0x4F, 0x8A26) /* <CJK> */
+MAP(0x5D, 0x50, 0x8A2B) /* <CJK> */
+MAP(0x5D, 0x51, 0x8A2C) /* <CJK> */
+MAP(0x5D, 0x52, 0x8A2F) /* <CJK> */
+MAP(0x5D, 0x53, 0x8A35) /* <CJK> */
+MAP(0x5D, 0x54, 0x8A37) /* <CJK> */
+MAP(0x5D, 0x55, 0x8A3D) /* <CJK> */
+MAP(0x5D, 0x56, 0x8A3E) /* <CJK> */
+MAP(0x5D, 0x57, 0x8A40) /* <CJK> */
+MAP(0x5D, 0x58, 0x8A43) /* <CJK> */
+MAP(0x5D, 0x59, 0x8A45) /* <CJK> */
+MAP(0x5D, 0x5A, 0x8A47) /* <CJK> */
+MAP(0x5D, 0x5B, 0x8A49) /* <CJK> */
+MAP(0x5D, 0x5C, 0x8A4D) /* <CJK> */
+MAP(0x5D, 0x5D, 0x8A4E) /* <CJK> */
+MAP(0x5D, 0x5E, 0x8A53) /* <CJK> */
+MAP(0x5D, 0x5F, 0x8A56) /* <CJK> */
+MAP(0x5D, 0x60, 0x8A57) /* <CJK> */
+MAP(0x5D, 0x61, 0x8A58) /* <CJK> */
+MAP(0x5D, 0x62, 0x8A5C) /* <CJK> */
+MAP(0x5D, 0x63, 0x8A5D) /* <CJK> */
+MAP(0x5D, 0x64, 0x8A61) /* <CJK> */
+MAP(0x5D, 0x65, 0x8A65) /* <CJK> */
+MAP(0x5D, 0x66, 0x8A67) /* <CJK> */
+MAP(0x5D, 0x67, 0x8A75) /* <CJK> */
+MAP(0x5D, 0x68, 0x8A76) /* <CJK> */
+MAP(0x5D, 0x69, 0x8A77) /* <CJK> */
+MAP(0x5D, 0x6A, 0x8A79) /* <CJK> */
+MAP(0x5D, 0x6B, 0x8A7A) /* <CJK> */
+MAP(0x5D, 0x6C, 0x8A7B) /* <CJK> */
+MAP(0x5D, 0x6D, 0x8A7E) /* <CJK> */
+MAP(0x5D, 0x6E, 0x8A7F) /* <CJK> */
+MAP(0x5D, 0x6F, 0x8A80) /* <CJK> */
+MAP(0x5D, 0x70, 0x8A83) /* <CJK> */
+MAP(0x5D, 0x71, 0x8A86) /* <CJK> */
+MAP(0x5D, 0x72, 0x8A8B) /* <CJK> */
+MAP(0x5D, 0x73, 0x8A8F) /* <CJK> */
+MAP(0x5D, 0x74, 0x8A90) /* <CJK> */
+MAP(0x5D, 0x75, 0x8A92) /* <CJK> */
+MAP(0x5D, 0x76, 0x8A96) /* <CJK> */
+MAP(0x5D, 0x77, 0x8A97) /* <CJK> */
+MAP(0x5D, 0x78, 0x8A99) /* <CJK> */
+MAP(0x5D, 0x79, 0x8A9F) /* <CJK> */
+MAP(0x5D, 0x7A, 0x8AA7) /* <CJK> */
+MAP(0x5D, 0x7B, 0x8AA9) /* <CJK> */
+MAP(0x5D, 0x7C, 0x8AAE) /* <CJK> */
+MAP(0x5D, 0x7D, 0x8AAF) /* <CJK> */
+MAP(0x5D, 0x7E, 0x8AB3) /* <CJK> */
+MAP(0x5E, 0x21, 0x8AB6) /* <CJK> */
+MAP(0x5E, 0x22, 0x8AB7) /* <CJK> */
+MAP(0x5E, 0x23, 0x8ABB) /* <CJK> */
+MAP(0x5E, 0x24, 0x8ABE) /* <CJK> */
+MAP(0x5E, 0x25, 0x8AC3) /* <CJK> */
+MAP(0x5E, 0x26, 0x8AC6) /* <CJK> */
+MAP(0x5E, 0x27, 0x8AC8) /* <CJK> */
+MAP(0x5E, 0x28, 0x8AC9) /* <CJK> */
+MAP(0x5E, 0x29, 0x8ACA) /* <CJK> */
+MAP(0x5E, 0x2A, 0x8AD1) /* <CJK> */
+MAP(0x5E, 0x2B, 0x8AD3) /* <CJK> */
+MAP(0x5E, 0x2C, 0x8AD4) /* <CJK> */
+MAP(0x5E, 0x2D, 0x8AD5) /* <CJK> */
+MAP(0x5E, 0x2E, 0x8AD7) /* <CJK> */
+MAP(0x5E, 0x2F, 0x8ADD) /* <CJK> */
+MAP(0x5E, 0x30, 0x8ADF) /* <CJK> */
+MAP(0x5E, 0x31, 0x8AEC) /* <CJK> */
+MAP(0x5E, 0x32, 0x8AF0) /* <CJK> */
+MAP(0x5E, 0x33, 0x8AF4) /* <CJK> */
+MAP(0x5E, 0x34, 0x8AF5) /* <CJK> */
+MAP(0x5E, 0x35, 0x8AF6) /* <CJK> */
+MAP(0x5E, 0x36, 0x8AFC) /* <CJK> */
+MAP(0x5E, 0x37, 0x8AFF) /* <CJK> */
+MAP(0x5E, 0x38, 0x8B05) /* <CJK> */
+MAP(0x5E, 0x39, 0x8B06) /* <CJK> */
+MAP(0x5E, 0x3A, 0x8B0B) /* <CJK> */
+MAP(0x5E, 0x3B, 0x8B11) /* <CJK> */
+MAP(0x5E, 0x3C, 0x8B1C) /* <CJK> */
+MAP(0x5E, 0x3D, 0x8B1E) /* <CJK> */
+MAP(0x5E, 0x3E, 0x8B1F) /* <CJK> */
+MAP(0x5E, 0x3F, 0x8B0A) /* <CJK> */
+MAP(0x5E, 0x40, 0x8B2D) /* <CJK> */
+MAP(0x5E, 0x41, 0x8B30) /* <CJK> */
+MAP(0x5E, 0x42, 0x8B37) /* <CJK> */
+MAP(0x5E, 0x43, 0x8B3C) /* <CJK> */
+MAP(0x5E, 0x44, 0x8B42) /* <CJK> */
+MAP(0x5E, 0x45, 0x8B43) /* <CJK> */
+MAP(0x5E, 0x46, 0x8B44) /* <CJK> */
+MAP(0x5E, 0x47, 0x8B45) /* <CJK> */
+MAP(0x5E, 0x48, 0x8B46) /* <CJK> */
+MAP(0x5E, 0x49, 0x8B48) /* <CJK> */
+MAP(0x5E, 0x4A, 0x8B52) /* <CJK> */
+MAP(0x5E, 0x4B, 0x8B53) /* <CJK> */
+MAP(0x5E, 0x4C, 0x8B54) /* <CJK> */
+MAP(0x5E, 0x4D, 0x8B59) /* <CJK> */
+MAP(0x5E, 0x4E, 0x8B4D) /* <CJK> */
+MAP(0x5E, 0x4F, 0x8B5E) /* <CJK> */
+MAP(0x5E, 0x50, 0x8B63) /* <CJK> */
+MAP(0x5E, 0x51, 0x8B6D) /* <CJK> */
+MAP(0x5E, 0x52, 0x8B76) /* <CJK> */
+MAP(0x5E, 0x53, 0x8B78) /* <CJK> */
+MAP(0x5E, 0x54, 0x8B79) /* <CJK> */
+MAP(0x5E, 0x55, 0x8B7C) /* <CJK> */
+MAP(0x5E, 0x56, 0x8B7E) /* <CJK> */
+MAP(0x5E, 0x57, 0x8B81) /* <CJK> */
+MAP(0x5E, 0x58, 0x8B84) /* <CJK> */
+MAP(0x5E, 0x59, 0x8B85) /* <CJK> */
+MAP(0x5E, 0x5A, 0x8B8B) /* <CJK> */
+MAP(0x5E, 0x5B, 0x8B8D) /* <CJK> */
+MAP(0x5E, 0x5C, 0x8B8F) /* <CJK> */
+MAP(0x5E, 0x5D, 0x8B94) /* <CJK> */
+MAP(0x5E, 0x5E, 0x8B95) /* <CJK> */
+MAP(0x5E, 0x5F, 0x8B9C) /* <CJK> */
+MAP(0x5E, 0x60, 0x8B9E) /* <CJK> */
+MAP(0x5E, 0x61, 0x8B9F) /* <CJK> */
+MAP(0x5E, 0x62, 0x8C38) /* <CJK> */
+MAP(0x5E, 0x63, 0x8C39) /* <CJK> */
+MAP(0x5E, 0x64, 0x8C3D) /* <CJK> */
+MAP(0x5E, 0x65, 0x8C3E) /* <CJK> */
+MAP(0x5E, 0x66, 0x8C45) /* <CJK> */
+MAP(0x5E, 0x67, 0x8C47) /* <CJK> */
+MAP(0x5E, 0x68, 0x8C49) /* <CJK> */
+MAP(0x5E, 0x69, 0x8C4B) /* <CJK> */
+MAP(0x5E, 0x6A, 0x8C4F) /* <CJK> */
+MAP(0x5E, 0x6B, 0x8C51) /* <CJK> */
+MAP(0x5E, 0x6C, 0x8C53) /* <CJK> */
+MAP(0x5E, 0x6D, 0x8C54) /* <CJK> */
+MAP(0x5E, 0x6E, 0x8C57) /* <CJK> */
+MAP(0x5E, 0x6F, 0x8C58) /* <CJK> */
+MAP(0x5E, 0x70, 0x8C5B) /* <CJK> */
+MAP(0x5E, 0x71, 0x8C5D) /* <CJK> */
+MAP(0x5E, 0x72, 0x8C59) /* <CJK> */
+MAP(0x5E, 0x73, 0x8C63) /* <CJK> */
+MAP(0x5E, 0x74, 0x8C64) /* <CJK> */
+MAP(0x5E, 0x75, 0x8C66) /* <CJK> */
+MAP(0x5E, 0x76, 0x8C68) /* <CJK> */
+MAP(0x5E, 0x77, 0x8C69) /* <CJK> */
+MAP(0x5E, 0x78, 0x8C6D) /* <CJK> */
+MAP(0x5E, 0x79, 0x8C73) /* <CJK> */
+MAP(0x5E, 0x7A, 0x8C75) /* <CJK> */
+MAP(0x5E, 0x7B, 0x8C76) /* <CJK> */
+MAP(0x5E, 0x7C, 0x8C7B) /* <CJK> */
+MAP(0x5E, 0x7D, 0x8C7E) /* <CJK> */
+MAP(0x5E, 0x7E, 0x8C86) /* <CJK> */
+MAP(0x5F, 0x21, 0x8C87) /* <CJK> */
+MAP(0x5F, 0x22, 0x8C8B) /* <CJK> */
+MAP(0x5F, 0x23, 0x8C90) /* <CJK> */
+MAP(0x5F, 0x24, 0x8C92) /* <CJK> */
+MAP(0x5F, 0x25, 0x8C93) /* <CJK> */
+MAP(0x5F, 0x26, 0x8C99) /* <CJK> */
+MAP(0x5F, 0x27, 0x8C9B) /* <CJK> */
+MAP(0x5F, 0x28, 0x8C9C) /* <CJK> */
+MAP(0x5F, 0x29, 0x8CA4) /* <CJK> */
+MAP(0x5F, 0x2A, 0x8CB9) /* <CJK> */
+MAP(0x5F, 0x2B, 0x8CBA) /* <CJK> */
+MAP(0x5F, 0x2C, 0x8CC5) /* <CJK> */
+MAP(0x5F, 0x2D, 0x8CC6) /* <CJK> */
+MAP(0x5F, 0x2E, 0x8CC9) /* <CJK> */
+MAP(0x5F, 0x2F, 0x8CCB) /* <CJK> */
+MAP(0x5F, 0x30, 0x8CCF) /* <CJK> */
+MAP(0x5F, 0x31, 0x8CD6) /* <CJK> */
+MAP(0x5F, 0x32, 0x8CD5) /* <CJK> */
+MAP(0x5F, 0x33, 0x8CD9) /* <CJK> */
+MAP(0x5F, 0x34, 0x8CDD) /* <CJK> */
+MAP(0x5F, 0x35, 0x8CE1) /* <CJK> */
+MAP(0x5F, 0x36, 0x8CE8) /* <CJK> */
+MAP(0x5F, 0x37, 0x8CEC) /* <CJK> */
+MAP(0x5F, 0x38, 0x8CEF) /* <CJK> */
+MAP(0x5F, 0x39, 0x8CF0) /* <CJK> */
+MAP(0x5F, 0x3A, 0x8CF2) /* <CJK> */
+MAP(0x5F, 0x3B, 0x8CF5) /* <CJK> */
+MAP(0x5F, 0x3C, 0x8CF7) /* <CJK> */
+MAP(0x5F, 0x3D, 0x8CF8) /* <CJK> */
+MAP(0x5F, 0x3E, 0x8CFE) /* <CJK> */
+MAP(0x5F, 0x3F, 0x8CFF) /* <CJK> */
+MAP(0x5F, 0x40, 0x8D01) /* <CJK> */
+MAP(0x5F, 0x41, 0x8D03) /* <CJK> */
+MAP(0x5F, 0x42, 0x8D09) /* <CJK> */
+MAP(0x5F, 0x43, 0x8D12) /* <CJK> */
+MAP(0x5F, 0x44, 0x8D17) /* <CJK> */
+MAP(0x5F, 0x45, 0x8D1B) /* <CJK> */
+MAP(0x5F, 0x46, 0x8D65) /* <CJK> */
+MAP(0x5F, 0x47, 0x8D69) /* <CJK> */
+MAP(0x5F, 0x48, 0x8D6C) /* <CJK> */
+MAP(0x5F, 0x49, 0x8D6E) /* <CJK> */
+MAP(0x5F, 0x4A, 0x8D7F) /* <CJK> */
+MAP(0x5F, 0x4B, 0x8D82) /* <CJK> */
+MAP(0x5F, 0x4C, 0x8D84) /* <CJK> */
+MAP(0x5F, 0x4D, 0x8D88) /* <CJK> */
+MAP(0x5F, 0x4E, 0x8D8D) /* <CJK> */
+MAP(0x5F, 0x4F, 0x8D90) /* <CJK> */
+MAP(0x5F, 0x50, 0x8D91) /* <CJK> */
+MAP(0x5F, 0x51, 0x8D95) /* <CJK> */
+MAP(0x5F, 0x52, 0x8D9E) /* <CJK> */
+MAP(0x5F, 0x53, 0x8D9F) /* <CJK> */
+MAP(0x5F, 0x54, 0x8DA0) /* <CJK> */
+MAP(0x5F, 0x55, 0x8DA6) /* <CJK> */
+MAP(0x5F, 0x56, 0x8DAB) /* <CJK> */
+MAP(0x5F, 0x57, 0x8DAC) /* <CJK> */
+MAP(0x5F, 0x58, 0x8DAF) /* <CJK> */
+MAP(0x5F, 0x59, 0x8DB2) /* <CJK> */
+MAP(0x5F, 0x5A, 0x8DB5) /* <CJK> */
+MAP(0x5F, 0x5B, 0x8DB7) /* <CJK> */
+MAP(0x5F, 0x5C, 0x8DB9) /* <CJK> */
+MAP(0x5F, 0x5D, 0x8DBB) /* <CJK> */
+MAP(0x5F, 0x5E, 0x8DC0) /* <CJK> */
+MAP(0x5F, 0x5F, 0x8DC5) /* <CJK> */
+MAP(0x5F, 0x60, 0x8DC6) /* <CJK> */
+MAP(0x5F, 0x61, 0x8DC7) /* <CJK> */
+MAP(0x5F, 0x62, 0x8DC8) /* <CJK> */
+MAP(0x5F, 0x63, 0x8DCA) /* <CJK> */
+MAP(0x5F, 0x64, 0x8DCE) /* <CJK> */
+MAP(0x5F, 0x65, 0x8DD1) /* <CJK> */
+MAP(0x5F, 0x66, 0x8DD4) /* <CJK> */
+MAP(0x5F, 0x67, 0x8DD5) /* <CJK> */
+MAP(0x5F, 0x68, 0x8DD7) /* <CJK> */
+MAP(0x5F, 0x69, 0x8DD9) /* <CJK> */
+MAP(0x5F, 0x6A, 0x8DE4) /* <CJK> */
+MAP(0x5F, 0x6B, 0x8DE5) /* <CJK> */
+MAP(0x5F, 0x6C, 0x8DE7) /* <CJK> */
+MAP(0x5F, 0x6D, 0x8DEC) /* <CJK> */
+MAP(0x5F, 0x6E, 0x8DF0) /* <CJK> */
+MAP(0x5F, 0x6F, 0x8DBC) /* <CJK> */
+MAP(0x5F, 0x70, 0x8DF1) /* <CJK> */
+MAP(0x5F, 0x71, 0x8DF2) /* <CJK> */
+MAP(0x5F, 0x72, 0x8DF4) /* <CJK> */
+MAP(0x5F, 0x73, 0x8DFD) /* <CJK> */
+MAP(0x5F, 0x74, 0x8E01) /* <CJK> */
+MAP(0x5F, 0x75, 0x8E04) /* <CJK> */
+MAP(0x5F, 0x76, 0x8E05) /* <CJK> */
+MAP(0x5F, 0x77, 0x8E06) /* <CJK> */
+MAP(0x5F, 0x78, 0x8E0B) /* <CJK> */
+MAP(0x5F, 0x79, 0x8E11) /* <CJK> */
+MAP(0x5F, 0x7A, 0x8E14) /* <CJK> */
+MAP(0x5F, 0x7B, 0x8E16) /* <CJK> */
+MAP(0x5F, 0x7C, 0x8E20) /* <CJK> */
+MAP(0x5F, 0x7D, 0x8E21) /* <CJK> */
+MAP(0x5F, 0x7E, 0x8E22) /* <CJK> */
+MAP(0x60, 0x21, 0x8E23) /* <CJK> */
+MAP(0x60, 0x22, 0x8E26) /* <CJK> */
+MAP(0x60, 0x23, 0x8E27) /* <CJK> */
+MAP(0x60, 0x24, 0x8E31) /* <CJK> */
+MAP(0x60, 0x25, 0x8E33) /* <CJK> */
+MAP(0x60, 0x26, 0x8E36) /* <CJK> */
+MAP(0x60, 0x27, 0x8E37) /* <CJK> */
+MAP(0x60, 0x28, 0x8E38) /* <CJK> */
+MAP(0x60, 0x29, 0x8E39) /* <CJK> */
+MAP(0x60, 0x2A, 0x8E3D) /* <CJK> */
+MAP(0x60, 0x2B, 0x8E40) /* <CJK> */
+MAP(0x60, 0x2C, 0x8E41) /* <CJK> */
+MAP(0x60, 0x2D, 0x8E4B) /* <CJK> */
+MAP(0x60, 0x2E, 0x8E4D) /* <CJK> */
+MAP(0x60, 0x2F, 0x8E4E) /* <CJK> */
+MAP(0x60, 0x30, 0x8E4F) /* <CJK> */
+MAP(0x60, 0x31, 0x8E54) /* <CJK> */
+MAP(0x60, 0x32, 0x8E5B) /* <CJK> */
+MAP(0x60, 0x33, 0x8E5C) /* <CJK> */
+MAP(0x60, 0x34, 0x8E5D) /* <CJK> */
+MAP(0x60, 0x35, 0x8E5E) /* <CJK> */
+MAP(0x60, 0x36, 0x8E61) /* <CJK> */
+MAP(0x60, 0x37, 0x8E62) /* <CJK> */
+MAP(0x60, 0x38, 0x8E69) /* <CJK> */
+MAP(0x60, 0x39, 0x8E6C) /* <CJK> */
+MAP(0x60, 0x3A, 0x8E6D) /* <CJK> */
+MAP(0x60, 0x3B, 0x8E6F) /* <CJK> */
+MAP(0x60, 0x3C, 0x8E70) /* <CJK> */
+MAP(0x60, 0x3D, 0x8E71) /* <CJK> */
+MAP(0x60, 0x3E, 0x8E79) /* <CJK> */
+MAP(0x60, 0x3F, 0x8E7A) /* <CJK> */
+MAP(0x60, 0x40, 0x8E7B) /* <CJK> */
+MAP(0x60, 0x41, 0x8E82) /* <CJK> */
+MAP(0x60, 0x42, 0x8E83) /* <CJK> */
+MAP(0x60, 0x43, 0x8E89) /* <CJK> */
+MAP(0x60, 0x44, 0x8E90) /* <CJK> */
+MAP(0x60, 0x45, 0x8E92) /* <CJK> */
+MAP(0x60, 0x46, 0x8E95) /* <CJK> */
+MAP(0x60, 0x47, 0x8E9A) /* <CJK> */
+MAP(0x60, 0x48, 0x8E9B) /* <CJK> */
+MAP(0x60, 0x49, 0x8E9D) /* <CJK> */
+MAP(0x60, 0x4A, 0x8E9E) /* <CJK> */
+MAP(0x60, 0x4B, 0x8EA2) /* <CJK> */
+MAP(0x60, 0x4C, 0x8EA7) /* <CJK> */
+MAP(0x60, 0x4D, 0x8EA9) /* <CJK> */
+MAP(0x60, 0x4E, 0x8EAD) /* <CJK> */
+MAP(0x60, 0x4F, 0x8EAE) /* <CJK> */
+MAP(0x60, 0x50, 0x8EB3) /* <CJK> */
+MAP(0x60, 0x51, 0x8EB5) /* <CJK> */
+MAP(0x60, 0x52, 0x8EBA) /* <CJK> */
+MAP(0x60, 0x53, 0x8EBB) /* <CJK> */
+MAP(0x60, 0x54, 0x8EC0) /* <CJK> */
+MAP(0x60, 0x55, 0x8EC1) /* <CJK> */
+MAP(0x60, 0x56, 0x8EC3) /* <CJK> */
+MAP(0x60, 0x57, 0x8EC4) /* <CJK> */
+MAP(0x60, 0x58, 0x8EC7) /* <CJK> */
+MAP(0x60, 0x59, 0x8ECF) /* <CJK> */
+MAP(0x60, 0x5A, 0x8ED1) /* <CJK> */
+MAP(0x60, 0x5B, 0x8ED4) /* <CJK> */
+MAP(0x60, 0x5C, 0x8EDC) /* <CJK> */
+MAP(0x60, 0x5D, 0x8EE8) /* <CJK> */
+MAP(0x60, 0x5E, 0x8EEE) /* <CJK> */
+MAP(0x60, 0x5F, 0x8EF0) /* <CJK> */
+MAP(0x60, 0x60, 0x8EF1) /* <CJK> */
+MAP(0x60, 0x61, 0x8EF7) /* <CJK> */
+MAP(0x60, 0x62, 0x8EF9) /* <CJK> */
+MAP(0x60, 0x63, 0x8EFA) /* <CJK> */
+MAP(0x60, 0x64, 0x8EED) /* <CJK> */
+MAP(0x60, 0x65, 0x8F00) /* <CJK> */
+MAP(0x60, 0x66, 0x8F02) /* <CJK> */
+MAP(0x60, 0x67, 0x8F07) /* <CJK> */
+MAP(0x60, 0x68, 0x8F08) /* <CJK> */
+MAP(0x60, 0x69, 0x8F0F) /* <CJK> */
+MAP(0x60, 0x6A, 0x8F10) /* <CJK> */
+MAP(0x60, 0x6B, 0x8F16) /* <CJK> */
+MAP(0x60, 0x6C, 0x8F17) /* <CJK> */
+MAP(0x60, 0x6D, 0x8F18) /* <CJK> */
+MAP(0x60, 0x6E, 0x8F1E) /* <CJK> */
+MAP(0x60, 0x6F, 0x8F20) /* <CJK> */
+MAP(0x60, 0x70, 0x8F21) /* <CJK> */
+MAP(0x60, 0x71, 0x8F23) /* <CJK> */
+MAP(0x60, 0x72, 0x8F25) /* <CJK> */
+MAP(0x60, 0x73, 0x8F27) /* <CJK> */
+MAP(0x60, 0x74, 0x8F28) /* <CJK> */
+MAP(0x60, 0x75, 0x8F2C) /* <CJK> */
+MAP(0x60, 0x76, 0x8F2D) /* <CJK> */
+MAP(0x60, 0x77, 0x8F2E) /* <CJK> */
+MAP(0x60, 0x78, 0x8F34) /* <CJK> */
+MAP(0x60, 0x79, 0x8F35) /* <CJK> */
+MAP(0x60, 0x7A, 0x8F36) /* <CJK> */
+MAP(0x60, 0x7B, 0x8F37) /* <CJK> */
+MAP(0x60, 0x7C, 0x8F3A) /* <CJK> */
+MAP(0x60, 0x7D, 0x8F40) /* <CJK> */
+MAP(0x60, 0x7E, 0x8F41) /* <CJK> */
+MAP(0x61, 0x21, 0x8F43) /* <CJK> */
+MAP(0x61, 0x22, 0x8F47) /* <CJK> */
+MAP(0x61, 0x23, 0x8F4F) /* <CJK> */
+MAP(0x61, 0x24, 0x8F51) /* <CJK> */
+MAP(0x61, 0x25, 0x8F52) /* <CJK> */
+MAP(0x61, 0x26, 0x8F53) /* <CJK> */
+MAP(0x61, 0x27, 0x8F54) /* <CJK> */
+MAP(0x61, 0x28, 0x8F55) /* <CJK> */
+MAP(0x61, 0x29, 0x8F58) /* <CJK> */
+MAP(0x61, 0x2A, 0x8F5D) /* <CJK> */
+MAP(0x61, 0x2B, 0x8F5E) /* <CJK> */
+MAP(0x61, 0x2C, 0x8F65) /* <CJK> */
+MAP(0x61, 0x2D, 0x8F9D) /* <CJK> */
+MAP(0x61, 0x2E, 0x8FA0) /* <CJK> */
+MAP(0x61, 0x2F, 0x8FA1) /* <CJK> */
+MAP(0x61, 0x30, 0x8FA4) /* <CJK> */
+MAP(0x61, 0x31, 0x8FA5) /* <CJK> */
+MAP(0x61, 0x32, 0x8FA6) /* <CJK> */
+MAP(0x61, 0x33, 0x8FB5) /* <CJK> */
+MAP(0x61, 0x34, 0x8FB6) /* <CJK> */
+MAP(0x61, 0x35, 0x8FB8) /* <CJK> */
+MAP(0x61, 0x36, 0x8FBE) /* <CJK> */
+MAP(0x61, 0x37, 0x8FC0) /* <CJK> */
+MAP(0x61, 0x38, 0x8FC1) /* <CJK> */
+MAP(0x61, 0x39, 0x8FC6) /* <CJK> */
+MAP(0x61, 0x3A, 0x8FCA) /* <CJK> */
+MAP(0x61, 0x3B, 0x8FCB) /* <CJK> */
+MAP(0x61, 0x3C, 0x8FCD) /* <CJK> */
+MAP(0x61, 0x3D, 0x8FD0) /* <CJK> */
+MAP(0x61, 0x3E, 0x8FD2) /* <CJK> */
+MAP(0x61, 0x3F, 0x8FD3) /* <CJK> */
+MAP(0x61, 0x40, 0x8FD5) /* <CJK> */
+MAP(0x61, 0x41, 0x8FE0) /* <CJK> */
+MAP(0x61, 0x42, 0x8FE3) /* <CJK> */
+MAP(0x61, 0x43, 0x8FE4) /* <CJK> */
+MAP(0x61, 0x44, 0x8FE8) /* <CJK> */
+MAP(0x61, 0x45, 0x8FEE) /* <CJK> */
+MAP(0x61, 0x46, 0x8FF1) /* <CJK> */
+MAP(0x61, 0x47, 0x8FF5) /* <CJK> */
+MAP(0x61, 0x48, 0x8FF6) /* <CJK> */
+MAP(0x61, 0x49, 0x8FFB) /* <CJK> */
+MAP(0x61, 0x4A, 0x8FFE) /* <CJK> */
+MAP(0x61, 0x4B, 0x9002) /* <CJK> */
+MAP(0x61, 0x4C, 0x9004) /* <CJK> */
+MAP(0x61, 0x4D, 0x9008) /* <CJK> */
+MAP(0x61, 0x4E, 0x900C) /* <CJK> */
+MAP(0x61, 0x4F, 0x9018) /* <CJK> */
+MAP(0x61, 0x50, 0x901B) /* <CJK> */
+MAP(0x61, 0x51, 0x9028) /* <CJK> */
+MAP(0x61, 0x52, 0x9029) /* <CJK> */
+MAP(0x61, 0x53, 0x902F) /* <CJK> */
+MAP(0x61, 0x54, 0x902A) /* <CJK> */
+MAP(0x61, 0x55, 0x902C) /* <CJK> */
+MAP(0x61, 0x56, 0x902D) /* <CJK> */
+MAP(0x61, 0x57, 0x9033) /* <CJK> */
+MAP(0x61, 0x58, 0x9034) /* <CJK> */
+MAP(0x61, 0x59, 0x9037) /* <CJK> */
+MAP(0x61, 0x5A, 0x903F) /* <CJK> */
+MAP(0x61, 0x5B, 0x9043) /* <CJK> */
+MAP(0x61, 0x5C, 0x9044) /* <CJK> */
+MAP(0x61, 0x5D, 0x904C) /* <CJK> */
+MAP(0x61, 0x5E, 0x905B) /* <CJK> */
+MAP(0x61, 0x5F, 0x905D) /* <CJK> */
+MAP(0x61, 0x60, 0x9062) /* <CJK> */
+MAP(0x61, 0x61, 0x9066) /* <CJK> */
+MAP(0x61, 0x62, 0x9067) /* <CJK> */
+MAP(0x61, 0x63, 0x906C) /* <CJK> */
+MAP(0x61, 0x64, 0x9070) /* <CJK> */
+MAP(0x61, 0x65, 0x9074) /* <CJK> */
+MAP(0x61, 0x66, 0x9079) /* <CJK> */
+MAP(0x61, 0x67, 0x9085) /* <CJK> */
+MAP(0x61, 0x68, 0x9088) /* <CJK> */
+MAP(0x61, 0x69, 0x908B) /* <CJK> */
+MAP(0x61, 0x6A, 0x908C) /* <CJK> */
+MAP(0x61, 0x6B, 0x908E) /* <CJK> */
+MAP(0x61, 0x6C, 0x9090) /* <CJK> */
+MAP(0x61, 0x6D, 0x9095) /* <CJK> */
+MAP(0x61, 0x6E, 0x9097) /* <CJK> */
+MAP(0x61, 0x6F, 0x9098) /* <CJK> */
+MAP(0x61, 0x70, 0x9099) /* <CJK> */
+MAP(0x61, 0x71, 0x909B) /* <CJK> */
+MAP(0x61, 0x72, 0x90A0) /* <CJK> */
+MAP(0x61, 0x73, 0x90A1) /* <CJK> */
+MAP(0x61, 0x74, 0x90A2) /* <CJK> */
+MAP(0x61, 0x75, 0x90A5) /* <CJK> */
+MAP(0x61, 0x76, 0x90B0) /* <CJK> */
+MAP(0x61, 0x77, 0x90B2) /* <CJK> */
+MAP(0x61, 0x78, 0x90B3) /* <CJK> */
+MAP(0x61, 0x79, 0x90B4) /* <CJK> */
+MAP(0x61, 0x7A, 0x90B6) /* <CJK> */
+MAP(0x61, 0x7B, 0x90BD) /* <CJK> */
+MAP(0x61, 0x7C, 0x90CC) /* <CJK> */
+MAP(0x61, 0x7D, 0x90BE) /* <CJK> */
+MAP(0x61, 0x7E, 0x90C3) /* <CJK> */
+MAP(0x62, 0x21, 0x90C4) /* <CJK> */
+MAP(0x62, 0x22, 0x90C5) /* <CJK> */
+MAP(0x62, 0x23, 0x90C7) /* <CJK> */
+MAP(0x62, 0x24, 0x90C8) /* <CJK> */
+MAP(0x62, 0x25, 0x90D5) /* <CJK> */
+MAP(0x62, 0x26, 0x90D7) /* <CJK> */
+MAP(0x62, 0x27, 0x90D8) /* <CJK> */
+MAP(0x62, 0x28, 0x90D9) /* <CJK> */
+MAP(0x62, 0x29, 0x90DC) /* <CJK> */
+MAP(0x62, 0x2A, 0x90DD) /* <CJK> */
+MAP(0x62, 0x2B, 0x90DF) /* <CJK> */
+MAP(0x62, 0x2C, 0x90E5) /* <CJK> */
+MAP(0x62, 0x2D, 0x90D2) /* <CJK> */
+MAP(0x62, 0x2E, 0x90F6) /* <CJK> */
+MAP(0x62, 0x2F, 0x90EB) /* <CJK> */
+MAP(0x62, 0x30, 0x90EF) /* <CJK> */
+MAP(0x62, 0x31, 0x90F0) /* <CJK> */
+MAP(0x62, 0x32, 0x90F4) /* <CJK> */
+MAP(0x62, 0x33, 0x90FE) /* <CJK> */
+MAP(0x62, 0x34, 0x90FF) /* <CJK> */
+MAP(0x62, 0x35, 0x9100) /* <CJK> */
+MAP(0x62, 0x36, 0x9104) /* <CJK> */
+MAP(0x62, 0x37, 0x9105) /* <CJK> */
+MAP(0x62, 0x38, 0x9106) /* <CJK> */
+MAP(0x62, 0x39, 0x9108) /* <CJK> */
+MAP(0x62, 0x3A, 0x910D) /* <CJK> */
+MAP(0x62, 0x3B, 0x9110) /* <CJK> */
+MAP(0x62, 0x3C, 0x9114) /* <CJK> */
+MAP(0x62, 0x3D, 0x9116) /* <CJK> */
+MAP(0x62, 0x3E, 0x9117) /* <CJK> */
+MAP(0x62, 0x3F, 0x9118) /* <CJK> */
+MAP(0x62, 0x40, 0x911A) /* <CJK> */
+MAP(0x62, 0x41, 0x911C) /* <CJK> */
+MAP(0x62, 0x42, 0x911E) /* <CJK> */
+MAP(0x62, 0x43, 0x9120) /* <CJK> */
+MAP(0x62, 0x44, 0x9125) /* <CJK> */
+MAP(0x62, 0x45, 0x9122) /* <CJK> */
+MAP(0x62, 0x46, 0x9123) /* <CJK> */
+MAP(0x62, 0x47, 0x9127) /* <CJK> */
+MAP(0x62, 0x48, 0x9129) /* <CJK> */
+MAP(0x62, 0x49, 0x912E) /* <CJK> */
+MAP(0x62, 0x4A, 0x912F) /* <CJK> */
+MAP(0x62, 0x4B, 0x9131) /* <CJK> */
+MAP(0x62, 0x4C, 0x9134) /* <CJK> */
+MAP(0x62, 0x4D, 0x9136) /* <CJK> */
+MAP(0x62, 0x4E, 0x9137) /* <CJK> */
+MAP(0x62, 0x4F, 0x9139) /* <CJK> */
+MAP(0x62, 0x50, 0x913A) /* <CJK> */
+MAP(0x62, 0x51, 0x913C) /* <CJK> */
+MAP(0x62, 0x52, 0x913D) /* <CJK> */
+MAP(0x62, 0x53, 0x9143) /* <CJK> */
+MAP(0x62, 0x54, 0x9147) /* <CJK> */
+MAP(0x62, 0x55, 0x9148) /* <CJK> */
+MAP(0x62, 0x56, 0x914F) /* <CJK> */
+MAP(0x62, 0x57, 0x9153) /* <CJK> */
+MAP(0x62, 0x58, 0x9157) /* <CJK> */
+MAP(0x62, 0x59, 0x9159) /* <CJK> */
+MAP(0x62, 0x5A, 0x915A) /* <CJK> */
+MAP(0x62, 0x5B, 0x915B) /* <CJK> */
+MAP(0x62, 0x5C, 0x9161) /* <CJK> */
+MAP(0x62, 0x5D, 0x9164) /* <CJK> */
+MAP(0x62, 0x5E, 0x9167) /* <CJK> */
+MAP(0x62, 0x5F, 0x916D) /* <CJK> */
+MAP(0x62, 0x60, 0x9174) /* <CJK> */
+MAP(0x62, 0x61, 0x9179) /* <CJK> */
+MAP(0x62, 0x62, 0x917A) /* <CJK> */
+MAP(0x62, 0x63, 0x917B) /* <CJK> */
+MAP(0x62, 0x64, 0x9181) /* <CJK> */
+MAP(0x62, 0x65, 0x9183) /* <CJK> */
+MAP(0x62, 0x66, 0x9185) /* <CJK> */
+MAP(0x62, 0x67, 0x9186) /* <CJK> */
+MAP(0x62, 0x68, 0x918A) /* <CJK> */
+MAP(0x62, 0x69, 0x918E) /* <CJK> */
+MAP(0x62, 0x6A, 0x9191) /* <CJK> */
+MAP(0x62, 0x6B, 0x9193) /* <CJK> */
+MAP(0x62, 0x6C, 0x9194) /* <CJK> */
+MAP(0x62, 0x6D, 0x9195) /* <CJK> */
+MAP(0x62, 0x6E, 0x9198) /* <CJK> */
+MAP(0x62, 0x6F, 0x919E) /* <CJK> */
+MAP(0x62, 0x70, 0x91A1) /* <CJK> */
+MAP(0x62, 0x71, 0x91A6) /* <CJK> */
+MAP(0x62, 0x72, 0x91A8) /* <CJK> */
+MAP(0x62, 0x73, 0x91AC) /* <CJK> */
+MAP(0x62, 0x74, 0x91AD) /* <CJK> */
+MAP(0x62, 0x75, 0x91AE) /* <CJK> */
+MAP(0x62, 0x76, 0x91B0) /* <CJK> */
+MAP(0x62, 0x77, 0x91B1) /* <CJK> */
+MAP(0x62, 0x78, 0x91B2) /* <CJK> */
+MAP(0x62, 0x79, 0x91B3) /* <CJK> */
+MAP(0x62, 0x7A, 0x91B6) /* <CJK> */
+MAP(0x62, 0x7B, 0x91BB) /* <CJK> */
+MAP(0x62, 0x7C, 0x91BC) /* <CJK> */
+MAP(0x62, 0x7D, 0x91BD) /* <CJK> */
+MAP(0x62, 0x7E, 0x91BF) /* <CJK> */
+MAP(0x63, 0x21, 0x91C2) /* <CJK> */
+MAP(0x63, 0x22, 0x91C3) /* <CJK> */
+MAP(0x63, 0x23, 0x91C5) /* <CJK> */
+MAP(0x63, 0x24, 0x91D3) /* <CJK> */
+MAP(0x63, 0x25, 0x91D4) /* <CJK> */
+MAP(0x63, 0x26, 0x91D7) /* <CJK> */
+MAP(0x63, 0x27, 0x91D9) /* <CJK> */
+MAP(0x63, 0x28, 0x91DA) /* <CJK> */
+MAP(0x63, 0x29, 0x91DE) /* <CJK> */
+MAP(0x63, 0x2A, 0x91E4) /* <CJK> */
+MAP(0x63, 0x2B, 0x91E5) /* <CJK> */
+MAP(0x63, 0x2C, 0x91E9) /* <CJK> */
+MAP(0x63, 0x2D, 0x91EA) /* <CJK> */
+MAP(0x63, 0x2E, 0x91EC) /* <CJK> */
+MAP(0x63, 0x2F, 0x91ED) /* <CJK> */
+MAP(0x63, 0x30, 0x91EE) /* <CJK> */
+MAP(0x63, 0x31, 0x91EF) /* <CJK> */
+MAP(0x63, 0x32, 0x91F0) /* <CJK> */
+MAP(0x63, 0x33, 0x91F1) /* <CJK> */
+MAP(0x63, 0x34, 0x91F7) /* <CJK> */
+MAP(0x63, 0x35, 0x91F9) /* <CJK> */
+MAP(0x63, 0x36, 0x91FB) /* <CJK> */
+MAP(0x63, 0x37, 0x91FD) /* <CJK> */
+MAP(0x63, 0x38, 0x9200) /* <CJK> */
+MAP(0x63, 0x39, 0x9201) /* <CJK> */
+MAP(0x63, 0x3A, 0x9204) /* <CJK> */
+MAP(0x63, 0x3B, 0x9205) /* <CJK> */
+MAP(0x63, 0x3C, 0x9206) /* <CJK> */
+MAP(0x63, 0x3D, 0x9207) /* <CJK> */
+MAP(0x63, 0x3E, 0x9209) /* <CJK> */
+MAP(0x63, 0x3F, 0x920A) /* <CJK> */
+MAP(0x63, 0x40, 0x920C) /* <CJK> */
+MAP(0x63, 0x41, 0x9210) /* <CJK> */
+MAP(0x63, 0x42, 0x9212) /* <CJK> */
+MAP(0x63, 0x43, 0x9213) /* <CJK> */
+MAP(0x63, 0x44, 0x9216) /* <CJK> */
+MAP(0x63, 0x45, 0x9218) /* <CJK> */
+MAP(0x63, 0x46, 0x921C) /* <CJK> */
+MAP(0x63, 0x47, 0x921D) /* <CJK> */
+MAP(0x63, 0x48, 0x9223) /* <CJK> */
+MAP(0x63, 0x49, 0x9224) /* <CJK> */
+MAP(0x63, 0x4A, 0x9225) /* <CJK> */
+MAP(0x63, 0x4B, 0x9226) /* <CJK> */
+MAP(0x63, 0x4C, 0x9228) /* <CJK> */
+MAP(0x63, 0x4D, 0x922E) /* <CJK> */
+MAP(0x63, 0x4E, 0x922F) /* <CJK> */
+MAP(0x63, 0x4F, 0x9230) /* <CJK> */
+MAP(0x63, 0x50, 0x9233) /* <CJK> */
+MAP(0x63, 0x51, 0x9235) /* <CJK> */
+MAP(0x63, 0x52, 0x9236) /* <CJK> */
+MAP(0x63, 0x53, 0x9238) /* <CJK> */
+MAP(0x63, 0x54, 0x9239) /* <CJK> */
+MAP(0x63, 0x55, 0x923A) /* <CJK> */
+MAP(0x63, 0x56, 0x923C) /* <CJK> */
+MAP(0x63, 0x57, 0x923E) /* <CJK> */
+MAP(0x63, 0x58, 0x9240) /* <CJK> */
+MAP(0x63, 0x59, 0x9242) /* <CJK> */
+MAP(0x63, 0x5A, 0x9243) /* <CJK> */
+MAP(0x63, 0x5B, 0x9246) /* <CJK> */
+MAP(0x63, 0x5C, 0x9247) /* <CJK> */
+MAP(0x63, 0x5D, 0x924A) /* <CJK> */
+MAP(0x63, 0x5E, 0x924D) /* <CJK> */
+MAP(0x63, 0x5F, 0x924E) /* <CJK> */
+MAP(0x63, 0x60, 0x924F) /* <CJK> */
+MAP(0x63, 0x61, 0x9251) /* <CJK> */
+MAP(0x63, 0x62, 0x9258) /* <CJK> */
+MAP(0x63, 0x63, 0x9259) /* <CJK> */
+MAP(0x63, 0x64, 0x925C) /* <CJK> */
+MAP(0x63, 0x65, 0x925D) /* <CJK> */
+MAP(0x63, 0x66, 0x9260) /* <CJK> */
+MAP(0x63, 0x67, 0x9261) /* <CJK> */
+MAP(0x63, 0x68, 0x9265) /* <CJK> */
+MAP(0x63, 0x69, 0x9267) /* <CJK> */
+MAP(0x63, 0x6A, 0x9268) /* <CJK> */
+MAP(0x63, 0x6B, 0x9269) /* <CJK> */
+MAP(0x63, 0x6C, 0x926E) /* <CJK> */
+MAP(0x63, 0x6D, 0x926F) /* <CJK> */
+MAP(0x63, 0x6E, 0x9270) /* <CJK> */
+MAP(0x63, 0x6F, 0x9275) /* <CJK> */
+MAP(0x63, 0x70, 0x9276) /* <CJK> */
+MAP(0x63, 0x71, 0x9277) /* <CJK> */
+MAP(0x63, 0x72, 0x9278) /* <CJK> */
+MAP(0x63, 0x73, 0x9279) /* <CJK> */
+MAP(0x63, 0x74, 0x927B) /* <CJK> */
+MAP(0x63, 0x75, 0x927C) /* <CJK> */
+MAP(0x63, 0x76, 0x927D) /* <CJK> */
+MAP(0x63, 0x77, 0x927F) /* <CJK> */
+MAP(0x63, 0x78, 0x9288) /* <CJK> */
+MAP(0x63, 0x79, 0x9289) /* <CJK> */
+MAP(0x63, 0x7A, 0x928A) /* <CJK> */
+MAP(0x63, 0x7B, 0x928D) /* <CJK> */
+MAP(0x63, 0x7C, 0x928E) /* <CJK> */
+MAP(0x63, 0x7D, 0x9292) /* <CJK> */
+MAP(0x63, 0x7E, 0x9297) /* <CJK> */
+MAP(0x64, 0x21, 0x9299) /* <CJK> */
+MAP(0x64, 0x22, 0x929F) /* <CJK> */
+MAP(0x64, 0x23, 0x92A0) /* <CJK> */
+MAP(0x64, 0x24, 0x92A4) /* <CJK> */
+MAP(0x64, 0x25, 0x92A5) /* <CJK> */
+MAP(0x64, 0x26, 0x92A7) /* <CJK> */
+MAP(0x64, 0x27, 0x92A8) /* <CJK> */
+MAP(0x64, 0x28, 0x92AB) /* <CJK> */
+MAP(0x64, 0x29, 0x92AF) /* <CJK> */
+MAP(0x64, 0x2A, 0x92B2) /* <CJK> */
+MAP(0x64, 0x2B, 0x92B6) /* <CJK> */
+MAP(0x64, 0x2C, 0x92B8) /* <CJK> */
+MAP(0x64, 0x2D, 0x92BA) /* <CJK> */
+MAP(0x64, 0x2E, 0x92BB) /* <CJK> */
+MAP(0x64, 0x2F, 0x92BC) /* <CJK> */
+MAP(0x64, 0x30, 0x92BD) /* <CJK> */
+MAP(0x64, 0x31, 0x92BF) /* <CJK> */
+MAP(0x64, 0x32, 0x92C0) /* <CJK> */
+MAP(0x64, 0x33, 0x92C1) /* <CJK> */
+MAP(0x64, 0x34, 0x92C2) /* <CJK> */
+MAP(0x64, 0x35, 0x92C3) /* <CJK> */
+MAP(0x64, 0x36, 0x92C5) /* <CJK> */
+MAP(0x64, 0x37, 0x92C6) /* <CJK> */
+MAP(0x64, 0x38, 0x92C7) /* <CJK> */
+MAP(0x64, 0x39, 0x92C8) /* <CJK> */
+MAP(0x64, 0x3A, 0x92CB) /* <CJK> */
+MAP(0x64, 0x3B, 0x92CC) /* <CJK> */
+MAP(0x64, 0x3C, 0x92CD) /* <CJK> */
+MAP(0x64, 0x3D, 0x92CE) /* <CJK> */
+MAP(0x64, 0x3E, 0x92D0) /* <CJK> */
+MAP(0x64, 0x3F, 0x92D3) /* <CJK> */
+MAP(0x64, 0x40, 0x92D5) /* <CJK> */
+MAP(0x64, 0x41, 0x92D7) /* <CJK> */
+MAP(0x64, 0x42, 0x92D8) /* <CJK> */
+MAP(0x64, 0x43, 0x92D9) /* <CJK> */
+MAP(0x64, 0x44, 0x92DC) /* <CJK> */
+MAP(0x64, 0x45, 0x92DD) /* <CJK> */
+MAP(0x64, 0x46, 0x92DF) /* <CJK> */
+MAP(0x64, 0x47, 0x92E0) /* <CJK> */
+MAP(0x64, 0x48, 0x92E1) /* <CJK> */
+MAP(0x64, 0x49, 0x92E3) /* <CJK> */
+MAP(0x64, 0x4A, 0x92E5) /* <CJK> */
+MAP(0x64, 0x4B, 0x92E7) /* <CJK> */
+MAP(0x64, 0x4C, 0x92E8) /* <CJK> */
+MAP(0x64, 0x4D, 0x92EC) /* <CJK> */
+MAP(0x64, 0x4E, 0x92EE) /* <CJK> */
+MAP(0x64, 0x4F, 0x92F0) /* <CJK> */
+MAP(0x64, 0x50, 0x92F9) /* <CJK> */
+MAP(0x64, 0x51, 0x92FB) /* <CJK> */
+MAP(0x64, 0x52, 0x92FF) /* <CJK> */
+MAP(0x64, 0x53, 0x9300) /* <CJK> */
+MAP(0x64, 0x54, 0x9302) /* <CJK> */
+MAP(0x64, 0x55, 0x9308) /* <CJK> */
+MAP(0x64, 0x56, 0x930D) /* <CJK> */
+MAP(0x64, 0x57, 0x9311) /* <CJK> */
+MAP(0x64, 0x58, 0x9314) /* <CJK> */
+MAP(0x64, 0x59, 0x9315) /* <CJK> */
+MAP(0x64, 0x5A, 0x931C) /* <CJK> */
+MAP(0x64, 0x5B, 0x931D) /* <CJK> */
+MAP(0x64, 0x5C, 0x931E) /* <CJK> */
+MAP(0x64, 0x5D, 0x931F) /* <CJK> */
+MAP(0x64, 0x5E, 0x9321) /* <CJK> */
+MAP(0x64, 0x5F, 0x9324) /* <CJK> */
+MAP(0x64, 0x60, 0x9325) /* <CJK> */
+MAP(0x64, 0x61, 0x9327) /* <CJK> */
+MAP(0x64, 0x62, 0x9329) /* <CJK> */
+MAP(0x64, 0x63, 0x932A) /* <CJK> */
+MAP(0x64, 0x64, 0x9333) /* <CJK> */
+MAP(0x64, 0x65, 0x9334) /* <CJK> */
+MAP(0x64, 0x66, 0x9336) /* <CJK> */
+MAP(0x64, 0x67, 0x9337) /* <CJK> */
+MAP(0x64, 0x68, 0x9347) /* <CJK> */
+MAP(0x64, 0x69, 0x9348) /* <CJK> */
+MAP(0x64, 0x6A, 0x9349) /* <CJK> */
+MAP(0x64, 0x6B, 0x9350) /* <CJK> */
+MAP(0x64, 0x6C, 0x9351) /* <CJK> */
+MAP(0x64, 0x6D, 0x9352) /* <CJK> */
+MAP(0x64, 0x6E, 0x9355) /* <CJK> */
+MAP(0x64, 0x6F, 0x9357) /* <CJK> */
+MAP(0x64, 0x70, 0x9358) /* <CJK> */
+MAP(0x64, 0x71, 0x935A) /* <CJK> */
+MAP(0x64, 0x72, 0x935E) /* <CJK> */
+MAP(0x64, 0x73, 0x9364) /* <CJK> */
+MAP(0x64, 0x74, 0x9365) /* <CJK> */
+MAP(0x64, 0x75, 0x9367) /* <CJK> */
+MAP(0x64, 0x76, 0x9369) /* <CJK> */
+MAP(0x64, 0x77, 0x936A) /* <CJK> */
+MAP(0x64, 0x78, 0x936D) /* <CJK> */
+MAP(0x64, 0x79, 0x936F) /* <CJK> */
+MAP(0x64, 0x7A, 0x9370) /* <CJK> */
+MAP(0x64, 0x7B, 0x9371) /* <CJK> */
+MAP(0x64, 0x7C, 0x9373) /* <CJK> */
+MAP(0x64, 0x7D, 0x9374) /* <CJK> */
+MAP(0x64, 0x7E, 0x9376) /* <CJK> */
+MAP(0x65, 0x21, 0x937A) /* <CJK> */
+MAP(0x65, 0x22, 0x937D) /* <CJK> */
+MAP(0x65, 0x23, 0x937F) /* <CJK> */
+MAP(0x65, 0x24, 0x9380) /* <CJK> */
+MAP(0x65, 0x25, 0x9381) /* <CJK> */
+MAP(0x65, 0x26, 0x9382) /* <CJK> */
+MAP(0x65, 0x27, 0x9388) /* <CJK> */
+MAP(0x65, 0x28, 0x938A) /* <CJK> */
+MAP(0x65, 0x29, 0x938B) /* <CJK> */
+MAP(0x65, 0x2A, 0x938D) /* <CJK> */
+MAP(0x65, 0x2B, 0x938F) /* <CJK> */
+MAP(0x65, 0x2C, 0x9392) /* <CJK> */
+MAP(0x65, 0x2D, 0x9395) /* <CJK> */
+MAP(0x65, 0x2E, 0x9398) /* <CJK> */
+MAP(0x65, 0x2F, 0x939B) /* <CJK> */
+MAP(0x65, 0x30, 0x939E) /* <CJK> */
+MAP(0x65, 0x31, 0x93A1) /* <CJK> */
+MAP(0x65, 0x32, 0x93A3) /* <CJK> */
+MAP(0x65, 0x33, 0x93A4) /* <CJK> */
+MAP(0x65, 0x34, 0x93A6) /* <CJK> */
+MAP(0x65, 0x35, 0x93A8) /* <CJK> */
+MAP(0x65, 0x36, 0x93AB) /* <CJK> */
+MAP(0x65, 0x37, 0x93B4) /* <CJK> */
+MAP(0x65, 0x38, 0x93B5) /* <CJK> */
+MAP(0x65, 0x39, 0x93B6) /* <CJK> */
+MAP(0x65, 0x3A, 0x93BA) /* <CJK> */
+MAP(0x65, 0x3B, 0x93A9) /* <CJK> */
+MAP(0x65, 0x3C, 0x93C1) /* <CJK> */
+MAP(0x65, 0x3D, 0x93C4) /* <CJK> */
+MAP(0x65, 0x3E, 0x93C5) /* <CJK> */
+MAP(0x65, 0x3F, 0x93C6) /* <CJK> */
+MAP(0x65, 0x40, 0x93C7) /* <CJK> */
+MAP(0x65, 0x41, 0x93C9) /* <CJK> */
+MAP(0x65, 0x42, 0x93CA) /* <CJK> */
+MAP(0x65, 0x43, 0x93CB) /* <CJK> */
+MAP(0x65, 0x44, 0x93CC) /* <CJK> */
+MAP(0x65, 0x45, 0x93CD) /* <CJK> */
+MAP(0x65, 0x46, 0x93D3) /* <CJK> */
+MAP(0x65, 0x47, 0x93D9) /* <CJK> */
+MAP(0x65, 0x48, 0x93DC) /* <CJK> */
+MAP(0x65, 0x49, 0x93DE) /* <CJK> */
+MAP(0x65, 0x4A, 0x93DF) /* <CJK> */
+MAP(0x65, 0x4B, 0x93E2) /* <CJK> */
+MAP(0x65, 0x4C, 0x93E6) /* <CJK> */
+MAP(0x65, 0x4D, 0x93E7) /* <CJK> */
+MAP(0x65, 0x4E, 0x93F9) /* <CJK> */
+MAP(0x65, 0x4F, 0x93F7) /* <CJK> */
+MAP(0x65, 0x50, 0x93F8) /* <CJK> */
+MAP(0x65, 0x51, 0x93FA) /* <CJK> */
+MAP(0x65, 0x52, 0x93FB) /* <CJK> */
+MAP(0x65, 0x53, 0x93FD) /* <CJK> */
+MAP(0x65, 0x54, 0x9401) /* <CJK> */
+MAP(0x65, 0x55, 0x9402) /* <CJK> */
+MAP(0x65, 0x56, 0x9404) /* <CJK> */
+MAP(0x65, 0x57, 0x9408) /* <CJK> */
+MAP(0x65, 0x58, 0x9409) /* <CJK> */
+MAP(0x65, 0x59, 0x940D) /* <CJK> */
+MAP(0x65, 0x5A, 0x940E) /* <CJK> */
+MAP(0x65, 0x5B, 0x940F) /* <CJK> */
+MAP(0x65, 0x5C, 0x9415) /* <CJK> */
+MAP(0x65, 0x5D, 0x9416) /* <CJK> */
+MAP(0x65, 0x5E, 0x9417) /* <CJK> */
+MAP(0x65, 0x5F, 0x941F) /* <CJK> */
+MAP(0x65, 0x60, 0x942E) /* <CJK> */
+MAP(0x65, 0x61, 0x942F) /* <CJK> */
+MAP(0x65, 0x62, 0x9431) /* <CJK> */
+MAP(0x65, 0x63, 0x9432) /* <CJK> */
+MAP(0x65, 0x64, 0x9433) /* <CJK> */
+MAP(0x65, 0x65, 0x9434) /* <CJK> */
+MAP(0x65, 0x66, 0x943B) /* <CJK> */
+MAP(0x65, 0x67, 0x943F) /* <CJK> */
+MAP(0x65, 0x68, 0x943D) /* <CJK> */
+MAP(0x65, 0x69, 0x9443) /* <CJK> */
+MAP(0x65, 0x6A, 0x9445) /* <CJK> */
+MAP(0x65, 0x6B, 0x9448) /* <CJK> */
+MAP(0x65, 0x6C, 0x944A) /* <CJK> */
+MAP(0x65, 0x6D, 0x944C) /* <CJK> */
+MAP(0x65, 0x6E, 0x9455) /* <CJK> */
+MAP(0x65, 0x6F, 0x9459) /* <CJK> */
+MAP(0x65, 0x70, 0x945C) /* <CJK> */
+MAP(0x65, 0x71, 0x945F) /* <CJK> */
+MAP(0x65, 0x72, 0x9461) /* <CJK> */
+MAP(0x65, 0x73, 0x9463) /* <CJK> */
+MAP(0x65, 0x74, 0x9468) /* <CJK> */
+MAP(0x65, 0x75, 0x946B) /* <CJK> */
+MAP(0x65, 0x76, 0x946D) /* <CJK> */
+MAP(0x65, 0x77, 0x946E) /* <CJK> */
+MAP(0x65, 0x78, 0x946F) /* <CJK> */
+MAP(0x65, 0x79, 0x9471) /* <CJK> */
+MAP(0x65, 0x7A, 0x9472) /* <CJK> */
+MAP(0x65, 0x7B, 0x9484) /* <CJK> */
+MAP(0x65, 0x7C, 0x9483) /* <CJK> */
+MAP(0x65, 0x7D, 0x9578) /* <CJK> */
+MAP(0x65, 0x7E, 0x9579) /* <CJK> */
+MAP(0x66, 0x21, 0x957E) /* <CJK> */
+MAP(0x66, 0x22, 0x9584) /* <CJK> */
+MAP(0x66, 0x23, 0x9588) /* <CJK> */
+MAP(0x66, 0x24, 0x958C) /* <CJK> */
+MAP(0x66, 0x25, 0x958D) /* <CJK> */
+MAP(0x66, 0x26, 0x958E) /* <CJK> */
+MAP(0x66, 0x27, 0x959D) /* <CJK> */
+MAP(0x66, 0x28, 0x959E) /* <CJK> */
+MAP(0x66, 0x29, 0x959F) /* <CJK> */
+MAP(0x66, 0x2A, 0x95A1) /* <CJK> */
+MAP(0x66, 0x2B, 0x95A6) /* <CJK> */
+MAP(0x66, 0x2C, 0x95A9) /* <CJK> */
+MAP(0x66, 0x2D, 0x95AB) /* <CJK> */
+MAP(0x66, 0x2E, 0x95AC) /* <CJK> */
+MAP(0x66, 0x2F, 0x95B4) /* <CJK> */
+MAP(0x66, 0x30, 0x95B6) /* <CJK> */
+MAP(0x66, 0x31, 0x95BA) /* <CJK> */
+MAP(0x66, 0x32, 0x95BD) /* <CJK> */
+MAP(0x66, 0x33, 0x95BF) /* <CJK> */
+MAP(0x66, 0x34, 0x95C6) /* <CJK> */
+MAP(0x66, 0x35, 0x95C8) /* <CJK> */
+MAP(0x66, 0x36, 0x95C9) /* <CJK> */
+MAP(0x66, 0x37, 0x95CB) /* <CJK> */
+MAP(0x66, 0x38, 0x95D0) /* <CJK> */
+MAP(0x66, 0x39, 0x95D1) /* <CJK> */
+MAP(0x66, 0x3A, 0x95D2) /* <CJK> */
+MAP(0x66, 0x3B, 0x95D3) /* <CJK> */
+MAP(0x66, 0x3C, 0x95D9) /* <CJK> */
+MAP(0x66, 0x3D, 0x95DA) /* <CJK> */
+MAP(0x66, 0x3E, 0x95DD) /* <CJK> */
+MAP(0x66, 0x3F, 0x95DE) /* <CJK> */
+MAP(0x66, 0x40, 0x95DF) /* <CJK> */
+MAP(0x66, 0x41, 0x95E0) /* <CJK> */
+MAP(0x66, 0x42, 0x95E4) /* <CJK> */
+MAP(0x66, 0x43, 0x95E6) /* <CJK> */
+MAP(0x66, 0x44, 0x961D) /* <CJK> */
+MAP(0x66, 0x45, 0x961E) /* <CJK> */
+MAP(0x66, 0x46, 0x9622) /* <CJK> */
+MAP(0x66, 0x47, 0x9624) /* <CJK> */
+MAP(0x66, 0x48, 0x9625) /* <CJK> */
+MAP(0x66, 0x49, 0x9626) /* <CJK> */
+MAP(0x66, 0x4A, 0x962C) /* <CJK> */
+MAP(0x66, 0x4B, 0x9631) /* <CJK> */
+MAP(0x66, 0x4C, 0x9633) /* <CJK> */
+MAP(0x66, 0x4D, 0x9637) /* <CJK> */
+MAP(0x66, 0x4E, 0x9638) /* <CJK> */
+MAP(0x66, 0x4F, 0x9639) /* <CJK> */
+MAP(0x66, 0x50, 0x963A) /* <CJK> */
+MAP(0x66, 0x51, 0x963C) /* <CJK> */
+MAP(0x66, 0x52, 0x963D) /* <CJK> */
+MAP(0x66, 0x53, 0x9641) /* <CJK> */
+MAP(0x66, 0x54, 0x9652) /* <CJK> */
+MAP(0x66, 0x55, 0x9654) /* <CJK> */
+MAP(0x66, 0x56, 0x9656) /* <CJK> */
+MAP(0x66, 0x57, 0x9657) /* <CJK> */
+MAP(0x66, 0x58, 0x9658) /* <CJK> */
+MAP(0x66, 0x59, 0x9661) /* <CJK> */
+MAP(0x66, 0x5A, 0x966E) /* <CJK> */
+MAP(0x66, 0x5B, 0x9674) /* <CJK> */
+MAP(0x66, 0x5C, 0x967B) /* <CJK> */
+MAP(0x66, 0x5D, 0x967C) /* <CJK> */
+MAP(0x66, 0x5E, 0x967E) /* <CJK> */
+MAP(0x66, 0x5F, 0x967F) /* <CJK> */
+MAP(0x66, 0x60, 0x9681) /* <CJK> */
+MAP(0x66, 0x61, 0x9682) /* <CJK> */
+MAP(0x66, 0x62, 0x9683) /* <CJK> */
+MAP(0x66, 0x63, 0x9684) /* <CJK> */
+MAP(0x66, 0x64, 0x9689) /* <CJK> */
+MAP(0x66, 0x65, 0x9691) /* <CJK> */
+MAP(0x66, 0x66, 0x9696) /* <CJK> */
+MAP(0x66, 0x67, 0x969A) /* <CJK> */
+MAP(0x66, 0x68, 0x969D) /* <CJK> */
+MAP(0x66, 0x69, 0x969F) /* <CJK> */
+MAP(0x66, 0x6A, 0x96A4) /* <CJK> */
+MAP(0x66, 0x6B, 0x96A5) /* <CJK> */
+MAP(0x66, 0x6C, 0x96A6) /* <CJK> */
+MAP(0x66, 0x6D, 0x96A9) /* <CJK> */
+MAP(0x66, 0x6E, 0x96AE) /* <CJK> */
+MAP(0x66, 0x6F, 0x96AF) /* <CJK> */
+MAP(0x66, 0x70, 0x96B3) /* <CJK> */
+MAP(0x66, 0x71, 0x96BA) /* <CJK> */
+MAP(0x66, 0x72, 0x96CA) /* <CJK> */
+MAP(0x66, 0x73, 0x96D2) /* <CJK> */
+MAP(0x66, 0x74, 0x5DB2) /* <CJK> */
+MAP(0x66, 0x75, 0x96D8) /* <CJK> */
+MAP(0x66, 0x76, 0x96DA) /* <CJK> */
+MAP(0x66, 0x77, 0x96DD) /* <CJK> */
+MAP(0x66, 0x78, 0x96DE) /* <CJK> */
+MAP(0x66, 0x79, 0x96DF) /* <CJK> */
+MAP(0x66, 0x7A, 0x96E9) /* <CJK> */
+MAP(0x66, 0x7B, 0x96EF) /* <CJK> */
+MAP(0x66, 0x7C, 0x96F1) /* <CJK> */
+MAP(0x66, 0x7D, 0x96FA) /* <CJK> */
+MAP(0x66, 0x7E, 0x9702) /* <CJK> */
+MAP(0x67, 0x21, 0x9703) /* <CJK> */
+MAP(0x67, 0x22, 0x9705) /* <CJK> */
+MAP(0x67, 0x23, 0x9709) /* <CJK> */
+MAP(0x67, 0x24, 0x971A) /* <CJK> */
+MAP(0x67, 0x25, 0x971B) /* <CJK> */
+MAP(0x67, 0x26, 0x971D) /* <CJK> */
+MAP(0x67, 0x27, 0x9721) /* <CJK> */
+MAP(0x67, 0x28, 0x9722) /* <CJK> */
+MAP(0x67, 0x29, 0x9723) /* <CJK> */
+MAP(0x67, 0x2A, 0x9728) /* <CJK> */
+MAP(0x67, 0x2B, 0x9731) /* <CJK> */
+MAP(0x67, 0x2C, 0x9733) /* <CJK> */
+MAP(0x67, 0x2D, 0x9741) /* <CJK> */
+MAP(0x67, 0x2E, 0x9743) /* <CJK> */
+MAP(0x67, 0x2F, 0x974A) /* <CJK> */
+MAP(0x67, 0x30, 0x974E) /* <CJK> */
+MAP(0x67, 0x31, 0x974F) /* <CJK> */
+MAP(0x67, 0x32, 0x9755) /* <CJK> */
+MAP(0x67, 0x33, 0x9757) /* <CJK> */
+MAP(0x67, 0x34, 0x9758) /* <CJK> */
+MAP(0x67, 0x35, 0x975A) /* <CJK> */
+MAP(0x67, 0x36, 0x975B) /* <CJK> */
+MAP(0x67, 0x37, 0x9763) /* <CJK> */
+MAP(0x67, 0x38, 0x9767) /* <CJK> */
+MAP(0x67, 0x39, 0x976A) /* <CJK> */
+MAP(0x67, 0x3A, 0x976E) /* <CJK> */
+MAP(0x67, 0x3B, 0x9773) /* <CJK> */
+MAP(0x67, 0x3C, 0x9776) /* <CJK> */
+MAP(0x67, 0x3D, 0x9777) /* <CJK> */
+MAP(0x67, 0x3E, 0x9778) /* <CJK> */
+MAP(0x67, 0x3F, 0x977B) /* <CJK> */
+MAP(0x67, 0x40, 0x977D) /* <CJK> */
+MAP(0x67, 0x41, 0x977F) /* <CJK> */
+MAP(0x67, 0x42, 0x9780) /* <CJK> */
+MAP(0x67, 0x43, 0x9789) /* <CJK> */
+MAP(0x67, 0x44, 0x9795) /* <CJK> */
+MAP(0x67, 0x45, 0x9796) /* <CJK> */
+MAP(0x67, 0x46, 0x9797) /* <CJK> */
+MAP(0x67, 0x47, 0x9799) /* <CJK> */
+MAP(0x67, 0x48, 0x979A) /* <CJK> */
+MAP(0x67, 0x49, 0x979E) /* <CJK> */
+MAP(0x67, 0x4A, 0x979F) /* <CJK> */
+MAP(0x67, 0x4B, 0x97A2) /* <CJK> */
+MAP(0x67, 0x4C, 0x97AC) /* <CJK> */
+MAP(0x67, 0x4D, 0x97AE) /* <CJK> */
+MAP(0x67, 0x4E, 0x97B1) /* <CJK> */
+MAP(0x67, 0x4F, 0x97B2) /* <CJK> */
+MAP(0x67, 0x50, 0x97B5) /* <CJK> */
+MAP(0x67, 0x51, 0x97B6) /* <CJK> */
+MAP(0x67, 0x52, 0x97B8) /* <CJK> */
+MAP(0x67, 0x53, 0x97B9) /* <CJK> */
+MAP(0x67, 0x54, 0x97BA) /* <CJK> */
+MAP(0x67, 0x55, 0x97BC) /* <CJK> */
+MAP(0x67, 0x56, 0x97BE) /* <CJK> */
+MAP(0x67, 0x57, 0x97BF) /* <CJK> */
+MAP(0x67, 0x58, 0x97C1) /* <CJK> */
+MAP(0x67, 0x59, 0x97C4) /* <CJK> */
+MAP(0x67, 0x5A, 0x97C5) /* <CJK> */
+MAP(0x67, 0x5B, 0x97C7) /* <CJK> */
+MAP(0x67, 0x5C, 0x97C9) /* <CJK> */
+MAP(0x67, 0x5D, 0x97CA) /* <CJK> */
+MAP(0x67, 0x5E, 0x97CC) /* <CJK> */
+MAP(0x67, 0x5F, 0x97CD) /* <CJK> */
+MAP(0x67, 0x60, 0x97CE) /* <CJK> */
+MAP(0x67, 0x61, 0x97D0) /* <CJK> */
+MAP(0x67, 0x62, 0x97D1) /* <CJK> */
+MAP(0x67, 0x63, 0x97D4) /* <CJK> */
+MAP(0x67, 0x64, 0x97D7) /* <CJK> */
+MAP(0x67, 0x65, 0x97D8) /* <CJK> */
+MAP(0x67, 0x66, 0x97D9) /* <CJK> */
+MAP(0x67, 0x67, 0x97DD) /* <CJK> */
+MAP(0x67, 0x68, 0x97DE) /* <CJK> */
+MAP(0x67, 0x69, 0x97E0) /* <CJK> */
+MAP(0x67, 0x6A, 0x97DB) /* <CJK> */
+MAP(0x67, 0x6B, 0x97E1) /* <CJK> */
+MAP(0x67, 0x6C, 0x97E4) /* <CJK> */
+MAP(0x67, 0x6D, 0x97EF) /* <CJK> */
+MAP(0x67, 0x6E, 0x97F1) /* <CJK> */
+MAP(0x67, 0x6F, 0x97F4) /* <CJK> */
+MAP(0x67, 0x70, 0x97F7) /* <CJK> */
+MAP(0x67, 0x71, 0x97F8) /* <CJK> */
+MAP(0x67, 0x72, 0x97FA) /* <CJK> */
+MAP(0x67, 0x73, 0x9807) /* <CJK> */
+MAP(0x67, 0x74, 0x980A) /* <CJK> */
+MAP(0x67, 0x75, 0x9819) /* <CJK> */
+MAP(0x67, 0x76, 0x980D) /* <CJK> */
+MAP(0x67, 0x77, 0x980E) /* <CJK> */
+MAP(0x67, 0x78, 0x9814) /* <CJK> */
+MAP(0x67, 0x79, 0x9816) /* <CJK> */
+MAP(0x67, 0x7A, 0x981C) /* <CJK> */
+MAP(0x67, 0x7B, 0x981E) /* <CJK> */
+MAP(0x67, 0x7C, 0x9820) /* <CJK> */
+MAP(0x67, 0x7D, 0x9823) /* <CJK> */
+MAP(0x67, 0x7E, 0x9826) /* <CJK> */
+MAP(0x68, 0x21, 0x982B) /* <CJK> */
+MAP(0x68, 0x22, 0x982E) /* <CJK> */
+MAP(0x68, 0x23, 0x982F) /* <CJK> */
+MAP(0x68, 0x24, 0x9830) /* <CJK> */
+MAP(0x68, 0x25, 0x9832) /* <CJK> */
+MAP(0x68, 0x26, 0x9833) /* <CJK> */
+MAP(0x68, 0x27, 0x9835) /* <CJK> */
+MAP(0x68, 0x28, 0x9825) /* <CJK> */
+MAP(0x68, 0x29, 0x983E) /* <CJK> */
+MAP(0x68, 0x2A, 0x9844) /* <CJK> */
+MAP(0x68, 0x2B, 0x9847) /* <CJK> */
+MAP(0x68, 0x2C, 0x984A) /* <CJK> */
+MAP(0x68, 0x2D, 0x9851) /* <CJK> */
+MAP(0x68, 0x2E, 0x9852) /* <CJK> */
+MAP(0x68, 0x2F, 0x9853) /* <CJK> */
+MAP(0x68, 0x30, 0x9856) /* <CJK> */
+MAP(0x68, 0x31, 0x9857) /* <CJK> */
+MAP(0x68, 0x32, 0x9859) /* <CJK> */
+MAP(0x68, 0x33, 0x985A) /* <CJK> */
+MAP(0x68, 0x34, 0x9862) /* <CJK> */
+MAP(0x68, 0x35, 0x9863) /* <CJK> */
+MAP(0x68, 0x36, 0x9865) /* <CJK> */
+MAP(0x68, 0x37, 0x9866) /* <CJK> */
+MAP(0x68, 0x38, 0x986A) /* <CJK> */
+MAP(0x68, 0x39, 0x986C) /* <CJK> */
+MAP(0x68, 0x3A, 0x98AB) /* <CJK> */
+MAP(0x68, 0x3B, 0x98AD) /* <CJK> */
+MAP(0x68, 0x3C, 0x98AE) /* <CJK> */
+MAP(0x68, 0x3D, 0x98B0) /* <CJK> */
+MAP(0x68, 0x3E, 0x98B4) /* <CJK> */
+MAP(0x68, 0x3F, 0x98B7) /* <CJK> */
+MAP(0x68, 0x40, 0x98B8) /* <CJK> */
+MAP(0x68, 0x41, 0x98BA) /* <CJK> */
+MAP(0x68, 0x42, 0x98BB) /* <CJK> */
+MAP(0x68, 0x43, 0x98BF) /* <CJK> */
+MAP(0x68, 0x44, 0x98C2) /* <CJK> */
+MAP(0x68, 0x45, 0x98C5) /* <CJK> */
+MAP(0x68, 0x46, 0x98C8) /* <CJK> */
+MAP(0x68, 0x47, 0x98CC) /* <CJK> */
+MAP(0x68, 0x48, 0x98E1) /* <CJK> */
+MAP(0x68, 0x49, 0x98E3) /* <CJK> */
+MAP(0x68, 0x4A, 0x98E5) /* <CJK> */
+MAP(0x68, 0x4B, 0x98E6) /* <CJK> */
+MAP(0x68, 0x4C, 0x98E7) /* <CJK> */
+MAP(0x68, 0x4D, 0x98EA) /* <CJK> */
+MAP(0x68, 0x4E, 0x98F3) /* <CJK> */
+MAP(0x68, 0x4F, 0x98F6) /* <CJK> */
+MAP(0x68, 0x50, 0x9902) /* <CJK> */
+MAP(0x68, 0x51, 0x9907) /* <CJK> */
+MAP(0x68, 0x52, 0x9908) /* <CJK> */
+MAP(0x68, 0x53, 0x9911) /* <CJK> */
+MAP(0x68, 0x54, 0x9915) /* <CJK> */
+MAP(0x68, 0x55, 0x9916) /* <CJK> */
+MAP(0x68, 0x56, 0x9917) /* <CJK> */
+MAP(0x68, 0x57, 0x991A) /* <CJK> */
+MAP(0x68, 0x58, 0x991B) /* <CJK> */
+MAP(0x68, 0x59, 0x991C) /* <CJK> */
+MAP(0x68, 0x5A, 0x991F) /* <CJK> */
+MAP(0x68, 0x5B, 0x9922) /* <CJK> */
+MAP(0x68, 0x5C, 0x9926) /* <CJK> */
+MAP(0x68, 0x5D, 0x9927) /* <CJK> */
+MAP(0x68, 0x5E, 0x992B) /* <CJK> */
+MAP(0x68, 0x5F, 0x9931) /* <CJK> */
+MAP(0x68, 0x60, 0x9932) /* <CJK> */
+MAP(0x68, 0x61, 0x9933) /* <CJK> */
+MAP(0x68, 0x62, 0x9934) /* <CJK> */
+MAP(0x68, 0x63, 0x9935) /* <CJK> */
+MAP(0x68, 0x64, 0x9939) /* <CJK> */
+MAP(0x68, 0x65, 0x993A) /* <CJK> */
+MAP(0x68, 0x66, 0x993B) /* <CJK> */
+MAP(0x68, 0x67, 0x993C) /* <CJK> */
+MAP(0x68, 0x68, 0x9940) /* <CJK> */
+MAP(0x68, 0x69, 0x9941) /* <CJK> */
+MAP(0x68, 0x6A, 0x9946) /* <CJK> */
+MAP(0x68, 0x6B, 0x9947) /* <CJK> */
+MAP(0x68, 0x6C, 0x9948) /* <CJK> */
+MAP(0x68, 0x6D, 0x994D) /* <CJK> */
+MAP(0x68, 0x6E, 0x994E) /* <CJK> */
+MAP(0x68, 0x6F, 0x9954) /* <CJK> */
+MAP(0x68, 0x70, 0x9958) /* <CJK> */
+MAP(0x68, 0x71, 0x9959) /* <CJK> */
+MAP(0x68, 0x72, 0x995B) /* <CJK> */
+MAP(0x68, 0x73, 0x995C) /* <CJK> */
+MAP(0x68, 0x74, 0x995E) /* <CJK> */
+MAP(0x68, 0x75, 0x995F) /* <CJK> */
+MAP(0x68, 0x76, 0x9960) /* <CJK> */
+MAP(0x68, 0x77, 0x999B) /* <CJK> */
+MAP(0x68, 0x78, 0x999D) /* <CJK> */
+MAP(0x68, 0x79, 0x999F) /* <CJK> */
+MAP(0x68, 0x7A, 0x99A6) /* <CJK> */
+MAP(0x68, 0x7B, 0x99B0) /* <CJK> */
+MAP(0x68, 0x7C, 0x99B1) /* <CJK> */
+MAP(0x68, 0x7D, 0x99B2) /* <CJK> */
+MAP(0x68, 0x7E, 0x99B5) /* <CJK> */
+MAP(0x69, 0x21, 0x99B9) /* <CJK> */
+MAP(0x69, 0x22, 0x99BA) /* <CJK> */
+MAP(0x69, 0x23, 0x99BD) /* <CJK> */
+MAP(0x69, 0x24, 0x99BF) /* <CJK> */
+MAP(0x69, 0x25, 0x99C3) /* <CJK> */
+MAP(0x69, 0x26, 0x99C9) /* <CJK> */
+MAP(0x69, 0x27, 0x99D3) /* <CJK> */
+MAP(0x69, 0x28, 0x99D4) /* <CJK> */
+MAP(0x69, 0x29, 0x99D9) /* <CJK> */
+MAP(0x69, 0x2A, 0x99DA) /* <CJK> */
+MAP(0x69, 0x2B, 0x99DC) /* <CJK> */
+MAP(0x69, 0x2C, 0x99DE) /* <CJK> */
+MAP(0x69, 0x2D, 0x99E7) /* <CJK> */
+MAP(0x69, 0x2E, 0x99EA) /* <CJK> */
+MAP(0x69, 0x2F, 0x99EB) /* <CJK> */
+MAP(0x69, 0x30, 0x99EC) /* <CJK> */
+MAP(0x69, 0x31, 0x99F0) /* <CJK> */
+MAP(0x69, 0x32, 0x99F4) /* <CJK> */
+MAP(0x69, 0x33, 0x99F5) /* <CJK> */
+MAP(0x69, 0x34, 0x99F9) /* <CJK> */
+MAP(0x69, 0x35, 0x99FD) /* <CJK> */
+MAP(0x69, 0x36, 0x99FE) /* <CJK> */
+MAP(0x69, 0x37, 0x9A02) /* <CJK> */
+MAP(0x69, 0x38, 0x9A03) /* <CJK> */
+MAP(0x69, 0x39, 0x9A04) /* <CJK> */
+MAP(0x69, 0x3A, 0x9A0B) /* <CJK> */
+MAP(0x69, 0x3B, 0x9A0C) /* <CJK> */
+MAP(0x69, 0x3C, 0x9A10) /* <CJK> */
+MAP(0x69, 0x3D, 0x9A11) /* <CJK> */
+MAP(0x69, 0x3E, 0x9A16) /* <CJK> */
+MAP(0x69, 0x3F, 0x9A1E) /* <CJK> */
+MAP(0x69, 0x40, 0x9A20) /* <CJK> */
+MAP(0x69, 0x41, 0x9A22) /* <CJK> */
+MAP(0x69, 0x42, 0x9A23) /* <CJK> */
+MAP(0x69, 0x43, 0x9A24) /* <CJK> */
+MAP(0x69, 0x44, 0x9A27) /* <CJK> */
+MAP(0x69, 0x45, 0x9A2D) /* <CJK> */
+MAP(0x69, 0x46, 0x9A2E) /* <CJK> */
+MAP(0x69, 0x47, 0x9A33) /* <CJK> */
+MAP(0x69, 0x48, 0x9A35) /* <CJK> */
+MAP(0x69, 0x49, 0x9A36) /* <CJK> */
+MAP(0x69, 0x4A, 0x9A38) /* <CJK> */
+MAP(0x69, 0x4B, 0x9A47) /* <CJK> */
+MAP(0x69, 0x4C, 0x9A41) /* <CJK> */
+MAP(0x69, 0x4D, 0x9A44) /* <CJK> */
+MAP(0x69, 0x4E, 0x9A4A) /* <CJK> */
+MAP(0x69, 0x4F, 0x9A4B) /* <CJK> */
+MAP(0x69, 0x50, 0x9A4C) /* <CJK> */
+MAP(0x69, 0x51, 0x9A4E) /* <CJK> */
+MAP(0x69, 0x52, 0x9A51) /* <CJK> */
+MAP(0x69, 0x53, 0x9A54) /* <CJK> */
+MAP(0x69, 0x54, 0x9A56) /* <CJK> */
+MAP(0x69, 0x55, 0x9A5D) /* <CJK> */
+MAP(0x69, 0x56, 0x9AAA) /* <CJK> */
+MAP(0x69, 0x57, 0x9AAC) /* <CJK> */
+MAP(0x69, 0x58, 0x9AAE) /* <CJK> */
+MAP(0x69, 0x59, 0x9AAF) /* <CJK> */
+MAP(0x69, 0x5A, 0x9AB2) /* <CJK> */
+MAP(0x69, 0x5B, 0x9AB4) /* <CJK> */
+MAP(0x69, 0x5C, 0x9AB5) /* <CJK> */
+MAP(0x69, 0x5D, 0x9AB6) /* <CJK> */
+MAP(0x69, 0x5E, 0x9AB9) /* <CJK> */
+MAP(0x69, 0x5F, 0x9ABB) /* <CJK> */
+MAP(0x69, 0x60, 0x9ABE) /* <CJK> */
+MAP(0x69, 0x61, 0x9ABF) /* <CJK> */
+MAP(0x69, 0x62, 0x9AC1) /* <CJK> */
+MAP(0x69, 0x63, 0x9AC3) /* <CJK> */
+MAP(0x69, 0x64, 0x9AC6) /* <CJK> */
+MAP(0x69, 0x65, 0x9AC8) /* <CJK> */
+MAP(0x69, 0x66, 0x9ACE) /* <CJK> */
+MAP(0x69, 0x67, 0x9AD0) /* <CJK> */
+MAP(0x69, 0x68, 0x9AD2) /* <CJK> */
+MAP(0x69, 0x69, 0x9AD5) /* <CJK> */
+MAP(0x69, 0x6A, 0x9AD6) /* <CJK> */
+MAP(0x69, 0x6B, 0x9AD7) /* <CJK> */
+MAP(0x69, 0x6C, 0x9ADB) /* <CJK> */
+MAP(0x69, 0x6D, 0x9ADC) /* <CJK> */
+MAP(0x69, 0x6E, 0x9AE0) /* <CJK> */
+MAP(0x69, 0x6F, 0x9AE4) /* <CJK> */
+MAP(0x69, 0x70, 0x9AE5) /* <CJK> */
+MAP(0x69, 0x71, 0x9AE7) /* <CJK> */
+MAP(0x69, 0x72, 0x9AE9) /* <CJK> */
+MAP(0x69, 0x73, 0x9AEC) /* <CJK> */
+MAP(0x69, 0x74, 0x9AF2) /* <CJK> */
+MAP(0x69, 0x75, 0x9AF3) /* <CJK> */
+MAP(0x69, 0x76, 0x9AF5) /* <CJK> */
+MAP(0x69, 0x77, 0x9AF9) /* <CJK> */
+MAP(0x69, 0x78, 0x9AFA) /* <CJK> */
+MAP(0x69, 0x79, 0x9AFD) /* <CJK> */
+MAP(0x69, 0x7A, 0x9AFF) /* <CJK> */
+MAP(0x69, 0x7B, 0x9B00) /* <CJK> */
+MAP(0x69, 0x7C, 0x9B01) /* <CJK> */
+MAP(0x69, 0x7D, 0x9B02) /* <CJK> */
+MAP(0x69, 0x7E, 0x9B03) /* <CJK> */
+MAP(0x6A, 0x21, 0x9B04) /* <CJK> */
+MAP(0x6A, 0x22, 0x9B05) /* <CJK> */
+MAP(0x6A, 0x23, 0x9B08) /* <CJK> */
+MAP(0x6A, 0x24, 0x9B09) /* <CJK> */
+MAP(0x6A, 0x25, 0x9B0B) /* <CJK> */
+MAP(0x6A, 0x26, 0x9B0C) /* <CJK> */
+MAP(0x6A, 0x27, 0x9B0D) /* <CJK> */
+MAP(0x6A, 0x28, 0x9B0E) /* <CJK> */
+MAP(0x6A, 0x29, 0x9B10) /* <CJK> */
+MAP(0x6A, 0x2A, 0x9B12) /* <CJK> */
+MAP(0x6A, 0x2B, 0x9B16) /* <CJK> */
+MAP(0x6A, 0x2C, 0x9B19) /* <CJK> */
+MAP(0x6A, 0x2D, 0x9B1B) /* <CJK> */
+MAP(0x6A, 0x2E, 0x9B1C) /* <CJK> */
+MAP(0x6A, 0x2F, 0x9B20) /* <CJK> */
+MAP(0x6A, 0x30, 0x9B26) /* <CJK> */
+MAP(0x6A, 0x31, 0x9B2B) /* <CJK> */
+MAP(0x6A, 0x32, 0x9B2D) /* <CJK> */
+MAP(0x6A, 0x33, 0x9B33) /* <CJK> */
+MAP(0x6A, 0x34, 0x9B34) /* <CJK> */
+MAP(0x6A, 0x35, 0x9B35) /* <CJK> */
+MAP(0x6A, 0x36, 0x9B37) /* <CJK> */
+MAP(0x6A, 0x37, 0x9B39) /* <CJK> */
+MAP(0x6A, 0x38, 0x9B3A) /* <CJK> */
+MAP(0x6A, 0x39, 0x9B3D) /* <CJK> */
+MAP(0x6A, 0x3A, 0x9B48) /* <CJK> */
+MAP(0x6A, 0x3B, 0x9B4B) /* <CJK> */
+MAP(0x6A, 0x3C, 0x9B4C) /* <CJK> */
+MAP(0x6A, 0x3D, 0x9B55) /* <CJK> */
+MAP(0x6A, 0x3E, 0x9B56) /* <CJK> */
+MAP(0x6A, 0x3F, 0x9B57) /* <CJK> */
+MAP(0x6A, 0x40, 0x9B5B) /* <CJK> */
+MAP(0x6A, 0x41, 0x9B5E) /* <CJK> */
+MAP(0x6A, 0x42, 0x9B61) /* <CJK> */
+MAP(0x6A, 0x43, 0x9B63) /* <CJK> */
+MAP(0x6A, 0x44, 0x9B65) /* <CJK> */
+MAP(0x6A, 0x45, 0x9B66) /* <CJK> */
+MAP(0x6A, 0x46, 0x9B68) /* <CJK> */
+MAP(0x6A, 0x47, 0x9B6A) /* <CJK> */
+MAP(0x6A, 0x48, 0x9B6B) /* <CJK> */
+MAP(0x6A, 0x49, 0x9B6C) /* <CJK> */
+MAP(0x6A, 0x4A, 0x9B6D) /* <CJK> */
+MAP(0x6A, 0x4B, 0x9B6E) /* <CJK> */
+MAP(0x6A, 0x4C, 0x9B73) /* <CJK> */
+MAP(0x6A, 0x4D, 0x9B75) /* <CJK> */
+MAP(0x6A, 0x4E, 0x9B77) /* <CJK> */
+MAP(0x6A, 0x4F, 0x9B78) /* <CJK> */
+MAP(0x6A, 0x50, 0x9B79) /* <CJK> */
+MAP(0x6A, 0x51, 0x9B7F) /* <CJK> */
+MAP(0x6A, 0x52, 0x9B80) /* <CJK> */
+MAP(0x6A, 0x53, 0x9B84) /* <CJK> */
+MAP(0x6A, 0x54, 0x9B85) /* <CJK> */
+MAP(0x6A, 0x55, 0x9B86) /* <CJK> */
+MAP(0x6A, 0x56, 0x9B87) /* <CJK> */
+MAP(0x6A, 0x57, 0x9B89) /* <CJK> */
+MAP(0x6A, 0x58, 0x9B8A) /* <CJK> */
+MAP(0x6A, 0x59, 0x9B8B) /* <CJK> */
+MAP(0x6A, 0x5A, 0x9B8D) /* <CJK> */
+MAP(0x6A, 0x5B, 0x9B8F) /* <CJK> */
+MAP(0x6A, 0x5C, 0x9B90) /* <CJK> */
+MAP(0x6A, 0x5D, 0x9B94) /* <CJK> */
+MAP(0x6A, 0x5E, 0x9B9A) /* <CJK> */
+MAP(0x6A, 0x5F, 0x9B9D) /* <CJK> */
+MAP(0x6A, 0x60, 0x9B9E) /* <CJK> */
+MAP(0x6A, 0x61, 0x9BA6) /* <CJK> */
+MAP(0x6A, 0x62, 0x9BA7) /* <CJK> */
+MAP(0x6A, 0x63, 0x9BA9) /* <CJK> */
+MAP(0x6A, 0x64, 0x9BAC) /* <CJK> */
+MAP(0x6A, 0x65, 0x9BB0) /* <CJK> */
+MAP(0x6A, 0x66, 0x9BB1) /* <CJK> */
+MAP(0x6A, 0x67, 0x9BB2) /* <CJK> */
+MAP(0x6A, 0x68, 0x9BB7) /* <CJK> */
+MAP(0x6A, 0x69, 0x9BB8) /* <CJK> */
+MAP(0x6A, 0x6A, 0x9BBB) /* <CJK> */
+MAP(0x6A, 0x6B, 0x9BBC) /* <CJK> */
+MAP(0x6A, 0x6C, 0x9BBE) /* <CJK> */
+MAP(0x6A, 0x6D, 0x9BBF) /* <CJK> */
+MAP(0x6A, 0x6E, 0x9BC1) /* <CJK> */
+MAP(0x6A, 0x6F, 0x9BC7) /* <CJK> */
+MAP(0x6A, 0x70, 0x9BC8) /* <CJK> */
+MAP(0x6A, 0x71, 0x9BCE) /* <CJK> */
+MAP(0x6A, 0x72, 0x9BD0) /* <CJK> */
+MAP(0x6A, 0x73, 0x9BD7) /* <CJK> */
+MAP(0x6A, 0x74, 0x9BD8) /* <CJK> */
+MAP(0x6A, 0x75, 0x9BDD) /* <CJK> */
+MAP(0x6A, 0x76, 0x9BDF) /* <CJK> */
+MAP(0x6A, 0x77, 0x9BE5) /* <CJK> */
+MAP(0x6A, 0x78, 0x9BE7) /* <CJK> */
+MAP(0x6A, 0x79, 0x9BEA) /* <CJK> */
+MAP(0x6A, 0x7A, 0x9BEB) /* <CJK> */
+MAP(0x6A, 0x7B, 0x9BEF) /* <CJK> */
+MAP(0x6A, 0x7C, 0x9BF3) /* <CJK> */
+MAP(0x6A, 0x7D, 0x9BF7) /* <CJK> */
+MAP(0x6A, 0x7E, 0x9BF8) /* <CJK> */
+MAP(0x6B, 0x21, 0x9BF9) /* <CJK> */
+MAP(0x6B, 0x22, 0x9BFA) /* <CJK> */
+MAP(0x6B, 0x23, 0x9BFD) /* <CJK> */
+MAP(0x6B, 0x24, 0x9BFF) /* <CJK> */
+MAP(0x6B, 0x25, 0x9C00) /* <CJK> */
+MAP(0x6B, 0x26, 0x9C02) /* <CJK> */
+MAP(0x6B, 0x27, 0x9C0B) /* <CJK> */
+MAP(0x6B, 0x28, 0x9C0F) /* <CJK> */
+MAP(0x6B, 0x29, 0x9C11) /* <CJK> */
+MAP(0x6B, 0x2A, 0x9C16) /* <CJK> */
+MAP(0x6B, 0x2B, 0x9C18) /* <CJK> */
+MAP(0x6B, 0x2C, 0x9C19) /* <CJK> */
+MAP(0x6B, 0x2D, 0x9C1A) /* <CJK> */
+MAP(0x6B, 0x2E, 0x9C1C) /* <CJK> */
+MAP(0x6B, 0x2F, 0x9C1E) /* <CJK> */
+MAP(0x6B, 0x30, 0x9C22) /* <CJK> */
+MAP(0x6B, 0x31, 0x9C23) /* <CJK> */
+MAP(0x6B, 0x32, 0x9C26) /* <CJK> */
+MAP(0x6B, 0x33, 0x9C27) /* <CJK> */
+MAP(0x6B, 0x34, 0x9C28) /* <CJK> */
+MAP(0x6B, 0x35, 0x9C29) /* <CJK> */
+MAP(0x6B, 0x36, 0x9C2A) /* <CJK> */
+MAP(0x6B, 0x37, 0x9C31) /* <CJK> */
+MAP(0x6B, 0x38, 0x9C35) /* <CJK> */
+MAP(0x6B, 0x39, 0x9C36) /* <CJK> */
+MAP(0x6B, 0x3A, 0x9C37) /* <CJK> */
+MAP(0x6B, 0x3B, 0x9C3D) /* <CJK> */
+MAP(0x6B, 0x3C, 0x9C41) /* <CJK> */
+MAP(0x6B, 0x3D, 0x9C43) /* <CJK> */
+MAP(0x6B, 0x3E, 0x9C44) /* <CJK> */
+MAP(0x6B, 0x3F, 0x9C45) /* <CJK> */
+MAP(0x6B, 0x40, 0x9C49) /* <CJK> */
+MAP(0x6B, 0x41, 0x9C4A) /* <CJK> */
+MAP(0x6B, 0x42, 0x9C4E) /* <CJK> */
+MAP(0x6B, 0x43, 0x9C4F) /* <CJK> */
+MAP(0x6B, 0x44, 0x9C50) /* <CJK> */
+MAP(0x6B, 0x45, 0x9C53) /* <CJK> */
+MAP(0x6B, 0x46, 0x9C54) /* <CJK> */
+MAP(0x6B, 0x47, 0x9C56) /* <CJK> */
+MAP(0x6B, 0x48, 0x9C58) /* <CJK> */
+MAP(0x6B, 0x49, 0x9C5B) /* <CJK> */
+MAP(0x6B, 0x4A, 0x9C5D) /* <CJK> */
+MAP(0x6B, 0x4B, 0x9C5E) /* <CJK> */
+MAP(0x6B, 0x4C, 0x9C5F) /* <CJK> */
+MAP(0x6B, 0x4D, 0x9C63) /* <CJK> */
+MAP(0x6B, 0x4E, 0x9C69) /* <CJK> */
+MAP(0x6B, 0x4F, 0x9C6A) /* <CJK> */
+MAP(0x6B, 0x50, 0x9C5C) /* <CJK> */
+MAP(0x6B, 0x51, 0x9C6B) /* <CJK> */
+MAP(0x6B, 0x52, 0x9C68) /* <CJK> */
+MAP(0x6B, 0x53, 0x9C6E) /* <CJK> */
+MAP(0x6B, 0x54, 0x9C70) /* <CJK> */
+MAP(0x6B, 0x55, 0x9C72) /* <CJK> */
+MAP(0x6B, 0x56, 0x9C75) /* <CJK> */
+MAP(0x6B, 0x57, 0x9C77) /* <CJK> */
+MAP(0x6B, 0x58, 0x9C7B) /* <CJK> */
+MAP(0x6B, 0x59, 0x9CE6) /* <CJK> */
+MAP(0x6B, 0x5A, 0x9CF2) /* <CJK> */
+MAP(0x6B, 0x5B, 0x9CF7) /* <CJK> */
+MAP(0x6B, 0x5C, 0x9CF9) /* <CJK> */
+MAP(0x6B, 0x5D, 0x9D0B) /* <CJK> */
+MAP(0x6B, 0x5E, 0x9D02) /* <CJK> */
+MAP(0x6B, 0x5F, 0x9D11) /* <CJK> */
+MAP(0x6B, 0x60, 0x9D17) /* <CJK> */
+MAP(0x6B, 0x61, 0x9D18) /* <CJK> */
+MAP(0x6B, 0x62, 0x9D1C) /* <CJK> */
+MAP(0x6B, 0x63, 0x9D1D) /* <CJK> */
+MAP(0x6B, 0x64, 0x9D1E) /* <CJK> */
+MAP(0x6B, 0x65, 0x9D2F) /* <CJK> */
+MAP(0x6B, 0x66, 0x9D30) /* <CJK> */
+MAP(0x6B, 0x67, 0x9D32) /* <CJK> */
+MAP(0x6B, 0x68, 0x9D33) /* <CJK> */
+MAP(0x6B, 0x69, 0x9D34) /* <CJK> */
+MAP(0x6B, 0x6A, 0x9D3A) /* <CJK> */
+MAP(0x6B, 0x6B, 0x9D3C) /* <CJK> */
+MAP(0x6B, 0x6C, 0x9D45) /* <CJK> */
+MAP(0x6B, 0x6D, 0x9D3D) /* <CJK> */
+MAP(0x6B, 0x6E, 0x9D42) /* <CJK> */
+MAP(0x6B, 0x6F, 0x9D43) /* <CJK> */
+MAP(0x6B, 0x70, 0x9D47) /* <CJK> */
+MAP(0x6B, 0x71, 0x9D4A) /* <CJK> */
+MAP(0x6B, 0x72, 0x9D53) /* <CJK> */
+MAP(0x6B, 0x73, 0x9D54) /* <CJK> */
+MAP(0x6B, 0x74, 0x9D5F) /* <CJK> */
+MAP(0x6B, 0x75, 0x9D63) /* <CJK> */
+MAP(0x6B, 0x76, 0x9D62) /* <CJK> */
+MAP(0x6B, 0x77, 0x9D65) /* <CJK> */
+MAP(0x6B, 0x78, 0x9D69) /* <CJK> */
+MAP(0x6B, 0x79, 0x9D6A) /* <CJK> */
+MAP(0x6B, 0x7A, 0x9D6B) /* <CJK> */
+MAP(0x6B, 0x7B, 0x9D70) /* <CJK> */
+MAP(0x6B, 0x7C, 0x9D76) /* <CJK> */
+MAP(0x6B, 0x7D, 0x9D77) /* <CJK> */
+MAP(0x6B, 0x7E, 0x9D7B) /* <CJK> */
+MAP(0x6C, 0x21, 0x9D7C) /* <CJK> */
+MAP(0x6C, 0x22, 0x9D7E) /* <CJK> */
+MAP(0x6C, 0x23, 0x9D83) /* <CJK> */
+MAP(0x6C, 0x24, 0x9D84) /* <CJK> */
+MAP(0x6C, 0x25, 0x9D86) /* <CJK> */
+MAP(0x6C, 0x26, 0x9D8A) /* <CJK> */
+MAP(0x6C, 0x27, 0x9D8D) /* <CJK> */
+MAP(0x6C, 0x28, 0x9D8E) /* <CJK> */
+MAP(0x6C, 0x29, 0x9D92) /* <CJK> */
+MAP(0x6C, 0x2A, 0x9D93) /* <CJK> */
+MAP(0x6C, 0x2B, 0x9D95) /* <CJK> */
+MAP(0x6C, 0x2C, 0x9D96) /* <CJK> */
+MAP(0x6C, 0x2D, 0x9D97) /* <CJK> */
+MAP(0x6C, 0x2E, 0x9D98) /* <CJK> */
+MAP(0x6C, 0x2F, 0x9DA1) /* <CJK> */
+MAP(0x6C, 0x30, 0x9DAA) /* <CJK> */
+MAP(0x6C, 0x31, 0x9DAC) /* <CJK> */
+MAP(0x6C, 0x32, 0x9DAE) /* <CJK> */
+MAP(0x6C, 0x33, 0x9DB1) /* <CJK> */
+MAP(0x6C, 0x34, 0x9DB5) /* <CJK> */
+MAP(0x6C, 0x35, 0x9DB9) /* <CJK> */
+MAP(0x6C, 0x36, 0x9DBC) /* <CJK> */
+MAP(0x6C, 0x37, 0x9DBF) /* <CJK> */
+MAP(0x6C, 0x38, 0x9DC3) /* <CJK> */
+MAP(0x6C, 0x39, 0x9DC7) /* <CJK> */
+MAP(0x6C, 0x3A, 0x9DC9) /* <CJK> */
+MAP(0x6C, 0x3B, 0x9DCA) /* <CJK> */
+MAP(0x6C, 0x3C, 0x9DD4) /* <CJK> */
+MAP(0x6C, 0x3D, 0x9DD5) /* <CJK> */
+MAP(0x6C, 0x3E, 0x9DD6) /* <CJK> */
+MAP(0x6C, 0x3F, 0x9DD7) /* <CJK> */
+MAP(0x6C, 0x40, 0x9DDA) /* <CJK> */
+MAP(0x6C, 0x41, 0x9DDE) /* <CJK> */
+MAP(0x6C, 0x42, 0x9DDF) /* <CJK> */
+MAP(0x6C, 0x43, 0x9DE0) /* <CJK> */
+MAP(0x6C, 0x44, 0x9DE5) /* <CJK> */
+MAP(0x6C, 0x45, 0x9DE7) /* <CJK> */
+MAP(0x6C, 0x46, 0x9DE9) /* <CJK> */
+MAP(0x6C, 0x47, 0x9DEB) /* <CJK> */
+MAP(0x6C, 0x48, 0x9DEE) /* <CJK> */
+MAP(0x6C, 0x49, 0x9DF0) /* <CJK> */
+MAP(0x6C, 0x4A, 0x9DF3) /* <CJK> */
+MAP(0x6C, 0x4B, 0x9DF4) /* <CJK> */
+MAP(0x6C, 0x4C, 0x9DFE) /* <CJK> */
+MAP(0x6C, 0x4D, 0x9E0A) /* <CJK> */
+MAP(0x6C, 0x4E, 0x9E02) /* <CJK> */
+MAP(0x6C, 0x4F, 0x9E07) /* <CJK> */
+MAP(0x6C, 0x50, 0x9E0E) /* <CJK> */
+MAP(0x6C, 0x51, 0x9E10) /* <CJK> */
+MAP(0x6C, 0x52, 0x9E11) /* <CJK> */
+MAP(0x6C, 0x53, 0x9E12) /* <CJK> */
+MAP(0x6C, 0x54, 0x9E15) /* <CJK> */
+MAP(0x6C, 0x55, 0x9E16) /* <CJK> */
+MAP(0x6C, 0x56, 0x9E19) /* <CJK> */
+MAP(0x6C, 0x57, 0x9E1C) /* <CJK> */
+MAP(0x6C, 0x58, 0x9E1D) /* <CJK> */
+MAP(0x6C, 0x59, 0x9E7A) /* <CJK> */
+MAP(0x6C, 0x5A, 0x9E7B) /* <CJK> */
+MAP(0x6C, 0x5B, 0x9E7C) /* <CJK> */
+MAP(0x6C, 0x5C, 0x9E80) /* <CJK> */
+MAP(0x6C, 0x5D, 0x9E82) /* <CJK> */
+MAP(0x6C, 0x5E, 0x9E83) /* <CJK> */
+MAP(0x6C, 0x5F, 0x9E84) /* <CJK> */
+MAP(0x6C, 0x60, 0x9E85) /* <CJK> */
+MAP(0x6C, 0x61, 0x9E87) /* <CJK> */
+MAP(0x6C, 0x62, 0x9E8E) /* <CJK> */
+MAP(0x6C, 0x63, 0x9E8F) /* <CJK> */
+MAP(0x6C, 0x64, 0x9E96) /* <CJK> */
+MAP(0x6C, 0x65, 0x9E98) /* <CJK> */
+MAP(0x6C, 0x66, 0x9E9B) /* <CJK> */
+MAP(0x6C, 0x67, 0x9E9E) /* <CJK> */
+MAP(0x6C, 0x68, 0x9EA4) /* <CJK> */
+MAP(0x6C, 0x69, 0x9EA8) /* <CJK> */
+MAP(0x6C, 0x6A, 0x9EAC) /* <CJK> */
+MAP(0x6C, 0x6B, 0x9EAE) /* <CJK> */
+MAP(0x6C, 0x6C, 0x9EAF) /* <CJK> */
+MAP(0x6C, 0x6D, 0x9EB0) /* <CJK> */
+MAP(0x6C, 0x6E, 0x9EB3) /* <CJK> */
+MAP(0x6C, 0x6F, 0x9EB4) /* <CJK> */
+MAP(0x6C, 0x70, 0x9EB5) /* <CJK> */
+MAP(0x6C, 0x71, 0x9EC6) /* <CJK> */
+MAP(0x6C, 0x72, 0x9EC8) /* <CJK> */
+MAP(0x6C, 0x73, 0x9ECB) /* <CJK> */
+MAP(0x6C, 0x74, 0x9ED5) /* <CJK> */
+MAP(0x6C, 0x75, 0x9EDF) /* <CJK> */
+MAP(0x6C, 0x76, 0x9EE4) /* <CJK> */
+MAP(0x6C, 0x77, 0x9EE7) /* <CJK> */
+MAP(0x6C, 0x78, 0x9EEC) /* <CJK> */
+MAP(0x6C, 0x79, 0x9EED) /* <CJK> */
+MAP(0x6C, 0x7A, 0x9EEE) /* <CJK> */
+MAP(0x6C, 0x7B, 0x9EF0) /* <CJK> */
+MAP(0x6C, 0x7C, 0x9EF1) /* <CJK> */
+MAP(0x6C, 0x7D, 0x9EF2) /* <CJK> */
+MAP(0x6C, 0x7E, 0x9EF5) /* <CJK> */
+MAP(0x6D, 0x21, 0x9EF8) /* <CJK> */
+MAP(0x6D, 0x22, 0x9EFF) /* <CJK> */
+MAP(0x6D, 0x23, 0x9F02) /* <CJK> */
+MAP(0x6D, 0x24, 0x9F03) /* <CJK> */
+MAP(0x6D, 0x25, 0x9F09) /* <CJK> */
+MAP(0x6D, 0x26, 0x9F0F) /* <CJK> */
+MAP(0x6D, 0x27, 0x9F10) /* <CJK> */
+MAP(0x6D, 0x28, 0x9F11) /* <CJK> */
+MAP(0x6D, 0x29, 0x9F12) /* <CJK> */
+MAP(0x6D, 0x2A, 0x9F14) /* <CJK> */
+MAP(0x6D, 0x2B, 0x9F16) /* <CJK> */
+MAP(0x6D, 0x2C, 0x9F17) /* <CJK> */
+MAP(0x6D, 0x2D, 0x9F19) /* <CJK> */
+MAP(0x6D, 0x2E, 0x9F1A) /* <CJK> */
+MAP(0x6D, 0x2F, 0x9F1B) /* <CJK> */
+MAP(0x6D, 0x30, 0x9F1F) /* <CJK> */
+MAP(0x6D, 0x31, 0x9F22) /* <CJK> */
+MAP(0x6D, 0x32, 0x9F26) /* <CJK> */
+MAP(0x6D, 0x33, 0x9F2A) /* <CJK> */
+MAP(0x6D, 0x34, 0x9F2B) /* <CJK> */
+MAP(0x6D, 0x35, 0x9F2F) /* <CJK> */
+MAP(0x6D, 0x36, 0x9F31) /* <CJK> */
+MAP(0x6D, 0x37, 0x9F32) /* <CJK> */
+MAP(0x6D, 0x38, 0x9F34) /* <CJK> */
+MAP(0x6D, 0x39, 0x9F37) /* <CJK> */
+MAP(0x6D, 0x3A, 0x9F39) /* <CJK> */
+MAP(0x6D, 0x3B, 0x9F3A) /* <CJK> */
+MAP(0x6D, 0x3C, 0x9F3C) /* <CJK> */
+MAP(0x6D, 0x3D, 0x9F3D) /* <CJK> */
+MAP(0x6D, 0x3E, 0x9F3F) /* <CJK> */
+MAP(0x6D, 0x3F, 0x9F41) /* <CJK> */
+MAP(0x6D, 0x40, 0x9F43) /* <CJK> */
+MAP(0x6D, 0x41, 0x9F44) /* <CJK> */
+MAP(0x6D, 0x42, 0x9F45) /* <CJK> */
+MAP(0x6D, 0x43, 0x9F46) /* <CJK> */
+MAP(0x6D, 0x44, 0x9F47) /* <CJK> */
+MAP(0x6D, 0x45, 0x9F53) /* <CJK> */
+MAP(0x6D, 0x46, 0x9F55) /* <CJK> */
+MAP(0x6D, 0x47, 0x9F56) /* <CJK> */
+MAP(0x6D, 0x48, 0x9F57) /* <CJK> */
+MAP(0x6D, 0x49, 0x9F58) /* <CJK> */
+MAP(0x6D, 0x4A, 0x9F5A) /* <CJK> */
+MAP(0x6D, 0x4B, 0x9F5D) /* <CJK> */
+MAP(0x6D, 0x4C, 0x9F5E) /* <CJK> */
+MAP(0x6D, 0x4D, 0x9F68) /* <CJK> */
+MAP(0x6D, 0x4E, 0x9F69) /* <CJK> */
+MAP(0x6D, 0x4F, 0x9F6D) /* <CJK> */
+MAP(0x6D, 0x50, 0x9F6E) /* <CJK> */
+MAP(0x6D, 0x51, 0x9F6F) /* <CJK> */
+MAP(0x6D, 0x52, 0x9F70) /* <CJK> */
+MAP(0x6D, 0x53, 0x9F71) /* <CJK> */
+MAP(0x6D, 0x54, 0x9F73) /* <CJK> */
+MAP(0x6D, 0x55, 0x9F75) /* <CJK> */
+MAP(0x6D, 0x56, 0x9F7A) /* <CJK> */
+MAP(0x6D, 0x57, 0x9F7D) /* <CJK> */
+MAP(0x6D, 0x58, 0x9F8F) /* <CJK> */
+MAP(0x6D, 0x59, 0x9F90) /* <CJK> */
+MAP(0x6D, 0x5A, 0x9F91) /* <CJK> */
+MAP(0x6D, 0x5B, 0x9F92) /* <CJK> */
+MAP(0x6D, 0x5C, 0x9F94) /* <CJK> */
+MAP(0x6D, 0x5D, 0x9F96) /* <CJK> */
+MAP(0x6D, 0x5E, 0x9F97) /* <CJK> */
+MAP(0x6D, 0x5F, 0x9F9E) /* <CJK> */
+MAP(0x6D, 0x60, 0x9FA1) /* <CJK> */
+MAP(0x6D, 0x61, 0x9FA2) /* <CJK> */
+MAP(0x6D, 0x62, 0x9FA3) /* <CJK> */
+MAP(0x6D, 0x63, 0x9FA5) /* <CJK> */
diff --git a/libjava/gnu/gcj/convert/Output_8859_1.java b/libjava/gnu/gcj/convert/Output_8859_1.java
index ef6e211f9f8..8dd9f43d717 100644
--- a/libjava/gnu/gcj/convert/Output_8859_1.java
+++ b/libjava/gnu/gcj/convert/Output_8859_1.java
@@ -8,6 +8,13 @@ details. */
package gnu.gcj.convert;
+/**
+ * Convert Unicode ISO-Latin-1 (8851-1) text.
+ * The high-order byte of each character is truncated.
+ * @author Per Bothner <bothner@cygnus.com>
+ * @date Match 1999.
+ */
+
public class Output_8859_1 extends UnicodeToBytes
{
public String getName() { return "8859_1"; }
@@ -28,4 +35,19 @@ public class Output_8859_1 extends UnicodeToBytes
this.count = count;
return inlength;
}
+
+ public int write (String str, int inpos, int inlength, char[] work)
+ {
+ int count = this.count;
+ byte[] buf = this.buf;
+ int avail = buf.length - count;
+ if (inlength > avail)
+ inlength = avail;
+ for (int i = inlength; --i >= 0; )
+ {
+ buf[count++] = (byte) str.charAt(inpos++);
+ }
+ this.count = count;
+ return inlength;
+ }
}
diff --git a/libjava/gnu/gcj/convert/Output_EUCJIS.java b/libjava/gnu/gcj/convert/Output_EUCJIS.java
new file mode 100644
index 00000000000..f094ffea160
--- /dev/null
+++ b/libjava/gnu/gcj/convert/Output_EUCJIS.java
@@ -0,0 +1,27 @@
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+package gnu.gcj.convert;
+
+/**
+ * Convert Unicode to EUCJIS (Extended Unix Code for Japan).
+ * @author Per Bothner <bothner@cygnus.com>
+ * @date April 1999.
+ */
+
+public class Output_EUCJIS extends UnicodeToBytes
+{
+ public String getName() { return "EUCJIS"; }
+
+ public native int write (char[] inbuffer, int inpos, int inlength);
+
+ public native int write (String str, int inpos, int inlength, char[] work);
+
+ int pending1 = -1;
+ int pending2;
+}
diff --git a/libjava/gnu/gcj/convert/Output_JavaSrc.java b/libjava/gnu/gcj/convert/Output_JavaSrc.java
index aa233612cd7..656ddae26b9 100644
--- a/libjava/gnu/gcj/convert/Output_JavaSrc.java
+++ b/libjava/gnu/gcj/convert/Output_JavaSrc.java
@@ -8,7 +8,11 @@ details. */
package gnu.gcj.convert;
-/** Convert Unicode to Ascii with \ u XXXX-escapes. */
+/**
+ * Convert Unicode to Ascii with \ u XXXX-escapes.
+ * @author Per Bothner <bothner@cygnus.com>
+ * @date April 1999.
+ */
public class Output_JavaSrc extends UnicodeToBytes
{
diff --git a/libjava/gnu/gcj/convert/Output_SJIS.java b/libjava/gnu/gcj/convert/Output_SJIS.java
new file mode 100644
index 00000000000..7fba4bc9eb1
--- /dev/null
+++ b/libjava/gnu/gcj/convert/Output_SJIS.java
@@ -0,0 +1,26 @@
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+package gnu.gcj.convert;
+
+/**
+ * Convert Unicode to SJIS (Shift JIS, used on Japanese MS-Windows).
+ * @author Per Bothner <bothner@cygnus.com>
+ * @date April 1999.
+ */
+
+public class Output_SJIS extends UnicodeToBytes
+{
+ public String getName() { return "SJIS"; }
+
+ public native int write (char[] inbuffer, int inpos, int inlength);
+
+ public native int write (String str, int inpos, int inlength, char[] work);
+
+ int pending = -1;
+}
diff --git a/libjava/gnu/gcj/convert/Output_UTF8.java b/libjava/gnu/gcj/convert/Output_UTF8.java
index 6be753bf8ec..db2215a6171 100644
--- a/libjava/gnu/gcj/convert/Output_UTF8.java
+++ b/libjava/gnu/gcj/convert/Output_UTF8.java
@@ -8,6 +8,12 @@ details. */
package gnu.gcj.convert;
+/**
+ * Convert Unicode to UTF8.
+ * @author Per Bothner <bothner@cygnus.com>
+ * @date Match 1999.
+ */
+
public class Output_UTF8 extends UnicodeToBytes
{
public String getName() { return "UTF8"; }
@@ -48,7 +54,7 @@ public class Output_UTF8 extends UnicodeToBytes
{
bytes_todo--;
buf[count++] = (byte)
- (((value >> (bytes_todo * 6)) & 0xC0) | 0x80);
+ (((value >> (bytes_todo * 6)) & 0x3F) | 0x80);
avail--;
}
while (bytes_todo > 0 && avail > 0);
diff --git a/libjava/gnu/gcj/convert/UnicodeToBytes.java b/libjava/gnu/gcj/convert/UnicodeToBytes.java
index 4b772f96eda..7ab92a8eefa 100644
--- a/libjava/gnu/gcj/convert/UnicodeToBytes.java
+++ b/libjava/gnu/gcj/convert/UnicodeToBytes.java
@@ -80,11 +80,30 @@ public abstract class UnicodeToBytes
/** Convert chars to bytes.
* Converted bytes are written to buf, starting at count.
- * @param inbuffer sources of characters to convert
- * @param inpos index of initial character ininbuffer to convert
+ * @param inbuffer source of characters to convert
+ * @param inpos index of initial character in inbuffer to convert
* @param inlength number of characters to convert
* @return number of chars converted
* Also, this.count is increment by the number of bytes converted.
*/
public abstract int write (char[] inbuffer, int inpos, int inlength);
+
+ /** Convert chars to bytes.
+ * Converted bytes are written to buf, starting at count.
+ * @param str source of characters to convert
+ * @param inpos index of initial character in str to convert
+ * @param inlength number of characters to convert
+ * @param work if non-null, a buffer than can be used
+ * @return number of chars converted
+ * Also, this.count is increment by the number of bytes converted.
+ */
+ public int write (String str, int inpos, int inlength, char[] work)
+ {
+ if (work == null)
+ work = new char[inlength];
+ int srcEnd = inpos + (inlength > work.length ? work.length : inlength);
+ str.getChars(inpos, srcEnd, work, 0);
+ return write(work, inpos, inlength);
+ }
+
}
diff --git a/libjava/gnu/gcj/convert/Unicode_to_JIS.cc b/libjava/gnu/gcj/convert/Unicode_to_JIS.cc
new file mode 100644
index 00000000000..10b3b7003db
--- /dev/null
+++ b/libjava/gnu/gcj/convert/Unicode_to_JIS.cc
@@ -0,0 +1,23139 @@
+/* This file is automatically generated. */
+unsigned short Unicode_to_JIS[] = {
+ /* branch: 0x0XXX */ 16,
+ /* branch: 0x1XXX */ 0,
+ /* branch: 0x2XXX */ 720,
+ /* branch: 0x3XXX */ 1296,
+ /* branch: 0x4XXX */ 1552,
+ /* branch: 0x5XXX */ 2112,
+ /* branch: 0x6XXX */ 6480,
+ /* branch: 0x7XXX */ 10848,
+ /* branch: 0x8XXX */ 15072,
+ /* branch: 0x9XXX */ 19184,
+ /* branch: 0xaXXX */ 0,
+ /* branch: 0xbXXX */ 0,
+ /* branch: 0xcXXX */ 0,
+ /* branch: 0xdXXX */ 0,
+ /* branch: 0xeXXX */ 0,
+ /* branch: 0xfXXX */ 22928,
+ /* branch: 0x00XX */ 32,
+ /* branch: 0x01XX */ 272,
+ /* branch: 0x02XX */ 464,
+ /* branch: 0x03XX */ 512,
+ /* branch: 0x04XX */ 608,
+ /* branch: 0x05XX */ 0,
+ /* branch: 0x06XX */ 0,
+ /* branch: 0x07XX */ 0,
+ /* branch: 0x08XX */ 0,
+ /* branch: 0x09XX */ 0,
+ /* branch: 0x0aXX */ 0,
+ /* branch: 0x0bXX */ 0,
+ /* branch: 0x0cXX */ 0,
+ /* branch: 0x0dXX */ 0,
+ /* branch: 0x0eXX */ 0,
+ /* branch: 0x0fXX */ 0,
+ /* branch: 0x000X */ 48,
+ /* branch: 0x001X */ 64,
+ /* branch: 0x002X */ 80,
+ /* branch: 0x003X */ 96,
+ /* branch: 0x004X */ 112,
+ /* branch: 0x005X */ 128,
+ /* branch: 0x006X */ 144,
+ /* branch: 0x007X */ 160,
+ /* branch: 0x008X */ 0,
+ /* branch: 0x009X */ 0,
+ /* branch: 0x00aX */ 176,
+ /* branch: 0x00bX */ 192,
+ /* branch: 0x00cX */ 208,
+ /* branch: 0x00dX */ 224,
+ /* branch: 0x00eX */ 240,
+ /* branch: 0x00fX */ 256,
+ /* key: 0x0 */ 0x0,
+ /* key: 0x1 */ 0x1,
+ /* key: 0x2 */ 0x2,
+ /* key: 0x3 */ 0x3,
+ /* key: 0x4 */ 0x4,
+ /* key: 0x5 */ 0x5,
+ /* key: 0x6 */ 0x6,
+ /* key: 0x7 */ 0x7,
+ /* key: 0x8 */ 0x8,
+ /* key: 0x9 */ 0x9,
+ /* key: 0xa */ 0xa,
+ /* key: 0xb */ 0xb,
+ /* key: 0xc */ 0xc,
+ /* key: 0xd */ 0xd,
+ /* key: 0xe */ 0xe,
+ /* key: 0xf */ 0xf,
+ /* key: 0x10 */ 0x10,
+ /* key: 0x11 */ 0x11,
+ /* key: 0x12 */ 0x12,
+ /* key: 0x13 */ 0x13,
+ /* key: 0x14 */ 0x14,
+ /* key: 0x15 */ 0x15,
+ /* key: 0x16 */ 0x16,
+ /* key: 0x17 */ 0x17,
+ /* key: 0x18 */ 0x18,
+ /* key: 0x19 */ 0x19,
+ /* key: 0x1a */ 0x1a,
+ /* key: 0x1b */ 0x1b,
+ /* key: 0x1c */ 0x1c,
+ /* key: 0x1d */ 0x1d,
+ /* key: 0x1e */ 0x1e,
+ /* key: 0x1f */ 0x1f,
+ /* key: 0x20 */ 0x20,
+ /* key: 0x21 */ 0x21,
+ /* key: 0x22 */ 0x22,
+ /* key: 0x23 */ 0x23,
+ /* key: 0x24 */ 0x24,
+ /* key: 0x25 */ 0x25,
+ /* key: 0x26 */ 0x26,
+ /* key: 0x27 */ 0x27,
+ /* key: 0x28 */ 0x28,
+ /* key: 0x29 */ 0x29,
+ /* key: 0x2a */ 0x2a,
+ /* key: 0x2b */ 0x2b,
+ /* key: 0x2c */ 0x2c,
+ /* key: 0x2d */ 0x2d,
+ /* key: 0x2e */ 0x2e,
+ /* key: 0x2f */ 0x2f,
+ /* key: 0x30 */ 0x30,
+ /* key: 0x31 */ 0x31,
+ /* key: 0x32 */ 0x32,
+ /* key: 0x33 */ 0x33,
+ /* key: 0x34 */ 0x34,
+ /* key: 0x35 */ 0x35,
+ /* key: 0x36 */ 0x36,
+ /* key: 0x37 */ 0x37,
+ /* key: 0x38 */ 0x38,
+ /* key: 0x39 */ 0x39,
+ /* key: 0x3a */ 0x3a,
+ /* key: 0x3b */ 0x3b,
+ /* key: 0x3c */ 0x3c,
+ /* key: 0x3d */ 0x3d,
+ /* key: 0x3e */ 0x3e,
+ /* key: 0x3f */ 0x3f,
+ /* key: 0x40 */ 0x40,
+ /* key: 0x41 */ 0x41,
+ /* key: 0x42 */ 0x42,
+ /* key: 0x43 */ 0x43,
+ /* key: 0x44 */ 0x44,
+ /* key: 0x45 */ 0x45,
+ /* key: 0x46 */ 0x46,
+ /* key: 0x47 */ 0x47,
+ /* key: 0x48 */ 0x48,
+ /* key: 0x49 */ 0x49,
+ /* key: 0x4a */ 0x4a,
+ /* key: 0x4b */ 0x4b,
+ /* key: 0x4c */ 0x4c,
+ /* key: 0x4d */ 0x4d,
+ /* key: 0x4e */ 0x4e,
+ /* key: 0x4f */ 0x4f,
+ /* key: 0x50 */ 0x50,
+ /* key: 0x51 */ 0x51,
+ /* key: 0x52 */ 0x52,
+ /* key: 0x53 */ 0x53,
+ /* key: 0x54 */ 0x54,
+ /* key: 0x55 */ 0x55,
+ /* key: 0x56 */ 0x56,
+ /* key: 0x57 */ 0x57,
+ /* key: 0x58 */ 0x58,
+ /* key: 0x59 */ 0x59,
+ /* key: 0x5a */ 0x5a,
+ /* key: 0x5b */ 0x5b,
+ /* key: 0x5c */ 0x2140,
+ /* key: 0x5d */ 0x5d,
+ /* key: 0x5e */ 0x5e,
+ /* key: 0x5f */ 0x5f,
+ /* key: 0x60 */ 0x60,
+ /* key: 0x61 */ 0x61,
+ /* key: 0x62 */ 0x62,
+ /* key: 0x63 */ 0x63,
+ /* key: 0x64 */ 0x64,
+ /* key: 0x65 */ 0x65,
+ /* key: 0x66 */ 0x66,
+ /* key: 0x67 */ 0x67,
+ /* key: 0x68 */ 0x68,
+ /* key: 0x69 */ 0x69,
+ /* key: 0x6a */ 0x6a,
+ /* key: 0x6b */ 0x6b,
+ /* key: 0x6c */ 0x6c,
+ /* key: 0x6d */ 0x6d,
+ /* key: 0x6e */ 0x6e,
+ /* key: 0x6f */ 0x6f,
+ /* key: 0x70 */ 0x70,
+ /* key: 0x71 */ 0x71,
+ /* key: 0x72 */ 0x72,
+ /* key: 0x73 */ 0x73,
+ /* key: 0x74 */ 0x74,
+ /* key: 0x75 */ 0x75,
+ /* key: 0x76 */ 0x76,
+ /* key: 0x77 */ 0x77,
+ /* key: 0x78 */ 0x78,
+ /* key: 0x79 */ 0x79,
+ /* key: 0x7a */ 0x7a,
+ /* key: 0x7b */ 0x7b,
+ /* key: 0x7c */ 0x7c,
+ /* key: 0x7d */ 0x7d,
+ /* key: 0x7e */ 0xa237,
+ /* key: 0x7f */ 0x7f,
+ /* key: 0xa0 */ 0xffff,
+ /* key: 0xa1 */ 0xa242,
+ /* key: 0xa2 */ 0x2171,
+ /* key: 0xa3 */ 0x2172,
+ /* key: 0xa4 */ 0xa270,
+ /* key: 0xa5 */ 0x5c,
+ /* key: 0xa6 */ 0xa243,
+ /* key: 0xa7 */ 0x2178,
+ /* key: 0xa8 */ 0x212f,
+ /* key: 0xa9 */ 0xa26d,
+ /* key: 0xaa */ 0xa26c,
+ /* key: 0xab */ 0xffff,
+ /* key: 0xac */ 0x224c,
+ /* key: 0xad */ 0xffff,
+ /* key: 0xae */ 0xa26e,
+ /* key: 0xaf */ 0xa234,
+ /* key: 0xb0 */ 0x216b,
+ /* key: 0xb1 */ 0x215e,
+ /* key: 0xb2 */ 0xffff,
+ /* key: 0xb3 */ 0xffff,
+ /* key: 0xb4 */ 0x212d,
+ /* key: 0xb5 */ 0xffff,
+ /* key: 0xb6 */ 0x2279,
+ /* key: 0xb7 */ 0xffff,
+ /* key: 0xb8 */ 0xa231,
+ /* key: 0xb9 */ 0xffff,
+ /* key: 0xba */ 0xa26b,
+ /* key: 0xbb */ 0xffff,
+ /* key: 0xbc */ 0xffff,
+ /* key: 0xbd */ 0xffff,
+ /* key: 0xbe */ 0xffff,
+ /* key: 0xbf */ 0xa244,
+ /* key: 0xc0 */ 0xaa22,
+ /* key: 0xc1 */ 0xaa21,
+ /* key: 0xc2 */ 0xaa24,
+ /* key: 0xc3 */ 0xaa2a,
+ /* key: 0xc4 */ 0xaa23,
+ /* key: 0xc5 */ 0xaa29,
+ /* key: 0xc6 */ 0xa921,
+ /* key: 0xc7 */ 0xaa2e,
+ /* key: 0xc8 */ 0xaa32,
+ /* key: 0xc9 */ 0xaa31,
+ /* key: 0xca */ 0xaa34,
+ /* key: 0xcb */ 0xaa33,
+ /* key: 0xcc */ 0xaa40,
+ /* key: 0xcd */ 0xaa3f,
+ /* key: 0xce */ 0xaa42,
+ /* key: 0xcf */ 0xaa41,
+ /* key: 0xd0 */ 0xffff,
+ /* key: 0xd1 */ 0xaa50,
+ /* key: 0xd2 */ 0xaa52,
+ /* key: 0xd3 */ 0xaa51,
+ /* key: 0xd4 */ 0xaa54,
+ /* key: 0xd5 */ 0xaa58,
+ /* key: 0xd6 */ 0xaa53,
+ /* key: 0xd7 */ 0x215f,
+ /* key: 0xd8 */ 0xa92c,
+ /* key: 0xd9 */ 0xaa63,
+ /* key: 0xda */ 0xaa62,
+ /* key: 0xdb */ 0xaa65,
+ /* key: 0xdc */ 0xaa64,
+ /* key: 0xdd */ 0xaa72,
+ /* key: 0xde */ 0xa930,
+ /* key: 0xdf */ 0xa94e,
+ /* key: 0xe0 */ 0xab22,
+ /* key: 0xe1 */ 0xab21,
+ /* key: 0xe2 */ 0xab24,
+ /* key: 0xe3 */ 0xab2a,
+ /* key: 0xe4 */ 0xab23,
+ /* key: 0xe5 */ 0xab29,
+ /* key: 0xe6 */ 0xa941,
+ /* key: 0xe7 */ 0xab2e,
+ /* key: 0xe8 */ 0xab32,
+ /* key: 0xe9 */ 0xab31,
+ /* key: 0xea */ 0xab34,
+ /* key: 0xeb */ 0xab33,
+ /* key: 0xec */ 0xab40,
+ /* key: 0xed */ 0xab3f,
+ /* key: 0xee */ 0xab42,
+ /* key: 0xef */ 0xab41,
+ /* key: 0xf0 */ 0xa943,
+ /* key: 0xf1 */ 0xab50,
+ /* key: 0xf2 */ 0xab52,
+ /* key: 0xf3 */ 0xab51,
+ /* key: 0xf4 */ 0xab54,
+ /* key: 0xf5 */ 0xab58,
+ /* key: 0xf6 */ 0xab53,
+ /* key: 0xf7 */ 0x2160,
+ /* key: 0xf8 */ 0xa94c,
+ /* key: 0xf9 */ 0xab63,
+ /* key: 0xfa */ 0xab62,
+ /* key: 0xfb */ 0xab65,
+ /* key: 0xfc */ 0xab64,
+ /* key: 0xfd */ 0xab72,
+ /* key: 0xfe */ 0xa950,
+ /* key: 0xff */ 0xab73,
+ /* branch: 0x010X */ 288,
+ /* branch: 0x011X */ 304,
+ /* branch: 0x012X */ 320,
+ /* branch: 0x013X */ 336,
+ /* branch: 0x014X */ 352,
+ /* branch: 0x015X */ 368,
+ /* branch: 0x016X */ 384,
+ /* branch: 0x017X */ 400,
+ /* branch: 0x018X */ 0,
+ /* branch: 0x019X */ 0,
+ /* branch: 0x01aX */ 0,
+ /* branch: 0x01bX */ 0,
+ /* branch: 0x01cX */ 416,
+ /* branch: 0x01dX */ 432,
+ /* branch: 0x01eX */ 0,
+ /* branch: 0x01fX */ 448,
+ /* key: 0x100 */ 0xaa27,
+ /* key: 0x101 */ 0xab27,
+ /* key: 0x102 */ 0xaa25,
+ /* key: 0x103 */ 0xab25,
+ /* key: 0x104 */ 0xaa28,
+ /* key: 0x105 */ 0xab28,
+ /* key: 0x106 */ 0xaa2b,
+ /* key: 0x107 */ 0xab2b,
+ /* key: 0x108 */ 0xaa2c,
+ /* key: 0x109 */ 0xab2c,
+ /* key: 0x10a */ 0xaa2f,
+ /* key: 0x10b */ 0xab2f,
+ /* key: 0x10c */ 0xaa2d,
+ /* key: 0x10d */ 0xab2d,
+ /* key: 0x10e */ 0xaa30,
+ /* key: 0x10f */ 0xab30,
+ /* key: 0x110 */ 0xa922,
+ /* key: 0x111 */ 0xa942,
+ /* key: 0x112 */ 0xaa37,
+ /* key: 0x113 */ 0xab37,
+ /* key: 0x114 */ 0xffff,
+ /* key: 0x115 */ 0xffff,
+ /* key: 0x116 */ 0xaa36,
+ /* key: 0x117 */ 0xab36,
+ /* key: 0x118 */ 0xaa38,
+ /* key: 0x119 */ 0xab38,
+ /* key: 0x11a */ 0xaa35,
+ /* key: 0x11b */ 0xab35,
+ /* key: 0x11c */ 0xaa3a,
+ /* key: 0x11d */ 0xab3a,
+ /* key: 0x11e */ 0xaa3b,
+ /* key: 0x11f */ 0xab3b,
+ /* key: 0x120 */ 0xaa3d,
+ /* key: 0x121 */ 0xab3d,
+ /* key: 0x122 */ 0xaa3c,
+ /* key: 0x123 */ 0xffff,
+ /* key: 0x124 */ 0xaa3e,
+ /* key: 0x125 */ 0xab3e,
+ /* key: 0x126 */ 0xa924,
+ /* key: 0x127 */ 0xa944,
+ /* key: 0x128 */ 0xaa47,
+ /* key: 0x129 */ 0xab47,
+ /* key: 0x12a */ 0xaa45,
+ /* key: 0x12b */ 0xab45,
+ /* key: 0x12c */ 0xffff,
+ /* key: 0x12d */ 0xffff,
+ /* key: 0x12e */ 0xaa46,
+ /* key: 0x12f */ 0xab46,
+ /* key: 0x130 */ 0xaa44,
+ /* key: 0x131 */ 0xa945,
+ /* key: 0x132 */ 0xa926,
+ /* key: 0x133 */ 0xa946,
+ /* key: 0x134 */ 0xaa48,
+ /* key: 0x135 */ 0xab48,
+ /* key: 0x136 */ 0xaa49,
+ /* key: 0x137 */ 0xab49,
+ /* key: 0x138 */ 0xa947,
+ /* key: 0x139 */ 0xaa4a,
+ /* key: 0x13a */ 0xab4a,
+ /* key: 0x13b */ 0xaa4c,
+ /* key: 0x13c */ 0xab4c,
+ /* key: 0x13d */ 0xaa4b,
+ /* key: 0x13e */ 0xab4b,
+ /* key: 0x13f */ 0xa929,
+ /* key: 0x140 */ 0xa949,
+ /* key: 0x141 */ 0xa928,
+ /* key: 0x142 */ 0xa948,
+ /* key: 0x143 */ 0xaa4d,
+ /* key: 0x144 */ 0xab4d,
+ /* key: 0x145 */ 0xaa4f,
+ /* key: 0x146 */ 0xab4f,
+ /* key: 0x147 */ 0xaa4e,
+ /* key: 0x148 */ 0xab4e,
+ /* key: 0x149 */ 0xa94a,
+ /* key: 0x14a */ 0xa92b,
+ /* key: 0x14b */ 0xa94b,
+ /* key: 0x14c */ 0xaa57,
+ /* key: 0x14d */ 0xab57,
+ /* key: 0x14e */ 0xffff,
+ /* key: 0x14f */ 0xffff,
+ /* key: 0x150 */ 0xaa56,
+ /* key: 0x151 */ 0xab56,
+ /* key: 0x152 */ 0xa92d,
+ /* key: 0x153 */ 0xa94d,
+ /* key: 0x154 */ 0xaa59,
+ /* key: 0x155 */ 0xab59,
+ /* key: 0x156 */ 0xaa5b,
+ /* key: 0x157 */ 0xab5b,
+ /* key: 0x158 */ 0xaa5a,
+ /* key: 0x159 */ 0xab5a,
+ /* key: 0x15a */ 0xaa5c,
+ /* key: 0x15b */ 0xab5c,
+ /* key: 0x15c */ 0xaa5d,
+ /* key: 0x15d */ 0xab5d,
+ /* key: 0x15e */ 0xaa5f,
+ /* key: 0x15f */ 0xab5f,
+ /* key: 0x160 */ 0xaa5e,
+ /* key: 0x161 */ 0xab5e,
+ /* key: 0x162 */ 0xaa61,
+ /* key: 0x163 */ 0xab61,
+ /* key: 0x164 */ 0xaa60,
+ /* key: 0x165 */ 0xab60,
+ /* key: 0x166 */ 0xa92f,
+ /* key: 0x167 */ 0xa94f,
+ /* key: 0x168 */ 0xaa6c,
+ /* key: 0x169 */ 0xab6c,
+ /* key: 0x16a */ 0xaa69,
+ /* key: 0x16b */ 0xab69,
+ /* key: 0x16c */ 0xaa66,
+ /* key: 0x16d */ 0xab66,
+ /* key: 0x16e */ 0xaa6b,
+ /* key: 0x16f */ 0xab6b,
+ /* key: 0x170 */ 0xaa68,
+ /* key: 0x171 */ 0xab68,
+ /* key: 0x172 */ 0xaa6a,
+ /* key: 0x173 */ 0xab6a,
+ /* key: 0x174 */ 0xaa71,
+ /* key: 0x175 */ 0xab71,
+ /* key: 0x176 */ 0xaa74,
+ /* key: 0x177 */ 0xab74,
+ /* key: 0x178 */ 0xaa73,
+ /* key: 0x179 */ 0xaa75,
+ /* key: 0x17a */ 0xab75,
+ /* key: 0x17b */ 0xaa77,
+ /* key: 0x17c */ 0xab77,
+ /* key: 0x17d */ 0xaa76,
+ /* key: 0x17e */ 0xab76,
+ /* key: 0x17f */ 0xffff,
+ /* key: 0x1c0 */ 0xffff,
+ /* key: 0x1c1 */ 0xffff,
+ /* key: 0x1c2 */ 0xffff,
+ /* key: 0x1c3 */ 0xffff,
+ /* key: 0x1c4 */ 0xffff,
+ /* key: 0x1c5 */ 0xffff,
+ /* key: 0x1c6 */ 0xffff,
+ /* key: 0x1c7 */ 0xffff,
+ /* key: 0x1c8 */ 0xffff,
+ /* key: 0x1c9 */ 0xffff,
+ /* key: 0x1ca */ 0xffff,
+ /* key: 0x1cb */ 0xffff,
+ /* key: 0x1cc */ 0xffff,
+ /* key: 0x1cd */ 0xaa26,
+ /* key: 0x1ce */ 0xab26,
+ /* key: 0x1cf */ 0xaa43,
+ /* key: 0x1d0 */ 0xab43,
+ /* key: 0x1d1 */ 0xaa55,
+ /* key: 0x1d2 */ 0xab55,
+ /* key: 0x1d3 */ 0xaa67,
+ /* key: 0x1d4 */ 0xab67,
+ /* key: 0x1d5 */ 0xaa70,
+ /* key: 0x1d6 */ 0xab70,
+ /* key: 0x1d7 */ 0xaa6d,
+ /* key: 0x1d8 */ 0xab6d,
+ /* key: 0x1d9 */ 0xaa6f,
+ /* key: 0x1da */ 0xab6f,
+ /* key: 0x1db */ 0xaa6e,
+ /* key: 0x1dc */ 0xab6e,
+ /* key: 0x1dd */ 0xffff,
+ /* key: 0x1de */ 0xffff,
+ /* key: 0x1df */ 0xffff,
+ /* key: 0x1f0 */ 0xffff,
+ /* key: 0x1f1 */ 0xffff,
+ /* key: 0x1f2 */ 0xffff,
+ /* key: 0x1f3 */ 0xffff,
+ /* key: 0x1f4 */ 0xffff,
+ /* key: 0x1f5 */ 0xab39,
+ /* key: 0x1f6 */ 0xffff,
+ /* key: 0x1f7 */ 0xffff,
+ /* key: 0x1f8 */ 0xffff,
+ /* key: 0x1f9 */ 0xffff,
+ /* key: 0x1fa */ 0xffff,
+ /* key: 0x1fb */ 0xffff,
+ /* key: 0x1fc */ 0xffff,
+ /* key: 0x1fd */ 0xffff,
+ /* key: 0x1fe */ 0xffff,
+ /* key: 0x1ff */ 0xffff,
+ /* branch: 0x020X */ 0,
+ /* branch: 0x021X */ 0,
+ /* branch: 0x022X */ 0,
+ /* branch: 0x023X */ 0,
+ /* branch: 0x024X */ 0,
+ /* branch: 0x025X */ 0,
+ /* branch: 0x026X */ 0,
+ /* branch: 0x027X */ 0,
+ /* branch: 0x028X */ 0,
+ /* branch: 0x029X */ 0,
+ /* branch: 0x02aX */ 0,
+ /* branch: 0x02bX */ 0,
+ /* branch: 0x02cX */ 480,
+ /* branch: 0x02dX */ 496,
+ /* branch: 0x02eX */ 0,
+ /* branch: 0x02fX */ 0,
+ /* key: 0x2c0 */ 0xffff,
+ /* key: 0x2c1 */ 0xffff,
+ /* key: 0x2c2 */ 0xffff,
+ /* key: 0x2c3 */ 0xffff,
+ /* key: 0x2c4 */ 0xffff,
+ /* key: 0x2c5 */ 0xffff,
+ /* key: 0x2c6 */ 0xffff,
+ /* key: 0x2c7 */ 0xa230,
+ /* key: 0x2c8 */ 0xffff,
+ /* key: 0x2c9 */ 0xffff,
+ /* key: 0x2ca */ 0xffff,
+ /* key: 0x2cb */ 0xffff,
+ /* key: 0x2cc */ 0xffff,
+ /* key: 0x2cd */ 0xffff,
+ /* key: 0x2ce */ 0xffff,
+ /* key: 0x2cf */ 0xffff,
+ /* key: 0x2d0 */ 0xffff,
+ /* key: 0x2d1 */ 0xffff,
+ /* key: 0x2d2 */ 0xffff,
+ /* key: 0x2d3 */ 0xffff,
+ /* key: 0x2d4 */ 0xffff,
+ /* key: 0x2d5 */ 0xffff,
+ /* key: 0x2d6 */ 0xffff,
+ /* key: 0x2d7 */ 0xffff,
+ /* key: 0x2d8 */ 0xa22f,
+ /* key: 0x2d9 */ 0xa232,
+ /* key: 0x2da */ 0xa236,
+ /* key: 0x2db */ 0xa235,
+ /* key: 0x2dc */ 0xffff,
+ /* key: 0x2dd */ 0xa233,
+ /* key: 0x2de */ 0xffff,
+ /* key: 0x2df */ 0xffff,
+ /* branch: 0x030X */ 0,
+ /* branch: 0x031X */ 0,
+ /* branch: 0x032X */ 0,
+ /* branch: 0x033X */ 0,
+ /* branch: 0x034X */ 0,
+ /* branch: 0x035X */ 0,
+ /* branch: 0x036X */ 0,
+ /* branch: 0x037X */ 0,
+ /* branch: 0x038X */ 528,
+ /* branch: 0x039X */ 544,
+ /* branch: 0x03aX */ 560,
+ /* branch: 0x03bX */ 576,
+ /* branch: 0x03cX */ 592,
+ /* branch: 0x03dX */ 0,
+ /* branch: 0x03eX */ 0,
+ /* branch: 0x03fX */ 0,
+ /* key: 0x380 */ 0xffff,
+ /* key: 0x381 */ 0xffff,
+ /* key: 0x382 */ 0xffff,
+ /* key: 0x383 */ 0xffff,
+ /* key: 0x384 */ 0xa238,
+ /* key: 0x385 */ 0xa239,
+ /* key: 0x386 */ 0xa661,
+ /* key: 0x387 */ 0xffff,
+ /* key: 0x388 */ 0xa662,
+ /* key: 0x389 */ 0xa663,
+ /* key: 0x38a */ 0xa664,
+ /* key: 0x38b */ 0xffff,
+ /* key: 0x38c */ 0xa667,
+ /* key: 0x38d */ 0xffff,
+ /* key: 0x38e */ 0xa669,
+ /* key: 0x38f */ 0xa66c,
+ /* key: 0x390 */ 0xa676,
+ /* key: 0x391 */ 0x2621,
+ /* key: 0x392 */ 0x2622,
+ /* key: 0x393 */ 0x2623,
+ /* key: 0x394 */ 0x2624,
+ /* key: 0x395 */ 0x2625,
+ /* key: 0x396 */ 0x2626,
+ /* key: 0x397 */ 0x2627,
+ /* key: 0x398 */ 0x2628,
+ /* key: 0x399 */ 0x2629,
+ /* key: 0x39a */ 0x262a,
+ /* key: 0x39b */ 0x262b,
+ /* key: 0x39c */ 0x262c,
+ /* key: 0x39d */ 0x262d,
+ /* key: 0x39e */ 0x262e,
+ /* key: 0x39f */ 0x262f,
+ /* key: 0x3a0 */ 0x2630,
+ /* key: 0x3a1 */ 0x2631,
+ /* key: 0x3a2 */ 0xffff,
+ /* key: 0x3a3 */ 0x2632,
+ /* key: 0x3a4 */ 0x2633,
+ /* key: 0x3a5 */ 0x2634,
+ /* key: 0x3a6 */ 0x2635,
+ /* key: 0x3a7 */ 0x2636,
+ /* key: 0x3a8 */ 0x2637,
+ /* key: 0x3a9 */ 0x2638,
+ /* key: 0x3aa */ 0xa665,
+ /* key: 0x3ab */ 0xa66a,
+ /* key: 0x3ac */ 0xa671,
+ /* key: 0x3ad */ 0xa672,
+ /* key: 0x3ae */ 0xa673,
+ /* key: 0x3af */ 0xa674,
+ /* key: 0x3b0 */ 0xa67b,
+ /* key: 0x3b1 */ 0x2641,
+ /* key: 0x3b2 */ 0x2642,
+ /* key: 0x3b3 */ 0x2643,
+ /* key: 0x3b4 */ 0x2644,
+ /* key: 0x3b5 */ 0x2645,
+ /* key: 0x3b6 */ 0x2646,
+ /* key: 0x3b7 */ 0x2647,
+ /* key: 0x3b8 */ 0x2648,
+ /* key: 0x3b9 */ 0x2649,
+ /* key: 0x3ba */ 0x264a,
+ /* key: 0x3bb */ 0x264b,
+ /* key: 0x3bc */ 0x264c,
+ /* key: 0x3bd */ 0x264d,
+ /* key: 0x3be */ 0x264e,
+ /* key: 0x3bf */ 0x264f,
+ /* key: 0x3c0 */ 0x2650,
+ /* key: 0x3c1 */ 0x2651,
+ /* key: 0x3c2 */ 0xa678,
+ /* key: 0x3c3 */ 0x2652,
+ /* key: 0x3c4 */ 0x2653,
+ /* key: 0x3c5 */ 0x2654,
+ /* key: 0x3c6 */ 0x2655,
+ /* key: 0x3c7 */ 0x2656,
+ /* key: 0x3c8 */ 0x2657,
+ /* key: 0x3c9 */ 0x2658,
+ /* key: 0x3ca */ 0xa675,
+ /* key: 0x3cb */ 0xa67a,
+ /* key: 0x3cc */ 0xa677,
+ /* key: 0x3cd */ 0xa679,
+ /* key: 0x3ce */ 0xa67c,
+ /* key: 0x3cf */ 0xffff,
+ /* branch: 0x040X */ 624,
+ /* branch: 0x041X */ 640,
+ /* branch: 0x042X */ 656,
+ /* branch: 0x043X */ 672,
+ /* branch: 0x044X */ 688,
+ /* branch: 0x045X */ 704,
+ /* branch: 0x046X */ 0,
+ /* branch: 0x047X */ 0,
+ /* branch: 0x048X */ 0,
+ /* branch: 0x049X */ 0,
+ /* branch: 0x04aX */ 0,
+ /* branch: 0x04bX */ 0,
+ /* branch: 0x04cX */ 0,
+ /* branch: 0x04dX */ 0,
+ /* branch: 0x04eX */ 0,
+ /* branch: 0x04fX */ 0,
+ /* key: 0x400 */ 0xffff,
+ /* key: 0x401 */ 0x2727,
+ /* key: 0x402 */ 0xa742,
+ /* key: 0x403 */ 0xa743,
+ /* key: 0x404 */ 0xa744,
+ /* key: 0x405 */ 0xa745,
+ /* key: 0x406 */ 0xa746,
+ /* key: 0x407 */ 0xa747,
+ /* key: 0x408 */ 0xa748,
+ /* key: 0x409 */ 0xa749,
+ /* key: 0x40a */ 0xa74a,
+ /* key: 0x40b */ 0xa74b,
+ /* key: 0x40c */ 0xa74c,
+ /* key: 0x40d */ 0xffff,
+ /* key: 0x40e */ 0xa74d,
+ /* key: 0x40f */ 0xa74e,
+ /* key: 0x410 */ 0x2721,
+ /* key: 0x411 */ 0x2722,
+ /* key: 0x412 */ 0x2723,
+ /* key: 0x413 */ 0x2724,
+ /* key: 0x414 */ 0x2725,
+ /* key: 0x415 */ 0x2726,
+ /* key: 0x416 */ 0x2728,
+ /* key: 0x417 */ 0x2729,
+ /* key: 0x418 */ 0x272a,
+ /* key: 0x419 */ 0x272b,
+ /* key: 0x41a */ 0x272c,
+ /* key: 0x41b */ 0x272d,
+ /* key: 0x41c */ 0x272e,
+ /* key: 0x41d */ 0x272f,
+ /* key: 0x41e */ 0x2730,
+ /* key: 0x41f */ 0x2731,
+ /* key: 0x420 */ 0x2732,
+ /* key: 0x421 */ 0x2733,
+ /* key: 0x422 */ 0x2734,
+ /* key: 0x423 */ 0x2735,
+ /* key: 0x424 */ 0x2736,
+ /* key: 0x425 */ 0x2737,
+ /* key: 0x426 */ 0x2738,
+ /* key: 0x427 */ 0x2739,
+ /* key: 0x428 */ 0x273a,
+ /* key: 0x429 */ 0x273b,
+ /* key: 0x42a */ 0x273c,
+ /* key: 0x42b */ 0x273d,
+ /* key: 0x42c */ 0x273e,
+ /* key: 0x42d */ 0x273f,
+ /* key: 0x42e */ 0x2740,
+ /* key: 0x42f */ 0x2741,
+ /* key: 0x430 */ 0x2751,
+ /* key: 0x431 */ 0x2752,
+ /* key: 0x432 */ 0x2753,
+ /* key: 0x433 */ 0x2754,
+ /* key: 0x434 */ 0x2755,
+ /* key: 0x435 */ 0x2756,
+ /* key: 0x436 */ 0x2758,
+ /* key: 0x437 */ 0x2759,
+ /* key: 0x438 */ 0x275a,
+ /* key: 0x439 */ 0x275b,
+ /* key: 0x43a */ 0x275c,
+ /* key: 0x43b */ 0x275d,
+ /* key: 0x43c */ 0x275e,
+ /* key: 0x43d */ 0x275f,
+ /* key: 0x43e */ 0x2760,
+ /* key: 0x43f */ 0x2761,
+ /* key: 0x440 */ 0x2762,
+ /* key: 0x441 */ 0x2763,
+ /* key: 0x442 */ 0x2764,
+ /* key: 0x443 */ 0x2765,
+ /* key: 0x444 */ 0x2766,
+ /* key: 0x445 */ 0x2767,
+ /* key: 0x446 */ 0x2768,
+ /* key: 0x447 */ 0x2769,
+ /* key: 0x448 */ 0x276a,
+ /* key: 0x449 */ 0x276b,
+ /* key: 0x44a */ 0x276c,
+ /* key: 0x44b */ 0x276d,
+ /* key: 0x44c */ 0x276e,
+ /* key: 0x44d */ 0x276f,
+ /* key: 0x44e */ 0x2770,
+ /* key: 0x44f */ 0x2771,
+ /* key: 0x450 */ 0xffff,
+ /* key: 0x451 */ 0x2757,
+ /* key: 0x452 */ 0xa772,
+ /* key: 0x453 */ 0xa773,
+ /* key: 0x454 */ 0xa774,
+ /* key: 0x455 */ 0xa775,
+ /* key: 0x456 */ 0xa776,
+ /* key: 0x457 */ 0xa777,
+ /* key: 0x458 */ 0xa778,
+ /* key: 0x459 */ 0xa779,
+ /* key: 0x45a */ 0xa77a,
+ /* key: 0x45b */ 0xa77b,
+ /* key: 0x45c */ 0xa77c,
+ /* key: 0x45d */ 0xffff,
+ /* key: 0x45e */ 0xa77d,
+ /* key: 0x45f */ 0xa77e,
+ /* branch: 0x20XX */ 736,
+ /* branch: 0x21XX */ 800,
+ /* branch: 0x22XX */ 896,
+ /* branch: 0x23XX */ 1040,
+ /* branch: 0x24XX */ 0,
+ /* branch: 0x25XX */ 1072,
+ /* branch: 0x26XX */ 1232,
+ /* branch: 0x27XX */ 0,
+ /* branch: 0x28XX */ 0,
+ /* branch: 0x29XX */ 0,
+ /* branch: 0x2aXX */ 0,
+ /* branch: 0x2bXX */ 0,
+ /* branch: 0x2cXX */ 0,
+ /* branch: 0x2dXX */ 0,
+ /* branch: 0x2eXX */ 0,
+ /* branch: 0x2fXX */ 0,
+ /* branch: 0x200X */ 0,
+ /* branch: 0x201X */ 752,
+ /* branch: 0x202X */ 768,
+ /* branch: 0x203X */ 784,
+ /* branch: 0x204X */ 0,
+ /* branch: 0x205X */ 0,
+ /* branch: 0x206X */ 0,
+ /* branch: 0x207X */ 0,
+ /* branch: 0x208X */ 0,
+ /* branch: 0x209X */ 0,
+ /* branch: 0x20aX */ 0,
+ /* branch: 0x20bX */ 0,
+ /* branch: 0x20cX */ 0,
+ /* branch: 0x20dX */ 0,
+ /* branch: 0x20eX */ 0,
+ /* branch: 0x20fX */ 0,
+ /* key: 0x2010 */ 0x213e,
+ /* key: 0x2011 */ 0xffff,
+ /* key: 0x2012 */ 0xffff,
+ /* key: 0x2013 */ 0xffff,
+ /* key: 0x2014 */ 0xffff,
+ /* key: 0x2015 */ 0x213d,
+ /* key: 0x2016 */ 0x2142,
+ /* key: 0x2017 */ 0xffff,
+ /* key: 0x2018 */ 0x2146,
+ /* key: 0x2019 */ 0x2147,
+ /* key: 0x201a */ 0xffff,
+ /* key: 0x201b */ 0xffff,
+ /* key: 0x201c */ 0x2148,
+ /* key: 0x201d */ 0x2149,
+ /* key: 0x201e */ 0xffff,
+ /* key: 0x201f */ 0xffff,
+ /* key: 0x2020 */ 0x2277,
+ /* key: 0x2021 */ 0x2278,
+ /* key: 0x2022 */ 0xffff,
+ /* key: 0x2023 */ 0xffff,
+ /* key: 0x2024 */ 0xffff,
+ /* key: 0x2025 */ 0x2145,
+ /* key: 0x2026 */ 0x2144,
+ /* key: 0x2027 */ 0xffff,
+ /* key: 0x2028 */ 0xffff,
+ /* key: 0x2029 */ 0xffff,
+ /* key: 0x202a */ 0xffff,
+ /* key: 0x202b */ 0xffff,
+ /* key: 0x202c */ 0xffff,
+ /* key: 0x202d */ 0xffff,
+ /* key: 0x202e */ 0xffff,
+ /* key: 0x202f */ 0xffff,
+ /* key: 0x2030 */ 0x2273,
+ /* key: 0x2031 */ 0xffff,
+ /* key: 0x2032 */ 0x216c,
+ /* key: 0x2033 */ 0x216d,
+ /* key: 0x2034 */ 0xffff,
+ /* key: 0x2035 */ 0xffff,
+ /* key: 0x2036 */ 0xffff,
+ /* key: 0x2037 */ 0xffff,
+ /* key: 0x2038 */ 0xffff,
+ /* key: 0x2039 */ 0xffff,
+ /* key: 0x203a */ 0xffff,
+ /* key: 0x203b */ 0x2228,
+ /* key: 0x203c */ 0xffff,
+ /* key: 0x203d */ 0xffff,
+ /* key: 0x203e */ 0x7e,
+ /* key: 0x203f */ 0xffff,
+ /* branch: 0x210X */ 816,
+ /* branch: 0x211X */ 832,
+ /* branch: 0x212X */ 848,
+ /* branch: 0x213X */ 0,
+ /* branch: 0x214X */ 0,
+ /* branch: 0x215X */ 0,
+ /* branch: 0x216X */ 0,
+ /* branch: 0x217X */ 0,
+ /* branch: 0x218X */ 0,
+ /* branch: 0x219X */ 864,
+ /* branch: 0x21aX */ 0,
+ /* branch: 0x21bX */ 0,
+ /* branch: 0x21cX */ 0,
+ /* branch: 0x21dX */ 880,
+ /* branch: 0x21eX */ 0,
+ /* branch: 0x21fX */ 0,
+ /* key: 0x2100 */ 0xffff,
+ /* key: 0x2101 */ 0xffff,
+ /* key: 0x2102 */ 0xffff,
+ /* key: 0x2103 */ 0x216e,
+ /* key: 0x2104 */ 0xffff,
+ /* key: 0x2105 */ 0xffff,
+ /* key: 0x2106 */ 0xffff,
+ /* key: 0x2107 */ 0xffff,
+ /* key: 0x2108 */ 0xffff,
+ /* key: 0x2109 */ 0xffff,
+ /* key: 0x210a */ 0xffff,
+ /* key: 0x210b */ 0xffff,
+ /* key: 0x210c */ 0xffff,
+ /* key: 0x210d */ 0xffff,
+ /* key: 0x210e */ 0xffff,
+ /* key: 0x210f */ 0xffff,
+ /* key: 0x2110 */ 0xffff,
+ /* key: 0x2111 */ 0xffff,
+ /* key: 0x2112 */ 0xffff,
+ /* key: 0x2113 */ 0xffff,
+ /* key: 0x2114 */ 0xffff,
+ /* key: 0x2115 */ 0xffff,
+ /* key: 0x2116 */ 0xa271,
+ /* key: 0x2117 */ 0xffff,
+ /* key: 0x2118 */ 0xffff,
+ /* key: 0x2119 */ 0xffff,
+ /* key: 0x211a */ 0xffff,
+ /* key: 0x211b */ 0xffff,
+ /* key: 0x211c */ 0xffff,
+ /* key: 0x211d */ 0xffff,
+ /* key: 0x211e */ 0xffff,
+ /* key: 0x211f */ 0xffff,
+ /* key: 0x2120 */ 0xffff,
+ /* key: 0x2121 */ 0xffff,
+ /* key: 0x2122 */ 0xa26f,
+ /* key: 0x2123 */ 0xffff,
+ /* key: 0x2124 */ 0xffff,
+ /* key: 0x2125 */ 0xffff,
+ /* key: 0x2126 */ 0xffff,
+ /* key: 0x2127 */ 0xffff,
+ /* key: 0x2128 */ 0xffff,
+ /* key: 0x2129 */ 0xffff,
+ /* key: 0x212a */ 0xffff,
+ /* key: 0x212b */ 0x2272,
+ /* key: 0x212c */ 0xffff,
+ /* key: 0x212d */ 0xffff,
+ /* key: 0x212e */ 0xffff,
+ /* key: 0x212f */ 0xffff,
+ /* key: 0x2190 */ 0x222b,
+ /* key: 0x2191 */ 0x222c,
+ /* key: 0x2192 */ 0x222a,
+ /* key: 0x2193 */ 0x222d,
+ /* key: 0x2194 */ 0xffff,
+ /* key: 0x2195 */ 0xffff,
+ /* key: 0x2196 */ 0xffff,
+ /* key: 0x2197 */ 0xffff,
+ /* key: 0x2198 */ 0xffff,
+ /* key: 0x2199 */ 0xffff,
+ /* key: 0x219a */ 0xffff,
+ /* key: 0x219b */ 0xffff,
+ /* key: 0x219c */ 0xffff,
+ /* key: 0x219d */ 0xffff,
+ /* key: 0x219e */ 0xffff,
+ /* key: 0x219f */ 0xffff,
+ /* key: 0x21d0 */ 0xffff,
+ /* key: 0x21d1 */ 0xffff,
+ /* key: 0x21d2 */ 0x224d,
+ /* key: 0x21d3 */ 0xffff,
+ /* key: 0x21d4 */ 0x224e,
+ /* key: 0x21d5 */ 0xffff,
+ /* key: 0x21d6 */ 0xffff,
+ /* key: 0x21d7 */ 0xffff,
+ /* key: 0x21d8 */ 0xffff,
+ /* key: 0x21d9 */ 0xffff,
+ /* key: 0x21da */ 0xffff,
+ /* key: 0x21db */ 0xffff,
+ /* key: 0x21dc */ 0xffff,
+ /* key: 0x21dd */ 0xffff,
+ /* key: 0x21de */ 0xffff,
+ /* key: 0x21df */ 0xffff,
+ /* branch: 0x220X */ 912,
+ /* branch: 0x221X */ 928,
+ /* branch: 0x222X */ 944,
+ /* branch: 0x223X */ 960,
+ /* branch: 0x224X */ 0,
+ /* branch: 0x225X */ 976,
+ /* branch: 0x226X */ 992,
+ /* branch: 0x227X */ 0,
+ /* branch: 0x228X */ 1008,
+ /* branch: 0x229X */ 0,
+ /* branch: 0x22aX */ 1024,
+ /* branch: 0x22bX */ 0,
+ /* branch: 0x22cX */ 0,
+ /* branch: 0x22dX */ 0,
+ /* branch: 0x22eX */ 0,
+ /* branch: 0x22fX */ 0,
+ /* key: 0x2200 */ 0x224f,
+ /* key: 0x2201 */ 0xffff,
+ /* key: 0x2202 */ 0x225f,
+ /* key: 0x2203 */ 0x2250,
+ /* key: 0x2204 */ 0xffff,
+ /* key: 0x2205 */ 0xffff,
+ /* key: 0x2206 */ 0xffff,
+ /* key: 0x2207 */ 0x2260,
+ /* key: 0x2208 */ 0x223a,
+ /* key: 0x2209 */ 0xffff,
+ /* key: 0x220a */ 0xffff,
+ /* key: 0x220b */ 0x223b,
+ /* key: 0x220c */ 0xffff,
+ /* key: 0x220d */ 0xffff,
+ /* key: 0x220e */ 0xffff,
+ /* key: 0x220f */ 0xffff,
+ /* key: 0x2210 */ 0xffff,
+ /* key: 0x2211 */ 0xffff,
+ /* key: 0x2212 */ 0x215d,
+ /* key: 0x2213 */ 0xffff,
+ /* key: 0x2214 */ 0xffff,
+ /* key: 0x2215 */ 0xffff,
+ /* key: 0x2216 */ 0xffff,
+ /* key: 0x2217 */ 0xffff,
+ /* key: 0x2218 */ 0xffff,
+ /* key: 0x2219 */ 0xffff,
+ /* key: 0x221a */ 0x2265,
+ /* key: 0x221b */ 0xffff,
+ /* key: 0x221c */ 0xffff,
+ /* key: 0x221d */ 0x2267,
+ /* key: 0x221e */ 0x2167,
+ /* key: 0x221f */ 0xffff,
+ /* key: 0x2220 */ 0x225c,
+ /* key: 0x2221 */ 0xffff,
+ /* key: 0x2222 */ 0xffff,
+ /* key: 0x2223 */ 0xffff,
+ /* key: 0x2224 */ 0xffff,
+ /* key: 0x2225 */ 0xffff,
+ /* key: 0x2226 */ 0xffff,
+ /* key: 0x2227 */ 0x224a,
+ /* key: 0x2228 */ 0x224b,
+ /* key: 0x2229 */ 0x2241,
+ /* key: 0x222a */ 0x2240,
+ /* key: 0x222b */ 0x2269,
+ /* key: 0x222c */ 0x226a,
+ /* key: 0x222d */ 0xffff,
+ /* key: 0x222e */ 0xffff,
+ /* key: 0x222f */ 0xffff,
+ /* key: 0x2230 */ 0xffff,
+ /* key: 0x2231 */ 0xffff,
+ /* key: 0x2232 */ 0xffff,
+ /* key: 0x2233 */ 0xffff,
+ /* key: 0x2234 */ 0x2168,
+ /* key: 0x2235 */ 0x2268,
+ /* key: 0x2236 */ 0xffff,
+ /* key: 0x2237 */ 0xffff,
+ /* key: 0x2238 */ 0xffff,
+ /* key: 0x2239 */ 0xffff,
+ /* key: 0x223a */ 0xffff,
+ /* key: 0x223b */ 0xffff,
+ /* key: 0x223c */ 0xffff,
+ /* key: 0x223d */ 0x2266,
+ /* key: 0x223e */ 0xffff,
+ /* key: 0x223f */ 0xffff,
+ /* key: 0x2250 */ 0xffff,
+ /* key: 0x2251 */ 0xffff,
+ /* key: 0x2252 */ 0x2262,
+ /* key: 0x2253 */ 0xffff,
+ /* key: 0x2254 */ 0xffff,
+ /* key: 0x2255 */ 0xffff,
+ /* key: 0x2256 */ 0xffff,
+ /* key: 0x2257 */ 0xffff,
+ /* key: 0x2258 */ 0xffff,
+ /* key: 0x2259 */ 0xffff,
+ /* key: 0x225a */ 0xffff,
+ /* key: 0x225b */ 0xffff,
+ /* key: 0x225c */ 0xffff,
+ /* key: 0x225d */ 0xffff,
+ /* key: 0x225e */ 0xffff,
+ /* key: 0x225f */ 0xffff,
+ /* key: 0x2260 */ 0x2162,
+ /* key: 0x2261 */ 0x2261,
+ /* key: 0x2262 */ 0xffff,
+ /* key: 0x2263 */ 0xffff,
+ /* key: 0x2264 */ 0xffff,
+ /* key: 0x2265 */ 0xffff,
+ /* key: 0x2266 */ 0x2165,
+ /* key: 0x2267 */ 0x2166,
+ /* key: 0x2268 */ 0xffff,
+ /* key: 0x2269 */ 0xffff,
+ /* key: 0x226a */ 0x2263,
+ /* key: 0x226b */ 0x2264,
+ /* key: 0x226c */ 0xffff,
+ /* key: 0x226d */ 0xffff,
+ /* key: 0x226e */ 0xffff,
+ /* key: 0x226f */ 0xffff,
+ /* key: 0x2280 */ 0xffff,
+ /* key: 0x2281 */ 0xffff,
+ /* key: 0x2282 */ 0x223e,
+ /* key: 0x2283 */ 0x223f,
+ /* key: 0x2284 */ 0xffff,
+ /* key: 0x2285 */ 0xffff,
+ /* key: 0x2286 */ 0x223c,
+ /* key: 0x2287 */ 0x223d,
+ /* key: 0x2288 */ 0xffff,
+ /* key: 0x2289 */ 0xffff,
+ /* key: 0x228a */ 0xffff,
+ /* key: 0x228b */ 0xffff,
+ /* key: 0x228c */ 0xffff,
+ /* key: 0x228d */ 0xffff,
+ /* key: 0x228e */ 0xffff,
+ /* key: 0x228f */ 0xffff,
+ /* key: 0x22a0 */ 0xffff,
+ /* key: 0x22a1 */ 0xffff,
+ /* key: 0x22a2 */ 0xffff,
+ /* key: 0x22a3 */ 0xffff,
+ /* key: 0x22a4 */ 0xffff,
+ /* key: 0x22a5 */ 0x225d,
+ /* key: 0x22a6 */ 0xffff,
+ /* key: 0x22a7 */ 0xffff,
+ /* key: 0x22a8 */ 0xffff,
+ /* key: 0x22a9 */ 0xffff,
+ /* key: 0x22aa */ 0xffff,
+ /* key: 0x22ab */ 0xffff,
+ /* key: 0x22ac */ 0xffff,
+ /* key: 0x22ad */ 0xffff,
+ /* key: 0x22ae */ 0xffff,
+ /* key: 0x22af */ 0xffff,
+ /* branch: 0x230X */ 0,
+ /* branch: 0x231X */ 1056,
+ /* branch: 0x232X */ 0,
+ /* branch: 0x233X */ 0,
+ /* branch: 0x234X */ 0,
+ /* branch: 0x235X */ 0,
+ /* branch: 0x236X */ 0,
+ /* branch: 0x237X */ 0,
+ /* branch: 0x238X */ 0,
+ /* branch: 0x239X */ 0,
+ /* branch: 0x23aX */ 0,
+ /* branch: 0x23bX */ 0,
+ /* branch: 0x23cX */ 0,
+ /* branch: 0x23dX */ 0,
+ /* branch: 0x23eX */ 0,
+ /* branch: 0x23fX */ 0,
+ /* key: 0x2310 */ 0xffff,
+ /* key: 0x2311 */ 0xffff,
+ /* key: 0x2312 */ 0x225e,
+ /* key: 0x2313 */ 0xffff,
+ /* key: 0x2314 */ 0xffff,
+ /* key: 0x2315 */ 0xffff,
+ /* key: 0x2316 */ 0xffff,
+ /* key: 0x2317 */ 0xffff,
+ /* key: 0x2318 */ 0xffff,
+ /* key: 0x2319 */ 0xffff,
+ /* key: 0x231a */ 0xffff,
+ /* key: 0x231b */ 0xffff,
+ /* key: 0x231c */ 0xffff,
+ /* key: 0x231d */ 0xffff,
+ /* key: 0x231e */ 0xffff,
+ /* key: 0x231f */ 0xffff,
+ /* branch: 0x250X */ 1088,
+ /* branch: 0x251X */ 1104,
+ /* branch: 0x252X */ 1120,
+ /* branch: 0x253X */ 1136,
+ /* branch: 0x254X */ 1152,
+ /* branch: 0x255X */ 0,
+ /* branch: 0x256X */ 0,
+ /* branch: 0x257X */ 0,
+ /* branch: 0x258X */ 0,
+ /* branch: 0x259X */ 0,
+ /* branch: 0x25aX */ 1168,
+ /* branch: 0x25bX */ 1184,
+ /* branch: 0x25cX */ 1200,
+ /* branch: 0x25dX */ 0,
+ /* branch: 0x25eX */ 1216,
+ /* branch: 0x25fX */ 0,
+ /* key: 0x2500 */ 0x2821,
+ /* key: 0x2501 */ 0x282c,
+ /* key: 0x2502 */ 0x2822,
+ /* key: 0x2503 */ 0x282d,
+ /* key: 0x2504 */ 0xffff,
+ /* key: 0x2505 */ 0xffff,
+ /* key: 0x2506 */ 0xffff,
+ /* key: 0x2507 */ 0xffff,
+ /* key: 0x2508 */ 0xffff,
+ /* key: 0x2509 */ 0xffff,
+ /* key: 0x250a */ 0xffff,
+ /* key: 0x250b */ 0xffff,
+ /* key: 0x250c */ 0x2823,
+ /* key: 0x250d */ 0xffff,
+ /* key: 0x250e */ 0xffff,
+ /* key: 0x250f */ 0x282e,
+ /* key: 0x2510 */ 0x2824,
+ /* key: 0x2511 */ 0xffff,
+ /* key: 0x2512 */ 0xffff,
+ /* key: 0x2513 */ 0x282f,
+ /* key: 0x2514 */ 0x2826,
+ /* key: 0x2515 */ 0xffff,
+ /* key: 0x2516 */ 0xffff,
+ /* key: 0x2517 */ 0x2831,
+ /* key: 0x2518 */ 0x2825,
+ /* key: 0x2519 */ 0xffff,
+ /* key: 0x251a */ 0xffff,
+ /* key: 0x251b */ 0x2830,
+ /* key: 0x251c */ 0x2827,
+ /* key: 0x251d */ 0x283c,
+ /* key: 0x251e */ 0xffff,
+ /* key: 0x251f */ 0xffff,
+ /* key: 0x2520 */ 0x2837,
+ /* key: 0x2521 */ 0xffff,
+ /* key: 0x2522 */ 0xffff,
+ /* key: 0x2523 */ 0x2832,
+ /* key: 0x2524 */ 0x2829,
+ /* key: 0x2525 */ 0x283e,
+ /* key: 0x2526 */ 0xffff,
+ /* key: 0x2527 */ 0xffff,
+ /* key: 0x2528 */ 0x2839,
+ /* key: 0x2529 */ 0xffff,
+ /* key: 0x252a */ 0xffff,
+ /* key: 0x252b */ 0x2834,
+ /* key: 0x252c */ 0x2828,
+ /* key: 0x252d */ 0xffff,
+ /* key: 0x252e */ 0xffff,
+ /* key: 0x252f */ 0x2838,
+ /* key: 0x2530 */ 0x283d,
+ /* key: 0x2531 */ 0xffff,
+ /* key: 0x2532 */ 0xffff,
+ /* key: 0x2533 */ 0x2833,
+ /* key: 0x2534 */ 0x282a,
+ /* key: 0x2535 */ 0xffff,
+ /* key: 0x2536 */ 0xffff,
+ /* key: 0x2537 */ 0x283a,
+ /* key: 0x2538 */ 0x283f,
+ /* key: 0x2539 */ 0xffff,
+ /* key: 0x253a */ 0xffff,
+ /* key: 0x253b */ 0x2835,
+ /* key: 0x253c */ 0x282b,
+ /* key: 0x253d */ 0xffff,
+ /* key: 0x253e */ 0xffff,
+ /* key: 0x253f */ 0x283b,
+ /* key: 0x2540 */ 0xffff,
+ /* key: 0x2541 */ 0xffff,
+ /* key: 0x2542 */ 0x2840,
+ /* key: 0x2543 */ 0xffff,
+ /* key: 0x2544 */ 0xffff,
+ /* key: 0x2545 */ 0xffff,
+ /* key: 0x2546 */ 0xffff,
+ /* key: 0x2547 */ 0xffff,
+ /* key: 0x2548 */ 0xffff,
+ /* key: 0x2549 */ 0xffff,
+ /* key: 0x254a */ 0xffff,
+ /* key: 0x254b */ 0x2836,
+ /* key: 0x254c */ 0xffff,
+ /* key: 0x254d */ 0xffff,
+ /* key: 0x254e */ 0xffff,
+ /* key: 0x254f */ 0xffff,
+ /* key: 0x25a0 */ 0x2223,
+ /* key: 0x25a1 */ 0x2222,
+ /* key: 0x25a2 */ 0xffff,
+ /* key: 0x25a3 */ 0xffff,
+ /* key: 0x25a4 */ 0xffff,
+ /* key: 0x25a5 */ 0xffff,
+ /* key: 0x25a6 */ 0xffff,
+ /* key: 0x25a7 */ 0xffff,
+ /* key: 0x25a8 */ 0xffff,
+ /* key: 0x25a9 */ 0xffff,
+ /* key: 0x25aa */ 0xffff,
+ /* key: 0x25ab */ 0xffff,
+ /* key: 0x25ac */ 0xffff,
+ /* key: 0x25ad */ 0xffff,
+ /* key: 0x25ae */ 0xffff,
+ /* key: 0x25af */ 0xffff,
+ /* key: 0x25b0 */ 0xffff,
+ /* key: 0x25b1 */ 0xffff,
+ /* key: 0x25b2 */ 0x2225,
+ /* key: 0x25b3 */ 0x2224,
+ /* key: 0x25b4 */ 0xffff,
+ /* key: 0x25b5 */ 0xffff,
+ /* key: 0x25b6 */ 0xffff,
+ /* key: 0x25b7 */ 0xffff,
+ /* key: 0x25b8 */ 0xffff,
+ /* key: 0x25b9 */ 0xffff,
+ /* key: 0x25ba */ 0xffff,
+ /* key: 0x25bb */ 0xffff,
+ /* key: 0x25bc */ 0x2227,
+ /* key: 0x25bd */ 0x2226,
+ /* key: 0x25be */ 0xffff,
+ /* key: 0x25bf */ 0xffff,
+ /* key: 0x25c0 */ 0xffff,
+ /* key: 0x25c1 */ 0xffff,
+ /* key: 0x25c2 */ 0xffff,
+ /* key: 0x25c3 */ 0xffff,
+ /* key: 0x25c4 */ 0xffff,
+ /* key: 0x25c5 */ 0xffff,
+ /* key: 0x25c6 */ 0x2221,
+ /* key: 0x25c7 */ 0x217e,
+ /* key: 0x25c8 */ 0xffff,
+ /* key: 0x25c9 */ 0xffff,
+ /* key: 0x25ca */ 0xffff,
+ /* key: 0x25cb */ 0x217b,
+ /* key: 0x25cc */ 0xffff,
+ /* key: 0x25cd */ 0xffff,
+ /* key: 0x25ce */ 0x217d,
+ /* key: 0x25cf */ 0x217c,
+ /* key: 0x25e0 */ 0xffff,
+ /* key: 0x25e1 */ 0xffff,
+ /* key: 0x25e2 */ 0xffff,
+ /* key: 0x25e3 */ 0xffff,
+ /* key: 0x25e4 */ 0xffff,
+ /* key: 0x25e5 */ 0xffff,
+ /* key: 0x25e6 */ 0xffff,
+ /* key: 0x25e7 */ 0xffff,
+ /* key: 0x25e8 */ 0xffff,
+ /* key: 0x25e9 */ 0xffff,
+ /* key: 0x25ea */ 0xffff,
+ /* key: 0x25eb */ 0xffff,
+ /* key: 0x25ec */ 0xffff,
+ /* key: 0x25ed */ 0xffff,
+ /* key: 0x25ee */ 0xffff,
+ /* key: 0x25ef */ 0x227e,
+ /* branch: 0x260X */ 1248,
+ /* branch: 0x261X */ 0,
+ /* branch: 0x262X */ 0,
+ /* branch: 0x263X */ 0,
+ /* branch: 0x264X */ 1264,
+ /* branch: 0x265X */ 0,
+ /* branch: 0x266X */ 1280,
+ /* branch: 0x267X */ 0,
+ /* branch: 0x268X */ 0,
+ /* branch: 0x269X */ 0,
+ /* branch: 0x26aX */ 0,
+ /* branch: 0x26bX */ 0,
+ /* branch: 0x26cX */ 0,
+ /* branch: 0x26dX */ 0,
+ /* branch: 0x26eX */ 0,
+ /* branch: 0x26fX */ 0,
+ /* key: 0x2600 */ 0xffff,
+ /* key: 0x2601 */ 0xffff,
+ /* key: 0x2602 */ 0xffff,
+ /* key: 0x2603 */ 0xffff,
+ /* key: 0x2604 */ 0xffff,
+ /* key: 0x2605 */ 0x217a,
+ /* key: 0x2606 */ 0x2179,
+ /* key: 0x2607 */ 0xffff,
+ /* key: 0x2608 */ 0xffff,
+ /* key: 0x2609 */ 0xffff,
+ /* key: 0x260a */ 0xffff,
+ /* key: 0x260b */ 0xffff,
+ /* key: 0x260c */ 0xffff,
+ /* key: 0x260d */ 0xffff,
+ /* key: 0x260e */ 0xffff,
+ /* key: 0x260f */ 0xffff,
+ /* key: 0x2640 */ 0x216a,
+ /* key: 0x2641 */ 0xffff,
+ /* key: 0x2642 */ 0x2169,
+ /* key: 0x2643 */ 0xffff,
+ /* key: 0x2644 */ 0xffff,
+ /* key: 0x2645 */ 0xffff,
+ /* key: 0x2646 */ 0xffff,
+ /* key: 0x2647 */ 0xffff,
+ /* key: 0x2648 */ 0xffff,
+ /* key: 0x2649 */ 0xffff,
+ /* key: 0x264a */ 0xffff,
+ /* key: 0x264b */ 0xffff,
+ /* key: 0x264c */ 0xffff,
+ /* key: 0x264d */ 0xffff,
+ /* key: 0x264e */ 0xffff,
+ /* key: 0x264f */ 0xffff,
+ /* key: 0x2660 */ 0xffff,
+ /* key: 0x2661 */ 0xffff,
+ /* key: 0x2662 */ 0xffff,
+ /* key: 0x2663 */ 0xffff,
+ /* key: 0x2664 */ 0xffff,
+ /* key: 0x2665 */ 0xffff,
+ /* key: 0x2666 */ 0xffff,
+ /* key: 0x2667 */ 0xffff,
+ /* key: 0x2668 */ 0xffff,
+ /* key: 0x2669 */ 0xffff,
+ /* key: 0x266a */ 0x2276,
+ /* key: 0x266b */ 0xffff,
+ /* key: 0x266c */ 0xffff,
+ /* key: 0x266d */ 0x2275,
+ /* key: 0x266e */ 0xffff,
+ /* key: 0x266f */ 0x2274,
+ /* branch: 0x30XX */ 1312,
+ /* branch: 0x31XX */ 0,
+ /* branch: 0x32XX */ 0,
+ /* branch: 0x33XX */ 0,
+ /* branch: 0x34XX */ 0,
+ /* branch: 0x35XX */ 0,
+ /* branch: 0x36XX */ 0,
+ /* branch: 0x37XX */ 0,
+ /* branch: 0x38XX */ 0,
+ /* branch: 0x39XX */ 0,
+ /* branch: 0x3aXX */ 0,
+ /* branch: 0x3bXX */ 0,
+ /* branch: 0x3cXX */ 0,
+ /* branch: 0x3dXX */ 0,
+ /* branch: 0x3eXX */ 0,
+ /* branch: 0x3fXX */ 0,
+ /* branch: 0x300X */ 1328,
+ /* branch: 0x301X */ 1344,
+ /* branch: 0x302X */ 0,
+ /* branch: 0x303X */ 0,
+ /* branch: 0x304X */ 1360,
+ /* branch: 0x305X */ 1376,
+ /* branch: 0x306X */ 1392,
+ /* branch: 0x307X */ 1408,
+ /* branch: 0x308X */ 1424,
+ /* branch: 0x309X */ 1440,
+ /* branch: 0x30aX */ 1456,
+ /* branch: 0x30bX */ 1472,
+ /* branch: 0x30cX */ 1488,
+ /* branch: 0x30dX */ 1504,
+ /* branch: 0x30eX */ 1520,
+ /* branch: 0x30fX */ 1536,
+ /* key: 0x3000 */ 0x2121,
+ /* key: 0x3001 */ 0x2122,
+ /* key: 0x3002 */ 0x2123,
+ /* key: 0x3003 */ 0x2137,
+ /* key: 0x3004 */ 0xffff,
+ /* key: 0x3005 */ 0x2139,
+ /* key: 0x3006 */ 0x213a,
+ /* key: 0x3007 */ 0x213b,
+ /* key: 0x3008 */ 0x2152,
+ /* key: 0x3009 */ 0x2153,
+ /* key: 0x300a */ 0x2154,
+ /* key: 0x300b */ 0x2155,
+ /* key: 0x300c */ 0x2156,
+ /* key: 0x300d */ 0x2157,
+ /* key: 0x300e */ 0x2158,
+ /* key: 0x300f */ 0x2159,
+ /* key: 0x3010 */ 0x215a,
+ /* key: 0x3011 */ 0x215b,
+ /* key: 0x3012 */ 0x2229,
+ /* key: 0x3013 */ 0x222e,
+ /* key: 0x3014 */ 0x214c,
+ /* key: 0x3015 */ 0x214d,
+ /* key: 0x3016 */ 0xffff,
+ /* key: 0x3017 */ 0xffff,
+ /* key: 0x3018 */ 0xffff,
+ /* key: 0x3019 */ 0xffff,
+ /* key: 0x301a */ 0xffff,
+ /* key: 0x301b */ 0xffff,
+ /* key: 0x301c */ 0x2141,
+ /* key: 0x301d */ 0xffff,
+ /* key: 0x301e */ 0xffff,
+ /* key: 0x301f */ 0xffff,
+ /* key: 0x3040 */ 0xffff,
+ /* key: 0x3041 */ 0x2421,
+ /* key: 0x3042 */ 0x2422,
+ /* key: 0x3043 */ 0x2423,
+ /* key: 0x3044 */ 0x2424,
+ /* key: 0x3045 */ 0x2425,
+ /* key: 0x3046 */ 0x2426,
+ /* key: 0x3047 */ 0x2427,
+ /* key: 0x3048 */ 0x2428,
+ /* key: 0x3049 */ 0x2429,
+ /* key: 0x304a */ 0x242a,
+ /* key: 0x304b */ 0x242b,
+ /* key: 0x304c */ 0x242c,
+ /* key: 0x304d */ 0x242d,
+ /* key: 0x304e */ 0x242e,
+ /* key: 0x304f */ 0x242f,
+ /* key: 0x3050 */ 0x2430,
+ /* key: 0x3051 */ 0x2431,
+ /* key: 0x3052 */ 0x2432,
+ /* key: 0x3053 */ 0x2433,
+ /* key: 0x3054 */ 0x2434,
+ /* key: 0x3055 */ 0x2435,
+ /* key: 0x3056 */ 0x2436,
+ /* key: 0x3057 */ 0x2437,
+ /* key: 0x3058 */ 0x2438,
+ /* key: 0x3059 */ 0x2439,
+ /* key: 0x305a */ 0x243a,
+ /* key: 0x305b */ 0x243b,
+ /* key: 0x305c */ 0x243c,
+ /* key: 0x305d */ 0x243d,
+ /* key: 0x305e */ 0x243e,
+ /* key: 0x305f */ 0x243f,
+ /* key: 0x3060 */ 0x2440,
+ /* key: 0x3061 */ 0x2441,
+ /* key: 0x3062 */ 0x2442,
+ /* key: 0x3063 */ 0x2443,
+ /* key: 0x3064 */ 0x2444,
+ /* key: 0x3065 */ 0x2445,
+ /* key: 0x3066 */ 0x2446,
+ /* key: 0x3067 */ 0x2447,
+ /* key: 0x3068 */ 0x2448,
+ /* key: 0x3069 */ 0x2449,
+ /* key: 0x306a */ 0x244a,
+ /* key: 0x306b */ 0x244b,
+ /* key: 0x306c */ 0x244c,
+ /* key: 0x306d */ 0x244d,
+ /* key: 0x306e */ 0x244e,
+ /* key: 0x306f */ 0x244f,
+ /* key: 0x3070 */ 0x2450,
+ /* key: 0x3071 */ 0x2451,
+ /* key: 0x3072 */ 0x2452,
+ /* key: 0x3073 */ 0x2453,
+ /* key: 0x3074 */ 0x2454,
+ /* key: 0x3075 */ 0x2455,
+ /* key: 0x3076 */ 0x2456,
+ /* key: 0x3077 */ 0x2457,
+ /* key: 0x3078 */ 0x2458,
+ /* key: 0x3079 */ 0x2459,
+ /* key: 0x307a */ 0x245a,
+ /* key: 0x307b */ 0x245b,
+ /* key: 0x307c */ 0x245c,
+ /* key: 0x307d */ 0x245d,
+ /* key: 0x307e */ 0x245e,
+ /* key: 0x307f */ 0x245f,
+ /* key: 0x3080 */ 0x2460,
+ /* key: 0x3081 */ 0x2461,
+ /* key: 0x3082 */ 0x2462,
+ /* key: 0x3083 */ 0x2463,
+ /* key: 0x3084 */ 0x2464,
+ /* key: 0x3085 */ 0x2465,
+ /* key: 0x3086 */ 0x2466,
+ /* key: 0x3087 */ 0x2467,
+ /* key: 0x3088 */ 0x2468,
+ /* key: 0x3089 */ 0x2469,
+ /* key: 0x308a */ 0x246a,
+ /* key: 0x308b */ 0x246b,
+ /* key: 0x308c */ 0x246c,
+ /* key: 0x308d */ 0x246d,
+ /* key: 0x308e */ 0x246e,
+ /* key: 0x308f */ 0x246f,
+ /* key: 0x3090 */ 0x2470,
+ /* key: 0x3091 */ 0x2471,
+ /* key: 0x3092 */ 0x2472,
+ /* key: 0x3093 */ 0x2473,
+ /* key: 0x3094 */ 0xffff,
+ /* key: 0x3095 */ 0xffff,
+ /* key: 0x3096 */ 0xffff,
+ /* key: 0x3097 */ 0xffff,
+ /* key: 0x3098 */ 0xffff,
+ /* key: 0x3099 */ 0xffff,
+ /* key: 0x309a */ 0xffff,
+ /* key: 0x309b */ 0x212b,
+ /* key: 0x309c */ 0x212c,
+ /* key: 0x309d */ 0x2135,
+ /* key: 0x309e */ 0x2136,
+ /* key: 0x309f */ 0xffff,
+ /* key: 0x30a0 */ 0xffff,
+ /* key: 0x30a1 */ 0x2521,
+ /* key: 0x30a2 */ 0x2522,
+ /* key: 0x30a3 */ 0x2523,
+ /* key: 0x30a4 */ 0x2524,
+ /* key: 0x30a5 */ 0x2525,
+ /* key: 0x30a6 */ 0x2526,
+ /* key: 0x30a7 */ 0x2527,
+ /* key: 0x30a8 */ 0x2528,
+ /* key: 0x30a9 */ 0x2529,
+ /* key: 0x30aa */ 0x252a,
+ /* key: 0x30ab */ 0x252b,
+ /* key: 0x30ac */ 0x252c,
+ /* key: 0x30ad */ 0x252d,
+ /* key: 0x30ae */ 0x252e,
+ /* key: 0x30af */ 0x252f,
+ /* key: 0x30b0 */ 0x2530,
+ /* key: 0x30b1 */ 0x2531,
+ /* key: 0x30b2 */ 0x2532,
+ /* key: 0x30b3 */ 0x2533,
+ /* key: 0x30b4 */ 0x2534,
+ /* key: 0x30b5 */ 0x2535,
+ /* key: 0x30b6 */ 0x2536,
+ /* key: 0x30b7 */ 0x2537,
+ /* key: 0x30b8 */ 0x2538,
+ /* key: 0x30b9 */ 0x2539,
+ /* key: 0x30ba */ 0x253a,
+ /* key: 0x30bb */ 0x253b,
+ /* key: 0x30bc */ 0x253c,
+ /* key: 0x30bd */ 0x253d,
+ /* key: 0x30be */ 0x253e,
+ /* key: 0x30bf */ 0x253f,
+ /* key: 0x30c0 */ 0x2540,
+ /* key: 0x30c1 */ 0x2541,
+ /* key: 0x30c2 */ 0x2542,
+ /* key: 0x30c3 */ 0x2543,
+ /* key: 0x30c4 */ 0x2544,
+ /* key: 0x30c5 */ 0x2545,
+ /* key: 0x30c6 */ 0x2546,
+ /* key: 0x30c7 */ 0x2547,
+ /* key: 0x30c8 */ 0x2548,
+ /* key: 0x30c9 */ 0x2549,
+ /* key: 0x30ca */ 0x254a,
+ /* key: 0x30cb */ 0x254b,
+ /* key: 0x30cc */ 0x254c,
+ /* key: 0x30cd */ 0x254d,
+ /* key: 0x30ce */ 0x254e,
+ /* key: 0x30cf */ 0x254f,
+ /* key: 0x30d0 */ 0x2550,
+ /* key: 0x30d1 */ 0x2551,
+ /* key: 0x30d2 */ 0x2552,
+ /* key: 0x30d3 */ 0x2553,
+ /* key: 0x30d4 */ 0x2554,
+ /* key: 0x30d5 */ 0x2555,
+ /* key: 0x30d6 */ 0x2556,
+ /* key: 0x30d7 */ 0x2557,
+ /* key: 0x30d8 */ 0x2558,
+ /* key: 0x30d9 */ 0x2559,
+ /* key: 0x30da */ 0x255a,
+ /* key: 0x30db */ 0x255b,
+ /* key: 0x30dc */ 0x255c,
+ /* key: 0x30dd */ 0x255d,
+ /* key: 0x30de */ 0x255e,
+ /* key: 0x30df */ 0x255f,
+ /* key: 0x30e0 */ 0x2560,
+ /* key: 0x30e1 */ 0x2561,
+ /* key: 0x30e2 */ 0x2562,
+ /* key: 0x30e3 */ 0x2563,
+ /* key: 0x30e4 */ 0x2564,
+ /* key: 0x30e5 */ 0x2565,
+ /* key: 0x30e6 */ 0x2566,
+ /* key: 0x30e7 */ 0x2567,
+ /* key: 0x30e8 */ 0x2568,
+ /* key: 0x30e9 */ 0x2569,
+ /* key: 0x30ea */ 0x256a,
+ /* key: 0x30eb */ 0x256b,
+ /* key: 0x30ec */ 0x256c,
+ /* key: 0x30ed */ 0x256d,
+ /* key: 0x30ee */ 0x256e,
+ /* key: 0x30ef */ 0x256f,
+ /* key: 0x30f0 */ 0x2570,
+ /* key: 0x30f1 */ 0x2571,
+ /* key: 0x30f2 */ 0x2572,
+ /* key: 0x30f3 */ 0x2573,
+ /* key: 0x30f4 */ 0x2574,
+ /* key: 0x30f5 */ 0x2575,
+ /* key: 0x30f6 */ 0x2576,
+ /* key: 0x30f7 */ 0xffff,
+ /* key: 0x30f8 */ 0xffff,
+ /* key: 0x30f9 */ 0xffff,
+ /* key: 0x30fa */ 0xffff,
+ /* key: 0x30fb */ 0x2126,
+ /* key: 0x30fc */ 0x213c,
+ /* key: 0x30fd */ 0x2133,
+ /* key: 0x30fe */ 0x2134,
+ /* key: 0x30ff */ 0xffff,
+ /* branch: 0x40XX */ 0,
+ /* branch: 0x41XX */ 0,
+ /* branch: 0x42XX */ 0,
+ /* branch: 0x43XX */ 0,
+ /* branch: 0x44XX */ 0,
+ /* branch: 0x45XX */ 0,
+ /* branch: 0x46XX */ 0,
+ /* branch: 0x47XX */ 0,
+ /* branch: 0x48XX */ 0,
+ /* branch: 0x49XX */ 0,
+ /* branch: 0x4aXX */ 0,
+ /* branch: 0x4bXX */ 0,
+ /* branch: 0x4cXX */ 0,
+ /* branch: 0x4dXX */ 0,
+ /* branch: 0x4eXX */ 1568,
+ /* branch: 0x4fXX */ 1840,
+ /* branch: 0x4e0X */ 1584,
+ /* branch: 0x4e1X */ 1600,
+ /* branch: 0x4e2X */ 1616,
+ /* branch: 0x4e3X */ 1632,
+ /* branch: 0x4e4X */ 1648,
+ /* branch: 0x4e5X */ 1664,
+ /* branch: 0x4e6X */ 1680,
+ /* branch: 0x4e7X */ 1696,
+ /* branch: 0x4e8X */ 1712,
+ /* branch: 0x4e9X */ 1728,
+ /* branch: 0x4eaX */ 1744,
+ /* branch: 0x4ebX */ 1760,
+ /* branch: 0x4ecX */ 1776,
+ /* branch: 0x4edX */ 1792,
+ /* branch: 0x4eeX */ 1808,
+ /* branch: 0x4efX */ 1824,
+ /* key: 0x4e00 */ 0x306c,
+ /* key: 0x4e01 */ 0x437a,
+ /* key: 0x4e02 */ 0xb021,
+ /* key: 0x4e03 */ 0x3c37,
+ /* key: 0x4e04 */ 0xb022,
+ /* key: 0x4e05 */ 0xb023,
+ /* key: 0x4e06 */ 0xffff,
+ /* key: 0x4e07 */ 0x4b7c,
+ /* key: 0x4e08 */ 0x3e66,
+ /* key: 0x4e09 */ 0x3b30,
+ /* key: 0x4e0a */ 0x3e65,
+ /* key: 0x4e0b */ 0x323c,
+ /* key: 0x4e0c */ 0xb024,
+ /* key: 0x4e0d */ 0x4954,
+ /* key: 0x4e0e */ 0x4d3f,
+ /* key: 0x4e0f */ 0xffff,
+ /* key: 0x4e10 */ 0x5022,
+ /* key: 0x4e11 */ 0x312f,
+ /* key: 0x4e12 */ 0xb025,
+ /* key: 0x4e13 */ 0xffff,
+ /* key: 0x4e14 */ 0x336e,
+ /* key: 0x4e15 */ 0x5023,
+ /* key: 0x4e16 */ 0x4024,
+ /* key: 0x4e17 */ 0x5242,
+ /* key: 0x4e18 */ 0x3556,
+ /* key: 0x4e19 */ 0x4a3a,
+ /* key: 0x4e1a */ 0xffff,
+ /* key: 0x4e1b */ 0xffff,
+ /* key: 0x4e1c */ 0xffff,
+ /* key: 0x4e1d */ 0xffff,
+ /* key: 0x4e1e */ 0x3e67,
+ /* key: 0x4e1f */ 0xb026,
+ /* key: 0x4e20 */ 0xffff,
+ /* key: 0x4e21 */ 0x4e3e,
+ /* key: 0x4e22 */ 0xffff,
+ /* key: 0x4e23 */ 0xb027,
+ /* key: 0x4e24 */ 0xb028,
+ /* key: 0x4e25 */ 0xffff,
+ /* key: 0x4e26 */ 0x4a42,
+ /* key: 0x4e27 */ 0xffff,
+ /* key: 0x4e28 */ 0xb029,
+ /* key: 0x4e29 */ 0xffff,
+ /* key: 0x4e2a */ 0x5024,
+ /* key: 0x4e2b */ 0xb02a,
+ /* key: 0x4e2c */ 0xffff,
+ /* key: 0x4e2d */ 0x4366,
+ /* key: 0x4e2e */ 0xb02b,
+ /* key: 0x4e2f */ 0xb02c,
+ /* key: 0x4e30 */ 0xb02d,
+ /* key: 0x4e31 */ 0x5025,
+ /* key: 0x4e32 */ 0x367a,
+ /* key: 0x4e33 */ 0xffff,
+ /* key: 0x4e34 */ 0xffff,
+ /* key: 0x4e35 */ 0xb02e,
+ /* key: 0x4e36 */ 0x5026,
+ /* key: 0x4e37 */ 0xffff,
+ /* key: 0x4e38 */ 0x345d,
+ /* key: 0x4e39 */ 0x4330,
+ /* key: 0x4e3a */ 0xffff,
+ /* key: 0x4e3b */ 0x3c67,
+ /* key: 0x4e3c */ 0x5027,
+ /* key: 0x4e3d */ 0xffff,
+ /* key: 0x4e3e */ 0xffff,
+ /* key: 0x4e3f */ 0x5028,
+ /* key: 0x4e40 */ 0xb02f,
+ /* key: 0x4e41 */ 0xb030,
+ /* key: 0x4e42 */ 0x5029,
+ /* key: 0x4e43 */ 0x4735,
+ /* key: 0x4e44 */ 0xb031,
+ /* key: 0x4e45 */ 0x3557,
+ /* key: 0x4e46 */ 0xffff,
+ /* key: 0x4e47 */ 0xb032,
+ /* key: 0x4e48 */ 0xffff,
+ /* key: 0x4e49 */ 0xffff,
+ /* key: 0x4e4a */ 0xffff,
+ /* key: 0x4e4b */ 0x4737,
+ /* key: 0x4e4c */ 0xffff,
+ /* key: 0x4e4d */ 0x4663,
+ /* key: 0x4e4e */ 0x3843,
+ /* key: 0x4e4f */ 0x4b33,
+ /* key: 0x4e50 */ 0xffff,
+ /* key: 0x4e51 */ 0xb033,
+ /* key: 0x4e52 */ 0xffff,
+ /* key: 0x4e53 */ 0xffff,
+ /* key: 0x4e54 */ 0xffff,
+ /* key: 0x4e55 */ 0x6949,
+ /* key: 0x4e56 */ 0x502a,
+ /* key: 0x4e57 */ 0x3e68,
+ /* key: 0x4e58 */ 0x502b,
+ /* key: 0x4e59 */ 0x3235,
+ /* key: 0x4e5a */ 0xb034,
+ /* key: 0x4e5b */ 0xffff,
+ /* key: 0x4e5c */ 0xb035,
+ /* key: 0x4e5d */ 0x3665,
+ /* key: 0x4e5e */ 0x3870,
+ /* key: 0x4e5f */ 0x4c69,
+ /* key: 0x4e60 */ 0xffff,
+ /* key: 0x4e61 */ 0xffff,
+ /* key: 0x4e62 */ 0x5626,
+ /* key: 0x4e63 */ 0xb036,
+ /* key: 0x4e64 */ 0xffff,
+ /* key: 0x4e65 */ 0xffff,
+ /* key: 0x4e66 */ 0xffff,
+ /* key: 0x4e67 */ 0xffff,
+ /* key: 0x4e68 */ 0xb037,
+ /* key: 0x4e69 */ 0xb038,
+ /* key: 0x4e6a */ 0xffff,
+ /* key: 0x4e6b */ 0xffff,
+ /* key: 0x4e6c */ 0xffff,
+ /* key: 0x4e6d */ 0xffff,
+ /* key: 0x4e6e */ 0xffff,
+ /* key: 0x4e6f */ 0xffff,
+ /* key: 0x4e70 */ 0xffff,
+ /* key: 0x4e71 */ 0x4d70,
+ /* key: 0x4e72 */ 0xffff,
+ /* key: 0x4e73 */ 0x467d,
+ /* key: 0x4e74 */ 0xb039,
+ /* key: 0x4e75 */ 0xb03a,
+ /* key: 0x4e76 */ 0xffff,
+ /* key: 0x4e77 */ 0xffff,
+ /* key: 0x4e78 */ 0xffff,
+ /* key: 0x4e79 */ 0xb03b,
+ /* key: 0x4e7a */ 0xffff,
+ /* key: 0x4e7b */ 0xffff,
+ /* key: 0x4e7c */ 0xffff,
+ /* key: 0x4e7d */ 0xffff,
+ /* key: 0x4e7e */ 0x3425,
+ /* key: 0x4e7f */ 0xb03c,
+ /* key: 0x4e80 */ 0x3535,
+ /* key: 0x4e81 */ 0xffff,
+ /* key: 0x4e82 */ 0x502c,
+ /* key: 0x4e83 */ 0xffff,
+ /* key: 0x4e84 */ 0xffff,
+ /* key: 0x4e85 */ 0x502d,
+ /* key: 0x4e86 */ 0x4e3b,
+ /* key: 0x4e87 */ 0xffff,
+ /* key: 0x4e88 */ 0x4d3d,
+ /* key: 0x4e89 */ 0x4168,
+ /* key: 0x4e8a */ 0x502f,
+ /* key: 0x4e8b */ 0x3b76,
+ /* key: 0x4e8c */ 0x4673,
+ /* key: 0x4e8d */ 0xb03d,
+ /* key: 0x4e8e */ 0x5032,
+ /* key: 0x4e8f */ 0xffff,
+ /* key: 0x4e90 */ 0xffff,
+ /* key: 0x4e91 */ 0x313e,
+ /* key: 0x4e92 */ 0x385f,
+ /* key: 0x4e93 */ 0xffff,
+ /* key: 0x4e94 */ 0x385e,
+ /* key: 0x4e95 */ 0x3066,
+ /* key: 0x4e96 */ 0xb03e,
+ /* key: 0x4e97 */ 0xb03f,
+ /* key: 0x4e98 */ 0x4f4b,
+ /* key: 0x4e99 */ 0x4f4a,
+ /* key: 0x4e9a */ 0xffff,
+ /* key: 0x4e9b */ 0x3a33,
+ /* key: 0x4e9c */ 0x3021,
+ /* key: 0x4e9d */ 0xb040,
+ /* key: 0x4e9e */ 0x5033,
+ /* key: 0x4e9f */ 0x5034,
+ /* key: 0x4ea0 */ 0x5035,
+ /* key: 0x4ea1 */ 0x4b34,
+ /* key: 0x4ea2 */ 0x5036,
+ /* key: 0x4ea3 */ 0xffff,
+ /* key: 0x4ea4 */ 0x3872,
+ /* key: 0x4ea5 */ 0x3067,
+ /* key: 0x4ea6 */ 0x4b72,
+ /* key: 0x4ea7 */ 0xffff,
+ /* key: 0x4ea8 */ 0x357c,
+ /* key: 0x4ea9 */ 0xffff,
+ /* key: 0x4eaa */ 0xffff,
+ /* key: 0x4eab */ 0x357d,
+ /* key: 0x4eac */ 0x357e,
+ /* key: 0x4ead */ 0x4462,
+ /* key: 0x4eae */ 0x4e3c,
+ /* key: 0x4eaf */ 0xb041,
+ /* key: 0x4eb0 */ 0x5037,
+ /* key: 0x4eb1 */ 0xffff,
+ /* key: 0x4eb2 */ 0xffff,
+ /* key: 0x4eb3 */ 0x5038,
+ /* key: 0x4eb4 */ 0xffff,
+ /* key: 0x4eb5 */ 0xffff,
+ /* key: 0x4eb6 */ 0x5039,
+ /* key: 0x4eb7 */ 0xffff,
+ /* key: 0x4eb8 */ 0xffff,
+ /* key: 0x4eb9 */ 0xb042,
+ /* key: 0x4eba */ 0x3f4d,
+ /* key: 0x4ebb */ 0xffff,
+ /* key: 0x4ebc */ 0xffff,
+ /* key: 0x4ebd */ 0xffff,
+ /* key: 0x4ebe */ 0xffff,
+ /* key: 0x4ebf */ 0xffff,
+ /* key: 0x4ec0 */ 0x3d3a,
+ /* key: 0x4ec1 */ 0x3f4e,
+ /* key: 0x4ec2 */ 0x503e,
+ /* key: 0x4ec3 */ 0xb043,
+ /* key: 0x4ec4 */ 0x503c,
+ /* key: 0x4ec5 */ 0xffff,
+ /* key: 0x4ec6 */ 0x503d,
+ /* key: 0x4ec7 */ 0x3558,
+ /* key: 0x4ec8 */ 0xffff,
+ /* key: 0x4ec9 */ 0xffff,
+ /* key: 0x4eca */ 0x3a23,
+ /* key: 0x4ecb */ 0x3270,
+ /* key: 0x4ecc */ 0xffff,
+ /* key: 0x4ecd */ 0x503b,
+ /* key: 0x4ece */ 0x503a,
+ /* key: 0x4ecf */ 0x4a29,
+ /* key: 0x4ed0 */ 0xb044,
+ /* key: 0x4ed1 */ 0xffff,
+ /* key: 0x4ed2 */ 0xffff,
+ /* key: 0x4ed3 */ 0xffff,
+ /* key: 0x4ed4 */ 0x3b46,
+ /* key: 0x4ed5 */ 0x3b45,
+ /* key: 0x4ed6 */ 0x423e,
+ /* key: 0x4ed7 */ 0x503f,
+ /* key: 0x4ed8 */ 0x4955,
+ /* key: 0x4ed9 */ 0x4067,
+ /* key: 0x4eda */ 0xb045,
+ /* key: 0x4edb */ 0xb046,
+ /* key: 0x4edc */ 0xffff,
+ /* key: 0x4edd */ 0x2138,
+ /* key: 0x4ede */ 0x5040,
+ /* key: 0x4edf */ 0x5042,
+ /* key: 0x4ee0 */ 0xb047,
+ /* key: 0x4ee1 */ 0xb048,
+ /* key: 0x4ee2 */ 0xb049,
+ /* key: 0x4ee3 */ 0x4265,
+ /* key: 0x4ee4 */ 0x4e61,
+ /* key: 0x4ee5 */ 0x304a,
+ /* key: 0x4ee6 */ 0xffff,
+ /* key: 0x4ee7 */ 0xffff,
+ /* key: 0x4ee8 */ 0xb04a,
+ /* key: 0x4ee9 */ 0xffff,
+ /* key: 0x4eea */ 0xffff,
+ /* key: 0x4eeb */ 0xffff,
+ /* key: 0x4eec */ 0xffff,
+ /* key: 0x4eed */ 0x5041,
+ /* key: 0x4eee */ 0x323e,
+ /* key: 0x4eef */ 0xb04b,
+ /* key: 0x4ef0 */ 0x3644,
+ /* key: 0x4ef1 */ 0xb04c,
+ /* key: 0x4ef2 */ 0x4367,
+ /* key: 0x4ef3 */ 0xb04d,
+ /* key: 0x4ef4 */ 0xffff,
+ /* key: 0x4ef5 */ 0xb04e,
+ /* key: 0x4ef6 */ 0x376f,
+ /* key: 0x4ef7 */ 0x5043,
+ /* key: 0x4ef8 */ 0xffff,
+ /* key: 0x4ef9 */ 0xffff,
+ /* key: 0x4efa */ 0xffff,
+ /* key: 0x4efb */ 0x4724,
+ /* key: 0x4efc */ 0xffff,
+ /* key: 0x4efd */ 0xb04f,
+ /* key: 0x4efe */ 0xb050,
+ /* key: 0x4eff */ 0xb051,
+ /* branch: 0x4f0X */ 1856,
+ /* branch: 0x4f1X */ 1872,
+ /* branch: 0x4f2X */ 1888,
+ /* branch: 0x4f3X */ 1904,
+ /* branch: 0x4f4X */ 1920,
+ /* branch: 0x4f5X */ 1936,
+ /* branch: 0x4f6X */ 1952,
+ /* branch: 0x4f7X */ 1968,
+ /* branch: 0x4f8X */ 1984,
+ /* branch: 0x4f9X */ 2000,
+ /* branch: 0x4faX */ 2016,
+ /* branch: 0x4fbX */ 2032,
+ /* branch: 0x4fcX */ 2048,
+ /* branch: 0x4fdX */ 2064,
+ /* branch: 0x4feX */ 2080,
+ /* branch: 0x4ffX */ 2096,
+ /* key: 0x4f00 */ 0xb052,
+ /* key: 0x4f01 */ 0x346b,
+ /* key: 0x4f02 */ 0xb053,
+ /* key: 0x4f03 */ 0xb054,
+ /* key: 0x4f04 */ 0xffff,
+ /* key: 0x4f05 */ 0xffff,
+ /* key: 0x4f06 */ 0xffff,
+ /* key: 0x4f07 */ 0xffff,
+ /* key: 0x4f08 */ 0xb055,
+ /* key: 0x4f09 */ 0x5044,
+ /* key: 0x4f0a */ 0x304b,
+ /* key: 0x4f0b */ 0xb056,
+ /* key: 0x4f0c */ 0xb057,
+ /* key: 0x4f0d */ 0x3860,
+ /* key: 0x4f0e */ 0x346c,
+ /* key: 0x4f0f */ 0x497a,
+ /* key: 0x4f10 */ 0x4832,
+ /* key: 0x4f11 */ 0x3559,
+ /* key: 0x4f12 */ 0xb058,
+ /* key: 0x4f13 */ 0xffff,
+ /* key: 0x4f14 */ 0xffff,
+ /* key: 0x4f15 */ 0xb059,
+ /* key: 0x4f16 */ 0xb05a,
+ /* key: 0x4f17 */ 0xb05b,
+ /* key: 0x4f18 */ 0xffff,
+ /* key: 0x4f19 */ 0xb05c,
+ /* key: 0x4f1a */ 0x3271,
+ /* key: 0x4f1b */ 0xffff,
+ /* key: 0x4f1c */ 0x5067,
+ /* key: 0x4f1d */ 0x4541,
+ /* key: 0x4f1e */ 0xffff,
+ /* key: 0x4f1f */ 0xffff,
+ /* key: 0x4f20 */ 0xffff,
+ /* key: 0x4f21 */ 0xffff,
+ /* key: 0x4f22 */ 0xffff,
+ /* key: 0x4f23 */ 0xffff,
+ /* key: 0x4f24 */ 0xffff,
+ /* key: 0x4f25 */ 0xffff,
+ /* key: 0x4f26 */ 0xffff,
+ /* key: 0x4f27 */ 0xffff,
+ /* key: 0x4f28 */ 0xffff,
+ /* key: 0x4f29 */ 0xffff,
+ /* key: 0x4f2a */ 0xffff,
+ /* key: 0x4f2b */ 0xffff,
+ /* key: 0x4f2c */ 0xffff,
+ /* key: 0x4f2d */ 0xffff,
+ /* key: 0x4f2e */ 0xb05d,
+ /* key: 0x4f2f */ 0x476c,
+ /* key: 0x4f30 */ 0x5046,
+ /* key: 0x4f31 */ 0xb05e,
+ /* key: 0x4f32 */ 0xffff,
+ /* key: 0x4f33 */ 0xb060,
+ /* key: 0x4f34 */ 0x483c,
+ /* key: 0x4f35 */ 0xb061,
+ /* key: 0x4f36 */ 0x4e62,
+ /* key: 0x4f37 */ 0xb062,
+ /* key: 0x4f38 */ 0x3f2d,
+ /* key: 0x4f39 */ 0xb063,
+ /* key: 0x4f3a */ 0x3b47,
+ /* key: 0x4f3b */ 0xb064,
+ /* key: 0x4f3c */ 0x3b77,
+ /* key: 0x4f3d */ 0x3240,
+ /* key: 0x4f3e */ 0xb065,
+ /* key: 0x4f3f */ 0xffff,
+ /* key: 0x4f40 */ 0xb066,
+ /* key: 0x4f41 */ 0xffff,
+ /* key: 0x4f42 */ 0xb067,
+ /* key: 0x4f43 */ 0x4451,
+ /* key: 0x4f44 */ 0xffff,
+ /* key: 0x4f45 */ 0xffff,
+ /* key: 0x4f46 */ 0x4322,
+ /* key: 0x4f47 */ 0x504a,
+ /* key: 0x4f48 */ 0xb068,
+ /* key: 0x4f49 */ 0xb069,
+ /* key: 0x4f4a */ 0xffff,
+ /* key: 0x4f4b */ 0xb06a,
+ /* key: 0x4f4c */ 0xb06b,
+ /* key: 0x4f4d */ 0x304c,
+ /* key: 0x4f4e */ 0x4463,
+ /* key: 0x4f4f */ 0x3d3b,
+ /* key: 0x4f50 */ 0x3a34,
+ /* key: 0x4f51 */ 0x4d24,
+ /* key: 0x4f52 */ 0xb06c,
+ /* key: 0x4f53 */ 0x424e,
+ /* key: 0x4f54 */ 0xb06d,
+ /* key: 0x4f55 */ 0x323f,
+ /* key: 0x4f56 */ 0xb06e,
+ /* key: 0x4f57 */ 0x5049,
+ /* key: 0x4f58 */ 0xb06f,
+ /* key: 0x4f59 */ 0x4d3e,
+ /* key: 0x4f5a */ 0x5045,
+ /* key: 0x4f5b */ 0x5047,
+ /* key: 0x4f5c */ 0x3a6e,
+ /* key: 0x4f5d */ 0x5048,
+ /* key: 0x4f5e */ 0x5524,
+ /* key: 0x4f5f */ 0xb070,
+ /* key: 0x4f60 */ 0xb05f,
+ /* key: 0x4f61 */ 0xffff,
+ /* key: 0x4f62 */ 0xffff,
+ /* key: 0x4f63 */ 0xb071,
+ /* key: 0x4f64 */ 0xffff,
+ /* key: 0x4f65 */ 0xffff,
+ /* key: 0x4f66 */ 0xffff,
+ /* key: 0x4f67 */ 0xffff,
+ /* key: 0x4f68 */ 0xffff,
+ /* key: 0x4f69 */ 0x5050,
+ /* key: 0x4f6a */ 0xb072,
+ /* key: 0x4f6b */ 0xffff,
+ /* key: 0x4f6c */ 0xb073,
+ /* key: 0x4f6d */ 0xffff,
+ /* key: 0x4f6e */ 0xb074,
+ /* key: 0x4f6f */ 0x5053,
+ /* key: 0x4f70 */ 0x5051,
+ /* key: 0x4f71 */ 0xb075,
+ /* key: 0x4f72 */ 0xffff,
+ /* key: 0x4f73 */ 0x3242,
+ /* key: 0x4f74 */ 0xffff,
+ /* key: 0x4f75 */ 0x4a3b,
+ /* key: 0x4f76 */ 0x504b,
+ /* key: 0x4f77 */ 0xb076,
+ /* key: 0x4f78 */ 0xb077,
+ /* key: 0x4f79 */ 0xb078,
+ /* key: 0x4f7a */ 0xb079,
+ /* key: 0x4f7b */ 0x504f,
+ /* key: 0x4f7c */ 0x3873,
+ /* key: 0x4f7d */ 0xb07a,
+ /* key: 0x4f7e */ 0xb07b,
+ /* key: 0x4f7f */ 0x3b48,
+ /* key: 0x4f80 */ 0xffff,
+ /* key: 0x4f81 */ 0xb07c,
+ /* key: 0x4f82 */ 0xb07d,
+ /* key: 0x4f83 */ 0x3426,
+ /* key: 0x4f84 */ 0xb07e,
+ /* key: 0x4f85 */ 0xb121,
+ /* key: 0x4f86 */ 0x5054,
+ /* key: 0x4f87 */ 0xffff,
+ /* key: 0x4f88 */ 0x504c,
+ /* key: 0x4f89 */ 0xb122,
+ /* key: 0x4f8a */ 0xb123,
+ /* key: 0x4f8b */ 0x4e63,
+ /* key: 0x4f8c */ 0xb124,
+ /* key: 0x4f8d */ 0x3b78,
+ /* key: 0x4f8e */ 0xb125,
+ /* key: 0x4f8f */ 0x504d,
+ /* key: 0x4f90 */ 0xb126,
+ /* key: 0x4f91 */ 0x5052,
+ /* key: 0x4f92 */ 0xb127,
+ /* key: 0x4f93 */ 0xb128,
+ /* key: 0x4f94 */ 0xb129,
+ /* key: 0x4f95 */ 0xffff,
+ /* key: 0x4f96 */ 0x5055,
+ /* key: 0x4f97 */ 0xb12a,
+ /* key: 0x4f98 */ 0x504e,
+ /* key: 0x4f99 */ 0xb12b,
+ /* key: 0x4f9a */ 0xb12c,
+ /* key: 0x4f9b */ 0x3621,
+ /* key: 0x4f9c */ 0xffff,
+ /* key: 0x4f9d */ 0x304d,
+ /* key: 0x4f9e */ 0xb12d,
+ /* key: 0x4f9f */ 0xb12e,
+ /* key: 0x4fa0 */ 0x3622,
+ /* key: 0x4fa1 */ 0x3241,
+ /* key: 0x4fa2 */ 0xffff,
+ /* key: 0x4fa3 */ 0xffff,
+ /* key: 0x4fa4 */ 0xffff,
+ /* key: 0x4fa5 */ 0xffff,
+ /* key: 0x4fa6 */ 0xffff,
+ /* key: 0x4fa7 */ 0xffff,
+ /* key: 0x4fa8 */ 0xffff,
+ /* key: 0x4fa9 */ 0xffff,
+ /* key: 0x4faa */ 0xffff,
+ /* key: 0x4fab */ 0x5525,
+ /* key: 0x4fac */ 0xffff,
+ /* key: 0x4fad */ 0x4b79,
+ /* key: 0x4fae */ 0x496e,
+ /* key: 0x4faf */ 0x3874,
+ /* key: 0x4fb0 */ 0xffff,
+ /* key: 0x4fb1 */ 0xffff,
+ /* key: 0x4fb2 */ 0xb12f,
+ /* key: 0x4fb3 */ 0xffff,
+ /* key: 0x4fb4 */ 0xffff,
+ /* key: 0x4fb5 */ 0x3f2f,
+ /* key: 0x4fb6 */ 0x4e37,
+ /* key: 0x4fb7 */ 0xb130,
+ /* key: 0x4fb8 */ 0xffff,
+ /* key: 0x4fb9 */ 0xb131,
+ /* key: 0x4fba */ 0xffff,
+ /* key: 0x4fbb */ 0xb132,
+ /* key: 0x4fbc */ 0xb133,
+ /* key: 0x4fbd */ 0xb134,
+ /* key: 0x4fbe */ 0xb135,
+ /* key: 0x4fbf */ 0x4a58,
+ /* key: 0x4fc0 */ 0xb136,
+ /* key: 0x4fc1 */ 0xb137,
+ /* key: 0x4fc2 */ 0x3738,
+ /* key: 0x4fc3 */ 0x4225,
+ /* key: 0x4fc4 */ 0x3264,
+ /* key: 0x4fc5 */ 0xb138,
+ /* key: 0x4fc6 */ 0xb139,
+ /* key: 0x4fc7 */ 0xffff,
+ /* key: 0x4fc8 */ 0xb13a,
+ /* key: 0x4fc9 */ 0xb13b,
+ /* key: 0x4fca */ 0x3d53,
+ /* key: 0x4fcb */ 0xb13c,
+ /* key: 0x4fcc */ 0xb13d,
+ /* key: 0x4fcd */ 0xb13e,
+ /* key: 0x4fce */ 0x5059,
+ /* key: 0x4fcf */ 0xb13f,
+ /* key: 0x4fd0 */ 0x505e,
+ /* key: 0x4fd1 */ 0x505c,
+ /* key: 0x4fd2 */ 0xb140,
+ /* key: 0x4fd3 */ 0xffff,
+ /* key: 0x4fd4 */ 0x5057,
+ /* key: 0x4fd5 */ 0xffff,
+ /* key: 0x4fd6 */ 0xffff,
+ /* key: 0x4fd7 */ 0x422f,
+ /* key: 0x4fd8 */ 0x505a,
+ /* key: 0x4fd9 */ 0xffff,
+ /* key: 0x4fda */ 0x505d,
+ /* key: 0x4fdb */ 0x505b,
+ /* key: 0x4fdc */ 0xb141,
+ /* key: 0x4fdd */ 0x4a5d,
+ /* key: 0x4fde */ 0xffff,
+ /* key: 0x4fdf */ 0x5058,
+ /* key: 0x4fe0 */ 0xb142,
+ /* key: 0x4fe1 */ 0x3f2e,
+ /* key: 0x4fe2 */ 0xb143,
+ /* key: 0x4fe3 */ 0x4b73,
+ /* key: 0x4fe4 */ 0x505f,
+ /* key: 0x4fe5 */ 0x5060,
+ /* key: 0x4fe6 */ 0xffff,
+ /* key: 0x4fe7 */ 0xffff,
+ /* key: 0x4fe8 */ 0xffff,
+ /* key: 0x4fe9 */ 0xffff,
+ /* key: 0x4fea */ 0xffff,
+ /* key: 0x4feb */ 0xffff,
+ /* key: 0x4fec */ 0xffff,
+ /* key: 0x4fed */ 0xffff,
+ /* key: 0x4fee */ 0x3d24,
+ /* key: 0x4fef */ 0x506d,
+ /* key: 0x4ff0 */ 0xb144,
+ /* key: 0x4ff1 */ 0xffff,
+ /* key: 0x4ff2 */ 0xb145,
+ /* key: 0x4ff3 */ 0x4750,
+ /* key: 0x4ff4 */ 0xffff,
+ /* key: 0x4ff5 */ 0x4936,
+ /* key: 0x4ff6 */ 0x5068,
+ /* key: 0x4ff7 */ 0xffff,
+ /* key: 0x4ff8 */ 0x4a70,
+ /* key: 0x4ff9 */ 0xffff,
+ /* key: 0x4ffa */ 0x3236,
+ /* key: 0x4ffb */ 0xffff,
+ /* key: 0x4ffc */ 0xb146,
+ /* key: 0x4ffd */ 0xb147,
+ /* key: 0x4ffe */ 0x506c,
+ /* key: 0x4fff */ 0xb148,
+ /* branch: 0x50XX */ 2128,
+ /* branch: 0x51XX */ 2400,
+ /* branch: 0x52XX */ 2672,
+ /* branch: 0x53XX */ 2944,
+ /* branch: 0x54XX */ 3216,
+ /* branch: 0x55XX */ 3488,
+ /* branch: 0x56XX */ 3760,
+ /* branch: 0x57XX */ 4032,
+ /* branch: 0x58XX */ 4304,
+ /* branch: 0x59XX */ 4576,
+ /* branch: 0x5aXX */ 4848,
+ /* branch: 0x5bXX */ 5120,
+ /* branch: 0x5cXX */ 5392,
+ /* branch: 0x5dXX */ 5664,
+ /* branch: 0x5eXX */ 5936,
+ /* branch: 0x5fXX */ 6208,
+ /* branch: 0x500X */ 2144,
+ /* branch: 0x501X */ 2160,
+ /* branch: 0x502X */ 2176,
+ /* branch: 0x503X */ 2192,
+ /* branch: 0x504X */ 2208,
+ /* branch: 0x505X */ 2224,
+ /* branch: 0x506X */ 2240,
+ /* branch: 0x507X */ 2256,
+ /* branch: 0x508X */ 2272,
+ /* branch: 0x509X */ 2288,
+ /* branch: 0x50aX */ 2304,
+ /* branch: 0x50bX */ 2320,
+ /* branch: 0x50cX */ 2336,
+ /* branch: 0x50dX */ 2352,
+ /* branch: 0x50eX */ 2368,
+ /* branch: 0x50fX */ 2384,
+ /* key: 0x5000 */ 0xb149,
+ /* key: 0x5001 */ 0xb14a,
+ /* key: 0x5002 */ 0xffff,
+ /* key: 0x5003 */ 0xffff,
+ /* key: 0x5004 */ 0xb14b,
+ /* key: 0x5005 */ 0x5066,
+ /* key: 0x5006 */ 0x506f,
+ /* key: 0x5007 */ 0xb14c,
+ /* key: 0x5008 */ 0xffff,
+ /* key: 0x5009 */ 0x4152,
+ /* key: 0x500a */ 0xb14d,
+ /* key: 0x500b */ 0x3844,
+ /* key: 0x500c */ 0xb14e,
+ /* key: 0x500d */ 0x475c,
+ /* key: 0x500e */ 0xb14f,
+ /* key: 0x500f */ 0x6047,
+ /* key: 0x5010 */ 0xb150,
+ /* key: 0x5011 */ 0x506e,
+ /* key: 0x5012 */ 0x455d,
+ /* key: 0x5013 */ 0xb151,
+ /* key: 0x5014 */ 0x5063,
+ /* key: 0x5015 */ 0xffff,
+ /* key: 0x5016 */ 0x3876,
+ /* key: 0x5017 */ 0xb152,
+ /* key: 0x5018 */ 0xb153,
+ /* key: 0x5019 */ 0x3875,
+ /* key: 0x501a */ 0x5061,
+ /* key: 0x501b */ 0xb154,
+ /* key: 0x501c */ 0xb155,
+ /* key: 0x501d */ 0xb156,
+ /* key: 0x501e */ 0xb157,
+ /* key: 0x501f */ 0x3c5a,
+ /* key: 0x5020 */ 0xffff,
+ /* key: 0x5021 */ 0x5069,
+ /* key: 0x5022 */ 0xb158,
+ /* key: 0x5023 */ 0x4a6f,
+ /* key: 0x5024 */ 0x434d,
+ /* key: 0x5025 */ 0x5065,
+ /* key: 0x5026 */ 0x3771,
+ /* key: 0x5027 */ 0xb159,
+ /* key: 0x5028 */ 0x5062,
+ /* key: 0x5029 */ 0x506a,
+ /* key: 0x502a */ 0x5064,
+ /* key: 0x502b */ 0x4e51,
+ /* key: 0x502c */ 0x506b,
+ /* key: 0x502d */ 0x4f41,
+ /* key: 0x502e */ 0xb15a,
+ /* key: 0x502f */ 0xffff,
+ /* key: 0x5030 */ 0xb15b,
+ /* key: 0x5031 */ 0xffff,
+ /* key: 0x5032 */ 0xb15c,
+ /* key: 0x5033 */ 0xb15d,
+ /* key: 0x5034 */ 0xffff,
+ /* key: 0x5035 */ 0xb15e,
+ /* key: 0x5036 */ 0x3666,
+ /* key: 0x5037 */ 0xffff,
+ /* key: 0x5038 */ 0xffff,
+ /* key: 0x5039 */ 0x3770,
+ /* key: 0x503a */ 0xffff,
+ /* key: 0x503b */ 0xb176,
+ /* key: 0x503c */ 0xffff,
+ /* key: 0x503d */ 0xffff,
+ /* key: 0x503e */ 0xffff,
+ /* key: 0x503f */ 0xffff,
+ /* key: 0x5040 */ 0xb15f,
+ /* key: 0x5041 */ 0xb160,
+ /* key: 0x5042 */ 0xb161,
+ /* key: 0x5043 */ 0x5070,
+ /* key: 0x5044 */ 0xffff,
+ /* key: 0x5045 */ 0xb162,
+ /* key: 0x5046 */ 0xb163,
+ /* key: 0x5047 */ 0x5071,
+ /* key: 0x5048 */ 0x5075,
+ /* key: 0x5049 */ 0x304e,
+ /* key: 0x504a */ 0xb164,
+ /* key: 0x504b */ 0xffff,
+ /* key: 0x504c */ 0xb165,
+ /* key: 0x504d */ 0xffff,
+ /* key: 0x504e */ 0xb166,
+ /* key: 0x504f */ 0x4a50,
+ /* key: 0x5050 */ 0x5074,
+ /* key: 0x5051 */ 0xb167,
+ /* key: 0x5052 */ 0xb168,
+ /* key: 0x5053 */ 0xb169,
+ /* key: 0x5054 */ 0xffff,
+ /* key: 0x5055 */ 0x5073,
+ /* key: 0x5056 */ 0x5077,
+ /* key: 0x5057 */ 0xb16a,
+ /* key: 0x5058 */ 0xffff,
+ /* key: 0x5059 */ 0xb16b,
+ /* key: 0x505a */ 0x5076,
+ /* key: 0x505b */ 0xffff,
+ /* key: 0x505c */ 0x4464,
+ /* key: 0x505d */ 0xffff,
+ /* key: 0x505e */ 0xffff,
+ /* key: 0x505f */ 0xb16c,
+ /* key: 0x5060 */ 0xb16d,
+ /* key: 0x5061 */ 0xffff,
+ /* key: 0x5062 */ 0xb16e,
+ /* key: 0x5063 */ 0xb16f,
+ /* key: 0x5064 */ 0xffff,
+ /* key: 0x5065 */ 0x3772,
+ /* key: 0x5066 */ 0xb170,
+ /* key: 0x5067 */ 0xb171,
+ /* key: 0x5068 */ 0xffff,
+ /* key: 0x5069 */ 0xffff,
+ /* key: 0x506a */ 0xb172,
+ /* key: 0x506b */ 0xffff,
+ /* key: 0x506c */ 0x5078,
+ /* key: 0x506d */ 0xb173,
+ /* key: 0x506e */ 0xffff,
+ /* key: 0x506f */ 0xffff,
+ /* key: 0x5070 */ 0xb174,
+ /* key: 0x5071 */ 0xb175,
+ /* key: 0x5072 */ 0x3c45,
+ /* key: 0x5073 */ 0xffff,
+ /* key: 0x5074 */ 0x4226,
+ /* key: 0x5075 */ 0x4465,
+ /* key: 0x5076 */ 0x3676,
+ /* key: 0x5077 */ 0xffff,
+ /* key: 0x5078 */ 0x5079,
+ /* key: 0x5079 */ 0xffff,
+ /* key: 0x507a */ 0xffff,
+ /* key: 0x507b */ 0xffff,
+ /* key: 0x507c */ 0xffff,
+ /* key: 0x507d */ 0x3536,
+ /* key: 0x507e */ 0xffff,
+ /* key: 0x507f */ 0xffff,
+ /* key: 0x5080 */ 0x507a,
+ /* key: 0x5081 */ 0xb177,
+ /* key: 0x5082 */ 0xffff,
+ /* key: 0x5083 */ 0xb178,
+ /* key: 0x5084 */ 0xb179,
+ /* key: 0x5085 */ 0x507c,
+ /* key: 0x5086 */ 0xb17a,
+ /* key: 0x5087 */ 0xffff,
+ /* key: 0x5088 */ 0xffff,
+ /* key: 0x5089 */ 0xffff,
+ /* key: 0x508a */ 0xb17b,
+ /* key: 0x508b */ 0xffff,
+ /* key: 0x508c */ 0xffff,
+ /* key: 0x508d */ 0x4b35,
+ /* key: 0x508e */ 0xb17c,
+ /* key: 0x508f */ 0xb17d,
+ /* key: 0x5090 */ 0xb17e,
+ /* key: 0x5091 */ 0x3766,
+ /* key: 0x5092 */ 0xb221,
+ /* key: 0x5093 */ 0xb222,
+ /* key: 0x5094 */ 0xb223,
+ /* key: 0x5095 */ 0xffff,
+ /* key: 0x5096 */ 0xb224,
+ /* key: 0x5097 */ 0xffff,
+ /* key: 0x5098 */ 0x3b31,
+ /* key: 0x5099 */ 0x4877,
+ /* key: 0x509a */ 0x507b,
+ /* key: 0x509b */ 0xb225,
+ /* key: 0x509c */ 0xb226,
+ /* key: 0x509d */ 0xffff,
+ /* key: 0x509e */ 0xb227,
+ /* key: 0x509f */ 0xb228,
+ /* key: 0x50a0 */ 0xb229,
+ /* key: 0x50a1 */ 0xb22a,
+ /* key: 0x50a2 */ 0xb22b,
+ /* key: 0x50a3 */ 0xffff,
+ /* key: 0x50a4 */ 0xffff,
+ /* key: 0x50a5 */ 0xffff,
+ /* key: 0x50a6 */ 0xffff,
+ /* key: 0x50a7 */ 0xffff,
+ /* key: 0x50a8 */ 0xffff,
+ /* key: 0x50a9 */ 0xffff,
+ /* key: 0x50aa */ 0xb22c,
+ /* key: 0x50ab */ 0xffff,
+ /* key: 0x50ac */ 0x3a45,
+ /* key: 0x50ad */ 0x4d43,
+ /* key: 0x50ae */ 0xffff,
+ /* key: 0x50af */ 0xb22d,
+ /* key: 0x50b0 */ 0xb22e,
+ /* key: 0x50b1 */ 0xffff,
+ /* key: 0x50b2 */ 0x507e,
+ /* key: 0x50b3 */ 0x5123,
+ /* key: 0x50b4 */ 0x507d,
+ /* key: 0x50b5 */ 0x3a44,
+ /* key: 0x50b6 */ 0xffff,
+ /* key: 0x50b7 */ 0x3d7d,
+ /* key: 0x50b8 */ 0xffff,
+ /* key: 0x50b9 */ 0xb22f,
+ /* key: 0x50ba */ 0xb230,
+ /* key: 0x50bb */ 0xffff,
+ /* key: 0x50bc */ 0xffff,
+ /* key: 0x50bd */ 0xb231,
+ /* key: 0x50be */ 0x3739,
+ /* key: 0x50bf */ 0xffff,
+ /* key: 0x50c0 */ 0xb232,
+ /* key: 0x50c1 */ 0xffff,
+ /* key: 0x50c2 */ 0x5124,
+ /* key: 0x50c3 */ 0xb233,
+ /* key: 0x50c4 */ 0xb234,
+ /* key: 0x50c5 */ 0x364f,
+ /* key: 0x50c6 */ 0xffff,
+ /* key: 0x50c7 */ 0xb235,
+ /* key: 0x50c8 */ 0xffff,
+ /* key: 0x50c9 */ 0x5121,
+ /* key: 0x50ca */ 0x5122,
+ /* key: 0x50cb */ 0xffff,
+ /* key: 0x50cc */ 0xb236,
+ /* key: 0x50cd */ 0x462f,
+ /* key: 0x50ce */ 0xb237,
+ /* key: 0x50cf */ 0x417c,
+ /* key: 0x50d0 */ 0xb238,
+ /* key: 0x50d1 */ 0x3623,
+ /* key: 0x50d2 */ 0xffff,
+ /* key: 0x50d3 */ 0xb239,
+ /* key: 0x50d4 */ 0xb23a,
+ /* key: 0x50d5 */ 0x4b4d,
+ /* key: 0x50d6 */ 0x5125,
+ /* key: 0x50d7 */ 0xffff,
+ /* key: 0x50d8 */ 0xb23b,
+ /* key: 0x50d9 */ 0xffff,
+ /* key: 0x50da */ 0x4e3d,
+ /* key: 0x50db */ 0xffff,
+ /* key: 0x50dc */ 0xb23c,
+ /* key: 0x50dd */ 0xb23d,
+ /* key: 0x50de */ 0x5126,
+ /* key: 0x50df */ 0xb23e,
+ /* key: 0x50e0 */ 0xffff,
+ /* key: 0x50e1 */ 0xffff,
+ /* key: 0x50e2 */ 0xb23f,
+ /* key: 0x50e3 */ 0x5129,
+ /* key: 0x50e4 */ 0xb240,
+ /* key: 0x50e5 */ 0x5127,
+ /* key: 0x50e6 */ 0xb241,
+ /* key: 0x50e7 */ 0x414e,
+ /* key: 0x50e8 */ 0xb242,
+ /* key: 0x50e9 */ 0xb243,
+ /* key: 0x50ea */ 0xffff,
+ /* key: 0x50eb */ 0xffff,
+ /* key: 0x50ec */ 0xffff,
+ /* key: 0x50ed */ 0x5128,
+ /* key: 0x50ee */ 0x512a,
+ /* key: 0x50ef */ 0xb244,
+ /* key: 0x50f0 */ 0xffff,
+ /* key: 0x50f1 */ 0xb245,
+ /* key: 0x50f2 */ 0xb251,
+ /* key: 0x50f3 */ 0xffff,
+ /* key: 0x50f4 */ 0xffff,
+ /* key: 0x50f5 */ 0x512c,
+ /* key: 0x50f6 */ 0xb246,
+ /* key: 0x50f7 */ 0xffff,
+ /* key: 0x50f8 */ 0xffff,
+ /* key: 0x50f9 */ 0x512b,
+ /* key: 0x50fa */ 0xb247,
+ /* key: 0x50fb */ 0x4a48,
+ /* key: 0x50fc */ 0xffff,
+ /* key: 0x50fd */ 0xffff,
+ /* key: 0x50fe */ 0xb248,
+ /* key: 0x50ff */ 0xffff,
+ /* branch: 0x510X */ 2416,
+ /* branch: 0x511X */ 2432,
+ /* branch: 0x512X */ 2448,
+ /* branch: 0x513X */ 2464,
+ /* branch: 0x514X */ 2480,
+ /* branch: 0x515X */ 2496,
+ /* branch: 0x516X */ 2512,
+ /* branch: 0x517X */ 2528,
+ /* branch: 0x518X */ 2544,
+ /* branch: 0x519X */ 2560,
+ /* branch: 0x51aX */ 2576,
+ /* branch: 0x51bX */ 2592,
+ /* branch: 0x51cX */ 2608,
+ /* branch: 0x51dX */ 2624,
+ /* branch: 0x51eX */ 2640,
+ /* branch: 0x51fX */ 2656,
+ /* key: 0x5100 */ 0x3537,
+ /* key: 0x5101 */ 0x512e,
+ /* key: 0x5102 */ 0x512f,
+ /* key: 0x5103 */ 0xb249,
+ /* key: 0x5104 */ 0x322f,
+ /* key: 0x5105 */ 0xffff,
+ /* key: 0x5106 */ 0xb24a,
+ /* key: 0x5107 */ 0xb24b,
+ /* key: 0x5108 */ 0xb24c,
+ /* key: 0x5109 */ 0x512d,
+ /* key: 0x510a */ 0xffff,
+ /* key: 0x510b */ 0xb24d,
+ /* key: 0x510c */ 0xb24e,
+ /* key: 0x510d */ 0xb24f,
+ /* key: 0x510e */ 0xb250,
+ /* key: 0x510f */ 0xffff,
+ /* key: 0x5110 */ 0xb252,
+ /* key: 0x5111 */ 0xffff,
+ /* key: 0x5112 */ 0x3c74,
+ /* key: 0x5113 */ 0xffff,
+ /* key: 0x5114 */ 0x5132,
+ /* key: 0x5115 */ 0x5131,
+ /* key: 0x5116 */ 0x5130,
+ /* key: 0x5117 */ 0xb253,
+ /* key: 0x5118 */ 0x5056,
+ /* key: 0x5119 */ 0xb254,
+ /* key: 0x511a */ 0x5133,
+ /* key: 0x511b */ 0xb255,
+ /* key: 0x511c */ 0xb256,
+ /* key: 0x511d */ 0xb257,
+ /* key: 0x511e */ 0xb258,
+ /* key: 0x511f */ 0x3d7e,
+ /* key: 0x5120 */ 0xffff,
+ /* key: 0x5121 */ 0x5134,
+ /* key: 0x5122 */ 0xffff,
+ /* key: 0x5123 */ 0xb259,
+ /* key: 0x5124 */ 0xffff,
+ /* key: 0x5125 */ 0xffff,
+ /* key: 0x5126 */ 0xffff,
+ /* key: 0x5127 */ 0xb25a,
+ /* key: 0x5128 */ 0xb25b,
+ /* key: 0x5129 */ 0xffff,
+ /* key: 0x512a */ 0x4d25,
+ /* key: 0x512b */ 0xffff,
+ /* key: 0x512c */ 0xb25c,
+ /* key: 0x512d */ 0xb25d,
+ /* key: 0x512e */ 0xffff,
+ /* key: 0x512f */ 0xb25e,
+ /* key: 0x5130 */ 0xffff,
+ /* key: 0x5131 */ 0xb25f,
+ /* key: 0x5132 */ 0x4c59,
+ /* key: 0x5133 */ 0xb260,
+ /* key: 0x5134 */ 0xb261,
+ /* key: 0x5135 */ 0xb262,
+ /* key: 0x5136 */ 0xffff,
+ /* key: 0x5137 */ 0x5136,
+ /* key: 0x5138 */ 0xb263,
+ /* key: 0x5139 */ 0xb264,
+ /* key: 0x513a */ 0x5135,
+ /* key: 0x513b */ 0x5138,
+ /* key: 0x513c */ 0x5137,
+ /* key: 0x513d */ 0xffff,
+ /* key: 0x513e */ 0xffff,
+ /* key: 0x513f */ 0x5139,
+ /* key: 0x5140 */ 0x513a,
+ /* key: 0x5141 */ 0x3074,
+ /* key: 0x5142 */ 0xb265,
+ /* key: 0x5143 */ 0x3835,
+ /* key: 0x5144 */ 0x373b,
+ /* key: 0x5145 */ 0x3d3c,
+ /* key: 0x5146 */ 0x437b,
+ /* key: 0x5147 */ 0x3624,
+ /* key: 0x5148 */ 0x4068,
+ /* key: 0x5149 */ 0x3877,
+ /* key: 0x514a */ 0xb266,
+ /* key: 0x514b */ 0x396e,
+ /* key: 0x514c */ 0x513c,
+ /* key: 0x514d */ 0x4c48,
+ /* key: 0x514e */ 0x4546,
+ /* key: 0x514f */ 0xb267,
+ /* key: 0x5150 */ 0x3b79,
+ /* key: 0x5151 */ 0xffff,
+ /* key: 0x5152 */ 0x513b,
+ /* key: 0x5153 */ 0xb268,
+ /* key: 0x5154 */ 0x513d,
+ /* key: 0x5155 */ 0xb269,
+ /* key: 0x5156 */ 0xffff,
+ /* key: 0x5157 */ 0xb26a,
+ /* key: 0x5158 */ 0xb26b,
+ /* key: 0x5159 */ 0xffff,
+ /* key: 0x515a */ 0x455e,
+ /* key: 0x515b */ 0xffff,
+ /* key: 0x515c */ 0x3375,
+ /* key: 0x515d */ 0xffff,
+ /* key: 0x515e */ 0xffff,
+ /* key: 0x515f */ 0xb26c,
+ /* key: 0x5160 */ 0xffff,
+ /* key: 0x5161 */ 0xffff,
+ /* key: 0x5162 */ 0x513e,
+ /* key: 0x5163 */ 0xffff,
+ /* key: 0x5164 */ 0xb26d,
+ /* key: 0x5165 */ 0x467e,
+ /* key: 0x5166 */ 0xb26e,
+ /* key: 0x5167 */ 0xffff,
+ /* key: 0x5168 */ 0x4134,
+ /* key: 0x5169 */ 0x5140,
+ /* key: 0x516a */ 0x5141,
+ /* key: 0x516b */ 0x482c,
+ /* key: 0x516c */ 0x3878,
+ /* key: 0x516d */ 0x4f3b,
+ /* key: 0x516e */ 0x5142,
+ /* key: 0x516f */ 0xffff,
+ /* key: 0x5170 */ 0xffff,
+ /* key: 0x5171 */ 0x3626,
+ /* key: 0x5172 */ 0xffff,
+ /* key: 0x5173 */ 0xffff,
+ /* key: 0x5174 */ 0xffff,
+ /* key: 0x5175 */ 0x4a3c,
+ /* key: 0x5176 */ 0x4236,
+ /* key: 0x5177 */ 0x3671,
+ /* key: 0x5178 */ 0x4535,
+ /* key: 0x5179 */ 0xffff,
+ /* key: 0x517a */ 0xffff,
+ /* key: 0x517b */ 0xffff,
+ /* key: 0x517c */ 0x3773,
+ /* key: 0x517d */ 0xffff,
+ /* key: 0x517e */ 0xb26f,
+ /* key: 0x517f */ 0xffff,
+ /* key: 0x5180 */ 0x5143,
+ /* key: 0x5181 */ 0xffff,
+ /* key: 0x5182 */ 0x5144,
+ /* key: 0x5183 */ 0xb270,
+ /* key: 0x5184 */ 0xb271,
+ /* key: 0x5185 */ 0x4662,
+ /* key: 0x5186 */ 0x315f,
+ /* key: 0x5187 */ 0xffff,
+ /* key: 0x5188 */ 0xffff,
+ /* key: 0x5189 */ 0x5147,
+ /* key: 0x518a */ 0x3a7d,
+ /* key: 0x518b */ 0xb272,
+ /* key: 0x518c */ 0x5146,
+ /* key: 0x518d */ 0x3a46,
+ /* key: 0x518e */ 0xb273,
+ /* key: 0x518f */ 0x5148,
+ /* key: 0x5190 */ 0x666e,
+ /* key: 0x5191 */ 0x5149,
+ /* key: 0x5192 */ 0x4b41,
+ /* key: 0x5193 */ 0x514a,
+ /* key: 0x5194 */ 0xffff,
+ /* key: 0x5195 */ 0x514b,
+ /* key: 0x5196 */ 0x514c,
+ /* key: 0x5197 */ 0x3e69,
+ /* key: 0x5198 */ 0xb274,
+ /* key: 0x5199 */ 0x3c4c,
+ /* key: 0x519a */ 0xffff,
+ /* key: 0x519b */ 0xffff,
+ /* key: 0x519c */ 0xffff,
+ /* key: 0x519d */ 0xb275,
+ /* key: 0x519e */ 0xffff,
+ /* key: 0x519f */ 0xffff,
+ /* key: 0x51a0 */ 0x3427,
+ /* key: 0x51a1 */ 0xb276,
+ /* key: 0x51a2 */ 0x514f,
+ /* key: 0x51a3 */ 0xb277,
+ /* key: 0x51a4 */ 0x514d,
+ /* key: 0x51a5 */ 0x4c3d,
+ /* key: 0x51a6 */ 0x514e,
+ /* key: 0x51a7 */ 0xffff,
+ /* key: 0x51a8 */ 0x495a,
+ /* key: 0x51a9 */ 0x5150,
+ /* key: 0x51aa */ 0x5151,
+ /* key: 0x51ab */ 0x5152,
+ /* key: 0x51ac */ 0x455f,
+ /* key: 0x51ad */ 0xb278,
+ /* key: 0x51ae */ 0xffff,
+ /* key: 0x51af */ 0xffff,
+ /* key: 0x51b0 */ 0x5156,
+ /* key: 0x51b1 */ 0x5154,
+ /* key: 0x51b2 */ 0x5155,
+ /* key: 0x51b3 */ 0x5153,
+ /* key: 0x51b4 */ 0x3a63,
+ /* key: 0x51b5 */ 0x5157,
+ /* key: 0x51b6 */ 0x4c6a,
+ /* key: 0x51b7 */ 0x4e64,
+ /* key: 0x51b8 */ 0xb279,
+ /* key: 0x51b9 */ 0xffff,
+ /* key: 0x51ba */ 0xb27a,
+ /* key: 0x51bb */ 0xffff,
+ /* key: 0x51bc */ 0xb27b,
+ /* key: 0x51bd */ 0x5158,
+ /* key: 0x51be */ 0xb27c,
+ /* key: 0x51bf */ 0xb27d,
+ /* key: 0x51c0 */ 0xffff,
+ /* key: 0x51c1 */ 0xffff,
+ /* key: 0x51c2 */ 0xb27e,
+ /* key: 0x51c3 */ 0xffff,
+ /* key: 0x51c4 */ 0x4028,
+ /* key: 0x51c5 */ 0x5159,
+ /* key: 0x51c6 */ 0x3d5a,
+ /* key: 0x51c7 */ 0xffff,
+ /* key: 0x51c8 */ 0xb321,
+ /* key: 0x51c9 */ 0x515a,
+ /* key: 0x51ca */ 0xffff,
+ /* key: 0x51cb */ 0x437c,
+ /* key: 0x51cc */ 0x4e3f,
+ /* key: 0x51cd */ 0x4560,
+ /* key: 0x51ce */ 0xffff,
+ /* key: 0x51cf */ 0xb322,
+ /* key: 0x51d0 */ 0xffff,
+ /* key: 0x51d1 */ 0xb323,
+ /* key: 0x51d2 */ 0xb324,
+ /* key: 0x51d3 */ 0xb325,
+ /* key: 0x51d4 */ 0xffff,
+ /* key: 0x51d5 */ 0xb326,
+ /* key: 0x51d6 */ 0x5245,
+ /* key: 0x51d7 */ 0xffff,
+ /* key: 0x51d8 */ 0xb327,
+ /* key: 0x51d9 */ 0xffff,
+ /* key: 0x51da */ 0xffff,
+ /* key: 0x51db */ 0x515b,
+ /* key: 0x51dc */ 0x7425,
+ /* key: 0x51dd */ 0x3645,
+ /* key: 0x51de */ 0xb328,
+ /* key: 0x51df */ 0xffff,
+ /* key: 0x51e0 */ 0x515c,
+ /* key: 0x51e1 */ 0x4b5e,
+ /* key: 0x51e2 */ 0xb329,
+ /* key: 0x51e3 */ 0xffff,
+ /* key: 0x51e4 */ 0xffff,
+ /* key: 0x51e5 */ 0xb32a,
+ /* key: 0x51e6 */ 0x3d68,
+ /* key: 0x51e7 */ 0x427c,
+ /* key: 0x51e8 */ 0xffff,
+ /* key: 0x51e9 */ 0x515e,
+ /* key: 0x51ea */ 0x4664,
+ /* key: 0x51eb */ 0xffff,
+ /* key: 0x51ec */ 0xffff,
+ /* key: 0x51ed */ 0x515f,
+ /* key: 0x51ee */ 0xb32b,
+ /* key: 0x51ef */ 0xffff,
+ /* key: 0x51f0 */ 0x5160,
+ /* key: 0x51f1 */ 0x332e,
+ /* key: 0x51f2 */ 0xb32c,
+ /* key: 0x51f3 */ 0xb32d,
+ /* key: 0x51f4 */ 0xb32e,
+ /* key: 0x51f5 */ 0x5161,
+ /* key: 0x51f6 */ 0x3627,
+ /* key: 0x51f7 */ 0xb32f,
+ /* key: 0x51f8 */ 0x464c,
+ /* key: 0x51f9 */ 0x317a,
+ /* key: 0x51fa */ 0x3d50,
+ /* key: 0x51fb */ 0xffff,
+ /* key: 0x51fc */ 0xffff,
+ /* key: 0x51fd */ 0x4821,
+ /* key: 0x51fe */ 0x5162,
+ /* key: 0x51ff */ 0xffff,
+ /* branch: 0x520X */ 2688,
+ /* branch: 0x521X */ 2704,
+ /* branch: 0x522X */ 2720,
+ /* branch: 0x523X */ 2736,
+ /* branch: 0x524X */ 2752,
+ /* branch: 0x525X */ 2768,
+ /* branch: 0x526X */ 2784,
+ /* branch: 0x527X */ 2800,
+ /* branch: 0x528X */ 2816,
+ /* branch: 0x529X */ 2832,
+ /* branch: 0x52aX */ 2848,
+ /* branch: 0x52bX */ 2864,
+ /* branch: 0x52cX */ 2880,
+ /* branch: 0x52dX */ 2896,
+ /* branch: 0x52eX */ 2912,
+ /* branch: 0x52fX */ 2928,
+ /* key: 0x5200 */ 0x4561,
+ /* key: 0x5201 */ 0xb330,
+ /* key: 0x5202 */ 0xb331,
+ /* key: 0x5203 */ 0x3f4f,
+ /* key: 0x5204 */ 0x5163,
+ /* key: 0x5205 */ 0xb332,
+ /* key: 0x5206 */ 0x4a2c,
+ /* key: 0x5207 */ 0x405a,
+ /* key: 0x5208 */ 0x3422,
+ /* key: 0x5209 */ 0xffff,
+ /* key: 0x520a */ 0x3429,
+ /* key: 0x520b */ 0x5164,
+ /* key: 0x520c */ 0xffff,
+ /* key: 0x520d */ 0xffff,
+ /* key: 0x520e */ 0x5166,
+ /* key: 0x520f */ 0xffff,
+ /* key: 0x5210 */ 0xffff,
+ /* key: 0x5211 */ 0x373a,
+ /* key: 0x5212 */ 0xb333,
+ /* key: 0x5213 */ 0xb334,
+ /* key: 0x5214 */ 0x5165,
+ /* key: 0x5215 */ 0xb335,
+ /* key: 0x5216 */ 0xb336,
+ /* key: 0x5217 */ 0x4e73,
+ /* key: 0x5218 */ 0xb337,
+ /* key: 0x5219 */ 0xffff,
+ /* key: 0x521a */ 0xffff,
+ /* key: 0x521b */ 0xffff,
+ /* key: 0x521c */ 0xffff,
+ /* key: 0x521d */ 0x3d69,
+ /* key: 0x521e */ 0xffff,
+ /* key: 0x521f */ 0xffff,
+ /* key: 0x5220 */ 0xffff,
+ /* key: 0x5221 */ 0xffff,
+ /* key: 0x5222 */ 0xb338,
+ /* key: 0x5223 */ 0xffff,
+ /* key: 0x5224 */ 0x483d,
+ /* key: 0x5225 */ 0x4a4c,
+ /* key: 0x5226 */ 0xffff,
+ /* key: 0x5227 */ 0x5167,
+ /* key: 0x5228 */ 0xb339,
+ /* key: 0x5229 */ 0x4d78,
+ /* key: 0x522a */ 0x5168,
+ /* key: 0x522b */ 0xffff,
+ /* key: 0x522c */ 0xffff,
+ /* key: 0x522d */ 0xffff,
+ /* key: 0x522e */ 0x5169,
+ /* key: 0x522f */ 0xffff,
+ /* key: 0x5230 */ 0x457e,
+ /* key: 0x5231 */ 0xb33a,
+ /* key: 0x5232 */ 0xb33b,
+ /* key: 0x5233 */ 0x516a,
+ /* key: 0x5234 */ 0xffff,
+ /* key: 0x5235 */ 0xb33c,
+ /* key: 0x5236 */ 0x4029,
+ /* key: 0x5237 */ 0x3a7e,
+ /* key: 0x5238 */ 0x3774,
+ /* key: 0x5239 */ 0x516b,
+ /* key: 0x523a */ 0x3b49,
+ /* key: 0x523b */ 0x396f,
+ /* key: 0x523c */ 0xb33d,
+ /* key: 0x523d */ 0xffff,
+ /* key: 0x523e */ 0xffff,
+ /* key: 0x523f */ 0xffff,
+ /* key: 0x5240 */ 0xffff,
+ /* key: 0x5241 */ 0xffff,
+ /* key: 0x5242 */ 0xffff,
+ /* key: 0x5243 */ 0x4466,
+ /* key: 0x5244 */ 0x516d,
+ /* key: 0x5245 */ 0xb33e,
+ /* key: 0x5246 */ 0xffff,
+ /* key: 0x5247 */ 0x4227,
+ /* key: 0x5248 */ 0xffff,
+ /* key: 0x5249 */ 0xb33f,
+ /* key: 0x524a */ 0x3a6f,
+ /* key: 0x524b */ 0x516e,
+ /* key: 0x524c */ 0x516f,
+ /* key: 0x524d */ 0x4130,
+ /* key: 0x524e */ 0xffff,
+ /* key: 0x524f */ 0x516c,
+ /* key: 0x5250 */ 0xffff,
+ /* key: 0x5251 */ 0xffff,
+ /* key: 0x5252 */ 0xffff,
+ /* key: 0x5253 */ 0xffff,
+ /* key: 0x5254 */ 0x5171,
+ /* key: 0x5255 */ 0xb340,
+ /* key: 0x5256 */ 0x4b36,
+ /* key: 0x5257 */ 0xb341,
+ /* key: 0x5258 */ 0xb342,
+ /* key: 0x5259 */ 0xffff,
+ /* key: 0x525a */ 0xb343,
+ /* key: 0x525b */ 0x3964,
+ /* key: 0x525c */ 0xb344,
+ /* key: 0x525d */ 0xffff,
+ /* key: 0x525e */ 0x5170,
+ /* key: 0x525f */ 0xb345,
+ /* key: 0x5260 */ 0xb346,
+ /* key: 0x5261 */ 0xb347,
+ /* key: 0x5262 */ 0xffff,
+ /* key: 0x5263 */ 0x3775,
+ /* key: 0x5264 */ 0x3a5e,
+ /* key: 0x5265 */ 0x476d,
+ /* key: 0x5266 */ 0xb348,
+ /* key: 0x5267 */ 0xffff,
+ /* key: 0x5268 */ 0xffff,
+ /* key: 0x5269 */ 0x5174,
+ /* key: 0x526a */ 0x5172,
+ /* key: 0x526b */ 0xffff,
+ /* key: 0x526c */ 0xffff,
+ /* key: 0x526d */ 0xffff,
+ /* key: 0x526e */ 0xb349,
+ /* key: 0x526f */ 0x497b,
+ /* key: 0x5270 */ 0x3e6a,
+ /* key: 0x5271 */ 0x517b,
+ /* key: 0x5272 */ 0x3364,
+ /* key: 0x5273 */ 0x5175,
+ /* key: 0x5274 */ 0x5173,
+ /* key: 0x5275 */ 0x414f,
+ /* key: 0x5276 */ 0xffff,
+ /* key: 0x5277 */ 0xb34a,
+ /* key: 0x5278 */ 0xb34b,
+ /* key: 0x5279 */ 0xb34c,
+ /* key: 0x527a */ 0xffff,
+ /* key: 0x527b */ 0xffff,
+ /* key: 0x527c */ 0xffff,
+ /* key: 0x527d */ 0x5177,
+ /* key: 0x527e */ 0xffff,
+ /* key: 0x527f */ 0x5176,
+ /* key: 0x5280 */ 0xb34d,
+ /* key: 0x5281 */ 0xffff,
+ /* key: 0x5282 */ 0xb34e,
+ /* key: 0x5283 */ 0x3344,
+ /* key: 0x5284 */ 0xffff,
+ /* key: 0x5285 */ 0xb34f,
+ /* key: 0x5286 */ 0xffff,
+ /* key: 0x5287 */ 0x3760,
+ /* key: 0x5288 */ 0x517c,
+ /* key: 0x5289 */ 0x4e2d,
+ /* key: 0x528a */ 0xb350,
+ /* key: 0x528b */ 0xffff,
+ /* key: 0x528c */ 0xb351,
+ /* key: 0x528d */ 0x5178,
+ /* key: 0x528e */ 0xffff,
+ /* key: 0x528f */ 0xffff,
+ /* key: 0x5290 */ 0xffff,
+ /* key: 0x5291 */ 0x517d,
+ /* key: 0x5292 */ 0x517a,
+ /* key: 0x5293 */ 0xb352,
+ /* key: 0x5294 */ 0x5179,
+ /* key: 0x5295 */ 0xb353,
+ /* key: 0x5296 */ 0xb354,
+ /* key: 0x5297 */ 0xb355,
+ /* key: 0x5298 */ 0xb356,
+ /* key: 0x5299 */ 0xffff,
+ /* key: 0x529a */ 0xb357,
+ /* key: 0x529b */ 0x4e4f,
+ /* key: 0x529c */ 0xb358,
+ /* key: 0x529d */ 0xffff,
+ /* key: 0x529e */ 0xffff,
+ /* key: 0x529f */ 0x3879,
+ /* key: 0x52a0 */ 0x3243,
+ /* key: 0x52a1 */ 0xffff,
+ /* key: 0x52a2 */ 0xffff,
+ /* key: 0x52a3 */ 0x4e74,
+ /* key: 0x52a4 */ 0xb359,
+ /* key: 0x52a5 */ 0xb35a,
+ /* key: 0x52a6 */ 0xb35b,
+ /* key: 0x52a7 */ 0xb35c,
+ /* key: 0x52a8 */ 0xffff,
+ /* key: 0x52a9 */ 0x3d75,
+ /* key: 0x52aa */ 0x4558,
+ /* key: 0x52ab */ 0x3965,
+ /* key: 0x52ac */ 0x5222,
+ /* key: 0x52ad */ 0x5223,
+ /* key: 0x52ae */ 0xffff,
+ /* key: 0x52af */ 0xb35d,
+ /* key: 0x52b0 */ 0xb35e,
+ /* key: 0x52b1 */ 0x4e65,
+ /* key: 0x52b2 */ 0xffff,
+ /* key: 0x52b3 */ 0xffff,
+ /* key: 0x52b4 */ 0x4f2b,
+ /* key: 0x52b5 */ 0x5225,
+ /* key: 0x52b6 */ 0xb35f,
+ /* key: 0x52b7 */ 0xb360,
+ /* key: 0x52b8 */ 0xb361,
+ /* key: 0x52b9 */ 0x387a,
+ /* key: 0x52ba */ 0xb362,
+ /* key: 0x52bb */ 0xb363,
+ /* key: 0x52bc */ 0x5224,
+ /* key: 0x52bd */ 0xb364,
+ /* key: 0x52be */ 0x332f,
+ /* key: 0x52bf */ 0xffff,
+ /* key: 0x52c0 */ 0xb365,
+ /* key: 0x52c1 */ 0x5226,
+ /* key: 0x52c2 */ 0xffff,
+ /* key: 0x52c3 */ 0x4b56,
+ /* key: 0x52c4 */ 0xb366,
+ /* key: 0x52c5 */ 0x443c,
+ /* key: 0x52c6 */ 0xb367,
+ /* key: 0x52c7 */ 0x4d26,
+ /* key: 0x52c8 */ 0xb368,
+ /* key: 0x52c9 */ 0x4a59,
+ /* key: 0x52ca */ 0xffff,
+ /* key: 0x52cb */ 0xffff,
+ /* key: 0x52cc */ 0xb369,
+ /* key: 0x52cd */ 0x5227,
+ /* key: 0x52ce */ 0xffff,
+ /* key: 0x52cf */ 0xb36a,
+ /* key: 0x52d0 */ 0xffff,
+ /* key: 0x52d1 */ 0xb36b,
+ /* key: 0x52d2 */ 0x7055,
+ /* key: 0x52d3 */ 0xffff,
+ /* key: 0x52d4 */ 0xb36c,
+ /* key: 0x52d5 */ 0x4630,
+ /* key: 0x52d6 */ 0xb36d,
+ /* key: 0x52d7 */ 0x5228,
+ /* key: 0x52d8 */ 0x342a,
+ /* key: 0x52d9 */ 0x4c33,
+ /* key: 0x52da */ 0xffff,
+ /* key: 0x52db */ 0xb36e,
+ /* key: 0x52dc */ 0xb36f,
+ /* key: 0x52dd */ 0x3e21,
+ /* key: 0x52de */ 0x5229,
+ /* key: 0x52df */ 0x4a67,
+ /* key: 0x52e0 */ 0x522d,
+ /* key: 0x52e1 */ 0xb370,
+ /* key: 0x52e2 */ 0x402a,
+ /* key: 0x52e3 */ 0x522a,
+ /* key: 0x52e4 */ 0x3650,
+ /* key: 0x52e5 */ 0xb371,
+ /* key: 0x52e6 */ 0x522b,
+ /* key: 0x52e7 */ 0x342b,
+ /* key: 0x52e8 */ 0xb372,
+ /* key: 0x52e9 */ 0xb373,
+ /* key: 0x52ea */ 0xb374,
+ /* key: 0x52eb */ 0xffff,
+ /* key: 0x52ec */ 0xb375,
+ /* key: 0x52ed */ 0xffff,
+ /* key: 0x52ee */ 0xffff,
+ /* key: 0x52ef */ 0xffff,
+ /* key: 0x52f0 */ 0xb376,
+ /* key: 0x52f1 */ 0xb377,
+ /* key: 0x52f2 */ 0x372e,
+ /* key: 0x52f3 */ 0x522e,
+ /* key: 0x52f4 */ 0xb378,
+ /* key: 0x52f5 */ 0x522f,
+ /* key: 0x52f6 */ 0xb379,
+ /* key: 0x52f7 */ 0xb37a,
+ /* key: 0x52f8 */ 0x5230,
+ /* key: 0x52f9 */ 0x5231,
+ /* key: 0x52fa */ 0x3c5b,
+ /* key: 0x52fb */ 0xffff,
+ /* key: 0x52fc */ 0xffff,
+ /* key: 0x52fd */ 0xffff,
+ /* key: 0x52fe */ 0x387b,
+ /* key: 0x52ff */ 0x4c5e,
+ /* branch: 0x530X */ 2960,
+ /* branch: 0x531X */ 2976,
+ /* branch: 0x532X */ 2992,
+ /* branch: 0x533X */ 3008,
+ /* branch: 0x534X */ 3024,
+ /* branch: 0x535X */ 3040,
+ /* branch: 0x536X */ 3056,
+ /* branch: 0x537X */ 3072,
+ /* branch: 0x538X */ 3088,
+ /* branch: 0x539X */ 3104,
+ /* branch: 0x53aX */ 3120,
+ /* branch: 0x53bX */ 3136,
+ /* branch: 0x53cX */ 3152,
+ /* branch: 0x53dX */ 3168,
+ /* branch: 0x53eX */ 3184,
+ /* branch: 0x53fX */ 3200,
+ /* key: 0x5300 */ 0xb37b,
+ /* key: 0x5301 */ 0x4c68,
+ /* key: 0x5302 */ 0x4677,
+ /* key: 0x5303 */ 0xb37c,
+ /* key: 0x5304 */ 0xffff,
+ /* key: 0x5305 */ 0x4a71,
+ /* key: 0x5306 */ 0x5232,
+ /* key: 0x5307 */ 0xffff,
+ /* key: 0x5308 */ 0x5233,
+ /* key: 0x5309 */ 0xffff,
+ /* key: 0x530a */ 0xb37d,
+ /* key: 0x530b */ 0xb37e,
+ /* key: 0x530c */ 0xb421,
+ /* key: 0x530d */ 0x5235,
+ /* key: 0x530e */ 0xffff,
+ /* key: 0x530f */ 0x5237,
+ /* key: 0x5310 */ 0x5236,
+ /* key: 0x5311 */ 0xb422,
+ /* key: 0x5312 */ 0xffff,
+ /* key: 0x5313 */ 0xb423,
+ /* key: 0x5314 */ 0xffff,
+ /* key: 0x5315 */ 0x5238,
+ /* key: 0x5316 */ 0x323d,
+ /* key: 0x5317 */ 0x4b4c,
+ /* key: 0x5318 */ 0xb424,
+ /* key: 0x5319 */ 0x3a7c,
+ /* key: 0x531a */ 0x5239,
+ /* key: 0x531b */ 0xb425,
+ /* key: 0x531c */ 0xb426,
+ /* key: 0x531d */ 0x4159,
+ /* key: 0x531e */ 0xb427,
+ /* key: 0x531f */ 0xb428,
+ /* key: 0x5320 */ 0x3e22,
+ /* key: 0x5321 */ 0x3629,
+ /* key: 0x5322 */ 0xffff,
+ /* key: 0x5323 */ 0x523a,
+ /* key: 0x5324 */ 0xffff,
+ /* key: 0x5325 */ 0xb429,
+ /* key: 0x5326 */ 0xffff,
+ /* key: 0x5327 */ 0xb42a,
+ /* key: 0x5328 */ 0xb42b,
+ /* key: 0x5329 */ 0xb42c,
+ /* key: 0x532a */ 0x485b,
+ /* key: 0x532b */ 0xb42d,
+ /* key: 0x532c */ 0xb42e,
+ /* key: 0x532d */ 0xb42f,
+ /* key: 0x532e */ 0xffff,
+ /* key: 0x532f */ 0x523b,
+ /* key: 0x5330 */ 0xb430,
+ /* key: 0x5331 */ 0x523c,
+ /* key: 0x5332 */ 0xb431,
+ /* key: 0x5333 */ 0x523d,
+ /* key: 0x5334 */ 0xffff,
+ /* key: 0x5335 */ 0xb432,
+ /* key: 0x5336 */ 0xffff,
+ /* key: 0x5337 */ 0xffff,
+ /* key: 0x5338 */ 0x523e,
+ /* key: 0x5339 */ 0x4924,
+ /* key: 0x533a */ 0x3668,
+ /* key: 0x533b */ 0x3065,
+ /* key: 0x533c */ 0xb433,
+ /* key: 0x533d */ 0xb434,
+ /* key: 0x533e */ 0xb435,
+ /* key: 0x533f */ 0x463f,
+ /* key: 0x5340 */ 0x523f,
+ /* key: 0x5341 */ 0x3d3d,
+ /* key: 0x5342 */ 0xb436,
+ /* key: 0x5343 */ 0x4069,
+ /* key: 0x5344 */ 0xffff,
+ /* key: 0x5345 */ 0x5241,
+ /* key: 0x5346 */ 0x5240,
+ /* key: 0x5347 */ 0x3e23,
+ /* key: 0x5348 */ 0x3861,
+ /* key: 0x5349 */ 0x5243,
+ /* key: 0x534a */ 0x483e,
+ /* key: 0x534b */ 0xb438,
+ /* key: 0x534c */ 0xb437,
+ /* key: 0x534d */ 0x5244,
+ /* key: 0x534e */ 0xffff,
+ /* key: 0x534f */ 0xffff,
+ /* key: 0x5350 */ 0xffff,
+ /* key: 0x5351 */ 0x485c,
+ /* key: 0x5352 */ 0x4234,
+ /* key: 0x5353 */ 0x426e,
+ /* key: 0x5354 */ 0x3628,
+ /* key: 0x5355 */ 0xffff,
+ /* key: 0x5356 */ 0xffff,
+ /* key: 0x5357 */ 0x466e,
+ /* key: 0x5358 */ 0x4331,
+ /* key: 0x5359 */ 0xb439,
+ /* key: 0x535a */ 0x476e,
+ /* key: 0x535b */ 0xb43a,
+ /* key: 0x535c */ 0x4b4e,
+ /* key: 0x535d */ 0xffff,
+ /* key: 0x535e */ 0x5246,
+ /* key: 0x535f */ 0xffff,
+ /* key: 0x5360 */ 0x406a,
+ /* key: 0x5361 */ 0xb43b,
+ /* key: 0x5362 */ 0xffff,
+ /* key: 0x5363 */ 0xb43c,
+ /* key: 0x5364 */ 0xffff,
+ /* key: 0x5365 */ 0xb43d,
+ /* key: 0x5366 */ 0x3735,
+ /* key: 0x5367 */ 0xffff,
+ /* key: 0x5368 */ 0xffff,
+ /* key: 0x5369 */ 0x5247,
+ /* key: 0x536a */ 0xffff,
+ /* key: 0x536b */ 0xffff,
+ /* key: 0x536c */ 0xb43e,
+ /* key: 0x536d */ 0xb43f,
+ /* key: 0x536e */ 0x5248,
+ /* key: 0x536f */ 0x312c,
+ /* key: 0x5370 */ 0x3075,
+ /* key: 0x5371 */ 0x346d,
+ /* key: 0x5372 */ 0xb440,
+ /* key: 0x5373 */ 0x4228,
+ /* key: 0x5374 */ 0x3551,
+ /* key: 0x5375 */ 0x4d71,
+ /* key: 0x5376 */ 0xffff,
+ /* key: 0x5377 */ 0x524b,
+ /* key: 0x5378 */ 0x3237,
+ /* key: 0x5379 */ 0xb441,
+ /* key: 0x537a */ 0xffff,
+ /* key: 0x537b */ 0x524a,
+ /* key: 0x537c */ 0xffff,
+ /* key: 0x537d */ 0xffff,
+ /* key: 0x537e */ 0xb442,
+ /* key: 0x537f */ 0x362a,
+ /* key: 0x5380 */ 0xffff,
+ /* key: 0x5381 */ 0xffff,
+ /* key: 0x5382 */ 0x524c,
+ /* key: 0x5383 */ 0xb443,
+ /* key: 0x5384 */ 0x4c71,
+ /* key: 0x5385 */ 0xffff,
+ /* key: 0x5386 */ 0xffff,
+ /* key: 0x5387 */ 0xb444,
+ /* key: 0x5388 */ 0xb445,
+ /* key: 0x5389 */ 0xffff,
+ /* key: 0x538a */ 0xffff,
+ /* key: 0x538b */ 0xffff,
+ /* key: 0x538c */ 0xffff,
+ /* key: 0x538d */ 0xffff,
+ /* key: 0x538e */ 0xb446,
+ /* key: 0x538f */ 0xffff,
+ /* key: 0x5390 */ 0xffff,
+ /* key: 0x5391 */ 0xffff,
+ /* key: 0x5392 */ 0xffff,
+ /* key: 0x5393 */ 0xb447,
+ /* key: 0x5394 */ 0xb448,
+ /* key: 0x5395 */ 0xffff,
+ /* key: 0x5396 */ 0x524d,
+ /* key: 0x5397 */ 0xffff,
+ /* key: 0x5398 */ 0x4e52,
+ /* key: 0x5399 */ 0xb449,
+ /* key: 0x539a */ 0x387c,
+ /* key: 0x539b */ 0xffff,
+ /* key: 0x539c */ 0xffff,
+ /* key: 0x539d */ 0xb44a,
+ /* key: 0x539e */ 0xffff,
+ /* key: 0x539f */ 0x3836,
+ /* key: 0x53a0 */ 0x524e,
+ /* key: 0x53a1 */ 0xb44b,
+ /* key: 0x53a2 */ 0xffff,
+ /* key: 0x53a3 */ 0xffff,
+ /* key: 0x53a4 */ 0xb44c,
+ /* key: 0x53a5 */ 0x5250,
+ /* key: 0x53a6 */ 0x524f,
+ /* key: 0x53a7 */ 0xffff,
+ /* key: 0x53a8 */ 0x3f5f,
+ /* key: 0x53a9 */ 0x3139,
+ /* key: 0x53aa */ 0xb44d,
+ /* key: 0x53ab */ 0xb44e,
+ /* key: 0x53ac */ 0xffff,
+ /* key: 0x53ad */ 0x315e,
+ /* key: 0x53ae */ 0x5251,
+ /* key: 0x53af */ 0xb44f,
+ /* key: 0x53b0 */ 0x5252,
+ /* key: 0x53b1 */ 0xffff,
+ /* key: 0x53b2 */ 0xb450,
+ /* key: 0x53b3 */ 0x3837,
+ /* key: 0x53b4 */ 0xb451,
+ /* key: 0x53b5 */ 0xb452,
+ /* key: 0x53b6 */ 0x5253,
+ /* key: 0x53b7 */ 0xb453,
+ /* key: 0x53b8 */ 0xb454,
+ /* key: 0x53b9 */ 0xffff,
+ /* key: 0x53ba */ 0xb455,
+ /* key: 0x53bb */ 0x356e,
+ /* key: 0x53bc */ 0xffff,
+ /* key: 0x53bd */ 0xb456,
+ /* key: 0x53be */ 0xffff,
+ /* key: 0x53bf */ 0xffff,
+ /* key: 0x53c0 */ 0xb457,
+ /* key: 0x53c1 */ 0xffff,
+ /* key: 0x53c2 */ 0x3b32,
+ /* key: 0x53c3 */ 0x5254,
+ /* key: 0x53c4 */ 0xffff,
+ /* key: 0x53c5 */ 0xb458,
+ /* key: 0x53c6 */ 0xffff,
+ /* key: 0x53c7 */ 0xffff,
+ /* key: 0x53c8 */ 0x4b74,
+ /* key: 0x53c9 */ 0x3a35,
+ /* key: 0x53ca */ 0x355a,
+ /* key: 0x53cb */ 0x4d27,
+ /* key: 0x53cc */ 0x4150,
+ /* key: 0x53cd */ 0x483f,
+ /* key: 0x53ce */ 0x3c7d,
+ /* key: 0x53cf */ 0xb459,
+ /* key: 0x53d0 */ 0xffff,
+ /* key: 0x53d1 */ 0xffff,
+ /* key: 0x53d2 */ 0xb45a,
+ /* key: 0x53d3 */ 0xb45b,
+ /* key: 0x53d4 */ 0x3d47,
+ /* key: 0x53d5 */ 0xb45c,
+ /* key: 0x53d6 */ 0x3c68,
+ /* key: 0x53d7 */ 0x3c75,
+ /* key: 0x53d8 */ 0xffff,
+ /* key: 0x53d9 */ 0x3d76,
+ /* key: 0x53da */ 0xb45d,
+ /* key: 0x53db */ 0x4840,
+ /* key: 0x53dc */ 0xffff,
+ /* key: 0x53dd */ 0xb45e,
+ /* key: 0x53de */ 0xb45f,
+ /* key: 0x53df */ 0x5257,
+ /* key: 0x53e0 */ 0xb460,
+ /* key: 0x53e1 */ 0x3143,
+ /* key: 0x53e2 */ 0x4151,
+ /* key: 0x53e3 */ 0x387d,
+ /* key: 0x53e4 */ 0x3845,
+ /* key: 0x53e5 */ 0x3667,
+ /* key: 0x53e6 */ 0xb461,
+ /* key: 0x53e7 */ 0xb462,
+ /* key: 0x53e8 */ 0x525b,
+ /* key: 0x53e9 */ 0x4321,
+ /* key: 0x53ea */ 0x427e,
+ /* key: 0x53eb */ 0x362b,
+ /* key: 0x53ec */ 0x3e24,
+ /* key: 0x53ed */ 0x525c,
+ /* key: 0x53ee */ 0x525a,
+ /* key: 0x53ef */ 0x3244,
+ /* key: 0x53f0 */ 0x4266,
+ /* key: 0x53f1 */ 0x3c38,
+ /* key: 0x53f2 */ 0x3b4b,
+ /* key: 0x53f3 */ 0x3126,
+ /* key: 0x53f4 */ 0xffff,
+ /* key: 0x53f5 */ 0xb463,
+ /* key: 0x53f6 */ 0x3370,
+ /* key: 0x53f7 */ 0x3966,
+ /* key: 0x53f8 */ 0x3b4a,
+ /* key: 0x53f9 */ 0xffff,
+ /* key: 0x53fa */ 0x525d,
+ /* key: 0x53fb */ 0xffff,
+ /* key: 0x53fc */ 0xffff,
+ /* key: 0x53fd */ 0xffff,
+ /* key: 0x53fe */ 0xffff,
+ /* key: 0x53ff */ 0xffff,
+ /* branch: 0x540X */ 3232,
+ /* branch: 0x541X */ 3248,
+ /* branch: 0x542X */ 3264,
+ /* branch: 0x543X */ 3280,
+ /* branch: 0x544X */ 3296,
+ /* branch: 0x545X */ 3312,
+ /* branch: 0x546X */ 3328,
+ /* branch: 0x547X */ 3344,
+ /* branch: 0x548X */ 3360,
+ /* branch: 0x549X */ 3376,
+ /* branch: 0x54aX */ 3392,
+ /* branch: 0x54bX */ 3408,
+ /* branch: 0x54cX */ 3424,
+ /* branch: 0x54dX */ 3440,
+ /* branch: 0x54eX */ 3456,
+ /* branch: 0x54fX */ 3472,
+ /* key: 0x5400 */ 0xffff,
+ /* key: 0x5401 */ 0x525e,
+ /* key: 0x5402 */ 0xb464,
+ /* key: 0x5403 */ 0x3549,
+ /* key: 0x5404 */ 0x3346,
+ /* key: 0x5405 */ 0xffff,
+ /* key: 0x5406 */ 0xffff,
+ /* key: 0x5407 */ 0xffff,
+ /* key: 0x5408 */ 0x3967,
+ /* key: 0x5409 */ 0x3548,
+ /* key: 0x540a */ 0x445f,
+ /* key: 0x540b */ 0x3125,
+ /* key: 0x540c */ 0x4631,
+ /* key: 0x540d */ 0x4c3e,
+ /* key: 0x540e */ 0x3921,
+ /* key: 0x540f */ 0x4d79,
+ /* key: 0x5410 */ 0x4547,
+ /* key: 0x5411 */ 0x387e,
+ /* key: 0x5412 */ 0xffff,
+ /* key: 0x5413 */ 0xb465,
+ /* key: 0x5414 */ 0xffff,
+ /* key: 0x5415 */ 0xffff,
+ /* key: 0x5416 */ 0xffff,
+ /* key: 0x5417 */ 0xffff,
+ /* key: 0x5418 */ 0xffff,
+ /* key: 0x5419 */ 0xffff,
+ /* key: 0x541a */ 0xb466,
+ /* key: 0x541b */ 0x372f,
+ /* key: 0x541c */ 0xffff,
+ /* key: 0x541d */ 0x5267,
+ /* key: 0x541e */ 0xffff,
+ /* key: 0x541f */ 0x3663,
+ /* key: 0x5420 */ 0x4b4a,
+ /* key: 0x5421 */ 0xb467,
+ /* key: 0x5422 */ 0xffff,
+ /* key: 0x5423 */ 0xffff,
+ /* key: 0x5424 */ 0xffff,
+ /* key: 0x5425 */ 0xffff,
+ /* key: 0x5426 */ 0x485d,
+ /* key: 0x5427 */ 0xb468,
+ /* key: 0x5428 */ 0xb469,
+ /* key: 0x5429 */ 0x5266,
+ /* key: 0x542a */ 0xb46a,
+ /* key: 0x542b */ 0x345e,
+ /* key: 0x542c */ 0x5261,
+ /* key: 0x542d */ 0x5262,
+ /* key: 0x542e */ 0x5264,
+ /* key: 0x542f */ 0xb46b,
+ /* key: 0x5430 */ 0xffff,
+ /* key: 0x5431 */ 0xb46c,
+ /* key: 0x5432 */ 0xffff,
+ /* key: 0x5433 */ 0xffff,
+ /* key: 0x5434 */ 0xb46d,
+ /* key: 0x5435 */ 0xb46e,
+ /* key: 0x5436 */ 0x5265,
+ /* key: 0x5437 */ 0xffff,
+ /* key: 0x5438 */ 0x355b,
+ /* key: 0x5439 */ 0x3f61,
+ /* key: 0x543a */ 0xffff,
+ /* key: 0x543b */ 0x4a2d,
+ /* key: 0x543c */ 0x5263,
+ /* key: 0x543d */ 0x525f,
+ /* key: 0x543e */ 0x3863,
+ /* key: 0x543f */ 0xffff,
+ /* key: 0x5440 */ 0x5260,
+ /* key: 0x5441 */ 0xffff,
+ /* key: 0x5442 */ 0x4f24,
+ /* key: 0x5443 */ 0xb46f,
+ /* key: 0x5444 */ 0xb470,
+ /* key: 0x5445 */ 0xffff,
+ /* key: 0x5446 */ 0x4a72,
+ /* key: 0x5447 */ 0xb471,
+ /* key: 0x5448 */ 0x4468,
+ /* key: 0x5449 */ 0x3862,
+ /* key: 0x544a */ 0x3970,
+ /* key: 0x544b */ 0xffff,
+ /* key: 0x544c */ 0xffff,
+ /* key: 0x544d */ 0xb472,
+ /* key: 0x544e */ 0x5268,
+ /* key: 0x544f */ 0xb473,
+ /* key: 0x5450 */ 0xffff,
+ /* key: 0x5451 */ 0x465d,
+ /* key: 0x5452 */ 0xffff,
+ /* key: 0x5453 */ 0xffff,
+ /* key: 0x5454 */ 0xffff,
+ /* key: 0x5455 */ 0xffff,
+ /* key: 0x5456 */ 0xffff,
+ /* key: 0x5457 */ 0xffff,
+ /* key: 0x5458 */ 0xffff,
+ /* key: 0x5459 */ 0xffff,
+ /* key: 0x545a */ 0xffff,
+ /* key: 0x545b */ 0xffff,
+ /* key: 0x545c */ 0xffff,
+ /* key: 0x545d */ 0xffff,
+ /* key: 0x545e */ 0xb474,
+ /* key: 0x545f */ 0x526c,
+ /* key: 0x5460 */ 0xffff,
+ /* key: 0x5461 */ 0xffff,
+ /* key: 0x5462 */ 0xb475,
+ /* key: 0x5463 */ 0xffff,
+ /* key: 0x5464 */ 0xb476,
+ /* key: 0x5465 */ 0xffff,
+ /* key: 0x5466 */ 0xb477,
+ /* key: 0x5467 */ 0xb478,
+ /* key: 0x5468 */ 0x3c7e,
+ /* key: 0x5469 */ 0xb479,
+ /* key: 0x546a */ 0x3c76,
+ /* key: 0x546b */ 0xb47a,
+ /* key: 0x546c */ 0xffff,
+ /* key: 0x546d */ 0xb47b,
+ /* key: 0x546e */ 0xb47c,
+ /* key: 0x546f */ 0xffff,
+ /* key: 0x5470 */ 0x526f,
+ /* key: 0x5471 */ 0x526d,
+ /* key: 0x5472 */ 0xffff,
+ /* key: 0x5473 */ 0x4c23,
+ /* key: 0x5474 */ 0xb47d,
+ /* key: 0x5475 */ 0x526a,
+ /* key: 0x5476 */ 0x5273,
+ /* key: 0x5477 */ 0x526e,
+ /* key: 0x5478 */ 0xffff,
+ /* key: 0x5479 */ 0xffff,
+ /* key: 0x547a */ 0xffff,
+ /* key: 0x547b */ 0x5271,
+ /* key: 0x547c */ 0x3846,
+ /* key: 0x547d */ 0x4c3f,
+ /* key: 0x547e */ 0xffff,
+ /* key: 0x547f */ 0xb47e,
+ /* key: 0x5480 */ 0x5272,
+ /* key: 0x5481 */ 0xb521,
+ /* key: 0x5482 */ 0xffff,
+ /* key: 0x5483 */ 0xb522,
+ /* key: 0x5484 */ 0x5274,
+ /* key: 0x5485 */ 0xb523,
+ /* key: 0x5486 */ 0x5276,
+ /* key: 0x5487 */ 0xffff,
+ /* key: 0x5488 */ 0xb524,
+ /* key: 0x5489 */ 0xb525,
+ /* key: 0x548a */ 0xffff,
+ /* key: 0x548b */ 0x3a70,
+ /* key: 0x548c */ 0x4f42,
+ /* key: 0x548d */ 0xb526,
+ /* key: 0x548e */ 0x526b,
+ /* key: 0x548f */ 0x5269,
+ /* key: 0x5490 */ 0x5275,
+ /* key: 0x5491 */ 0xb527,
+ /* key: 0x5492 */ 0x5270,
+ /* key: 0x5493 */ 0xffff,
+ /* key: 0x5494 */ 0xffff,
+ /* key: 0x5495 */ 0xb528,
+ /* key: 0x5496 */ 0xb529,
+ /* key: 0x5497 */ 0xffff,
+ /* key: 0x5498 */ 0xffff,
+ /* key: 0x5499 */ 0xffff,
+ /* key: 0x549a */ 0xffff,
+ /* key: 0x549b */ 0xffff,
+ /* key: 0x549c */ 0xb52a,
+ /* key: 0x549d */ 0xffff,
+ /* key: 0x549e */ 0xffff,
+ /* key: 0x549f */ 0xb52b,
+ /* key: 0x54a0 */ 0xffff,
+ /* key: 0x54a1 */ 0xb52c,
+ /* key: 0x54a2 */ 0x5278,
+ /* key: 0x54a3 */ 0xffff,
+ /* key: 0x54a4 */ 0x5323,
+ /* key: 0x54a5 */ 0x527a,
+ /* key: 0x54a6 */ 0xb52d,
+ /* key: 0x54a7 */ 0xb52e,
+ /* key: 0x54a8 */ 0x527e,
+ /* key: 0x54a9 */ 0xb52f,
+ /* key: 0x54aa */ 0xb530,
+ /* key: 0x54ab */ 0x5321,
+ /* key: 0x54ac */ 0x527b,
+ /* key: 0x54ad */ 0xb531,
+ /* key: 0x54ae */ 0xb532,
+ /* key: 0x54af */ 0x533e,
+ /* key: 0x54b0 */ 0xffff,
+ /* key: 0x54b1 */ 0xb533,
+ /* key: 0x54b2 */ 0x3a69,
+ /* key: 0x54b3 */ 0x3331,
+ /* key: 0x54b4 */ 0xffff,
+ /* key: 0x54b5 */ 0xffff,
+ /* key: 0x54b6 */ 0xffff,
+ /* key: 0x54b7 */ 0xb534,
+ /* key: 0x54b8 */ 0x5279,
+ /* key: 0x54b9 */ 0xb535,
+ /* key: 0x54ba */ 0xb536,
+ /* key: 0x54bb */ 0xb537,
+ /* key: 0x54bc */ 0x5325,
+ /* key: 0x54bd */ 0x3076,
+ /* key: 0x54be */ 0x5324,
+ /* key: 0x54bf */ 0xb538,
+ /* key: 0x54c0 */ 0x3025,
+ /* key: 0x54c1 */ 0x494a,
+ /* key: 0x54c2 */ 0x5322,
+ /* key: 0x54c3 */ 0xffff,
+ /* key: 0x54c4 */ 0x527c,
+ /* key: 0x54c5 */ 0xffff,
+ /* key: 0x54c6 */ 0xb539,
+ /* key: 0x54c7 */ 0x5277,
+ /* key: 0x54c8 */ 0x527d,
+ /* key: 0x54c9 */ 0x3a48,
+ /* key: 0x54ca */ 0xb53a,
+ /* key: 0x54cb */ 0xffff,
+ /* key: 0x54cc */ 0xffff,
+ /* key: 0x54cd */ 0xb53b,
+ /* key: 0x54ce */ 0xb53c,
+ /* key: 0x54cf */ 0xffff,
+ /* key: 0x54d0 */ 0xffff,
+ /* key: 0x54d1 */ 0xffff,
+ /* key: 0x54d2 */ 0xffff,
+ /* key: 0x54d3 */ 0xffff,
+ /* key: 0x54d4 */ 0xffff,
+ /* key: 0x54d5 */ 0xffff,
+ /* key: 0x54d6 */ 0xffff,
+ /* key: 0x54d7 */ 0xffff,
+ /* key: 0x54d8 */ 0x5326,
+ /* key: 0x54d9 */ 0xffff,
+ /* key: 0x54da */ 0xffff,
+ /* key: 0x54db */ 0xffff,
+ /* key: 0x54dc */ 0xffff,
+ /* key: 0x54dd */ 0xffff,
+ /* key: 0x54de */ 0xffff,
+ /* key: 0x54df */ 0xffff,
+ /* key: 0x54e0 */ 0xb53d,
+ /* key: 0x54e1 */ 0x3077,
+ /* key: 0x54e2 */ 0x532f,
+ /* key: 0x54e3 */ 0xffff,
+ /* key: 0x54e4 */ 0xffff,
+ /* key: 0x54e5 */ 0x5327,
+ /* key: 0x54e6 */ 0x5328,
+ /* key: 0x54e7 */ 0xffff,
+ /* key: 0x54e8 */ 0x3e25,
+ /* key: 0x54e9 */ 0x4b69,
+ /* key: 0x54ea */ 0xb53e,
+ /* key: 0x54eb */ 0xffff,
+ /* key: 0x54ec */ 0xb53f,
+ /* key: 0x54ed */ 0x532d,
+ /* key: 0x54ee */ 0x532c,
+ /* key: 0x54ef */ 0xb540,
+ /* key: 0x54f0 */ 0xffff,
+ /* key: 0x54f1 */ 0xffff,
+ /* key: 0x54f2 */ 0x452f,
+ /* key: 0x54f3 */ 0xffff,
+ /* key: 0x54f4 */ 0xffff,
+ /* key: 0x54f5 */ 0xffff,
+ /* key: 0x54f6 */ 0xb541,
+ /* key: 0x54f7 */ 0xffff,
+ /* key: 0x54f8 */ 0xffff,
+ /* key: 0x54f9 */ 0xffff,
+ /* key: 0x54fa */ 0x532e,
+ /* key: 0x54fb */ 0xffff,
+ /* key: 0x54fc */ 0xb542,
+ /* key: 0x54fd */ 0x532b,
+ /* key: 0x54fe */ 0xb543,
+ /* key: 0x54ff */ 0xb544,
+ /* branch: 0x550X */ 3504,
+ /* branch: 0x551X */ 3520,
+ /* branch: 0x552X */ 3536,
+ /* branch: 0x553X */ 3552,
+ /* branch: 0x554X */ 3568,
+ /* branch: 0x555X */ 3584,
+ /* branch: 0x556X */ 3600,
+ /* branch: 0x557X */ 3616,
+ /* branch: 0x558X */ 3632,
+ /* branch: 0x559X */ 3648,
+ /* branch: 0x55aX */ 3664,
+ /* branch: 0x55bX */ 3680,
+ /* branch: 0x55cX */ 3696,
+ /* branch: 0x55dX */ 3712,
+ /* branch: 0x55eX */ 3728,
+ /* branch: 0x55fX */ 3744,
+ /* key: 0x5500 */ 0xb545,
+ /* key: 0x5501 */ 0xb546,
+ /* key: 0x5502 */ 0xffff,
+ /* key: 0x5503 */ 0xffff,
+ /* key: 0x5504 */ 0x3134,
+ /* key: 0x5505 */ 0xb547,
+ /* key: 0x5506 */ 0x3a36,
+ /* key: 0x5507 */ 0x3f30,
+ /* key: 0x5508 */ 0xb548,
+ /* key: 0x5509 */ 0xb549,
+ /* key: 0x550a */ 0xffff,
+ /* key: 0x550b */ 0xffff,
+ /* key: 0x550c */ 0xb54a,
+ /* key: 0x550d */ 0xb54b,
+ /* key: 0x550e */ 0xb54c,
+ /* key: 0x550f */ 0x5329,
+ /* key: 0x5510 */ 0x4562,
+ /* key: 0x5511 */ 0xffff,
+ /* key: 0x5512 */ 0xffff,
+ /* key: 0x5513 */ 0xffff,
+ /* key: 0x5514 */ 0x532a,
+ /* key: 0x5515 */ 0xb54d,
+ /* key: 0x5516 */ 0x3022,
+ /* key: 0x5517 */ 0xffff,
+ /* key: 0x5518 */ 0xffff,
+ /* key: 0x5519 */ 0xffff,
+ /* key: 0x551a */ 0xffff,
+ /* key: 0x551b */ 0xffff,
+ /* key: 0x551c */ 0xffff,
+ /* key: 0x551d */ 0xffff,
+ /* key: 0x551e */ 0xffff,
+ /* key: 0x551f */ 0xffff,
+ /* key: 0x5520 */ 0xffff,
+ /* key: 0x5521 */ 0xffff,
+ /* key: 0x5522 */ 0xffff,
+ /* key: 0x5523 */ 0xffff,
+ /* key: 0x5524 */ 0xffff,
+ /* key: 0x5525 */ 0xffff,
+ /* key: 0x5526 */ 0xffff,
+ /* key: 0x5527 */ 0xffff,
+ /* key: 0x5528 */ 0xffff,
+ /* key: 0x5529 */ 0xffff,
+ /* key: 0x552a */ 0xb54e,
+ /* key: 0x552b */ 0xb54f,
+ /* key: 0x552c */ 0xffff,
+ /* key: 0x552d */ 0xffff,
+ /* key: 0x552e */ 0x5334,
+ /* key: 0x552f */ 0x4d23,
+ /* key: 0x5530 */ 0xffff,
+ /* key: 0x5531 */ 0x3e27,
+ /* key: 0x5532 */ 0xb550,
+ /* key: 0x5533 */ 0x533a,
+ /* key: 0x5534 */ 0xffff,
+ /* key: 0x5535 */ 0xb551,
+ /* key: 0x5536 */ 0xb552,
+ /* key: 0x5537 */ 0xffff,
+ /* key: 0x5538 */ 0x5339,
+ /* key: 0x5539 */ 0x5330,
+ /* key: 0x553a */ 0xffff,
+ /* key: 0x553b */ 0xb553,
+ /* key: 0x553c */ 0xb554,
+ /* key: 0x553d */ 0xb555,
+ /* key: 0x553e */ 0x4243,
+ /* key: 0x553f */ 0xffff,
+ /* key: 0x5540 */ 0x5331,
+ /* key: 0x5541 */ 0xb556,
+ /* key: 0x5542 */ 0xffff,
+ /* key: 0x5543 */ 0xffff,
+ /* key: 0x5544 */ 0x426f,
+ /* key: 0x5545 */ 0x5336,
+ /* key: 0x5546 */ 0x3e26,
+ /* key: 0x5547 */ 0xb557,
+ /* key: 0x5548 */ 0xffff,
+ /* key: 0x5549 */ 0xb558,
+ /* key: 0x554a */ 0xb559,
+ /* key: 0x554b */ 0xffff,
+ /* key: 0x554c */ 0x5333,
+ /* key: 0x554d */ 0xb55a,
+ /* key: 0x554e */ 0xffff,
+ /* key: 0x554f */ 0x4c64,
+ /* key: 0x5550 */ 0xb55b,
+ /* key: 0x5551 */ 0xb55c,
+ /* key: 0x5552 */ 0xffff,
+ /* key: 0x5553 */ 0x373c,
+ /* key: 0x5554 */ 0xffff,
+ /* key: 0x5555 */ 0xffff,
+ /* key: 0x5556 */ 0x5337,
+ /* key: 0x5557 */ 0x5338,
+ /* key: 0x5558 */ 0xb55d,
+ /* key: 0x5559 */ 0xffff,
+ /* key: 0x555a */ 0xb55e,
+ /* key: 0x555b */ 0xb55f,
+ /* key: 0x555c */ 0x5335,
+ /* key: 0x555d */ 0x533b,
+ /* key: 0x555e */ 0xb560,
+ /* key: 0x555f */ 0xffff,
+ /* key: 0x5560 */ 0xb561,
+ /* key: 0x5561 */ 0xb562,
+ /* key: 0x5562 */ 0xffff,
+ /* key: 0x5563 */ 0x5332,
+ /* key: 0x5564 */ 0xb563,
+ /* key: 0x5565 */ 0xffff,
+ /* key: 0x5566 */ 0xb564,
+ /* key: 0x5567 */ 0xffff,
+ /* key: 0x5568 */ 0xffff,
+ /* key: 0x5569 */ 0xffff,
+ /* key: 0x556a */ 0xffff,
+ /* key: 0x556b */ 0xffff,
+ /* key: 0x556c */ 0xffff,
+ /* key: 0x556d */ 0xffff,
+ /* key: 0x556e */ 0xffff,
+ /* key: 0x556f */ 0xffff,
+ /* key: 0x5570 */ 0xffff,
+ /* key: 0x5571 */ 0xffff,
+ /* key: 0x5572 */ 0xffff,
+ /* key: 0x5573 */ 0xffff,
+ /* key: 0x5574 */ 0xffff,
+ /* key: 0x5575 */ 0xffff,
+ /* key: 0x5576 */ 0xffff,
+ /* key: 0x5577 */ 0xffff,
+ /* key: 0x5578 */ 0xffff,
+ /* key: 0x5579 */ 0xffff,
+ /* key: 0x557a */ 0xffff,
+ /* key: 0x557b */ 0x5341,
+ /* key: 0x557c */ 0x5346,
+ /* key: 0x557d */ 0xffff,
+ /* key: 0x557e */ 0x5342,
+ /* key: 0x557f */ 0xb565,
+ /* key: 0x5580 */ 0x533d,
+ /* key: 0x5581 */ 0xb566,
+ /* key: 0x5582 */ 0xb567,
+ /* key: 0x5583 */ 0x5347,
+ /* key: 0x5584 */ 0x4131,
+ /* key: 0x5585 */ 0xffff,
+ /* key: 0x5586 */ 0xb568,
+ /* key: 0x5587 */ 0x5349,
+ /* key: 0x5588 */ 0xb569,
+ /* key: 0x5589 */ 0x3922,
+ /* key: 0x558a */ 0x533f,
+ /* key: 0x558b */ 0x437d,
+ /* key: 0x558c */ 0xffff,
+ /* key: 0x558d */ 0xffff,
+ /* key: 0x558e */ 0xb56a,
+ /* key: 0x558f */ 0xb56b,
+ /* key: 0x5590 */ 0xffff,
+ /* key: 0x5591 */ 0xb56c,
+ /* key: 0x5592 */ 0xb56d,
+ /* key: 0x5593 */ 0xb56e,
+ /* key: 0x5594 */ 0xb56f,
+ /* key: 0x5595 */ 0xffff,
+ /* key: 0x5596 */ 0xffff,
+ /* key: 0x5597 */ 0xb570,
+ /* key: 0x5598 */ 0x5343,
+ /* key: 0x5599 */ 0x533c,
+ /* key: 0x559a */ 0x342d,
+ /* key: 0x559b */ 0xffff,
+ /* key: 0x559c */ 0x346e,
+ /* key: 0x559d */ 0x3365,
+ /* key: 0x559e */ 0x5344,
+ /* key: 0x559f */ 0x5340,
+ /* key: 0x55a0 */ 0xffff,
+ /* key: 0x55a1 */ 0xffff,
+ /* key: 0x55a2 */ 0xffff,
+ /* key: 0x55a3 */ 0xb571,
+ /* key: 0x55a4 */ 0xb572,
+ /* key: 0x55a5 */ 0xffff,
+ /* key: 0x55a6 */ 0xffff,
+ /* key: 0x55a7 */ 0x3776,
+ /* key: 0x55a8 */ 0x534a,
+ /* key: 0x55a9 */ 0x5348,
+ /* key: 0x55aa */ 0x4153,
+ /* key: 0x55ab */ 0x354a,
+ /* key: 0x55ac */ 0x362c,
+ /* key: 0x55ad */ 0xb573,
+ /* key: 0x55ae */ 0x5345,
+ /* key: 0x55af */ 0xffff,
+ /* key: 0x55b0 */ 0x3674,
+ /* key: 0x55b1 */ 0xffff,
+ /* key: 0x55b2 */ 0xb574,
+ /* key: 0x55b3 */ 0xffff,
+ /* key: 0x55b4 */ 0xffff,
+ /* key: 0x55b5 */ 0xffff,
+ /* key: 0x55b6 */ 0x3144,
+ /* key: 0x55b7 */ 0xffff,
+ /* key: 0x55b8 */ 0xffff,
+ /* key: 0x55b9 */ 0xffff,
+ /* key: 0x55ba */ 0xffff,
+ /* key: 0x55bb */ 0xffff,
+ /* key: 0x55bc */ 0xffff,
+ /* key: 0x55bd */ 0xffff,
+ /* key: 0x55be */ 0xffff,
+ /* key: 0x55bf */ 0xb575,
+ /* key: 0x55c0 */ 0xffff,
+ /* key: 0x55c1 */ 0xb576,
+ /* key: 0x55c2 */ 0xffff,
+ /* key: 0x55c3 */ 0xb577,
+ /* key: 0x55c4 */ 0x534e,
+ /* key: 0x55c5 */ 0x534c,
+ /* key: 0x55c6 */ 0xb578,
+ /* key: 0x55c7 */ 0x5427,
+ /* key: 0x55c8 */ 0xffff,
+ /* key: 0x55c9 */ 0xb579,
+ /* key: 0x55ca */ 0xffff,
+ /* key: 0x55cb */ 0xb57a,
+ /* key: 0x55cc */ 0xb57b,
+ /* key: 0x55cd */ 0xffff,
+ /* key: 0x55ce */ 0xb57c,
+ /* key: 0x55cf */ 0xffff,
+ /* key: 0x55d0 */ 0xffff,
+ /* key: 0x55d1 */ 0xb57d,
+ /* key: 0x55d2 */ 0xb57e,
+ /* key: 0x55d3 */ 0xb621,
+ /* key: 0x55d4 */ 0x5351,
+ /* key: 0x55d5 */ 0xffff,
+ /* key: 0x55d6 */ 0xffff,
+ /* key: 0x55d7 */ 0xb622,
+ /* key: 0x55d8 */ 0xb623,
+ /* key: 0x55d9 */ 0xffff,
+ /* key: 0x55da */ 0x534b,
+ /* key: 0x55db */ 0xb624,
+ /* key: 0x55dc */ 0x534f,
+ /* key: 0x55dd */ 0xffff,
+ /* key: 0x55de */ 0xb625,
+ /* key: 0x55df */ 0x534d,
+ /* key: 0x55e0 */ 0xffff,
+ /* key: 0x55e1 */ 0xffff,
+ /* key: 0x55e2 */ 0xb626,
+ /* key: 0x55e3 */ 0x3b4c,
+ /* key: 0x55e4 */ 0x5350,
+ /* key: 0x55e5 */ 0xffff,
+ /* key: 0x55e6 */ 0xffff,
+ /* key: 0x55e7 */ 0xffff,
+ /* key: 0x55e8 */ 0xffff,
+ /* key: 0x55e9 */ 0xb627,
+ /* key: 0x55ea */ 0xffff,
+ /* key: 0x55eb */ 0xffff,
+ /* key: 0x55ec */ 0xffff,
+ /* key: 0x55ed */ 0xffff,
+ /* key: 0x55ee */ 0xffff,
+ /* key: 0x55ef */ 0xffff,
+ /* key: 0x55f0 */ 0xffff,
+ /* key: 0x55f1 */ 0xffff,
+ /* key: 0x55f2 */ 0xffff,
+ /* key: 0x55f3 */ 0xffff,
+ /* key: 0x55f4 */ 0xffff,
+ /* key: 0x55f5 */ 0xffff,
+ /* key: 0x55f6 */ 0xb628,
+ /* key: 0x55f7 */ 0x5353,
+ /* key: 0x55f8 */ 0xffff,
+ /* key: 0x55f9 */ 0x5358,
+ /* key: 0x55fa */ 0xffff,
+ /* key: 0x55fb */ 0xffff,
+ /* key: 0x55fc */ 0xffff,
+ /* key: 0x55fd */ 0x5356,
+ /* key: 0x55fe */ 0x5355,
+ /* key: 0x55ff */ 0xb629,
+ /* branch: 0x560X */ 3776,
+ /* branch: 0x561X */ 3792,
+ /* branch: 0x562X */ 3808,
+ /* branch: 0x563X */ 3824,
+ /* branch: 0x564X */ 3840,
+ /* branch: 0x565X */ 3856,
+ /* branch: 0x566X */ 3872,
+ /* branch: 0x567X */ 3888,
+ /* branch: 0x568X */ 3904,
+ /* branch: 0x569X */ 3920,
+ /* branch: 0x56aX */ 3936,
+ /* branch: 0x56bX */ 3952,
+ /* branch: 0x56cX */ 3968,
+ /* branch: 0x56dX */ 3984,
+ /* branch: 0x56eX */ 4000,
+ /* branch: 0x56fX */ 4016,
+ /* key: 0x5600 */ 0xffff,
+ /* key: 0x5601 */ 0xffff,
+ /* key: 0x5602 */ 0xffff,
+ /* key: 0x5603 */ 0xffff,
+ /* key: 0x5604 */ 0xffff,
+ /* key: 0x5605 */ 0xb62a,
+ /* key: 0x5606 */ 0x4332,
+ /* key: 0x5607 */ 0xffff,
+ /* key: 0x5608 */ 0xb62b,
+ /* key: 0x5609 */ 0x3245,
+ /* key: 0x560a */ 0xb62c,
+ /* key: 0x560b */ 0xffff,
+ /* key: 0x560c */ 0xffff,
+ /* key: 0x560d */ 0xb62d,
+ /* key: 0x560e */ 0xb62e,
+ /* key: 0x560f */ 0xb62f,
+ /* key: 0x5610 */ 0xb630,
+ /* key: 0x5611 */ 0xb631,
+ /* key: 0x5612 */ 0xb632,
+ /* key: 0x5613 */ 0xffff,
+ /* key: 0x5614 */ 0x5352,
+ /* key: 0x5615 */ 0xffff,
+ /* key: 0x5616 */ 0x5354,
+ /* key: 0x5617 */ 0x3e28,
+ /* key: 0x5618 */ 0x3133,
+ /* key: 0x5619 */ 0xb633,
+ /* key: 0x561a */ 0xffff,
+ /* key: 0x561b */ 0x5357,
+ /* key: 0x561c */ 0xffff,
+ /* key: 0x561d */ 0xffff,
+ /* key: 0x561e */ 0xffff,
+ /* key: 0x561f */ 0xffff,
+ /* key: 0x5620 */ 0xffff,
+ /* key: 0x5621 */ 0xffff,
+ /* key: 0x5622 */ 0xffff,
+ /* key: 0x5623 */ 0xffff,
+ /* key: 0x5624 */ 0xffff,
+ /* key: 0x5625 */ 0xffff,
+ /* key: 0x5626 */ 0xffff,
+ /* key: 0x5627 */ 0xffff,
+ /* key: 0x5628 */ 0xffff,
+ /* key: 0x5629 */ 0x325e,
+ /* key: 0x562a */ 0xffff,
+ /* key: 0x562b */ 0xffff,
+ /* key: 0x562c */ 0xb634,
+ /* key: 0x562d */ 0xffff,
+ /* key: 0x562e */ 0xffff,
+ /* key: 0x562f */ 0x5362,
+ /* key: 0x5630 */ 0xb635,
+ /* key: 0x5631 */ 0x3e7c,
+ /* key: 0x5632 */ 0x535e,
+ /* key: 0x5633 */ 0xb636,
+ /* key: 0x5634 */ 0x535c,
+ /* key: 0x5635 */ 0xb637,
+ /* key: 0x5636 */ 0x535d,
+ /* key: 0x5637 */ 0xb638,
+ /* key: 0x5638 */ 0x535f,
+ /* key: 0x5639 */ 0xb639,
+ /* key: 0x563a */ 0xffff,
+ /* key: 0x563b */ 0xb63a,
+ /* key: 0x563c */ 0xb63b,
+ /* key: 0x563d */ 0xb63c,
+ /* key: 0x563e */ 0xffff,
+ /* key: 0x563f */ 0xb63d,
+ /* key: 0x5640 */ 0xb63e,
+ /* key: 0x5641 */ 0xb63f,
+ /* key: 0x5642 */ 0x313d,
+ /* key: 0x5643 */ 0xb640,
+ /* key: 0x5644 */ 0xb641,
+ /* key: 0x5645 */ 0xffff,
+ /* key: 0x5646 */ 0xb642,
+ /* key: 0x5647 */ 0xffff,
+ /* key: 0x5648 */ 0xffff,
+ /* key: 0x5649 */ 0xb643,
+ /* key: 0x564a */ 0xffff,
+ /* key: 0x564b */ 0xb644,
+ /* key: 0x564c */ 0x4139,
+ /* key: 0x564d */ 0xb645,
+ /* key: 0x564e */ 0x5359,
+ /* key: 0x564f */ 0xb646,
+ /* key: 0x5650 */ 0x535a,
+ /* key: 0x5651 */ 0xffff,
+ /* key: 0x5652 */ 0xffff,
+ /* key: 0x5653 */ 0xffff,
+ /* key: 0x5654 */ 0xb647,
+ /* key: 0x5655 */ 0xffff,
+ /* key: 0x5656 */ 0xffff,
+ /* key: 0x5657 */ 0xffff,
+ /* key: 0x5658 */ 0xffff,
+ /* key: 0x5659 */ 0xffff,
+ /* key: 0x565a */ 0xffff,
+ /* key: 0x565b */ 0x337a,
+ /* key: 0x565c */ 0xffff,
+ /* key: 0x565d */ 0xffff,
+ /* key: 0x565e */ 0xb648,
+ /* key: 0x565f */ 0xffff,
+ /* key: 0x5660 */ 0xb649,
+ /* key: 0x5661 */ 0xb64a,
+ /* key: 0x5662 */ 0xb64b,
+ /* key: 0x5663 */ 0xb64c,
+ /* key: 0x5664 */ 0x5361,
+ /* key: 0x5665 */ 0xffff,
+ /* key: 0x5666 */ 0xb64d,
+ /* key: 0x5667 */ 0xffff,
+ /* key: 0x5668 */ 0x346f,
+ /* key: 0x5669 */ 0xb64e,
+ /* key: 0x566a */ 0x5364,
+ /* key: 0x566b */ 0x5360,
+ /* key: 0x566c */ 0x5363,
+ /* key: 0x566d */ 0xb64f,
+ /* key: 0x566e */ 0xffff,
+ /* key: 0x566f */ 0xb650,
+ /* key: 0x5670 */ 0xffff,
+ /* key: 0x5671 */ 0xb651,
+ /* key: 0x5672 */ 0xb652,
+ /* key: 0x5673 */ 0xffff,
+ /* key: 0x5674 */ 0x4a2e,
+ /* key: 0x5675 */ 0xb653,
+ /* key: 0x5676 */ 0xffff,
+ /* key: 0x5677 */ 0xffff,
+ /* key: 0x5678 */ 0x4655,
+ /* key: 0x5679 */ 0xffff,
+ /* key: 0x567a */ 0x4838,
+ /* key: 0x567b */ 0xffff,
+ /* key: 0x567c */ 0xffff,
+ /* key: 0x567d */ 0xffff,
+ /* key: 0x567e */ 0xffff,
+ /* key: 0x567f */ 0xffff,
+ /* key: 0x5680 */ 0x5366,
+ /* key: 0x5681 */ 0xffff,
+ /* key: 0x5682 */ 0xffff,
+ /* key: 0x5683 */ 0xffff,
+ /* key: 0x5684 */ 0xb654,
+ /* key: 0x5685 */ 0xb655,
+ /* key: 0x5686 */ 0x5365,
+ /* key: 0x5687 */ 0x3345,
+ /* key: 0x5688 */ 0xb656,
+ /* key: 0x5689 */ 0xffff,
+ /* key: 0x568a */ 0x5367,
+ /* key: 0x568b */ 0xb657,
+ /* key: 0x568c */ 0xb658,
+ /* key: 0x568d */ 0xffff,
+ /* key: 0x568e */ 0xffff,
+ /* key: 0x568f */ 0x536a,
+ /* key: 0x5690 */ 0xffff,
+ /* key: 0x5691 */ 0xffff,
+ /* key: 0x5692 */ 0xffff,
+ /* key: 0x5693 */ 0xffff,
+ /* key: 0x5694 */ 0x5369,
+ /* key: 0x5695 */ 0xb659,
+ /* key: 0x5696 */ 0xffff,
+ /* key: 0x5697 */ 0xffff,
+ /* key: 0x5698 */ 0xffff,
+ /* key: 0x5699 */ 0xb65a,
+ /* key: 0x569a */ 0xb65b,
+ /* key: 0x569b */ 0xffff,
+ /* key: 0x569c */ 0xffff,
+ /* key: 0x569d */ 0xb65c,
+ /* key: 0x569e */ 0xb65d,
+ /* key: 0x569f */ 0xb65e,
+ /* key: 0x56a0 */ 0x5368,
+ /* key: 0x56a1 */ 0xffff,
+ /* key: 0x56a2 */ 0x4739,
+ /* key: 0x56a3 */ 0xffff,
+ /* key: 0x56a4 */ 0xffff,
+ /* key: 0x56a5 */ 0x536b,
+ /* key: 0x56a6 */ 0xb65f,
+ /* key: 0x56a7 */ 0xb660,
+ /* key: 0x56a8 */ 0xb661,
+ /* key: 0x56a9 */ 0xb662,
+ /* key: 0x56aa */ 0xffff,
+ /* key: 0x56ab */ 0xb663,
+ /* key: 0x56ac */ 0xb664,
+ /* key: 0x56ad */ 0xb665,
+ /* key: 0x56ae */ 0x536c,
+ /* key: 0x56af */ 0xffff,
+ /* key: 0x56b0 */ 0xffff,
+ /* key: 0x56b1 */ 0xb666,
+ /* key: 0x56b2 */ 0xffff,
+ /* key: 0x56b3 */ 0xb667,
+ /* key: 0x56b4 */ 0x536e,
+ /* key: 0x56b5 */ 0xffff,
+ /* key: 0x56b6 */ 0x536d,
+ /* key: 0x56b7 */ 0xb668,
+ /* key: 0x56b8 */ 0xffff,
+ /* key: 0x56b9 */ 0xffff,
+ /* key: 0x56ba */ 0xffff,
+ /* key: 0x56bb */ 0xffff,
+ /* key: 0x56bc */ 0x5370,
+ /* key: 0x56bd */ 0xffff,
+ /* key: 0x56be */ 0xb669,
+ /* key: 0x56bf */ 0xffff,
+ /* key: 0x56c0 */ 0x5373,
+ /* key: 0x56c1 */ 0x5371,
+ /* key: 0x56c2 */ 0x536f,
+ /* key: 0x56c3 */ 0x5372,
+ /* key: 0x56c4 */ 0xffff,
+ /* key: 0x56c5 */ 0xb66a,
+ /* key: 0x56c6 */ 0xffff,
+ /* key: 0x56c7 */ 0xffff,
+ /* key: 0x56c8 */ 0x5374,
+ /* key: 0x56c9 */ 0xb66b,
+ /* key: 0x56ca */ 0xb66c,
+ /* key: 0x56cb */ 0xb66d,
+ /* key: 0x56cc */ 0xb670,
+ /* key: 0x56cd */ 0xb671,
+ /* key: 0x56ce */ 0x5375,
+ /* key: 0x56cf */ 0xb66e,
+ /* key: 0x56d0 */ 0xb66f,
+ /* key: 0x56d1 */ 0x5376,
+ /* key: 0x56d2 */ 0xffff,
+ /* key: 0x56d3 */ 0x5377,
+ /* key: 0x56d4 */ 0xffff,
+ /* key: 0x56d5 */ 0xffff,
+ /* key: 0x56d6 */ 0xffff,
+ /* key: 0x56d7 */ 0x5378,
+ /* key: 0x56d8 */ 0x5145,
+ /* key: 0x56d9 */ 0xb672,
+ /* key: 0x56da */ 0x3c7c,
+ /* key: 0x56db */ 0x3b4d,
+ /* key: 0x56dc */ 0xb673,
+ /* key: 0x56dd */ 0xb674,
+ /* key: 0x56de */ 0x3273,
+ /* key: 0x56df */ 0xb675,
+ /* key: 0x56e0 */ 0x3078,
+ /* key: 0x56e1 */ 0xb676,
+ /* key: 0x56e2 */ 0xffff,
+ /* key: 0x56e3 */ 0x4344,
+ /* key: 0x56e4 */ 0xb677,
+ /* key: 0x56e5 */ 0xb678,
+ /* key: 0x56e6 */ 0xb679,
+ /* key: 0x56e7 */ 0xb67a,
+ /* key: 0x56e8 */ 0xb67b,
+ /* key: 0x56e9 */ 0xffff,
+ /* key: 0x56ea */ 0xffff,
+ /* key: 0x56eb */ 0xb67d,
+ /* key: 0x56ec */ 0xffff,
+ /* key: 0x56ed */ 0xb67e,
+ /* key: 0x56ee */ 0x5379,
+ /* key: 0x56ef */ 0xffff,
+ /* key: 0x56f0 */ 0x3a24,
+ /* key: 0x56f1 */ 0xb67c,
+ /* key: 0x56f2 */ 0x304f,
+ /* key: 0x56f3 */ 0x3f5e,
+ /* key: 0x56f4 */ 0xffff,
+ /* key: 0x56f5 */ 0xffff,
+ /* key: 0x56f6 */ 0xb721,
+ /* key: 0x56f7 */ 0xb722,
+ /* key: 0x56f8 */ 0xffff,
+ /* key: 0x56f9 */ 0x537a,
+ /* key: 0x56fa */ 0x3847,
+ /* key: 0x56fb */ 0xffff,
+ /* key: 0x56fc */ 0xffff,
+ /* key: 0x56fd */ 0x3971,
+ /* key: 0x56fe */ 0xffff,
+ /* key: 0x56ff */ 0x537c,
+ /* branch: 0x570X */ 4048,
+ /* branch: 0x571X */ 4064,
+ /* branch: 0x572X */ 4080,
+ /* branch: 0x573X */ 4096,
+ /* branch: 0x574X */ 4112,
+ /* branch: 0x575X */ 4128,
+ /* branch: 0x576X */ 4144,
+ /* branch: 0x577X */ 4160,
+ /* branch: 0x578X */ 4176,
+ /* branch: 0x579X */ 4192,
+ /* branch: 0x57aX */ 4208,
+ /* branch: 0x57bX */ 4224,
+ /* branch: 0x57cX */ 4240,
+ /* branch: 0x57dX */ 4256,
+ /* branch: 0x57eX */ 4272,
+ /* branch: 0x57fX */ 4288,
+ /* key: 0x5700 */ 0x537b,
+ /* key: 0x5701 */ 0xb723,
+ /* key: 0x5702 */ 0xb724,
+ /* key: 0x5703 */ 0x4a60,
+ /* key: 0x5704 */ 0x537d,
+ /* key: 0x5705 */ 0xffff,
+ /* key: 0x5706 */ 0xffff,
+ /* key: 0x5707 */ 0xb725,
+ /* key: 0x5708 */ 0x5421,
+ /* key: 0x5709 */ 0x537e,
+ /* key: 0x570a */ 0xb726,
+ /* key: 0x570b */ 0x5422,
+ /* key: 0x570c */ 0xb727,
+ /* key: 0x570d */ 0x5423,
+ /* key: 0x570e */ 0xffff,
+ /* key: 0x570f */ 0x3777,
+ /* key: 0x5710 */ 0xffff,
+ /* key: 0x5711 */ 0xb728,
+ /* key: 0x5712 */ 0x3160,
+ /* key: 0x5713 */ 0x5424,
+ /* key: 0x5714 */ 0xffff,
+ /* key: 0x5715 */ 0xb729,
+ /* key: 0x5716 */ 0x5426,
+ /* key: 0x5717 */ 0xffff,
+ /* key: 0x5718 */ 0x5425,
+ /* key: 0x5719 */ 0xffff,
+ /* key: 0x571a */ 0xb72a,
+ /* key: 0x571b */ 0xb72b,
+ /* key: 0x571c */ 0x5428,
+ /* key: 0x571d */ 0xb72c,
+ /* key: 0x571e */ 0xffff,
+ /* key: 0x571f */ 0x455a,
+ /* key: 0x5720 */ 0xb72d,
+ /* key: 0x5721 */ 0xffff,
+ /* key: 0x5722 */ 0xb72e,
+ /* key: 0x5723 */ 0xb72f,
+ /* key: 0x5724 */ 0xb730,
+ /* key: 0x5725 */ 0xb731,
+ /* key: 0x5726 */ 0x5429,
+ /* key: 0x5727 */ 0x3035,
+ /* key: 0x5728 */ 0x3a5f,
+ /* key: 0x5729 */ 0xb732,
+ /* key: 0x572a */ 0xb733,
+ /* key: 0x572b */ 0xffff,
+ /* key: 0x572c */ 0xb734,
+ /* key: 0x572d */ 0x373d,
+ /* key: 0x572e */ 0xb735,
+ /* key: 0x572f */ 0xb736,
+ /* key: 0x5730 */ 0x434f,
+ /* key: 0x5731 */ 0xffff,
+ /* key: 0x5732 */ 0xffff,
+ /* key: 0x5733 */ 0xb737,
+ /* key: 0x5734 */ 0xb738,
+ /* key: 0x5735 */ 0xffff,
+ /* key: 0x5736 */ 0xffff,
+ /* key: 0x5737 */ 0x542a,
+ /* key: 0x5738 */ 0x542b,
+ /* key: 0x5739 */ 0xffff,
+ /* key: 0x573a */ 0xffff,
+ /* key: 0x573b */ 0x542d,
+ /* key: 0x573c */ 0xffff,
+ /* key: 0x573d */ 0xb739,
+ /* key: 0x573e */ 0xb73a,
+ /* key: 0x573f */ 0xb73b,
+ /* key: 0x5740 */ 0x542e,
+ /* key: 0x5741 */ 0xffff,
+ /* key: 0x5742 */ 0x3a64,
+ /* key: 0x5743 */ 0xffff,
+ /* key: 0x5744 */ 0xffff,
+ /* key: 0x5745 */ 0xb73c,
+ /* key: 0x5746 */ 0xb73d,
+ /* key: 0x5747 */ 0x3651,
+ /* key: 0x5748 */ 0xffff,
+ /* key: 0x5749 */ 0xffff,
+ /* key: 0x574a */ 0x4b37,
+ /* key: 0x574b */ 0xffff,
+ /* key: 0x574c */ 0xb73e,
+ /* key: 0x574d */ 0xb73f,
+ /* key: 0x574e */ 0x542c,
+ /* key: 0x574f */ 0x542f,
+ /* key: 0x5750 */ 0x3a41,
+ /* key: 0x5751 */ 0x3923,
+ /* key: 0x5752 */ 0xb740,
+ /* key: 0x5753 */ 0xffff,
+ /* key: 0x5754 */ 0xffff,
+ /* key: 0x5755 */ 0xffff,
+ /* key: 0x5756 */ 0xffff,
+ /* key: 0x5757 */ 0xffff,
+ /* key: 0x5758 */ 0xffff,
+ /* key: 0x5759 */ 0xffff,
+ /* key: 0x575a */ 0xffff,
+ /* key: 0x575b */ 0xffff,
+ /* key: 0x575c */ 0xffff,
+ /* key: 0x575d */ 0xffff,
+ /* key: 0x575e */ 0xffff,
+ /* key: 0x575f */ 0xffff,
+ /* key: 0x5760 */ 0xffff,
+ /* key: 0x5761 */ 0x5433,
+ /* key: 0x5762 */ 0xb741,
+ /* key: 0x5763 */ 0xffff,
+ /* key: 0x5764 */ 0x3a25,
+ /* key: 0x5765 */ 0xb742,
+ /* key: 0x5766 */ 0x4333,
+ /* key: 0x5767 */ 0xb743,
+ /* key: 0x5768 */ 0xb744,
+ /* key: 0x5769 */ 0x5430,
+ /* key: 0x576a */ 0x445a,
+ /* key: 0x576b */ 0xb745,
+ /* key: 0x576c */ 0xffff,
+ /* key: 0x576d */ 0xb746,
+ /* key: 0x576e */ 0xb747,
+ /* key: 0x576f */ 0xb748,
+ /* key: 0x5770 */ 0xb749,
+ /* key: 0x5771 */ 0xb74a,
+ /* key: 0x5772 */ 0xffff,
+ /* key: 0x5773 */ 0xb74b,
+ /* key: 0x5774 */ 0xb74c,
+ /* key: 0x5775 */ 0xb74d,
+ /* key: 0x5776 */ 0xffff,
+ /* key: 0x5777 */ 0xb74e,
+ /* key: 0x5778 */ 0xffff,
+ /* key: 0x5779 */ 0xb74f,
+ /* key: 0x577a */ 0xb750,
+ /* key: 0x577b */ 0xb751,
+ /* key: 0x577c */ 0xb752,
+ /* key: 0x577d */ 0xffff,
+ /* key: 0x577e */ 0xb753,
+ /* key: 0x577f */ 0x5434,
+ /* key: 0x5780 */ 0xffff,
+ /* key: 0x5781 */ 0xb754,
+ /* key: 0x5782 */ 0x3f62,
+ /* key: 0x5783 */ 0xb755,
+ /* key: 0x5784 */ 0xffff,
+ /* key: 0x5785 */ 0xffff,
+ /* key: 0x5786 */ 0xffff,
+ /* key: 0x5787 */ 0xffff,
+ /* key: 0x5788 */ 0x5432,
+ /* key: 0x5789 */ 0x5435,
+ /* key: 0x578a */ 0xffff,
+ /* key: 0x578b */ 0x373f,
+ /* key: 0x578c */ 0xb756,
+ /* key: 0x578d */ 0xffff,
+ /* key: 0x578e */ 0xffff,
+ /* key: 0x578f */ 0xffff,
+ /* key: 0x5790 */ 0xffff,
+ /* key: 0x5791 */ 0xffff,
+ /* key: 0x5792 */ 0xffff,
+ /* key: 0x5793 */ 0x5436,
+ /* key: 0x5794 */ 0xb757,
+ /* key: 0x5795 */ 0xb760,
+ /* key: 0x5796 */ 0xffff,
+ /* key: 0x5797 */ 0xb758,
+ /* key: 0x5798 */ 0xffff,
+ /* key: 0x5799 */ 0xb759,
+ /* key: 0x579a */ 0xb75a,
+ /* key: 0x579b */ 0xffff,
+ /* key: 0x579c */ 0xb75b,
+ /* key: 0x579d */ 0xb75c,
+ /* key: 0x579e */ 0xb75d,
+ /* key: 0x579f */ 0xb75e,
+ /* key: 0x57a0 */ 0x5437,
+ /* key: 0x57a1 */ 0xb75f,
+ /* key: 0x57a2 */ 0x3924,
+ /* key: 0x57a3 */ 0x3340,
+ /* key: 0x57a4 */ 0x5439,
+ /* key: 0x57a5 */ 0xffff,
+ /* key: 0x57a6 */ 0xffff,
+ /* key: 0x57a7 */ 0xb761,
+ /* key: 0x57a8 */ 0xb762,
+ /* key: 0x57a9 */ 0xb763,
+ /* key: 0x57aa */ 0x543a,
+ /* key: 0x57ab */ 0xffff,
+ /* key: 0x57ac */ 0xb764,
+ /* key: 0x57ad */ 0xffff,
+ /* key: 0x57ae */ 0xffff,
+ /* key: 0x57af */ 0xffff,
+ /* key: 0x57b0 */ 0x543b,
+ /* key: 0x57b1 */ 0xffff,
+ /* key: 0x57b2 */ 0xffff,
+ /* key: 0x57b3 */ 0x5438,
+ /* key: 0x57b4 */ 0xffff,
+ /* key: 0x57b5 */ 0xffff,
+ /* key: 0x57b6 */ 0xffff,
+ /* key: 0x57b7 */ 0xffff,
+ /* key: 0x57b8 */ 0xb765,
+ /* key: 0x57b9 */ 0xffff,
+ /* key: 0x57ba */ 0xffff,
+ /* key: 0x57bb */ 0xffff,
+ /* key: 0x57bc */ 0xffff,
+ /* key: 0x57bd */ 0xb766,
+ /* key: 0x57be */ 0xffff,
+ /* key: 0x57bf */ 0xffff,
+ /* key: 0x57c0 */ 0x5431,
+ /* key: 0x57c1 */ 0xffff,
+ /* key: 0x57c2 */ 0xffff,
+ /* key: 0x57c3 */ 0x543c,
+ /* key: 0x57c4 */ 0xffff,
+ /* key: 0x57c5 */ 0xffff,
+ /* key: 0x57c6 */ 0x543d,
+ /* key: 0x57c7 */ 0xb767,
+ /* key: 0x57c8 */ 0xb768,
+ /* key: 0x57c9 */ 0xffff,
+ /* key: 0x57ca */ 0xffff,
+ /* key: 0x57cb */ 0x4b64,
+ /* key: 0x57cc */ 0xb769,
+ /* key: 0x57cd */ 0xffff,
+ /* key: 0x57ce */ 0x3e6b,
+ /* key: 0x57cf */ 0xb76a,
+ /* key: 0x57d0 */ 0xffff,
+ /* key: 0x57d1 */ 0xffff,
+ /* key: 0x57d2 */ 0x543f,
+ /* key: 0x57d3 */ 0x5440,
+ /* key: 0x57d4 */ 0x543e,
+ /* key: 0x57d5 */ 0xb76b,
+ /* key: 0x57d6 */ 0x5442,
+ /* key: 0x57d7 */ 0xffff,
+ /* key: 0x57d8 */ 0xffff,
+ /* key: 0x57d9 */ 0xffff,
+ /* key: 0x57da */ 0xffff,
+ /* key: 0x57db */ 0xffff,
+ /* key: 0x57dc */ 0x4738,
+ /* key: 0x57dd */ 0xb76c,
+ /* key: 0x57de */ 0xb76d,
+ /* key: 0x57df */ 0x3068,
+ /* key: 0x57e0 */ 0x4956,
+ /* key: 0x57e1 */ 0xb77e,
+ /* key: 0x57e2 */ 0xffff,
+ /* key: 0x57e3 */ 0x5443,
+ /* key: 0x57e4 */ 0xb76e,
+ /* key: 0x57e5 */ 0xffff,
+ /* key: 0x57e6 */ 0xb76f,
+ /* key: 0x57e7 */ 0xb770,
+ /* key: 0x57e8 */ 0xffff,
+ /* key: 0x57e9 */ 0xb771,
+ /* key: 0x57ea */ 0xffff,
+ /* key: 0x57eb */ 0xffff,
+ /* key: 0x57ec */ 0xffff,
+ /* key: 0x57ed */ 0xb772,
+ /* key: 0x57ee */ 0xffff,
+ /* key: 0x57ef */ 0xffff,
+ /* key: 0x57f0 */ 0xb773,
+ /* key: 0x57f1 */ 0xffff,
+ /* key: 0x57f2 */ 0xffff,
+ /* key: 0x57f3 */ 0xffff,
+ /* key: 0x57f4 */ 0x3e7d,
+ /* key: 0x57f5 */ 0xb774,
+ /* key: 0x57f6 */ 0xb775,
+ /* key: 0x57f7 */ 0x3c39,
+ /* key: 0x57f8 */ 0xb776,
+ /* key: 0x57f9 */ 0x475d,
+ /* key: 0x57fa */ 0x3470,
+ /* key: 0x57fb */ 0xffff,
+ /* key: 0x57fc */ 0x3a6b,
+ /* key: 0x57fd */ 0xb777,
+ /* key: 0x57fe */ 0xb778,
+ /* key: 0x57ff */ 0xb779,
+ /* branch: 0x580X */ 4320,
+ /* branch: 0x581X */ 4336,
+ /* branch: 0x582X */ 4352,
+ /* branch: 0x583X */ 4368,
+ /* branch: 0x584X */ 4384,
+ /* branch: 0x585X */ 4400,
+ /* branch: 0x586X */ 4416,
+ /* branch: 0x587X */ 4432,
+ /* branch: 0x588X */ 4448,
+ /* branch: 0x589X */ 4464,
+ /* branch: 0x58aX */ 4480,
+ /* branch: 0x58bX */ 4496,
+ /* branch: 0x58cX */ 4512,
+ /* branch: 0x58dX */ 4528,
+ /* branch: 0x58eX */ 4544,
+ /* branch: 0x58fX */ 4560,
+ /* key: 0x5800 */ 0x4b59,
+ /* key: 0x5801 */ 0xffff,
+ /* key: 0x5802 */ 0x4632,
+ /* key: 0x5803 */ 0xb77a,
+ /* key: 0x5804 */ 0xb77b,
+ /* key: 0x5805 */ 0x3778,
+ /* key: 0x5806 */ 0x424f,
+ /* key: 0x5807 */ 0xffff,
+ /* key: 0x5808 */ 0xb77c,
+ /* key: 0x5809 */ 0xb77d,
+ /* key: 0x580a */ 0x5441,
+ /* key: 0x580b */ 0x5444,
+ /* key: 0x580c */ 0xb821,
+ /* key: 0x580d */ 0xb822,
+ /* key: 0x580e */ 0xffff,
+ /* key: 0x580f */ 0xffff,
+ /* key: 0x5810 */ 0xffff,
+ /* key: 0x5811 */ 0xffff,
+ /* key: 0x5812 */ 0xffff,
+ /* key: 0x5813 */ 0xffff,
+ /* key: 0x5814 */ 0xffff,
+ /* key: 0x5815 */ 0x4244,
+ /* key: 0x5816 */ 0xffff,
+ /* key: 0x5817 */ 0xffff,
+ /* key: 0x5818 */ 0xffff,
+ /* key: 0x5819 */ 0x5445,
+ /* key: 0x581a */ 0xffff,
+ /* key: 0x581b */ 0xb823,
+ /* key: 0x581c */ 0xffff,
+ /* key: 0x581d */ 0x5446,
+ /* key: 0x581e */ 0xb824,
+ /* key: 0x581f */ 0xb825,
+ /* key: 0x5820 */ 0xb826,
+ /* key: 0x5821 */ 0x5448,
+ /* key: 0x5822 */ 0xffff,
+ /* key: 0x5823 */ 0xffff,
+ /* key: 0x5824 */ 0x4469,
+ /* key: 0x5825 */ 0xffff,
+ /* key: 0x5826 */ 0xb827,
+ /* key: 0x5827 */ 0xb828,
+ /* key: 0x5828 */ 0xffff,
+ /* key: 0x5829 */ 0xffff,
+ /* key: 0x582a */ 0x342e,
+ /* key: 0x582b */ 0xffff,
+ /* key: 0x582c */ 0xffff,
+ /* key: 0x582d */ 0xb829,
+ /* key: 0x582e */ 0xffff,
+ /* key: 0x582f */ 0x7421,
+ /* key: 0x5830 */ 0x3161,
+ /* key: 0x5831 */ 0x4a73,
+ /* key: 0x5832 */ 0xb82a,
+ /* key: 0x5833 */ 0xffff,
+ /* key: 0x5834 */ 0x3e6c,
+ /* key: 0x5835 */ 0x4548,
+ /* key: 0x5836 */ 0xffff,
+ /* key: 0x5837 */ 0xffff,
+ /* key: 0x5838 */ 0xffff,
+ /* key: 0x5839 */ 0xb82b,
+ /* key: 0x583a */ 0x3a66,
+ /* key: 0x583b */ 0xffff,
+ /* key: 0x583c */ 0xffff,
+ /* key: 0x583d */ 0x544e,
+ /* key: 0x583e */ 0xffff,
+ /* key: 0x583f */ 0xb82c,
+ /* key: 0x5840 */ 0x4a3d,
+ /* key: 0x5841 */ 0x4e5d,
+ /* key: 0x5842 */ 0xffff,
+ /* key: 0x5843 */ 0xffff,
+ /* key: 0x5844 */ 0xffff,
+ /* key: 0x5845 */ 0xffff,
+ /* key: 0x5846 */ 0xffff,
+ /* key: 0x5847 */ 0xffff,
+ /* key: 0x5848 */ 0xffff,
+ /* key: 0x5849 */ 0xb82d,
+ /* key: 0x584a */ 0x3274,
+ /* key: 0x584b */ 0x544a,
+ /* key: 0x584c */ 0xb82e,
+ /* key: 0x584d */ 0xb82f,
+ /* key: 0x584e */ 0xffff,
+ /* key: 0x584f */ 0xb830,
+ /* key: 0x5850 */ 0xb831,
+ /* key: 0x5851 */ 0x413a,
+ /* key: 0x5852 */ 0x544d,
+ /* key: 0x5853 */ 0xffff,
+ /* key: 0x5854 */ 0x4563,
+ /* key: 0x5855 */ 0xb832,
+ /* key: 0x5856 */ 0xffff,
+ /* key: 0x5857 */ 0x4549,
+ /* key: 0x5858 */ 0x4564,
+ /* key: 0x5859 */ 0x4839,
+ /* key: 0x585a */ 0x444d,
+ /* key: 0x585b */ 0xffff,
+ /* key: 0x585c */ 0xffff,
+ /* key: 0x585d */ 0xffff,
+ /* key: 0x585e */ 0x3a49,
+ /* key: 0x585f */ 0xb833,
+ /* key: 0x5860 */ 0xffff,
+ /* key: 0x5861 */ 0xb834,
+ /* key: 0x5862 */ 0x5449,
+ /* key: 0x5863 */ 0xffff,
+ /* key: 0x5864 */ 0xb835,
+ /* key: 0x5865 */ 0xffff,
+ /* key: 0x5866 */ 0xffff,
+ /* key: 0x5867 */ 0xb836,
+ /* key: 0x5868 */ 0xb837,
+ /* key: 0x5869 */ 0x3176,
+ /* key: 0x586a */ 0xffff,
+ /* key: 0x586b */ 0x4536,
+ /* key: 0x586c */ 0xffff,
+ /* key: 0x586d */ 0xffff,
+ /* key: 0x586e */ 0xffff,
+ /* key: 0x586f */ 0xffff,
+ /* key: 0x5870 */ 0x544b,
+ /* key: 0x5871 */ 0xffff,
+ /* key: 0x5872 */ 0x5447,
+ /* key: 0x5873 */ 0xffff,
+ /* key: 0x5874 */ 0xffff,
+ /* key: 0x5875 */ 0x3f50,
+ /* key: 0x5876 */ 0xffff,
+ /* key: 0x5877 */ 0xffff,
+ /* key: 0x5878 */ 0xb838,
+ /* key: 0x5879 */ 0x544f,
+ /* key: 0x587a */ 0xffff,
+ /* key: 0x587b */ 0xffff,
+ /* key: 0x587c */ 0xb839,
+ /* key: 0x587d */ 0xffff,
+ /* key: 0x587e */ 0x3d4e,
+ /* key: 0x587f */ 0xb83a,
+ /* key: 0x5880 */ 0xb83b,
+ /* key: 0x5881 */ 0xb83c,
+ /* key: 0x5882 */ 0xffff,
+ /* key: 0x5883 */ 0x362d,
+ /* key: 0x5884 */ 0xffff,
+ /* key: 0x5885 */ 0x5450,
+ /* key: 0x5886 */ 0xffff,
+ /* key: 0x5887 */ 0xb83d,
+ /* key: 0x5888 */ 0xb83e,
+ /* key: 0x5889 */ 0xb83f,
+ /* key: 0x588a */ 0xb840,
+ /* key: 0x588b */ 0xffff,
+ /* key: 0x588c */ 0xb841,
+ /* key: 0x588d */ 0xb842,
+ /* key: 0x588e */ 0xffff,
+ /* key: 0x588f */ 0xb843,
+ /* key: 0x5890 */ 0xb844,
+ /* key: 0x5891 */ 0xffff,
+ /* key: 0x5892 */ 0xffff,
+ /* key: 0x5893 */ 0x4a68,
+ /* key: 0x5894 */ 0xb845,
+ /* key: 0x5895 */ 0xffff,
+ /* key: 0x5896 */ 0xb846,
+ /* key: 0x5897 */ 0x417d,
+ /* key: 0x5898 */ 0xffff,
+ /* key: 0x5899 */ 0xffff,
+ /* key: 0x589a */ 0xffff,
+ /* key: 0x589b */ 0xffff,
+ /* key: 0x589c */ 0x4446,
+ /* key: 0x589d */ 0xb847,
+ /* key: 0x589e */ 0xffff,
+ /* key: 0x589f */ 0x5452,
+ /* key: 0x58a0 */ 0xb848,
+ /* key: 0x58a1 */ 0xb849,
+ /* key: 0x58a2 */ 0xb84a,
+ /* key: 0x58a3 */ 0xffff,
+ /* key: 0x58a4 */ 0xffff,
+ /* key: 0x58a5 */ 0xffff,
+ /* key: 0x58a6 */ 0xb84b,
+ /* key: 0x58a7 */ 0xffff,
+ /* key: 0x58a8 */ 0x4b4f,
+ /* key: 0x58a9 */ 0xb84c,
+ /* key: 0x58aa */ 0xffff,
+ /* key: 0x58ab */ 0x5453,
+ /* key: 0x58ac */ 0xffff,
+ /* key: 0x58ad */ 0xffff,
+ /* key: 0x58ae */ 0x5458,
+ /* key: 0x58af */ 0xffff,
+ /* key: 0x58b0 */ 0xffff,
+ /* key: 0x58b1 */ 0xb84d,
+ /* key: 0x58b2 */ 0xb84e,
+ /* key: 0x58b3 */ 0x4a2f,
+ /* key: 0x58b4 */ 0xffff,
+ /* key: 0x58b5 */ 0xffff,
+ /* key: 0x58b6 */ 0xffff,
+ /* key: 0x58b7 */ 0xffff,
+ /* key: 0x58b8 */ 0x5457,
+ /* key: 0x58b9 */ 0x5451,
+ /* key: 0x58ba */ 0x5454,
+ /* key: 0x58bb */ 0x5456,
+ /* key: 0x58bc */ 0xb850,
+ /* key: 0x58bd */ 0xffff,
+ /* key: 0x58be */ 0x3a26,
+ /* key: 0x58bf */ 0xffff,
+ /* key: 0x58c0 */ 0xffff,
+ /* key: 0x58c1 */ 0x4a49,
+ /* key: 0x58c2 */ 0xb851,
+ /* key: 0x58c3 */ 0xffff,
+ /* key: 0x58c4 */ 0xb84f,
+ /* key: 0x58c5 */ 0x5459,
+ /* key: 0x58c6 */ 0xffff,
+ /* key: 0x58c7 */ 0x4345,
+ /* key: 0x58c8 */ 0xb852,
+ /* key: 0x58c9 */ 0xffff,
+ /* key: 0x58ca */ 0x3275,
+ /* key: 0x58cb */ 0xffff,
+ /* key: 0x58cc */ 0x3e6d,
+ /* key: 0x58cd */ 0xb853,
+ /* key: 0x58ce */ 0xb854,
+ /* key: 0x58cf */ 0xffff,
+ /* key: 0x58d0 */ 0xb855,
+ /* key: 0x58d1 */ 0x545b,
+ /* key: 0x58d2 */ 0xb856,
+ /* key: 0x58d3 */ 0x545a,
+ /* key: 0x58d4 */ 0xb857,
+ /* key: 0x58d5 */ 0x3968,
+ /* key: 0x58d6 */ 0xb858,
+ /* key: 0x58d7 */ 0x545c,
+ /* key: 0x58d8 */ 0x545e,
+ /* key: 0x58d9 */ 0x545d,
+ /* key: 0x58da */ 0xb859,
+ /* key: 0x58db */ 0xffff,
+ /* key: 0x58dc */ 0x5460,
+ /* key: 0x58dd */ 0xb85a,
+ /* key: 0x58de */ 0x5455,
+ /* key: 0x58df */ 0x5462,
+ /* key: 0x58e0 */ 0xffff,
+ /* key: 0x58e1 */ 0xb85b,
+ /* key: 0x58e2 */ 0xb85c,
+ /* key: 0x58e3 */ 0xffff,
+ /* key: 0x58e4 */ 0x5461,
+ /* key: 0x58e5 */ 0x545f,
+ /* key: 0x58e6 */ 0xffff,
+ /* key: 0x58e7 */ 0xffff,
+ /* key: 0x58e8 */ 0xffff,
+ /* key: 0x58e9 */ 0xb85d,
+ /* key: 0x58ea */ 0xffff,
+ /* key: 0x58eb */ 0x3b4e,
+ /* key: 0x58ec */ 0x3f51,
+ /* key: 0x58ed */ 0xffff,
+ /* key: 0x58ee */ 0x4154,
+ /* key: 0x58ef */ 0x5463,
+ /* key: 0x58f0 */ 0x403c,
+ /* key: 0x58f1 */ 0x306d,
+ /* key: 0x58f2 */ 0x4764,
+ /* key: 0x58f3 */ 0xb85e,
+ /* key: 0x58f4 */ 0xffff,
+ /* key: 0x58f5 */ 0xffff,
+ /* key: 0x58f6 */ 0xffff,
+ /* key: 0x58f7 */ 0x445b,
+ /* key: 0x58f8 */ 0xffff,
+ /* key: 0x58f9 */ 0x5465,
+ /* key: 0x58fa */ 0x5464,
+ /* key: 0x58fb */ 0x5466,
+ /* key: 0x58fc */ 0x5467,
+ /* key: 0x58fd */ 0x5468,
+ /* key: 0x58fe */ 0xffff,
+ /* key: 0x58ff */ 0xffff,
+ /* branch: 0x590X */ 4592,
+ /* branch: 0x591X */ 4608,
+ /* branch: 0x592X */ 4624,
+ /* branch: 0x593X */ 4640,
+ /* branch: 0x594X */ 4656,
+ /* branch: 0x595X */ 4672,
+ /* branch: 0x596X */ 4688,
+ /* branch: 0x597X */ 4704,
+ /* branch: 0x598X */ 4720,
+ /* branch: 0x599X */ 4736,
+ /* branch: 0x59aX */ 4752,
+ /* branch: 0x59bX */ 4768,
+ /* branch: 0x59cX */ 4784,
+ /* branch: 0x59dX */ 4800,
+ /* branch: 0x59eX */ 4816,
+ /* branch: 0x59fX */ 4832,
+ /* key: 0x5900 */ 0xffff,
+ /* key: 0x5901 */ 0xffff,
+ /* key: 0x5902 */ 0x5469,
+ /* key: 0x5903 */ 0xffff,
+ /* key: 0x5904 */ 0xffff,
+ /* key: 0x5905 */ 0xb85f,
+ /* key: 0x5906 */ 0xb860,
+ /* key: 0x5907 */ 0xffff,
+ /* key: 0x5908 */ 0xffff,
+ /* key: 0x5909 */ 0x4a51,
+ /* key: 0x590a */ 0x546a,
+ /* key: 0x590b */ 0xb861,
+ /* key: 0x590c */ 0xb862,
+ /* key: 0x590d */ 0xffff,
+ /* key: 0x590e */ 0xffff,
+ /* key: 0x590f */ 0x3246,
+ /* key: 0x5910 */ 0x546b,
+ /* key: 0x5911 */ 0xffff,
+ /* key: 0x5912 */ 0xb863,
+ /* key: 0x5913 */ 0xb864,
+ /* key: 0x5914 */ 0xb865,
+ /* key: 0x5915 */ 0x4d3c,
+ /* key: 0x5916 */ 0x3330,
+ /* key: 0x5917 */ 0xffff,
+ /* key: 0x5918 */ 0x5249,
+ /* key: 0x5919 */ 0x3d48,
+ /* key: 0x591a */ 0x423f,
+ /* key: 0x591b */ 0x546c,
+ /* key: 0x591c */ 0x4c6b,
+ /* key: 0x591d */ 0xb867,
+ /* key: 0x591e */ 0xffff,
+ /* key: 0x591f */ 0xffff,
+ /* key: 0x5920 */ 0xffff,
+ /* key: 0x5921 */ 0xb868,
+ /* key: 0x5922 */ 0x4c34,
+ /* key: 0x5923 */ 0xb869,
+ /* key: 0x5924 */ 0xb86a,
+ /* key: 0x5925 */ 0x546e,
+ /* key: 0x5926 */ 0xffff,
+ /* key: 0x5927 */ 0x4267,
+ /* key: 0x5928 */ 0xb86b,
+ /* key: 0x5929 */ 0x4537,
+ /* key: 0x592a */ 0x4240,
+ /* key: 0x592b */ 0x4957,
+ /* key: 0x592c */ 0x546f,
+ /* key: 0x592d */ 0x5470,
+ /* key: 0x592e */ 0x317b,
+ /* key: 0x592f */ 0xb86c,
+ /* key: 0x5930 */ 0xb86d,
+ /* key: 0x5931 */ 0x3c3a,
+ /* key: 0x5932 */ 0x5471,
+ /* key: 0x5933 */ 0xb86e,
+ /* key: 0x5934 */ 0xffff,
+ /* key: 0x5935 */ 0xb86f,
+ /* key: 0x5936 */ 0xb870,
+ /* key: 0x5937 */ 0x3050,
+ /* key: 0x5938 */ 0x5472,
+ /* key: 0x5939 */ 0xffff,
+ /* key: 0x593a */ 0xffff,
+ /* key: 0x593b */ 0xffff,
+ /* key: 0x593c */ 0xffff,
+ /* key: 0x593d */ 0xffff,
+ /* key: 0x593e */ 0x5473,
+ /* key: 0x593f */ 0xb871,
+ /* key: 0x5940 */ 0xffff,
+ /* key: 0x5941 */ 0xffff,
+ /* key: 0x5942 */ 0xffff,
+ /* key: 0x5943 */ 0xb872,
+ /* key: 0x5944 */ 0x3162,
+ /* key: 0x5945 */ 0xffff,
+ /* key: 0x5946 */ 0xb873,
+ /* key: 0x5947 */ 0x3471,
+ /* key: 0x5948 */ 0x4660,
+ /* key: 0x5949 */ 0x4a74,
+ /* key: 0x594a */ 0xffff,
+ /* key: 0x594b */ 0xffff,
+ /* key: 0x594c */ 0xffff,
+ /* key: 0x594d */ 0xffff,
+ /* key: 0x594e */ 0x5477,
+ /* key: 0x594f */ 0x4155,
+ /* key: 0x5950 */ 0x5476,
+ /* key: 0x5951 */ 0x3740,
+ /* key: 0x5952 */ 0xb874,
+ /* key: 0x5953 */ 0xb875,
+ /* key: 0x5954 */ 0x4b5b,
+ /* key: 0x5955 */ 0x5475,
+ /* key: 0x5956 */ 0xffff,
+ /* key: 0x5957 */ 0x4565,
+ /* key: 0x5958 */ 0x5479,
+ /* key: 0x5959 */ 0xb876,
+ /* key: 0x595a */ 0x5478,
+ /* key: 0x595b */ 0xb877,
+ /* key: 0x595c */ 0xffff,
+ /* key: 0x595d */ 0xb878,
+ /* key: 0x595e */ 0xb879,
+ /* key: 0x595f */ 0xb87a,
+ /* key: 0x5960 */ 0x547b,
+ /* key: 0x5961 */ 0xb87b,
+ /* key: 0x5962 */ 0x547a,
+ /* key: 0x5963 */ 0xb87c,
+ /* key: 0x5964 */ 0xffff,
+ /* key: 0x5965 */ 0x317c,
+ /* key: 0x5966 */ 0xffff,
+ /* key: 0x5967 */ 0x547c,
+ /* key: 0x5968 */ 0x3e29,
+ /* key: 0x5969 */ 0x547e,
+ /* key: 0x596a */ 0x4325,
+ /* key: 0x596b */ 0xb87d,
+ /* key: 0x596c */ 0x547d,
+ /* key: 0x596d */ 0xb87e,
+ /* key: 0x596e */ 0x4a33,
+ /* key: 0x596f */ 0xb921,
+ /* key: 0x5970 */ 0xffff,
+ /* key: 0x5971 */ 0xffff,
+ /* key: 0x5972 */ 0xb922,
+ /* key: 0x5973 */ 0x3d77,
+ /* key: 0x5974 */ 0x455b,
+ /* key: 0x5975 */ 0xb923,
+ /* key: 0x5976 */ 0xb924,
+ /* key: 0x5977 */ 0xffff,
+ /* key: 0x5978 */ 0x5521,
+ /* key: 0x5979 */ 0xb925,
+ /* key: 0x597a */ 0xffff,
+ /* key: 0x597b */ 0xb926,
+ /* key: 0x597c */ 0xb927,
+ /* key: 0x597d */ 0x3925,
+ /* key: 0x597e */ 0xffff,
+ /* key: 0x597f */ 0xffff,
+ /* key: 0x5980 */ 0xffff,
+ /* key: 0x5981 */ 0x5522,
+ /* key: 0x5982 */ 0x4721,
+ /* key: 0x5983 */ 0x485e,
+ /* key: 0x5984 */ 0x4c51,
+ /* key: 0x5985 */ 0xffff,
+ /* key: 0x5986 */ 0xffff,
+ /* key: 0x5987 */ 0xffff,
+ /* key: 0x5988 */ 0xffff,
+ /* key: 0x5989 */ 0xffff,
+ /* key: 0x598a */ 0x4725,
+ /* key: 0x598b */ 0xb928,
+ /* key: 0x598c */ 0xb929,
+ /* key: 0x598d */ 0x552b,
+ /* key: 0x598e */ 0xb92a,
+ /* key: 0x598f */ 0xffff,
+ /* key: 0x5990 */ 0xffff,
+ /* key: 0x5991 */ 0xffff,
+ /* key: 0x5992 */ 0xb92b,
+ /* key: 0x5993 */ 0x3538,
+ /* key: 0x5994 */ 0xffff,
+ /* key: 0x5995 */ 0xb92c,
+ /* key: 0x5996 */ 0x4d45,
+ /* key: 0x5997 */ 0xb92d,
+ /* key: 0x5998 */ 0xffff,
+ /* key: 0x5999 */ 0x4c2f,
+ /* key: 0x599a */ 0xffff,
+ /* key: 0x599b */ 0x562c,
+ /* key: 0x599c */ 0xffff,
+ /* key: 0x599d */ 0x5523,
+ /* key: 0x599e */ 0xffff,
+ /* key: 0x599f */ 0xb92e,
+ /* key: 0x59a0 */ 0xffff,
+ /* key: 0x59a1 */ 0xffff,
+ /* key: 0x59a2 */ 0xffff,
+ /* key: 0x59a3 */ 0x5526,
+ /* key: 0x59a4 */ 0xb92f,
+ /* key: 0x59a5 */ 0x4245,
+ /* key: 0x59a6 */ 0xffff,
+ /* key: 0x59a7 */ 0xb930,
+ /* key: 0x59a8 */ 0x4b38,
+ /* key: 0x59a9 */ 0xffff,
+ /* key: 0x59aa */ 0xffff,
+ /* key: 0x59ab */ 0xffff,
+ /* key: 0x59ac */ 0x454a,
+ /* key: 0x59ad */ 0xb931,
+ /* key: 0x59ae */ 0xb932,
+ /* key: 0x59af */ 0xb933,
+ /* key: 0x59b0 */ 0xb934,
+ /* key: 0x59b1 */ 0xffff,
+ /* key: 0x59b2 */ 0x5527,
+ /* key: 0x59b3 */ 0xb935,
+ /* key: 0x59b4 */ 0xffff,
+ /* key: 0x59b5 */ 0xffff,
+ /* key: 0x59b6 */ 0xffff,
+ /* key: 0x59b7 */ 0xb936,
+ /* key: 0x59b8 */ 0xffff,
+ /* key: 0x59b9 */ 0x4b65,
+ /* key: 0x59ba */ 0xb937,
+ /* key: 0x59bb */ 0x3a4a,
+ /* key: 0x59bc */ 0xb938,
+ /* key: 0x59bd */ 0xffff,
+ /* key: 0x59be */ 0x3e2a,
+ /* key: 0x59bf */ 0xffff,
+ /* key: 0x59c0 */ 0xffff,
+ /* key: 0x59c1 */ 0xb939,
+ /* key: 0x59c2 */ 0xffff,
+ /* key: 0x59c3 */ 0xb93a,
+ /* key: 0x59c4 */ 0xb93b,
+ /* key: 0x59c5 */ 0xffff,
+ /* key: 0x59c6 */ 0x5528,
+ /* key: 0x59c7 */ 0xffff,
+ /* key: 0x59c8 */ 0xb93c,
+ /* key: 0x59c9 */ 0x3b50,
+ /* key: 0x59ca */ 0xb93d,
+ /* key: 0x59cb */ 0x3b4f,
+ /* key: 0x59cc */ 0xffff,
+ /* key: 0x59cd */ 0xb93e,
+ /* key: 0x59ce */ 0xffff,
+ /* key: 0x59cf */ 0xffff,
+ /* key: 0x59d0 */ 0x3039,
+ /* key: 0x59d1 */ 0x3848,
+ /* key: 0x59d2 */ 0xb93f,
+ /* key: 0x59d3 */ 0x402b,
+ /* key: 0x59d4 */ 0x3051,
+ /* key: 0x59d5 */ 0xffff,
+ /* key: 0x59d6 */ 0xffff,
+ /* key: 0x59d7 */ 0xffff,
+ /* key: 0x59d8 */ 0xffff,
+ /* key: 0x59d9 */ 0x552c,
+ /* key: 0x59da */ 0x552d,
+ /* key: 0x59db */ 0xffff,
+ /* key: 0x59dc */ 0x552a,
+ /* key: 0x59dd */ 0xb940,
+ /* key: 0x59de */ 0xb941,
+ /* key: 0x59df */ 0xb942,
+ /* key: 0x59e0 */ 0xffff,
+ /* key: 0x59e1 */ 0xffff,
+ /* key: 0x59e2 */ 0xffff,
+ /* key: 0x59e3 */ 0xb943,
+ /* key: 0x59e4 */ 0xb944,
+ /* key: 0x59e5 */ 0x3138,
+ /* key: 0x59e6 */ 0x342f,
+ /* key: 0x59e7 */ 0xb945,
+ /* key: 0x59e8 */ 0x5529,
+ /* key: 0x59e9 */ 0xffff,
+ /* key: 0x59ea */ 0x4c45,
+ /* key: 0x59eb */ 0x4931,
+ /* key: 0x59ec */ 0xffff,
+ /* key: 0x59ed */ 0xffff,
+ /* key: 0x59ee */ 0xb946,
+ /* key: 0x59ef */ 0xb947,
+ /* key: 0x59f0 */ 0xffff,
+ /* key: 0x59f1 */ 0xb948,
+ /* key: 0x59f2 */ 0xb949,
+ /* key: 0x59f3 */ 0xffff,
+ /* key: 0x59f4 */ 0xb94a,
+ /* key: 0x59f5 */ 0xffff,
+ /* key: 0x59f6 */ 0x3028,
+ /* key: 0x59f7 */ 0xb94b,
+ /* key: 0x59f8 */ 0xffff,
+ /* key: 0x59f9 */ 0xffff,
+ /* key: 0x59fa */ 0xffff,
+ /* key: 0x59fb */ 0x3079,
+ /* key: 0x59fc */ 0xffff,
+ /* key: 0x59fd */ 0xffff,
+ /* key: 0x59fe */ 0xffff,
+ /* key: 0x59ff */ 0x3b51,
+ /* branch: 0x5a0X */ 4864,
+ /* branch: 0x5a1X */ 4880,
+ /* branch: 0x5a2X */ 4896,
+ /* branch: 0x5a3X */ 4912,
+ /* branch: 0x5a4X */ 4928,
+ /* branch: 0x5a5X */ 4944,
+ /* branch: 0x5a6X */ 4960,
+ /* branch: 0x5a7X */ 4976,
+ /* branch: 0x5a8X */ 4992,
+ /* branch: 0x5a9X */ 5008,
+ /* branch: 0x5aaX */ 5024,
+ /* branch: 0x5abX */ 5040,
+ /* branch: 0x5acX */ 5056,
+ /* branch: 0x5adX */ 5072,
+ /* branch: 0x5aeX */ 5088,
+ /* branch: 0x5afX */ 5104,
+ /* key: 0x5a00 */ 0xb94c,
+ /* key: 0x5a01 */ 0x3052,
+ /* key: 0x5a02 */ 0xffff,
+ /* key: 0x5a03 */ 0x3023,
+ /* key: 0x5a04 */ 0xb94d,
+ /* key: 0x5a05 */ 0xffff,
+ /* key: 0x5a06 */ 0xffff,
+ /* key: 0x5a07 */ 0xffff,
+ /* key: 0x5a08 */ 0xffff,
+ /* key: 0x5a09 */ 0x5532,
+ /* key: 0x5a0a */ 0xffff,
+ /* key: 0x5a0b */ 0xffff,
+ /* key: 0x5a0c */ 0xb94e,
+ /* key: 0x5a0d */ 0xb94f,
+ /* key: 0x5a0e */ 0xb950,
+ /* key: 0x5a0f */ 0xffff,
+ /* key: 0x5a10 */ 0xffff,
+ /* key: 0x5a11 */ 0x5530,
+ /* key: 0x5a12 */ 0xb951,
+ /* key: 0x5a13 */ 0xb952,
+ /* key: 0x5a14 */ 0xffff,
+ /* key: 0x5a15 */ 0xffff,
+ /* key: 0x5a16 */ 0xffff,
+ /* key: 0x5a17 */ 0xffff,
+ /* key: 0x5a18 */ 0x4c3c,
+ /* key: 0x5a19 */ 0xffff,
+ /* key: 0x5a1a */ 0x5533,
+ /* key: 0x5a1b */ 0xffff,
+ /* key: 0x5a1c */ 0x5531,
+ /* key: 0x5a1d */ 0xffff,
+ /* key: 0x5a1e */ 0xb953,
+ /* key: 0x5a1f */ 0x552f,
+ /* key: 0x5a20 */ 0x3f31,
+ /* key: 0x5a21 */ 0xffff,
+ /* key: 0x5a22 */ 0xffff,
+ /* key: 0x5a23 */ 0xb954,
+ /* key: 0x5a24 */ 0xb955,
+ /* key: 0x5a25 */ 0x552e,
+ /* key: 0x5a26 */ 0xffff,
+ /* key: 0x5a27 */ 0xb956,
+ /* key: 0x5a28 */ 0xb957,
+ /* key: 0x5a29 */ 0x4a5a,
+ /* key: 0x5a2a */ 0xb958,
+ /* key: 0x5a2b */ 0xffff,
+ /* key: 0x5a2c */ 0xffff,
+ /* key: 0x5a2d */ 0xb959,
+ /* key: 0x5a2e */ 0xffff,
+ /* key: 0x5a2f */ 0x3864,
+ /* key: 0x5a30 */ 0xb95a,
+ /* key: 0x5a31 */ 0xffff,
+ /* key: 0x5a32 */ 0xffff,
+ /* key: 0x5a33 */ 0xffff,
+ /* key: 0x5a34 */ 0xffff,
+ /* key: 0x5a35 */ 0x5537,
+ /* key: 0x5a36 */ 0x5538,
+ /* key: 0x5a37 */ 0xffff,
+ /* key: 0x5a38 */ 0xffff,
+ /* key: 0x5a39 */ 0xffff,
+ /* key: 0x5a3a */ 0xffff,
+ /* key: 0x5a3b */ 0xffff,
+ /* key: 0x5a3c */ 0x3e2b,
+ /* key: 0x5a3d */ 0xffff,
+ /* key: 0x5a3e */ 0xffff,
+ /* key: 0x5a3f */ 0xffff,
+ /* key: 0x5a40 */ 0x5534,
+ /* key: 0x5a41 */ 0x4f2c,
+ /* key: 0x5a42 */ 0xffff,
+ /* key: 0x5a43 */ 0xffff,
+ /* key: 0x5a44 */ 0xb95b,
+ /* key: 0x5a45 */ 0xb95c,
+ /* key: 0x5a46 */ 0x474c,
+ /* key: 0x5a47 */ 0xb95d,
+ /* key: 0x5a48 */ 0xb95e,
+ /* key: 0x5a49 */ 0x5536,
+ /* key: 0x5a4a */ 0xffff,
+ /* key: 0x5a4b */ 0xffff,
+ /* key: 0x5a4c */ 0xb95f,
+ /* key: 0x5a4d */ 0xffff,
+ /* key: 0x5a4e */ 0xffff,
+ /* key: 0x5a4f */ 0xffff,
+ /* key: 0x5a50 */ 0xb960,
+ /* key: 0x5a51 */ 0xffff,
+ /* key: 0x5a52 */ 0xffff,
+ /* key: 0x5a53 */ 0xffff,
+ /* key: 0x5a54 */ 0xffff,
+ /* key: 0x5a55 */ 0xb961,
+ /* key: 0x5a56 */ 0xffff,
+ /* key: 0x5a57 */ 0xffff,
+ /* key: 0x5a58 */ 0xffff,
+ /* key: 0x5a59 */ 0xffff,
+ /* key: 0x5a5a */ 0x3a27,
+ /* key: 0x5a5b */ 0xffff,
+ /* key: 0x5a5c */ 0xffff,
+ /* key: 0x5a5d */ 0xffff,
+ /* key: 0x5a5e */ 0xb962,
+ /* key: 0x5a5f */ 0xffff,
+ /* key: 0x5a60 */ 0xffff,
+ /* key: 0x5a61 */ 0xffff,
+ /* key: 0x5a62 */ 0x5539,
+ /* key: 0x5a63 */ 0xb963,
+ /* key: 0x5a64 */ 0xffff,
+ /* key: 0x5a65 */ 0xb964,
+ /* key: 0x5a66 */ 0x4958,
+ /* key: 0x5a67 */ 0xb965,
+ /* key: 0x5a68 */ 0xffff,
+ /* key: 0x5a69 */ 0xffff,
+ /* key: 0x5a6a */ 0x553a,
+ /* key: 0x5a6b */ 0xffff,
+ /* key: 0x5a6c */ 0x5535,
+ /* key: 0x5a6d */ 0xb966,
+ /* key: 0x5a6e */ 0xffff,
+ /* key: 0x5a6f */ 0xffff,
+ /* key: 0x5a70 */ 0xffff,
+ /* key: 0x5a71 */ 0xffff,
+ /* key: 0x5a72 */ 0xffff,
+ /* key: 0x5a73 */ 0xffff,
+ /* key: 0x5a74 */ 0xffff,
+ /* key: 0x5a75 */ 0xffff,
+ /* key: 0x5a76 */ 0xffff,
+ /* key: 0x5a77 */ 0xb967,
+ /* key: 0x5a78 */ 0xffff,
+ /* key: 0x5a79 */ 0xffff,
+ /* key: 0x5a7a */ 0xb968,
+ /* key: 0x5a7b */ 0xb969,
+ /* key: 0x5a7c */ 0xffff,
+ /* key: 0x5a7d */ 0xffff,
+ /* key: 0x5a7e */ 0xb96a,
+ /* key: 0x5a7f */ 0x4c3b,
+ /* key: 0x5a80 */ 0xffff,
+ /* key: 0x5a81 */ 0xffff,
+ /* key: 0x5a82 */ 0xffff,
+ /* key: 0x5a83 */ 0xffff,
+ /* key: 0x5a84 */ 0xffff,
+ /* key: 0x5a85 */ 0xffff,
+ /* key: 0x5a86 */ 0xffff,
+ /* key: 0x5a87 */ 0xffff,
+ /* key: 0x5a88 */ 0xffff,
+ /* key: 0x5a89 */ 0xffff,
+ /* key: 0x5a8a */ 0xffff,
+ /* key: 0x5a8b */ 0xb96b,
+ /* key: 0x5a8c */ 0xffff,
+ /* key: 0x5a8d */ 0xffff,
+ /* key: 0x5a8e */ 0xffff,
+ /* key: 0x5a8f */ 0xffff,
+ /* key: 0x5a90 */ 0xb96c,
+ /* key: 0x5a91 */ 0xffff,
+ /* key: 0x5a92 */ 0x475e,
+ /* key: 0x5a93 */ 0xb96d,
+ /* key: 0x5a94 */ 0xffff,
+ /* key: 0x5a95 */ 0xffff,
+ /* key: 0x5a96 */ 0xb96e,
+ /* key: 0x5a97 */ 0xffff,
+ /* key: 0x5a98 */ 0xffff,
+ /* key: 0x5a99 */ 0xb96f,
+ /* key: 0x5a9a */ 0x553b,
+ /* key: 0x5a9b */ 0x4932,
+ /* key: 0x5a9c */ 0xb970,
+ /* key: 0x5a9d */ 0xffff,
+ /* key: 0x5a9e */ 0xb971,
+ /* key: 0x5a9f */ 0xb972,
+ /* key: 0x5aa0 */ 0xb973,
+ /* key: 0x5aa1 */ 0xffff,
+ /* key: 0x5aa2 */ 0xb974,
+ /* key: 0x5aa3 */ 0xffff,
+ /* key: 0x5aa4 */ 0xffff,
+ /* key: 0x5aa5 */ 0xffff,
+ /* key: 0x5aa6 */ 0xffff,
+ /* key: 0x5aa7 */ 0xb975,
+ /* key: 0x5aa8 */ 0xffff,
+ /* key: 0x5aa9 */ 0xffff,
+ /* key: 0x5aaa */ 0xffff,
+ /* key: 0x5aab */ 0xffff,
+ /* key: 0x5aac */ 0xb976,
+ /* key: 0x5aad */ 0xffff,
+ /* key: 0x5aae */ 0xffff,
+ /* key: 0x5aaf */ 0xffff,
+ /* key: 0x5ab0 */ 0xffff,
+ /* key: 0x5ab1 */ 0xb977,
+ /* key: 0x5ab2 */ 0xb978,
+ /* key: 0x5ab3 */ 0xb979,
+ /* key: 0x5ab4 */ 0xffff,
+ /* key: 0x5ab5 */ 0xb97a,
+ /* key: 0x5ab6 */ 0xffff,
+ /* key: 0x5ab7 */ 0xffff,
+ /* key: 0x5ab8 */ 0xb97b,
+ /* key: 0x5ab9 */ 0xffff,
+ /* key: 0x5aba */ 0xb97c,
+ /* key: 0x5abb */ 0xb97d,
+ /* key: 0x5abc */ 0x553c,
+ /* key: 0x5abd */ 0x5540,
+ /* key: 0x5abe */ 0x553d,
+ /* key: 0x5abf */ 0xb97e,
+ /* key: 0x5ac0 */ 0xffff,
+ /* key: 0x5ac1 */ 0x3247,
+ /* key: 0x5ac2 */ 0x553f,
+ /* key: 0x5ac3 */ 0xffff,
+ /* key: 0x5ac4 */ 0xba21,
+ /* key: 0x5ac5 */ 0xffff,
+ /* key: 0x5ac6 */ 0xba22,
+ /* key: 0x5ac7 */ 0xffff,
+ /* key: 0x5ac8 */ 0xba23,
+ /* key: 0x5ac9 */ 0x3c3b,
+ /* key: 0x5aca */ 0xffff,
+ /* key: 0x5acb */ 0x553e,
+ /* key: 0x5acc */ 0x3779,
+ /* key: 0x5acd */ 0xffff,
+ /* key: 0x5ace */ 0xffff,
+ /* key: 0x5acf */ 0xba24,
+ /* key: 0x5ad0 */ 0x554c,
+ /* key: 0x5ad1 */ 0xffff,
+ /* key: 0x5ad2 */ 0xffff,
+ /* key: 0x5ad3 */ 0xffff,
+ /* key: 0x5ad4 */ 0xffff,
+ /* key: 0x5ad5 */ 0xffff,
+ /* key: 0x5ad6 */ 0x5545,
+ /* key: 0x5ad7 */ 0x5542,
+ /* key: 0x5ad8 */ 0xffff,
+ /* key: 0x5ad9 */ 0xffff,
+ /* key: 0x5ada */ 0xba25,
+ /* key: 0x5adb */ 0xffff,
+ /* key: 0x5adc */ 0xba26,
+ /* key: 0x5add */ 0xffff,
+ /* key: 0x5ade */ 0xffff,
+ /* key: 0x5adf */ 0xffff,
+ /* key: 0x5ae0 */ 0xba27,
+ /* key: 0x5ae1 */ 0x4364,
+ /* key: 0x5ae2 */ 0xffff,
+ /* key: 0x5ae3 */ 0x5541,
+ /* key: 0x5ae4 */ 0xffff,
+ /* key: 0x5ae5 */ 0xba28,
+ /* key: 0x5ae6 */ 0x5543,
+ /* key: 0x5ae7 */ 0xffff,
+ /* key: 0x5ae8 */ 0xffff,
+ /* key: 0x5ae9 */ 0x5544,
+ /* key: 0x5aea */ 0xba29,
+ /* key: 0x5aeb */ 0xffff,
+ /* key: 0x5aec */ 0xffff,
+ /* key: 0x5aed */ 0xffff,
+ /* key: 0x5aee */ 0xba2a,
+ /* key: 0x5aef */ 0xffff,
+ /* key: 0x5af0 */ 0xffff,
+ /* key: 0x5af1 */ 0xffff,
+ /* key: 0x5af2 */ 0xffff,
+ /* key: 0x5af3 */ 0xffff,
+ /* key: 0x5af4 */ 0xffff,
+ /* key: 0x5af5 */ 0xba2b,
+ /* key: 0x5af6 */ 0xba2c,
+ /* key: 0x5af7 */ 0xffff,
+ /* key: 0x5af8 */ 0xffff,
+ /* key: 0x5af9 */ 0xffff,
+ /* key: 0x5afa */ 0x5546,
+ /* key: 0x5afb */ 0x5547,
+ /* key: 0x5afc */ 0xffff,
+ /* key: 0x5afd */ 0xba2d,
+ /* key: 0x5afe */ 0xffff,
+ /* key: 0x5aff */ 0xffff,
+ /* branch: 0x5b0X */ 5136,
+ /* branch: 0x5b1X */ 5152,
+ /* branch: 0x5b2X */ 5168,
+ /* branch: 0x5b3X */ 5184,
+ /* branch: 0x5b4X */ 5200,
+ /* branch: 0x5b5X */ 5216,
+ /* branch: 0x5b6X */ 5232,
+ /* branch: 0x5b7X */ 5248,
+ /* branch: 0x5b8X */ 5264,
+ /* branch: 0x5b9X */ 5280,
+ /* branch: 0x5baX */ 5296,
+ /* branch: 0x5bbX */ 5312,
+ /* branch: 0x5bcX */ 5328,
+ /* branch: 0x5bdX */ 5344,
+ /* branch: 0x5beX */ 5360,
+ /* branch: 0x5bfX */ 5376,
+ /* key: 0x5b00 */ 0xba2e,
+ /* key: 0x5b01 */ 0xba2f,
+ /* key: 0x5b02 */ 0xffff,
+ /* key: 0x5b03 */ 0xffff,
+ /* key: 0x5b04 */ 0xffff,
+ /* key: 0x5b05 */ 0xffff,
+ /* key: 0x5b06 */ 0xffff,
+ /* key: 0x5b07 */ 0xffff,
+ /* key: 0x5b08 */ 0xba30,
+ /* key: 0x5b09 */ 0x3472,
+ /* key: 0x5b0a */ 0xffff,
+ /* key: 0x5b0b */ 0x5549,
+ /* key: 0x5b0c */ 0x5548,
+ /* key: 0x5b0d */ 0xffff,
+ /* key: 0x5b0e */ 0xffff,
+ /* key: 0x5b0f */ 0xffff,
+ /* key: 0x5b10 */ 0xffff,
+ /* key: 0x5b11 */ 0xffff,
+ /* key: 0x5b12 */ 0xffff,
+ /* key: 0x5b13 */ 0xffff,
+ /* key: 0x5b14 */ 0xffff,
+ /* key: 0x5b15 */ 0xffff,
+ /* key: 0x5b16 */ 0x554a,
+ /* key: 0x5b17 */ 0xba31,
+ /* key: 0x5b18 */ 0xffff,
+ /* key: 0x5b19 */ 0xba33,
+ /* key: 0x5b1a */ 0xffff,
+ /* key: 0x5b1b */ 0xba34,
+ /* key: 0x5b1c */ 0xffff,
+ /* key: 0x5b1d */ 0xba35,
+ /* key: 0x5b1e */ 0xffff,
+ /* key: 0x5b1f */ 0xffff,
+ /* key: 0x5b20 */ 0xffff,
+ /* key: 0x5b21 */ 0xba36,
+ /* key: 0x5b22 */ 0x3e6e,
+ /* key: 0x5b23 */ 0xffff,
+ /* key: 0x5b24 */ 0xffff,
+ /* key: 0x5b25 */ 0xba37,
+ /* key: 0x5b26 */ 0xffff,
+ /* key: 0x5b27 */ 0xffff,
+ /* key: 0x5b28 */ 0xffff,
+ /* key: 0x5b29 */ 0xffff,
+ /* key: 0x5b2a */ 0x554d,
+ /* key: 0x5b2b */ 0xffff,
+ /* key: 0x5b2c */ 0x445c,
+ /* key: 0x5b2d */ 0xba38,
+ /* key: 0x5b2e */ 0xffff,
+ /* key: 0x5b2f */ 0xffff,
+ /* key: 0x5b30 */ 0x3145,
+ /* key: 0x5b31 */ 0xffff,
+ /* key: 0x5b32 */ 0x554b,
+ /* key: 0x5b33 */ 0xffff,
+ /* key: 0x5b34 */ 0xba32,
+ /* key: 0x5b35 */ 0xffff,
+ /* key: 0x5b36 */ 0x554e,
+ /* key: 0x5b37 */ 0xffff,
+ /* key: 0x5b38 */ 0xba39,
+ /* key: 0x5b39 */ 0xffff,
+ /* key: 0x5b3a */ 0xffff,
+ /* key: 0x5b3b */ 0xffff,
+ /* key: 0x5b3c */ 0xffff,
+ /* key: 0x5b3d */ 0xffff,
+ /* key: 0x5b3e */ 0x554f,
+ /* key: 0x5b3f */ 0xffff,
+ /* key: 0x5b40 */ 0x5552,
+ /* key: 0x5b41 */ 0xba3a,
+ /* key: 0x5b42 */ 0xffff,
+ /* key: 0x5b43 */ 0x5550,
+ /* key: 0x5b44 */ 0xffff,
+ /* key: 0x5b45 */ 0x5551,
+ /* key: 0x5b46 */ 0xffff,
+ /* key: 0x5b47 */ 0xffff,
+ /* key: 0x5b48 */ 0xffff,
+ /* key: 0x5b49 */ 0xffff,
+ /* key: 0x5b4a */ 0xffff,
+ /* key: 0x5b4b */ 0xba3b,
+ /* key: 0x5b4c */ 0xba3c,
+ /* key: 0x5b4d */ 0xffff,
+ /* key: 0x5b4e */ 0xffff,
+ /* key: 0x5b4f */ 0xffff,
+ /* key: 0x5b50 */ 0x3b52,
+ /* key: 0x5b51 */ 0x5553,
+ /* key: 0x5b52 */ 0xba3d,
+ /* key: 0x5b53 */ 0xffff,
+ /* key: 0x5b54 */ 0x3926,
+ /* key: 0x5b55 */ 0x5554,
+ /* key: 0x5b56 */ 0xba3e,
+ /* key: 0x5b57 */ 0x3b7a,
+ /* key: 0x5b58 */ 0x4238,
+ /* key: 0x5b59 */ 0xffff,
+ /* key: 0x5b5a */ 0x5555,
+ /* key: 0x5b5b */ 0x5556,
+ /* key: 0x5b5c */ 0x3b5a,
+ /* key: 0x5b5d */ 0x3927,
+ /* key: 0x5b5e */ 0xba3f,
+ /* key: 0x5b5f */ 0x4c52,
+ /* key: 0x5b60 */ 0xffff,
+ /* key: 0x5b61 */ 0xffff,
+ /* key: 0x5b62 */ 0xffff,
+ /* key: 0x5b63 */ 0x3528,
+ /* key: 0x5b64 */ 0x3849,
+ /* key: 0x5b65 */ 0x5557,
+ /* key: 0x5b66 */ 0x3358,
+ /* key: 0x5b67 */ 0xffff,
+ /* key: 0x5b68 */ 0xba40,
+ /* key: 0x5b69 */ 0x5558,
+ /* key: 0x5b6a */ 0xffff,
+ /* key: 0x5b6b */ 0x4239,
+ /* key: 0x5b6c */ 0xffff,
+ /* key: 0x5b6d */ 0xffff,
+ /* key: 0x5b6e */ 0xba41,
+ /* key: 0x5b6f */ 0xba42,
+ /* key: 0x5b70 */ 0x5559,
+ /* key: 0x5b71 */ 0x5623,
+ /* key: 0x5b72 */ 0xffff,
+ /* key: 0x5b73 */ 0x555a,
+ /* key: 0x5b74 */ 0xffff,
+ /* key: 0x5b75 */ 0x555b,
+ /* key: 0x5b76 */ 0xffff,
+ /* key: 0x5b77 */ 0xffff,
+ /* key: 0x5b78 */ 0x555c,
+ /* key: 0x5b79 */ 0xffff,
+ /* key: 0x5b7a */ 0x555e,
+ /* key: 0x5b7b */ 0xffff,
+ /* key: 0x5b7c */ 0xba43,
+ /* key: 0x5b7d */ 0xba44,
+ /* key: 0x5b7e */ 0xba45,
+ /* key: 0x5b7f */ 0xba46,
+ /* key: 0x5b80 */ 0x555f,
+ /* key: 0x5b81 */ 0xba47,
+ /* key: 0x5b82 */ 0xffff,
+ /* key: 0x5b83 */ 0x5560,
+ /* key: 0x5b84 */ 0xba48,
+ /* key: 0x5b85 */ 0x4270,
+ /* key: 0x5b86 */ 0xba49,
+ /* key: 0x5b87 */ 0x3127,
+ /* key: 0x5b88 */ 0x3c69,
+ /* key: 0x5b89 */ 0x3042,
+ /* key: 0x5b8a */ 0xba4a,
+ /* key: 0x5b8b */ 0x4157,
+ /* key: 0x5b8c */ 0x3430,
+ /* key: 0x5b8d */ 0x3c35,
+ /* key: 0x5b8e */ 0xba4b,
+ /* key: 0x5b8f */ 0x3928,
+ /* key: 0x5b90 */ 0xba4c,
+ /* key: 0x5b91 */ 0xba4d,
+ /* key: 0x5b92 */ 0xffff,
+ /* key: 0x5b93 */ 0xba4e,
+ /* key: 0x5b94 */ 0xba4f,
+ /* key: 0x5b95 */ 0x4566,
+ /* key: 0x5b96 */ 0xba50,
+ /* key: 0x5b97 */ 0x3d21,
+ /* key: 0x5b98 */ 0x3431,
+ /* key: 0x5b99 */ 0x4368,
+ /* key: 0x5b9a */ 0x446a,
+ /* key: 0x5b9b */ 0x3038,
+ /* key: 0x5b9c */ 0x3539,
+ /* key: 0x5b9d */ 0x4a75,
+ /* key: 0x5b9e */ 0xffff,
+ /* key: 0x5b9f */ 0x3c42,
+ /* key: 0x5ba0 */ 0xffff,
+ /* key: 0x5ba1 */ 0xffff,
+ /* key: 0x5ba2 */ 0x3552,
+ /* key: 0x5ba3 */ 0x406b,
+ /* key: 0x5ba4 */ 0x3c3c,
+ /* key: 0x5ba5 */ 0x4d28,
+ /* key: 0x5ba6 */ 0x5561,
+ /* key: 0x5ba7 */ 0xffff,
+ /* key: 0x5ba8 */ 0xba51,
+ /* key: 0x5ba9 */ 0xba52,
+ /* key: 0x5baa */ 0xffff,
+ /* key: 0x5bab */ 0xffff,
+ /* key: 0x5bac */ 0xba53,
+ /* key: 0x5bad */ 0xba54,
+ /* key: 0x5bae */ 0x355c,
+ /* key: 0x5baf */ 0xba55,
+ /* key: 0x5bb0 */ 0x3a4b,
+ /* key: 0x5bb1 */ 0xba56,
+ /* key: 0x5bb2 */ 0xba57,
+ /* key: 0x5bb3 */ 0x3332,
+ /* key: 0x5bb4 */ 0x3163,
+ /* key: 0x5bb5 */ 0x3e2c,
+ /* key: 0x5bb6 */ 0x3248,
+ /* key: 0x5bb7 */ 0xba58,
+ /* key: 0x5bb8 */ 0x5562,
+ /* key: 0x5bb9 */ 0x4d46,
+ /* key: 0x5bba */ 0xba59,
+ /* key: 0x5bbb */ 0xffff,
+ /* key: 0x5bbc */ 0xba5a,
+ /* key: 0x5bbd */ 0xffff,
+ /* key: 0x5bbe */ 0xffff,
+ /* key: 0x5bbf */ 0x3d49,
+ /* key: 0x5bc0 */ 0xba5b,
+ /* key: 0x5bc1 */ 0xba5c,
+ /* key: 0x5bc2 */ 0x3c64,
+ /* key: 0x5bc3 */ 0x5563,
+ /* key: 0x5bc4 */ 0x3473,
+ /* key: 0x5bc5 */ 0x4652,
+ /* key: 0x5bc6 */ 0x4c29,
+ /* key: 0x5bc7 */ 0x5564,
+ /* key: 0x5bc8 */ 0xffff,
+ /* key: 0x5bc9 */ 0x5565,
+ /* key: 0x5bca */ 0xffff,
+ /* key: 0x5bcb */ 0xffff,
+ /* key: 0x5bcc */ 0x4959,
+ /* key: 0x5bcd */ 0xba5d,
+ /* key: 0x5bce */ 0xffff,
+ /* key: 0x5bcf */ 0xba5e,
+ /* key: 0x5bd0 */ 0x5567,
+ /* key: 0x5bd1 */ 0xffff,
+ /* key: 0x5bd2 */ 0x3428,
+ /* key: 0x5bd3 */ 0x3677,
+ /* key: 0x5bd4 */ 0x5566,
+ /* key: 0x5bd5 */ 0xffff,
+ /* key: 0x5bd6 */ 0xba5f,
+ /* key: 0x5bd7 */ 0xba60,
+ /* key: 0x5bd8 */ 0xba61,
+ /* key: 0x5bd9 */ 0xba62,
+ /* key: 0x5bda */ 0xba63,
+ /* key: 0x5bdb */ 0x3432,
+ /* key: 0x5bdc */ 0xffff,
+ /* key: 0x5bdd */ 0x3f32,
+ /* key: 0x5bde */ 0x556b,
+ /* key: 0x5bdf */ 0x3b21,
+ /* key: 0x5be0 */ 0xba64,
+ /* key: 0x5be1 */ 0x3249,
+ /* key: 0x5be2 */ 0x556a,
+ /* key: 0x5be3 */ 0xffff,
+ /* key: 0x5be4 */ 0x5568,
+ /* key: 0x5be5 */ 0x556c,
+ /* key: 0x5be6 */ 0x5569,
+ /* key: 0x5be7 */ 0x472b,
+ /* key: 0x5be8 */ 0x5c4d,
+ /* key: 0x5be9 */ 0x3f33,
+ /* key: 0x5bea */ 0xffff,
+ /* key: 0x5beb */ 0x556d,
+ /* key: 0x5bec */ 0xffff,
+ /* key: 0x5bed */ 0xffff,
+ /* key: 0x5bee */ 0x4e40,
+ /* key: 0x5bef */ 0xba65,
+ /* key: 0x5bf0 */ 0x556e,
+ /* key: 0x5bf1 */ 0xba66,
+ /* key: 0x5bf2 */ 0xffff,
+ /* key: 0x5bf3 */ 0x5570,
+ /* key: 0x5bf4 */ 0xba67,
+ /* key: 0x5bf5 */ 0x437e,
+ /* key: 0x5bf6 */ 0x556f,
+ /* key: 0x5bf7 */ 0xffff,
+ /* key: 0x5bf8 */ 0x4023,
+ /* key: 0x5bf9 */ 0xffff,
+ /* key: 0x5bfa */ 0x3b7b,
+ /* key: 0x5bfb */ 0xffff,
+ /* key: 0x5bfc */ 0xffff,
+ /* key: 0x5bfd */ 0xba68,
+ /* key: 0x5bfe */ 0x4250,
+ /* key: 0x5bff */ 0x3c77,
+ /* branch: 0x5c0X */ 5408,
+ /* branch: 0x5c1X */ 5424,
+ /* branch: 0x5c2X */ 5440,
+ /* branch: 0x5c3X */ 5456,
+ /* branch: 0x5c4X */ 5472,
+ /* branch: 0x5c5X */ 5488,
+ /* branch: 0x5c6X */ 5504,
+ /* branch: 0x5c7X */ 5520,
+ /* branch: 0x5c8X */ 5536,
+ /* branch: 0x5c9X */ 5552,
+ /* branch: 0x5caX */ 5568,
+ /* branch: 0x5cbX */ 5584,
+ /* branch: 0x5ccX */ 5600,
+ /* branch: 0x5cdX */ 5616,
+ /* branch: 0x5ceX */ 5632,
+ /* branch: 0x5cfX */ 5648,
+ /* key: 0x5c00 */ 0xffff,
+ /* key: 0x5c01 */ 0x4975,
+ /* key: 0x5c02 */ 0x406c,
+ /* key: 0x5c03 */ 0xffff,
+ /* key: 0x5c04 */ 0x3c4d,
+ /* key: 0x5c05 */ 0x5571,
+ /* key: 0x5c06 */ 0x3e2d,
+ /* key: 0x5c07 */ 0x5572,
+ /* key: 0x5c08 */ 0x5573,
+ /* key: 0x5c09 */ 0x3053,
+ /* key: 0x5c0a */ 0x423a,
+ /* key: 0x5c0b */ 0x3f52,
+ /* key: 0x5c0c */ 0xba69,
+ /* key: 0x5c0d */ 0x5574,
+ /* key: 0x5c0e */ 0x4633,
+ /* key: 0x5c0f */ 0x3e2e,
+ /* key: 0x5c10 */ 0xffff,
+ /* key: 0x5c11 */ 0x3e2f,
+ /* key: 0x5c12 */ 0xffff,
+ /* key: 0x5c13 */ 0x5575,
+ /* key: 0x5c14 */ 0xffff,
+ /* key: 0x5c15 */ 0xffff,
+ /* key: 0x5c16 */ 0x406d,
+ /* key: 0x5c17 */ 0xba6a,
+ /* key: 0x5c18 */ 0xffff,
+ /* key: 0x5c19 */ 0xffff,
+ /* key: 0x5c1a */ 0x3e30,
+ /* key: 0x5c1b */ 0xffff,
+ /* key: 0x5c1c */ 0xffff,
+ /* key: 0x5c1d */ 0xffff,
+ /* key: 0x5c1e */ 0xba6b,
+ /* key: 0x5c1f */ 0xba6c,
+ /* key: 0x5c20 */ 0x5576,
+ /* key: 0x5c21 */ 0xffff,
+ /* key: 0x5c22 */ 0x5577,
+ /* key: 0x5c23 */ 0xba6d,
+ /* key: 0x5c24 */ 0x4c60,
+ /* key: 0x5c25 */ 0xffff,
+ /* key: 0x5c26 */ 0xba6e,
+ /* key: 0x5c27 */ 0xffff,
+ /* key: 0x5c28 */ 0x5578,
+ /* key: 0x5c29 */ 0xba6f,
+ /* key: 0x5c2a */ 0xffff,
+ /* key: 0x5c2b */ 0xba70,
+ /* key: 0x5c2c */ 0xba71,
+ /* key: 0x5c2d */ 0x3646,
+ /* key: 0x5c2e */ 0xba72,
+ /* key: 0x5c2f */ 0xffff,
+ /* key: 0x5c30 */ 0xba73,
+ /* key: 0x5c31 */ 0x3d22,
+ /* key: 0x5c32 */ 0xba74,
+ /* key: 0x5c33 */ 0xffff,
+ /* key: 0x5c34 */ 0xffff,
+ /* key: 0x5c35 */ 0xba75,
+ /* key: 0x5c36 */ 0xba76,
+ /* key: 0x5c37 */ 0xffff,
+ /* key: 0x5c38 */ 0x5579,
+ /* key: 0x5c39 */ 0x557a,
+ /* key: 0x5c3a */ 0x3c5c,
+ /* key: 0x5c3b */ 0x3f2c,
+ /* key: 0x5c3c */ 0x4674,
+ /* key: 0x5c3d */ 0x3f54,
+ /* key: 0x5c3e */ 0x4878,
+ /* key: 0x5c3f */ 0x4722,
+ /* key: 0x5c40 */ 0x3649,
+ /* key: 0x5c41 */ 0x557b,
+ /* key: 0x5c42 */ 0xffff,
+ /* key: 0x5c43 */ 0xffff,
+ /* key: 0x5c44 */ 0xffff,
+ /* key: 0x5c45 */ 0x356f,
+ /* key: 0x5c46 */ 0x557c,
+ /* key: 0x5c47 */ 0xffff,
+ /* key: 0x5c48 */ 0x367e,
+ /* key: 0x5c49 */ 0xffff,
+ /* key: 0x5c4a */ 0x464f,
+ /* key: 0x5c4b */ 0x3230,
+ /* key: 0x5c4c */ 0xffff,
+ /* key: 0x5c4d */ 0x3b53,
+ /* key: 0x5c4e */ 0x557d,
+ /* key: 0x5c4f */ 0x5622,
+ /* key: 0x5c50 */ 0x5621,
+ /* key: 0x5c51 */ 0x367d,
+ /* key: 0x5c52 */ 0xffff,
+ /* key: 0x5c53 */ 0x557e,
+ /* key: 0x5c54 */ 0xffff,
+ /* key: 0x5c55 */ 0x4538,
+ /* key: 0x5c56 */ 0xffff,
+ /* key: 0x5c57 */ 0xffff,
+ /* key: 0x5c58 */ 0xffff,
+ /* key: 0x5c59 */ 0xba77,
+ /* key: 0x5c5a */ 0xba78,
+ /* key: 0x5c5b */ 0xffff,
+ /* key: 0x5c5c */ 0xba79,
+ /* key: 0x5c5d */ 0xffff,
+ /* key: 0x5c5e */ 0x4230,
+ /* key: 0x5c5f */ 0xffff,
+ /* key: 0x5c60 */ 0x454b,
+ /* key: 0x5c61 */ 0x3c48,
+ /* key: 0x5c62 */ 0xba7a,
+ /* key: 0x5c63 */ 0xba7b,
+ /* key: 0x5c64 */ 0x4158,
+ /* key: 0x5c65 */ 0x4d7a,
+ /* key: 0x5c66 */ 0xffff,
+ /* key: 0x5c67 */ 0xba7c,
+ /* key: 0x5c68 */ 0xba7d,
+ /* key: 0x5c69 */ 0xba7e,
+ /* key: 0x5c6a */ 0xffff,
+ /* key: 0x5c6b */ 0xffff,
+ /* key: 0x5c6c */ 0x5624,
+ /* key: 0x5c6d */ 0xbb21,
+ /* key: 0x5c6e */ 0x5625,
+ /* key: 0x5c6f */ 0x4656,
+ /* key: 0x5c70 */ 0xbb22,
+ /* key: 0x5c71 */ 0x3b33,
+ /* key: 0x5c72 */ 0xffff,
+ /* key: 0x5c73 */ 0xffff,
+ /* key: 0x5c74 */ 0xbb23,
+ /* key: 0x5c75 */ 0xbb24,
+ /* key: 0x5c76 */ 0x5627,
+ /* key: 0x5c77 */ 0xffff,
+ /* key: 0x5c78 */ 0xffff,
+ /* key: 0x5c79 */ 0x5628,
+ /* key: 0x5c7a */ 0xbb25,
+ /* key: 0x5c7b */ 0xbb26,
+ /* key: 0x5c7c */ 0xbb27,
+ /* key: 0x5c7d */ 0xbb28,
+ /* key: 0x5c7e */ 0xffff,
+ /* key: 0x5c7f */ 0xffff,
+ /* key: 0x5c80 */ 0xffff,
+ /* key: 0x5c81 */ 0xffff,
+ /* key: 0x5c82 */ 0xffff,
+ /* key: 0x5c83 */ 0xffff,
+ /* key: 0x5c84 */ 0xffff,
+ /* key: 0x5c85 */ 0xffff,
+ /* key: 0x5c86 */ 0xffff,
+ /* key: 0x5c87 */ 0xbb29,
+ /* key: 0x5c88 */ 0xbb2a,
+ /* key: 0x5c89 */ 0xffff,
+ /* key: 0x5c8a */ 0xbb2b,
+ /* key: 0x5c8b */ 0xffff,
+ /* key: 0x5c8c */ 0x5629,
+ /* key: 0x5c8d */ 0xffff,
+ /* key: 0x5c8e */ 0xffff,
+ /* key: 0x5c8f */ 0xbb2c,
+ /* key: 0x5c90 */ 0x3474,
+ /* key: 0x5c91 */ 0x562a,
+ /* key: 0x5c92 */ 0xbb2d,
+ /* key: 0x5c93 */ 0xffff,
+ /* key: 0x5c94 */ 0x562b,
+ /* key: 0x5c95 */ 0xffff,
+ /* key: 0x5c96 */ 0xffff,
+ /* key: 0x5c97 */ 0xffff,
+ /* key: 0x5c98 */ 0xffff,
+ /* key: 0x5c99 */ 0xffff,
+ /* key: 0x5c9a */ 0xffff,
+ /* key: 0x5c9b */ 0xffff,
+ /* key: 0x5c9c */ 0xffff,
+ /* key: 0x5c9d */ 0xbb2e,
+ /* key: 0x5c9e */ 0xffff,
+ /* key: 0x5c9f */ 0xbb2f,
+ /* key: 0x5ca0 */ 0xbb30,
+ /* key: 0x5ca1 */ 0x322c,
+ /* key: 0x5ca2 */ 0xbb31,
+ /* key: 0x5ca3 */ 0xbb32,
+ /* key: 0x5ca4 */ 0xffff,
+ /* key: 0x5ca5 */ 0xffff,
+ /* key: 0x5ca6 */ 0xbb33,
+ /* key: 0x5ca7 */ 0xffff,
+ /* key: 0x5ca8 */ 0x413b,
+ /* key: 0x5ca9 */ 0x3464,
+ /* key: 0x5caa */ 0xbb34,
+ /* key: 0x5cab */ 0x562d,
+ /* key: 0x5cac */ 0x4c28,
+ /* key: 0x5cad */ 0xffff,
+ /* key: 0x5cae */ 0xffff,
+ /* key: 0x5caf */ 0xffff,
+ /* key: 0x5cb0 */ 0xffff,
+ /* key: 0x5cb1 */ 0x4252,
+ /* key: 0x5cb2 */ 0xbb35,
+ /* key: 0x5cb3 */ 0x3359,
+ /* key: 0x5cb4 */ 0xbb36,
+ /* key: 0x5cb5 */ 0xbb37,
+ /* key: 0x5cb6 */ 0x562f,
+ /* key: 0x5cb7 */ 0x5631,
+ /* key: 0x5cb8 */ 0x345f,
+ /* key: 0x5cb9 */ 0xffff,
+ /* key: 0x5cba */ 0xbb38,
+ /* key: 0x5cbb */ 0x562e,
+ /* key: 0x5cbc */ 0x5630,
+ /* key: 0x5cbd */ 0xffff,
+ /* key: 0x5cbe */ 0x5633,
+ /* key: 0x5cbf */ 0xffff,
+ /* key: 0x5cc0 */ 0xffff,
+ /* key: 0x5cc1 */ 0xffff,
+ /* key: 0x5cc2 */ 0xffff,
+ /* key: 0x5cc3 */ 0xffff,
+ /* key: 0x5cc4 */ 0xffff,
+ /* key: 0x5cc5 */ 0x5632,
+ /* key: 0x5cc6 */ 0xffff,
+ /* key: 0x5cc7 */ 0x5634,
+ /* key: 0x5cc8 */ 0xffff,
+ /* key: 0x5cc9 */ 0xbb39,
+ /* key: 0x5cca */ 0xffff,
+ /* key: 0x5ccb */ 0xbb3a,
+ /* key: 0x5ccc */ 0xffff,
+ /* key: 0x5ccd */ 0xffff,
+ /* key: 0x5cce */ 0xffff,
+ /* key: 0x5ccf */ 0xffff,
+ /* key: 0x5cd0 */ 0xffff,
+ /* key: 0x5cd1 */ 0xffff,
+ /* key: 0x5cd2 */ 0xbb3b,
+ /* key: 0x5cd3 */ 0xffff,
+ /* key: 0x5cd4 */ 0xffff,
+ /* key: 0x5cd5 */ 0xffff,
+ /* key: 0x5cd6 */ 0xffff,
+ /* key: 0x5cd7 */ 0xbb3d,
+ /* key: 0x5cd8 */ 0xffff,
+ /* key: 0x5cd9 */ 0x5635,
+ /* key: 0x5cda */ 0xffff,
+ /* key: 0x5cdb */ 0xffff,
+ /* key: 0x5cdc */ 0xffff,
+ /* key: 0x5cdd */ 0xbb3c,
+ /* key: 0x5cde */ 0xffff,
+ /* key: 0x5cdf */ 0xffff,
+ /* key: 0x5ce0 */ 0x463d,
+ /* key: 0x5ce1 */ 0x362e,
+ /* key: 0x5ce2 */ 0xffff,
+ /* key: 0x5ce3 */ 0xffff,
+ /* key: 0x5ce4 */ 0xffff,
+ /* key: 0x5ce5 */ 0xffff,
+ /* key: 0x5ce6 */ 0xffff,
+ /* key: 0x5ce7 */ 0xffff,
+ /* key: 0x5ce8 */ 0x3265,
+ /* key: 0x5ce9 */ 0x5636,
+ /* key: 0x5cea */ 0x563b,
+ /* key: 0x5ceb */ 0xffff,
+ /* key: 0x5cec */ 0xffff,
+ /* key: 0x5ced */ 0x5639,
+ /* key: 0x5cee */ 0xbb3e,
+ /* key: 0x5cef */ 0x4a77,
+ /* key: 0x5cf0 */ 0x4a76,
+ /* key: 0x5cf1 */ 0xbb3f,
+ /* key: 0x5cf2 */ 0xbb40,
+ /* key: 0x5cf3 */ 0xffff,
+ /* key: 0x5cf4 */ 0xbb41,
+ /* key: 0x5cf5 */ 0xffff,
+ /* key: 0x5cf6 */ 0x4567,
+ /* key: 0x5cf7 */ 0xffff,
+ /* key: 0x5cf8 */ 0xffff,
+ /* key: 0x5cf9 */ 0xffff,
+ /* key: 0x5cfa */ 0x5638,
+ /* key: 0x5cfb */ 0x3d54,
+ /* key: 0x5cfc */ 0xffff,
+ /* key: 0x5cfd */ 0x5637,
+ /* key: 0x5cfe */ 0xffff,
+ /* key: 0x5cff */ 0xffff,
+ /* branch: 0x5d0X */ 5680,
+ /* branch: 0x5d1X */ 5696,
+ /* branch: 0x5d2X */ 5712,
+ /* branch: 0x5d3X */ 5728,
+ /* branch: 0x5d4X */ 5744,
+ /* branch: 0x5d5X */ 5760,
+ /* branch: 0x5d6X */ 5776,
+ /* branch: 0x5d7X */ 5792,
+ /* branch: 0x5d8X */ 5808,
+ /* branch: 0x5d9X */ 5824,
+ /* branch: 0x5daX */ 5840,
+ /* branch: 0x5dbX */ 5856,
+ /* branch: 0x5dcX */ 5872,
+ /* branch: 0x5ddX */ 5888,
+ /* branch: 0x5deX */ 5904,
+ /* branch: 0x5dfX */ 5920,
+ /* key: 0x5d00 */ 0xffff,
+ /* key: 0x5d01 */ 0xbb42,
+ /* key: 0x5d02 */ 0xffff,
+ /* key: 0x5d03 */ 0xffff,
+ /* key: 0x5d04 */ 0xffff,
+ /* key: 0x5d05 */ 0xffff,
+ /* key: 0x5d06 */ 0xbb43,
+ /* key: 0x5d07 */ 0x3f72,
+ /* key: 0x5d08 */ 0xffff,
+ /* key: 0x5d09 */ 0xffff,
+ /* key: 0x5d0a */ 0xffff,
+ /* key: 0x5d0b */ 0x563c,
+ /* key: 0x5d0c */ 0xffff,
+ /* key: 0x5d0d */ 0xbb44,
+ /* key: 0x5d0e */ 0x3a6a,
+ /* key: 0x5d0f */ 0xffff,
+ /* key: 0x5d10 */ 0xffff,
+ /* key: 0x5d11 */ 0x5642,
+ /* key: 0x5d12 */ 0xbb45,
+ /* key: 0x5d13 */ 0xffff,
+ /* key: 0x5d14 */ 0x5643,
+ /* key: 0x5d15 */ 0x563d,
+ /* key: 0x5d16 */ 0x3333,
+ /* key: 0x5d17 */ 0x563e,
+ /* key: 0x5d18 */ 0x5647,
+ /* key: 0x5d19 */ 0x5646,
+ /* key: 0x5d1a */ 0x5645,
+ /* key: 0x5d1b */ 0x5641,
+ /* key: 0x5d1c */ 0xffff,
+ /* key: 0x5d1d */ 0xffff,
+ /* key: 0x5d1e */ 0xffff,
+ /* key: 0x5d1f */ 0x5640,
+ /* key: 0x5d20 */ 0xffff,
+ /* key: 0x5d21 */ 0xffff,
+ /* key: 0x5d22 */ 0x5644,
+ /* key: 0x5d23 */ 0xbb47,
+ /* key: 0x5d24 */ 0xbb48,
+ /* key: 0x5d25 */ 0xffff,
+ /* key: 0x5d26 */ 0xbb49,
+ /* key: 0x5d27 */ 0xbb4a,
+ /* key: 0x5d28 */ 0xffff,
+ /* key: 0x5d29 */ 0x4a78,
+ /* key: 0x5d2a */ 0xffff,
+ /* key: 0x5d2b */ 0xbb46,
+ /* key: 0x5d2c */ 0xffff,
+ /* key: 0x5d2d */ 0xffff,
+ /* key: 0x5d2e */ 0xffff,
+ /* key: 0x5d2f */ 0xffff,
+ /* key: 0x5d30 */ 0xffff,
+ /* key: 0x5d31 */ 0xbb4b,
+ /* key: 0x5d32 */ 0xffff,
+ /* key: 0x5d33 */ 0xffff,
+ /* key: 0x5d34 */ 0xbb4c,
+ /* key: 0x5d35 */ 0xffff,
+ /* key: 0x5d36 */ 0xffff,
+ /* key: 0x5d37 */ 0xffff,
+ /* key: 0x5d38 */ 0xffff,
+ /* key: 0x5d39 */ 0xbb4d,
+ /* key: 0x5d3a */ 0xffff,
+ /* key: 0x5d3b */ 0xffff,
+ /* key: 0x5d3c */ 0xffff,
+ /* key: 0x5d3d */ 0xbb4e,
+ /* key: 0x5d3e */ 0xffff,
+ /* key: 0x5d3f */ 0xbb4f,
+ /* key: 0x5d40 */ 0xffff,
+ /* key: 0x5d41 */ 0xffff,
+ /* key: 0x5d42 */ 0xbb50,
+ /* key: 0x5d43 */ 0xbb51,
+ /* key: 0x5d44 */ 0xffff,
+ /* key: 0x5d45 */ 0xffff,
+ /* key: 0x5d46 */ 0xbb52,
+ /* key: 0x5d47 */ 0xffff,
+ /* key: 0x5d48 */ 0xbb53,
+ /* key: 0x5d49 */ 0xffff,
+ /* key: 0x5d4a */ 0xbb57,
+ /* key: 0x5d4b */ 0x564b,
+ /* key: 0x5d4c */ 0x5648,
+ /* key: 0x5d4d */ 0xffff,
+ /* key: 0x5d4e */ 0x564a,
+ /* key: 0x5d4f */ 0xffff,
+ /* key: 0x5d50 */ 0x4d72,
+ /* key: 0x5d51 */ 0xbb55,
+ /* key: 0x5d52 */ 0x5649,
+ /* key: 0x5d53 */ 0xffff,
+ /* key: 0x5d54 */ 0xffff,
+ /* key: 0x5d55 */ 0xbb54,
+ /* key: 0x5d56 */ 0xffff,
+ /* key: 0x5d57 */ 0xffff,
+ /* key: 0x5d58 */ 0xffff,
+ /* key: 0x5d59 */ 0xbb56,
+ /* key: 0x5d5a */ 0xffff,
+ /* key: 0x5d5b */ 0xffff,
+ /* key: 0x5d5c */ 0x563f,
+ /* key: 0x5d5d */ 0xffff,
+ /* key: 0x5d5e */ 0xffff,
+ /* key: 0x5d5f */ 0xbb58,
+ /* key: 0x5d60 */ 0xbb59,
+ /* key: 0x5d61 */ 0xbb5a,
+ /* key: 0x5d62 */ 0xbb5b,
+ /* key: 0x5d63 */ 0xffff,
+ /* key: 0x5d64 */ 0xbb5c,
+ /* key: 0x5d65 */ 0xffff,
+ /* key: 0x5d66 */ 0xffff,
+ /* key: 0x5d67 */ 0xffff,
+ /* key: 0x5d68 */ 0xffff,
+ /* key: 0x5d69 */ 0x3f73,
+ /* key: 0x5d6a */ 0xbb5d,
+ /* key: 0x5d6b */ 0xffff,
+ /* key: 0x5d6c */ 0x564c,
+ /* key: 0x5d6d */ 0xbb5e,
+ /* key: 0x5d6e */ 0xffff,
+ /* key: 0x5d6f */ 0x3a37,
+ /* key: 0x5d70 */ 0xbb5f,
+ /* key: 0x5d71 */ 0xffff,
+ /* key: 0x5d72 */ 0xffff,
+ /* key: 0x5d73 */ 0x564d,
+ /* key: 0x5d74 */ 0xffff,
+ /* key: 0x5d75 */ 0xffff,
+ /* key: 0x5d76 */ 0x564e,
+ /* key: 0x5d77 */ 0xffff,
+ /* key: 0x5d78 */ 0xffff,
+ /* key: 0x5d79 */ 0xbb60,
+ /* key: 0x5d7a */ 0xbb61,
+ /* key: 0x5d7b */ 0xffff,
+ /* key: 0x5d7c */ 0xffff,
+ /* key: 0x5d7d */ 0xffff,
+ /* key: 0x5d7e */ 0xbb62,
+ /* key: 0x5d7f */ 0xbb63,
+ /* key: 0x5d80 */ 0xffff,
+ /* key: 0x5d81 */ 0xbb64,
+ /* key: 0x5d82 */ 0x5651,
+ /* key: 0x5d83 */ 0xbb65,
+ /* key: 0x5d84 */ 0x5650,
+ /* key: 0x5d85 */ 0xffff,
+ /* key: 0x5d86 */ 0xffff,
+ /* key: 0x5d87 */ 0x564f,
+ /* key: 0x5d88 */ 0xbb66,
+ /* key: 0x5d89 */ 0xffff,
+ /* key: 0x5d8a */ 0xbb67,
+ /* key: 0x5d8b */ 0x4568,
+ /* key: 0x5d8c */ 0x563a,
+ /* key: 0x5d8d */ 0xffff,
+ /* key: 0x5d8e */ 0xffff,
+ /* key: 0x5d8f */ 0xffff,
+ /* key: 0x5d90 */ 0x5657,
+ /* key: 0x5d91 */ 0xffff,
+ /* key: 0x5d92 */ 0xbb68,
+ /* key: 0x5d93 */ 0xbb69,
+ /* key: 0x5d94 */ 0xbb6a,
+ /* key: 0x5d95 */ 0xbb6b,
+ /* key: 0x5d96 */ 0xffff,
+ /* key: 0x5d97 */ 0xffff,
+ /* key: 0x5d98 */ 0xffff,
+ /* key: 0x5d99 */ 0xbb6c,
+ /* key: 0x5d9a */ 0xffff,
+ /* key: 0x5d9b */ 0xbb6d,
+ /* key: 0x5d9c */ 0xffff,
+ /* key: 0x5d9d */ 0x5653,
+ /* key: 0x5d9e */ 0xffff,
+ /* key: 0x5d9f */ 0xbb6e,
+ /* key: 0x5da0 */ 0xbb6f,
+ /* key: 0x5da1 */ 0xffff,
+ /* key: 0x5da2 */ 0x5652,
+ /* key: 0x5da3 */ 0xffff,
+ /* key: 0x5da4 */ 0xffff,
+ /* key: 0x5da5 */ 0xffff,
+ /* key: 0x5da6 */ 0xffff,
+ /* key: 0x5da7 */ 0xbb70,
+ /* key: 0x5da8 */ 0xffff,
+ /* key: 0x5da9 */ 0xffff,
+ /* key: 0x5daa */ 0xffff,
+ /* key: 0x5dab */ 0xbb71,
+ /* key: 0x5dac */ 0x5654,
+ /* key: 0x5dad */ 0xffff,
+ /* key: 0x5dae */ 0x5655,
+ /* key: 0x5daf */ 0xffff,
+ /* key: 0x5db0 */ 0xbb72,
+ /* key: 0x5db1 */ 0xffff,
+ /* key: 0x5db2 */ 0xe674,
+ /* key: 0x5db3 */ 0xffff,
+ /* key: 0x5db4 */ 0xbb73,
+ /* key: 0x5db5 */ 0xffff,
+ /* key: 0x5db6 */ 0xffff,
+ /* key: 0x5db7 */ 0x5658,
+ /* key: 0x5db8 */ 0xbb74,
+ /* key: 0x5db9 */ 0xbb75,
+ /* key: 0x5dba */ 0x4e66,
+ /* key: 0x5dbb */ 0xffff,
+ /* key: 0x5dbc */ 0x5659,
+ /* key: 0x5dbd */ 0x5656,
+ /* key: 0x5dbe */ 0xffff,
+ /* key: 0x5dbf */ 0xffff,
+ /* key: 0x5dc0 */ 0xffff,
+ /* key: 0x5dc1 */ 0xffff,
+ /* key: 0x5dc2 */ 0xffff,
+ /* key: 0x5dc3 */ 0xbb76,
+ /* key: 0x5dc4 */ 0xffff,
+ /* key: 0x5dc5 */ 0xffff,
+ /* key: 0x5dc6 */ 0xffff,
+ /* key: 0x5dc7 */ 0xbb77,
+ /* key: 0x5dc8 */ 0xffff,
+ /* key: 0x5dc9 */ 0x565a,
+ /* key: 0x5dca */ 0xffff,
+ /* key: 0x5dcb */ 0xbb78,
+ /* key: 0x5dcc */ 0x3460,
+ /* key: 0x5dcd */ 0x565b,
+ /* key: 0x5dce */ 0xbb7a,
+ /* key: 0x5dcf */ 0xffff,
+ /* key: 0x5dd0 */ 0xbb79,
+ /* key: 0x5dd1 */ 0xffff,
+ /* key: 0x5dd2 */ 0x565d,
+ /* key: 0x5dd3 */ 0x565c,
+ /* key: 0x5dd4 */ 0xffff,
+ /* key: 0x5dd5 */ 0xffff,
+ /* key: 0x5dd6 */ 0x565e,
+ /* key: 0x5dd7 */ 0xffff,
+ /* key: 0x5dd8 */ 0xbb7b,
+ /* key: 0x5dd9 */ 0xbb7c,
+ /* key: 0x5dda */ 0xffff,
+ /* key: 0x5ddb */ 0x565f,
+ /* key: 0x5ddc */ 0xffff,
+ /* key: 0x5ddd */ 0x406e,
+ /* key: 0x5dde */ 0x3d23,
+ /* key: 0x5ddf */ 0xffff,
+ /* key: 0x5de0 */ 0xbb7d,
+ /* key: 0x5de1 */ 0x3d64,
+ /* key: 0x5de2 */ 0xffff,
+ /* key: 0x5de3 */ 0x4163,
+ /* key: 0x5de4 */ 0xbb7e,
+ /* key: 0x5de5 */ 0x3929,
+ /* key: 0x5de6 */ 0x3a38,
+ /* key: 0x5de7 */ 0x392a,
+ /* key: 0x5de8 */ 0x3570,
+ /* key: 0x5de9 */ 0xbc21,
+ /* key: 0x5dea */ 0xffff,
+ /* key: 0x5deb */ 0x5660,
+ /* key: 0x5dec */ 0xffff,
+ /* key: 0x5ded */ 0xffff,
+ /* key: 0x5dee */ 0x3a39,
+ /* key: 0x5def */ 0xffff,
+ /* key: 0x5df0 */ 0xffff,
+ /* key: 0x5df1 */ 0x384a,
+ /* key: 0x5df2 */ 0x5661,
+ /* key: 0x5df3 */ 0x4c26,
+ /* key: 0x5df4 */ 0x4743,
+ /* key: 0x5df5 */ 0x5662,
+ /* key: 0x5df6 */ 0xffff,
+ /* key: 0x5df7 */ 0x392b,
+ /* key: 0x5df8 */ 0xbc22,
+ /* key: 0x5df9 */ 0xbc23,
+ /* key: 0x5dfa */ 0xffff,
+ /* key: 0x5dfb */ 0x342c,
+ /* key: 0x5dfc */ 0xffff,
+ /* key: 0x5dfd */ 0x4327,
+ /* key: 0x5dfe */ 0x3652,
+ /* key: 0x5dff */ 0xffff,
+ /* branch: 0x5e0X */ 5952,
+ /* branch: 0x5e1X */ 5968,
+ /* branch: 0x5e2X */ 5984,
+ /* branch: 0x5e3X */ 6000,
+ /* branch: 0x5e4X */ 6016,
+ /* branch: 0x5e5X */ 6032,
+ /* branch: 0x5e6X */ 6048,
+ /* branch: 0x5e7X */ 6064,
+ /* branch: 0x5e8X */ 6080,
+ /* branch: 0x5e9X */ 6096,
+ /* branch: 0x5eaX */ 6112,
+ /* branch: 0x5ebX */ 6128,
+ /* branch: 0x5ecX */ 6144,
+ /* branch: 0x5edX */ 6160,
+ /* branch: 0x5eeX */ 6176,
+ /* branch: 0x5efX */ 6192,
+ /* key: 0x5e00 */ 0xbc24,
+ /* key: 0x5e01 */ 0xffff,
+ /* key: 0x5e02 */ 0x3b54,
+ /* key: 0x5e03 */ 0x495b,
+ /* key: 0x5e04 */ 0xffff,
+ /* key: 0x5e05 */ 0xffff,
+ /* key: 0x5e06 */ 0x4841,
+ /* key: 0x5e07 */ 0xbc25,
+ /* key: 0x5e08 */ 0xffff,
+ /* key: 0x5e09 */ 0xffff,
+ /* key: 0x5e0a */ 0xffff,
+ /* key: 0x5e0b */ 0x5663,
+ /* key: 0x5e0c */ 0x3475,
+ /* key: 0x5e0d */ 0xbc26,
+ /* key: 0x5e0e */ 0xffff,
+ /* key: 0x5e0f */ 0xffff,
+ /* key: 0x5e10 */ 0xffff,
+ /* key: 0x5e11 */ 0x5666,
+ /* key: 0x5e12 */ 0xbc27,
+ /* key: 0x5e13 */ 0xffff,
+ /* key: 0x5e14 */ 0xbc28,
+ /* key: 0x5e15 */ 0xbc29,
+ /* key: 0x5e16 */ 0x4421,
+ /* key: 0x5e17 */ 0xffff,
+ /* key: 0x5e18 */ 0xbc2a,
+ /* key: 0x5e19 */ 0x5665,
+ /* key: 0x5e1a */ 0x5664,
+ /* key: 0x5e1b */ 0x5667,
+ /* key: 0x5e1c */ 0xffff,
+ /* key: 0x5e1d */ 0x446b,
+ /* key: 0x5e1e */ 0xffff,
+ /* key: 0x5e1f */ 0xbc2b,
+ /* key: 0x5e20 */ 0xbc2c,
+ /* key: 0x5e21 */ 0xffff,
+ /* key: 0x5e22 */ 0xffff,
+ /* key: 0x5e23 */ 0xffff,
+ /* key: 0x5e24 */ 0xffff,
+ /* key: 0x5e25 */ 0x3f63,
+ /* key: 0x5e26 */ 0xffff,
+ /* key: 0x5e27 */ 0xffff,
+ /* key: 0x5e28 */ 0xbc2e,
+ /* key: 0x5e29 */ 0xffff,
+ /* key: 0x5e2a */ 0xffff,
+ /* key: 0x5e2b */ 0x3b55,
+ /* key: 0x5e2c */ 0xffff,
+ /* key: 0x5e2d */ 0x404a,
+ /* key: 0x5e2e */ 0xbc2d,
+ /* key: 0x5e2f */ 0x4253,
+ /* key: 0x5e30 */ 0x3522,
+ /* key: 0x5e31 */ 0xffff,
+ /* key: 0x5e32 */ 0xbc2f,
+ /* key: 0x5e33 */ 0x4422,
+ /* key: 0x5e34 */ 0xffff,
+ /* key: 0x5e35 */ 0xbc30,
+ /* key: 0x5e36 */ 0x5668,
+ /* key: 0x5e37 */ 0x5669,
+ /* key: 0x5e38 */ 0x3e6f,
+ /* key: 0x5e39 */ 0xffff,
+ /* key: 0x5e3a */ 0xffff,
+ /* key: 0x5e3b */ 0xffff,
+ /* key: 0x5e3c */ 0xffff,
+ /* key: 0x5e3d */ 0x4b39,
+ /* key: 0x5e3e */ 0xbc31,
+ /* key: 0x5e3f */ 0xffff,
+ /* key: 0x5e40 */ 0x566c,
+ /* key: 0x5e41 */ 0xffff,
+ /* key: 0x5e42 */ 0xffff,
+ /* key: 0x5e43 */ 0x566b,
+ /* key: 0x5e44 */ 0x566a,
+ /* key: 0x5e45 */ 0x497d,
+ /* key: 0x5e46 */ 0xffff,
+ /* key: 0x5e47 */ 0x5673,
+ /* key: 0x5e48 */ 0xffff,
+ /* key: 0x5e49 */ 0xbc34,
+ /* key: 0x5e4a */ 0xffff,
+ /* key: 0x5e4b */ 0xbc32,
+ /* key: 0x5e4c */ 0x4b5a,
+ /* key: 0x5e4d */ 0xffff,
+ /* key: 0x5e4e */ 0x566d,
+ /* key: 0x5e4f */ 0xffff,
+ /* key: 0x5e50 */ 0xbc33,
+ /* key: 0x5e51 */ 0xbc35,
+ /* key: 0x5e52 */ 0xffff,
+ /* key: 0x5e53 */ 0xffff,
+ /* key: 0x5e54 */ 0x566f,
+ /* key: 0x5e55 */ 0x4b6b,
+ /* key: 0x5e56 */ 0xbc36,
+ /* key: 0x5e57 */ 0x566e,
+ /* key: 0x5e58 */ 0xbc37,
+ /* key: 0x5e59 */ 0xffff,
+ /* key: 0x5e5a */ 0xffff,
+ /* key: 0x5e5b */ 0xbc38,
+ /* key: 0x5e5c */ 0xbc39,
+ /* key: 0x5e5d */ 0xffff,
+ /* key: 0x5e5e */ 0xbc3a,
+ /* key: 0x5e5f */ 0x5670,
+ /* key: 0x5e60 */ 0xffff,
+ /* key: 0x5e61 */ 0x4828,
+ /* key: 0x5e62 */ 0x5671,
+ /* key: 0x5e63 */ 0x4a3e,
+ /* key: 0x5e64 */ 0x5672,
+ /* key: 0x5e65 */ 0xffff,
+ /* key: 0x5e66 */ 0xffff,
+ /* key: 0x5e67 */ 0xffff,
+ /* key: 0x5e68 */ 0xbc3b,
+ /* key: 0x5e69 */ 0xffff,
+ /* key: 0x5e6a */ 0xbc3c,
+ /* key: 0x5e6b */ 0xbc3d,
+ /* key: 0x5e6c */ 0xbc3e,
+ /* key: 0x5e6d */ 0xbc3f,
+ /* key: 0x5e6e */ 0xbc40,
+ /* key: 0x5e6f */ 0xffff,
+ /* key: 0x5e70 */ 0xbc41,
+ /* key: 0x5e71 */ 0xffff,
+ /* key: 0x5e72 */ 0x3433,
+ /* key: 0x5e73 */ 0x4a3f,
+ /* key: 0x5e74 */ 0x472f,
+ /* key: 0x5e75 */ 0x5674,
+ /* key: 0x5e76 */ 0x5675,
+ /* key: 0x5e77 */ 0xffff,
+ /* key: 0x5e78 */ 0x392c,
+ /* key: 0x5e79 */ 0x3434,
+ /* key: 0x5e7a */ 0x5676,
+ /* key: 0x5e7b */ 0x3838,
+ /* key: 0x5e7c */ 0x4d44,
+ /* key: 0x5e7d */ 0x4d29,
+ /* key: 0x5e7e */ 0x3476,
+ /* key: 0x5e7f */ 0x5678,
+ /* key: 0x5e80 */ 0xbc42,
+ /* key: 0x5e81 */ 0x4423,
+ /* key: 0x5e82 */ 0xffff,
+ /* key: 0x5e83 */ 0x392d,
+ /* key: 0x5e84 */ 0x3e31,
+ /* key: 0x5e85 */ 0xffff,
+ /* key: 0x5e86 */ 0xffff,
+ /* key: 0x5e87 */ 0x485f,
+ /* key: 0x5e88 */ 0xffff,
+ /* key: 0x5e89 */ 0xffff,
+ /* key: 0x5e8a */ 0x3e32,
+ /* key: 0x5e8b */ 0xbc43,
+ /* key: 0x5e8c */ 0xffff,
+ /* key: 0x5e8d */ 0xffff,
+ /* key: 0x5e8e */ 0xbc44,
+ /* key: 0x5e8f */ 0x3d78,
+ /* key: 0x5e90 */ 0xffff,
+ /* key: 0x5e91 */ 0xffff,
+ /* key: 0x5e92 */ 0xffff,
+ /* key: 0x5e93 */ 0xffff,
+ /* key: 0x5e94 */ 0xffff,
+ /* key: 0x5e95 */ 0x446c,
+ /* key: 0x5e96 */ 0x4a79,
+ /* key: 0x5e97 */ 0x4539,
+ /* key: 0x5e98 */ 0xffff,
+ /* key: 0x5e99 */ 0xffff,
+ /* key: 0x5e9a */ 0x392e,
+ /* key: 0x5e9b */ 0xffff,
+ /* key: 0x5e9c */ 0x495c,
+ /* key: 0x5e9d */ 0xffff,
+ /* key: 0x5e9e */ 0xffff,
+ /* key: 0x5e9f */ 0xffff,
+ /* key: 0x5ea0 */ 0x5679,
+ /* key: 0x5ea1 */ 0xffff,
+ /* key: 0x5ea2 */ 0xbc45,
+ /* key: 0x5ea3 */ 0xffff,
+ /* key: 0x5ea4 */ 0xbc46,
+ /* key: 0x5ea5 */ 0xbc47,
+ /* key: 0x5ea6 */ 0x4559,
+ /* key: 0x5ea7 */ 0x3a42,
+ /* key: 0x5ea8 */ 0xbc48,
+ /* key: 0x5ea9 */ 0xffff,
+ /* key: 0x5eaa */ 0xbc49,
+ /* key: 0x5eab */ 0x384b,
+ /* key: 0x5eac */ 0xbc4a,
+ /* key: 0x5ead */ 0x446d,
+ /* key: 0x5eae */ 0xffff,
+ /* key: 0x5eaf */ 0xffff,
+ /* key: 0x5eb0 */ 0xffff,
+ /* key: 0x5eb1 */ 0xbc4b,
+ /* key: 0x5eb2 */ 0xffff,
+ /* key: 0x5eb3 */ 0xbc4c,
+ /* key: 0x5eb4 */ 0xffff,
+ /* key: 0x5eb5 */ 0x3043,
+ /* key: 0x5eb6 */ 0x3d6e,
+ /* key: 0x5eb7 */ 0x392f,
+ /* key: 0x5eb8 */ 0x4d47,
+ /* key: 0x5eb9 */ 0xffff,
+ /* key: 0x5eba */ 0xffff,
+ /* key: 0x5ebb */ 0xffff,
+ /* key: 0x5ebc */ 0xffff,
+ /* key: 0x5ebd */ 0xbc4d,
+ /* key: 0x5ebe */ 0xbc4e,
+ /* key: 0x5ebf */ 0xbc4f,
+ /* key: 0x5ec0 */ 0xffff,
+ /* key: 0x5ec1 */ 0x567a,
+ /* key: 0x5ec2 */ 0x567b,
+ /* key: 0x5ec3 */ 0x4751,
+ /* key: 0x5ec4 */ 0xffff,
+ /* key: 0x5ec5 */ 0xffff,
+ /* key: 0x5ec6 */ 0xbc50,
+ /* key: 0x5ec7 */ 0xffff,
+ /* key: 0x5ec8 */ 0x567c,
+ /* key: 0x5ec9 */ 0x4e77,
+ /* key: 0x5eca */ 0x4f2d,
+ /* key: 0x5ecb */ 0xbc52,
+ /* key: 0x5ecc */ 0xbc51,
+ /* key: 0x5ecd */ 0xffff,
+ /* key: 0x5ece */ 0xbc53,
+ /* key: 0x5ecf */ 0x567e,
+ /* key: 0x5ed0 */ 0x567d,
+ /* key: 0x5ed1 */ 0xbc54,
+ /* key: 0x5ed2 */ 0xbc55,
+ /* key: 0x5ed3 */ 0x3347,
+ /* key: 0x5ed4 */ 0xbc56,
+ /* key: 0x5ed5 */ 0xbc57,
+ /* key: 0x5ed6 */ 0x5721,
+ /* key: 0x5ed7 */ 0xffff,
+ /* key: 0x5ed8 */ 0xffff,
+ /* key: 0x5ed9 */ 0xffff,
+ /* key: 0x5eda */ 0x5724,
+ /* key: 0x5edb */ 0x5725,
+ /* key: 0x5edc */ 0xbc58,
+ /* key: 0x5edd */ 0x5723,
+ /* key: 0x5ede */ 0xbc59,
+ /* key: 0x5edf */ 0x4940,
+ /* key: 0x5ee0 */ 0x3e33,
+ /* key: 0x5ee1 */ 0x5727,
+ /* key: 0x5ee2 */ 0x5726,
+ /* key: 0x5ee3 */ 0x5722,
+ /* key: 0x5ee4 */ 0xffff,
+ /* key: 0x5ee5 */ 0xbc5a,
+ /* key: 0x5ee6 */ 0xffff,
+ /* key: 0x5ee7 */ 0xffff,
+ /* key: 0x5ee8 */ 0x5728,
+ /* key: 0x5ee9 */ 0x5729,
+ /* key: 0x5eea */ 0xffff,
+ /* key: 0x5eeb */ 0xbc5b,
+ /* key: 0x5eec */ 0x572a,
+ /* key: 0x5eed */ 0xffff,
+ /* key: 0x5eee */ 0xffff,
+ /* key: 0x5eef */ 0xffff,
+ /* key: 0x5ef0 */ 0x572d,
+ /* key: 0x5ef1 */ 0x572b,
+ /* key: 0x5ef2 */ 0xffff,
+ /* key: 0x5ef3 */ 0x572c,
+ /* key: 0x5ef4 */ 0x572e,
+ /* key: 0x5ef5 */ 0xffff,
+ /* key: 0x5ef6 */ 0x3164,
+ /* key: 0x5ef7 */ 0x446e,
+ /* key: 0x5ef8 */ 0x572f,
+ /* key: 0x5ef9 */ 0xffff,
+ /* key: 0x5efa */ 0x377a,
+ /* key: 0x5efb */ 0x3276,
+ /* key: 0x5efc */ 0x4736,
+ /* key: 0x5efd */ 0xffff,
+ /* key: 0x5efe */ 0x5730,
+ /* key: 0x5eff */ 0x467b,
+ /* branch: 0x5f0X */ 6224,
+ /* branch: 0x5f1X */ 6240,
+ /* branch: 0x5f2X */ 6256,
+ /* branch: 0x5f3X */ 6272,
+ /* branch: 0x5f4X */ 6288,
+ /* branch: 0x5f5X */ 6304,
+ /* branch: 0x5f6X */ 6320,
+ /* branch: 0x5f7X */ 6336,
+ /* branch: 0x5f8X */ 6352,
+ /* branch: 0x5f9X */ 6368,
+ /* branch: 0x5faX */ 6384,
+ /* branch: 0x5fbX */ 6400,
+ /* branch: 0x5fcX */ 6416,
+ /* branch: 0x5fdX */ 6432,
+ /* branch: 0x5feX */ 6448,
+ /* branch: 0x5ffX */ 6464,
+ /* key: 0x5f00 */ 0xffff,
+ /* key: 0x5f01 */ 0x4a5b,
+ /* key: 0x5f02 */ 0xbc5c,
+ /* key: 0x5f03 */ 0x5731,
+ /* key: 0x5f04 */ 0x4f2e,
+ /* key: 0x5f05 */ 0xffff,
+ /* key: 0x5f06 */ 0xbc5d,
+ /* key: 0x5f07 */ 0xbc5e,
+ /* key: 0x5f08 */ 0xbc5f,
+ /* key: 0x5f09 */ 0x5732,
+ /* key: 0x5f0a */ 0x4a40,
+ /* key: 0x5f0b */ 0x5735,
+ /* key: 0x5f0c */ 0x5021,
+ /* key: 0x5f0d */ 0x5031,
+ /* key: 0x5f0e */ 0xbc60,
+ /* key: 0x5f0f */ 0x3c30,
+ /* key: 0x5f10 */ 0x4675,
+ /* key: 0x5f11 */ 0x5736,
+ /* key: 0x5f12 */ 0xffff,
+ /* key: 0x5f13 */ 0x355d,
+ /* key: 0x5f14 */ 0x4424,
+ /* key: 0x5f15 */ 0x307a,
+ /* key: 0x5f16 */ 0x5737,
+ /* key: 0x5f17 */ 0x4a26,
+ /* key: 0x5f18 */ 0x3930,
+ /* key: 0x5f19 */ 0xbc61,
+ /* key: 0x5f1a */ 0xffff,
+ /* key: 0x5f1b */ 0x4350,
+ /* key: 0x5f1c */ 0xbc62,
+ /* key: 0x5f1d */ 0xbc63,
+ /* key: 0x5f1e */ 0xffff,
+ /* key: 0x5f1f */ 0x446f,
+ /* key: 0x5f20 */ 0xffff,
+ /* key: 0x5f21 */ 0xbc64,
+ /* key: 0x5f22 */ 0xbc65,
+ /* key: 0x5f23 */ 0xbc66,
+ /* key: 0x5f24 */ 0xbc67,
+ /* key: 0x5f25 */ 0x4c6f,
+ /* key: 0x5f26 */ 0x3839,
+ /* key: 0x5f27 */ 0x384c,
+ /* key: 0x5f28 */ 0xbc68,
+ /* key: 0x5f29 */ 0x5738,
+ /* key: 0x5f2a */ 0xffff,
+ /* key: 0x5f2b */ 0xbc69,
+ /* key: 0x5f2c */ 0xbc6a,
+ /* key: 0x5f2d */ 0x5739,
+ /* key: 0x5f2e */ 0xbc6b,
+ /* key: 0x5f2f */ 0x573f,
+ /* key: 0x5f30 */ 0xbc6c,
+ /* key: 0x5f31 */ 0x3c65,
+ /* key: 0x5f32 */ 0xffff,
+ /* key: 0x5f33 */ 0xffff,
+ /* key: 0x5f34 */ 0xbc6d,
+ /* key: 0x5f35 */ 0x4425,
+ /* key: 0x5f36 */ 0xbc6e,
+ /* key: 0x5f37 */ 0x362f,
+ /* key: 0x5f38 */ 0x573a,
+ /* key: 0x5f39 */ 0xffff,
+ /* key: 0x5f3a */ 0xffff,
+ /* key: 0x5f3b */ 0xbc6f,
+ /* key: 0x5f3c */ 0x492b,
+ /* key: 0x5f3d */ 0xbc70,
+ /* key: 0x5f3e */ 0x4346,
+ /* key: 0x5f3f */ 0xbc71,
+ /* key: 0x5f40 */ 0xbc72,
+ /* key: 0x5f41 */ 0x573b,
+ /* key: 0x5f42 */ 0xffff,
+ /* key: 0x5f43 */ 0xffff,
+ /* key: 0x5f44 */ 0xbc73,
+ /* key: 0x5f45 */ 0xbc74,
+ /* key: 0x5f46 */ 0xffff,
+ /* key: 0x5f47 */ 0xbc75,
+ /* key: 0x5f48 */ 0x573c,
+ /* key: 0x5f49 */ 0xffff,
+ /* key: 0x5f4a */ 0x3630,
+ /* key: 0x5f4b */ 0xffff,
+ /* key: 0x5f4c */ 0x573d,
+ /* key: 0x5f4d */ 0xbc76,
+ /* key: 0x5f4e */ 0x573e,
+ /* key: 0x5f4f */ 0xffff,
+ /* key: 0x5f50 */ 0xbc77,
+ /* key: 0x5f51 */ 0x5740,
+ /* key: 0x5f52 */ 0xffff,
+ /* key: 0x5f53 */ 0x4576,
+ /* key: 0x5f54 */ 0xbc78,
+ /* key: 0x5f55 */ 0xffff,
+ /* key: 0x5f56 */ 0x5741,
+ /* key: 0x5f57 */ 0x5742,
+ /* key: 0x5f58 */ 0xbc79,
+ /* key: 0x5f59 */ 0x5743,
+ /* key: 0x5f5a */ 0xffff,
+ /* key: 0x5f5b */ 0xbc7a,
+ /* key: 0x5f5c */ 0x5734,
+ /* key: 0x5f5d */ 0x5733,
+ /* key: 0x5f5e */ 0xffff,
+ /* key: 0x5f5f */ 0xffff,
+ /* key: 0x5f60 */ 0xbc7b,
+ /* key: 0x5f61 */ 0x5744,
+ /* key: 0x5f62 */ 0x3741,
+ /* key: 0x5f63 */ 0xbc7c,
+ /* key: 0x5f64 */ 0xbc7d,
+ /* key: 0x5f65 */ 0xffff,
+ /* key: 0x5f66 */ 0x4927,
+ /* key: 0x5f67 */ 0xbc7e,
+ /* key: 0x5f68 */ 0xffff,
+ /* key: 0x5f69 */ 0x3a4c,
+ /* key: 0x5f6a */ 0x4937,
+ /* key: 0x5f6b */ 0x4426,
+ /* key: 0x5f6c */ 0x494b,
+ /* key: 0x5f6d */ 0x5745,
+ /* key: 0x5f6e */ 0xffff,
+ /* key: 0x5f6f */ 0xbd21,
+ /* key: 0x5f70 */ 0x3e34,
+ /* key: 0x5f71 */ 0x3146,
+ /* key: 0x5f72 */ 0xbd22,
+ /* key: 0x5f73 */ 0x5746,
+ /* key: 0x5f74 */ 0xbd23,
+ /* key: 0x5f75 */ 0xbd24,
+ /* key: 0x5f76 */ 0xffff,
+ /* key: 0x5f77 */ 0x5747,
+ /* key: 0x5f78 */ 0xbd25,
+ /* key: 0x5f79 */ 0x4c72,
+ /* key: 0x5f7a */ 0xbd26,
+ /* key: 0x5f7b */ 0xffff,
+ /* key: 0x5f7c */ 0x4860,
+ /* key: 0x5f7d */ 0xbd27,
+ /* key: 0x5f7e */ 0xbd28,
+ /* key: 0x5f7f */ 0x574a,
+ /* key: 0x5f80 */ 0x317d,
+ /* key: 0x5f81 */ 0x402c,
+ /* key: 0x5f82 */ 0x5749,
+ /* key: 0x5f83 */ 0x5748,
+ /* key: 0x5f84 */ 0x3742,
+ /* key: 0x5f85 */ 0x4254,
+ /* key: 0x5f86 */ 0xffff,
+ /* key: 0x5f87 */ 0x574e,
+ /* key: 0x5f88 */ 0x574c,
+ /* key: 0x5f89 */ 0xbd29,
+ /* key: 0x5f8a */ 0x574b,
+ /* key: 0x5f8b */ 0x4e27,
+ /* key: 0x5f8c */ 0x3865,
+ /* key: 0x5f8d */ 0xbd2a,
+ /* key: 0x5f8e */ 0xffff,
+ /* key: 0x5f8f */ 0xbd2b,
+ /* key: 0x5f90 */ 0x3d79,
+ /* key: 0x5f91 */ 0x574d,
+ /* key: 0x5f92 */ 0x454c,
+ /* key: 0x5f93 */ 0x3d3e,
+ /* key: 0x5f94 */ 0xffff,
+ /* key: 0x5f95 */ 0xffff,
+ /* key: 0x5f96 */ 0xbd2c,
+ /* key: 0x5f97 */ 0x4640,
+ /* key: 0x5f98 */ 0x5751,
+ /* key: 0x5f99 */ 0x5750,
+ /* key: 0x5f9a */ 0xffff,
+ /* key: 0x5f9b */ 0xffff,
+ /* key: 0x5f9c */ 0xbd2d,
+ /* key: 0x5f9d */ 0xbd2e,
+ /* key: 0x5f9e */ 0x574f,
+ /* key: 0x5f9f */ 0xffff,
+ /* key: 0x5fa0 */ 0x5752,
+ /* key: 0x5fa1 */ 0x3866,
+ /* key: 0x5fa2 */ 0xbd2f,
+ /* key: 0x5fa3 */ 0xffff,
+ /* key: 0x5fa4 */ 0xbd32,
+ /* key: 0x5fa5 */ 0xffff,
+ /* key: 0x5fa6 */ 0xffff,
+ /* key: 0x5fa7 */ 0xbd30,
+ /* key: 0x5fa8 */ 0x5753,
+ /* key: 0x5fa9 */ 0x497c,
+ /* key: 0x5faa */ 0x3d5b,
+ /* key: 0x5fab */ 0xbd31,
+ /* key: 0x5fac */ 0xbd33,
+ /* key: 0x5fad */ 0x5754,
+ /* key: 0x5fae */ 0x4879,
+ /* key: 0x5faf */ 0xbd34,
+ /* key: 0x5fb0 */ 0xbd35,
+ /* key: 0x5fb1 */ 0xbd36,
+ /* key: 0x5fb2 */ 0xffff,
+ /* key: 0x5fb3 */ 0x4641,
+ /* key: 0x5fb4 */ 0x4427,
+ /* key: 0x5fb5 */ 0xffff,
+ /* key: 0x5fb6 */ 0xffff,
+ /* key: 0x5fb7 */ 0xffff,
+ /* key: 0x5fb8 */ 0xbd37,
+ /* key: 0x5fb9 */ 0x4530,
+ /* key: 0x5fba */ 0xffff,
+ /* key: 0x5fbb */ 0xffff,
+ /* key: 0x5fbc */ 0x5755,
+ /* key: 0x5fbd */ 0x352b,
+ /* key: 0x5fbe */ 0xffff,
+ /* key: 0x5fbf */ 0xffff,
+ /* key: 0x5fc0 */ 0xffff,
+ /* key: 0x5fc1 */ 0xffff,
+ /* key: 0x5fc2 */ 0xffff,
+ /* key: 0x5fc3 */ 0x3f34,
+ /* key: 0x5fc4 */ 0xbd38,
+ /* key: 0x5fc5 */ 0x492c,
+ /* key: 0x5fc6 */ 0xffff,
+ /* key: 0x5fc7 */ 0xbd39,
+ /* key: 0x5fc8 */ 0xbd3a,
+ /* key: 0x5fc9 */ 0xbd3b,
+ /* key: 0x5fca */ 0xffff,
+ /* key: 0x5fcb */ 0xbd3c,
+ /* key: 0x5fcc */ 0x3477,
+ /* key: 0x5fcd */ 0x4726,
+ /* key: 0x5fce */ 0xffff,
+ /* key: 0x5fcf */ 0xffff,
+ /* key: 0x5fd0 */ 0xbd3d,
+ /* key: 0x5fd1 */ 0xbd3e,
+ /* key: 0x5fd2 */ 0xbd3f,
+ /* key: 0x5fd3 */ 0xbd40,
+ /* key: 0x5fd4 */ 0xbd41,
+ /* key: 0x5fd5 */ 0xffff,
+ /* key: 0x5fd6 */ 0x5756,
+ /* key: 0x5fd7 */ 0x3b56,
+ /* key: 0x5fd8 */ 0x4b3a,
+ /* key: 0x5fd9 */ 0x4b3b,
+ /* key: 0x5fda */ 0xffff,
+ /* key: 0x5fdb */ 0xffff,
+ /* key: 0x5fdc */ 0x317e,
+ /* key: 0x5fdd */ 0x575b,
+ /* key: 0x5fde */ 0xbd42,
+ /* key: 0x5fdf */ 0xffff,
+ /* key: 0x5fe0 */ 0x4369,
+ /* key: 0x5fe1 */ 0xbd43,
+ /* key: 0x5fe2 */ 0xbd44,
+ /* key: 0x5fe3 */ 0xffff,
+ /* key: 0x5fe4 */ 0x5758,
+ /* key: 0x5fe5 */ 0xffff,
+ /* key: 0x5fe6 */ 0xffff,
+ /* key: 0x5fe7 */ 0xffff,
+ /* key: 0x5fe8 */ 0xbd45,
+ /* key: 0x5fe9 */ 0xbd46,
+ /* key: 0x5fea */ 0xbd47,
+ /* key: 0x5feb */ 0x3277,
+ /* key: 0x5fec */ 0xbd48,
+ /* key: 0x5fed */ 0xbd49,
+ /* key: 0x5fee */ 0xbd4a,
+ /* key: 0x5fef */ 0xbd4b,
+ /* key: 0x5ff0 */ 0x582d,
+ /* key: 0x5ff1 */ 0x575a,
+ /* key: 0x5ff2 */ 0xbd4c,
+ /* key: 0x5ff3 */ 0xbd4d,
+ /* key: 0x5ff4 */ 0xffff,
+ /* key: 0x5ff5 */ 0x4730,
+ /* key: 0x5ff6 */ 0xbd4e,
+ /* key: 0x5ff7 */ 0xffff,
+ /* key: 0x5ff8 */ 0x5759,
+ /* key: 0x5ff9 */ 0xffff,
+ /* key: 0x5ffa */ 0xbd4f,
+ /* key: 0x5ffb */ 0x5757,
+ /* key: 0x5ffc */ 0xbd50,
+ /* key: 0x5ffd */ 0x397a,
+ /* key: 0x5ffe */ 0xffff,
+ /* key: 0x5fff */ 0x575d,
+ /* branch: 0x60XX */ 6496,
+ /* branch: 0x61XX */ 6768,
+ /* branch: 0x62XX */ 7040,
+ /* branch: 0x63XX */ 7312,
+ /* branch: 0x64XX */ 7584,
+ /* branch: 0x65XX */ 7856,
+ /* branch: 0x66XX */ 8128,
+ /* branch: 0x67XX */ 8400,
+ /* branch: 0x68XX */ 8672,
+ /* branch: 0x69XX */ 8944,
+ /* branch: 0x6aXX */ 9216,
+ /* branch: 0x6bXX */ 9488,
+ /* branch: 0x6cXX */ 9760,
+ /* branch: 0x6dXX */ 10032,
+ /* branch: 0x6eXX */ 10304,
+ /* branch: 0x6fXX */ 10576,
+ /* branch: 0x600X */ 6512,
+ /* branch: 0x601X */ 6528,
+ /* branch: 0x602X */ 6544,
+ /* branch: 0x603X */ 6560,
+ /* branch: 0x604X */ 6576,
+ /* branch: 0x605X */ 6592,
+ /* branch: 0x606X */ 6608,
+ /* branch: 0x607X */ 6624,
+ /* branch: 0x608X */ 6640,
+ /* branch: 0x609X */ 6656,
+ /* branch: 0x60aX */ 6672,
+ /* branch: 0x60bX */ 6688,
+ /* branch: 0x60cX */ 6704,
+ /* branch: 0x60dX */ 6720,
+ /* branch: 0x60eX */ 6736,
+ /* branch: 0x60fX */ 6752,
+ /* key: 0x6000 */ 0xffff,
+ /* key: 0x6001 */ 0xffff,
+ /* key: 0x6002 */ 0xffff,
+ /* key: 0x6003 */ 0xffff,
+ /* key: 0x6004 */ 0xffff,
+ /* key: 0x6005 */ 0xffff,
+ /* key: 0x6006 */ 0xffff,
+ /* key: 0x6007 */ 0xbd51,
+ /* key: 0x6008 */ 0xffff,
+ /* key: 0x6009 */ 0xffff,
+ /* key: 0x600a */ 0xbd52,
+ /* key: 0x600b */ 0xffff,
+ /* key: 0x600c */ 0xffff,
+ /* key: 0x600d */ 0xbd53,
+ /* key: 0x600e */ 0x5763,
+ /* key: 0x600f */ 0x5769,
+ /* key: 0x6010 */ 0x5761,
+ /* key: 0x6011 */ 0xffff,
+ /* key: 0x6012 */ 0x455c,
+ /* key: 0x6013 */ 0xbd54,
+ /* key: 0x6014 */ 0xbd55,
+ /* key: 0x6015 */ 0x5766,
+ /* key: 0x6016 */ 0x495d,
+ /* key: 0x6017 */ 0xbd56,
+ /* key: 0x6018 */ 0xbd57,
+ /* key: 0x6019 */ 0x5760,
+ /* key: 0x601a */ 0xbd58,
+ /* key: 0x601b */ 0x5765,
+ /* key: 0x601c */ 0x4e67,
+ /* key: 0x601d */ 0x3b57,
+ /* key: 0x601e */ 0xffff,
+ /* key: 0x601f */ 0xbd59,
+ /* key: 0x6020 */ 0x4255,
+ /* key: 0x6021 */ 0x575e,
+ /* key: 0x6022 */ 0xffff,
+ /* key: 0x6023 */ 0xffff,
+ /* key: 0x6024 */ 0xbd5a,
+ /* key: 0x6025 */ 0x355e,
+ /* key: 0x6026 */ 0x5768,
+ /* key: 0x6027 */ 0x402d,
+ /* key: 0x6028 */ 0x3165,
+ /* key: 0x6029 */ 0x5762,
+ /* key: 0x602a */ 0x3278,
+ /* key: 0x602b */ 0x5767,
+ /* key: 0x602c */ 0xffff,
+ /* key: 0x602d */ 0xbd5b,
+ /* key: 0x602e */ 0xffff,
+ /* key: 0x602f */ 0x3631,
+ /* key: 0x6030 */ 0xffff,
+ /* key: 0x6031 */ 0x5764,
+ /* key: 0x6032 */ 0xffff,
+ /* key: 0x6033 */ 0xbd5c,
+ /* key: 0x6034 */ 0xffff,
+ /* key: 0x6035 */ 0xbd5d,
+ /* key: 0x6036 */ 0xffff,
+ /* key: 0x6037 */ 0xffff,
+ /* key: 0x6038 */ 0xffff,
+ /* key: 0x6039 */ 0xffff,
+ /* key: 0x603a */ 0x576a,
+ /* key: 0x603b */ 0xffff,
+ /* key: 0x603c */ 0xffff,
+ /* key: 0x603d */ 0xffff,
+ /* key: 0x603e */ 0xffff,
+ /* key: 0x603f */ 0xffff,
+ /* key: 0x6040 */ 0xbd5e,
+ /* key: 0x6041 */ 0x576c,
+ /* key: 0x6042 */ 0x5776,
+ /* key: 0x6043 */ 0x5774,
+ /* key: 0x6044 */ 0xffff,
+ /* key: 0x6045 */ 0xffff,
+ /* key: 0x6046 */ 0x5771,
+ /* key: 0x6047 */ 0xbd5f,
+ /* key: 0x6048 */ 0xbd60,
+ /* key: 0x6049 */ 0xbd61,
+ /* key: 0x604a */ 0x5770,
+ /* key: 0x604b */ 0x4e78,
+ /* key: 0x604c */ 0xbd62,
+ /* key: 0x604d */ 0x5772,
+ /* key: 0x604e */ 0xffff,
+ /* key: 0x604f */ 0xffff,
+ /* key: 0x6050 */ 0x3632,
+ /* key: 0x6051 */ 0xbd63,
+ /* key: 0x6052 */ 0x3931,
+ /* key: 0x6053 */ 0xffff,
+ /* key: 0x6054 */ 0xbd64,
+ /* key: 0x6055 */ 0x3d7a,
+ /* key: 0x6056 */ 0xbd65,
+ /* key: 0x6057 */ 0xbd66,
+ /* key: 0x6058 */ 0xffff,
+ /* key: 0x6059 */ 0x5779,
+ /* key: 0x605a */ 0x576b,
+ /* key: 0x605b */ 0xffff,
+ /* key: 0x605c */ 0xffff,
+ /* key: 0x605d */ 0xbd67,
+ /* key: 0x605e */ 0xffff,
+ /* key: 0x605f */ 0x576f,
+ /* key: 0x6060 */ 0x575f,
+ /* key: 0x6061 */ 0xbd68,
+ /* key: 0x6062 */ 0x327a,
+ /* key: 0x6063 */ 0x5773,
+ /* key: 0x6064 */ 0x5775,
+ /* key: 0x6065 */ 0x4351,
+ /* key: 0x6066 */ 0xffff,
+ /* key: 0x6067 */ 0xbd69,
+ /* key: 0x6068 */ 0x3a28,
+ /* key: 0x6069 */ 0x3238,
+ /* key: 0x606a */ 0x576d,
+ /* key: 0x606b */ 0x5778,
+ /* key: 0x606c */ 0x5777,
+ /* key: 0x606d */ 0x3633,
+ /* key: 0x606e */ 0xffff,
+ /* key: 0x606f */ 0x4229,
+ /* key: 0x6070 */ 0x3366,
+ /* key: 0x6071 */ 0xbd6a,
+ /* key: 0x6072 */ 0xffff,
+ /* key: 0x6073 */ 0xffff,
+ /* key: 0x6074 */ 0xffff,
+ /* key: 0x6075 */ 0x3743,
+ /* key: 0x6076 */ 0xffff,
+ /* key: 0x6077 */ 0x576e,
+ /* key: 0x6078 */ 0xffff,
+ /* key: 0x6079 */ 0xffff,
+ /* key: 0x607a */ 0xffff,
+ /* key: 0x607b */ 0xffff,
+ /* key: 0x607c */ 0xffff,
+ /* key: 0x607d */ 0xffff,
+ /* key: 0x607e */ 0xbd6b,
+ /* key: 0x607f */ 0xbd6c,
+ /* key: 0x6080 */ 0xffff,
+ /* key: 0x6081 */ 0x577a,
+ /* key: 0x6082 */ 0xbd6d,
+ /* key: 0x6083 */ 0x577d,
+ /* key: 0x6084 */ 0x5821,
+ /* key: 0x6085 */ 0xffff,
+ /* key: 0x6086 */ 0xbd6e,
+ /* key: 0x6087 */ 0xffff,
+ /* key: 0x6088 */ 0xbd6f,
+ /* key: 0x6089 */ 0x3c3d,
+ /* key: 0x608a */ 0xbd70,
+ /* key: 0x608b */ 0x5827,
+ /* key: 0x608c */ 0x4470,
+ /* key: 0x608d */ 0x577b,
+ /* key: 0x608e */ 0xbd71,
+ /* key: 0x608f */ 0xffff,
+ /* key: 0x6090 */ 0xffff,
+ /* key: 0x6091 */ 0xbd72,
+ /* key: 0x6092 */ 0x5825,
+ /* key: 0x6093 */ 0xbd73,
+ /* key: 0x6094 */ 0x3279,
+ /* key: 0x6095 */ 0xbd74,
+ /* key: 0x6096 */ 0x5823,
+ /* key: 0x6097 */ 0x5824,
+ /* key: 0x6098 */ 0xbd75,
+ /* key: 0x6099 */ 0xffff,
+ /* key: 0x609a */ 0x577e,
+ /* key: 0x609b */ 0x5822,
+ /* key: 0x609c */ 0xffff,
+ /* key: 0x609d */ 0xbd76,
+ /* key: 0x609e */ 0xbd77,
+ /* key: 0x609f */ 0x3867,
+ /* key: 0x60a0 */ 0x4d2a,
+ /* key: 0x60a1 */ 0xffff,
+ /* key: 0x60a2 */ 0xbd78,
+ /* key: 0x60a3 */ 0x3435,
+ /* key: 0x60a4 */ 0xbd79,
+ /* key: 0x60a5 */ 0xbd7a,
+ /* key: 0x60a6 */ 0x3159,
+ /* key: 0x60a7 */ 0x5826,
+ /* key: 0x60a8 */ 0xbd7b,
+ /* key: 0x60a9 */ 0x473a,
+ /* key: 0x60aa */ 0x302d,
+ /* key: 0x60ab */ 0xffff,
+ /* key: 0x60ac */ 0xffff,
+ /* key: 0x60ad */ 0xffff,
+ /* key: 0x60ae */ 0xffff,
+ /* key: 0x60af */ 0xffff,
+ /* key: 0x60b0 */ 0xbd7c,
+ /* key: 0x60b1 */ 0xbd7d,
+ /* key: 0x60b2 */ 0x4861,
+ /* key: 0x60b3 */ 0x575c,
+ /* key: 0x60b4 */ 0x582c,
+ /* key: 0x60b5 */ 0x5830,
+ /* key: 0x60b6 */ 0x4c65,
+ /* key: 0x60b7 */ 0xbd7e,
+ /* key: 0x60b8 */ 0x5829,
+ /* key: 0x60b9 */ 0xffff,
+ /* key: 0x60ba */ 0xffff,
+ /* key: 0x60bb */ 0xbe21,
+ /* key: 0x60bc */ 0x4569,
+ /* key: 0x60bd */ 0x582e,
+ /* key: 0x60be */ 0xbe22,
+ /* key: 0x60bf */ 0xffff,
+ /* key: 0x60c0 */ 0xffff,
+ /* key: 0x60c1 */ 0xffff,
+ /* key: 0x60c2 */ 0xbe23,
+ /* key: 0x60c3 */ 0xffff,
+ /* key: 0x60c4 */ 0xbe24,
+ /* key: 0x60c5 */ 0x3e70,
+ /* key: 0x60c6 */ 0x582f,
+ /* key: 0x60c7 */ 0x4657,
+ /* key: 0x60c8 */ 0xbe25,
+ /* key: 0x60c9 */ 0xbe26,
+ /* key: 0x60ca */ 0xbe27,
+ /* key: 0x60cb */ 0xbe28,
+ /* key: 0x60cc */ 0xffff,
+ /* key: 0x60cd */ 0xffff,
+ /* key: 0x60ce */ 0xbe29,
+ /* key: 0x60cf */ 0xbe2a,
+ /* key: 0x60d0 */ 0xffff,
+ /* key: 0x60d1 */ 0x4f47,
+ /* key: 0x60d2 */ 0xffff,
+ /* key: 0x60d3 */ 0x582b,
+ /* key: 0x60d4 */ 0xbe2b,
+ /* key: 0x60d5 */ 0xbe2c,
+ /* key: 0x60d6 */ 0xffff,
+ /* key: 0x60d7 */ 0xffff,
+ /* key: 0x60d8 */ 0x5831,
+ /* key: 0x60d9 */ 0xbe2d,
+ /* key: 0x60da */ 0x397b,
+ /* key: 0x60db */ 0xbe2e,
+ /* key: 0x60dc */ 0x404b,
+ /* key: 0x60dd */ 0xbe2f,
+ /* key: 0x60de */ 0xbe30,
+ /* key: 0x60df */ 0x3054,
+ /* key: 0x60e0 */ 0x582a,
+ /* key: 0x60e1 */ 0x5828,
+ /* key: 0x60e2 */ 0xbe31,
+ /* key: 0x60e3 */ 0x415a,
+ /* key: 0x60e4 */ 0xffff,
+ /* key: 0x60e5 */ 0xbe32,
+ /* key: 0x60e6 */ 0xffff,
+ /* key: 0x60e7 */ 0x577c,
+ /* key: 0x60e8 */ 0x3b34,
+ /* key: 0x60e9 */ 0xffff,
+ /* key: 0x60ea */ 0xffff,
+ /* key: 0x60eb */ 0xffff,
+ /* key: 0x60ec */ 0xffff,
+ /* key: 0x60ed */ 0xffff,
+ /* key: 0x60ee */ 0xffff,
+ /* key: 0x60ef */ 0xffff,
+ /* key: 0x60f0 */ 0x4246,
+ /* key: 0x60f1 */ 0x583d,
+ /* key: 0x60f2 */ 0xbe33,
+ /* key: 0x60f3 */ 0x415b,
+ /* key: 0x60f4 */ 0x5838,
+ /* key: 0x60f5 */ 0xbe34,
+ /* key: 0x60f6 */ 0x5835,
+ /* key: 0x60f7 */ 0x5836,
+ /* key: 0x60f8 */ 0xbe35,
+ /* key: 0x60f9 */ 0x3c66,
+ /* key: 0x60fa */ 0x5839,
+ /* key: 0x60fb */ 0x583c,
+ /* key: 0x60fc */ 0xbe36,
+ /* key: 0x60fd */ 0xbe37,
+ /* key: 0x60fe */ 0xffff,
+ /* key: 0x60ff */ 0xffff,
+ /* branch: 0x610X */ 6784,
+ /* branch: 0x611X */ 6800,
+ /* branch: 0x612X */ 6816,
+ /* branch: 0x613X */ 6832,
+ /* branch: 0x614X */ 6848,
+ /* branch: 0x615X */ 6864,
+ /* branch: 0x616X */ 6880,
+ /* branch: 0x617X */ 6896,
+ /* branch: 0x618X */ 6912,
+ /* branch: 0x619X */ 6928,
+ /* branch: 0x61aX */ 6944,
+ /* branch: 0x61bX */ 6960,
+ /* branch: 0x61cX */ 6976,
+ /* branch: 0x61dX */ 6992,
+ /* branch: 0x61eX */ 7008,
+ /* branch: 0x61fX */ 7024,
+ /* key: 0x6100 */ 0x5837,
+ /* key: 0x6101 */ 0x3d25,
+ /* key: 0x6102 */ 0xbe38,
+ /* key: 0x6103 */ 0x583a,
+ /* key: 0x6104 */ 0xffff,
+ /* key: 0x6105 */ 0xffff,
+ /* key: 0x6106 */ 0x5834,
+ /* key: 0x6107 */ 0xbe39,
+ /* key: 0x6108 */ 0x4c7c,
+ /* key: 0x6109 */ 0x4c7b,
+ /* key: 0x610a */ 0xbe3a,
+ /* key: 0x610b */ 0xffff,
+ /* key: 0x610c */ 0xbe3b,
+ /* key: 0x610d */ 0x583e,
+ /* key: 0x610e */ 0x583f,
+ /* key: 0x610f */ 0x3055,
+ /* key: 0x6110 */ 0xbe3c,
+ /* key: 0x6111 */ 0xbe3d,
+ /* key: 0x6112 */ 0xbe3e,
+ /* key: 0x6113 */ 0xbe3f,
+ /* key: 0x6114 */ 0xbe40,
+ /* key: 0x6115 */ 0x5833,
+ /* key: 0x6116 */ 0xbe41,
+ /* key: 0x6117 */ 0xbe42,
+ /* key: 0x6118 */ 0xffff,
+ /* key: 0x6119 */ 0xbe43,
+ /* key: 0x611a */ 0x3672,
+ /* key: 0x611b */ 0x3026,
+ /* key: 0x611c */ 0xbe44,
+ /* key: 0x611d */ 0xffff,
+ /* key: 0x611e */ 0xbe45,
+ /* key: 0x611f */ 0x3436,
+ /* key: 0x6120 */ 0xffff,
+ /* key: 0x6121 */ 0x583b,
+ /* key: 0x6122 */ 0xbe46,
+ /* key: 0x6123 */ 0xffff,
+ /* key: 0x6124 */ 0xffff,
+ /* key: 0x6125 */ 0xffff,
+ /* key: 0x6126 */ 0xffff,
+ /* key: 0x6127 */ 0x5843,
+ /* key: 0x6128 */ 0x5842,
+ /* key: 0x6129 */ 0xffff,
+ /* key: 0x612a */ 0xbe47,
+ /* key: 0x612b */ 0xbe48,
+ /* key: 0x612c */ 0x5847,
+ /* key: 0x612d */ 0xffff,
+ /* key: 0x612e */ 0xffff,
+ /* key: 0x612f */ 0xffff,
+ /* key: 0x6130 */ 0xbe49,
+ /* key: 0x6131 */ 0xbe4a,
+ /* key: 0x6132 */ 0xffff,
+ /* key: 0x6133 */ 0xffff,
+ /* key: 0x6134 */ 0x5848,
+ /* key: 0x6135 */ 0xbe4b,
+ /* key: 0x6136 */ 0xbe4c,
+ /* key: 0x6137 */ 0xbe4d,
+ /* key: 0x6138 */ 0xffff,
+ /* key: 0x6139 */ 0xbe4e,
+ /* key: 0x613a */ 0xffff,
+ /* key: 0x613b */ 0xffff,
+ /* key: 0x613c */ 0x5846,
+ /* key: 0x613d */ 0x5849,
+ /* key: 0x613e */ 0x5841,
+ /* key: 0x613f */ 0x5845,
+ /* key: 0x6140 */ 0xffff,
+ /* key: 0x6141 */ 0xbe4f,
+ /* key: 0x6142 */ 0x584a,
+ /* key: 0x6143 */ 0xffff,
+ /* key: 0x6144 */ 0x584b,
+ /* key: 0x6145 */ 0xbe50,
+ /* key: 0x6146 */ 0xbe51,
+ /* key: 0x6147 */ 0x5840,
+ /* key: 0x6148 */ 0x3b7c,
+ /* key: 0x6149 */ 0xbe52,
+ /* key: 0x614a */ 0x5844,
+ /* key: 0x614b */ 0x4256,
+ /* key: 0x614c */ 0x3932,
+ /* key: 0x614d */ 0x5832,
+ /* key: 0x614e */ 0x3f35,
+ /* key: 0x614f */ 0xffff,
+ /* key: 0x6150 */ 0xffff,
+ /* key: 0x6151 */ 0xffff,
+ /* key: 0x6152 */ 0xffff,
+ /* key: 0x6153 */ 0x5858,
+ /* key: 0x6154 */ 0xffff,
+ /* key: 0x6155 */ 0x4a69,
+ /* key: 0x6156 */ 0xffff,
+ /* key: 0x6157 */ 0xffff,
+ /* key: 0x6158 */ 0x584e,
+ /* key: 0x6159 */ 0x584f,
+ /* key: 0x615a */ 0x5850,
+ /* key: 0x615b */ 0xffff,
+ /* key: 0x615c */ 0xffff,
+ /* key: 0x615d */ 0x5857,
+ /* key: 0x615e */ 0xbe53,
+ /* key: 0x615f */ 0x5856,
+ /* key: 0x6160 */ 0xbe54,
+ /* key: 0x6161 */ 0xffff,
+ /* key: 0x6162 */ 0x4b7d,
+ /* key: 0x6163 */ 0x3437,
+ /* key: 0x6164 */ 0xffff,
+ /* key: 0x6165 */ 0x5854,
+ /* key: 0x6166 */ 0xffff,
+ /* key: 0x6167 */ 0x3745,
+ /* key: 0x6168 */ 0x3334,
+ /* key: 0x6169 */ 0xffff,
+ /* key: 0x616a */ 0xffff,
+ /* key: 0x616b */ 0x5851,
+ /* key: 0x616c */ 0xbe55,
+ /* key: 0x616d */ 0xffff,
+ /* key: 0x616e */ 0x4e38,
+ /* key: 0x616f */ 0x5853,
+ /* key: 0x6170 */ 0x3056,
+ /* key: 0x6171 */ 0x5855,
+ /* key: 0x6172 */ 0xbe56,
+ /* key: 0x6173 */ 0x584c,
+ /* key: 0x6174 */ 0x5852,
+ /* key: 0x6175 */ 0x5859,
+ /* key: 0x6176 */ 0x3744,
+ /* key: 0x6177 */ 0x584d,
+ /* key: 0x6178 */ 0xbe57,
+ /* key: 0x6179 */ 0xffff,
+ /* key: 0x617a */ 0xffff,
+ /* key: 0x617b */ 0xbe58,
+ /* key: 0x617c */ 0xbe59,
+ /* key: 0x617d */ 0xffff,
+ /* key: 0x617e */ 0x4d5d,
+ /* key: 0x617f */ 0xbe5a,
+ /* key: 0x6180 */ 0xbe5b,
+ /* key: 0x6181 */ 0xbe5c,
+ /* key: 0x6182 */ 0x4d2b,
+ /* key: 0x6183 */ 0xbe5d,
+ /* key: 0x6184 */ 0xbe5e,
+ /* key: 0x6185 */ 0xffff,
+ /* key: 0x6186 */ 0xffff,
+ /* key: 0x6187 */ 0x585c,
+ /* key: 0x6188 */ 0xffff,
+ /* key: 0x6189 */ 0xffff,
+ /* key: 0x618a */ 0x5860,
+ /* key: 0x618b */ 0xbe5f,
+ /* key: 0x618c */ 0xffff,
+ /* key: 0x618d */ 0xbe60,
+ /* key: 0x618e */ 0x417e,
+ /* key: 0x618f */ 0xffff,
+ /* key: 0x6190 */ 0x4e79,
+ /* key: 0x6191 */ 0x5861,
+ /* key: 0x6192 */ 0xbe61,
+ /* key: 0x6193 */ 0xbe62,
+ /* key: 0x6194 */ 0x585e,
+ /* key: 0x6195 */ 0xffff,
+ /* key: 0x6196 */ 0x585b,
+ /* key: 0x6197 */ 0xbe63,
+ /* key: 0x6198 */ 0xbe64,
+ /* key: 0x6199 */ 0x585a,
+ /* key: 0x619a */ 0x585f,
+ /* key: 0x619b */ 0xffff,
+ /* key: 0x619c */ 0xbe65,
+ /* key: 0x619d */ 0xbe66,
+ /* key: 0x619e */ 0xffff,
+ /* key: 0x619f */ 0xbe67,
+ /* key: 0x61a0 */ 0xbe68,
+ /* key: 0x61a1 */ 0xffff,
+ /* key: 0x61a2 */ 0xffff,
+ /* key: 0x61a3 */ 0xffff,
+ /* key: 0x61a4 */ 0x4a30,
+ /* key: 0x61a5 */ 0xbe69,
+ /* key: 0x61a6 */ 0xffff,
+ /* key: 0x61a7 */ 0x4634,
+ /* key: 0x61a8 */ 0xbe6a,
+ /* key: 0x61a9 */ 0x3746,
+ /* key: 0x61aa */ 0xbe6b,
+ /* key: 0x61ab */ 0x5862,
+ /* key: 0x61ac */ 0x585d,
+ /* key: 0x61ad */ 0xbe6c,
+ /* key: 0x61ae */ 0x5863,
+ /* key: 0x61af */ 0xffff,
+ /* key: 0x61b0 */ 0xffff,
+ /* key: 0x61b1 */ 0xffff,
+ /* key: 0x61b2 */ 0x377b,
+ /* key: 0x61b3 */ 0xffff,
+ /* key: 0x61b4 */ 0xffff,
+ /* key: 0x61b5 */ 0xffff,
+ /* key: 0x61b6 */ 0x3231,
+ /* key: 0x61b7 */ 0xffff,
+ /* key: 0x61b8 */ 0xbe6d,
+ /* key: 0x61b9 */ 0xbe6e,
+ /* key: 0x61ba */ 0x586b,
+ /* key: 0x61bb */ 0xffff,
+ /* key: 0x61bc */ 0xbe6f,
+ /* key: 0x61bd */ 0xffff,
+ /* key: 0x61be */ 0x3438,
+ /* key: 0x61bf */ 0xffff,
+ /* key: 0x61c0 */ 0xbe70,
+ /* key: 0x61c1 */ 0xbe71,
+ /* key: 0x61c2 */ 0xbe72,
+ /* key: 0x61c3 */ 0x5869,
+ /* key: 0x61c4 */ 0xffff,
+ /* key: 0x61c5 */ 0xffff,
+ /* key: 0x61c6 */ 0x586a,
+ /* key: 0x61c7 */ 0x3a29,
+ /* key: 0x61c8 */ 0x5868,
+ /* key: 0x61c9 */ 0x5866,
+ /* key: 0x61ca */ 0x5865,
+ /* key: 0x61cb */ 0x586c,
+ /* key: 0x61cc */ 0x5864,
+ /* key: 0x61cd */ 0x586e,
+ /* key: 0x61ce */ 0xbe73,
+ /* key: 0x61cf */ 0xbe74,
+ /* key: 0x61d0 */ 0x327b,
+ /* key: 0x61d1 */ 0xffff,
+ /* key: 0x61d2 */ 0xffff,
+ /* key: 0x61d3 */ 0xffff,
+ /* key: 0x61d4 */ 0xffff,
+ /* key: 0x61d5 */ 0xbe75,
+ /* key: 0x61d6 */ 0xffff,
+ /* key: 0x61d7 */ 0xffff,
+ /* key: 0x61d8 */ 0xffff,
+ /* key: 0x61d9 */ 0xffff,
+ /* key: 0x61da */ 0xffff,
+ /* key: 0x61db */ 0xffff,
+ /* key: 0x61dc */ 0xbe76,
+ /* key: 0x61dd */ 0xbe77,
+ /* key: 0x61de */ 0xbe78,
+ /* key: 0x61df */ 0xbe79,
+ /* key: 0x61e0 */ 0xffff,
+ /* key: 0x61e1 */ 0xbe7a,
+ /* key: 0x61e2 */ 0xbe7b,
+ /* key: 0x61e3 */ 0x5870,
+ /* key: 0x61e4 */ 0xffff,
+ /* key: 0x61e5 */ 0xbe7e,
+ /* key: 0x61e6 */ 0x586f,
+ /* key: 0x61e7 */ 0xbe7c,
+ /* key: 0x61e8 */ 0xffff,
+ /* key: 0x61e9 */ 0xbe7d,
+ /* key: 0x61ea */ 0xffff,
+ /* key: 0x61eb */ 0xffff,
+ /* key: 0x61ec */ 0xbf21,
+ /* key: 0x61ed */ 0xbf22,
+ /* key: 0x61ee */ 0xffff,
+ /* key: 0x61ef */ 0xbf23,
+ /* key: 0x61f0 */ 0xffff,
+ /* key: 0x61f1 */ 0xffff,
+ /* key: 0x61f2 */ 0x4428,
+ /* key: 0x61f3 */ 0xffff,
+ /* key: 0x61f4 */ 0x5873,
+ /* key: 0x61f5 */ 0xffff,
+ /* key: 0x61f6 */ 0x5871,
+ /* key: 0x61f7 */ 0x5867,
+ /* key: 0x61f8 */ 0x377c,
+ /* key: 0x61f9 */ 0xffff,
+ /* key: 0x61fa */ 0x5872,
+ /* key: 0x61fb */ 0xffff,
+ /* key: 0x61fc */ 0x5876,
+ /* key: 0x61fd */ 0x5875,
+ /* key: 0x61fe */ 0x5877,
+ /* key: 0x61ff */ 0x5874,
+ /* branch: 0x620X */ 7056,
+ /* branch: 0x621X */ 7072,
+ /* branch: 0x622X */ 7088,
+ /* branch: 0x623X */ 7104,
+ /* branch: 0x624X */ 7120,
+ /* branch: 0x625X */ 7136,
+ /* branch: 0x626X */ 7152,
+ /* branch: 0x627X */ 7168,
+ /* branch: 0x628X */ 7184,
+ /* branch: 0x629X */ 7200,
+ /* branch: 0x62aX */ 7216,
+ /* branch: 0x62bX */ 7232,
+ /* branch: 0x62cX */ 7248,
+ /* branch: 0x62dX */ 7264,
+ /* branch: 0x62eX */ 7280,
+ /* branch: 0x62fX */ 7296,
+ /* key: 0x6200 */ 0x5878,
+ /* key: 0x6201 */ 0xbf24,
+ /* key: 0x6202 */ 0xffff,
+ /* key: 0x6203 */ 0xbf25,
+ /* key: 0x6204 */ 0xbf26,
+ /* key: 0x6205 */ 0xffff,
+ /* key: 0x6206 */ 0xffff,
+ /* key: 0x6207 */ 0xbf27,
+ /* key: 0x6208 */ 0x5879,
+ /* key: 0x6209 */ 0x587a,
+ /* key: 0x620a */ 0x4a6a,
+ /* key: 0x620b */ 0xffff,
+ /* key: 0x620c */ 0x587c,
+ /* key: 0x620d */ 0x587b,
+ /* key: 0x620e */ 0x3d3f,
+ /* key: 0x620f */ 0xffff,
+ /* key: 0x6210 */ 0x402e,
+ /* key: 0x6211 */ 0x3266,
+ /* key: 0x6212 */ 0x327c,
+ /* key: 0x6213 */ 0xbf28,
+ /* key: 0x6214 */ 0x587d,
+ /* key: 0x6215 */ 0xbf29,
+ /* key: 0x6216 */ 0x303f,
+ /* key: 0x6217 */ 0xffff,
+ /* key: 0x6218 */ 0xffff,
+ /* key: 0x6219 */ 0xffff,
+ /* key: 0x621a */ 0x404c,
+ /* key: 0x621b */ 0x587e,
+ /* key: 0x621c */ 0xbf2a,
+ /* key: 0x621d */ 0x6c43,
+ /* key: 0x621e */ 0x5921,
+ /* key: 0x621f */ 0x3761,
+ /* key: 0x6220 */ 0xbf2b,
+ /* key: 0x6221 */ 0x5922,
+ /* key: 0x6222 */ 0xbf2c,
+ /* key: 0x6223 */ 0xbf2d,
+ /* key: 0x6224 */ 0xffff,
+ /* key: 0x6225 */ 0xffff,
+ /* key: 0x6226 */ 0x406f,
+ /* key: 0x6227 */ 0xbf2e,
+ /* key: 0x6228 */ 0xffff,
+ /* key: 0x6229 */ 0xbf2f,
+ /* key: 0x622a */ 0x5923,
+ /* key: 0x622b */ 0xbf30,
+ /* key: 0x622c */ 0xffff,
+ /* key: 0x622d */ 0xffff,
+ /* key: 0x622e */ 0x5924,
+ /* key: 0x622f */ 0x353a,
+ /* key: 0x6230 */ 0x5925,
+ /* key: 0x6231 */ 0xffff,
+ /* key: 0x6232 */ 0x5926,
+ /* key: 0x6233 */ 0x5927,
+ /* key: 0x6234 */ 0x4257,
+ /* key: 0x6235 */ 0xffff,
+ /* key: 0x6236 */ 0xffff,
+ /* key: 0x6237 */ 0xffff,
+ /* key: 0x6238 */ 0x384d,
+ /* key: 0x6239 */ 0xbf31,
+ /* key: 0x623a */ 0xffff,
+ /* key: 0x623b */ 0x4c61,
+ /* key: 0x623c */ 0xffff,
+ /* key: 0x623d */ 0xbf32,
+ /* key: 0x623e */ 0xffff,
+ /* key: 0x623f */ 0x4b3c,
+ /* key: 0x6240 */ 0x3d6a,
+ /* key: 0x6241 */ 0x5928,
+ /* key: 0x6242 */ 0xbf33,
+ /* key: 0x6243 */ 0xbf34,
+ /* key: 0x6244 */ 0xbf35,
+ /* key: 0x6245 */ 0xffff,
+ /* key: 0x6246 */ 0xbf36,
+ /* key: 0x6247 */ 0x4070,
+ /* key: 0x6248 */ 0x6e3d,
+ /* key: 0x6249 */ 0x4862,
+ /* key: 0x624a */ 0xffff,
+ /* key: 0x624b */ 0x3c6a,
+ /* key: 0x624c */ 0xbf37,
+ /* key: 0x624d */ 0x3a4d,
+ /* key: 0x624e */ 0x5929,
+ /* key: 0x624f */ 0xffff,
+ /* key: 0x6250 */ 0xbf38,
+ /* key: 0x6251 */ 0xbf39,
+ /* key: 0x6252 */ 0xbf3a,
+ /* key: 0x6253 */ 0x4247,
+ /* key: 0x6254 */ 0xbf3b,
+ /* key: 0x6255 */ 0x4a27,
+ /* key: 0x6256 */ 0xbf3c,
+ /* key: 0x6257 */ 0xffff,
+ /* key: 0x6258 */ 0x4271,
+ /* key: 0x6259 */ 0xffff,
+ /* key: 0x625a */ 0xbf3d,
+ /* key: 0x625b */ 0x592c,
+ /* key: 0x625c */ 0xbf3e,
+ /* key: 0x625d */ 0xffff,
+ /* key: 0x625e */ 0x592a,
+ /* key: 0x625f */ 0xffff,
+ /* key: 0x6260 */ 0x592d,
+ /* key: 0x6261 */ 0xffff,
+ /* key: 0x6262 */ 0xffff,
+ /* key: 0x6263 */ 0x592b,
+ /* key: 0x6264 */ 0xbf3f,
+ /* key: 0x6265 */ 0xffff,
+ /* key: 0x6266 */ 0xffff,
+ /* key: 0x6267 */ 0xffff,
+ /* key: 0x6268 */ 0x592e,
+ /* key: 0x6269 */ 0xffff,
+ /* key: 0x626a */ 0xffff,
+ /* key: 0x626b */ 0xffff,
+ /* key: 0x626c */ 0xffff,
+ /* key: 0x626d */ 0xbf40,
+ /* key: 0x626e */ 0x4a31,
+ /* key: 0x626f */ 0xbf41,
+ /* key: 0x6270 */ 0xffff,
+ /* key: 0x6271 */ 0x3037,
+ /* key: 0x6272 */ 0xffff,
+ /* key: 0x6273 */ 0xbf42,
+ /* key: 0x6274 */ 0xffff,
+ /* key: 0x6275 */ 0xffff,
+ /* key: 0x6276 */ 0x495e,
+ /* key: 0x6277 */ 0xffff,
+ /* key: 0x6278 */ 0xffff,
+ /* key: 0x6279 */ 0x4863,
+ /* key: 0x627a */ 0xbf43,
+ /* key: 0x627b */ 0xffff,
+ /* key: 0x627c */ 0x592f,
+ /* key: 0x627d */ 0xbf44,
+ /* key: 0x627e */ 0x5932,
+ /* key: 0x627f */ 0x3e35,
+ /* key: 0x6280 */ 0x353b,
+ /* key: 0x6281 */ 0xffff,
+ /* key: 0x6282 */ 0x5930,
+ /* key: 0x6283 */ 0x5937,
+ /* key: 0x6284 */ 0x3e36,
+ /* key: 0x6285 */ 0xffff,
+ /* key: 0x6286 */ 0xffff,
+ /* key: 0x6287 */ 0xffff,
+ /* key: 0x6288 */ 0xffff,
+ /* key: 0x6289 */ 0x5931,
+ /* key: 0x628a */ 0x4744,
+ /* key: 0x628b */ 0xffff,
+ /* key: 0x628c */ 0xffff,
+ /* key: 0x628d */ 0xbf45,
+ /* key: 0x628e */ 0xbf46,
+ /* key: 0x628f */ 0xbf47,
+ /* key: 0x6290 */ 0xbf48,
+ /* key: 0x6291 */ 0x4d5e,
+ /* key: 0x6292 */ 0x5933,
+ /* key: 0x6293 */ 0x5934,
+ /* key: 0x6294 */ 0x5938,
+ /* key: 0x6295 */ 0x456a,
+ /* key: 0x6296 */ 0x5935,
+ /* key: 0x6297 */ 0x3933,
+ /* key: 0x6298 */ 0x405e,
+ /* key: 0x6299 */ 0xffff,
+ /* key: 0x629a */ 0xffff,
+ /* key: 0x629b */ 0x5946,
+ /* key: 0x629c */ 0x4834,
+ /* key: 0x629d */ 0xffff,
+ /* key: 0x629e */ 0x4272,
+ /* key: 0x629f */ 0xffff,
+ /* key: 0x62a0 */ 0xffff,
+ /* key: 0x62a1 */ 0xffff,
+ /* key: 0x62a2 */ 0xffff,
+ /* key: 0x62a3 */ 0xffff,
+ /* key: 0x62a4 */ 0xffff,
+ /* key: 0x62a5 */ 0xffff,
+ /* key: 0x62a6 */ 0xbf49,
+ /* key: 0x62a7 */ 0xffff,
+ /* key: 0x62a8 */ 0xbf4a,
+ /* key: 0x62a9 */ 0xffff,
+ /* key: 0x62aa */ 0xffff,
+ /* key: 0x62ab */ 0x4864,
+ /* key: 0x62ac */ 0x5a2d,
+ /* key: 0x62ad */ 0xffff,
+ /* key: 0x62ae */ 0xffff,
+ /* key: 0x62af */ 0xffff,
+ /* key: 0x62b0 */ 0xffff,
+ /* key: 0x62b1 */ 0x4a7a,
+ /* key: 0x62b2 */ 0xffff,
+ /* key: 0x62b3 */ 0xbf4b,
+ /* key: 0x62b4 */ 0xffff,
+ /* key: 0x62b5 */ 0x4471,
+ /* key: 0x62b6 */ 0xbf4c,
+ /* key: 0x62b7 */ 0xbf4d,
+ /* key: 0x62b8 */ 0xffff,
+ /* key: 0x62b9 */ 0x4b75,
+ /* key: 0x62ba */ 0xbf4e,
+ /* key: 0x62bb */ 0x593b,
+ /* key: 0x62bc */ 0x3221,
+ /* key: 0x62bd */ 0x436a,
+ /* key: 0x62be */ 0xbf4f,
+ /* key: 0x62bf */ 0xbf50,
+ /* key: 0x62c0 */ 0xffff,
+ /* key: 0x62c1 */ 0xffff,
+ /* key: 0x62c2 */ 0x5944,
+ /* key: 0x62c3 */ 0xffff,
+ /* key: 0x62c4 */ 0xbf51,
+ /* key: 0x62c5 */ 0x4334,
+ /* key: 0x62c6 */ 0x593e,
+ /* key: 0x62c7 */ 0x5945,
+ /* key: 0x62c8 */ 0x5940,
+ /* key: 0x62c9 */ 0x5947,
+ /* key: 0x62ca */ 0x5943,
+ /* key: 0x62cb */ 0xffff,
+ /* key: 0x62cc */ 0x5942,
+ /* key: 0x62cd */ 0x476f,
+ /* key: 0x62ce */ 0xbf52,
+ /* key: 0x62cf */ 0x593c,
+ /* key: 0x62d0 */ 0x327d,
+ /* key: 0x62d1 */ 0x593a,
+ /* key: 0x62d2 */ 0x3571,
+ /* key: 0x62d3 */ 0x4273,
+ /* key: 0x62d4 */ 0x5936,
+ /* key: 0x62d5 */ 0xbf53,
+ /* key: 0x62d6 */ 0xbf54,
+ /* key: 0x62d7 */ 0x5939,
+ /* key: 0x62d8 */ 0x3934,
+ /* key: 0x62d9 */ 0x405b,
+ /* key: 0x62da */ 0xbf55,
+ /* key: 0x62db */ 0x3e37,
+ /* key: 0x62dc */ 0x5941,
+ /* key: 0x62dd */ 0x4752,
+ /* key: 0x62de */ 0xffff,
+ /* key: 0x62df */ 0xffff,
+ /* key: 0x62e0 */ 0x3572,
+ /* key: 0x62e1 */ 0x3348,
+ /* key: 0x62e2 */ 0xffff,
+ /* key: 0x62e3 */ 0xffff,
+ /* key: 0x62e4 */ 0xffff,
+ /* key: 0x62e5 */ 0xffff,
+ /* key: 0x62e6 */ 0xffff,
+ /* key: 0x62e7 */ 0xffff,
+ /* key: 0x62e8 */ 0xffff,
+ /* key: 0x62e9 */ 0xffff,
+ /* key: 0x62ea */ 0xbf56,
+ /* key: 0x62eb */ 0xffff,
+ /* key: 0x62ec */ 0x3367,
+ /* key: 0x62ed */ 0x3f21,
+ /* key: 0x62ee */ 0x5949,
+ /* key: 0x62ef */ 0x594e,
+ /* key: 0x62f0 */ 0xffff,
+ /* key: 0x62f1 */ 0x594a,
+ /* key: 0x62f2 */ 0xbf57,
+ /* key: 0x62f3 */ 0x377d,
+ /* key: 0x62f4 */ 0xbf58,
+ /* key: 0x62f5 */ 0x594f,
+ /* key: 0x62f6 */ 0x3b22,
+ /* key: 0x62f7 */ 0x3969,
+ /* key: 0x62f8 */ 0xffff,
+ /* key: 0x62f9 */ 0xffff,
+ /* key: 0x62fa */ 0xffff,
+ /* key: 0x62fb */ 0xffff,
+ /* key: 0x62fc */ 0xbf59,
+ /* key: 0x62fd */ 0xbf5a,
+ /* key: 0x62fe */ 0x3d26,
+ /* key: 0x62ff */ 0x593d,
+ /* branch: 0x630X */ 7328,
+ /* branch: 0x631X */ 7344,
+ /* branch: 0x632X */ 7360,
+ /* branch: 0x633X */ 7376,
+ /* branch: 0x634X */ 7392,
+ /* branch: 0x635X */ 7408,
+ /* branch: 0x636X */ 7424,
+ /* branch: 0x637X */ 7440,
+ /* branch: 0x638X */ 7456,
+ /* branch: 0x639X */ 7472,
+ /* branch: 0x63aX */ 7488,
+ /* branch: 0x63bX */ 7504,
+ /* branch: 0x63cX */ 7520,
+ /* branch: 0x63dX */ 7536,
+ /* branch: 0x63eX */ 7552,
+ /* branch: 0x63fX */ 7568,
+ /* key: 0x6300 */ 0xffff,
+ /* key: 0x6301 */ 0x3b7d,
+ /* key: 0x6302 */ 0x594c,
+ /* key: 0x6303 */ 0xbf5b,
+ /* key: 0x6304 */ 0xbf5c,
+ /* key: 0x6305 */ 0xffff,
+ /* key: 0x6306 */ 0xffff,
+ /* key: 0x6307 */ 0x3b58,
+ /* key: 0x6308 */ 0x594d,
+ /* key: 0x6309 */ 0x3044,
+ /* key: 0x630a */ 0xbf5d,
+ /* key: 0x630b */ 0xbf5e,
+ /* key: 0x630c */ 0x5948,
+ /* key: 0x630d */ 0xbf5f,
+ /* key: 0x630e */ 0xffff,
+ /* key: 0x630f */ 0xffff,
+ /* key: 0x6310 */ 0xbf60,
+ /* key: 0x6311 */ 0x4429,
+ /* key: 0x6312 */ 0xffff,
+ /* key: 0x6313 */ 0xbf61,
+ /* key: 0x6314 */ 0xffff,
+ /* key: 0x6315 */ 0xffff,
+ /* key: 0x6316 */ 0xbf62,
+ /* key: 0x6317 */ 0xffff,
+ /* key: 0x6318 */ 0xbf63,
+ /* key: 0x6319 */ 0x3573,
+ /* key: 0x631a */ 0xffff,
+ /* key: 0x631b */ 0xffff,
+ /* key: 0x631c */ 0xffff,
+ /* key: 0x631d */ 0xffff,
+ /* key: 0x631e */ 0xffff,
+ /* key: 0x631f */ 0x3634,
+ /* key: 0x6320 */ 0xffff,
+ /* key: 0x6321 */ 0xffff,
+ /* key: 0x6322 */ 0xffff,
+ /* key: 0x6323 */ 0xffff,
+ /* key: 0x6324 */ 0xffff,
+ /* key: 0x6325 */ 0xffff,
+ /* key: 0x6326 */ 0xffff,
+ /* key: 0x6327 */ 0x594b,
+ /* key: 0x6328 */ 0x3027,
+ /* key: 0x6329 */ 0xbf64,
+ /* key: 0x632a */ 0xbf65,
+ /* key: 0x632b */ 0x3a43,
+ /* key: 0x632c */ 0xffff,
+ /* key: 0x632d */ 0xbf66,
+ /* key: 0x632e */ 0xffff,
+ /* key: 0x632f */ 0x3f36,
+ /* key: 0x6330 */ 0xffff,
+ /* key: 0x6331 */ 0xffff,
+ /* key: 0x6332 */ 0xffff,
+ /* key: 0x6333 */ 0xffff,
+ /* key: 0x6334 */ 0xffff,
+ /* key: 0x6335 */ 0xbf67,
+ /* key: 0x6336 */ 0xbf68,
+ /* key: 0x6337 */ 0xffff,
+ /* key: 0x6338 */ 0xffff,
+ /* key: 0x6339 */ 0xbf69,
+ /* key: 0x633a */ 0x4472,
+ /* key: 0x633b */ 0xffff,
+ /* key: 0x633c */ 0xbf6a,
+ /* key: 0x633d */ 0x4854,
+ /* key: 0x633e */ 0x5951,
+ /* key: 0x633f */ 0x415e,
+ /* key: 0x6340 */ 0xffff,
+ /* key: 0x6341 */ 0xbf6b,
+ /* key: 0x6342 */ 0xbf6c,
+ /* key: 0x6343 */ 0xbf6d,
+ /* key: 0x6344 */ 0xbf6e,
+ /* key: 0x6345 */ 0xffff,
+ /* key: 0x6346 */ 0xbf6f,
+ /* key: 0x6347 */ 0xffff,
+ /* key: 0x6348 */ 0xffff,
+ /* key: 0x6349 */ 0x422a,
+ /* key: 0x634a */ 0xbf70,
+ /* key: 0x634b */ 0xbf71,
+ /* key: 0x634c */ 0x3b2b,
+ /* key: 0x634d */ 0x5952,
+ /* key: 0x634e */ 0xbf72,
+ /* key: 0x634f */ 0x5954,
+ /* key: 0x6350 */ 0x5950,
+ /* key: 0x6351 */ 0xffff,
+ /* key: 0x6352 */ 0xbf73,
+ /* key: 0x6353 */ 0xbf74,
+ /* key: 0x6354 */ 0xbf75,
+ /* key: 0x6355 */ 0x4a61,
+ /* key: 0x6356 */ 0xffff,
+ /* key: 0x6357 */ 0x443d,
+ /* key: 0x6358 */ 0xbf76,
+ /* key: 0x6359 */ 0xffff,
+ /* key: 0x635a */ 0xffff,
+ /* key: 0x635b */ 0xbf77,
+ /* key: 0x635c */ 0x415c,
+ /* key: 0x635d */ 0xffff,
+ /* key: 0x635e */ 0xffff,
+ /* key: 0x635f */ 0xffff,
+ /* key: 0x6360 */ 0xffff,
+ /* key: 0x6361 */ 0xffff,
+ /* key: 0x6362 */ 0xffff,
+ /* key: 0x6363 */ 0xffff,
+ /* key: 0x6364 */ 0xffff,
+ /* key: 0x6365 */ 0xbf78,
+ /* key: 0x6366 */ 0xbf79,
+ /* key: 0x6367 */ 0x4a7b,
+ /* key: 0x6368 */ 0x3c4e,
+ /* key: 0x6369 */ 0x5960,
+ /* key: 0x636a */ 0xffff,
+ /* key: 0x636b */ 0x595f,
+ /* key: 0x636c */ 0xbf7a,
+ /* key: 0x636d */ 0xbf7b,
+ /* key: 0x636e */ 0x3f78,
+ /* key: 0x636f */ 0xffff,
+ /* key: 0x6370 */ 0xffff,
+ /* key: 0x6371 */ 0xbf7c,
+ /* key: 0x6372 */ 0x377e,
+ /* key: 0x6373 */ 0xffff,
+ /* key: 0x6374 */ 0xbf7d,
+ /* key: 0x6375 */ 0xbf7e,
+ /* key: 0x6376 */ 0x5959,
+ /* key: 0x6377 */ 0x3e39,
+ /* key: 0x6378 */ 0xc021,
+ /* key: 0x6379 */ 0xffff,
+ /* key: 0x637a */ 0x4668,
+ /* key: 0x637b */ 0x4731,
+ /* key: 0x637c */ 0xc022,
+ /* key: 0x637d */ 0xc023,
+ /* key: 0x637e */ 0xffff,
+ /* key: 0x637f */ 0xc024,
+ /* key: 0x6380 */ 0x5957,
+ /* key: 0x6381 */ 0xffff,
+ /* key: 0x6382 */ 0xc025,
+ /* key: 0x6383 */ 0x415d,
+ /* key: 0x6384 */ 0xc026,
+ /* key: 0x6385 */ 0xffff,
+ /* key: 0x6386 */ 0xffff,
+ /* key: 0x6387 */ 0xc027,
+ /* key: 0x6388 */ 0x3c78,
+ /* key: 0x6389 */ 0x595c,
+ /* key: 0x638a */ 0xc028,
+ /* key: 0x638b */ 0xffff,
+ /* key: 0x638c */ 0x3e38,
+ /* key: 0x638d */ 0xffff,
+ /* key: 0x638e */ 0x5956,
+ /* key: 0x638f */ 0x595b,
+ /* key: 0x6390 */ 0xc029,
+ /* key: 0x6391 */ 0xffff,
+ /* key: 0x6392 */ 0x4753,
+ /* key: 0x6393 */ 0xffff,
+ /* key: 0x6394 */ 0xc02a,
+ /* key: 0x6395 */ 0xc02b,
+ /* key: 0x6396 */ 0x5955,
+ /* key: 0x6397 */ 0xffff,
+ /* key: 0x6398 */ 0x3721,
+ /* key: 0x6399 */ 0xc02c,
+ /* key: 0x639a */ 0xc02d,
+ /* key: 0x639b */ 0x335d,
+ /* key: 0x639c */ 0xffff,
+ /* key: 0x639d */ 0xffff,
+ /* key: 0x639e */ 0xc02e,
+ /* key: 0x639f */ 0x595d,
+ /* key: 0x63a0 */ 0x4e2b,
+ /* key: 0x63a1 */ 0x3a4e,
+ /* key: 0x63a2 */ 0x4335,
+ /* key: 0x63a3 */ 0x595a,
+ /* key: 0x63a4 */ 0xc02f,
+ /* key: 0x63a5 */ 0x405c,
+ /* key: 0x63a6 */ 0xc030,
+ /* key: 0x63a7 */ 0x3935,
+ /* key: 0x63a8 */ 0x3f64,
+ /* key: 0x63a9 */ 0x3166,
+ /* key: 0x63aa */ 0x413c,
+ /* key: 0x63ab */ 0x5958,
+ /* key: 0x63ac */ 0x3545,
+ /* key: 0x63ad */ 0xc031,
+ /* key: 0x63ae */ 0xc032,
+ /* key: 0x63af */ 0xc033,
+ /* key: 0x63b0 */ 0xffff,
+ /* key: 0x63b1 */ 0xffff,
+ /* key: 0x63b2 */ 0x3747,
+ /* key: 0x63b3 */ 0xffff,
+ /* key: 0x63b4 */ 0x444f,
+ /* key: 0x63b5 */ 0x595e,
+ /* key: 0x63b6 */ 0xffff,
+ /* key: 0x63b7 */ 0xffff,
+ /* key: 0x63b8 */ 0xffff,
+ /* key: 0x63b9 */ 0xffff,
+ /* key: 0x63ba */ 0xffff,
+ /* key: 0x63bb */ 0x415f,
+ /* key: 0x63bc */ 0xffff,
+ /* key: 0x63bd */ 0xc034,
+ /* key: 0x63be */ 0x5961,
+ /* key: 0x63bf */ 0xffff,
+ /* key: 0x63c0 */ 0x5963,
+ /* key: 0x63c1 */ 0xc035,
+ /* key: 0x63c2 */ 0xffff,
+ /* key: 0x63c3 */ 0x4237,
+ /* key: 0x63c4 */ 0x5969,
+ /* key: 0x63c5 */ 0xc036,
+ /* key: 0x63c6 */ 0x5964,
+ /* key: 0x63c7 */ 0xffff,
+ /* key: 0x63c8 */ 0xc037,
+ /* key: 0x63c9 */ 0x5966,
+ /* key: 0x63ca */ 0xffff,
+ /* key: 0x63cb */ 0xffff,
+ /* key: 0x63cc */ 0xffff,
+ /* key: 0x63cd */ 0xffff,
+ /* key: 0x63ce */ 0xc038,
+ /* key: 0x63cf */ 0x4941,
+ /* key: 0x63d0 */ 0x4473,
+ /* key: 0x63d1 */ 0xc039,
+ /* key: 0x63d2 */ 0x5967,
+ /* key: 0x63d3 */ 0xc03a,
+ /* key: 0x63d4 */ 0xc03b,
+ /* key: 0x63d5 */ 0xc03c,
+ /* key: 0x63d6 */ 0x4d2c,
+ /* key: 0x63d7 */ 0xffff,
+ /* key: 0x63d8 */ 0xffff,
+ /* key: 0x63d9 */ 0xffff,
+ /* key: 0x63da */ 0x4d48,
+ /* key: 0x63db */ 0x3439,
+ /* key: 0x63dc */ 0xc03d,
+ /* key: 0x63dd */ 0xffff,
+ /* key: 0x63de */ 0xffff,
+ /* key: 0x63df */ 0xffff,
+ /* key: 0x63e0 */ 0xc03e,
+ /* key: 0x63e1 */ 0x302e,
+ /* key: 0x63e2 */ 0xffff,
+ /* key: 0x63e3 */ 0x5965,
+ /* key: 0x63e4 */ 0xffff,
+ /* key: 0x63e5 */ 0xc03f,
+ /* key: 0x63e6 */ 0xffff,
+ /* key: 0x63e7 */ 0xffff,
+ /* key: 0x63e8 */ 0xffff,
+ /* key: 0x63e9 */ 0x5962,
+ /* key: 0x63ea */ 0xc040,
+ /* key: 0x63eb */ 0xffff,
+ /* key: 0x63ec */ 0xc041,
+ /* key: 0x63ed */ 0xffff,
+ /* key: 0x63ee */ 0x3478,
+ /* key: 0x63ef */ 0xffff,
+ /* key: 0x63f0 */ 0xffff,
+ /* key: 0x63f1 */ 0xffff,
+ /* key: 0x63f2 */ 0xc042,
+ /* key: 0x63f3 */ 0xc043,
+ /* key: 0x63f4 */ 0x3167,
+ /* key: 0x63f5 */ 0xc044,
+ /* key: 0x63f6 */ 0x5968,
+ /* key: 0x63f7 */ 0xffff,
+ /* key: 0x63f8 */ 0xc045,
+ /* key: 0x63f9 */ 0xc046,
+ /* key: 0x63fa */ 0x4d49,
+ /* key: 0x63fb */ 0xffff,
+ /* key: 0x63fc */ 0xffff,
+ /* key: 0x63fd */ 0xffff,
+ /* key: 0x63fe */ 0xffff,
+ /* key: 0x63ff */ 0xffff,
+ /* branch: 0x640X */ 7600,
+ /* branch: 0x641X */ 7616,
+ /* branch: 0x642X */ 7632,
+ /* branch: 0x643X */ 7648,
+ /* branch: 0x644X */ 7664,
+ /* branch: 0x645X */ 7680,
+ /* branch: 0x646X */ 7696,
+ /* branch: 0x647X */ 7712,
+ /* branch: 0x648X */ 7728,
+ /* branch: 0x649X */ 7744,
+ /* branch: 0x64aX */ 7760,
+ /* branch: 0x64bX */ 7776,
+ /* branch: 0x64cX */ 7792,
+ /* branch: 0x64dX */ 7808,
+ /* branch: 0x64eX */ 7824,
+ /* branch: 0x64fX */ 7840,
+ /* key: 0x6400 */ 0xffff,
+ /* key: 0x6401 */ 0xffff,
+ /* key: 0x6402 */ 0xffff,
+ /* key: 0x6403 */ 0xffff,
+ /* key: 0x6404 */ 0xffff,
+ /* key: 0x6405 */ 0xffff,
+ /* key: 0x6406 */ 0x596c,
+ /* key: 0x6407 */ 0xffff,
+ /* key: 0x6408 */ 0xffff,
+ /* key: 0x6409 */ 0xc047,
+ /* key: 0x640a */ 0xc048,
+ /* key: 0x640b */ 0xffff,
+ /* key: 0x640c */ 0xffff,
+ /* key: 0x640d */ 0x423b,
+ /* key: 0x640e */ 0xffff,
+ /* key: 0x640f */ 0x5973,
+ /* key: 0x6410 */ 0xc049,
+ /* key: 0x6411 */ 0xffff,
+ /* key: 0x6412 */ 0xc04a,
+ /* key: 0x6413 */ 0x596d,
+ /* key: 0x6414 */ 0xc04b,
+ /* key: 0x6415 */ 0xffff,
+ /* key: 0x6416 */ 0x596a,
+ /* key: 0x6417 */ 0x5971,
+ /* key: 0x6418 */ 0xc04c,
+ /* key: 0x6419 */ 0xffff,
+ /* key: 0x641a */ 0xffff,
+ /* key: 0x641b */ 0xffff,
+ /* key: 0x641c */ 0x5953,
+ /* key: 0x641d */ 0xffff,
+ /* key: 0x641e */ 0xc04d,
+ /* key: 0x641f */ 0xffff,
+ /* key: 0x6420 */ 0xc04e,
+ /* key: 0x6421 */ 0xffff,
+ /* key: 0x6422 */ 0xc04f,
+ /* key: 0x6423 */ 0xffff,
+ /* key: 0x6424 */ 0xc050,
+ /* key: 0x6425 */ 0xc051,
+ /* key: 0x6426 */ 0x596e,
+ /* key: 0x6427 */ 0xffff,
+ /* key: 0x6428 */ 0x5972,
+ /* key: 0x6429 */ 0xc052,
+ /* key: 0x642a */ 0xc053,
+ /* key: 0x642b */ 0xffff,
+ /* key: 0x642c */ 0x4842,
+ /* key: 0x642d */ 0x456b,
+ /* key: 0x642e */ 0xffff,
+ /* key: 0x642f */ 0xc054,
+ /* key: 0x6430 */ 0xc055,
+ /* key: 0x6431 */ 0xffff,
+ /* key: 0x6432 */ 0xffff,
+ /* key: 0x6433 */ 0xffff,
+ /* key: 0x6434 */ 0x596b,
+ /* key: 0x6435 */ 0xc056,
+ /* key: 0x6436 */ 0x596f,
+ /* key: 0x6437 */ 0xffff,
+ /* key: 0x6438 */ 0xffff,
+ /* key: 0x6439 */ 0xffff,
+ /* key: 0x643a */ 0x3748,
+ /* key: 0x643b */ 0xffff,
+ /* key: 0x643c */ 0xffff,
+ /* key: 0x643d */ 0xc057,
+ /* key: 0x643e */ 0x3a71,
+ /* key: 0x643f */ 0xc058,
+ /* key: 0x6440 */ 0xffff,
+ /* key: 0x6441 */ 0xffff,
+ /* key: 0x6442 */ 0x405d,
+ /* key: 0x6443 */ 0xffff,
+ /* key: 0x6444 */ 0xffff,
+ /* key: 0x6445 */ 0xffff,
+ /* key: 0x6446 */ 0xffff,
+ /* key: 0x6447 */ 0xffff,
+ /* key: 0x6448 */ 0xffff,
+ /* key: 0x6449 */ 0xffff,
+ /* key: 0x644a */ 0xffff,
+ /* key: 0x644b */ 0xc059,
+ /* key: 0x644c */ 0xffff,
+ /* key: 0x644d */ 0xffff,
+ /* key: 0x644e */ 0x5977,
+ /* key: 0x644f */ 0xc05a,
+ /* key: 0x6450 */ 0xffff,
+ /* key: 0x6451 */ 0xc05b,
+ /* key: 0x6452 */ 0xc05c,
+ /* key: 0x6453 */ 0xc05d,
+ /* key: 0x6454 */ 0xc05e,
+ /* key: 0x6455 */ 0xffff,
+ /* key: 0x6456 */ 0xffff,
+ /* key: 0x6457 */ 0xffff,
+ /* key: 0x6458 */ 0x4526,
+ /* key: 0x6459 */ 0xffff,
+ /* key: 0x645a */ 0xc05f,
+ /* key: 0x645b */ 0xc060,
+ /* key: 0x645c */ 0xc061,
+ /* key: 0x645d */ 0xc062,
+ /* key: 0x645e */ 0xffff,
+ /* key: 0x645f */ 0xc063,
+ /* key: 0x6460 */ 0xc064,
+ /* key: 0x6461 */ 0xc065,
+ /* key: 0x6462 */ 0xffff,
+ /* key: 0x6463 */ 0xc066,
+ /* key: 0x6464 */ 0xffff,
+ /* key: 0x6465 */ 0xffff,
+ /* key: 0x6466 */ 0xffff,
+ /* key: 0x6467 */ 0x5974,
+ /* key: 0x6468 */ 0xffff,
+ /* key: 0x6469 */ 0x4b60,
+ /* key: 0x646a */ 0xffff,
+ /* key: 0x646b */ 0xffff,
+ /* key: 0x646c */ 0xffff,
+ /* key: 0x646d */ 0xc067,
+ /* key: 0x646e */ 0xffff,
+ /* key: 0x646f */ 0x5975,
+ /* key: 0x6470 */ 0xffff,
+ /* key: 0x6471 */ 0xffff,
+ /* key: 0x6472 */ 0xffff,
+ /* key: 0x6473 */ 0xc068,
+ /* key: 0x6474 */ 0xc069,
+ /* key: 0x6475 */ 0xffff,
+ /* key: 0x6476 */ 0x5976,
+ /* key: 0x6477 */ 0xffff,
+ /* key: 0x6478 */ 0x4c4e,
+ /* key: 0x6479 */ 0xffff,
+ /* key: 0x647a */ 0x4022,
+ /* key: 0x647b */ 0xc06a,
+ /* key: 0x647c */ 0xffff,
+ /* key: 0x647d */ 0xc06b,
+ /* key: 0x647e */ 0xffff,
+ /* key: 0x647f */ 0xffff,
+ /* key: 0x6480 */ 0xffff,
+ /* key: 0x6481 */ 0xffff,
+ /* key: 0x6482 */ 0xffff,
+ /* key: 0x6483 */ 0x3762,
+ /* key: 0x6484 */ 0xffff,
+ /* key: 0x6485 */ 0xc06c,
+ /* key: 0x6486 */ 0xffff,
+ /* key: 0x6487 */ 0xc06d,
+ /* key: 0x6488 */ 0x597d,
+ /* key: 0x6489 */ 0xffff,
+ /* key: 0x648a */ 0xffff,
+ /* key: 0x648b */ 0xffff,
+ /* key: 0x648c */ 0xffff,
+ /* key: 0x648d */ 0xffff,
+ /* key: 0x648e */ 0xffff,
+ /* key: 0x648f */ 0xc06e,
+ /* key: 0x6490 */ 0xc06f,
+ /* key: 0x6491 */ 0xc070,
+ /* key: 0x6492 */ 0x3b35,
+ /* key: 0x6493 */ 0x597a,
+ /* key: 0x6494 */ 0xffff,
+ /* key: 0x6495 */ 0x5979,
+ /* key: 0x6496 */ 0xffff,
+ /* key: 0x6497 */ 0xffff,
+ /* key: 0x6498 */ 0xc071,
+ /* key: 0x6499 */ 0xc072,
+ /* key: 0x649a */ 0x4732,
+ /* key: 0x649b */ 0xc073,
+ /* key: 0x649c */ 0xffff,
+ /* key: 0x649d */ 0xc074,
+ /* key: 0x649e */ 0x4635,
+ /* key: 0x649f */ 0xc075,
+ /* key: 0x64a0 */ 0xffff,
+ /* key: 0x64a1 */ 0xc076,
+ /* key: 0x64a2 */ 0xffff,
+ /* key: 0x64a3 */ 0xc077,
+ /* key: 0x64a4 */ 0x4531,
+ /* key: 0x64a5 */ 0x597b,
+ /* key: 0x64a6 */ 0xc078,
+ /* key: 0x64a7 */ 0xffff,
+ /* key: 0x64a8 */ 0xc079,
+ /* key: 0x64a9 */ 0x597c,
+ /* key: 0x64aa */ 0xffff,
+ /* key: 0x64ab */ 0x496f,
+ /* key: 0x64ac */ 0xc07a,
+ /* key: 0x64ad */ 0x4745,
+ /* key: 0x64ae */ 0x3b23,
+ /* key: 0x64af */ 0xffff,
+ /* key: 0x64b0 */ 0x4071,
+ /* key: 0x64b1 */ 0xffff,
+ /* key: 0x64b2 */ 0x4b50,
+ /* key: 0x64b3 */ 0xc07b,
+ /* key: 0x64b4 */ 0xffff,
+ /* key: 0x64b5 */ 0xffff,
+ /* key: 0x64b6 */ 0xffff,
+ /* key: 0x64b7 */ 0xffff,
+ /* key: 0x64b8 */ 0xffff,
+ /* key: 0x64b9 */ 0x3349,
+ /* key: 0x64ba */ 0xffff,
+ /* key: 0x64bb */ 0x5a25,
+ /* key: 0x64bc */ 0x597e,
+ /* key: 0x64bd */ 0xc07c,
+ /* key: 0x64be */ 0xc07d,
+ /* key: 0x64bf */ 0xc07e,
+ /* key: 0x64c0 */ 0xffff,
+ /* key: 0x64c1 */ 0x4d4a,
+ /* key: 0x64c2 */ 0x5a27,
+ /* key: 0x64c3 */ 0xffff,
+ /* key: 0x64c4 */ 0xc121,
+ /* key: 0x64c5 */ 0x5a23,
+ /* key: 0x64c6 */ 0xffff,
+ /* key: 0x64c7 */ 0x5a24,
+ /* key: 0x64c8 */ 0xffff,
+ /* key: 0x64c9 */ 0xc122,
+ /* key: 0x64ca */ 0xc123,
+ /* key: 0x64cb */ 0xc124,
+ /* key: 0x64cc */ 0xc125,
+ /* key: 0x64cd */ 0x4160,
+ /* key: 0x64ce */ 0xc126,
+ /* key: 0x64cf */ 0xffff,
+ /* key: 0x64d0 */ 0xc127,
+ /* key: 0x64d1 */ 0xc128,
+ /* key: 0x64d2 */ 0x5a22,
+ /* key: 0x64d3 */ 0xffff,
+ /* key: 0x64d4 */ 0x593f,
+ /* key: 0x64d5 */ 0xc129,
+ /* key: 0x64d6 */ 0xffff,
+ /* key: 0x64d7 */ 0xc12a,
+ /* key: 0x64d8 */ 0x5a26,
+ /* key: 0x64d9 */ 0xffff,
+ /* key: 0x64da */ 0x5a21,
+ /* key: 0x64db */ 0xffff,
+ /* key: 0x64dc */ 0xffff,
+ /* key: 0x64dd */ 0xffff,
+ /* key: 0x64de */ 0xffff,
+ /* key: 0x64df */ 0xffff,
+ /* key: 0x64e0 */ 0x5a2b,
+ /* key: 0x64e1 */ 0x5a2c,
+ /* key: 0x64e2 */ 0x4527,
+ /* key: 0x64e3 */ 0x5a2e,
+ /* key: 0x64e4 */ 0xc12b,
+ /* key: 0x64e5 */ 0xc12c,
+ /* key: 0x64e6 */ 0x3b24,
+ /* key: 0x64e7 */ 0x5a29,
+ /* key: 0x64e8 */ 0xffff,
+ /* key: 0x64e9 */ 0xc12d,
+ /* key: 0x64ea */ 0xc12e,
+ /* key: 0x64eb */ 0xffff,
+ /* key: 0x64ec */ 0x353c,
+ /* key: 0x64ed */ 0xc12f,
+ /* key: 0x64ee */ 0xffff,
+ /* key: 0x64ef */ 0x5a2f,
+ /* key: 0x64f0 */ 0xc130,
+ /* key: 0x64f1 */ 0x5a28,
+ /* key: 0x64f2 */ 0x5a33,
+ /* key: 0x64f3 */ 0xffff,
+ /* key: 0x64f4 */ 0x5a32,
+ /* key: 0x64f5 */ 0xc131,
+ /* key: 0x64f6 */ 0x5a31,
+ /* key: 0x64f7 */ 0xc132,
+ /* key: 0x64f8 */ 0xffff,
+ /* key: 0x64f9 */ 0xffff,
+ /* key: 0x64fa */ 0x5a34,
+ /* key: 0x64fb */ 0xc133,
+ /* key: 0x64fc */ 0xffff,
+ /* key: 0x64fd */ 0x5a36,
+ /* key: 0x64fe */ 0x3e71,
+ /* key: 0x64ff */ 0xc134,
+ /* branch: 0x650X */ 7872,
+ /* branch: 0x651X */ 7888,
+ /* branch: 0x652X */ 7904,
+ /* branch: 0x653X */ 7920,
+ /* branch: 0x654X */ 7936,
+ /* branch: 0x655X */ 7952,
+ /* branch: 0x656X */ 7968,
+ /* branch: 0x657X */ 7984,
+ /* branch: 0x658X */ 8000,
+ /* branch: 0x659X */ 8016,
+ /* branch: 0x65aX */ 8032,
+ /* branch: 0x65bX */ 8048,
+ /* branch: 0x65cX */ 8064,
+ /* branch: 0x65dX */ 8080,
+ /* branch: 0x65eX */ 8096,
+ /* branch: 0x65fX */ 8112,
+ /* key: 0x6500 */ 0x5a35,
+ /* key: 0x6501 */ 0xc135,
+ /* key: 0x6502 */ 0xffff,
+ /* key: 0x6503 */ 0xffff,
+ /* key: 0x6504 */ 0xc136,
+ /* key: 0x6505 */ 0x5a39,
+ /* key: 0x6506 */ 0xffff,
+ /* key: 0x6507 */ 0xffff,
+ /* key: 0x6508 */ 0xc137,
+ /* key: 0x6509 */ 0xc138,
+ /* key: 0x650a */ 0xc139,
+ /* key: 0x650b */ 0xffff,
+ /* key: 0x650c */ 0xffff,
+ /* key: 0x650d */ 0xffff,
+ /* key: 0x650e */ 0xffff,
+ /* key: 0x650f */ 0xc13a,
+ /* key: 0x6510 */ 0xffff,
+ /* key: 0x6511 */ 0xffff,
+ /* key: 0x6512 */ 0xffff,
+ /* key: 0x6513 */ 0xc13b,
+ /* key: 0x6514 */ 0xc13c,
+ /* key: 0x6515 */ 0xffff,
+ /* key: 0x6516 */ 0xc13d,
+ /* key: 0x6517 */ 0xffff,
+ /* key: 0x6518 */ 0x5a37,
+ /* key: 0x6519 */ 0xc13e,
+ /* key: 0x651a */ 0xffff,
+ /* key: 0x651b */ 0xc13f,
+ /* key: 0x651c */ 0x5a38,
+ /* key: 0x651d */ 0x5970,
+ /* key: 0x651e */ 0xc140,
+ /* key: 0x651f */ 0xc141,
+ /* key: 0x6520 */ 0xffff,
+ /* key: 0x6521 */ 0xffff,
+ /* key: 0x6522 */ 0xc142,
+ /* key: 0x6523 */ 0x5a3b,
+ /* key: 0x6524 */ 0x5a3a,
+ /* key: 0x6525 */ 0xffff,
+ /* key: 0x6526 */ 0xc143,
+ /* key: 0x6527 */ 0xffff,
+ /* key: 0x6528 */ 0xffff,
+ /* key: 0x6529 */ 0xc144,
+ /* key: 0x652a */ 0x5978,
+ /* key: 0x652b */ 0x5a3c,
+ /* key: 0x652c */ 0x5a30,
+ /* key: 0x652d */ 0xffff,
+ /* key: 0x652e */ 0xc145,
+ /* key: 0x652f */ 0x3b59,
+ /* key: 0x6530 */ 0xffff,
+ /* key: 0x6531 */ 0xc146,
+ /* key: 0x6532 */ 0xffff,
+ /* key: 0x6533 */ 0xffff,
+ /* key: 0x6534 */ 0x5a3d,
+ /* key: 0x6535 */ 0x5a3e,
+ /* key: 0x6536 */ 0x5a40,
+ /* key: 0x6537 */ 0x5a3f,
+ /* key: 0x6538 */ 0x5a41,
+ /* key: 0x6539 */ 0x327e,
+ /* key: 0x653a */ 0xc147,
+ /* key: 0x653b */ 0x3936,
+ /* key: 0x653c */ 0xc148,
+ /* key: 0x653d */ 0xc149,
+ /* key: 0x653e */ 0x4a7c,
+ /* key: 0x653f */ 0x402f,
+ /* key: 0x6540 */ 0xffff,
+ /* key: 0x6541 */ 0xffff,
+ /* key: 0x6542 */ 0xffff,
+ /* key: 0x6543 */ 0xc14a,
+ /* key: 0x6544 */ 0xffff,
+ /* key: 0x6545 */ 0x384e,
+ /* key: 0x6546 */ 0xffff,
+ /* key: 0x6547 */ 0xc14b,
+ /* key: 0x6548 */ 0x5a43,
+ /* key: 0x6549 */ 0xc14c,
+ /* key: 0x654a */ 0xffff,
+ /* key: 0x654b */ 0xffff,
+ /* key: 0x654c */ 0xffff,
+ /* key: 0x654d */ 0x5a46,
+ /* key: 0x654e */ 0xffff,
+ /* key: 0x654f */ 0x4952,
+ /* key: 0x6550 */ 0xc14d,
+ /* key: 0x6551 */ 0x355f,
+ /* key: 0x6552 */ 0xc14e,
+ /* key: 0x6553 */ 0xffff,
+ /* key: 0x6554 */ 0xc14f,
+ /* key: 0x6555 */ 0x5a45,
+ /* key: 0x6556 */ 0x5a44,
+ /* key: 0x6557 */ 0x4754,
+ /* key: 0x6558 */ 0x5a47,
+ /* key: 0x6559 */ 0x3635,
+ /* key: 0x655a */ 0xffff,
+ /* key: 0x655b */ 0xffff,
+ /* key: 0x655c */ 0xffff,
+ /* key: 0x655d */ 0x5a49,
+ /* key: 0x655e */ 0x5a48,
+ /* key: 0x655f */ 0xc150,
+ /* key: 0x6560 */ 0xc151,
+ /* key: 0x6561 */ 0xffff,
+ /* key: 0x6562 */ 0x343a,
+ /* key: 0x6563 */ 0x3b36,
+ /* key: 0x6564 */ 0xffff,
+ /* key: 0x6565 */ 0xffff,
+ /* key: 0x6566 */ 0x4658,
+ /* key: 0x6567 */ 0xc152,
+ /* key: 0x6568 */ 0xffff,
+ /* key: 0x6569 */ 0xffff,
+ /* key: 0x656a */ 0xffff,
+ /* key: 0x656b */ 0xc153,
+ /* key: 0x656c */ 0x3749,
+ /* key: 0x656d */ 0xffff,
+ /* key: 0x656e */ 0xffff,
+ /* key: 0x656f */ 0xffff,
+ /* key: 0x6570 */ 0x3f74,
+ /* key: 0x6571 */ 0xffff,
+ /* key: 0x6572 */ 0x5a4a,
+ /* key: 0x6573 */ 0xffff,
+ /* key: 0x6574 */ 0x4030,
+ /* key: 0x6575 */ 0x4528,
+ /* key: 0x6576 */ 0xffff,
+ /* key: 0x6577 */ 0x495f,
+ /* key: 0x6578 */ 0x5a4b,
+ /* key: 0x6579 */ 0xffff,
+ /* key: 0x657a */ 0xc154,
+ /* key: 0x657b */ 0xffff,
+ /* key: 0x657c */ 0xffff,
+ /* key: 0x657d */ 0xc155,
+ /* key: 0x657e */ 0xffff,
+ /* key: 0x657f */ 0xffff,
+ /* key: 0x6580 */ 0xffff,
+ /* key: 0x6581 */ 0xc156,
+ /* key: 0x6582 */ 0x5a4c,
+ /* key: 0x6583 */ 0x5a4d,
+ /* key: 0x6584 */ 0xffff,
+ /* key: 0x6585 */ 0xc157,
+ /* key: 0x6586 */ 0xffff,
+ /* key: 0x6587 */ 0x4a38,
+ /* key: 0x6588 */ 0x555d,
+ /* key: 0x6589 */ 0x4046,
+ /* key: 0x658a */ 0xc158,
+ /* key: 0x658b */ 0xffff,
+ /* key: 0x658c */ 0x494c,
+ /* key: 0x658d */ 0xffff,
+ /* key: 0x658e */ 0x3a58,
+ /* key: 0x658f */ 0xffff,
+ /* key: 0x6590 */ 0x4865,
+ /* key: 0x6591 */ 0x4843,
+ /* key: 0x6592 */ 0xc159,
+ /* key: 0x6593 */ 0xffff,
+ /* key: 0x6594 */ 0xffff,
+ /* key: 0x6595 */ 0xc15a,
+ /* key: 0x6596 */ 0xffff,
+ /* key: 0x6597 */ 0x454d,
+ /* key: 0x6598 */ 0xc15b,
+ /* key: 0x6599 */ 0x4e41,
+ /* key: 0x659a */ 0xffff,
+ /* key: 0x659b */ 0x5a4f,
+ /* key: 0x659c */ 0x3c50,
+ /* key: 0x659d */ 0xc15c,
+ /* key: 0x659e */ 0xffff,
+ /* key: 0x659f */ 0x5a50,
+ /* key: 0x65a0 */ 0xc15d,
+ /* key: 0x65a1 */ 0x3036,
+ /* key: 0x65a2 */ 0xffff,
+ /* key: 0x65a3 */ 0xc15e,
+ /* key: 0x65a4 */ 0x3654,
+ /* key: 0x65a5 */ 0x404d,
+ /* key: 0x65a6 */ 0xc15f,
+ /* key: 0x65a7 */ 0x4960,
+ /* key: 0x65a8 */ 0xffff,
+ /* key: 0x65a9 */ 0xffff,
+ /* key: 0x65aa */ 0xffff,
+ /* key: 0x65ab */ 0x5a51,
+ /* key: 0x65ac */ 0x3b42,
+ /* key: 0x65ad */ 0x4347,
+ /* key: 0x65ae */ 0xc160,
+ /* key: 0x65af */ 0x3b5b,
+ /* key: 0x65b0 */ 0x3f37,
+ /* key: 0x65b1 */ 0xffff,
+ /* key: 0x65b2 */ 0xc161,
+ /* key: 0x65b3 */ 0xc162,
+ /* key: 0x65b4 */ 0xc163,
+ /* key: 0x65b5 */ 0xffff,
+ /* key: 0x65b6 */ 0xffff,
+ /* key: 0x65b7 */ 0x5a52,
+ /* key: 0x65b8 */ 0xffff,
+ /* key: 0x65b9 */ 0x4a7d,
+ /* key: 0x65ba */ 0xffff,
+ /* key: 0x65bb */ 0xffff,
+ /* key: 0x65bc */ 0x3177,
+ /* key: 0x65bd */ 0x3b5c,
+ /* key: 0x65be */ 0xffff,
+ /* key: 0x65bf */ 0xc164,
+ /* key: 0x65c0 */ 0xffff,
+ /* key: 0x65c1 */ 0x5a55,
+ /* key: 0x65c2 */ 0xc165,
+ /* key: 0x65c3 */ 0x5a53,
+ /* key: 0x65c4 */ 0x5a56,
+ /* key: 0x65c5 */ 0x4e39,
+ /* key: 0x65c6 */ 0x5a54,
+ /* key: 0x65c7 */ 0xffff,
+ /* key: 0x65c8 */ 0xc166,
+ /* key: 0x65c9 */ 0xc167,
+ /* key: 0x65ca */ 0xffff,
+ /* key: 0x65cb */ 0x407b,
+ /* key: 0x65cc */ 0x5a57,
+ /* key: 0x65cd */ 0xffff,
+ /* key: 0x65ce */ 0xc168,
+ /* key: 0x65cf */ 0x4232,
+ /* key: 0x65d0 */ 0xc169,
+ /* key: 0x65d1 */ 0xffff,
+ /* key: 0x65d2 */ 0x5a58,
+ /* key: 0x65d3 */ 0xffff,
+ /* key: 0x65d4 */ 0xc16a,
+ /* key: 0x65d5 */ 0xffff,
+ /* key: 0x65d6 */ 0xc16b,
+ /* key: 0x65d7 */ 0x347a,
+ /* key: 0x65d8 */ 0xc16c,
+ /* key: 0x65d9 */ 0x5a5a,
+ /* key: 0x65da */ 0xffff,
+ /* key: 0x65db */ 0x5a59,
+ /* key: 0x65dc */ 0xffff,
+ /* key: 0x65dd */ 0xffff,
+ /* key: 0x65de */ 0xffff,
+ /* key: 0x65df */ 0xc16d,
+ /* key: 0x65e0 */ 0x5a5b,
+ /* key: 0x65e1 */ 0x5a5c,
+ /* key: 0x65e2 */ 0x347b,
+ /* key: 0x65e3 */ 0xffff,
+ /* key: 0x65e4 */ 0xffff,
+ /* key: 0x65e5 */ 0x467c,
+ /* key: 0x65e6 */ 0x4336,
+ /* key: 0x65e7 */ 0x356c,
+ /* key: 0x65e8 */ 0x3b5d,
+ /* key: 0x65e9 */ 0x4161,
+ /* key: 0x65ea */ 0xffff,
+ /* key: 0x65eb */ 0xffff,
+ /* key: 0x65ec */ 0x3d5c,
+ /* key: 0x65ed */ 0x3030,
+ /* key: 0x65ee */ 0xffff,
+ /* key: 0x65ef */ 0xffff,
+ /* key: 0x65f0 */ 0xc16e,
+ /* key: 0x65f1 */ 0x5a5d,
+ /* key: 0x65f2 */ 0xc16f,
+ /* key: 0x65f3 */ 0xffff,
+ /* key: 0x65f4 */ 0xc170,
+ /* key: 0x65f5 */ 0xc171,
+ /* key: 0x65f6 */ 0xffff,
+ /* key: 0x65f7 */ 0xffff,
+ /* key: 0x65f8 */ 0xffff,
+ /* key: 0x65f9 */ 0xc172,
+ /* key: 0x65fa */ 0x3222,
+ /* key: 0x65fb */ 0x5a61,
+ /* key: 0x65fc */ 0xffff,
+ /* key: 0x65fd */ 0xffff,
+ /* key: 0x65fe */ 0xc173,
+ /* key: 0x65ff */ 0xc174,
+ /* branch: 0x660X */ 8144,
+ /* branch: 0x661X */ 8160,
+ /* branch: 0x662X */ 8176,
+ /* branch: 0x663X */ 8192,
+ /* branch: 0x664X */ 8208,
+ /* branch: 0x665X */ 8224,
+ /* branch: 0x666X */ 8240,
+ /* branch: 0x667X */ 8256,
+ /* branch: 0x668X */ 8272,
+ /* branch: 0x669X */ 8288,
+ /* branch: 0x66aX */ 8304,
+ /* branch: 0x66bX */ 8320,
+ /* branch: 0x66cX */ 8336,
+ /* branch: 0x66dX */ 8352,
+ /* branch: 0x66eX */ 8368,
+ /* branch: 0x66fX */ 8384,
+ /* key: 0x6600 */ 0xc175,
+ /* key: 0x6601 */ 0xffff,
+ /* key: 0x6602 */ 0x3937,
+ /* key: 0x6603 */ 0x5a60,
+ /* key: 0x6604 */ 0xc176,
+ /* key: 0x6605 */ 0xffff,
+ /* key: 0x6606 */ 0x3a2b,
+ /* key: 0x6607 */ 0x3e3a,
+ /* key: 0x6608 */ 0xc177,
+ /* key: 0x6609 */ 0xc178,
+ /* key: 0x660a */ 0x5a5f,
+ /* key: 0x660b */ 0xffff,
+ /* key: 0x660c */ 0x3e3b,
+ /* key: 0x660d */ 0xc179,
+ /* key: 0x660e */ 0x4c40,
+ /* key: 0x660f */ 0x3a2a,
+ /* key: 0x6610 */ 0xffff,
+ /* key: 0x6611 */ 0xc17a,
+ /* key: 0x6612 */ 0xc17b,
+ /* key: 0x6613 */ 0x3057,
+ /* key: 0x6614 */ 0x404e,
+ /* key: 0x6615 */ 0xc17c,
+ /* key: 0x6616 */ 0xc17d,
+ /* key: 0x6617 */ 0xffff,
+ /* key: 0x6618 */ 0xffff,
+ /* key: 0x6619 */ 0xffff,
+ /* key: 0x661a */ 0xffff,
+ /* key: 0x661b */ 0xffff,
+ /* key: 0x661c */ 0x5a66,
+ /* key: 0x661d */ 0xc17e,
+ /* key: 0x661e */ 0xc221,
+ /* key: 0x661f */ 0x4031,
+ /* key: 0x6620 */ 0x3147,
+ /* key: 0x6621 */ 0xc222,
+ /* key: 0x6622 */ 0xc223,
+ /* key: 0x6623 */ 0xc224,
+ /* key: 0x6624 */ 0xc225,
+ /* key: 0x6625 */ 0x3d55,
+ /* key: 0x6626 */ 0xc226,
+ /* key: 0x6627 */ 0x4b66,
+ /* key: 0x6628 */ 0x3a72,
+ /* key: 0x6629 */ 0xc227,
+ /* key: 0x662a */ 0xc228,
+ /* key: 0x662b */ 0xc229,
+ /* key: 0x662c */ 0xc22a,
+ /* key: 0x662d */ 0x3e3c,
+ /* key: 0x662e */ 0xc22b,
+ /* key: 0x662f */ 0x4027,
+ /* key: 0x6630 */ 0xc22c,
+ /* key: 0x6631 */ 0xc22d,
+ /* key: 0x6632 */ 0xffff,
+ /* key: 0x6633 */ 0xc22e,
+ /* key: 0x6634 */ 0x5a65,
+ /* key: 0x6635 */ 0x5a63,
+ /* key: 0x6636 */ 0x5a64,
+ /* key: 0x6637 */ 0xc230,
+ /* key: 0x6638 */ 0xffff,
+ /* key: 0x6639 */ 0xc22f,
+ /* key: 0x663a */ 0xffff,
+ /* key: 0x663b */ 0xffff,
+ /* key: 0x663c */ 0x436b,
+ /* key: 0x663d */ 0xffff,
+ /* key: 0x663e */ 0xffff,
+ /* key: 0x663f */ 0x5b26,
+ /* key: 0x6640 */ 0xc231,
+ /* key: 0x6641 */ 0x5a6a,
+ /* key: 0x6642 */ 0x3b7e,
+ /* key: 0x6643 */ 0x3938,
+ /* key: 0x6644 */ 0x5a68,
+ /* key: 0x6645 */ 0xc232,
+ /* key: 0x6646 */ 0xc233,
+ /* key: 0x6647 */ 0xffff,
+ /* key: 0x6648 */ 0xffff,
+ /* key: 0x6649 */ 0x5a69,
+ /* key: 0x664a */ 0xc234,
+ /* key: 0x664b */ 0x3f38,
+ /* key: 0x664c */ 0xc235,
+ /* key: 0x664d */ 0xffff,
+ /* key: 0x664e */ 0xc237,
+ /* key: 0x664f */ 0x5a67,
+ /* key: 0x6650 */ 0xffff,
+ /* key: 0x6651 */ 0xc236,
+ /* key: 0x6652 */ 0x3b2f,
+ /* key: 0x6653 */ 0xffff,
+ /* key: 0x6654 */ 0xffff,
+ /* key: 0x6655 */ 0xffff,
+ /* key: 0x6656 */ 0xffff,
+ /* key: 0x6657 */ 0xc238,
+ /* key: 0x6658 */ 0xc239,
+ /* key: 0x6659 */ 0xc23a,
+ /* key: 0x665a */ 0xffff,
+ /* key: 0x665b */ 0xc23b,
+ /* key: 0x665c */ 0xc23c,
+ /* key: 0x665d */ 0x5a6c,
+ /* key: 0x665e */ 0x5a6b,
+ /* key: 0x665f */ 0x5a70,
+ /* key: 0x6660 */ 0xc23d,
+ /* key: 0x6661 */ 0xc23e,
+ /* key: 0x6662 */ 0x5a71,
+ /* key: 0x6663 */ 0xffff,
+ /* key: 0x6664 */ 0x5a6d,
+ /* key: 0x6665 */ 0xffff,
+ /* key: 0x6666 */ 0x3322,
+ /* key: 0x6667 */ 0x5a6e,
+ /* key: 0x6668 */ 0x5a6f,
+ /* key: 0x6669 */ 0x4855,
+ /* key: 0x666a */ 0xc240,
+ /* key: 0x666b */ 0xc241,
+ /* key: 0x666c */ 0xc242,
+ /* key: 0x666d */ 0xffff,
+ /* key: 0x666e */ 0x4961,
+ /* key: 0x666f */ 0x374a,
+ /* key: 0x6670 */ 0x5a72,
+ /* key: 0x6671 */ 0xffff,
+ /* key: 0x6672 */ 0xffff,
+ /* key: 0x6673 */ 0xc244,
+ /* key: 0x6674 */ 0x4032,
+ /* key: 0x6675 */ 0xc245,
+ /* key: 0x6676 */ 0x3e3d,
+ /* key: 0x6677 */ 0xc247,
+ /* key: 0x6678 */ 0xc248,
+ /* key: 0x6679 */ 0xc249,
+ /* key: 0x667a */ 0x4352,
+ /* key: 0x667b */ 0xc24a,
+ /* key: 0x667c */ 0xc24c,
+ /* key: 0x667d */ 0xffff,
+ /* key: 0x667e */ 0xc243,
+ /* key: 0x667f */ 0xc246,
+ /* key: 0x6680 */ 0xc24b,
+ /* key: 0x6681 */ 0x3647,
+ /* key: 0x6682 */ 0xffff,
+ /* key: 0x6683 */ 0x5a73,
+ /* key: 0x6684 */ 0x5a77,
+ /* key: 0x6685 */ 0xffff,
+ /* key: 0x6686 */ 0xffff,
+ /* key: 0x6687 */ 0x324b,
+ /* key: 0x6688 */ 0x5a74,
+ /* key: 0x6689 */ 0x5a76,
+ /* key: 0x668a */ 0xffff,
+ /* key: 0x668b */ 0xc24d,
+ /* key: 0x668c */ 0xc24e,
+ /* key: 0x668d */ 0xc24f,
+ /* key: 0x668e */ 0x5a75,
+ /* key: 0x668f */ 0xffff,
+ /* key: 0x6690 */ 0xc250,
+ /* key: 0x6691 */ 0x3d6b,
+ /* key: 0x6692 */ 0xc251,
+ /* key: 0x6693 */ 0xffff,
+ /* key: 0x6694 */ 0xffff,
+ /* key: 0x6695 */ 0xffff,
+ /* key: 0x6696 */ 0x4348,
+ /* key: 0x6697 */ 0x3045,
+ /* key: 0x6698 */ 0x5a78,
+ /* key: 0x6699 */ 0xc252,
+ /* key: 0x669a */ 0xc253,
+ /* key: 0x669b */ 0xc254,
+ /* key: 0x669c */ 0xc255,
+ /* key: 0x669d */ 0x5a79,
+ /* key: 0x669e */ 0xffff,
+ /* key: 0x669f */ 0xc256,
+ /* key: 0x66a0 */ 0xc257,
+ /* key: 0x66a1 */ 0xffff,
+ /* key: 0x66a2 */ 0x442a,
+ /* key: 0x66a3 */ 0xffff,
+ /* key: 0x66a4 */ 0xc258,
+ /* key: 0x66a5 */ 0xffff,
+ /* key: 0x66a6 */ 0x4e71,
+ /* key: 0x66a7 */ 0xffff,
+ /* key: 0x66a8 */ 0xffff,
+ /* key: 0x66a9 */ 0xffff,
+ /* key: 0x66aa */ 0xffff,
+ /* key: 0x66ab */ 0x3b43,
+ /* key: 0x66ac */ 0xffff,
+ /* key: 0x66ad */ 0xc259,
+ /* key: 0x66ae */ 0x4a6b,
+ /* key: 0x66af */ 0xffff,
+ /* key: 0x66b0 */ 0xffff,
+ /* key: 0x66b1 */ 0xc25a,
+ /* key: 0x66b2 */ 0xc25b,
+ /* key: 0x66b3 */ 0xffff,
+ /* key: 0x66b4 */ 0x4b3d,
+ /* key: 0x66b5 */ 0xc25c,
+ /* key: 0x66b6 */ 0xffff,
+ /* key: 0x66b7 */ 0xffff,
+ /* key: 0x66b8 */ 0x5b22,
+ /* key: 0x66b9 */ 0x5a7b,
+ /* key: 0x66ba */ 0xffff,
+ /* key: 0x66bb */ 0xc25d,
+ /* key: 0x66bc */ 0x5a7e,
+ /* key: 0x66bd */ 0xffff,
+ /* key: 0x66be */ 0x5a7d,
+ /* key: 0x66bf */ 0xc25e,
+ /* key: 0x66c0 */ 0xc25f,
+ /* key: 0x66c1 */ 0x5a7a,
+ /* key: 0x66c2 */ 0xc260,
+ /* key: 0x66c3 */ 0xc261,
+ /* key: 0x66c4 */ 0x5b21,
+ /* key: 0x66c5 */ 0xffff,
+ /* key: 0x66c6 */ 0xffff,
+ /* key: 0x66c7 */ 0x465e,
+ /* key: 0x66c8 */ 0xc262,
+ /* key: 0x66c9 */ 0x5a7c,
+ /* key: 0x66ca */ 0xffff,
+ /* key: 0x66cb */ 0xffff,
+ /* key: 0x66cc */ 0xc263,
+ /* key: 0x66cd */ 0xffff,
+ /* key: 0x66ce */ 0xc264,
+ /* key: 0x66cf */ 0xc265,
+ /* key: 0x66d0 */ 0xffff,
+ /* key: 0x66d1 */ 0xffff,
+ /* key: 0x66d2 */ 0xffff,
+ /* key: 0x66d3 */ 0xffff,
+ /* key: 0x66d4 */ 0xc266,
+ /* key: 0x66d5 */ 0xffff,
+ /* key: 0x66d6 */ 0x5b23,
+ /* key: 0x66d7 */ 0xffff,
+ /* key: 0x66d8 */ 0xffff,
+ /* key: 0x66d9 */ 0x3d6c,
+ /* key: 0x66da */ 0x5b24,
+ /* key: 0x66db */ 0xc267,
+ /* key: 0x66dc */ 0x4d4b,
+ /* key: 0x66dd */ 0x4778,
+ /* key: 0x66de */ 0xffff,
+ /* key: 0x66df */ 0xc268,
+ /* key: 0x66e0 */ 0x5b25,
+ /* key: 0x66e1 */ 0xffff,
+ /* key: 0x66e2 */ 0xffff,
+ /* key: 0x66e3 */ 0xffff,
+ /* key: 0x66e4 */ 0xffff,
+ /* key: 0x66e5 */ 0xffff,
+ /* key: 0x66e6 */ 0x5b27,
+ /* key: 0x66e7 */ 0xffff,
+ /* key: 0x66e8 */ 0xc269,
+ /* key: 0x66e9 */ 0x5b28,
+ /* key: 0x66ea */ 0xffff,
+ /* key: 0x66eb */ 0xc26a,
+ /* key: 0x66ec */ 0xc26b,
+ /* key: 0x66ed */ 0xffff,
+ /* key: 0x66ee */ 0xc26c,
+ /* key: 0x66ef */ 0xffff,
+ /* key: 0x66f0 */ 0x5b29,
+ /* key: 0x66f1 */ 0xffff,
+ /* key: 0x66f2 */ 0x364a,
+ /* key: 0x66f3 */ 0x3148,
+ /* key: 0x66f4 */ 0x3939,
+ /* key: 0x66f5 */ 0x5b2a,
+ /* key: 0x66f6 */ 0xffff,
+ /* key: 0x66f7 */ 0x5b2b,
+ /* key: 0x66f8 */ 0x3d71,
+ /* key: 0x66f9 */ 0x4162,
+ /* key: 0x66fa */ 0xc26d,
+ /* key: 0x66fb */ 0xc23f,
+ /* key: 0x66fc */ 0x5258,
+ /* key: 0x66fd */ 0x413e,
+ /* key: 0x66fe */ 0x413d,
+ /* key: 0x66ff */ 0x4258,
+ /* branch: 0x670X */ 8416,
+ /* branch: 0x671X */ 8432,
+ /* branch: 0x672X */ 8448,
+ /* branch: 0x673X */ 8464,
+ /* branch: 0x674X */ 8480,
+ /* branch: 0x675X */ 8496,
+ /* branch: 0x676X */ 8512,
+ /* branch: 0x677X */ 8528,
+ /* branch: 0x678X */ 8544,
+ /* branch: 0x679X */ 8560,
+ /* branch: 0x67aX */ 8576,
+ /* branch: 0x67bX */ 8592,
+ /* branch: 0x67cX */ 8608,
+ /* branch: 0x67dX */ 8624,
+ /* branch: 0x67eX */ 8640,
+ /* branch: 0x67fX */ 8656,
+ /* key: 0x6700 */ 0x3a47,
+ /* key: 0x6701 */ 0xffff,
+ /* key: 0x6702 */ 0xffff,
+ /* key: 0x6703 */ 0x5072,
+ /* key: 0x6704 */ 0xffff,
+ /* key: 0x6705 */ 0xc26e,
+ /* key: 0x6706 */ 0xffff,
+ /* key: 0x6707 */ 0xc26f,
+ /* key: 0x6708 */ 0x376e,
+ /* key: 0x6709 */ 0x4d2d,
+ /* key: 0x670a */ 0xffff,
+ /* key: 0x670b */ 0x4a7e,
+ /* key: 0x670c */ 0xffff,
+ /* key: 0x670d */ 0x497e,
+ /* key: 0x670e */ 0xc270,
+ /* key: 0x670f */ 0x5b2c,
+ /* key: 0x6710 */ 0xffff,
+ /* key: 0x6711 */ 0xffff,
+ /* key: 0x6712 */ 0xffff,
+ /* key: 0x6713 */ 0xc271,
+ /* key: 0x6714 */ 0x3a73,
+ /* key: 0x6715 */ 0x443f,
+ /* key: 0x6716 */ 0x5b2d,
+ /* key: 0x6717 */ 0x4f2f,
+ /* key: 0x6718 */ 0xffff,
+ /* key: 0x6719 */ 0xc272,
+ /* key: 0x671a */ 0xffff,
+ /* key: 0x671b */ 0x4b3e,
+ /* key: 0x671c */ 0xc273,
+ /* key: 0x671d */ 0x442b,
+ /* key: 0x671e */ 0x5b2e,
+ /* key: 0x671f */ 0x347c,
+ /* key: 0x6720 */ 0xc274,
+ /* key: 0x6721 */ 0xffff,
+ /* key: 0x6722 */ 0xc275,
+ /* key: 0x6723 */ 0xffff,
+ /* key: 0x6724 */ 0xffff,
+ /* key: 0x6725 */ 0xffff,
+ /* key: 0x6726 */ 0x5b2f,
+ /* key: 0x6727 */ 0x5b30,
+ /* key: 0x6728 */ 0x4c5a,
+ /* key: 0x6729 */ 0xffff,
+ /* key: 0x672a */ 0x4c24,
+ /* key: 0x672b */ 0x4b76,
+ /* key: 0x672c */ 0x4b5c,
+ /* key: 0x672d */ 0x3b25,
+ /* key: 0x672e */ 0x5b32,
+ /* key: 0x672f */ 0xffff,
+ /* key: 0x6730 */ 0xffff,
+ /* key: 0x6731 */ 0x3c6b,
+ /* key: 0x6732 */ 0xffff,
+ /* key: 0x6733 */ 0xc276,
+ /* key: 0x6734 */ 0x4b51,
+ /* key: 0x6735 */ 0xffff,
+ /* key: 0x6736 */ 0x5b34,
+ /* key: 0x6737 */ 0x5b37,
+ /* key: 0x6738 */ 0x5b36,
+ /* key: 0x6739 */ 0xffff,
+ /* key: 0x673a */ 0x3479,
+ /* key: 0x673b */ 0xffff,
+ /* key: 0x673c */ 0xffff,
+ /* key: 0x673d */ 0x3560,
+ /* key: 0x673e */ 0xc277,
+ /* key: 0x673f */ 0x5b33,
+ /* key: 0x6740 */ 0xffff,
+ /* key: 0x6741 */ 0x5b35,
+ /* key: 0x6742 */ 0xffff,
+ /* key: 0x6743 */ 0xffff,
+ /* key: 0x6744 */ 0xffff,
+ /* key: 0x6745 */ 0xc278,
+ /* key: 0x6746 */ 0x5b38,
+ /* key: 0x6747 */ 0xc279,
+ /* key: 0x6748 */ 0xc27a,
+ /* key: 0x6749 */ 0x3f79,
+ /* key: 0x674a */ 0xffff,
+ /* key: 0x674b */ 0xffff,
+ /* key: 0x674c */ 0xc27b,
+ /* key: 0x674d */ 0xffff,
+ /* key: 0x674e */ 0x4d7b,
+ /* key: 0x674f */ 0x3049,
+ /* key: 0x6750 */ 0x3a60,
+ /* key: 0x6751 */ 0x423c,
+ /* key: 0x6752 */ 0xffff,
+ /* key: 0x6753 */ 0x3c5d,
+ /* key: 0x6754 */ 0xc27c,
+ /* key: 0x6755 */ 0xc27d,
+ /* key: 0x6756 */ 0x3e73,
+ /* key: 0x6757 */ 0xffff,
+ /* key: 0x6758 */ 0xffff,
+ /* key: 0x6759 */ 0x5b3b,
+ /* key: 0x675a */ 0xffff,
+ /* key: 0x675b */ 0xffff,
+ /* key: 0x675c */ 0x454e,
+ /* key: 0x675d */ 0xc27e,
+ /* key: 0x675e */ 0x5b39,
+ /* key: 0x675f */ 0x422b,
+ /* key: 0x6760 */ 0x5b3a,
+ /* key: 0x6761 */ 0x3e72,
+ /* key: 0x6762 */ 0x4c5d,
+ /* key: 0x6763 */ 0x5b3c,
+ /* key: 0x6764 */ 0x5b3d,
+ /* key: 0x6765 */ 0x4d68,
+ /* key: 0x6766 */ 0xc321,
+ /* key: 0x6767 */ 0xffff,
+ /* key: 0x6768 */ 0xffff,
+ /* key: 0x6769 */ 0xffff,
+ /* key: 0x676a */ 0x5b42,
+ /* key: 0x676b */ 0xffff,
+ /* key: 0x676c */ 0xc322,
+ /* key: 0x676d */ 0x393a,
+ /* key: 0x676e */ 0xc323,
+ /* key: 0x676f */ 0x4755,
+ /* key: 0x6770 */ 0x5b3f,
+ /* key: 0x6771 */ 0x456c,
+ /* key: 0x6772 */ 0x5a5e,
+ /* key: 0x6773 */ 0x5a62,
+ /* key: 0x6774 */ 0xc324,
+ /* key: 0x6775 */ 0x354f,
+ /* key: 0x6776 */ 0xc325,
+ /* key: 0x6777 */ 0x4747,
+ /* key: 0x6778 */ 0xffff,
+ /* key: 0x6779 */ 0xffff,
+ /* key: 0x677a */ 0xffff,
+ /* key: 0x677b */ 0xc326,
+ /* key: 0x677c */ 0x5b41,
+ /* key: 0x677d */ 0xffff,
+ /* key: 0x677e */ 0x3e3e,
+ /* key: 0x677f */ 0x4844,
+ /* key: 0x6780 */ 0xffff,
+ /* key: 0x6781 */ 0xc327,
+ /* key: 0x6782 */ 0xffff,
+ /* key: 0x6783 */ 0xffff,
+ /* key: 0x6784 */ 0xc328,
+ /* key: 0x6785 */ 0x5b47,
+ /* key: 0x6786 */ 0xffff,
+ /* key: 0x6787 */ 0x487a,
+ /* key: 0x6788 */ 0xffff,
+ /* key: 0x6789 */ 0x5b3e,
+ /* key: 0x678a */ 0xffff,
+ /* key: 0x678b */ 0x5b44,
+ /* key: 0x678c */ 0x5b43,
+ /* key: 0x678d */ 0xffff,
+ /* key: 0x678e */ 0xc329,
+ /* key: 0x678f */ 0xc32a,
+ /* key: 0x6790 */ 0x404f,
+ /* key: 0x6791 */ 0xc32b,
+ /* key: 0x6792 */ 0xffff,
+ /* key: 0x6793 */ 0xc32c,
+ /* key: 0x6794 */ 0xffff,
+ /* key: 0x6795 */ 0x4b6d,
+ /* key: 0x6796 */ 0xc32d,
+ /* key: 0x6797 */ 0x4e53,
+ /* key: 0x6798 */ 0xc32e,
+ /* key: 0x6799 */ 0xc32f,
+ /* key: 0x679a */ 0x4b67,
+ /* key: 0x679b */ 0xc330,
+ /* key: 0x679c */ 0x324c,
+ /* key: 0x679d */ 0x3b5e,
+ /* key: 0x679e */ 0xffff,
+ /* key: 0x679f */ 0xffff,
+ /* key: 0x67a0 */ 0x4f48,
+ /* key: 0x67a1 */ 0x5b46,
+ /* key: 0x67a2 */ 0x3f75,
+ /* key: 0x67a3 */ 0xffff,
+ /* key: 0x67a4 */ 0xffff,
+ /* key: 0x67a5 */ 0xffff,
+ /* key: 0x67a6 */ 0x5b45,
+ /* key: 0x67a7 */ 0xffff,
+ /* key: 0x67a8 */ 0xffff,
+ /* key: 0x67a9 */ 0x5b40,
+ /* key: 0x67aa */ 0xffff,
+ /* key: 0x67ab */ 0xffff,
+ /* key: 0x67ac */ 0xffff,
+ /* key: 0x67ad */ 0xffff,
+ /* key: 0x67ae */ 0xffff,
+ /* key: 0x67af */ 0x384f,
+ /* key: 0x67b0 */ 0xc331,
+ /* key: 0x67b1 */ 0xc332,
+ /* key: 0x67b2 */ 0xc333,
+ /* key: 0x67b3 */ 0x5b4c,
+ /* key: 0x67b4 */ 0x5b4a,
+ /* key: 0x67b5 */ 0xc334,
+ /* key: 0x67b6 */ 0x324d,
+ /* key: 0x67b7 */ 0x5b48,
+ /* key: 0x67b8 */ 0x5b4e,
+ /* key: 0x67b9 */ 0x5b54,
+ /* key: 0x67ba */ 0xffff,
+ /* key: 0x67bb */ 0xc335,
+ /* key: 0x67bc */ 0xc336,
+ /* key: 0x67bd */ 0xc337,
+ /* key: 0x67be */ 0xffff,
+ /* key: 0x67bf */ 0xffff,
+ /* key: 0x67c0 */ 0xc339,
+ /* key: 0x67c1 */ 0x4248,
+ /* key: 0x67c2 */ 0xc33a,
+ /* key: 0x67c3 */ 0xc33b,
+ /* key: 0x67c4 */ 0x4a41,
+ /* key: 0x67c5 */ 0xc33c,
+ /* key: 0x67c6 */ 0x5b56,
+ /* key: 0x67c7 */ 0xffff,
+ /* key: 0x67c8 */ 0xc33d,
+ /* key: 0x67c9 */ 0xc33e,
+ /* key: 0x67ca */ 0x4922,
+ /* key: 0x67cb */ 0xffff,
+ /* key: 0x67cc */ 0xffff,
+ /* key: 0x67cd */ 0xffff,
+ /* key: 0x67ce */ 0x5b55,
+ /* key: 0x67cf */ 0x4770,
+ /* key: 0x67d0 */ 0x4b3f,
+ /* key: 0x67d1 */ 0x343b,
+ /* key: 0x67d2 */ 0xc33f,
+ /* key: 0x67d3 */ 0x4077,
+ /* key: 0x67d4 */ 0x3d40,
+ /* key: 0x67d5 */ 0xffff,
+ /* key: 0x67d6 */ 0xffff,
+ /* key: 0x67d7 */ 0xc340,
+ /* key: 0x67d8 */ 0x4453,
+ /* key: 0x67d9 */ 0xc341,
+ /* key: 0x67da */ 0x4d2e,
+ /* key: 0x67db */ 0xffff,
+ /* key: 0x67dc */ 0xc342,
+ /* key: 0x67dd */ 0x5b51,
+ /* key: 0x67de */ 0x5b50,
+ /* key: 0x67df */ 0xffff,
+ /* key: 0x67e0 */ 0xffff,
+ /* key: 0x67e1 */ 0xc343,
+ /* key: 0x67e2 */ 0x5b52,
+ /* key: 0x67e3 */ 0xffff,
+ /* key: 0x67e4 */ 0x5b4f,
+ /* key: 0x67e5 */ 0xffff,
+ /* key: 0x67e6 */ 0xc344,
+ /* key: 0x67e7 */ 0x5b57,
+ /* key: 0x67e8 */ 0xffff,
+ /* key: 0x67e9 */ 0x5b4d,
+ /* key: 0x67ea */ 0xffff,
+ /* key: 0x67eb */ 0xffff,
+ /* key: 0x67ec */ 0x5b4b,
+ /* key: 0x67ed */ 0xffff,
+ /* key: 0x67ee */ 0x5b53,
+ /* key: 0x67ef */ 0x5b49,
+ /* key: 0x67f0 */ 0xc345,
+ /* key: 0x67f1 */ 0x436c,
+ /* key: 0x67f2 */ 0xc346,
+ /* key: 0x67f3 */ 0x4c78,
+ /* key: 0x67f4 */ 0x3c46,
+ /* key: 0x67f5 */ 0x3a74,
+ /* key: 0x67f6 */ 0xc347,
+ /* key: 0x67f7 */ 0xc348,
+ /* key: 0x67f8 */ 0xffff,
+ /* key: 0x67f9 */ 0xc338,
+ /* key: 0x67fa */ 0xffff,
+ /* key: 0x67fb */ 0x3a3a,
+ /* key: 0x67fc */ 0xffff,
+ /* key: 0x67fd */ 0xffff,
+ /* key: 0x67fe */ 0x4b6f,
+ /* key: 0x67ff */ 0x3341,
+ /* branch: 0x680X */ 8688,
+ /* branch: 0x681X */ 8704,
+ /* branch: 0x682X */ 8720,
+ /* branch: 0x683X */ 8736,
+ /* branch: 0x684X */ 8752,
+ /* branch: 0x685X */ 8768,
+ /* branch: 0x686X */ 8784,
+ /* branch: 0x687X */ 8800,
+ /* branch: 0x688X */ 8816,
+ /* branch: 0x689X */ 8832,
+ /* branch: 0x68aX */ 8848,
+ /* branch: 0x68bX */ 8864,
+ /* branch: 0x68cX */ 8880,
+ /* branch: 0x68dX */ 8896,
+ /* branch: 0x68eX */ 8912,
+ /* branch: 0x68fX */ 8928,
+ /* key: 0x6800 */ 0xffff,
+ /* key: 0x6801 */ 0xffff,
+ /* key: 0x6802 */ 0x444e,
+ /* key: 0x6803 */ 0x464a,
+ /* key: 0x6804 */ 0x3149,
+ /* key: 0x6805 */ 0xffff,
+ /* key: 0x6806 */ 0xffff,
+ /* key: 0x6807 */ 0xffff,
+ /* key: 0x6808 */ 0xffff,
+ /* key: 0x6809 */ 0xffff,
+ /* key: 0x680a */ 0xffff,
+ /* key: 0x680b */ 0xffff,
+ /* key: 0x680c */ 0xffff,
+ /* key: 0x680d */ 0xffff,
+ /* key: 0x680e */ 0xffff,
+ /* key: 0x680f */ 0xffff,
+ /* key: 0x6810 */ 0xffff,
+ /* key: 0x6811 */ 0xffff,
+ /* key: 0x6812 */ 0xffff,
+ /* key: 0x6813 */ 0x4072,
+ /* key: 0x6814 */ 0xc34a,
+ /* key: 0x6815 */ 0xffff,
+ /* key: 0x6816 */ 0x4034,
+ /* key: 0x6817 */ 0x372a,
+ /* key: 0x6818 */ 0xffff,
+ /* key: 0x6819 */ 0xc34b,
+ /* key: 0x681a */ 0xffff,
+ /* key: 0x681b */ 0xffff,
+ /* key: 0x681c */ 0xffff,
+ /* key: 0x681d */ 0xc34c,
+ /* key: 0x681e */ 0x5b59,
+ /* key: 0x681f */ 0xc34d,
+ /* key: 0x6820 */ 0xffff,
+ /* key: 0x6821 */ 0x393b,
+ /* key: 0x6822 */ 0x337c,
+ /* key: 0x6823 */ 0xffff,
+ /* key: 0x6824 */ 0xffff,
+ /* key: 0x6825 */ 0xffff,
+ /* key: 0x6826 */ 0xffff,
+ /* key: 0x6827 */ 0xc34f,
+ /* key: 0x6828 */ 0xc34e,
+ /* key: 0x6829 */ 0x5b5b,
+ /* key: 0x682a */ 0x3374,
+ /* key: 0x682b */ 0x5b61,
+ /* key: 0x682c */ 0xc350,
+ /* key: 0x682d */ 0xc351,
+ /* key: 0x682e */ 0xffff,
+ /* key: 0x682f */ 0xc352,
+ /* key: 0x6830 */ 0xc353,
+ /* key: 0x6831 */ 0xc354,
+ /* key: 0x6832 */ 0x5b5e,
+ /* key: 0x6833 */ 0xc355,
+ /* key: 0x6834 */ 0x4073,
+ /* key: 0x6835 */ 0xffff,
+ /* key: 0x6836 */ 0xffff,
+ /* key: 0x6837 */ 0xffff,
+ /* key: 0x6838 */ 0x334b,
+ /* key: 0x6839 */ 0x3a2c,
+ /* key: 0x683a */ 0xffff,
+ /* key: 0x683b */ 0xc356,
+ /* key: 0x683c */ 0x334a,
+ /* key: 0x683d */ 0x3a4f,
+ /* key: 0x683e */ 0xffff,
+ /* key: 0x683f */ 0xc357,
+ /* key: 0x6840 */ 0x5b5c,
+ /* key: 0x6841 */ 0x3765,
+ /* key: 0x6842 */ 0x374b,
+ /* key: 0x6843 */ 0x456d,
+ /* key: 0x6844 */ 0xc358,
+ /* key: 0x6845 */ 0xc359,
+ /* key: 0x6846 */ 0x5b5a,
+ /* key: 0x6847 */ 0xffff,
+ /* key: 0x6848 */ 0x3046,
+ /* key: 0x6849 */ 0xffff,
+ /* key: 0x684a */ 0xc35a,
+ /* key: 0x684b */ 0xffff,
+ /* key: 0x684c */ 0xc35b,
+ /* key: 0x684d */ 0x5b5d,
+ /* key: 0x684e */ 0x5b5f,
+ /* key: 0x684f */ 0xffff,
+ /* key: 0x6850 */ 0x364d,
+ /* key: 0x6851 */ 0x372c,
+ /* key: 0x6852 */ 0xc349,
+ /* key: 0x6853 */ 0x343c,
+ /* key: 0x6854 */ 0x354b,
+ /* key: 0x6855 */ 0xc35c,
+ /* key: 0x6856 */ 0xffff,
+ /* key: 0x6857 */ 0xc35d,
+ /* key: 0x6858 */ 0xc35e,
+ /* key: 0x6859 */ 0x5b62,
+ /* key: 0x685a */ 0xffff,
+ /* key: 0x685b */ 0xc35f,
+ /* key: 0x685c */ 0x3a79,
+ /* key: 0x685d */ 0x4b71,
+ /* key: 0x685e */ 0xffff,
+ /* key: 0x685f */ 0x3b37,
+ /* key: 0x6860 */ 0xffff,
+ /* key: 0x6861 */ 0xffff,
+ /* key: 0x6862 */ 0xffff,
+ /* key: 0x6863 */ 0x5b63,
+ /* key: 0x6864 */ 0xffff,
+ /* key: 0x6865 */ 0xffff,
+ /* key: 0x6866 */ 0xffff,
+ /* key: 0x6867 */ 0x4930,
+ /* key: 0x6868 */ 0xffff,
+ /* key: 0x6869 */ 0xffff,
+ /* key: 0x686a */ 0xffff,
+ /* key: 0x686b */ 0xc360,
+ /* key: 0x686c */ 0xffff,
+ /* key: 0x686d */ 0xffff,
+ /* key: 0x686e */ 0xc361,
+ /* key: 0x686f */ 0xc362,
+ /* key: 0x6870 */ 0xc363,
+ /* key: 0x6871 */ 0xc364,
+ /* key: 0x6872 */ 0xc365,
+ /* key: 0x6873 */ 0xffff,
+ /* key: 0x6874 */ 0x5b6f,
+ /* key: 0x6875 */ 0xc366,
+ /* key: 0x6876 */ 0x3233,
+ /* key: 0x6877 */ 0x5b64,
+ /* key: 0x6878 */ 0xffff,
+ /* key: 0x6879 */ 0xc367,
+ /* key: 0x687a */ 0xc368,
+ /* key: 0x687b */ 0xc369,
+ /* key: 0x687c */ 0xc36a,
+ /* key: 0x687d */ 0xffff,
+ /* key: 0x687e */ 0x5b75,
+ /* key: 0x687f */ 0x5b65,
+ /* key: 0x6880 */ 0xffff,
+ /* key: 0x6881 */ 0x4e42,
+ /* key: 0x6882 */ 0xc36b,
+ /* key: 0x6883 */ 0x5b6c,
+ /* key: 0x6884 */ 0xc36c,
+ /* key: 0x6885 */ 0x475f,
+ /* key: 0x6886 */ 0xc36d,
+ /* key: 0x6887 */ 0xffff,
+ /* key: 0x6888 */ 0xc36e,
+ /* key: 0x6889 */ 0xffff,
+ /* key: 0x688a */ 0xffff,
+ /* key: 0x688b */ 0xffff,
+ /* key: 0x688c */ 0xffff,
+ /* key: 0x688d */ 0x5b74,
+ /* key: 0x688e */ 0xffff,
+ /* key: 0x688f */ 0x5b67,
+ /* key: 0x6890 */ 0xffff,
+ /* key: 0x6891 */ 0xffff,
+ /* key: 0x6892 */ 0xffff,
+ /* key: 0x6893 */ 0x3034,
+ /* key: 0x6894 */ 0x5b69,
+ /* key: 0x6895 */ 0xffff,
+ /* key: 0x6896 */ 0xc36f,
+ /* key: 0x6897 */ 0x393c,
+ /* key: 0x6898 */ 0xc370,
+ /* key: 0x6899 */ 0xffff,
+ /* key: 0x689a */ 0xc371,
+ /* key: 0x689b */ 0x5b6b,
+ /* key: 0x689c */ 0xc372,
+ /* key: 0x689d */ 0x5b6a,
+ /* key: 0x689e */ 0xffff,
+ /* key: 0x689f */ 0x5b66,
+ /* key: 0x68a0 */ 0x5b71,
+ /* key: 0x68a1 */ 0xc373,
+ /* key: 0x68a2 */ 0x3e3f,
+ /* key: 0x68a3 */ 0xc374,
+ /* key: 0x68a4 */ 0xffff,
+ /* key: 0x68a5 */ 0xc375,
+ /* key: 0x68a6 */ 0x546d,
+ /* key: 0x68a7 */ 0x3868,
+ /* key: 0x68a8 */ 0x4d7c,
+ /* key: 0x68a9 */ 0xc376,
+ /* key: 0x68aa */ 0xc377,
+ /* key: 0x68ab */ 0xffff,
+ /* key: 0x68ac */ 0xffff,
+ /* key: 0x68ad */ 0x5b68,
+ /* key: 0x68ae */ 0xc378,
+ /* key: 0x68af */ 0x4474,
+ /* key: 0x68b0 */ 0x3323,
+ /* key: 0x68b1 */ 0x3a2d,
+ /* key: 0x68b2 */ 0xc379,
+ /* key: 0x68b3 */ 0x5b60,
+ /* key: 0x68b4 */ 0xffff,
+ /* key: 0x68b5 */ 0x5b70,
+ /* key: 0x68b6 */ 0x3361,
+ /* key: 0x68b7 */ 0xffff,
+ /* key: 0x68b8 */ 0xffff,
+ /* key: 0x68b9 */ 0x5b6e,
+ /* key: 0x68ba */ 0x5b72,
+ /* key: 0x68bb */ 0xc37a,
+ /* key: 0x68bc */ 0x456e,
+ /* key: 0x68bd */ 0xffff,
+ /* key: 0x68be */ 0xffff,
+ /* key: 0x68bf */ 0xffff,
+ /* key: 0x68c0 */ 0xffff,
+ /* key: 0x68c1 */ 0xffff,
+ /* key: 0x68c2 */ 0xffff,
+ /* key: 0x68c3 */ 0xffff,
+ /* key: 0x68c4 */ 0x347e,
+ /* key: 0x68c5 */ 0xc37b,
+ /* key: 0x68c6 */ 0x5c32,
+ /* key: 0x68c7 */ 0xffff,
+ /* key: 0x68c8 */ 0xc37c,
+ /* key: 0x68c9 */ 0x4c49,
+ /* key: 0x68ca */ 0x5b77,
+ /* key: 0x68cb */ 0x347d,
+ /* key: 0x68cc */ 0xc37d,
+ /* key: 0x68cd */ 0x5b7e,
+ /* key: 0x68ce */ 0xffff,
+ /* key: 0x68cf */ 0xc37e,
+ /* key: 0x68d0 */ 0xc421,
+ /* key: 0x68d1 */ 0xc422,
+ /* key: 0x68d2 */ 0x4b40,
+ /* key: 0x68d3 */ 0xc423,
+ /* key: 0x68d4 */ 0x5c21,
+ /* key: 0x68d5 */ 0x5c23,
+ /* key: 0x68d6 */ 0xc424,
+ /* key: 0x68d7 */ 0x5c27,
+ /* key: 0x68d8 */ 0x5b79,
+ /* key: 0x68d9 */ 0xc425,
+ /* key: 0x68da */ 0x432a,
+ /* key: 0x68db */ 0xffff,
+ /* key: 0x68dc */ 0xc426,
+ /* key: 0x68dd */ 0xc427,
+ /* key: 0x68de */ 0xffff,
+ /* key: 0x68df */ 0x456f,
+ /* key: 0x68e0 */ 0x5c2b,
+ /* key: 0x68e1 */ 0x5b7c,
+ /* key: 0x68e2 */ 0xffff,
+ /* key: 0x68e3 */ 0x5c28,
+ /* key: 0x68e4 */ 0xffff,
+ /* key: 0x68e5 */ 0xc428,
+ /* key: 0x68e6 */ 0xffff,
+ /* key: 0x68e7 */ 0x5c22,
+ /* key: 0x68e8 */ 0xc429,
+ /* key: 0x68e9 */ 0xffff,
+ /* key: 0x68ea */ 0xc42a,
+ /* key: 0x68eb */ 0xc42b,
+ /* key: 0x68ec */ 0xc42c,
+ /* key: 0x68ed */ 0xc42d,
+ /* key: 0x68ee */ 0x3f39,
+ /* key: 0x68ef */ 0x5c2c,
+ /* key: 0x68f0 */ 0xc42e,
+ /* key: 0x68f1 */ 0xc42f,
+ /* key: 0x68f2 */ 0x4033,
+ /* key: 0x68f3 */ 0xffff,
+ /* key: 0x68f4 */ 0xffff,
+ /* key: 0x68f5 */ 0xc430,
+ /* key: 0x68f6 */ 0xc431,
+ /* key: 0x68f7 */ 0xffff,
+ /* key: 0x68f8 */ 0xffff,
+ /* key: 0x68f9 */ 0x5c2a,
+ /* key: 0x68fa */ 0x343d,
+ /* key: 0x68fb */ 0xc432,
+ /* key: 0x68fc */ 0xc433,
+ /* key: 0x68fd */ 0xc434,
+ /* key: 0x68fe */ 0xffff,
+ /* key: 0x68ff */ 0xffff,
+ /* branch: 0x690X */ 8960,
+ /* branch: 0x691X */ 8976,
+ /* branch: 0x692X */ 8992,
+ /* branch: 0x693X */ 9008,
+ /* branch: 0x694X */ 9024,
+ /* branch: 0x695X */ 9040,
+ /* branch: 0x696X */ 9056,
+ /* branch: 0x697X */ 9072,
+ /* branch: 0x698X */ 9088,
+ /* branch: 0x699X */ 9104,
+ /* branch: 0x69aX */ 9120,
+ /* branch: 0x69bX */ 9136,
+ /* branch: 0x69cX */ 9152,
+ /* branch: 0x69dX */ 9168,
+ /* branch: 0x69eX */ 9184,
+ /* branch: 0x69fX */ 9200,
+ /* key: 0x6900 */ 0x4f50,
+ /* key: 0x6901 */ 0x5b76,
+ /* key: 0x6902 */ 0xffff,
+ /* key: 0x6903 */ 0xffff,
+ /* key: 0x6904 */ 0x5c26,
+ /* key: 0x6905 */ 0x3058,
+ /* key: 0x6906 */ 0xc435,
+ /* key: 0x6907 */ 0xffff,
+ /* key: 0x6908 */ 0x5b78,
+ /* key: 0x6909 */ 0xc436,
+ /* key: 0x690a */ 0xc437,
+ /* key: 0x690b */ 0x4c3a,
+ /* key: 0x690c */ 0x5b7d,
+ /* key: 0x690d */ 0x3f22,
+ /* key: 0x690e */ 0x4447,
+ /* key: 0x690f */ 0x5b73,
+ /* key: 0x6910 */ 0xc438,
+ /* key: 0x6911 */ 0xc439,
+ /* key: 0x6912 */ 0x5c25,
+ /* key: 0x6913 */ 0xc43a,
+ /* key: 0x6914 */ 0xffff,
+ /* key: 0x6915 */ 0xffff,
+ /* key: 0x6916 */ 0xc43b,
+ /* key: 0x6917 */ 0xc43c,
+ /* key: 0x6918 */ 0xffff,
+ /* key: 0x6919 */ 0x3f7a,
+ /* key: 0x691a */ 0x5c2f,
+ /* key: 0x691b */ 0x3371,
+ /* key: 0x691c */ 0x3821,
+ /* key: 0x691d */ 0xffff,
+ /* key: 0x691e */ 0xffff,
+ /* key: 0x691f */ 0xffff,
+ /* key: 0x6920 */ 0xffff,
+ /* key: 0x6921 */ 0x5c31,
+ /* key: 0x6922 */ 0x5b7a,
+ /* key: 0x6923 */ 0x5c30,
+ /* key: 0x6924 */ 0xffff,
+ /* key: 0x6925 */ 0x5c29,
+ /* key: 0x6926 */ 0x5b7b,
+ /* key: 0x6927 */ 0xffff,
+ /* key: 0x6928 */ 0x5c2d,
+ /* key: 0x6929 */ 0xffff,
+ /* key: 0x692a */ 0x5c2e,
+ /* key: 0x692b */ 0xffff,
+ /* key: 0x692c */ 0xffff,
+ /* key: 0x692d */ 0xffff,
+ /* key: 0x692e */ 0xffff,
+ /* key: 0x692f */ 0xffff,
+ /* key: 0x6930 */ 0x5c3f,
+ /* key: 0x6931 */ 0xc43d,
+ /* key: 0x6932 */ 0xffff,
+ /* key: 0x6933 */ 0xc43e,
+ /* key: 0x6934 */ 0x464e,
+ /* key: 0x6935 */ 0xc43f,
+ /* key: 0x6936 */ 0x5c24,
+ /* key: 0x6937 */ 0xffff,
+ /* key: 0x6938 */ 0xc440,
+ /* key: 0x6939 */ 0x5c3b,
+ /* key: 0x693a */ 0xffff,
+ /* key: 0x693b */ 0xc441,
+ /* key: 0x693c */ 0xffff,
+ /* key: 0x693d */ 0x5c3d,
+ /* key: 0x693e */ 0xffff,
+ /* key: 0x693f */ 0x4458,
+ /* key: 0x6940 */ 0xffff,
+ /* key: 0x6941 */ 0xffff,
+ /* key: 0x6942 */ 0xc442,
+ /* key: 0x6943 */ 0xffff,
+ /* key: 0x6944 */ 0xffff,
+ /* key: 0x6945 */ 0xc443,
+ /* key: 0x6946 */ 0xffff,
+ /* key: 0x6947 */ 0xffff,
+ /* key: 0x6948 */ 0xffff,
+ /* key: 0x6949 */ 0xc444,
+ /* key: 0x694a */ 0x4d4c,
+ /* key: 0x694b */ 0xffff,
+ /* key: 0x694c */ 0xffff,
+ /* key: 0x694d */ 0xffff,
+ /* key: 0x694e */ 0xc445,
+ /* key: 0x694f */ 0xffff,
+ /* key: 0x6950 */ 0xffff,
+ /* key: 0x6951 */ 0xffff,
+ /* key: 0x6952 */ 0xffff,
+ /* key: 0x6953 */ 0x4976,
+ /* key: 0x6954 */ 0x5c38,
+ /* key: 0x6955 */ 0x424a,
+ /* key: 0x6956 */ 0xffff,
+ /* key: 0x6957 */ 0xc446,
+ /* key: 0x6958 */ 0xffff,
+ /* key: 0x6959 */ 0x5c3e,
+ /* key: 0x695a */ 0x413f,
+ /* key: 0x695b */ 0xc447,
+ /* key: 0x695c */ 0x5c35,
+ /* key: 0x695d */ 0x5c42,
+ /* key: 0x695e */ 0x5c41,
+ /* key: 0x695f */ 0xffff,
+ /* key: 0x6960 */ 0x466f,
+ /* key: 0x6961 */ 0x5c40,
+ /* key: 0x6962 */ 0x466a,
+ /* key: 0x6963 */ 0xc448,
+ /* key: 0x6964 */ 0xc449,
+ /* key: 0x6965 */ 0xc44a,
+ /* key: 0x6966 */ 0xc44b,
+ /* key: 0x6967 */ 0xffff,
+ /* key: 0x6968 */ 0xc44c,
+ /* key: 0x6969 */ 0xc44d,
+ /* key: 0x696a */ 0x5c44,
+ /* key: 0x696b */ 0x5c37,
+ /* key: 0x696c */ 0xc44e,
+ /* key: 0x696d */ 0x3648,
+ /* key: 0x696e */ 0x5c3a,
+ /* key: 0x696f */ 0x3d5d,
+ /* key: 0x6970 */ 0xc44f,
+ /* key: 0x6971 */ 0xc450,
+ /* key: 0x6972 */ 0xc451,
+ /* key: 0x6973 */ 0x4760,
+ /* key: 0x6974 */ 0x5c3c,
+ /* key: 0x6975 */ 0x364b,
+ /* key: 0x6976 */ 0xffff,
+ /* key: 0x6977 */ 0x5c34,
+ /* key: 0x6978 */ 0x5c36,
+ /* key: 0x6979 */ 0x5c33,
+ /* key: 0x697a */ 0xc452,
+ /* key: 0x697b */ 0xc453,
+ /* key: 0x697c */ 0x4f30,
+ /* key: 0x697d */ 0x335a,
+ /* key: 0x697e */ 0x5c39,
+ /* key: 0x697f */ 0xc454,
+ /* key: 0x6980 */ 0xc455,
+ /* key: 0x6981 */ 0x5c43,
+ /* key: 0x6982 */ 0x3335,
+ /* key: 0x6983 */ 0xffff,
+ /* key: 0x6984 */ 0xffff,
+ /* key: 0x6985 */ 0xffff,
+ /* key: 0x6986 */ 0xffff,
+ /* key: 0x6987 */ 0xffff,
+ /* key: 0x6988 */ 0xffff,
+ /* key: 0x6989 */ 0xffff,
+ /* key: 0x698a */ 0x3a67,
+ /* key: 0x698b */ 0xffff,
+ /* key: 0x698c */ 0xffff,
+ /* key: 0x698d */ 0xc456,
+ /* key: 0x698e */ 0x315d,
+ /* key: 0x698f */ 0xffff,
+ /* key: 0x6990 */ 0xffff,
+ /* key: 0x6991 */ 0x5c54,
+ /* key: 0x6992 */ 0xc457,
+ /* key: 0x6993 */ 0xffff,
+ /* key: 0x6994 */ 0x4f31,
+ /* key: 0x6995 */ 0x5c57,
+ /* key: 0x6996 */ 0xc458,
+ /* key: 0x6997 */ 0xffff,
+ /* key: 0x6998 */ 0xc459,
+ /* key: 0x6999 */ 0xffff,
+ /* key: 0x699a */ 0xffff,
+ /* key: 0x699b */ 0x3f3a,
+ /* key: 0x699c */ 0x5c56,
+ /* key: 0x699d */ 0xffff,
+ /* key: 0x699e */ 0xffff,
+ /* key: 0x699f */ 0xffff,
+ /* key: 0x69a0 */ 0x5c55,
+ /* key: 0x69a1 */ 0xc45a,
+ /* key: 0x69a2 */ 0xffff,
+ /* key: 0x69a3 */ 0xffff,
+ /* key: 0x69a4 */ 0xffff,
+ /* key: 0x69a5 */ 0xc45b,
+ /* key: 0x69a6 */ 0xc45c,
+ /* key: 0x69a7 */ 0x5c52,
+ /* key: 0x69a8 */ 0xc45d,
+ /* key: 0x69a9 */ 0xffff,
+ /* key: 0x69aa */ 0xffff,
+ /* key: 0x69ab */ 0xc45e,
+ /* key: 0x69ac */ 0xffff,
+ /* key: 0x69ad */ 0xc45f,
+ /* key: 0x69ae */ 0x5c46,
+ /* key: 0x69af */ 0xc460,
+ /* key: 0x69b0 */ 0xffff,
+ /* key: 0x69b1 */ 0x5c63,
+ /* key: 0x69b2 */ 0x5c45,
+ /* key: 0x69b3 */ 0xffff,
+ /* key: 0x69b4 */ 0x5c58,
+ /* key: 0x69b5 */ 0xffff,
+ /* key: 0x69b6 */ 0xffff,
+ /* key: 0x69b7 */ 0xc461,
+ /* key: 0x69b8 */ 0xc462,
+ /* key: 0x69b9 */ 0xffff,
+ /* key: 0x69ba */ 0xc463,
+ /* key: 0x69bb */ 0x5c50,
+ /* key: 0x69bc */ 0xc464,
+ /* key: 0x69bd */ 0xffff,
+ /* key: 0x69be */ 0x5c4b,
+ /* key: 0x69bf */ 0x5c48,
+ /* key: 0x69c0 */ 0xffff,
+ /* key: 0x69c1 */ 0x5c49,
+ /* key: 0x69c2 */ 0xffff,
+ /* key: 0x69c3 */ 0x5c51,
+ /* key: 0x69c4 */ 0xffff,
+ /* key: 0x69c5 */ 0xc465,
+ /* key: 0x69c6 */ 0xffff,
+ /* key: 0x69c7 */ 0x7422,
+ /* key: 0x69c8 */ 0xc466,
+ /* key: 0x69c9 */ 0xffff,
+ /* key: 0x69ca */ 0x5c4e,
+ /* key: 0x69cb */ 0x393d,
+ /* key: 0x69cc */ 0x4448,
+ /* key: 0x69cd */ 0x4164,
+ /* key: 0x69ce */ 0x5c4c,
+ /* key: 0x69cf */ 0xffff,
+ /* key: 0x69d0 */ 0x5c47,
+ /* key: 0x69d1 */ 0xc467,
+ /* key: 0x69d2 */ 0xffff,
+ /* key: 0x69d3 */ 0x5c4a,
+ /* key: 0x69d4 */ 0xffff,
+ /* key: 0x69d5 */ 0xffff,
+ /* key: 0x69d6 */ 0xc468,
+ /* key: 0x69d7 */ 0xc469,
+ /* key: 0x69d8 */ 0x4d4d,
+ /* key: 0x69d9 */ 0x4b6a,
+ /* key: 0x69da */ 0xffff,
+ /* key: 0x69db */ 0xffff,
+ /* key: 0x69dc */ 0xffff,
+ /* key: 0x69dd */ 0x5c4f,
+ /* key: 0x69de */ 0x5c59,
+ /* key: 0x69df */ 0xffff,
+ /* key: 0x69e0 */ 0xffff,
+ /* key: 0x69e1 */ 0xffff,
+ /* key: 0x69e2 */ 0xc46a,
+ /* key: 0x69e3 */ 0xffff,
+ /* key: 0x69e4 */ 0xffff,
+ /* key: 0x69e5 */ 0xc46b,
+ /* key: 0x69e6 */ 0xffff,
+ /* key: 0x69e7 */ 0x5c61,
+ /* key: 0x69e8 */ 0x5c5a,
+ /* key: 0x69e9 */ 0xffff,
+ /* key: 0x69ea */ 0xffff,
+ /* key: 0x69eb */ 0x5c67,
+ /* key: 0x69ec */ 0xffff,
+ /* key: 0x69ed */ 0x5c65,
+ /* key: 0x69ee */ 0xc46c,
+ /* key: 0x69ef */ 0xc46d,
+ /* key: 0x69f0 */ 0xffff,
+ /* key: 0x69f1 */ 0xc46e,
+ /* key: 0x69f2 */ 0x5c60,
+ /* key: 0x69f3 */ 0xc46f,
+ /* key: 0x69f4 */ 0xffff,
+ /* key: 0x69f5 */ 0xc470,
+ /* key: 0x69f6 */ 0xffff,
+ /* key: 0x69f7 */ 0xffff,
+ /* key: 0x69f8 */ 0xffff,
+ /* key: 0x69f9 */ 0x5c5f,
+ /* key: 0x69fa */ 0xffff,
+ /* key: 0x69fb */ 0x4450,
+ /* key: 0x69fc */ 0xffff,
+ /* key: 0x69fd */ 0x4165,
+ /* key: 0x69fe */ 0xc471,
+ /* key: 0x69ff */ 0x5c5d,
+ /* branch: 0x6a0X */ 9232,
+ /* branch: 0x6a1X */ 9248,
+ /* branch: 0x6a2X */ 9264,
+ /* branch: 0x6a3X */ 9280,
+ /* branch: 0x6a4X */ 9296,
+ /* branch: 0x6a5X */ 9312,
+ /* branch: 0x6a6X */ 9328,
+ /* branch: 0x6a7X */ 9344,
+ /* branch: 0x6a8X */ 9360,
+ /* branch: 0x6a9X */ 9376,
+ /* branch: 0x6aaX */ 9392,
+ /* branch: 0x6abX */ 9408,
+ /* branch: 0x6acX */ 9424,
+ /* branch: 0x6adX */ 9440,
+ /* branch: 0x6aeX */ 9456,
+ /* branch: 0x6afX */ 9472,
+ /* key: 0x6a00 */ 0xc472,
+ /* key: 0x6a01 */ 0xc473,
+ /* key: 0x6a02 */ 0x5c5b,
+ /* key: 0x6a03 */ 0xc474,
+ /* key: 0x6a04 */ 0xffff,
+ /* key: 0x6a05 */ 0x5c62,
+ /* key: 0x6a06 */ 0xffff,
+ /* key: 0x6a07 */ 0xffff,
+ /* key: 0x6a08 */ 0xffff,
+ /* key: 0x6a09 */ 0xffff,
+ /* key: 0x6a0a */ 0x5c68,
+ /* key: 0x6a0b */ 0x4875,
+ /* key: 0x6a0c */ 0x5c6e,
+ /* key: 0x6a0d */ 0xffff,
+ /* key: 0x6a0e */ 0xffff,
+ /* key: 0x6a0f */ 0xc475,
+ /* key: 0x6a10 */ 0xffff,
+ /* key: 0x6a11 */ 0xc476,
+ /* key: 0x6a12 */ 0x5c69,
+ /* key: 0x6a13 */ 0x5c6c,
+ /* key: 0x6a14 */ 0x5c66,
+ /* key: 0x6a15 */ 0xc477,
+ /* key: 0x6a16 */ 0xffff,
+ /* key: 0x6a17 */ 0x4374,
+ /* key: 0x6a18 */ 0xffff,
+ /* key: 0x6a19 */ 0x4938,
+ /* key: 0x6a1a */ 0xc478,
+ /* key: 0x6a1b */ 0x5c5c,
+ /* key: 0x6a1c */ 0xffff,
+ /* key: 0x6a1d */ 0xc479,
+ /* key: 0x6a1e */ 0x5c64,
+ /* key: 0x6a1f */ 0x3e40,
+ /* key: 0x6a20 */ 0xc47a,
+ /* key: 0x6a21 */ 0x4c4f,
+ /* key: 0x6a22 */ 0x5c78,
+ /* key: 0x6a23 */ 0x5c6b,
+ /* key: 0x6a24 */ 0xc47b,
+ /* key: 0x6a25 */ 0xffff,
+ /* key: 0x6a26 */ 0xffff,
+ /* key: 0x6a27 */ 0xffff,
+ /* key: 0x6a28 */ 0xc47c,
+ /* key: 0x6a29 */ 0x3822,
+ /* key: 0x6a2a */ 0x3223,
+ /* key: 0x6a2b */ 0x335f,
+ /* key: 0x6a2c */ 0xffff,
+ /* key: 0x6a2d */ 0xffff,
+ /* key: 0x6a2e */ 0x5c53,
+ /* key: 0x6a2f */ 0xffff,
+ /* key: 0x6a30 */ 0xc47d,
+ /* key: 0x6a31 */ 0xffff,
+ /* key: 0x6a32 */ 0xc47e,
+ /* key: 0x6a33 */ 0xffff,
+ /* key: 0x6a34 */ 0xc521,
+ /* key: 0x6a35 */ 0x3e41,
+ /* key: 0x6a36 */ 0x5c70,
+ /* key: 0x6a37 */ 0xc522,
+ /* key: 0x6a38 */ 0x5c77,
+ /* key: 0x6a39 */ 0x3c79,
+ /* key: 0x6a3a */ 0x3372,
+ /* key: 0x6a3b */ 0xc523,
+ /* key: 0x6a3c */ 0xffff,
+ /* key: 0x6a3d */ 0x432e,
+ /* key: 0x6a3e */ 0xc524,
+ /* key: 0x6a3f */ 0xc525,
+ /* key: 0x6a40 */ 0xffff,
+ /* key: 0x6a41 */ 0xffff,
+ /* key: 0x6a42 */ 0xffff,
+ /* key: 0x6a43 */ 0xffff,
+ /* key: 0x6a44 */ 0x5c6d,
+ /* key: 0x6a45 */ 0xc526,
+ /* key: 0x6a46 */ 0xc527,
+ /* key: 0x6a47 */ 0x5c72,
+ /* key: 0x6a48 */ 0x5c76,
+ /* key: 0x6a49 */ 0xc528,
+ /* key: 0x6a4a */ 0xc529,
+ /* key: 0x6a4b */ 0x3636,
+ /* key: 0x6a4c */ 0xffff,
+ /* key: 0x6a4d */ 0xffff,
+ /* key: 0x6a4e */ 0xc52a,
+ /* key: 0x6a4f */ 0xffff,
+ /* key: 0x6a50 */ 0xc52b,
+ /* key: 0x6a51 */ 0xc52c,
+ /* key: 0x6a52 */ 0xc52d,
+ /* key: 0x6a53 */ 0xffff,
+ /* key: 0x6a54 */ 0xffff,
+ /* key: 0x6a55 */ 0xc52e,
+ /* key: 0x6a56 */ 0xc52f,
+ /* key: 0x6a57 */ 0xffff,
+ /* key: 0x6a58 */ 0x354c,
+ /* key: 0x6a59 */ 0x5c74,
+ /* key: 0x6a5a */ 0xffff,
+ /* key: 0x6a5b */ 0xc530,
+ /* key: 0x6a5c */ 0xffff,
+ /* key: 0x6a5d */ 0xffff,
+ /* key: 0x6a5e */ 0xffff,
+ /* key: 0x6a5f */ 0x3521,
+ /* key: 0x6a60 */ 0xffff,
+ /* key: 0x6a61 */ 0x464b,
+ /* key: 0x6a62 */ 0x5c73,
+ /* key: 0x6a63 */ 0xffff,
+ /* key: 0x6a64 */ 0xc531,
+ /* key: 0x6a65 */ 0xffff,
+ /* key: 0x6a66 */ 0x5c75,
+ /* key: 0x6a67 */ 0xc532,
+ /* key: 0x6a68 */ 0xffff,
+ /* key: 0x6a69 */ 0xffff,
+ /* key: 0x6a6a */ 0xc533,
+ /* key: 0x6a6b */ 0xffff,
+ /* key: 0x6a6c */ 0xffff,
+ /* key: 0x6a6d */ 0xffff,
+ /* key: 0x6a6e */ 0xffff,
+ /* key: 0x6a6f */ 0xffff,
+ /* key: 0x6a70 */ 0xffff,
+ /* key: 0x6a71 */ 0xc534,
+ /* key: 0x6a72 */ 0x5c6f,
+ /* key: 0x6a73 */ 0xc535,
+ /* key: 0x6a74 */ 0xffff,
+ /* key: 0x6a75 */ 0xffff,
+ /* key: 0x6a76 */ 0xffff,
+ /* key: 0x6a77 */ 0xffff,
+ /* key: 0x6a78 */ 0x5c71,
+ /* key: 0x6a79 */ 0xffff,
+ /* key: 0x6a7a */ 0xffff,
+ /* key: 0x6a7b */ 0xffff,
+ /* key: 0x6a7c */ 0xffff,
+ /* key: 0x6a7d */ 0xffff,
+ /* key: 0x6a7e */ 0xc536,
+ /* key: 0x6a7f */ 0x3360,
+ /* key: 0x6a80 */ 0x4349,
+ /* key: 0x6a81 */ 0xc537,
+ /* key: 0x6a82 */ 0xffff,
+ /* key: 0x6a83 */ 0xc538,
+ /* key: 0x6a84 */ 0x5c7c,
+ /* key: 0x6a85 */ 0xffff,
+ /* key: 0x6a86 */ 0xc539,
+ /* key: 0x6a87 */ 0xc53a,
+ /* key: 0x6a88 */ 0xffff,
+ /* key: 0x6a89 */ 0xc53b,
+ /* key: 0x6a8a */ 0xffff,
+ /* key: 0x6a8b */ 0xc53c,
+ /* key: 0x6a8c */ 0xffff,
+ /* key: 0x6a8d */ 0x5c7a,
+ /* key: 0x6a8e */ 0x3869,
+ /* key: 0x6a8f */ 0xffff,
+ /* key: 0x6a90 */ 0x5c79,
+ /* key: 0x6a91 */ 0xc53d,
+ /* key: 0x6a92 */ 0xffff,
+ /* key: 0x6a93 */ 0xffff,
+ /* key: 0x6a94 */ 0xffff,
+ /* key: 0x6a95 */ 0xffff,
+ /* key: 0x6a96 */ 0xffff,
+ /* key: 0x6a97 */ 0x5d21,
+ /* key: 0x6a98 */ 0xffff,
+ /* key: 0x6a99 */ 0xffff,
+ /* key: 0x6a9a */ 0xffff,
+ /* key: 0x6a9b */ 0xc53e,
+ /* key: 0x6a9c */ 0x5b58,
+ /* key: 0x6a9d */ 0xc53f,
+ /* key: 0x6a9e */ 0xc540,
+ /* key: 0x6a9f */ 0xc541,
+ /* key: 0x6aa0 */ 0x5c7b,
+ /* key: 0x6aa1 */ 0xffff,
+ /* key: 0x6aa2 */ 0x5c7d,
+ /* key: 0x6aa3 */ 0x5c7e,
+ /* key: 0x6aa4 */ 0xffff,
+ /* key: 0x6aa5 */ 0xc542,
+ /* key: 0x6aa6 */ 0xffff,
+ /* key: 0x6aa7 */ 0xffff,
+ /* key: 0x6aa8 */ 0xffff,
+ /* key: 0x6aa9 */ 0xffff,
+ /* key: 0x6aaa */ 0x5d2c,
+ /* key: 0x6aab */ 0xc543,
+ /* key: 0x6aac */ 0x5d28,
+ /* key: 0x6aad */ 0xffff,
+ /* key: 0x6aae */ 0x5b6d,
+ /* key: 0x6aaf */ 0xc544,
+ /* key: 0x6ab0 */ 0xc545,
+ /* key: 0x6ab1 */ 0xc546,
+ /* key: 0x6ab2 */ 0xffff,
+ /* key: 0x6ab3 */ 0x5d27,
+ /* key: 0x6ab4 */ 0xc547,
+ /* key: 0x6ab5 */ 0xffff,
+ /* key: 0x6ab6 */ 0xffff,
+ /* key: 0x6ab7 */ 0xffff,
+ /* key: 0x6ab8 */ 0x5d26,
+ /* key: 0x6ab9 */ 0xffff,
+ /* key: 0x6aba */ 0xffff,
+ /* key: 0x6abb */ 0x5d23,
+ /* key: 0x6abc */ 0xffff,
+ /* key: 0x6abd */ 0xc548,
+ /* key: 0x6abe */ 0xc549,
+ /* key: 0x6abf */ 0xc54a,
+ /* key: 0x6ac0 */ 0xffff,
+ /* key: 0x6ac1 */ 0x5c6a,
+ /* key: 0x6ac2 */ 0x5d25,
+ /* key: 0x6ac3 */ 0x5d24,
+ /* key: 0x6ac4 */ 0xffff,
+ /* key: 0x6ac5 */ 0xffff,
+ /* key: 0x6ac6 */ 0xc54b,
+ /* key: 0x6ac7 */ 0xffff,
+ /* key: 0x6ac8 */ 0xc54d,
+ /* key: 0x6ac9 */ 0xc54c,
+ /* key: 0x6aca */ 0xffff,
+ /* key: 0x6acb */ 0xffff,
+ /* key: 0x6acc */ 0xc54e,
+ /* key: 0x6acd */ 0xffff,
+ /* key: 0x6ace */ 0xffff,
+ /* key: 0x6acf */ 0xffff,
+ /* key: 0x6ad0 */ 0xc54f,
+ /* key: 0x6ad1 */ 0x5d2a,
+ /* key: 0x6ad2 */ 0xffff,
+ /* key: 0x6ad3 */ 0x4f26,
+ /* key: 0x6ad4 */ 0xc550,
+ /* key: 0x6ad5 */ 0xc551,
+ /* key: 0x6ad6 */ 0xc552,
+ /* key: 0x6ad7 */ 0xffff,
+ /* key: 0x6ad8 */ 0xffff,
+ /* key: 0x6ad9 */ 0xffff,
+ /* key: 0x6ada */ 0x5d2d,
+ /* key: 0x6adb */ 0x367b,
+ /* key: 0x6adc */ 0xc553,
+ /* key: 0x6add */ 0xc554,
+ /* key: 0x6ade */ 0x5d29,
+ /* key: 0x6adf */ 0x5d2b,
+ /* key: 0x6ae0 */ 0xffff,
+ /* key: 0x6ae1 */ 0xffff,
+ /* key: 0x6ae2 */ 0xffff,
+ /* key: 0x6ae3 */ 0xffff,
+ /* key: 0x6ae4 */ 0xc555,
+ /* key: 0x6ae5 */ 0xffff,
+ /* key: 0x6ae6 */ 0xffff,
+ /* key: 0x6ae7 */ 0xc556,
+ /* key: 0x6ae8 */ 0x4827,
+ /* key: 0x6ae9 */ 0xffff,
+ /* key: 0x6aea */ 0x5d2e,
+ /* key: 0x6aeb */ 0xffff,
+ /* key: 0x6aec */ 0xc557,
+ /* key: 0x6aed */ 0xffff,
+ /* key: 0x6aee */ 0xffff,
+ /* key: 0x6aef */ 0xffff,
+ /* key: 0x6af0 */ 0xc558,
+ /* key: 0x6af1 */ 0xc559,
+ /* key: 0x6af2 */ 0xc55a,
+ /* key: 0x6af3 */ 0xffff,
+ /* key: 0x6af4 */ 0xffff,
+ /* key: 0x6af5 */ 0xffff,
+ /* key: 0x6af6 */ 0xffff,
+ /* key: 0x6af7 */ 0xffff,
+ /* key: 0x6af8 */ 0xffff,
+ /* key: 0x6af9 */ 0xffff,
+ /* key: 0x6afa */ 0x5d32,
+ /* key: 0x6afb */ 0x5d2f,
+ /* key: 0x6afc */ 0xc55b,
+ /* key: 0x6afd */ 0xc55c,
+ /* key: 0x6afe */ 0xffff,
+ /* key: 0x6aff */ 0xffff,
+ /* branch: 0x6b0X */ 9504,
+ /* branch: 0x6b1X */ 9520,
+ /* branch: 0x6b2X */ 9536,
+ /* branch: 0x6b3X */ 9552,
+ /* branch: 0x6b4X */ 9568,
+ /* branch: 0x6b5X */ 9584,
+ /* branch: 0x6b6X */ 9600,
+ /* branch: 0x6b7X */ 9616,
+ /* branch: 0x6b8X */ 9632,
+ /* branch: 0x6b9X */ 9648,
+ /* branch: 0x6baX */ 9664,
+ /* branch: 0x6bbX */ 9680,
+ /* branch: 0x6bcX */ 9696,
+ /* branch: 0x6bdX */ 9712,
+ /* branch: 0x6beX */ 9728,
+ /* branch: 0x6bfX */ 9744,
+ /* key: 0x6b00 */ 0xffff,
+ /* key: 0x6b01 */ 0xffff,
+ /* key: 0x6b02 */ 0xc55d,
+ /* key: 0x6b03 */ 0xc55e,
+ /* key: 0x6b04 */ 0x4d73,
+ /* key: 0x6b05 */ 0x5d30,
+ /* key: 0x6b06 */ 0xc55f,
+ /* key: 0x6b07 */ 0xc560,
+ /* key: 0x6b08 */ 0xffff,
+ /* key: 0x6b09 */ 0xc561,
+ /* key: 0x6b0a */ 0x5c5e,
+ /* key: 0x6b0b */ 0xffff,
+ /* key: 0x6b0c */ 0xffff,
+ /* key: 0x6b0d */ 0xffff,
+ /* key: 0x6b0e */ 0xffff,
+ /* key: 0x6b0f */ 0xc562,
+ /* key: 0x6b10 */ 0xc563,
+ /* key: 0x6b11 */ 0xc564,
+ /* key: 0x6b12 */ 0x5d33,
+ /* key: 0x6b13 */ 0xffff,
+ /* key: 0x6b14 */ 0xffff,
+ /* key: 0x6b15 */ 0xffff,
+ /* key: 0x6b16 */ 0x5d34,
+ /* key: 0x6b17 */ 0xc565,
+ /* key: 0x6b18 */ 0xffff,
+ /* key: 0x6b19 */ 0xffff,
+ /* key: 0x6b1a */ 0xffff,
+ /* key: 0x6b1b */ 0xc566,
+ /* key: 0x6b1c */ 0xffff,
+ /* key: 0x6b1d */ 0x3135,
+ /* key: 0x6b1e */ 0xc567,
+ /* key: 0x6b1f */ 0x5d36,
+ /* key: 0x6b20 */ 0x3767,
+ /* key: 0x6b21 */ 0x3c21,
+ /* key: 0x6b22 */ 0xffff,
+ /* key: 0x6b23 */ 0x3655,
+ /* key: 0x6b24 */ 0xc568,
+ /* key: 0x6b25 */ 0xffff,
+ /* key: 0x6b26 */ 0xffff,
+ /* key: 0x6b27 */ 0x3224,
+ /* key: 0x6b28 */ 0xc569,
+ /* key: 0x6b29 */ 0xffff,
+ /* key: 0x6b2a */ 0xffff,
+ /* key: 0x6b2b */ 0xc56a,
+ /* key: 0x6b2c */ 0xc56b,
+ /* key: 0x6b2d */ 0xffff,
+ /* key: 0x6b2e */ 0xffff,
+ /* key: 0x6b2f */ 0xc56c,
+ /* key: 0x6b30 */ 0xffff,
+ /* key: 0x6b31 */ 0xffff,
+ /* key: 0x6b32 */ 0x4d5f,
+ /* key: 0x6b33 */ 0xffff,
+ /* key: 0x6b34 */ 0xffff,
+ /* key: 0x6b35 */ 0xc56d,
+ /* key: 0x6b36 */ 0xc56e,
+ /* key: 0x6b37 */ 0x5d38,
+ /* key: 0x6b38 */ 0x5d37,
+ /* key: 0x6b39 */ 0x5d3a,
+ /* key: 0x6b3a */ 0x353d,
+ /* key: 0x6b3b */ 0xc56f,
+ /* key: 0x6b3c */ 0xffff,
+ /* key: 0x6b3d */ 0x3656,
+ /* key: 0x6b3e */ 0x343e,
+ /* key: 0x6b3f */ 0xc570,
+ /* key: 0x6b40 */ 0xffff,
+ /* key: 0x6b41 */ 0xffff,
+ /* key: 0x6b42 */ 0xffff,
+ /* key: 0x6b43 */ 0x5d3d,
+ /* key: 0x6b44 */ 0xffff,
+ /* key: 0x6b45 */ 0xffff,
+ /* key: 0x6b46 */ 0xc571,
+ /* key: 0x6b47 */ 0x5d3c,
+ /* key: 0x6b48 */ 0xffff,
+ /* key: 0x6b49 */ 0x5d3e,
+ /* key: 0x6b4a */ 0xc572,
+ /* key: 0x6b4b */ 0xffff,
+ /* key: 0x6b4c */ 0x324e,
+ /* key: 0x6b4d */ 0xc573,
+ /* key: 0x6b4e */ 0x4337,
+ /* key: 0x6b4f */ 0xffff,
+ /* key: 0x6b50 */ 0x5d3f,
+ /* key: 0x6b51 */ 0xffff,
+ /* key: 0x6b52 */ 0xc574,
+ /* key: 0x6b53 */ 0x343f,
+ /* key: 0x6b54 */ 0x5d41,
+ /* key: 0x6b55 */ 0xffff,
+ /* key: 0x6b56 */ 0xc575,
+ /* key: 0x6b57 */ 0xffff,
+ /* key: 0x6b58 */ 0xc576,
+ /* key: 0x6b59 */ 0x5d40,
+ /* key: 0x6b5a */ 0xffff,
+ /* key: 0x6b5b */ 0x5d42,
+ /* key: 0x6b5c */ 0xffff,
+ /* key: 0x6b5d */ 0xc577,
+ /* key: 0x6b5e */ 0xffff,
+ /* key: 0x6b5f */ 0x5d43,
+ /* key: 0x6b60 */ 0xc578,
+ /* key: 0x6b61 */ 0x5d44,
+ /* key: 0x6b62 */ 0x3b5f,
+ /* key: 0x6b63 */ 0x4035,
+ /* key: 0x6b64 */ 0x3a21,
+ /* key: 0x6b65 */ 0xffff,
+ /* key: 0x6b66 */ 0x4970,
+ /* key: 0x6b67 */ 0xc579,
+ /* key: 0x6b68 */ 0xffff,
+ /* key: 0x6b69 */ 0x4a62,
+ /* key: 0x6b6a */ 0x4f44,
+ /* key: 0x6b6b */ 0xc57a,
+ /* key: 0x6b6c */ 0xffff,
+ /* key: 0x6b6d */ 0xffff,
+ /* key: 0x6b6e */ 0xc57b,
+ /* key: 0x6b6f */ 0x3b75,
+ /* key: 0x6b70 */ 0xc57c,
+ /* key: 0x6b71 */ 0xffff,
+ /* key: 0x6b72 */ 0xffff,
+ /* key: 0x6b73 */ 0x3a50,
+ /* key: 0x6b74 */ 0x4e72,
+ /* key: 0x6b75 */ 0xc57d,
+ /* key: 0x6b76 */ 0xffff,
+ /* key: 0x6b77 */ 0xffff,
+ /* key: 0x6b78 */ 0x5d45,
+ /* key: 0x6b79 */ 0x5d46,
+ /* key: 0x6b7a */ 0xffff,
+ /* key: 0x6b7b */ 0x3b60,
+ /* key: 0x6b7c */ 0xffff,
+ /* key: 0x6b7d */ 0xc57e,
+ /* key: 0x6b7e */ 0xc621,
+ /* key: 0x6b7f */ 0x5d47,
+ /* key: 0x6b80 */ 0x5d48,
+ /* key: 0x6b81 */ 0xffff,
+ /* key: 0x6b82 */ 0xc622,
+ /* key: 0x6b83 */ 0x5d4a,
+ /* key: 0x6b84 */ 0x5d49,
+ /* key: 0x6b85 */ 0xc623,
+ /* key: 0x6b86 */ 0x4b58,
+ /* key: 0x6b87 */ 0xffff,
+ /* key: 0x6b88 */ 0xffff,
+ /* key: 0x6b89 */ 0x3d5e,
+ /* key: 0x6b8a */ 0x3c6c,
+ /* key: 0x6b8b */ 0x3b44,
+ /* key: 0x6b8c */ 0xffff,
+ /* key: 0x6b8d */ 0x5d4b,
+ /* key: 0x6b8e */ 0xffff,
+ /* key: 0x6b8f */ 0xffff,
+ /* key: 0x6b90 */ 0xffff,
+ /* key: 0x6b91 */ 0xffff,
+ /* key: 0x6b92 */ 0xffff,
+ /* key: 0x6b93 */ 0xffff,
+ /* key: 0x6b94 */ 0xffff,
+ /* key: 0x6b95 */ 0x5d4d,
+ /* key: 0x6b96 */ 0x3f23,
+ /* key: 0x6b97 */ 0xc624,
+ /* key: 0x6b98 */ 0x5d4c,
+ /* key: 0x6b99 */ 0xffff,
+ /* key: 0x6b9a */ 0xffff,
+ /* key: 0x6b9b */ 0xc625,
+ /* key: 0x6b9c */ 0xffff,
+ /* key: 0x6b9d */ 0xffff,
+ /* key: 0x6b9e */ 0x5d4e,
+ /* key: 0x6b9f */ 0xc626,
+ /* key: 0x6ba0 */ 0xc627,
+ /* key: 0x6ba1 */ 0xffff,
+ /* key: 0x6ba2 */ 0xc628,
+ /* key: 0x6ba3 */ 0xc629,
+ /* key: 0x6ba4 */ 0x5d4f,
+ /* key: 0x6ba5 */ 0xffff,
+ /* key: 0x6ba6 */ 0xffff,
+ /* key: 0x6ba7 */ 0xffff,
+ /* key: 0x6ba8 */ 0xc62a,
+ /* key: 0x6ba9 */ 0xc62b,
+ /* key: 0x6baa */ 0x5d50,
+ /* key: 0x6bab */ 0x5d51,
+ /* key: 0x6bac */ 0xc62c,
+ /* key: 0x6bad */ 0xc62d,
+ /* key: 0x6bae */ 0xc62e,
+ /* key: 0x6baf */ 0x5d52,
+ /* key: 0x6bb0 */ 0xc62f,
+ /* key: 0x6bb1 */ 0x5d54,
+ /* key: 0x6bb2 */ 0x5d53,
+ /* key: 0x6bb3 */ 0x5d55,
+ /* key: 0x6bb4 */ 0x3225,
+ /* key: 0x6bb5 */ 0x434a,
+ /* key: 0x6bb6 */ 0xffff,
+ /* key: 0x6bb7 */ 0x5d56,
+ /* key: 0x6bb8 */ 0xc630,
+ /* key: 0x6bb9 */ 0xc631,
+ /* key: 0x6bba */ 0x3b26,
+ /* key: 0x6bbb */ 0x334c,
+ /* key: 0x6bbc */ 0x5d57,
+ /* key: 0x6bbd */ 0xc632,
+ /* key: 0x6bbe */ 0xc633,
+ /* key: 0x6bbf */ 0x4542,
+ /* key: 0x6bc0 */ 0x544c,
+ /* key: 0x6bc1 */ 0xffff,
+ /* key: 0x6bc2 */ 0xffff,
+ /* key: 0x6bc3 */ 0xc634,
+ /* key: 0x6bc4 */ 0xc635,
+ /* key: 0x6bc5 */ 0x3523,
+ /* key: 0x6bc6 */ 0x5d58,
+ /* key: 0x6bc7 */ 0xffff,
+ /* key: 0x6bc8 */ 0xffff,
+ /* key: 0x6bc9 */ 0xc636,
+ /* key: 0x6bca */ 0xffff,
+ /* key: 0x6bcb */ 0x5d59,
+ /* key: 0x6bcc */ 0xc637,
+ /* key: 0x6bcd */ 0x4a6c,
+ /* key: 0x6bce */ 0x4b68,
+ /* key: 0x6bcf */ 0xffff,
+ /* key: 0x6bd0 */ 0xffff,
+ /* key: 0x6bd1 */ 0xffff,
+ /* key: 0x6bd2 */ 0x4647,
+ /* key: 0x6bd3 */ 0x5d5a,
+ /* key: 0x6bd4 */ 0x4866,
+ /* key: 0x6bd5 */ 0xffff,
+ /* key: 0x6bd6 */ 0xc638,
+ /* key: 0x6bd7 */ 0xffff,
+ /* key: 0x6bd8 */ 0x487b,
+ /* key: 0x6bd9 */ 0xffff,
+ /* key: 0x6bda */ 0xc639,
+ /* key: 0x6bdb */ 0x4c53,
+ /* key: 0x6bdc */ 0xffff,
+ /* key: 0x6bdd */ 0xffff,
+ /* key: 0x6bde */ 0xffff,
+ /* key: 0x6bdf */ 0x5d5b,
+ /* key: 0x6be0 */ 0xffff,
+ /* key: 0x6be1 */ 0xc63a,
+ /* key: 0x6be2 */ 0xffff,
+ /* key: 0x6be3 */ 0xc63b,
+ /* key: 0x6be4 */ 0xffff,
+ /* key: 0x6be5 */ 0xffff,
+ /* key: 0x6be6 */ 0xc63c,
+ /* key: 0x6be7 */ 0xc63d,
+ /* key: 0x6be8 */ 0xffff,
+ /* key: 0x6be9 */ 0xffff,
+ /* key: 0x6bea */ 0xffff,
+ /* key: 0x6beb */ 0x5d5d,
+ /* key: 0x6bec */ 0x5d5c,
+ /* key: 0x6bed */ 0xffff,
+ /* key: 0x6bee */ 0xc63e,
+ /* key: 0x6bef */ 0x5d5f,
+ /* key: 0x6bf0 */ 0xffff,
+ /* key: 0x6bf1 */ 0xc63f,
+ /* key: 0x6bf2 */ 0xffff,
+ /* key: 0x6bf3 */ 0x5d5e,
+ /* key: 0x6bf4 */ 0xffff,
+ /* key: 0x6bf5 */ 0xffff,
+ /* key: 0x6bf6 */ 0xffff,
+ /* key: 0x6bf7 */ 0xc640,
+ /* key: 0x6bf8 */ 0xffff,
+ /* key: 0x6bf9 */ 0xc641,
+ /* key: 0x6bfa */ 0xffff,
+ /* key: 0x6bfb */ 0xffff,
+ /* key: 0x6bfc */ 0xffff,
+ /* key: 0x6bfd */ 0xffff,
+ /* key: 0x6bfe */ 0xffff,
+ /* key: 0x6bff */ 0xc642,
+ /* branch: 0x6c0X */ 9776,
+ /* branch: 0x6c1X */ 9792,
+ /* branch: 0x6c2X */ 9808,
+ /* branch: 0x6c3X */ 9824,
+ /* branch: 0x6c4X */ 9840,
+ /* branch: 0x6c5X */ 9856,
+ /* branch: 0x6c6X */ 9872,
+ /* branch: 0x6c7X */ 9888,
+ /* branch: 0x6c8X */ 9904,
+ /* branch: 0x6c9X */ 9920,
+ /* branch: 0x6caX */ 9936,
+ /* branch: 0x6cbX */ 9952,
+ /* branch: 0x6ccX */ 9968,
+ /* branch: 0x6cdX */ 9984,
+ /* branch: 0x6ceX */ 10000,
+ /* branch: 0x6cfX */ 10016,
+ /* key: 0x6c00 */ 0xffff,
+ /* key: 0x6c01 */ 0xffff,
+ /* key: 0x6c02 */ 0xc643,
+ /* key: 0x6c03 */ 0xffff,
+ /* key: 0x6c04 */ 0xc644,
+ /* key: 0x6c05 */ 0xc645,
+ /* key: 0x6c06 */ 0xffff,
+ /* key: 0x6c07 */ 0xffff,
+ /* key: 0x6c08 */ 0x5d61,
+ /* key: 0x6c09 */ 0xc646,
+ /* key: 0x6c0a */ 0xffff,
+ /* key: 0x6c0b */ 0xffff,
+ /* key: 0x6c0c */ 0xffff,
+ /* key: 0x6c0d */ 0xc647,
+ /* key: 0x6c0e */ 0xc648,
+ /* key: 0x6c0f */ 0x3b61,
+ /* key: 0x6c10 */ 0xc649,
+ /* key: 0x6c11 */ 0x4c31,
+ /* key: 0x6c12 */ 0xc64a,
+ /* key: 0x6c13 */ 0x5d62,
+ /* key: 0x6c14 */ 0x5d63,
+ /* key: 0x6c15 */ 0xffff,
+ /* key: 0x6c16 */ 0xffff,
+ /* key: 0x6c17 */ 0x3524,
+ /* key: 0x6c18 */ 0xffff,
+ /* key: 0x6c19 */ 0xc64b,
+ /* key: 0x6c1a */ 0xffff,
+ /* key: 0x6c1b */ 0x5d64,
+ /* key: 0x6c1c */ 0xffff,
+ /* key: 0x6c1d */ 0xffff,
+ /* key: 0x6c1e */ 0xffff,
+ /* key: 0x6c1f */ 0xc64c,
+ /* key: 0x6c20 */ 0xffff,
+ /* key: 0x6c21 */ 0xffff,
+ /* key: 0x6c22 */ 0xffff,
+ /* key: 0x6c23 */ 0x5d66,
+ /* key: 0x6c24 */ 0x5d65,
+ /* key: 0x6c25 */ 0xffff,
+ /* key: 0x6c26 */ 0xc64d,
+ /* key: 0x6c27 */ 0xc64e,
+ /* key: 0x6c28 */ 0xc64f,
+ /* key: 0x6c29 */ 0xffff,
+ /* key: 0x6c2a */ 0xffff,
+ /* key: 0x6c2b */ 0xffff,
+ /* key: 0x6c2c */ 0xc650,
+ /* key: 0x6c2d */ 0xffff,
+ /* key: 0x6c2e */ 0xc651,
+ /* key: 0x6c2f */ 0xffff,
+ /* key: 0x6c30 */ 0xffff,
+ /* key: 0x6c31 */ 0xffff,
+ /* key: 0x6c32 */ 0xffff,
+ /* key: 0x6c33 */ 0xc652,
+ /* key: 0x6c34 */ 0x3f65,
+ /* key: 0x6c35 */ 0xc653,
+ /* key: 0x6c36 */ 0xc654,
+ /* key: 0x6c37 */ 0x4939,
+ /* key: 0x6c38 */ 0x314a,
+ /* key: 0x6c39 */ 0xffff,
+ /* key: 0x6c3a */ 0xc655,
+ /* key: 0x6c3b */ 0xc656,
+ /* key: 0x6c3c */ 0xffff,
+ /* key: 0x6c3d */ 0xffff,
+ /* key: 0x6c3e */ 0x4845,
+ /* key: 0x6c3f */ 0xc657,
+ /* key: 0x6c40 */ 0x4475,
+ /* key: 0x6c41 */ 0x3d41,
+ /* key: 0x6c42 */ 0x3561,
+ /* key: 0x6c43 */ 0xffff,
+ /* key: 0x6c44 */ 0xffff,
+ /* key: 0x6c45 */ 0xffff,
+ /* key: 0x6c46 */ 0xffff,
+ /* key: 0x6c47 */ 0xffff,
+ /* key: 0x6c48 */ 0xffff,
+ /* key: 0x6c49 */ 0xffff,
+ /* key: 0x6c4a */ 0xc658,
+ /* key: 0x6c4b */ 0xc659,
+ /* key: 0x6c4c */ 0xffff,
+ /* key: 0x6c4d */ 0xc65a,
+ /* key: 0x6c4e */ 0x4846,
+ /* key: 0x6c4f */ 0xc65b,
+ /* key: 0x6c50 */ 0x3c2e,
+ /* key: 0x6c51 */ 0xffff,
+ /* key: 0x6c52 */ 0xc65c,
+ /* key: 0x6c53 */ 0xffff,
+ /* key: 0x6c54 */ 0xc65d,
+ /* key: 0x6c55 */ 0x5d68,
+ /* key: 0x6c56 */ 0xffff,
+ /* key: 0x6c57 */ 0x3440,
+ /* key: 0x6c58 */ 0xffff,
+ /* key: 0x6c59 */ 0xc65e,
+ /* key: 0x6c5a */ 0x3178,
+ /* key: 0x6c5b */ 0xc65f,
+ /* key: 0x6c5c */ 0xc660,
+ /* key: 0x6c5d */ 0x4672,
+ /* key: 0x6c5e */ 0x5d67,
+ /* key: 0x6c5f */ 0x393e,
+ /* key: 0x6c60 */ 0x4353,
+ /* key: 0x6c61 */ 0xffff,
+ /* key: 0x6c62 */ 0x5d69,
+ /* key: 0x6c63 */ 0xffff,
+ /* key: 0x6c64 */ 0xffff,
+ /* key: 0x6c65 */ 0xffff,
+ /* key: 0x6c66 */ 0xffff,
+ /* key: 0x6c67 */ 0xc736,
+ /* key: 0x6c68 */ 0x5d71,
+ /* key: 0x6c69 */ 0xffff,
+ /* key: 0x6c6a */ 0x5d6a,
+ /* key: 0x6c6b */ 0xc661,
+ /* key: 0x6c6c */ 0xffff,
+ /* key: 0x6c6d */ 0xc662,
+ /* key: 0x6c6e */ 0xffff,
+ /* key: 0x6c6f */ 0xc663,
+ /* key: 0x6c70 */ 0x4241,
+ /* key: 0x6c71 */ 0xffff,
+ /* key: 0x6c72 */ 0x3562,
+ /* key: 0x6c73 */ 0x5d72,
+ /* key: 0x6c74 */ 0xc664,
+ /* key: 0x6c75 */ 0xffff,
+ /* key: 0x6c76 */ 0xc665,
+ /* key: 0x6c77 */ 0xffff,
+ /* key: 0x6c78 */ 0xc666,
+ /* key: 0x6c79 */ 0xc667,
+ /* key: 0x6c7a */ 0x3768,
+ /* key: 0x6c7b */ 0xc668,
+ /* key: 0x6c7c */ 0xffff,
+ /* key: 0x6c7d */ 0x3525,
+ /* key: 0x6c7e */ 0x5d70,
+ /* key: 0x6c7f */ 0xffff,
+ /* key: 0x6c80 */ 0xffff,
+ /* key: 0x6c81 */ 0x5d6e,
+ /* key: 0x6c82 */ 0x5d6b,
+ /* key: 0x6c83 */ 0x4d60,
+ /* key: 0x6c84 */ 0xffff,
+ /* key: 0x6c85 */ 0xc669,
+ /* key: 0x6c86 */ 0xc66a,
+ /* key: 0x6c87 */ 0xc66b,
+ /* key: 0x6c88 */ 0x4440,
+ /* key: 0x6c89 */ 0xc66c,
+ /* key: 0x6c8a */ 0xffff,
+ /* key: 0x6c8b */ 0xffff,
+ /* key: 0x6c8c */ 0x4659,
+ /* key: 0x6c8d */ 0x5d6c,
+ /* key: 0x6c8e */ 0xffff,
+ /* key: 0x6c8f */ 0xffff,
+ /* key: 0x6c90 */ 0x5d74,
+ /* key: 0x6c91 */ 0xffff,
+ /* key: 0x6c92 */ 0x5d73,
+ /* key: 0x6c93 */ 0x3723,
+ /* key: 0x6c94 */ 0xc66d,
+ /* key: 0x6c95 */ 0xc66e,
+ /* key: 0x6c96 */ 0x322d,
+ /* key: 0x6c97 */ 0xc66f,
+ /* key: 0x6c98 */ 0xc670,
+ /* key: 0x6c99 */ 0x3a3b,
+ /* key: 0x6c9a */ 0x5d6d,
+ /* key: 0x6c9b */ 0x5d6f,
+ /* key: 0x6c9c */ 0xc671,
+ /* key: 0x6c9d */ 0xffff,
+ /* key: 0x6c9e */ 0xffff,
+ /* key: 0x6c9f */ 0xc672,
+ /* key: 0x6ca0 */ 0xffff,
+ /* key: 0x6ca1 */ 0x4b57,
+ /* key: 0x6ca2 */ 0x4274,
+ /* key: 0x6ca3 */ 0xffff,
+ /* key: 0x6ca4 */ 0xffff,
+ /* key: 0x6ca5 */ 0xffff,
+ /* key: 0x6ca6 */ 0xffff,
+ /* key: 0x6ca7 */ 0xffff,
+ /* key: 0x6ca8 */ 0xffff,
+ /* key: 0x6ca9 */ 0xffff,
+ /* key: 0x6caa */ 0xffff,
+ /* key: 0x6cab */ 0x4b77,
+ /* key: 0x6cac */ 0xffff,
+ /* key: 0x6cad */ 0xffff,
+ /* key: 0x6cae */ 0x5d7c,
+ /* key: 0x6caf */ 0xffff,
+ /* key: 0x6cb0 */ 0xc673,
+ /* key: 0x6cb1 */ 0x5d7d,
+ /* key: 0x6cb2 */ 0xc674,
+ /* key: 0x6cb3 */ 0x324f,
+ /* key: 0x6cb4 */ 0xc675,
+ /* key: 0x6cb5 */ 0xffff,
+ /* key: 0x6cb6 */ 0xffff,
+ /* key: 0x6cb7 */ 0xffff,
+ /* key: 0x6cb8 */ 0x4a28,
+ /* key: 0x6cb9 */ 0x4c7d,
+ /* key: 0x6cba */ 0x5e21,
+ /* key: 0x6cbb */ 0x3c23,
+ /* key: 0x6cbc */ 0x3e42,
+ /* key: 0x6cbd */ 0x5d78,
+ /* key: 0x6cbe */ 0x5d7e,
+ /* key: 0x6cbf */ 0x3168,
+ /* key: 0x6cc0 */ 0xffff,
+ /* key: 0x6cc1 */ 0x3637,
+ /* key: 0x6cc2 */ 0xc676,
+ /* key: 0x6cc3 */ 0xffff,
+ /* key: 0x6cc4 */ 0x5d75,
+ /* key: 0x6cc5 */ 0x5d7a,
+ /* key: 0x6cc6 */ 0xc677,
+ /* key: 0x6cc7 */ 0xffff,
+ /* key: 0x6cc8 */ 0xffff,
+ /* key: 0x6cc9 */ 0x4074,
+ /* key: 0x6cca */ 0x4771,
+ /* key: 0x6ccb */ 0xffff,
+ /* key: 0x6ccc */ 0x4867,
+ /* key: 0x6ccd */ 0xc678,
+ /* key: 0x6cce */ 0xffff,
+ /* key: 0x6ccf */ 0xc679,
+ /* key: 0x6cd0 */ 0xc67a,
+ /* key: 0x6cd1 */ 0xc67b,
+ /* key: 0x6cd2 */ 0xc67c,
+ /* key: 0x6cd3 */ 0x5d77,
+ /* key: 0x6cd4 */ 0xc67d,
+ /* key: 0x6cd5 */ 0x4b21,
+ /* key: 0x6cd6 */ 0xc67e,
+ /* key: 0x6cd7 */ 0x5d79,
+ /* key: 0x6cd8 */ 0xffff,
+ /* key: 0x6cd9 */ 0x5e24,
+ /* key: 0x6cda */ 0xc721,
+ /* key: 0x6cdb */ 0x5e22,
+ /* key: 0x6cdc */ 0xc722,
+ /* key: 0x6cdd */ 0x5d7b,
+ /* key: 0x6cde */ 0xffff,
+ /* key: 0x6cdf */ 0xffff,
+ /* key: 0x6ce0 */ 0xc723,
+ /* key: 0x6ce1 */ 0x4b22,
+ /* key: 0x6ce2 */ 0x4748,
+ /* key: 0x6ce3 */ 0x3563,
+ /* key: 0x6ce4 */ 0xffff,
+ /* key: 0x6ce5 */ 0x4525,
+ /* key: 0x6ce6 */ 0xffff,
+ /* key: 0x6ce7 */ 0xc724,
+ /* key: 0x6ce8 */ 0x436d,
+ /* key: 0x6ce9 */ 0xc725,
+ /* key: 0x6cea */ 0x5e25,
+ /* key: 0x6ceb */ 0xc726,
+ /* key: 0x6cec */ 0xc727,
+ /* key: 0x6ced */ 0xffff,
+ /* key: 0x6cee */ 0xc728,
+ /* key: 0x6cef */ 0x5e23,
+ /* key: 0x6cf0 */ 0x4259,
+ /* key: 0x6cf1 */ 0x5d76,
+ /* key: 0x6cf2 */ 0xc729,
+ /* key: 0x6cf3 */ 0x314b,
+ /* key: 0x6cf4 */ 0xc72a,
+ /* key: 0x6cf5 */ 0xffff,
+ /* key: 0x6cf6 */ 0xffff,
+ /* key: 0x6cf7 */ 0xffff,
+ /* key: 0x6cf8 */ 0xffff,
+ /* key: 0x6cf9 */ 0xffff,
+ /* key: 0x6cfa */ 0xffff,
+ /* key: 0x6cfb */ 0xffff,
+ /* key: 0x6cfc */ 0xffff,
+ /* key: 0x6cfd */ 0xffff,
+ /* key: 0x6cfe */ 0xffff,
+ /* key: 0x6cff */ 0xffff,
+ /* branch: 0x6d0X */ 10048,
+ /* branch: 0x6d1X */ 10064,
+ /* branch: 0x6d2X */ 10080,
+ /* branch: 0x6d3X */ 10096,
+ /* branch: 0x6d4X */ 10112,
+ /* branch: 0x6d5X */ 10128,
+ /* branch: 0x6d6X */ 10144,
+ /* branch: 0x6d7X */ 10160,
+ /* branch: 0x6d8X */ 10176,
+ /* branch: 0x6d9X */ 10192,
+ /* branch: 0x6daX */ 10208,
+ /* branch: 0x6dbX */ 10224,
+ /* branch: 0x6dcX */ 10240,
+ /* branch: 0x6ddX */ 10256,
+ /* branch: 0x6deX */ 10272,
+ /* branch: 0x6dfX */ 10288,
+ /* key: 0x6d00 */ 0xffff,
+ /* key: 0x6d01 */ 0xffff,
+ /* key: 0x6d02 */ 0xffff,
+ /* key: 0x6d03 */ 0xffff,
+ /* key: 0x6d04 */ 0xc72b,
+ /* key: 0x6d05 */ 0xffff,
+ /* key: 0x6d06 */ 0xffff,
+ /* key: 0x6d07 */ 0xc72c,
+ /* key: 0x6d08 */ 0xffff,
+ /* key: 0x6d09 */ 0xffff,
+ /* key: 0x6d0a */ 0xc72d,
+ /* key: 0x6d0b */ 0x4d4e,
+ /* key: 0x6d0c */ 0x5e30,
+ /* key: 0x6d0d */ 0xffff,
+ /* key: 0x6d0e */ 0xc72e,
+ /* key: 0x6d0f */ 0xc72f,
+ /* key: 0x6d10 */ 0xffff,
+ /* key: 0x6d11 */ 0xc730,
+ /* key: 0x6d12 */ 0x5e2f,
+ /* key: 0x6d13 */ 0xc731,
+ /* key: 0x6d14 */ 0xffff,
+ /* key: 0x6d15 */ 0xffff,
+ /* key: 0x6d16 */ 0xffff,
+ /* key: 0x6d17 */ 0x4076,
+ /* key: 0x6d18 */ 0xffff,
+ /* key: 0x6d19 */ 0x5e2c,
+ /* key: 0x6d1a */ 0xc732,
+ /* key: 0x6d1b */ 0x4d6c,
+ /* key: 0x6d1c */ 0xffff,
+ /* key: 0x6d1d */ 0xffff,
+ /* key: 0x6d1e */ 0x4636,
+ /* key: 0x6d1f */ 0x5e26,
+ /* key: 0x6d20 */ 0xffff,
+ /* key: 0x6d21 */ 0xffff,
+ /* key: 0x6d22 */ 0xffff,
+ /* key: 0x6d23 */ 0xffff,
+ /* key: 0x6d24 */ 0xffff,
+ /* key: 0x6d25 */ 0x4445,
+ /* key: 0x6d26 */ 0xc733,
+ /* key: 0x6d27 */ 0xc734,
+ /* key: 0x6d28 */ 0xc735,
+ /* key: 0x6d29 */ 0x314c,
+ /* key: 0x6d2a */ 0x393f,
+ /* key: 0x6d2b */ 0x5e29,
+ /* key: 0x6d2c */ 0xffff,
+ /* key: 0x6d2d */ 0xffff,
+ /* key: 0x6d2e */ 0xc737,
+ /* key: 0x6d2f */ 0xc738,
+ /* key: 0x6d30 */ 0xffff,
+ /* key: 0x6d31 */ 0xc739,
+ /* key: 0x6d32 */ 0x3d27,
+ /* key: 0x6d33 */ 0x5e2e,
+ /* key: 0x6d34 */ 0xffff,
+ /* key: 0x6d35 */ 0x5e2d,
+ /* key: 0x6d36 */ 0x5e28,
+ /* key: 0x6d37 */ 0xffff,
+ /* key: 0x6d38 */ 0x5e2b,
+ /* key: 0x6d39 */ 0xc73a,
+ /* key: 0x6d3a */ 0xffff,
+ /* key: 0x6d3b */ 0x3368,
+ /* key: 0x6d3c */ 0xc73b,
+ /* key: 0x6d3d */ 0x5e2a,
+ /* key: 0x6d3e */ 0x4749,
+ /* key: 0x6d3f */ 0xc73c,
+ /* key: 0x6d40 */ 0xffff,
+ /* key: 0x6d41 */ 0x4e2e,
+ /* key: 0x6d42 */ 0xffff,
+ /* key: 0x6d43 */ 0xffff,
+ /* key: 0x6d44 */ 0x3e74,
+ /* key: 0x6d45 */ 0x4075,
+ /* key: 0x6d46 */ 0xffff,
+ /* key: 0x6d47 */ 0xffff,
+ /* key: 0x6d48 */ 0xffff,
+ /* key: 0x6d49 */ 0xffff,
+ /* key: 0x6d4a */ 0xffff,
+ /* key: 0x6d4b */ 0xffff,
+ /* key: 0x6d4c */ 0xffff,
+ /* key: 0x6d4d */ 0xffff,
+ /* key: 0x6d4e */ 0xffff,
+ /* key: 0x6d4f */ 0xffff,
+ /* key: 0x6d50 */ 0xffff,
+ /* key: 0x6d51 */ 0xffff,
+ /* key: 0x6d52 */ 0xffff,
+ /* key: 0x6d53 */ 0xffff,
+ /* key: 0x6d54 */ 0xffff,
+ /* key: 0x6d55 */ 0xffff,
+ /* key: 0x6d56 */ 0xffff,
+ /* key: 0x6d57 */ 0xc73d,
+ /* key: 0x6d58 */ 0xffff,
+ /* key: 0x6d59 */ 0x5e36,
+ /* key: 0x6d5a */ 0x5e34,
+ /* key: 0x6d5b */ 0xffff,
+ /* key: 0x6d5c */ 0x494d,
+ /* key: 0x6d5d */ 0xffff,
+ /* key: 0x6d5e */ 0xc73e,
+ /* key: 0x6d5f */ 0xc73f,
+ /* key: 0x6d60 */ 0xffff,
+ /* key: 0x6d61 */ 0xc740,
+ /* key: 0x6d62 */ 0xffff,
+ /* key: 0x6d63 */ 0x5e31,
+ /* key: 0x6d64 */ 0x5e33,
+ /* key: 0x6d65 */ 0xc741,
+ /* key: 0x6d66 */ 0x313a,
+ /* key: 0x6d67 */ 0xc742,
+ /* key: 0x6d68 */ 0xffff,
+ /* key: 0x6d69 */ 0x3940,
+ /* key: 0x6d6a */ 0x4f32,
+ /* key: 0x6d6b */ 0xffff,
+ /* key: 0x6d6c */ 0x333d,
+ /* key: 0x6d6d */ 0xffff,
+ /* key: 0x6d6e */ 0x4962,
+ /* key: 0x6d6f */ 0xc743,
+ /* key: 0x6d70 */ 0xc744,
+ /* key: 0x6d71 */ 0xffff,
+ /* key: 0x6d72 */ 0xffff,
+ /* key: 0x6d73 */ 0xffff,
+ /* key: 0x6d74 */ 0x4d61,
+ /* key: 0x6d75 */ 0xffff,
+ /* key: 0x6d76 */ 0xffff,
+ /* key: 0x6d77 */ 0x3324,
+ /* key: 0x6d78 */ 0x3f3b,
+ /* key: 0x6d79 */ 0x5e35,
+ /* key: 0x6d7a */ 0xffff,
+ /* key: 0x6d7b */ 0xffff,
+ /* key: 0x6d7c */ 0xc745,
+ /* key: 0x6d7d */ 0xffff,
+ /* key: 0x6d7e */ 0xffff,
+ /* key: 0x6d7f */ 0xffff,
+ /* key: 0x6d80 */ 0xffff,
+ /* key: 0x6d81 */ 0xffff,
+ /* key: 0x6d82 */ 0xc746,
+ /* key: 0x6d83 */ 0xffff,
+ /* key: 0x6d84 */ 0xffff,
+ /* key: 0x6d85 */ 0x5e3a,
+ /* key: 0x6d86 */ 0xffff,
+ /* key: 0x6d87 */ 0xc747,
+ /* key: 0x6d88 */ 0x3e43,
+ /* key: 0x6d89 */ 0xffff,
+ /* key: 0x6d8a */ 0xffff,
+ /* key: 0x6d8b */ 0xffff,
+ /* key: 0x6d8c */ 0x4d30,
+ /* key: 0x6d8d */ 0xffff,
+ /* key: 0x6d8e */ 0x5e37,
+ /* key: 0x6d8f */ 0xffff,
+ /* key: 0x6d90 */ 0xffff,
+ /* key: 0x6d91 */ 0xc748,
+ /* key: 0x6d92 */ 0xc749,
+ /* key: 0x6d93 */ 0x5e32,
+ /* key: 0x6d94 */ 0xc74a,
+ /* key: 0x6d95 */ 0x5e38,
+ /* key: 0x6d96 */ 0xc74b,
+ /* key: 0x6d97 */ 0xc74c,
+ /* key: 0x6d98 */ 0xc74d,
+ /* key: 0x6d99 */ 0x4e5e,
+ /* key: 0x6d9a */ 0xffff,
+ /* key: 0x6d9b */ 0x4573,
+ /* key: 0x6d9c */ 0x4642,
+ /* key: 0x6d9d */ 0xffff,
+ /* key: 0x6d9e */ 0xffff,
+ /* key: 0x6d9f */ 0xffff,
+ /* key: 0x6da0 */ 0xffff,
+ /* key: 0x6da1 */ 0xffff,
+ /* key: 0x6da2 */ 0xffff,
+ /* key: 0x6da3 */ 0xffff,
+ /* key: 0x6da4 */ 0xffff,
+ /* key: 0x6da5 */ 0xffff,
+ /* key: 0x6da6 */ 0xffff,
+ /* key: 0x6da7 */ 0xffff,
+ /* key: 0x6da8 */ 0xffff,
+ /* key: 0x6da9 */ 0xffff,
+ /* key: 0x6daa */ 0xc74e,
+ /* key: 0x6dab */ 0xffff,
+ /* key: 0x6dac */ 0xc74f,
+ /* key: 0x6dad */ 0xffff,
+ /* key: 0x6dae */ 0xffff,
+ /* key: 0x6daf */ 0x3336,
+ /* key: 0x6db0 */ 0xffff,
+ /* key: 0x6db1 */ 0xffff,
+ /* key: 0x6db2 */ 0x3155,
+ /* key: 0x6db3 */ 0xffff,
+ /* key: 0x6db4 */ 0xc750,
+ /* key: 0x6db5 */ 0x5e3e,
+ /* key: 0x6db6 */ 0xffff,
+ /* key: 0x6db7 */ 0xc751,
+ /* key: 0x6db8 */ 0x5e41,
+ /* key: 0x6db9 */ 0xc752,
+ /* key: 0x6dba */ 0xffff,
+ /* key: 0x6dbb */ 0xffff,
+ /* key: 0x6dbc */ 0x4e43,
+ /* key: 0x6dbd */ 0xc753,
+ /* key: 0x6dbe */ 0xffff,
+ /* key: 0x6dbf */ 0xc754,
+ /* key: 0x6dc0 */ 0x4d64,
+ /* key: 0x6dc1 */ 0xffff,
+ /* key: 0x6dc2 */ 0xffff,
+ /* key: 0x6dc3 */ 0xffff,
+ /* key: 0x6dc4 */ 0xc755,
+ /* key: 0x6dc5 */ 0x5e48,
+ /* key: 0x6dc6 */ 0x5e42,
+ /* key: 0x6dc7 */ 0x5e3f,
+ /* key: 0x6dc8 */ 0xc756,
+ /* key: 0x6dc9 */ 0xffff,
+ /* key: 0x6dca */ 0xc757,
+ /* key: 0x6dcb */ 0x4e54,
+ /* key: 0x6dcc */ 0x5e45,
+ /* key: 0x6dcd */ 0xffff,
+ /* key: 0x6dce */ 0xc758,
+ /* key: 0x6dcf */ 0xc759,
+ /* key: 0x6dd0 */ 0xffff,
+ /* key: 0x6dd1 */ 0x3d4a,
+ /* key: 0x6dd2 */ 0x5e47,
+ /* key: 0x6dd3 */ 0xffff,
+ /* key: 0x6dd4 */ 0xffff,
+ /* key: 0x6dd5 */ 0x5e4c,
+ /* key: 0x6dd6 */ 0xc75a,
+ /* key: 0x6dd7 */ 0xffff,
+ /* key: 0x6dd8 */ 0x4571,
+ /* key: 0x6dd9 */ 0x5e4a,
+ /* key: 0x6dda */ 0xffff,
+ /* key: 0x6ddb */ 0xc75b,
+ /* key: 0x6ddc */ 0xffff,
+ /* key: 0x6ddd */ 0xc75c,
+ /* key: 0x6dde */ 0x5e44,
+ /* key: 0x6ddf */ 0xc75d,
+ /* key: 0x6de0 */ 0xc75e,
+ /* key: 0x6de1 */ 0x4338,
+ /* key: 0x6de2 */ 0xc75f,
+ /* key: 0x6de3 */ 0xffff,
+ /* key: 0x6de4 */ 0x5e4b,
+ /* key: 0x6de5 */ 0xc760,
+ /* key: 0x6de6 */ 0x5e40,
+ /* key: 0x6de7 */ 0xffff,
+ /* key: 0x6de8 */ 0x5e46,
+ /* key: 0x6de9 */ 0xc761,
+ /* key: 0x6dea */ 0x5e4d,
+ /* key: 0x6deb */ 0x307c,
+ /* key: 0x6dec */ 0x5e43,
+ /* key: 0x6ded */ 0xffff,
+ /* key: 0x6dee */ 0x5e4e,
+ /* key: 0x6def */ 0xc762,
+ /* key: 0x6df0 */ 0xc763,
+ /* key: 0x6df1 */ 0x3f3c,
+ /* key: 0x6df2 */ 0xffff,
+ /* key: 0x6df3 */ 0x3d5f,
+ /* key: 0x6df4 */ 0xc764,
+ /* key: 0x6df5 */ 0x4a25,
+ /* key: 0x6df6 */ 0xc765,
+ /* key: 0x6df7 */ 0x3a2e,
+ /* key: 0x6df8 */ 0xffff,
+ /* key: 0x6df9 */ 0x5e3b,
+ /* key: 0x6dfa */ 0x5e49,
+ /* key: 0x6dfb */ 0x453a,
+ /* key: 0x6dfc */ 0xc766,
+ /* key: 0x6dfd */ 0xffff,
+ /* key: 0x6dfe */ 0xffff,
+ /* key: 0x6dff */ 0xffff,
+ /* branch: 0x6e0X */ 10320,
+ /* branch: 0x6e1X */ 10336,
+ /* branch: 0x6e2X */ 10352,
+ /* branch: 0x6e3X */ 10368,
+ /* branch: 0x6e4X */ 10384,
+ /* branch: 0x6e5X */ 10400,
+ /* branch: 0x6e6X */ 10416,
+ /* branch: 0x6e7X */ 10432,
+ /* branch: 0x6e8X */ 10448,
+ /* branch: 0x6e9X */ 10464,
+ /* branch: 0x6eaX */ 10480,
+ /* branch: 0x6ebX */ 10496,
+ /* branch: 0x6ecX */ 10512,
+ /* branch: 0x6edX */ 10528,
+ /* branch: 0x6eeX */ 10544,
+ /* branch: 0x6efX */ 10560,
+ /* key: 0x6e00 */ 0xc767,
+ /* key: 0x6e01 */ 0xffff,
+ /* key: 0x6e02 */ 0xffff,
+ /* key: 0x6e03 */ 0xffff,
+ /* key: 0x6e04 */ 0xc768,
+ /* key: 0x6e05 */ 0x4036,
+ /* key: 0x6e06 */ 0xffff,
+ /* key: 0x6e07 */ 0x3369,
+ /* key: 0x6e08 */ 0x3a51,
+ /* key: 0x6e09 */ 0x3e44,
+ /* key: 0x6e0a */ 0x5e3d,
+ /* key: 0x6e0b */ 0x3d42,
+ /* key: 0x6e0c */ 0xffff,
+ /* key: 0x6e0d */ 0xffff,
+ /* key: 0x6e0e */ 0xffff,
+ /* key: 0x6e0f */ 0xffff,
+ /* key: 0x6e10 */ 0xffff,
+ /* key: 0x6e11 */ 0xffff,
+ /* key: 0x6e12 */ 0xffff,
+ /* key: 0x6e13 */ 0x374c,
+ /* key: 0x6e14 */ 0xffff,
+ /* key: 0x6e15 */ 0x5e3c,
+ /* key: 0x6e16 */ 0xffff,
+ /* key: 0x6e17 */ 0xffff,
+ /* key: 0x6e18 */ 0xffff,
+ /* key: 0x6e19 */ 0x5e52,
+ /* key: 0x6e1a */ 0x3d6d,
+ /* key: 0x6e1b */ 0x383a,
+ /* key: 0x6e1c */ 0xffff,
+ /* key: 0x6e1d */ 0x5e61,
+ /* key: 0x6e1e */ 0xc769,
+ /* key: 0x6e1f */ 0x5e5b,
+ /* key: 0x6e20 */ 0x3574,
+ /* key: 0x6e21 */ 0x454f,
+ /* key: 0x6e22 */ 0xc76a,
+ /* key: 0x6e23 */ 0x5e56,
+ /* key: 0x6e24 */ 0x5e5f,
+ /* key: 0x6e25 */ 0x302f,
+ /* key: 0x6e26 */ 0x3132,
+ /* key: 0x6e27 */ 0xc76b,
+ /* key: 0x6e28 */ 0xffff,
+ /* key: 0x6e29 */ 0x3239,
+ /* key: 0x6e2a */ 0xffff,
+ /* key: 0x6e2b */ 0x5e58,
+ /* key: 0x6e2c */ 0x422c,
+ /* key: 0x6e2d */ 0x5e4f,
+ /* key: 0x6e2e */ 0x5e51,
+ /* key: 0x6e2f */ 0x3941,
+ /* key: 0x6e30 */ 0xffff,
+ /* key: 0x6e31 */ 0xffff,
+ /* key: 0x6e32 */ 0xc76c,
+ /* key: 0x6e33 */ 0xffff,
+ /* key: 0x6e34 */ 0xffff,
+ /* key: 0x6e35 */ 0xffff,
+ /* key: 0x6e36 */ 0xc76d,
+ /* key: 0x6e37 */ 0xffff,
+ /* key: 0x6e38 */ 0x5e62,
+ /* key: 0x6e39 */ 0xc76e,
+ /* key: 0x6e3a */ 0x5e5d,
+ /* key: 0x6e3b */ 0xc76f,
+ /* key: 0x6e3c */ 0xc770,
+ /* key: 0x6e3d */ 0xffff,
+ /* key: 0x6e3e */ 0x5e55,
+ /* key: 0x6e3f */ 0xffff,
+ /* key: 0x6e40 */ 0xffff,
+ /* key: 0x6e41 */ 0xffff,
+ /* key: 0x6e42 */ 0xffff,
+ /* key: 0x6e43 */ 0x5e5c,
+ /* key: 0x6e44 */ 0xc771,
+ /* key: 0x6e45 */ 0xc772,
+ /* key: 0x6e46 */ 0xffff,
+ /* key: 0x6e47 */ 0xffff,
+ /* key: 0x6e48 */ 0xc773,
+ /* key: 0x6e49 */ 0xc774,
+ /* key: 0x6e4a */ 0x4c2b,
+ /* key: 0x6e4b */ 0xc775,
+ /* key: 0x6e4c */ 0xffff,
+ /* key: 0x6e4d */ 0x5e5a,
+ /* key: 0x6e4e */ 0x5e5e,
+ /* key: 0x6e4f */ 0xc776,
+ /* key: 0x6e50 */ 0xffff,
+ /* key: 0x6e51 */ 0xc777,
+ /* key: 0x6e52 */ 0xc778,
+ /* key: 0x6e53 */ 0xc779,
+ /* key: 0x6e54 */ 0xc77a,
+ /* key: 0x6e55 */ 0xffff,
+ /* key: 0x6e56 */ 0x3850,
+ /* key: 0x6e57 */ 0xc77b,
+ /* key: 0x6e58 */ 0x3e45,
+ /* key: 0x6e59 */ 0xffff,
+ /* key: 0x6e5a */ 0xffff,
+ /* key: 0x6e5b */ 0x4339,
+ /* key: 0x6e5c */ 0xc77c,
+ /* key: 0x6e5d */ 0xc77d,
+ /* key: 0x6e5e */ 0xc77e,
+ /* key: 0x6e5f */ 0x5e54,
+ /* key: 0x6e60 */ 0xffff,
+ /* key: 0x6e61 */ 0xffff,
+ /* key: 0x6e62 */ 0xc821,
+ /* key: 0x6e63 */ 0xc822,
+ /* key: 0x6e64 */ 0xffff,
+ /* key: 0x6e65 */ 0xffff,
+ /* key: 0x6e66 */ 0xffff,
+ /* key: 0x6e67 */ 0x4d2f,
+ /* key: 0x6e68 */ 0xc823,
+ /* key: 0x6e69 */ 0xffff,
+ /* key: 0x6e6a */ 0xffff,
+ /* key: 0x6e6b */ 0x5e57,
+ /* key: 0x6e6c */ 0xffff,
+ /* key: 0x6e6d */ 0xffff,
+ /* key: 0x6e6e */ 0x5e50,
+ /* key: 0x6e6f */ 0x4572,
+ /* key: 0x6e70 */ 0xffff,
+ /* key: 0x6e71 */ 0xffff,
+ /* key: 0x6e72 */ 0x5e53,
+ /* key: 0x6e73 */ 0xc824,
+ /* key: 0x6e74 */ 0xffff,
+ /* key: 0x6e75 */ 0xffff,
+ /* key: 0x6e76 */ 0x5e59,
+ /* key: 0x6e77 */ 0xffff,
+ /* key: 0x6e78 */ 0xffff,
+ /* key: 0x6e79 */ 0xffff,
+ /* key: 0x6e7a */ 0xffff,
+ /* key: 0x6e7b */ 0xc825,
+ /* key: 0x6e7c */ 0xffff,
+ /* key: 0x6e7d */ 0xc826,
+ /* key: 0x6e7e */ 0x4f51,
+ /* key: 0x6e7f */ 0x3c3e,
+ /* key: 0x6e80 */ 0x4b7e,
+ /* key: 0x6e81 */ 0xffff,
+ /* key: 0x6e82 */ 0x5e63,
+ /* key: 0x6e83 */ 0xffff,
+ /* key: 0x6e84 */ 0xffff,
+ /* key: 0x6e85 */ 0xffff,
+ /* key: 0x6e86 */ 0xffff,
+ /* key: 0x6e87 */ 0xffff,
+ /* key: 0x6e88 */ 0xffff,
+ /* key: 0x6e89 */ 0xffff,
+ /* key: 0x6e8a */ 0xffff,
+ /* key: 0x6e8b */ 0xffff,
+ /* key: 0x6e8c */ 0x482e,
+ /* key: 0x6e8d */ 0xc827,
+ /* key: 0x6e8e */ 0xffff,
+ /* key: 0x6e8f */ 0x5e6f,
+ /* key: 0x6e90 */ 0x383b,
+ /* key: 0x6e91 */ 0xffff,
+ /* key: 0x6e92 */ 0xffff,
+ /* key: 0x6e93 */ 0xc828,
+ /* key: 0x6e94 */ 0xffff,
+ /* key: 0x6e95 */ 0xffff,
+ /* key: 0x6e96 */ 0x3d60,
+ /* key: 0x6e97 */ 0xffff,
+ /* key: 0x6e98 */ 0x5e65,
+ /* key: 0x6e99 */ 0xc829,
+ /* key: 0x6e9a */ 0xffff,
+ /* key: 0x6e9b */ 0xffff,
+ /* key: 0x6e9c */ 0x4e2f,
+ /* key: 0x6e9d */ 0x3942,
+ /* key: 0x6e9e */ 0xffff,
+ /* key: 0x6e9f */ 0x5e72,
+ /* key: 0x6ea0 */ 0xc82a,
+ /* key: 0x6ea1 */ 0xffff,
+ /* key: 0x6ea2 */ 0x306e,
+ /* key: 0x6ea3 */ 0xffff,
+ /* key: 0x6ea4 */ 0xffff,
+ /* key: 0x6ea5 */ 0x5e70,
+ /* key: 0x6ea6 */ 0xffff,
+ /* key: 0x6ea7 */ 0xc82b,
+ /* key: 0x6ea8 */ 0xffff,
+ /* key: 0x6ea9 */ 0xffff,
+ /* key: 0x6eaa */ 0x5e64,
+ /* key: 0x6eab */ 0xffff,
+ /* key: 0x6eac */ 0xffff,
+ /* key: 0x6ead */ 0xc82c,
+ /* key: 0x6eae */ 0xc82d,
+ /* key: 0x6eaf */ 0x5e6a,
+ /* key: 0x6eb0 */ 0xffff,
+ /* key: 0x6eb1 */ 0xc82e,
+ /* key: 0x6eb2 */ 0x5e6c,
+ /* key: 0x6eb3 */ 0xc82f,
+ /* key: 0x6eb4 */ 0xffff,
+ /* key: 0x6eb5 */ 0xffff,
+ /* key: 0x6eb6 */ 0x4d4f,
+ /* key: 0x6eb7 */ 0x5e67,
+ /* key: 0x6eb8 */ 0xffff,
+ /* key: 0x6eb9 */ 0xffff,
+ /* key: 0x6eba */ 0x452e,
+ /* key: 0x6ebb */ 0xc830,
+ /* key: 0x6ebc */ 0xffff,
+ /* key: 0x6ebd */ 0x5e69,
+ /* key: 0x6ebe */ 0xffff,
+ /* key: 0x6ebf */ 0xc831,
+ /* key: 0x6ec0 */ 0xc832,
+ /* key: 0x6ec1 */ 0xc833,
+ /* key: 0x6ec2 */ 0x5e71,
+ /* key: 0x6ec3 */ 0xc834,
+ /* key: 0x6ec4 */ 0x5e6b,
+ /* key: 0x6ec5 */ 0x4c47,
+ /* key: 0x6ec6 */ 0xffff,
+ /* key: 0x6ec7 */ 0xc835,
+ /* key: 0x6ec8 */ 0xc836,
+ /* key: 0x6ec9 */ 0x5e66,
+ /* key: 0x6eca */ 0xc837,
+ /* key: 0x6ecb */ 0x3c22,
+ /* key: 0x6ecc */ 0x5e7e,
+ /* key: 0x6ecd */ 0xc838,
+ /* key: 0x6ece */ 0xc839,
+ /* key: 0x6ecf */ 0xc83a,
+ /* key: 0x6ed0 */ 0xffff,
+ /* key: 0x6ed1 */ 0x336a,
+ /* key: 0x6ed2 */ 0xffff,
+ /* key: 0x6ed3 */ 0x5e68,
+ /* key: 0x6ed4 */ 0x5e6d,
+ /* key: 0x6ed5 */ 0x5e6e,
+ /* key: 0x6ed6 */ 0xffff,
+ /* key: 0x6ed7 */ 0xffff,
+ /* key: 0x6ed8 */ 0xffff,
+ /* key: 0x6ed9 */ 0xffff,
+ /* key: 0x6eda */ 0xffff,
+ /* key: 0x6edb */ 0xffff,
+ /* key: 0x6edc */ 0xffff,
+ /* key: 0x6edd */ 0x426c,
+ /* key: 0x6ede */ 0x425a,
+ /* key: 0x6edf */ 0xffff,
+ /* key: 0x6ee0 */ 0xffff,
+ /* key: 0x6ee1 */ 0xffff,
+ /* key: 0x6ee2 */ 0xffff,
+ /* key: 0x6ee3 */ 0xffff,
+ /* key: 0x6ee4 */ 0xffff,
+ /* key: 0x6ee5 */ 0xffff,
+ /* key: 0x6ee6 */ 0xffff,
+ /* key: 0x6ee7 */ 0xffff,
+ /* key: 0x6ee8 */ 0xffff,
+ /* key: 0x6ee9 */ 0xffff,
+ /* key: 0x6eea */ 0xffff,
+ /* key: 0x6eeb */ 0xc83b,
+ /* key: 0x6eec */ 0x5e76,
+ /* key: 0x6eed */ 0xc83c,
+ /* key: 0x6eee */ 0xc83d,
+ /* key: 0x6eef */ 0x5e7c,
+ /* key: 0x6ef0 */ 0xffff,
+ /* key: 0x6ef1 */ 0xffff,
+ /* key: 0x6ef2 */ 0x5e7a,
+ /* key: 0x6ef3 */ 0xffff,
+ /* key: 0x6ef4 */ 0x4529,
+ /* key: 0x6ef5 */ 0xffff,
+ /* key: 0x6ef6 */ 0xffff,
+ /* key: 0x6ef7 */ 0x5f23,
+ /* key: 0x6ef8 */ 0x5e77,
+ /* key: 0x6ef9 */ 0xc83e,
+ /* key: 0x6efa */ 0xffff,
+ /* key: 0x6efb */ 0xc83f,
+ /* key: 0x6efc */ 0xffff,
+ /* key: 0x6efd */ 0xc840,
+ /* key: 0x6efe */ 0x5e78,
+ /* key: 0x6eff */ 0x5e60,
+ /* branch: 0x6f0X */ 10592,
+ /* branch: 0x6f1X */ 10608,
+ /* branch: 0x6f2X */ 10624,
+ /* branch: 0x6f3X */ 10640,
+ /* branch: 0x6f4X */ 10656,
+ /* branch: 0x6f5X */ 10672,
+ /* branch: 0x6f6X */ 10688,
+ /* branch: 0x6f7X */ 10704,
+ /* branch: 0x6f8X */ 10720,
+ /* branch: 0x6f9X */ 10736,
+ /* branch: 0x6faX */ 10752,
+ /* branch: 0x6fbX */ 10768,
+ /* branch: 0x6fcX */ 10784,
+ /* branch: 0x6fdX */ 10800,
+ /* branch: 0x6feX */ 10816,
+ /* branch: 0x6ffX */ 10832,
+ /* key: 0x6f00 */ 0xffff,
+ /* key: 0x6f01 */ 0x3579,
+ /* key: 0x6f02 */ 0x493a,
+ /* key: 0x6f03 */ 0xffff,
+ /* key: 0x6f04 */ 0xc841,
+ /* key: 0x6f05 */ 0xffff,
+ /* key: 0x6f06 */ 0x3c3f,
+ /* key: 0x6f07 */ 0xffff,
+ /* key: 0x6f08 */ 0xc842,
+ /* key: 0x6f09 */ 0x3977,
+ /* key: 0x6f0a */ 0xc843,
+ /* key: 0x6f0b */ 0xffff,
+ /* key: 0x6f0c */ 0xc844,
+ /* key: 0x6f0d */ 0xc845,
+ /* key: 0x6f0e */ 0xffff,
+ /* key: 0x6f0f */ 0x4f33,
+ /* key: 0x6f10 */ 0xffff,
+ /* key: 0x6f11 */ 0x5e74,
+ /* key: 0x6f12 */ 0xffff,
+ /* key: 0x6f13 */ 0x5f22,
+ /* key: 0x6f14 */ 0x3169,
+ /* key: 0x6f15 */ 0x4166,
+ /* key: 0x6f16 */ 0xc846,
+ /* key: 0x6f17 */ 0xffff,
+ /* key: 0x6f18 */ 0xc847,
+ /* key: 0x6f19 */ 0xffff,
+ /* key: 0x6f1a */ 0xc848,
+ /* key: 0x6f1b */ 0xc849,
+ /* key: 0x6f1c */ 0xffff,
+ /* key: 0x6f1d */ 0xffff,
+ /* key: 0x6f1e */ 0xffff,
+ /* key: 0x6f1f */ 0xffff,
+ /* key: 0x6f20 */ 0x4779,
+ /* key: 0x6f21 */ 0xffff,
+ /* key: 0x6f22 */ 0x3441,
+ /* key: 0x6f23 */ 0x4e7a,
+ /* key: 0x6f24 */ 0xffff,
+ /* key: 0x6f25 */ 0xffff,
+ /* key: 0x6f26 */ 0xc84a,
+ /* key: 0x6f27 */ 0xffff,
+ /* key: 0x6f28 */ 0xffff,
+ /* key: 0x6f29 */ 0xc84b,
+ /* key: 0x6f2a */ 0xc84c,
+ /* key: 0x6f2b */ 0x4c21,
+ /* key: 0x6f2c */ 0x4452,
+ /* key: 0x6f2d */ 0xc853,
+ /* key: 0x6f2e */ 0xffff,
+ /* key: 0x6f2f */ 0xc84d,
+ /* key: 0x6f30 */ 0xc84e,
+ /* key: 0x6f31 */ 0x5e7b,
+ /* key: 0x6f32 */ 0x5e7d,
+ /* key: 0x6f33 */ 0xc84f,
+ /* key: 0x6f34 */ 0xffff,
+ /* key: 0x6f35 */ 0xffff,
+ /* key: 0x6f36 */ 0xc850,
+ /* key: 0x6f37 */ 0xffff,
+ /* key: 0x6f38 */ 0x4132,
+ /* key: 0x6f39 */ 0xffff,
+ /* key: 0x6f3a */ 0xffff,
+ /* key: 0x6f3b */ 0xc851,
+ /* key: 0x6f3c */ 0xc852,
+ /* key: 0x6f3d */ 0xffff,
+ /* key: 0x6f3e */ 0x5f21,
+ /* key: 0x6f3f */ 0x5e79,
+ /* key: 0x6f40 */ 0xffff,
+ /* key: 0x6f41 */ 0x5e73,
+ /* key: 0x6f42 */ 0xffff,
+ /* key: 0x6f43 */ 0xffff,
+ /* key: 0x6f44 */ 0xffff,
+ /* key: 0x6f45 */ 0x3443,
+ /* key: 0x6f46 */ 0xffff,
+ /* key: 0x6f47 */ 0xffff,
+ /* key: 0x6f48 */ 0xffff,
+ /* key: 0x6f49 */ 0xffff,
+ /* key: 0x6f4a */ 0xffff,
+ /* key: 0x6f4b */ 0xffff,
+ /* key: 0x6f4c */ 0xffff,
+ /* key: 0x6f4d */ 0xffff,
+ /* key: 0x6f4e */ 0xffff,
+ /* key: 0x6f4f */ 0xc854,
+ /* key: 0x6f50 */ 0xffff,
+ /* key: 0x6f51 */ 0xc855,
+ /* key: 0x6f52 */ 0xc856,
+ /* key: 0x6f53 */ 0xc857,
+ /* key: 0x6f54 */ 0x3769,
+ /* key: 0x6f55 */ 0xffff,
+ /* key: 0x6f56 */ 0xffff,
+ /* key: 0x6f57 */ 0xc858,
+ /* key: 0x6f58 */ 0x5f2f,
+ /* key: 0x6f59 */ 0xc859,
+ /* key: 0x6f5a */ 0xc85a,
+ /* key: 0x6f5b */ 0x5f2a,
+ /* key: 0x6f5c */ 0x4078,
+ /* key: 0x6f5d */ 0xc85b,
+ /* key: 0x6f5e */ 0xc85c,
+ /* key: 0x6f5f */ 0x3363,
+ /* key: 0x6f60 */ 0xffff,
+ /* key: 0x6f61 */ 0xc85d,
+ /* key: 0x6f62 */ 0xc85e,
+ /* key: 0x6f63 */ 0xffff,
+ /* key: 0x6f64 */ 0x3d61,
+ /* key: 0x6f65 */ 0xffff,
+ /* key: 0x6f66 */ 0x5f33,
+ /* key: 0x6f67 */ 0xffff,
+ /* key: 0x6f68 */ 0xc85f,
+ /* key: 0x6f69 */ 0xffff,
+ /* key: 0x6f6a */ 0xffff,
+ /* key: 0x6f6b */ 0xffff,
+ /* key: 0x6f6c */ 0xc860,
+ /* key: 0x6f6d */ 0x5f2c,
+ /* key: 0x6f6e */ 0x442c,
+ /* key: 0x6f6f */ 0x5f29,
+ /* key: 0x6f70 */ 0x4459,
+ /* key: 0x6f71 */ 0xffff,
+ /* key: 0x6f72 */ 0xffff,
+ /* key: 0x6f73 */ 0xffff,
+ /* key: 0x6f74 */ 0x5f4c,
+ /* key: 0x6f75 */ 0xffff,
+ /* key: 0x6f76 */ 0xffff,
+ /* key: 0x6f77 */ 0xffff,
+ /* key: 0x6f78 */ 0x5f26,
+ /* key: 0x6f79 */ 0xffff,
+ /* key: 0x6f7a */ 0x5f25,
+ /* key: 0x6f7b */ 0xffff,
+ /* key: 0x6f7c */ 0x5f2e,
+ /* key: 0x6f7d */ 0xc861,
+ /* key: 0x6f7e */ 0xc862,
+ /* key: 0x6f7f */ 0xffff,
+ /* key: 0x6f80 */ 0x5f28,
+ /* key: 0x6f81 */ 0x5f27,
+ /* key: 0x6f82 */ 0x5f2d,
+ /* key: 0x6f83 */ 0xc863,
+ /* key: 0x6f84 */ 0x4021,
+ /* key: 0x6f85 */ 0xffff,
+ /* key: 0x6f86 */ 0x5f24,
+ /* key: 0x6f87 */ 0xc864,
+ /* key: 0x6f88 */ 0xc865,
+ /* key: 0x6f89 */ 0xffff,
+ /* key: 0x6f8a */ 0xffff,
+ /* key: 0x6f8b */ 0xc866,
+ /* key: 0x6f8c */ 0xc867,
+ /* key: 0x6f8d */ 0xc868,
+ /* key: 0x6f8e */ 0x5f30,
+ /* key: 0x6f8f */ 0xffff,
+ /* key: 0x6f90 */ 0xc869,
+ /* key: 0x6f91 */ 0x5f31,
+ /* key: 0x6f92 */ 0xc86a,
+ /* key: 0x6f93 */ 0xc86b,
+ /* key: 0x6f94 */ 0xc86c,
+ /* key: 0x6f95 */ 0xffff,
+ /* key: 0x6f96 */ 0xc86d,
+ /* key: 0x6f97 */ 0x3442,
+ /* key: 0x6f98 */ 0xffff,
+ /* key: 0x6f99 */ 0xffff,
+ /* key: 0x6f9a */ 0xc86e,
+ /* key: 0x6f9b */ 0xffff,
+ /* key: 0x6f9c */ 0xffff,
+ /* key: 0x6f9d */ 0xffff,
+ /* key: 0x6f9e */ 0xffff,
+ /* key: 0x6f9f */ 0xc86f,
+ /* key: 0x6fa0 */ 0xc870,
+ /* key: 0x6fa1 */ 0x5f36,
+ /* key: 0x6fa2 */ 0xffff,
+ /* key: 0x6fa3 */ 0x5f35,
+ /* key: 0x6fa4 */ 0x5f37,
+ /* key: 0x6fa5 */ 0xc871,
+ /* key: 0x6fa6 */ 0xc872,
+ /* key: 0x6fa7 */ 0xc873,
+ /* key: 0x6fa8 */ 0xc874,
+ /* key: 0x6fa9 */ 0xffff,
+ /* key: 0x6faa */ 0x5f3a,
+ /* key: 0x6fab */ 0xffff,
+ /* key: 0x6fac */ 0xffff,
+ /* key: 0x6fad */ 0xffff,
+ /* key: 0x6fae */ 0xc875,
+ /* key: 0x6faf */ 0xc876,
+ /* key: 0x6fb0 */ 0xc877,
+ /* key: 0x6fb1 */ 0x4543,
+ /* key: 0x6fb2 */ 0xffff,
+ /* key: 0x6fb3 */ 0x5f34,
+ /* key: 0x6fb4 */ 0xffff,
+ /* key: 0x6fb5 */ 0xc878,
+ /* key: 0x6fb6 */ 0xc879,
+ /* key: 0x6fb7 */ 0xffff,
+ /* key: 0x6fb8 */ 0xffff,
+ /* key: 0x6fb9 */ 0x5f38,
+ /* key: 0x6fba */ 0xffff,
+ /* key: 0x6fbb */ 0xffff,
+ /* key: 0x6fbc */ 0xc87a,
+ /* key: 0x6fbd */ 0xffff,
+ /* key: 0x6fbe */ 0xffff,
+ /* key: 0x6fbf */ 0xffff,
+ /* key: 0x6fc0 */ 0x3763,
+ /* key: 0x6fc1 */ 0x4279,
+ /* key: 0x6fc2 */ 0x5f32,
+ /* key: 0x6fc3 */ 0x473b,
+ /* key: 0x6fc4 */ 0xffff,
+ /* key: 0x6fc5 */ 0xc87b,
+ /* key: 0x6fc6 */ 0x5f39,
+ /* key: 0x6fc7 */ 0xc87c,
+ /* key: 0x6fc8 */ 0xc87d,
+ /* key: 0x6fc9 */ 0xffff,
+ /* key: 0x6fca */ 0xc87e,
+ /* key: 0x6fcb */ 0xffff,
+ /* key: 0x6fcc */ 0xffff,
+ /* key: 0x6fcd */ 0xffff,
+ /* key: 0x6fce */ 0xffff,
+ /* key: 0x6fcf */ 0xffff,
+ /* key: 0x6fd0 */ 0xffff,
+ /* key: 0x6fd1 */ 0xffff,
+ /* key: 0x6fd2 */ 0xffff,
+ /* key: 0x6fd3 */ 0xffff,
+ /* key: 0x6fd4 */ 0x5f3e,
+ /* key: 0x6fd5 */ 0x5f3c,
+ /* key: 0x6fd6 */ 0xffff,
+ /* key: 0x6fd7 */ 0xffff,
+ /* key: 0x6fd8 */ 0x5f3f,
+ /* key: 0x6fd9 */ 0xffff,
+ /* key: 0x6fda */ 0xc921,
+ /* key: 0x6fdb */ 0x5f42,
+ /* key: 0x6fdc */ 0xffff,
+ /* key: 0x6fdd */ 0xffff,
+ /* key: 0x6fde */ 0xc922,
+ /* key: 0x6fdf */ 0x5f3b,
+ /* key: 0x6fe0 */ 0x396a,
+ /* key: 0x6fe1 */ 0x4728,
+ /* key: 0x6fe2 */ 0xffff,
+ /* key: 0x6fe3 */ 0xffff,
+ /* key: 0x6fe4 */ 0x5e39,
+ /* key: 0x6fe5 */ 0xffff,
+ /* key: 0x6fe6 */ 0xffff,
+ /* key: 0x6fe7 */ 0xffff,
+ /* key: 0x6fe8 */ 0xc923,
+ /* key: 0x6fe9 */ 0xc924,
+ /* key: 0x6fea */ 0xffff,
+ /* key: 0x6feb */ 0x4d74,
+ /* key: 0x6fec */ 0x5f3d,
+ /* key: 0x6fed */ 0xffff,
+ /* key: 0x6fee */ 0x5f41,
+ /* key: 0x6fef */ 0x4275,
+ /* key: 0x6ff0 */ 0xc925,
+ /* key: 0x6ff1 */ 0x5f40,
+ /* key: 0x6ff2 */ 0xffff,
+ /* key: 0x6ff3 */ 0x5f2b,
+ /* key: 0x6ff4 */ 0xffff,
+ /* key: 0x6ff5 */ 0xc926,
+ /* key: 0x6ff6 */ 0x6f69,
+ /* key: 0x6ff7 */ 0xffff,
+ /* key: 0x6ff8 */ 0xffff,
+ /* key: 0x6ff9 */ 0xc927,
+ /* key: 0x6ffa */ 0x5f45,
+ /* key: 0x6ffb */ 0xffff,
+ /* key: 0x6ffc */ 0xc928,
+ /* key: 0x6ffd */ 0xc929,
+ /* key: 0x6ffe */ 0x5f49,
+ /* key: 0x6fff */ 0xffff,
+ /* branch: 0x70XX */ 10864,
+ /* branch: 0x71XX */ 11136,
+ /* branch: 0x72XX */ 11408,
+ /* branch: 0x73XX */ 11680,
+ /* branch: 0x74XX */ 11952,
+ /* branch: 0x75XX */ 12224,
+ /* branch: 0x76XX */ 12496,
+ /* branch: 0x77XX */ 12768,
+ /* branch: 0x78XX */ 13040,
+ /* branch: 0x79XX */ 13312,
+ /* branch: 0x7aXX */ 13584,
+ /* branch: 0x7bXX */ 13856,
+ /* branch: 0x7cXX */ 14128,
+ /* branch: 0x7dXX */ 14400,
+ /* branch: 0x7eXX */ 14672,
+ /* branch: 0x7fXX */ 14848,
+ /* branch: 0x700X */ 10880,
+ /* branch: 0x701X */ 10896,
+ /* branch: 0x702X */ 10912,
+ /* branch: 0x703X */ 10928,
+ /* branch: 0x704X */ 10944,
+ /* branch: 0x705X */ 10960,
+ /* branch: 0x706X */ 10976,
+ /* branch: 0x707X */ 10992,
+ /* branch: 0x708X */ 11008,
+ /* branch: 0x709X */ 11024,
+ /* branch: 0x70aX */ 11040,
+ /* branch: 0x70bX */ 11056,
+ /* branch: 0x70cX */ 11072,
+ /* branch: 0x70dX */ 11088,
+ /* branch: 0x70eX */ 11104,
+ /* branch: 0x70fX */ 11120,
+ /* key: 0x7000 */ 0xc92a,
+ /* key: 0x7001 */ 0x5f47,
+ /* key: 0x7002 */ 0xffff,
+ /* key: 0x7003 */ 0xffff,
+ /* key: 0x7004 */ 0xffff,
+ /* key: 0x7005 */ 0xc92b,
+ /* key: 0x7006 */ 0xc92c,
+ /* key: 0x7007 */ 0xc92d,
+ /* key: 0x7008 */ 0xffff,
+ /* key: 0x7009 */ 0x5f43,
+ /* key: 0x700a */ 0xffff,
+ /* key: 0x700b */ 0x5f44,
+ /* key: 0x700c */ 0xffff,
+ /* key: 0x700d */ 0xc92e,
+ /* key: 0x700e */ 0xffff,
+ /* key: 0x700f */ 0x5f48,
+ /* key: 0x7010 */ 0xffff,
+ /* key: 0x7011 */ 0x5f46,
+ /* key: 0x7012 */ 0xffff,
+ /* key: 0x7013 */ 0xffff,
+ /* key: 0x7014 */ 0xffff,
+ /* key: 0x7015 */ 0x494e,
+ /* key: 0x7016 */ 0xffff,
+ /* key: 0x7017 */ 0xc92f,
+ /* key: 0x7018 */ 0x5f4e,
+ /* key: 0x7019 */ 0xffff,
+ /* key: 0x701a */ 0x5f4b,
+ /* key: 0x701b */ 0x5f4a,
+ /* key: 0x701c */ 0xffff,
+ /* key: 0x701d */ 0x5f4d,
+ /* key: 0x701e */ 0x4654,
+ /* key: 0x701f */ 0x5f4f,
+ /* key: 0x7020 */ 0xc930,
+ /* key: 0x7021 */ 0xffff,
+ /* key: 0x7022 */ 0xffff,
+ /* key: 0x7023 */ 0xc931,
+ /* key: 0x7024 */ 0xffff,
+ /* key: 0x7025 */ 0xffff,
+ /* key: 0x7026 */ 0x4375,
+ /* key: 0x7027 */ 0x426d,
+ /* key: 0x7028 */ 0xffff,
+ /* key: 0x7029 */ 0xffff,
+ /* key: 0x702a */ 0xffff,
+ /* key: 0x702b */ 0xffff,
+ /* key: 0x702c */ 0x4025,
+ /* key: 0x702d */ 0xffff,
+ /* key: 0x702e */ 0xffff,
+ /* key: 0x702f */ 0xc932,
+ /* key: 0x7030 */ 0x5f50,
+ /* key: 0x7031 */ 0xffff,
+ /* key: 0x7032 */ 0x5f52,
+ /* key: 0x7033 */ 0xffff,
+ /* key: 0x7034 */ 0xc933,
+ /* key: 0x7035 */ 0xffff,
+ /* key: 0x7036 */ 0xffff,
+ /* key: 0x7037 */ 0xc934,
+ /* key: 0x7038 */ 0xffff,
+ /* key: 0x7039 */ 0xc935,
+ /* key: 0x703a */ 0xffff,
+ /* key: 0x703b */ 0xffff,
+ /* key: 0x703c */ 0xc936,
+ /* key: 0x703d */ 0xffff,
+ /* key: 0x703e */ 0x5f51,
+ /* key: 0x703f */ 0xffff,
+ /* key: 0x7040 */ 0xffff,
+ /* key: 0x7041 */ 0xffff,
+ /* key: 0x7042 */ 0xffff,
+ /* key: 0x7043 */ 0xc937,
+ /* key: 0x7044 */ 0xc938,
+ /* key: 0x7045 */ 0xffff,
+ /* key: 0x7046 */ 0xffff,
+ /* key: 0x7047 */ 0xffff,
+ /* key: 0x7048 */ 0xc939,
+ /* key: 0x7049 */ 0xc93a,
+ /* key: 0x704a */ 0xc93b,
+ /* key: 0x704b */ 0xc93c,
+ /* key: 0x704c */ 0x5e75,
+ /* key: 0x704d */ 0xffff,
+ /* key: 0x704e */ 0xc941,
+ /* key: 0x704f */ 0xffff,
+ /* key: 0x7050 */ 0xffff,
+ /* key: 0x7051 */ 0x5f53,
+ /* key: 0x7052 */ 0xffff,
+ /* key: 0x7053 */ 0xffff,
+ /* key: 0x7054 */ 0xc93d,
+ /* key: 0x7055 */ 0xc93e,
+ /* key: 0x7056 */ 0xffff,
+ /* key: 0x7057 */ 0xffff,
+ /* key: 0x7058 */ 0x4667,
+ /* key: 0x7059 */ 0xffff,
+ /* key: 0x705a */ 0xffff,
+ /* key: 0x705b */ 0xffff,
+ /* key: 0x705c */ 0xffff,
+ /* key: 0x705d */ 0xc93f,
+ /* key: 0x705e */ 0xc940,
+ /* key: 0x705f */ 0xffff,
+ /* key: 0x7060 */ 0xffff,
+ /* key: 0x7061 */ 0xffff,
+ /* key: 0x7062 */ 0xffff,
+ /* key: 0x7063 */ 0x5f54,
+ /* key: 0x7064 */ 0xc942,
+ /* key: 0x7065 */ 0xc943,
+ /* key: 0x7066 */ 0xffff,
+ /* key: 0x7067 */ 0xffff,
+ /* key: 0x7068 */ 0xffff,
+ /* key: 0x7069 */ 0xffff,
+ /* key: 0x706a */ 0xffff,
+ /* key: 0x706b */ 0x3250,
+ /* key: 0x706c */ 0xc944,
+ /* key: 0x706d */ 0xffff,
+ /* key: 0x706e */ 0xc945,
+ /* key: 0x706f */ 0x4574,
+ /* key: 0x7070 */ 0x3325,
+ /* key: 0x7071 */ 0xffff,
+ /* key: 0x7072 */ 0xffff,
+ /* key: 0x7073 */ 0xffff,
+ /* key: 0x7074 */ 0xffff,
+ /* key: 0x7075 */ 0xc946,
+ /* key: 0x7076 */ 0xc947,
+ /* key: 0x7077 */ 0xffff,
+ /* key: 0x7078 */ 0x3564,
+ /* key: 0x7079 */ 0xffff,
+ /* key: 0x707a */ 0xffff,
+ /* key: 0x707b */ 0xffff,
+ /* key: 0x707c */ 0x3c5e,
+ /* key: 0x707d */ 0x3a52,
+ /* key: 0x707e */ 0xc948,
+ /* key: 0x707f */ 0xffff,
+ /* key: 0x7080 */ 0xffff,
+ /* key: 0x7081 */ 0xc949,
+ /* key: 0x7082 */ 0xffff,
+ /* key: 0x7083 */ 0xffff,
+ /* key: 0x7084 */ 0xffff,
+ /* key: 0x7085 */ 0xc94a,
+ /* key: 0x7086 */ 0xc94b,
+ /* key: 0x7087 */ 0xffff,
+ /* key: 0x7088 */ 0xffff,
+ /* key: 0x7089 */ 0x4f27,
+ /* key: 0x708a */ 0x3f66,
+ /* key: 0x708b */ 0xffff,
+ /* key: 0x708c */ 0xffff,
+ /* key: 0x708d */ 0xffff,
+ /* key: 0x708e */ 0x316a,
+ /* key: 0x708f */ 0xffff,
+ /* key: 0x7090 */ 0xffff,
+ /* key: 0x7091 */ 0xffff,
+ /* key: 0x7092 */ 0x5f56,
+ /* key: 0x7093 */ 0xffff,
+ /* key: 0x7094 */ 0xc94c,
+ /* key: 0x7095 */ 0xc94d,
+ /* key: 0x7096 */ 0xc94e,
+ /* key: 0x7097 */ 0xc94f,
+ /* key: 0x7098 */ 0xc950,
+ /* key: 0x7099 */ 0x5f55,
+ /* key: 0x709a */ 0xffff,
+ /* key: 0x709b */ 0xc951,
+ /* key: 0x709c */ 0xffff,
+ /* key: 0x709d */ 0xffff,
+ /* key: 0x709e */ 0xffff,
+ /* key: 0x709f */ 0xffff,
+ /* key: 0x70a0 */ 0xffff,
+ /* key: 0x70a1 */ 0xffff,
+ /* key: 0x70a2 */ 0xffff,
+ /* key: 0x70a3 */ 0xffff,
+ /* key: 0x70a4 */ 0xc952,
+ /* key: 0x70a5 */ 0xffff,
+ /* key: 0x70a6 */ 0xffff,
+ /* key: 0x70a7 */ 0xffff,
+ /* key: 0x70a8 */ 0xffff,
+ /* key: 0x70a9 */ 0xffff,
+ /* key: 0x70aa */ 0xffff,
+ /* key: 0x70ab */ 0xc953,
+ /* key: 0x70ac */ 0x5f59,
+ /* key: 0x70ad */ 0x433a,
+ /* key: 0x70ae */ 0x5f5c,
+ /* key: 0x70af */ 0x5f57,
+ /* key: 0x70b0 */ 0xc954,
+ /* key: 0x70b1 */ 0xc955,
+ /* key: 0x70b2 */ 0xffff,
+ /* key: 0x70b3 */ 0x5f5b,
+ /* key: 0x70b4 */ 0xc956,
+ /* key: 0x70b5 */ 0xffff,
+ /* key: 0x70b6 */ 0xffff,
+ /* key: 0x70b7 */ 0xc957,
+ /* key: 0x70b8 */ 0x5f5a,
+ /* key: 0x70b9 */ 0x4540,
+ /* key: 0x70ba */ 0x3059,
+ /* key: 0x70bb */ 0xffff,
+ /* key: 0x70bc */ 0xffff,
+ /* key: 0x70bd */ 0xffff,
+ /* key: 0x70be */ 0xffff,
+ /* key: 0x70bf */ 0xffff,
+ /* key: 0x70c0 */ 0xffff,
+ /* key: 0x70c1 */ 0xffff,
+ /* key: 0x70c2 */ 0xffff,
+ /* key: 0x70c3 */ 0xffff,
+ /* key: 0x70c4 */ 0xffff,
+ /* key: 0x70c5 */ 0xffff,
+ /* key: 0x70c6 */ 0xffff,
+ /* key: 0x70c7 */ 0xffff,
+ /* key: 0x70c8 */ 0x4e75,
+ /* key: 0x70c9 */ 0xffff,
+ /* key: 0x70ca */ 0xc958,
+ /* key: 0x70cb */ 0x5f5e,
+ /* key: 0x70cc */ 0xffff,
+ /* key: 0x70cd */ 0xffff,
+ /* key: 0x70ce */ 0xffff,
+ /* key: 0x70cf */ 0x3128,
+ /* key: 0x70d0 */ 0xffff,
+ /* key: 0x70d1 */ 0xc959,
+ /* key: 0x70d2 */ 0xffff,
+ /* key: 0x70d3 */ 0xc95a,
+ /* key: 0x70d4 */ 0xc95b,
+ /* key: 0x70d5 */ 0xc95c,
+ /* key: 0x70d6 */ 0xc95d,
+ /* key: 0x70d7 */ 0xffff,
+ /* key: 0x70d8 */ 0xc95e,
+ /* key: 0x70d9 */ 0x5f60,
+ /* key: 0x70da */ 0xffff,
+ /* key: 0x70db */ 0xffff,
+ /* key: 0x70dc */ 0xc95f,
+ /* key: 0x70dd */ 0x5f5f,
+ /* key: 0x70de */ 0xffff,
+ /* key: 0x70df */ 0x5f5d,
+ /* key: 0x70e0 */ 0xffff,
+ /* key: 0x70e1 */ 0xffff,
+ /* key: 0x70e2 */ 0xffff,
+ /* key: 0x70e3 */ 0xffff,
+ /* key: 0x70e4 */ 0xc960,
+ /* key: 0x70e5 */ 0xffff,
+ /* key: 0x70e6 */ 0xffff,
+ /* key: 0x70e7 */ 0xffff,
+ /* key: 0x70e8 */ 0xffff,
+ /* key: 0x70e9 */ 0xffff,
+ /* key: 0x70ea */ 0xffff,
+ /* key: 0x70eb */ 0xffff,
+ /* key: 0x70ec */ 0xffff,
+ /* key: 0x70ed */ 0xffff,
+ /* key: 0x70ee */ 0xffff,
+ /* key: 0x70ef */ 0xffff,
+ /* key: 0x70f0 */ 0xffff,
+ /* key: 0x70f1 */ 0x5f58,
+ /* key: 0x70f2 */ 0xffff,
+ /* key: 0x70f3 */ 0xffff,
+ /* key: 0x70f4 */ 0xffff,
+ /* key: 0x70f5 */ 0xffff,
+ /* key: 0x70f6 */ 0xffff,
+ /* key: 0x70f7 */ 0xffff,
+ /* key: 0x70f8 */ 0xffff,
+ /* key: 0x70f9 */ 0x4b23,
+ /* key: 0x70fa */ 0xc961,
+ /* key: 0x70fb */ 0xffff,
+ /* key: 0x70fc */ 0xffff,
+ /* key: 0x70fd */ 0x5f62,
+ /* key: 0x70fe */ 0xffff,
+ /* key: 0x70ff */ 0xffff,
+ /* branch: 0x710X */ 11152,
+ /* branch: 0x711X */ 11168,
+ /* branch: 0x712X */ 11184,
+ /* branch: 0x713X */ 11200,
+ /* branch: 0x714X */ 11216,
+ /* branch: 0x715X */ 11232,
+ /* branch: 0x716X */ 11248,
+ /* branch: 0x717X */ 11264,
+ /* branch: 0x718X */ 11280,
+ /* branch: 0x719X */ 11296,
+ /* branch: 0x71aX */ 11312,
+ /* branch: 0x71bX */ 11328,
+ /* branch: 0x71cX */ 11344,
+ /* branch: 0x71dX */ 11360,
+ /* branch: 0x71eX */ 11376,
+ /* branch: 0x71fX */ 11392,
+ /* key: 0x7100 */ 0xffff,
+ /* key: 0x7101 */ 0xffff,
+ /* key: 0x7102 */ 0xffff,
+ /* key: 0x7103 */ 0xc962,
+ /* key: 0x7104 */ 0xc963,
+ /* key: 0x7105 */ 0xc964,
+ /* key: 0x7106 */ 0xc965,
+ /* key: 0x7107 */ 0xc966,
+ /* key: 0x7108 */ 0xffff,
+ /* key: 0x7109 */ 0x5f61,
+ /* key: 0x710a */ 0xffff,
+ /* key: 0x710b */ 0xc967,
+ /* key: 0x710c */ 0xc968,
+ /* key: 0x710d */ 0xffff,
+ /* key: 0x710e */ 0xffff,
+ /* key: 0x710f */ 0xc969,
+ /* key: 0x7110 */ 0xffff,
+ /* key: 0x7111 */ 0xffff,
+ /* key: 0x7112 */ 0xffff,
+ /* key: 0x7113 */ 0xffff,
+ /* key: 0x7114 */ 0x316b,
+ /* key: 0x7115 */ 0xffff,
+ /* key: 0x7116 */ 0xffff,
+ /* key: 0x7117 */ 0xffff,
+ /* key: 0x7118 */ 0xffff,
+ /* key: 0x7119 */ 0x5f64,
+ /* key: 0x711a */ 0x4a32,
+ /* key: 0x711b */ 0xffff,
+ /* key: 0x711c */ 0x5f63,
+ /* key: 0x711d */ 0xffff,
+ /* key: 0x711e */ 0xc96a,
+ /* key: 0x711f */ 0xffff,
+ /* key: 0x7120 */ 0xc96b,
+ /* key: 0x7121 */ 0x4c35,
+ /* key: 0x7122 */ 0xffff,
+ /* key: 0x7123 */ 0xffff,
+ /* key: 0x7124 */ 0xffff,
+ /* key: 0x7125 */ 0xffff,
+ /* key: 0x7126 */ 0x3e47,
+ /* key: 0x7127 */ 0xffff,
+ /* key: 0x7128 */ 0xffff,
+ /* key: 0x7129 */ 0xffff,
+ /* key: 0x712a */ 0xffff,
+ /* key: 0x712b */ 0xc96c,
+ /* key: 0x712c */ 0xffff,
+ /* key: 0x712d */ 0xc96d,
+ /* key: 0x712e */ 0xffff,
+ /* key: 0x712f */ 0xc96e,
+ /* key: 0x7130 */ 0xc96f,
+ /* key: 0x7131 */ 0xc970,
+ /* key: 0x7132 */ 0xffff,
+ /* key: 0x7133 */ 0xffff,
+ /* key: 0x7134 */ 0xffff,
+ /* key: 0x7135 */ 0xffff,
+ /* key: 0x7136 */ 0x4133,
+ /* key: 0x7137 */ 0xffff,
+ /* key: 0x7138 */ 0xc971,
+ /* key: 0x7139 */ 0xffff,
+ /* key: 0x713a */ 0xffff,
+ /* key: 0x713b */ 0xffff,
+ /* key: 0x713c */ 0x3e46,
+ /* key: 0x713d */ 0xffff,
+ /* key: 0x713e */ 0xffff,
+ /* key: 0x713f */ 0xffff,
+ /* key: 0x7140 */ 0xffff,
+ /* key: 0x7141 */ 0xc972,
+ /* key: 0x7142 */ 0xffff,
+ /* key: 0x7143 */ 0xffff,
+ /* key: 0x7144 */ 0xffff,
+ /* key: 0x7145 */ 0xc973,
+ /* key: 0x7146 */ 0xc974,
+ /* key: 0x7147 */ 0xc975,
+ /* key: 0x7148 */ 0xffff,
+ /* key: 0x7149 */ 0x4e7b,
+ /* key: 0x714a */ 0xc976,
+ /* key: 0x714b */ 0xc977,
+ /* key: 0x714c */ 0x5f6a,
+ /* key: 0x714d */ 0xffff,
+ /* key: 0x714e */ 0x4079,
+ /* key: 0x714f */ 0xffff,
+ /* key: 0x7150 */ 0xc978,
+ /* key: 0x7151 */ 0xffff,
+ /* key: 0x7152 */ 0xc979,
+ /* key: 0x7153 */ 0xffff,
+ /* key: 0x7154 */ 0xffff,
+ /* key: 0x7155 */ 0x5f66,
+ /* key: 0x7156 */ 0x5f6b,
+ /* key: 0x7157 */ 0xc97a,
+ /* key: 0x7158 */ 0xffff,
+ /* key: 0x7159 */ 0x316c,
+ /* key: 0x715a */ 0xc97b,
+ /* key: 0x715b */ 0xffff,
+ /* key: 0x715c */ 0xc97c,
+ /* key: 0x715d */ 0xffff,
+ /* key: 0x715e */ 0xc97d,
+ /* key: 0x715f */ 0xffff,
+ /* key: 0x7160 */ 0xc97e,
+ /* key: 0x7161 */ 0xffff,
+ /* key: 0x7162 */ 0x5f69,
+ /* key: 0x7163 */ 0xffff,
+ /* key: 0x7164 */ 0x4761,
+ /* key: 0x7165 */ 0x5f65,
+ /* key: 0x7166 */ 0x5f68,
+ /* key: 0x7167 */ 0x3e48,
+ /* key: 0x7168 */ 0xca21,
+ /* key: 0x7169 */ 0x4851,
+ /* key: 0x716a */ 0xffff,
+ /* key: 0x716b */ 0xffff,
+ /* key: 0x716c */ 0x5f6c,
+ /* key: 0x716d */ 0xffff,
+ /* key: 0x716e */ 0x3c51,
+ /* key: 0x716f */ 0xffff,
+ /* key: 0x7170 */ 0xffff,
+ /* key: 0x7171 */ 0xffff,
+ /* key: 0x7172 */ 0xffff,
+ /* key: 0x7173 */ 0xffff,
+ /* key: 0x7174 */ 0xffff,
+ /* key: 0x7175 */ 0xffff,
+ /* key: 0x7176 */ 0xffff,
+ /* key: 0x7177 */ 0xffff,
+ /* key: 0x7178 */ 0xffff,
+ /* key: 0x7179 */ 0xca22,
+ /* key: 0x717a */ 0xffff,
+ /* key: 0x717b */ 0xffff,
+ /* key: 0x717c */ 0xffff,
+ /* key: 0x717d */ 0x407a,
+ /* key: 0x717e */ 0xffff,
+ /* key: 0x717f */ 0xffff,
+ /* key: 0x7180 */ 0xca23,
+ /* key: 0x7181 */ 0xffff,
+ /* key: 0x7182 */ 0xffff,
+ /* key: 0x7183 */ 0xffff,
+ /* key: 0x7184 */ 0x5f6f,
+ /* key: 0x7185 */ 0xca24,
+ /* key: 0x7186 */ 0xffff,
+ /* key: 0x7187 */ 0xca25,
+ /* key: 0x7188 */ 0x5f67,
+ /* key: 0x7189 */ 0xffff,
+ /* key: 0x718a */ 0x3727,
+ /* key: 0x718b */ 0xffff,
+ /* key: 0x718c */ 0xca26,
+ /* key: 0x718d */ 0xffff,
+ /* key: 0x718e */ 0xffff,
+ /* key: 0x718f */ 0x5f6d,
+ /* key: 0x7190 */ 0xffff,
+ /* key: 0x7191 */ 0xffff,
+ /* key: 0x7192 */ 0xca27,
+ /* key: 0x7193 */ 0xffff,
+ /* key: 0x7194 */ 0x4d50,
+ /* key: 0x7195 */ 0x5f70,
+ /* key: 0x7196 */ 0xffff,
+ /* key: 0x7197 */ 0xffff,
+ /* key: 0x7198 */ 0xffff,
+ /* key: 0x7199 */ 0x7426,
+ /* key: 0x719a */ 0xca28,
+ /* key: 0x719b */ 0xca29,
+ /* key: 0x719c */ 0xffff,
+ /* key: 0x719d */ 0xffff,
+ /* key: 0x719e */ 0xffff,
+ /* key: 0x719f */ 0x3d4f,
+ /* key: 0x71a0 */ 0xca2a,
+ /* key: 0x71a1 */ 0xffff,
+ /* key: 0x71a2 */ 0xca2b,
+ /* key: 0x71a3 */ 0xffff,
+ /* key: 0x71a4 */ 0xffff,
+ /* key: 0x71a5 */ 0xffff,
+ /* key: 0x71a6 */ 0xffff,
+ /* key: 0x71a7 */ 0xffff,
+ /* key: 0x71a8 */ 0x5f71,
+ /* key: 0x71a9 */ 0xffff,
+ /* key: 0x71aa */ 0xffff,
+ /* key: 0x71ab */ 0xffff,
+ /* key: 0x71ac */ 0x5f72,
+ /* key: 0x71ad */ 0xffff,
+ /* key: 0x71ae */ 0xffff,
+ /* key: 0x71af */ 0xca2c,
+ /* key: 0x71b0 */ 0xca2d,
+ /* key: 0x71b1 */ 0x472e,
+ /* key: 0x71b2 */ 0xca2e,
+ /* key: 0x71b3 */ 0xca2f,
+ /* key: 0x71b4 */ 0xffff,
+ /* key: 0x71b5 */ 0xffff,
+ /* key: 0x71b6 */ 0xffff,
+ /* key: 0x71b7 */ 0xffff,
+ /* key: 0x71b8 */ 0xffff,
+ /* key: 0x71b9 */ 0x5f74,
+ /* key: 0x71ba */ 0xca30,
+ /* key: 0x71bb */ 0xffff,
+ /* key: 0x71bc */ 0xffff,
+ /* key: 0x71bd */ 0xffff,
+ /* key: 0x71be */ 0x5f75,
+ /* key: 0x71bf */ 0xca31,
+ /* key: 0x71c0 */ 0xca32,
+ /* key: 0x71c1 */ 0xca33,
+ /* key: 0x71c2 */ 0xffff,
+ /* key: 0x71c3 */ 0x4733,
+ /* key: 0x71c4 */ 0xca34,
+ /* key: 0x71c5 */ 0xffff,
+ /* key: 0x71c6 */ 0xffff,
+ /* key: 0x71c7 */ 0xffff,
+ /* key: 0x71c8 */ 0x4575,
+ /* key: 0x71c9 */ 0x5f77,
+ /* key: 0x71ca */ 0xffff,
+ /* key: 0x71cb */ 0xca35,
+ /* key: 0x71cc */ 0xca36,
+ /* key: 0x71cd */ 0xffff,
+ /* key: 0x71ce */ 0x5f79,
+ /* key: 0x71cf */ 0xffff,
+ /* key: 0x71d0 */ 0x4e55,
+ /* key: 0x71d1 */ 0xffff,
+ /* key: 0x71d2 */ 0x5f76,
+ /* key: 0x71d3 */ 0xca37,
+ /* key: 0x71d4 */ 0x5f78,
+ /* key: 0x71d5 */ 0x316d,
+ /* key: 0x71d6 */ 0xca38,
+ /* key: 0x71d7 */ 0x5f73,
+ /* key: 0x71d8 */ 0xffff,
+ /* key: 0x71d9 */ 0xca39,
+ /* key: 0x71da */ 0xca3a,
+ /* key: 0x71db */ 0xffff,
+ /* key: 0x71dc */ 0xca3b,
+ /* key: 0x71dd */ 0xffff,
+ /* key: 0x71de */ 0xffff,
+ /* key: 0x71df */ 0x535b,
+ /* key: 0x71e0 */ 0x5f7a,
+ /* key: 0x71e1 */ 0xffff,
+ /* key: 0x71e2 */ 0xffff,
+ /* key: 0x71e3 */ 0xffff,
+ /* key: 0x71e4 */ 0xffff,
+ /* key: 0x71e5 */ 0x4167,
+ /* key: 0x71e6 */ 0x3b38,
+ /* key: 0x71e7 */ 0x5f7c,
+ /* key: 0x71e8 */ 0xffff,
+ /* key: 0x71e9 */ 0xffff,
+ /* key: 0x71ea */ 0xffff,
+ /* key: 0x71eb */ 0xffff,
+ /* key: 0x71ec */ 0x5f7b,
+ /* key: 0x71ed */ 0x3f24,
+ /* key: 0x71ee */ 0x5259,
+ /* key: 0x71ef */ 0xffff,
+ /* key: 0x71f0 */ 0xffff,
+ /* key: 0x71f1 */ 0xffff,
+ /* key: 0x71f2 */ 0xffff,
+ /* key: 0x71f3 */ 0xffff,
+ /* key: 0x71f4 */ 0xffff,
+ /* key: 0x71f5 */ 0x5f7d,
+ /* key: 0x71f6 */ 0xffff,
+ /* key: 0x71f7 */ 0xffff,
+ /* key: 0x71f8 */ 0xca3c,
+ /* key: 0x71f9 */ 0x6021,
+ /* key: 0x71fa */ 0xffff,
+ /* key: 0x71fb */ 0x5f6e,
+ /* key: 0x71fc */ 0x5f7e,
+ /* key: 0x71fd */ 0xffff,
+ /* key: 0x71fe */ 0xca3d,
+ /* key: 0x71ff */ 0x6022,
+ /* branch: 0x720X */ 11424,
+ /* branch: 0x721X */ 11440,
+ /* branch: 0x722X */ 11456,
+ /* branch: 0x723X */ 11472,
+ /* branch: 0x724X */ 11488,
+ /* branch: 0x725X */ 11504,
+ /* branch: 0x726X */ 11520,
+ /* branch: 0x727X */ 11536,
+ /* branch: 0x728X */ 11552,
+ /* branch: 0x729X */ 11568,
+ /* branch: 0x72aX */ 11584,
+ /* branch: 0x72bX */ 11600,
+ /* branch: 0x72cX */ 11616,
+ /* branch: 0x72dX */ 11632,
+ /* branch: 0x72eX */ 11648,
+ /* branch: 0x72fX */ 11664,
+ /* key: 0x7200 */ 0xca3e,
+ /* key: 0x7201 */ 0xffff,
+ /* key: 0x7202 */ 0xffff,
+ /* key: 0x7203 */ 0xffff,
+ /* key: 0x7204 */ 0xffff,
+ /* key: 0x7205 */ 0xffff,
+ /* key: 0x7206 */ 0x477a,
+ /* key: 0x7207 */ 0xca3f,
+ /* key: 0x7208 */ 0xca40,
+ /* key: 0x7209 */ 0xca41,
+ /* key: 0x720a */ 0xffff,
+ /* key: 0x720b */ 0xffff,
+ /* key: 0x720c */ 0xffff,
+ /* key: 0x720d */ 0x6023,
+ /* key: 0x720e */ 0xffff,
+ /* key: 0x720f */ 0xffff,
+ /* key: 0x7210 */ 0x6024,
+ /* key: 0x7211 */ 0xffff,
+ /* key: 0x7212 */ 0xffff,
+ /* key: 0x7213 */ 0xca42,
+ /* key: 0x7214 */ 0xffff,
+ /* key: 0x7215 */ 0xffff,
+ /* key: 0x7216 */ 0xffff,
+ /* key: 0x7217 */ 0xca43,
+ /* key: 0x7218 */ 0xffff,
+ /* key: 0x7219 */ 0xffff,
+ /* key: 0x721a */ 0xca44,
+ /* key: 0x721b */ 0x6025,
+ /* key: 0x721c */ 0xffff,
+ /* key: 0x721d */ 0xca45,
+ /* key: 0x721e */ 0xffff,
+ /* key: 0x721f */ 0xca46,
+ /* key: 0x7220 */ 0xffff,
+ /* key: 0x7221 */ 0xffff,
+ /* key: 0x7222 */ 0xffff,
+ /* key: 0x7223 */ 0xffff,
+ /* key: 0x7224 */ 0xca47,
+ /* key: 0x7225 */ 0xffff,
+ /* key: 0x7226 */ 0xffff,
+ /* key: 0x7227 */ 0xffff,
+ /* key: 0x7228 */ 0x6026,
+ /* key: 0x7229 */ 0xffff,
+ /* key: 0x722a */ 0x445e,
+ /* key: 0x722b */ 0xca48,
+ /* key: 0x722c */ 0x6028,
+ /* key: 0x722d */ 0x6027,
+ /* key: 0x722e */ 0xffff,
+ /* key: 0x722f */ 0xca49,
+ /* key: 0x7230 */ 0x6029,
+ /* key: 0x7231 */ 0xffff,
+ /* key: 0x7232 */ 0x602a,
+ /* key: 0x7233 */ 0xffff,
+ /* key: 0x7234 */ 0xca4a,
+ /* key: 0x7235 */ 0x3c5f,
+ /* key: 0x7236 */ 0x4963,
+ /* key: 0x7237 */ 0xffff,
+ /* key: 0x7238 */ 0xca4b,
+ /* key: 0x7239 */ 0xca4c,
+ /* key: 0x723a */ 0x4c6c,
+ /* key: 0x723b */ 0x602b,
+ /* key: 0x723c */ 0x602c,
+ /* key: 0x723d */ 0x4156,
+ /* key: 0x723e */ 0x3c24,
+ /* key: 0x723f */ 0x602d,
+ /* key: 0x7240 */ 0x602e,
+ /* key: 0x7241 */ 0xca4d,
+ /* key: 0x7242 */ 0xca4e,
+ /* key: 0x7243 */ 0xca4f,
+ /* key: 0x7244 */ 0xffff,
+ /* key: 0x7245 */ 0xca50,
+ /* key: 0x7246 */ 0x602f,
+ /* key: 0x7247 */ 0x4a52,
+ /* key: 0x7248 */ 0x4847,
+ /* key: 0x7249 */ 0xffff,
+ /* key: 0x724a */ 0xffff,
+ /* key: 0x724b */ 0x6030,
+ /* key: 0x724c */ 0x4757,
+ /* key: 0x724d */ 0xffff,
+ /* key: 0x724e */ 0xca51,
+ /* key: 0x724f */ 0xca52,
+ /* key: 0x7250 */ 0xca53,
+ /* key: 0x7251 */ 0xffff,
+ /* key: 0x7252 */ 0x442d,
+ /* key: 0x7253 */ 0xca54,
+ /* key: 0x7254 */ 0xffff,
+ /* key: 0x7255 */ 0xca55,
+ /* key: 0x7256 */ 0xca56,
+ /* key: 0x7257 */ 0xffff,
+ /* key: 0x7258 */ 0x6031,
+ /* key: 0x7259 */ 0x3267,
+ /* key: 0x725a */ 0xca57,
+ /* key: 0x725b */ 0x356d,
+ /* key: 0x725c */ 0xca58,
+ /* key: 0x725d */ 0x4c46,
+ /* key: 0x725e */ 0xca59,
+ /* key: 0x725f */ 0x4c36,
+ /* key: 0x7260 */ 0xca5a,
+ /* key: 0x7261 */ 0x3234,
+ /* key: 0x7262 */ 0x4f34,
+ /* key: 0x7263 */ 0xca5b,
+ /* key: 0x7264 */ 0xffff,
+ /* key: 0x7265 */ 0xffff,
+ /* key: 0x7266 */ 0xffff,
+ /* key: 0x7267 */ 0x4b52,
+ /* key: 0x7268 */ 0xca5c,
+ /* key: 0x7269 */ 0x4a2a,
+ /* key: 0x726a */ 0xffff,
+ /* key: 0x726b */ 0xca5d,
+ /* key: 0x726c */ 0xffff,
+ /* key: 0x726d */ 0xffff,
+ /* key: 0x726e */ 0xca5e,
+ /* key: 0x726f */ 0xca5f,
+ /* key: 0x7270 */ 0xffff,
+ /* key: 0x7271 */ 0xca60,
+ /* key: 0x7272 */ 0x4037,
+ /* key: 0x7273 */ 0xffff,
+ /* key: 0x7274 */ 0x6032,
+ /* key: 0x7275 */ 0xffff,
+ /* key: 0x7276 */ 0xffff,
+ /* key: 0x7277 */ 0xca61,
+ /* key: 0x7278 */ 0xca62,
+ /* key: 0x7279 */ 0x4643,
+ /* key: 0x727a */ 0xffff,
+ /* key: 0x727b */ 0xca63,
+ /* key: 0x727c */ 0xca64,
+ /* key: 0x727d */ 0x3823,
+ /* key: 0x727e */ 0x6033,
+ /* key: 0x727f */ 0xca65,
+ /* key: 0x7280 */ 0x3a54,
+ /* key: 0x7281 */ 0x6035,
+ /* key: 0x7282 */ 0x6034,
+ /* key: 0x7283 */ 0xffff,
+ /* key: 0x7284 */ 0xca66,
+ /* key: 0x7285 */ 0xffff,
+ /* key: 0x7286 */ 0xffff,
+ /* key: 0x7287 */ 0x6036,
+ /* key: 0x7288 */ 0xffff,
+ /* key: 0x7289 */ 0xca67,
+ /* key: 0x728a */ 0xffff,
+ /* key: 0x728b */ 0xffff,
+ /* key: 0x728c */ 0xffff,
+ /* key: 0x728d */ 0xca68,
+ /* key: 0x728e */ 0xca69,
+ /* key: 0x728f */ 0xffff,
+ /* key: 0x7290 */ 0xffff,
+ /* key: 0x7291 */ 0xffff,
+ /* key: 0x7292 */ 0x6037,
+ /* key: 0x7293 */ 0xca6a,
+ /* key: 0x7294 */ 0xffff,
+ /* key: 0x7295 */ 0xffff,
+ /* key: 0x7296 */ 0x6038,
+ /* key: 0x7297 */ 0xffff,
+ /* key: 0x7298 */ 0xffff,
+ /* key: 0x7299 */ 0xffff,
+ /* key: 0x729a */ 0xffff,
+ /* key: 0x729b */ 0xca6b,
+ /* key: 0x729c */ 0xffff,
+ /* key: 0x729d */ 0xffff,
+ /* key: 0x729e */ 0xffff,
+ /* key: 0x729f */ 0xffff,
+ /* key: 0x72a0 */ 0x353e,
+ /* key: 0x72a1 */ 0xffff,
+ /* key: 0x72a2 */ 0x6039,
+ /* key: 0x72a3 */ 0xffff,
+ /* key: 0x72a4 */ 0xffff,
+ /* key: 0x72a5 */ 0xffff,
+ /* key: 0x72a6 */ 0xffff,
+ /* key: 0x72a7 */ 0x603a,
+ /* key: 0x72a8 */ 0xca6c,
+ /* key: 0x72a9 */ 0xffff,
+ /* key: 0x72aa */ 0xffff,
+ /* key: 0x72ab */ 0xffff,
+ /* key: 0x72ac */ 0x3824,
+ /* key: 0x72ad */ 0xca6d,
+ /* key: 0x72ae */ 0xca6e,
+ /* key: 0x72af */ 0x4848,
+ /* key: 0x72b0 */ 0xffff,
+ /* key: 0x72b1 */ 0xca6f,
+ /* key: 0x72b2 */ 0x603c,
+ /* key: 0x72b3 */ 0xffff,
+ /* key: 0x72b4 */ 0xca70,
+ /* key: 0x72b5 */ 0xffff,
+ /* key: 0x72b6 */ 0x3e75,
+ /* key: 0x72b7 */ 0xffff,
+ /* key: 0x72b8 */ 0xffff,
+ /* key: 0x72b9 */ 0x603b,
+ /* key: 0x72ba */ 0xffff,
+ /* key: 0x72bb */ 0xffff,
+ /* key: 0x72bc */ 0xffff,
+ /* key: 0x72bd */ 0xffff,
+ /* key: 0x72be */ 0xca71,
+ /* key: 0x72bf */ 0xffff,
+ /* key: 0x72c0 */ 0xffff,
+ /* key: 0x72c1 */ 0xca72,
+ /* key: 0x72c2 */ 0x3638,
+ /* key: 0x72c3 */ 0x603d,
+ /* key: 0x72c4 */ 0x603f,
+ /* key: 0x72c5 */ 0xffff,
+ /* key: 0x72c6 */ 0x603e,
+ /* key: 0x72c7 */ 0xca73,
+ /* key: 0x72c8 */ 0xffff,
+ /* key: 0x72c9 */ 0xca74,
+ /* key: 0x72ca */ 0xffff,
+ /* key: 0x72cb */ 0xffff,
+ /* key: 0x72cc */ 0xca75,
+ /* key: 0x72cd */ 0xffff,
+ /* key: 0x72ce */ 0x6040,
+ /* key: 0x72cf */ 0xffff,
+ /* key: 0x72d0 */ 0x3851,
+ /* key: 0x72d1 */ 0xffff,
+ /* key: 0x72d2 */ 0x6041,
+ /* key: 0x72d3 */ 0xffff,
+ /* key: 0x72d4 */ 0xffff,
+ /* key: 0x72d5 */ 0xca76,
+ /* key: 0x72d6 */ 0xca77,
+ /* key: 0x72d7 */ 0x3669,
+ /* key: 0x72d8 */ 0xca78,
+ /* key: 0x72d9 */ 0x4140,
+ /* key: 0x72da */ 0xffff,
+ /* key: 0x72db */ 0x397d,
+ /* key: 0x72dc */ 0xffff,
+ /* key: 0x72dd */ 0xffff,
+ /* key: 0x72de */ 0xffff,
+ /* key: 0x72df */ 0xca79,
+ /* key: 0x72e0 */ 0x6043,
+ /* key: 0x72e1 */ 0x6044,
+ /* key: 0x72e2 */ 0x6042,
+ /* key: 0x72e3 */ 0xffff,
+ /* key: 0x72e4 */ 0xffff,
+ /* key: 0x72e5 */ 0xca7a,
+ /* key: 0x72e6 */ 0xffff,
+ /* key: 0x72e7 */ 0xffff,
+ /* key: 0x72e8 */ 0xffff,
+ /* key: 0x72e9 */ 0x3c6d,
+ /* key: 0x72ea */ 0xffff,
+ /* key: 0x72eb */ 0xffff,
+ /* key: 0x72ec */ 0x4648,
+ /* key: 0x72ed */ 0x3639,
+ /* key: 0x72ee */ 0xffff,
+ /* key: 0x72ef */ 0xffff,
+ /* key: 0x72f0 */ 0xffff,
+ /* key: 0x72f1 */ 0xffff,
+ /* key: 0x72f2 */ 0xffff,
+ /* key: 0x72f3 */ 0xca7b,
+ /* key: 0x72f4 */ 0xca7c,
+ /* key: 0x72f5 */ 0xffff,
+ /* key: 0x72f6 */ 0xffff,
+ /* key: 0x72f7 */ 0x6046,
+ /* key: 0x72f8 */ 0x432c,
+ /* key: 0x72f9 */ 0x6045,
+ /* key: 0x72fa */ 0xca7d,
+ /* key: 0x72fb */ 0xca7e,
+ /* key: 0x72fc */ 0x4f35,
+ /* key: 0x72fd */ 0x4762,
+ /* key: 0x72fe */ 0xcb21,
+ /* key: 0x72ff */ 0xffff,
+ /* branch: 0x730X */ 11696,
+ /* branch: 0x731X */ 11712,
+ /* branch: 0x732X */ 11728,
+ /* branch: 0x733X */ 11744,
+ /* branch: 0x734X */ 11760,
+ /* branch: 0x735X */ 11776,
+ /* branch: 0x736X */ 11792,
+ /* branch: 0x737X */ 11808,
+ /* branch: 0x738X */ 11824,
+ /* branch: 0x739X */ 11840,
+ /* branch: 0x73aX */ 11856,
+ /* branch: 0x73bX */ 11872,
+ /* branch: 0x73cX */ 11888,
+ /* branch: 0x73dX */ 11904,
+ /* branch: 0x73eX */ 11920,
+ /* branch: 0x73fX */ 11936,
+ /* key: 0x7300 */ 0xffff,
+ /* key: 0x7301 */ 0xffff,
+ /* key: 0x7302 */ 0xcb22,
+ /* key: 0x7303 */ 0xffff,
+ /* key: 0x7304 */ 0xcb23,
+ /* key: 0x7305 */ 0xcb24,
+ /* key: 0x7306 */ 0xffff,
+ /* key: 0x7307 */ 0xcb25,
+ /* key: 0x7308 */ 0xffff,
+ /* key: 0x7309 */ 0xffff,
+ /* key: 0x730a */ 0x6049,
+ /* key: 0x730b */ 0xcb26,
+ /* key: 0x730c */ 0xffff,
+ /* key: 0x730d */ 0xcb27,
+ /* key: 0x730e */ 0xffff,
+ /* key: 0x730f */ 0xffff,
+ /* key: 0x7310 */ 0xffff,
+ /* key: 0x7311 */ 0xffff,
+ /* key: 0x7312 */ 0xcb28,
+ /* key: 0x7313 */ 0xcb29,
+ /* key: 0x7314 */ 0xffff,
+ /* key: 0x7315 */ 0xffff,
+ /* key: 0x7316 */ 0x604b,
+ /* key: 0x7317 */ 0x6048,
+ /* key: 0x7318 */ 0xcb2a,
+ /* key: 0x7319 */ 0xcb2b,
+ /* key: 0x731a */ 0xffff,
+ /* key: 0x731b */ 0x4c54,
+ /* key: 0x731c */ 0x604a,
+ /* key: 0x731d */ 0x604c,
+ /* key: 0x731e */ 0xcb2c,
+ /* key: 0x731f */ 0x4e44,
+ /* key: 0x7320 */ 0xffff,
+ /* key: 0x7321 */ 0xffff,
+ /* key: 0x7322 */ 0xcb2d,
+ /* key: 0x7323 */ 0xffff,
+ /* key: 0x7324 */ 0xcb2e,
+ /* key: 0x7325 */ 0x6050,
+ /* key: 0x7326 */ 0xffff,
+ /* key: 0x7327 */ 0xcb2f,
+ /* key: 0x7328 */ 0xcb30,
+ /* key: 0x7329 */ 0x604f,
+ /* key: 0x732a */ 0x4376,
+ /* key: 0x732b */ 0x472d,
+ /* key: 0x732c */ 0xcb31,
+ /* key: 0x732d */ 0xffff,
+ /* key: 0x732e */ 0x3825,
+ /* key: 0x732f */ 0x604e,
+ /* key: 0x7330 */ 0xffff,
+ /* key: 0x7331 */ 0xcb32,
+ /* key: 0x7332 */ 0xcb33,
+ /* key: 0x7333 */ 0xffff,
+ /* key: 0x7334 */ 0x604d,
+ /* key: 0x7335 */ 0xcb34,
+ /* key: 0x7336 */ 0x4d31,
+ /* key: 0x7337 */ 0x4d32,
+ /* key: 0x7338 */ 0xffff,
+ /* key: 0x7339 */ 0xffff,
+ /* key: 0x733a */ 0xcb35,
+ /* key: 0x733b */ 0xcb36,
+ /* key: 0x733c */ 0xffff,
+ /* key: 0x733d */ 0xcb37,
+ /* key: 0x733e */ 0x6051,
+ /* key: 0x733f */ 0x316e,
+ /* key: 0x7340 */ 0xffff,
+ /* key: 0x7341 */ 0xffff,
+ /* key: 0x7342 */ 0xffff,
+ /* key: 0x7343 */ 0xcb38,
+ /* key: 0x7344 */ 0x3976,
+ /* key: 0x7345 */ 0x3b62,
+ /* key: 0x7346 */ 0xffff,
+ /* key: 0x7347 */ 0xffff,
+ /* key: 0x7348 */ 0xffff,
+ /* key: 0x7349 */ 0xffff,
+ /* key: 0x734a */ 0xffff,
+ /* key: 0x734b */ 0xffff,
+ /* key: 0x734c */ 0xffff,
+ /* key: 0x734d */ 0xcb39,
+ /* key: 0x734e */ 0x6052,
+ /* key: 0x734f */ 0x6053,
+ /* key: 0x7350 */ 0xcb3a,
+ /* key: 0x7351 */ 0xffff,
+ /* key: 0x7352 */ 0xcb3b,
+ /* key: 0x7353 */ 0xffff,
+ /* key: 0x7354 */ 0xffff,
+ /* key: 0x7355 */ 0xffff,
+ /* key: 0x7356 */ 0xcb3c,
+ /* key: 0x7357 */ 0x6055,
+ /* key: 0x7358 */ 0xcb3d,
+ /* key: 0x7359 */ 0xffff,
+ /* key: 0x735a */ 0xffff,
+ /* key: 0x735b */ 0xffff,
+ /* key: 0x735c */ 0xffff,
+ /* key: 0x735d */ 0xcb3e,
+ /* key: 0x735e */ 0xcb3f,
+ /* key: 0x735f */ 0xcb40,
+ /* key: 0x7360 */ 0xcb41,
+ /* key: 0x7361 */ 0xffff,
+ /* key: 0x7362 */ 0xffff,
+ /* key: 0x7363 */ 0x3d43,
+ /* key: 0x7364 */ 0xffff,
+ /* key: 0x7365 */ 0xffff,
+ /* key: 0x7366 */ 0xcb42,
+ /* key: 0x7367 */ 0xcb43,
+ /* key: 0x7368 */ 0x6057,
+ /* key: 0x7369 */ 0xcb44,
+ /* key: 0x736a */ 0x6056,
+ /* key: 0x736b */ 0xcb45,
+ /* key: 0x736c */ 0xcb46,
+ /* key: 0x736d */ 0xffff,
+ /* key: 0x736e */ 0xcb47,
+ /* key: 0x736f */ 0xcb48,
+ /* key: 0x7370 */ 0x6058,
+ /* key: 0x7371 */ 0xcb49,
+ /* key: 0x7372 */ 0x334d,
+ /* key: 0x7373 */ 0xffff,
+ /* key: 0x7374 */ 0xffff,
+ /* key: 0x7375 */ 0x605a,
+ /* key: 0x7376 */ 0xffff,
+ /* key: 0x7377 */ 0xcb4a,
+ /* key: 0x7378 */ 0x6059,
+ /* key: 0x7379 */ 0xcb4b,
+ /* key: 0x737a */ 0x605c,
+ /* key: 0x737b */ 0x605b,
+ /* key: 0x737c */ 0xcb4c,
+ /* key: 0x737d */ 0xffff,
+ /* key: 0x737e */ 0xffff,
+ /* key: 0x737f */ 0xffff,
+ /* key: 0x7380 */ 0xcb4d,
+ /* key: 0x7381 */ 0xcb4e,
+ /* key: 0x7382 */ 0xffff,
+ /* key: 0x7383 */ 0xcb4f,
+ /* key: 0x7384 */ 0x383c,
+ /* key: 0x7385 */ 0xcb50,
+ /* key: 0x7386 */ 0xcb51,
+ /* key: 0x7387 */ 0x4e28,
+ /* key: 0x7388 */ 0xffff,
+ /* key: 0x7389 */ 0x364c,
+ /* key: 0x738a */ 0xffff,
+ /* key: 0x738b */ 0x3226,
+ /* key: 0x738c */ 0xffff,
+ /* key: 0x738d */ 0xffff,
+ /* key: 0x738e */ 0xcb52,
+ /* key: 0x738f */ 0xffff,
+ /* key: 0x7390 */ 0xcb53,
+ /* key: 0x7391 */ 0xffff,
+ /* key: 0x7392 */ 0xffff,
+ /* key: 0x7393 */ 0xcb54,
+ /* key: 0x7394 */ 0xffff,
+ /* key: 0x7395 */ 0xcb55,
+ /* key: 0x7396 */ 0x366a,
+ /* key: 0x7397 */ 0xcb56,
+ /* key: 0x7398 */ 0xcb57,
+ /* key: 0x7399 */ 0xffff,
+ /* key: 0x739a */ 0xffff,
+ /* key: 0x739b */ 0xffff,
+ /* key: 0x739c */ 0xcb58,
+ /* key: 0x739d */ 0xffff,
+ /* key: 0x739e */ 0xcb59,
+ /* key: 0x739f */ 0xcb5a,
+ /* key: 0x73a0 */ 0xcb5b,
+ /* key: 0x73a1 */ 0xffff,
+ /* key: 0x73a2 */ 0xcb5c,
+ /* key: 0x73a3 */ 0xffff,
+ /* key: 0x73a4 */ 0xffff,
+ /* key: 0x73a5 */ 0xcb5d,
+ /* key: 0x73a6 */ 0xcb5e,
+ /* key: 0x73a7 */ 0xffff,
+ /* key: 0x73a8 */ 0xffff,
+ /* key: 0x73a9 */ 0x3461,
+ /* key: 0x73aa */ 0xcb5f,
+ /* key: 0x73ab */ 0xcb60,
+ /* key: 0x73ac */ 0xffff,
+ /* key: 0x73ad */ 0xcb61,
+ /* key: 0x73ae */ 0xffff,
+ /* key: 0x73af */ 0xffff,
+ /* key: 0x73b0 */ 0xffff,
+ /* key: 0x73b1 */ 0xffff,
+ /* key: 0x73b2 */ 0x4e68,
+ /* key: 0x73b3 */ 0x605e,
+ /* key: 0x73b4 */ 0xffff,
+ /* key: 0x73b5 */ 0xcb62,
+ /* key: 0x73b6 */ 0xffff,
+ /* key: 0x73b7 */ 0xcb63,
+ /* key: 0x73b8 */ 0xffff,
+ /* key: 0x73b9 */ 0xcb64,
+ /* key: 0x73ba */ 0xffff,
+ /* key: 0x73bb */ 0x6060,
+ /* key: 0x73bc */ 0xcb65,
+ /* key: 0x73bd */ 0xcb66,
+ /* key: 0x73be */ 0xffff,
+ /* key: 0x73bf */ 0xcb67,
+ /* key: 0x73c0 */ 0x6061,
+ /* key: 0x73c1 */ 0xffff,
+ /* key: 0x73c2 */ 0x3251,
+ /* key: 0x73c3 */ 0xffff,
+ /* key: 0x73c4 */ 0xffff,
+ /* key: 0x73c5 */ 0xcb68,
+ /* key: 0x73c6 */ 0xcb69,
+ /* key: 0x73c7 */ 0xffff,
+ /* key: 0x73c8 */ 0x605d,
+ /* key: 0x73c9 */ 0xcb6a,
+ /* key: 0x73ca */ 0x3b39,
+ /* key: 0x73cb */ 0xcb6b,
+ /* key: 0x73cc */ 0xcb6c,
+ /* key: 0x73cd */ 0x4441,
+ /* key: 0x73ce */ 0x605f,
+ /* key: 0x73cf */ 0xcb6d,
+ /* key: 0x73d0 */ 0xffff,
+ /* key: 0x73d1 */ 0xffff,
+ /* key: 0x73d2 */ 0xcb6e,
+ /* key: 0x73d3 */ 0xcb6f,
+ /* key: 0x73d4 */ 0xffff,
+ /* key: 0x73d5 */ 0xffff,
+ /* key: 0x73d6 */ 0xcb70,
+ /* key: 0x73d7 */ 0xffff,
+ /* key: 0x73d8 */ 0xffff,
+ /* key: 0x73d9 */ 0xcb71,
+ /* key: 0x73da */ 0xffff,
+ /* key: 0x73db */ 0xffff,
+ /* key: 0x73dc */ 0xffff,
+ /* key: 0x73dd */ 0xcb72,
+ /* key: 0x73de */ 0x6064,
+ /* key: 0x73df */ 0xffff,
+ /* key: 0x73e0 */ 0x3c6e,
+ /* key: 0x73e1 */ 0xcb73,
+ /* key: 0x73e2 */ 0xffff,
+ /* key: 0x73e3 */ 0xcb74,
+ /* key: 0x73e4 */ 0xffff,
+ /* key: 0x73e5 */ 0x6062,
+ /* key: 0x73e6 */ 0xcb75,
+ /* key: 0x73e7 */ 0xcb76,
+ /* key: 0x73e8 */ 0xffff,
+ /* key: 0x73e9 */ 0xcb77,
+ /* key: 0x73ea */ 0x373e,
+ /* key: 0x73eb */ 0xffff,
+ /* key: 0x73ec */ 0xffff,
+ /* key: 0x73ed */ 0x4849,
+ /* key: 0x73ee */ 0x6063,
+ /* key: 0x73ef */ 0xffff,
+ /* key: 0x73f0 */ 0xffff,
+ /* key: 0x73f1 */ 0x607e,
+ /* key: 0x73f2 */ 0xffff,
+ /* key: 0x73f3 */ 0xffff,
+ /* key: 0x73f4 */ 0xcb78,
+ /* key: 0x73f5 */ 0xcb79,
+ /* key: 0x73f6 */ 0xffff,
+ /* key: 0x73f7 */ 0xcb7a,
+ /* key: 0x73f8 */ 0x6069,
+ /* key: 0x73f9 */ 0xcb7b,
+ /* key: 0x73fa */ 0xcb7c,
+ /* key: 0x73fb */ 0xcb7d,
+ /* key: 0x73fc */ 0xffff,
+ /* key: 0x73fd */ 0xcb7e,
+ /* key: 0x73fe */ 0x383d,
+ /* key: 0x73ff */ 0xcc21,
+ /* branch: 0x740X */ 11968,
+ /* branch: 0x741X */ 11984,
+ /* branch: 0x742X */ 12000,
+ /* branch: 0x743X */ 12016,
+ /* branch: 0x744X */ 12032,
+ /* branch: 0x745X */ 12048,
+ /* branch: 0x746X */ 12064,
+ /* branch: 0x747X */ 12080,
+ /* branch: 0x748X */ 12096,
+ /* branch: 0x749X */ 12112,
+ /* branch: 0x74aX */ 12128,
+ /* branch: 0x74bX */ 12144,
+ /* branch: 0x74cX */ 12160,
+ /* branch: 0x74dX */ 12176,
+ /* branch: 0x74eX */ 12192,
+ /* branch: 0x74fX */ 12208,
+ /* key: 0x7400 */ 0xcc22,
+ /* key: 0x7401 */ 0xcc23,
+ /* key: 0x7402 */ 0xffff,
+ /* key: 0x7403 */ 0x3565,
+ /* key: 0x7404 */ 0xcc24,
+ /* key: 0x7405 */ 0x6066,
+ /* key: 0x7406 */ 0x4d7d,
+ /* key: 0x7407 */ 0xcc25,
+ /* key: 0x7408 */ 0xffff,
+ /* key: 0x7409 */ 0x4e30,
+ /* key: 0x740a */ 0xcc26,
+ /* key: 0x740b */ 0xffff,
+ /* key: 0x740c */ 0xffff,
+ /* key: 0x740d */ 0xffff,
+ /* key: 0x740e */ 0xffff,
+ /* key: 0x740f */ 0xffff,
+ /* key: 0x7410 */ 0xffff,
+ /* key: 0x7411 */ 0xcc27,
+ /* key: 0x7412 */ 0xffff,
+ /* key: 0x7413 */ 0xffff,
+ /* key: 0x7414 */ 0xffff,
+ /* key: 0x7415 */ 0xffff,
+ /* key: 0x7416 */ 0xffff,
+ /* key: 0x7417 */ 0xffff,
+ /* key: 0x7418 */ 0xffff,
+ /* key: 0x7419 */ 0xffff,
+ /* key: 0x741a */ 0xcc28,
+ /* key: 0x741b */ 0xcc29,
+ /* key: 0x741c */ 0xffff,
+ /* key: 0x741d */ 0xffff,
+ /* key: 0x741e */ 0xffff,
+ /* key: 0x741f */ 0xffff,
+ /* key: 0x7420 */ 0xffff,
+ /* key: 0x7421 */ 0xffff,
+ /* key: 0x7422 */ 0x4276,
+ /* key: 0x7423 */ 0xffff,
+ /* key: 0x7424 */ 0xcc2a,
+ /* key: 0x7425 */ 0x6068,
+ /* key: 0x7426 */ 0xcc2b,
+ /* key: 0x7427 */ 0xffff,
+ /* key: 0x7428 */ 0xcc2c,
+ /* key: 0x7429 */ 0xcc2d,
+ /* key: 0x742a */ 0xcc2e,
+ /* key: 0x742b */ 0xcc2f,
+ /* key: 0x742c */ 0xcc30,
+ /* key: 0x742d */ 0xcc31,
+ /* key: 0x742e */ 0xcc32,
+ /* key: 0x742f */ 0xcc33,
+ /* key: 0x7430 */ 0xcc34,
+ /* key: 0x7431 */ 0xcc35,
+ /* key: 0x7432 */ 0x606a,
+ /* key: 0x7433 */ 0x4e56,
+ /* key: 0x7434 */ 0x3657,
+ /* key: 0x7435 */ 0x487c,
+ /* key: 0x7436 */ 0x474a,
+ /* key: 0x7437 */ 0xffff,
+ /* key: 0x7438 */ 0xffff,
+ /* key: 0x7439 */ 0xcc36,
+ /* key: 0x743a */ 0x606b,
+ /* key: 0x743b */ 0xffff,
+ /* key: 0x743c */ 0xffff,
+ /* key: 0x743d */ 0xffff,
+ /* key: 0x743e */ 0xffff,
+ /* key: 0x743f */ 0x606d,
+ /* key: 0x7440 */ 0xcc37,
+ /* key: 0x7441 */ 0x6070,
+ /* key: 0x7442 */ 0xffff,
+ /* key: 0x7443 */ 0xcc38,
+ /* key: 0x7444 */ 0xcc39,
+ /* key: 0x7445 */ 0xffff,
+ /* key: 0x7446 */ 0xcc3a,
+ /* key: 0x7447 */ 0xcc3b,
+ /* key: 0x7448 */ 0xffff,
+ /* key: 0x7449 */ 0xffff,
+ /* key: 0x744a */ 0xffff,
+ /* key: 0x744b */ 0xcc3c,
+ /* key: 0x744c */ 0xffff,
+ /* key: 0x744d */ 0xcc3d,
+ /* key: 0x744e */ 0xffff,
+ /* key: 0x744f */ 0xffff,
+ /* key: 0x7450 */ 0xffff,
+ /* key: 0x7451 */ 0xcc3e,
+ /* key: 0x7452 */ 0xcc3f,
+ /* key: 0x7453 */ 0xffff,
+ /* key: 0x7454 */ 0xffff,
+ /* key: 0x7455 */ 0x606c,
+ /* key: 0x7456 */ 0xffff,
+ /* key: 0x7457 */ 0xcc40,
+ /* key: 0x7458 */ 0xffff,
+ /* key: 0x7459 */ 0x606f,
+ /* key: 0x745a */ 0x386a,
+ /* key: 0x745b */ 0x314d,
+ /* key: 0x745c */ 0x6071,
+ /* key: 0x745d */ 0xcc41,
+ /* key: 0x745e */ 0x3f70,
+ /* key: 0x745f */ 0x606e,
+ /* key: 0x7460 */ 0x4e5c,
+ /* key: 0x7461 */ 0xffff,
+ /* key: 0x7462 */ 0xcc42,
+ /* key: 0x7463 */ 0x6074,
+ /* key: 0x7464 */ 0x7424,
+ /* key: 0x7465 */ 0xffff,
+ /* key: 0x7466 */ 0xcc43,
+ /* key: 0x7467 */ 0xcc44,
+ /* key: 0x7468 */ 0xcc45,
+ /* key: 0x7469 */ 0x6072,
+ /* key: 0x746a */ 0x6075,
+ /* key: 0x746b */ 0xcc46,
+ /* key: 0x746c */ 0xffff,
+ /* key: 0x746d */ 0xcc47,
+ /* key: 0x746e */ 0xcc48,
+ /* key: 0x746f */ 0x6067,
+ /* key: 0x7470 */ 0x6073,
+ /* key: 0x7471 */ 0xcc49,
+ /* key: 0x7472 */ 0xcc4a,
+ /* key: 0x7473 */ 0x3a3c,
+ /* key: 0x7474 */ 0xffff,
+ /* key: 0x7475 */ 0xffff,
+ /* key: 0x7476 */ 0x6076,
+ /* key: 0x7477 */ 0xffff,
+ /* key: 0x7478 */ 0xffff,
+ /* key: 0x7479 */ 0xffff,
+ /* key: 0x747a */ 0xffff,
+ /* key: 0x747b */ 0xffff,
+ /* key: 0x747c */ 0xffff,
+ /* key: 0x747d */ 0xffff,
+ /* key: 0x747e */ 0x6077,
+ /* key: 0x747f */ 0xffff,
+ /* key: 0x7480 */ 0xcc4b,
+ /* key: 0x7481 */ 0xcc4c,
+ /* key: 0x7482 */ 0xffff,
+ /* key: 0x7483 */ 0x4d7e,
+ /* key: 0x7484 */ 0xffff,
+ /* key: 0x7485 */ 0xcc4d,
+ /* key: 0x7486 */ 0xcc4e,
+ /* key: 0x7487 */ 0xcc4f,
+ /* key: 0x7488 */ 0xffff,
+ /* key: 0x7489 */ 0xcc50,
+ /* key: 0x748a */ 0xffff,
+ /* key: 0x748b */ 0x6078,
+ /* key: 0x748c */ 0xffff,
+ /* key: 0x748d */ 0xffff,
+ /* key: 0x748e */ 0xffff,
+ /* key: 0x748f */ 0xcc51,
+ /* key: 0x7490 */ 0xcc52,
+ /* key: 0x7491 */ 0xcc53,
+ /* key: 0x7492 */ 0xcc54,
+ /* key: 0x7493 */ 0xffff,
+ /* key: 0x7494 */ 0xffff,
+ /* key: 0x7495 */ 0xffff,
+ /* key: 0x7496 */ 0xffff,
+ /* key: 0x7497 */ 0xffff,
+ /* key: 0x7498 */ 0xcc55,
+ /* key: 0x7499 */ 0xcc56,
+ /* key: 0x749a */ 0xcc57,
+ /* key: 0x749b */ 0xffff,
+ /* key: 0x749c */ 0xcc58,
+ /* key: 0x749d */ 0xffff,
+ /* key: 0x749e */ 0x6079,
+ /* key: 0x749f */ 0xcc59,
+ /* key: 0x74a0 */ 0xcc5a,
+ /* key: 0x74a1 */ 0xcc5b,
+ /* key: 0x74a2 */ 0x6065,
+ /* key: 0x74a3 */ 0xcc5c,
+ /* key: 0x74a4 */ 0xffff,
+ /* key: 0x74a5 */ 0xffff,
+ /* key: 0x74a6 */ 0xcc5d,
+ /* key: 0x74a7 */ 0x607a,
+ /* key: 0x74a8 */ 0xcc5e,
+ /* key: 0x74a9 */ 0xcc5f,
+ /* key: 0x74aa */ 0xcc60,
+ /* key: 0x74ab */ 0xcc61,
+ /* key: 0x74ac */ 0xffff,
+ /* key: 0x74ad */ 0xffff,
+ /* key: 0x74ae */ 0xcc62,
+ /* key: 0x74af */ 0xcc63,
+ /* key: 0x74b0 */ 0x3444,
+ /* key: 0x74b1 */ 0xcc64,
+ /* key: 0x74b2 */ 0xcc65,
+ /* key: 0x74b3 */ 0xffff,
+ /* key: 0x74b4 */ 0xffff,
+ /* key: 0x74b5 */ 0xcc66,
+ /* key: 0x74b6 */ 0xffff,
+ /* key: 0x74b7 */ 0xffff,
+ /* key: 0x74b8 */ 0xffff,
+ /* key: 0x74b9 */ 0xcc67,
+ /* key: 0x74ba */ 0xffff,
+ /* key: 0x74bb */ 0xcc68,
+ /* key: 0x74bc */ 0xffff,
+ /* key: 0x74bd */ 0x3c25,
+ /* key: 0x74be */ 0xffff,
+ /* key: 0x74bf */ 0xcc69,
+ /* key: 0x74c0 */ 0xffff,
+ /* key: 0x74c1 */ 0xffff,
+ /* key: 0x74c2 */ 0xffff,
+ /* key: 0x74c3 */ 0xffff,
+ /* key: 0x74c4 */ 0xffff,
+ /* key: 0x74c5 */ 0xffff,
+ /* key: 0x74c6 */ 0xffff,
+ /* key: 0x74c7 */ 0xffff,
+ /* key: 0x74c8 */ 0xcc6a,
+ /* key: 0x74c9 */ 0xcc6b,
+ /* key: 0x74ca */ 0x607b,
+ /* key: 0x74cb */ 0xffff,
+ /* key: 0x74cc */ 0xcc6c,
+ /* key: 0x74cd */ 0xffff,
+ /* key: 0x74ce */ 0xffff,
+ /* key: 0x74cf */ 0x607c,
+ /* key: 0x74d0 */ 0xcc6d,
+ /* key: 0x74d1 */ 0xffff,
+ /* key: 0x74d2 */ 0xffff,
+ /* key: 0x74d3 */ 0xcc6e,
+ /* key: 0x74d4 */ 0x607d,
+ /* key: 0x74d5 */ 0xffff,
+ /* key: 0x74d6 */ 0xffff,
+ /* key: 0x74d7 */ 0xffff,
+ /* key: 0x74d8 */ 0xcc6f,
+ /* key: 0x74d9 */ 0xffff,
+ /* key: 0x74da */ 0xcc70,
+ /* key: 0x74db */ 0xcc71,
+ /* key: 0x74dc */ 0x313b,
+ /* key: 0x74dd */ 0xffff,
+ /* key: 0x74de */ 0xcc72,
+ /* key: 0x74df */ 0xcc73,
+ /* key: 0x74e0 */ 0x6121,
+ /* key: 0x74e1 */ 0xffff,
+ /* key: 0x74e2 */ 0x493b,
+ /* key: 0x74e3 */ 0x6122,
+ /* key: 0x74e4 */ 0xcc74,
+ /* key: 0x74e5 */ 0xffff,
+ /* key: 0x74e6 */ 0x3424,
+ /* key: 0x74e7 */ 0x6123,
+ /* key: 0x74e8 */ 0xcc75,
+ /* key: 0x74e9 */ 0x6124,
+ /* key: 0x74ea */ 0xcc76,
+ /* key: 0x74eb */ 0xcc77,
+ /* key: 0x74ec */ 0xffff,
+ /* key: 0x74ed */ 0xffff,
+ /* key: 0x74ee */ 0x6125,
+ /* key: 0x74ef */ 0xcc78,
+ /* key: 0x74f0 */ 0x6127,
+ /* key: 0x74f1 */ 0x6128,
+ /* key: 0x74f2 */ 0x6126,
+ /* key: 0x74f3 */ 0xffff,
+ /* key: 0x74f4 */ 0xcc79,
+ /* key: 0x74f5 */ 0xffff,
+ /* key: 0x74f6 */ 0x4953,
+ /* key: 0x74f7 */ 0x612a,
+ /* key: 0x74f8 */ 0x6129,
+ /* key: 0x74f9 */ 0xffff,
+ /* key: 0x74fa */ 0xcc7a,
+ /* key: 0x74fb */ 0xcc7b,
+ /* key: 0x74fc */ 0xcc7c,
+ /* key: 0x74fd */ 0xffff,
+ /* key: 0x74fe */ 0xffff,
+ /* key: 0x74ff */ 0xcc7d,
+ /* branch: 0x750X */ 12240,
+ /* branch: 0x751X */ 12256,
+ /* branch: 0x752X */ 12272,
+ /* branch: 0x753X */ 12288,
+ /* branch: 0x754X */ 12304,
+ /* branch: 0x755X */ 12320,
+ /* branch: 0x756X */ 12336,
+ /* branch: 0x757X */ 12352,
+ /* branch: 0x758X */ 12368,
+ /* branch: 0x759X */ 12384,
+ /* branch: 0x75aX */ 12400,
+ /* branch: 0x75bX */ 12416,
+ /* branch: 0x75cX */ 12432,
+ /* branch: 0x75dX */ 12448,
+ /* branch: 0x75eX */ 12464,
+ /* branch: 0x75fX */ 12480,
+ /* key: 0x7500 */ 0xffff,
+ /* key: 0x7501 */ 0xffff,
+ /* key: 0x7502 */ 0xffff,
+ /* key: 0x7503 */ 0x612c,
+ /* key: 0x7504 */ 0x612b,
+ /* key: 0x7505 */ 0x612d,
+ /* key: 0x7506 */ 0xcc7e,
+ /* key: 0x7507 */ 0xffff,
+ /* key: 0x7508 */ 0xffff,
+ /* key: 0x7509 */ 0xffff,
+ /* key: 0x750a */ 0xffff,
+ /* key: 0x750b */ 0xffff,
+ /* key: 0x750c */ 0x612e,
+ /* key: 0x750d */ 0x6130,
+ /* key: 0x750e */ 0x612f,
+ /* key: 0x750f */ 0xffff,
+ /* key: 0x7510 */ 0xffff,
+ /* key: 0x7511 */ 0x3979,
+ /* key: 0x7512 */ 0xcd21,
+ /* key: 0x7513 */ 0x6132,
+ /* key: 0x7514 */ 0xffff,
+ /* key: 0x7515 */ 0x6131,
+ /* key: 0x7516 */ 0xcd22,
+ /* key: 0x7517 */ 0xcd23,
+ /* key: 0x7518 */ 0x3445,
+ /* key: 0x7519 */ 0xffff,
+ /* key: 0x751a */ 0x3f53,
+ /* key: 0x751b */ 0xffff,
+ /* key: 0x751c */ 0x453c,
+ /* key: 0x751d */ 0xffff,
+ /* key: 0x751e */ 0x6133,
+ /* key: 0x751f */ 0x4038,
+ /* key: 0x7520 */ 0xcd24,
+ /* key: 0x7521 */ 0xcd25,
+ /* key: 0x7522 */ 0xffff,
+ /* key: 0x7523 */ 0x3b3a,
+ /* key: 0x7524 */ 0xcd26,
+ /* key: 0x7525 */ 0x3179,
+ /* key: 0x7526 */ 0x6134,
+ /* key: 0x7527 */ 0xcd27,
+ /* key: 0x7528 */ 0x4d51,
+ /* key: 0x7529 */ 0xcd28,
+ /* key: 0x752a */ 0xcd29,
+ /* key: 0x752b */ 0x4a63,
+ /* key: 0x752c */ 0x6135,
+ /* key: 0x752d */ 0xffff,
+ /* key: 0x752e */ 0xffff,
+ /* key: 0x752f */ 0xcd2a,
+ /* key: 0x7530 */ 0x4544,
+ /* key: 0x7531 */ 0x4d33,
+ /* key: 0x7532 */ 0x3943,
+ /* key: 0x7533 */ 0x3f3d,
+ /* key: 0x7534 */ 0xffff,
+ /* key: 0x7535 */ 0xffff,
+ /* key: 0x7536 */ 0xcd2b,
+ /* key: 0x7537 */ 0x434b,
+ /* key: 0x7538 */ 0x5234,
+ /* key: 0x7539 */ 0xcd2c,
+ /* key: 0x753a */ 0x442e,
+ /* key: 0x753b */ 0x3268,
+ /* key: 0x753c */ 0x6136,
+ /* key: 0x753d */ 0xcd2d,
+ /* key: 0x753e */ 0xcd2e,
+ /* key: 0x753f */ 0xcd2f,
+ /* key: 0x7540 */ 0xcd30,
+ /* key: 0x7541 */ 0xffff,
+ /* key: 0x7542 */ 0xffff,
+ /* key: 0x7543 */ 0xcd31,
+ /* key: 0x7544 */ 0x6137,
+ /* key: 0x7545 */ 0xffff,
+ /* key: 0x7546 */ 0x613c,
+ /* key: 0x7547 */ 0xcd32,
+ /* key: 0x7548 */ 0xcd33,
+ /* key: 0x7549 */ 0x613a,
+ /* key: 0x754a */ 0x6139,
+ /* key: 0x754b */ 0x5a42,
+ /* key: 0x754c */ 0x3326,
+ /* key: 0x754d */ 0x6138,
+ /* key: 0x754e */ 0xcd34,
+ /* key: 0x754f */ 0x305a,
+ /* key: 0x7550 */ 0xcd35,
+ /* key: 0x7551 */ 0x482a,
+ /* key: 0x7552 */ 0xcd36,
+ /* key: 0x7553 */ 0xffff,
+ /* key: 0x7554 */ 0x484a,
+ /* key: 0x7555 */ 0xffff,
+ /* key: 0x7556 */ 0xffff,
+ /* key: 0x7557 */ 0xcd37,
+ /* key: 0x7558 */ 0xffff,
+ /* key: 0x7559 */ 0x4e31,
+ /* key: 0x755a */ 0x613d,
+ /* key: 0x755b */ 0x613b,
+ /* key: 0x755c */ 0x435c,
+ /* key: 0x755d */ 0x4026,
+ /* key: 0x755e */ 0xcd38,
+ /* key: 0x755f */ 0xcd39,
+ /* key: 0x7560 */ 0x482b,
+ /* key: 0x7561 */ 0xcd3a,
+ /* key: 0x7562 */ 0x492d,
+ /* key: 0x7563 */ 0xffff,
+ /* key: 0x7564 */ 0x613f,
+ /* key: 0x7565 */ 0x4e2c,
+ /* key: 0x7566 */ 0x374d,
+ /* key: 0x7567 */ 0x6140,
+ /* key: 0x7568 */ 0xffff,
+ /* key: 0x7569 */ 0x613e,
+ /* key: 0x756a */ 0x4856,
+ /* key: 0x756b */ 0x6141,
+ /* key: 0x756c */ 0xffff,
+ /* key: 0x756d */ 0x6142,
+ /* key: 0x756e */ 0xffff,
+ /* key: 0x756f */ 0xcd3b,
+ /* key: 0x7570 */ 0x305b,
+ /* key: 0x7571 */ 0xcd3c,
+ /* key: 0x7572 */ 0xffff,
+ /* key: 0x7573 */ 0x3e76,
+ /* key: 0x7574 */ 0x6147,
+ /* key: 0x7575 */ 0xffff,
+ /* key: 0x7576 */ 0x6144,
+ /* key: 0x7577 */ 0x466d,
+ /* key: 0x7578 */ 0x6143,
+ /* key: 0x7579 */ 0xcd3d,
+ /* key: 0x757a */ 0xcd3e,
+ /* key: 0x757b */ 0xcd3f,
+ /* key: 0x757c */ 0xcd40,
+ /* key: 0x757d */ 0xcd41,
+ /* key: 0x757e */ 0xcd42,
+ /* key: 0x757f */ 0x3526,
+ /* key: 0x7580 */ 0xffff,
+ /* key: 0x7581 */ 0xcd43,
+ /* key: 0x7582 */ 0x614a,
+ /* key: 0x7583 */ 0xffff,
+ /* key: 0x7584 */ 0xffff,
+ /* key: 0x7585 */ 0xcd44,
+ /* key: 0x7586 */ 0x6145,
+ /* key: 0x7587 */ 0x6146,
+ /* key: 0x7588 */ 0xffff,
+ /* key: 0x7589 */ 0x6149,
+ /* key: 0x758a */ 0x6148,
+ /* key: 0x758b */ 0x4925,
+ /* key: 0x758c */ 0xffff,
+ /* key: 0x758d */ 0xffff,
+ /* key: 0x758e */ 0x4142,
+ /* key: 0x758f */ 0x4141,
+ /* key: 0x7590 */ 0xcd45,
+ /* key: 0x7591 */ 0x353f,
+ /* key: 0x7592 */ 0xcd46,
+ /* key: 0x7593 */ 0xcd47,
+ /* key: 0x7594 */ 0x614b,
+ /* key: 0x7595 */ 0xcd48,
+ /* key: 0x7596 */ 0xffff,
+ /* key: 0x7597 */ 0xffff,
+ /* key: 0x7598 */ 0xffff,
+ /* key: 0x7599 */ 0xcd49,
+ /* key: 0x759a */ 0x614c,
+ /* key: 0x759b */ 0xffff,
+ /* key: 0x759c */ 0xcd4a,
+ /* key: 0x759d */ 0x614d,
+ /* key: 0x759e */ 0xffff,
+ /* key: 0x759f */ 0xffff,
+ /* key: 0x75a0 */ 0xffff,
+ /* key: 0x75a1 */ 0xffff,
+ /* key: 0x75a2 */ 0xcd4b,
+ /* key: 0x75a3 */ 0x614f,
+ /* key: 0x75a4 */ 0xcd4c,
+ /* key: 0x75a5 */ 0x614e,
+ /* key: 0x75a6 */ 0xffff,
+ /* key: 0x75a7 */ 0xffff,
+ /* key: 0x75a8 */ 0xffff,
+ /* key: 0x75a9 */ 0xffff,
+ /* key: 0x75aa */ 0xffff,
+ /* key: 0x75ab */ 0x3156,
+ /* key: 0x75ac */ 0xffff,
+ /* key: 0x75ad */ 0xffff,
+ /* key: 0x75ae */ 0xffff,
+ /* key: 0x75af */ 0xffff,
+ /* key: 0x75b0 */ 0xffff,
+ /* key: 0x75b1 */ 0x6157,
+ /* key: 0x75b2 */ 0x4868,
+ /* key: 0x75b3 */ 0x6151,
+ /* key: 0x75b4 */ 0xcd4d,
+ /* key: 0x75b5 */ 0x6153,
+ /* key: 0x75b6 */ 0xffff,
+ /* key: 0x75b7 */ 0xffff,
+ /* key: 0x75b8 */ 0x6155,
+ /* key: 0x75b9 */ 0x3f3e,
+ /* key: 0x75ba */ 0xcd4e,
+ /* key: 0x75bb */ 0xffff,
+ /* key: 0x75bc */ 0x6156,
+ /* key: 0x75bd */ 0x6154,
+ /* key: 0x75be */ 0x3c40,
+ /* key: 0x75bf */ 0xcd4f,
+ /* key: 0x75c0 */ 0xcd50,
+ /* key: 0x75c1 */ 0xcd51,
+ /* key: 0x75c2 */ 0x6150,
+ /* key: 0x75c3 */ 0x6152,
+ /* key: 0x75c4 */ 0xcd52,
+ /* key: 0x75c5 */ 0x4942,
+ /* key: 0x75c6 */ 0xcd53,
+ /* key: 0x75c7 */ 0x3e49,
+ /* key: 0x75c8 */ 0xffff,
+ /* key: 0x75c9 */ 0xffff,
+ /* key: 0x75ca */ 0x6159,
+ /* key: 0x75cb */ 0xffff,
+ /* key: 0x75cc */ 0xcd54,
+ /* key: 0x75cd */ 0x6158,
+ /* key: 0x75ce */ 0xcd55,
+ /* key: 0x75cf */ 0xcd56,
+ /* key: 0x75d0 */ 0xffff,
+ /* key: 0x75d1 */ 0xffff,
+ /* key: 0x75d2 */ 0x615a,
+ /* key: 0x75d3 */ 0xffff,
+ /* key: 0x75d4 */ 0x3c26,
+ /* key: 0x75d5 */ 0x3a2f,
+ /* key: 0x75d6 */ 0xffff,
+ /* key: 0x75d7 */ 0xcd57,
+ /* key: 0x75d8 */ 0x4577,
+ /* key: 0x75d9 */ 0x615b,
+ /* key: 0x75da */ 0xffff,
+ /* key: 0x75db */ 0x444b,
+ /* key: 0x75dc */ 0xcd58,
+ /* key: 0x75dd */ 0xffff,
+ /* key: 0x75de */ 0x615d,
+ /* key: 0x75df */ 0xcd59,
+ /* key: 0x75e0 */ 0xcd5a,
+ /* key: 0x75e1 */ 0xcd5b,
+ /* key: 0x75e2 */ 0x4e21,
+ /* key: 0x75e3 */ 0x615c,
+ /* key: 0x75e4 */ 0xcd5c,
+ /* key: 0x75e5 */ 0xffff,
+ /* key: 0x75e6 */ 0xffff,
+ /* key: 0x75e7 */ 0xcd5d,
+ /* key: 0x75e8 */ 0xffff,
+ /* key: 0x75e9 */ 0x4169,
+ /* key: 0x75ea */ 0xffff,
+ /* key: 0x75eb */ 0xffff,
+ /* key: 0x75ec */ 0xcd5e,
+ /* key: 0x75ed */ 0xffff,
+ /* key: 0x75ee */ 0xcd5f,
+ /* key: 0x75ef */ 0xcd60,
+ /* key: 0x75f0 */ 0x6162,
+ /* key: 0x75f1 */ 0xcd61,
+ /* key: 0x75f2 */ 0x6164,
+ /* key: 0x75f3 */ 0x6165,
+ /* key: 0x75f4 */ 0x4354,
+ /* key: 0x75f5 */ 0xffff,
+ /* key: 0x75f6 */ 0xffff,
+ /* key: 0x75f7 */ 0xffff,
+ /* key: 0x75f8 */ 0xffff,
+ /* key: 0x75f9 */ 0xcd62,
+ /* key: 0x75fa */ 0x6163,
+ /* key: 0x75fb */ 0xffff,
+ /* key: 0x75fc */ 0x6160,
+ /* key: 0x75fd */ 0xffff,
+ /* key: 0x75fe */ 0x615e,
+ /* key: 0x75ff */ 0x615f,
+ /* branch: 0x760X */ 12512,
+ /* branch: 0x761X */ 12528,
+ /* branch: 0x762X */ 12544,
+ /* branch: 0x763X */ 12560,
+ /* branch: 0x764X */ 12576,
+ /* branch: 0x765X */ 12592,
+ /* branch: 0x766X */ 12608,
+ /* branch: 0x767X */ 12624,
+ /* branch: 0x768X */ 12640,
+ /* branch: 0x769X */ 12656,
+ /* branch: 0x76aX */ 12672,
+ /* branch: 0x76bX */ 12688,
+ /* branch: 0x76cX */ 12704,
+ /* branch: 0x76dX */ 12720,
+ /* branch: 0x76eX */ 12736,
+ /* branch: 0x76fX */ 12752,
+ /* key: 0x7600 */ 0xcd63,
+ /* key: 0x7601 */ 0x6161,
+ /* key: 0x7602 */ 0xcd64,
+ /* key: 0x7603 */ 0xcd65,
+ /* key: 0x7604 */ 0xcd66,
+ /* key: 0x7605 */ 0xffff,
+ /* key: 0x7606 */ 0xffff,
+ /* key: 0x7607 */ 0xcd67,
+ /* key: 0x7608 */ 0xcd68,
+ /* key: 0x7609 */ 0x6168,
+ /* key: 0x760a */ 0xcd69,
+ /* key: 0x760b */ 0x6166,
+ /* key: 0x760c */ 0xcd6a,
+ /* key: 0x760d */ 0x6167,
+ /* key: 0x760e */ 0xffff,
+ /* key: 0x760f */ 0xcd6b,
+ /* key: 0x7610 */ 0xffff,
+ /* key: 0x7611 */ 0xffff,
+ /* key: 0x7612 */ 0xcd6c,
+ /* key: 0x7613 */ 0xcd6d,
+ /* key: 0x7614 */ 0xffff,
+ /* key: 0x7615 */ 0xcd6e,
+ /* key: 0x7616 */ 0xcd6f,
+ /* key: 0x7617 */ 0xffff,
+ /* key: 0x7618 */ 0xffff,
+ /* key: 0x7619 */ 0xcd70,
+ /* key: 0x761a */ 0xffff,
+ /* key: 0x761b */ 0xcd71,
+ /* key: 0x761c */ 0xcd72,
+ /* key: 0x761d */ 0xcd73,
+ /* key: 0x761e */ 0xcd74,
+ /* key: 0x761f */ 0x6169,
+ /* key: 0x7620 */ 0x616b,
+ /* key: 0x7621 */ 0x616c,
+ /* key: 0x7622 */ 0x616d,
+ /* key: 0x7623 */ 0xcd75,
+ /* key: 0x7624 */ 0x616e,
+ /* key: 0x7625 */ 0xcd76,
+ /* key: 0x7626 */ 0xcd77,
+ /* key: 0x7627 */ 0x616a,
+ /* key: 0x7628 */ 0xffff,
+ /* key: 0x7629 */ 0xcd78,
+ /* key: 0x762a */ 0xffff,
+ /* key: 0x762b */ 0xffff,
+ /* key: 0x762c */ 0xffff,
+ /* key: 0x762d */ 0xcd79,
+ /* key: 0x762e */ 0xffff,
+ /* key: 0x762f */ 0xffff,
+ /* key: 0x7630 */ 0x6170,
+ /* key: 0x7631 */ 0xffff,
+ /* key: 0x7632 */ 0xcd7a,
+ /* key: 0x7633 */ 0xcd7b,
+ /* key: 0x7634 */ 0x616f,
+ /* key: 0x7635 */ 0xcd7c,
+ /* key: 0x7636 */ 0xffff,
+ /* key: 0x7637 */ 0xffff,
+ /* key: 0x7638 */ 0xcd7d,
+ /* key: 0x7639 */ 0xcd7e,
+ /* key: 0x763a */ 0xce21,
+ /* key: 0x763b */ 0x6171,
+ /* key: 0x763c */ 0xce22,
+ /* key: 0x763d */ 0xffff,
+ /* key: 0x763e */ 0xffff,
+ /* key: 0x763f */ 0xffff,
+ /* key: 0x7640 */ 0xce24,
+ /* key: 0x7641 */ 0xce25,
+ /* key: 0x7642 */ 0x4e45,
+ /* key: 0x7643 */ 0xce26,
+ /* key: 0x7644 */ 0xce27,
+ /* key: 0x7645 */ 0xce28,
+ /* key: 0x7646 */ 0x6174,
+ /* key: 0x7647 */ 0x6172,
+ /* key: 0x7648 */ 0x6173,
+ /* key: 0x7649 */ 0xce29,
+ /* key: 0x764a */ 0xce23,
+ /* key: 0x764b */ 0xce2a,
+ /* key: 0x764c */ 0x3462,
+ /* key: 0x764d */ 0xffff,
+ /* key: 0x764e */ 0xffff,
+ /* key: 0x764f */ 0xffff,
+ /* key: 0x7650 */ 0xffff,
+ /* key: 0x7651 */ 0xffff,
+ /* key: 0x7652 */ 0x4c7e,
+ /* key: 0x7653 */ 0xffff,
+ /* key: 0x7654 */ 0xffff,
+ /* key: 0x7655 */ 0xce2b,
+ /* key: 0x7656 */ 0x4a4a,
+ /* key: 0x7657 */ 0xffff,
+ /* key: 0x7658 */ 0x6176,
+ /* key: 0x7659 */ 0xce2c,
+ /* key: 0x765a */ 0xffff,
+ /* key: 0x765b */ 0xffff,
+ /* key: 0x765c */ 0x6175,
+ /* key: 0x765d */ 0xffff,
+ /* key: 0x765e */ 0xffff,
+ /* key: 0x765f */ 0xce2d,
+ /* key: 0x7660 */ 0xffff,
+ /* key: 0x7661 */ 0x6177,
+ /* key: 0x7662 */ 0x6178,
+ /* key: 0x7663 */ 0xffff,
+ /* key: 0x7664 */ 0xce2e,
+ /* key: 0x7665 */ 0xce2f,
+ /* key: 0x7666 */ 0xffff,
+ /* key: 0x7667 */ 0x617c,
+ /* key: 0x7668 */ 0x6179,
+ /* key: 0x7669 */ 0x617a,
+ /* key: 0x766a */ 0x617b,
+ /* key: 0x766b */ 0xffff,
+ /* key: 0x766c */ 0x617d,
+ /* key: 0x766d */ 0xce30,
+ /* key: 0x766e */ 0xce31,
+ /* key: 0x766f */ 0xce32,
+ /* key: 0x7670 */ 0x617e,
+ /* key: 0x7671 */ 0xce33,
+ /* key: 0x7672 */ 0x6221,
+ /* key: 0x7673 */ 0xffff,
+ /* key: 0x7674 */ 0xce34,
+ /* key: 0x7675 */ 0xffff,
+ /* key: 0x7676 */ 0x6222,
+ /* key: 0x7677 */ 0xffff,
+ /* key: 0x7678 */ 0x6223,
+ /* key: 0x7679 */ 0xffff,
+ /* key: 0x767a */ 0x482f,
+ /* key: 0x767b */ 0x4550,
+ /* key: 0x767c */ 0x6224,
+ /* key: 0x767d */ 0x4772,
+ /* key: 0x767e */ 0x4934,
+ /* key: 0x767f */ 0xffff,
+ /* key: 0x7680 */ 0x6225,
+ /* key: 0x7681 */ 0xce35,
+ /* key: 0x7682 */ 0xffff,
+ /* key: 0x7683 */ 0x6226,
+ /* key: 0x7684 */ 0x452a,
+ /* key: 0x7685 */ 0xce36,
+ /* key: 0x7686 */ 0x3327,
+ /* key: 0x7687 */ 0x3944,
+ /* key: 0x7688 */ 0x6227,
+ /* key: 0x7689 */ 0xffff,
+ /* key: 0x768a */ 0xffff,
+ /* key: 0x768b */ 0x6228,
+ /* key: 0x768c */ 0xce37,
+ /* key: 0x768d */ 0xce38,
+ /* key: 0x768e */ 0x6229,
+ /* key: 0x768f */ 0xffff,
+ /* key: 0x7690 */ 0x3b29,
+ /* key: 0x7691 */ 0xffff,
+ /* key: 0x7692 */ 0xffff,
+ /* key: 0x7693 */ 0x622b,
+ /* key: 0x7694 */ 0xffff,
+ /* key: 0x7695 */ 0xce39,
+ /* key: 0x7696 */ 0x622a,
+ /* key: 0x7697 */ 0xffff,
+ /* key: 0x7698 */ 0xffff,
+ /* key: 0x7699 */ 0x622c,
+ /* key: 0x769a */ 0x622d,
+ /* key: 0x769b */ 0xce3a,
+ /* key: 0x769c */ 0xce3b,
+ /* key: 0x769d */ 0xce3c,
+ /* key: 0x769e */ 0xffff,
+ /* key: 0x769f */ 0xce3d,
+ /* key: 0x76a0 */ 0xce3e,
+ /* key: 0x76a1 */ 0xffff,
+ /* key: 0x76a2 */ 0xce3f,
+ /* key: 0x76a3 */ 0xce40,
+ /* key: 0x76a4 */ 0xce41,
+ /* key: 0x76a5 */ 0xce42,
+ /* key: 0x76a6 */ 0xce43,
+ /* key: 0x76a7 */ 0xce44,
+ /* key: 0x76a8 */ 0xce45,
+ /* key: 0x76a9 */ 0xffff,
+ /* key: 0x76aa */ 0xce46,
+ /* key: 0x76ab */ 0xffff,
+ /* key: 0x76ac */ 0xffff,
+ /* key: 0x76ad */ 0xce47,
+ /* key: 0x76ae */ 0x4869,
+ /* key: 0x76af */ 0xffff,
+ /* key: 0x76b0 */ 0x622e,
+ /* key: 0x76b1 */ 0xffff,
+ /* key: 0x76b2 */ 0xffff,
+ /* key: 0x76b3 */ 0xffff,
+ /* key: 0x76b4 */ 0x622f,
+ /* key: 0x76b5 */ 0xffff,
+ /* key: 0x76b6 */ 0xffff,
+ /* key: 0x76b7 */ 0x7369,
+ /* key: 0x76b8 */ 0x6230,
+ /* key: 0x76b9 */ 0x6231,
+ /* key: 0x76ba */ 0x6232,
+ /* key: 0x76bb */ 0xffff,
+ /* key: 0x76bc */ 0xffff,
+ /* key: 0x76bd */ 0xce48,
+ /* key: 0x76be */ 0xffff,
+ /* key: 0x76bf */ 0x3b2e,
+ /* key: 0x76c0 */ 0xffff,
+ /* key: 0x76c1 */ 0xce49,
+ /* key: 0x76c2 */ 0x6233,
+ /* key: 0x76c3 */ 0x4756,
+ /* key: 0x76c4 */ 0xffff,
+ /* key: 0x76c5 */ 0xce4a,
+ /* key: 0x76c6 */ 0x4b5f,
+ /* key: 0x76c7 */ 0xffff,
+ /* key: 0x76c8 */ 0x314e,
+ /* key: 0x76c9 */ 0xce4b,
+ /* key: 0x76ca */ 0x3157,
+ /* key: 0x76cb */ 0xce4c,
+ /* key: 0x76cc */ 0xce4d,
+ /* key: 0x76cd */ 0x6234,
+ /* key: 0x76ce */ 0xce4e,
+ /* key: 0x76cf */ 0xffff,
+ /* key: 0x76d0 */ 0xffff,
+ /* key: 0x76d1 */ 0xffff,
+ /* key: 0x76d2 */ 0x6236,
+ /* key: 0x76d3 */ 0xffff,
+ /* key: 0x76d4 */ 0xce4f,
+ /* key: 0x76d5 */ 0xffff,
+ /* key: 0x76d6 */ 0x6235,
+ /* key: 0x76d7 */ 0x4570,
+ /* key: 0x76d8 */ 0xffff,
+ /* key: 0x76d9 */ 0xce50,
+ /* key: 0x76da */ 0xffff,
+ /* key: 0x76db */ 0x4039,
+ /* key: 0x76dc */ 0x5d39,
+ /* key: 0x76dd */ 0xffff,
+ /* key: 0x76de */ 0x6237,
+ /* key: 0x76df */ 0x4c41,
+ /* key: 0x76e0 */ 0xce51,
+ /* key: 0x76e1 */ 0x6238,
+ /* key: 0x76e2 */ 0xffff,
+ /* key: 0x76e3 */ 0x3446,
+ /* key: 0x76e4 */ 0x4857,
+ /* key: 0x76e5 */ 0x6239,
+ /* key: 0x76e6 */ 0xce52,
+ /* key: 0x76e7 */ 0x623a,
+ /* key: 0x76e8 */ 0xce53,
+ /* key: 0x76e9 */ 0xffff,
+ /* key: 0x76ea */ 0x623b,
+ /* key: 0x76eb */ 0xffff,
+ /* key: 0x76ec */ 0xce54,
+ /* key: 0x76ed */ 0xffff,
+ /* key: 0x76ee */ 0x4c5c,
+ /* key: 0x76ef */ 0xffff,
+ /* key: 0x76f0 */ 0xce55,
+ /* key: 0x76f1 */ 0xce56,
+ /* key: 0x76f2 */ 0x4c55,
+ /* key: 0x76f3 */ 0xffff,
+ /* key: 0x76f4 */ 0x443e,
+ /* key: 0x76f5 */ 0xffff,
+ /* key: 0x76f6 */ 0xce57,
+ /* key: 0x76f7 */ 0xffff,
+ /* key: 0x76f8 */ 0x416a,
+ /* key: 0x76f9 */ 0xce58,
+ /* key: 0x76fa */ 0xffff,
+ /* key: 0x76fb */ 0x623d,
+ /* key: 0x76fc */ 0xce59,
+ /* key: 0x76fd */ 0xffff,
+ /* key: 0x76fe */ 0x3d62,
+ /* key: 0x76ff */ 0xffff,
+ /* branch: 0x770X */ 12784,
+ /* branch: 0x771X */ 12800,
+ /* branch: 0x772X */ 12816,
+ /* branch: 0x773X */ 12832,
+ /* branch: 0x774X */ 12848,
+ /* branch: 0x775X */ 12864,
+ /* branch: 0x776X */ 12880,
+ /* branch: 0x777X */ 12896,
+ /* branch: 0x778X */ 12912,
+ /* branch: 0x779X */ 12928,
+ /* branch: 0x77aX */ 12944,
+ /* branch: 0x77bX */ 12960,
+ /* branch: 0x77cX */ 12976,
+ /* branch: 0x77dX */ 12992,
+ /* branch: 0x77eX */ 13008,
+ /* branch: 0x77fX */ 13024,
+ /* key: 0x7700 */ 0xce5a,
+ /* key: 0x7701 */ 0x3e4a,
+ /* key: 0x7702 */ 0xffff,
+ /* key: 0x7703 */ 0xffff,
+ /* key: 0x7704 */ 0x6240,
+ /* key: 0x7705 */ 0xffff,
+ /* key: 0x7706 */ 0xce5b,
+ /* key: 0x7707 */ 0x623f,
+ /* key: 0x7708 */ 0x623e,
+ /* key: 0x7709 */ 0x487d,
+ /* key: 0x770a */ 0xce5c,
+ /* key: 0x770b */ 0x3447,
+ /* key: 0x770c */ 0x3829,
+ /* key: 0x770d */ 0xffff,
+ /* key: 0x770e */ 0xce5d,
+ /* key: 0x770f */ 0xffff,
+ /* key: 0x7710 */ 0xffff,
+ /* key: 0x7711 */ 0xffff,
+ /* key: 0x7712 */ 0xce5e,
+ /* key: 0x7713 */ 0xffff,
+ /* key: 0x7714 */ 0xce5f,
+ /* key: 0x7715 */ 0xce60,
+ /* key: 0x7716 */ 0xffff,
+ /* key: 0x7717 */ 0xce61,
+ /* key: 0x7718 */ 0xffff,
+ /* key: 0x7719 */ 0xce62,
+ /* key: 0x771a */ 0xce63,
+ /* key: 0x771b */ 0x6246,
+ /* key: 0x771c */ 0xce64,
+ /* key: 0x771d */ 0xffff,
+ /* key: 0x771e */ 0x6243,
+ /* key: 0x771f */ 0x3f3f,
+ /* key: 0x7720 */ 0x4c32,
+ /* key: 0x7721 */ 0xffff,
+ /* key: 0x7722 */ 0xce65,
+ /* key: 0x7723 */ 0xffff,
+ /* key: 0x7724 */ 0x6242,
+ /* key: 0x7725 */ 0x6244,
+ /* key: 0x7726 */ 0x6245,
+ /* key: 0x7727 */ 0xffff,
+ /* key: 0x7728 */ 0xce66,
+ /* key: 0x7729 */ 0x6241,
+ /* key: 0x772a */ 0xffff,
+ /* key: 0x772b */ 0xffff,
+ /* key: 0x772c */ 0xffff,
+ /* key: 0x772d */ 0xce67,
+ /* key: 0x772e */ 0xce68,
+ /* key: 0x772f */ 0xce69,
+ /* key: 0x7730 */ 0xffff,
+ /* key: 0x7731 */ 0xffff,
+ /* key: 0x7732 */ 0xffff,
+ /* key: 0x7733 */ 0xffff,
+ /* key: 0x7734 */ 0xce6a,
+ /* key: 0x7735 */ 0xce6b,
+ /* key: 0x7736 */ 0xce6c,
+ /* key: 0x7737 */ 0x6247,
+ /* key: 0x7738 */ 0x6248,
+ /* key: 0x7739 */ 0xce6d,
+ /* key: 0x773a */ 0x442f,
+ /* key: 0x773b */ 0xffff,
+ /* key: 0x773c */ 0x3463,
+ /* key: 0x773d */ 0xce6e,
+ /* key: 0x773e */ 0xce6f,
+ /* key: 0x773f */ 0xffff,
+ /* key: 0x7740 */ 0x4365,
+ /* key: 0x7741 */ 0xffff,
+ /* key: 0x7742 */ 0xce70,
+ /* key: 0x7743 */ 0xffff,
+ /* key: 0x7744 */ 0xffff,
+ /* key: 0x7745 */ 0xce71,
+ /* key: 0x7746 */ 0xce72,
+ /* key: 0x7747 */ 0x6249,
+ /* key: 0x7748 */ 0xffff,
+ /* key: 0x7749 */ 0xffff,
+ /* key: 0x774a */ 0xce73,
+ /* key: 0x774b */ 0xffff,
+ /* key: 0x774c */ 0xffff,
+ /* key: 0x774d */ 0xce74,
+ /* key: 0x774e */ 0xce75,
+ /* key: 0x774f */ 0xce76,
+ /* key: 0x7750 */ 0xffff,
+ /* key: 0x7751 */ 0xffff,
+ /* key: 0x7752 */ 0xce77,
+ /* key: 0x7753 */ 0xffff,
+ /* key: 0x7754 */ 0xffff,
+ /* key: 0x7755 */ 0xffff,
+ /* key: 0x7756 */ 0xce78,
+ /* key: 0x7757 */ 0xce79,
+ /* key: 0x7758 */ 0xffff,
+ /* key: 0x7759 */ 0xffff,
+ /* key: 0x775a */ 0x624a,
+ /* key: 0x775b */ 0x624d,
+ /* key: 0x775c */ 0xce7a,
+ /* key: 0x775d */ 0xffff,
+ /* key: 0x775e */ 0xce7b,
+ /* key: 0x775f */ 0xce7c,
+ /* key: 0x7760 */ 0xce7d,
+ /* key: 0x7761 */ 0x3f67,
+ /* key: 0x7762 */ 0xce7e,
+ /* key: 0x7763 */ 0x4644,
+ /* key: 0x7764 */ 0xcf21,
+ /* key: 0x7765 */ 0x624e,
+ /* key: 0x7766 */ 0x4b53,
+ /* key: 0x7767 */ 0xcf22,
+ /* key: 0x7768 */ 0x624b,
+ /* key: 0x7769 */ 0xffff,
+ /* key: 0x776a */ 0xcf23,
+ /* key: 0x776b */ 0x624c,
+ /* key: 0x776c */ 0xcf24,
+ /* key: 0x776d */ 0xffff,
+ /* key: 0x776e */ 0xffff,
+ /* key: 0x776f */ 0xffff,
+ /* key: 0x7770 */ 0xcf25,
+ /* key: 0x7771 */ 0xffff,
+ /* key: 0x7772 */ 0xcf26,
+ /* key: 0x7773 */ 0xcf27,
+ /* key: 0x7774 */ 0xcf28,
+ /* key: 0x7775 */ 0xffff,
+ /* key: 0x7776 */ 0xffff,
+ /* key: 0x7777 */ 0xffff,
+ /* key: 0x7778 */ 0xffff,
+ /* key: 0x7779 */ 0x6251,
+ /* key: 0x777a */ 0xcf29,
+ /* key: 0x777b */ 0xffff,
+ /* key: 0x777c */ 0xffff,
+ /* key: 0x777d */ 0xcf2a,
+ /* key: 0x777e */ 0x6250,
+ /* key: 0x777f */ 0x624f,
+ /* key: 0x7780 */ 0xcf2b,
+ /* key: 0x7781 */ 0xffff,
+ /* key: 0x7782 */ 0xffff,
+ /* key: 0x7783 */ 0xffff,
+ /* key: 0x7784 */ 0xcf2c,
+ /* key: 0x7785 */ 0xffff,
+ /* key: 0x7786 */ 0xffff,
+ /* key: 0x7787 */ 0xffff,
+ /* key: 0x7788 */ 0xffff,
+ /* key: 0x7789 */ 0xffff,
+ /* key: 0x778a */ 0xffff,
+ /* key: 0x778b */ 0x6253,
+ /* key: 0x778c */ 0xcf2d,
+ /* key: 0x778d */ 0xcf2e,
+ /* key: 0x778e */ 0x6252,
+ /* key: 0x778f */ 0xffff,
+ /* key: 0x7790 */ 0xffff,
+ /* key: 0x7791 */ 0x6254,
+ /* key: 0x7792 */ 0xffff,
+ /* key: 0x7793 */ 0xffff,
+ /* key: 0x7794 */ 0xcf2f,
+ /* key: 0x7795 */ 0xcf30,
+ /* key: 0x7796 */ 0xcf31,
+ /* key: 0x7797 */ 0xffff,
+ /* key: 0x7798 */ 0xffff,
+ /* key: 0x7799 */ 0xffff,
+ /* key: 0x779a */ 0xcf32,
+ /* key: 0x779b */ 0xffff,
+ /* key: 0x779c */ 0xffff,
+ /* key: 0x779d */ 0xffff,
+ /* key: 0x779e */ 0x6256,
+ /* key: 0x779f */ 0xcf33,
+ /* key: 0x77a0 */ 0x6255,
+ /* key: 0x77a1 */ 0xffff,
+ /* key: 0x77a2 */ 0xcf34,
+ /* key: 0x77a3 */ 0xffff,
+ /* key: 0x77a4 */ 0xffff,
+ /* key: 0x77a5 */ 0x4a4d,
+ /* key: 0x77a6 */ 0xffff,
+ /* key: 0x77a7 */ 0xcf35,
+ /* key: 0x77a8 */ 0xffff,
+ /* key: 0x77a9 */ 0xffff,
+ /* key: 0x77aa */ 0xcf36,
+ /* key: 0x77ab */ 0xffff,
+ /* key: 0x77ac */ 0x3d56,
+ /* key: 0x77ad */ 0x4e46,
+ /* key: 0x77ae */ 0xcf37,
+ /* key: 0x77af */ 0xcf38,
+ /* key: 0x77b0 */ 0x6257,
+ /* key: 0x77b1 */ 0xcf39,
+ /* key: 0x77b2 */ 0xffff,
+ /* key: 0x77b3 */ 0x4637,
+ /* key: 0x77b4 */ 0xffff,
+ /* key: 0x77b5 */ 0xcf3a,
+ /* key: 0x77b6 */ 0x6258,
+ /* key: 0x77b7 */ 0xffff,
+ /* key: 0x77b8 */ 0xffff,
+ /* key: 0x77b9 */ 0x6259,
+ /* key: 0x77ba */ 0xffff,
+ /* key: 0x77bb */ 0x625d,
+ /* key: 0x77bc */ 0x625b,
+ /* key: 0x77bd */ 0x625c,
+ /* key: 0x77be */ 0xcf3b,
+ /* key: 0x77bf */ 0x625a,
+ /* key: 0x77c0 */ 0xffff,
+ /* key: 0x77c1 */ 0xffff,
+ /* key: 0x77c2 */ 0xffff,
+ /* key: 0x77c3 */ 0xcf3c,
+ /* key: 0x77c4 */ 0xffff,
+ /* key: 0x77c5 */ 0xffff,
+ /* key: 0x77c6 */ 0xffff,
+ /* key: 0x77c7 */ 0x625e,
+ /* key: 0x77c8 */ 0xffff,
+ /* key: 0x77c9 */ 0xcf3d,
+ /* key: 0x77ca */ 0xffff,
+ /* key: 0x77cb */ 0xffff,
+ /* key: 0x77cc */ 0xffff,
+ /* key: 0x77cd */ 0x625f,
+ /* key: 0x77ce */ 0xffff,
+ /* key: 0x77cf */ 0xffff,
+ /* key: 0x77d0 */ 0xffff,
+ /* key: 0x77d1 */ 0xcf3e,
+ /* key: 0x77d2 */ 0xcf3f,
+ /* key: 0x77d3 */ 0xffff,
+ /* key: 0x77d4 */ 0xffff,
+ /* key: 0x77d5 */ 0xcf40,
+ /* key: 0x77d6 */ 0xffff,
+ /* key: 0x77d7 */ 0x6260,
+ /* key: 0x77d8 */ 0xffff,
+ /* key: 0x77d9 */ 0xcf41,
+ /* key: 0x77da */ 0x6261,
+ /* key: 0x77db */ 0x4c37,
+ /* key: 0x77dc */ 0x6262,
+ /* key: 0x77dd */ 0xffff,
+ /* key: 0x77de */ 0xcf42,
+ /* key: 0x77df */ 0xcf43,
+ /* key: 0x77e0 */ 0xcf44,
+ /* key: 0x77e1 */ 0xffff,
+ /* key: 0x77e2 */ 0x4c70,
+ /* key: 0x77e3 */ 0x6263,
+ /* key: 0x77e4 */ 0xcf45,
+ /* key: 0x77e5 */ 0x434e,
+ /* key: 0x77e6 */ 0xcf46,
+ /* key: 0x77e7 */ 0x476a,
+ /* key: 0x77e8 */ 0xffff,
+ /* key: 0x77e9 */ 0x366b,
+ /* key: 0x77ea */ 0xcf47,
+ /* key: 0x77eb */ 0xffff,
+ /* key: 0x77ec */ 0xcf48,
+ /* key: 0x77ed */ 0x433b,
+ /* key: 0x77ee */ 0x6264,
+ /* key: 0x77ef */ 0x363a,
+ /* key: 0x77f0 */ 0xcf49,
+ /* key: 0x77f1 */ 0xcf4a,
+ /* key: 0x77f2 */ 0xffff,
+ /* key: 0x77f3 */ 0x4050,
+ /* key: 0x77f4 */ 0xcf4b,
+ /* key: 0x77f5 */ 0xffff,
+ /* key: 0x77f6 */ 0xffff,
+ /* key: 0x77f7 */ 0xffff,
+ /* key: 0x77f8 */ 0xcf4c,
+ /* key: 0x77f9 */ 0xffff,
+ /* key: 0x77fa */ 0xffff,
+ /* key: 0x77fb */ 0xcf4d,
+ /* key: 0x77fc */ 0x6265,
+ /* key: 0x77fd */ 0xffff,
+ /* key: 0x77fe */ 0xffff,
+ /* key: 0x77ff */ 0xffff,
+ /* branch: 0x780X */ 13056,
+ /* branch: 0x781X */ 13072,
+ /* branch: 0x782X */ 13088,
+ /* branch: 0x783X */ 13104,
+ /* branch: 0x784X */ 13120,
+ /* branch: 0x785X */ 13136,
+ /* branch: 0x786X */ 13152,
+ /* branch: 0x787X */ 13168,
+ /* branch: 0x788X */ 13184,
+ /* branch: 0x789X */ 13200,
+ /* branch: 0x78aX */ 13216,
+ /* branch: 0x78bX */ 13232,
+ /* branch: 0x78cX */ 13248,
+ /* branch: 0x78dX */ 13264,
+ /* branch: 0x78eX */ 13280,
+ /* branch: 0x78fX */ 13296,
+ /* key: 0x7800 */ 0xffff,
+ /* key: 0x7801 */ 0xffff,
+ /* key: 0x7802 */ 0x3a3d,
+ /* key: 0x7803 */ 0xffff,
+ /* key: 0x7804 */ 0xffff,
+ /* key: 0x7805 */ 0xcf4e,
+ /* key: 0x7806 */ 0xcf4f,
+ /* key: 0x7807 */ 0xffff,
+ /* key: 0x7808 */ 0xffff,
+ /* key: 0x7809 */ 0xcf50,
+ /* key: 0x780a */ 0xffff,
+ /* key: 0x780b */ 0xffff,
+ /* key: 0x780c */ 0x6266,
+ /* key: 0x780d */ 0xcf51,
+ /* key: 0x780e */ 0xcf52,
+ /* key: 0x780f */ 0xffff,
+ /* key: 0x7810 */ 0xffff,
+ /* key: 0x7811 */ 0xcf53,
+ /* key: 0x7812 */ 0x6267,
+ /* key: 0x7813 */ 0xffff,
+ /* key: 0x7814 */ 0x3826,
+ /* key: 0x7815 */ 0x3a55,
+ /* key: 0x7816 */ 0xffff,
+ /* key: 0x7817 */ 0xffff,
+ /* key: 0x7818 */ 0xffff,
+ /* key: 0x7819 */ 0xffff,
+ /* key: 0x781a */ 0xffff,
+ /* key: 0x781b */ 0xffff,
+ /* key: 0x781c */ 0xffff,
+ /* key: 0x781d */ 0xcf54,
+ /* key: 0x781e */ 0xffff,
+ /* key: 0x781f */ 0xffff,
+ /* key: 0x7820 */ 0x6269,
+ /* key: 0x7821 */ 0xcf55,
+ /* key: 0x7822 */ 0xcf56,
+ /* key: 0x7823 */ 0xcf57,
+ /* key: 0x7824 */ 0xffff,
+ /* key: 0x7825 */ 0x4556,
+ /* key: 0x7826 */ 0x3a56,
+ /* key: 0x7827 */ 0x354e,
+ /* key: 0x7828 */ 0xffff,
+ /* key: 0x7829 */ 0xffff,
+ /* key: 0x782a */ 0xffff,
+ /* key: 0x782b */ 0xffff,
+ /* key: 0x782c */ 0xffff,
+ /* key: 0x782d */ 0xcf58,
+ /* key: 0x782e */ 0xcf59,
+ /* key: 0x782f */ 0xffff,
+ /* key: 0x7830 */ 0xcf5a,
+ /* key: 0x7831 */ 0xffff,
+ /* key: 0x7832 */ 0x4b24,
+ /* key: 0x7833 */ 0xffff,
+ /* key: 0x7834 */ 0x474b,
+ /* key: 0x7835 */ 0xcf5b,
+ /* key: 0x7836 */ 0xffff,
+ /* key: 0x7837 */ 0xcf5c,
+ /* key: 0x7838 */ 0xffff,
+ /* key: 0x7839 */ 0xffff,
+ /* key: 0x783a */ 0x4557,
+ /* key: 0x783b */ 0xffff,
+ /* key: 0x783c */ 0xffff,
+ /* key: 0x783d */ 0xffff,
+ /* key: 0x783e */ 0xffff,
+ /* key: 0x783f */ 0x395c,
+ /* key: 0x7840 */ 0xffff,
+ /* key: 0x7841 */ 0xffff,
+ /* key: 0x7842 */ 0xffff,
+ /* key: 0x7843 */ 0xcf5d,
+ /* key: 0x7844 */ 0xcf5e,
+ /* key: 0x7845 */ 0x626b,
+ /* key: 0x7846 */ 0xffff,
+ /* key: 0x7847 */ 0xcf5f,
+ /* key: 0x7848 */ 0xcf60,
+ /* key: 0x7849 */ 0xffff,
+ /* key: 0x784a */ 0xffff,
+ /* key: 0x784b */ 0xffff,
+ /* key: 0x784c */ 0xcf61,
+ /* key: 0x784d */ 0xffff,
+ /* key: 0x784e */ 0xcf62,
+ /* key: 0x784f */ 0xffff,
+ /* key: 0x7850 */ 0xffff,
+ /* key: 0x7851 */ 0xffff,
+ /* key: 0x7852 */ 0xcf63,
+ /* key: 0x7853 */ 0xffff,
+ /* key: 0x7854 */ 0xffff,
+ /* key: 0x7855 */ 0xffff,
+ /* key: 0x7856 */ 0xffff,
+ /* key: 0x7857 */ 0xffff,
+ /* key: 0x7858 */ 0xffff,
+ /* key: 0x7859 */ 0xffff,
+ /* key: 0x785a */ 0xffff,
+ /* key: 0x785b */ 0xffff,
+ /* key: 0x785c */ 0xcf64,
+ /* key: 0x785d */ 0x3e4b,
+ /* key: 0x785e */ 0xcf65,
+ /* key: 0x785f */ 0xffff,
+ /* key: 0x7860 */ 0xcf66,
+ /* key: 0x7861 */ 0xcf67,
+ /* key: 0x7862 */ 0xffff,
+ /* key: 0x7863 */ 0xcf68,
+ /* key: 0x7864 */ 0xcf69,
+ /* key: 0x7865 */ 0xffff,
+ /* key: 0x7866 */ 0xffff,
+ /* key: 0x7867 */ 0xffff,
+ /* key: 0x7868 */ 0xcf6a,
+ /* key: 0x7869 */ 0xffff,
+ /* key: 0x786a */ 0xcf6b,
+ /* key: 0x786b */ 0x4e32,
+ /* key: 0x786c */ 0x3945,
+ /* key: 0x786d */ 0xffff,
+ /* key: 0x786e */ 0xcf6c,
+ /* key: 0x786f */ 0x3827,
+ /* key: 0x7870 */ 0xffff,
+ /* key: 0x7871 */ 0xffff,
+ /* key: 0x7872 */ 0x4823,
+ /* key: 0x7873 */ 0xffff,
+ /* key: 0x7874 */ 0x626d,
+ /* key: 0x7875 */ 0xffff,
+ /* key: 0x7876 */ 0xffff,
+ /* key: 0x7877 */ 0xffff,
+ /* key: 0x7878 */ 0xffff,
+ /* key: 0x7879 */ 0xffff,
+ /* key: 0x787a */ 0xcf6d,
+ /* key: 0x787b */ 0xffff,
+ /* key: 0x787c */ 0x626f,
+ /* key: 0x787d */ 0xffff,
+ /* key: 0x787e */ 0xcf6e,
+ /* key: 0x787f */ 0xffff,
+ /* key: 0x7880 */ 0xffff,
+ /* key: 0x7881 */ 0x386b,
+ /* key: 0x7882 */ 0xffff,
+ /* key: 0x7883 */ 0xffff,
+ /* key: 0x7884 */ 0xffff,
+ /* key: 0x7885 */ 0xffff,
+ /* key: 0x7886 */ 0x626e,
+ /* key: 0x7887 */ 0x4476,
+ /* key: 0x7888 */ 0xffff,
+ /* key: 0x7889 */ 0xffff,
+ /* key: 0x788a */ 0xcf6f,
+ /* key: 0x788b */ 0xffff,
+ /* key: 0x788c */ 0x6271,
+ /* key: 0x788d */ 0x3337,
+ /* key: 0x788e */ 0x626c,
+ /* key: 0x788f */ 0xcf70,
+ /* key: 0x7890 */ 0xffff,
+ /* key: 0x7891 */ 0x486a,
+ /* key: 0x7892 */ 0xffff,
+ /* key: 0x7893 */ 0x3130,
+ /* key: 0x7894 */ 0xcf71,
+ /* key: 0x7895 */ 0x3a6c,
+ /* key: 0x7896 */ 0xffff,
+ /* key: 0x7897 */ 0x4f52,
+ /* key: 0x7898 */ 0xcf72,
+ /* key: 0x7899 */ 0xffff,
+ /* key: 0x789a */ 0x6270,
+ /* key: 0x789b */ 0xffff,
+ /* key: 0x789c */ 0xffff,
+ /* key: 0x789d */ 0xcf74,
+ /* key: 0x789e */ 0xcf75,
+ /* key: 0x789f */ 0xcf76,
+ /* key: 0x78a0 */ 0xffff,
+ /* key: 0x78a1 */ 0xcf73,
+ /* key: 0x78a2 */ 0xffff,
+ /* key: 0x78a3 */ 0x6272,
+ /* key: 0x78a4 */ 0xcf77,
+ /* key: 0x78a5 */ 0xffff,
+ /* key: 0x78a6 */ 0xffff,
+ /* key: 0x78a7 */ 0x4a4b,
+ /* key: 0x78a8 */ 0xcf78,
+ /* key: 0x78a9 */ 0x4059,
+ /* key: 0x78aa */ 0x6274,
+ /* key: 0x78ab */ 0xffff,
+ /* key: 0x78ac */ 0xcf79,
+ /* key: 0x78ad */ 0xcf7a,
+ /* key: 0x78ae */ 0xffff,
+ /* key: 0x78af */ 0x6275,
+ /* key: 0x78b0 */ 0xcf7b,
+ /* key: 0x78b1 */ 0xcf7c,
+ /* key: 0x78b2 */ 0xcf7d,
+ /* key: 0x78b3 */ 0xcf7e,
+ /* key: 0x78b4 */ 0xffff,
+ /* key: 0x78b5 */ 0x6273,
+ /* key: 0x78b6 */ 0xffff,
+ /* key: 0x78b7 */ 0xffff,
+ /* key: 0x78b8 */ 0xffff,
+ /* key: 0x78b9 */ 0xffff,
+ /* key: 0x78ba */ 0x334e,
+ /* key: 0x78bb */ 0xd021,
+ /* key: 0x78bc */ 0x627b,
+ /* key: 0x78bd */ 0xd022,
+ /* key: 0x78be */ 0x627a,
+ /* key: 0x78bf */ 0xd023,
+ /* key: 0x78c0 */ 0xffff,
+ /* key: 0x78c1 */ 0x3c27,
+ /* key: 0x78c2 */ 0xffff,
+ /* key: 0x78c3 */ 0xffff,
+ /* key: 0x78c4 */ 0xffff,
+ /* key: 0x78c5 */ 0x627c,
+ /* key: 0x78c6 */ 0x6277,
+ /* key: 0x78c7 */ 0xd024,
+ /* key: 0x78c8 */ 0xd025,
+ /* key: 0x78c9 */ 0xd026,
+ /* key: 0x78ca */ 0x627d,
+ /* key: 0x78cb */ 0x6278,
+ /* key: 0x78cc */ 0xd027,
+ /* key: 0x78cd */ 0xffff,
+ /* key: 0x78ce */ 0xd028,
+ /* key: 0x78cf */ 0xffff,
+ /* key: 0x78d0 */ 0x4858,
+ /* key: 0x78d1 */ 0x6276,
+ /* key: 0x78d2 */ 0xd029,
+ /* key: 0x78d3 */ 0xd02a,
+ /* key: 0x78d4 */ 0x6279,
+ /* key: 0x78d5 */ 0xd02b,
+ /* key: 0x78d6 */ 0xd02c,
+ /* key: 0x78d7 */ 0xffff,
+ /* key: 0x78d8 */ 0xffff,
+ /* key: 0x78d9 */ 0xffff,
+ /* key: 0x78da */ 0x6322,
+ /* key: 0x78db */ 0xd02e,
+ /* key: 0x78dc */ 0xffff,
+ /* key: 0x78dd */ 0xffff,
+ /* key: 0x78de */ 0xffff,
+ /* key: 0x78df */ 0xd02f,
+ /* key: 0x78e0 */ 0xd030,
+ /* key: 0x78e1 */ 0xd031,
+ /* key: 0x78e2 */ 0xffff,
+ /* key: 0x78e3 */ 0xffff,
+ /* key: 0x78e4 */ 0xd02d,
+ /* key: 0x78e5 */ 0xffff,
+ /* key: 0x78e6 */ 0xd032,
+ /* key: 0x78e7 */ 0x6321,
+ /* key: 0x78e8 */ 0x4b61,
+ /* key: 0x78e9 */ 0xffff,
+ /* key: 0x78ea */ 0xd033,
+ /* key: 0x78eb */ 0xffff,
+ /* key: 0x78ec */ 0x627e,
+ /* key: 0x78ed */ 0xffff,
+ /* key: 0x78ee */ 0xffff,
+ /* key: 0x78ef */ 0x306b,
+ /* key: 0x78f0 */ 0xffff,
+ /* key: 0x78f1 */ 0xffff,
+ /* key: 0x78f2 */ 0xd034,
+ /* key: 0x78f3 */ 0xd035,
+ /* key: 0x78f4 */ 0x6324,
+ /* key: 0x78f5 */ 0xffff,
+ /* key: 0x78f6 */ 0xd037,
+ /* key: 0x78f7 */ 0xd038,
+ /* key: 0x78f8 */ 0xffff,
+ /* key: 0x78f9 */ 0xffff,
+ /* key: 0x78fa */ 0xd039,
+ /* key: 0x78fb */ 0xd03a,
+ /* key: 0x78fc */ 0xffff,
+ /* key: 0x78fd */ 0x6323,
+ /* key: 0x78fe */ 0xffff,
+ /* key: 0x78ff */ 0xd03b,
+ /* branch: 0x790X */ 13328,
+ /* branch: 0x791X */ 13344,
+ /* branch: 0x792X */ 13360,
+ /* branch: 0x793X */ 13376,
+ /* branch: 0x794X */ 13392,
+ /* branch: 0x795X */ 13408,
+ /* branch: 0x796X */ 13424,
+ /* branch: 0x797X */ 13440,
+ /* branch: 0x798X */ 13456,
+ /* branch: 0x799X */ 13472,
+ /* branch: 0x79aX */ 13488,
+ /* branch: 0x79bX */ 13504,
+ /* branch: 0x79cX */ 13520,
+ /* branch: 0x79dX */ 13536,
+ /* branch: 0x79eX */ 13552,
+ /* branch: 0x79fX */ 13568,
+ /* key: 0x7900 */ 0xd036,
+ /* key: 0x7901 */ 0x3e4c,
+ /* key: 0x7902 */ 0xffff,
+ /* key: 0x7903 */ 0xffff,
+ /* key: 0x7904 */ 0xffff,
+ /* key: 0x7905 */ 0xffff,
+ /* key: 0x7906 */ 0xd03c,
+ /* key: 0x7907 */ 0x6325,
+ /* key: 0x7908 */ 0xffff,
+ /* key: 0x7909 */ 0xffff,
+ /* key: 0x790a */ 0xffff,
+ /* key: 0x790b */ 0xffff,
+ /* key: 0x790c */ 0xd03d,
+ /* key: 0x790d */ 0xffff,
+ /* key: 0x790e */ 0x4143,
+ /* key: 0x790f */ 0xffff,
+ /* key: 0x7910 */ 0xd03e,
+ /* key: 0x7911 */ 0x6327,
+ /* key: 0x7912 */ 0x6326,
+ /* key: 0x7913 */ 0xffff,
+ /* key: 0x7914 */ 0xffff,
+ /* key: 0x7915 */ 0xffff,
+ /* key: 0x7916 */ 0xffff,
+ /* key: 0x7917 */ 0xffff,
+ /* key: 0x7918 */ 0xffff,
+ /* key: 0x7919 */ 0x6328,
+ /* key: 0x791a */ 0xd03f,
+ /* key: 0x791b */ 0xffff,
+ /* key: 0x791c */ 0xd040,
+ /* key: 0x791d */ 0xffff,
+ /* key: 0x791e */ 0xd041,
+ /* key: 0x791f */ 0xd042,
+ /* key: 0x7920 */ 0xd043,
+ /* key: 0x7921 */ 0xffff,
+ /* key: 0x7922 */ 0xffff,
+ /* key: 0x7923 */ 0xffff,
+ /* key: 0x7924 */ 0xffff,
+ /* key: 0x7925 */ 0xd044,
+ /* key: 0x7926 */ 0x6268,
+ /* key: 0x7927 */ 0xd045,
+ /* key: 0x7928 */ 0xffff,
+ /* key: 0x7929 */ 0xd046,
+ /* key: 0x792a */ 0x626a,
+ /* key: 0x792b */ 0x632a,
+ /* key: 0x792c */ 0x6329,
+ /* key: 0x792d */ 0xd047,
+ /* key: 0x792e */ 0xffff,
+ /* key: 0x792f */ 0xffff,
+ /* key: 0x7930 */ 0xffff,
+ /* key: 0x7931 */ 0xd048,
+ /* key: 0x7932 */ 0xffff,
+ /* key: 0x7933 */ 0xffff,
+ /* key: 0x7934 */ 0xd049,
+ /* key: 0x7935 */ 0xd04a,
+ /* key: 0x7936 */ 0xffff,
+ /* key: 0x7937 */ 0xffff,
+ /* key: 0x7938 */ 0xffff,
+ /* key: 0x7939 */ 0xffff,
+ /* key: 0x793a */ 0x3c28,
+ /* key: 0x793b */ 0xd04b,
+ /* key: 0x793c */ 0x4e69,
+ /* key: 0x793d */ 0xd04c,
+ /* key: 0x793e */ 0x3c52,
+ /* key: 0x793f */ 0xd04d,
+ /* key: 0x7940 */ 0x632b,
+ /* key: 0x7941 */ 0x3737,
+ /* key: 0x7942 */ 0xffff,
+ /* key: 0x7943 */ 0xffff,
+ /* key: 0x7944 */ 0xd04e,
+ /* key: 0x7945 */ 0xd04f,
+ /* key: 0x7946 */ 0xd050,
+ /* key: 0x7947 */ 0x3540,
+ /* key: 0x7948 */ 0x3527,
+ /* key: 0x7949 */ 0x3b63,
+ /* key: 0x794a */ 0xd051,
+ /* key: 0x794b */ 0xd052,
+ /* key: 0x794c */ 0xffff,
+ /* key: 0x794d */ 0xffff,
+ /* key: 0x794e */ 0xffff,
+ /* key: 0x794f */ 0xd053,
+ /* key: 0x7950 */ 0x4d34,
+ /* key: 0x7951 */ 0xd054,
+ /* key: 0x7952 */ 0xffff,
+ /* key: 0x7953 */ 0x6331,
+ /* key: 0x7954 */ 0xd055,
+ /* key: 0x7955 */ 0x6330,
+ /* key: 0x7956 */ 0x4144,
+ /* key: 0x7957 */ 0x632d,
+ /* key: 0x7958 */ 0xd056,
+ /* key: 0x7959 */ 0xffff,
+ /* key: 0x795a */ 0x632f,
+ /* key: 0x795b */ 0xd057,
+ /* key: 0x795c */ 0xd058,
+ /* key: 0x795d */ 0x3d4b,
+ /* key: 0x795e */ 0x3f40,
+ /* key: 0x795f */ 0x632e,
+ /* key: 0x7960 */ 0x632c,
+ /* key: 0x7961 */ 0xffff,
+ /* key: 0x7962 */ 0x472a,
+ /* key: 0x7963 */ 0xffff,
+ /* key: 0x7964 */ 0xffff,
+ /* key: 0x7965 */ 0x3e4d,
+ /* key: 0x7966 */ 0xffff,
+ /* key: 0x7967 */ 0xd059,
+ /* key: 0x7968 */ 0x493c,
+ /* key: 0x7969 */ 0xd05a,
+ /* key: 0x796a */ 0xffff,
+ /* key: 0x796b */ 0xd05b,
+ /* key: 0x796c */ 0xffff,
+ /* key: 0x796d */ 0x3a57,
+ /* key: 0x796e */ 0xffff,
+ /* key: 0x796f */ 0xffff,
+ /* key: 0x7970 */ 0xffff,
+ /* key: 0x7971 */ 0xffff,
+ /* key: 0x7972 */ 0xd05c,
+ /* key: 0x7973 */ 0xffff,
+ /* key: 0x7974 */ 0xffff,
+ /* key: 0x7975 */ 0xffff,
+ /* key: 0x7976 */ 0xffff,
+ /* key: 0x7977 */ 0x4578,
+ /* key: 0x7978 */ 0xffff,
+ /* key: 0x7979 */ 0xd05d,
+ /* key: 0x797a */ 0x6332,
+ /* key: 0x797b */ 0xd05e,
+ /* key: 0x797c */ 0xd05f,
+ /* key: 0x797d */ 0xffff,
+ /* key: 0x797e */ 0xd060,
+ /* key: 0x797f */ 0x6333,
+ /* key: 0x7980 */ 0x6349,
+ /* key: 0x7981 */ 0x3658,
+ /* key: 0x7982 */ 0xffff,
+ /* key: 0x7983 */ 0xffff,
+ /* key: 0x7984 */ 0x4f3d,
+ /* key: 0x7985 */ 0x4135,
+ /* key: 0x7986 */ 0xffff,
+ /* key: 0x7987 */ 0xffff,
+ /* key: 0x7988 */ 0xffff,
+ /* key: 0x7989 */ 0xffff,
+ /* key: 0x798a */ 0x6334,
+ /* key: 0x798b */ 0xd061,
+ /* key: 0x798c */ 0xd062,
+ /* key: 0x798d */ 0x3252,
+ /* key: 0x798e */ 0x4477,
+ /* key: 0x798f */ 0x4a21,
+ /* key: 0x7990 */ 0xffff,
+ /* key: 0x7991 */ 0xd063,
+ /* key: 0x7992 */ 0xffff,
+ /* key: 0x7993 */ 0xd064,
+ /* key: 0x7994 */ 0xd065,
+ /* key: 0x7995 */ 0xd066,
+ /* key: 0x7996 */ 0xd067,
+ /* key: 0x7997 */ 0xffff,
+ /* key: 0x7998 */ 0xd068,
+ /* key: 0x7999 */ 0xffff,
+ /* key: 0x799a */ 0xffff,
+ /* key: 0x799b */ 0xd069,
+ /* key: 0x799c */ 0xd06a,
+ /* key: 0x799d */ 0x6335,
+ /* key: 0x799e */ 0xffff,
+ /* key: 0x799f */ 0xffff,
+ /* key: 0x79a0 */ 0xffff,
+ /* key: 0x79a1 */ 0xd06b,
+ /* key: 0x79a2 */ 0xffff,
+ /* key: 0x79a3 */ 0xffff,
+ /* key: 0x79a4 */ 0xffff,
+ /* key: 0x79a5 */ 0xffff,
+ /* key: 0x79a6 */ 0x357a,
+ /* key: 0x79a7 */ 0x6336,
+ /* key: 0x79a8 */ 0xd06c,
+ /* key: 0x79a9 */ 0xd06d,
+ /* key: 0x79aa */ 0x6338,
+ /* key: 0x79ab */ 0xd06e,
+ /* key: 0x79ac */ 0xffff,
+ /* key: 0x79ad */ 0xffff,
+ /* key: 0x79ae */ 0x6339,
+ /* key: 0x79af */ 0xd06f,
+ /* key: 0x79b0 */ 0x4729,
+ /* key: 0x79b1 */ 0xd070,
+ /* key: 0x79b2 */ 0xffff,
+ /* key: 0x79b3 */ 0x633a,
+ /* key: 0x79b4 */ 0xd071,
+ /* key: 0x79b5 */ 0xffff,
+ /* key: 0x79b6 */ 0xffff,
+ /* key: 0x79b7 */ 0xffff,
+ /* key: 0x79b8 */ 0xd072,
+ /* key: 0x79b9 */ 0x633b,
+ /* key: 0x79ba */ 0x633c,
+ /* key: 0x79bb */ 0xd073,
+ /* key: 0x79bc */ 0xffff,
+ /* key: 0x79bd */ 0x3659,
+ /* key: 0x79be */ 0x3253,
+ /* key: 0x79bf */ 0x4645,
+ /* key: 0x79c0 */ 0x3d28,
+ /* key: 0x79c1 */ 0x3b64,
+ /* key: 0x79c2 */ 0xd074,
+ /* key: 0x79c3 */ 0xffff,
+ /* key: 0x79c4 */ 0xd075,
+ /* key: 0x79c5 */ 0xffff,
+ /* key: 0x79c6 */ 0xffff,
+ /* key: 0x79c7 */ 0xd076,
+ /* key: 0x79c8 */ 0xd077,
+ /* key: 0x79c9 */ 0x633d,
+ /* key: 0x79ca */ 0xd078,
+ /* key: 0x79cb */ 0x3d29,
+ /* key: 0x79cc */ 0xffff,
+ /* key: 0x79cd */ 0xffff,
+ /* key: 0x79ce */ 0xffff,
+ /* key: 0x79cf */ 0xd079,
+ /* key: 0x79d0 */ 0xffff,
+ /* key: 0x79d1 */ 0x324a,
+ /* key: 0x79d2 */ 0x4943,
+ /* key: 0x79d3 */ 0xffff,
+ /* key: 0x79d4 */ 0xd07a,
+ /* key: 0x79d5 */ 0x633e,
+ /* key: 0x79d6 */ 0xd07b,
+ /* key: 0x79d7 */ 0xffff,
+ /* key: 0x79d8 */ 0x486b,
+ /* key: 0x79d9 */ 0xffff,
+ /* key: 0x79da */ 0xd07c,
+ /* key: 0x79db */ 0xffff,
+ /* key: 0x79dc */ 0xffff,
+ /* key: 0x79dd */ 0xd07d,
+ /* key: 0x79de */ 0xd07e,
+ /* key: 0x79df */ 0x4145,
+ /* key: 0x79e0 */ 0xd121,
+ /* key: 0x79e1 */ 0x6341,
+ /* key: 0x79e2 */ 0xd122,
+ /* key: 0x79e3 */ 0x6342,
+ /* key: 0x79e4 */ 0x4769,
+ /* key: 0x79e5 */ 0xd123,
+ /* key: 0x79e6 */ 0x3f41,
+ /* key: 0x79e7 */ 0x633f,
+ /* key: 0x79e8 */ 0xffff,
+ /* key: 0x79e9 */ 0x4361,
+ /* key: 0x79ea */ 0xd124,
+ /* key: 0x79eb */ 0xd125,
+ /* key: 0x79ec */ 0x6340,
+ /* key: 0x79ed */ 0xd126,
+ /* key: 0x79ee */ 0xffff,
+ /* key: 0x79ef */ 0xffff,
+ /* key: 0x79f0 */ 0x3e4e,
+ /* key: 0x79f1 */ 0xd127,
+ /* key: 0x79f2 */ 0xffff,
+ /* key: 0x79f3 */ 0xffff,
+ /* key: 0x79f4 */ 0xffff,
+ /* key: 0x79f5 */ 0xffff,
+ /* key: 0x79f6 */ 0xffff,
+ /* key: 0x79f7 */ 0xffff,
+ /* key: 0x79f8 */ 0xd128,
+ /* key: 0x79f9 */ 0xffff,
+ /* key: 0x79fa */ 0xffff,
+ /* key: 0x79fb */ 0x305c,
+ /* key: 0x79fc */ 0xd129,
+ /* key: 0x79fd */ 0xffff,
+ /* key: 0x79fe */ 0xffff,
+ /* key: 0x79ff */ 0xffff,
+ /* branch: 0x7a0X */ 13600,
+ /* branch: 0x7a1X */ 13616,
+ /* branch: 0x7a2X */ 13632,
+ /* branch: 0x7a3X */ 13648,
+ /* branch: 0x7a4X */ 13664,
+ /* branch: 0x7a5X */ 13680,
+ /* branch: 0x7a6X */ 13696,
+ /* branch: 0x7a7X */ 13712,
+ /* branch: 0x7a8X */ 13728,
+ /* branch: 0x7a9X */ 13744,
+ /* branch: 0x7aaX */ 13760,
+ /* branch: 0x7abX */ 13776,
+ /* branch: 0x7acX */ 13792,
+ /* branch: 0x7adX */ 13808,
+ /* branch: 0x7aeX */ 13824,
+ /* branch: 0x7afX */ 13840,
+ /* key: 0x7a00 */ 0x3529,
+ /* key: 0x7a01 */ 0xffff,
+ /* key: 0x7a02 */ 0xd12a,
+ /* key: 0x7a03 */ 0xd12b,
+ /* key: 0x7a04 */ 0xffff,
+ /* key: 0x7a05 */ 0xffff,
+ /* key: 0x7a06 */ 0xffff,
+ /* key: 0x7a07 */ 0xd12c,
+ /* key: 0x7a08 */ 0x6343,
+ /* key: 0x7a09 */ 0xd12d,
+ /* key: 0x7a0a */ 0xd12e,
+ /* key: 0x7a0b */ 0x4478,
+ /* key: 0x7a0c */ 0xd12f,
+ /* key: 0x7a0d */ 0x6344,
+ /* key: 0x7a0e */ 0x4047,
+ /* key: 0x7a0f */ 0xffff,
+ /* key: 0x7a10 */ 0xffff,
+ /* key: 0x7a11 */ 0xd130,
+ /* key: 0x7a12 */ 0xffff,
+ /* key: 0x7a13 */ 0xffff,
+ /* key: 0x7a14 */ 0x4c2d,
+ /* key: 0x7a15 */ 0xd131,
+ /* key: 0x7a16 */ 0xffff,
+ /* key: 0x7a17 */ 0x4923,
+ /* key: 0x7a18 */ 0x6345,
+ /* key: 0x7a19 */ 0x6346,
+ /* key: 0x7a1a */ 0x4355,
+ /* key: 0x7a1b */ 0xd132,
+ /* key: 0x7a1c */ 0x4e47,
+ /* key: 0x7a1d */ 0xffff,
+ /* key: 0x7a1e */ 0xd133,
+ /* key: 0x7a1f */ 0x6348,
+ /* key: 0x7a20 */ 0x6347,
+ /* key: 0x7a21 */ 0xd134,
+ /* key: 0x7a22 */ 0xffff,
+ /* key: 0x7a23 */ 0xffff,
+ /* key: 0x7a24 */ 0xffff,
+ /* key: 0x7a25 */ 0xffff,
+ /* key: 0x7a26 */ 0xffff,
+ /* key: 0x7a27 */ 0xd135,
+ /* key: 0x7a28 */ 0xffff,
+ /* key: 0x7a29 */ 0xffff,
+ /* key: 0x7a2a */ 0xffff,
+ /* key: 0x7a2b */ 0xd136,
+ /* key: 0x7a2c */ 0xffff,
+ /* key: 0x7a2d */ 0xd137,
+ /* key: 0x7a2e */ 0x3c6f,
+ /* key: 0x7a2f */ 0xd138,
+ /* key: 0x7a30 */ 0xd139,
+ /* key: 0x7a31 */ 0x634a,
+ /* key: 0x7a32 */ 0x3070,
+ /* key: 0x7a33 */ 0xffff,
+ /* key: 0x7a34 */ 0xd13a,
+ /* key: 0x7a35 */ 0xd13b,
+ /* key: 0x7a36 */ 0xffff,
+ /* key: 0x7a37 */ 0x634d,
+ /* key: 0x7a38 */ 0xd13c,
+ /* key: 0x7a39 */ 0xd13d,
+ /* key: 0x7a3a */ 0xd13e,
+ /* key: 0x7a3b */ 0x634b,
+ /* key: 0x7a3c */ 0x3254,
+ /* key: 0x7a3d */ 0x374e,
+ /* key: 0x7a3e */ 0x634c,
+ /* key: 0x7a3f */ 0x3946,
+ /* key: 0x7a40 */ 0x3972,
+ /* key: 0x7a41 */ 0xffff,
+ /* key: 0x7a42 */ 0x4a66,
+ /* key: 0x7a43 */ 0x634e,
+ /* key: 0x7a44 */ 0xd13f,
+ /* key: 0x7a45 */ 0xd140,
+ /* key: 0x7a46 */ 0x4b54,
+ /* key: 0x7a47 */ 0xd141,
+ /* key: 0x7a48 */ 0xd142,
+ /* key: 0x7a49 */ 0x6350,
+ /* key: 0x7a4a */ 0xffff,
+ /* key: 0x7a4b */ 0xffff,
+ /* key: 0x7a4c */ 0xd143,
+ /* key: 0x7a4d */ 0x4051,
+ /* key: 0x7a4e */ 0x314f,
+ /* key: 0x7a4f */ 0x323a,
+ /* key: 0x7a50 */ 0x302c,
+ /* key: 0x7a51 */ 0xffff,
+ /* key: 0x7a52 */ 0xffff,
+ /* key: 0x7a53 */ 0xffff,
+ /* key: 0x7a54 */ 0xffff,
+ /* key: 0x7a55 */ 0xd144,
+ /* key: 0x7a56 */ 0xd145,
+ /* key: 0x7a57 */ 0x634f,
+ /* key: 0x7a58 */ 0xffff,
+ /* key: 0x7a59 */ 0xd146,
+ /* key: 0x7a5a */ 0xffff,
+ /* key: 0x7a5b */ 0xffff,
+ /* key: 0x7a5c */ 0xd147,
+ /* key: 0x7a5d */ 0xd148,
+ /* key: 0x7a5e */ 0xffff,
+ /* key: 0x7a5f */ 0xd149,
+ /* key: 0x7a60 */ 0xd14a,
+ /* key: 0x7a61 */ 0x6351,
+ /* key: 0x7a62 */ 0x6352,
+ /* key: 0x7a63 */ 0x3e77,
+ /* key: 0x7a64 */ 0xffff,
+ /* key: 0x7a65 */ 0xd14b,
+ /* key: 0x7a66 */ 0xffff,
+ /* key: 0x7a67 */ 0xd14c,
+ /* key: 0x7a68 */ 0xffff,
+ /* key: 0x7a69 */ 0x6353,
+ /* key: 0x7a6a */ 0xd14d,
+ /* key: 0x7a6b */ 0x334f,
+ /* key: 0x7a6c */ 0xffff,
+ /* key: 0x7a6d */ 0xd14e,
+ /* key: 0x7a6e */ 0xffff,
+ /* key: 0x7a6f */ 0xffff,
+ /* key: 0x7a70 */ 0x6355,
+ /* key: 0x7a71 */ 0xffff,
+ /* key: 0x7a72 */ 0xffff,
+ /* key: 0x7a73 */ 0xffff,
+ /* key: 0x7a74 */ 0x376a,
+ /* key: 0x7a75 */ 0xd14f,
+ /* key: 0x7a76 */ 0x3566,
+ /* key: 0x7a77 */ 0xffff,
+ /* key: 0x7a78 */ 0xd150,
+ /* key: 0x7a79 */ 0x6356,
+ /* key: 0x7a7a */ 0x3675,
+ /* key: 0x7a7b */ 0xffff,
+ /* key: 0x7a7c */ 0xffff,
+ /* key: 0x7a7d */ 0x6357,
+ /* key: 0x7a7e */ 0xd151,
+ /* key: 0x7a7f */ 0x407c,
+ /* key: 0x7a80 */ 0xd152,
+ /* key: 0x7a81 */ 0x464d,
+ /* key: 0x7a82 */ 0xd153,
+ /* key: 0x7a83 */ 0x4060,
+ /* key: 0x7a84 */ 0x3a75,
+ /* key: 0x7a85 */ 0xd154,
+ /* key: 0x7a86 */ 0xd155,
+ /* key: 0x7a87 */ 0xffff,
+ /* key: 0x7a88 */ 0x6358,
+ /* key: 0x7a89 */ 0xffff,
+ /* key: 0x7a8a */ 0xd156,
+ /* key: 0x7a8b */ 0xd157,
+ /* key: 0x7a8c */ 0xffff,
+ /* key: 0x7a8d */ 0xffff,
+ /* key: 0x7a8e */ 0xffff,
+ /* key: 0x7a8f */ 0xffff,
+ /* key: 0x7a90 */ 0xd158,
+ /* key: 0x7a91 */ 0xd159,
+ /* key: 0x7a92 */ 0x4362,
+ /* key: 0x7a93 */ 0x416b,
+ /* key: 0x7a94 */ 0xd15a,
+ /* key: 0x7a95 */ 0x635a,
+ /* key: 0x7a96 */ 0x635c,
+ /* key: 0x7a97 */ 0x6359,
+ /* key: 0x7a98 */ 0x635b,
+ /* key: 0x7a99 */ 0xffff,
+ /* key: 0x7a9a */ 0xffff,
+ /* key: 0x7a9b */ 0xffff,
+ /* key: 0x7a9c */ 0xffff,
+ /* key: 0x7a9d */ 0xffff,
+ /* key: 0x7a9e */ 0xd15b,
+ /* key: 0x7a9f */ 0x3722,
+ /* key: 0x7aa0 */ 0xd15c,
+ /* key: 0x7aa1 */ 0xffff,
+ /* key: 0x7aa2 */ 0xffff,
+ /* key: 0x7aa3 */ 0xd15d,
+ /* key: 0x7aa4 */ 0xffff,
+ /* key: 0x7aa5 */ 0xffff,
+ /* key: 0x7aa6 */ 0xffff,
+ /* key: 0x7aa7 */ 0xffff,
+ /* key: 0x7aa8 */ 0xffff,
+ /* key: 0x7aa9 */ 0x635d,
+ /* key: 0x7aaa */ 0x3726,
+ /* key: 0x7aab */ 0xffff,
+ /* key: 0x7aac */ 0xd15e,
+ /* key: 0x7aad */ 0xffff,
+ /* key: 0x7aae */ 0x3567,
+ /* key: 0x7aaf */ 0x4d52,
+ /* key: 0x7ab0 */ 0x635f,
+ /* key: 0x7ab1 */ 0xffff,
+ /* key: 0x7ab2 */ 0xffff,
+ /* key: 0x7ab3 */ 0xd15f,
+ /* key: 0x7ab4 */ 0xffff,
+ /* key: 0x7ab5 */ 0xd160,
+ /* key: 0x7ab6 */ 0x6360,
+ /* key: 0x7ab7 */ 0xffff,
+ /* key: 0x7ab8 */ 0xffff,
+ /* key: 0x7ab9 */ 0xd161,
+ /* key: 0x7aba */ 0x312e,
+ /* key: 0x7abb */ 0xd162,
+ /* key: 0x7abc */ 0xd163,
+ /* key: 0x7abd */ 0xffff,
+ /* key: 0x7abe */ 0xffff,
+ /* key: 0x7abf */ 0x6363,
+ /* key: 0x7ac0 */ 0xffff,
+ /* key: 0x7ac1 */ 0xffff,
+ /* key: 0x7ac2 */ 0xffff,
+ /* key: 0x7ac3 */ 0x3376,
+ /* key: 0x7ac4 */ 0x6362,
+ /* key: 0x7ac5 */ 0x6361,
+ /* key: 0x7ac6 */ 0xd164,
+ /* key: 0x7ac7 */ 0x6365,
+ /* key: 0x7ac8 */ 0x635e,
+ /* key: 0x7ac9 */ 0xd165,
+ /* key: 0x7aca */ 0x6366,
+ /* key: 0x7acb */ 0x4e29,
+ /* key: 0x7acc */ 0xd166,
+ /* key: 0x7acd */ 0x6367,
+ /* key: 0x7ace */ 0xd167,
+ /* key: 0x7acf */ 0x6368,
+ /* key: 0x7ad0 */ 0xffff,
+ /* key: 0x7ad1 */ 0xd168,
+ /* key: 0x7ad2 */ 0x5474,
+ /* key: 0x7ad3 */ 0x636a,
+ /* key: 0x7ad4 */ 0xffff,
+ /* key: 0x7ad5 */ 0x6369,
+ /* key: 0x7ad6 */ 0xffff,
+ /* key: 0x7ad7 */ 0xffff,
+ /* key: 0x7ad8 */ 0xffff,
+ /* key: 0x7ad9 */ 0x636b,
+ /* key: 0x7ada */ 0x636c,
+ /* key: 0x7adb */ 0xd169,
+ /* key: 0x7adc */ 0x4e35,
+ /* key: 0x7add */ 0x636d,
+ /* key: 0x7ade */ 0xffff,
+ /* key: 0x7adf */ 0x706f,
+ /* key: 0x7ae0 */ 0x3e4f,
+ /* key: 0x7ae1 */ 0x636e,
+ /* key: 0x7ae2 */ 0x636f,
+ /* key: 0x7ae3 */ 0x3d57,
+ /* key: 0x7ae4 */ 0xffff,
+ /* key: 0x7ae5 */ 0x4638,
+ /* key: 0x7ae6 */ 0x6370,
+ /* key: 0x7ae7 */ 0xffff,
+ /* key: 0x7ae8 */ 0xd16a,
+ /* key: 0x7ae9 */ 0xd16b,
+ /* key: 0x7aea */ 0x4328,
+ /* key: 0x7aeb */ 0xd16c,
+ /* key: 0x7aec */ 0xd16d,
+ /* key: 0x7aed */ 0x6371,
+ /* key: 0x7aee */ 0xffff,
+ /* key: 0x7aef */ 0x433c,
+ /* key: 0x7af0 */ 0x6372,
+ /* key: 0x7af1 */ 0xd16e,
+ /* key: 0x7af2 */ 0xffff,
+ /* key: 0x7af3 */ 0xffff,
+ /* key: 0x7af4 */ 0xd16f,
+ /* key: 0x7af5 */ 0xffff,
+ /* key: 0x7af6 */ 0x3625,
+ /* key: 0x7af7 */ 0xffff,
+ /* key: 0x7af8 */ 0x513f,
+ /* key: 0x7af9 */ 0x435d,
+ /* key: 0x7afa */ 0x3c33,
+ /* key: 0x7afb */ 0xd170,
+ /* key: 0x7afc */ 0xffff,
+ /* key: 0x7afd */ 0xd171,
+ /* key: 0x7afe */ 0xd172,
+ /* key: 0x7aff */ 0x3448,
+ /* branch: 0x7b0X */ 13872,
+ /* branch: 0x7b1X */ 13888,
+ /* branch: 0x7b2X */ 13904,
+ /* branch: 0x7b3X */ 13920,
+ /* branch: 0x7b4X */ 13936,
+ /* branch: 0x7b5X */ 13952,
+ /* branch: 0x7b6X */ 13968,
+ /* branch: 0x7b7X */ 13984,
+ /* branch: 0x7b8X */ 14000,
+ /* branch: 0x7b9X */ 14016,
+ /* branch: 0x7baX */ 14032,
+ /* branch: 0x7bbX */ 14048,
+ /* branch: 0x7bcX */ 14064,
+ /* branch: 0x7bdX */ 14080,
+ /* branch: 0x7beX */ 14096,
+ /* branch: 0x7bfX */ 14112,
+ /* key: 0x7b00 */ 0xffff,
+ /* key: 0x7b01 */ 0xffff,
+ /* key: 0x7b02 */ 0x6373,
+ /* key: 0x7b03 */ 0xffff,
+ /* key: 0x7b04 */ 0x6422,
+ /* key: 0x7b05 */ 0xffff,
+ /* key: 0x7b06 */ 0x6376,
+ /* key: 0x7b07 */ 0xd173,
+ /* key: 0x7b08 */ 0x3568,
+ /* key: 0x7b09 */ 0xffff,
+ /* key: 0x7b0a */ 0x6375,
+ /* key: 0x7b0b */ 0x6424,
+ /* key: 0x7b0c */ 0xffff,
+ /* key: 0x7b0d */ 0xffff,
+ /* key: 0x7b0e */ 0xffff,
+ /* key: 0x7b0f */ 0x6374,
+ /* key: 0x7b10 */ 0xffff,
+ /* key: 0x7b11 */ 0x3e50,
+ /* key: 0x7b12 */ 0xffff,
+ /* key: 0x7b13 */ 0xffff,
+ /* key: 0x7b14 */ 0xd174,
+ /* key: 0x7b15 */ 0xffff,
+ /* key: 0x7b16 */ 0xffff,
+ /* key: 0x7b17 */ 0xffff,
+ /* key: 0x7b18 */ 0x6378,
+ /* key: 0x7b19 */ 0x6379,
+ /* key: 0x7b1a */ 0xffff,
+ /* key: 0x7b1b */ 0x452b,
+ /* key: 0x7b1c */ 0xffff,
+ /* key: 0x7b1d */ 0xffff,
+ /* key: 0x7b1e */ 0x637a,
+ /* key: 0x7b1f */ 0xd175,
+ /* key: 0x7b20 */ 0x335e,
+ /* key: 0x7b21 */ 0xffff,
+ /* key: 0x7b22 */ 0xffff,
+ /* key: 0x7b23 */ 0xd176,
+ /* key: 0x7b24 */ 0xffff,
+ /* key: 0x7b25 */ 0x3f5a,
+ /* key: 0x7b26 */ 0x4964,
+ /* key: 0x7b27 */ 0xd177,
+ /* key: 0x7b28 */ 0x637c,
+ /* key: 0x7b29 */ 0xd178,
+ /* key: 0x7b2a */ 0xd179,
+ /* key: 0x7b2b */ 0xd17a,
+ /* key: 0x7b2c */ 0x4268,
+ /* key: 0x7b2d */ 0xd17b,
+ /* key: 0x7b2e */ 0xd17c,
+ /* key: 0x7b2f */ 0xd17d,
+ /* key: 0x7b30 */ 0xd17e,
+ /* key: 0x7b31 */ 0xd221,
+ /* key: 0x7b32 */ 0xffff,
+ /* key: 0x7b33 */ 0x6377,
+ /* key: 0x7b34 */ 0xd222,
+ /* key: 0x7b35 */ 0x637b,
+ /* key: 0x7b36 */ 0x637d,
+ /* key: 0x7b37 */ 0xffff,
+ /* key: 0x7b38 */ 0xffff,
+ /* key: 0x7b39 */ 0x3a7b,
+ /* key: 0x7b3a */ 0xffff,
+ /* key: 0x7b3b */ 0xffff,
+ /* key: 0x7b3c */ 0xffff,
+ /* key: 0x7b3d */ 0xd223,
+ /* key: 0x7b3e */ 0xffff,
+ /* key: 0x7b3f */ 0xd224,
+ /* key: 0x7b40 */ 0xd225,
+ /* key: 0x7b41 */ 0xd226,
+ /* key: 0x7b42 */ 0xffff,
+ /* key: 0x7b43 */ 0xffff,
+ /* key: 0x7b44 */ 0xffff,
+ /* key: 0x7b45 */ 0x6426,
+ /* key: 0x7b46 */ 0x492e,
+ /* key: 0x7b47 */ 0xd227,
+ /* key: 0x7b48 */ 0x4826,
+ /* key: 0x7b49 */ 0x4579,
+ /* key: 0x7b4a */ 0xffff,
+ /* key: 0x7b4b */ 0x365a,
+ /* key: 0x7b4c */ 0x6425,
+ /* key: 0x7b4d */ 0x6423,
+ /* key: 0x7b4e */ 0xd228,
+ /* key: 0x7b4f */ 0x4835,
+ /* key: 0x7b50 */ 0x637e,
+ /* key: 0x7b51 */ 0x435e,
+ /* key: 0x7b52 */ 0x457b,
+ /* key: 0x7b53 */ 0xffff,
+ /* key: 0x7b54 */ 0x457a,
+ /* key: 0x7b55 */ 0xd229,
+ /* key: 0x7b56 */ 0x3a76,
+ /* key: 0x7b57 */ 0xffff,
+ /* key: 0x7b58 */ 0xffff,
+ /* key: 0x7b59 */ 0xffff,
+ /* key: 0x7b5a */ 0xffff,
+ /* key: 0x7b5b */ 0xffff,
+ /* key: 0x7b5c */ 0xffff,
+ /* key: 0x7b5d */ 0x6438,
+ /* key: 0x7b5e */ 0xffff,
+ /* key: 0x7b5f */ 0xffff,
+ /* key: 0x7b60 */ 0xd22a,
+ /* key: 0x7b61 */ 0xffff,
+ /* key: 0x7b62 */ 0xffff,
+ /* key: 0x7b63 */ 0xffff,
+ /* key: 0x7b64 */ 0xd22b,
+ /* key: 0x7b65 */ 0x6428,
+ /* key: 0x7b66 */ 0xd22c,
+ /* key: 0x7b67 */ 0x642a,
+ /* key: 0x7b68 */ 0xffff,
+ /* key: 0x7b69 */ 0xd22d,
+ /* key: 0x7b6a */ 0xd22e,
+ /* key: 0x7b6b */ 0xffff,
+ /* key: 0x7b6c */ 0x642d,
+ /* key: 0x7b6d */ 0xd22f,
+ /* key: 0x7b6e */ 0x642e,
+ /* key: 0x7b6f */ 0xd230,
+ /* key: 0x7b70 */ 0x642b,
+ /* key: 0x7b71 */ 0x642c,
+ /* key: 0x7b72 */ 0xd231,
+ /* key: 0x7b73 */ 0xd232,
+ /* key: 0x7b74 */ 0x6429,
+ /* key: 0x7b75 */ 0x6427,
+ /* key: 0x7b76 */ 0xffff,
+ /* key: 0x7b77 */ 0xd233,
+ /* key: 0x7b78 */ 0xffff,
+ /* key: 0x7b79 */ 0xffff,
+ /* key: 0x7b7a */ 0x6421,
+ /* key: 0x7b7b */ 0xffff,
+ /* key: 0x7b7c */ 0xffff,
+ /* key: 0x7b7d */ 0xffff,
+ /* key: 0x7b7e */ 0xffff,
+ /* key: 0x7b7f */ 0xffff,
+ /* key: 0x7b80 */ 0xffff,
+ /* key: 0x7b81 */ 0xffff,
+ /* key: 0x7b82 */ 0xffff,
+ /* key: 0x7b83 */ 0xffff,
+ /* key: 0x7b84 */ 0xd234,
+ /* key: 0x7b85 */ 0xffff,
+ /* key: 0x7b86 */ 0x4a4f,
+ /* key: 0x7b87 */ 0x3255,
+ /* key: 0x7b88 */ 0xffff,
+ /* key: 0x7b89 */ 0xd235,
+ /* key: 0x7b8a */ 0xffff,
+ /* key: 0x7b8b */ 0x6435,
+ /* key: 0x7b8c */ 0xffff,
+ /* key: 0x7b8d */ 0x6432,
+ /* key: 0x7b8e */ 0xd236,
+ /* key: 0x7b8f */ 0x6437,
+ /* key: 0x7b90 */ 0xd237,
+ /* key: 0x7b91 */ 0xd238,
+ /* key: 0x7b92 */ 0x6436,
+ /* key: 0x7b93 */ 0xffff,
+ /* key: 0x7b94 */ 0x4773,
+ /* key: 0x7b95 */ 0x4c27,
+ /* key: 0x7b96 */ 0xd239,
+ /* key: 0x7b97 */ 0x3b3b,
+ /* key: 0x7b98 */ 0x6430,
+ /* key: 0x7b99 */ 0x6439,
+ /* key: 0x7b9a */ 0x6434,
+ /* key: 0x7b9b */ 0xd23a,
+ /* key: 0x7b9c */ 0x6433,
+ /* key: 0x7b9d */ 0x642f,
+ /* key: 0x7b9e */ 0xd23b,
+ /* key: 0x7b9f */ 0x6431,
+ /* key: 0x7ba0 */ 0xd23c,
+ /* key: 0x7ba1 */ 0x3449,
+ /* key: 0x7ba2 */ 0xffff,
+ /* key: 0x7ba3 */ 0xffff,
+ /* key: 0x7ba4 */ 0xffff,
+ /* key: 0x7ba5 */ 0xd23d,
+ /* key: 0x7ba6 */ 0xffff,
+ /* key: 0x7ba7 */ 0xffff,
+ /* key: 0x7ba8 */ 0xffff,
+ /* key: 0x7ba9 */ 0xffff,
+ /* key: 0x7baa */ 0x433d,
+ /* key: 0x7bab */ 0xffff,
+ /* key: 0x7bac */ 0xd23e,
+ /* key: 0x7bad */ 0x407d,
+ /* key: 0x7bae */ 0xffff,
+ /* key: 0x7baf */ 0xd23f,
+ /* key: 0x7bb0 */ 0xd240,
+ /* key: 0x7bb1 */ 0x4822,
+ /* key: 0x7bb2 */ 0xd241,
+ /* key: 0x7bb3 */ 0xffff,
+ /* key: 0x7bb4 */ 0x643e,
+ /* key: 0x7bb5 */ 0xd242,
+ /* key: 0x7bb6 */ 0xd243,
+ /* key: 0x7bb7 */ 0xffff,
+ /* key: 0x7bb8 */ 0x4824,
+ /* key: 0x7bb9 */ 0xffff,
+ /* key: 0x7bba */ 0xd244,
+ /* key: 0x7bbb */ 0xd245,
+ /* key: 0x7bbc */ 0xd246,
+ /* key: 0x7bbd */ 0xd247,
+ /* key: 0x7bbe */ 0xffff,
+ /* key: 0x7bbf */ 0xffff,
+ /* key: 0x7bc0 */ 0x4061,
+ /* key: 0x7bc1 */ 0x643b,
+ /* key: 0x7bc2 */ 0xd248,
+ /* key: 0x7bc3 */ 0xffff,
+ /* key: 0x7bc4 */ 0x484f,
+ /* key: 0x7bc5 */ 0xd249,
+ /* key: 0x7bc6 */ 0x643f,
+ /* key: 0x7bc7 */ 0x4a53,
+ /* key: 0x7bc8 */ 0xd24a,
+ /* key: 0x7bc9 */ 0x435b,
+ /* key: 0x7bca */ 0xd24b,
+ /* key: 0x7bcb */ 0x643a,
+ /* key: 0x7bcc */ 0x643c,
+ /* key: 0x7bcd */ 0xffff,
+ /* key: 0x7bce */ 0xffff,
+ /* key: 0x7bcf */ 0x643d,
+ /* key: 0x7bd0 */ 0xffff,
+ /* key: 0x7bd1 */ 0xffff,
+ /* key: 0x7bd2 */ 0xffff,
+ /* key: 0x7bd3 */ 0xffff,
+ /* key: 0x7bd4 */ 0xd24c,
+ /* key: 0x7bd5 */ 0xffff,
+ /* key: 0x7bd6 */ 0xd24d,
+ /* key: 0x7bd7 */ 0xd24e,
+ /* key: 0x7bd8 */ 0xffff,
+ /* key: 0x7bd9 */ 0xd24f,
+ /* key: 0x7bda */ 0xd250,
+ /* key: 0x7bdb */ 0xd251,
+ /* key: 0x7bdc */ 0xffff,
+ /* key: 0x7bdd */ 0x6440,
+ /* key: 0x7bde */ 0xffff,
+ /* key: 0x7bdf */ 0xffff,
+ /* key: 0x7be0 */ 0x3c44,
+ /* key: 0x7be1 */ 0xffff,
+ /* key: 0x7be2 */ 0xffff,
+ /* key: 0x7be3 */ 0xffff,
+ /* key: 0x7be4 */ 0x4646,
+ /* key: 0x7be5 */ 0x6445,
+ /* key: 0x7be6 */ 0x6444,
+ /* key: 0x7be7 */ 0xffff,
+ /* key: 0x7be8 */ 0xd252,
+ /* key: 0x7be9 */ 0x6441,
+ /* key: 0x7bea */ 0xd253,
+ /* key: 0x7beb */ 0xffff,
+ /* key: 0x7bec */ 0xffff,
+ /* key: 0x7bed */ 0x4f36,
+ /* key: 0x7bee */ 0xffff,
+ /* key: 0x7bef */ 0xffff,
+ /* key: 0x7bf0 */ 0xffff,
+ /* key: 0x7bf1 */ 0xffff,
+ /* key: 0x7bf2 */ 0xd254,
+ /* key: 0x7bf3 */ 0x644a,
+ /* key: 0x7bf4 */ 0xd255,
+ /* key: 0x7bf5 */ 0xd256,
+ /* key: 0x7bf6 */ 0x644e,
+ /* key: 0x7bf7 */ 0x644b,
+ /* key: 0x7bf8 */ 0xd257,
+ /* key: 0x7bf9 */ 0xd258,
+ /* key: 0x7bfa */ 0xd259,
+ /* key: 0x7bfb */ 0xffff,
+ /* key: 0x7bfc */ 0xd25a,
+ /* key: 0x7bfd */ 0xffff,
+ /* key: 0x7bfe */ 0xd25b,
+ /* key: 0x7bff */ 0xffff,
+ /* branch: 0x7c0X */ 14144,
+ /* branch: 0x7c1X */ 14160,
+ /* branch: 0x7c2X */ 14176,
+ /* branch: 0x7c3X */ 14192,
+ /* branch: 0x7c4X */ 14208,
+ /* branch: 0x7c5X */ 14224,
+ /* branch: 0x7c6X */ 14240,
+ /* branch: 0x7c7X */ 14256,
+ /* branch: 0x7c8X */ 14272,
+ /* branch: 0x7c9X */ 14288,
+ /* branch: 0x7caX */ 14304,
+ /* branch: 0x7cbX */ 14320,
+ /* branch: 0x7ccX */ 14336,
+ /* branch: 0x7cdX */ 14352,
+ /* branch: 0x7ceX */ 14368,
+ /* branch: 0x7cfX */ 14384,
+ /* key: 0x7c00 */ 0x6447,
+ /* key: 0x7c01 */ 0xd25c,
+ /* key: 0x7c02 */ 0xd25d,
+ /* key: 0x7c03 */ 0xd25e,
+ /* key: 0x7c04 */ 0xd25f,
+ /* key: 0x7c05 */ 0xffff,
+ /* key: 0x7c06 */ 0xd260,
+ /* key: 0x7c07 */ 0x6448,
+ /* key: 0x7c08 */ 0xffff,
+ /* key: 0x7c09 */ 0xd261,
+ /* key: 0x7c0a */ 0xffff,
+ /* key: 0x7c0b */ 0xd262,
+ /* key: 0x7c0c */ 0xd263,
+ /* key: 0x7c0d */ 0x644d,
+ /* key: 0x7c0e */ 0xd264,
+ /* key: 0x7c0f */ 0xd265,
+ /* key: 0x7c10 */ 0xffff,
+ /* key: 0x7c11 */ 0x6442,
+ /* key: 0x7c12 */ 0x5255,
+ /* key: 0x7c13 */ 0x6449,
+ /* key: 0x7c14 */ 0x6443,
+ /* key: 0x7c15 */ 0xffff,
+ /* key: 0x7c16 */ 0xffff,
+ /* key: 0x7c17 */ 0x644c,
+ /* key: 0x7c18 */ 0xffff,
+ /* key: 0x7c19 */ 0xd266,
+ /* key: 0x7c1a */ 0xffff,
+ /* key: 0x7c1b */ 0xd267,
+ /* key: 0x7c1c */ 0xffff,
+ /* key: 0x7c1d */ 0xffff,
+ /* key: 0x7c1e */ 0xffff,
+ /* key: 0x7c1f */ 0x6452,
+ /* key: 0x7c20 */ 0xd268,
+ /* key: 0x7c21 */ 0x344a,
+ /* key: 0x7c22 */ 0xffff,
+ /* key: 0x7c23 */ 0x644f,
+ /* key: 0x7c24 */ 0xffff,
+ /* key: 0x7c25 */ 0xd269,
+ /* key: 0x7c26 */ 0xd26a,
+ /* key: 0x7c27 */ 0x6450,
+ /* key: 0x7c28 */ 0xd26b,
+ /* key: 0x7c29 */ 0xffff,
+ /* key: 0x7c2a */ 0x6451,
+ /* key: 0x7c2b */ 0x6454,
+ /* key: 0x7c2c */ 0xd26c,
+ /* key: 0x7c2d */ 0xffff,
+ /* key: 0x7c2e */ 0xffff,
+ /* key: 0x7c2f */ 0xffff,
+ /* key: 0x7c30 */ 0xffff,
+ /* key: 0x7c31 */ 0xd26d,
+ /* key: 0x7c32 */ 0xffff,
+ /* key: 0x7c33 */ 0xd26e,
+ /* key: 0x7c34 */ 0xd26f,
+ /* key: 0x7c35 */ 0xffff,
+ /* key: 0x7c36 */ 0xd270,
+ /* key: 0x7c37 */ 0x6453,
+ /* key: 0x7c38 */ 0x4876,
+ /* key: 0x7c39 */ 0xd271,
+ /* key: 0x7c3a */ 0xd272,
+ /* key: 0x7c3b */ 0xffff,
+ /* key: 0x7c3c */ 0xffff,
+ /* key: 0x7c3d */ 0x6455,
+ /* key: 0x7c3e */ 0x4e7c,
+ /* key: 0x7c3f */ 0x4a6d,
+ /* key: 0x7c40 */ 0x645a,
+ /* key: 0x7c41 */ 0xffff,
+ /* key: 0x7c42 */ 0xffff,
+ /* key: 0x7c43 */ 0x6457,
+ /* key: 0x7c44 */ 0xffff,
+ /* key: 0x7c45 */ 0xffff,
+ /* key: 0x7c46 */ 0xd273,
+ /* key: 0x7c47 */ 0xffff,
+ /* key: 0x7c48 */ 0xffff,
+ /* key: 0x7c49 */ 0xffff,
+ /* key: 0x7c4a */ 0xd274,
+ /* key: 0x7c4b */ 0xffff,
+ /* key: 0x7c4c */ 0x6456,
+ /* key: 0x7c4d */ 0x4052,
+ /* key: 0x7c4e */ 0xffff,
+ /* key: 0x7c4f */ 0x6459,
+ /* key: 0x7c50 */ 0x645b,
+ /* key: 0x7c51 */ 0xd276,
+ /* key: 0x7c52 */ 0xd277,
+ /* key: 0x7c53 */ 0xd278,
+ /* key: 0x7c54 */ 0x6458,
+ /* key: 0x7c55 */ 0xd275,
+ /* key: 0x7c56 */ 0x645f,
+ /* key: 0x7c57 */ 0xffff,
+ /* key: 0x7c58 */ 0x645c,
+ /* key: 0x7c59 */ 0xd279,
+ /* key: 0x7c5a */ 0xd27a,
+ /* key: 0x7c5b */ 0xd27b,
+ /* key: 0x7c5c */ 0xd27c,
+ /* key: 0x7c5d */ 0xd27d,
+ /* key: 0x7c5e */ 0xd27e,
+ /* key: 0x7c5f */ 0x645d,
+ /* key: 0x7c60 */ 0x6446,
+ /* key: 0x7c61 */ 0xd321,
+ /* key: 0x7c62 */ 0xffff,
+ /* key: 0x7c63 */ 0xd322,
+ /* key: 0x7c64 */ 0x645e,
+ /* key: 0x7c65 */ 0x6460,
+ /* key: 0x7c66 */ 0xffff,
+ /* key: 0x7c67 */ 0xd323,
+ /* key: 0x7c68 */ 0xffff,
+ /* key: 0x7c69 */ 0xd324,
+ /* key: 0x7c6a */ 0xffff,
+ /* key: 0x7c6b */ 0xffff,
+ /* key: 0x7c6c */ 0x6461,
+ /* key: 0x7c6d */ 0xd325,
+ /* key: 0x7c6e */ 0xd326,
+ /* key: 0x7c6f */ 0xffff,
+ /* key: 0x7c70 */ 0xd327,
+ /* key: 0x7c71 */ 0xffff,
+ /* key: 0x7c72 */ 0xd328,
+ /* key: 0x7c73 */ 0x4a46,
+ /* key: 0x7c74 */ 0xffff,
+ /* key: 0x7c75 */ 0x6462,
+ /* key: 0x7c76 */ 0xffff,
+ /* key: 0x7c77 */ 0xffff,
+ /* key: 0x7c78 */ 0xffff,
+ /* key: 0x7c79 */ 0xd329,
+ /* key: 0x7c7a */ 0xffff,
+ /* key: 0x7c7b */ 0xffff,
+ /* key: 0x7c7c */ 0xd32a,
+ /* key: 0x7c7d */ 0xd32b,
+ /* key: 0x7c7e */ 0x4c62,
+ /* key: 0x7c7f */ 0xffff,
+ /* key: 0x7c80 */ 0xffff,
+ /* key: 0x7c81 */ 0x364e,
+ /* key: 0x7c82 */ 0x3729,
+ /* key: 0x7c83 */ 0x6463,
+ /* key: 0x7c84 */ 0xffff,
+ /* key: 0x7c85 */ 0xffff,
+ /* key: 0x7c86 */ 0xd32c,
+ /* key: 0x7c87 */ 0xd32d,
+ /* key: 0x7c88 */ 0xffff,
+ /* key: 0x7c89 */ 0x4a34,
+ /* key: 0x7c8a */ 0xffff,
+ /* key: 0x7c8b */ 0x3f68,
+ /* key: 0x7c8c */ 0xffff,
+ /* key: 0x7c8d */ 0x4c30,
+ /* key: 0x7c8e */ 0xffff,
+ /* key: 0x7c8f */ 0xd32e,
+ /* key: 0x7c90 */ 0x6464,
+ /* key: 0x7c91 */ 0xffff,
+ /* key: 0x7c92 */ 0x4e33,
+ /* key: 0x7c93 */ 0xffff,
+ /* key: 0x7c94 */ 0xd32f,
+ /* key: 0x7c95 */ 0x4774,
+ /* key: 0x7c96 */ 0xffff,
+ /* key: 0x7c97 */ 0x4146,
+ /* key: 0x7c98 */ 0x4734,
+ /* key: 0x7c99 */ 0xffff,
+ /* key: 0x7c9a */ 0xffff,
+ /* key: 0x7c9b */ 0x3d4d,
+ /* key: 0x7c9c */ 0xffff,
+ /* key: 0x7c9d */ 0xffff,
+ /* key: 0x7c9e */ 0xd330,
+ /* key: 0x7c9f */ 0x3040,
+ /* key: 0x7ca0 */ 0xd331,
+ /* key: 0x7ca1 */ 0x6469,
+ /* key: 0x7ca2 */ 0x6467,
+ /* key: 0x7ca3 */ 0xffff,
+ /* key: 0x7ca4 */ 0x6465,
+ /* key: 0x7ca5 */ 0x3421,
+ /* key: 0x7ca6 */ 0xd332,
+ /* key: 0x7ca7 */ 0x3e51,
+ /* key: 0x7ca8 */ 0x646a,
+ /* key: 0x7ca9 */ 0xffff,
+ /* key: 0x7caa */ 0xffff,
+ /* key: 0x7cab */ 0x6468,
+ /* key: 0x7cac */ 0xffff,
+ /* key: 0x7cad */ 0x6466,
+ /* key: 0x7cae */ 0x646e,
+ /* key: 0x7caf */ 0xffff,
+ /* key: 0x7cb0 */ 0xd333,
+ /* key: 0x7cb1 */ 0x646d,
+ /* key: 0x7cb2 */ 0x646c,
+ /* key: 0x7cb3 */ 0x646b,
+ /* key: 0x7cb4 */ 0xffff,
+ /* key: 0x7cb5 */ 0xffff,
+ /* key: 0x7cb6 */ 0xd334,
+ /* key: 0x7cb7 */ 0xd335,
+ /* key: 0x7cb8 */ 0xffff,
+ /* key: 0x7cb9 */ 0x646f,
+ /* key: 0x7cba */ 0xd336,
+ /* key: 0x7cbb */ 0xd337,
+ /* key: 0x7cbc */ 0xd338,
+ /* key: 0x7cbd */ 0x6470,
+ /* key: 0x7cbe */ 0x403a,
+ /* key: 0x7cbf */ 0xd339,
+ /* key: 0x7cc0 */ 0x6471,
+ /* key: 0x7cc1 */ 0xffff,
+ /* key: 0x7cc2 */ 0x6473,
+ /* key: 0x7cc3 */ 0xffff,
+ /* key: 0x7cc4 */ 0xd33a,
+ /* key: 0x7cc5 */ 0x6472,
+ /* key: 0x7cc6 */ 0xffff,
+ /* key: 0x7cc7 */ 0xd33b,
+ /* key: 0x7cc8 */ 0xd33c,
+ /* key: 0x7cc9 */ 0xd33d,
+ /* key: 0x7cca */ 0x3852,
+ /* key: 0x7ccb */ 0xffff,
+ /* key: 0x7ccc */ 0xffff,
+ /* key: 0x7ccd */ 0xd33e,
+ /* key: 0x7cce */ 0x4138,
+ /* key: 0x7ccf */ 0xd33f,
+ /* key: 0x7cd0 */ 0xffff,
+ /* key: 0x7cd1 */ 0xffff,
+ /* key: 0x7cd2 */ 0x6475,
+ /* key: 0x7cd3 */ 0xd340,
+ /* key: 0x7cd4 */ 0xd341,
+ /* key: 0x7cd5 */ 0xd342,
+ /* key: 0x7cd6 */ 0x457c,
+ /* key: 0x7cd7 */ 0xd343,
+ /* key: 0x7cd8 */ 0x6474,
+ /* key: 0x7cd9 */ 0xd344,
+ /* key: 0x7cda */ 0xd345,
+ /* key: 0x7cdb */ 0xffff,
+ /* key: 0x7cdc */ 0x6476,
+ /* key: 0x7cdd */ 0xd346,
+ /* key: 0x7cde */ 0x4a35,
+ /* key: 0x7cdf */ 0x416c,
+ /* key: 0x7ce0 */ 0x3947,
+ /* key: 0x7ce1 */ 0xffff,
+ /* key: 0x7ce2 */ 0x6477,
+ /* key: 0x7ce3 */ 0xffff,
+ /* key: 0x7ce4 */ 0xffff,
+ /* key: 0x7ce5 */ 0xffff,
+ /* key: 0x7ce6 */ 0xd347,
+ /* key: 0x7ce7 */ 0x4e48,
+ /* key: 0x7ce8 */ 0xffff,
+ /* key: 0x7ce9 */ 0xd348,
+ /* key: 0x7cea */ 0xffff,
+ /* key: 0x7ceb */ 0xd349,
+ /* key: 0x7cec */ 0xffff,
+ /* key: 0x7ced */ 0xffff,
+ /* key: 0x7cee */ 0xffff,
+ /* key: 0x7cef */ 0x6479,
+ /* key: 0x7cf0 */ 0xffff,
+ /* key: 0x7cf1 */ 0xffff,
+ /* key: 0x7cf2 */ 0x647a,
+ /* key: 0x7cf3 */ 0xffff,
+ /* key: 0x7cf4 */ 0x647b,
+ /* key: 0x7cf5 */ 0xd34a,
+ /* key: 0x7cf6 */ 0x647c,
+ /* key: 0x7cf7 */ 0xffff,
+ /* key: 0x7cf8 */ 0x3b65,
+ /* key: 0x7cf9 */ 0xffff,
+ /* key: 0x7cfa */ 0x647d,
+ /* key: 0x7cfb */ 0x374f,
+ /* key: 0x7cfc */ 0xffff,
+ /* key: 0x7cfd */ 0xffff,
+ /* key: 0x7cfe */ 0x356a,
+ /* key: 0x7cff */ 0xffff,
+ /* branch: 0x7d0X */ 14416,
+ /* branch: 0x7d1X */ 14432,
+ /* branch: 0x7d2X */ 14448,
+ /* branch: 0x7d3X */ 14464,
+ /* branch: 0x7d4X */ 14480,
+ /* branch: 0x7d5X */ 14496,
+ /* branch: 0x7d6X */ 14512,
+ /* branch: 0x7d7X */ 14528,
+ /* branch: 0x7d8X */ 14544,
+ /* branch: 0x7d9X */ 14560,
+ /* branch: 0x7daX */ 14576,
+ /* branch: 0x7dbX */ 14592,
+ /* branch: 0x7dcX */ 14608,
+ /* branch: 0x7ddX */ 14624,
+ /* branch: 0x7deX */ 14640,
+ /* branch: 0x7dfX */ 14656,
+ /* key: 0x7d00 */ 0x352a,
+ /* key: 0x7d01 */ 0xffff,
+ /* key: 0x7d02 */ 0x6521,
+ /* key: 0x7d03 */ 0xd34b,
+ /* key: 0x7d04 */ 0x4c73,
+ /* key: 0x7d05 */ 0x3948,
+ /* key: 0x7d06 */ 0x647e,
+ /* key: 0x7d07 */ 0xd34c,
+ /* key: 0x7d08 */ 0xd34d,
+ /* key: 0x7d09 */ 0xd34e,
+ /* key: 0x7d0a */ 0x6524,
+ /* key: 0x7d0b */ 0x4c66,
+ /* key: 0x7d0c */ 0xffff,
+ /* key: 0x7d0d */ 0x473c,
+ /* key: 0x7d0e */ 0xffff,
+ /* key: 0x7d0f */ 0xd34f,
+ /* key: 0x7d10 */ 0x4933,
+ /* key: 0x7d11 */ 0xd350,
+ /* key: 0x7d12 */ 0xd351,
+ /* key: 0x7d13 */ 0xd352,
+ /* key: 0x7d14 */ 0x3d63,
+ /* key: 0x7d15 */ 0x6523,
+ /* key: 0x7d16 */ 0xd353,
+ /* key: 0x7d17 */ 0x3c53,
+ /* key: 0x7d18 */ 0x3949,
+ /* key: 0x7d19 */ 0x3b66,
+ /* key: 0x7d1a */ 0x3569,
+ /* key: 0x7d1b */ 0x4a36,
+ /* key: 0x7d1c */ 0x6522,
+ /* key: 0x7d1d */ 0xd354,
+ /* key: 0x7d1e */ 0xd355,
+ /* key: 0x7d1f */ 0xffff,
+ /* key: 0x7d20 */ 0x4147,
+ /* key: 0x7d21 */ 0x4b42,
+ /* key: 0x7d22 */ 0x3a77,
+ /* key: 0x7d23 */ 0xd356,
+ /* key: 0x7d24 */ 0xffff,
+ /* key: 0x7d25 */ 0xffff,
+ /* key: 0x7d26 */ 0xd357,
+ /* key: 0x7d27 */ 0xffff,
+ /* key: 0x7d28 */ 0xffff,
+ /* key: 0x7d29 */ 0xffff,
+ /* key: 0x7d2a */ 0xd358,
+ /* key: 0x7d2b */ 0x3b67,
+ /* key: 0x7d2c */ 0x445d,
+ /* key: 0x7d2d */ 0xd359,
+ /* key: 0x7d2e */ 0x6527,
+ /* key: 0x7d2f */ 0x4e5f,
+ /* key: 0x7d30 */ 0x3a59,
+ /* key: 0x7d31 */ 0xd35a,
+ /* key: 0x7d32 */ 0x6528,
+ /* key: 0x7d33 */ 0x3f42,
+ /* key: 0x7d34 */ 0xffff,
+ /* key: 0x7d35 */ 0x652a,
+ /* key: 0x7d36 */ 0xffff,
+ /* key: 0x7d37 */ 0xffff,
+ /* key: 0x7d38 */ 0xffff,
+ /* key: 0x7d39 */ 0x3e52,
+ /* key: 0x7d3a */ 0x3a30,
+ /* key: 0x7d3b */ 0xffff,
+ /* key: 0x7d3c */ 0xd35b,
+ /* key: 0x7d3d */ 0xd35c,
+ /* key: 0x7d3e */ 0xd35d,
+ /* key: 0x7d3f */ 0x6529,
+ /* key: 0x7d40 */ 0xd35e,
+ /* key: 0x7d41 */ 0xd35f,
+ /* key: 0x7d42 */ 0x3d2a,
+ /* key: 0x7d43 */ 0x383e,
+ /* key: 0x7d44 */ 0x4148,
+ /* key: 0x7d45 */ 0x6525,
+ /* key: 0x7d46 */ 0x652b,
+ /* key: 0x7d47 */ 0xd360,
+ /* key: 0x7d48 */ 0xd361,
+ /* key: 0x7d49 */ 0xffff,
+ /* key: 0x7d4a */ 0xffff,
+ /* key: 0x7d4b */ 0x6526,
+ /* key: 0x7d4c */ 0x3750,
+ /* key: 0x7d4d */ 0xd362,
+ /* key: 0x7d4e */ 0x652e,
+ /* key: 0x7d4f */ 0x6532,
+ /* key: 0x7d50 */ 0x376b,
+ /* key: 0x7d51 */ 0xd363,
+ /* key: 0x7d52 */ 0xffff,
+ /* key: 0x7d53 */ 0xd364,
+ /* key: 0x7d54 */ 0xffff,
+ /* key: 0x7d55 */ 0xffff,
+ /* key: 0x7d56 */ 0x652d,
+ /* key: 0x7d57 */ 0xd365,
+ /* key: 0x7d58 */ 0xffff,
+ /* key: 0x7d59 */ 0xd366,
+ /* key: 0x7d5a */ 0xd367,
+ /* key: 0x7d5b */ 0x6536,
+ /* key: 0x7d5c */ 0xd368,
+ /* key: 0x7d5d */ 0xd369,
+ /* key: 0x7d5e */ 0x394a,
+ /* key: 0x7d5f */ 0xffff,
+ /* key: 0x7d60 */ 0xffff,
+ /* key: 0x7d61 */ 0x4d6d,
+ /* key: 0x7d62 */ 0x303c,
+ /* key: 0x7d63 */ 0x6533,
+ /* key: 0x7d64 */ 0xffff,
+ /* key: 0x7d65 */ 0xd36a,
+ /* key: 0x7d66 */ 0x356b,
+ /* key: 0x7d67 */ 0xd36b,
+ /* key: 0x7d68 */ 0x6530,
+ /* key: 0x7d69 */ 0xffff,
+ /* key: 0x7d6a */ 0xd36c,
+ /* key: 0x7d6b */ 0xffff,
+ /* key: 0x7d6c */ 0xffff,
+ /* key: 0x7d6d */ 0xffff,
+ /* key: 0x7d6e */ 0x6531,
+ /* key: 0x7d6f */ 0xffff,
+ /* key: 0x7d70 */ 0xd36d,
+ /* key: 0x7d71 */ 0x457d,
+ /* key: 0x7d72 */ 0x652f,
+ /* key: 0x7d73 */ 0x652c,
+ /* key: 0x7d74 */ 0xffff,
+ /* key: 0x7d75 */ 0x3328,
+ /* key: 0x7d76 */ 0x4064,
+ /* key: 0x7d77 */ 0xffff,
+ /* key: 0x7d78 */ 0xd36e,
+ /* key: 0x7d79 */ 0x3828,
+ /* key: 0x7d7a */ 0xd36f,
+ /* key: 0x7d7b */ 0xd370,
+ /* key: 0x7d7c */ 0xffff,
+ /* key: 0x7d7d */ 0x6538,
+ /* key: 0x7d7e */ 0xffff,
+ /* key: 0x7d7f */ 0xd371,
+ /* key: 0x7d80 */ 0xffff,
+ /* key: 0x7d81 */ 0xd372,
+ /* key: 0x7d82 */ 0xd373,
+ /* key: 0x7d83 */ 0xd374,
+ /* key: 0x7d84 */ 0xffff,
+ /* key: 0x7d85 */ 0xd375,
+ /* key: 0x7d86 */ 0xd376,
+ /* key: 0x7d87 */ 0xffff,
+ /* key: 0x7d88 */ 0xd377,
+ /* key: 0x7d89 */ 0x6535,
+ /* key: 0x7d8a */ 0xffff,
+ /* key: 0x7d8b */ 0xd378,
+ /* key: 0x7d8c */ 0xd379,
+ /* key: 0x7d8d */ 0xd37a,
+ /* key: 0x7d8e */ 0xffff,
+ /* key: 0x7d8f */ 0x6537,
+ /* key: 0x7d90 */ 0xffff,
+ /* key: 0x7d91 */ 0xd37b,
+ /* key: 0x7d92 */ 0xffff,
+ /* key: 0x7d93 */ 0x6534,
+ /* key: 0x7d94 */ 0xffff,
+ /* key: 0x7d95 */ 0xffff,
+ /* key: 0x7d96 */ 0xd37c,
+ /* key: 0x7d97 */ 0xd37d,
+ /* key: 0x7d98 */ 0xffff,
+ /* key: 0x7d99 */ 0x3751,
+ /* key: 0x7d9a */ 0x4233,
+ /* key: 0x7d9b */ 0x6539,
+ /* key: 0x7d9c */ 0x416e,
+ /* key: 0x7d9d */ 0xd37e,
+ /* key: 0x7d9e */ 0xd421,
+ /* key: 0x7d9f */ 0x6546,
+ /* key: 0x7da0 */ 0xffff,
+ /* key: 0x7da1 */ 0xffff,
+ /* key: 0x7da2 */ 0x6542,
+ /* key: 0x7da3 */ 0x653c,
+ /* key: 0x7da4 */ 0xffff,
+ /* key: 0x7da5 */ 0xffff,
+ /* key: 0x7da6 */ 0xd422,
+ /* key: 0x7da7 */ 0xd423,
+ /* key: 0x7da8 */ 0xffff,
+ /* key: 0x7da9 */ 0xffff,
+ /* key: 0x7daa */ 0xd424,
+ /* key: 0x7dab */ 0x6540,
+ /* key: 0x7dac */ 0x3c7a,
+ /* key: 0x7dad */ 0x305d,
+ /* key: 0x7dae */ 0x653b,
+ /* key: 0x7daf */ 0x6543,
+ /* key: 0x7db0 */ 0x6547,
+ /* key: 0x7db1 */ 0x394b,
+ /* key: 0x7db2 */ 0x4c56,
+ /* key: 0x7db3 */ 0xd425,
+ /* key: 0x7db4 */ 0x4456,
+ /* key: 0x7db5 */ 0x653d,
+ /* key: 0x7db6 */ 0xd426,
+ /* key: 0x7db7 */ 0xd427,
+ /* key: 0x7db8 */ 0x6545,
+ /* key: 0x7db9 */ 0xd428,
+ /* key: 0x7dba */ 0x653a,
+ /* key: 0x7dbb */ 0x433e,
+ /* key: 0x7dbc */ 0xffff,
+ /* key: 0x7dbd */ 0x653f,
+ /* key: 0x7dbe */ 0x303d,
+ /* key: 0x7dbf */ 0x4c4a,
+ /* key: 0x7dc0 */ 0xffff,
+ /* key: 0x7dc1 */ 0xffff,
+ /* key: 0x7dc2 */ 0xd429,
+ /* key: 0x7dc3 */ 0xd42a,
+ /* key: 0x7dc4 */ 0xd42b,
+ /* key: 0x7dc5 */ 0xd42c,
+ /* key: 0x7dc6 */ 0xd42d,
+ /* key: 0x7dc7 */ 0x653e,
+ /* key: 0x7dc8 */ 0xffff,
+ /* key: 0x7dc9 */ 0xffff,
+ /* key: 0x7dca */ 0x365b,
+ /* key: 0x7dcb */ 0x486c,
+ /* key: 0x7dcc */ 0xd42e,
+ /* key: 0x7dcd */ 0xd42f,
+ /* key: 0x7dce */ 0xd430,
+ /* key: 0x7dcf */ 0x416d,
+ /* key: 0x7dd0 */ 0xffff,
+ /* key: 0x7dd1 */ 0x4e50,
+ /* key: 0x7dd2 */ 0x3d6f,
+ /* key: 0x7dd3 */ 0xffff,
+ /* key: 0x7dd4 */ 0xffff,
+ /* key: 0x7dd5 */ 0x656e,
+ /* key: 0x7dd6 */ 0xffff,
+ /* key: 0x7dd7 */ 0xd431,
+ /* key: 0x7dd8 */ 0x6548,
+ /* key: 0x7dd9 */ 0xd432,
+ /* key: 0x7dda */ 0x407e,
+ /* key: 0x7ddb */ 0xffff,
+ /* key: 0x7ddc */ 0x6544,
+ /* key: 0x7ddd */ 0x6549,
+ /* key: 0x7dde */ 0x654b,
+ /* key: 0x7ddf */ 0xffff,
+ /* key: 0x7de0 */ 0x4479,
+ /* key: 0x7de1 */ 0x654e,
+ /* key: 0x7de2 */ 0xd434,
+ /* key: 0x7de3 */ 0xffff,
+ /* key: 0x7de4 */ 0x654a,
+ /* key: 0x7de5 */ 0xd435,
+ /* key: 0x7de6 */ 0xd436,
+ /* key: 0x7de7 */ 0xffff,
+ /* key: 0x7de8 */ 0x4a54,
+ /* key: 0x7de9 */ 0x344b,
+ /* key: 0x7dea */ 0xd437,
+ /* key: 0x7deb */ 0xd438,
+ /* key: 0x7dec */ 0x4c4b,
+ /* key: 0x7ded */ 0xd439,
+ /* key: 0x7dee */ 0xffff,
+ /* key: 0x7def */ 0x305e,
+ /* key: 0x7df0 */ 0xffff,
+ /* key: 0x7df1 */ 0xd43a,
+ /* key: 0x7df2 */ 0x654d,
+ /* key: 0x7df3 */ 0xffff,
+ /* key: 0x7df4 */ 0x4e7d,
+ /* key: 0x7df5 */ 0xd43b,
+ /* key: 0x7df6 */ 0xd43c,
+ /* key: 0x7df7 */ 0xffff,
+ /* key: 0x7df8 */ 0xffff,
+ /* key: 0x7df9 */ 0xd43d,
+ /* key: 0x7dfa */ 0xd43e,
+ /* key: 0x7dfb */ 0x654c,
+ /* key: 0x7dfc */ 0xffff,
+ /* key: 0x7dfd */ 0xffff,
+ /* key: 0x7dfe */ 0xffff,
+ /* key: 0x7dff */ 0xffff,
+ /* branch: 0x7e0X */ 14688,
+ /* branch: 0x7e1X */ 14704,
+ /* branch: 0x7e2X */ 14720,
+ /* branch: 0x7e3X */ 14736,
+ /* branch: 0x7e4X */ 14752,
+ /* branch: 0x7e5X */ 14768,
+ /* branch: 0x7e6X */ 14784,
+ /* branch: 0x7e7X */ 14800,
+ /* branch: 0x7e8X */ 14816,
+ /* branch: 0x7e9X */ 14832,
+ /* branch: 0x7eaX */ 0,
+ /* branch: 0x7ebX */ 0,
+ /* branch: 0x7ecX */ 0,
+ /* branch: 0x7edX */ 0,
+ /* branch: 0x7eeX */ 0,
+ /* branch: 0x7efX */ 0,
+ /* key: 0x7e00 */ 0xd433,
+ /* key: 0x7e01 */ 0x316f,
+ /* key: 0x7e02 */ 0xffff,
+ /* key: 0x7e03 */ 0xffff,
+ /* key: 0x7e04 */ 0x466c,
+ /* key: 0x7e05 */ 0x654f,
+ /* key: 0x7e06 */ 0xffff,
+ /* key: 0x7e07 */ 0xffff,
+ /* key: 0x7e08 */ 0xd43f,
+ /* key: 0x7e09 */ 0x6556,
+ /* key: 0x7e0a */ 0x6550,
+ /* key: 0x7e0b */ 0x6557,
+ /* key: 0x7e0c */ 0xffff,
+ /* key: 0x7e0d */ 0xffff,
+ /* key: 0x7e0e */ 0xffff,
+ /* key: 0x7e0f */ 0xffff,
+ /* key: 0x7e10 */ 0xd440,
+ /* key: 0x7e11 */ 0xd441,
+ /* key: 0x7e12 */ 0x6553,
+ /* key: 0x7e13 */ 0xffff,
+ /* key: 0x7e14 */ 0xffff,
+ /* key: 0x7e15 */ 0xd442,
+ /* key: 0x7e16 */ 0xffff,
+ /* key: 0x7e17 */ 0xd443,
+ /* key: 0x7e18 */ 0xffff,
+ /* key: 0x7e19 */ 0xffff,
+ /* key: 0x7e1a */ 0xffff,
+ /* key: 0x7e1b */ 0x477b,
+ /* key: 0x7e1c */ 0xd444,
+ /* key: 0x7e1d */ 0xd445,
+ /* key: 0x7e1e */ 0x3c4a,
+ /* key: 0x7e1f */ 0x6555,
+ /* key: 0x7e20 */ 0xd446,
+ /* key: 0x7e21 */ 0x6552,
+ /* key: 0x7e22 */ 0x6558,
+ /* key: 0x7e23 */ 0x6551,
+ /* key: 0x7e24 */ 0xffff,
+ /* key: 0x7e25 */ 0xffff,
+ /* key: 0x7e26 */ 0x3d44,
+ /* key: 0x7e27 */ 0xd447,
+ /* key: 0x7e28 */ 0xd448,
+ /* key: 0x7e29 */ 0xffff,
+ /* key: 0x7e2a */ 0xffff,
+ /* key: 0x7e2b */ 0x4b25,
+ /* key: 0x7e2c */ 0xd449,
+ /* key: 0x7e2d */ 0xd44a,
+ /* key: 0x7e2e */ 0x3d4c,
+ /* key: 0x7e2f */ 0xd44b,
+ /* key: 0x7e30 */ 0xffff,
+ /* key: 0x7e31 */ 0x6554,
+ /* key: 0x7e32 */ 0x6560,
+ /* key: 0x7e33 */ 0xd44c,
+ /* key: 0x7e34 */ 0xffff,
+ /* key: 0x7e35 */ 0x655c,
+ /* key: 0x7e36 */ 0xd44d,
+ /* key: 0x7e37 */ 0x655f,
+ /* key: 0x7e38 */ 0xffff,
+ /* key: 0x7e39 */ 0x655d,
+ /* key: 0x7e3a */ 0x6561,
+ /* key: 0x7e3b */ 0x655b,
+ /* key: 0x7e3c */ 0xffff,
+ /* key: 0x7e3d */ 0x6541,
+ /* key: 0x7e3e */ 0x4053,
+ /* key: 0x7e3f */ 0xd44e,
+ /* key: 0x7e40 */ 0xffff,
+ /* key: 0x7e41 */ 0x484b,
+ /* key: 0x7e42 */ 0xffff,
+ /* key: 0x7e43 */ 0x655e,
+ /* key: 0x7e44 */ 0xd44f,
+ /* key: 0x7e45 */ 0xd450,
+ /* key: 0x7e46 */ 0x6559,
+ /* key: 0x7e47 */ 0xd451,
+ /* key: 0x7e48 */ 0xffff,
+ /* key: 0x7e49 */ 0xffff,
+ /* key: 0x7e4a */ 0x4121,
+ /* key: 0x7e4b */ 0x3752,
+ /* key: 0x7e4c */ 0xffff,
+ /* key: 0x7e4d */ 0x3d2b,
+ /* key: 0x7e4e */ 0xd452,
+ /* key: 0x7e4f */ 0xffff,
+ /* key: 0x7e50 */ 0xd453,
+ /* key: 0x7e51 */ 0xffff,
+ /* key: 0x7e52 */ 0xd454,
+ /* key: 0x7e53 */ 0xffff,
+ /* key: 0x7e54 */ 0x3f25,
+ /* key: 0x7e55 */ 0x4136,
+ /* key: 0x7e56 */ 0x6564,
+ /* key: 0x7e57 */ 0xffff,
+ /* key: 0x7e58 */ 0xd455,
+ /* key: 0x7e59 */ 0x6566,
+ /* key: 0x7e5a */ 0x6567,
+ /* key: 0x7e5b */ 0xffff,
+ /* key: 0x7e5c */ 0xffff,
+ /* key: 0x7e5d */ 0x6563,
+ /* key: 0x7e5e */ 0x6565,
+ /* key: 0x7e5f */ 0xd456,
+ /* key: 0x7e60 */ 0xffff,
+ /* key: 0x7e61 */ 0xd457,
+ /* key: 0x7e62 */ 0xd458,
+ /* key: 0x7e63 */ 0xffff,
+ /* key: 0x7e64 */ 0xffff,
+ /* key: 0x7e65 */ 0xd459,
+ /* key: 0x7e66 */ 0x655a,
+ /* key: 0x7e67 */ 0x6562,
+ /* key: 0x7e68 */ 0xffff,
+ /* key: 0x7e69 */ 0x656a,
+ /* key: 0x7e6a */ 0x6569,
+ /* key: 0x7e6b */ 0xd45a,
+ /* key: 0x7e6c */ 0xffff,
+ /* key: 0x7e6d */ 0x4b7a,
+ /* key: 0x7e6e */ 0xd45b,
+ /* key: 0x7e6f */ 0xd45c,
+ /* key: 0x7e70 */ 0x372b,
+ /* key: 0x7e71 */ 0xffff,
+ /* key: 0x7e72 */ 0xffff,
+ /* key: 0x7e73 */ 0xd45d,
+ /* key: 0x7e74 */ 0xffff,
+ /* key: 0x7e75 */ 0xffff,
+ /* key: 0x7e76 */ 0xffff,
+ /* key: 0x7e77 */ 0xffff,
+ /* key: 0x7e78 */ 0xd45e,
+ /* key: 0x7e79 */ 0x6568,
+ /* key: 0x7e7a */ 0xffff,
+ /* key: 0x7e7b */ 0x656c,
+ /* key: 0x7e7c */ 0x656b,
+ /* key: 0x7e7d */ 0x656f,
+ /* key: 0x7e7e */ 0xd45f,
+ /* key: 0x7e7f */ 0x6571,
+ /* key: 0x7e80 */ 0xffff,
+ /* key: 0x7e81 */ 0xd460,
+ /* key: 0x7e82 */ 0x3b3c,
+ /* key: 0x7e83 */ 0x656d,
+ /* key: 0x7e84 */ 0xffff,
+ /* key: 0x7e85 */ 0xffff,
+ /* key: 0x7e86 */ 0xd461,
+ /* key: 0x7e87 */ 0xd462,
+ /* key: 0x7e88 */ 0x6572,
+ /* key: 0x7e89 */ 0x6573,
+ /* key: 0x7e8a */ 0xd463,
+ /* key: 0x7e8b */ 0xffff,
+ /* key: 0x7e8c */ 0x6574,
+ /* key: 0x7e8d */ 0xd464,
+ /* key: 0x7e8e */ 0x657a,
+ /* key: 0x7e8f */ 0x453b,
+ /* key: 0x7e90 */ 0x6576,
+ /* key: 0x7e91 */ 0xd465,
+ /* key: 0x7e92 */ 0x6575,
+ /* key: 0x7e93 */ 0x6577,
+ /* key: 0x7e94 */ 0x6578,
+ /* key: 0x7e95 */ 0xd466,
+ /* key: 0x7e96 */ 0x6579,
+ /* key: 0x7e97 */ 0xffff,
+ /* key: 0x7e98 */ 0xd467,
+ /* key: 0x7e99 */ 0xffff,
+ /* key: 0x7e9a */ 0xd468,
+ /* key: 0x7e9b */ 0x657b,
+ /* key: 0x7e9c */ 0x657c,
+ /* key: 0x7e9d */ 0xd469,
+ /* key: 0x7e9e */ 0xd46a,
+ /* key: 0x7e9f */ 0xffff,
+ /* branch: 0x7f0X */ 0,
+ /* branch: 0x7f1X */ 0,
+ /* branch: 0x7f2X */ 0,
+ /* branch: 0x7f3X */ 14864,
+ /* branch: 0x7f4X */ 14880,
+ /* branch: 0x7f5X */ 14896,
+ /* branch: 0x7f6X */ 14912,
+ /* branch: 0x7f7X */ 14928,
+ /* branch: 0x7f8X */ 14944,
+ /* branch: 0x7f9X */ 14960,
+ /* branch: 0x7faX */ 14976,
+ /* branch: 0x7fbX */ 14992,
+ /* branch: 0x7fcX */ 15008,
+ /* branch: 0x7fdX */ 15024,
+ /* branch: 0x7feX */ 15040,
+ /* branch: 0x7ffX */ 15056,
+ /* key: 0x7f30 */ 0xffff,
+ /* key: 0x7f31 */ 0xffff,
+ /* key: 0x7f32 */ 0xffff,
+ /* key: 0x7f33 */ 0xffff,
+ /* key: 0x7f34 */ 0xffff,
+ /* key: 0x7f35 */ 0xffff,
+ /* key: 0x7f36 */ 0x344c,
+ /* key: 0x7f37 */ 0xffff,
+ /* key: 0x7f38 */ 0x657d,
+ /* key: 0x7f39 */ 0xffff,
+ /* key: 0x7f3a */ 0x657e,
+ /* key: 0x7f3b */ 0xd46c,
+ /* key: 0x7f3c */ 0xd46b,
+ /* key: 0x7f3d */ 0xd46d,
+ /* key: 0x7f3e */ 0xd46e,
+ /* key: 0x7f3f */ 0xd46f,
+ /* key: 0x7f40 */ 0xffff,
+ /* key: 0x7f41 */ 0xffff,
+ /* key: 0x7f42 */ 0xffff,
+ /* key: 0x7f43 */ 0xd470,
+ /* key: 0x7f44 */ 0xd471,
+ /* key: 0x7f45 */ 0x6621,
+ /* key: 0x7f46 */ 0xffff,
+ /* key: 0x7f47 */ 0xd472,
+ /* key: 0x7f48 */ 0xffff,
+ /* key: 0x7f49 */ 0xffff,
+ /* key: 0x7f4a */ 0xffff,
+ /* key: 0x7f4b */ 0xffff,
+ /* key: 0x7f4c */ 0x6622,
+ /* key: 0x7f4d */ 0x6623,
+ /* key: 0x7f4e */ 0x6624,
+ /* key: 0x7f4f */ 0xd473,
+ /* key: 0x7f50 */ 0x6625,
+ /* key: 0x7f51 */ 0x6626,
+ /* key: 0x7f52 */ 0xd474,
+ /* key: 0x7f53 */ 0xd475,
+ /* key: 0x7f54 */ 0x6628,
+ /* key: 0x7f55 */ 0x6627,
+ /* key: 0x7f56 */ 0xffff,
+ /* key: 0x7f57 */ 0xffff,
+ /* key: 0x7f58 */ 0x6629,
+ /* key: 0x7f59 */ 0xffff,
+ /* key: 0x7f5a */ 0xffff,
+ /* key: 0x7f5b */ 0xd476,
+ /* key: 0x7f5c */ 0xd477,
+ /* key: 0x7f5d */ 0xd478,
+ /* key: 0x7f5e */ 0xffff,
+ /* key: 0x7f5f */ 0x662a,
+ /* key: 0x7f60 */ 0x662b,
+ /* key: 0x7f61 */ 0xd479,
+ /* key: 0x7f62 */ 0xffff,
+ /* key: 0x7f63 */ 0xd47a,
+ /* key: 0x7f64 */ 0xd47b,
+ /* key: 0x7f65 */ 0xd47c,
+ /* key: 0x7f66 */ 0xd47d,
+ /* key: 0x7f67 */ 0x662e,
+ /* key: 0x7f68 */ 0x662c,
+ /* key: 0x7f69 */ 0x662d,
+ /* key: 0x7f6a */ 0x3a61,
+ /* key: 0x7f6b */ 0x3753,
+ /* key: 0x7f6c */ 0xffff,
+ /* key: 0x7f6d */ 0xd47e,
+ /* key: 0x7f6e */ 0x4356,
+ /* key: 0x7f6f */ 0xffff,
+ /* key: 0x7f70 */ 0x4833,
+ /* key: 0x7f71 */ 0xd521,
+ /* key: 0x7f72 */ 0x3d70,
+ /* key: 0x7f73 */ 0xffff,
+ /* key: 0x7f74 */ 0xffff,
+ /* key: 0x7f75 */ 0x474d,
+ /* key: 0x7f76 */ 0xffff,
+ /* key: 0x7f77 */ 0x486d,
+ /* key: 0x7f78 */ 0x662f,
+ /* key: 0x7f79 */ 0x586d,
+ /* key: 0x7f7a */ 0xffff,
+ /* key: 0x7f7b */ 0xffff,
+ /* key: 0x7f7c */ 0xffff,
+ /* key: 0x7f7d */ 0xd522,
+ /* key: 0x7f7e */ 0xd523,
+ /* key: 0x7f7f */ 0xd524,
+ /* key: 0x7f80 */ 0xd525,
+ /* key: 0x7f81 */ 0xffff,
+ /* key: 0x7f82 */ 0x6630,
+ /* key: 0x7f83 */ 0x6632,
+ /* key: 0x7f84 */ 0xffff,
+ /* key: 0x7f85 */ 0x4d65,
+ /* key: 0x7f86 */ 0x6631,
+ /* key: 0x7f87 */ 0x6634,
+ /* key: 0x7f88 */ 0x6633,
+ /* key: 0x7f89 */ 0xffff,
+ /* key: 0x7f8a */ 0x4d53,
+ /* key: 0x7f8b */ 0xd526,
+ /* key: 0x7f8c */ 0x6635,
+ /* key: 0x7f8d */ 0xd527,
+ /* key: 0x7f8e */ 0x487e,
+ /* key: 0x7f8f */ 0xd528,
+ /* key: 0x7f90 */ 0xd529,
+ /* key: 0x7f91 */ 0xd52a,
+ /* key: 0x7f92 */ 0xffff,
+ /* key: 0x7f93 */ 0xffff,
+ /* key: 0x7f94 */ 0x6636,
+ /* key: 0x7f95 */ 0xffff,
+ /* key: 0x7f96 */ 0xd52b,
+ /* key: 0x7f97 */ 0xd52c,
+ /* key: 0x7f98 */ 0xffff,
+ /* key: 0x7f99 */ 0xffff,
+ /* key: 0x7f9a */ 0x6639,
+ /* key: 0x7f9b */ 0xffff,
+ /* key: 0x7f9c */ 0xd52d,
+ /* key: 0x7f9d */ 0x6638,
+ /* key: 0x7f9e */ 0x6637,
+ /* key: 0x7f9f */ 0xffff,
+ /* key: 0x7fa0 */ 0xffff,
+ /* key: 0x7fa1 */ 0xd52e,
+ /* key: 0x7fa2 */ 0xd52f,
+ /* key: 0x7fa3 */ 0x663a,
+ /* key: 0x7fa4 */ 0x3732,
+ /* key: 0x7fa5 */ 0xffff,
+ /* key: 0x7fa6 */ 0xd530,
+ /* key: 0x7fa7 */ 0xffff,
+ /* key: 0x7fa8 */ 0x4122,
+ /* key: 0x7fa9 */ 0x3541,
+ /* key: 0x7faa */ 0xd531,
+ /* key: 0x7fab */ 0xffff,
+ /* key: 0x7fac */ 0xffff,
+ /* key: 0x7fad */ 0xd532,
+ /* key: 0x7fae */ 0x663e,
+ /* key: 0x7faf */ 0x663b,
+ /* key: 0x7fb0 */ 0xffff,
+ /* key: 0x7fb1 */ 0xffff,
+ /* key: 0x7fb2 */ 0x663c,
+ /* key: 0x7fb3 */ 0xffff,
+ /* key: 0x7fb4 */ 0xd533,
+ /* key: 0x7fb5 */ 0xffff,
+ /* key: 0x7fb6 */ 0x663f,
+ /* key: 0x7fb7 */ 0xffff,
+ /* key: 0x7fb8 */ 0x6640,
+ /* key: 0x7fb9 */ 0x663d,
+ /* key: 0x7fba */ 0xffff,
+ /* key: 0x7fbb */ 0xffff,
+ /* key: 0x7fbc */ 0xd534,
+ /* key: 0x7fbd */ 0x3129,
+ /* key: 0x7fbe */ 0xffff,
+ /* key: 0x7fbf */ 0xd535,
+ /* key: 0x7fc0 */ 0xd536,
+ /* key: 0x7fc1 */ 0x3227,
+ /* key: 0x7fc2 */ 0xffff,
+ /* key: 0x7fc3 */ 0xd537,
+ /* key: 0x7fc4 */ 0xffff,
+ /* key: 0x7fc5 */ 0x6642,
+ /* key: 0x7fc6 */ 0x6643,
+ /* key: 0x7fc7 */ 0xffff,
+ /* key: 0x7fc8 */ 0xd538,
+ /* key: 0x7fc9 */ 0xffff,
+ /* key: 0x7fca */ 0x6644,
+ /* key: 0x7fcb */ 0xffff,
+ /* key: 0x7fcc */ 0x4d62,
+ /* key: 0x7fcd */ 0xffff,
+ /* key: 0x7fce */ 0xd539,
+ /* key: 0x7fcf */ 0xd53a,
+ /* key: 0x7fd0 */ 0xffff,
+ /* key: 0x7fd1 */ 0xffff,
+ /* key: 0x7fd2 */ 0x3d2c,
+ /* key: 0x7fd3 */ 0xffff,
+ /* key: 0x7fd4 */ 0x6646,
+ /* key: 0x7fd5 */ 0x6645,
+ /* key: 0x7fd6 */ 0xffff,
+ /* key: 0x7fd7 */ 0xffff,
+ /* key: 0x7fd8 */ 0xffff,
+ /* key: 0x7fd9 */ 0xffff,
+ /* key: 0x7fda */ 0xffff,
+ /* key: 0x7fdb */ 0xd53b,
+ /* key: 0x7fdc */ 0xffff,
+ /* key: 0x7fdd */ 0xffff,
+ /* key: 0x7fde */ 0xffff,
+ /* key: 0x7fdf */ 0xd53c,
+ /* key: 0x7fe0 */ 0x3f69,
+ /* key: 0x7fe1 */ 0x6647,
+ /* key: 0x7fe2 */ 0xffff,
+ /* key: 0x7fe3 */ 0xd53d,
+ /* key: 0x7fe4 */ 0xffff,
+ /* key: 0x7fe5 */ 0xd53e,
+ /* key: 0x7fe6 */ 0x6648,
+ /* key: 0x7fe7 */ 0xffff,
+ /* key: 0x7fe8 */ 0xd53f,
+ /* key: 0x7fe9 */ 0x6649,
+ /* key: 0x7fea */ 0xffff,
+ /* key: 0x7feb */ 0x3465,
+ /* key: 0x7fec */ 0xd540,
+ /* key: 0x7fed */ 0xffff,
+ /* key: 0x7fee */ 0xd541,
+ /* key: 0x7fef */ 0xd542,
+ /* key: 0x7ff0 */ 0x344d,
+ /* key: 0x7ff1 */ 0xffff,
+ /* key: 0x7ff2 */ 0xd543,
+ /* key: 0x7ff3 */ 0x664a,
+ /* key: 0x7ff4 */ 0xffff,
+ /* key: 0x7ff5 */ 0xffff,
+ /* key: 0x7ff6 */ 0xffff,
+ /* key: 0x7ff7 */ 0xffff,
+ /* key: 0x7ff8 */ 0xffff,
+ /* key: 0x7ff9 */ 0x664b,
+ /* key: 0x7ffa */ 0xd544,
+ /* key: 0x7ffb */ 0x4b5d,
+ /* key: 0x7ffc */ 0x4d63,
+ /* key: 0x7ffd */ 0xd545,
+ /* key: 0x7ffe */ 0xd546,
+ /* key: 0x7fff */ 0xd547,
+ /* branch: 0x80XX */ 15088,
+ /* branch: 0x81XX */ 15360,
+ /* branch: 0x82XX */ 15632,
+ /* branch: 0x83XX */ 15904,
+ /* branch: 0x84XX */ 16160,
+ /* branch: 0x85XX */ 16432,
+ /* branch: 0x86XX */ 16704,
+ /* branch: 0x87XX */ 16976,
+ /* branch: 0x88XX */ 17248,
+ /* branch: 0x89XX */ 17520,
+ /* branch: 0x8aXX */ 17792,
+ /* branch: 0x8bXX */ 18064,
+ /* branch: 0x8cXX */ 18240,
+ /* branch: 0x8dXX */ 18464,
+ /* branch: 0x8eXX */ 18672,
+ /* branch: 0x8fXX */ 18944,
+ /* branch: 0x800X */ 15104,
+ /* branch: 0x801X */ 15120,
+ /* branch: 0x802X */ 15136,
+ /* branch: 0x803X */ 15152,
+ /* branch: 0x804X */ 15168,
+ /* branch: 0x805X */ 15184,
+ /* branch: 0x806X */ 15200,
+ /* branch: 0x807X */ 15216,
+ /* branch: 0x808X */ 15232,
+ /* branch: 0x809X */ 15248,
+ /* branch: 0x80aX */ 15264,
+ /* branch: 0x80bX */ 15280,
+ /* branch: 0x80cX */ 15296,
+ /* branch: 0x80dX */ 15312,
+ /* branch: 0x80eX */ 15328,
+ /* branch: 0x80fX */ 15344,
+ /* key: 0x8000 */ 0x4d54,
+ /* key: 0x8001 */ 0x4f37,
+ /* key: 0x8002 */ 0xffff,
+ /* key: 0x8003 */ 0x394d,
+ /* key: 0x8004 */ 0x664e,
+ /* key: 0x8005 */ 0x3c54,
+ /* key: 0x8006 */ 0x664d,
+ /* key: 0x8007 */ 0xd548,
+ /* key: 0x8008 */ 0xd549,
+ /* key: 0x8009 */ 0xffff,
+ /* key: 0x800a */ 0xd54a,
+ /* key: 0x800b */ 0x664f,
+ /* key: 0x800c */ 0x3c29,
+ /* key: 0x800d */ 0xd54b,
+ /* key: 0x800e */ 0xd54c,
+ /* key: 0x800f */ 0xd54d,
+ /* key: 0x8010 */ 0x4251,
+ /* key: 0x8011 */ 0xd54e,
+ /* key: 0x8012 */ 0x6650,
+ /* key: 0x8013 */ 0xd54f,
+ /* key: 0x8014 */ 0xd550,
+ /* key: 0x8015 */ 0x394c,
+ /* key: 0x8016 */ 0xd551,
+ /* key: 0x8017 */ 0x4c57,
+ /* key: 0x8018 */ 0x6651,
+ /* key: 0x8019 */ 0x6652,
+ /* key: 0x801a */ 0xffff,
+ /* key: 0x801b */ 0xffff,
+ /* key: 0x801c */ 0x6653,
+ /* key: 0x801d */ 0xd552,
+ /* key: 0x801e */ 0xd553,
+ /* key: 0x801f */ 0xd554,
+ /* key: 0x8020 */ 0xd555,
+ /* key: 0x8021 */ 0x6654,
+ /* key: 0x8022 */ 0xffff,
+ /* key: 0x8023 */ 0xffff,
+ /* key: 0x8024 */ 0xd556,
+ /* key: 0x8025 */ 0xffff,
+ /* key: 0x8026 */ 0xd557,
+ /* key: 0x8027 */ 0xffff,
+ /* key: 0x8028 */ 0x6655,
+ /* key: 0x8029 */ 0xffff,
+ /* key: 0x802a */ 0xffff,
+ /* key: 0x802b */ 0xffff,
+ /* key: 0x802c */ 0xd558,
+ /* key: 0x802d */ 0xffff,
+ /* key: 0x802e */ 0xd559,
+ /* key: 0x802f */ 0xffff,
+ /* key: 0x8030 */ 0xd55a,
+ /* key: 0x8031 */ 0xffff,
+ /* key: 0x8032 */ 0xffff,
+ /* key: 0x8033 */ 0x3c2a,
+ /* key: 0x8034 */ 0xd55b,
+ /* key: 0x8035 */ 0xd55c,
+ /* key: 0x8036 */ 0x4c6d,
+ /* key: 0x8037 */ 0xd55d,
+ /* key: 0x8038 */ 0xffff,
+ /* key: 0x8039 */ 0xd55e,
+ /* key: 0x803a */ 0xd55f,
+ /* key: 0x803b */ 0x6657,
+ /* key: 0x803c */ 0xd560,
+ /* key: 0x803d */ 0x433f,
+ /* key: 0x803e */ 0xd561,
+ /* key: 0x803f */ 0x6656,
+ /* key: 0x8040 */ 0xd562,
+ /* key: 0x8041 */ 0xffff,
+ /* key: 0x8042 */ 0xffff,
+ /* key: 0x8043 */ 0xffff,
+ /* key: 0x8044 */ 0xd563,
+ /* key: 0x8045 */ 0xffff,
+ /* key: 0x8046 */ 0x6659,
+ /* key: 0x8047 */ 0xffff,
+ /* key: 0x8048 */ 0xffff,
+ /* key: 0x8049 */ 0xffff,
+ /* key: 0x804a */ 0x6658,
+ /* key: 0x804b */ 0xffff,
+ /* key: 0x804c */ 0xffff,
+ /* key: 0x804d */ 0xffff,
+ /* key: 0x804e */ 0xffff,
+ /* key: 0x804f */ 0xffff,
+ /* key: 0x8050 */ 0xffff,
+ /* key: 0x8051 */ 0xffff,
+ /* key: 0x8052 */ 0x665a,
+ /* key: 0x8053 */ 0xffff,
+ /* key: 0x8054 */ 0xffff,
+ /* key: 0x8055 */ 0xffff,
+ /* key: 0x8056 */ 0x403b,
+ /* key: 0x8057 */ 0xffff,
+ /* key: 0x8058 */ 0x665b,
+ /* key: 0x8059 */ 0xffff,
+ /* key: 0x805a */ 0x665c,
+ /* key: 0x805b */ 0xffff,
+ /* key: 0x805c */ 0xffff,
+ /* key: 0x805d */ 0xffff,
+ /* key: 0x805e */ 0x4a39,
+ /* key: 0x805f */ 0x665d,
+ /* key: 0x8060 */ 0xd564,
+ /* key: 0x8061 */ 0x416f,
+ /* key: 0x8062 */ 0x665e,
+ /* key: 0x8063 */ 0xffff,
+ /* key: 0x8064 */ 0xd565,
+ /* key: 0x8065 */ 0xffff,
+ /* key: 0x8066 */ 0xd566,
+ /* key: 0x8067 */ 0xffff,
+ /* key: 0x8068 */ 0x665f,
+ /* key: 0x8069 */ 0xffff,
+ /* key: 0x806a */ 0xffff,
+ /* key: 0x806b */ 0xffff,
+ /* key: 0x806c */ 0xffff,
+ /* key: 0x806d */ 0xd567,
+ /* key: 0x806e */ 0xffff,
+ /* key: 0x806f */ 0x4e7e,
+ /* key: 0x8070 */ 0x6662,
+ /* key: 0x8071 */ 0xd568,
+ /* key: 0x8072 */ 0x6661,
+ /* key: 0x8073 */ 0x6660,
+ /* key: 0x8074 */ 0x4430,
+ /* key: 0x8075 */ 0xd569,
+ /* key: 0x8076 */ 0x6663,
+ /* key: 0x8077 */ 0x3f26,
+ /* key: 0x8078 */ 0xffff,
+ /* key: 0x8079 */ 0x6664,
+ /* key: 0x807a */ 0xffff,
+ /* key: 0x807b */ 0xffff,
+ /* key: 0x807c */ 0xffff,
+ /* key: 0x807d */ 0x6665,
+ /* key: 0x807e */ 0x4f38,
+ /* key: 0x807f */ 0x6666,
+ /* key: 0x8080 */ 0xffff,
+ /* key: 0x8081 */ 0xd56a,
+ /* key: 0x8082 */ 0xffff,
+ /* key: 0x8083 */ 0xffff,
+ /* key: 0x8084 */ 0x6667,
+ /* key: 0x8085 */ 0x6669,
+ /* key: 0x8086 */ 0x6668,
+ /* key: 0x8087 */ 0x4825,
+ /* key: 0x8088 */ 0xd56b,
+ /* key: 0x8089 */ 0x4679,
+ /* key: 0x808a */ 0xffff,
+ /* key: 0x808b */ 0x4f3e,
+ /* key: 0x808c */ 0x4829,
+ /* key: 0x808d */ 0xffff,
+ /* key: 0x808e */ 0xd56c,
+ /* key: 0x808f */ 0xffff,
+ /* key: 0x8090 */ 0xffff,
+ /* key: 0x8091 */ 0xffff,
+ /* key: 0x8092 */ 0xffff,
+ /* key: 0x8093 */ 0x666b,
+ /* key: 0x8094 */ 0xffff,
+ /* key: 0x8095 */ 0xffff,
+ /* key: 0x8096 */ 0x3e53,
+ /* key: 0x8097 */ 0xffff,
+ /* key: 0x8098 */ 0x492a,
+ /* key: 0x8099 */ 0xffff,
+ /* key: 0x809a */ 0x666c,
+ /* key: 0x809b */ 0x666a,
+ /* key: 0x809c */ 0xd56d,
+ /* key: 0x809d */ 0x344e,
+ /* key: 0x809e */ 0xd56e,
+ /* key: 0x809f */ 0xffff,
+ /* key: 0x80a0 */ 0xffff,
+ /* key: 0x80a1 */ 0x3854,
+ /* key: 0x80a2 */ 0x3b68,
+ /* key: 0x80a3 */ 0xffff,
+ /* key: 0x80a4 */ 0xffff,
+ /* key: 0x80a5 */ 0x486e,
+ /* key: 0x80a6 */ 0xd56f,
+ /* key: 0x80a7 */ 0xd570,
+ /* key: 0x80a8 */ 0xffff,
+ /* key: 0x80a9 */ 0x382a,
+ /* key: 0x80aa */ 0x4b43,
+ /* key: 0x80ab */ 0xd571,
+ /* key: 0x80ac */ 0x666f,
+ /* key: 0x80ad */ 0x666d,
+ /* key: 0x80ae */ 0xffff,
+ /* key: 0x80af */ 0x394e,
+ /* key: 0x80b0 */ 0xffff,
+ /* key: 0x80b1 */ 0x394f,
+ /* key: 0x80b2 */ 0x3069,
+ /* key: 0x80b3 */ 0xffff,
+ /* key: 0x80b4 */ 0x3a68,
+ /* key: 0x80b5 */ 0xffff,
+ /* key: 0x80b6 */ 0xffff,
+ /* key: 0x80b7 */ 0xffff,
+ /* key: 0x80b8 */ 0xd572,
+ /* key: 0x80b9 */ 0xd573,
+ /* key: 0x80ba */ 0x4759,
+ /* key: 0x80bb */ 0xffff,
+ /* key: 0x80bc */ 0xffff,
+ /* key: 0x80bd */ 0xffff,
+ /* key: 0x80be */ 0xffff,
+ /* key: 0x80bf */ 0xffff,
+ /* key: 0x80c0 */ 0xffff,
+ /* key: 0x80c1 */ 0xffff,
+ /* key: 0x80c2 */ 0xffff,
+ /* key: 0x80c3 */ 0x305f,
+ /* key: 0x80c4 */ 0x6674,
+ /* key: 0x80c5 */ 0xffff,
+ /* key: 0x80c6 */ 0x4340,
+ /* key: 0x80c7 */ 0xffff,
+ /* key: 0x80c8 */ 0xd574,
+ /* key: 0x80c9 */ 0xffff,
+ /* key: 0x80ca */ 0xffff,
+ /* key: 0x80cb */ 0xffff,
+ /* key: 0x80cc */ 0x4758,
+ /* key: 0x80cd */ 0xd575,
+ /* key: 0x80ce */ 0x425b,
+ /* key: 0x80cf */ 0xd576,
+ /* key: 0x80d0 */ 0xffff,
+ /* key: 0x80d1 */ 0xffff,
+ /* key: 0x80d2 */ 0xd577,
+ /* key: 0x80d3 */ 0xffff,
+ /* key: 0x80d4 */ 0xd578,
+ /* key: 0x80d5 */ 0xd579,
+ /* key: 0x80d6 */ 0x6676,
+ /* key: 0x80d7 */ 0xd57a,
+ /* key: 0x80d8 */ 0xd57b,
+ /* key: 0x80d9 */ 0x6672,
+ /* key: 0x80da */ 0x6675,
+ /* key: 0x80db */ 0x6670,
+ /* key: 0x80dc */ 0xffff,
+ /* key: 0x80dd */ 0x6673,
+ /* key: 0x80de */ 0x4b26,
+ /* key: 0x80df */ 0xffff,
+ /* key: 0x80e0 */ 0xd57c,
+ /* key: 0x80e1 */ 0x3855,
+ /* key: 0x80e2 */ 0xffff,
+ /* key: 0x80e3 */ 0xffff,
+ /* key: 0x80e4 */ 0x307d,
+ /* key: 0x80e5 */ 0x6671,
+ /* key: 0x80e6 */ 0xffff,
+ /* key: 0x80e7 */ 0xffff,
+ /* key: 0x80e8 */ 0xffff,
+ /* key: 0x80e9 */ 0xffff,
+ /* key: 0x80ea */ 0xffff,
+ /* key: 0x80eb */ 0xffff,
+ /* key: 0x80ec */ 0xffff,
+ /* key: 0x80ed */ 0xd57d,
+ /* key: 0x80ee */ 0xd57e,
+ /* key: 0x80ef */ 0x6678,
+ /* key: 0x80f0 */ 0xd621,
+ /* key: 0x80f1 */ 0x6679,
+ /* key: 0x80f2 */ 0xd622,
+ /* key: 0x80f3 */ 0xd623,
+ /* key: 0x80f4 */ 0x4639,
+ /* key: 0x80f5 */ 0xffff,
+ /* key: 0x80f6 */ 0xd624,
+ /* key: 0x80f7 */ 0xffff,
+ /* key: 0x80f8 */ 0x363b,
+ /* key: 0x80f9 */ 0xd625,
+ /* key: 0x80fa */ 0xd626,
+ /* key: 0x80fb */ 0xffff,
+ /* key: 0x80fc */ 0x6726,
+ /* key: 0x80fd */ 0x473d,
+ /* key: 0x80fe */ 0xd627,
+ /* key: 0x80ff */ 0xffff,
+ /* branch: 0x810X */ 15376,
+ /* branch: 0x811X */ 15392,
+ /* branch: 0x812X */ 15408,
+ /* branch: 0x813X */ 15424,
+ /* branch: 0x814X */ 15440,
+ /* branch: 0x815X */ 15456,
+ /* branch: 0x816X */ 15472,
+ /* branch: 0x817X */ 15488,
+ /* branch: 0x818X */ 15504,
+ /* branch: 0x819X */ 15520,
+ /* branch: 0x81aX */ 15536,
+ /* branch: 0x81bX */ 15552,
+ /* branch: 0x81cX */ 15568,
+ /* branch: 0x81dX */ 15584,
+ /* branch: 0x81eX */ 15600,
+ /* branch: 0x81fX */ 15616,
+ /* key: 0x8100 */ 0xffff,
+ /* key: 0x8101 */ 0xffff,
+ /* key: 0x8102 */ 0x3b69,
+ /* key: 0x8103 */ 0xd628,
+ /* key: 0x8104 */ 0xffff,
+ /* key: 0x8105 */ 0x363c,
+ /* key: 0x8106 */ 0x4048,
+ /* key: 0x8107 */ 0x4f46,
+ /* key: 0x8108 */ 0x4c2e,
+ /* key: 0x8109 */ 0x6677,
+ /* key: 0x810a */ 0x4054,
+ /* key: 0x810b */ 0xd629,
+ /* key: 0x810c */ 0xffff,
+ /* key: 0x810d */ 0xffff,
+ /* key: 0x810e */ 0xffff,
+ /* key: 0x810f */ 0xffff,
+ /* key: 0x8110 */ 0xffff,
+ /* key: 0x8111 */ 0xffff,
+ /* key: 0x8112 */ 0xffff,
+ /* key: 0x8113 */ 0xffff,
+ /* key: 0x8114 */ 0xffff,
+ /* key: 0x8115 */ 0xffff,
+ /* key: 0x8116 */ 0xd62a,
+ /* key: 0x8117 */ 0xd62b,
+ /* key: 0x8118 */ 0xd62c,
+ /* key: 0x8119 */ 0xffff,
+ /* key: 0x811a */ 0x3553,
+ /* key: 0x811b */ 0x667a,
+ /* key: 0x811c */ 0xd62d,
+ /* key: 0x811d */ 0xffff,
+ /* key: 0x811e */ 0xd62e,
+ /* key: 0x811f */ 0xffff,
+ /* key: 0x8120 */ 0xd62f,
+ /* key: 0x8121 */ 0xffff,
+ /* key: 0x8122 */ 0xffff,
+ /* key: 0x8123 */ 0x667c,
+ /* key: 0x8124 */ 0xd630,
+ /* key: 0x8125 */ 0xffff,
+ /* key: 0x8126 */ 0xffff,
+ /* key: 0x8127 */ 0xd631,
+ /* key: 0x8128 */ 0xffff,
+ /* key: 0x8129 */ 0x667b,
+ /* key: 0x812a */ 0xffff,
+ /* key: 0x812b */ 0xffff,
+ /* key: 0x812c */ 0xd632,
+ /* key: 0x812d */ 0xffff,
+ /* key: 0x812e */ 0xffff,
+ /* key: 0x812f */ 0x667d,
+ /* key: 0x8130 */ 0xd633,
+ /* key: 0x8131 */ 0x4326,
+ /* key: 0x8132 */ 0xffff,
+ /* key: 0x8133 */ 0x473e,
+ /* key: 0x8134 */ 0xffff,
+ /* key: 0x8135 */ 0xd634,
+ /* key: 0x8136 */ 0xffff,
+ /* key: 0x8137 */ 0xffff,
+ /* key: 0x8138 */ 0xffff,
+ /* key: 0x8139 */ 0x4431,
+ /* key: 0x813a */ 0xd635,
+ /* key: 0x813b */ 0xffff,
+ /* key: 0x813c */ 0xd636,
+ /* key: 0x813d */ 0xffff,
+ /* key: 0x813e */ 0x6723,
+ /* key: 0x813f */ 0xffff,
+ /* key: 0x8140 */ 0xffff,
+ /* key: 0x8141 */ 0xffff,
+ /* key: 0x8142 */ 0xffff,
+ /* key: 0x8143 */ 0xffff,
+ /* key: 0x8144 */ 0xffff,
+ /* key: 0x8145 */ 0xd637,
+ /* key: 0x8146 */ 0x6722,
+ /* key: 0x8147 */ 0xd638,
+ /* key: 0x8148 */ 0xffff,
+ /* key: 0x8149 */ 0xffff,
+ /* key: 0x814a */ 0xd639,
+ /* key: 0x814b */ 0x667e,
+ /* key: 0x814c */ 0xd63a,
+ /* key: 0x814d */ 0xffff,
+ /* key: 0x814e */ 0x3f55,
+ /* key: 0x814f */ 0xffff,
+ /* key: 0x8150 */ 0x4965,
+ /* key: 0x8151 */ 0x6725,
+ /* key: 0x8152 */ 0xd63b,
+ /* key: 0x8153 */ 0x6724,
+ /* key: 0x8154 */ 0x3950,
+ /* key: 0x8155 */ 0x4f53,
+ /* key: 0x8156 */ 0xffff,
+ /* key: 0x8157 */ 0xd63c,
+ /* key: 0x8158 */ 0xffff,
+ /* key: 0x8159 */ 0xffff,
+ /* key: 0x815a */ 0xffff,
+ /* key: 0x815b */ 0xffff,
+ /* key: 0x815c */ 0xffff,
+ /* key: 0x815d */ 0xffff,
+ /* key: 0x815e */ 0xffff,
+ /* key: 0x815f */ 0x6735,
+ /* key: 0x8160 */ 0xd63d,
+ /* key: 0x8161 */ 0xd63e,
+ /* key: 0x8162 */ 0xffff,
+ /* key: 0x8163 */ 0xffff,
+ /* key: 0x8164 */ 0xffff,
+ /* key: 0x8165 */ 0x6729,
+ /* key: 0x8166 */ 0x672a,
+ /* key: 0x8167 */ 0xd63f,
+ /* key: 0x8168 */ 0xd640,
+ /* key: 0x8169 */ 0xd641,
+ /* key: 0x816a */ 0xffff,
+ /* key: 0x816b */ 0x3c70,
+ /* key: 0x816c */ 0xffff,
+ /* key: 0x816d */ 0xd642,
+ /* key: 0x816e */ 0x6728,
+ /* key: 0x816f */ 0xd643,
+ /* key: 0x8170 */ 0x3978,
+ /* key: 0x8171 */ 0x6727,
+ /* key: 0x8172 */ 0xffff,
+ /* key: 0x8173 */ 0xffff,
+ /* key: 0x8174 */ 0x672b,
+ /* key: 0x8175 */ 0xffff,
+ /* key: 0x8176 */ 0xffff,
+ /* key: 0x8177 */ 0xd644,
+ /* key: 0x8178 */ 0x4432,
+ /* key: 0x8179 */ 0x4a22,
+ /* key: 0x817a */ 0x4123,
+ /* key: 0x817b */ 0xffff,
+ /* key: 0x817c */ 0xffff,
+ /* key: 0x817d */ 0xffff,
+ /* key: 0x817e */ 0xffff,
+ /* key: 0x817f */ 0x425c,
+ /* key: 0x8180 */ 0x672f,
+ /* key: 0x8181 */ 0xd645,
+ /* key: 0x8182 */ 0x6730,
+ /* key: 0x8183 */ 0x672c,
+ /* key: 0x8184 */ 0xd647,
+ /* key: 0x8185 */ 0xd648,
+ /* key: 0x8186 */ 0xd649,
+ /* key: 0x8187 */ 0xffff,
+ /* key: 0x8188 */ 0x672d,
+ /* key: 0x8189 */ 0xffff,
+ /* key: 0x818a */ 0x672e,
+ /* key: 0x818b */ 0xd64a,
+ /* key: 0x818c */ 0xffff,
+ /* key: 0x818d */ 0xffff,
+ /* key: 0x818e */ 0xd64b,
+ /* key: 0x818f */ 0x3951,
+ /* key: 0x8190 */ 0xd646,
+ /* key: 0x8191 */ 0xffff,
+ /* key: 0x8192 */ 0xffff,
+ /* key: 0x8193 */ 0x6736,
+ /* key: 0x8194 */ 0xffff,
+ /* key: 0x8195 */ 0x6732,
+ /* key: 0x8196 */ 0xd64c,
+ /* key: 0x8197 */ 0xffff,
+ /* key: 0x8198 */ 0xd64d,
+ /* key: 0x8199 */ 0xffff,
+ /* key: 0x819a */ 0x4966,
+ /* key: 0x819b */ 0xd64e,
+ /* key: 0x819c */ 0x4b6c,
+ /* key: 0x819d */ 0x4928,
+ /* key: 0x819e */ 0xd64f,
+ /* key: 0x819f */ 0xffff,
+ /* key: 0x81a0 */ 0x6731,
+ /* key: 0x81a1 */ 0xffff,
+ /* key: 0x81a2 */ 0xd650,
+ /* key: 0x81a3 */ 0x6734,
+ /* key: 0x81a4 */ 0x6733,
+ /* key: 0x81a5 */ 0xffff,
+ /* key: 0x81a6 */ 0xffff,
+ /* key: 0x81a7 */ 0xffff,
+ /* key: 0x81a8 */ 0x4b44,
+ /* key: 0x81a9 */ 0x6737,
+ /* key: 0x81aa */ 0xffff,
+ /* key: 0x81ab */ 0xffff,
+ /* key: 0x81ac */ 0xffff,
+ /* key: 0x81ad */ 0xffff,
+ /* key: 0x81ae */ 0xd651,
+ /* key: 0x81af */ 0xffff,
+ /* key: 0x81b0 */ 0x6738,
+ /* key: 0x81b1 */ 0xffff,
+ /* key: 0x81b2 */ 0xd652,
+ /* key: 0x81b3 */ 0x4137,
+ /* key: 0x81b4 */ 0xd653,
+ /* key: 0x81b5 */ 0x6739,
+ /* key: 0x81b6 */ 0xffff,
+ /* key: 0x81b7 */ 0xffff,
+ /* key: 0x81b8 */ 0x673b,
+ /* key: 0x81b9 */ 0xffff,
+ /* key: 0x81ba */ 0x673f,
+ /* key: 0x81bb */ 0xd654,
+ /* key: 0x81bc */ 0xffff,
+ /* key: 0x81bd */ 0x673c,
+ /* key: 0x81be */ 0x673a,
+ /* key: 0x81bf */ 0x473f,
+ /* key: 0x81c0 */ 0x673d,
+ /* key: 0x81c1 */ 0xffff,
+ /* key: 0x81c2 */ 0x673e,
+ /* key: 0x81c3 */ 0xd656,
+ /* key: 0x81c4 */ 0xffff,
+ /* key: 0x81c5 */ 0xd657,
+ /* key: 0x81c6 */ 0x3232,
+ /* key: 0x81c7 */ 0xffff,
+ /* key: 0x81c8 */ 0x6745,
+ /* key: 0x81c9 */ 0x6740,
+ /* key: 0x81ca */ 0xd658,
+ /* key: 0x81cb */ 0xd655,
+ /* key: 0x81cc */ 0xffff,
+ /* key: 0x81cd */ 0x6741,
+ /* key: 0x81ce */ 0xd659,
+ /* key: 0x81cf */ 0xd65a,
+ /* key: 0x81d0 */ 0xffff,
+ /* key: 0x81d1 */ 0x6742,
+ /* key: 0x81d2 */ 0xffff,
+ /* key: 0x81d3 */ 0x4221,
+ /* key: 0x81d4 */ 0xffff,
+ /* key: 0x81d5 */ 0xd65b,
+ /* key: 0x81d6 */ 0xffff,
+ /* key: 0x81d7 */ 0xd65c,
+ /* key: 0x81d8 */ 0x6744,
+ /* key: 0x81d9 */ 0x6743,
+ /* key: 0x81da */ 0x6746,
+ /* key: 0x81db */ 0xd65d,
+ /* key: 0x81dc */ 0xffff,
+ /* key: 0x81dd */ 0xd65e,
+ /* key: 0x81de */ 0xd65f,
+ /* key: 0x81df */ 0x6747,
+ /* key: 0x81e0 */ 0x6748,
+ /* key: 0x81e1 */ 0xd660,
+ /* key: 0x81e2 */ 0xffff,
+ /* key: 0x81e3 */ 0x3f43,
+ /* key: 0x81e4 */ 0xd661,
+ /* key: 0x81e5 */ 0x3269,
+ /* key: 0x81e6 */ 0xffff,
+ /* key: 0x81e7 */ 0x6749,
+ /* key: 0x81e8 */ 0x4e57,
+ /* key: 0x81e9 */ 0xffff,
+ /* key: 0x81ea */ 0x3c2b,
+ /* key: 0x81eb */ 0xd662,
+ /* key: 0x81ec */ 0xd663,
+ /* key: 0x81ed */ 0x3d2d,
+ /* key: 0x81ee */ 0xffff,
+ /* key: 0x81ef */ 0xffff,
+ /* key: 0x81f0 */ 0xd664,
+ /* key: 0x81f1 */ 0xd665,
+ /* key: 0x81f2 */ 0xd666,
+ /* key: 0x81f3 */ 0x3b6a,
+ /* key: 0x81f4 */ 0x4357,
+ /* key: 0x81f5 */ 0xd667,
+ /* key: 0x81f6 */ 0xd668,
+ /* key: 0x81f7 */ 0xffff,
+ /* key: 0x81f8 */ 0xd669,
+ /* key: 0x81f9 */ 0xd66a,
+ /* key: 0x81fa */ 0x674a,
+ /* key: 0x81fb */ 0x674b,
+ /* key: 0x81fc */ 0x3131,
+ /* key: 0x81fd */ 0xd66b,
+ /* key: 0x81fe */ 0x674c,
+ /* key: 0x81ff */ 0xd66c,
+ /* branch: 0x820X */ 15648,
+ /* branch: 0x821X */ 15664,
+ /* branch: 0x822X */ 15680,
+ /* branch: 0x823X */ 15696,
+ /* branch: 0x824X */ 15712,
+ /* branch: 0x825X */ 15728,
+ /* branch: 0x826X */ 15744,
+ /* branch: 0x827X */ 15760,
+ /* branch: 0x828X */ 15776,
+ /* branch: 0x829X */ 15792,
+ /* branch: 0x82aX */ 15808,
+ /* branch: 0x82bX */ 15824,
+ /* branch: 0x82cX */ 15840,
+ /* branch: 0x82dX */ 15856,
+ /* branch: 0x82eX */ 15872,
+ /* branch: 0x82fX */ 15888,
+ /* key: 0x8200 */ 0xd66d,
+ /* key: 0x8201 */ 0x674d,
+ /* key: 0x8202 */ 0x674e,
+ /* key: 0x8203 */ 0xd66e,
+ /* key: 0x8204 */ 0xffff,
+ /* key: 0x8205 */ 0x674f,
+ /* key: 0x8206 */ 0xffff,
+ /* key: 0x8207 */ 0x6750,
+ /* key: 0x8208 */ 0x363d,
+ /* key: 0x8209 */ 0x5a2a,
+ /* key: 0x820a */ 0x6751,
+ /* key: 0x820b */ 0xffff,
+ /* key: 0x820c */ 0x4065,
+ /* key: 0x820d */ 0x6752,
+ /* key: 0x820e */ 0x3c4b,
+ /* key: 0x820f */ 0xd66f,
+ /* key: 0x8210 */ 0x6753,
+ /* key: 0x8211 */ 0xffff,
+ /* key: 0x8212 */ 0x5030,
+ /* key: 0x8213 */ 0xd670,
+ /* key: 0x8214 */ 0xd671,
+ /* key: 0x8215 */ 0xffff,
+ /* key: 0x8216 */ 0x6754,
+ /* key: 0x8217 */ 0x4a5e,
+ /* key: 0x8218 */ 0x345c,
+ /* key: 0x8219 */ 0xd672,
+ /* key: 0x821a */ 0xd673,
+ /* key: 0x821b */ 0x4124,
+ /* key: 0x821c */ 0x3d58,
+ /* key: 0x821d */ 0xd674,
+ /* key: 0x821e */ 0x4971,
+ /* key: 0x821f */ 0x3d2e,
+ /* key: 0x8220 */ 0xffff,
+ /* key: 0x8221 */ 0xd675,
+ /* key: 0x8222 */ 0xd676,
+ /* key: 0x8223 */ 0xffff,
+ /* key: 0x8224 */ 0xffff,
+ /* key: 0x8225 */ 0xffff,
+ /* key: 0x8226 */ 0xffff,
+ /* key: 0x8227 */ 0xffff,
+ /* key: 0x8228 */ 0xd677,
+ /* key: 0x8229 */ 0x6755,
+ /* key: 0x822a */ 0x3952,
+ /* key: 0x822b */ 0x6756,
+ /* key: 0x822c */ 0x484c,
+ /* key: 0x822d */ 0xffff,
+ /* key: 0x822e */ 0x6764,
+ /* key: 0x822f */ 0xffff,
+ /* key: 0x8230 */ 0xffff,
+ /* key: 0x8231 */ 0xffff,
+ /* key: 0x8232 */ 0xd678,
+ /* key: 0x8233 */ 0x6758,
+ /* key: 0x8234 */ 0xd679,
+ /* key: 0x8235 */ 0x4249,
+ /* key: 0x8236 */ 0x4775,
+ /* key: 0x8237 */ 0x383f,
+ /* key: 0x8238 */ 0x6757,
+ /* key: 0x8239 */ 0x4125,
+ /* key: 0x823a */ 0xd67a,
+ /* key: 0x823b */ 0xffff,
+ /* key: 0x823c */ 0xffff,
+ /* key: 0x823d */ 0xffff,
+ /* key: 0x823e */ 0xffff,
+ /* key: 0x823f */ 0xffff,
+ /* key: 0x8240 */ 0x6759,
+ /* key: 0x8241 */ 0xffff,
+ /* key: 0x8242 */ 0xffff,
+ /* key: 0x8243 */ 0xd67b,
+ /* key: 0x8244 */ 0xd67c,
+ /* key: 0x8245 */ 0xd67d,
+ /* key: 0x8246 */ 0xd67e,
+ /* key: 0x8247 */ 0x447a,
+ /* key: 0x8248 */ 0xffff,
+ /* key: 0x8249 */ 0xffff,
+ /* key: 0x824a */ 0xffff,
+ /* key: 0x824b */ 0xd721,
+ /* key: 0x824c */ 0xffff,
+ /* key: 0x824d */ 0xffff,
+ /* key: 0x824e */ 0xd722,
+ /* key: 0x824f */ 0xd723,
+ /* key: 0x8250 */ 0xffff,
+ /* key: 0x8251 */ 0xd724,
+ /* key: 0x8252 */ 0xffff,
+ /* key: 0x8253 */ 0xffff,
+ /* key: 0x8254 */ 0xffff,
+ /* key: 0x8255 */ 0xffff,
+ /* key: 0x8256 */ 0xd725,
+ /* key: 0x8257 */ 0xffff,
+ /* key: 0x8258 */ 0x675b,
+ /* key: 0x8259 */ 0x675a,
+ /* key: 0x825a */ 0x675d,
+ /* key: 0x825b */ 0xffff,
+ /* key: 0x825c */ 0xd726,
+ /* key: 0x825d */ 0x675c,
+ /* key: 0x825e */ 0xffff,
+ /* key: 0x825f */ 0x675e,
+ /* key: 0x8260 */ 0xd727,
+ /* key: 0x8261 */ 0xffff,
+ /* key: 0x8262 */ 0x6760,
+ /* key: 0x8263 */ 0xd728,
+ /* key: 0x8264 */ 0x675f,
+ /* key: 0x8265 */ 0xffff,
+ /* key: 0x8266 */ 0x344f,
+ /* key: 0x8267 */ 0xd729,
+ /* key: 0x8268 */ 0x6761,
+ /* key: 0x8269 */ 0xffff,
+ /* key: 0x826a */ 0x6762,
+ /* key: 0x826b */ 0x6763,
+ /* key: 0x826c */ 0xffff,
+ /* key: 0x826d */ 0xd72a,
+ /* key: 0x826e */ 0x3a31,
+ /* key: 0x826f */ 0x4e49,
+ /* key: 0x8270 */ 0xffff,
+ /* key: 0x8271 */ 0x6765,
+ /* key: 0x8272 */ 0x3f27,
+ /* key: 0x8273 */ 0xffff,
+ /* key: 0x8274 */ 0xd72b,
+ /* key: 0x8275 */ 0xffff,
+ /* key: 0x8276 */ 0x3170,
+ /* key: 0x8277 */ 0x6766,
+ /* key: 0x8278 */ 0x6767,
+ /* key: 0x8279 */ 0xffff,
+ /* key: 0x827a */ 0xffff,
+ /* key: 0x827b */ 0xd72c,
+ /* key: 0x827c */ 0xffff,
+ /* key: 0x827d */ 0xd72d,
+ /* key: 0x827e */ 0x6768,
+ /* key: 0x827f */ 0xd72e,
+ /* key: 0x8280 */ 0xd72f,
+ /* key: 0x8281 */ 0xd730,
+ /* key: 0x8282 */ 0xffff,
+ /* key: 0x8283 */ 0xd731,
+ /* key: 0x8284 */ 0xd732,
+ /* key: 0x8285 */ 0xffff,
+ /* key: 0x8286 */ 0xffff,
+ /* key: 0x8287 */ 0xd733,
+ /* key: 0x8288 */ 0xffff,
+ /* key: 0x8289 */ 0xd734,
+ /* key: 0x828a */ 0xd735,
+ /* key: 0x828b */ 0x3072,
+ /* key: 0x828c */ 0xffff,
+ /* key: 0x828d */ 0x6769,
+ /* key: 0x828e */ 0xd736,
+ /* key: 0x828f */ 0xffff,
+ /* key: 0x8290 */ 0xffff,
+ /* key: 0x8291 */ 0xd737,
+ /* key: 0x8292 */ 0x676a,
+ /* key: 0x8293 */ 0xffff,
+ /* key: 0x8294 */ 0xd738,
+ /* key: 0x8295 */ 0xffff,
+ /* key: 0x8296 */ 0xd739,
+ /* key: 0x8297 */ 0xffff,
+ /* key: 0x8298 */ 0xd73a,
+ /* key: 0x8299 */ 0x4967,
+ /* key: 0x829a */ 0xd73b,
+ /* key: 0x829b */ 0xd73c,
+ /* key: 0x829c */ 0xffff,
+ /* key: 0x829d */ 0x3c47,
+ /* key: 0x829e */ 0xffff,
+ /* key: 0x829f */ 0x676c,
+ /* key: 0x82a0 */ 0xd73d,
+ /* key: 0x82a1 */ 0xd73e,
+ /* key: 0x82a2 */ 0xffff,
+ /* key: 0x82a3 */ 0xd73f,
+ /* key: 0x82a4 */ 0xd740,
+ /* key: 0x82a5 */ 0x3329,
+ /* key: 0x82a6 */ 0x3032,
+ /* key: 0x82a7 */ 0xd741,
+ /* key: 0x82a8 */ 0xd742,
+ /* key: 0x82a9 */ 0xd743,
+ /* key: 0x82aa */ 0xd744,
+ /* key: 0x82ab */ 0x676b,
+ /* key: 0x82ac */ 0x676e,
+ /* key: 0x82ad */ 0x474e,
+ /* key: 0x82ae */ 0xd745,
+ /* key: 0x82af */ 0x3f44,
+ /* key: 0x82b0 */ 0xd746,
+ /* key: 0x82b1 */ 0x3256,
+ /* key: 0x82b2 */ 0xd747,
+ /* key: 0x82b3 */ 0x4b27,
+ /* key: 0x82b4 */ 0xd748,
+ /* key: 0x82b5 */ 0xffff,
+ /* key: 0x82b6 */ 0xffff,
+ /* key: 0x82b7 */ 0xd749,
+ /* key: 0x82b8 */ 0x375d,
+ /* key: 0x82b9 */ 0x365c,
+ /* key: 0x82ba */ 0xd74a,
+ /* key: 0x82bb */ 0x676d,
+ /* key: 0x82bc */ 0xd74b,
+ /* key: 0x82bd */ 0x326a,
+ /* key: 0x82be */ 0xd74c,
+ /* key: 0x82bf */ 0xd74d,
+ /* key: 0x82c0 */ 0xffff,
+ /* key: 0x82c1 */ 0xffff,
+ /* key: 0x82c2 */ 0xffff,
+ /* key: 0x82c3 */ 0xffff,
+ /* key: 0x82c4 */ 0xffff,
+ /* key: 0x82c5 */ 0x3423,
+ /* key: 0x82c6 */ 0xd74e,
+ /* key: 0x82c7 */ 0xffff,
+ /* key: 0x82c8 */ 0xffff,
+ /* key: 0x82c9 */ 0xffff,
+ /* key: 0x82ca */ 0xffff,
+ /* key: 0x82cb */ 0xffff,
+ /* key: 0x82cc */ 0xffff,
+ /* key: 0x82cd */ 0xffff,
+ /* key: 0x82ce */ 0xffff,
+ /* key: 0x82cf */ 0xffff,
+ /* key: 0x82d0 */ 0xd74f,
+ /* key: 0x82d1 */ 0x3171,
+ /* key: 0x82d2 */ 0x6772,
+ /* key: 0x82d3 */ 0x4e6a,
+ /* key: 0x82d4 */ 0x425d,
+ /* key: 0x82d5 */ 0xd750,
+ /* key: 0x82d6 */ 0xffff,
+ /* key: 0x82d7 */ 0x4944,
+ /* key: 0x82d8 */ 0xffff,
+ /* key: 0x82d9 */ 0x677e,
+ /* key: 0x82da */ 0xd751,
+ /* key: 0x82db */ 0x3257,
+ /* key: 0x82dc */ 0x677c,
+ /* key: 0x82dd */ 0xffff,
+ /* key: 0x82de */ 0x677a,
+ /* key: 0x82df */ 0x6771,
+ /* key: 0x82e0 */ 0xd752,
+ /* key: 0x82e1 */ 0x676f,
+ /* key: 0x82e2 */ 0xd753,
+ /* key: 0x82e3 */ 0x6770,
+ /* key: 0x82e4 */ 0xd754,
+ /* key: 0x82e5 */ 0x3c63,
+ /* key: 0x82e6 */ 0x366c,
+ /* key: 0x82e7 */ 0x4377,
+ /* key: 0x82e8 */ 0xd755,
+ /* key: 0x82e9 */ 0xffff,
+ /* key: 0x82ea */ 0xd756,
+ /* key: 0x82eb */ 0x4651,
+ /* key: 0x82ec */ 0xffff,
+ /* key: 0x82ed */ 0xd757,
+ /* key: 0x82ee */ 0xffff,
+ /* key: 0x82ef */ 0xd758,
+ /* key: 0x82f0 */ 0xffff,
+ /* key: 0x82f1 */ 0x3151,
+ /* key: 0x82f2 */ 0xffff,
+ /* key: 0x82f3 */ 0x6774,
+ /* key: 0x82f4 */ 0x6773,
+ /* key: 0x82f5 */ 0xffff,
+ /* key: 0x82f6 */ 0xd759,
+ /* key: 0x82f7 */ 0xd75a,
+ /* key: 0x82f8 */ 0xffff,
+ /* key: 0x82f9 */ 0x6779,
+ /* key: 0x82fa */ 0x6775,
+ /* key: 0x82fb */ 0x6778,
+ /* key: 0x82fc */ 0xffff,
+ /* key: 0x82fd */ 0xd75b,
+ /* key: 0x82fe */ 0xd75c,
+ /* key: 0x82ff */ 0xffff,
+ /* branch: 0x830X */ 15920,
+ /* branch: 0x831X */ 15936,
+ /* branch: 0x832X */ 15952,
+ /* branch: 0x833X */ 15968,
+ /* branch: 0x834X */ 15984,
+ /* branch: 0x835X */ 16000,
+ /* branch: 0x836X */ 0,
+ /* branch: 0x837X */ 16016,
+ /* branch: 0x838X */ 16032,
+ /* branch: 0x839X */ 16048,
+ /* branch: 0x83aX */ 16064,
+ /* branch: 0x83bX */ 16080,
+ /* branch: 0x83cX */ 16096,
+ /* branch: 0x83dX */ 16112,
+ /* branch: 0x83eX */ 16128,
+ /* branch: 0x83fX */ 16144,
+ /* key: 0x8300 */ 0xd75d,
+ /* key: 0x8301 */ 0xd75e,
+ /* key: 0x8302 */ 0x4c50,
+ /* key: 0x8303 */ 0x6777,
+ /* key: 0x8304 */ 0x3258,
+ /* key: 0x8305 */ 0x337d,
+ /* key: 0x8306 */ 0x677b,
+ /* key: 0x8307 */ 0xd75f,
+ /* key: 0x8308 */ 0xd760,
+ /* key: 0x8309 */ 0x677d,
+ /* key: 0x830a */ 0xd761,
+ /* key: 0x830b */ 0xd762,
+ /* key: 0x830c */ 0xffff,
+ /* key: 0x830d */ 0xffff,
+ /* key: 0x830e */ 0x3754,
+ /* key: 0x830f */ 0xffff,
+ /* key: 0x8310 */ 0xffff,
+ /* key: 0x8311 */ 0xffff,
+ /* key: 0x8312 */ 0xffff,
+ /* key: 0x8313 */ 0xffff,
+ /* key: 0x8314 */ 0xffff,
+ /* key: 0x8315 */ 0xffff,
+ /* key: 0x8316 */ 0x6823,
+ /* key: 0x8317 */ 0x682c,
+ /* key: 0x8318 */ 0x682d,
+ /* key: 0x8319 */ 0xffff,
+ /* key: 0x831a */ 0xffff,
+ /* key: 0x831b */ 0xd764,
+ /* key: 0x831c */ 0x302b,
+ /* key: 0x831d */ 0xd765,
+ /* key: 0x831e */ 0xd766,
+ /* key: 0x831f */ 0xd767,
+ /* key: 0x8320 */ 0xffff,
+ /* key: 0x8321 */ 0xd768,
+ /* key: 0x8322 */ 0xd769,
+ /* key: 0x8323 */ 0x6834,
+ /* key: 0x8324 */ 0xffff,
+ /* key: 0x8325 */ 0xffff,
+ /* key: 0x8326 */ 0xffff,
+ /* key: 0x8327 */ 0xffff,
+ /* key: 0x8328 */ 0x3071,
+ /* key: 0x8329 */ 0xffff,
+ /* key: 0x832a */ 0xffff,
+ /* key: 0x832b */ 0x682b,
+ /* key: 0x832c */ 0xd76a,
+ /* key: 0x832d */ 0xd76b,
+ /* key: 0x832e */ 0xd76c,
+ /* key: 0x832f */ 0x682a,
+ /* key: 0x8330 */ 0xd76d,
+ /* key: 0x8331 */ 0x6825,
+ /* key: 0x8332 */ 0x6824,
+ /* key: 0x8333 */ 0xd76e,
+ /* key: 0x8334 */ 0x6822,
+ /* key: 0x8335 */ 0x6821,
+ /* key: 0x8336 */ 0x4363,
+ /* key: 0x8337 */ 0xd76f,
+ /* key: 0x8338 */ 0x427b,
+ /* key: 0x8339 */ 0x6827,
+ /* key: 0x833a */ 0xd770,
+ /* key: 0x833b */ 0xffff,
+ /* key: 0x833c */ 0xd771,
+ /* key: 0x833d */ 0xd772,
+ /* key: 0x833e */ 0xffff,
+ /* key: 0x833f */ 0xffff,
+ /* key: 0x8340 */ 0x6826,
+ /* key: 0x8341 */ 0xffff,
+ /* key: 0x8342 */ 0xd773,
+ /* key: 0x8343 */ 0xd774,
+ /* key: 0x8344 */ 0xd775,
+ /* key: 0x8345 */ 0x6829,
+ /* key: 0x8346 */ 0xffff,
+ /* key: 0x8347 */ 0xd776,
+ /* key: 0x8348 */ 0xffff,
+ /* key: 0x8349 */ 0x4170,
+ /* key: 0x834a */ 0x3755,
+ /* key: 0x834b */ 0xffff,
+ /* key: 0x834c */ 0xffff,
+ /* key: 0x834d */ 0xd777,
+ /* key: 0x834e */ 0xd778,
+ /* key: 0x834f */ 0x3141,
+ /* key: 0x8350 */ 0x6828,
+ /* key: 0x8351 */ 0xd779,
+ /* key: 0x8352 */ 0x3953,
+ /* key: 0x8353 */ 0xd83e,
+ /* key: 0x8354 */ 0xd763,
+ /* key: 0x8355 */ 0xd77a,
+ /* key: 0x8356 */ 0xd77b,
+ /* key: 0x8357 */ 0xd77c,
+ /* key: 0x8358 */ 0x4171,
+ /* key: 0x8359 */ 0xffff,
+ /* key: 0x835a */ 0xffff,
+ /* key: 0x835b */ 0xffff,
+ /* key: 0x835c */ 0xffff,
+ /* key: 0x835d */ 0xffff,
+ /* key: 0x835e */ 0xffff,
+ /* key: 0x835f */ 0xffff,
+ /* key: 0x8370 */ 0xd77d,
+ /* key: 0x8371 */ 0xffff,
+ /* key: 0x8372 */ 0xffff,
+ /* key: 0x8373 */ 0x683a,
+ /* key: 0x8374 */ 0xffff,
+ /* key: 0x8375 */ 0x683b,
+ /* key: 0x8376 */ 0xffff,
+ /* key: 0x8377 */ 0x3259,
+ /* key: 0x8378 */ 0xd77e,
+ /* key: 0x8379 */ 0xffff,
+ /* key: 0x837a */ 0xffff,
+ /* key: 0x837b */ 0x322e,
+ /* key: 0x837c */ 0x6838,
+ /* key: 0x837d */ 0xd821,
+ /* key: 0x837e */ 0xffff,
+ /* key: 0x837f */ 0xd822,
+ /* key: 0x8380 */ 0xd823,
+ /* key: 0x8381 */ 0xffff,
+ /* key: 0x8382 */ 0xd824,
+ /* key: 0x8383 */ 0xffff,
+ /* key: 0x8384 */ 0xd825,
+ /* key: 0x8385 */ 0x682e,
+ /* key: 0x8386 */ 0xd826,
+ /* key: 0x8387 */ 0x6836,
+ /* key: 0x8388 */ 0xffff,
+ /* key: 0x8389 */ 0x683d,
+ /* key: 0x838a */ 0x6837,
+ /* key: 0x838b */ 0xffff,
+ /* key: 0x838c */ 0xffff,
+ /* key: 0x838d */ 0xd827,
+ /* key: 0x838e */ 0x6835,
+ /* key: 0x838f */ 0xffff,
+ /* key: 0x8390 */ 0xffff,
+ /* key: 0x8391 */ 0xffff,
+ /* key: 0x8392 */ 0xd828,
+ /* key: 0x8393 */ 0x6776,
+ /* key: 0x8394 */ 0xd829,
+ /* key: 0x8395 */ 0xd82a,
+ /* key: 0x8396 */ 0x6833,
+ /* key: 0x8397 */ 0xffff,
+ /* key: 0x8398 */ 0xd82b,
+ /* key: 0x8399 */ 0xd82c,
+ /* key: 0x839a */ 0x682f,
+ /* key: 0x839b */ 0xd82d,
+ /* key: 0x839c */ 0xd82e,
+ /* key: 0x839d */ 0xd82f,
+ /* key: 0x839e */ 0x3450,
+ /* key: 0x839f */ 0x6831,
+ /* key: 0x83a0 */ 0x683c,
+ /* key: 0x83a1 */ 0xffff,
+ /* key: 0x83a2 */ 0x6832,
+ /* key: 0x83a3 */ 0xffff,
+ /* key: 0x83a4 */ 0xffff,
+ /* key: 0x83a5 */ 0xffff,
+ /* key: 0x83a6 */ 0xd830,
+ /* key: 0x83a7 */ 0xd831,
+ /* key: 0x83a8 */ 0x683e,
+ /* key: 0x83a9 */ 0xd832,
+ /* key: 0x83aa */ 0x6830,
+ /* key: 0x83ab */ 0x477c,
+ /* key: 0x83ac */ 0xd833,
+ /* key: 0x83ad */ 0xd84c,
+ /* key: 0x83ae */ 0xffff,
+ /* key: 0x83af */ 0xffff,
+ /* key: 0x83b0 */ 0xffff,
+ /* key: 0x83b1 */ 0x4d69,
+ /* key: 0x83b2 */ 0xffff,
+ /* key: 0x83b3 */ 0xffff,
+ /* key: 0x83b4 */ 0xffff,
+ /* key: 0x83b5 */ 0x6839,
+ /* key: 0x83b6 */ 0xffff,
+ /* key: 0x83b7 */ 0xffff,
+ /* key: 0x83b8 */ 0xffff,
+ /* key: 0x83b9 */ 0xffff,
+ /* key: 0x83ba */ 0xffff,
+ /* key: 0x83bb */ 0xffff,
+ /* key: 0x83bc */ 0xffff,
+ /* key: 0x83bd */ 0x684f,
+ /* key: 0x83be */ 0xd834,
+ /* key: 0x83bf */ 0xd835,
+ /* key: 0x83c0 */ 0xd836,
+ /* key: 0x83c1 */ 0x6847,
+ /* key: 0x83c2 */ 0xffff,
+ /* key: 0x83c3 */ 0xffff,
+ /* key: 0x83c4 */ 0xffff,
+ /* key: 0x83c5 */ 0x3f7b,
+ /* key: 0x83c6 */ 0xffff,
+ /* key: 0x83c7 */ 0xd837,
+ /* key: 0x83c8 */ 0xffff,
+ /* key: 0x83c9 */ 0xd838,
+ /* key: 0x83ca */ 0x3546,
+ /* key: 0x83cb */ 0xffff,
+ /* key: 0x83cc */ 0x365d,
+ /* key: 0x83cd */ 0xffff,
+ /* key: 0x83ce */ 0x6842,
+ /* key: 0x83cf */ 0xd839,
+ /* key: 0x83d0 */ 0xd83a,
+ /* key: 0x83d1 */ 0xd83b,
+ /* key: 0x83d2 */ 0xffff,
+ /* key: 0x83d3 */ 0x325b,
+ /* key: 0x83d4 */ 0xd83c,
+ /* key: 0x83d5 */ 0xffff,
+ /* key: 0x83d6 */ 0x3e54,
+ /* key: 0x83d7 */ 0xffff,
+ /* key: 0x83d8 */ 0x6845,
+ /* key: 0x83d9 */ 0xffff,
+ /* key: 0x83da */ 0xffff,
+ /* key: 0x83db */ 0xffff,
+ /* key: 0x83dc */ 0x3a5a,
+ /* key: 0x83dd */ 0xd83d,
+ /* key: 0x83de */ 0xffff,
+ /* key: 0x83df */ 0x4551,
+ /* key: 0x83e0 */ 0x684a,
+ /* key: 0x83e1 */ 0xffff,
+ /* key: 0x83e2 */ 0xffff,
+ /* key: 0x83e3 */ 0xffff,
+ /* key: 0x83e4 */ 0xffff,
+ /* key: 0x83e5 */ 0xffff,
+ /* key: 0x83e6 */ 0xffff,
+ /* key: 0x83e7 */ 0xffff,
+ /* key: 0x83e8 */ 0xd83f,
+ /* key: 0x83e9 */ 0x4a6e,
+ /* key: 0x83ea */ 0xd840,
+ /* key: 0x83eb */ 0x6841,
+ /* key: 0x83ec */ 0xffff,
+ /* key: 0x83ed */ 0xffff,
+ /* key: 0x83ee */ 0xffff,
+ /* key: 0x83ef */ 0x325a,
+ /* key: 0x83f0 */ 0x3856,
+ /* key: 0x83f1 */ 0x4929,
+ /* key: 0x83f2 */ 0x684b,
+ /* key: 0x83f3 */ 0xffff,
+ /* key: 0x83f4 */ 0x683f,
+ /* key: 0x83f5 */ 0xffff,
+ /* key: 0x83f6 */ 0xd841,
+ /* key: 0x83f7 */ 0x6848,
+ /* key: 0x83f8 */ 0xd842,
+ /* key: 0x83f9 */ 0xd843,
+ /* key: 0x83fa */ 0xffff,
+ /* key: 0x83fb */ 0x6852,
+ /* key: 0x83fc */ 0xd844,
+ /* key: 0x83fd */ 0x6843,
+ /* key: 0x83fe */ 0xffff,
+ /* key: 0x83ff */ 0xffff,
+ /* branch: 0x840X */ 16176,
+ /* branch: 0x841X */ 16192,
+ /* branch: 0x842X */ 16208,
+ /* branch: 0x843X */ 16224,
+ /* branch: 0x844X */ 16240,
+ /* branch: 0x845X */ 16256,
+ /* branch: 0x846X */ 16272,
+ /* branch: 0x847X */ 16288,
+ /* branch: 0x848X */ 16304,
+ /* branch: 0x849X */ 16320,
+ /* branch: 0x84aX */ 16336,
+ /* branch: 0x84bX */ 16352,
+ /* branch: 0x84cX */ 16368,
+ /* branch: 0x84dX */ 16384,
+ /* branch: 0x84eX */ 16400,
+ /* branch: 0x84fX */ 16416,
+ /* key: 0x8400 */ 0xffff,
+ /* key: 0x8401 */ 0xd845,
+ /* key: 0x8402 */ 0xffff,
+ /* key: 0x8403 */ 0x6844,
+ /* key: 0x8404 */ 0x463a,
+ /* key: 0x8405 */ 0xffff,
+ /* key: 0x8406 */ 0xd846,
+ /* key: 0x8407 */ 0x6849,
+ /* key: 0x8408 */ 0xffff,
+ /* key: 0x8409 */ 0xffff,
+ /* key: 0x840a */ 0xd847,
+ /* key: 0x840b */ 0x6846,
+ /* key: 0x840c */ 0x4b28,
+ /* key: 0x840d */ 0x684c,
+ /* key: 0x840e */ 0x3060,
+ /* key: 0x840f */ 0xd848,
+ /* key: 0x8410 */ 0xffff,
+ /* key: 0x8411 */ 0xd849,
+ /* key: 0x8412 */ 0xffff,
+ /* key: 0x8413 */ 0x6840,
+ /* key: 0x8414 */ 0xffff,
+ /* key: 0x8415 */ 0xd84a,
+ /* key: 0x8416 */ 0xffff,
+ /* key: 0x8417 */ 0xffff,
+ /* key: 0x8418 */ 0xffff,
+ /* key: 0x8419 */ 0xd84b,
+ /* key: 0x841a */ 0xffff,
+ /* key: 0x841b */ 0xffff,
+ /* key: 0x841c */ 0xffff,
+ /* key: 0x841d */ 0xffff,
+ /* key: 0x841e */ 0xffff,
+ /* key: 0x841f */ 0xffff,
+ /* key: 0x8420 */ 0x684e,
+ /* key: 0x8421 */ 0xffff,
+ /* key: 0x8422 */ 0x684d,
+ /* key: 0x8423 */ 0xffff,
+ /* key: 0x8424 */ 0xffff,
+ /* key: 0x8425 */ 0xffff,
+ /* key: 0x8426 */ 0xffff,
+ /* key: 0x8427 */ 0xffff,
+ /* key: 0x8428 */ 0xffff,
+ /* key: 0x8429 */ 0x476b,
+ /* key: 0x842a */ 0x6854,
+ /* key: 0x842b */ 0xffff,
+ /* key: 0x842c */ 0x685f,
+ /* key: 0x842d */ 0xffff,
+ /* key: 0x842e */ 0xffff,
+ /* key: 0x842f */ 0xd84d,
+ /* key: 0x8430 */ 0xffff,
+ /* key: 0x8431 */ 0x337e,
+ /* key: 0x8432 */ 0xffff,
+ /* key: 0x8433 */ 0xffff,
+ /* key: 0x8434 */ 0xffff,
+ /* key: 0x8435 */ 0x6862,
+ /* key: 0x8436 */ 0xffff,
+ /* key: 0x8437 */ 0xffff,
+ /* key: 0x8438 */ 0x6850,
+ /* key: 0x8439 */ 0xd84e,
+ /* key: 0x843a */ 0xffff,
+ /* key: 0x843b */ 0xffff,
+ /* key: 0x843c */ 0x6855,
+ /* key: 0x843d */ 0x4d6e,
+ /* key: 0x843e */ 0xffff,
+ /* key: 0x843f */ 0xffff,
+ /* key: 0x8440 */ 0xffff,
+ /* key: 0x8441 */ 0xffff,
+ /* key: 0x8442 */ 0xffff,
+ /* key: 0x8443 */ 0xffff,
+ /* key: 0x8444 */ 0xffff,
+ /* key: 0x8445 */ 0xd84f,
+ /* key: 0x8446 */ 0x685e,
+ /* key: 0x8447 */ 0xd850,
+ /* key: 0x8448 */ 0xd851,
+ /* key: 0x8449 */ 0x4d55,
+ /* key: 0x844a */ 0xd852,
+ /* key: 0x844b */ 0xffff,
+ /* key: 0x844c */ 0xffff,
+ /* key: 0x844d */ 0xd853,
+ /* key: 0x844e */ 0x4e2a,
+ /* key: 0x844f */ 0xd854,
+ /* key: 0x8450 */ 0xffff,
+ /* key: 0x8451 */ 0xd855,
+ /* key: 0x8452 */ 0xd856,
+ /* key: 0x8453 */ 0xffff,
+ /* key: 0x8454 */ 0xffff,
+ /* key: 0x8455 */ 0xffff,
+ /* key: 0x8456 */ 0xd857,
+ /* key: 0x8457 */ 0x4378,
+ /* key: 0x8458 */ 0xd858,
+ /* key: 0x8459 */ 0xd859,
+ /* key: 0x845a */ 0xd85a,
+ /* key: 0x845b */ 0x336b,
+ /* key: 0x845c */ 0xd85b,
+ /* key: 0x845d */ 0xffff,
+ /* key: 0x845e */ 0xffff,
+ /* key: 0x845f */ 0xffff,
+ /* key: 0x8460 */ 0xd85c,
+ /* key: 0x8461 */ 0x4972,
+ /* key: 0x8462 */ 0x6864,
+ /* key: 0x8463 */ 0x4621,
+ /* key: 0x8464 */ 0xd85d,
+ /* key: 0x8465 */ 0xd85e,
+ /* key: 0x8466 */ 0x3031,
+ /* key: 0x8467 */ 0xd85f,
+ /* key: 0x8468 */ 0xffff,
+ /* key: 0x8469 */ 0x685d,
+ /* key: 0x846a */ 0xd860,
+ /* key: 0x846b */ 0x6859,
+ /* key: 0x846c */ 0x4172,
+ /* key: 0x846d */ 0x6853,
+ /* key: 0x846e */ 0x685b,
+ /* key: 0x846f */ 0x6860,
+ /* key: 0x8470 */ 0xd861,
+ /* key: 0x8471 */ 0x472c,
+ /* key: 0x8472 */ 0xffff,
+ /* key: 0x8473 */ 0xd862,
+ /* key: 0x8474 */ 0xd863,
+ /* key: 0x8475 */ 0x302a,
+ /* key: 0x8476 */ 0xd864,
+ /* key: 0x8477 */ 0x6858,
+ /* key: 0x8478 */ 0xd865,
+ /* key: 0x8479 */ 0x6861,
+ /* key: 0x847a */ 0x4978,
+ /* key: 0x847b */ 0xffff,
+ /* key: 0x847c */ 0xd866,
+ /* key: 0x847d */ 0xd867,
+ /* key: 0x847e */ 0xffff,
+ /* key: 0x847f */ 0xffff,
+ /* key: 0x8480 */ 0xffff,
+ /* key: 0x8481 */ 0xd868,
+ /* key: 0x8482 */ 0x685c,
+ /* key: 0x8483 */ 0xffff,
+ /* key: 0x8484 */ 0x6857,
+ /* key: 0x8485 */ 0xd869,
+ /* key: 0x8486 */ 0xffff,
+ /* key: 0x8487 */ 0xffff,
+ /* key: 0x8488 */ 0xffff,
+ /* key: 0x8489 */ 0xffff,
+ /* key: 0x848a */ 0xffff,
+ /* key: 0x848b */ 0x3e55,
+ /* key: 0x848c */ 0xffff,
+ /* key: 0x848d */ 0xffff,
+ /* key: 0x848e */ 0xffff,
+ /* key: 0x848f */ 0xffff,
+ /* key: 0x8490 */ 0x3d2f,
+ /* key: 0x8491 */ 0xffff,
+ /* key: 0x8492 */ 0xd86a,
+ /* key: 0x8493 */ 0xd86b,
+ /* key: 0x8494 */ 0x3c2c,
+ /* key: 0x8495 */ 0xd86c,
+ /* key: 0x8496 */ 0xffff,
+ /* key: 0x8497 */ 0xffff,
+ /* key: 0x8498 */ 0xffff,
+ /* key: 0x8499 */ 0x4c58,
+ /* key: 0x849a */ 0xffff,
+ /* key: 0x849b */ 0xffff,
+ /* key: 0x849c */ 0x4947,
+ /* key: 0x849d */ 0xffff,
+ /* key: 0x849e */ 0xd86d,
+ /* key: 0x849f */ 0x6867,
+ /* key: 0x84a0 */ 0xffff,
+ /* key: 0x84a1 */ 0x6870,
+ /* key: 0x84a2 */ 0xffff,
+ /* key: 0x84a3 */ 0xffff,
+ /* key: 0x84a4 */ 0xffff,
+ /* key: 0x84a5 */ 0xffff,
+ /* key: 0x84a6 */ 0xd86e,
+ /* key: 0x84a7 */ 0xffff,
+ /* key: 0x84a8 */ 0xd86f,
+ /* key: 0x84a9 */ 0xd870,
+ /* key: 0x84aa */ 0xd871,
+ /* key: 0x84ab */ 0xffff,
+ /* key: 0x84ac */ 0xffff,
+ /* key: 0x84ad */ 0x685a,
+ /* key: 0x84ae */ 0xffff,
+ /* key: 0x84af */ 0xd872,
+ /* key: 0x84b0 */ 0xffff,
+ /* key: 0x84b1 */ 0xd873,
+ /* key: 0x84b2 */ 0x3377,
+ /* key: 0x84b3 */ 0xffff,
+ /* key: 0x84b4 */ 0xd874,
+ /* key: 0x84b5 */ 0xffff,
+ /* key: 0x84b6 */ 0xffff,
+ /* key: 0x84b7 */ 0xffff,
+ /* key: 0x84b8 */ 0x3e78,
+ /* key: 0x84b9 */ 0x6865,
+ /* key: 0x84ba */ 0xd875,
+ /* key: 0x84bb */ 0x686a,
+ /* key: 0x84bc */ 0x4173,
+ /* key: 0x84bd */ 0xd876,
+ /* key: 0x84be */ 0xd877,
+ /* key: 0x84bf */ 0x6866,
+ /* key: 0x84c0 */ 0xd878,
+ /* key: 0x84c1 */ 0x686d,
+ /* key: 0x84c2 */ 0xd879,
+ /* key: 0x84c3 */ 0xffff,
+ /* key: 0x84c4 */ 0x435f,
+ /* key: 0x84c5 */ 0xffff,
+ /* key: 0x84c6 */ 0x686e,
+ /* key: 0x84c7 */ 0xd87a,
+ /* key: 0x84c8 */ 0xd87b,
+ /* key: 0x84c9 */ 0x4d56,
+ /* key: 0x84ca */ 0x6863,
+ /* key: 0x84cb */ 0x3338,
+ /* key: 0x84cc */ 0xd87c,
+ /* key: 0x84cd */ 0x6869,
+ /* key: 0x84ce */ 0xffff,
+ /* key: 0x84cf */ 0xd87d,
+ /* key: 0x84d0 */ 0x686c,
+ /* key: 0x84d1 */ 0x4c2c,
+ /* key: 0x84d2 */ 0xffff,
+ /* key: 0x84d3 */ 0xd87e,
+ /* key: 0x84d4 */ 0xffff,
+ /* key: 0x84d5 */ 0xffff,
+ /* key: 0x84d6 */ 0x686f,
+ /* key: 0x84d7 */ 0xffff,
+ /* key: 0x84d8 */ 0xffff,
+ /* key: 0x84d9 */ 0x6868,
+ /* key: 0x84da */ 0x686b,
+ /* key: 0x84db */ 0xffff,
+ /* key: 0x84dc */ 0xd921,
+ /* key: 0x84dd */ 0xffff,
+ /* key: 0x84de */ 0xffff,
+ /* key: 0x84df */ 0xffff,
+ /* key: 0x84e0 */ 0xffff,
+ /* key: 0x84e1 */ 0xffff,
+ /* key: 0x84e2 */ 0xffff,
+ /* key: 0x84e3 */ 0xffff,
+ /* key: 0x84e4 */ 0xffff,
+ /* key: 0x84e5 */ 0xffff,
+ /* key: 0x84e6 */ 0xffff,
+ /* key: 0x84e7 */ 0xd922,
+ /* key: 0x84e8 */ 0xffff,
+ /* key: 0x84e9 */ 0xffff,
+ /* key: 0x84ea */ 0xd923,
+ /* key: 0x84eb */ 0xffff,
+ /* key: 0x84ec */ 0x4b29,
+ /* key: 0x84ed */ 0xffff,
+ /* key: 0x84ee */ 0x4f21,
+ /* key: 0x84ef */ 0xd924,
+ /* key: 0x84f0 */ 0xd925,
+ /* key: 0x84f1 */ 0xd926,
+ /* key: 0x84f2 */ 0xd927,
+ /* key: 0x84f3 */ 0xffff,
+ /* key: 0x84f4 */ 0x6873,
+ /* key: 0x84f5 */ 0xffff,
+ /* key: 0x84f6 */ 0xffff,
+ /* key: 0x84f7 */ 0xd928,
+ /* key: 0x84f8 */ 0xffff,
+ /* key: 0x84f9 */ 0xffff,
+ /* key: 0x84fa */ 0xd92a,
+ /* key: 0x84fb */ 0xd92b,
+ /* key: 0x84fc */ 0x687a,
+ /* key: 0x84fd */ 0xd92c,
+ /* key: 0x84fe */ 0xffff,
+ /* key: 0x84ff */ 0x6872,
+ /* branch: 0x850X */ 16448,
+ /* branch: 0x851X */ 16464,
+ /* branch: 0x852X */ 16480,
+ /* branch: 0x853X */ 16496,
+ /* branch: 0x854X */ 16512,
+ /* branch: 0x855X */ 16528,
+ /* branch: 0x856X */ 16544,
+ /* branch: 0x857X */ 16560,
+ /* branch: 0x858X */ 16576,
+ /* branch: 0x859X */ 16592,
+ /* branch: 0x85aX */ 16608,
+ /* branch: 0x85bX */ 16624,
+ /* branch: 0x85cX */ 16640,
+ /* branch: 0x85dX */ 16656,
+ /* branch: 0x85eX */ 16672,
+ /* branch: 0x85fX */ 16688,
+ /* key: 0x8500 */ 0x3c43,
+ /* key: 0x8501 */ 0xffff,
+ /* key: 0x8502 */ 0xd92d,
+ /* key: 0x8503 */ 0xd92e,
+ /* key: 0x8504 */ 0xffff,
+ /* key: 0x8505 */ 0xffff,
+ /* key: 0x8506 */ 0x6851,
+ /* key: 0x8507 */ 0xd92f,
+ /* key: 0x8508 */ 0xffff,
+ /* key: 0x8509 */ 0xffff,
+ /* key: 0x850a */ 0xffff,
+ /* key: 0x850b */ 0xffff,
+ /* key: 0x850c */ 0xd930,
+ /* key: 0x850d */ 0xffff,
+ /* key: 0x850e */ 0xd931,
+ /* key: 0x850f */ 0xffff,
+ /* key: 0x8510 */ 0xd932,
+ /* key: 0x8511 */ 0x4a4e,
+ /* key: 0x8512 */ 0xffff,
+ /* key: 0x8513 */ 0x4c22,
+ /* key: 0x8514 */ 0x6879,
+ /* key: 0x8515 */ 0x6878,
+ /* key: 0x8516 */ 0xffff,
+ /* key: 0x8517 */ 0x6874,
+ /* key: 0x8518 */ 0x6875,
+ /* key: 0x8519 */ 0xffff,
+ /* key: 0x851a */ 0x3136,
+ /* key: 0x851b */ 0xffff,
+ /* key: 0x851c */ 0xd933,
+ /* key: 0x851d */ 0xffff,
+ /* key: 0x851e */ 0xd934,
+ /* key: 0x851f */ 0x6877,
+ /* key: 0x8520 */ 0xffff,
+ /* key: 0x8521 */ 0x6871,
+ /* key: 0x8522 */ 0xd935,
+ /* key: 0x8523 */ 0xd936,
+ /* key: 0x8524 */ 0xd937,
+ /* key: 0x8525 */ 0xd938,
+ /* key: 0x8526 */ 0x4455,
+ /* key: 0x8527 */ 0xd939,
+ /* key: 0x8528 */ 0xffff,
+ /* key: 0x8529 */ 0xffff,
+ /* key: 0x852a */ 0xd93a,
+ /* key: 0x852b */ 0xd93b,
+ /* key: 0x852c */ 0x6876,
+ /* key: 0x852d */ 0x307e,
+ /* key: 0x852e */ 0xffff,
+ /* key: 0x852f */ 0xd93c,
+ /* key: 0x8530 */ 0xffff,
+ /* key: 0x8531 */ 0xffff,
+ /* key: 0x8532 */ 0xd929,
+ /* key: 0x8533 */ 0xd93d,
+ /* key: 0x8534 */ 0xd93e,
+ /* key: 0x8535 */ 0x4222,
+ /* key: 0x8536 */ 0xd93f,
+ /* key: 0x8537 */ 0xffff,
+ /* key: 0x8538 */ 0xffff,
+ /* key: 0x8539 */ 0xffff,
+ /* key: 0x853a */ 0xffff,
+ /* key: 0x853b */ 0xffff,
+ /* key: 0x853c */ 0xffff,
+ /* key: 0x853d */ 0x4a43,
+ /* key: 0x853e */ 0xffff,
+ /* key: 0x853f */ 0xd940,
+ /* key: 0x8540 */ 0x687b,
+ /* key: 0x8541 */ 0x6921,
+ /* key: 0x8542 */ 0xffff,
+ /* key: 0x8543 */ 0x4859,
+ /* key: 0x8544 */ 0xffff,
+ /* key: 0x8545 */ 0xffff,
+ /* key: 0x8546 */ 0xd941,
+ /* key: 0x8547 */ 0xffff,
+ /* key: 0x8548 */ 0x687e,
+ /* key: 0x8549 */ 0x3e56,
+ /* key: 0x854a */ 0x3c49,
+ /* key: 0x854b */ 0x6923,
+ /* key: 0x854c */ 0xffff,
+ /* key: 0x854d */ 0xffff,
+ /* key: 0x854e */ 0x363e,
+ /* key: 0x854f */ 0xd942,
+ /* key: 0x8550 */ 0xd943,
+ /* key: 0x8551 */ 0xd944,
+ /* key: 0x8552 */ 0xd945,
+ /* key: 0x8553 */ 0xd946,
+ /* key: 0x8554 */ 0xffff,
+ /* key: 0x8555 */ 0x6924,
+ /* key: 0x8556 */ 0xd947,
+ /* key: 0x8557 */ 0x4979,
+ /* key: 0x8558 */ 0x687d,
+ /* key: 0x8559 */ 0xd948,
+ /* key: 0x855a */ 0x6856,
+ /* key: 0x855b */ 0xffff,
+ /* key: 0x855c */ 0xd949,
+ /* key: 0x855d */ 0xd94a,
+ /* key: 0x855e */ 0xd94b,
+ /* key: 0x855f */ 0xd94c,
+ /* key: 0x8560 */ 0xd94d,
+ /* key: 0x8561 */ 0xd94e,
+ /* key: 0x8562 */ 0xd94f,
+ /* key: 0x8563 */ 0x687c,
+ /* key: 0x8564 */ 0xd950,
+ /* key: 0x8565 */ 0xffff,
+ /* key: 0x8566 */ 0xffff,
+ /* key: 0x8567 */ 0xffff,
+ /* key: 0x8568 */ 0x4f4f,
+ /* key: 0x8569 */ 0x4622,
+ /* key: 0x856a */ 0x4973,
+ /* key: 0x856b */ 0xd951,
+ /* key: 0x856c */ 0xffff,
+ /* key: 0x856d */ 0x692b,
+ /* key: 0x856e */ 0xffff,
+ /* key: 0x856f */ 0xd952,
+ /* key: 0x8570 */ 0xffff,
+ /* key: 0x8571 */ 0xffff,
+ /* key: 0x8572 */ 0xffff,
+ /* key: 0x8573 */ 0xffff,
+ /* key: 0x8574 */ 0xffff,
+ /* key: 0x8575 */ 0xffff,
+ /* key: 0x8576 */ 0xffff,
+ /* key: 0x8577 */ 0x6931,
+ /* key: 0x8578 */ 0xffff,
+ /* key: 0x8579 */ 0xd953,
+ /* key: 0x857a */ 0xd954,
+ /* key: 0x857b */ 0xd955,
+ /* key: 0x857c */ 0xffff,
+ /* key: 0x857d */ 0xd956,
+ /* key: 0x857e */ 0x6932,
+ /* key: 0x857f */ 0xd957,
+ /* key: 0x8580 */ 0x6925,
+ /* key: 0x8581 */ 0xd958,
+ /* key: 0x8582 */ 0xffff,
+ /* key: 0x8583 */ 0xffff,
+ /* key: 0x8584 */ 0x4776,
+ /* key: 0x8585 */ 0xd959,
+ /* key: 0x8586 */ 0xd95a,
+ /* key: 0x8587 */ 0x692f,
+ /* key: 0x8588 */ 0x6927,
+ /* key: 0x8589 */ 0xd95b,
+ /* key: 0x858a */ 0x6929,
+ /* key: 0x858b */ 0xd95c,
+ /* key: 0x858c */ 0xd95d,
+ /* key: 0x858d */ 0xffff,
+ /* key: 0x858e */ 0xffff,
+ /* key: 0x858f */ 0xd95e,
+ /* key: 0x8590 */ 0x6933,
+ /* key: 0x8591 */ 0x6928,
+ /* key: 0x8592 */ 0xffff,
+ /* key: 0x8593 */ 0xd95f,
+ /* key: 0x8594 */ 0x692c,
+ /* key: 0x8595 */ 0xffff,
+ /* key: 0x8596 */ 0xffff,
+ /* key: 0x8597 */ 0x3172,
+ /* key: 0x8598 */ 0xd960,
+ /* key: 0x8599 */ 0x4665,
+ /* key: 0x859a */ 0xffff,
+ /* key: 0x859b */ 0x692d,
+ /* key: 0x859c */ 0x6930,
+ /* key: 0x859d */ 0xd961,
+ /* key: 0x859e */ 0xffff,
+ /* key: 0x859f */ 0xd962,
+ /* key: 0x85a0 */ 0xd963,
+ /* key: 0x85a1 */ 0xffff,
+ /* key: 0x85a2 */ 0xd964,
+ /* key: 0x85a3 */ 0xffff,
+ /* key: 0x85a4 */ 0x6926,
+ /* key: 0x85a5 */ 0xd965,
+ /* key: 0x85a6 */ 0x4126,
+ /* key: 0x85a7 */ 0xd966,
+ /* key: 0x85a8 */ 0x692a,
+ /* key: 0x85a9 */ 0x3b27,
+ /* key: 0x85aa */ 0x3f45,
+ /* key: 0x85ab */ 0x3730,
+ /* key: 0x85ac */ 0x4c74,
+ /* key: 0x85ad */ 0xd974,
+ /* key: 0x85ae */ 0x4c79,
+ /* key: 0x85af */ 0x3d72,
+ /* key: 0x85b0 */ 0xffff,
+ /* key: 0x85b1 */ 0xffff,
+ /* key: 0x85b2 */ 0xffff,
+ /* key: 0x85b3 */ 0xffff,
+ /* key: 0x85b4 */ 0xd967,
+ /* key: 0x85b5 */ 0xffff,
+ /* key: 0x85b6 */ 0xd968,
+ /* key: 0x85b7 */ 0xd969,
+ /* key: 0x85b8 */ 0xd96a,
+ /* key: 0x85b9 */ 0x6937,
+ /* key: 0x85ba */ 0x6935,
+ /* key: 0x85bb */ 0xffff,
+ /* key: 0x85bc */ 0xd96b,
+ /* key: 0x85bd */ 0xd96c,
+ /* key: 0x85be */ 0xd96d,
+ /* key: 0x85bf */ 0xd96e,
+ /* key: 0x85c0 */ 0xffff,
+ /* key: 0x85c1 */ 0x4f4e,
+ /* key: 0x85c2 */ 0xd96f,
+ /* key: 0x85c3 */ 0xffff,
+ /* key: 0x85c4 */ 0xffff,
+ /* key: 0x85c5 */ 0xffff,
+ /* key: 0x85c6 */ 0xffff,
+ /* key: 0x85c7 */ 0xd970,
+ /* key: 0x85c8 */ 0xffff,
+ /* key: 0x85c9 */ 0x6934,
+ /* key: 0x85ca */ 0xd971,
+ /* key: 0x85cb */ 0xd972,
+ /* key: 0x85cc */ 0xffff,
+ /* key: 0x85cd */ 0x4d75,
+ /* key: 0x85ce */ 0xd973,
+ /* key: 0x85cf */ 0x6936,
+ /* key: 0x85d0 */ 0x6938,
+ /* key: 0x85d1 */ 0xffff,
+ /* key: 0x85d2 */ 0xffff,
+ /* key: 0x85d3 */ 0xffff,
+ /* key: 0x85d4 */ 0xffff,
+ /* key: 0x85d5 */ 0x6939,
+ /* key: 0x85d6 */ 0xffff,
+ /* key: 0x85d7 */ 0xffff,
+ /* key: 0x85d8 */ 0xd975,
+ /* key: 0x85d9 */ 0xffff,
+ /* key: 0x85da */ 0xd976,
+ /* key: 0x85db */ 0xffff,
+ /* key: 0x85dc */ 0x693c,
+ /* key: 0x85dd */ 0x693a,
+ /* key: 0x85de */ 0xffff,
+ /* key: 0x85df */ 0xd977,
+ /* key: 0x85e0 */ 0xd978,
+ /* key: 0x85e1 */ 0xffff,
+ /* key: 0x85e2 */ 0xffff,
+ /* key: 0x85e3 */ 0xffff,
+ /* key: 0x85e4 */ 0x4623,
+ /* key: 0x85e5 */ 0x693b,
+ /* key: 0x85e6 */ 0xd979,
+ /* key: 0x85e7 */ 0xffff,
+ /* key: 0x85e8 */ 0xd97a,
+ /* key: 0x85e9 */ 0x484d,
+ /* key: 0x85ea */ 0x692e,
+ /* key: 0x85eb */ 0xffff,
+ /* key: 0x85ec */ 0xffff,
+ /* key: 0x85ed */ 0xd97b,
+ /* key: 0x85ee */ 0xffff,
+ /* key: 0x85ef */ 0xffff,
+ /* key: 0x85f0 */ 0xffff,
+ /* key: 0x85f1 */ 0xffff,
+ /* key: 0x85f2 */ 0xffff,
+ /* key: 0x85f3 */ 0xd97c,
+ /* key: 0x85f4 */ 0xffff,
+ /* key: 0x85f5 */ 0xffff,
+ /* key: 0x85f6 */ 0xd97d,
+ /* key: 0x85f7 */ 0x3d73,
+ /* key: 0x85f8 */ 0xffff,
+ /* key: 0x85f9 */ 0x693d,
+ /* key: 0x85fa */ 0x6942,
+ /* key: 0x85fb */ 0x4174,
+ /* key: 0x85fc */ 0xd97e,
+ /* key: 0x85fd */ 0xffff,
+ /* key: 0x85fe */ 0x6941,
+ /* key: 0x85ff */ 0xda21,
+ /* branch: 0x860X */ 16720,
+ /* branch: 0x861X */ 16736,
+ /* branch: 0x862X */ 16752,
+ /* branch: 0x863X */ 16768,
+ /* branch: 0x864X */ 16784,
+ /* branch: 0x865X */ 16800,
+ /* branch: 0x866X */ 16816,
+ /* branch: 0x867X */ 16832,
+ /* branch: 0x868X */ 16848,
+ /* branch: 0x869X */ 16864,
+ /* branch: 0x86aX */ 16880,
+ /* branch: 0x86bX */ 16896,
+ /* branch: 0x86cX */ 16912,
+ /* branch: 0x86dX */ 16928,
+ /* branch: 0x86eX */ 16944,
+ /* branch: 0x86fX */ 16960,
+ /* key: 0x8600 */ 0xda22,
+ /* key: 0x8601 */ 0xffff,
+ /* key: 0x8602 */ 0x6922,
+ /* key: 0x8603 */ 0xffff,
+ /* key: 0x8604 */ 0xda23,
+ /* key: 0x8605 */ 0xda24,
+ /* key: 0x8606 */ 0x6943,
+ /* key: 0x8607 */ 0x4149,
+ /* key: 0x8608 */ 0xffff,
+ /* key: 0x8609 */ 0xffff,
+ /* key: 0x860a */ 0x693e,
+ /* key: 0x860b */ 0x6940,
+ /* key: 0x860c */ 0xffff,
+ /* key: 0x860d */ 0xda25,
+ /* key: 0x860e */ 0xda26,
+ /* key: 0x860f */ 0xffff,
+ /* key: 0x8610 */ 0xda27,
+ /* key: 0x8611 */ 0xda28,
+ /* key: 0x8612 */ 0xda29,
+ /* key: 0x8613 */ 0x693f,
+ /* key: 0x8614 */ 0xffff,
+ /* key: 0x8615 */ 0xffff,
+ /* key: 0x8616 */ 0x5d31,
+ /* key: 0x8617 */ 0x5d22,
+ /* key: 0x8618 */ 0xda2a,
+ /* key: 0x8619 */ 0xda2b,
+ /* key: 0x861a */ 0x6945,
+ /* key: 0x861b */ 0xda2c,
+ /* key: 0x861c */ 0xffff,
+ /* key: 0x861d */ 0xffff,
+ /* key: 0x861e */ 0xda2d,
+ /* key: 0x861f */ 0xffff,
+ /* key: 0x8620 */ 0xffff,
+ /* key: 0x8621 */ 0xda2e,
+ /* key: 0x8622 */ 0x6944,
+ /* key: 0x8623 */ 0xffff,
+ /* key: 0x8624 */ 0xffff,
+ /* key: 0x8625 */ 0xffff,
+ /* key: 0x8626 */ 0xffff,
+ /* key: 0x8627 */ 0xda2f,
+ /* key: 0x8628 */ 0xffff,
+ /* key: 0x8629 */ 0xda30,
+ /* key: 0x862a */ 0xffff,
+ /* key: 0x862b */ 0xffff,
+ /* key: 0x862c */ 0xffff,
+ /* key: 0x862d */ 0x4d76,
+ /* key: 0x862e */ 0xffff,
+ /* key: 0x862f */ 0x623c,
+ /* key: 0x8630 */ 0x6946,
+ /* key: 0x8631 */ 0xffff,
+ /* key: 0x8632 */ 0xffff,
+ /* key: 0x8633 */ 0xffff,
+ /* key: 0x8634 */ 0xffff,
+ /* key: 0x8635 */ 0xffff,
+ /* key: 0x8636 */ 0xda31,
+ /* key: 0x8637 */ 0xffff,
+ /* key: 0x8638 */ 0xda32,
+ /* key: 0x8639 */ 0xffff,
+ /* key: 0x863a */ 0xda33,
+ /* key: 0x863b */ 0xffff,
+ /* key: 0x863c */ 0xda34,
+ /* key: 0x863d */ 0xda35,
+ /* key: 0x863e */ 0xffff,
+ /* key: 0x863f */ 0x6947,
+ /* key: 0x8640 */ 0xda36,
+ /* key: 0x8641 */ 0xb866,
+ /* key: 0x8642 */ 0xda37,
+ /* key: 0x8643 */ 0xffff,
+ /* key: 0x8644 */ 0xffff,
+ /* key: 0x8645 */ 0xffff,
+ /* key: 0x8646 */ 0xda38,
+ /* key: 0x8647 */ 0xffff,
+ /* key: 0x8648 */ 0xffff,
+ /* key: 0x8649 */ 0xffff,
+ /* key: 0x864a */ 0xffff,
+ /* key: 0x864b */ 0xffff,
+ /* key: 0x864c */ 0xffff,
+ /* key: 0x864d */ 0x6948,
+ /* key: 0x864e */ 0x3857,
+ /* key: 0x864f */ 0xffff,
+ /* key: 0x8650 */ 0x3554,
+ /* key: 0x8651 */ 0xffff,
+ /* key: 0x8652 */ 0xda39,
+ /* key: 0x8653 */ 0xda3a,
+ /* key: 0x8654 */ 0x694a,
+ /* key: 0x8655 */ 0x515d,
+ /* key: 0x8656 */ 0xda3b,
+ /* key: 0x8657 */ 0xda3c,
+ /* key: 0x8658 */ 0xda3d,
+ /* key: 0x8659 */ 0xda3e,
+ /* key: 0x865a */ 0x3575,
+ /* key: 0x865b */ 0xffff,
+ /* key: 0x865c */ 0x4e3a,
+ /* key: 0x865d */ 0xda3f,
+ /* key: 0x865e */ 0x3673,
+ /* key: 0x865f */ 0x694b,
+ /* key: 0x8660 */ 0xda40,
+ /* key: 0x8661 */ 0xda41,
+ /* key: 0x8662 */ 0xda42,
+ /* key: 0x8663 */ 0xda43,
+ /* key: 0x8664 */ 0xda44,
+ /* key: 0x8665 */ 0xffff,
+ /* key: 0x8666 */ 0xffff,
+ /* key: 0x8667 */ 0x694c,
+ /* key: 0x8668 */ 0xffff,
+ /* key: 0x8669 */ 0xda45,
+ /* key: 0x866a */ 0xffff,
+ /* key: 0x866b */ 0x436e,
+ /* key: 0x866c */ 0xda46,
+ /* key: 0x866d */ 0xffff,
+ /* key: 0x866e */ 0xffff,
+ /* key: 0x866f */ 0xda47,
+ /* key: 0x8670 */ 0xffff,
+ /* key: 0x8671 */ 0x694d,
+ /* key: 0x8672 */ 0xffff,
+ /* key: 0x8673 */ 0xffff,
+ /* key: 0x8674 */ 0xffff,
+ /* key: 0x8675 */ 0xda48,
+ /* key: 0x8676 */ 0xda49,
+ /* key: 0x8677 */ 0xda4a,
+ /* key: 0x8678 */ 0xffff,
+ /* key: 0x8679 */ 0x467a,
+ /* key: 0x867a */ 0xda4b,
+ /* key: 0x867b */ 0x303a,
+ /* key: 0x867c */ 0xffff,
+ /* key: 0x867d */ 0xffff,
+ /* key: 0x867e */ 0xffff,
+ /* key: 0x867f */ 0xffff,
+ /* key: 0x8680 */ 0xffff,
+ /* key: 0x8681 */ 0xffff,
+ /* key: 0x8682 */ 0xffff,
+ /* key: 0x8683 */ 0xffff,
+ /* key: 0x8684 */ 0xffff,
+ /* key: 0x8685 */ 0xffff,
+ /* key: 0x8686 */ 0xffff,
+ /* key: 0x8687 */ 0xffff,
+ /* key: 0x8688 */ 0xda6d,
+ /* key: 0x8689 */ 0xffff,
+ /* key: 0x868a */ 0x3263,
+ /* key: 0x868b */ 0x6952,
+ /* key: 0x868c */ 0x6953,
+ /* key: 0x868d */ 0xda4c,
+ /* key: 0x868e */ 0xffff,
+ /* key: 0x868f */ 0xffff,
+ /* key: 0x8690 */ 0xffff,
+ /* key: 0x8691 */ 0xda4d,
+ /* key: 0x8692 */ 0xffff,
+ /* key: 0x8693 */ 0x694e,
+ /* key: 0x8694 */ 0xffff,
+ /* key: 0x8695 */ 0x3b3d,
+ /* key: 0x8696 */ 0xda4e,
+ /* key: 0x8697 */ 0xffff,
+ /* key: 0x8698 */ 0xda4f,
+ /* key: 0x8699 */ 0xffff,
+ /* key: 0x869a */ 0xda50,
+ /* key: 0x869b */ 0xffff,
+ /* key: 0x869c */ 0xda51,
+ /* key: 0x869d */ 0xffff,
+ /* key: 0x869e */ 0xffff,
+ /* key: 0x869f */ 0xffff,
+ /* key: 0x86a0 */ 0xffff,
+ /* key: 0x86a1 */ 0xda52,
+ /* key: 0x86a2 */ 0xffff,
+ /* key: 0x86a3 */ 0x694f,
+ /* key: 0x86a4 */ 0x4742,
+ /* key: 0x86a5 */ 0xffff,
+ /* key: 0x86a6 */ 0xda53,
+ /* key: 0x86a7 */ 0xda54,
+ /* key: 0x86a8 */ 0xda55,
+ /* key: 0x86a9 */ 0x6950,
+ /* key: 0x86aa */ 0x6951,
+ /* key: 0x86ab */ 0x695b,
+ /* key: 0x86ac */ 0xffff,
+ /* key: 0x86ad */ 0xda56,
+ /* key: 0x86ae */ 0xffff,
+ /* key: 0x86af */ 0x6955,
+ /* key: 0x86b0 */ 0x6958,
+ /* key: 0x86b1 */ 0xda57,
+ /* key: 0x86b2 */ 0xffff,
+ /* key: 0x86b3 */ 0xda58,
+ /* key: 0x86b4 */ 0xda59,
+ /* key: 0x86b5 */ 0xda5a,
+ /* key: 0x86b6 */ 0x6954,
+ /* key: 0x86b7 */ 0xda5b,
+ /* key: 0x86b8 */ 0xda5c,
+ /* key: 0x86b9 */ 0xda5d,
+ /* key: 0x86ba */ 0xffff,
+ /* key: 0x86bb */ 0xffff,
+ /* key: 0x86bc */ 0xffff,
+ /* key: 0x86bd */ 0xffff,
+ /* key: 0x86be */ 0xffff,
+ /* key: 0x86bf */ 0xda5e,
+ /* key: 0x86c0 */ 0xda5f,
+ /* key: 0x86c1 */ 0xda60,
+ /* key: 0x86c2 */ 0xffff,
+ /* key: 0x86c3 */ 0xda61,
+ /* key: 0x86c4 */ 0x6956,
+ /* key: 0x86c5 */ 0xda62,
+ /* key: 0x86c6 */ 0x6957,
+ /* key: 0x86c7 */ 0x3c58,
+ /* key: 0x86c8 */ 0xffff,
+ /* key: 0x86c9 */ 0x6959,
+ /* key: 0x86ca */ 0xffff,
+ /* key: 0x86cb */ 0x4341,
+ /* key: 0x86cc */ 0xffff,
+ /* key: 0x86cd */ 0x3756,
+ /* key: 0x86ce */ 0x3342,
+ /* key: 0x86cf */ 0xffff,
+ /* key: 0x86d0 */ 0xffff,
+ /* key: 0x86d1 */ 0xda63,
+ /* key: 0x86d2 */ 0xda64,
+ /* key: 0x86d3 */ 0xffff,
+ /* key: 0x86d4 */ 0x695c,
+ /* key: 0x86d5 */ 0xda65,
+ /* key: 0x86d6 */ 0xffff,
+ /* key: 0x86d7 */ 0xda66,
+ /* key: 0x86d8 */ 0xffff,
+ /* key: 0x86d9 */ 0x333f,
+ /* key: 0x86da */ 0xda67,
+ /* key: 0x86db */ 0x6961,
+ /* key: 0x86dc */ 0xda68,
+ /* key: 0x86dd */ 0xffff,
+ /* key: 0x86de */ 0x695d,
+ /* key: 0x86df */ 0x6960,
+ /* key: 0x86e0 */ 0xda69,
+ /* key: 0x86e1 */ 0xffff,
+ /* key: 0x86e2 */ 0xffff,
+ /* key: 0x86e3 */ 0xda6a,
+ /* key: 0x86e4 */ 0x483a,
+ /* key: 0x86e5 */ 0xda6b,
+ /* key: 0x86e6 */ 0xffff,
+ /* key: 0x86e7 */ 0xda6c,
+ /* key: 0x86e8 */ 0xffff,
+ /* key: 0x86e9 */ 0x695e,
+ /* key: 0x86ea */ 0xffff,
+ /* key: 0x86eb */ 0xffff,
+ /* key: 0x86ec */ 0x695f,
+ /* key: 0x86ed */ 0x4948,
+ /* key: 0x86ee */ 0x485a,
+ /* key: 0x86ef */ 0x6962,
+ /* key: 0x86f0 */ 0xffff,
+ /* key: 0x86f1 */ 0xffff,
+ /* key: 0x86f2 */ 0xffff,
+ /* key: 0x86f3 */ 0xffff,
+ /* key: 0x86f4 */ 0xffff,
+ /* key: 0x86f5 */ 0xffff,
+ /* key: 0x86f6 */ 0xffff,
+ /* key: 0x86f7 */ 0xffff,
+ /* key: 0x86f8 */ 0x427d,
+ /* key: 0x86f9 */ 0x696c,
+ /* key: 0x86fa */ 0xda6e,
+ /* key: 0x86fb */ 0x6968,
+ /* key: 0x86fc */ 0xda6f,
+ /* key: 0x86fd */ 0xda70,
+ /* key: 0x86fe */ 0x326b,
+ /* key: 0x86ff */ 0xffff,
+ /* branch: 0x870X */ 16992,
+ /* branch: 0x871X */ 17008,
+ /* branch: 0x872X */ 17024,
+ /* branch: 0x873X */ 17040,
+ /* branch: 0x874X */ 17056,
+ /* branch: 0x875X */ 17072,
+ /* branch: 0x876X */ 17088,
+ /* branch: 0x877X */ 17104,
+ /* branch: 0x878X */ 17120,
+ /* branch: 0x879X */ 17136,
+ /* branch: 0x87aX */ 17152,
+ /* branch: 0x87bX */ 17168,
+ /* branch: 0x87cX */ 17184,
+ /* branch: 0x87dX */ 17200,
+ /* branch: 0x87eX */ 17216,
+ /* branch: 0x87fX */ 17232,
+ /* key: 0x8700 */ 0x6966,
+ /* key: 0x8701 */ 0xffff,
+ /* key: 0x8702 */ 0x4b2a,
+ /* key: 0x8703 */ 0x6967,
+ /* key: 0x8704 */ 0xda71,
+ /* key: 0x8705 */ 0xda72,
+ /* key: 0x8706 */ 0x6964,
+ /* key: 0x8707 */ 0xda73,
+ /* key: 0x8708 */ 0x6965,
+ /* key: 0x8709 */ 0x696a,
+ /* key: 0x870a */ 0x696d,
+ /* key: 0x870b */ 0xda74,
+ /* key: 0x870c */ 0xffff,
+ /* key: 0x870d */ 0x696b,
+ /* key: 0x870e */ 0xda75,
+ /* key: 0x870f */ 0xda76,
+ /* key: 0x8710 */ 0xda77,
+ /* key: 0x8711 */ 0x6969,
+ /* key: 0x8712 */ 0x6963,
+ /* key: 0x8713 */ 0xda78,
+ /* key: 0x8714 */ 0xda79,
+ /* key: 0x8715 */ 0xffff,
+ /* key: 0x8716 */ 0xffff,
+ /* key: 0x8717 */ 0xffff,
+ /* key: 0x8718 */ 0x4358,
+ /* key: 0x8719 */ 0xda7a,
+ /* key: 0x871a */ 0x6974,
+ /* key: 0x871b */ 0xffff,
+ /* key: 0x871c */ 0x4c2a,
+ /* key: 0x871d */ 0xffff,
+ /* key: 0x871e */ 0xda7b,
+ /* key: 0x871f */ 0xda7c,
+ /* key: 0x8720 */ 0xffff,
+ /* key: 0x8721 */ 0xda7d,
+ /* key: 0x8722 */ 0xffff,
+ /* key: 0x8723 */ 0xda7e,
+ /* key: 0x8724 */ 0xffff,
+ /* key: 0x8725 */ 0x6972,
+ /* key: 0x8726 */ 0xffff,
+ /* key: 0x8727 */ 0xffff,
+ /* key: 0x8728 */ 0xdb21,
+ /* key: 0x8729 */ 0x6973,
+ /* key: 0x872a */ 0xffff,
+ /* key: 0x872b */ 0xffff,
+ /* key: 0x872c */ 0xffff,
+ /* key: 0x872d */ 0xffff,
+ /* key: 0x872e */ 0xdb22,
+ /* key: 0x872f */ 0xdb23,
+ /* key: 0x8730 */ 0xffff,
+ /* key: 0x8731 */ 0xdb24,
+ /* key: 0x8732 */ 0xdb25,
+ /* key: 0x8733 */ 0xffff,
+ /* key: 0x8734 */ 0x696e,
+ /* key: 0x8735 */ 0xffff,
+ /* key: 0x8736 */ 0xffff,
+ /* key: 0x8737 */ 0x6970,
+ /* key: 0x8738 */ 0xffff,
+ /* key: 0x8739 */ 0xdb26,
+ /* key: 0x873a */ 0xdb27,
+ /* key: 0x873b */ 0x6971,
+ /* key: 0x873c */ 0xdb28,
+ /* key: 0x873d */ 0xdb29,
+ /* key: 0x873e */ 0xdb2a,
+ /* key: 0x873f */ 0x696f,
+ /* key: 0x8740 */ 0xdb2b,
+ /* key: 0x8741 */ 0xffff,
+ /* key: 0x8742 */ 0xffff,
+ /* key: 0x8743 */ 0xdb2c,
+ /* key: 0x8744 */ 0xffff,
+ /* key: 0x8745 */ 0xdb2d,
+ /* key: 0x8746 */ 0xffff,
+ /* key: 0x8747 */ 0xffff,
+ /* key: 0x8748 */ 0xffff,
+ /* key: 0x8749 */ 0x4066,
+ /* key: 0x874a */ 0xffff,
+ /* key: 0x874b */ 0x4f39,
+ /* key: 0x874c */ 0x6978,
+ /* key: 0x874d */ 0xdb2e,
+ /* key: 0x874e */ 0x6979,
+ /* key: 0x874f */ 0xffff,
+ /* key: 0x8750 */ 0xffff,
+ /* key: 0x8751 */ 0xffff,
+ /* key: 0x8752 */ 0xffff,
+ /* key: 0x8753 */ 0x6a21,
+ /* key: 0x8754 */ 0xffff,
+ /* key: 0x8755 */ 0x3f2a,
+ /* key: 0x8756 */ 0xffff,
+ /* key: 0x8757 */ 0x697b,
+ /* key: 0x8758 */ 0xdb2f,
+ /* key: 0x8759 */ 0x697e,
+ /* key: 0x875a */ 0xffff,
+ /* key: 0x875b */ 0xffff,
+ /* key: 0x875c */ 0xffff,
+ /* key: 0x875d */ 0xdb30,
+ /* key: 0x875e */ 0xffff,
+ /* key: 0x875f */ 0x6976,
+ /* key: 0x8760 */ 0x6975,
+ /* key: 0x8761 */ 0xdb31,
+ /* key: 0x8762 */ 0xffff,
+ /* key: 0x8763 */ 0x6a22,
+ /* key: 0x8764 */ 0xdb32,
+ /* key: 0x8765 */ 0xdb33,
+ /* key: 0x8766 */ 0x325c,
+ /* key: 0x8767 */ 0xffff,
+ /* key: 0x8768 */ 0x697c,
+ /* key: 0x8769 */ 0xffff,
+ /* key: 0x876a */ 0x6a23,
+ /* key: 0x876b */ 0xffff,
+ /* key: 0x876c */ 0xffff,
+ /* key: 0x876d */ 0xffff,
+ /* key: 0x876e */ 0x697d,
+ /* key: 0x876f */ 0xdb34,
+ /* key: 0x8770 */ 0xffff,
+ /* key: 0x8771 */ 0xdb35,
+ /* key: 0x8772 */ 0xdb36,
+ /* key: 0x8773 */ 0xffff,
+ /* key: 0x8774 */ 0x697a,
+ /* key: 0x8775 */ 0xffff,
+ /* key: 0x8776 */ 0x4433,
+ /* key: 0x8777 */ 0xffff,
+ /* key: 0x8778 */ 0x6977,
+ /* key: 0x8779 */ 0xffff,
+ /* key: 0x877a */ 0xffff,
+ /* key: 0x877b */ 0xdb37,
+ /* key: 0x877c */ 0xffff,
+ /* key: 0x877d */ 0xffff,
+ /* key: 0x877e */ 0xffff,
+ /* key: 0x877f */ 0x4768,
+ /* key: 0x8780 */ 0xffff,
+ /* key: 0x8781 */ 0xffff,
+ /* key: 0x8782 */ 0x6a27,
+ /* key: 0x8783 */ 0xdb38,
+ /* key: 0x8784 */ 0xdb39,
+ /* key: 0x8785 */ 0xdb3a,
+ /* key: 0x8786 */ 0xdb3b,
+ /* key: 0x8787 */ 0xdb3c,
+ /* key: 0x8788 */ 0xdb3d,
+ /* key: 0x8789 */ 0xdb3e,
+ /* key: 0x878a */ 0xffff,
+ /* key: 0x878b */ 0xdb3f,
+ /* key: 0x878c */ 0xdb40,
+ /* key: 0x878d */ 0x4d3b,
+ /* key: 0x878e */ 0xffff,
+ /* key: 0x878f */ 0xffff,
+ /* key: 0x8790 */ 0xdb41,
+ /* key: 0x8791 */ 0xffff,
+ /* key: 0x8792 */ 0xffff,
+ /* key: 0x8793 */ 0xdb42,
+ /* key: 0x8794 */ 0xffff,
+ /* key: 0x8795 */ 0xdb43,
+ /* key: 0x8796 */ 0xffff,
+ /* key: 0x8797 */ 0xdb44,
+ /* key: 0x8798 */ 0xdb45,
+ /* key: 0x8799 */ 0xdb46,
+ /* key: 0x879a */ 0xffff,
+ /* key: 0x879b */ 0xffff,
+ /* key: 0x879c */ 0xffff,
+ /* key: 0x879d */ 0xffff,
+ /* key: 0x879e */ 0xdb47,
+ /* key: 0x879f */ 0x6a26,
+ /* key: 0x87a0 */ 0xdb48,
+ /* key: 0x87a1 */ 0xffff,
+ /* key: 0x87a2 */ 0x6a25,
+ /* key: 0x87a3 */ 0xdb49,
+ /* key: 0x87a4 */ 0xffff,
+ /* key: 0x87a5 */ 0xffff,
+ /* key: 0x87a6 */ 0xffff,
+ /* key: 0x87a7 */ 0xdb4a,
+ /* key: 0x87a8 */ 0xffff,
+ /* key: 0x87a9 */ 0xffff,
+ /* key: 0x87aa */ 0xffff,
+ /* key: 0x87ab */ 0x6a2e,
+ /* key: 0x87ac */ 0xdb4b,
+ /* key: 0x87ad */ 0xdb4c,
+ /* key: 0x87ae */ 0xdb4d,
+ /* key: 0x87af */ 0x6a28,
+ /* key: 0x87b0 */ 0xffff,
+ /* key: 0x87b1 */ 0xdb4e,
+ /* key: 0x87b2 */ 0xffff,
+ /* key: 0x87b3 */ 0x6a30,
+ /* key: 0x87b4 */ 0xffff,
+ /* key: 0x87b5 */ 0xdb4f,
+ /* key: 0x87b6 */ 0xffff,
+ /* key: 0x87b7 */ 0xffff,
+ /* key: 0x87b8 */ 0xffff,
+ /* key: 0x87b9 */ 0xffff,
+ /* key: 0x87ba */ 0x4d66,
+ /* key: 0x87bb */ 0x6a33,
+ /* key: 0x87bc */ 0xffff,
+ /* key: 0x87bd */ 0x6a2a,
+ /* key: 0x87be */ 0xdb50,
+ /* key: 0x87bf */ 0xdb51,
+ /* key: 0x87c0 */ 0x6a2b,
+ /* key: 0x87c1 */ 0xdb52,
+ /* key: 0x87c2 */ 0xffff,
+ /* key: 0x87c3 */ 0xffff,
+ /* key: 0x87c4 */ 0x6a2f,
+ /* key: 0x87c5 */ 0xffff,
+ /* key: 0x87c6 */ 0x6a32,
+ /* key: 0x87c7 */ 0x6a31,
+ /* key: 0x87c8 */ 0xdb53,
+ /* key: 0x87c9 */ 0xdb54,
+ /* key: 0x87ca */ 0xdb55,
+ /* key: 0x87cb */ 0x6a29,
+ /* key: 0x87cc */ 0xffff,
+ /* key: 0x87cd */ 0xffff,
+ /* key: 0x87ce */ 0xdb56,
+ /* key: 0x87cf */ 0xffff,
+ /* key: 0x87d0 */ 0x6a2c,
+ /* key: 0x87d1 */ 0xffff,
+ /* key: 0x87d2 */ 0x6a3d,
+ /* key: 0x87d3 */ 0xffff,
+ /* key: 0x87d4 */ 0xffff,
+ /* key: 0x87d5 */ 0xdb57,
+ /* key: 0x87d6 */ 0xdb58,
+ /* key: 0x87d7 */ 0xffff,
+ /* key: 0x87d8 */ 0xffff,
+ /* key: 0x87d9 */ 0xdb59,
+ /* key: 0x87da */ 0xdb5a,
+ /* key: 0x87db */ 0xffff,
+ /* key: 0x87dc */ 0xdb5b,
+ /* key: 0x87dd */ 0xffff,
+ /* key: 0x87de */ 0xffff,
+ /* key: 0x87df */ 0xdb5c,
+ /* key: 0x87e0 */ 0x6a36,
+ /* key: 0x87e1 */ 0xffff,
+ /* key: 0x87e2 */ 0xdb5d,
+ /* key: 0x87e3 */ 0xdb5e,
+ /* key: 0x87e4 */ 0xdb5f,
+ /* key: 0x87e5 */ 0xffff,
+ /* key: 0x87e6 */ 0xffff,
+ /* key: 0x87e7 */ 0xffff,
+ /* key: 0x87e8 */ 0xffff,
+ /* key: 0x87e9 */ 0xffff,
+ /* key: 0x87ea */ 0xdb60,
+ /* key: 0x87eb */ 0xdb61,
+ /* key: 0x87ec */ 0xffff,
+ /* key: 0x87ed */ 0xdb62,
+ /* key: 0x87ee */ 0xffff,
+ /* key: 0x87ef */ 0x6a34,
+ /* key: 0x87f0 */ 0xffff,
+ /* key: 0x87f1 */ 0xdb63,
+ /* key: 0x87f2 */ 0x6a35,
+ /* key: 0x87f3 */ 0xdb64,
+ /* key: 0x87f4 */ 0xffff,
+ /* key: 0x87f5 */ 0xffff,
+ /* key: 0x87f6 */ 0x6a3a,
+ /* key: 0x87f7 */ 0x6a3b,
+ /* key: 0x87f8 */ 0xdb65,
+ /* key: 0x87f9 */ 0x332a,
+ /* key: 0x87fa */ 0xdb66,
+ /* key: 0x87fb */ 0x3542,
+ /* key: 0x87fc */ 0xffff,
+ /* key: 0x87fd */ 0xffff,
+ /* key: 0x87fe */ 0x6a39,
+ /* key: 0x87ff */ 0xdb67,
+ /* branch: 0x880X */ 17264,
+ /* branch: 0x881X */ 17280,
+ /* branch: 0x882X */ 17296,
+ /* branch: 0x883X */ 17312,
+ /* branch: 0x884X */ 17328,
+ /* branch: 0x885X */ 17344,
+ /* branch: 0x886X */ 17360,
+ /* branch: 0x887X */ 17376,
+ /* branch: 0x888X */ 17392,
+ /* branch: 0x889X */ 17408,
+ /* branch: 0x88aX */ 17424,
+ /* branch: 0x88bX */ 17440,
+ /* branch: 0x88cX */ 17456,
+ /* branch: 0x88dX */ 17472,
+ /* branch: 0x88eX */ 17488,
+ /* branch: 0x88fX */ 17504,
+ /* key: 0x8800 */ 0xffff,
+ /* key: 0x8801 */ 0xdb68,
+ /* key: 0x8802 */ 0xffff,
+ /* key: 0x8803 */ 0xdb69,
+ /* key: 0x8804 */ 0xffff,
+ /* key: 0x8805 */ 0x6a24,
+ /* key: 0x8806 */ 0xdb6a,
+ /* key: 0x8807 */ 0xffff,
+ /* key: 0x8808 */ 0xffff,
+ /* key: 0x8809 */ 0xdb6b,
+ /* key: 0x880a */ 0xdb6c,
+ /* key: 0x880b */ 0xdb6d,
+ /* key: 0x880c */ 0xffff,
+ /* key: 0x880d */ 0x6a38,
+ /* key: 0x880e */ 0x6a3c,
+ /* key: 0x880f */ 0x6a37,
+ /* key: 0x8810 */ 0xdb6e,
+ /* key: 0x8811 */ 0x6a3e,
+ /* key: 0x8812 */ 0xdb70,
+ /* key: 0x8813 */ 0xdb71,
+ /* key: 0x8814 */ 0xdb72,
+ /* key: 0x8815 */ 0x6a40,
+ /* key: 0x8816 */ 0x6a3f,
+ /* key: 0x8817 */ 0xffff,
+ /* key: 0x8818 */ 0xdb73,
+ /* key: 0x8819 */ 0xdb6f,
+ /* key: 0x881a */ 0xdb74,
+ /* key: 0x881b */ 0xdb75,
+ /* key: 0x881c */ 0xdb76,
+ /* key: 0x881d */ 0xffff,
+ /* key: 0x881e */ 0xdb77,
+ /* key: 0x881f */ 0xdb78,
+ /* key: 0x8820 */ 0xffff,
+ /* key: 0x8821 */ 0x6a42,
+ /* key: 0x8822 */ 0x6a41,
+ /* key: 0x8823 */ 0x695a,
+ /* key: 0x8824 */ 0xffff,
+ /* key: 0x8825 */ 0xffff,
+ /* key: 0x8826 */ 0xffff,
+ /* key: 0x8827 */ 0x6a46,
+ /* key: 0x8828 */ 0xdb79,
+ /* key: 0x8829 */ 0xffff,
+ /* key: 0x882a */ 0xffff,
+ /* key: 0x882b */ 0xffff,
+ /* key: 0x882c */ 0xffff,
+ /* key: 0x882d */ 0xdb7a,
+ /* key: 0x882e */ 0xdb7b,
+ /* key: 0x882f */ 0xffff,
+ /* key: 0x8830 */ 0xdb7c,
+ /* key: 0x8831 */ 0x6a43,
+ /* key: 0x8832 */ 0xdb7d,
+ /* key: 0x8833 */ 0xffff,
+ /* key: 0x8834 */ 0xffff,
+ /* key: 0x8835 */ 0xdb7e,
+ /* key: 0x8836 */ 0x6a44,
+ /* key: 0x8837 */ 0xffff,
+ /* key: 0x8838 */ 0xffff,
+ /* key: 0x8839 */ 0x6a45,
+ /* key: 0x883a */ 0xdc21,
+ /* key: 0x883b */ 0x6a47,
+ /* key: 0x883c */ 0xdc22,
+ /* key: 0x883d */ 0xffff,
+ /* key: 0x883e */ 0xffff,
+ /* key: 0x883f */ 0xffff,
+ /* key: 0x8840 */ 0x376c,
+ /* key: 0x8841 */ 0xdc23,
+ /* key: 0x8842 */ 0x6a49,
+ /* key: 0x8843 */ 0xdc24,
+ /* key: 0x8844 */ 0x6a48,
+ /* key: 0x8845 */ 0xdc25,
+ /* key: 0x8846 */ 0x3d30,
+ /* key: 0x8847 */ 0xffff,
+ /* key: 0x8848 */ 0xdc26,
+ /* key: 0x8849 */ 0xdc27,
+ /* key: 0x884a */ 0xdc28,
+ /* key: 0x884b */ 0xdc29,
+ /* key: 0x884c */ 0x3954,
+ /* key: 0x884d */ 0x5e27,
+ /* key: 0x884e */ 0xdc2a,
+ /* key: 0x884f */ 0xffff,
+ /* key: 0x8850 */ 0xffff,
+ /* key: 0x8851 */ 0xdc2b,
+ /* key: 0x8852 */ 0x6a4a,
+ /* key: 0x8853 */ 0x3d51,
+ /* key: 0x8854 */ 0xffff,
+ /* key: 0x8855 */ 0xdc2c,
+ /* key: 0x8856 */ 0xdc2d,
+ /* key: 0x8857 */ 0x3339,
+ /* key: 0x8858 */ 0xdc2e,
+ /* key: 0x8859 */ 0x6a4b,
+ /* key: 0x885a */ 0xdc2f,
+ /* key: 0x885b */ 0x3152,
+ /* key: 0x885c */ 0xdc30,
+ /* key: 0x885d */ 0x3e57,
+ /* key: 0x885e */ 0x6a4c,
+ /* key: 0x885f */ 0xdc31,
+ /* key: 0x8860 */ 0xdc32,
+ /* key: 0x8861 */ 0x3955,
+ /* key: 0x8862 */ 0x6a4d,
+ /* key: 0x8863 */ 0x3061,
+ /* key: 0x8864 */ 0xdc33,
+ /* key: 0x8865 */ 0xffff,
+ /* key: 0x8866 */ 0xffff,
+ /* key: 0x8867 */ 0xffff,
+ /* key: 0x8868 */ 0x493d,
+ /* key: 0x8869 */ 0xdc34,
+ /* key: 0x886a */ 0xffff,
+ /* key: 0x886b */ 0x6a4e,
+ /* key: 0x886c */ 0xffff,
+ /* key: 0x886d */ 0xffff,
+ /* key: 0x886e */ 0xffff,
+ /* key: 0x886f */ 0xffff,
+ /* key: 0x8870 */ 0x3f6a,
+ /* key: 0x8871 */ 0xdc35,
+ /* key: 0x8872 */ 0x6a55,
+ /* key: 0x8873 */ 0xffff,
+ /* key: 0x8874 */ 0xffff,
+ /* key: 0x8875 */ 0x6a52,
+ /* key: 0x8876 */ 0xffff,
+ /* key: 0x8877 */ 0x436f,
+ /* key: 0x8878 */ 0xffff,
+ /* key: 0x8879 */ 0xdc36,
+ /* key: 0x887a */ 0xffff,
+ /* key: 0x887b */ 0xdc37,
+ /* key: 0x887c */ 0xffff,
+ /* key: 0x887d */ 0x6a53,
+ /* key: 0x887e */ 0x6a50,
+ /* key: 0x887f */ 0x365e,
+ /* key: 0x8880 */ 0xdc38,
+ /* key: 0x8881 */ 0x6a4f,
+ /* key: 0x8882 */ 0x6a56,
+ /* key: 0x8883 */ 0xffff,
+ /* key: 0x8884 */ 0xffff,
+ /* key: 0x8885 */ 0xffff,
+ /* key: 0x8886 */ 0xffff,
+ /* key: 0x8887 */ 0xffff,
+ /* key: 0x8888 */ 0x3736,
+ /* key: 0x8889 */ 0xffff,
+ /* key: 0x888a */ 0xffff,
+ /* key: 0x888b */ 0x425e,
+ /* key: 0x888c */ 0xffff,
+ /* key: 0x888d */ 0x6a5c,
+ /* key: 0x888e */ 0xffff,
+ /* key: 0x888f */ 0xffff,
+ /* key: 0x8890 */ 0xffff,
+ /* key: 0x8891 */ 0xffff,
+ /* key: 0x8892 */ 0x6a58,
+ /* key: 0x8893 */ 0xffff,
+ /* key: 0x8894 */ 0xffff,
+ /* key: 0x8895 */ 0xffff,
+ /* key: 0x8896 */ 0x4235,
+ /* key: 0x8897 */ 0x6a57,
+ /* key: 0x8898 */ 0xdc39,
+ /* key: 0x8899 */ 0x6a5a,
+ /* key: 0x889a */ 0xdc3a,
+ /* key: 0x889b */ 0xdc3b,
+ /* key: 0x889c */ 0xdc3c,
+ /* key: 0x889d */ 0xffff,
+ /* key: 0x889e */ 0x6a51,
+ /* key: 0x889f */ 0xdc3d,
+ /* key: 0x88a0 */ 0xdc3e,
+ /* key: 0x88a1 */ 0xffff,
+ /* key: 0x88a2 */ 0x6a5b,
+ /* key: 0x88a3 */ 0xffff,
+ /* key: 0x88a4 */ 0x6a5d,
+ /* key: 0x88a5 */ 0xffff,
+ /* key: 0x88a6 */ 0xffff,
+ /* key: 0x88a7 */ 0xffff,
+ /* key: 0x88a8 */ 0xdc3f,
+ /* key: 0x88a9 */ 0xffff,
+ /* key: 0x88aa */ 0xdc40,
+ /* key: 0x88ab */ 0x486f,
+ /* key: 0x88ac */ 0xffff,
+ /* key: 0x88ad */ 0xffff,
+ /* key: 0x88ae */ 0x6a59,
+ /* key: 0x88af */ 0xffff,
+ /* key: 0x88b0 */ 0x6a5e,
+ /* key: 0x88b1 */ 0x6a60,
+ /* key: 0x88b2 */ 0xffff,
+ /* key: 0x88b3 */ 0xffff,
+ /* key: 0x88b4 */ 0x3853,
+ /* key: 0x88b5 */ 0x6a54,
+ /* key: 0x88b6 */ 0xffff,
+ /* key: 0x88b7 */ 0x3041,
+ /* key: 0x88b8 */ 0xffff,
+ /* key: 0x88b9 */ 0xffff,
+ /* key: 0x88ba */ 0xdc41,
+ /* key: 0x88bb */ 0xffff,
+ /* key: 0x88bc */ 0xffff,
+ /* key: 0x88bd */ 0xdc42,
+ /* key: 0x88be */ 0xdc43,
+ /* key: 0x88bf */ 0x6a5f,
+ /* key: 0x88c0 */ 0xdc44,
+ /* key: 0x88c1 */ 0x3a5b,
+ /* key: 0x88c2 */ 0x4e76,
+ /* key: 0x88c3 */ 0x6a61,
+ /* key: 0x88c4 */ 0x6a62,
+ /* key: 0x88c5 */ 0x4175,
+ /* key: 0x88c6 */ 0xffff,
+ /* key: 0x88c7 */ 0xffff,
+ /* key: 0x88c8 */ 0xffff,
+ /* key: 0x88c9 */ 0xffff,
+ /* key: 0x88ca */ 0xdc45,
+ /* key: 0x88cb */ 0xdc46,
+ /* key: 0x88cc */ 0xdc47,
+ /* key: 0x88cd */ 0xdc48,
+ /* key: 0x88ce */ 0xdc49,
+ /* key: 0x88cf */ 0x4e22,
+ /* key: 0x88d0 */ 0xffff,
+ /* key: 0x88d1 */ 0xdc4a,
+ /* key: 0x88d2 */ 0xdc4b,
+ /* key: 0x88d3 */ 0xdc4c,
+ /* key: 0x88d4 */ 0x6a63,
+ /* key: 0x88d5 */ 0x4d35,
+ /* key: 0x88d6 */ 0xffff,
+ /* key: 0x88d7 */ 0xffff,
+ /* key: 0x88d8 */ 0x6a64,
+ /* key: 0x88d9 */ 0x6a65,
+ /* key: 0x88da */ 0xffff,
+ /* key: 0x88db */ 0xdc4d,
+ /* key: 0x88dc */ 0x4a64,
+ /* key: 0x88dd */ 0x6a66,
+ /* key: 0x88de */ 0xdc4e,
+ /* key: 0x88df */ 0x3a40,
+ /* key: 0x88e0 */ 0xffff,
+ /* key: 0x88e1 */ 0x4e23,
+ /* key: 0x88e2 */ 0xffff,
+ /* key: 0x88e3 */ 0xffff,
+ /* key: 0x88e4 */ 0xffff,
+ /* key: 0x88e5 */ 0xffff,
+ /* key: 0x88e6 */ 0xffff,
+ /* key: 0x88e7 */ 0xdc4f,
+ /* key: 0x88e8 */ 0x6a6b,
+ /* key: 0x88e9 */ 0xffff,
+ /* key: 0x88ea */ 0xffff,
+ /* key: 0x88eb */ 0xffff,
+ /* key: 0x88ec */ 0xffff,
+ /* key: 0x88ed */ 0xffff,
+ /* key: 0x88ee */ 0xffff,
+ /* key: 0x88ef */ 0xdc50,
+ /* key: 0x88f0 */ 0xdc51,
+ /* key: 0x88f1 */ 0xdc52,
+ /* key: 0x88f2 */ 0x6a6c,
+ /* key: 0x88f3 */ 0x3e58,
+ /* key: 0x88f4 */ 0x6a6a,
+ /* key: 0x88f5 */ 0xdc53,
+ /* key: 0x88f6 */ 0xffff,
+ /* key: 0x88f7 */ 0xdc54,
+ /* key: 0x88f8 */ 0x4d67,
+ /* key: 0x88f9 */ 0x6a67,
+ /* key: 0x88fa */ 0xffff,
+ /* key: 0x88fb */ 0xffff,
+ /* key: 0x88fc */ 0x6a69,
+ /* key: 0x88fd */ 0x403d,
+ /* key: 0x88fe */ 0x3f7e,
+ /* key: 0x88ff */ 0xffff,
+ /* branch: 0x890X */ 17536,
+ /* branch: 0x891X */ 17552,
+ /* branch: 0x892X */ 17568,
+ /* branch: 0x893X */ 17584,
+ /* branch: 0x894X */ 17600,
+ /* branch: 0x895X */ 17616,
+ /* branch: 0x896X */ 17632,
+ /* branch: 0x897X */ 17648,
+ /* branch: 0x898X */ 17664,
+ /* branch: 0x899X */ 17680,
+ /* branch: 0x89aX */ 17696,
+ /* branch: 0x89bX */ 17712,
+ /* branch: 0x89cX */ 17728,
+ /* branch: 0x89dX */ 17744,
+ /* branch: 0x89eX */ 17760,
+ /* branch: 0x89fX */ 17776,
+ /* key: 0x8900 */ 0xffff,
+ /* key: 0x8901 */ 0xdc55,
+ /* key: 0x8902 */ 0x6a68,
+ /* key: 0x8903 */ 0xffff,
+ /* key: 0x8904 */ 0x6a6d,
+ /* key: 0x8905 */ 0xffff,
+ /* key: 0x8906 */ 0xdc56,
+ /* key: 0x8907 */ 0x4a23,
+ /* key: 0x8908 */ 0xffff,
+ /* key: 0x8909 */ 0xffff,
+ /* key: 0x890a */ 0x6a6f,
+ /* key: 0x890b */ 0xffff,
+ /* key: 0x890c */ 0x6a6e,
+ /* key: 0x890d */ 0xdc57,
+ /* key: 0x890e */ 0xdc58,
+ /* key: 0x890f */ 0xdc59,
+ /* key: 0x8910 */ 0x336c,
+ /* key: 0x8911 */ 0xffff,
+ /* key: 0x8912 */ 0x4b2b,
+ /* key: 0x8913 */ 0x6a70,
+ /* key: 0x8914 */ 0xffff,
+ /* key: 0x8915 */ 0xdc5a,
+ /* key: 0x8916 */ 0xdc5b,
+ /* key: 0x8917 */ 0xffff,
+ /* key: 0x8918 */ 0xdc5c,
+ /* key: 0x8919 */ 0xdc5d,
+ /* key: 0x891a */ 0xdc5e,
+ /* key: 0x891b */ 0xffff,
+ /* key: 0x891c */ 0xdc5f,
+ /* key: 0x891d */ 0x6a7c,
+ /* key: 0x891e */ 0x6a72,
+ /* key: 0x891f */ 0xffff,
+ /* key: 0x8920 */ 0xdc60,
+ /* key: 0x8921 */ 0xffff,
+ /* key: 0x8922 */ 0xffff,
+ /* key: 0x8923 */ 0xffff,
+ /* key: 0x8924 */ 0xffff,
+ /* key: 0x8925 */ 0x6a73,
+ /* key: 0x8926 */ 0xdc61,
+ /* key: 0x8927 */ 0xdc62,
+ /* key: 0x8928 */ 0xdc63,
+ /* key: 0x8929 */ 0xffff,
+ /* key: 0x892a */ 0x6a74,
+ /* key: 0x892b */ 0x6a75,
+ /* key: 0x892c */ 0xffff,
+ /* key: 0x892d */ 0xffff,
+ /* key: 0x892e */ 0xffff,
+ /* key: 0x892f */ 0xffff,
+ /* key: 0x8930 */ 0xdc64,
+ /* key: 0x8931 */ 0xdc65,
+ /* key: 0x8932 */ 0xdc66,
+ /* key: 0x8933 */ 0xffff,
+ /* key: 0x8934 */ 0xffff,
+ /* key: 0x8935 */ 0xdc67,
+ /* key: 0x8936 */ 0x6a79,
+ /* key: 0x8937 */ 0xffff,
+ /* key: 0x8938 */ 0x6a7a,
+ /* key: 0x8939 */ 0xdc68,
+ /* key: 0x893a */ 0xdc69,
+ /* key: 0x893b */ 0x6a78,
+ /* key: 0x893c */ 0xffff,
+ /* key: 0x893d */ 0xffff,
+ /* key: 0x893e */ 0xdc6a,
+ /* key: 0x893f */ 0xffff,
+ /* key: 0x8940 */ 0xdc6b,
+ /* key: 0x8941 */ 0x6a76,
+ /* key: 0x8942 */ 0xdc6c,
+ /* key: 0x8943 */ 0x6a71,
+ /* key: 0x8944 */ 0x6a77,
+ /* key: 0x8945 */ 0xdc6d,
+ /* key: 0x8946 */ 0xdc6e,
+ /* key: 0x8947 */ 0xffff,
+ /* key: 0x8948 */ 0xffff,
+ /* key: 0x8949 */ 0xdc6f,
+ /* key: 0x894a */ 0xffff,
+ /* key: 0x894b */ 0xffff,
+ /* key: 0x894c */ 0x6a7b,
+ /* key: 0x894d */ 0x7037,
+ /* key: 0x894e */ 0xffff,
+ /* key: 0x894f */ 0xdc70,
+ /* key: 0x8950 */ 0xffff,
+ /* key: 0x8951 */ 0xffff,
+ /* key: 0x8952 */ 0xdc71,
+ /* key: 0x8953 */ 0xffff,
+ /* key: 0x8954 */ 0xffff,
+ /* key: 0x8955 */ 0xffff,
+ /* key: 0x8956 */ 0x3228,
+ /* key: 0x8957 */ 0xdc72,
+ /* key: 0x8958 */ 0xffff,
+ /* key: 0x8959 */ 0xffff,
+ /* key: 0x895a */ 0xdc73,
+ /* key: 0x895b */ 0xdc74,
+ /* key: 0x895c */ 0xdc75,
+ /* key: 0x895d */ 0xffff,
+ /* key: 0x895e */ 0x6a7e,
+ /* key: 0x895f */ 0x365f,
+ /* key: 0x8960 */ 0x6a7d,
+ /* key: 0x8961 */ 0xdc76,
+ /* key: 0x8962 */ 0xdc77,
+ /* key: 0x8963 */ 0xdc78,
+ /* key: 0x8964 */ 0x6b22,
+ /* key: 0x8965 */ 0xffff,
+ /* key: 0x8966 */ 0x6b21,
+ /* key: 0x8967 */ 0xffff,
+ /* key: 0x8968 */ 0xffff,
+ /* key: 0x8969 */ 0xffff,
+ /* key: 0x896a */ 0x6b24,
+ /* key: 0x896b */ 0xdc79,
+ /* key: 0x896c */ 0xffff,
+ /* key: 0x896d */ 0x6b23,
+ /* key: 0x896e */ 0xdc7a,
+ /* key: 0x896f */ 0x6b25,
+ /* key: 0x8970 */ 0xdc7b,
+ /* key: 0x8971 */ 0xffff,
+ /* key: 0x8972 */ 0x3d31,
+ /* key: 0x8973 */ 0xdc7c,
+ /* key: 0x8974 */ 0x6b26,
+ /* key: 0x8975 */ 0xdc7d,
+ /* key: 0x8976 */ 0xffff,
+ /* key: 0x8977 */ 0x6b27,
+ /* key: 0x8978 */ 0xffff,
+ /* key: 0x8979 */ 0xffff,
+ /* key: 0x897a */ 0xdc7e,
+ /* key: 0x897b */ 0xdd21,
+ /* key: 0x897c */ 0xdd22,
+ /* key: 0x897d */ 0xdd23,
+ /* key: 0x897e */ 0x6b28,
+ /* key: 0x897f */ 0x403e,
+ /* key: 0x8980 */ 0xffff,
+ /* key: 0x8981 */ 0x4d57,
+ /* key: 0x8982 */ 0xffff,
+ /* key: 0x8983 */ 0x6b29,
+ /* key: 0x8984 */ 0xffff,
+ /* key: 0x8985 */ 0xffff,
+ /* key: 0x8986 */ 0x4a24,
+ /* key: 0x8987 */ 0x4746,
+ /* key: 0x8988 */ 0x6b2a,
+ /* key: 0x8989 */ 0xdd24,
+ /* key: 0x898a */ 0x6b2b,
+ /* key: 0x898b */ 0x382b,
+ /* key: 0x898c */ 0xffff,
+ /* key: 0x898d */ 0xdd25,
+ /* key: 0x898e */ 0xffff,
+ /* key: 0x898f */ 0x352c,
+ /* key: 0x8990 */ 0xdd26,
+ /* key: 0x8991 */ 0xffff,
+ /* key: 0x8992 */ 0xffff,
+ /* key: 0x8993 */ 0x6b2c,
+ /* key: 0x8994 */ 0xdd27,
+ /* key: 0x8995 */ 0xdd28,
+ /* key: 0x8996 */ 0x3b6b,
+ /* key: 0x8997 */ 0x4741,
+ /* key: 0x8998 */ 0x6b2d,
+ /* key: 0x8999 */ 0xffff,
+ /* key: 0x899a */ 0x3350,
+ /* key: 0x899b */ 0xdd29,
+ /* key: 0x899c */ 0xdd2a,
+ /* key: 0x899d */ 0xffff,
+ /* key: 0x899e */ 0xffff,
+ /* key: 0x899f */ 0xdd2b,
+ /* key: 0x89a0 */ 0xdd2c,
+ /* key: 0x89a1 */ 0x6b2e,
+ /* key: 0x89a2 */ 0xffff,
+ /* key: 0x89a3 */ 0xffff,
+ /* key: 0x89a4 */ 0xffff,
+ /* key: 0x89a5 */ 0xdd2d,
+ /* key: 0x89a6 */ 0x6b30,
+ /* key: 0x89a7 */ 0x4d77,
+ /* key: 0x89a8 */ 0xffff,
+ /* key: 0x89a9 */ 0x6b2f,
+ /* key: 0x89aa */ 0x3f46,
+ /* key: 0x89ab */ 0xffff,
+ /* key: 0x89ac */ 0x6b31,
+ /* key: 0x89ad */ 0xffff,
+ /* key: 0x89ae */ 0xffff,
+ /* key: 0x89af */ 0x6b32,
+ /* key: 0x89b0 */ 0xdd2e,
+ /* key: 0x89b1 */ 0xffff,
+ /* key: 0x89b2 */ 0x6b33,
+ /* key: 0x89b3 */ 0x3451,
+ /* key: 0x89b4 */ 0xdd2f,
+ /* key: 0x89b5 */ 0xdd30,
+ /* key: 0x89b6 */ 0xdd31,
+ /* key: 0x89b7 */ 0xdd32,
+ /* key: 0x89b8 */ 0xffff,
+ /* key: 0x89b9 */ 0xffff,
+ /* key: 0x89ba */ 0x6b34,
+ /* key: 0x89bb */ 0xffff,
+ /* key: 0x89bc */ 0xdd33,
+ /* key: 0x89bd */ 0x6b35,
+ /* key: 0x89be */ 0xffff,
+ /* key: 0x89bf */ 0x6b36,
+ /* key: 0x89c0 */ 0x6b37,
+ /* key: 0x89c1 */ 0xffff,
+ /* key: 0x89c2 */ 0xffff,
+ /* key: 0x89c3 */ 0xffff,
+ /* key: 0x89c4 */ 0xffff,
+ /* key: 0x89c5 */ 0xffff,
+ /* key: 0x89c6 */ 0xffff,
+ /* key: 0x89c7 */ 0xffff,
+ /* key: 0x89c8 */ 0xffff,
+ /* key: 0x89c9 */ 0xffff,
+ /* key: 0x89ca */ 0xffff,
+ /* key: 0x89cb */ 0xffff,
+ /* key: 0x89cc */ 0xffff,
+ /* key: 0x89cd */ 0xffff,
+ /* key: 0x89ce */ 0xffff,
+ /* key: 0x89cf */ 0xffff,
+ /* key: 0x89d0 */ 0xffff,
+ /* key: 0x89d1 */ 0xffff,
+ /* key: 0x89d2 */ 0x3351,
+ /* key: 0x89d3 */ 0xffff,
+ /* key: 0x89d4 */ 0xdd34,
+ /* key: 0x89d5 */ 0xdd35,
+ /* key: 0x89d6 */ 0xdd36,
+ /* key: 0x89d7 */ 0xdd37,
+ /* key: 0x89d8 */ 0xdd38,
+ /* key: 0x89d9 */ 0xffff,
+ /* key: 0x89da */ 0x6b38,
+ /* key: 0x89db */ 0xffff,
+ /* key: 0x89dc */ 0x6b39,
+ /* key: 0x89dd */ 0x6b3a,
+ /* key: 0x89de */ 0xffff,
+ /* key: 0x89df */ 0xffff,
+ /* key: 0x89e0 */ 0xffff,
+ /* key: 0x89e1 */ 0xffff,
+ /* key: 0x89e2 */ 0xffff,
+ /* key: 0x89e3 */ 0x3272,
+ /* key: 0x89e4 */ 0xffff,
+ /* key: 0x89e5 */ 0xdd39,
+ /* key: 0x89e6 */ 0x3f28,
+ /* key: 0x89e7 */ 0x6b3b,
+ /* key: 0x89e8 */ 0xffff,
+ /* key: 0x89e9 */ 0xdd3a,
+ /* key: 0x89ea */ 0xffff,
+ /* key: 0x89eb */ 0xdd3b,
+ /* key: 0x89ec */ 0xffff,
+ /* key: 0x89ed */ 0xdd3c,
+ /* key: 0x89ee */ 0xffff,
+ /* key: 0x89ef */ 0xffff,
+ /* key: 0x89f0 */ 0xffff,
+ /* key: 0x89f1 */ 0xdd3d,
+ /* key: 0x89f2 */ 0xffff,
+ /* key: 0x89f3 */ 0xdd3e,
+ /* key: 0x89f4 */ 0x6b3c,
+ /* key: 0x89f5 */ 0xffff,
+ /* key: 0x89f6 */ 0xdd3f,
+ /* key: 0x89f7 */ 0xffff,
+ /* key: 0x89f8 */ 0x6b3d,
+ /* key: 0x89f9 */ 0xdd40,
+ /* key: 0x89fa */ 0xffff,
+ /* key: 0x89fb */ 0xffff,
+ /* key: 0x89fc */ 0xffff,
+ /* key: 0x89fd */ 0xdd41,
+ /* key: 0x89fe */ 0xffff,
+ /* key: 0x89ff */ 0xdd42,
+ /* branch: 0x8a0X */ 17808,
+ /* branch: 0x8a1X */ 17824,
+ /* branch: 0x8a2X */ 17840,
+ /* branch: 0x8a3X */ 17856,
+ /* branch: 0x8a4X */ 17872,
+ /* branch: 0x8a5X */ 17888,
+ /* branch: 0x8a6X */ 17904,
+ /* branch: 0x8a7X */ 17920,
+ /* branch: 0x8a8X */ 17936,
+ /* branch: 0x8a9X */ 17952,
+ /* branch: 0x8aaX */ 17968,
+ /* branch: 0x8abX */ 17984,
+ /* branch: 0x8acX */ 18000,
+ /* branch: 0x8adX */ 18016,
+ /* branch: 0x8aeX */ 18032,
+ /* branch: 0x8afX */ 18048,
+ /* key: 0x8a00 */ 0x3840,
+ /* key: 0x8a01 */ 0xffff,
+ /* key: 0x8a02 */ 0x447b,
+ /* key: 0x8a03 */ 0x6b3e,
+ /* key: 0x8a04 */ 0xdd43,
+ /* key: 0x8a05 */ 0xdd44,
+ /* key: 0x8a06 */ 0xffff,
+ /* key: 0x8a07 */ 0xdd45,
+ /* key: 0x8a08 */ 0x3757,
+ /* key: 0x8a09 */ 0xffff,
+ /* key: 0x8a0a */ 0x3f56,
+ /* key: 0x8a0b */ 0xffff,
+ /* key: 0x8a0c */ 0x6b41,
+ /* key: 0x8a0d */ 0xffff,
+ /* key: 0x8a0e */ 0x4624,
+ /* key: 0x8a0f */ 0xdd46,
+ /* key: 0x8a10 */ 0x6b40,
+ /* key: 0x8a11 */ 0xdd47,
+ /* key: 0x8a12 */ 0xdd48,
+ /* key: 0x8a13 */ 0x3731,
+ /* key: 0x8a14 */ 0xdd49,
+ /* key: 0x8a15 */ 0xdd4a,
+ /* key: 0x8a16 */ 0x6b3f,
+ /* key: 0x8a17 */ 0x4277,
+ /* key: 0x8a18 */ 0x352d,
+ /* key: 0x8a19 */ 0xffff,
+ /* key: 0x8a1a */ 0xffff,
+ /* key: 0x8a1b */ 0x6b42,
+ /* key: 0x8a1c */ 0xffff,
+ /* key: 0x8a1d */ 0x6b43,
+ /* key: 0x8a1e */ 0xdd4b,
+ /* key: 0x8a1f */ 0x3e59,
+ /* key: 0x8a20 */ 0xdd4c,
+ /* key: 0x8a21 */ 0xffff,
+ /* key: 0x8a22 */ 0xdd4d,
+ /* key: 0x8a23 */ 0x376d,
+ /* key: 0x8a24 */ 0xdd4e,
+ /* key: 0x8a25 */ 0x6b44,
+ /* key: 0x8a26 */ 0xdd4f,
+ /* key: 0x8a27 */ 0xffff,
+ /* key: 0x8a28 */ 0xffff,
+ /* key: 0x8a29 */ 0xffff,
+ /* key: 0x8a2a */ 0x4b2c,
+ /* key: 0x8a2b */ 0xdd50,
+ /* key: 0x8a2c */ 0xdd51,
+ /* key: 0x8a2d */ 0x405f,
+ /* key: 0x8a2e */ 0xffff,
+ /* key: 0x8a2f */ 0xdd52,
+ /* key: 0x8a30 */ 0xffff,
+ /* key: 0x8a31 */ 0x3576,
+ /* key: 0x8a32 */ 0xffff,
+ /* key: 0x8a33 */ 0x4c75,
+ /* key: 0x8a34 */ 0x414a,
+ /* key: 0x8a35 */ 0xdd53,
+ /* key: 0x8a36 */ 0x6b45,
+ /* key: 0x8a37 */ 0xdd54,
+ /* key: 0x8a38 */ 0xffff,
+ /* key: 0x8a39 */ 0xffff,
+ /* key: 0x8a3a */ 0x3f47,
+ /* key: 0x8a3b */ 0x4370,
+ /* key: 0x8a3c */ 0x3e5a,
+ /* key: 0x8a3d */ 0xdd55,
+ /* key: 0x8a3e */ 0xdd56,
+ /* key: 0x8a3f */ 0xffff,
+ /* key: 0x8a40 */ 0xdd57,
+ /* key: 0x8a41 */ 0x6b46,
+ /* key: 0x8a42 */ 0xffff,
+ /* key: 0x8a43 */ 0xdd58,
+ /* key: 0x8a44 */ 0xffff,
+ /* key: 0x8a45 */ 0xdd59,
+ /* key: 0x8a46 */ 0x6b49,
+ /* key: 0x8a47 */ 0xdd5a,
+ /* key: 0x8a48 */ 0x6b4a,
+ /* key: 0x8a49 */ 0xdd5b,
+ /* key: 0x8a4a */ 0xffff,
+ /* key: 0x8a4b */ 0xffff,
+ /* key: 0x8a4c */ 0xffff,
+ /* key: 0x8a4d */ 0xdd5c,
+ /* key: 0x8a4e */ 0xdd5d,
+ /* key: 0x8a4f */ 0xffff,
+ /* key: 0x8a50 */ 0x3a3e,
+ /* key: 0x8a51 */ 0x4242,
+ /* key: 0x8a52 */ 0x6b48,
+ /* key: 0x8a53 */ 0xdd5e,
+ /* key: 0x8a54 */ 0x3e5b,
+ /* key: 0x8a55 */ 0x493e,
+ /* key: 0x8a56 */ 0xdd5f,
+ /* key: 0x8a57 */ 0xdd60,
+ /* key: 0x8a58 */ 0xdd61,
+ /* key: 0x8a59 */ 0xffff,
+ /* key: 0x8a5a */ 0xffff,
+ /* key: 0x8a5b */ 0x6b47,
+ /* key: 0x8a5c */ 0xdd62,
+ /* key: 0x8a5d */ 0xdd63,
+ /* key: 0x8a5e */ 0x3b6c,
+ /* key: 0x8a5f */ 0xffff,
+ /* key: 0x8a60 */ 0x3153,
+ /* key: 0x8a61 */ 0xdd64,
+ /* key: 0x8a62 */ 0x6b4e,
+ /* key: 0x8a63 */ 0x3758,
+ /* key: 0x8a64 */ 0xffff,
+ /* key: 0x8a65 */ 0xdd65,
+ /* key: 0x8a66 */ 0x3b6e,
+ /* key: 0x8a67 */ 0xdd66,
+ /* key: 0x8a68 */ 0xffff,
+ /* key: 0x8a69 */ 0x3b6d,
+ /* key: 0x8a6a */ 0xffff,
+ /* key: 0x8a6b */ 0x4f4d,
+ /* key: 0x8a6c */ 0x6b4d,
+ /* key: 0x8a6d */ 0x6b4c,
+ /* key: 0x8a6e */ 0x4127,
+ /* key: 0x8a6f */ 0xffff,
+ /* key: 0x8a70 */ 0x354d,
+ /* key: 0x8a71 */ 0x4f43,
+ /* key: 0x8a72 */ 0x333a,
+ /* key: 0x8a73 */ 0x3e5c,
+ /* key: 0x8a74 */ 0xffff,
+ /* key: 0x8a75 */ 0xdd67,
+ /* key: 0x8a76 */ 0xdd68,
+ /* key: 0x8a77 */ 0xdd69,
+ /* key: 0x8a78 */ 0xffff,
+ /* key: 0x8a79 */ 0xdd6a,
+ /* key: 0x8a7a */ 0xdd6b,
+ /* key: 0x8a7b */ 0xdd6c,
+ /* key: 0x8a7c */ 0x6b4b,
+ /* key: 0x8a7d */ 0xffff,
+ /* key: 0x8a7e */ 0xdd6d,
+ /* key: 0x8a7f */ 0xdd6e,
+ /* key: 0x8a80 */ 0xdd6f,
+ /* key: 0x8a81 */ 0xffff,
+ /* key: 0x8a82 */ 0x6b50,
+ /* key: 0x8a83 */ 0xdd70,
+ /* key: 0x8a84 */ 0x6b51,
+ /* key: 0x8a85 */ 0x6b4f,
+ /* key: 0x8a86 */ 0xdd71,
+ /* key: 0x8a87 */ 0x3858,
+ /* key: 0x8a88 */ 0xffff,
+ /* key: 0x8a89 */ 0x4d40,
+ /* key: 0x8a8a */ 0xffff,
+ /* key: 0x8a8b */ 0xdd72,
+ /* key: 0x8a8c */ 0x3b6f,
+ /* key: 0x8a8d */ 0x4727,
+ /* key: 0x8a8e */ 0xffff,
+ /* key: 0x8a8f */ 0xdd73,
+ /* key: 0x8a90 */ 0xdd74,
+ /* key: 0x8a91 */ 0x6b54,
+ /* key: 0x8a92 */ 0xdd75,
+ /* key: 0x8a93 */ 0x4040,
+ /* key: 0x8a94 */ 0xffff,
+ /* key: 0x8a95 */ 0x4342,
+ /* key: 0x8a96 */ 0xdd76,
+ /* key: 0x8a97 */ 0xdd77,
+ /* key: 0x8a98 */ 0x4d36,
+ /* key: 0x8a99 */ 0xdd78,
+ /* key: 0x8a9a */ 0x6b57,
+ /* key: 0x8a9b */ 0xffff,
+ /* key: 0x8a9c */ 0xffff,
+ /* key: 0x8a9d */ 0xffff,
+ /* key: 0x8a9e */ 0x386c,
+ /* key: 0x8a9f */ 0xdd79,
+ /* key: 0x8aa0 */ 0x403f,
+ /* key: 0x8aa1 */ 0x6b53,
+ /* key: 0x8aa2 */ 0xffff,
+ /* key: 0x8aa3 */ 0x6b58,
+ /* key: 0x8aa4 */ 0x386d,
+ /* key: 0x8aa5 */ 0x6b55,
+ /* key: 0x8aa6 */ 0x6b56,
+ /* key: 0x8aa7 */ 0xdd7a,
+ /* key: 0x8aa8 */ 0x6b52,
+ /* key: 0x8aa9 */ 0xdd7b,
+ /* key: 0x8aaa */ 0xffff,
+ /* key: 0x8aab */ 0xffff,
+ /* key: 0x8aac */ 0x4062,
+ /* key: 0x8aad */ 0x4649,
+ /* key: 0x8aae */ 0xdd7c,
+ /* key: 0x8aaf */ 0xdd7d,
+ /* key: 0x8ab0 */ 0x432f,
+ /* key: 0x8ab1 */ 0xffff,
+ /* key: 0x8ab2 */ 0x325d,
+ /* key: 0x8ab3 */ 0xdd7e,
+ /* key: 0x8ab4 */ 0xffff,
+ /* key: 0x8ab5 */ 0xffff,
+ /* key: 0x8ab6 */ 0xde21,
+ /* key: 0x8ab7 */ 0xde22,
+ /* key: 0x8ab8 */ 0xffff,
+ /* key: 0x8ab9 */ 0x4870,
+ /* key: 0x8aba */ 0xffff,
+ /* key: 0x8abb */ 0xde23,
+ /* key: 0x8abc */ 0x3543,
+ /* key: 0x8abd */ 0xffff,
+ /* key: 0x8abe */ 0xde24,
+ /* key: 0x8abf */ 0x4434,
+ /* key: 0x8ac0 */ 0xffff,
+ /* key: 0x8ac1 */ 0xffff,
+ /* key: 0x8ac2 */ 0x6b5b,
+ /* key: 0x8ac3 */ 0xde25,
+ /* key: 0x8ac4 */ 0x6b59,
+ /* key: 0x8ac5 */ 0xffff,
+ /* key: 0x8ac6 */ 0xde26,
+ /* key: 0x8ac7 */ 0x434c,
+ /* key: 0x8ac8 */ 0xde27,
+ /* key: 0x8ac9 */ 0xde28,
+ /* key: 0x8aca */ 0xde29,
+ /* key: 0x8acb */ 0x4041,
+ /* key: 0x8acc */ 0x3452,
+ /* key: 0x8acd */ 0x6b5a,
+ /* key: 0x8ace */ 0xffff,
+ /* key: 0x8acf */ 0x3f5b,
+ /* key: 0x8ad0 */ 0xffff,
+ /* key: 0x8ad1 */ 0xde2a,
+ /* key: 0x8ad2 */ 0x4e4a,
+ /* key: 0x8ad3 */ 0xde2b,
+ /* key: 0x8ad4 */ 0xde2c,
+ /* key: 0x8ad5 */ 0xde2d,
+ /* key: 0x8ad6 */ 0x4f40,
+ /* key: 0x8ad7 */ 0xde2e,
+ /* key: 0x8ad8 */ 0xffff,
+ /* key: 0x8ad9 */ 0xffff,
+ /* key: 0x8ada */ 0x6b5c,
+ /* key: 0x8adb */ 0x6b67,
+ /* key: 0x8adc */ 0x4435,
+ /* key: 0x8add */ 0xde2f,
+ /* key: 0x8ade */ 0x6b66,
+ /* key: 0x8adf */ 0xde30,
+ /* key: 0x8ae0 */ 0x6b63,
+ /* key: 0x8ae1 */ 0x6b6b,
+ /* key: 0x8ae2 */ 0x6b64,
+ /* key: 0x8ae3 */ 0xffff,
+ /* key: 0x8ae4 */ 0x6b60,
+ /* key: 0x8ae5 */ 0xffff,
+ /* key: 0x8ae6 */ 0x447c,
+ /* key: 0x8ae7 */ 0x6b5f,
+ /* key: 0x8ae8 */ 0xffff,
+ /* key: 0x8ae9 */ 0xffff,
+ /* key: 0x8aea */ 0xffff,
+ /* key: 0x8aeb */ 0x6b5d,
+ /* key: 0x8aec */ 0xde31,
+ /* key: 0x8aed */ 0x4d21,
+ /* key: 0x8aee */ 0x3b70,
+ /* key: 0x8aef */ 0xffff,
+ /* key: 0x8af0 */ 0xde32,
+ /* key: 0x8af1 */ 0x6b61,
+ /* key: 0x8af2 */ 0xffff,
+ /* key: 0x8af3 */ 0x6b5e,
+ /* key: 0x8af4 */ 0xde33,
+ /* key: 0x8af5 */ 0xde34,
+ /* key: 0x8af6 */ 0xde35,
+ /* key: 0x8af7 */ 0x6b65,
+ /* key: 0x8af8 */ 0x3d74,
+ /* key: 0x8af9 */ 0xffff,
+ /* key: 0x8afa */ 0x3841,
+ /* key: 0x8afb */ 0xffff,
+ /* key: 0x8afc */ 0xde36,
+ /* key: 0x8afd */ 0xffff,
+ /* key: 0x8afe */ 0x427a,
+ /* key: 0x8aff */ 0xde37,
+ /* branch: 0x8b0X */ 18080,
+ /* branch: 0x8b1X */ 18096,
+ /* branch: 0x8b2X */ 18112,
+ /* branch: 0x8b3X */ 18128,
+ /* branch: 0x8b4X */ 18144,
+ /* branch: 0x8b5X */ 18160,
+ /* branch: 0x8b6X */ 18176,
+ /* branch: 0x8b7X */ 18192,
+ /* branch: 0x8b8X */ 18208,
+ /* branch: 0x8b9X */ 18224,
+ /* branch: 0x8baX */ 0,
+ /* branch: 0x8bbX */ 0,
+ /* branch: 0x8bcX */ 0,
+ /* branch: 0x8bdX */ 0,
+ /* branch: 0x8beX */ 0,
+ /* branch: 0x8bfX */ 0,
+ /* key: 0x8b00 */ 0x4b45,
+ /* key: 0x8b01 */ 0x315a,
+ /* key: 0x8b02 */ 0x3062,
+ /* key: 0x8b03 */ 0xffff,
+ /* key: 0x8b04 */ 0x4625,
+ /* key: 0x8b05 */ 0xde38,
+ /* key: 0x8b06 */ 0xde39,
+ /* key: 0x8b07 */ 0x6b69,
+ /* key: 0x8b08 */ 0xffff,
+ /* key: 0x8b09 */ 0xffff,
+ /* key: 0x8b0a */ 0xde3f,
+ /* key: 0x8b0b */ 0xde3a,
+ /* key: 0x8b0c */ 0x6b68,
+ /* key: 0x8b0d */ 0xffff,
+ /* key: 0x8b0e */ 0x4666,
+ /* key: 0x8b0f */ 0xffff,
+ /* key: 0x8b10 */ 0x6b6d,
+ /* key: 0x8b11 */ 0xde3b,
+ /* key: 0x8b12 */ 0xffff,
+ /* key: 0x8b13 */ 0xffff,
+ /* key: 0x8b14 */ 0x6b62,
+ /* key: 0x8b15 */ 0xffff,
+ /* key: 0x8b16 */ 0x6b6c,
+ /* key: 0x8b17 */ 0x6b6e,
+ /* key: 0x8b18 */ 0xffff,
+ /* key: 0x8b19 */ 0x382c,
+ /* key: 0x8b1a */ 0x6b6a,
+ /* key: 0x8b1b */ 0x3956,
+ /* key: 0x8b1c */ 0xde3c,
+ /* key: 0x8b1d */ 0x3c55,
+ /* key: 0x8b1e */ 0xde3d,
+ /* key: 0x8b1f */ 0xde3e,
+ /* key: 0x8b20 */ 0x6b6f,
+ /* key: 0x8b21 */ 0x4d58,
+ /* key: 0x8b22 */ 0xffff,
+ /* key: 0x8b23 */ 0xffff,
+ /* key: 0x8b24 */ 0xffff,
+ /* key: 0x8b25 */ 0xffff,
+ /* key: 0x8b26 */ 0x6b72,
+ /* key: 0x8b27 */ 0xffff,
+ /* key: 0x8b28 */ 0x6b75,
+ /* key: 0x8b29 */ 0xffff,
+ /* key: 0x8b2a */ 0xffff,
+ /* key: 0x8b2b */ 0x6b73,
+ /* key: 0x8b2c */ 0x4935,
+ /* key: 0x8b2d */ 0xde40,
+ /* key: 0x8b2e */ 0xffff,
+ /* key: 0x8b2f */ 0xffff,
+ /* key: 0x8b30 */ 0xde41,
+ /* key: 0x8b31 */ 0xffff,
+ /* key: 0x8b32 */ 0xffff,
+ /* key: 0x8b33 */ 0x6b70,
+ /* key: 0x8b34 */ 0xffff,
+ /* key: 0x8b35 */ 0xffff,
+ /* key: 0x8b36 */ 0xffff,
+ /* key: 0x8b37 */ 0xde42,
+ /* key: 0x8b38 */ 0xffff,
+ /* key: 0x8b39 */ 0x3660,
+ /* key: 0x8b3a */ 0xffff,
+ /* key: 0x8b3b */ 0xffff,
+ /* key: 0x8b3c */ 0xde43,
+ /* key: 0x8b3d */ 0xffff,
+ /* key: 0x8b3e */ 0x6b74,
+ /* key: 0x8b3f */ 0xffff,
+ /* key: 0x8b40 */ 0xffff,
+ /* key: 0x8b41 */ 0x6b76,
+ /* key: 0x8b42 */ 0xde44,
+ /* key: 0x8b43 */ 0xde45,
+ /* key: 0x8b44 */ 0xde46,
+ /* key: 0x8b45 */ 0xde47,
+ /* key: 0x8b46 */ 0xde48,
+ /* key: 0x8b47 */ 0xffff,
+ /* key: 0x8b48 */ 0xde49,
+ /* key: 0x8b49 */ 0x6b7a,
+ /* key: 0x8b4a */ 0xffff,
+ /* key: 0x8b4b */ 0xffff,
+ /* key: 0x8b4c */ 0x6b77,
+ /* key: 0x8b4d */ 0xde4e,
+ /* key: 0x8b4e */ 0x6b79,
+ /* key: 0x8b4f */ 0x6b78,
+ /* key: 0x8b50 */ 0xffff,
+ /* key: 0x8b51 */ 0xffff,
+ /* key: 0x8b52 */ 0xde4a,
+ /* key: 0x8b53 */ 0xde4b,
+ /* key: 0x8b54 */ 0xde4c,
+ /* key: 0x8b55 */ 0xffff,
+ /* key: 0x8b56 */ 0x6b7b,
+ /* key: 0x8b57 */ 0xffff,
+ /* key: 0x8b58 */ 0x3c31,
+ /* key: 0x8b59 */ 0xde4d,
+ /* key: 0x8b5a */ 0x6b7d,
+ /* key: 0x8b5b */ 0x6b7c,
+ /* key: 0x8b5c */ 0x4968,
+ /* key: 0x8b5d */ 0xffff,
+ /* key: 0x8b5e */ 0xde4f,
+ /* key: 0x8b5f */ 0x6c21,
+ /* key: 0x8b60 */ 0xffff,
+ /* key: 0x8b61 */ 0xffff,
+ /* key: 0x8b62 */ 0xffff,
+ /* key: 0x8b63 */ 0xde50,
+ /* key: 0x8b64 */ 0xffff,
+ /* key: 0x8b65 */ 0xffff,
+ /* key: 0x8b66 */ 0x3759,
+ /* key: 0x8b67 */ 0xffff,
+ /* key: 0x8b68 */ 0xffff,
+ /* key: 0x8b69 */ 0xffff,
+ /* key: 0x8b6a */ 0xffff,
+ /* key: 0x8b6b */ 0x6b7e,
+ /* key: 0x8b6c */ 0x6c22,
+ /* key: 0x8b6d */ 0xde51,
+ /* key: 0x8b6e */ 0xffff,
+ /* key: 0x8b6f */ 0x6c23,
+ /* key: 0x8b70 */ 0x3544,
+ /* key: 0x8b71 */ 0x6641,
+ /* key: 0x8b72 */ 0x3e79,
+ /* key: 0x8b73 */ 0xffff,
+ /* key: 0x8b74 */ 0x6c24,
+ /* key: 0x8b75 */ 0xffff,
+ /* key: 0x8b76 */ 0xde52,
+ /* key: 0x8b77 */ 0x386e,
+ /* key: 0x8b78 */ 0xde53,
+ /* key: 0x8b79 */ 0xde54,
+ /* key: 0x8b7a */ 0xffff,
+ /* key: 0x8b7b */ 0xffff,
+ /* key: 0x8b7c */ 0xde55,
+ /* key: 0x8b7d */ 0x6c25,
+ /* key: 0x8b7e */ 0xde56,
+ /* key: 0x8b7f */ 0xffff,
+ /* key: 0x8b80 */ 0x6c26,
+ /* key: 0x8b81 */ 0xde57,
+ /* key: 0x8b82 */ 0xffff,
+ /* key: 0x8b83 */ 0x3b3e,
+ /* key: 0x8b84 */ 0xde58,
+ /* key: 0x8b85 */ 0xde59,
+ /* key: 0x8b86 */ 0xffff,
+ /* key: 0x8b87 */ 0xffff,
+ /* key: 0x8b88 */ 0xffff,
+ /* key: 0x8b89 */ 0xffff,
+ /* key: 0x8b8a */ 0x5a4e,
+ /* key: 0x8b8b */ 0xde5a,
+ /* key: 0x8b8c */ 0x6c27,
+ /* key: 0x8b8d */ 0xde5b,
+ /* key: 0x8b8e */ 0x6c28,
+ /* key: 0x8b8f */ 0xde5c,
+ /* key: 0x8b90 */ 0x3d32,
+ /* key: 0x8b91 */ 0xffff,
+ /* key: 0x8b92 */ 0x6c29,
+ /* key: 0x8b93 */ 0x6c2a,
+ /* key: 0x8b94 */ 0xde5d,
+ /* key: 0x8b95 */ 0xde5e,
+ /* key: 0x8b96 */ 0x6c2b,
+ /* key: 0x8b97 */ 0xffff,
+ /* key: 0x8b98 */ 0xffff,
+ /* key: 0x8b99 */ 0x6c2c,
+ /* key: 0x8b9a */ 0x6c2d,
+ /* key: 0x8b9b */ 0xffff,
+ /* key: 0x8b9c */ 0xde5f,
+ /* key: 0x8b9d */ 0xffff,
+ /* key: 0x8b9e */ 0xde60,
+ /* key: 0x8b9f */ 0xde61,
+ /* branch: 0x8c0X */ 0,
+ /* branch: 0x8c1X */ 0,
+ /* branch: 0x8c2X */ 0,
+ /* branch: 0x8c3X */ 18256,
+ /* branch: 0x8c4X */ 18272,
+ /* branch: 0x8c5X */ 18288,
+ /* branch: 0x8c6X */ 18304,
+ /* branch: 0x8c7X */ 18320,
+ /* branch: 0x8c8X */ 18336,
+ /* branch: 0x8c9X */ 18352,
+ /* branch: 0x8caX */ 18368,
+ /* branch: 0x8cbX */ 18384,
+ /* branch: 0x8ccX */ 18400,
+ /* branch: 0x8cdX */ 18416,
+ /* branch: 0x8ceX */ 18432,
+ /* branch: 0x8cfX */ 18448,
+ /* key: 0x8c30 */ 0xffff,
+ /* key: 0x8c31 */ 0xffff,
+ /* key: 0x8c32 */ 0xffff,
+ /* key: 0x8c33 */ 0xffff,
+ /* key: 0x8c34 */ 0xffff,
+ /* key: 0x8c35 */ 0xffff,
+ /* key: 0x8c36 */ 0xffff,
+ /* key: 0x8c37 */ 0x432b,
+ /* key: 0x8c38 */ 0xde62,
+ /* key: 0x8c39 */ 0xde63,
+ /* key: 0x8c3a */ 0x6c2e,
+ /* key: 0x8c3b */ 0xffff,
+ /* key: 0x8c3c */ 0xffff,
+ /* key: 0x8c3d */ 0xde64,
+ /* key: 0x8c3e */ 0xde65,
+ /* key: 0x8c3f */ 0x6c30,
+ /* key: 0x8c40 */ 0xffff,
+ /* key: 0x8c41 */ 0x6c2f,
+ /* key: 0x8c42 */ 0xffff,
+ /* key: 0x8c43 */ 0xffff,
+ /* key: 0x8c44 */ 0xffff,
+ /* key: 0x8c45 */ 0xde66,
+ /* key: 0x8c46 */ 0x4626,
+ /* key: 0x8c47 */ 0xde67,
+ /* key: 0x8c48 */ 0x6c31,
+ /* key: 0x8c49 */ 0xde68,
+ /* key: 0x8c4a */ 0x4b2d,
+ /* key: 0x8c4b */ 0xde69,
+ /* key: 0x8c4c */ 0x6c32,
+ /* key: 0x8c4d */ 0xffff,
+ /* key: 0x8c4e */ 0x6c33,
+ /* key: 0x8c4f */ 0xde6a,
+ /* key: 0x8c50 */ 0x6c34,
+ /* key: 0x8c51 */ 0xde6b,
+ /* key: 0x8c52 */ 0xffff,
+ /* key: 0x8c53 */ 0xde6c,
+ /* key: 0x8c54 */ 0xde6d,
+ /* key: 0x8c55 */ 0x6c35,
+ /* key: 0x8c56 */ 0xffff,
+ /* key: 0x8c57 */ 0xde6e,
+ /* key: 0x8c58 */ 0xde6f,
+ /* key: 0x8c59 */ 0xde72,
+ /* key: 0x8c5a */ 0x465a,
+ /* key: 0x8c5b */ 0xde70,
+ /* key: 0x8c5c */ 0xffff,
+ /* key: 0x8c5d */ 0xde71,
+ /* key: 0x8c5e */ 0xffff,
+ /* key: 0x8c5f */ 0xffff,
+ /* key: 0x8c60 */ 0xffff,
+ /* key: 0x8c61 */ 0x3e5d,
+ /* key: 0x8c62 */ 0x6c36,
+ /* key: 0x8c63 */ 0xde73,
+ /* key: 0x8c64 */ 0xde74,
+ /* key: 0x8c65 */ 0xffff,
+ /* key: 0x8c66 */ 0xde75,
+ /* key: 0x8c67 */ 0xffff,
+ /* key: 0x8c68 */ 0xde76,
+ /* key: 0x8c69 */ 0xde77,
+ /* key: 0x8c6a */ 0x396b,
+ /* key: 0x8c6b */ 0x502e,
+ /* key: 0x8c6c */ 0x6c37,
+ /* key: 0x8c6d */ 0xde78,
+ /* key: 0x8c6e */ 0xffff,
+ /* key: 0x8c6f */ 0xffff,
+ /* key: 0x8c70 */ 0xffff,
+ /* key: 0x8c71 */ 0xffff,
+ /* key: 0x8c72 */ 0xffff,
+ /* key: 0x8c73 */ 0xde79,
+ /* key: 0x8c74 */ 0xffff,
+ /* key: 0x8c75 */ 0xde7a,
+ /* key: 0x8c76 */ 0xde7b,
+ /* key: 0x8c77 */ 0xffff,
+ /* key: 0x8c78 */ 0x6c38,
+ /* key: 0x8c79 */ 0x493f,
+ /* key: 0x8c7a */ 0x6c39,
+ /* key: 0x8c7b */ 0xde7c,
+ /* key: 0x8c7c */ 0x6c41,
+ /* key: 0x8c7d */ 0xffff,
+ /* key: 0x8c7e */ 0xde7d,
+ /* key: 0x8c7f */ 0xffff,
+ /* key: 0x8c80 */ 0xffff,
+ /* key: 0x8c81 */ 0xffff,
+ /* key: 0x8c82 */ 0x6c3a,
+ /* key: 0x8c83 */ 0xffff,
+ /* key: 0x8c84 */ 0xffff,
+ /* key: 0x8c85 */ 0x6c3c,
+ /* key: 0x8c86 */ 0xde7e,
+ /* key: 0x8c87 */ 0xdf21,
+ /* key: 0x8c88 */ 0xffff,
+ /* key: 0x8c89 */ 0x6c3b,
+ /* key: 0x8c8a */ 0x6c3d,
+ /* key: 0x8c8b */ 0xdf22,
+ /* key: 0x8c8c */ 0x4b46,
+ /* key: 0x8c8d */ 0x6c3e,
+ /* key: 0x8c8e */ 0x6c3f,
+ /* key: 0x8c8f */ 0xffff,
+ /* key: 0x8c90 */ 0xdf23,
+ /* key: 0x8c91 */ 0xffff,
+ /* key: 0x8c92 */ 0xdf24,
+ /* key: 0x8c93 */ 0xdf25,
+ /* key: 0x8c94 */ 0x6c40,
+ /* key: 0x8c95 */ 0xffff,
+ /* key: 0x8c96 */ 0xffff,
+ /* key: 0x8c97 */ 0xffff,
+ /* key: 0x8c98 */ 0x6c42,
+ /* key: 0x8c99 */ 0xdf26,
+ /* key: 0x8c9a */ 0xffff,
+ /* key: 0x8c9b */ 0xdf27,
+ /* key: 0x8c9c */ 0xdf28,
+ /* key: 0x8c9d */ 0x332d,
+ /* key: 0x8c9e */ 0x4467,
+ /* key: 0x8c9f */ 0xffff,
+ /* key: 0x8ca0 */ 0x4969,
+ /* key: 0x8ca1 */ 0x3a62,
+ /* key: 0x8ca2 */ 0x3957,
+ /* key: 0x8ca3 */ 0xffff,
+ /* key: 0x8ca4 */ 0xdf29,
+ /* key: 0x8ca5 */ 0xffff,
+ /* key: 0x8ca6 */ 0xffff,
+ /* key: 0x8ca7 */ 0x494f,
+ /* key: 0x8ca8 */ 0x325f,
+ /* key: 0x8ca9 */ 0x484e,
+ /* key: 0x8caa */ 0x6c45,
+ /* key: 0x8cab */ 0x3453,
+ /* key: 0x8cac */ 0x4055,
+ /* key: 0x8cad */ 0x6c44,
+ /* key: 0x8cae */ 0x6c49,
+ /* key: 0x8caf */ 0x4379,
+ /* key: 0x8cb0 */ 0x4c63,
+ /* key: 0x8cb1 */ 0xffff,
+ /* key: 0x8cb2 */ 0x6c47,
+ /* key: 0x8cb3 */ 0x6c48,
+ /* key: 0x8cb4 */ 0x352e,
+ /* key: 0x8cb5 */ 0xffff,
+ /* key: 0x8cb6 */ 0x6c4a,
+ /* key: 0x8cb7 */ 0x4763,
+ /* key: 0x8cb8 */ 0x425f,
+ /* key: 0x8cb9 */ 0xdf2a,
+ /* key: 0x8cba */ 0xdf2b,
+ /* key: 0x8cbb */ 0x4871,
+ /* key: 0x8cbc */ 0x453d,
+ /* key: 0x8cbd */ 0x6c46,
+ /* key: 0x8cbe */ 0xffff,
+ /* key: 0x8cbf */ 0x4b47,
+ /* key: 0x8cc0 */ 0x326c,
+ /* key: 0x8cc1 */ 0x6c4c,
+ /* key: 0x8cc2 */ 0x4f28,
+ /* key: 0x8cc3 */ 0x4442,
+ /* key: 0x8cc4 */ 0x4f45,
+ /* key: 0x8cc5 */ 0xdf2c,
+ /* key: 0x8cc6 */ 0xdf2d,
+ /* key: 0x8cc7 */ 0x3b71,
+ /* key: 0x8cc8 */ 0x6c4b,
+ /* key: 0x8cc9 */ 0xdf2e,
+ /* key: 0x8cca */ 0x4231,
+ /* key: 0x8ccb */ 0xdf2f,
+ /* key: 0x8ccc */ 0xffff,
+ /* key: 0x8ccd */ 0x6c5c,
+ /* key: 0x8cce */ 0x4128,
+ /* key: 0x8ccf */ 0xdf30,
+ /* key: 0x8cd0 */ 0xffff,
+ /* key: 0x8cd1 */ 0x4678,
+ /* key: 0x8cd2 */ 0xffff,
+ /* key: 0x8cd3 */ 0x4950,
+ /* key: 0x8cd4 */ 0xffff,
+ /* key: 0x8cd5 */ 0xdf32,
+ /* key: 0x8cd6 */ 0xdf31,
+ /* key: 0x8cd7 */ 0xffff,
+ /* key: 0x8cd8 */ 0xffff,
+ /* key: 0x8cd9 */ 0xdf33,
+ /* key: 0x8cda */ 0x6c4f,
+ /* key: 0x8cdb */ 0x3b3f,
+ /* key: 0x8cdc */ 0x3b72,
+ /* key: 0x8cdd */ 0xdf34,
+ /* key: 0x8cde */ 0x3e5e,
+ /* key: 0x8cdf */ 0xffff,
+ /* key: 0x8ce0 */ 0x4765,
+ /* key: 0x8ce1 */ 0xdf35,
+ /* key: 0x8ce2 */ 0x382d,
+ /* key: 0x8ce3 */ 0x6c4e,
+ /* key: 0x8ce4 */ 0x6c4d,
+ /* key: 0x8ce5 */ 0xffff,
+ /* key: 0x8ce6 */ 0x496a,
+ /* key: 0x8ce7 */ 0xffff,
+ /* key: 0x8ce8 */ 0xdf36,
+ /* key: 0x8ce9 */ 0xffff,
+ /* key: 0x8cea */ 0x3c41,
+ /* key: 0x8ceb */ 0xffff,
+ /* key: 0x8cec */ 0xdf37,
+ /* key: 0x8ced */ 0x4552,
+ /* key: 0x8cee */ 0xffff,
+ /* key: 0x8cef */ 0xdf38,
+ /* key: 0x8cf0 */ 0xdf39,
+ /* key: 0x8cf1 */ 0xffff,
+ /* key: 0x8cf2 */ 0xdf3a,
+ /* key: 0x8cf3 */ 0xffff,
+ /* key: 0x8cf4 */ 0xffff,
+ /* key: 0x8cf5 */ 0xdf3b,
+ /* key: 0x8cf6 */ 0xffff,
+ /* key: 0x8cf7 */ 0xdf3c,
+ /* key: 0x8cf8 */ 0xdf3d,
+ /* key: 0x8cf9 */ 0xffff,
+ /* key: 0x8cfa */ 0x6c51,
+ /* key: 0x8cfb */ 0x6c52,
+ /* key: 0x8cfc */ 0x3958,
+ /* key: 0x8cfd */ 0x6c50,
+ /* key: 0x8cfe */ 0xdf3e,
+ /* key: 0x8cff */ 0xdf3f,
+ /* branch: 0x8d0X */ 18480,
+ /* branch: 0x8d1X */ 18496,
+ /* branch: 0x8d2X */ 0,
+ /* branch: 0x8d3X */ 0,
+ /* branch: 0x8d4X */ 0,
+ /* branch: 0x8d5X */ 0,
+ /* branch: 0x8d6X */ 18512,
+ /* branch: 0x8d7X */ 18528,
+ /* branch: 0x8d8X */ 18544,
+ /* branch: 0x8d9X */ 18560,
+ /* branch: 0x8daX */ 18576,
+ /* branch: 0x8dbX */ 18592,
+ /* branch: 0x8dcX */ 18608,
+ /* branch: 0x8ddX */ 18624,
+ /* branch: 0x8deX */ 18640,
+ /* branch: 0x8dfX */ 18656,
+ /* key: 0x8d00 */ 0xffff,
+ /* key: 0x8d01 */ 0xdf40,
+ /* key: 0x8d02 */ 0xffff,
+ /* key: 0x8d03 */ 0xdf41,
+ /* key: 0x8d04 */ 0x6c53,
+ /* key: 0x8d05 */ 0x6c54,
+ /* key: 0x8d06 */ 0xffff,
+ /* key: 0x8d07 */ 0x6c56,
+ /* key: 0x8d08 */ 0x4223,
+ /* key: 0x8d09 */ 0xdf42,
+ /* key: 0x8d0a */ 0x6c55,
+ /* key: 0x8d0b */ 0x3466,
+ /* key: 0x8d0c */ 0xffff,
+ /* key: 0x8d0d */ 0x6c58,
+ /* key: 0x8d0e */ 0xffff,
+ /* key: 0x8d0f */ 0x6c57,
+ /* key: 0x8d10 */ 0x6c59,
+ /* key: 0x8d11 */ 0xffff,
+ /* key: 0x8d12 */ 0xdf43,
+ /* key: 0x8d13 */ 0x6c5b,
+ /* key: 0x8d14 */ 0x6c5d,
+ /* key: 0x8d15 */ 0xffff,
+ /* key: 0x8d16 */ 0x6c5e,
+ /* key: 0x8d17 */ 0xdf44,
+ /* key: 0x8d18 */ 0xffff,
+ /* key: 0x8d19 */ 0xffff,
+ /* key: 0x8d1a */ 0xffff,
+ /* key: 0x8d1b */ 0xdf45,
+ /* key: 0x8d1c */ 0xffff,
+ /* key: 0x8d1d */ 0xffff,
+ /* key: 0x8d1e */ 0xffff,
+ /* key: 0x8d1f */ 0xffff,
+ /* key: 0x8d60 */ 0xffff,
+ /* key: 0x8d61 */ 0xffff,
+ /* key: 0x8d62 */ 0xffff,
+ /* key: 0x8d63 */ 0xffff,
+ /* key: 0x8d64 */ 0x4056,
+ /* key: 0x8d65 */ 0xdf46,
+ /* key: 0x8d66 */ 0x3c4f,
+ /* key: 0x8d67 */ 0x6c5f,
+ /* key: 0x8d68 */ 0xffff,
+ /* key: 0x8d69 */ 0xdf47,
+ /* key: 0x8d6a */ 0xffff,
+ /* key: 0x8d6b */ 0x3352,
+ /* key: 0x8d6c */ 0xdf48,
+ /* key: 0x8d6d */ 0x6c60,
+ /* key: 0x8d6e */ 0xdf49,
+ /* key: 0x8d6f */ 0xffff,
+ /* key: 0x8d70 */ 0x4176,
+ /* key: 0x8d71 */ 0x6c61,
+ /* key: 0x8d72 */ 0xffff,
+ /* key: 0x8d73 */ 0x6c62,
+ /* key: 0x8d74 */ 0x496b,
+ /* key: 0x8d75 */ 0xffff,
+ /* key: 0x8d76 */ 0xffff,
+ /* key: 0x8d77 */ 0x352f,
+ /* key: 0x8d78 */ 0xffff,
+ /* key: 0x8d79 */ 0xffff,
+ /* key: 0x8d7a */ 0xffff,
+ /* key: 0x8d7b */ 0xffff,
+ /* key: 0x8d7c */ 0xffff,
+ /* key: 0x8d7d */ 0xffff,
+ /* key: 0x8d7e */ 0xffff,
+ /* key: 0x8d7f */ 0xdf4a,
+ /* key: 0x8d80 */ 0xffff,
+ /* key: 0x8d81 */ 0x6c63,
+ /* key: 0x8d82 */ 0xdf4b,
+ /* key: 0x8d83 */ 0xffff,
+ /* key: 0x8d84 */ 0xdf4c,
+ /* key: 0x8d85 */ 0x4436,
+ /* key: 0x8d86 */ 0xffff,
+ /* key: 0x8d87 */ 0xffff,
+ /* key: 0x8d88 */ 0xdf4d,
+ /* key: 0x8d89 */ 0xffff,
+ /* key: 0x8d8a */ 0x315b,
+ /* key: 0x8d8b */ 0xffff,
+ /* key: 0x8d8c */ 0xffff,
+ /* key: 0x8d8d */ 0xdf4e,
+ /* key: 0x8d8e */ 0xffff,
+ /* key: 0x8d8f */ 0xffff,
+ /* key: 0x8d90 */ 0xdf4f,
+ /* key: 0x8d91 */ 0xdf50,
+ /* key: 0x8d92 */ 0xffff,
+ /* key: 0x8d93 */ 0xffff,
+ /* key: 0x8d94 */ 0xffff,
+ /* key: 0x8d95 */ 0xdf51,
+ /* key: 0x8d96 */ 0xffff,
+ /* key: 0x8d97 */ 0xffff,
+ /* key: 0x8d98 */ 0xffff,
+ /* key: 0x8d99 */ 0x6c64,
+ /* key: 0x8d9a */ 0xffff,
+ /* key: 0x8d9b */ 0xffff,
+ /* key: 0x8d9c */ 0xffff,
+ /* key: 0x8d9d */ 0xffff,
+ /* key: 0x8d9e */ 0xdf52,
+ /* key: 0x8d9f */ 0xdf53,
+ /* key: 0x8da0 */ 0xdf54,
+ /* key: 0x8da1 */ 0xffff,
+ /* key: 0x8da2 */ 0xffff,
+ /* key: 0x8da3 */ 0x3c71,
+ /* key: 0x8da4 */ 0xffff,
+ /* key: 0x8da5 */ 0xffff,
+ /* key: 0x8da6 */ 0xdf55,
+ /* key: 0x8da7 */ 0xffff,
+ /* key: 0x8da8 */ 0x3f76,
+ /* key: 0x8da9 */ 0xffff,
+ /* key: 0x8daa */ 0xffff,
+ /* key: 0x8dab */ 0xdf56,
+ /* key: 0x8dac */ 0xdf57,
+ /* key: 0x8dad */ 0xffff,
+ /* key: 0x8dae */ 0xffff,
+ /* key: 0x8daf */ 0xdf58,
+ /* key: 0x8db0 */ 0xffff,
+ /* key: 0x8db1 */ 0xffff,
+ /* key: 0x8db2 */ 0xdf59,
+ /* key: 0x8db3 */ 0x422d,
+ /* key: 0x8db4 */ 0xffff,
+ /* key: 0x8db5 */ 0xdf5a,
+ /* key: 0x8db6 */ 0xffff,
+ /* key: 0x8db7 */ 0xdf5b,
+ /* key: 0x8db8 */ 0xffff,
+ /* key: 0x8db9 */ 0xdf5c,
+ /* key: 0x8dba */ 0x6c67,
+ /* key: 0x8dbb */ 0xdf5d,
+ /* key: 0x8dbc */ 0xdf6f,
+ /* key: 0x8dbd */ 0xffff,
+ /* key: 0x8dbe */ 0x6c66,
+ /* key: 0x8dbf */ 0xffff,
+ /* key: 0x8dc0 */ 0xdf5e,
+ /* key: 0x8dc1 */ 0xffff,
+ /* key: 0x8dc2 */ 0x6c65,
+ /* key: 0x8dc3 */ 0xffff,
+ /* key: 0x8dc4 */ 0xffff,
+ /* key: 0x8dc5 */ 0xdf5f,
+ /* key: 0x8dc6 */ 0xdf60,
+ /* key: 0x8dc7 */ 0xdf61,
+ /* key: 0x8dc8 */ 0xdf62,
+ /* key: 0x8dc9 */ 0xffff,
+ /* key: 0x8dca */ 0xdf63,
+ /* key: 0x8dcb */ 0x6c6d,
+ /* key: 0x8dcc */ 0x6c6b,
+ /* key: 0x8dcd */ 0xffff,
+ /* key: 0x8dce */ 0xdf64,
+ /* key: 0x8dcf */ 0x6c68,
+ /* key: 0x8dd0 */ 0xffff,
+ /* key: 0x8dd1 */ 0xdf65,
+ /* key: 0x8dd2 */ 0xffff,
+ /* key: 0x8dd3 */ 0xffff,
+ /* key: 0x8dd4 */ 0xdf66,
+ /* key: 0x8dd5 */ 0xdf67,
+ /* key: 0x8dd6 */ 0x6c6a,
+ /* key: 0x8dd7 */ 0xdf68,
+ /* key: 0x8dd8 */ 0xffff,
+ /* key: 0x8dd9 */ 0xdf69,
+ /* key: 0x8dda */ 0x6c69,
+ /* key: 0x8ddb */ 0x6c6c,
+ /* key: 0x8ddc */ 0xffff,
+ /* key: 0x8ddd */ 0x3577,
+ /* key: 0x8dde */ 0xffff,
+ /* key: 0x8ddf */ 0x6c70,
+ /* key: 0x8de0 */ 0xffff,
+ /* key: 0x8de1 */ 0x4057,
+ /* key: 0x8de2 */ 0xffff,
+ /* key: 0x8de3 */ 0x6c71,
+ /* key: 0x8de4 */ 0xdf6a,
+ /* key: 0x8de5 */ 0xdf6b,
+ /* key: 0x8de6 */ 0xffff,
+ /* key: 0x8de7 */ 0xdf6c,
+ /* key: 0x8de8 */ 0x3859,
+ /* key: 0x8de9 */ 0xffff,
+ /* key: 0x8dea */ 0x6c6e,
+ /* key: 0x8deb */ 0x6c6f,
+ /* key: 0x8dec */ 0xdf6d,
+ /* key: 0x8ded */ 0xffff,
+ /* key: 0x8dee */ 0xffff,
+ /* key: 0x8def */ 0x4f29,
+ /* key: 0x8df0 */ 0xdf6e,
+ /* key: 0x8df1 */ 0xdf70,
+ /* key: 0x8df2 */ 0xdf71,
+ /* key: 0x8df3 */ 0x4437,
+ /* key: 0x8df4 */ 0xdf72,
+ /* key: 0x8df5 */ 0x4129,
+ /* key: 0x8df6 */ 0xffff,
+ /* key: 0x8df7 */ 0xffff,
+ /* key: 0x8df8 */ 0xffff,
+ /* key: 0x8df9 */ 0xffff,
+ /* key: 0x8dfa */ 0xffff,
+ /* key: 0x8dfb */ 0xffff,
+ /* key: 0x8dfc */ 0x6c72,
+ /* key: 0x8dfd */ 0xdf73,
+ /* key: 0x8dfe */ 0xffff,
+ /* key: 0x8dff */ 0x6c75,
+ /* branch: 0x8e0X */ 18688,
+ /* branch: 0x8e1X */ 18704,
+ /* branch: 0x8e2X */ 18720,
+ /* branch: 0x8e3X */ 18736,
+ /* branch: 0x8e4X */ 18752,
+ /* branch: 0x8e5X */ 18768,
+ /* branch: 0x8e6X */ 18784,
+ /* branch: 0x8e7X */ 18800,
+ /* branch: 0x8e8X */ 18816,
+ /* branch: 0x8e9X */ 18832,
+ /* branch: 0x8eaX */ 18848,
+ /* branch: 0x8ebX */ 18864,
+ /* branch: 0x8ecX */ 18880,
+ /* branch: 0x8edX */ 18896,
+ /* branch: 0x8eeX */ 18912,
+ /* branch: 0x8efX */ 18928,
+ /* key: 0x8e00 */ 0xffff,
+ /* key: 0x8e01 */ 0xdf74,
+ /* key: 0x8e02 */ 0xffff,
+ /* key: 0x8e03 */ 0xffff,
+ /* key: 0x8e04 */ 0xdf75,
+ /* key: 0x8e05 */ 0xdf76,
+ /* key: 0x8e06 */ 0xdf77,
+ /* key: 0x8e07 */ 0xffff,
+ /* key: 0x8e08 */ 0x6c73,
+ /* key: 0x8e09 */ 0x6c74,
+ /* key: 0x8e0a */ 0x4d59,
+ /* key: 0x8e0b */ 0xdf78,
+ /* key: 0x8e0c */ 0xffff,
+ /* key: 0x8e0d */ 0xffff,
+ /* key: 0x8e0e */ 0xffff,
+ /* key: 0x8e0f */ 0x4627,
+ /* key: 0x8e10 */ 0x6c78,
+ /* key: 0x8e11 */ 0xdf79,
+ /* key: 0x8e12 */ 0xffff,
+ /* key: 0x8e13 */ 0xffff,
+ /* key: 0x8e14 */ 0xdf7a,
+ /* key: 0x8e15 */ 0xffff,
+ /* key: 0x8e16 */ 0xdf7b,
+ /* key: 0x8e17 */ 0xffff,
+ /* key: 0x8e18 */ 0xffff,
+ /* key: 0x8e19 */ 0xffff,
+ /* key: 0x8e1a */ 0xffff,
+ /* key: 0x8e1b */ 0xffff,
+ /* key: 0x8e1c */ 0xffff,
+ /* key: 0x8e1d */ 0x6c76,
+ /* key: 0x8e1e */ 0x6c77,
+ /* key: 0x8e1f */ 0x6c79,
+ /* key: 0x8e20 */ 0xdf7c,
+ /* key: 0x8e21 */ 0xdf7d,
+ /* key: 0x8e22 */ 0xdf7e,
+ /* key: 0x8e23 */ 0xe021,
+ /* key: 0x8e24 */ 0xffff,
+ /* key: 0x8e25 */ 0xffff,
+ /* key: 0x8e26 */ 0xe022,
+ /* key: 0x8e27 */ 0xe023,
+ /* key: 0x8e28 */ 0xffff,
+ /* key: 0x8e29 */ 0xffff,
+ /* key: 0x8e2a */ 0x6d29,
+ /* key: 0x8e2b */ 0xffff,
+ /* key: 0x8e2c */ 0xffff,
+ /* key: 0x8e2d */ 0xffff,
+ /* key: 0x8e2e */ 0xffff,
+ /* key: 0x8e2f */ 0xffff,
+ /* key: 0x8e30 */ 0x6c7c,
+ /* key: 0x8e31 */ 0xe024,
+ /* key: 0x8e32 */ 0xffff,
+ /* key: 0x8e33 */ 0xe025,
+ /* key: 0x8e34 */ 0x6c7d,
+ /* key: 0x8e35 */ 0x6c7b,
+ /* key: 0x8e36 */ 0xe026,
+ /* key: 0x8e37 */ 0xe027,
+ /* key: 0x8e38 */ 0xe028,
+ /* key: 0x8e39 */ 0xe029,
+ /* key: 0x8e3a */ 0xffff,
+ /* key: 0x8e3b */ 0xffff,
+ /* key: 0x8e3c */ 0xffff,
+ /* key: 0x8e3d */ 0xe02a,
+ /* key: 0x8e3e */ 0xffff,
+ /* key: 0x8e3f */ 0xffff,
+ /* key: 0x8e40 */ 0xe02b,
+ /* key: 0x8e41 */ 0xe02c,
+ /* key: 0x8e42 */ 0x6c7a,
+ /* key: 0x8e43 */ 0xffff,
+ /* key: 0x8e44 */ 0x447d,
+ /* key: 0x8e45 */ 0xffff,
+ /* key: 0x8e46 */ 0xffff,
+ /* key: 0x8e47 */ 0x6d21,
+ /* key: 0x8e48 */ 0x6d25,
+ /* key: 0x8e49 */ 0x6d22,
+ /* key: 0x8e4a */ 0x6c7e,
+ /* key: 0x8e4b */ 0xe02d,
+ /* key: 0x8e4c */ 0x6d23,
+ /* key: 0x8e4d */ 0xe02e,
+ /* key: 0x8e4e */ 0xe02f,
+ /* key: 0x8e4f */ 0xe030,
+ /* key: 0x8e50 */ 0x6d24,
+ /* key: 0x8e51 */ 0xffff,
+ /* key: 0x8e52 */ 0xffff,
+ /* key: 0x8e53 */ 0xffff,
+ /* key: 0x8e54 */ 0xe031,
+ /* key: 0x8e55 */ 0x6d2b,
+ /* key: 0x8e56 */ 0xffff,
+ /* key: 0x8e57 */ 0xffff,
+ /* key: 0x8e58 */ 0xffff,
+ /* key: 0x8e59 */ 0x6d26,
+ /* key: 0x8e5a */ 0xffff,
+ /* key: 0x8e5b */ 0xe032,
+ /* key: 0x8e5c */ 0xe033,
+ /* key: 0x8e5d */ 0xe034,
+ /* key: 0x8e5e */ 0xe035,
+ /* key: 0x8e5f */ 0x4058,
+ /* key: 0x8e60 */ 0x6d28,
+ /* key: 0x8e61 */ 0xe036,
+ /* key: 0x8e62 */ 0xe037,
+ /* key: 0x8e63 */ 0x6d2a,
+ /* key: 0x8e64 */ 0x6d27,
+ /* key: 0x8e65 */ 0xffff,
+ /* key: 0x8e66 */ 0xffff,
+ /* key: 0x8e67 */ 0xffff,
+ /* key: 0x8e68 */ 0xffff,
+ /* key: 0x8e69 */ 0xe038,
+ /* key: 0x8e6a */ 0xffff,
+ /* key: 0x8e6b */ 0xffff,
+ /* key: 0x8e6c */ 0xe039,
+ /* key: 0x8e6d */ 0xe03a,
+ /* key: 0x8e6e */ 0xffff,
+ /* key: 0x8e6f */ 0xe03b,
+ /* key: 0x8e70 */ 0xe03c,
+ /* key: 0x8e71 */ 0xe03d,
+ /* key: 0x8e72 */ 0x6d2d,
+ /* key: 0x8e73 */ 0xffff,
+ /* key: 0x8e74 */ 0x3d33,
+ /* key: 0x8e75 */ 0xffff,
+ /* key: 0x8e76 */ 0x6d2c,
+ /* key: 0x8e77 */ 0xffff,
+ /* key: 0x8e78 */ 0xffff,
+ /* key: 0x8e79 */ 0xe03e,
+ /* key: 0x8e7a */ 0xe03f,
+ /* key: 0x8e7b */ 0xe040,
+ /* key: 0x8e7c */ 0x6d2e,
+ /* key: 0x8e7d */ 0xffff,
+ /* key: 0x8e7e */ 0xffff,
+ /* key: 0x8e7f */ 0xffff,
+ /* key: 0x8e80 */ 0xffff,
+ /* key: 0x8e81 */ 0x6d2f,
+ /* key: 0x8e82 */ 0xe041,
+ /* key: 0x8e83 */ 0xe042,
+ /* key: 0x8e84 */ 0x6d32,
+ /* key: 0x8e85 */ 0x6d31,
+ /* key: 0x8e86 */ 0xffff,
+ /* key: 0x8e87 */ 0x6d30,
+ /* key: 0x8e88 */ 0xffff,
+ /* key: 0x8e89 */ 0xe043,
+ /* key: 0x8e8a */ 0x6d34,
+ /* key: 0x8e8b */ 0x6d33,
+ /* key: 0x8e8c */ 0xffff,
+ /* key: 0x8e8d */ 0x4c76,
+ /* key: 0x8e8e */ 0xffff,
+ /* key: 0x8e8f */ 0xffff,
+ /* key: 0x8e90 */ 0xe044,
+ /* key: 0x8e91 */ 0x6d36,
+ /* key: 0x8e92 */ 0xe045,
+ /* key: 0x8e93 */ 0x6d35,
+ /* key: 0x8e94 */ 0x6d37,
+ /* key: 0x8e95 */ 0xe046,
+ /* key: 0x8e96 */ 0xffff,
+ /* key: 0x8e97 */ 0xffff,
+ /* key: 0x8e98 */ 0xffff,
+ /* key: 0x8e99 */ 0x6d38,
+ /* key: 0x8e9a */ 0xe047,
+ /* key: 0x8e9b */ 0xe048,
+ /* key: 0x8e9c */ 0xffff,
+ /* key: 0x8e9d */ 0xe049,
+ /* key: 0x8e9e */ 0xe04a,
+ /* key: 0x8e9f */ 0xffff,
+ /* key: 0x8ea0 */ 0xffff,
+ /* key: 0x8ea1 */ 0x6d3a,
+ /* key: 0x8ea2 */ 0xe04b,
+ /* key: 0x8ea3 */ 0xffff,
+ /* key: 0x8ea4 */ 0xffff,
+ /* key: 0x8ea5 */ 0xffff,
+ /* key: 0x8ea6 */ 0xffff,
+ /* key: 0x8ea7 */ 0xe04c,
+ /* key: 0x8ea8 */ 0xffff,
+ /* key: 0x8ea9 */ 0xe04d,
+ /* key: 0x8eaa */ 0x6d39,
+ /* key: 0x8eab */ 0x3f48,
+ /* key: 0x8eac */ 0x6d3b,
+ /* key: 0x8ead */ 0xe04e,
+ /* key: 0x8eae */ 0xe04f,
+ /* key: 0x8eaf */ 0x366d,
+ /* key: 0x8eb0 */ 0x6d3c,
+ /* key: 0x8eb1 */ 0x6d3e,
+ /* key: 0x8eb2 */ 0xffff,
+ /* key: 0x8eb3 */ 0xe050,
+ /* key: 0x8eb4 */ 0xffff,
+ /* key: 0x8eb5 */ 0xe051,
+ /* key: 0x8eb6 */ 0xffff,
+ /* key: 0x8eb7 */ 0xffff,
+ /* key: 0x8eb8 */ 0xffff,
+ /* key: 0x8eb9 */ 0xffff,
+ /* key: 0x8eba */ 0xe052,
+ /* key: 0x8ebb */ 0xe053,
+ /* key: 0x8ebc */ 0xffff,
+ /* key: 0x8ebd */ 0xffff,
+ /* key: 0x8ebe */ 0x6d3f,
+ /* key: 0x8ebf */ 0xffff,
+ /* key: 0x8ec0 */ 0xe054,
+ /* key: 0x8ec1 */ 0xe055,
+ /* key: 0x8ec2 */ 0xffff,
+ /* key: 0x8ec3 */ 0xe056,
+ /* key: 0x8ec4 */ 0xe057,
+ /* key: 0x8ec5 */ 0x6d40,
+ /* key: 0x8ec6 */ 0x6d3d,
+ /* key: 0x8ec7 */ 0xe058,
+ /* key: 0x8ec8 */ 0x6d41,
+ /* key: 0x8ec9 */ 0xffff,
+ /* key: 0x8eca */ 0x3c56,
+ /* key: 0x8ecb */ 0x6d42,
+ /* key: 0x8ecc */ 0x3530,
+ /* key: 0x8ecd */ 0x3733,
+ /* key: 0x8ece */ 0xffff,
+ /* key: 0x8ecf */ 0xe059,
+ /* key: 0x8ed0 */ 0xffff,
+ /* key: 0x8ed1 */ 0xe05a,
+ /* key: 0x8ed2 */ 0x382e,
+ /* key: 0x8ed3 */ 0xffff,
+ /* key: 0x8ed4 */ 0xe05b,
+ /* key: 0x8ed5 */ 0xffff,
+ /* key: 0x8ed6 */ 0xffff,
+ /* key: 0x8ed7 */ 0xffff,
+ /* key: 0x8ed8 */ 0xffff,
+ /* key: 0x8ed9 */ 0xffff,
+ /* key: 0x8eda */ 0xffff,
+ /* key: 0x8edb */ 0x6d43,
+ /* key: 0x8edc */ 0xe05c,
+ /* key: 0x8edd */ 0xffff,
+ /* key: 0x8ede */ 0xffff,
+ /* key: 0x8edf */ 0x4670,
+ /* key: 0x8ee0 */ 0xffff,
+ /* key: 0x8ee1 */ 0xffff,
+ /* key: 0x8ee2 */ 0x453e,
+ /* key: 0x8ee3 */ 0x6d44,
+ /* key: 0x8ee4 */ 0xffff,
+ /* key: 0x8ee5 */ 0xffff,
+ /* key: 0x8ee6 */ 0xffff,
+ /* key: 0x8ee7 */ 0xffff,
+ /* key: 0x8ee8 */ 0xe05d,
+ /* key: 0x8ee9 */ 0xffff,
+ /* key: 0x8eea */ 0xffff,
+ /* key: 0x8eeb */ 0x6d47,
+ /* key: 0x8eec */ 0xffff,
+ /* key: 0x8eed */ 0xe064,
+ /* key: 0x8eee */ 0xe05e,
+ /* key: 0x8eef */ 0xffff,
+ /* key: 0x8ef0 */ 0xe05f,
+ /* key: 0x8ef1 */ 0xe060,
+ /* key: 0x8ef2 */ 0xffff,
+ /* key: 0x8ef3 */ 0xffff,
+ /* key: 0x8ef4 */ 0xffff,
+ /* key: 0x8ef5 */ 0xffff,
+ /* key: 0x8ef6 */ 0xffff,
+ /* key: 0x8ef7 */ 0xe061,
+ /* key: 0x8ef8 */ 0x3c34,
+ /* key: 0x8ef9 */ 0xe062,
+ /* key: 0x8efa */ 0xe063,
+ /* key: 0x8efb */ 0x6d46,
+ /* key: 0x8efc */ 0x6d45,
+ /* key: 0x8efd */ 0x375a,
+ /* key: 0x8efe */ 0x6d48,
+ /* key: 0x8eff */ 0xffff,
+ /* branch: 0x8f0X */ 18960,
+ /* branch: 0x8f1X */ 18976,
+ /* branch: 0x8f2X */ 18992,
+ /* branch: 0x8f3X */ 19008,
+ /* branch: 0x8f4X */ 19024,
+ /* branch: 0x8f5X */ 19040,
+ /* branch: 0x8f6X */ 19056,
+ /* branch: 0x8f7X */ 0,
+ /* branch: 0x8f8X */ 0,
+ /* branch: 0x8f9X */ 19072,
+ /* branch: 0x8faX */ 19088,
+ /* branch: 0x8fbX */ 19104,
+ /* branch: 0x8fcX */ 19120,
+ /* branch: 0x8fdX */ 19136,
+ /* branch: 0x8feX */ 19152,
+ /* branch: 0x8ffX */ 19168,
+ /* key: 0x8f00 */ 0xe065,
+ /* key: 0x8f01 */ 0xffff,
+ /* key: 0x8f02 */ 0xe066,
+ /* key: 0x8f03 */ 0x3353,
+ /* key: 0x8f04 */ 0xffff,
+ /* key: 0x8f05 */ 0x6d4a,
+ /* key: 0x8f06 */ 0xffff,
+ /* key: 0x8f07 */ 0xe067,
+ /* key: 0x8f08 */ 0xe068,
+ /* key: 0x8f09 */ 0x3a5c,
+ /* key: 0x8f0a */ 0x6d49,
+ /* key: 0x8f0b */ 0xffff,
+ /* key: 0x8f0c */ 0x6d52,
+ /* key: 0x8f0d */ 0xffff,
+ /* key: 0x8f0e */ 0xffff,
+ /* key: 0x8f0f */ 0xe069,
+ /* key: 0x8f10 */ 0xe06a,
+ /* key: 0x8f11 */ 0xffff,
+ /* key: 0x8f12 */ 0x6d4c,
+ /* key: 0x8f13 */ 0x6d4e,
+ /* key: 0x8f14 */ 0x4a65,
+ /* key: 0x8f15 */ 0x6d4b,
+ /* key: 0x8f16 */ 0xe06b,
+ /* key: 0x8f17 */ 0xe06c,
+ /* key: 0x8f18 */ 0xe06d,
+ /* key: 0x8f19 */ 0x6d4d,
+ /* key: 0x8f1a */ 0xffff,
+ /* key: 0x8f1b */ 0x6d51,
+ /* key: 0x8f1c */ 0x6d4f,
+ /* key: 0x8f1d */ 0x3531,
+ /* key: 0x8f1e */ 0xe06e,
+ /* key: 0x8f1f */ 0x6d50,
+ /* key: 0x8f20 */ 0xe06f,
+ /* key: 0x8f21 */ 0xe070,
+ /* key: 0x8f22 */ 0xffff,
+ /* key: 0x8f23 */ 0xe071,
+ /* key: 0x8f24 */ 0xffff,
+ /* key: 0x8f25 */ 0xe072,
+ /* key: 0x8f26 */ 0x6d53,
+ /* key: 0x8f27 */ 0xe073,
+ /* key: 0x8f28 */ 0xe074,
+ /* key: 0x8f29 */ 0x475a,
+ /* key: 0x8f2a */ 0x4e58,
+ /* key: 0x8f2b */ 0xffff,
+ /* key: 0x8f2c */ 0xe075,
+ /* key: 0x8f2d */ 0xe076,
+ /* key: 0x8f2e */ 0xe077,
+ /* key: 0x8f2f */ 0x3d34,
+ /* key: 0x8f30 */ 0xffff,
+ /* key: 0x8f31 */ 0xffff,
+ /* key: 0x8f32 */ 0xffff,
+ /* key: 0x8f33 */ 0x6d54,
+ /* key: 0x8f34 */ 0xe078,
+ /* key: 0x8f35 */ 0xe079,
+ /* key: 0x8f36 */ 0xe07a,
+ /* key: 0x8f37 */ 0xe07b,
+ /* key: 0x8f38 */ 0x4d22,
+ /* key: 0x8f39 */ 0x6d56,
+ /* key: 0x8f3a */ 0xe07c,
+ /* key: 0x8f3b */ 0x6d55,
+ /* key: 0x8f3c */ 0xffff,
+ /* key: 0x8f3d */ 0xffff,
+ /* key: 0x8f3e */ 0x6d59,
+ /* key: 0x8f3f */ 0x4d41,
+ /* key: 0x8f40 */ 0xe07d,
+ /* key: 0x8f41 */ 0xe07e,
+ /* key: 0x8f42 */ 0x6d58,
+ /* key: 0x8f43 */ 0xe121,
+ /* key: 0x8f44 */ 0x336d,
+ /* key: 0x8f45 */ 0x6d57,
+ /* key: 0x8f46 */ 0x6d5c,
+ /* key: 0x8f47 */ 0xe122,
+ /* key: 0x8f48 */ 0xffff,
+ /* key: 0x8f49 */ 0x6d5b,
+ /* key: 0x8f4a */ 0xffff,
+ /* key: 0x8f4b */ 0xffff,
+ /* key: 0x8f4c */ 0x6d5a,
+ /* key: 0x8f4d */ 0x4532,
+ /* key: 0x8f4e */ 0x6d5d,
+ /* key: 0x8f4f */ 0xe123,
+ /* key: 0x8f50 */ 0xffff,
+ /* key: 0x8f51 */ 0xe124,
+ /* key: 0x8f52 */ 0xe125,
+ /* key: 0x8f53 */ 0xe126,
+ /* key: 0x8f54 */ 0xe127,
+ /* key: 0x8f55 */ 0xe128,
+ /* key: 0x8f56 */ 0xffff,
+ /* key: 0x8f57 */ 0x6d5e,
+ /* key: 0x8f58 */ 0xe129,
+ /* key: 0x8f59 */ 0xffff,
+ /* key: 0x8f5a */ 0xffff,
+ /* key: 0x8f5b */ 0xffff,
+ /* key: 0x8f5c */ 0x6d5f,
+ /* key: 0x8f5d */ 0xe12a,
+ /* key: 0x8f5e */ 0xe12b,
+ /* key: 0x8f5f */ 0x396c,
+ /* key: 0x8f60 */ 0xffff,
+ /* key: 0x8f61 */ 0x3725,
+ /* key: 0x8f62 */ 0x6d60,
+ /* key: 0x8f63 */ 0x6d61,
+ /* key: 0x8f64 */ 0x6d62,
+ /* key: 0x8f65 */ 0xe12c,
+ /* key: 0x8f66 */ 0xffff,
+ /* key: 0x8f67 */ 0xffff,
+ /* key: 0x8f68 */ 0xffff,
+ /* key: 0x8f69 */ 0xffff,
+ /* key: 0x8f6a */ 0xffff,
+ /* key: 0x8f6b */ 0xffff,
+ /* key: 0x8f6c */ 0xffff,
+ /* key: 0x8f6d */ 0xffff,
+ /* key: 0x8f6e */ 0xffff,
+ /* key: 0x8f6f */ 0xffff,
+ /* key: 0x8f90 */ 0xffff,
+ /* key: 0x8f91 */ 0xffff,
+ /* key: 0x8f92 */ 0xffff,
+ /* key: 0x8f93 */ 0xffff,
+ /* key: 0x8f94 */ 0xffff,
+ /* key: 0x8f95 */ 0xffff,
+ /* key: 0x8f96 */ 0xffff,
+ /* key: 0x8f97 */ 0xffff,
+ /* key: 0x8f98 */ 0xffff,
+ /* key: 0x8f99 */ 0xffff,
+ /* key: 0x8f9a */ 0xffff,
+ /* key: 0x8f9b */ 0x3f49,
+ /* key: 0x8f9c */ 0x6d63,
+ /* key: 0x8f9d */ 0xe12d,
+ /* key: 0x8f9e */ 0x3c2d,
+ /* key: 0x8f9f */ 0x6d64,
+ /* key: 0x8fa0 */ 0xe12e,
+ /* key: 0x8fa1 */ 0xe12f,
+ /* key: 0x8fa2 */ 0xffff,
+ /* key: 0x8fa3 */ 0x6d65,
+ /* key: 0x8fa4 */ 0xe130,
+ /* key: 0x8fa5 */ 0xe131,
+ /* key: 0x8fa6 */ 0xe132,
+ /* key: 0x8fa7 */ 0x5221,
+ /* key: 0x8fa8 */ 0x517e,
+ /* key: 0x8fa9 */ 0xffff,
+ /* key: 0x8faa */ 0xffff,
+ /* key: 0x8fab */ 0xffff,
+ /* key: 0x8fac */ 0xffff,
+ /* key: 0x8fad */ 0x6d66,
+ /* key: 0x8fae */ 0x6570,
+ /* key: 0x8faf */ 0x6d67,
+ /* key: 0x8fb0 */ 0x4324,
+ /* key: 0x8fb1 */ 0x3f2b,
+ /* key: 0x8fb2 */ 0x4740,
+ /* key: 0x8fb3 */ 0xffff,
+ /* key: 0x8fb4 */ 0xffff,
+ /* key: 0x8fb5 */ 0xe133,
+ /* key: 0x8fb6 */ 0xe134,
+ /* key: 0x8fb7 */ 0x6d68,
+ /* key: 0x8fb8 */ 0xe135,
+ /* key: 0x8fb9 */ 0xffff,
+ /* key: 0x8fba */ 0x4a55,
+ /* key: 0x8fbb */ 0x4454,
+ /* key: 0x8fbc */ 0x397e,
+ /* key: 0x8fbd */ 0xffff,
+ /* key: 0x8fbe */ 0xe136,
+ /* key: 0x8fbf */ 0x4329,
+ /* key: 0x8fc0 */ 0xe137,
+ /* key: 0x8fc1 */ 0xe138,
+ /* key: 0x8fc2 */ 0x312a,
+ /* key: 0x8fc3 */ 0xffff,
+ /* key: 0x8fc4 */ 0x4b78,
+ /* key: 0x8fc5 */ 0x3f57,
+ /* key: 0x8fc6 */ 0xe139,
+ /* key: 0x8fc7 */ 0xffff,
+ /* key: 0x8fc8 */ 0xffff,
+ /* key: 0x8fc9 */ 0xffff,
+ /* key: 0x8fca */ 0xe13a,
+ /* key: 0x8fcb */ 0xe13b,
+ /* key: 0x8fcc */ 0xffff,
+ /* key: 0x8fcd */ 0xe13c,
+ /* key: 0x8fce */ 0x375e,
+ /* key: 0x8fcf */ 0xffff,
+ /* key: 0x8fd0 */ 0xe13d,
+ /* key: 0x8fd1 */ 0x3661,
+ /* key: 0x8fd2 */ 0xe13e,
+ /* key: 0x8fd3 */ 0xe13f,
+ /* key: 0x8fd4 */ 0x4a56,
+ /* key: 0x8fd5 */ 0xe140,
+ /* key: 0x8fd6 */ 0xffff,
+ /* key: 0x8fd7 */ 0xffff,
+ /* key: 0x8fd8 */ 0xffff,
+ /* key: 0x8fd9 */ 0xffff,
+ /* key: 0x8fda */ 0x6d69,
+ /* key: 0x8fdb */ 0xffff,
+ /* key: 0x8fdc */ 0xffff,
+ /* key: 0x8fdd */ 0xffff,
+ /* key: 0x8fde */ 0xffff,
+ /* key: 0x8fdf */ 0xffff,
+ /* key: 0x8fe0 */ 0xe141,
+ /* key: 0x8fe1 */ 0xffff,
+ /* key: 0x8fe2 */ 0x6d6b,
+ /* key: 0x8fe3 */ 0xe142,
+ /* key: 0x8fe4 */ 0xe143,
+ /* key: 0x8fe5 */ 0x6d6a,
+ /* key: 0x8fe6 */ 0x3260,
+ /* key: 0x8fe7 */ 0xffff,
+ /* key: 0x8fe8 */ 0xe144,
+ /* key: 0x8fe9 */ 0x4676,
+ /* key: 0x8fea */ 0x6d6c,
+ /* key: 0x8feb */ 0x4777,
+ /* key: 0x8fec */ 0xffff,
+ /* key: 0x8fed */ 0x4533,
+ /* key: 0x8fee */ 0xe145,
+ /* key: 0x8fef */ 0x6d6d,
+ /* key: 0x8ff0 */ 0x3d52,
+ /* key: 0x8ff1 */ 0xe146,
+ /* key: 0x8ff2 */ 0xffff,
+ /* key: 0x8ff3 */ 0xffff,
+ /* key: 0x8ff4 */ 0x6d6f,
+ /* key: 0x8ff5 */ 0xe147,
+ /* key: 0x8ff6 */ 0xe148,
+ /* key: 0x8ff7 */ 0x4c42,
+ /* key: 0x8ff8 */ 0x6d7e,
+ /* key: 0x8ff9 */ 0x6d71,
+ /* key: 0x8ffa */ 0x6d72,
+ /* key: 0x8ffb */ 0xe149,
+ /* key: 0x8ffc */ 0xffff,
+ /* key: 0x8ffd */ 0x4449,
+ /* key: 0x8ffe */ 0xe14a,
+ /* key: 0x8fff */ 0xffff,
+ /* branch: 0x90XX */ 19200,
+ /* branch: 0x91XX */ 19472,
+ /* branch: 0x92XX */ 19744,
+ /* branch: 0x93XX */ 20016,
+ /* branch: 0x94XX */ 20288,
+ /* branch: 0x95XX */ 20448,
+ /* branch: 0x96XX */ 20592,
+ /* branch: 0x97XX */ 20848,
+ /* branch: 0x98XX */ 21120,
+ /* branch: 0x99XX */ 21360,
+ /* branch: 0x9aXX */ 21600,
+ /* branch: 0x9bXX */ 21824,
+ /* branch: 0x9cXX */ 22096,
+ /* branch: 0x9dXX */ 22272,
+ /* branch: 0x9eXX */ 22544,
+ /* branch: 0x9fXX */ 22736,
+ /* branch: 0x900X */ 19216,
+ /* branch: 0x901X */ 19232,
+ /* branch: 0x902X */ 19248,
+ /* branch: 0x903X */ 19264,
+ /* branch: 0x904X */ 19280,
+ /* branch: 0x905X */ 19296,
+ /* branch: 0x906X */ 19312,
+ /* branch: 0x907X */ 19328,
+ /* branch: 0x908X */ 19344,
+ /* branch: 0x909X */ 19360,
+ /* branch: 0x90aX */ 19376,
+ /* branch: 0x90bX */ 19392,
+ /* branch: 0x90cX */ 19408,
+ /* branch: 0x90dX */ 19424,
+ /* branch: 0x90eX */ 19440,
+ /* branch: 0x90fX */ 19456,
+ /* key: 0x9000 */ 0x4260,
+ /* key: 0x9001 */ 0x4177,
+ /* key: 0x9002 */ 0xe14b,
+ /* key: 0x9003 */ 0x4628,
+ /* key: 0x9004 */ 0xe14c,
+ /* key: 0x9005 */ 0x6d70,
+ /* key: 0x9006 */ 0x3555,
+ /* key: 0x9007 */ 0xffff,
+ /* key: 0x9008 */ 0xe14d,
+ /* key: 0x9009 */ 0xffff,
+ /* key: 0x900a */ 0xffff,
+ /* key: 0x900b */ 0x6d79,
+ /* key: 0x900c */ 0xe14e,
+ /* key: 0x900d */ 0x6d76,
+ /* key: 0x900e */ 0x6e25,
+ /* key: 0x900f */ 0x4629,
+ /* key: 0x9010 */ 0x4360,
+ /* key: 0x9011 */ 0x6d73,
+ /* key: 0x9012 */ 0xffff,
+ /* key: 0x9013 */ 0x447e,
+ /* key: 0x9014 */ 0x4553,
+ /* key: 0x9015 */ 0x6d74,
+ /* key: 0x9016 */ 0x6d78,
+ /* key: 0x9017 */ 0x3f60,
+ /* key: 0x9018 */ 0xe14f,
+ /* key: 0x9019 */ 0x4767,
+ /* key: 0x901a */ 0x444c,
+ /* key: 0x901b */ 0xe150,
+ /* key: 0x901c */ 0xffff,
+ /* key: 0x901d */ 0x4042,
+ /* key: 0x901e */ 0x6d77,
+ /* key: 0x901f */ 0x422e,
+ /* key: 0x9020 */ 0x4224,
+ /* key: 0x9021 */ 0x6d75,
+ /* key: 0x9022 */ 0x3029,
+ /* key: 0x9023 */ 0x4f22,
+ /* key: 0x9024 */ 0xffff,
+ /* key: 0x9025 */ 0xffff,
+ /* key: 0x9026 */ 0xffff,
+ /* key: 0x9027 */ 0x6d7a,
+ /* key: 0x9028 */ 0xe151,
+ /* key: 0x9029 */ 0xe152,
+ /* key: 0x902a */ 0xe154,
+ /* key: 0x902b */ 0xffff,
+ /* key: 0x902c */ 0xe155,
+ /* key: 0x902d */ 0xe156,
+ /* key: 0x902e */ 0x4261,
+ /* key: 0x902f */ 0xe153,
+ /* key: 0x9030 */ 0xffff,
+ /* key: 0x9031 */ 0x3d35,
+ /* key: 0x9032 */ 0x3f4a,
+ /* key: 0x9033 */ 0xe157,
+ /* key: 0x9034 */ 0xe158,
+ /* key: 0x9035 */ 0x6d7c,
+ /* key: 0x9036 */ 0x6d7b,
+ /* key: 0x9037 */ 0xe159,
+ /* key: 0x9038 */ 0x306f,
+ /* key: 0x9039 */ 0x6d7d,
+ /* key: 0x903a */ 0xffff,
+ /* key: 0x903b */ 0xffff,
+ /* key: 0x903c */ 0x492f,
+ /* key: 0x903d */ 0xffff,
+ /* key: 0x903e */ 0x6e27,
+ /* key: 0x903f */ 0xe15a,
+ /* key: 0x9040 */ 0xffff,
+ /* key: 0x9041 */ 0x465b,
+ /* key: 0x9042 */ 0x3f6b,
+ /* key: 0x9043 */ 0xe15b,
+ /* key: 0x9044 */ 0xe15c,
+ /* key: 0x9045 */ 0x4359,
+ /* key: 0x9046 */ 0xffff,
+ /* key: 0x9047 */ 0x3678,
+ /* key: 0x9048 */ 0xffff,
+ /* key: 0x9049 */ 0x6e26,
+ /* key: 0x904a */ 0x4d37,
+ /* key: 0x904b */ 0x313f,
+ /* key: 0x904c */ 0xe15d,
+ /* key: 0x904d */ 0x4a57,
+ /* key: 0x904e */ 0x3261,
+ /* key: 0x904f */ 0x6e21,
+ /* key: 0x9050 */ 0x6e22,
+ /* key: 0x9051 */ 0x6e23,
+ /* key: 0x9052 */ 0x6e24,
+ /* key: 0x9053 */ 0x463b,
+ /* key: 0x9054 */ 0x4323,
+ /* key: 0x9055 */ 0x3063,
+ /* key: 0x9056 */ 0x6e28,
+ /* key: 0x9057 */ 0xffff,
+ /* key: 0x9058 */ 0x6e29,
+ /* key: 0x9059 */ 0x7423,
+ /* key: 0x905a */ 0xffff,
+ /* key: 0x905b */ 0xe15e,
+ /* key: 0x905c */ 0x423d,
+ /* key: 0x905d */ 0xe15f,
+ /* key: 0x905e */ 0x6e2a,
+ /* key: 0x905f */ 0xffff,
+ /* key: 0x9060 */ 0x3173,
+ /* key: 0x9061 */ 0x414c,
+ /* key: 0x9062 */ 0xe160,
+ /* key: 0x9063 */ 0x382f,
+ /* key: 0x9064 */ 0xffff,
+ /* key: 0x9065 */ 0x4d5a,
+ /* key: 0x9066 */ 0xe161,
+ /* key: 0x9067 */ 0xe162,
+ /* key: 0x9068 */ 0x6e2b,
+ /* key: 0x9069 */ 0x452c,
+ /* key: 0x906a */ 0xffff,
+ /* key: 0x906b */ 0xffff,
+ /* key: 0x906c */ 0xe163,
+ /* key: 0x906d */ 0x4178,
+ /* key: 0x906e */ 0x3c57,
+ /* key: 0x906f */ 0x6e2c,
+ /* key: 0x9070 */ 0xe164,
+ /* key: 0x9071 */ 0xffff,
+ /* key: 0x9072 */ 0x6e2f,
+ /* key: 0x9073 */ 0xffff,
+ /* key: 0x9074 */ 0xe165,
+ /* key: 0x9075 */ 0x3d65,
+ /* key: 0x9076 */ 0x6e2d,
+ /* key: 0x9077 */ 0x412b,
+ /* key: 0x9078 */ 0x412a,
+ /* key: 0x9079 */ 0xe166,
+ /* key: 0x907a */ 0x3064,
+ /* key: 0x907b */ 0xffff,
+ /* key: 0x907c */ 0x4e4b,
+ /* key: 0x907d */ 0x6e31,
+ /* key: 0x907e */ 0xffff,
+ /* key: 0x907f */ 0x4872,
+ /* key: 0x9080 */ 0x6e33,
+ /* key: 0x9081 */ 0x6e32,
+ /* key: 0x9082 */ 0x6e30,
+ /* key: 0x9083 */ 0x6364,
+ /* key: 0x9084 */ 0x3454,
+ /* key: 0x9085 */ 0xe167,
+ /* key: 0x9086 */ 0xffff,
+ /* key: 0x9087 */ 0x6d6e,
+ /* key: 0x9088 */ 0xe168,
+ /* key: 0x9089 */ 0x6e35,
+ /* key: 0x908a */ 0x6e34,
+ /* key: 0x908b */ 0xe169,
+ /* key: 0x908c */ 0xe16a,
+ /* key: 0x908d */ 0xffff,
+ /* key: 0x908e */ 0xe16b,
+ /* key: 0x908f */ 0x6e36,
+ /* key: 0x9090 */ 0xe16c,
+ /* key: 0x9091 */ 0x4d38,
+ /* key: 0x9092 */ 0xffff,
+ /* key: 0x9093 */ 0xffff,
+ /* key: 0x9094 */ 0xffff,
+ /* key: 0x9095 */ 0xe16d,
+ /* key: 0x9096 */ 0xffff,
+ /* key: 0x9097 */ 0xe16e,
+ /* key: 0x9098 */ 0xe16f,
+ /* key: 0x9099 */ 0xe170,
+ /* key: 0x909a */ 0xffff,
+ /* key: 0x909b */ 0xe171,
+ /* key: 0x909c */ 0xffff,
+ /* key: 0x909d */ 0xffff,
+ /* key: 0x909e */ 0xffff,
+ /* key: 0x909f */ 0xffff,
+ /* key: 0x90a0 */ 0xe172,
+ /* key: 0x90a1 */ 0xe173,
+ /* key: 0x90a2 */ 0xe174,
+ /* key: 0x90a3 */ 0x4661,
+ /* key: 0x90a4 */ 0xffff,
+ /* key: 0x90a5 */ 0xe175,
+ /* key: 0x90a6 */ 0x4b2e,
+ /* key: 0x90a7 */ 0xffff,
+ /* key: 0x90a8 */ 0x6e37,
+ /* key: 0x90a9 */ 0xffff,
+ /* key: 0x90aa */ 0x3c59,
+ /* key: 0x90ab */ 0xffff,
+ /* key: 0x90ac */ 0xffff,
+ /* key: 0x90ad */ 0xffff,
+ /* key: 0x90ae */ 0xffff,
+ /* key: 0x90af */ 0x6e38,
+ /* key: 0x90b0 */ 0xe176,
+ /* key: 0x90b1 */ 0x6e39,
+ /* key: 0x90b2 */ 0xe177,
+ /* key: 0x90b3 */ 0xe178,
+ /* key: 0x90b4 */ 0xe179,
+ /* key: 0x90b5 */ 0x6e3a,
+ /* key: 0x90b6 */ 0xe17a,
+ /* key: 0x90b7 */ 0xffff,
+ /* key: 0x90b8 */ 0x4521,
+ /* key: 0x90b9 */ 0xffff,
+ /* key: 0x90ba */ 0xffff,
+ /* key: 0x90bb */ 0xffff,
+ /* key: 0x90bc */ 0xffff,
+ /* key: 0x90bd */ 0xe17b,
+ /* key: 0x90be */ 0xe17d,
+ /* key: 0x90bf */ 0xffff,
+ /* key: 0x90c0 */ 0xffff,
+ /* key: 0x90c1 */ 0x306a,
+ /* key: 0x90c2 */ 0xffff,
+ /* key: 0x90c3 */ 0xe17e,
+ /* key: 0x90c4 */ 0xe221,
+ /* key: 0x90c5 */ 0xe222,
+ /* key: 0x90c6 */ 0xffff,
+ /* key: 0x90c7 */ 0xe223,
+ /* key: 0x90c8 */ 0xe224,
+ /* key: 0x90c9 */ 0xffff,
+ /* key: 0x90ca */ 0x3959,
+ /* key: 0x90cb */ 0xffff,
+ /* key: 0x90cc */ 0xe17c,
+ /* key: 0x90cd */ 0xffff,
+ /* key: 0x90ce */ 0x4f3a,
+ /* key: 0x90cf */ 0xffff,
+ /* key: 0x90d0 */ 0xffff,
+ /* key: 0x90d1 */ 0xffff,
+ /* key: 0x90d2 */ 0xe22d,
+ /* key: 0x90d3 */ 0xffff,
+ /* key: 0x90d4 */ 0xffff,
+ /* key: 0x90d5 */ 0xe225,
+ /* key: 0x90d6 */ 0xffff,
+ /* key: 0x90d7 */ 0xe226,
+ /* key: 0x90d8 */ 0xe227,
+ /* key: 0x90d9 */ 0xe228,
+ /* key: 0x90da */ 0xffff,
+ /* key: 0x90db */ 0x6e3e,
+ /* key: 0x90dc */ 0xe229,
+ /* key: 0x90dd */ 0xe22a,
+ /* key: 0x90de */ 0xffff,
+ /* key: 0x90df */ 0xe22b,
+ /* key: 0x90e0 */ 0xffff,
+ /* key: 0x90e1 */ 0x3734,
+ /* key: 0x90e2 */ 0x6e3b,
+ /* key: 0x90e3 */ 0xffff,
+ /* key: 0x90e4 */ 0x6e3c,
+ /* key: 0x90e5 */ 0xe22c,
+ /* key: 0x90e6 */ 0xffff,
+ /* key: 0x90e7 */ 0xffff,
+ /* key: 0x90e8 */ 0x4974,
+ /* key: 0x90e9 */ 0xffff,
+ /* key: 0x90ea */ 0xffff,
+ /* key: 0x90eb */ 0xe22f,
+ /* key: 0x90ec */ 0xffff,
+ /* key: 0x90ed */ 0x3354,
+ /* key: 0x90ee */ 0xffff,
+ /* key: 0x90ef */ 0xe230,
+ /* key: 0x90f0 */ 0xe231,
+ /* key: 0x90f1 */ 0xffff,
+ /* key: 0x90f2 */ 0xffff,
+ /* key: 0x90f3 */ 0xffff,
+ /* key: 0x90f4 */ 0xe232,
+ /* key: 0x90f5 */ 0x4d39,
+ /* key: 0x90f6 */ 0xe22e,
+ /* key: 0x90f7 */ 0x363f,
+ /* key: 0x90f8 */ 0xffff,
+ /* key: 0x90f9 */ 0xffff,
+ /* key: 0x90fa */ 0xffff,
+ /* key: 0x90fb */ 0xffff,
+ /* key: 0x90fc */ 0xffff,
+ /* key: 0x90fd */ 0x4554,
+ /* key: 0x90fe */ 0xe233,
+ /* key: 0x90ff */ 0xe234,
+ /* branch: 0x910X */ 19488,
+ /* branch: 0x911X */ 19504,
+ /* branch: 0x912X */ 19520,
+ /* branch: 0x913X */ 19536,
+ /* branch: 0x914X */ 19552,
+ /* branch: 0x915X */ 19568,
+ /* branch: 0x916X */ 19584,
+ /* branch: 0x917X */ 19600,
+ /* branch: 0x918X */ 19616,
+ /* branch: 0x919X */ 19632,
+ /* branch: 0x91aX */ 19648,
+ /* branch: 0x91bX */ 19664,
+ /* branch: 0x91cX */ 19680,
+ /* branch: 0x91dX */ 19696,
+ /* branch: 0x91eX */ 19712,
+ /* branch: 0x91fX */ 19728,
+ /* key: 0x9100 */ 0xe235,
+ /* key: 0x9101 */ 0xffff,
+ /* key: 0x9102 */ 0x6e3f,
+ /* key: 0x9103 */ 0xffff,
+ /* key: 0x9104 */ 0xe236,
+ /* key: 0x9105 */ 0xe237,
+ /* key: 0x9106 */ 0xe238,
+ /* key: 0x9107 */ 0xffff,
+ /* key: 0x9108 */ 0xe239,
+ /* key: 0x9109 */ 0xffff,
+ /* key: 0x910a */ 0xffff,
+ /* key: 0x910b */ 0xffff,
+ /* key: 0x910c */ 0xffff,
+ /* key: 0x910d */ 0xe23a,
+ /* key: 0x910e */ 0xffff,
+ /* key: 0x910f */ 0xffff,
+ /* key: 0x9110 */ 0xe23b,
+ /* key: 0x9111 */ 0xffff,
+ /* key: 0x9112 */ 0x6e40,
+ /* key: 0x9113 */ 0xffff,
+ /* key: 0x9114 */ 0xe23c,
+ /* key: 0x9115 */ 0xffff,
+ /* key: 0x9116 */ 0xe23d,
+ /* key: 0x9117 */ 0xe23e,
+ /* key: 0x9118 */ 0xe23f,
+ /* key: 0x9119 */ 0x6e41,
+ /* key: 0x911a */ 0xe240,
+ /* key: 0x911b */ 0xffff,
+ /* key: 0x911c */ 0xe241,
+ /* key: 0x911d */ 0xffff,
+ /* key: 0x911e */ 0xe242,
+ /* key: 0x911f */ 0xffff,
+ /* key: 0x9120 */ 0xe243,
+ /* key: 0x9121 */ 0xffff,
+ /* key: 0x9122 */ 0xe245,
+ /* key: 0x9123 */ 0xe246,
+ /* key: 0x9124 */ 0xffff,
+ /* key: 0x9125 */ 0xe244,
+ /* key: 0x9126 */ 0xffff,
+ /* key: 0x9127 */ 0xe247,
+ /* key: 0x9128 */ 0xffff,
+ /* key: 0x9129 */ 0xe248,
+ /* key: 0x912a */ 0xffff,
+ /* key: 0x912b */ 0xffff,
+ /* key: 0x912c */ 0xffff,
+ /* key: 0x912d */ 0x4522,
+ /* key: 0x912e */ 0xe249,
+ /* key: 0x912f */ 0xe24a,
+ /* key: 0x9130 */ 0x6e43,
+ /* key: 0x9131 */ 0xe24b,
+ /* key: 0x9132 */ 0x6e42,
+ /* key: 0x9133 */ 0xffff,
+ /* key: 0x9134 */ 0xe24c,
+ /* key: 0x9135 */ 0xffff,
+ /* key: 0x9136 */ 0xe24d,
+ /* key: 0x9137 */ 0xe24e,
+ /* key: 0x9138 */ 0xffff,
+ /* key: 0x9139 */ 0xe24f,
+ /* key: 0x913a */ 0xe250,
+ /* key: 0x913b */ 0xffff,
+ /* key: 0x913c */ 0xe251,
+ /* key: 0x913d */ 0xe252,
+ /* key: 0x913e */ 0xffff,
+ /* key: 0x913f */ 0xffff,
+ /* key: 0x9140 */ 0xffff,
+ /* key: 0x9141 */ 0xffff,
+ /* key: 0x9142 */ 0xffff,
+ /* key: 0x9143 */ 0xe253,
+ /* key: 0x9144 */ 0xffff,
+ /* key: 0x9145 */ 0xffff,
+ /* key: 0x9146 */ 0xffff,
+ /* key: 0x9147 */ 0xe254,
+ /* key: 0x9148 */ 0xe255,
+ /* key: 0x9149 */ 0x4653,
+ /* key: 0x914a */ 0x6e44,
+ /* key: 0x914b */ 0x3d36,
+ /* key: 0x914c */ 0x3c60,
+ /* key: 0x914d */ 0x475b,
+ /* key: 0x914e */ 0x4371,
+ /* key: 0x914f */ 0xe256,
+ /* key: 0x9150 */ 0xffff,
+ /* key: 0x9151 */ 0xffff,
+ /* key: 0x9152 */ 0x3c72,
+ /* key: 0x9153 */ 0xe257,
+ /* key: 0x9154 */ 0x3f6c,
+ /* key: 0x9155 */ 0xffff,
+ /* key: 0x9156 */ 0x6e45,
+ /* key: 0x9157 */ 0xe258,
+ /* key: 0x9158 */ 0x6e46,
+ /* key: 0x9159 */ 0xe259,
+ /* key: 0x915a */ 0xe25a,
+ /* key: 0x915b */ 0xe25b,
+ /* key: 0x915c */ 0xffff,
+ /* key: 0x915d */ 0xffff,
+ /* key: 0x915e */ 0xffff,
+ /* key: 0x915f */ 0xffff,
+ /* key: 0x9160 */ 0xffff,
+ /* key: 0x9161 */ 0xe25c,
+ /* key: 0x9162 */ 0x3f5d,
+ /* key: 0x9163 */ 0x6e47,
+ /* key: 0x9164 */ 0xe25d,
+ /* key: 0x9165 */ 0x6e48,
+ /* key: 0x9166 */ 0xffff,
+ /* key: 0x9167 */ 0xe25e,
+ /* key: 0x9168 */ 0xffff,
+ /* key: 0x9169 */ 0x6e49,
+ /* key: 0x916a */ 0x4d6f,
+ /* key: 0x916b */ 0xffff,
+ /* key: 0x916c */ 0x3d37,
+ /* key: 0x916d */ 0xe25f,
+ /* key: 0x916e */ 0xffff,
+ /* key: 0x916f */ 0xffff,
+ /* key: 0x9170 */ 0xffff,
+ /* key: 0x9171 */ 0xffff,
+ /* key: 0x9172 */ 0x6e4b,
+ /* key: 0x9173 */ 0x6e4a,
+ /* key: 0x9174 */ 0xe260,
+ /* key: 0x9175 */ 0x395a,
+ /* key: 0x9176 */ 0xffff,
+ /* key: 0x9177 */ 0x3973,
+ /* key: 0x9178 */ 0x3b40,
+ /* key: 0x9179 */ 0xe261,
+ /* key: 0x917a */ 0xe262,
+ /* key: 0x917b */ 0xe263,
+ /* key: 0x917c */ 0xffff,
+ /* key: 0x917d */ 0xffff,
+ /* key: 0x917e */ 0xffff,
+ /* key: 0x917f */ 0xffff,
+ /* key: 0x9180 */ 0xffff,
+ /* key: 0x9181 */ 0xe264,
+ /* key: 0x9182 */ 0x6e4e,
+ /* key: 0x9183 */ 0xe265,
+ /* key: 0x9184 */ 0xffff,
+ /* key: 0x9185 */ 0xe266,
+ /* key: 0x9186 */ 0xe267,
+ /* key: 0x9187 */ 0x3d66,
+ /* key: 0x9188 */ 0xffff,
+ /* key: 0x9189 */ 0x6e4d,
+ /* key: 0x918a */ 0xe268,
+ /* key: 0x918b */ 0x6e4c,
+ /* key: 0x918c */ 0xffff,
+ /* key: 0x918d */ 0x4269,
+ /* key: 0x918e */ 0xe269,
+ /* key: 0x918f */ 0xffff,
+ /* key: 0x9190 */ 0x386f,
+ /* key: 0x9191 */ 0xe26a,
+ /* key: 0x9192 */ 0x4043,
+ /* key: 0x9193 */ 0xe26b,
+ /* key: 0x9194 */ 0xe26c,
+ /* key: 0x9195 */ 0xe26d,
+ /* key: 0x9196 */ 0xffff,
+ /* key: 0x9197 */ 0x4830,
+ /* key: 0x9198 */ 0xe26e,
+ /* key: 0x9199 */ 0xffff,
+ /* key: 0x919a */ 0xffff,
+ /* key: 0x919b */ 0xffff,
+ /* key: 0x919c */ 0x3d39,
+ /* key: 0x919d */ 0xffff,
+ /* key: 0x919e */ 0xe26f,
+ /* key: 0x919f */ 0xffff,
+ /* key: 0x91a0 */ 0xffff,
+ /* key: 0x91a1 */ 0xe270,
+ /* key: 0x91a2 */ 0x6e4f,
+ /* key: 0x91a3 */ 0xffff,
+ /* key: 0x91a4 */ 0x3e5f,
+ /* key: 0x91a5 */ 0xffff,
+ /* key: 0x91a6 */ 0xe271,
+ /* key: 0x91a7 */ 0xffff,
+ /* key: 0x91a8 */ 0xe272,
+ /* key: 0x91a9 */ 0xffff,
+ /* key: 0x91aa */ 0x6e52,
+ /* key: 0x91ab */ 0x6e50,
+ /* key: 0x91ac */ 0xe273,
+ /* key: 0x91ad */ 0xe274,
+ /* key: 0x91ae */ 0xe275,
+ /* key: 0x91af */ 0x6e51,
+ /* key: 0x91b0 */ 0xe276,
+ /* key: 0x91b1 */ 0xe277,
+ /* key: 0x91b2 */ 0xe278,
+ /* key: 0x91b3 */ 0xe279,
+ /* key: 0x91b4 */ 0x6e54,
+ /* key: 0x91b5 */ 0x6e53,
+ /* key: 0x91b6 */ 0xe27a,
+ /* key: 0x91b7 */ 0xffff,
+ /* key: 0x91b8 */ 0x3e7a,
+ /* key: 0x91b9 */ 0xffff,
+ /* key: 0x91ba */ 0x6e55,
+ /* key: 0x91bb */ 0xe27b,
+ /* key: 0x91bc */ 0xe27c,
+ /* key: 0x91bd */ 0xe27d,
+ /* key: 0x91be */ 0xffff,
+ /* key: 0x91bf */ 0xe27e,
+ /* key: 0x91c0 */ 0x6e56,
+ /* key: 0x91c1 */ 0x6e57,
+ /* key: 0x91c2 */ 0xe321,
+ /* key: 0x91c3 */ 0xe322,
+ /* key: 0x91c4 */ 0xffff,
+ /* key: 0x91c5 */ 0xe323,
+ /* key: 0x91c6 */ 0x4850,
+ /* key: 0x91c7 */ 0x3a53,
+ /* key: 0x91c8 */ 0x3c61,
+ /* key: 0x91c9 */ 0x6e58,
+ /* key: 0x91ca */ 0xffff,
+ /* key: 0x91cb */ 0x6e59,
+ /* key: 0x91cc */ 0x4e24,
+ /* key: 0x91cd */ 0x3d45,
+ /* key: 0x91ce */ 0x4c6e,
+ /* key: 0x91cf */ 0x4e4c,
+ /* key: 0x91d0 */ 0x6e5a,
+ /* key: 0x91d1 */ 0x3662,
+ /* key: 0x91d2 */ 0xffff,
+ /* key: 0x91d3 */ 0xe324,
+ /* key: 0x91d4 */ 0xe325,
+ /* key: 0x91d5 */ 0xffff,
+ /* key: 0x91d6 */ 0x6e5b,
+ /* key: 0x91d7 */ 0xe326,
+ /* key: 0x91d8 */ 0x4523,
+ /* key: 0x91d9 */ 0xe327,
+ /* key: 0x91da */ 0xe328,
+ /* key: 0x91db */ 0x6e5e,
+ /* key: 0x91dc */ 0x3378,
+ /* key: 0x91dd */ 0x3f4b,
+ /* key: 0x91de */ 0xe329,
+ /* key: 0x91df */ 0x6e5c,
+ /* key: 0x91e0 */ 0xffff,
+ /* key: 0x91e1 */ 0x6e5d,
+ /* key: 0x91e2 */ 0xffff,
+ /* key: 0x91e3 */ 0x4460,
+ /* key: 0x91e4 */ 0xe32a,
+ /* key: 0x91e5 */ 0xe32b,
+ /* key: 0x91e6 */ 0x4b55,
+ /* key: 0x91e7 */ 0x367c,
+ /* key: 0x91e8 */ 0xffff,
+ /* key: 0x91e9 */ 0xe32c,
+ /* key: 0x91ea */ 0xe32d,
+ /* key: 0x91eb */ 0xffff,
+ /* key: 0x91ec */ 0xe32e,
+ /* key: 0x91ed */ 0xe32f,
+ /* key: 0x91ee */ 0xe330,
+ /* key: 0x91ef */ 0xe331,
+ /* key: 0x91f0 */ 0xe332,
+ /* key: 0x91f1 */ 0xe333,
+ /* key: 0x91f2 */ 0xffff,
+ /* key: 0x91f3 */ 0xffff,
+ /* key: 0x91f4 */ 0xffff,
+ /* key: 0x91f5 */ 0x6e60,
+ /* key: 0x91f6 */ 0x6e61,
+ /* key: 0x91f7 */ 0xe334,
+ /* key: 0x91f8 */ 0xffff,
+ /* key: 0x91f9 */ 0xe335,
+ /* key: 0x91fa */ 0xffff,
+ /* key: 0x91fb */ 0xe336,
+ /* key: 0x91fc */ 0x6e5f,
+ /* key: 0x91fd */ 0xe337,
+ /* key: 0x91fe */ 0xffff,
+ /* key: 0x91ff */ 0x6e63,
+ /* branch: 0x920X */ 19760,
+ /* branch: 0x921X */ 19776,
+ /* branch: 0x922X */ 19792,
+ /* branch: 0x923X */ 19808,
+ /* branch: 0x924X */ 19824,
+ /* branch: 0x925X */ 19840,
+ /* branch: 0x926X */ 19856,
+ /* branch: 0x927X */ 19872,
+ /* branch: 0x928X */ 19888,
+ /* branch: 0x929X */ 19904,
+ /* branch: 0x92aX */ 19920,
+ /* branch: 0x92bX */ 19936,
+ /* branch: 0x92cX */ 19952,
+ /* branch: 0x92dX */ 19968,
+ /* branch: 0x92eX */ 19984,
+ /* branch: 0x92fX */ 20000,
+ /* key: 0x9200 */ 0xe338,
+ /* key: 0x9201 */ 0xe339,
+ /* key: 0x9202 */ 0xffff,
+ /* key: 0x9203 */ 0xffff,
+ /* key: 0x9204 */ 0xe33a,
+ /* key: 0x9205 */ 0xe33b,
+ /* key: 0x9206 */ 0xe33c,
+ /* key: 0x9207 */ 0xe33d,
+ /* key: 0x9208 */ 0xffff,
+ /* key: 0x9209 */ 0xe33e,
+ /* key: 0x920a */ 0xe33f,
+ /* key: 0x920b */ 0xffff,
+ /* key: 0x920c */ 0xe340,
+ /* key: 0x920d */ 0x465f,
+ /* key: 0x920e */ 0x3343,
+ /* key: 0x920f */ 0xffff,
+ /* key: 0x9210 */ 0xe341,
+ /* key: 0x9211 */ 0x6e67,
+ /* key: 0x9212 */ 0xe342,
+ /* key: 0x9213 */ 0xe343,
+ /* key: 0x9214 */ 0x6e64,
+ /* key: 0x9215 */ 0x6e66,
+ /* key: 0x9216 */ 0xe344,
+ /* key: 0x9217 */ 0xffff,
+ /* key: 0x9218 */ 0xe345,
+ /* key: 0x9219 */ 0xffff,
+ /* key: 0x921a */ 0xffff,
+ /* key: 0x921b */ 0xffff,
+ /* key: 0x921c */ 0xe346,
+ /* key: 0x921d */ 0xe347,
+ /* key: 0x921e */ 0x6e62,
+ /* key: 0x921f */ 0xffff,
+ /* key: 0x9220 */ 0xffff,
+ /* key: 0x9221 */ 0xffff,
+ /* key: 0x9222 */ 0xffff,
+ /* key: 0x9223 */ 0xe348,
+ /* key: 0x9224 */ 0xe349,
+ /* key: 0x9225 */ 0xe34a,
+ /* key: 0x9226 */ 0xe34b,
+ /* key: 0x9227 */ 0xffff,
+ /* key: 0x9228 */ 0xe34c,
+ /* key: 0x9229 */ 0x6f4f,
+ /* key: 0x922a */ 0xffff,
+ /* key: 0x922b */ 0xffff,
+ /* key: 0x922c */ 0x6e65,
+ /* key: 0x922d */ 0xffff,
+ /* key: 0x922e */ 0xe34d,
+ /* key: 0x922f */ 0xe34e,
+ /* key: 0x9230 */ 0xe34f,
+ /* key: 0x9231 */ 0xffff,
+ /* key: 0x9232 */ 0xffff,
+ /* key: 0x9233 */ 0xe350,
+ /* key: 0x9234 */ 0x4e6b,
+ /* key: 0x9235 */ 0xe351,
+ /* key: 0x9236 */ 0xe352,
+ /* key: 0x9237 */ 0x385a,
+ /* key: 0x9238 */ 0xe353,
+ /* key: 0x9239 */ 0xe354,
+ /* key: 0x923a */ 0xe355,
+ /* key: 0x923b */ 0xffff,
+ /* key: 0x923c */ 0xe356,
+ /* key: 0x923d */ 0xffff,
+ /* key: 0x923e */ 0xe357,
+ /* key: 0x923f */ 0x6e6f,
+ /* key: 0x9240 */ 0xe358,
+ /* key: 0x9241 */ 0xffff,
+ /* key: 0x9242 */ 0xe359,
+ /* key: 0x9243 */ 0xe35a,
+ /* key: 0x9244 */ 0x4534,
+ /* key: 0x9245 */ 0x6e6a,
+ /* key: 0x9246 */ 0xe35b,
+ /* key: 0x9247 */ 0xe35c,
+ /* key: 0x9248 */ 0x6e6d,
+ /* key: 0x9249 */ 0x6e6b,
+ /* key: 0x924a */ 0xe35d,
+ /* key: 0x924b */ 0x6e70,
+ /* key: 0x924c */ 0xffff,
+ /* key: 0x924d */ 0xe35e,
+ /* key: 0x924e */ 0xe35f,
+ /* key: 0x924f */ 0xe360,
+ /* key: 0x9250 */ 0x6e71,
+ /* key: 0x9251 */ 0xe361,
+ /* key: 0x9252 */ 0xffff,
+ /* key: 0x9253 */ 0xffff,
+ /* key: 0x9254 */ 0xffff,
+ /* key: 0x9255 */ 0xffff,
+ /* key: 0x9256 */ 0xffff,
+ /* key: 0x9257 */ 0x6e69,
+ /* key: 0x9258 */ 0xe362,
+ /* key: 0x9259 */ 0xe363,
+ /* key: 0x925a */ 0x6e76,
+ /* key: 0x925b */ 0x3174,
+ /* key: 0x925c */ 0xe364,
+ /* key: 0x925d */ 0xe365,
+ /* key: 0x925e */ 0x6e68,
+ /* key: 0x925f */ 0xffff,
+ /* key: 0x9260 */ 0xe366,
+ /* key: 0x9261 */ 0xe367,
+ /* key: 0x9262 */ 0x482d,
+ /* key: 0x9263 */ 0xffff,
+ /* key: 0x9264 */ 0x6e6c,
+ /* key: 0x9265 */ 0xe368,
+ /* key: 0x9266 */ 0x3e60,
+ /* key: 0x9267 */ 0xe369,
+ /* key: 0x9268 */ 0xe36a,
+ /* key: 0x9269 */ 0xe36b,
+ /* key: 0x926a */ 0xffff,
+ /* key: 0x926b */ 0xffff,
+ /* key: 0x926c */ 0xffff,
+ /* key: 0x926d */ 0xffff,
+ /* key: 0x926e */ 0xe36c,
+ /* key: 0x926f */ 0xe36d,
+ /* key: 0x9270 */ 0xe36e,
+ /* key: 0x9271 */ 0x395b,
+ /* key: 0x9272 */ 0xffff,
+ /* key: 0x9273 */ 0xffff,
+ /* key: 0x9274 */ 0xffff,
+ /* key: 0x9275 */ 0xe36f,
+ /* key: 0x9276 */ 0xe370,
+ /* key: 0x9277 */ 0xe371,
+ /* key: 0x9278 */ 0xe372,
+ /* key: 0x9279 */ 0xe373,
+ /* key: 0x927a */ 0xffff,
+ /* key: 0x927b */ 0xe374,
+ /* key: 0x927c */ 0xe375,
+ /* key: 0x927d */ 0xe376,
+ /* key: 0x927e */ 0x4b48,
+ /* key: 0x927f */ 0xe377,
+ /* key: 0x9280 */ 0x3664,
+ /* key: 0x9281 */ 0xffff,
+ /* key: 0x9282 */ 0xffff,
+ /* key: 0x9283 */ 0x3d46,
+ /* key: 0x9284 */ 0xffff,
+ /* key: 0x9285 */ 0x463c,
+ /* key: 0x9286 */ 0xffff,
+ /* key: 0x9287 */ 0xffff,
+ /* key: 0x9288 */ 0xe378,
+ /* key: 0x9289 */ 0xe379,
+ /* key: 0x928a */ 0xe37a,
+ /* key: 0x928b */ 0xffff,
+ /* key: 0x928c */ 0xffff,
+ /* key: 0x928d */ 0xe37b,
+ /* key: 0x928e */ 0xe37c,
+ /* key: 0x928f */ 0xffff,
+ /* key: 0x9290 */ 0xffff,
+ /* key: 0x9291 */ 0x412d,
+ /* key: 0x9292 */ 0xe37d,
+ /* key: 0x9293 */ 0x6e74,
+ /* key: 0x9294 */ 0xffff,
+ /* key: 0x9295 */ 0x6e6e,
+ /* key: 0x9296 */ 0x6e73,
+ /* key: 0x9297 */ 0xe37e,
+ /* key: 0x9298 */ 0x4c43,
+ /* key: 0x9299 */ 0xe421,
+ /* key: 0x929a */ 0x4438,
+ /* key: 0x929b */ 0x6e75,
+ /* key: 0x929c */ 0x6e72,
+ /* key: 0x929d */ 0xffff,
+ /* key: 0x929e */ 0xffff,
+ /* key: 0x929f */ 0xe422,
+ /* key: 0x92a0 */ 0xe423,
+ /* key: 0x92a1 */ 0xffff,
+ /* key: 0x92a2 */ 0xffff,
+ /* key: 0x92a3 */ 0xffff,
+ /* key: 0x92a4 */ 0xe424,
+ /* key: 0x92a5 */ 0xe425,
+ /* key: 0x92a6 */ 0xffff,
+ /* key: 0x92a7 */ 0xe426,
+ /* key: 0x92a8 */ 0xe427,
+ /* key: 0x92a9 */ 0xffff,
+ /* key: 0x92aa */ 0xffff,
+ /* key: 0x92ab */ 0xe428,
+ /* key: 0x92ac */ 0xffff,
+ /* key: 0x92ad */ 0x412c,
+ /* key: 0x92ae */ 0xffff,
+ /* key: 0x92af */ 0xe429,
+ /* key: 0x92b0 */ 0xffff,
+ /* key: 0x92b1 */ 0xffff,
+ /* key: 0x92b2 */ 0xe42a,
+ /* key: 0x92b3 */ 0xffff,
+ /* key: 0x92b4 */ 0xffff,
+ /* key: 0x92b5 */ 0xffff,
+ /* key: 0x92b6 */ 0xe42b,
+ /* key: 0x92b7 */ 0x6e79,
+ /* key: 0x92b8 */ 0xe42c,
+ /* key: 0x92b9 */ 0x6e78,
+ /* key: 0x92ba */ 0xe42d,
+ /* key: 0x92bb */ 0xe42e,
+ /* key: 0x92bc */ 0xe42f,
+ /* key: 0x92bd */ 0xe430,
+ /* key: 0x92be */ 0xffff,
+ /* key: 0x92bf */ 0xe431,
+ /* key: 0x92c0 */ 0xe432,
+ /* key: 0x92c1 */ 0xe433,
+ /* key: 0x92c2 */ 0xe434,
+ /* key: 0x92c3 */ 0xe435,
+ /* key: 0x92c4 */ 0xffff,
+ /* key: 0x92c5 */ 0xe436,
+ /* key: 0x92c6 */ 0xe437,
+ /* key: 0x92c7 */ 0xe438,
+ /* key: 0x92c8 */ 0xe439,
+ /* key: 0x92c9 */ 0xffff,
+ /* key: 0x92ca */ 0xffff,
+ /* key: 0x92cb */ 0xe43a,
+ /* key: 0x92cc */ 0xe43b,
+ /* key: 0x92cd */ 0xe43c,
+ /* key: 0x92ce */ 0xe43d,
+ /* key: 0x92cf */ 0x6e77,
+ /* key: 0x92d0 */ 0xe43e,
+ /* key: 0x92d1 */ 0xffff,
+ /* key: 0x92d2 */ 0x4b2f,
+ /* key: 0x92d3 */ 0xe43f,
+ /* key: 0x92d4 */ 0xffff,
+ /* key: 0x92d5 */ 0xe440,
+ /* key: 0x92d6 */ 0xffff,
+ /* key: 0x92d7 */ 0xe441,
+ /* key: 0x92d8 */ 0xe442,
+ /* key: 0x92d9 */ 0xe443,
+ /* key: 0x92da */ 0xffff,
+ /* key: 0x92db */ 0xffff,
+ /* key: 0x92dc */ 0xe444,
+ /* key: 0x92dd */ 0xe445,
+ /* key: 0x92de */ 0xffff,
+ /* key: 0x92df */ 0xe446,
+ /* key: 0x92e0 */ 0xe447,
+ /* key: 0x92e1 */ 0xe448,
+ /* key: 0x92e2 */ 0xffff,
+ /* key: 0x92e3 */ 0xe449,
+ /* key: 0x92e4 */ 0x3d7b,
+ /* key: 0x92e5 */ 0xe44a,
+ /* key: 0x92e6 */ 0xffff,
+ /* key: 0x92e7 */ 0xe44b,
+ /* key: 0x92e8 */ 0xe44c,
+ /* key: 0x92e9 */ 0x6e7a,
+ /* key: 0x92ea */ 0x4a5f,
+ /* key: 0x92eb */ 0xffff,
+ /* key: 0x92ec */ 0xe44d,
+ /* key: 0x92ed */ 0x3154,
+ /* key: 0x92ee */ 0xe44e,
+ /* key: 0x92ef */ 0xffff,
+ /* key: 0x92f0 */ 0xe44f,
+ /* key: 0x92f1 */ 0xffff,
+ /* key: 0x92f2 */ 0x4946,
+ /* key: 0x92f3 */ 0x4372,
+ /* key: 0x92f4 */ 0xffff,
+ /* key: 0x92f5 */ 0xffff,
+ /* key: 0x92f6 */ 0xffff,
+ /* key: 0x92f7 */ 0xffff,
+ /* key: 0x92f8 */ 0x3578,
+ /* key: 0x92f9 */ 0xe450,
+ /* key: 0x92fa */ 0x6e7c,
+ /* key: 0x92fb */ 0xe451,
+ /* key: 0x92fc */ 0x395d,
+ /* key: 0x92fd */ 0xffff,
+ /* key: 0x92fe */ 0xffff,
+ /* key: 0x92ff */ 0xe452,
+ /* branch: 0x930X */ 20032,
+ /* branch: 0x931X */ 20048,
+ /* branch: 0x932X */ 20064,
+ /* branch: 0x933X */ 20080,
+ /* branch: 0x934X */ 20096,
+ /* branch: 0x935X */ 20112,
+ /* branch: 0x936X */ 20128,
+ /* branch: 0x937X */ 20144,
+ /* branch: 0x938X */ 20160,
+ /* branch: 0x939X */ 20176,
+ /* branch: 0x93aX */ 20192,
+ /* branch: 0x93bX */ 20208,
+ /* branch: 0x93cX */ 20224,
+ /* branch: 0x93dX */ 20240,
+ /* branch: 0x93eX */ 20256,
+ /* branch: 0x93fX */ 20272,
+ /* key: 0x9300 */ 0xe453,
+ /* key: 0x9301 */ 0xffff,
+ /* key: 0x9302 */ 0xe454,
+ /* key: 0x9303 */ 0xffff,
+ /* key: 0x9304 */ 0xffff,
+ /* key: 0x9305 */ 0xffff,
+ /* key: 0x9306 */ 0x3b2c,
+ /* key: 0x9307 */ 0xffff,
+ /* key: 0x9308 */ 0xe455,
+ /* key: 0x9309 */ 0xffff,
+ /* key: 0x930a */ 0xffff,
+ /* key: 0x930b */ 0xffff,
+ /* key: 0x930c */ 0xffff,
+ /* key: 0x930d */ 0xe456,
+ /* key: 0x930e */ 0xffff,
+ /* key: 0x930f */ 0x6e7b,
+ /* key: 0x9310 */ 0x3f6d,
+ /* key: 0x9311 */ 0xe457,
+ /* key: 0x9312 */ 0xffff,
+ /* key: 0x9313 */ 0xffff,
+ /* key: 0x9314 */ 0xe458,
+ /* key: 0x9315 */ 0xe459,
+ /* key: 0x9316 */ 0xffff,
+ /* key: 0x9317 */ 0xffff,
+ /* key: 0x9318 */ 0x3f6e,
+ /* key: 0x9319 */ 0x6f21,
+ /* key: 0x931a */ 0x6f23,
+ /* key: 0x931b */ 0xffff,
+ /* key: 0x931c */ 0xe45a,
+ /* key: 0x931d */ 0xe45b,
+ /* key: 0x931e */ 0xe45c,
+ /* key: 0x931f */ 0xe45d,
+ /* key: 0x9320 */ 0x3e7b,
+ /* key: 0x9321 */ 0xe45e,
+ /* key: 0x9322 */ 0x6f22,
+ /* key: 0x9323 */ 0x6f24,
+ /* key: 0x9324 */ 0xe45f,
+ /* key: 0x9325 */ 0xe460,
+ /* key: 0x9326 */ 0x3653,
+ /* key: 0x9327 */ 0xe461,
+ /* key: 0x9328 */ 0x4945,
+ /* key: 0x9329 */ 0xe462,
+ /* key: 0x932a */ 0xe463,
+ /* key: 0x932b */ 0x3c62,
+ /* key: 0x932c */ 0x4f23,
+ /* key: 0x932d */ 0xffff,
+ /* key: 0x932e */ 0x6e7e,
+ /* key: 0x932f */ 0x3a78,
+ /* key: 0x9330 */ 0xffff,
+ /* key: 0x9331 */ 0xffff,
+ /* key: 0x9332 */ 0x4f3f,
+ /* key: 0x9333 */ 0xe464,
+ /* key: 0x9334 */ 0xe465,
+ /* key: 0x9335 */ 0x6f26,
+ /* key: 0x9336 */ 0xe466,
+ /* key: 0x9337 */ 0xe467,
+ /* key: 0x9338 */ 0xffff,
+ /* key: 0x9339 */ 0xffff,
+ /* key: 0x933a */ 0x6f25,
+ /* key: 0x933b */ 0x6f27,
+ /* key: 0x933c */ 0xffff,
+ /* key: 0x933d */ 0xffff,
+ /* key: 0x933e */ 0xffff,
+ /* key: 0x933f */ 0xffff,
+ /* key: 0x9340 */ 0xffff,
+ /* key: 0x9341 */ 0xffff,
+ /* key: 0x9342 */ 0xffff,
+ /* key: 0x9343 */ 0xffff,
+ /* key: 0x9344 */ 0x6e7d,
+ /* key: 0x9345 */ 0xffff,
+ /* key: 0x9346 */ 0xffff,
+ /* key: 0x9347 */ 0xe468,
+ /* key: 0x9348 */ 0xe469,
+ /* key: 0x9349 */ 0xe46a,
+ /* key: 0x934a */ 0xffff,
+ /* key: 0x934b */ 0x4669,
+ /* key: 0x934c */ 0xffff,
+ /* key: 0x934d */ 0x4555,
+ /* key: 0x934e */ 0xffff,
+ /* key: 0x934f */ 0xffff,
+ /* key: 0x9350 */ 0xe46b,
+ /* key: 0x9351 */ 0xe46c,
+ /* key: 0x9352 */ 0xe46d,
+ /* key: 0x9353 */ 0xffff,
+ /* key: 0x9354 */ 0x4457,
+ /* key: 0x9355 */ 0xe46e,
+ /* key: 0x9356 */ 0x6f2c,
+ /* key: 0x9357 */ 0xe46f,
+ /* key: 0x9358 */ 0xe470,
+ /* key: 0x9359 */ 0xffff,
+ /* key: 0x935a */ 0xe471,
+ /* key: 0x935b */ 0x4343,
+ /* key: 0x935c */ 0x6f28,
+ /* key: 0x935d */ 0xffff,
+ /* key: 0x935e */ 0xe472,
+ /* key: 0x935f */ 0xffff,
+ /* key: 0x9360 */ 0x6f29,
+ /* key: 0x9361 */ 0xffff,
+ /* key: 0x9362 */ 0xffff,
+ /* key: 0x9363 */ 0xffff,
+ /* key: 0x9364 */ 0xe473,
+ /* key: 0x9365 */ 0xe474,
+ /* key: 0x9366 */ 0xffff,
+ /* key: 0x9367 */ 0xe475,
+ /* key: 0x9368 */ 0xffff,
+ /* key: 0x9369 */ 0xe476,
+ /* key: 0x936a */ 0xe477,
+ /* key: 0x936b */ 0xffff,
+ /* key: 0x936c */ 0x372d,
+ /* key: 0x936d */ 0xe478,
+ /* key: 0x936e */ 0x6f2b,
+ /* key: 0x936f */ 0xe479,
+ /* key: 0x9370 */ 0xe47a,
+ /* key: 0x9371 */ 0xe47b,
+ /* key: 0x9372 */ 0xffff,
+ /* key: 0x9373 */ 0xe47c,
+ /* key: 0x9374 */ 0xe47d,
+ /* key: 0x9375 */ 0x3830,
+ /* key: 0x9376 */ 0xe47e,
+ /* key: 0x9377 */ 0xffff,
+ /* key: 0x9378 */ 0xffff,
+ /* key: 0x9379 */ 0xffff,
+ /* key: 0x937a */ 0xe521,
+ /* key: 0x937b */ 0xffff,
+ /* key: 0x937c */ 0x6f2a,
+ /* key: 0x937d */ 0xe522,
+ /* key: 0x937e */ 0x3e61,
+ /* key: 0x937f */ 0xe523,
+ /* key: 0x9380 */ 0xe524,
+ /* key: 0x9381 */ 0xe525,
+ /* key: 0x9382 */ 0xe526,
+ /* key: 0x9383 */ 0xffff,
+ /* key: 0x9384 */ 0xffff,
+ /* key: 0x9385 */ 0xffff,
+ /* key: 0x9386 */ 0xffff,
+ /* key: 0x9387 */ 0xffff,
+ /* key: 0x9388 */ 0xe527,
+ /* key: 0x9389 */ 0xffff,
+ /* key: 0x938a */ 0xe528,
+ /* key: 0x938b */ 0xe529,
+ /* key: 0x938c */ 0x3379,
+ /* key: 0x938d */ 0xe52a,
+ /* key: 0x938e */ 0xffff,
+ /* key: 0x938f */ 0xe52b,
+ /* key: 0x9390 */ 0xffff,
+ /* key: 0x9391 */ 0xffff,
+ /* key: 0x9392 */ 0xe52c,
+ /* key: 0x9393 */ 0xffff,
+ /* key: 0x9394 */ 0x6f30,
+ /* key: 0x9395 */ 0xe52d,
+ /* key: 0x9396 */ 0x3a3f,
+ /* key: 0x9397 */ 0x4179,
+ /* key: 0x9398 */ 0xe52e,
+ /* key: 0x9399 */ 0xffff,
+ /* key: 0x939a */ 0x444a,
+ /* key: 0x939b */ 0xe52f,
+ /* key: 0x939c */ 0xffff,
+ /* key: 0x939d */ 0xffff,
+ /* key: 0x939e */ 0xe530,
+ /* key: 0x939f */ 0xffff,
+ /* key: 0x93a0 */ 0xffff,
+ /* key: 0x93a1 */ 0xe531,
+ /* key: 0x93a2 */ 0xffff,
+ /* key: 0x93a3 */ 0xe532,
+ /* key: 0x93a4 */ 0xe533,
+ /* key: 0x93a5 */ 0xffff,
+ /* key: 0x93a6 */ 0xe534,
+ /* key: 0x93a7 */ 0x333b,
+ /* key: 0x93a8 */ 0xe535,
+ /* key: 0x93a9 */ 0xe53b,
+ /* key: 0x93aa */ 0xffff,
+ /* key: 0x93ab */ 0xe536,
+ /* key: 0x93ac */ 0x6f2e,
+ /* key: 0x93ad */ 0x6f2f,
+ /* key: 0x93ae */ 0x4443,
+ /* key: 0x93af */ 0xffff,
+ /* key: 0x93b0 */ 0x6f2d,
+ /* key: 0x93b1 */ 0xffff,
+ /* key: 0x93b2 */ 0xffff,
+ /* key: 0x93b3 */ 0xffff,
+ /* key: 0x93b4 */ 0xe537,
+ /* key: 0x93b5 */ 0xe538,
+ /* key: 0x93b6 */ 0xe539,
+ /* key: 0x93b7 */ 0xffff,
+ /* key: 0x93b8 */ 0xffff,
+ /* key: 0x93b9 */ 0x6f31,
+ /* key: 0x93ba */ 0xe53a,
+ /* key: 0x93bb */ 0xffff,
+ /* key: 0x93bc */ 0xffff,
+ /* key: 0x93bd */ 0xffff,
+ /* key: 0x93be */ 0xffff,
+ /* key: 0x93bf */ 0xffff,
+ /* key: 0x93c0 */ 0xffff,
+ /* key: 0x93c1 */ 0xe53c,
+ /* key: 0x93c2 */ 0xffff,
+ /* key: 0x93c3 */ 0x6f37,
+ /* key: 0x93c4 */ 0xe53d,
+ /* key: 0x93c5 */ 0xe53e,
+ /* key: 0x93c6 */ 0xe53f,
+ /* key: 0x93c7 */ 0xe540,
+ /* key: 0x93c8 */ 0x6f3a,
+ /* key: 0x93c9 */ 0xe541,
+ /* key: 0x93ca */ 0xe542,
+ /* key: 0x93cb */ 0xe543,
+ /* key: 0x93cc */ 0xe544,
+ /* key: 0x93cd */ 0xe545,
+ /* key: 0x93ce */ 0xffff,
+ /* key: 0x93cf */ 0xffff,
+ /* key: 0x93d0 */ 0x6f39,
+ /* key: 0x93d1 */ 0x452d,
+ /* key: 0x93d2 */ 0xffff,
+ /* key: 0x93d3 */ 0xe546,
+ /* key: 0x93d4 */ 0xffff,
+ /* key: 0x93d5 */ 0xffff,
+ /* key: 0x93d6 */ 0x6f32,
+ /* key: 0x93d7 */ 0x6f33,
+ /* key: 0x93d8 */ 0x6f36,
+ /* key: 0x93d9 */ 0xe547,
+ /* key: 0x93da */ 0xffff,
+ /* key: 0x93db */ 0xffff,
+ /* key: 0x93dc */ 0xe548,
+ /* key: 0x93dd */ 0x6f38,
+ /* key: 0x93de */ 0xe549,
+ /* key: 0x93df */ 0xe54a,
+ /* key: 0x93e0 */ 0xffff,
+ /* key: 0x93e1 */ 0x3640,
+ /* key: 0x93e2 */ 0xe54b,
+ /* key: 0x93e3 */ 0xffff,
+ /* key: 0x93e4 */ 0x6f3b,
+ /* key: 0x93e5 */ 0x6f35,
+ /* key: 0x93e6 */ 0xe54c,
+ /* key: 0x93e7 */ 0xe54d,
+ /* key: 0x93e8 */ 0x6f34,
+ /* key: 0x93e9 */ 0xffff,
+ /* key: 0x93ea */ 0xffff,
+ /* key: 0x93eb */ 0xffff,
+ /* key: 0x93ec */ 0xffff,
+ /* key: 0x93ed */ 0xffff,
+ /* key: 0x93ee */ 0xffff,
+ /* key: 0x93ef */ 0xffff,
+ /* key: 0x93f0 */ 0xffff,
+ /* key: 0x93f1 */ 0xffff,
+ /* key: 0x93f2 */ 0xffff,
+ /* key: 0x93f3 */ 0xffff,
+ /* key: 0x93f4 */ 0xffff,
+ /* key: 0x93f5 */ 0xffff,
+ /* key: 0x93f6 */ 0xffff,
+ /* key: 0x93f7 */ 0xe54f,
+ /* key: 0x93f8 */ 0xe550,
+ /* key: 0x93f9 */ 0xe54e,
+ /* key: 0x93fa */ 0xe551,
+ /* key: 0x93fb */ 0xe552,
+ /* key: 0x93fc */ 0xffff,
+ /* key: 0x93fd */ 0xe553,
+ /* key: 0x93fe */ 0xffff,
+ /* key: 0x93ff */ 0xffff,
+ /* branch: 0x940X */ 20304,
+ /* branch: 0x941X */ 20320,
+ /* branch: 0x942X */ 20336,
+ /* branch: 0x943X */ 20352,
+ /* branch: 0x944X */ 20368,
+ /* branch: 0x945X */ 20384,
+ /* branch: 0x946X */ 20400,
+ /* branch: 0x947X */ 20416,
+ /* branch: 0x948X */ 20432,
+ /* branch: 0x949X */ 0,
+ /* branch: 0x94aX */ 0,
+ /* branch: 0x94bX */ 0,
+ /* branch: 0x94cX */ 0,
+ /* branch: 0x94dX */ 0,
+ /* branch: 0x94eX */ 0,
+ /* branch: 0x94fX */ 0,
+ /* key: 0x9400 */ 0xffff,
+ /* key: 0x9401 */ 0xe554,
+ /* key: 0x9402 */ 0xe555,
+ /* key: 0x9403 */ 0x6f3f,
+ /* key: 0x9404 */ 0xe556,
+ /* key: 0x9405 */ 0xffff,
+ /* key: 0x9406 */ 0xffff,
+ /* key: 0x9407 */ 0x6f40,
+ /* key: 0x9408 */ 0xe557,
+ /* key: 0x9409 */ 0xe558,
+ /* key: 0x940a */ 0xffff,
+ /* key: 0x940b */ 0xffff,
+ /* key: 0x940c */ 0xffff,
+ /* key: 0x940d */ 0xe559,
+ /* key: 0x940e */ 0xe55a,
+ /* key: 0x940f */ 0xe55b,
+ /* key: 0x9410 */ 0x6f41,
+ /* key: 0x9411 */ 0xffff,
+ /* key: 0x9412 */ 0xffff,
+ /* key: 0x9413 */ 0x6f3e,
+ /* key: 0x9414 */ 0x6f3d,
+ /* key: 0x9415 */ 0xe55c,
+ /* key: 0x9416 */ 0xe55d,
+ /* key: 0x9417 */ 0xe55e,
+ /* key: 0x9418 */ 0x3e62,
+ /* key: 0x9419 */ 0x462a,
+ /* key: 0x941a */ 0x6f3c,
+ /* key: 0x941b */ 0xffff,
+ /* key: 0x941c */ 0xffff,
+ /* key: 0x941d */ 0xffff,
+ /* key: 0x941e */ 0xffff,
+ /* key: 0x941f */ 0xe55f,
+ /* key: 0x9420 */ 0xffff,
+ /* key: 0x9421 */ 0x6f45,
+ /* key: 0x9422 */ 0xffff,
+ /* key: 0x9423 */ 0xffff,
+ /* key: 0x9424 */ 0xffff,
+ /* key: 0x9425 */ 0xffff,
+ /* key: 0x9426 */ 0xffff,
+ /* key: 0x9427 */ 0xffff,
+ /* key: 0x9428 */ 0xffff,
+ /* key: 0x9429 */ 0xffff,
+ /* key: 0x942a */ 0xffff,
+ /* key: 0x942b */ 0x6f43,
+ /* key: 0x942c */ 0xffff,
+ /* key: 0x942d */ 0xffff,
+ /* key: 0x942e */ 0xe560,
+ /* key: 0x942f */ 0xe561,
+ /* key: 0x9430 */ 0xffff,
+ /* key: 0x9431 */ 0xe562,
+ /* key: 0x9432 */ 0xe563,
+ /* key: 0x9433 */ 0xe564,
+ /* key: 0x9434 */ 0xe565,
+ /* key: 0x9435 */ 0x6f44,
+ /* key: 0x9436 */ 0x6f42,
+ /* key: 0x9437 */ 0xffff,
+ /* key: 0x9438 */ 0x4278,
+ /* key: 0x9439 */ 0xffff,
+ /* key: 0x943a */ 0x6f46,
+ /* key: 0x943b */ 0xe566,
+ /* key: 0x943c */ 0xffff,
+ /* key: 0x943d */ 0xe568,
+ /* key: 0x943e */ 0xffff,
+ /* key: 0x943f */ 0xe567,
+ /* key: 0x9440 */ 0xffff,
+ /* key: 0x9441 */ 0x6f47,
+ /* key: 0x9442 */ 0xffff,
+ /* key: 0x9443 */ 0xe569,
+ /* key: 0x9444 */ 0x6f49,
+ /* key: 0x9445 */ 0xe56a,
+ /* key: 0x9446 */ 0xffff,
+ /* key: 0x9447 */ 0xffff,
+ /* key: 0x9448 */ 0xe56b,
+ /* key: 0x9449 */ 0xffff,
+ /* key: 0x944a */ 0xe56c,
+ /* key: 0x944b */ 0xffff,
+ /* key: 0x944c */ 0xe56d,
+ /* key: 0x944d */ 0xffff,
+ /* key: 0x944e */ 0xffff,
+ /* key: 0x944f */ 0xffff,
+ /* key: 0x9450 */ 0xffff,
+ /* key: 0x9451 */ 0x3455,
+ /* key: 0x9452 */ 0x6f48,
+ /* key: 0x9453 */ 0x4c7a,
+ /* key: 0x9454 */ 0xffff,
+ /* key: 0x9455 */ 0xe56e,
+ /* key: 0x9456 */ 0xffff,
+ /* key: 0x9457 */ 0xffff,
+ /* key: 0x9458 */ 0xffff,
+ /* key: 0x9459 */ 0xe56f,
+ /* key: 0x945a */ 0x6f54,
+ /* key: 0x945b */ 0x6f4a,
+ /* key: 0x945c */ 0xe570,
+ /* key: 0x945d */ 0xffff,
+ /* key: 0x945e */ 0x6f4d,
+ /* key: 0x945f */ 0xe571,
+ /* key: 0x9460 */ 0x6f4b,
+ /* key: 0x9461 */ 0xe572,
+ /* key: 0x9462 */ 0x6f4c,
+ /* key: 0x9463 */ 0xe573,
+ /* key: 0x9464 */ 0xffff,
+ /* key: 0x9465 */ 0xffff,
+ /* key: 0x9466 */ 0xffff,
+ /* key: 0x9467 */ 0xffff,
+ /* key: 0x9468 */ 0xe574,
+ /* key: 0x9469 */ 0xffff,
+ /* key: 0x946a */ 0x6f4e,
+ /* key: 0x946b */ 0xe575,
+ /* key: 0x946c */ 0xffff,
+ /* key: 0x946d */ 0xe576,
+ /* key: 0x946e */ 0xe577,
+ /* key: 0x946f */ 0xe578,
+ /* key: 0x9470 */ 0x6f50,
+ /* key: 0x9471 */ 0xe579,
+ /* key: 0x9472 */ 0xe57a,
+ /* key: 0x9473 */ 0xffff,
+ /* key: 0x9474 */ 0xffff,
+ /* key: 0x9475 */ 0x6f51,
+ /* key: 0x9476 */ 0xffff,
+ /* key: 0x9477 */ 0x6f52,
+ /* key: 0x9478 */ 0xffff,
+ /* key: 0x9479 */ 0xffff,
+ /* key: 0x947a */ 0xffff,
+ /* key: 0x947b */ 0xffff,
+ /* key: 0x947c */ 0x6f55,
+ /* key: 0x947d */ 0x6f53,
+ /* key: 0x947e */ 0x6f56,
+ /* key: 0x947f */ 0x6f58,
+ /* key: 0x9480 */ 0xffff,
+ /* key: 0x9481 */ 0x6f57,
+ /* key: 0x9482 */ 0xffff,
+ /* key: 0x9483 */ 0xe57c,
+ /* key: 0x9484 */ 0xe57b,
+ /* key: 0x9485 */ 0xffff,
+ /* key: 0x9486 */ 0xffff,
+ /* key: 0x9487 */ 0xffff,
+ /* key: 0x9488 */ 0xffff,
+ /* key: 0x9489 */ 0xffff,
+ /* key: 0x948a */ 0xffff,
+ /* key: 0x948b */ 0xffff,
+ /* key: 0x948c */ 0xffff,
+ /* key: 0x948d */ 0xffff,
+ /* key: 0x948e */ 0xffff,
+ /* key: 0x948f */ 0xffff,
+ /* branch: 0x950X */ 0,
+ /* branch: 0x951X */ 0,
+ /* branch: 0x952X */ 0,
+ /* branch: 0x953X */ 0,
+ /* branch: 0x954X */ 0,
+ /* branch: 0x955X */ 0,
+ /* branch: 0x956X */ 0,
+ /* branch: 0x957X */ 20464,
+ /* branch: 0x958X */ 20480,
+ /* branch: 0x959X */ 20496,
+ /* branch: 0x95aX */ 20512,
+ /* branch: 0x95bX */ 20528,
+ /* branch: 0x95cX */ 20544,
+ /* branch: 0x95dX */ 20560,
+ /* branch: 0x95eX */ 20576,
+ /* branch: 0x95fX */ 0,
+ /* key: 0x9570 */ 0xffff,
+ /* key: 0x9571 */ 0xffff,
+ /* key: 0x9572 */ 0xffff,
+ /* key: 0x9573 */ 0xffff,
+ /* key: 0x9574 */ 0xffff,
+ /* key: 0x9575 */ 0xffff,
+ /* key: 0x9576 */ 0xffff,
+ /* key: 0x9577 */ 0x4439,
+ /* key: 0x9578 */ 0xe57d,
+ /* key: 0x9579 */ 0xe57e,
+ /* key: 0x957a */ 0xffff,
+ /* key: 0x957b */ 0xffff,
+ /* key: 0x957c */ 0xffff,
+ /* key: 0x957d */ 0xffff,
+ /* key: 0x957e */ 0xe621,
+ /* key: 0x957f */ 0xffff,
+ /* key: 0x9580 */ 0x4c67,
+ /* key: 0x9581 */ 0xffff,
+ /* key: 0x9582 */ 0x6f59,
+ /* key: 0x9583 */ 0x412e,
+ /* key: 0x9584 */ 0xe622,
+ /* key: 0x9585 */ 0xffff,
+ /* key: 0x9586 */ 0xffff,
+ /* key: 0x9587 */ 0x6f5a,
+ /* key: 0x9588 */ 0xe623,
+ /* key: 0x9589 */ 0x4a44,
+ /* key: 0x958a */ 0x6f5b,
+ /* key: 0x958b */ 0x332b,
+ /* key: 0x958c */ 0xe624,
+ /* key: 0x958d */ 0xe625,
+ /* key: 0x958e */ 0xe626,
+ /* key: 0x958f */ 0x313c,
+ /* key: 0x9590 */ 0xffff,
+ /* key: 0x9591 */ 0x3457,
+ /* key: 0x9592 */ 0xffff,
+ /* key: 0x9593 */ 0x3456,
+ /* key: 0x9594 */ 0x6f5c,
+ /* key: 0x9595 */ 0xffff,
+ /* key: 0x9596 */ 0x6f5d,
+ /* key: 0x9597 */ 0xffff,
+ /* key: 0x9598 */ 0x6f5e,
+ /* key: 0x9599 */ 0x6f5f,
+ /* key: 0x959a */ 0xffff,
+ /* key: 0x959b */ 0xffff,
+ /* key: 0x959c */ 0xffff,
+ /* key: 0x959d */ 0xe627,
+ /* key: 0x959e */ 0xe628,
+ /* key: 0x959f */ 0xe629,
+ /* key: 0x95a0 */ 0x6f60,
+ /* key: 0x95a1 */ 0xe62a,
+ /* key: 0x95a2 */ 0x3458,
+ /* key: 0x95a3 */ 0x3355,
+ /* key: 0x95a4 */ 0x395e,
+ /* key: 0x95a5 */ 0x4836,
+ /* key: 0x95a6 */ 0xe62b,
+ /* key: 0x95a7 */ 0x6f62,
+ /* key: 0x95a8 */ 0x6f61,
+ /* key: 0x95a9 */ 0xe62c,
+ /* key: 0x95aa */ 0xffff,
+ /* key: 0x95ab */ 0xe62d,
+ /* key: 0x95ac */ 0xe62e,
+ /* key: 0x95ad */ 0x6f63,
+ /* key: 0x95ae */ 0xffff,
+ /* key: 0x95af */ 0xffff,
+ /* key: 0x95b0 */ 0xffff,
+ /* key: 0x95b1 */ 0xffff,
+ /* key: 0x95b2 */ 0x315c,
+ /* key: 0x95b3 */ 0xffff,
+ /* key: 0x95b4 */ 0xe62f,
+ /* key: 0x95b5 */ 0xffff,
+ /* key: 0x95b6 */ 0xe630,
+ /* key: 0x95b7 */ 0xffff,
+ /* key: 0x95b8 */ 0xffff,
+ /* key: 0x95b9 */ 0x6f66,
+ /* key: 0x95ba */ 0xe631,
+ /* key: 0x95bb */ 0x6f65,
+ /* key: 0x95bc */ 0x6f64,
+ /* key: 0x95bd */ 0xe632,
+ /* key: 0x95be */ 0x6f67,
+ /* key: 0x95bf */ 0xe633,
+ /* key: 0x95c0 */ 0xffff,
+ /* key: 0x95c1 */ 0xffff,
+ /* key: 0x95c2 */ 0xffff,
+ /* key: 0x95c3 */ 0x6f6a,
+ /* key: 0x95c4 */ 0xffff,
+ /* key: 0x95c5 */ 0xffff,
+ /* key: 0x95c6 */ 0xe634,
+ /* key: 0x95c7 */ 0x3047,
+ /* key: 0x95c8 */ 0xe635,
+ /* key: 0x95c9 */ 0xe636,
+ /* key: 0x95ca */ 0x6f68,
+ /* key: 0x95cb */ 0xe637,
+ /* key: 0x95cc */ 0x6f6c,
+ /* key: 0x95cd */ 0x6f6b,
+ /* key: 0x95ce */ 0xffff,
+ /* key: 0x95cf */ 0xffff,
+ /* key: 0x95d0 */ 0xe638,
+ /* key: 0x95d1 */ 0xe639,
+ /* key: 0x95d2 */ 0xe63a,
+ /* key: 0x95d3 */ 0xe63b,
+ /* key: 0x95d4 */ 0x6f6e,
+ /* key: 0x95d5 */ 0x6f6d,
+ /* key: 0x95d6 */ 0x6f6f,
+ /* key: 0x95d7 */ 0xffff,
+ /* key: 0x95d8 */ 0x462e,
+ /* key: 0x95d9 */ 0xe63c,
+ /* key: 0x95da */ 0xe63d,
+ /* key: 0x95db */ 0xffff,
+ /* key: 0x95dc */ 0x6f70,
+ /* key: 0x95dd */ 0xe63e,
+ /* key: 0x95de */ 0xe63f,
+ /* key: 0x95df */ 0xe640,
+ /* key: 0x95e0 */ 0xe641,
+ /* key: 0x95e1 */ 0x6f71,
+ /* key: 0x95e2 */ 0x6f73,
+ /* key: 0x95e3 */ 0xffff,
+ /* key: 0x95e4 */ 0xe642,
+ /* key: 0x95e5 */ 0x6f72,
+ /* key: 0x95e6 */ 0xe643,
+ /* key: 0x95e7 */ 0xffff,
+ /* key: 0x95e8 */ 0xffff,
+ /* key: 0x95e9 */ 0xffff,
+ /* key: 0x95ea */ 0xffff,
+ /* key: 0x95eb */ 0xffff,
+ /* key: 0x95ec */ 0xffff,
+ /* key: 0x95ed */ 0xffff,
+ /* key: 0x95ee */ 0xffff,
+ /* key: 0x95ef */ 0xffff,
+ /* branch: 0x960X */ 0,
+ /* branch: 0x961X */ 20608,
+ /* branch: 0x962X */ 20624,
+ /* branch: 0x963X */ 20640,
+ /* branch: 0x964X */ 20656,
+ /* branch: 0x965X */ 20672,
+ /* branch: 0x966X */ 20688,
+ /* branch: 0x967X */ 20704,
+ /* branch: 0x968X */ 20720,
+ /* branch: 0x969X */ 20736,
+ /* branch: 0x96aX */ 20752,
+ /* branch: 0x96bX */ 20768,
+ /* branch: 0x96cX */ 20784,
+ /* branch: 0x96dX */ 20800,
+ /* branch: 0x96eX */ 20816,
+ /* branch: 0x96fX */ 20832,
+ /* key: 0x9610 */ 0xffff,
+ /* key: 0x9611 */ 0xffff,
+ /* key: 0x9612 */ 0xffff,
+ /* key: 0x9613 */ 0xffff,
+ /* key: 0x9614 */ 0xffff,
+ /* key: 0x9615 */ 0xffff,
+ /* key: 0x9616 */ 0xffff,
+ /* key: 0x9617 */ 0xffff,
+ /* key: 0x9618 */ 0xffff,
+ /* key: 0x9619 */ 0xffff,
+ /* key: 0x961a */ 0xffff,
+ /* key: 0x961b */ 0xffff,
+ /* key: 0x961c */ 0x496c,
+ /* key: 0x961d */ 0xe644,
+ /* key: 0x961e */ 0xe645,
+ /* key: 0x961f */ 0xffff,
+ /* key: 0x9620 */ 0xffff,
+ /* key: 0x9621 */ 0x6f74,
+ /* key: 0x9622 */ 0xe646,
+ /* key: 0x9623 */ 0xffff,
+ /* key: 0x9624 */ 0xe647,
+ /* key: 0x9625 */ 0xe648,
+ /* key: 0x9626 */ 0xe649,
+ /* key: 0x9627 */ 0xffff,
+ /* key: 0x9628 */ 0x6f75,
+ /* key: 0x9629 */ 0xffff,
+ /* key: 0x962a */ 0x3a65,
+ /* key: 0x962b */ 0xffff,
+ /* key: 0x962c */ 0xe64a,
+ /* key: 0x962d */ 0xffff,
+ /* key: 0x962e */ 0x6f76,
+ /* key: 0x962f */ 0x6f77,
+ /* key: 0x9630 */ 0xffff,
+ /* key: 0x9631 */ 0xe64b,
+ /* key: 0x9632 */ 0x4b49,
+ /* key: 0x9633 */ 0xe64c,
+ /* key: 0x9634 */ 0xffff,
+ /* key: 0x9635 */ 0xffff,
+ /* key: 0x9636 */ 0xffff,
+ /* key: 0x9637 */ 0xe64d,
+ /* key: 0x9638 */ 0xe64e,
+ /* key: 0x9639 */ 0xe64f,
+ /* key: 0x963a */ 0xe650,
+ /* key: 0x963b */ 0x414b,
+ /* key: 0x963c */ 0xe651,
+ /* key: 0x963d */ 0xe652,
+ /* key: 0x963e */ 0xffff,
+ /* key: 0x963f */ 0x3024,
+ /* key: 0x9640 */ 0x424b,
+ /* key: 0x9641 */ 0xe653,
+ /* key: 0x9642 */ 0x6f78,
+ /* key: 0x9643 */ 0xffff,
+ /* key: 0x9644 */ 0x496d,
+ /* key: 0x9645 */ 0xffff,
+ /* key: 0x9646 */ 0xffff,
+ /* key: 0x9647 */ 0xffff,
+ /* key: 0x9648 */ 0xffff,
+ /* key: 0x9649 */ 0xffff,
+ /* key: 0x964a */ 0xffff,
+ /* key: 0x964b */ 0x6f7b,
+ /* key: 0x964c */ 0x6f79,
+ /* key: 0x964d */ 0x395f,
+ /* key: 0x964e */ 0xffff,
+ /* key: 0x964f */ 0x6f7a,
+ /* key: 0x9650 */ 0x3842,
+ /* key: 0x9651 */ 0xffff,
+ /* key: 0x9652 */ 0xe654,
+ /* key: 0x9653 */ 0xffff,
+ /* key: 0x9654 */ 0xe655,
+ /* key: 0x9655 */ 0xffff,
+ /* key: 0x9656 */ 0xe656,
+ /* key: 0x9657 */ 0xe657,
+ /* key: 0x9658 */ 0xe658,
+ /* key: 0x9659 */ 0xffff,
+ /* key: 0x965a */ 0xffff,
+ /* key: 0x965b */ 0x4a45,
+ /* key: 0x965c */ 0x6f7d,
+ /* key: 0x965d */ 0x7021,
+ /* key: 0x965e */ 0x6f7e,
+ /* key: 0x965f */ 0x7022,
+ /* key: 0x9660 */ 0xffff,
+ /* key: 0x9661 */ 0xe659,
+ /* key: 0x9662 */ 0x3121,
+ /* key: 0x9663 */ 0x3f58,
+ /* key: 0x9664 */ 0x3d7c,
+ /* key: 0x9665 */ 0x3459,
+ /* key: 0x9666 */ 0x7023,
+ /* key: 0x9667 */ 0xffff,
+ /* key: 0x9668 */ 0xffff,
+ /* key: 0x9669 */ 0xffff,
+ /* key: 0x966a */ 0x4766,
+ /* key: 0x966b */ 0xffff,
+ /* key: 0x966c */ 0x7025,
+ /* key: 0x966d */ 0xffff,
+ /* key: 0x966e */ 0xe65a,
+ /* key: 0x966f */ 0xffff,
+ /* key: 0x9670 */ 0x3122,
+ /* key: 0x9671 */ 0xffff,
+ /* key: 0x9672 */ 0x7024,
+ /* key: 0x9673 */ 0x4444,
+ /* key: 0x9674 */ 0xe65b,
+ /* key: 0x9675 */ 0x4e4d,
+ /* key: 0x9676 */ 0x462b,
+ /* key: 0x9677 */ 0x6f7c,
+ /* key: 0x9678 */ 0x4e26,
+ /* key: 0x9679 */ 0xffff,
+ /* key: 0x967a */ 0x3831,
+ /* key: 0x967b */ 0xe65c,
+ /* key: 0x967c */ 0xe65d,
+ /* key: 0x967d */ 0x4d5b,
+ /* key: 0x967e */ 0xe65e,
+ /* key: 0x967f */ 0xe65f,
+ /* key: 0x9680 */ 0xffff,
+ /* key: 0x9681 */ 0xe660,
+ /* key: 0x9682 */ 0xe661,
+ /* key: 0x9683 */ 0xe662,
+ /* key: 0x9684 */ 0xe663,
+ /* key: 0x9685 */ 0x3679,
+ /* key: 0x9686 */ 0x4e34,
+ /* key: 0x9687 */ 0xffff,
+ /* key: 0x9688 */ 0x3728,
+ /* key: 0x9689 */ 0xe664,
+ /* key: 0x968a */ 0x4262,
+ /* key: 0x968b */ 0x6721,
+ /* key: 0x968c */ 0xffff,
+ /* key: 0x968d */ 0x7026,
+ /* key: 0x968e */ 0x332c,
+ /* key: 0x968f */ 0x3f6f,
+ /* key: 0x9690 */ 0xffff,
+ /* key: 0x9691 */ 0xe665,
+ /* key: 0x9692 */ 0xffff,
+ /* key: 0x9693 */ 0xffff,
+ /* key: 0x9694 */ 0x3356,
+ /* key: 0x9695 */ 0x7028,
+ /* key: 0x9696 */ 0xe666,
+ /* key: 0x9697 */ 0x7029,
+ /* key: 0x9698 */ 0x7027,
+ /* key: 0x9699 */ 0x3764,
+ /* key: 0x969a */ 0xe667,
+ /* key: 0x969b */ 0x3a5d,
+ /* key: 0x969c */ 0x3e63,
+ /* key: 0x969d */ 0xe668,
+ /* key: 0x969e */ 0xffff,
+ /* key: 0x969f */ 0xe669,
+ /* key: 0x96a0 */ 0x3123,
+ /* key: 0x96a1 */ 0xffff,
+ /* key: 0x96a2 */ 0xffff,
+ /* key: 0x96a3 */ 0x4e59,
+ /* key: 0x96a4 */ 0xe66a,
+ /* key: 0x96a5 */ 0xe66b,
+ /* key: 0x96a6 */ 0xe66c,
+ /* key: 0x96a7 */ 0x702b,
+ /* key: 0x96a8 */ 0x6e2e,
+ /* key: 0x96a9 */ 0xe66d,
+ /* key: 0x96aa */ 0x702a,
+ /* key: 0x96ab */ 0xffff,
+ /* key: 0x96ac */ 0xffff,
+ /* key: 0x96ad */ 0xffff,
+ /* key: 0x96ae */ 0xe66e,
+ /* key: 0x96af */ 0xe66f,
+ /* key: 0x96b0 */ 0x702e,
+ /* key: 0x96b1 */ 0x702c,
+ /* key: 0x96b2 */ 0x702d,
+ /* key: 0x96b3 */ 0xe670,
+ /* key: 0x96b4 */ 0x702f,
+ /* key: 0x96b5 */ 0xffff,
+ /* key: 0x96b6 */ 0x7030,
+ /* key: 0x96b7 */ 0x4e6c,
+ /* key: 0x96b8 */ 0x7031,
+ /* key: 0x96b9 */ 0x7032,
+ /* key: 0x96ba */ 0xe671,
+ /* key: 0x96bb */ 0x4049,
+ /* key: 0x96bc */ 0x483b,
+ /* key: 0x96bd */ 0xffff,
+ /* key: 0x96be */ 0xffff,
+ /* key: 0x96bf */ 0xffff,
+ /* key: 0x96c0 */ 0x3f7d,
+ /* key: 0x96c1 */ 0x3467,
+ /* key: 0x96c2 */ 0xffff,
+ /* key: 0x96c3 */ 0xffff,
+ /* key: 0x96c4 */ 0x4d3a,
+ /* key: 0x96c5 */ 0x326d,
+ /* key: 0x96c6 */ 0x3d38,
+ /* key: 0x96c7 */ 0x385b,
+ /* key: 0x96c8 */ 0xffff,
+ /* key: 0x96c9 */ 0x7035,
+ /* key: 0x96ca */ 0xe672,
+ /* key: 0x96cb */ 0x7034,
+ /* key: 0x96cc */ 0x3b73,
+ /* key: 0x96cd */ 0x7036,
+ /* key: 0x96ce */ 0x7033,
+ /* key: 0x96cf */ 0xffff,
+ /* key: 0x96d0 */ 0xffff,
+ /* key: 0x96d1 */ 0x3b28,
+ /* key: 0x96d2 */ 0xe673,
+ /* key: 0x96d3 */ 0xffff,
+ /* key: 0x96d4 */ 0xffff,
+ /* key: 0x96d5 */ 0x703a,
+ /* key: 0x96d6 */ 0x6a2d,
+ /* key: 0x96d7 */ 0xffff,
+ /* key: 0x96d8 */ 0xe675,
+ /* key: 0x96d9 */ 0x5256,
+ /* key: 0x96da */ 0xe676,
+ /* key: 0x96db */ 0x3f77,
+ /* key: 0x96dc */ 0x7038,
+ /* key: 0x96dd */ 0xe677,
+ /* key: 0x96de */ 0xe678,
+ /* key: 0x96df */ 0xe679,
+ /* key: 0x96e0 */ 0xffff,
+ /* key: 0x96e1 */ 0xffff,
+ /* key: 0x96e2 */ 0x4e25,
+ /* key: 0x96e3 */ 0x4671,
+ /* key: 0x96e4 */ 0xffff,
+ /* key: 0x96e5 */ 0xffff,
+ /* key: 0x96e6 */ 0xffff,
+ /* key: 0x96e7 */ 0xffff,
+ /* key: 0x96e8 */ 0x312b,
+ /* key: 0x96e9 */ 0xe67a,
+ /* key: 0x96ea */ 0x4063,
+ /* key: 0x96eb */ 0x3c36,
+ /* key: 0x96ec */ 0xffff,
+ /* key: 0x96ed */ 0xffff,
+ /* key: 0x96ee */ 0xffff,
+ /* key: 0x96ef */ 0xe67b,
+ /* key: 0x96f0 */ 0x4a37,
+ /* key: 0x96f1 */ 0xe67c,
+ /* key: 0x96f2 */ 0x3140,
+ /* key: 0x96f3 */ 0xffff,
+ /* key: 0x96f4 */ 0xffff,
+ /* key: 0x96f5 */ 0xffff,
+ /* key: 0x96f6 */ 0x4e6d,
+ /* key: 0x96f7 */ 0x4d6b,
+ /* key: 0x96f8 */ 0xffff,
+ /* key: 0x96f9 */ 0x703b,
+ /* key: 0x96fa */ 0xe67d,
+ /* key: 0x96fb */ 0x4545,
+ /* key: 0x96fc */ 0xffff,
+ /* key: 0x96fd */ 0xffff,
+ /* key: 0x96fe */ 0xffff,
+ /* key: 0x96ff */ 0xffff,
+ /* branch: 0x970X */ 20864,
+ /* branch: 0x971X */ 20880,
+ /* branch: 0x972X */ 20896,
+ /* branch: 0x973X */ 20912,
+ /* branch: 0x974X */ 20928,
+ /* branch: 0x975X */ 20944,
+ /* branch: 0x976X */ 20960,
+ /* branch: 0x977X */ 20976,
+ /* branch: 0x978X */ 20992,
+ /* branch: 0x979X */ 21008,
+ /* branch: 0x97aX */ 21024,
+ /* branch: 0x97bX */ 21040,
+ /* branch: 0x97cX */ 21056,
+ /* branch: 0x97dX */ 21072,
+ /* branch: 0x97eX */ 21088,
+ /* branch: 0x97fX */ 21104,
+ /* key: 0x9700 */ 0x3c7b,
+ /* key: 0x9701 */ 0xffff,
+ /* key: 0x9702 */ 0xe67e,
+ /* key: 0x9703 */ 0xe721,
+ /* key: 0x9704 */ 0x703c,
+ /* key: 0x9705 */ 0xe722,
+ /* key: 0x9706 */ 0x703d,
+ /* key: 0x9707 */ 0x3f4c,
+ /* key: 0x9708 */ 0x703e,
+ /* key: 0x9709 */ 0xe723,
+ /* key: 0x970a */ 0x4e6e,
+ /* key: 0x970b */ 0xffff,
+ /* key: 0x970c */ 0xffff,
+ /* key: 0x970d */ 0x7039,
+ /* key: 0x970e */ 0x7040,
+ /* key: 0x970f */ 0x7042,
+ /* key: 0x9710 */ 0xffff,
+ /* key: 0x9711 */ 0x7041,
+ /* key: 0x9712 */ 0xffff,
+ /* key: 0x9713 */ 0x703f,
+ /* key: 0x9714 */ 0xffff,
+ /* key: 0x9715 */ 0xffff,
+ /* key: 0x9716 */ 0x7043,
+ /* key: 0x9717 */ 0xffff,
+ /* key: 0x9718 */ 0xffff,
+ /* key: 0x9719 */ 0x7044,
+ /* key: 0x971a */ 0xe724,
+ /* key: 0x971b */ 0xe725,
+ /* key: 0x971c */ 0x417a,
+ /* key: 0x971d */ 0xe726,
+ /* key: 0x971e */ 0x3262,
+ /* key: 0x971f */ 0xffff,
+ /* key: 0x9720 */ 0xffff,
+ /* key: 0x9721 */ 0xe727,
+ /* key: 0x9722 */ 0xe728,
+ /* key: 0x9723 */ 0xe729,
+ /* key: 0x9724 */ 0x7045,
+ /* key: 0x9725 */ 0xffff,
+ /* key: 0x9726 */ 0xffff,
+ /* key: 0x9727 */ 0x4c38,
+ /* key: 0x9728 */ 0xe72a,
+ /* key: 0x9729 */ 0xffff,
+ /* key: 0x972a */ 0x7046,
+ /* key: 0x972b */ 0xffff,
+ /* key: 0x972c */ 0xffff,
+ /* key: 0x972d */ 0xffff,
+ /* key: 0x972e */ 0xffff,
+ /* key: 0x972f */ 0xffff,
+ /* key: 0x9730 */ 0x7047,
+ /* key: 0x9731 */ 0xe72b,
+ /* key: 0x9732 */ 0x4f2a,
+ /* key: 0x9733 */ 0xe72c,
+ /* key: 0x9734 */ 0xffff,
+ /* key: 0x9735 */ 0xffff,
+ /* key: 0x9736 */ 0xffff,
+ /* key: 0x9737 */ 0xffff,
+ /* key: 0x9738 */ 0x5b31,
+ /* key: 0x9739 */ 0x7048,
+ /* key: 0x973a */ 0xffff,
+ /* key: 0x973b */ 0xffff,
+ /* key: 0x973c */ 0xffff,
+ /* key: 0x973d */ 0x7049,
+ /* key: 0x973e */ 0x704a,
+ /* key: 0x973f */ 0xffff,
+ /* key: 0x9740 */ 0xffff,
+ /* key: 0x9741 */ 0xe72d,
+ /* key: 0x9742 */ 0x704e,
+ /* key: 0x9743 */ 0xe72e,
+ /* key: 0x9744 */ 0x704b,
+ /* key: 0x9745 */ 0xffff,
+ /* key: 0x9746 */ 0x704c,
+ /* key: 0x9747 */ 0xffff,
+ /* key: 0x9748 */ 0x704d,
+ /* key: 0x9749 */ 0x704f,
+ /* key: 0x974a */ 0xe72f,
+ /* key: 0x974b */ 0xffff,
+ /* key: 0x974c */ 0xffff,
+ /* key: 0x974d */ 0xffff,
+ /* key: 0x974e */ 0xe730,
+ /* key: 0x974f */ 0xe731,
+ /* key: 0x9750 */ 0xffff,
+ /* key: 0x9751 */ 0xffff,
+ /* key: 0x9752 */ 0x4044,
+ /* key: 0x9753 */ 0xffff,
+ /* key: 0x9754 */ 0xffff,
+ /* key: 0x9755 */ 0xe732,
+ /* key: 0x9756 */ 0x4c77,
+ /* key: 0x9757 */ 0xe733,
+ /* key: 0x9758 */ 0xe734,
+ /* key: 0x9759 */ 0x4045,
+ /* key: 0x975a */ 0xe735,
+ /* key: 0x975b */ 0xe736,
+ /* key: 0x975c */ 0x7050,
+ /* key: 0x975d */ 0xffff,
+ /* key: 0x975e */ 0x4873,
+ /* key: 0x975f */ 0xffff,
+ /* key: 0x9760 */ 0x7051,
+ /* key: 0x9761 */ 0x7353,
+ /* key: 0x9762 */ 0x4c4c,
+ /* key: 0x9763 */ 0xe737,
+ /* key: 0x9764 */ 0x7052,
+ /* key: 0x9765 */ 0xffff,
+ /* key: 0x9766 */ 0x7053,
+ /* key: 0x9767 */ 0xe738,
+ /* key: 0x9768 */ 0x7054,
+ /* key: 0x9769 */ 0x3357,
+ /* key: 0x976a */ 0xe739,
+ /* key: 0x976b */ 0x7056,
+ /* key: 0x976c */ 0xffff,
+ /* key: 0x976d */ 0x3f59,
+ /* key: 0x976e */ 0xe73a,
+ /* key: 0x976f */ 0xffff,
+ /* key: 0x9770 */ 0xffff,
+ /* key: 0x9771 */ 0x7057,
+ /* key: 0x9772 */ 0xffff,
+ /* key: 0x9773 */ 0xe73b,
+ /* key: 0x9774 */ 0x3724,
+ /* key: 0x9775 */ 0xffff,
+ /* key: 0x9776 */ 0xe73c,
+ /* key: 0x9777 */ 0xe73d,
+ /* key: 0x9778 */ 0xe73e,
+ /* key: 0x9779 */ 0x7058,
+ /* key: 0x977a */ 0x705c,
+ /* key: 0x977b */ 0xe73f,
+ /* key: 0x977c */ 0x705a,
+ /* key: 0x977d */ 0xe740,
+ /* key: 0x977e */ 0xffff,
+ /* key: 0x977f */ 0xe741,
+ /* key: 0x9780 */ 0xe742,
+ /* key: 0x9781 */ 0x705b,
+ /* key: 0x9782 */ 0xffff,
+ /* key: 0x9783 */ 0xffff,
+ /* key: 0x9784 */ 0x3373,
+ /* key: 0x9785 */ 0x7059,
+ /* key: 0x9786 */ 0x705d,
+ /* key: 0x9787 */ 0xffff,
+ /* key: 0x9788 */ 0xffff,
+ /* key: 0x9789 */ 0xe743,
+ /* key: 0x978a */ 0xffff,
+ /* key: 0x978b */ 0x705e,
+ /* key: 0x978c */ 0xffff,
+ /* key: 0x978d */ 0x3048,
+ /* key: 0x978e */ 0xffff,
+ /* key: 0x978f */ 0x705f,
+ /* key: 0x9790 */ 0x7060,
+ /* key: 0x9791 */ 0xffff,
+ /* key: 0x9792 */ 0xffff,
+ /* key: 0x9793 */ 0xffff,
+ /* key: 0x9794 */ 0xffff,
+ /* key: 0x9795 */ 0xe744,
+ /* key: 0x9796 */ 0xe745,
+ /* key: 0x9797 */ 0xe746,
+ /* key: 0x9798 */ 0x3e64,
+ /* key: 0x9799 */ 0xe747,
+ /* key: 0x979a */ 0xe748,
+ /* key: 0x979b */ 0xffff,
+ /* key: 0x979c */ 0x7061,
+ /* key: 0x979d */ 0xffff,
+ /* key: 0x979e */ 0xe749,
+ /* key: 0x979f */ 0xe74a,
+ /* key: 0x97a0 */ 0x3547,
+ /* key: 0x97a1 */ 0xffff,
+ /* key: 0x97a2 */ 0xe74b,
+ /* key: 0x97a3 */ 0x7064,
+ /* key: 0x97a4 */ 0xffff,
+ /* key: 0x97a5 */ 0xffff,
+ /* key: 0x97a6 */ 0x7063,
+ /* key: 0x97a7 */ 0xffff,
+ /* key: 0x97a8 */ 0x7062,
+ /* key: 0x97a9 */ 0xffff,
+ /* key: 0x97aa */ 0xffff,
+ /* key: 0x97ab */ 0x6b71,
+ /* key: 0x97ac */ 0xe74c,
+ /* key: 0x97ad */ 0x4a5c,
+ /* key: 0x97ae */ 0xe74d,
+ /* key: 0x97af */ 0xffff,
+ /* key: 0x97b0 */ 0xffff,
+ /* key: 0x97b1 */ 0xe74e,
+ /* key: 0x97b2 */ 0xe74f,
+ /* key: 0x97b3 */ 0x7065,
+ /* key: 0x97b4 */ 0x7066,
+ /* key: 0x97b5 */ 0xe750,
+ /* key: 0x97b6 */ 0xe751,
+ /* key: 0x97b7 */ 0xffff,
+ /* key: 0x97b8 */ 0xe752,
+ /* key: 0x97b9 */ 0xe753,
+ /* key: 0x97ba */ 0xe754,
+ /* key: 0x97bb */ 0xffff,
+ /* key: 0x97bc */ 0xe755,
+ /* key: 0x97bd */ 0xffff,
+ /* key: 0x97be */ 0xe756,
+ /* key: 0x97bf */ 0xe757,
+ /* key: 0x97c0 */ 0xffff,
+ /* key: 0x97c1 */ 0xe758,
+ /* key: 0x97c2 */ 0xffff,
+ /* key: 0x97c3 */ 0x7067,
+ /* key: 0x97c4 */ 0xe759,
+ /* key: 0x97c5 */ 0xe75a,
+ /* key: 0x97c6 */ 0x7068,
+ /* key: 0x97c7 */ 0xe75b,
+ /* key: 0x97c8 */ 0x7069,
+ /* key: 0x97c9 */ 0xe75c,
+ /* key: 0x97ca */ 0xe75d,
+ /* key: 0x97cb */ 0x706a,
+ /* key: 0x97cc */ 0xe75e,
+ /* key: 0x97cd */ 0xe75f,
+ /* key: 0x97ce */ 0xe760,
+ /* key: 0x97cf */ 0xffff,
+ /* key: 0x97d0 */ 0xe761,
+ /* key: 0x97d1 */ 0xe762,
+ /* key: 0x97d2 */ 0xffff,
+ /* key: 0x97d3 */ 0x345a,
+ /* key: 0x97d4 */ 0xe763,
+ /* key: 0x97d5 */ 0xffff,
+ /* key: 0x97d6 */ 0xffff,
+ /* key: 0x97d7 */ 0xe764,
+ /* key: 0x97d8 */ 0xe765,
+ /* key: 0x97d9 */ 0xe766,
+ /* key: 0x97da */ 0xffff,
+ /* key: 0x97db */ 0xe76a,
+ /* key: 0x97dc */ 0x706b,
+ /* key: 0x97dd */ 0xe767,
+ /* key: 0x97de */ 0xe768,
+ /* key: 0x97df */ 0xffff,
+ /* key: 0x97e0 */ 0xe769,
+ /* key: 0x97e1 */ 0xe76b,
+ /* key: 0x97e2 */ 0xffff,
+ /* key: 0x97e3 */ 0xffff,
+ /* key: 0x97e4 */ 0xe76c,
+ /* key: 0x97e5 */ 0xffff,
+ /* key: 0x97e6 */ 0xffff,
+ /* key: 0x97e7 */ 0xffff,
+ /* key: 0x97e8 */ 0xffff,
+ /* key: 0x97e9 */ 0xffff,
+ /* key: 0x97ea */ 0xffff,
+ /* key: 0x97eb */ 0xffff,
+ /* key: 0x97ec */ 0xffff,
+ /* key: 0x97ed */ 0x706c,
+ /* key: 0x97ee */ 0x4723,
+ /* key: 0x97ef */ 0xe76d,
+ /* key: 0x97f0 */ 0xffff,
+ /* key: 0x97f1 */ 0xe76e,
+ /* key: 0x97f2 */ 0x706e,
+ /* key: 0x97f3 */ 0x323b,
+ /* key: 0x97f4 */ 0xe76f,
+ /* key: 0x97f5 */ 0x7071,
+ /* key: 0x97f6 */ 0x7070,
+ /* key: 0x97f7 */ 0xe770,
+ /* key: 0x97f8 */ 0xe771,
+ /* key: 0x97f9 */ 0xffff,
+ /* key: 0x97fa */ 0xe772,
+ /* key: 0x97fb */ 0x3124,
+ /* key: 0x97fc */ 0xffff,
+ /* key: 0x97fd */ 0xffff,
+ /* key: 0x97fe */ 0xffff,
+ /* key: 0x97ff */ 0x3641,
+ /* branch: 0x980X */ 21136,
+ /* branch: 0x981X */ 21152,
+ /* branch: 0x982X */ 21168,
+ /* branch: 0x983X */ 21184,
+ /* branch: 0x984X */ 21200,
+ /* branch: 0x985X */ 21216,
+ /* branch: 0x986X */ 21232,
+ /* branch: 0x987X */ 21248,
+ /* branch: 0x988X */ 0,
+ /* branch: 0x989X */ 0,
+ /* branch: 0x98aX */ 21264,
+ /* branch: 0x98bX */ 21280,
+ /* branch: 0x98cX */ 21296,
+ /* branch: 0x98dX */ 21312,
+ /* branch: 0x98eX */ 21328,
+ /* branch: 0x98fX */ 21344,
+ /* key: 0x9800 */ 0xffff,
+ /* key: 0x9801 */ 0x4a47,
+ /* key: 0x9802 */ 0x443a,
+ /* key: 0x9803 */ 0x3a22,
+ /* key: 0x9804 */ 0xffff,
+ /* key: 0x9805 */ 0x3960,
+ /* key: 0x9806 */ 0x3d67,
+ /* key: 0x9807 */ 0xe773,
+ /* key: 0x9808 */ 0x3f5c,
+ /* key: 0x9809 */ 0xffff,
+ /* key: 0x980a */ 0xe774,
+ /* key: 0x980b */ 0xffff,
+ /* key: 0x980c */ 0x7073,
+ /* key: 0x980d */ 0xe776,
+ /* key: 0x980e */ 0xe777,
+ /* key: 0x980f */ 0x7072,
+ /* key: 0x9810 */ 0x4d42,
+ /* key: 0x9811 */ 0x3468,
+ /* key: 0x9812 */ 0x4852,
+ /* key: 0x9813 */ 0x465c,
+ /* key: 0x9814 */ 0xe778,
+ /* key: 0x9815 */ 0xffff,
+ /* key: 0x9816 */ 0xe779,
+ /* key: 0x9817 */ 0x3f7c,
+ /* key: 0x9818 */ 0x4e4e,
+ /* key: 0x9819 */ 0xe775,
+ /* key: 0x981a */ 0x375b,
+ /* key: 0x981b */ 0xffff,
+ /* key: 0x981c */ 0xe77a,
+ /* key: 0x981d */ 0xffff,
+ /* key: 0x981e */ 0xe77b,
+ /* key: 0x981f */ 0xffff,
+ /* key: 0x9820 */ 0xe77c,
+ /* key: 0x9821 */ 0x7076,
+ /* key: 0x9822 */ 0xffff,
+ /* key: 0x9823 */ 0xe77d,
+ /* key: 0x9824 */ 0x7075,
+ /* key: 0x9825 */ 0xe828,
+ /* key: 0x9826 */ 0xe77e,
+ /* key: 0x9827 */ 0xffff,
+ /* key: 0x9828 */ 0xffff,
+ /* key: 0x9829 */ 0xffff,
+ /* key: 0x982a */ 0xffff,
+ /* key: 0x982b */ 0xe821,
+ /* key: 0x982c */ 0x4b4b,
+ /* key: 0x982d */ 0x462c,
+ /* key: 0x982e */ 0xe822,
+ /* key: 0x982f */ 0xe823,
+ /* key: 0x9830 */ 0xe824,
+ /* key: 0x9831 */ 0xffff,
+ /* key: 0x9832 */ 0xe825,
+ /* key: 0x9833 */ 0xe826,
+ /* key: 0x9834 */ 0x3150,
+ /* key: 0x9835 */ 0xe827,
+ /* key: 0x9836 */ 0xffff,
+ /* key: 0x9837 */ 0x7077,
+ /* key: 0x9838 */ 0x7074,
+ /* key: 0x9839 */ 0xffff,
+ /* key: 0x983a */ 0xffff,
+ /* key: 0x983b */ 0x4951,
+ /* key: 0x983c */ 0x4d6a,
+ /* key: 0x983d */ 0x7078,
+ /* key: 0x983e */ 0xe829,
+ /* key: 0x983f */ 0xffff,
+ /* key: 0x9840 */ 0xffff,
+ /* key: 0x9841 */ 0xffff,
+ /* key: 0x9842 */ 0xffff,
+ /* key: 0x9843 */ 0xffff,
+ /* key: 0x9844 */ 0xe82a,
+ /* key: 0x9845 */ 0xffff,
+ /* key: 0x9846 */ 0x7079,
+ /* key: 0x9847 */ 0xe82b,
+ /* key: 0x9848 */ 0xffff,
+ /* key: 0x9849 */ 0xffff,
+ /* key: 0x984a */ 0xe82c,
+ /* key: 0x984b */ 0x707b,
+ /* key: 0x984c */ 0x426a,
+ /* key: 0x984d */ 0x335b,
+ /* key: 0x984e */ 0x335c,
+ /* key: 0x984f */ 0x707a,
+ /* key: 0x9850 */ 0xffff,
+ /* key: 0x9851 */ 0xe82d,
+ /* key: 0x9852 */ 0xe82e,
+ /* key: 0x9853 */ 0xe82f,
+ /* key: 0x9854 */ 0x3469,
+ /* key: 0x9855 */ 0x3832,
+ /* key: 0x9856 */ 0xe830,
+ /* key: 0x9857 */ 0xe831,
+ /* key: 0x9858 */ 0x346a,
+ /* key: 0x9859 */ 0xe832,
+ /* key: 0x985a */ 0xe833,
+ /* key: 0x985b */ 0x453f,
+ /* key: 0x985c */ 0xffff,
+ /* key: 0x985d */ 0xffff,
+ /* key: 0x985e */ 0x4e60,
+ /* key: 0x985f */ 0xffff,
+ /* key: 0x9860 */ 0xffff,
+ /* key: 0x9861 */ 0xffff,
+ /* key: 0x9862 */ 0xe834,
+ /* key: 0x9863 */ 0xe835,
+ /* key: 0x9864 */ 0xffff,
+ /* key: 0x9865 */ 0xe836,
+ /* key: 0x9866 */ 0xe837,
+ /* key: 0x9867 */ 0x385c,
+ /* key: 0x9868 */ 0xffff,
+ /* key: 0x9869 */ 0xffff,
+ /* key: 0x986a */ 0xe838,
+ /* key: 0x986b */ 0x707c,
+ /* key: 0x986c */ 0xe839,
+ /* key: 0x986d */ 0xffff,
+ /* key: 0x986e */ 0xffff,
+ /* key: 0x986f */ 0x707d,
+ /* key: 0x9870 */ 0x707e,
+ /* key: 0x9871 */ 0x7121,
+ /* key: 0x9872 */ 0xffff,
+ /* key: 0x9873 */ 0x7123,
+ /* key: 0x9874 */ 0x7122,
+ /* key: 0x9875 */ 0xffff,
+ /* key: 0x9876 */ 0xffff,
+ /* key: 0x9877 */ 0xffff,
+ /* key: 0x9878 */ 0xffff,
+ /* key: 0x9879 */ 0xffff,
+ /* key: 0x987a */ 0xffff,
+ /* key: 0x987b */ 0xffff,
+ /* key: 0x987c */ 0xffff,
+ /* key: 0x987d */ 0xffff,
+ /* key: 0x987e */ 0xffff,
+ /* key: 0x987f */ 0xffff,
+ /* key: 0x98a0 */ 0xffff,
+ /* key: 0x98a1 */ 0xffff,
+ /* key: 0x98a2 */ 0xffff,
+ /* key: 0x98a3 */ 0xffff,
+ /* key: 0x98a4 */ 0xffff,
+ /* key: 0x98a5 */ 0xffff,
+ /* key: 0x98a6 */ 0xffff,
+ /* key: 0x98a7 */ 0xffff,
+ /* key: 0x98a8 */ 0x4977,
+ /* key: 0x98a9 */ 0xffff,
+ /* key: 0x98aa */ 0x7124,
+ /* key: 0x98ab */ 0xe83a,
+ /* key: 0x98ac */ 0xffff,
+ /* key: 0x98ad */ 0xe83b,
+ /* key: 0x98ae */ 0xe83c,
+ /* key: 0x98af */ 0x7125,
+ /* key: 0x98b0 */ 0xe83d,
+ /* key: 0x98b1 */ 0x7126,
+ /* key: 0x98b2 */ 0xffff,
+ /* key: 0x98b3 */ 0xffff,
+ /* key: 0x98b4 */ 0xe83e,
+ /* key: 0x98b5 */ 0xffff,
+ /* key: 0x98b6 */ 0x7127,
+ /* key: 0x98b7 */ 0xe83f,
+ /* key: 0x98b8 */ 0xe840,
+ /* key: 0x98b9 */ 0xffff,
+ /* key: 0x98ba */ 0xe841,
+ /* key: 0x98bb */ 0xe842,
+ /* key: 0x98bc */ 0xffff,
+ /* key: 0x98bd */ 0xffff,
+ /* key: 0x98be */ 0xffff,
+ /* key: 0x98bf */ 0xe843,
+ /* key: 0x98c0 */ 0xffff,
+ /* key: 0x98c1 */ 0xffff,
+ /* key: 0x98c2 */ 0xe844,
+ /* key: 0x98c3 */ 0x7129,
+ /* key: 0x98c4 */ 0x7128,
+ /* key: 0x98c5 */ 0xe845,
+ /* key: 0x98c6 */ 0x712a,
+ /* key: 0x98c7 */ 0xffff,
+ /* key: 0x98c8 */ 0xe846,
+ /* key: 0x98c9 */ 0xffff,
+ /* key: 0x98ca */ 0xffff,
+ /* key: 0x98cb */ 0xffff,
+ /* key: 0x98cc */ 0xe847,
+ /* key: 0x98cd */ 0xffff,
+ /* key: 0x98ce */ 0xffff,
+ /* key: 0x98cf */ 0xffff,
+ /* key: 0x98d0 */ 0xffff,
+ /* key: 0x98d1 */ 0xffff,
+ /* key: 0x98d2 */ 0xffff,
+ /* key: 0x98d3 */ 0xffff,
+ /* key: 0x98d4 */ 0xffff,
+ /* key: 0x98d5 */ 0xffff,
+ /* key: 0x98d6 */ 0xffff,
+ /* key: 0x98d7 */ 0xffff,
+ /* key: 0x98d8 */ 0xffff,
+ /* key: 0x98d9 */ 0xffff,
+ /* key: 0x98da */ 0xffff,
+ /* key: 0x98db */ 0x4874,
+ /* key: 0x98dc */ 0x664c,
+ /* key: 0x98dd */ 0xffff,
+ /* key: 0x98de */ 0xffff,
+ /* key: 0x98df */ 0x3f29,
+ /* key: 0x98e0 */ 0xffff,
+ /* key: 0x98e1 */ 0xe848,
+ /* key: 0x98e2 */ 0x3532,
+ /* key: 0x98e3 */ 0xe849,
+ /* key: 0x98e4 */ 0xffff,
+ /* key: 0x98e5 */ 0xe84a,
+ /* key: 0x98e6 */ 0xe84b,
+ /* key: 0x98e7 */ 0xe84c,
+ /* key: 0x98e8 */ 0xffff,
+ /* key: 0x98e9 */ 0x712b,
+ /* key: 0x98ea */ 0xe84d,
+ /* key: 0x98eb */ 0x712c,
+ /* key: 0x98ec */ 0xffff,
+ /* key: 0x98ed */ 0x522c,
+ /* key: 0x98ee */ 0x5d3b,
+ /* key: 0x98ef */ 0x4853,
+ /* key: 0x98f0 */ 0xffff,
+ /* key: 0x98f1 */ 0xffff,
+ /* key: 0x98f2 */ 0x307b,
+ /* key: 0x98f3 */ 0xe84e,
+ /* key: 0x98f4 */ 0x303b,
+ /* key: 0x98f5 */ 0xffff,
+ /* key: 0x98f6 */ 0xe84f,
+ /* key: 0x98f7 */ 0xffff,
+ /* key: 0x98f8 */ 0xffff,
+ /* key: 0x98f9 */ 0xffff,
+ /* key: 0x98fa */ 0xffff,
+ /* key: 0x98fb */ 0xffff,
+ /* key: 0x98fc */ 0x3b74,
+ /* key: 0x98fd */ 0x4b30,
+ /* key: 0x98fe */ 0x3e7e,
+ /* key: 0x98ff */ 0xffff,
+ /* branch: 0x990X */ 21376,
+ /* branch: 0x991X */ 21392,
+ /* branch: 0x992X */ 21408,
+ /* branch: 0x993X */ 21424,
+ /* branch: 0x994X */ 21440,
+ /* branch: 0x995X */ 21456,
+ /* branch: 0x996X */ 21472,
+ /* branch: 0x997X */ 0,
+ /* branch: 0x998X */ 0,
+ /* branch: 0x999X */ 21488,
+ /* branch: 0x99aX */ 21504,
+ /* branch: 0x99bX */ 21520,
+ /* branch: 0x99cX */ 21536,
+ /* branch: 0x99dX */ 21552,
+ /* branch: 0x99eX */ 21568,
+ /* branch: 0x99fX */ 21584,
+ /* key: 0x9900 */ 0xffff,
+ /* key: 0x9901 */ 0xffff,
+ /* key: 0x9902 */ 0xe850,
+ /* key: 0x9903 */ 0x712d,
+ /* key: 0x9904 */ 0xffff,
+ /* key: 0x9905 */ 0x4c5f,
+ /* key: 0x9906 */ 0xffff,
+ /* key: 0x9907 */ 0xe851,
+ /* key: 0x9908 */ 0xe852,
+ /* key: 0x9909 */ 0x712e,
+ /* key: 0x990a */ 0x4d5c,
+ /* key: 0x990b */ 0xffff,
+ /* key: 0x990c */ 0x3142,
+ /* key: 0x990d */ 0xffff,
+ /* key: 0x990e */ 0xffff,
+ /* key: 0x990f */ 0xffff,
+ /* key: 0x9910 */ 0x3b41,
+ /* key: 0x9911 */ 0xe853,
+ /* key: 0x9912 */ 0x712f,
+ /* key: 0x9913 */ 0x326e,
+ /* key: 0x9914 */ 0x7130,
+ /* key: 0x9915 */ 0xe854,
+ /* key: 0x9916 */ 0xe855,
+ /* key: 0x9917 */ 0xe856,
+ /* key: 0x9918 */ 0x7131,
+ /* key: 0x9919 */ 0xffff,
+ /* key: 0x991a */ 0xe857,
+ /* key: 0x991b */ 0xe858,
+ /* key: 0x991c */ 0xe859,
+ /* key: 0x991d */ 0x7133,
+ /* key: 0x991e */ 0x7134,
+ /* key: 0x991f */ 0xe85a,
+ /* key: 0x9920 */ 0x7136,
+ /* key: 0x9921 */ 0x7132,
+ /* key: 0x9922 */ 0xe85b,
+ /* key: 0x9923 */ 0xffff,
+ /* key: 0x9924 */ 0x7135,
+ /* key: 0x9925 */ 0xffff,
+ /* key: 0x9926 */ 0xe85c,
+ /* key: 0x9927 */ 0xe85d,
+ /* key: 0x9928 */ 0x345b,
+ /* key: 0x9929 */ 0xffff,
+ /* key: 0x992a */ 0xffff,
+ /* key: 0x992b */ 0xe85e,
+ /* key: 0x992c */ 0x7137,
+ /* key: 0x992d */ 0xffff,
+ /* key: 0x992e */ 0x7138,
+ /* key: 0x992f */ 0xffff,
+ /* key: 0x9930 */ 0xffff,
+ /* key: 0x9931 */ 0xe85f,
+ /* key: 0x9932 */ 0xe860,
+ /* key: 0x9933 */ 0xe861,
+ /* key: 0x9934 */ 0xe862,
+ /* key: 0x9935 */ 0xe863,
+ /* key: 0x9936 */ 0xffff,
+ /* key: 0x9937 */ 0xffff,
+ /* key: 0x9938 */ 0xffff,
+ /* key: 0x9939 */ 0xe864,
+ /* key: 0x993a */ 0xe865,
+ /* key: 0x993b */ 0xe866,
+ /* key: 0x993c */ 0xe867,
+ /* key: 0x993d */ 0x7139,
+ /* key: 0x993e */ 0x713a,
+ /* key: 0x993f */ 0xffff,
+ /* key: 0x9940 */ 0xe868,
+ /* key: 0x9941 */ 0xe869,
+ /* key: 0x9942 */ 0x713b,
+ /* key: 0x9943 */ 0xffff,
+ /* key: 0x9944 */ 0xffff,
+ /* key: 0x9945 */ 0x713d,
+ /* key: 0x9946 */ 0xe86a,
+ /* key: 0x9947 */ 0xe86b,
+ /* key: 0x9948 */ 0xe86c,
+ /* key: 0x9949 */ 0x713c,
+ /* key: 0x994a */ 0xffff,
+ /* key: 0x994b */ 0x713f,
+ /* key: 0x994c */ 0x7142,
+ /* key: 0x994d */ 0xe86d,
+ /* key: 0x994e */ 0xe86e,
+ /* key: 0x994f */ 0xffff,
+ /* key: 0x9950 */ 0x713e,
+ /* key: 0x9951 */ 0x7140,
+ /* key: 0x9952 */ 0x7141,
+ /* key: 0x9953 */ 0xffff,
+ /* key: 0x9954 */ 0xe86f,
+ /* key: 0x9955 */ 0x7143,
+ /* key: 0x9956 */ 0xffff,
+ /* key: 0x9957 */ 0x3642,
+ /* key: 0x9958 */ 0xe870,
+ /* key: 0x9959 */ 0xe871,
+ /* key: 0x995a */ 0xffff,
+ /* key: 0x995b */ 0xe872,
+ /* key: 0x995c */ 0xe873,
+ /* key: 0x995d */ 0xffff,
+ /* key: 0x995e */ 0xe874,
+ /* key: 0x995f */ 0xe875,
+ /* key: 0x9960 */ 0xe876,
+ /* key: 0x9961 */ 0xffff,
+ /* key: 0x9962 */ 0xffff,
+ /* key: 0x9963 */ 0xffff,
+ /* key: 0x9964 */ 0xffff,
+ /* key: 0x9965 */ 0xffff,
+ /* key: 0x9966 */ 0xffff,
+ /* key: 0x9967 */ 0xffff,
+ /* key: 0x9968 */ 0xffff,
+ /* key: 0x9969 */ 0xffff,
+ /* key: 0x996a */ 0xffff,
+ /* key: 0x996b */ 0xffff,
+ /* key: 0x996c */ 0xffff,
+ /* key: 0x996d */ 0xffff,
+ /* key: 0x996e */ 0xffff,
+ /* key: 0x996f */ 0xffff,
+ /* key: 0x9990 */ 0xffff,
+ /* key: 0x9991 */ 0xffff,
+ /* key: 0x9992 */ 0xffff,
+ /* key: 0x9993 */ 0xffff,
+ /* key: 0x9994 */ 0xffff,
+ /* key: 0x9995 */ 0xffff,
+ /* key: 0x9996 */ 0x3c73,
+ /* key: 0x9997 */ 0x7144,
+ /* key: 0x9998 */ 0x7145,
+ /* key: 0x9999 */ 0x3961,
+ /* key: 0x999a */ 0xffff,
+ /* key: 0x999b */ 0xe877,
+ /* key: 0x999c */ 0xffff,
+ /* key: 0x999d */ 0xe878,
+ /* key: 0x999e */ 0xffff,
+ /* key: 0x999f */ 0xe879,
+ /* key: 0x99a0 */ 0xffff,
+ /* key: 0x99a1 */ 0xffff,
+ /* key: 0x99a2 */ 0xffff,
+ /* key: 0x99a3 */ 0xffff,
+ /* key: 0x99a4 */ 0xffff,
+ /* key: 0x99a5 */ 0x7146,
+ /* key: 0x99a6 */ 0xe87a,
+ /* key: 0x99a7 */ 0xffff,
+ /* key: 0x99a8 */ 0x333e,
+ /* key: 0x99a9 */ 0xffff,
+ /* key: 0x99aa */ 0xffff,
+ /* key: 0x99ab */ 0xffff,
+ /* key: 0x99ac */ 0x474f,
+ /* key: 0x99ad */ 0x7147,
+ /* key: 0x99ae */ 0x7148,
+ /* key: 0x99af */ 0xffff,
+ /* key: 0x99b0 */ 0xe87b,
+ /* key: 0x99b1 */ 0xe87c,
+ /* key: 0x99b2 */ 0xe87d,
+ /* key: 0x99b3 */ 0x435a,
+ /* key: 0x99b4 */ 0x466b,
+ /* key: 0x99b5 */ 0xe87e,
+ /* key: 0x99b6 */ 0xffff,
+ /* key: 0x99b7 */ 0xffff,
+ /* key: 0x99b8 */ 0xffff,
+ /* key: 0x99b9 */ 0xe921,
+ /* key: 0x99ba */ 0xe922,
+ /* key: 0x99bb */ 0xffff,
+ /* key: 0x99bc */ 0x7149,
+ /* key: 0x99bd */ 0xe923,
+ /* key: 0x99be */ 0xffff,
+ /* key: 0x99bf */ 0xe924,
+ /* key: 0x99c0 */ 0xffff,
+ /* key: 0x99c1 */ 0x477d,
+ /* key: 0x99c2 */ 0xffff,
+ /* key: 0x99c3 */ 0xe925,
+ /* key: 0x99c4 */ 0x424c,
+ /* key: 0x99c5 */ 0x3158,
+ /* key: 0x99c6 */ 0x366e,
+ /* key: 0x99c7 */ 0xffff,
+ /* key: 0x99c8 */ 0x366f,
+ /* key: 0x99c9 */ 0xe926,
+ /* key: 0x99ca */ 0xffff,
+ /* key: 0x99cb */ 0xffff,
+ /* key: 0x99cc */ 0xffff,
+ /* key: 0x99cd */ 0xffff,
+ /* key: 0x99ce */ 0xffff,
+ /* key: 0x99cf */ 0xffff,
+ /* key: 0x99d0 */ 0x4373,
+ /* key: 0x99d1 */ 0x714e,
+ /* key: 0x99d2 */ 0x3670,
+ /* key: 0x99d3 */ 0xe927,
+ /* key: 0x99d4 */ 0xe928,
+ /* key: 0x99d5 */ 0x326f,
+ /* key: 0x99d6 */ 0xffff,
+ /* key: 0x99d7 */ 0xffff,
+ /* key: 0x99d8 */ 0x714d,
+ /* key: 0x99d9 */ 0xe929,
+ /* key: 0x99da */ 0xe92a,
+ /* key: 0x99db */ 0x714b,
+ /* key: 0x99dc */ 0xe92b,
+ /* key: 0x99dd */ 0x714c,
+ /* key: 0x99de */ 0xe92c,
+ /* key: 0x99df */ 0x714a,
+ /* key: 0x99e0 */ 0xffff,
+ /* key: 0x99e1 */ 0xffff,
+ /* key: 0x99e2 */ 0x7158,
+ /* key: 0x99e3 */ 0xffff,
+ /* key: 0x99e4 */ 0xffff,
+ /* key: 0x99e5 */ 0xffff,
+ /* key: 0x99e6 */ 0xffff,
+ /* key: 0x99e7 */ 0xe92d,
+ /* key: 0x99e8 */ 0xffff,
+ /* key: 0x99e9 */ 0xffff,
+ /* key: 0x99ea */ 0xe92e,
+ /* key: 0x99eb */ 0xe92f,
+ /* key: 0x99ec */ 0xe930,
+ /* key: 0x99ed */ 0x714f,
+ /* key: 0x99ee */ 0x7150,
+ /* key: 0x99ef */ 0xffff,
+ /* key: 0x99f0 */ 0xe931,
+ /* key: 0x99f1 */ 0x7151,
+ /* key: 0x99f2 */ 0x7152,
+ /* key: 0x99f3 */ 0xffff,
+ /* key: 0x99f4 */ 0xe932,
+ /* key: 0x99f5 */ 0xe933,
+ /* key: 0x99f6 */ 0xffff,
+ /* key: 0x99f7 */ 0xffff,
+ /* key: 0x99f8 */ 0x7154,
+ /* key: 0x99f9 */ 0xe934,
+ /* key: 0x99fa */ 0xffff,
+ /* key: 0x99fb */ 0x7153,
+ /* key: 0x99fc */ 0xffff,
+ /* key: 0x99fd */ 0xe935,
+ /* key: 0x99fe */ 0xe936,
+ /* key: 0x99ff */ 0x3d59,
+ /* branch: 0x9a0X */ 21616,
+ /* branch: 0x9a1X */ 21632,
+ /* branch: 0x9a2X */ 21648,
+ /* branch: 0x9a3X */ 21664,
+ /* branch: 0x9a4X */ 21680,
+ /* branch: 0x9a5X */ 21696,
+ /* branch: 0x9a6X */ 21712,
+ /* branch: 0x9a7X */ 0,
+ /* branch: 0x9a8X */ 0,
+ /* branch: 0x9a9X */ 0,
+ /* branch: 0x9aaX */ 21728,
+ /* branch: 0x9abX */ 21744,
+ /* branch: 0x9acX */ 21760,
+ /* branch: 0x9adX */ 21776,
+ /* branch: 0x9aeX */ 21792,
+ /* branch: 0x9afX */ 21808,
+ /* key: 0x9a00 */ 0xffff,
+ /* key: 0x9a01 */ 0x7155,
+ /* key: 0x9a02 */ 0xe937,
+ /* key: 0x9a03 */ 0xe938,
+ /* key: 0x9a04 */ 0xe939,
+ /* key: 0x9a05 */ 0x7157,
+ /* key: 0x9a06 */ 0xffff,
+ /* key: 0x9a07 */ 0xffff,
+ /* key: 0x9a08 */ 0xffff,
+ /* key: 0x9a09 */ 0xffff,
+ /* key: 0x9a0a */ 0xffff,
+ /* key: 0x9a0b */ 0xe93a,
+ /* key: 0x9a0c */ 0xe93b,
+ /* key: 0x9a0d */ 0xffff,
+ /* key: 0x9a0e */ 0x3533,
+ /* key: 0x9a0f */ 0x7156,
+ /* key: 0x9a10 */ 0xe93c,
+ /* key: 0x9a11 */ 0xe93d,
+ /* key: 0x9a12 */ 0x417b,
+ /* key: 0x9a13 */ 0x3833,
+ /* key: 0x9a14 */ 0xffff,
+ /* key: 0x9a15 */ 0xffff,
+ /* key: 0x9a16 */ 0xe93e,
+ /* key: 0x9a17 */ 0xffff,
+ /* key: 0x9a18 */ 0xffff,
+ /* key: 0x9a19 */ 0x7159,
+ /* key: 0x9a1a */ 0xffff,
+ /* key: 0x9a1b */ 0xffff,
+ /* key: 0x9a1c */ 0xffff,
+ /* key: 0x9a1d */ 0xffff,
+ /* key: 0x9a1e */ 0xe93f,
+ /* key: 0x9a1f */ 0xffff,
+ /* key: 0x9a20 */ 0xe940,
+ /* key: 0x9a21 */ 0xffff,
+ /* key: 0x9a22 */ 0xe941,
+ /* key: 0x9a23 */ 0xe942,
+ /* key: 0x9a24 */ 0xe943,
+ /* key: 0x9a25 */ 0xffff,
+ /* key: 0x9a26 */ 0xffff,
+ /* key: 0x9a27 */ 0xe944,
+ /* key: 0x9a28 */ 0x424d,
+ /* key: 0x9a29 */ 0xffff,
+ /* key: 0x9a2a */ 0xffff,
+ /* key: 0x9a2b */ 0x715a,
+ /* key: 0x9a2c */ 0xffff,
+ /* key: 0x9a2d */ 0xe945,
+ /* key: 0x9a2e */ 0xe946,
+ /* key: 0x9a2f */ 0xffff,
+ /* key: 0x9a30 */ 0x462d,
+ /* key: 0x9a31 */ 0xffff,
+ /* key: 0x9a32 */ 0xffff,
+ /* key: 0x9a33 */ 0xe947,
+ /* key: 0x9a34 */ 0xffff,
+ /* key: 0x9a35 */ 0xe948,
+ /* key: 0x9a36 */ 0xe949,
+ /* key: 0x9a37 */ 0x715b,
+ /* key: 0x9a38 */ 0xe94a,
+ /* key: 0x9a39 */ 0xffff,
+ /* key: 0x9a3a */ 0xffff,
+ /* key: 0x9a3b */ 0xffff,
+ /* key: 0x9a3c */ 0xffff,
+ /* key: 0x9a3d */ 0xffff,
+ /* key: 0x9a3e */ 0x7160,
+ /* key: 0x9a3f */ 0xffff,
+ /* key: 0x9a40 */ 0x715e,
+ /* key: 0x9a41 */ 0xe94c,
+ /* key: 0x9a42 */ 0x715d,
+ /* key: 0x9a43 */ 0x715f,
+ /* key: 0x9a44 */ 0xe94d,
+ /* key: 0x9a45 */ 0x715c,
+ /* key: 0x9a46 */ 0xffff,
+ /* key: 0x9a47 */ 0xe94b,
+ /* key: 0x9a48 */ 0xffff,
+ /* key: 0x9a49 */ 0xffff,
+ /* key: 0x9a4a */ 0xe94e,
+ /* key: 0x9a4b */ 0xe94f,
+ /* key: 0x9a4c */ 0xe950,
+ /* key: 0x9a4d */ 0x7162,
+ /* key: 0x9a4e */ 0xe951,
+ /* key: 0x9a4f */ 0xffff,
+ /* key: 0x9a50 */ 0xffff,
+ /* key: 0x9a51 */ 0xe952,
+ /* key: 0x9a52 */ 0xffff,
+ /* key: 0x9a53 */ 0xffff,
+ /* key: 0x9a54 */ 0xe953,
+ /* key: 0x9a55 */ 0x7161,
+ /* key: 0x9a56 */ 0xe954,
+ /* key: 0x9a57 */ 0x7164,
+ /* key: 0x9a58 */ 0xffff,
+ /* key: 0x9a59 */ 0xffff,
+ /* key: 0x9a5a */ 0x3643,
+ /* key: 0x9a5b */ 0x7163,
+ /* key: 0x9a5c */ 0xffff,
+ /* key: 0x9a5d */ 0xe955,
+ /* key: 0x9a5e */ 0xffff,
+ /* key: 0x9a5f */ 0x7165,
+ /* key: 0x9a60 */ 0xffff,
+ /* key: 0x9a61 */ 0xffff,
+ /* key: 0x9a62 */ 0x7166,
+ /* key: 0x9a63 */ 0xffff,
+ /* key: 0x9a64 */ 0x7168,
+ /* key: 0x9a65 */ 0x7167,
+ /* key: 0x9a66 */ 0xffff,
+ /* key: 0x9a67 */ 0xffff,
+ /* key: 0x9a68 */ 0xffff,
+ /* key: 0x9a69 */ 0x7169,
+ /* key: 0x9a6a */ 0x716b,
+ /* key: 0x9a6b */ 0x716a,
+ /* key: 0x9a6c */ 0xffff,
+ /* key: 0x9a6d */ 0xffff,
+ /* key: 0x9a6e */ 0xffff,
+ /* key: 0x9a6f */ 0xffff,
+ /* key: 0x9aa0 */ 0xffff,
+ /* key: 0x9aa1 */ 0xffff,
+ /* key: 0x9aa2 */ 0xffff,
+ /* key: 0x9aa3 */ 0xffff,
+ /* key: 0x9aa4 */ 0xffff,
+ /* key: 0x9aa5 */ 0xffff,
+ /* key: 0x9aa6 */ 0xffff,
+ /* key: 0x9aa7 */ 0xffff,
+ /* key: 0x9aa8 */ 0x397c,
+ /* key: 0x9aa9 */ 0xffff,
+ /* key: 0x9aaa */ 0xe956,
+ /* key: 0x9aab */ 0xffff,
+ /* key: 0x9aac */ 0xe957,
+ /* key: 0x9aad */ 0x716c,
+ /* key: 0x9aae */ 0xe958,
+ /* key: 0x9aaf */ 0xe959,
+ /* key: 0x9ab0 */ 0x716d,
+ /* key: 0x9ab1 */ 0xffff,
+ /* key: 0x9ab2 */ 0xe95a,
+ /* key: 0x9ab3 */ 0xffff,
+ /* key: 0x9ab4 */ 0xe95b,
+ /* key: 0x9ab5 */ 0xe95c,
+ /* key: 0x9ab6 */ 0xe95d,
+ /* key: 0x9ab7 */ 0xffff,
+ /* key: 0x9ab8 */ 0x333c,
+ /* key: 0x9ab9 */ 0xe95e,
+ /* key: 0x9aba */ 0xffff,
+ /* key: 0x9abb */ 0xe95f,
+ /* key: 0x9abc */ 0x716e,
+ /* key: 0x9abd */ 0xffff,
+ /* key: 0x9abe */ 0xe960,
+ /* key: 0x9abf */ 0xe961,
+ /* key: 0x9ac0 */ 0x716f,
+ /* key: 0x9ac1 */ 0xe962,
+ /* key: 0x9ac2 */ 0xffff,
+ /* key: 0x9ac3 */ 0xe963,
+ /* key: 0x9ac4 */ 0x3f71,
+ /* key: 0x9ac5 */ 0xffff,
+ /* key: 0x9ac6 */ 0xe964,
+ /* key: 0x9ac7 */ 0xffff,
+ /* key: 0x9ac8 */ 0xe965,
+ /* key: 0x9ac9 */ 0xffff,
+ /* key: 0x9aca */ 0xffff,
+ /* key: 0x9acb */ 0xffff,
+ /* key: 0x9acc */ 0xffff,
+ /* key: 0x9acd */ 0xffff,
+ /* key: 0x9ace */ 0xe966,
+ /* key: 0x9acf */ 0x7170,
+ /* key: 0x9ad0 */ 0xe967,
+ /* key: 0x9ad1 */ 0x7171,
+ /* key: 0x9ad2 */ 0xe968,
+ /* key: 0x9ad3 */ 0x7172,
+ /* key: 0x9ad4 */ 0x7173,
+ /* key: 0x9ad5 */ 0xe969,
+ /* key: 0x9ad6 */ 0xe96a,
+ /* key: 0x9ad7 */ 0xe96b,
+ /* key: 0x9ad8 */ 0x3962,
+ /* key: 0x9ad9 */ 0xffff,
+ /* key: 0x9ada */ 0xffff,
+ /* key: 0x9adb */ 0xe96c,
+ /* key: 0x9adc */ 0xe96d,
+ /* key: 0x9add */ 0xffff,
+ /* key: 0x9ade */ 0x7174,
+ /* key: 0x9adf */ 0x7175,
+ /* key: 0x9ae0 */ 0xe96e,
+ /* key: 0x9ae1 */ 0xffff,
+ /* key: 0x9ae2 */ 0x7176,
+ /* key: 0x9ae3 */ 0x7177,
+ /* key: 0x9ae4 */ 0xe96f,
+ /* key: 0x9ae5 */ 0xe970,
+ /* key: 0x9ae6 */ 0x7178,
+ /* key: 0x9ae7 */ 0xe971,
+ /* key: 0x9ae8 */ 0xffff,
+ /* key: 0x9ae9 */ 0xe972,
+ /* key: 0x9aea */ 0x4831,
+ /* key: 0x9aeb */ 0x717a,
+ /* key: 0x9aec */ 0xe973,
+ /* key: 0x9aed */ 0x4926,
+ /* key: 0x9aee */ 0x717b,
+ /* key: 0x9aef */ 0x7179,
+ /* key: 0x9af0 */ 0xffff,
+ /* key: 0x9af1 */ 0x717d,
+ /* key: 0x9af2 */ 0xe974,
+ /* key: 0x9af3 */ 0xe975,
+ /* key: 0x9af4 */ 0x717c,
+ /* key: 0x9af5 */ 0xe976,
+ /* key: 0x9af6 */ 0xffff,
+ /* key: 0x9af7 */ 0x717e,
+ /* key: 0x9af8 */ 0xffff,
+ /* key: 0x9af9 */ 0xe977,
+ /* key: 0x9afa */ 0xe978,
+ /* key: 0x9afb */ 0x7221,
+ /* key: 0x9afc */ 0xffff,
+ /* key: 0x9afd */ 0xe979,
+ /* key: 0x9afe */ 0xffff,
+ /* key: 0x9aff */ 0xe97a,
+ /* branch: 0x9b0X */ 21840,
+ /* branch: 0x9b1X */ 21856,
+ /* branch: 0x9b2X */ 21872,
+ /* branch: 0x9b3X */ 21888,
+ /* branch: 0x9b4X */ 21904,
+ /* branch: 0x9b5X */ 21920,
+ /* branch: 0x9b6X */ 21936,
+ /* branch: 0x9b7X */ 21952,
+ /* branch: 0x9b8X */ 21968,
+ /* branch: 0x9b9X */ 21984,
+ /* branch: 0x9baX */ 22000,
+ /* branch: 0x9bbX */ 22016,
+ /* branch: 0x9bcX */ 22032,
+ /* branch: 0x9bdX */ 22048,
+ /* branch: 0x9beX */ 22064,
+ /* branch: 0x9bfX */ 22080,
+ /* key: 0x9b00 */ 0xe97b,
+ /* key: 0x9b01 */ 0xe97c,
+ /* key: 0x9b02 */ 0xe97d,
+ /* key: 0x9b03 */ 0xe97e,
+ /* key: 0x9b04 */ 0xea21,
+ /* key: 0x9b05 */ 0xea22,
+ /* key: 0x9b06 */ 0x7222,
+ /* key: 0x9b07 */ 0xffff,
+ /* key: 0x9b08 */ 0xea23,
+ /* key: 0x9b09 */ 0xea24,
+ /* key: 0x9b0a */ 0xffff,
+ /* key: 0x9b0b */ 0xea25,
+ /* key: 0x9b0c */ 0xea26,
+ /* key: 0x9b0d */ 0xea27,
+ /* key: 0x9b0e */ 0xea28,
+ /* key: 0x9b0f */ 0xffff,
+ /* key: 0x9b10 */ 0xea29,
+ /* key: 0x9b11 */ 0xffff,
+ /* key: 0x9b12 */ 0xea2a,
+ /* key: 0x9b13 */ 0xffff,
+ /* key: 0x9b14 */ 0xffff,
+ /* key: 0x9b15 */ 0xffff,
+ /* key: 0x9b16 */ 0xea2b,
+ /* key: 0x9b17 */ 0xffff,
+ /* key: 0x9b18 */ 0x7223,
+ /* key: 0x9b19 */ 0xea2c,
+ /* key: 0x9b1a */ 0x7224,
+ /* key: 0x9b1b */ 0xea2d,
+ /* key: 0x9b1c */ 0xea2e,
+ /* key: 0x9b1d */ 0xffff,
+ /* key: 0x9b1e */ 0xffff,
+ /* key: 0x9b1f */ 0x7225,
+ /* key: 0x9b20 */ 0xea2f,
+ /* key: 0x9b21 */ 0xffff,
+ /* key: 0x9b22 */ 0x7226,
+ /* key: 0x9b23 */ 0x7227,
+ /* key: 0x9b24 */ 0xffff,
+ /* key: 0x9b25 */ 0x7228,
+ /* key: 0x9b26 */ 0xea30,
+ /* key: 0x9b27 */ 0x7229,
+ /* key: 0x9b28 */ 0x722a,
+ /* key: 0x9b29 */ 0x722b,
+ /* key: 0x9b2a */ 0x722c,
+ /* key: 0x9b2b */ 0xea31,
+ /* key: 0x9b2c */ 0xffff,
+ /* key: 0x9b2d */ 0xea32,
+ /* key: 0x9b2e */ 0x722d,
+ /* key: 0x9b2f */ 0x722e,
+ /* key: 0x9b30 */ 0xffff,
+ /* key: 0x9b31 */ 0x5d35,
+ /* key: 0x9b32 */ 0x722f,
+ /* key: 0x9b33 */ 0xea33,
+ /* key: 0x9b34 */ 0xea34,
+ /* key: 0x9b35 */ 0xea35,
+ /* key: 0x9b36 */ 0xffff,
+ /* key: 0x9b37 */ 0xea36,
+ /* key: 0x9b38 */ 0xffff,
+ /* key: 0x9b39 */ 0xea37,
+ /* key: 0x9b3a */ 0xea38,
+ /* key: 0x9b3b */ 0x6478,
+ /* key: 0x9b3c */ 0x3534,
+ /* key: 0x9b3d */ 0xea39,
+ /* key: 0x9b3e */ 0xffff,
+ /* key: 0x9b3f */ 0xffff,
+ /* key: 0x9b40 */ 0xffff,
+ /* key: 0x9b41 */ 0x3321,
+ /* key: 0x9b42 */ 0x3a32,
+ /* key: 0x9b43 */ 0x7231,
+ /* key: 0x9b44 */ 0x7230,
+ /* key: 0x9b45 */ 0x4c25,
+ /* key: 0x9b46 */ 0xffff,
+ /* key: 0x9b47 */ 0xffff,
+ /* key: 0x9b48 */ 0xea3a,
+ /* key: 0x9b49 */ 0xffff,
+ /* key: 0x9b4a */ 0xffff,
+ /* key: 0x9b4b */ 0xea3b,
+ /* key: 0x9b4c */ 0xea3c,
+ /* key: 0x9b4d */ 0x7233,
+ /* key: 0x9b4e */ 0x7234,
+ /* key: 0x9b4f */ 0x7232,
+ /* key: 0x9b50 */ 0xffff,
+ /* key: 0x9b51 */ 0x7235,
+ /* key: 0x9b52 */ 0xffff,
+ /* key: 0x9b53 */ 0xffff,
+ /* key: 0x9b54 */ 0x4b62,
+ /* key: 0x9b55 */ 0xea3d,
+ /* key: 0x9b56 */ 0xea3e,
+ /* key: 0x9b57 */ 0xea3f,
+ /* key: 0x9b58 */ 0x7236,
+ /* key: 0x9b59 */ 0xffff,
+ /* key: 0x9b5a */ 0x357b,
+ /* key: 0x9b5b */ 0xea40,
+ /* key: 0x9b5c */ 0xffff,
+ /* key: 0x9b5d */ 0xffff,
+ /* key: 0x9b5e */ 0xea41,
+ /* key: 0x9b5f */ 0xffff,
+ /* key: 0x9b60 */ 0xffff,
+ /* key: 0x9b61 */ 0xea42,
+ /* key: 0x9b62 */ 0xffff,
+ /* key: 0x9b63 */ 0xea43,
+ /* key: 0x9b64 */ 0xffff,
+ /* key: 0x9b65 */ 0xea44,
+ /* key: 0x9b66 */ 0xea45,
+ /* key: 0x9b67 */ 0xffff,
+ /* key: 0x9b68 */ 0xea46,
+ /* key: 0x9b69 */ 0xffff,
+ /* key: 0x9b6a */ 0xea47,
+ /* key: 0x9b6b */ 0xea48,
+ /* key: 0x9b6c */ 0xea49,
+ /* key: 0x9b6d */ 0xea4a,
+ /* key: 0x9b6e */ 0xea4b,
+ /* key: 0x9b6f */ 0x4f25,
+ /* key: 0x9b70 */ 0xffff,
+ /* key: 0x9b71 */ 0xffff,
+ /* key: 0x9b72 */ 0xffff,
+ /* key: 0x9b73 */ 0xea4c,
+ /* key: 0x9b74 */ 0x7237,
+ /* key: 0x9b75 */ 0xea4d,
+ /* key: 0x9b76 */ 0xffff,
+ /* key: 0x9b77 */ 0xea4e,
+ /* key: 0x9b78 */ 0xea4f,
+ /* key: 0x9b79 */ 0xea50,
+ /* key: 0x9b7a */ 0xffff,
+ /* key: 0x9b7b */ 0xffff,
+ /* key: 0x9b7c */ 0xffff,
+ /* key: 0x9b7d */ 0xffff,
+ /* key: 0x9b7e */ 0xffff,
+ /* key: 0x9b7f */ 0xea51,
+ /* key: 0x9b80 */ 0xea52,
+ /* key: 0x9b81 */ 0xffff,
+ /* key: 0x9b82 */ 0xffff,
+ /* key: 0x9b83 */ 0x7239,
+ /* key: 0x9b84 */ 0xea53,
+ /* key: 0x9b85 */ 0xea54,
+ /* key: 0x9b86 */ 0xea55,
+ /* key: 0x9b87 */ 0xea56,
+ /* key: 0x9b88 */ 0xffff,
+ /* key: 0x9b89 */ 0xea57,
+ /* key: 0x9b8a */ 0xea58,
+ /* key: 0x9b8b */ 0xea59,
+ /* key: 0x9b8c */ 0xffff,
+ /* key: 0x9b8d */ 0xea5a,
+ /* key: 0x9b8e */ 0x303e,
+ /* key: 0x9b8f */ 0xea5b,
+ /* key: 0x9b90 */ 0xea5c,
+ /* key: 0x9b91 */ 0x723a,
+ /* key: 0x9b92 */ 0x4a2b,
+ /* key: 0x9b93 */ 0x7238,
+ /* key: 0x9b94 */ 0xea5d,
+ /* key: 0x9b95 */ 0xffff,
+ /* key: 0x9b96 */ 0x723b,
+ /* key: 0x9b97 */ 0x723c,
+ /* key: 0x9b98 */ 0xffff,
+ /* key: 0x9b99 */ 0xffff,
+ /* key: 0x9b9a */ 0xea5e,
+ /* key: 0x9b9b */ 0xffff,
+ /* key: 0x9b9c */ 0xffff,
+ /* key: 0x9b9d */ 0xea5f,
+ /* key: 0x9b9e */ 0xea60,
+ /* key: 0x9b9f */ 0x723d,
+ /* key: 0x9ba0 */ 0x723e,
+ /* key: 0x9ba1 */ 0xffff,
+ /* key: 0x9ba2 */ 0xffff,
+ /* key: 0x9ba3 */ 0xffff,
+ /* key: 0x9ba4 */ 0xffff,
+ /* key: 0x9ba5 */ 0xffff,
+ /* key: 0x9ba6 */ 0xea61,
+ /* key: 0x9ba7 */ 0xea62,
+ /* key: 0x9ba8 */ 0x723f,
+ /* key: 0x9ba9 */ 0xea63,
+ /* key: 0x9baa */ 0x4b6e,
+ /* key: 0x9bab */ 0x3b2d,
+ /* key: 0x9bac */ 0xea64,
+ /* key: 0x9bad */ 0x3a7a,
+ /* key: 0x9bae */ 0x412f,
+ /* key: 0x9baf */ 0xffff,
+ /* key: 0x9bb0 */ 0xea65,
+ /* key: 0x9bb1 */ 0xea66,
+ /* key: 0x9bb2 */ 0xea67,
+ /* key: 0x9bb3 */ 0xffff,
+ /* key: 0x9bb4 */ 0x7240,
+ /* key: 0x9bb5 */ 0xffff,
+ /* key: 0x9bb6 */ 0xffff,
+ /* key: 0x9bb7 */ 0xea68,
+ /* key: 0x9bb8 */ 0xea69,
+ /* key: 0x9bb9 */ 0x7243,
+ /* key: 0x9bba */ 0xffff,
+ /* key: 0x9bbb */ 0xea6a,
+ /* key: 0x9bbc */ 0xea6b,
+ /* key: 0x9bbd */ 0xffff,
+ /* key: 0x9bbe */ 0xea6c,
+ /* key: 0x9bbf */ 0xea6d,
+ /* key: 0x9bc0 */ 0x7241,
+ /* key: 0x9bc1 */ 0xea6e,
+ /* key: 0x9bc2 */ 0xffff,
+ /* key: 0x9bc3 */ 0xffff,
+ /* key: 0x9bc4 */ 0xffff,
+ /* key: 0x9bc5 */ 0xffff,
+ /* key: 0x9bc6 */ 0x7244,
+ /* key: 0x9bc7 */ 0xea6f,
+ /* key: 0x9bc8 */ 0xea70,
+ /* key: 0x9bc9 */ 0x3871,
+ /* key: 0x9bca */ 0x7242,
+ /* key: 0x9bcb */ 0xffff,
+ /* key: 0x9bcc */ 0xffff,
+ /* key: 0x9bcd */ 0xffff,
+ /* key: 0x9bce */ 0xea71,
+ /* key: 0x9bcf */ 0x7245,
+ /* key: 0x9bd0 */ 0xea72,
+ /* key: 0x9bd1 */ 0x7246,
+ /* key: 0x9bd2 */ 0x7247,
+ /* key: 0x9bd3 */ 0xffff,
+ /* key: 0x9bd4 */ 0x724b,
+ /* key: 0x9bd5 */ 0xffff,
+ /* key: 0x9bd6 */ 0x3b2a,
+ /* key: 0x9bd7 */ 0xea73,
+ /* key: 0x9bd8 */ 0xea74,
+ /* key: 0x9bd9 */ 0xffff,
+ /* key: 0x9bda */ 0xffff,
+ /* key: 0x9bdb */ 0x4264,
+ /* key: 0x9bdc */ 0xffff,
+ /* key: 0x9bdd */ 0xea75,
+ /* key: 0x9bde */ 0xffff,
+ /* key: 0x9bdf */ 0xea76,
+ /* key: 0x9be0 */ 0xffff,
+ /* key: 0x9be1 */ 0x724c,
+ /* key: 0x9be2 */ 0x7249,
+ /* key: 0x9be3 */ 0x7248,
+ /* key: 0x9be4 */ 0x724a,
+ /* key: 0x9be5 */ 0xea77,
+ /* key: 0x9be6 */ 0xffff,
+ /* key: 0x9be7 */ 0xea78,
+ /* key: 0x9be8 */ 0x375f,
+ /* key: 0x9be9 */ 0xffff,
+ /* key: 0x9bea */ 0xea79,
+ /* key: 0x9beb */ 0xea7a,
+ /* key: 0x9bec */ 0xffff,
+ /* key: 0x9bed */ 0xffff,
+ /* key: 0x9bee */ 0xffff,
+ /* key: 0x9bef */ 0xea7b,
+ /* key: 0x9bf0 */ 0x7250,
+ /* key: 0x9bf1 */ 0x724f,
+ /* key: 0x9bf2 */ 0x724e,
+ /* key: 0x9bf3 */ 0xea7c,
+ /* key: 0x9bf4 */ 0xffff,
+ /* key: 0x9bf5 */ 0x3033,
+ /* key: 0x9bf6 */ 0xffff,
+ /* key: 0x9bf7 */ 0xea7d,
+ /* key: 0x9bf8 */ 0xea7e,
+ /* key: 0x9bf9 */ 0xeb21,
+ /* key: 0x9bfa */ 0xeb22,
+ /* key: 0x9bfb */ 0xffff,
+ /* key: 0x9bfc */ 0xffff,
+ /* key: 0x9bfd */ 0xeb23,
+ /* key: 0x9bfe */ 0xffff,
+ /* key: 0x9bff */ 0xeb24,
+ /* branch: 0x9c0X */ 22112,
+ /* branch: 0x9c1X */ 22128,
+ /* branch: 0x9c2X */ 22144,
+ /* branch: 0x9c3X */ 22160,
+ /* branch: 0x9c4X */ 22176,
+ /* branch: 0x9c5X */ 22192,
+ /* branch: 0x9c6X */ 22208,
+ /* branch: 0x9c7X */ 22224,
+ /* branch: 0x9c8X */ 0,
+ /* branch: 0x9c9X */ 0,
+ /* branch: 0x9caX */ 0,
+ /* branch: 0x9cbX */ 0,
+ /* branch: 0x9ccX */ 0,
+ /* branch: 0x9cdX */ 0,
+ /* branch: 0x9ceX */ 22240,
+ /* branch: 0x9cfX */ 22256,
+ /* key: 0x9c00 */ 0xeb25,
+ /* key: 0x9c01 */ 0xffff,
+ /* key: 0x9c02 */ 0xeb26,
+ /* key: 0x9c03 */ 0xffff,
+ /* key: 0x9c04 */ 0x725a,
+ /* key: 0x9c05 */ 0xffff,
+ /* key: 0x9c06 */ 0x7256,
+ /* key: 0x9c07 */ 0xffff,
+ /* key: 0x9c08 */ 0x7257,
+ /* key: 0x9c09 */ 0x7253,
+ /* key: 0x9c0a */ 0x7259,
+ /* key: 0x9c0b */ 0xeb27,
+ /* key: 0x9c0c */ 0x7255,
+ /* key: 0x9c0d */ 0x3362,
+ /* key: 0x9c0e */ 0xffff,
+ /* key: 0x9c0f */ 0xeb28,
+ /* key: 0x9c10 */ 0x4f4c,
+ /* key: 0x9c11 */ 0xeb29,
+ /* key: 0x9c12 */ 0x7258,
+ /* key: 0x9c13 */ 0x7254,
+ /* key: 0x9c14 */ 0x7252,
+ /* key: 0x9c15 */ 0x7251,
+ /* key: 0x9c16 */ 0xeb2a,
+ /* key: 0x9c17 */ 0xffff,
+ /* key: 0x9c18 */ 0xeb2b,
+ /* key: 0x9c19 */ 0xeb2c,
+ /* key: 0x9c1a */ 0xeb2d,
+ /* key: 0x9c1b */ 0x725c,
+ /* key: 0x9c1c */ 0xeb2e,
+ /* key: 0x9c1d */ 0xffff,
+ /* key: 0x9c1e */ 0xeb2f,
+ /* key: 0x9c1f */ 0xffff,
+ /* key: 0x9c20 */ 0xffff,
+ /* key: 0x9c21 */ 0x725f,
+ /* key: 0x9c22 */ 0xeb30,
+ /* key: 0x9c23 */ 0xeb31,
+ /* key: 0x9c24 */ 0x725e,
+ /* key: 0x9c25 */ 0x725d,
+ /* key: 0x9c26 */ 0xeb32,
+ /* key: 0x9c27 */ 0xeb33,
+ /* key: 0x9c28 */ 0xeb34,
+ /* key: 0x9c29 */ 0xeb35,
+ /* key: 0x9c2a */ 0xeb36,
+ /* key: 0x9c2b */ 0xffff,
+ /* key: 0x9c2c */ 0xffff,
+ /* key: 0x9c2d */ 0x4949,
+ /* key: 0x9c2e */ 0x725b,
+ /* key: 0x9c2f */ 0x3073,
+ /* key: 0x9c30 */ 0x7260,
+ /* key: 0x9c31 */ 0xeb37,
+ /* key: 0x9c32 */ 0x7262,
+ /* key: 0x9c33 */ 0xffff,
+ /* key: 0x9c34 */ 0xffff,
+ /* key: 0x9c35 */ 0xeb38,
+ /* key: 0x9c36 */ 0xeb39,
+ /* key: 0x9c37 */ 0xeb3a,
+ /* key: 0x9c38 */ 0xffff,
+ /* key: 0x9c39 */ 0x336f,
+ /* key: 0x9c3a */ 0x724d,
+ /* key: 0x9c3b */ 0x3137,
+ /* key: 0x9c3c */ 0xffff,
+ /* key: 0x9c3d */ 0xeb3b,
+ /* key: 0x9c3e */ 0x7264,
+ /* key: 0x9c3f */ 0xffff,
+ /* key: 0x9c40 */ 0xffff,
+ /* key: 0x9c41 */ 0xeb3c,
+ /* key: 0x9c42 */ 0xffff,
+ /* key: 0x9c43 */ 0xeb3d,
+ /* key: 0x9c44 */ 0xeb3e,
+ /* key: 0x9c45 */ 0xeb3f,
+ /* key: 0x9c46 */ 0x7263,
+ /* key: 0x9c47 */ 0x7261,
+ /* key: 0x9c48 */ 0x432d,
+ /* key: 0x9c49 */ 0xeb40,
+ /* key: 0x9c4a */ 0xeb41,
+ /* key: 0x9c4b */ 0xffff,
+ /* key: 0x9c4c */ 0xffff,
+ /* key: 0x9c4d */ 0xffff,
+ /* key: 0x9c4e */ 0xeb42,
+ /* key: 0x9c4f */ 0xeb43,
+ /* key: 0x9c50 */ 0xeb44,
+ /* key: 0x9c51 */ 0xffff,
+ /* key: 0x9c52 */ 0x4b70,
+ /* key: 0x9c53 */ 0xeb45,
+ /* key: 0x9c54 */ 0xeb46,
+ /* key: 0x9c55 */ 0xffff,
+ /* key: 0x9c56 */ 0xeb47,
+ /* key: 0x9c57 */ 0x4e5a,
+ /* key: 0x9c58 */ 0xeb48,
+ /* key: 0x9c59 */ 0xffff,
+ /* key: 0x9c5a */ 0x7265,
+ /* key: 0x9c5b */ 0xeb49,
+ /* key: 0x9c5c */ 0xeb50,
+ /* key: 0x9c5d */ 0xeb4a,
+ /* key: 0x9c5e */ 0xeb4b,
+ /* key: 0x9c5f */ 0xeb4c,
+ /* key: 0x9c60 */ 0x7266,
+ /* key: 0x9c61 */ 0xffff,
+ /* key: 0x9c62 */ 0xffff,
+ /* key: 0x9c63 */ 0xeb4d,
+ /* key: 0x9c64 */ 0xffff,
+ /* key: 0x9c65 */ 0xffff,
+ /* key: 0x9c66 */ 0xffff,
+ /* key: 0x9c67 */ 0x7267,
+ /* key: 0x9c68 */ 0xeb52,
+ /* key: 0x9c69 */ 0xeb4e,
+ /* key: 0x9c6a */ 0xeb4f,
+ /* key: 0x9c6b */ 0xeb51,
+ /* key: 0x9c6c */ 0xffff,
+ /* key: 0x9c6d */ 0xffff,
+ /* key: 0x9c6e */ 0xeb53,
+ /* key: 0x9c6f */ 0xffff,
+ /* key: 0x9c70 */ 0xeb54,
+ /* key: 0x9c71 */ 0xffff,
+ /* key: 0x9c72 */ 0xeb55,
+ /* key: 0x9c73 */ 0xffff,
+ /* key: 0x9c74 */ 0xffff,
+ /* key: 0x9c75 */ 0xeb56,
+ /* key: 0x9c76 */ 0x7268,
+ /* key: 0x9c77 */ 0xeb57,
+ /* key: 0x9c78 */ 0x7269,
+ /* key: 0x9c79 */ 0xffff,
+ /* key: 0x9c7a */ 0xffff,
+ /* key: 0x9c7b */ 0xeb58,
+ /* key: 0x9c7c */ 0xffff,
+ /* key: 0x9c7d */ 0xffff,
+ /* key: 0x9c7e */ 0xffff,
+ /* key: 0x9c7f */ 0xffff,
+ /* key: 0x9ce0 */ 0xffff,
+ /* key: 0x9ce1 */ 0xffff,
+ /* key: 0x9ce2 */ 0xffff,
+ /* key: 0x9ce3 */ 0xffff,
+ /* key: 0x9ce4 */ 0xffff,
+ /* key: 0x9ce5 */ 0x443b,
+ /* key: 0x9ce6 */ 0xeb59,
+ /* key: 0x9ce7 */ 0x726a,
+ /* key: 0x9ce8 */ 0xffff,
+ /* key: 0x9ce9 */ 0x4837,
+ /* key: 0x9cea */ 0xffff,
+ /* key: 0x9ceb */ 0x726f,
+ /* key: 0x9cec */ 0x726b,
+ /* key: 0x9ced */ 0xffff,
+ /* key: 0x9cee */ 0xffff,
+ /* key: 0x9cef */ 0xffff,
+ /* key: 0x9cf0 */ 0x726c,
+ /* key: 0x9cf1 */ 0xffff,
+ /* key: 0x9cf2 */ 0xeb5a,
+ /* key: 0x9cf3 */ 0x4b31,
+ /* key: 0x9cf4 */ 0x4c44,
+ /* key: 0x9cf5 */ 0xffff,
+ /* key: 0x9cf6 */ 0x4650,
+ /* key: 0x9cf7 */ 0xeb5b,
+ /* key: 0x9cf8 */ 0xffff,
+ /* key: 0x9cf9 */ 0xeb5c,
+ /* key: 0x9cfa */ 0xffff,
+ /* key: 0x9cfb */ 0xffff,
+ /* key: 0x9cfc */ 0xffff,
+ /* key: 0x9cfd */ 0xffff,
+ /* key: 0x9cfe */ 0xffff,
+ /* key: 0x9cff */ 0xffff,
+ /* branch: 0x9d0X */ 22288,
+ /* branch: 0x9d1X */ 22304,
+ /* branch: 0x9d2X */ 22320,
+ /* branch: 0x9d3X */ 22336,
+ /* branch: 0x9d4X */ 22352,
+ /* branch: 0x9d5X */ 22368,
+ /* branch: 0x9d6X */ 22384,
+ /* branch: 0x9d7X */ 22400,
+ /* branch: 0x9d8X */ 22416,
+ /* branch: 0x9d9X */ 22432,
+ /* branch: 0x9daX */ 22448,
+ /* branch: 0x9dbX */ 22464,
+ /* branch: 0x9dcX */ 22480,
+ /* branch: 0x9ddX */ 22496,
+ /* branch: 0x9deX */ 22512,
+ /* branch: 0x9dfX */ 22528,
+ /* key: 0x9d00 */ 0xffff,
+ /* key: 0x9d01 */ 0xffff,
+ /* key: 0x9d02 */ 0xeb5e,
+ /* key: 0x9d03 */ 0x7270,
+ /* key: 0x9d04 */ 0xffff,
+ /* key: 0x9d05 */ 0xffff,
+ /* key: 0x9d06 */ 0x7271,
+ /* key: 0x9d07 */ 0x463e,
+ /* key: 0x9d08 */ 0x726e,
+ /* key: 0x9d09 */ 0x726d,
+ /* key: 0x9d0a */ 0xffff,
+ /* key: 0x9d0b */ 0xeb5d,
+ /* key: 0x9d0c */ 0xffff,
+ /* key: 0x9d0d */ 0xffff,
+ /* key: 0x9d0e */ 0x322a,
+ /* key: 0x9d0f */ 0xffff,
+ /* key: 0x9d10 */ 0xffff,
+ /* key: 0x9d11 */ 0xeb5f,
+ /* key: 0x9d12 */ 0x7279,
+ /* key: 0x9d13 */ 0xffff,
+ /* key: 0x9d14 */ 0xffff,
+ /* key: 0x9d15 */ 0x7278,
+ /* key: 0x9d16 */ 0xffff,
+ /* key: 0x9d17 */ 0xeb60,
+ /* key: 0x9d18 */ 0xeb61,
+ /* key: 0x9d19 */ 0xffff,
+ /* key: 0x9d1a */ 0xffff,
+ /* key: 0x9d1b */ 0x3175,
+ /* key: 0x9d1c */ 0xeb62,
+ /* key: 0x9d1d */ 0xeb63,
+ /* key: 0x9d1e */ 0xeb64,
+ /* key: 0x9d1f */ 0x7276,
+ /* key: 0x9d20 */ 0xffff,
+ /* key: 0x9d21 */ 0xffff,
+ /* key: 0x9d22 */ 0xffff,
+ /* key: 0x9d23 */ 0x7275,
+ /* key: 0x9d24 */ 0xffff,
+ /* key: 0x9d25 */ 0xffff,
+ /* key: 0x9d26 */ 0x7273,
+ /* key: 0x9d27 */ 0xffff,
+ /* key: 0x9d28 */ 0x337b,
+ /* key: 0x9d29 */ 0xffff,
+ /* key: 0x9d2a */ 0x7272,
+ /* key: 0x9d2b */ 0x3c32,
+ /* key: 0x9d2c */ 0x3229,
+ /* key: 0x9d2d */ 0xffff,
+ /* key: 0x9d2e */ 0xffff,
+ /* key: 0x9d2f */ 0xeb65,
+ /* key: 0x9d30 */ 0xeb66,
+ /* key: 0x9d31 */ 0xffff,
+ /* key: 0x9d32 */ 0xeb67,
+ /* key: 0x9d33 */ 0xeb68,
+ /* key: 0x9d34 */ 0xeb69,
+ /* key: 0x9d35 */ 0xffff,
+ /* key: 0x9d36 */ 0xffff,
+ /* key: 0x9d37 */ 0xffff,
+ /* key: 0x9d38 */ 0xffff,
+ /* key: 0x9d39 */ 0xffff,
+ /* key: 0x9d3a */ 0xeb6a,
+ /* key: 0x9d3b */ 0x3963,
+ /* key: 0x9d3c */ 0xeb6b,
+ /* key: 0x9d3d */ 0xeb6d,
+ /* key: 0x9d3e */ 0x727c,
+ /* key: 0x9d3f */ 0x727b,
+ /* key: 0x9d40 */ 0xffff,
+ /* key: 0x9d41 */ 0x727a,
+ /* key: 0x9d42 */ 0xeb6e,
+ /* key: 0x9d43 */ 0xeb6f,
+ /* key: 0x9d44 */ 0x7277,
+ /* key: 0x9d45 */ 0xeb6c,
+ /* key: 0x9d46 */ 0x727d,
+ /* key: 0x9d47 */ 0xeb70,
+ /* key: 0x9d48 */ 0x727e,
+ /* key: 0x9d49 */ 0xffff,
+ /* key: 0x9d4a */ 0xeb71,
+ /* key: 0x9d4b */ 0xffff,
+ /* key: 0x9d4c */ 0xffff,
+ /* key: 0x9d4d */ 0xffff,
+ /* key: 0x9d4e */ 0xffff,
+ /* key: 0x9d4f */ 0xffff,
+ /* key: 0x9d50 */ 0x7325,
+ /* key: 0x9d51 */ 0x7324,
+ /* key: 0x9d52 */ 0xffff,
+ /* key: 0x9d53 */ 0xeb72,
+ /* key: 0x9d54 */ 0xeb73,
+ /* key: 0x9d55 */ 0xffff,
+ /* key: 0x9d56 */ 0xffff,
+ /* key: 0x9d57 */ 0xffff,
+ /* key: 0x9d58 */ 0xffff,
+ /* key: 0x9d59 */ 0x7326,
+ /* key: 0x9d5a */ 0xffff,
+ /* key: 0x9d5b */ 0xffff,
+ /* key: 0x9d5c */ 0x312d,
+ /* key: 0x9d5d */ 0x7321,
+ /* key: 0x9d5e */ 0x7322,
+ /* key: 0x9d5f */ 0xeb74,
+ /* key: 0x9d60 */ 0x3974,
+ /* key: 0x9d61 */ 0x4c39,
+ /* key: 0x9d62 */ 0xeb76,
+ /* key: 0x9d63 */ 0xeb75,
+ /* key: 0x9d64 */ 0x7323,
+ /* key: 0x9d65 */ 0xeb77,
+ /* key: 0x9d66 */ 0xffff,
+ /* key: 0x9d67 */ 0xffff,
+ /* key: 0x9d68 */ 0xffff,
+ /* key: 0x9d69 */ 0xeb78,
+ /* key: 0x9d6a */ 0xeb79,
+ /* key: 0x9d6b */ 0xeb7a,
+ /* key: 0x9d6c */ 0x4b32,
+ /* key: 0x9d6d */ 0xffff,
+ /* key: 0x9d6e */ 0xffff,
+ /* key: 0x9d6f */ 0x732b,
+ /* key: 0x9d70 */ 0xeb7b,
+ /* key: 0x9d71 */ 0xffff,
+ /* key: 0x9d72 */ 0x7327,
+ /* key: 0x9d73 */ 0xffff,
+ /* key: 0x9d74 */ 0xffff,
+ /* key: 0x9d75 */ 0xffff,
+ /* key: 0x9d76 */ 0xeb7c,
+ /* key: 0x9d77 */ 0xeb7d,
+ /* key: 0x9d78 */ 0xffff,
+ /* key: 0x9d79 */ 0xffff,
+ /* key: 0x9d7a */ 0x732c,
+ /* key: 0x9d7b */ 0xeb7e,
+ /* key: 0x9d7c */ 0xec21,
+ /* key: 0x9d7d */ 0xffff,
+ /* key: 0x9d7e */ 0xec22,
+ /* key: 0x9d7f */ 0xffff,
+ /* key: 0x9d80 */ 0xffff,
+ /* key: 0x9d81 */ 0xffff,
+ /* key: 0x9d82 */ 0xffff,
+ /* key: 0x9d83 */ 0xec23,
+ /* key: 0x9d84 */ 0xec24,
+ /* key: 0x9d85 */ 0xffff,
+ /* key: 0x9d86 */ 0xec25,
+ /* key: 0x9d87 */ 0x7329,
+ /* key: 0x9d88 */ 0xffff,
+ /* key: 0x9d89 */ 0x7328,
+ /* key: 0x9d8a */ 0xec26,
+ /* key: 0x9d8b */ 0xffff,
+ /* key: 0x9d8c */ 0xffff,
+ /* key: 0x9d8d */ 0xec27,
+ /* key: 0x9d8e */ 0xec28,
+ /* key: 0x9d8f */ 0x375c,
+ /* key: 0x9d90 */ 0xffff,
+ /* key: 0x9d91 */ 0xffff,
+ /* key: 0x9d92 */ 0xec29,
+ /* key: 0x9d93 */ 0xec2a,
+ /* key: 0x9d94 */ 0xffff,
+ /* key: 0x9d95 */ 0xec2b,
+ /* key: 0x9d96 */ 0xec2c,
+ /* key: 0x9d97 */ 0xec2d,
+ /* key: 0x9d98 */ 0xec2e,
+ /* key: 0x9d99 */ 0xffff,
+ /* key: 0x9d9a */ 0x732d,
+ /* key: 0x9d9b */ 0xffff,
+ /* key: 0x9d9c */ 0xffff,
+ /* key: 0x9d9d */ 0xffff,
+ /* key: 0x9d9e */ 0xffff,
+ /* key: 0x9d9f */ 0xffff,
+ /* key: 0x9da0 */ 0xffff,
+ /* key: 0x9da1 */ 0xec2f,
+ /* key: 0x9da2 */ 0xffff,
+ /* key: 0x9da3 */ 0xffff,
+ /* key: 0x9da4 */ 0x732e,
+ /* key: 0x9da5 */ 0xffff,
+ /* key: 0x9da6 */ 0xffff,
+ /* key: 0x9da7 */ 0xffff,
+ /* key: 0x9da8 */ 0xffff,
+ /* key: 0x9da9 */ 0x732f,
+ /* key: 0x9daa */ 0xec30,
+ /* key: 0x9dab */ 0x732a,
+ /* key: 0x9dac */ 0xec31,
+ /* key: 0x9dad */ 0xffff,
+ /* key: 0x9dae */ 0xec32,
+ /* key: 0x9daf */ 0x7274,
+ /* key: 0x9db0 */ 0xffff,
+ /* key: 0x9db1 */ 0xec33,
+ /* key: 0x9db2 */ 0x7330,
+ /* key: 0x9db3 */ 0xffff,
+ /* key: 0x9db4 */ 0x4461,
+ /* key: 0x9db5 */ 0xec34,
+ /* key: 0x9db6 */ 0xffff,
+ /* key: 0x9db7 */ 0xffff,
+ /* key: 0x9db8 */ 0x7334,
+ /* key: 0x9db9 */ 0xec35,
+ /* key: 0x9dba */ 0x7335,
+ /* key: 0x9dbb */ 0x7333,
+ /* key: 0x9dbc */ 0xec36,
+ /* key: 0x9dbd */ 0xffff,
+ /* key: 0x9dbe */ 0xffff,
+ /* key: 0x9dbf */ 0xec37,
+ /* key: 0x9dc0 */ 0xffff,
+ /* key: 0x9dc1 */ 0x7332,
+ /* key: 0x9dc2 */ 0x7338,
+ /* key: 0x9dc3 */ 0xec38,
+ /* key: 0x9dc4 */ 0x7331,
+ /* key: 0x9dc5 */ 0xffff,
+ /* key: 0x9dc6 */ 0x7336,
+ /* key: 0x9dc7 */ 0xec39,
+ /* key: 0x9dc8 */ 0xffff,
+ /* key: 0x9dc9 */ 0xec3a,
+ /* key: 0x9dca */ 0xec3b,
+ /* key: 0x9dcb */ 0xffff,
+ /* key: 0x9dcc */ 0xffff,
+ /* key: 0x9dcd */ 0xffff,
+ /* key: 0x9dce */ 0xffff,
+ /* key: 0x9dcf */ 0x7337,
+ /* key: 0x9dd0 */ 0xffff,
+ /* key: 0x9dd1 */ 0xffff,
+ /* key: 0x9dd2 */ 0xffff,
+ /* key: 0x9dd3 */ 0x733a,
+ /* key: 0x9dd4 */ 0xec3c,
+ /* key: 0x9dd5 */ 0xec3d,
+ /* key: 0x9dd6 */ 0xec3e,
+ /* key: 0x9dd7 */ 0xec3f,
+ /* key: 0x9dd8 */ 0xffff,
+ /* key: 0x9dd9 */ 0x7339,
+ /* key: 0x9dda */ 0xec40,
+ /* key: 0x9ddb */ 0xffff,
+ /* key: 0x9ddc */ 0xffff,
+ /* key: 0x9ddd */ 0xffff,
+ /* key: 0x9dde */ 0xec41,
+ /* key: 0x9ddf */ 0xec42,
+ /* key: 0x9de0 */ 0xec43,
+ /* key: 0x9de1 */ 0xffff,
+ /* key: 0x9de2 */ 0xffff,
+ /* key: 0x9de3 */ 0xffff,
+ /* key: 0x9de4 */ 0xffff,
+ /* key: 0x9de5 */ 0xec44,
+ /* key: 0x9de6 */ 0x733c,
+ /* key: 0x9de7 */ 0xec45,
+ /* key: 0x9de8 */ 0xffff,
+ /* key: 0x9de9 */ 0xec46,
+ /* key: 0x9dea */ 0xffff,
+ /* key: 0x9deb */ 0xec47,
+ /* key: 0x9dec */ 0xffff,
+ /* key: 0x9ded */ 0x733d,
+ /* key: 0x9dee */ 0xec48,
+ /* key: 0x9def */ 0x733e,
+ /* key: 0x9df0 */ 0xec49,
+ /* key: 0x9df1 */ 0xffff,
+ /* key: 0x9df2 */ 0x4f49,
+ /* key: 0x9df3 */ 0xec4a,
+ /* key: 0x9df4 */ 0xec4b,
+ /* key: 0x9df5 */ 0xffff,
+ /* key: 0x9df6 */ 0xffff,
+ /* key: 0x9df7 */ 0xffff,
+ /* key: 0x9df8 */ 0x733b,
+ /* key: 0x9df9 */ 0x426b,
+ /* key: 0x9dfa */ 0x3a6d,
+ /* key: 0x9dfb */ 0xffff,
+ /* key: 0x9dfc */ 0xffff,
+ /* key: 0x9dfd */ 0x733f,
+ /* key: 0x9dfe */ 0xec4c,
+ /* key: 0x9dff */ 0xffff,
+ /* branch: 0x9e0X */ 22560,
+ /* branch: 0x9e1X */ 22576,
+ /* branch: 0x9e2X */ 0,
+ /* branch: 0x9e3X */ 0,
+ /* branch: 0x9e4X */ 0,
+ /* branch: 0x9e5X */ 0,
+ /* branch: 0x9e6X */ 0,
+ /* branch: 0x9e7X */ 22592,
+ /* branch: 0x9e8X */ 22608,
+ /* branch: 0x9e9X */ 22624,
+ /* branch: 0x9eaX */ 22640,
+ /* branch: 0x9ebX */ 22656,
+ /* branch: 0x9ecX */ 22672,
+ /* branch: 0x9edX */ 22688,
+ /* branch: 0x9eeX */ 22704,
+ /* branch: 0x9efX */ 22720,
+ /* key: 0x9e00 */ 0xffff,
+ /* key: 0x9e01 */ 0xffff,
+ /* key: 0x9e02 */ 0xec4e,
+ /* key: 0x9e03 */ 0xffff,
+ /* key: 0x9e04 */ 0xffff,
+ /* key: 0x9e05 */ 0xffff,
+ /* key: 0x9e06 */ 0xffff,
+ /* key: 0x9e07 */ 0xec4f,
+ /* key: 0x9e08 */ 0xffff,
+ /* key: 0x9e09 */ 0xffff,
+ /* key: 0x9e0a */ 0xec4d,
+ /* key: 0x9e0b */ 0xffff,
+ /* key: 0x9e0c */ 0xffff,
+ /* key: 0x9e0d */ 0xffff,
+ /* key: 0x9e0e */ 0xec50,
+ /* key: 0x9e0f */ 0xffff,
+ /* key: 0x9e10 */ 0xec51,
+ /* key: 0x9e11 */ 0xec52,
+ /* key: 0x9e12 */ 0xec53,
+ /* key: 0x9e13 */ 0xffff,
+ /* key: 0x9e14 */ 0xffff,
+ /* key: 0x9e15 */ 0xec54,
+ /* key: 0x9e16 */ 0xec55,
+ /* key: 0x9e17 */ 0xffff,
+ /* key: 0x9e18 */ 0xffff,
+ /* key: 0x9e19 */ 0xec56,
+ /* key: 0x9e1a */ 0x7340,
+ /* key: 0x9e1b */ 0x7341,
+ /* key: 0x9e1c */ 0xec57,
+ /* key: 0x9e1d */ 0xec58,
+ /* key: 0x9e1e */ 0x7342,
+ /* key: 0x9e1f */ 0xffff,
+ /* key: 0x9e70 */ 0xffff,
+ /* key: 0x9e71 */ 0xffff,
+ /* key: 0x9e72 */ 0xffff,
+ /* key: 0x9e73 */ 0xffff,
+ /* key: 0x9e74 */ 0xffff,
+ /* key: 0x9e75 */ 0x7343,
+ /* key: 0x9e76 */ 0xffff,
+ /* key: 0x9e77 */ 0xffff,
+ /* key: 0x9e78 */ 0x3834,
+ /* key: 0x9e79 */ 0x7344,
+ /* key: 0x9e7a */ 0xec59,
+ /* key: 0x9e7b */ 0xec5a,
+ /* key: 0x9e7c */ 0xec5b,
+ /* key: 0x9e7d */ 0x7345,
+ /* key: 0x9e7e */ 0xffff,
+ /* key: 0x9e7f */ 0x3c2f,
+ /* key: 0x9e80 */ 0xec5c,
+ /* key: 0x9e81 */ 0x7346,
+ /* key: 0x9e82 */ 0xec5d,
+ /* key: 0x9e83 */ 0xec5e,
+ /* key: 0x9e84 */ 0xec5f,
+ /* key: 0x9e85 */ 0xec60,
+ /* key: 0x9e86 */ 0xffff,
+ /* key: 0x9e87 */ 0xec61,
+ /* key: 0x9e88 */ 0x7347,
+ /* key: 0x9e89 */ 0xffff,
+ /* key: 0x9e8a */ 0xffff,
+ /* key: 0x9e8b */ 0x7348,
+ /* key: 0x9e8c */ 0x7349,
+ /* key: 0x9e8d */ 0xffff,
+ /* key: 0x9e8e */ 0xec62,
+ /* key: 0x9e8f */ 0xec63,
+ /* key: 0x9e90 */ 0xffff,
+ /* key: 0x9e91 */ 0x734c,
+ /* key: 0x9e92 */ 0x734a,
+ /* key: 0x9e93 */ 0x4f3c,
+ /* key: 0x9e94 */ 0xffff,
+ /* key: 0x9e95 */ 0x734b,
+ /* key: 0x9e96 */ 0xec64,
+ /* key: 0x9e97 */ 0x4e6f,
+ /* key: 0x9e98 */ 0xec65,
+ /* key: 0x9e99 */ 0xffff,
+ /* key: 0x9e9a */ 0xffff,
+ /* key: 0x9e9b */ 0xec66,
+ /* key: 0x9e9c */ 0xffff,
+ /* key: 0x9e9d */ 0x734d,
+ /* key: 0x9e9e */ 0xec67,
+ /* key: 0x9e9f */ 0x4e5b,
+ /* key: 0x9ea0 */ 0xffff,
+ /* key: 0x9ea1 */ 0xffff,
+ /* key: 0x9ea2 */ 0xffff,
+ /* key: 0x9ea3 */ 0xffff,
+ /* key: 0x9ea4 */ 0xec68,
+ /* key: 0x9ea5 */ 0x734e,
+ /* key: 0x9ea6 */ 0x477e,
+ /* key: 0x9ea7 */ 0xffff,
+ /* key: 0x9ea8 */ 0xec69,
+ /* key: 0x9ea9 */ 0x734f,
+ /* key: 0x9eaa */ 0x7351,
+ /* key: 0x9eab */ 0xffff,
+ /* key: 0x9eac */ 0xec6a,
+ /* key: 0x9ead */ 0x7352,
+ /* key: 0x9eae */ 0xec6b,
+ /* key: 0x9eaf */ 0xec6c,
+ /* key: 0x9eb0 */ 0xec6d,
+ /* key: 0x9eb1 */ 0xffff,
+ /* key: 0x9eb2 */ 0xffff,
+ /* key: 0x9eb3 */ 0xec6e,
+ /* key: 0x9eb4 */ 0xec6f,
+ /* key: 0x9eb5 */ 0xec70,
+ /* key: 0x9eb6 */ 0xffff,
+ /* key: 0x9eb7 */ 0xffff,
+ /* key: 0x9eb8 */ 0x7350,
+ /* key: 0x9eb9 */ 0x396d,
+ /* key: 0x9eba */ 0x4c4d,
+ /* key: 0x9ebb */ 0x4b63,
+ /* key: 0x9ebc */ 0x5677,
+ /* key: 0x9ebd */ 0xffff,
+ /* key: 0x9ebe */ 0x5d60,
+ /* key: 0x9ebf */ 0x4b7b,
+ /* key: 0x9ec0 */ 0xffff,
+ /* key: 0x9ec1 */ 0xffff,
+ /* key: 0x9ec2 */ 0xffff,
+ /* key: 0x9ec3 */ 0xffff,
+ /* key: 0x9ec4 */ 0x322b,
+ /* key: 0x9ec5 */ 0xffff,
+ /* key: 0x9ec6 */ 0xec71,
+ /* key: 0x9ec7 */ 0xffff,
+ /* key: 0x9ec8 */ 0xec72,
+ /* key: 0x9ec9 */ 0xffff,
+ /* key: 0x9eca */ 0xffff,
+ /* key: 0x9ecb */ 0xec73,
+ /* key: 0x9ecc */ 0x7354,
+ /* key: 0x9ecd */ 0x3550,
+ /* key: 0x9ece */ 0x7355,
+ /* key: 0x9ecf */ 0x7356,
+ /* key: 0x9ed0 */ 0x7357,
+ /* key: 0x9ed1 */ 0xffff,
+ /* key: 0x9ed2 */ 0x3975,
+ /* key: 0x9ed3 */ 0xffff,
+ /* key: 0x9ed4 */ 0x7358,
+ /* key: 0x9ed5 */ 0xec74,
+ /* key: 0x9ed6 */ 0xffff,
+ /* key: 0x9ed7 */ 0xffff,
+ /* key: 0x9ed8 */ 0x6054,
+ /* key: 0x9ed9 */ 0x4c5b,
+ /* key: 0x9eda */ 0xffff,
+ /* key: 0x9edb */ 0x4263,
+ /* key: 0x9edc */ 0x7359,
+ /* key: 0x9edd */ 0x735b,
+ /* key: 0x9ede */ 0x735a,
+ /* key: 0x9edf */ 0xec75,
+ /* key: 0x9ee0 */ 0x735c,
+ /* key: 0x9ee1 */ 0xffff,
+ /* key: 0x9ee2 */ 0xffff,
+ /* key: 0x9ee3 */ 0xffff,
+ /* key: 0x9ee4 */ 0xec76,
+ /* key: 0x9ee5 */ 0x735d,
+ /* key: 0x9ee6 */ 0xffff,
+ /* key: 0x9ee7 */ 0xec77,
+ /* key: 0x9ee8 */ 0x735e,
+ /* key: 0x9ee9 */ 0xffff,
+ /* key: 0x9eea */ 0xffff,
+ /* key: 0x9eeb */ 0xffff,
+ /* key: 0x9eec */ 0xec78,
+ /* key: 0x9eed */ 0xec79,
+ /* key: 0x9eee */ 0xec7a,
+ /* key: 0x9eef */ 0x735f,
+ /* key: 0x9ef0 */ 0xec7b,
+ /* key: 0x9ef1 */ 0xec7c,
+ /* key: 0x9ef2 */ 0xec7d,
+ /* key: 0x9ef3 */ 0xffff,
+ /* key: 0x9ef4 */ 0x7360,
+ /* key: 0x9ef5 */ 0xec7e,
+ /* key: 0x9ef6 */ 0x7361,
+ /* key: 0x9ef7 */ 0x7362,
+ /* key: 0x9ef8 */ 0xed21,
+ /* key: 0x9ef9 */ 0x7363,
+ /* key: 0x9efa */ 0xffff,
+ /* key: 0x9efb */ 0x7364,
+ /* key: 0x9efc */ 0x7365,
+ /* key: 0x9efd */ 0x7366,
+ /* key: 0x9efe */ 0xffff,
+ /* key: 0x9eff */ 0xed22,
+ /* branch: 0x9f0X */ 22752,
+ /* branch: 0x9f1X */ 22768,
+ /* branch: 0x9f2X */ 22784,
+ /* branch: 0x9f3X */ 22800,
+ /* branch: 0x9f4X */ 22816,
+ /* branch: 0x9f5X */ 22832,
+ /* branch: 0x9f6X */ 22848,
+ /* branch: 0x9f7X */ 22864,
+ /* branch: 0x9f8X */ 22880,
+ /* branch: 0x9f9X */ 22896,
+ /* branch: 0x9faX */ 22912,
+ /* branch: 0x9fbX */ 0,
+ /* branch: 0x9fcX */ 0,
+ /* branch: 0x9fdX */ 0,
+ /* branch: 0x9feX */ 0,
+ /* branch: 0x9ffX */ 0,
+ /* key: 0x9f00 */ 0xffff,
+ /* key: 0x9f01 */ 0xffff,
+ /* key: 0x9f02 */ 0xed23,
+ /* key: 0x9f03 */ 0xed24,
+ /* key: 0x9f04 */ 0xffff,
+ /* key: 0x9f05 */ 0xffff,
+ /* key: 0x9f06 */ 0xffff,
+ /* key: 0x9f07 */ 0x7367,
+ /* key: 0x9f08 */ 0x7368,
+ /* key: 0x9f09 */ 0xed25,
+ /* key: 0x9f0a */ 0xffff,
+ /* key: 0x9f0b */ 0xffff,
+ /* key: 0x9f0c */ 0xffff,
+ /* key: 0x9f0d */ 0xffff,
+ /* key: 0x9f0e */ 0x4524,
+ /* key: 0x9f0f */ 0xed26,
+ /* key: 0x9f10 */ 0xed27,
+ /* key: 0x9f11 */ 0xed28,
+ /* key: 0x9f12 */ 0xed29,
+ /* key: 0x9f13 */ 0x385d,
+ /* key: 0x9f14 */ 0xed2a,
+ /* key: 0x9f15 */ 0x736a,
+ /* key: 0x9f16 */ 0xed2b,
+ /* key: 0x9f17 */ 0xed2c,
+ /* key: 0x9f18 */ 0xffff,
+ /* key: 0x9f19 */ 0xed2d,
+ /* key: 0x9f1a */ 0xed2e,
+ /* key: 0x9f1b */ 0xed2f,
+ /* key: 0x9f1c */ 0xffff,
+ /* key: 0x9f1d */ 0xffff,
+ /* key: 0x9f1e */ 0xffff,
+ /* key: 0x9f1f */ 0xed30,
+ /* key: 0x9f20 */ 0x414d,
+ /* key: 0x9f21 */ 0x736b,
+ /* key: 0x9f22 */ 0xed31,
+ /* key: 0x9f23 */ 0xffff,
+ /* key: 0x9f24 */ 0xffff,
+ /* key: 0x9f25 */ 0xffff,
+ /* key: 0x9f26 */ 0xed32,
+ /* key: 0x9f27 */ 0xffff,
+ /* key: 0x9f28 */ 0xffff,
+ /* key: 0x9f29 */ 0xffff,
+ /* key: 0x9f2a */ 0xed33,
+ /* key: 0x9f2b */ 0xed34,
+ /* key: 0x9f2c */ 0x736c,
+ /* key: 0x9f2d */ 0xffff,
+ /* key: 0x9f2e */ 0xffff,
+ /* key: 0x9f2f */ 0xed35,
+ /* key: 0x9f30 */ 0xffff,
+ /* key: 0x9f31 */ 0xed36,
+ /* key: 0x9f32 */ 0xed37,
+ /* key: 0x9f33 */ 0xffff,
+ /* key: 0x9f34 */ 0xed38,
+ /* key: 0x9f35 */ 0xffff,
+ /* key: 0x9f36 */ 0xffff,
+ /* key: 0x9f37 */ 0xed39,
+ /* key: 0x9f38 */ 0xffff,
+ /* key: 0x9f39 */ 0xed3a,
+ /* key: 0x9f3a */ 0xed3b,
+ /* key: 0x9f3b */ 0x4921,
+ /* key: 0x9f3c */ 0xed3c,
+ /* key: 0x9f3d */ 0xed3d,
+ /* key: 0x9f3e */ 0x736d,
+ /* key: 0x9f3f */ 0xed3e,
+ /* key: 0x9f40 */ 0xffff,
+ /* key: 0x9f41 */ 0xed3f,
+ /* key: 0x9f42 */ 0xffff,
+ /* key: 0x9f43 */ 0xed40,
+ /* key: 0x9f44 */ 0xed41,
+ /* key: 0x9f45 */ 0xed42,
+ /* key: 0x9f46 */ 0xed43,
+ /* key: 0x9f47 */ 0xed44,
+ /* key: 0x9f48 */ 0xffff,
+ /* key: 0x9f49 */ 0xffff,
+ /* key: 0x9f4a */ 0x736e,
+ /* key: 0x9f4b */ 0x6337,
+ /* key: 0x9f4c */ 0xffff,
+ /* key: 0x9f4d */ 0xffff,
+ /* key: 0x9f4e */ 0x6c5a,
+ /* key: 0x9f4f */ 0x706d,
+ /* key: 0x9f50 */ 0xffff,
+ /* key: 0x9f51 */ 0xffff,
+ /* key: 0x9f52 */ 0x736f,
+ /* key: 0x9f53 */ 0xed45,
+ /* key: 0x9f54 */ 0x7370,
+ /* key: 0x9f55 */ 0xed46,
+ /* key: 0x9f56 */ 0xed47,
+ /* key: 0x9f57 */ 0xed48,
+ /* key: 0x9f58 */ 0xed49,
+ /* key: 0x9f59 */ 0xffff,
+ /* key: 0x9f5a */ 0xed4a,
+ /* key: 0x9f5b */ 0xffff,
+ /* key: 0x9f5c */ 0xffff,
+ /* key: 0x9f5d */ 0xed4b,
+ /* key: 0x9f5e */ 0xed4c,
+ /* key: 0x9f5f */ 0x7372,
+ /* key: 0x9f60 */ 0x7373,
+ /* key: 0x9f61 */ 0x7374,
+ /* key: 0x9f62 */ 0x4e70,
+ /* key: 0x9f63 */ 0x7371,
+ /* key: 0x9f64 */ 0xffff,
+ /* key: 0x9f65 */ 0xffff,
+ /* key: 0x9f66 */ 0x7375,
+ /* key: 0x9f67 */ 0x7376,
+ /* key: 0x9f68 */ 0xed4d,
+ /* key: 0x9f69 */ 0xed4e,
+ /* key: 0x9f6a */ 0x7378,
+ /* key: 0x9f6b */ 0xffff,
+ /* key: 0x9f6c */ 0x7377,
+ /* key: 0x9f6d */ 0xed4f,
+ /* key: 0x9f6e */ 0xed50,
+ /* key: 0x9f6f */ 0xed51,
+ /* key: 0x9f70 */ 0xed52,
+ /* key: 0x9f71 */ 0xed53,
+ /* key: 0x9f72 */ 0x737a,
+ /* key: 0x9f73 */ 0xed54,
+ /* key: 0x9f74 */ 0xffff,
+ /* key: 0x9f75 */ 0xed55,
+ /* key: 0x9f76 */ 0x737b,
+ /* key: 0x9f77 */ 0x7379,
+ /* key: 0x9f78 */ 0xffff,
+ /* key: 0x9f79 */ 0xffff,
+ /* key: 0x9f7a */ 0xed56,
+ /* key: 0x9f7b */ 0xffff,
+ /* key: 0x9f7c */ 0xffff,
+ /* key: 0x9f7d */ 0xed57,
+ /* key: 0x9f7e */ 0xffff,
+ /* key: 0x9f7f */ 0xffff,
+ /* key: 0x9f80 */ 0xffff,
+ /* key: 0x9f81 */ 0xffff,
+ /* key: 0x9f82 */ 0xffff,
+ /* key: 0x9f83 */ 0xffff,
+ /* key: 0x9f84 */ 0xffff,
+ /* key: 0x9f85 */ 0xffff,
+ /* key: 0x9f86 */ 0xffff,
+ /* key: 0x9f87 */ 0xffff,
+ /* key: 0x9f88 */ 0xffff,
+ /* key: 0x9f89 */ 0xffff,
+ /* key: 0x9f8a */ 0xffff,
+ /* key: 0x9f8b */ 0xffff,
+ /* key: 0x9f8c */ 0xffff,
+ /* key: 0x9f8d */ 0x4e36,
+ /* key: 0x9f8e */ 0xffff,
+ /* key: 0x9f8f */ 0xed58,
+ /* key: 0x9f90 */ 0xed59,
+ /* key: 0x9f91 */ 0xed5a,
+ /* key: 0x9f92 */ 0xed5b,
+ /* key: 0x9f93 */ 0xffff,
+ /* key: 0x9f94 */ 0xed5c,
+ /* key: 0x9f95 */ 0x737c,
+ /* key: 0x9f96 */ 0xed5d,
+ /* key: 0x9f97 */ 0xed5e,
+ /* key: 0x9f98 */ 0xffff,
+ /* key: 0x9f99 */ 0xffff,
+ /* key: 0x9f9a */ 0xffff,
+ /* key: 0x9f9b */ 0xffff,
+ /* key: 0x9f9c */ 0x737d,
+ /* key: 0x9f9d */ 0x6354,
+ /* key: 0x9f9e */ 0xed5f,
+ /* key: 0x9f9f */ 0xffff,
+ /* key: 0x9fa0 */ 0x737e,
+ /* key: 0x9fa1 */ 0xed60,
+ /* key: 0x9fa2 */ 0xed61,
+ /* key: 0x9fa3 */ 0xed62,
+ /* key: 0x9fa4 */ 0xffff,
+ /* key: 0x9fa5 */ 0xed63,
+ /* key: 0x9fa6 */ 0xffff,
+ /* key: 0x9fa7 */ 0xffff,
+ /* key: 0x9fa8 */ 0xffff,
+ /* key: 0x9fa9 */ 0xffff,
+ /* key: 0x9faa */ 0xffff,
+ /* key: 0x9fab */ 0xffff,
+ /* key: 0x9fac */ 0xffff,
+ /* key: 0x9fad */ 0xffff,
+ /* key: 0x9fae */ 0xffff,
+ /* key: 0x9faf */ 0xffff,
+ /* branch: 0xf0XX */ 0,
+ /* branch: 0xf1XX */ 0,
+ /* branch: 0xf2XX */ 0,
+ /* branch: 0xf3XX */ 0,
+ /* branch: 0xf4XX */ 0,
+ /* branch: 0xf5XX */ 0,
+ /* branch: 0xf6XX */ 0,
+ /* branch: 0xf7XX */ 0,
+ /* branch: 0xf8XX */ 0,
+ /* branch: 0xf9XX */ 0,
+ /* branch: 0xfaXX */ 0,
+ /* branch: 0xfbXX */ 0,
+ /* branch: 0xfcXX */ 0,
+ /* branch: 0xfdXX */ 0,
+ /* branch: 0xfeXX */ 0,
+ /* branch: 0xffXX */ 22944,
+ /* branch: 0xff0X */ 22960,
+ /* branch: 0xff1X */ 22976,
+ /* branch: 0xff2X */ 22992,
+ /* branch: 0xff3X */ 23008,
+ /* branch: 0xff4X */ 23024,
+ /* branch: 0xff5X */ 23040,
+ /* branch: 0xff6X */ 23056,
+ /* branch: 0xff7X */ 23072,
+ /* branch: 0xff8X */ 23088,
+ /* branch: 0xff9X */ 23104,
+ /* branch: 0xffaX */ 0,
+ /* branch: 0xffbX */ 0,
+ /* branch: 0xffcX */ 0,
+ /* branch: 0xffdX */ 0,
+ /* branch: 0xffeX */ 23120,
+ /* branch: 0xfffX */ 0,
+ /* key: 0xff00 */ 0xffff,
+ /* key: 0xff01 */ 0x212a,
+ /* key: 0xff02 */ 0xffff,
+ /* key: 0xff03 */ 0x2174,
+ /* key: 0xff04 */ 0x2170,
+ /* key: 0xff05 */ 0x2173,
+ /* key: 0xff06 */ 0x2175,
+ /* key: 0xff07 */ 0xffff,
+ /* key: 0xff08 */ 0x214a,
+ /* key: 0xff09 */ 0x214b,
+ /* key: 0xff0a */ 0x2176,
+ /* key: 0xff0b */ 0x215c,
+ /* key: 0xff0c */ 0x2124,
+ /* key: 0xff0d */ 0xffff,
+ /* key: 0xff0e */ 0x2125,
+ /* key: 0xff0f */ 0x213f,
+ /* key: 0xff10 */ 0x2330,
+ /* key: 0xff11 */ 0x2331,
+ /* key: 0xff12 */ 0x2332,
+ /* key: 0xff13 */ 0x2333,
+ /* key: 0xff14 */ 0x2334,
+ /* key: 0xff15 */ 0x2335,
+ /* key: 0xff16 */ 0x2336,
+ /* key: 0xff17 */ 0x2337,
+ /* key: 0xff18 */ 0x2338,
+ /* key: 0xff19 */ 0x2339,
+ /* key: 0xff1a */ 0x2127,
+ /* key: 0xff1b */ 0x2128,
+ /* key: 0xff1c */ 0x2163,
+ /* key: 0xff1d */ 0x2161,
+ /* key: 0xff1e */ 0x2164,
+ /* key: 0xff1f */ 0x2129,
+ /* key: 0xff20 */ 0x2177,
+ /* key: 0xff21 */ 0x2341,
+ /* key: 0xff22 */ 0x2342,
+ /* key: 0xff23 */ 0x2343,
+ /* key: 0xff24 */ 0x2344,
+ /* key: 0xff25 */ 0x2345,
+ /* key: 0xff26 */ 0x2346,
+ /* key: 0xff27 */ 0x2347,
+ /* key: 0xff28 */ 0x2348,
+ /* key: 0xff29 */ 0x2349,
+ /* key: 0xff2a */ 0x234a,
+ /* key: 0xff2b */ 0x234b,
+ /* key: 0xff2c */ 0x234c,
+ /* key: 0xff2d */ 0x234d,
+ /* key: 0xff2e */ 0x234e,
+ /* key: 0xff2f */ 0x234f,
+ /* key: 0xff30 */ 0x2350,
+ /* key: 0xff31 */ 0x2351,
+ /* key: 0xff32 */ 0x2352,
+ /* key: 0xff33 */ 0x2353,
+ /* key: 0xff34 */ 0x2354,
+ /* key: 0xff35 */ 0x2355,
+ /* key: 0xff36 */ 0x2356,
+ /* key: 0xff37 */ 0x2357,
+ /* key: 0xff38 */ 0x2358,
+ /* key: 0xff39 */ 0x2359,
+ /* key: 0xff3a */ 0x235a,
+ /* key: 0xff3b */ 0x214e,
+ /* key: 0xff3c */ 0xffff,
+ /* key: 0xff3d */ 0x214f,
+ /* key: 0xff3e */ 0x2130,
+ /* key: 0xff3f */ 0x2132,
+ /* key: 0xff40 */ 0x212e,
+ /* key: 0xff41 */ 0x2361,
+ /* key: 0xff42 */ 0x2362,
+ /* key: 0xff43 */ 0x2363,
+ /* key: 0xff44 */ 0x2364,
+ /* key: 0xff45 */ 0x2365,
+ /* key: 0xff46 */ 0x2366,
+ /* key: 0xff47 */ 0x2367,
+ /* key: 0xff48 */ 0x2368,
+ /* key: 0xff49 */ 0x2369,
+ /* key: 0xff4a */ 0x236a,
+ /* key: 0xff4b */ 0x236b,
+ /* key: 0xff4c */ 0x236c,
+ /* key: 0xff4d */ 0x236d,
+ /* key: 0xff4e */ 0x236e,
+ /* key: 0xff4f */ 0x236f,
+ /* key: 0xff50 */ 0x2370,
+ /* key: 0xff51 */ 0x2371,
+ /* key: 0xff52 */ 0x2372,
+ /* key: 0xff53 */ 0x2373,
+ /* key: 0xff54 */ 0x2374,
+ /* key: 0xff55 */ 0x2375,
+ /* key: 0xff56 */ 0x2376,
+ /* key: 0xff57 */ 0x2377,
+ /* key: 0xff58 */ 0x2378,
+ /* key: 0xff59 */ 0x2379,
+ /* key: 0xff5a */ 0x237a,
+ /* key: 0xff5b */ 0x2150,
+ /* key: 0xff5c */ 0x2143,
+ /* key: 0xff5d */ 0x2151,
+ /* key: 0xff5e */ 0xffff,
+ /* key: 0xff5f */ 0xffff,
+ /* key: 0xff60 */ 0xffff,
+ /* key: 0xff61 */ 0xa1,
+ /* key: 0xff62 */ 0xa2,
+ /* key: 0xff63 */ 0xa3,
+ /* key: 0xff64 */ 0xa4,
+ /* key: 0xff65 */ 0xa5,
+ /* key: 0xff66 */ 0xa6,
+ /* key: 0xff67 */ 0xa7,
+ /* key: 0xff68 */ 0xa8,
+ /* key: 0xff69 */ 0xa9,
+ /* key: 0xff6a */ 0xaa,
+ /* key: 0xff6b */ 0xab,
+ /* key: 0xff6c */ 0xac,
+ /* key: 0xff6d */ 0xad,
+ /* key: 0xff6e */ 0xae,
+ /* key: 0xff6f */ 0xaf,
+ /* key: 0xff70 */ 0xb0,
+ /* key: 0xff71 */ 0xb1,
+ /* key: 0xff72 */ 0xb2,
+ /* key: 0xff73 */ 0xb3,
+ /* key: 0xff74 */ 0xb4,
+ /* key: 0xff75 */ 0xb5,
+ /* key: 0xff76 */ 0xb6,
+ /* key: 0xff77 */ 0xb7,
+ /* key: 0xff78 */ 0xb8,
+ /* key: 0xff79 */ 0xb9,
+ /* key: 0xff7a */ 0xba,
+ /* key: 0xff7b */ 0xbb,
+ /* key: 0xff7c */ 0xbc,
+ /* key: 0xff7d */ 0xbd,
+ /* key: 0xff7e */ 0xbe,
+ /* key: 0xff7f */ 0xbf,
+ /* key: 0xff80 */ 0xc0,
+ /* key: 0xff81 */ 0xc1,
+ /* key: 0xff82 */ 0xc2,
+ /* key: 0xff83 */ 0xc3,
+ /* key: 0xff84 */ 0xc4,
+ /* key: 0xff85 */ 0xc5,
+ /* key: 0xff86 */ 0xc6,
+ /* key: 0xff87 */ 0xc7,
+ /* key: 0xff88 */ 0xc8,
+ /* key: 0xff89 */ 0xc9,
+ /* key: 0xff8a */ 0xca,
+ /* key: 0xff8b */ 0xcb,
+ /* key: 0xff8c */ 0xcc,
+ /* key: 0xff8d */ 0xcd,
+ /* key: 0xff8e */ 0xce,
+ /* key: 0xff8f */ 0xcf,
+ /* key: 0xff90 */ 0xd0,
+ /* key: 0xff91 */ 0xd1,
+ /* key: 0xff92 */ 0xd2,
+ /* key: 0xff93 */ 0xd3,
+ /* key: 0xff94 */ 0xd4,
+ /* key: 0xff95 */ 0xd5,
+ /* key: 0xff96 */ 0xd6,
+ /* key: 0xff97 */ 0xd7,
+ /* key: 0xff98 */ 0xd8,
+ /* key: 0xff99 */ 0xd9,
+ /* key: 0xff9a */ 0xda,
+ /* key: 0xff9b */ 0xdb,
+ /* key: 0xff9c */ 0xdc,
+ /* key: 0xff9d */ 0xdd,
+ /* key: 0xff9e */ 0xde,
+ /* key: 0xff9f */ 0xdf,
+ /* key: 0xffe0 */ 0xffff,
+ /* key: 0xffe1 */ 0xffff,
+ /* key: 0xffe2 */ 0xffff,
+ /* key: 0xffe3 */ 0x2131,
+ /* key: 0xffe4 */ 0xffff,
+ /* key: 0xffe5 */ 0x216f,
+ /* key: 0xffe6 */ 0xffff,
+ /* key: 0xffe7 */ 0xffff,
+ /* key: 0xffe8 */ 0xffff,
+ /* key: 0xffe9 */ 0xffff,
+ /* key: 0xffea */ 0xffff,
+ /* key: 0xffeb */ 0xffff,
+ /* key: 0xffec */ 0xffff,
+ /* key: 0xffed */ 0xffff,
+ /* key: 0xffee */ 0xffff,
+ /* key: 0xffef */ 0xffff,
+};
diff --git a/libjava/gnu/gcj/convert/gen-from-JIS.c b/libjava/gnu/gcj/convert/gen-from-JIS.c
index c49b8945ec3..4df25bc5444 100644
--- a/libjava/gnu/gcj/convert/gen-from-JIS.c
+++ b/libjava/gnu/gcj/convert/gen-from-JIS.c
@@ -16,6 +16,11 @@ struct chval
#define MAP(B1, B2, C) { B1, B2, C },
+struct chval chtab_0201[] = {
+#include "JIS0201.h"
+ { 255, 255, 0}
+};
+
struct chval chtab_0208[] = {
#include "JIS0208.h"
{ 255, 255, 0}
@@ -50,9 +55,9 @@ int
main(int argc, char** argv)
{
FILE *out = stdout;
- unsigned min1 = 256, max1 = 0, min2 = 256, max2 = 0, count = 0;
- unsigned short low1_uc = 0xFFFF, high1_uc = 0;
- unsigned short low2_uc = 0xFFFF, high2_uc = 0;
+ int min1 = 256, max1 = 0, min2 = 256, max2 = 0, count = 0;
+ int low1_uc = 0xFFFF, high1_uc = 0;
+ int low2_uc = 0xFFFF, high2_uc = 0;
int i; int row, col;
if (strcmp (argv[1], "JIS0208") == 0)
chtab = chtab_0208;
@@ -61,14 +66,26 @@ main(int argc, char** argv)
else if (strcmp (argv[1], "toJIS") == 0)
{
int i;
- int count = sizeof(sorted)/sizeof(struct chval);
- qsort (sorted, count, sizeof(struct chval),
- compare);
- for (i = 0; i < count; i++)
+ for (i = 0; chtab_0201[i].b1 != 255; i++)
+ {
+ enter(chtab_0201[i].uc, chtab_0201[i].b2);
+ }
+ for (i = 0; i < 0x20; i++)
+ {
+ enter (i, i);
+ }
+ enter (127, 127);
+ for (i = 0; chtab_0208[i].b1 != 255; i++)
+ {
+ enter(chtab_0208[i].uc,
+ (chtab_0208[i].b1 << 8) | chtab_0208[i].b2);
+ }
+ for (i = 0; chtab_0212[i].b1 != 255; i++)
{
- fprintf (out, " 0x%04x -> 0x%02x, 0x%02x\n",
- sorted[i].uc, sorted[i].b1, sorted[i].b2);
+ enter(chtab_0212[i].uc,
+ 0x8000 | (chtab_0212[i].b1 << 8) | chtab_0212[i].b2);
}
+ print_table ("Unicode_to_JIS", stdout);
exit(0);
}
else
@@ -111,7 +128,7 @@ main(int argc, char** argv)
{
if (row == chtab[i].b1 && col == chtab[i].b2)
{
- unsigned uc = chtab[i].uc;
+ int uc = chtab[i].uc;
if (uc < 0x2000)
{
if (uc > high1_uc)
diff --git a/libjava/gnu/gcj/convert/make-trie.c b/libjava/gnu/gcj/convert/make-trie.c
new file mode 100644
index 00000000000..49c85fbe83b
--- /dev/null
+++ b/libjava/gnu/gcj/convert/make-trie.c
@@ -0,0 +1,176 @@
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+typedef struct trie_node
+{
+ int key;
+ int level;
+ int position;
+ union
+ {
+ int value;
+ struct trie_node *node;
+ } u[16];
+} trie_node;
+
+trie_node *
+make_node ()
+{
+ trie_node *node = (trie_node *) malloc (sizeof(trie_node));
+ if (node == NULL)
+ abort();
+ return node;
+}
+
+trie_node *
+make_leaf_node ()
+{
+ trie_node *node = make_node ();
+ int i = 16;
+ while (--i >= 0)
+ node->u[i].value = -1;
+ return node;
+}
+
+trie_node *
+make_branch_node ()
+{
+ trie_node *node = make_node ();
+ int i = 16;
+ while (--i >= 0)
+ node->u[i].node = NULL;
+ return node;
+}
+
+
+trie_node *table = NULL;
+
+void
+enter (int key, int value)
+{
+ trie_node **ptr = &table;
+ int shift = 12;
+ for (; shift > 0; shift -= 4)
+ {
+ if (*ptr == NULL)
+ {
+ *ptr = make_branch_node ();
+ (*ptr)->key = key & (0xFFFF << (shift + 4));
+ (*ptr)->level = shift / 4;
+ }
+ ptr = &(*ptr)->u[(key >> shift) & 0xF].node;
+ }
+ if (*ptr == NULL)
+ {
+ *ptr = make_leaf_node ();
+ (*ptr)->key = key & 0xFFF0;
+ (*ptr)->level = 0;
+ }
+ if ((*ptr)->u[key & 0xF].value != -1
+ && (*ptr)->u[key & 0xF].value != value)
+ fprintf(stderr, "duplicate value for key: %d, %d!\n", key, value);
+ (*ptr)->u[key & 0xF].value = value;
+}
+
+int assigned = 0;
+
+void
+assign (trie_node *node, int level)
+{
+ int i;
+ if (node == NULL)
+ return;
+ if (node->level != level)
+ abort();
+ node->position = assigned;
+ assigned++;
+ if (level == 0)
+ return;
+ for (i = 0; i < 16; i++)
+ {
+ assign (node->u[i].node, level-1);
+ }
+}
+
+int next_node_index_toprint = 0;
+
+void
+print (trie_node *node, int index, int level, FILE *out)
+{
+ int i;
+ if (node->key != index || node->level != level)
+ abort();
+ if (level == 0) /* leaf node */
+ {
+ for (i = 0; i < 16; i++)
+ {
+ int node_index = index | (i << (level * 4));
+ if (node_index < next_node_index_toprint)
+ abort();
+ if (node->u[i].value == -1)
+ fprintf (out, " /* key: 0x%x */ 0xffff,\n", node_index);
+ else
+ fprintf (out, " /* key: 0x%x */ 0x%x,\n",
+ node_index, node->u[i].value);
+ next_node_index_toprint = node_index + 1;
+ }
+ }
+ else
+ {
+ for (i = 0; i < 16; i++)
+ {
+ int node_index = index | (i << (level * 4));
+ fprintf (out, " /* branch: 0x%0*x%.*s */ ",
+ 4 - level, node_index >> ( 4 * level),
+ level, "XXXX");
+ if (node->u[i].node == NULL)
+ fprintf (out, "0,\n");
+ else
+ fprintf (out, "%d,\n", 16 * node->u[i].node->position);
+ }
+
+ for (i = 0; i < 16; i++)
+ {
+ int node_index = index | (i << (level * 4));
+ if (node->u[i].node != NULL)
+ print (node->u[i].node, node_index, level-1, out);
+ }
+ }
+}
+
+void
+print_table (char *name, FILE *out)
+{
+ assign (table, 3);
+
+ fprintf(out, "/* This file is automatically generated. */\n");
+ fprintf(out, "unsigned short %s[] = {\n", name);
+ print (table, 0x0000, 3, out);
+ fprintf(out, "};\n");
+}
+
+#if 0
+int
+main (int argc, char **argv)
+{
+ int count = 0;
+ for (;;)
+ {
+ int key, value;
+ int i = scanf (" 0x%x 0x%x", &key, &value);
+ if (i < 2)
+ break;
+ count++;
+ enter (key, value);
+ }
+ return 0;
+}
+#endif
diff --git a/libjava/gnu/gcj/convert/natInput_EUCJIS.cc b/libjava/gnu/gcj/convert/natInput_EUCJIS.cc
index 68e4caed2c0..4c62818464d 100644
--- a/libjava/gnu/gcj/convert/natInput_EUCJIS.cc
+++ b/libjava/gnu/gcj/convert/natInput_EUCJIS.cc
@@ -31,7 +31,7 @@ gnu::gcj::convert::Input_EUCJIS::read(jcharArray outbuffer, jint outpos,
{
if (b < 128)
{
-#if 0
+#if 1
// Technically, we should translate 0x5c to Yen symbol;
// in practice, it is not clear.
if (b == 0x5c)
diff --git a/libjava/gnu/gcj/convert/natInput_SJIS.cc b/libjava/gnu/gcj/convert/natInput_SJIS.cc
new file mode 100644
index 00000000000..59ad532ec82
--- /dev/null
+++ b/libjava/gnu/gcj/convert/natInput_SJIS.cc
@@ -0,0 +1,76 @@
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+#include <config.h>
+#include <cni.h>
+#include <gnu/gcj/convert/Input_SJIS.h>
+
+#define ERROR_CHAR 0xFFFD
+
+extern unsigned short JIS0208_to_Unicode[84][94];
+extern unsigned short JIS0212_to_Unicode[76][94];
+
+jint
+gnu::gcj::convert::Input_SJIS::read(jcharArray outbuffer, jint outpos,
+ jint outlength)
+{
+ jint start_outpos = outpos;
+ for (;;)
+ {
+ if (outpos >= outlength)
+ break;
+ if (inpos >= inlength)
+ break;
+ int b = ((unsigned char*) elements(inbuffer))[inpos++];
+ if (first_byte == 0)
+ {
+ if (b < 128)
+ {
+#if 1
+ // Technically, we should translate 0x5c to Yen symbol;
+ // in practice, it is not clear.
+ if (b == 0x5c)
+ b = 0x00A5; // Yen sign.
+#endif
+ elements(outbuffer)[outpos++] = (char) b;
+ }
+ else if (b >= 0xA1 && b <= 0xDF)
+ {
+ b += 0xFF61 - 0xA1;
+ elements(outbuffer)[outpos++] = b;
+ }
+ else
+ first_byte = b;
+ }
+ else
+ {
+ // From Lunde: "CJKV Informatio Processing", O'Reilly, 1999, p 420:
+ bool adjust = b < 159;
+ int rowOffset = first_byte < 160 ? 112 : 176;
+ int cellOffset = adjust ? (b > 127 ? 32 : 31) : 126;
+ first_byte = ((first_byte - rowOffset) << 1) - adjust;
+ b -= cellOffset;
+
+ first_byte -= 33;
+ b -= 33;
+
+ if ((unsigned) first_byte >= 84 || (unsigned) b >= 94)
+ b = ERROR_CHAR;
+ else
+ {
+ b = JIS0208_to_Unicode[first_byte][b];
+ if (b == 0)
+ b = ERROR_CHAR;
+ }
+ elements(outbuffer)[outpos++] = b;
+
+ first_byte = 0;
+ }
+ }
+ return outpos - start_outpos;
+}
diff --git a/libjava/gnu/gcj/convert/natOutput_EUCJIS.cc b/libjava/gnu/gcj/convert/natOutput_EUCJIS.cc
new file mode 100644
index 00000000000..585e56b25c5
--- /dev/null
+++ b/libjava/gnu/gcj/convert/natOutput_EUCJIS.cc
@@ -0,0 +1,102 @@
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+#include <config.h>
+#include <cni.h>
+#include <gnu/gcj/convert/Output_EUCJIS.h>
+
+/* A trie structure to map unicode values to JIS codes.
+ * code == -1: the character is undefined.
+ * code >= 0 && code < 128: JIS-Roman - mostly Ascii.
+ * code >= 128 && code < 256: Half-width Katakana.
+ * code >= 256 && code < 0x8000: JIS X 0208:1997.
+ * code >= 0x8000 && code < 0xFFFF: JIX X 0212-1990.
+ */
+
+extern unsigned short Unicode_to_JIS[];
+
+int
+trie_lookup (unsigned short *trie, unsigned short key)
+{
+ unsigned short branch = trie[(key >> 12) & 0xf];
+ if (branch == 0)
+ return -1;
+ branch = trie[branch + ((key >> 8) & 0xf)];
+ if (branch == 0)
+ return -1;
+ branch = trie[branch + ((key >> 4) & 0xf)];
+ if (branch == 0)
+ return -1;
+ return trie[branch + (key & 0xf)];
+}
+
+static jint
+convert_TO_EUCJIS (gnu::gcj::convert::Output_EUCJIS *encoder,
+ jchar *ptr, jint inlength)
+{
+ int orig_inlength = inlength;
+ jint outbuf_length = encoder->buf->length;
+ for (;;)
+ {
+ if (encoder->count >= outbuf_length)
+ break;
+ if (encoder->pending1 >= 0)
+ {
+ elements(encoder->buf)[encoder->count++] = encoder->pending1;
+ encoder->pending1 = encoder->pending2;
+ encoder->pending2 = -1;
+ continue;
+ }
+ if (inlength == 0)
+ break;
+ jchar ch = *ptr++;
+ inlength--;
+ unsigned short val = trie_lookup(Unicode_to_JIS, ch);
+ if (val < 0x80)
+ {
+ if (val == 0xffff)
+ val = '?';
+ }
+ else if (val <= 0xFF)
+ {
+ encoder->pending1 = val;
+ encoder->pending2 = -1;
+ val = 0x8e;
+ }
+ else if (val < 0x8000)
+ {
+ val |= 0x8080;
+ encoder->pending1 = val & 0xff;
+ val = val >> 8;
+ encoder->pending2 = -1;
+ }
+ else
+ {
+ val |= 0x8080;
+ encoder->pending1 = val >> 8;
+ encoder->pending2 = val & 0xff;
+ val = 0x8f;
+ }
+ elements(encoder->buf)[encoder->count++] = val;
+ }
+ return orig_inlength - inlength;
+}
+
+jint
+gnu::gcj::convert::Output_EUCJIS::write (jcharArray inbuffer,
+ jint inpos, jint inlength)
+{
+ return convert_TO_EUCJIS(this, &elements(inbuffer)[inpos], inlength);
+}
+
+jint
+gnu::gcj::convert::Output_EUCJIS::write (jstring str, jint inpos,
+ jint inlength, jcharArray)
+{
+ return convert_TO_EUCJIS(this, _Jv_GetStringChars(str)+inpos, inlength);
+}
diff --git a/libjava/gnu/gcj/convert/natOutput_SJIS.cc b/libjava/gnu/gcj/convert/natOutput_SJIS.cc
new file mode 100644
index 00000000000..66be27b4635
--- /dev/null
+++ b/libjava/gnu/gcj/convert/natOutput_SJIS.cc
@@ -0,0 +1,72 @@
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+#include <config.h>
+#include <cni.h>
+#include <gnu/gcj/convert/Output_SJIS.h>
+
+extern unsigned short Unicode_to_JIS[];
+
+extern int trie_lookup (unsigned short *trie, unsigned short key);
+
+static jint
+convert_TO_SJIS (gnu::gcj::convert::Output_SJIS *encoder,
+ jchar *ptr, jint inlength)
+{
+ int orig_inlength = inlength;
+ jint outbuf_length = encoder->buf->length;
+ for (;;)
+ {
+ if (encoder->count >= outbuf_length)
+ break;
+ if (encoder->pending >= 0)
+ {
+ elements(encoder->buf)[encoder->count++] = encoder->pending;
+ encoder->pending = -1;
+ continue;
+ }
+ if (inlength == 0)
+ break;
+ jchar ch = *ptr++;
+ inlength--;
+ unsigned short val = trie_lookup(Unicode_to_JIS, ch);
+ if (val < 0xFF)
+ {
+ if (val == 0xffff)
+ val = '?';
+ }
+ else
+ {
+ int b1 = val >> 8;
+ int b2 = val & 0xff;
+ // From Lunde: "CJKV Informatio Processing", O'Reilly, 1999:
+ int rowOffset = b1 < 95 ? 112 : 176;
+ int cellOffset = (b1 & 1) != 0 ? (b2 > 95 ? 32 : 31) : 126;
+ b1 = ((b1 + 1) >> 1) + rowOffset;
+ b2 += cellOffset;
+ val = b1;
+ encoder->pending = b2;
+ }
+ elements(encoder->buf)[encoder->count++] = val;
+ }
+ return orig_inlength - inlength;
+}
+
+jint
+gnu::gcj::convert::Output_SJIS::write (jcharArray inbuffer,
+ jint inpos, jint inlength)
+{
+ return convert_TO_SJIS(this, &elements(inbuffer)[inpos], inlength);
+}
+
+jint
+gnu::gcj::convert::Output_SJIS::write (jstring str, jint inpos,
+ jint inlength, jcharArray)
+{
+ return convert_TO_SJIS(this, _Jv_GetStringChars(str)+inpos, inlength);
+}
diff --git a/libjava/gnu/gcj/protocol/file/Connection.java b/libjava/gnu/gcj/protocol/file/Connection.java
new file mode 100644
index 00000000000..7ad7ca0d659
--- /dev/null
+++ b/libjava/gnu/gcj/protocol/file/Connection.java
@@ -0,0 +1,169 @@
+// Connection.java - Implementation of URLConnection for file protocol.
+
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+package gnu.gcj.protocol.file;
+
+import java.net.*;
+import java.io.*;
+import java.util.Vector;
+import java.util.Hashtable;
+import java.util.Enumeration;
+
+/**
+ * @author Warren Levy <warrenl@cygnus.com>
+ * @date April 13, 1999.
+ */
+
+/**
+ * Written using on-line Java Platform 1.2 API Specification, as well
+ * as "The Java Class Libraries", 2nd edition (Addison-Wesley, 1998).
+ * Status: Minimal subset of functionality.
+ */
+
+class Connection extends URLConnection
+{
+ private Hashtable hdrHash = new Hashtable();
+ private Vector hdrVec = new Vector();
+ private boolean gotHeaders = false;
+ private File fileIn;
+
+ public Connection(URL url)
+ {
+ super(url);
+ }
+
+ // Implementation of abstract method.
+ public void connect() throws IOException
+ {
+ // Call is ignored if already connected.
+ if (connected)
+ return;
+
+ // If not connected, then file needs to be openned.
+ fileIn = new File(url.getFile());
+ connected = true;
+ }
+
+ public InputStream getInputStream() throws IOException
+ {
+ if (!connected)
+ connect();
+
+ if (! doInput)
+ throw new ProtocolException("Can't open InputStream if doInput is false");
+ return new BufferedInputStream(new FileInputStream(fileIn));
+ }
+
+ // Override default method in URLConnection.
+ public OutputStream getOutputStream() throws IOException
+ {
+ if (!connected)
+ connect();
+
+ if (! doOutput)
+ throw new
+ ProtocolException("Can't open OutputStream if doOutput is false");
+ return new BufferedOutputStream(new FileOutputStream(fileIn));
+ }
+
+ // Override default method in URLConnection.
+ public String getHeaderField(String name)
+ {
+ try
+ {
+ getHeaders();
+ }
+ catch (IOException x)
+ {
+ return null;
+ }
+ return (String) hdrHash.get(name.toLowerCase());
+ }
+
+ // Override default method in URLConnection.
+ public String getHeaderField(int n)
+ {
+ try
+ {
+ getHeaders();
+ }
+ catch (IOException x)
+ {
+ return null;
+ }
+ if (n < hdrVec.size())
+ return getField((String) hdrVec.elementAt(n));
+
+ return null;
+ }
+
+ // Override default method in URLConnection.
+ public String getHeaderFieldKey(int n)
+ {
+ try
+ {
+ getHeaders();
+ }
+ catch (IOException x)
+ {
+ return null;
+ }
+ if (n < hdrVec.size())
+ return getKey((String) hdrVec.elementAt(n));
+
+ return null;
+ }
+
+ private String getKey(String str)
+ {
+ if (str == null)
+ return null;
+ int index = str.indexOf(':');
+ if (index >= 0)
+ return str.substring(0, index);
+ else
+ return null;
+ }
+
+ private String getField(String str)
+ {
+ if (str == null)
+ return null;
+ int index = str.indexOf(':');
+ if (index >= 0)
+ return str.substring(index + 1).trim();
+ else
+ return str;
+ }
+
+ private void getHeaders() throws IOException
+ {
+ if (gotHeaders)
+ return;
+ gotHeaders = true;
+
+ connect();
+
+ // Yes, it is overkill to use the hash table and vector here since
+ // we're only putting one header in the file, but in case we need
+ // to add others later and for consistency, we'll implement it this way.
+
+ // Add the only header we know about right now: Content-length.
+ long len = fileIn.length();
+ String line = "Content-length: " + len;
+ hdrVec.addElement(line);
+
+ // The key will never be null in this scenario since we build up the
+ // headers ourselves. If we ever rely on getting a header from somewhere
+ // else, then we may have to check if the result of getKey() is null.
+ String key = getKey(line);
+ hdrHash.put(key.toLowerCase(), Long.toString(len));
+ }
+}
diff --git a/libjava/gnu/gcj/protocol/file/Handler.java b/libjava/gnu/gcj/protocol/file/Handler.java
new file mode 100644
index 00000000000..de7d79b35d0
--- /dev/null
+++ b/libjava/gnu/gcj/protocol/file/Handler.java
@@ -0,0 +1,49 @@
+// Handler.java - URLStreamHandler for file protocol.
+
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+package gnu.gcj.protocol.file;
+
+import java.net.URL;
+import java.net.URLConnection;
+import java.net.URLStreamHandler;
+import java.io.IOException;
+
+/**
+ * @author Warren Levy <warrenl@cygnus.com>
+ * @date April 13, 1999.
+ */
+
+/**
+ * Written using on-line Java Platform 1.2 API Specification, as well
+ * as "The Java Class Libraries", 2nd edition (Addison-Wesley, 1998).
+ * Status: Minimal functionality.
+ */
+
+public class Handler extends URLStreamHandler
+{
+ protected URLConnection openConnection(URL url) throws IOException
+ {
+ // If a hostname is set, then we need to switch protocols to ftp
+ // in order to transfer this from the remote host.
+ if (! url.getHost().equals(""))
+ {
+ // Reset the protocol (and implicitly the handler) for this URL.
+ // Then have the URL attempt the connection again, as it will
+ // get the changed handler the next time around.
+ url.set("ftp", url.getHost(), url.getPort(), url.getFile(),
+ url.getRef());
+ // Until the ftp protocol handler is written, this will cause
+ // a NullPointerException.
+ return url.openConnection();
+ }
+
+ return new Connection(url);
+ }
+}
diff --git a/libjava/gnu/gcj/protocol/http/Connection.java b/libjava/gnu/gcj/protocol/http/Connection.java
index aee6fdd3e57..e76aa772a13 100644
--- a/libjava/gnu/gcj/protocol/http/Connection.java
+++ b/libjava/gnu/gcj/protocol/http/Connection.java
@@ -135,6 +135,8 @@ class Connection extends HttpURLConnection
if (!connected)
connect();
+ if (! doInput)
+ throw new ProtocolException("Can't open InputStream if doInput is false");
if (bufferedIn == null)
bufferedIn = new BufferedInputStream(sock.getInputStream());
return bufferedIn;
@@ -146,6 +148,9 @@ class Connection extends HttpURLConnection
if (!connected)
connect();
+ if (! doOutput)
+ throw new
+ ProtocolException("Can't open OutputStream if doOutput is false");
return sock.getOutputStream();
}
diff --git a/libjava/gnu/gcj/text/LocaleData_en.java b/libjava/gnu/gcj/text/LocaleData_en.java
index df5a0de8a40..f21f7cef0ce 100644
--- a/libjava/gnu/gcj/text/LocaleData_en.java
+++ b/libjava/gnu/gcj/text/LocaleData_en.java
@@ -65,7 +65,13 @@ public final class LocaleData_en extends ListResourceBundle
{ "months", monthsDefault },
{ "shortMonths", shortMonthsDefault },
{ "shortWeekdays", shortWeekdaysDefault },
- { "weekdays", weekdaysDefault }
+ { "weekdays", weekdaysDefault },
+
+ // For RuleBasedCollator.
+ // FIXME: this is nowhere near complete.
+ // In particular we must mark accents as ignorable,
+ // and probably other things as well.
+ { "collatorRule", "< 0 < 1 < 2 < 3 < 4 < 5 < 6 < 7 < 8 < 9 < a,A < b,B < c,C < d,D < e,E < f,F < g,G < h,H < i,I < j,J < k,K < l,L < m,M < n,N < o,O < p,P < q,Q < r,R < s,S < t,T < u,U < v,V < w,W < x,X < y,Y < z,Z" }
};
protected Object[][] getContents ()
diff --git a/libjava/gnu/gcj/util/EnumerationChain.java b/libjava/gnu/gcj/util/EnumerationChain.java
new file mode 100644
index 00000000000..6828439d530
--- /dev/null
+++ b/libjava/gnu/gcj/util/EnumerationChain.java
@@ -0,0 +1,52 @@
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+package gnu.gcj.util;
+
+import java.util.Enumeration;
+import java.util.NoSuchElementException;
+
+public class EnumerationChain implements Enumeration
+{
+ private Enumeration first_;
+ private Enumeration second_;
+
+ public EnumerationChain (Enumeration first, Enumeration second)
+ {
+ if (first == null
+ || second == null)
+ throw new NullPointerException();
+
+ first_ = first;
+ second_ = second;
+ }
+
+ public synchronized boolean hasMoreElements()
+ {
+ if (first_ == null)
+ return false;
+ else
+ return first_.hasMoreElements();
+ }
+
+ public synchronized Object nextElement() throws NoSuchElementException
+ {
+ while (first_ != null)
+ {
+ if (! first_.hasMoreElements())
+ {
+ first_ = second_;
+ second_ = null;
+ }
+ else
+ return first_.nextElement();
+ }
+
+ throw new NoSuchElementException();
+ }
+}
diff --git a/libjava/include/config.h.in b/libjava/include/config.h.in
index 7575b771a3d..cbef5f162b5 100644
--- a/libjava/include/config.h.in
+++ b/libjava/include/config.h.in
@@ -40,9 +40,12 @@
/* Define if you have strerror. */
#undef HAVE_STRERROR
-/* Define if you have __int32_t and __uint32_t. */
+/* Define if you have int32_t and uint32_t. */
#undef HAVE_INT32_DEFINED
+/* Define if you have u_int32_t */
+#undef HAVE_BSD_INT32_DEFINED
+
/* Define if you're running eCos. */
#undef ECOS
@@ -88,6 +91,9 @@
/* Define if global `timezone' exists. */
#undef HAVE_TIMEZONE
+/* Define to version of GCJ in use. */
+#undef GCJVERSION
+
/* Define if you have the appropriate function. */
#undef HAVE_ACCESS
#undef HAVE_STAT
@@ -205,12 +211,18 @@
/* Define if you have the <arpa/inet.h> header file. */
#undef HAVE_ARPA_INET_H
+/* Define if you have the <bstring.h> header file. */
+#undef HAVE_BSTRING_H
+
/* Define if you have the <dirent.h> header file. */
#undef HAVE_DIRENT_H
/* Define if you have the <fcntl.h> header file. */
#undef HAVE_FCNTL_H
+/* Define if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
/* Define if you have the <netdb.h> header file. */
#undef HAVE_NETDB_H
@@ -220,6 +232,12 @@
/* Define if you have the <pwd.h> header file. */
#undef HAVE_PWD_H
+/* Define if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define if you have the <sys/config.h> header file. */
+#undef HAVE_SYS_CONFIG_H
+
/* Define if you have the <sys/filio.h> header file. */
#undef HAVE_SYS_FILIO_H
@@ -250,3 +268,9 @@
/* Version number of package */
#undef VERSION
+/* Define if gethostbyname_r is only declared if _REENTRANT is defined */
+#undef GETHOSTBYNAME_R_NEEDS_REENTRANT
+
+/* Define if struct hostent_data is defined in netdb.h */
+#undef HAVE_STRUCT_HOSTENT_DATA
+
diff --git a/libjava/include/default-signal.h b/libjava/include/default-signal.h
new file mode 100644
index 00000000000..71545c06aca
--- /dev/null
+++ b/libjava/include/default-signal.h
@@ -0,0 +1,21 @@
+// default-signal.h - Catch runtime signals and turn them into exceptions.
+
+/* Copyright (C) 1998, 1999 Cygnus Solutions
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+#ifndef JAVA_SIGNAL_H
+#define JAVA_SIGNAL_H 1
+
+#undef HANDLE_SEGV
+#undef HANDLE_FPE
+
+#define INIT_SEGV do {} while (0)
+#define INIT_FPE do {} while (0)
+
+#endif /* JAVA_SIGNAL_H */
+
diff --git a/libjava/include/i386-signal.h b/libjava/include/i386-signal.h
new file mode 100644
index 00000000000..ddb66bea125
--- /dev/null
+++ b/libjava/include/i386-signal.h
@@ -0,0 +1,148 @@
+// i386-signal.h - Catch runtime signals and turn them into exceptions.
+
+/* Copyright (C) 1998, 1999 Cygnus Solutions
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+/* This technique should work for all i386 based Unices which conform
+ * to iBCS2. This includes all versions of Linux more recent than 1.3
+ */
+
+
+#ifndef JAVA_SIGNAL_H
+#define JAVA_SIGNAL_H 1
+
+#include <signal.h>
+
+#define HANDLE_SEGV 1
+#define HANDLE_FPE 1
+
+#define SIGNAL_HANDLER(_name) \
+static void _name (int _dummy)
+
+#define MAKE_THROW_FRAME \
+do \
+{ \
+ void **_p = (void **)&_dummy; \
+ struct sigcontext_struct *_regs = (struct sigcontext_struct *)++_p; \
+ \
+ register unsigned long _ebp = _regs->ebp; \
+ register unsigned char *_eip = (unsigned char *)_regs->eip; \
+ \
+ /* Advance the program counter so that it is after the start of the \
+ instruction: the x86 exception handler expects \
+ the PC to point to the instruction after a call. */ \
+ _eip += 2; \
+ \
+ asm volatile ("mov %0, (%%ebp); mov %1, 4(%%ebp)" \
+ : : "r"(_ebp), "r"(_eip)); \
+} \
+while (0)
+
+#define HANDLE_DIVIDE_OVERFLOW \
+do \
+{ \
+ void **_p = (void **)&_dummy; \
+ struct sigcontext_struct *_regs = (struct sigcontext_struct *)++_p; \
+ \
+ register unsigned long *_ebp = (unsigned long *)_regs->ebp; \
+ register unsigned char *_eip = (unsigned char *)_regs->eip; \
+ \
+ /* According to the JVM spec, "if the dividend is the negative \
+ * integer of the smallest magnitude and the divisor is -1, then \
+ * overflow occurs and the result is equal to the dividend. Despite \
+ * the overflow, no exception occurs". \
+ \
+ * We handle this by inspecting the instruction which generated the \
+ * signal and advancing eip to point to the following instruction. \
+ * As the instructions are variable length it is necessary to do a \
+ * little calculation to figure out where the following instruction \
+ * actually is. \
+ \
+ */ \
+ \
+ if (_eip[0] == 0xf7) \
+ { \
+ unsigned char _modrm = _eip[1]; \
+ \
+ if (_regs->eax == 0x80000000 \
+ && ((_modrm >> 3) & 7) == 7) /* Signed divide */ \
+ { \
+ _regs->edx = 0; /* the remainder is zero */ \
+ switch (_modrm >> 6) \
+ { \
+ case 0: \
+ if ((_modrm & 7) == 5) \
+ _eip += 4; \
+ break; \
+ case 1: \
+ _eip += 1; \
+ break; \
+ case 2: \
+ _eip += 4; \
+ break; \
+ case 3: \
+ break; \
+ } \
+ _eip += 2; \
+ _regs->eip = (unsigned long)_eip; \
+ return; \
+ } \
+ else if (((_modrm >> 3) & 7) == 6) /* Unsigned divide */ \
+ { \
+ /* We assume that unsigned divisions are in library code, so \
+ * we throw one level down the stack, which was hopefully \
+ * the place that called the library routine. This will \
+ * break if the library is ever compiled with \
+ * -fomit-frame-pointer, but at least this way we've got a \
+ * good chance of finding the exception handler. */ \
+ \
+ _eip = (unsigned char *)_ebp[1]; \
+ _ebp = (unsigned long *)_ebp[0]; \
+ } \
+ else \
+ { \
+ /* Advance the program counter so that it is after the start \
+ of the instruction: this is because the x86 exception \
+ handler expects the PC to point to the instruction after a \
+ call. */ \
+ _eip += 2; \
+ } \
+ } \
+ \
+ asm volatile ("mov %0, (%%ebp); mov %1, 4(%%ebp)" \
+ : : "r"(_ebp), "r"(_eip)); \
+} \
+while (0)
+
+#define INIT_SEGV \
+do \
+ { \
+ nullp = new java::lang::NullPointerException (); \
+ struct sigaction act; \
+ act.sa_handler = catch_segv; \
+ sigemptyset (&act.sa_mask); \
+ act.sa_flags = 0; \
+ __sigaction (SIGSEGV, &act, NULL); \
+ } \
+while (0)
+
+#define INIT_FPE \
+do \
+ { \
+ arithexception = new java::lang::ArithmeticException \
+ (JvNewStringLatin1 ("/ by zero")); \
+ struct sigaction act; \
+ act.sa_handler = catch_fpe; \
+ sigemptyset (&act.sa_mask); \
+ act.sa_flags = 0; \
+ __sigaction (SIGFPE, &act, NULL); \
+ } \
+while (0)
+
+#endif /* JAVA_SIGNAL_H */
+
diff --git a/libjava/include/javaprims.h b/libjava/include/javaprims.h
index 83c2cf9faeb..fb1c40fa5a9 100644
--- a/libjava/include/javaprims.h
+++ b/libjava/include/javaprims.h
@@ -11,6 +11,11 @@ details. */
#ifndef __JAVAPRIMS_H__
#define __JAVAPRIMS_H__
+#undef TRUE
+#define TRUE TRUE
+#undef FALSE
+#define FALSE FALSE
+
// To force selection of correct types that will mangle consistently
// across platforms.
extern "Java"
@@ -106,6 +111,7 @@ extern "Java"
class Cloneable;
class Comparable;
class Compiler;
+ class ConcreteProcess;
class Double;
class Error;
class Exception;
@@ -161,7 +167,6 @@ extern "Java"
class VerifyError;
class VirtualMachineError;
class Void;
-
namespace reflect
{
class AccessibleObject;
@@ -197,6 +202,7 @@ extern "Java"
class Observable;
class Observer;
class Properties;
+ class PropertyResourceBundle;
class Random;
class ResourceBundle;
class SimpleTimeZone;
@@ -206,19 +212,26 @@ extern "Java"
class TooManyListenersException;
class Vector;
class VectorEnumeration;
-
namespace zip
{
class Adler32;
class CRC32;
+ class CheckedInputStream;
+ class CheckedOutputStream;
class Checksum;
+ class DataFormatException;
class Deflater;
class DeflaterOutputStream;
+ class GZIPInputStream;
+ class GZIPOutputStream;
+ class Inflater;
+ class InflaterInputStream;
class ZipConstants;
class ZipEntry;
class ZipEnumeration;
class ZipException;
class ZipFile;
+ class ZipInputStream;
class ZipOutputStream;
};
};
diff --git a/libjava/include/jni.h b/libjava/include/jni.h
index bf7b015cdca..d589b022309 100644
--- a/libjava/include/jni.h
+++ b/libjava/include/jni.h
@@ -9,14 +9,8 @@ details. */
#ifndef __JAVA_JNI_H__
#define __JAVA_JNI_H__
-#ifdef __GNUC__
-# define __need___va_list
-# include <stdarg.h>
-# define _Jv_va_list __gnuc_va_list
-#else
-# include <stdarg.h>
-# define _Jv_va_list va_list
-#endif
+#include <stdarg.h>
+#define _Jv_va_list va_list
#ifdef __cplusplus
diff --git a/libjava/include/sparc-signal.h b/libjava/include/sparc-signal.h
new file mode 100644
index 00000000000..b2464c4c4aa
--- /dev/null
+++ b/libjava/include/sparc-signal.h
@@ -0,0 +1,64 @@
+// sparc-signal.h - Catch runtime signals and turn them into exceptions.
+
+/* Copyright (C) 1998, 1999 Cygnus Solutions
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+#ifndef JAVA_SIGNAL_H
+#define JAVA_SIGNAL_H 1
+
+#include <signal.h>
+#include <ucontext.h>
+
+#define HANDLE_SEGV 1
+#define HANDLE_FPE 1
+
+#define SIGNAL_HANDLER(_name) \
+static void _name (int _dummy, siginfo_t *_info, ucontext_t *_context)
+
+#define FLUSH_REGISTER_WINDOWS \
+ asm volatile ("ta 3");
+
+#define MAKE_THROW_FRAME \
+do \
+{ \
+ (void)_dummy; \
+ (void)_info; \
+ register int sp = _context->uc_mcontext.gregs[REG_SP]; \
+ register int retaddr = _context->uc_mcontext.gregs[REG_O7]; \
+ FLUSH_REGISTER_WINDOWS; \
+ asm volatile ("mov %0, %%i6; mov %1, %%i7" \
+ : : "r"(sp), "r"(retaddr)); \
+} \
+while (0)
+
+#define INIT_SEGV \
+do \
+ { \
+ nullp = new java::lang::NullPointerException (); \
+ struct sigaction act; \
+ act.sa_sigaction = catch_segv; \
+ act.sa_flags = SA_SIGINFO | SA_NODEFER; \
+ sigemptyset (&act.sa_mask); \
+ sigaction (SIGSEGV, &act, NULL); \
+ } \
+while (0)
+
+#define INIT_FPE \
+do \
+ { \
+ arithexception = new java::lang::ArithmeticException \
+ (JvNewStringLatin1 ("/ by zero")); \
+ struct sigaction act; \
+ act.sa_flags = SA_SIGINFO | SA_NODEFER; \
+ act.sa_sigaction = catch_fpe; \
+ sigemptyset (&act.sa_mask); \
+ sigaction (SIGFPE, &act, NULL); \
+ } \
+while (0)
+
+#endif /* JAVA_SIGNAL_H */
diff --git a/libjava/include/stamp-h.in b/libjava/include/stamp-h.in
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/libjava/include/stamp-h.in
diff --git a/libjava/java/awt/AWTEvent.java b/libjava/java/awt/AWTEvent.java
new file mode 100644
index 00000000000..45859cf8674
--- /dev/null
+++ b/libjava/java/awt/AWTEvent.java
@@ -0,0 +1,25 @@
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libjava.
+
+This software is copyrighted work licensed under the terms of the
+Libjava License. Please consult the file "LIBJAVA_LICENSE" for
+details. */
+
+package java.awt;
+
+/* A very incomplete placeholder. */
+
+public abstract class AWTEvent extends java.util.EventObject
+{
+ protected boolean consumed;
+ protected int id;
+
+ public int getID() { return id; }
+
+ public AWTEvent (Object source, int id)
+ {
+ super(source);
+ this.id = id;
+ }
+}
diff --git a/libjava/java/awt/BorderLayout.java b/libjava/java/awt/BorderLayout.java
new file mode 100644
index 00000000000..8549a5b61f1
--- /dev/null
+++ b/libjava/java/awt/BorderLayout.java
@@ -0,0 +1,46 @@
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libjava.
+
+This software is copyrighted work licensed under the terms of the
+Libjava License. Please consult the file "LIBJAVA_LICENSE" for
+details. */
+
+package java.awt;
+
+/* A very incomplete placeholder. */
+
+public class BorderLayout implements LayoutManager2
+{
+ int hgap;
+ int vgap;
+
+ public BorderLayout (int hgap, int vgap)
+ {
+ this.hgap = hgap;
+ this.vgap = vgap;
+ }
+
+ public void addLayoutComponent (String name, Component comp)
+ { /* FIXME */ }
+ public void layoutContainer (Container parent)
+ { /* FIXME */ }
+ public Dimension minimumLayoutSize (Container parent)
+ { /* FIXME */ return null; }
+ public Dimension preferredLayoutSize (Container parent)
+ { /* FIXME */ return null; }
+ public void removeLayoutComponent (Component comp)
+ { /* FIXME */ }
+
+ public void addLayoutComponent (Component comp, Object constraints)
+ { /* FIXME */ }
+ public float getLayoutAlignmentX (Container target)
+ { /* FIXME */ return (float) 0.0; }
+ public float getLayoutAlignmentY (Container target)
+ { /* FIXME */ return (float) 0.0; }
+ public void invalidateLayout (Container target)
+ { /* FIXME */ }
+ public Dimension maximumLayoutSize (Container target)
+ { /* FIXME */ return null; }
+
+}
diff --git a/libjava/java/awt/Component.java b/libjava/java/awt/Component.java
new file mode 100644
index 00000000000..c79d3b70604
--- /dev/null
+++ b/libjava/java/awt/Component.java
@@ -0,0 +1,98 @@
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libjava.
+
+This software is copyrighted work licensed under the terms of the
+Libjava License. Please consult the file "LIBJAVA_LICENSE" for
+details. */
+
+package java.awt;
+import java.awt.event.*;
+//import java.awt.peer.ComponentPeer;
+
+/* A very incomplete placeholder. */
+
+public abstract class Component implements MenuContainer
+{
+ Container parent;
+ java.awt.peer.ComponentPeer peer;
+ int x, y, width, height;
+
+ public Container getParent () { return parent; }
+
+ /** @deprecated */
+ public java.awt.peer.ComponentPeer getPeer () { return peer; }
+
+ public void setVisible (boolean b)
+ { /* FIXME */ }
+
+ public void setSize (Dimension d)
+ { setSize(d.width, d.height); }
+
+ public void setSize (int width, int height)
+ {
+ this.width = width; this.height = height;
+ if (peer != null)
+ peer.setBounds(x, y, width, height);
+ }
+
+ public void setLocation (int x, int y)
+ {
+ this.x = x; this.y = y;
+ if (peer != null)
+ peer.setBounds(x, y, width, height);
+ }
+
+ public void setLocation (Point pt)
+ { setLocation(pt.x, pt.y); }
+
+ public void setBounds (int x, int y, int w, int h)
+ {
+ this.x = x; this.y = y;
+ this.width = w; this.height = h;
+ if (peer != null)
+ peer.setBounds(x, y, w, h);
+ }
+
+ public void setBounds (Rectangle rect)
+ { setBounds(rect.x, rect.y, rect.width, rect.height); }
+
+ public Rectangle getBounds ()
+ {
+ return new Rectangle(x, y, width, height);
+ }
+
+ public Point getLocation ()
+ {
+ return new Point(x, y);
+ }
+
+ public Dimension getSize ()
+ {
+ return new Dimension(width, height);
+ }
+
+ public Dimension getMinimumSize ()
+ {
+ if (peer == null)
+ return new Dimension(width, height);
+ else
+ return peer.getMinimumSize();
+ }
+
+ public Dimension getPreferredSize ()
+ {
+ if (peer == null)
+ return new Dimension(width, height);
+ else
+ return peer.getPreferredSize();
+ }
+
+ public synchronized void addKeyListener (KeyListener listener)
+ { /* FIXME */ }
+
+ public boolean isFocusTraversable ()
+ { /* FIXME */ return false; }
+
+ public void addNotify () { }
+}
diff --git a/libjava/java/awt/Container.java b/libjava/java/awt/Container.java
new file mode 100644
index 00000000000..dc3d1938570
--- /dev/null
+++ b/libjava/java/awt/Container.java
@@ -0,0 +1,59 @@
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libjava.
+
+This software is copyrighted work licensed under the terms of the
+Libjava License. Please consult the file "LIBJAVA_LICENSE" for
+details. */
+
+package java.awt;
+
+/* A very incomplete placeholder. */
+
+public abstract class Container extends Component
+{
+ int componentCount;
+ Component[] components;
+
+ public Component[] getComponents()
+ {
+ Component[] result = new Component[componentCount];
+ if (componentCount > 0)
+ System.arraycopy(components, 0, result, 0, componentCount);
+ return result;
+ }
+
+ public Component getComponent (int n)
+ {
+ if (n < 0 || n >= componentCount)
+ throw new ArrayIndexOutOfBoundsException("no such component");
+ return components[n];
+ }
+
+ public boolean isAncestorOf (Component comp)
+ {
+ for (;;)
+ {
+ if (comp == null)
+ return false;
+ if (comp == this)
+ return true;
+ comp = comp.getParent();
+ }
+ }
+
+ public Component add (String name, Component comp)
+ {
+ /* FIXME */
+ return comp;
+ }
+
+ public void addNotify ()
+ {
+ for (int i = componentCount; --i >= 0; )
+ components[i].addNotify();
+ }
+
+ public void setLayout (LayoutManager layout)
+ { /* FIXME */ }
+}
diff --git a/libjava/java/awt/Dimension.java b/libjava/java/awt/Dimension.java
new file mode 100644
index 00000000000..8593f0e1355
--- /dev/null
+++ b/libjava/java/awt/Dimension.java
@@ -0,0 +1,78 @@
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libjava.
+
+This software is copyrighted work licensed under the terms of the
+Libjava License. Please consult the file "LIBJAVA_LICENSE" for
+details. */
+
+package java.awt;
+
+/**
+ * @author Per Bothner <bothner@cygnus.com>
+ * @date Fenruary 8, 1999.
+ */
+
+/* Written using "Java Class Libraries", 2nd edition, plus online
+ * API docs for JDK 1.2 beta from http://www.javasoft.com.
+ * Status: Believed complete and correct, except that neither toString
+ * has not been compared with JDK output.
+ */
+
+public class Dimension extends java.awt.geom.Dimension2D
+{
+ public int height;
+ public int width;
+
+ public Dimension () { }
+
+ public Dimension (Dimension dim)
+ {
+ this.width = dim.width;
+ this.height = dim.height;
+ }
+
+ public Dimension (int width, int height)
+ {
+ this.width = width;
+ this.height = height;
+ }
+
+ public boolean equals (Object obj)
+ {
+ if (! (obj instanceof Dimension))
+ return false;
+ Dimension dim = (Dimension) obj;
+ return height == dim.height && width == dim.width;
+ }
+
+ public Dimension getSize () { return new Dimension(this); }
+
+ public void setSize (Dimension dim)
+ {
+ this.width = dim.width;
+ this.height = dim.height;
+ }
+
+ public void setSize (int width, int height)
+ {
+ this.width = width;
+ this.height = height;
+ }
+
+ public String toString ()
+ {
+ return "Dimension[w:"+width+",h:"+height+']';
+ }
+
+ /* Note: There is no Dimension.hashCode. */
+
+ public double getWidth() { return width; }
+ public double getHeight() { return height; }
+
+ public void setSize (double width, double height)
+ {
+ this.width = (int) width;
+ this.height = (int) height;
+ }
+}
diff --git a/libjava/java/awt/Event.java b/libjava/java/awt/Event.java
new file mode 100644
index 00000000000..a5991f25e3a
--- /dev/null
+++ b/libjava/java/awt/Event.java
@@ -0,0 +1,26 @@
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libjava.
+
+This software is copyrighted work licensed under the terms of the
+Libjava License. Please consult the file "LIBJAVA_LICENSE" for
+details. */
+
+package java.awt;
+
+/* A very incomplete placeholder. */
+
+public class Event
+{
+ public Event evt;
+ public Object arg;
+ public int id;
+ public Object target;
+
+ public Event (Object target, int id, Object arg)
+ {
+ this.id = id;
+ this.target = target;
+ this.arg = arg;
+ }
+}
diff --git a/libjava/java/awt/Font.java b/libjava/java/awt/Font.java
new file mode 100644
index 00000000000..43b3c160e62
--- /dev/null
+++ b/libjava/java/awt/Font.java
@@ -0,0 +1,15 @@
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libjava.
+
+This software is copyrighted work licensed under the terms of the
+Libjava License. Please consult the file "LIBJAVA_LICENSE" for
+details. */
+
+package java.awt;
+
+/* A *very* incomplete placeholder. */
+
+public class Font
+{
+}
diff --git a/libjava/java/awt/Frame.java b/libjava/java/awt/Frame.java
new file mode 100644
index 00000000000..8d258f73261
--- /dev/null
+++ b/libjava/java/awt/Frame.java
@@ -0,0 +1,55 @@
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libjava.
+
+This software is copyrighted work licensed under the terms of the
+Libjava License. Please consult the file "LIBJAVA_LICENSE" for
+details. */
+
+package java.awt;
+import java.awt.peer.FramePeer;
+
+/* A very incomplete placeholder. */
+
+public class Frame extends Window implements MenuContainer
+{
+ MenuBar menuBar = null;
+ String title;
+
+ public Frame ()
+ { /* FIXME */ }
+
+ public Frame (String title)
+ {
+ this();
+ setTitle(title);
+ }
+
+ public String getTitle () { return title; }
+
+ public void setTitle (String title)
+ {
+ this.title = title;
+ if (peer != null)
+ ((FramePeer)peer).setTitle(title);
+ }
+
+ public synchronized void dispose ()
+ { /* FIXME */ }
+
+ public synchronized void setMenuBar (MenuBar menuBar)
+ { this.menuBar = menuBar; }
+
+ public synchronized void addNotify ()
+ {
+ if (peer == null)
+ {
+ FramePeer fpeer = Toolkit.getDefaultToolkit().createFrame(this);
+ // Compiler bug requires cast ??; FIXME?
+ peer = (java.awt.peer.ComponentPeer) fpeer;
+ if (width + height > 0)
+ peer.setBounds(x, y, width, height);
+ }
+ super.addNotify();
+ }
+}
diff --git a/libjava/java/awt/LayoutManager.java b/libjava/java/awt/LayoutManager.java
new file mode 100644
index 00000000000..1cd47b131ba
--- /dev/null
+++ b/libjava/java/awt/LayoutManager.java
@@ -0,0 +1,20 @@
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libjava.
+
+This software is copyrighted work licensed under the terms of the
+Libjava License. Please consult the file "LIBJAVA_LICENSE" for
+details. */
+
+package java.awt;
+
+/* Status: Believed complete and correct. */
+
+public interface LayoutManager
+{
+ public void addLayoutComponent (String name, Component comp);
+ public void layoutContainer (Container parent);
+ public Dimension minimumLayoutSize (Container parent);
+ public Dimension preferredLayoutSize (Container parent);
+ public void removeLayoutComponent (Component comp);
+}
diff --git a/libjava/java/awt/LayoutManager2.java b/libjava/java/awt/LayoutManager2.java
new file mode 100644
index 00000000000..6c0286c007e
--- /dev/null
+++ b/libjava/java/awt/LayoutManager2.java
@@ -0,0 +1,20 @@
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libjava.
+
+This software is copyrighted work licensed under the terms of the
+Libjava License. Please consult the file "LIBJAVA_LICENSE" for
+details. */
+
+package java.awt;
+
+/* Status: Believed complete and correct. */
+
+public interface LayoutManager2 extends LayoutManager
+{
+ public void addLayoutComponent (Component comp, Object constraints);
+ public float getLayoutAlignmentX (Container target);
+ public float getLayoutAlignmentY (Container target);
+ public void invalidateLayout (Container target);
+ public Dimension maximumLayoutSize (Container target);
+}
diff --git a/libjava/java/awt/Menu.java b/libjava/java/awt/Menu.java
new file mode 100644
index 00000000000..ad602e77e9f
--- /dev/null
+++ b/libjava/java/awt/Menu.java
@@ -0,0 +1,33 @@
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libjava.
+
+This software is copyrighted work licensed under the terms of the
+Libjava License. Please consult the file "LIBJAVA_LICENSE" for
+details. */
+
+package java.awt;
+
+/* A very incomplete placeholder. */
+
+public class Menu extends MenuItem implements MenuContainer
+{
+ public Menu (String label)
+ {
+ super(label); // ???
+ throw new Error ("java.awt.Menu: not implemented");
+ }
+
+ public void add (String label)
+ { /* FIXME */ }
+
+ public synchronized MenuItem add (MenuItem item)
+ {
+ /* FIXME */
+ return item;
+ }
+
+ public Font getFont() { return null; } // FIXME
+ //public boolean postEvent(Event evt);
+ public void remove(MenuComponent comp) { } // FIXME
+}
diff --git a/libjava/java/awt/MenuBar.java b/libjava/java/awt/MenuBar.java
new file mode 100644
index 00000000000..4b93e8ab504
--- /dev/null
+++ b/libjava/java/awt/MenuBar.java
@@ -0,0 +1,44 @@
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libjava.
+
+This software is copyrighted work licensed under the terms of the
+Libjava License. Please consult the file "LIBJAVA_LICENSE" for
+details. */
+
+package java.awt;
+
+/* A very incomplete placeholder. */
+
+public class MenuBar extends MenuComponent implements MenuContainer
+{
+ Menu[] menus;
+ int count;
+
+ public synchronized Menu add (Menu m)
+ {
+ if (menus == null)
+ menus = new Menu[1];
+ else if (count == menus.length)
+ {
+ Menu[] newMenus = new Menu[2 * count];
+ System.arraycopy(menus, 0, newMenus, 0, count);
+ }
+ menus[count++] = m;
+ return m;
+ }
+
+ public void remove (MenuComponent comp)
+ {
+ for (int i = count; --i >= 0; )
+ {
+ if (menus[i] == comp)
+ {
+ System.arraycopy(menus, i, menus, i+1, count-i-1);
+ count--;
+ // FIXME: destroy peer
+ return;
+ }
+ }
+ }
+}
diff --git a/libjava/java/awt/MenuComponent.java b/libjava/java/awt/MenuComponent.java
new file mode 100644
index 00000000000..3bd92a4b222
--- /dev/null
+++ b/libjava/java/awt/MenuComponent.java
@@ -0,0 +1,15 @@
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libjava.
+
+This software is copyrighted work licensed under the terms of the
+Libjava License. Please consult the file "LIBJAVA_LICENSE" for
+details. */
+
+package java.awt;
+
+/* A very incomplete placeholder. */
+
+public abstract class MenuComponent
+{
+}
diff --git a/libjava/java/awt/MenuContainer.java b/libjava/java/awt/MenuContainer.java
new file mode 100644
index 00000000000..2d8ff9275fb
--- /dev/null
+++ b/libjava/java/awt/MenuContainer.java
@@ -0,0 +1,27 @@
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libjava.
+
+This software is copyrighted work licensed under the terms of the
+Libjava License. Please consult the file "LIBJAVA_LICENSE" for
+details. */
+
+package java.awt;
+
+/* Written using "Java Class Libraries", 2nd edition, plus online
+ * API docs for JDK 1.2 beta from http://www.javasoft.com.
+ * Status: Believed complete and correct.
+ */
+
+public interface MenuContainer
+{
+ public Font getFont();
+
+ /**
+ * @deprected
+ */
+ public boolean postEvent(Event evt);
+
+ public void remove(MenuComponent comp);
+}
+
diff --git a/libjava/java/awt/MenuItem.java b/libjava/java/awt/MenuItem.java
new file mode 100644
index 00000000000..1becbccb8ff
--- /dev/null
+++ b/libjava/java/awt/MenuItem.java
@@ -0,0 +1,25 @@
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libjava.
+
+This software is copyrighted work licensed under the terms of the
+Libjava License. Please consult the file "LIBJAVA_LICENSE" for
+details. */
+
+package java.awt;
+import java.awt.event.*;
+
+/* A very incomplete placeholder. */
+
+public class MenuItem extends MenuComponent
+{
+ public MenuItem (String label)
+ {
+ throw new Error("java.awt.MenuItem: not implemented");
+ }
+
+ public synchronized void addActionListener (ActionListener listener)
+ {
+ /* FIXME */
+ }
+}
diff --git a/libjava/java/awt/Point.java b/libjava/java/awt/Point.java
new file mode 100644
index 00000000000..bdeb39d513b
--- /dev/null
+++ b/libjava/java/awt/Point.java
@@ -0,0 +1,65 @@
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libjava.
+
+This software is copyrighted work licensed under the terms of the
+Libjava License. Please consult the file "LIBJAVA_LICENSE" for
+details. */
+
+package java.awt;
+import java.awt.geom.Point2D;
+
+/**
+ * @author Per Bothner <bothner@cygnus.com>
+ * @date February 8, 1999.
+ */
+
+/* Written using "Java Class Libraries", 2nd edition, plus online
+ * API docs for JDK 1.2 beta from http://www.javasoft.com.
+ * Status: Believed complete and correct, except that neither toString
+ * nor hashCode have been compared with JDK output.
+ */
+
+public class Point extends Point2D implements java.io.Serializable
+{
+ public int x;
+ public int y;
+
+ public Point () { }
+
+ public Point (Point p) { this.x = p.x; this.y = p.y; }
+
+ public Point (int x, int y) { this.x = x; this.y = y; }
+
+ public boolean equals (Object obj)
+ {
+ if (! (obj instanceof Point))
+ return false;
+ Point p = (Point) obj;
+ return this.x == p.x && this.y == p.y;
+ }
+
+ public int hashCode () { return x ^ y; }
+
+ public Point getLocation () { return new Point(this); }
+
+ public void move (int x, int y) { this.x = x; this.y = y; }
+
+ public void setLocation (int x, int y) { this.x = x; this.y = y; }
+
+ public void setLocation (Point pt) { this.x = pt.x; this.y = pt.y; }
+
+ public void translate (int x, int y) { this.x += x; this.y += y; }
+
+ public String toString ()
+ {
+ return "Point[x:"+x+",y:"+y+']';
+ }
+
+ public double getX() { return x; }
+ public double getY() { return y; }
+
+ public void setLocation (double x, double y)
+ { this.x = (int) x; this.y = (int) y; }
+
+}
diff --git a/libjava/java/awt/Rectangle.java b/libjava/java/awt/Rectangle.java
new file mode 100644
index 00000000000..975a41572e1
--- /dev/null
+++ b/libjava/java/awt/Rectangle.java
@@ -0,0 +1,35 @@
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libjava.
+
+This software is copyrighted work licensed under the terms of the
+Libjava License. Please consult the file "LIBJAVA_LICENSE" for
+details. */
+
+package java.awt;
+
+/* Status: Quite imcomplete. */
+
+public class Rectangle implements Shape
+{
+ public int x;
+ public int y;
+ public int width;
+ public int height;
+
+ public Rectangle () { }
+
+ public Rectangle (int width, int height)
+ { this.width = width; this.height = height; }
+
+ public Rectangle (int x, int y, int width, int height)
+ {
+ this.x = x; this.y = y;
+ this.width = width; this.height = height;
+ }
+
+ public Rectangle getBounds ()
+ {
+ return new Rectangle (x, y, width, height);
+ }
+}
diff --git a/libjava/java/awt/Shape.java b/libjava/java/awt/Shape.java
new file mode 100644
index 00000000000..c54ad15ee73
--- /dev/null
+++ b/libjava/java/awt/Shape.java
@@ -0,0 +1,23 @@
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libjava.
+
+This software is copyrighted work licensed under the terms of the
+Libjava License. Please consult the file "LIBJAVA_LICENSE" for
+details. */
+
+package java.awt;
+
+/**
+ * @author Per Bothner <bothner@cygnus.com>
+ * @date Fenruary 8, 1999.
+ */
+
+/* Written using "Java Class Libraries", 2nd edition.
+ * Status: Believed complete and correct.
+ */
+
+public interface Shape
+{
+ public Rectangle getBounds ();
+}
diff --git a/libjava/java/awt/TextArea.java b/libjava/java/awt/TextArea.java
new file mode 100644
index 00000000000..7ee3f9110c5
--- /dev/null
+++ b/libjava/java/awt/TextArea.java
@@ -0,0 +1,49 @@
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libjava.
+
+This software is copyrighted work licensed under the terms of the
+Libjava License. Please consult the file "LIBJAVA_LICENSE" for
+details. */
+
+package java.awt;
+
+/* A very incomplete placeholder. */
+
+public class TextArea extends TextComponent
+{
+ public synchronized void append (String str)
+ {
+ replaceRange(str, length, length);
+ }
+
+ public synchronized void insert (String str, int pos)
+ {
+ replaceRange(str, pos, pos);
+ }
+
+ public synchronized void replaceRange (String str, int start, int end)
+ {
+ if (length == 0)
+ setText (str);
+ else
+ {
+ int len = str.length();
+ int delta = len - (end - start);
+ int new_length = length + delta;
+ if (buffer.length < new_length)
+ {
+ int new_size = 2 * buffer.length;
+ if (new_size < new_length)
+ new_size = new_length;
+ char[] new_buffer = new char[new_size];
+ System.arraycopy(buffer, 0, new_buffer, 0, length);
+ buffer = new_buffer;
+ }
+ if (len != end)
+ System.arraycopy(buffer, start, buffer, start + len, len - end);
+ str.getChars(0, len, buffer, start);
+ length += delta;
+ }
+ }
+}
diff --git a/libjava/java/awt/TextComponent.java b/libjava/java/awt/TextComponent.java
new file mode 100644
index 00000000000..bbdd51830e6
--- /dev/null
+++ b/libjava/java/awt/TextComponent.java
@@ -0,0 +1,38 @@
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libjava.
+
+This software is copyrighted work licensed under the terms of the
+Libjava License. Please consult the file "LIBJAVA_LICENSE" for
+details. */
+
+package java.awt;
+import java.awt.event.*;
+
+/* A very incomplete placeholder. */
+
+public class TextComponent extends Component
+{
+ char[] buffer;
+ int length;
+ int caretPosition;
+
+ public synchronized String getText ()
+ { return new String(buffer, 0, length); }
+
+ public synchronized void setText (String text)
+ {
+ length = text.length();
+ if (buffer == null || buffer.length < length)
+ buffer = new char[length];
+ text.getChars(0, length, buffer, 0);
+ }
+
+ public synchronized void addTextListener (TextListener listener)
+ { /* FIXME */ }
+
+ public int getCaretPosition () { return caretPosition; }
+
+ public void setCaretPosition (int pos) { caretPosition = pos; }
+
+}
diff --git a/libjava/java/awt/Toolkit.java b/libjava/java/awt/Toolkit.java
new file mode 100644
index 00000000000..b6a27dd42f3
--- /dev/null
+++ b/libjava/java/awt/Toolkit.java
@@ -0,0 +1,29 @@
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libjava.
+
+This software is copyrighted work licensed under the terms of the
+Libjava License. Please consult the file "LIBJAVA_LICENSE" for
+details. */
+
+package java.awt;
+import java.awt.peer.*;
+
+/* A very incomplete placeholder. */
+
+public abstract class Toolkit
+{
+ static Toolkit defaultToolkit;
+
+ public static synchronized Toolkit getDefaultToolkit()
+ {
+ if (defaultToolkit == null)
+ init();
+ return defaultToolkit;
+ }
+
+ protected abstract FramePeer createFrame(Frame target);
+
+ private static native void init();
+ // static { init(); }
+}
diff --git a/libjava/java/awt/Window.java b/libjava/java/awt/Window.java
new file mode 100644
index 00000000000..a7a4b4b713f
--- /dev/null
+++ b/libjava/java/awt/Window.java
@@ -0,0 +1,29 @@
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libjava.
+
+This software is copyrighted work licensed under the terms of the
+Libjava License. Please consult the file "LIBJAVA_LICENSE" for
+details. */
+
+package java.awt;
+import java.awt.event.WindowListener;
+
+/* A very incomplete placeholder. */
+
+public class Window extends Container
+{
+ public void dispose ()
+ { /* FIXME */ }
+
+ public synchronized void addWindowListener (WindowListener listener)
+ { /* FIXME */ }
+
+
+ public void show ()
+ {
+ addNotify();
+ // validate FIXME
+ // validate setVisible FIXME
+ }
+}
diff --git a/libjava/java/awt/event/ActionEvent.java b/libjava/java/awt/event/ActionEvent.java
new file mode 100644
index 00000000000..3ea105b93b4
--- /dev/null
+++ b/libjava/java/awt/event/ActionEvent.java
@@ -0,0 +1,35 @@
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libjava.
+
+This software is copyrighted work licensed under the terms of the
+Libjava License. Please consult the file "LIBJAVA_LICENSE" for
+details. */
+
+package java.awt.event;
+import java.awt.*;
+
+/* A very incomplete placeholder. */
+
+public class ActionEvent extends AWTEvent
+{
+ String actionCommand;
+ int modifiers;
+
+ public ActionEvent (Object source, int id, String command)
+ {
+ super(source, id);
+ actionCommand = command;
+ }
+
+ public ActionEvent (Object source, int id, String command, int modifiers)
+ {
+ super(source, id);
+ actionCommand = command;
+ this.modifiers = modifiers;
+ }
+
+ public String getActionCommand () { return actionCommand; }
+
+ public int getModifiers () { return modifiers; }
+}
diff --git a/libjava/java/awt/event/ActionListener.java b/libjava/java/awt/event/ActionListener.java
new file mode 100644
index 00000000000..5a3700a0ace
--- /dev/null
+++ b/libjava/java/awt/event/ActionListener.java
@@ -0,0 +1,21 @@
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libjava.
+
+This software is copyrighted work licensed under the terms of the
+Libjava License. Please consult the file "LIBJAVA_LICENSE" for
+details. */
+
+package java.awt.event;
+
+/**
+ * @author Per Bothner <bothner@cygnus.com>
+ * @date Fenruary, 1999.
+ */
+
+/* Status: Believed complete and correct. */
+
+public interface ActionListener extends java.util.EventListener
+{
+ public void actionPerformed (ActionEvent e);
+}
diff --git a/libjava/java/awt/event/ComponentEvent.java b/libjava/java/awt/event/ComponentEvent.java
new file mode 100644
index 00000000000..c44ddf6ad9c
--- /dev/null
+++ b/libjava/java/awt/event/ComponentEvent.java
@@ -0,0 +1,20 @@
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libjava.
+
+This software is copyrighted work licensed under the terms of the
+Libjava License. Please consult the file "LIBJAVA_LICENSE" for
+details. */
+
+package java.awt.event;
+import java.awt.*;
+
+/* A very incomplete placeholder. */
+
+public class ComponentEvent extends AWTEvent
+{
+ public ComponentEvent (Object source, int id)
+ {
+ super(source, id);
+ }
+}
diff --git a/libjava/java/awt/event/InputEvent.java b/libjava/java/awt/event/InputEvent.java
new file mode 100644
index 00000000000..bc98e7edd0d
--- /dev/null
+++ b/libjava/java/awt/event/InputEvent.java
@@ -0,0 +1,22 @@
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libjava.
+
+This software is copyrighted work licensed under the terms of the
+Libjava License. Please consult the file "LIBJAVA_LICENSE" for
+details. */
+
+package java.awt.event;
+
+/* A very incomplete placeholder. */
+
+public class InputEvent extends ComponentEvent
+{
+ InputEvent (Object source, int id) // Not public
+ {
+ super(source, id);
+ }
+
+ public void consume ()
+ { /* FIXME */ }
+}
diff --git a/libjava/java/awt/event/KeyEvent.java b/libjava/java/awt/event/KeyEvent.java
new file mode 100644
index 00000000000..1fcb9747e41
--- /dev/null
+++ b/libjava/java/awt/event/KeyEvent.java
@@ -0,0 +1,38 @@
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libjava.
+
+This software is copyrighted work licensed under the terms of the
+Libjava License. Please consult the file "LIBJAVA_LICENSE" for
+details. */
+
+package java.awt.event;
+import java.awt.*;
+
+/* A very incomplete placeholder. */
+
+public class KeyEvent extends InputEvent
+{
+ int keyCode;
+ char keyChar;
+ int modifiers;
+
+ public KeyEvent (Component source, int id, long when,
+ int modifiers, int keyCode, char keyChar)
+ {
+ super(source, id);
+ this.keyCode = keyCode;
+ this.keyChar = keyChar;
+ this.modifiers = modifiers;
+ }
+
+ public int getKeyCode () { return keyCode; }
+
+ public char getKeyChar () { return keyChar; }
+
+ public void setKeyCode (int keyCode) { this.keyCode = keyCode; }
+
+ public void setKeyChar (char keyChar) { this.keyChar = keyChar; }
+
+ public void setModifiers (int modifiers) { this.modifiers = modifiers; }
+}
diff --git a/libjava/java/awt/event/KeyListener.java b/libjava/java/awt/event/KeyListener.java
new file mode 100644
index 00000000000..126cc459136
--- /dev/null
+++ b/libjava/java/awt/event/KeyListener.java
@@ -0,0 +1,23 @@
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libjava.
+
+This software is copyrighted work licensed under the terms of the
+Libjava License. Please consult the file "LIBJAVA_LICENSE" for
+details. */
+
+package java.awt.event;
+
+/**
+ * @author Per Bothner <bothner@cygnus.com>
+ * @date Fenruary, 1999.
+ */
+
+/* Status: Believed complete and correct. */
+
+public interface KeyListener extends java.util.EventListener
+{
+ public void keyPressed (KeyEvent w);
+ public void keyReleased (KeyEvent w);
+ public void keyTyped (KeyEvent w);
+}
diff --git a/libjava/java/awt/event/TextEvent.java b/libjava/java/awt/event/TextEvent.java
new file mode 100644
index 00000000000..b3725f920eb
--- /dev/null
+++ b/libjava/java/awt/event/TextEvent.java
@@ -0,0 +1,20 @@
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libjava.
+
+This software is copyrighted work licensed under the terms of the
+Libjava License. Please consult the file "LIBJAVA_LICENSE" for
+details. */
+
+package java.awt.event;
+import java.awt.*;
+
+/* A very incomplete placeholder. */
+
+public class TextEvent extends AWTEvent
+{
+ public TextEvent (Object source, int id)
+ {
+ super(source, id);
+ }
+}
diff --git a/libjava/java/awt/event/TextListener.java b/libjava/java/awt/event/TextListener.java
new file mode 100644
index 00000000000..b4863fff8d9
--- /dev/null
+++ b/libjava/java/awt/event/TextListener.java
@@ -0,0 +1,22 @@
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libjava.
+
+This software is copyrighted work licensed under the terms of the
+Libjava License. Please consult the file "LIBJAVA_LICENSE" for
+details. */
+
+package java.awt.event;
+
+/**
+ * @author Per Bothner <bothner@cygnus.com>
+ * @date Fenruary, 1999.
+ */
+
+/* Status: Believed complete and correct. */
+
+public interface TextListener extends java.util.EventListener
+{
+ public void textValueChanged (TextEvent w);
+}
+
diff --git a/libjava/java/awt/event/WindowAdapter.java b/libjava/java/awt/event/WindowAdapter.java
new file mode 100644
index 00000000000..f2675a3cca1
--- /dev/null
+++ b/libjava/java/awt/event/WindowAdapter.java
@@ -0,0 +1,27 @@
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libjava.
+
+This software is copyrighted work licensed under the terms of the
+Libjava License. Please consult the file "LIBJAVA_LICENSE" for
+details. */
+
+package java.awt.event;
+
+/**
+ * @author Per Bothner <bothner@cygnus.com>
+ * @date Fenruary, 1999.
+ */
+
+/* Status: Believed complete and correct. */
+
+public class WindowAdapter implements WindowListener
+{
+ public void windowActivated (WindowEvent w) { }
+ public void windowClosed (WindowEvent w) { }
+ public void windowClosing (WindowEvent w) { }
+ public void windowDeactivated (WindowEvent w) { }
+ public void windowDeiconified (WindowEvent w) { }
+ public void windowIconified (WindowEvent w) { }
+ public void windowOpened (WindowEvent w) { }
+}
diff --git a/libjava/java/awt/event/WindowEvent.java b/libjava/java/awt/event/WindowEvent.java
new file mode 100644
index 00000000000..4b347dd6bc2
--- /dev/null
+++ b/libjava/java/awt/event/WindowEvent.java
@@ -0,0 +1,19 @@
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libjava.
+
+This software is copyrighted work licensed under the terms of the
+Libjava License. Please consult the file "LIBJAVA_LICENSE" for
+details. */
+
+package java.awt.event;
+
+/* A very incomplete placeholder. */
+
+public class WindowEvent extends ComponentEvent
+{
+ public WindowEvent (Object source, int id)
+ {
+ super(source, id);
+ }
+}
diff --git a/libjava/java/awt/event/WindowListener.java b/libjava/java/awt/event/WindowListener.java
new file mode 100644
index 00000000000..ff8ae943363
--- /dev/null
+++ b/libjava/java/awt/event/WindowListener.java
@@ -0,0 +1,27 @@
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libjava.
+
+This software is copyrighted work licensed under the terms of the
+Libjava License. Please consult the file "LIBJAVA_LICENSE" for
+details. */
+
+package java.awt.event;
+
+/**
+ * @author Per Bothner <bothner@cygnus.com>
+ * @date Fenruary, 1999.
+ */
+
+/* Status: Believed complete and correct. */
+
+public interface WindowListener extends java.util.EventListener
+{
+ public void windowActivated (WindowEvent w);
+ public void windowClosed (WindowEvent w);
+ public void windowClosing (WindowEvent w);
+ public void windowDeactivated (WindowEvent w);
+ public void windowDeiconified (WindowEvent w);
+ public void windowIconified (WindowEvent w);
+ public void windowOpened (WindowEvent w);
+}
diff --git a/libjava/java/awt/geom/Dimension2D.java b/libjava/java/awt/geom/Dimension2D.java
new file mode 100644
index 00000000000..7bdcf37c376
--- /dev/null
+++ b/libjava/java/awt/geom/Dimension2D.java
@@ -0,0 +1,36 @@
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libjava.
+
+This software is copyrighted work licensed under the terms of the
+Libjava License. Please consult the file "LIBJAVA_LICENSE" for
+details. */
+
+package java.awt.geom;
+
+/**
+ * @author Per Bothner <bothner@cygnus.com>
+ * @date Fenruary, 1999.
+ */
+
+/* Written using online API docs for JDK 1.2 beta from http://www.javasoft.com.
+ * Status: Believed complete and correct.
+ */
+
+public abstract class Dimension2D implements Cloneable
+{
+ public abstract double getWidth();
+ public abstract double getHeight();
+
+ public abstract void setSize (double width, double height);
+
+ public void setSize (Dimension2D dim)
+ {
+ setSize(dim.getWidth(), dim.getHeight());
+ }
+
+ public Object clone ()
+ {
+ return super.clone();
+ }
+}
diff --git a/libjava/java/awt/geom/Point2D.java b/libjava/java/awt/geom/Point2D.java
new file mode 100644
index 00000000000..3d9e0a4a9da
--- /dev/null
+++ b/libjava/java/awt/geom/Point2D.java
@@ -0,0 +1,69 @@
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libjava.
+
+This software is copyrighted work licensed under the terms of the
+Libjava License. Please consult the file "LIBJAVA_LICENSE" for
+details. */
+
+package java.awt.geom;
+
+/**
+ * @author Per Bothner <bothner@cygnus.com>
+ * @date Fenruary 8, 1999.
+ */
+
+/* Written using "Java Class Libraries", 2nd edition, plus online
+ * API docs for JDK 1.2 beta from http://www.javasoft.com.
+ * Status: Believed complete and correct, except that neither toString
+ * nor hashCode have been compared with JDK output.
+ */
+
+public abstract class Point2D implements Cloneable
+{
+ public abstract double getX();
+ public abstract double getY();
+
+ public abstract void setLocation (double x, double y);
+
+ public void setLocation (Point2D pt) { setLocation(pt.getX(), pt.getY()); }
+
+ static public double distanceSq (double X1, double Y1, double X2, double Y2)
+ {
+ X2 -= X1;
+ Y2 -= Y1;
+ return X2*X2 + Y2*Y2;
+ }
+
+ static public double distance (double X1, double Y1, double X2, double Y2)
+ {
+ return Math.sqrt(distance(X1, Y1, X2, Y2));
+ }
+
+ public double distanceSq (double PX, double PY)
+ {
+ return distanceSq (getX(), PX, getY(), PY);
+ }
+
+ public double distance (double PX, double PY)
+ {
+ return distance (getX(), PX, getY(), PY);
+ }
+
+ public double distanceSq (Point2D pt)
+ {
+ return distanceSq (getX(), pt.getX(), getY(), pt.getY());
+ }
+
+ public double distance (Point2D pt)
+ {
+ return distance (getX(), pt.getX(), getY(), pt.getY());
+ }
+
+ public int hashCode() { return (int) getX() ^ (int) getY(); }
+
+ public Object clone()
+ {
+ return super.clone();
+ }
+}
diff --git a/libjava/java/awt/natToolkit.cc b/libjava/java/awt/natToolkit.cc
new file mode 100644
index 00000000000..2d644a6b783
--- /dev/null
+++ b/libjava/java/awt/natToolkit.cc
@@ -0,0 +1,27 @@
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+#include <config.h>
+
+/*#define ENABLE_GTK*/
+
+#include <cni.h>
+#include <java/awt/Toolkit.h>
+#ifdef ENABLE_GTK
+#include <java/awt/peer/GtkToolkit.h>
+#endif
+
+void
+java::awt::Toolkit::init()
+{
+#ifdef ENABLE_GTK
+ defaultToolkit = new java::awt::peer::GtkToolkit();
+#else
+ JvFail("no awt (graphics) toolkit available");
+#endif
+}
diff --git a/libjava/java/awt/peer/ComponentPeer.java b/libjava/java/awt/peer/ComponentPeer.java
new file mode 100644
index 00000000000..edf47a622a0
--- /dev/null
+++ b/libjava/java/awt/peer/ComponentPeer.java
@@ -0,0 +1,23 @@
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libjava.
+
+This software is copyrighted work licensed under the terms of the
+Libjava License. Please consult the file "LIBJAVA_LICENSE" for
+details. */
+
+package java.awt.peer;
+import java.awt.*;
+
+/* A very incomplete placeholder. */
+
+public interface ComponentPeer
+{
+ public abstract Toolkit getToolkit ();
+
+ public Dimension getMinimumSize ();
+
+ public Dimension getPreferredSize ();
+
+ public void setBounds (int x, int y, int w, int h);
+}
diff --git a/libjava/java/awt/peer/ContainerPeer.java b/libjava/java/awt/peer/ContainerPeer.java
new file mode 100644
index 00000000000..6c5ad1cdd62
--- /dev/null
+++ b/libjava/java/awt/peer/ContainerPeer.java
@@ -0,0 +1,15 @@
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libjava.
+
+This software is copyrighted work licensed under the terms of the
+Libjava License. Please consult the file "LIBJAVA_LICENSE" for
+details. */
+
+package java.awt.peer;
+
+/* A very incomplete placeholder. */
+
+public interface ContainerPeer extends ComponentPeer
+{
+}
diff --git a/libjava/java/awt/peer/FramePeer.java b/libjava/java/awt/peer/FramePeer.java
new file mode 100644
index 00000000000..6db70193ab6
--- /dev/null
+++ b/libjava/java/awt/peer/FramePeer.java
@@ -0,0 +1,16 @@
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libjava.
+
+This software is copyrighted work licensed under the terms of the
+Libjava License. Please consult the file "LIBJAVA_LICENSE" for
+details. */
+
+package java.awt.peer;
+
+/* A very incomplete placeholder. */
+
+public interface FramePeer extends WindowPeer
+{
+ void setTitle(String title);
+}
diff --git a/libjava/java/awt/peer/WindowPeer.java b/libjava/java/awt/peer/WindowPeer.java
new file mode 100644
index 00000000000..9d76f56016c
--- /dev/null
+++ b/libjava/java/awt/peer/WindowPeer.java
@@ -0,0 +1,15 @@
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libjava.
+
+This software is copyrighted work licensed under the terms of the
+Libjava License. Please consult the file "LIBJAVA_LICENSE" for
+details. */
+
+package java.awt.peer;
+
+/* A very incomplete placeholder. */
+
+public interface WindowPeer extends ContainerPeer
+{
+}
diff --git a/libjava/java/io/DataInputStream.java b/libjava/java/io/DataInputStream.java
index 7c90008c6e0..bbcf1daf8a3 100644
--- a/libjava/java/io/DataInputStream.java
+++ b/libjava/java/io/DataInputStream.java
@@ -21,6 +21,11 @@ package java.io;
public class DataInputStream extends FilterInputStream implements DataInput
{
+ // readLine() hack to ensure that an '\r' not followed by an '\n' is
+ // handled correctly. If set, readLine() will ignore the first char it sees
+ // if that char is a '\n'
+ boolean ignoreInitialNewline = false;
+
public DataInputStream(InputStream in)
{
super(in);
@@ -103,11 +108,29 @@ public class DataInputStream extends FilterInputStream implements DataInput
{
StringBuffer strb = new StringBuffer();
- while (true)
+ readloop: while (true)
{
- char ch = (char) read();
- if (ch < 0 || (ch &= 0xFF) == '\n')
- break;
+ int c = 0;
+ char ch = ' ';
+ boolean getnext = true;
+ while (getnext)
+ {
+ getnext = false;
+ c = read();
+ if (c < 0) // got an EOF
+ return strb.length() > 0 ? strb.toString() : null;
+ ch = (char) c;
+ if ((ch &= 0xFF) == '\n')
+ // hack to correctly handle '\r\n' sequences
+ if (ignoreInitialNewline)
+ {
+ ignoreInitialNewline = false;
+ getnext = true;
+ }
+ else
+ break readloop;
+ }
+
if (ch == '\r')
{
// FIXME: The following code tries to adjust the stream back one
@@ -131,24 +154,41 @@ public class DataInputStream extends FilterInputStream implements DataInput
// and since it is undesirable to make non-deprecated methods
// less efficient, the following seems like the most reasonable
// approach.
- if (in instanceof BufferedInputStream && (read() & 0xFF) != '\n')
+ int next_c = 0;
+ char next_ch = ' ';
+ if (in instanceof BufferedInputStream)
{
- BufferedInputStream bin = (BufferedInputStream) in;
- if (bin.pos > 0)
- bin.pos--;
+ next_c = read();
+ next_ch = (char) (next_c & 0xFF);
+ if ((next_ch != '\n') && (next_c >= 0))
+ {
+ BufferedInputStream bin = (BufferedInputStream) in;
+ if (bin.pos > 0)
+ bin.pos--;
+ }
}
else if (markSupported())
{
- mark(1);
- if ((read() & 0xFF) != '\n')
- reset();
- }
+ next_c = read();
+ next_ch = (char) (next_c & 0xFF);
+ if ((next_ch != '\n') && (next_c >= 0))
+ {
+ mark(1);
+ if ((read() & 0xFF) != '\n')
+ reset();
+ }
+ }
+ // In order to catch cases where 'in' isn't a BufferedInputStream
+ // and doesn't support mark() (such as reading from a Socket), set
+ // a flag that instructs readLine() to ignore the first character
+ // it sees _if_ that character is a '\n'.
+ else ignoreInitialNewline = true;
break;
}
strb.append(ch);
}
- return strb.length() > 0 ? strb.toString() : null;
+ return strb.length() > 0 ? strb.toString() : "";
}
public final long readLong() throws IOException
diff --git a/libjava/java/io/File.java b/libjava/java/io/File.java
index 30d98878f9c..fa098e26bf5 100644
--- a/libjava/java/io/File.java
+++ b/libjava/java/io/File.java
@@ -190,10 +190,14 @@ public class File implements Serializable
if (x.isDirectory())
return true;
String p = x.getPath();
- x.setPath(x.getParent());
- if (! mkdirs (x))
- return false;
- x.setPath(p);
+ String parent = x.getParent();
+ if (parent != null)
+ {
+ x.setPath(parent);
+ if (! mkdirs (x))
+ return false;
+ x.setPath(p);
+ }
return x.mkdir();
}
diff --git a/libjava/java/io/FileDescriptor.java b/libjava/java/io/FileDescriptor.java
index 0782b0c8e95..d345db29ad7 100644
--- a/libjava/java/io/FileDescriptor.java
+++ b/libjava/java/io/FileDescriptor.java
@@ -42,7 +42,7 @@ public final class FileDescriptor
static final int CUR = 1;
// Open a file. MODE is a combination of the above mode flags.
- FileDescriptor (String path, int mode) throws IOException
+ FileDescriptor (String path, int mode) throws FileNotFoundException
{
fd = open (path, mode);
}
@@ -52,7 +52,7 @@ public final class FileDescriptor
fd = -1;
}
- native int open (String path, int mode) throws IOException;
+ native int open (String path, int mode) throws FileNotFoundException;
native void write (int b) throws IOException;
native void write (byte[] b, int offset, int len)
throws IOException, NullPointerException, IndexOutOfBoundsException;
diff --git a/libjava/java/io/FileInputStream.java b/libjava/java/io/FileInputStream.java
index 4f44dae03b7..04ad6dd78db 100644
--- a/libjava/java/io/FileInputStream.java
+++ b/libjava/java/io/FileInputStream.java
@@ -23,7 +23,7 @@ public class FileInputStream extends InputStream
/* Contains the file descriptor for referencing the actual file. */
private FileDescriptor fd;
- public FileInputStream(String name) throws FileNotFoundException, IOException
+ public FileInputStream(String name) throws FileNotFoundException
{
SecurityManager s = System.getSecurityManager();
if (s != null)
@@ -31,7 +31,7 @@ public class FileInputStream extends InputStream
fd = new FileDescriptor(name, FileDescriptor.READ);
}
- public FileInputStream(File file) throws FileNotFoundException, IOException
+ public FileInputStream(File file) throws FileNotFoundException
{
this(file.getPath());
}
diff --git a/libjava/java/io/FilterOutputStream.java b/libjava/java/io/FilterOutputStream.java
index 45d6fd024ad..cf498a2e269 100644
--- a/libjava/java/io/FilterOutputStream.java
+++ b/libjava/java/io/FilterOutputStream.java
@@ -46,14 +46,15 @@ public class FilterOutputStream extends OutputStream
public void write (byte[] b) throws IOException, NullPointerException
{
// Don't do checking here, per Java Lang Spec.
- out.write (b);
+ write (b, 0, b.length);
}
public void write (byte[] b, int off, int len)
throws IOException, NullPointerException, IndexOutOfBoundsException
{
// Don't do checking here, per Java Lang Spec.
- out.write(b, off, len);
+ for (int i=0; i < len; i++)
+ write (b[off + i]);
}
// The output stream.
diff --git a/libjava/java/io/FilterWriter.java b/libjava/java/io/FilterWriter.java
index 385cc7eee30..d0c167ee1bd 100644
--- a/libjava/java/io/FilterWriter.java
+++ b/libjava/java/io/FilterWriter.java
@@ -29,7 +29,6 @@ public abstract class FilterWriter extends Writer
protected FilterWriter (Writer ox)
{
- // FIXME: should we really share locks like this?
super (ox);
out = ox;
}
diff --git a/libjava/java/io/InputStreamReader.java b/libjava/java/io/InputStreamReader.java
index ee44f918122..ae5e2c7b0eb 100644
--- a/libjava/java/io/InputStreamReader.java
+++ b/libjava/java/io/InputStreamReader.java
@@ -44,9 +44,9 @@ public class InputStreamReader extends Reader
private InputStreamReader(InputStream in, BytesToUnicode decoder)
{
- super(in);
- this.in = in instanceof BufferedInputStream ? (BufferedInputStream) in
- : new BufferedInputStream(in, 250);
+ super((this.in = (in instanceof BufferedInputStream
+ ? (BufferedInputStream) in
+ : new BufferedInputStream(in, 250))));
converter = decoder;
converter.setInput(this.in.buf, 0, 0);
}
@@ -111,6 +111,8 @@ public class InputStreamReader extends Reader
}
else
{
+ if (length == 0)
+ return 0;
for (;;)
{
in.mark(1);
@@ -141,6 +143,11 @@ public class InputStreamReader extends Reader
wpos = 0;
wcount = 0;
}
+ else if (wavail == 0)
+ {
+ wpos = 0;
+ wcount = 0;
+ }
int count = read(work, wpos, work.length-wpos);
if (count <= 0)
return -1;
diff --git a/libjava/java/io/OutputStreamWriter.java b/libjava/java/io/OutputStreamWriter.java
index e529474875c..88841d9c1b4 100644
--- a/libjava/java/io/OutputStreamWriter.java
+++ b/libjava/java/io/OutputStreamWriter.java
@@ -32,9 +32,9 @@ public class OutputStreamWriter extends Writer
private OutputStreamWriter(OutputStream out, UnicodeToBytes encoder)
{
- super(out);
- this.out = out instanceof BufferedOutputStream ? (BufferedOutputStream) out
- : new BufferedOutputStream(out, 2048);
+ super((this.out = (out instanceof BufferedOutputStream
+ ? (BufferedOutputStream) out
+ : new BufferedOutputStream(out, 250))));
this.converter = encoder;
}
@@ -90,12 +90,17 @@ public class OutputStreamWriter extends Writer
}
}
+ /** Writes characters through to the inferior BufferedOutputStream.
+ * Ignores wcount and the work buffer. */
private void writeChars(char[] buf, int offset, int count)
throws IOException
{
while (count > 0)
{
- if (out.count != 0)
+ // We must flush if out.count == out.buf.length.
+ // It is probably a good idea to flush if out.buf is almost full.
+ // This test is an approximation for "almost full".
+ if (out.count + count >= out.buf.length)
{
out.flush();
if (out.count != 0)
diff --git a/libjava/java/io/PrintStream.java b/libjava/java/io/PrintStream.java
index 499e5eb7059..f13d9f318bd 100644
--- a/libjava/java/io/PrintStream.java
+++ b/libjava/java/io/PrintStream.java
@@ -9,6 +9,7 @@ Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
details. */
package java.io;
+import gnu.gcj.convert.UnicodeToBytes;
/**
* @author Tom Tromey <tromey@cygnus.com>
@@ -22,6 +23,10 @@ package java.io;
public class PrintStream extends FilterOutputStream
{
+ /* Notice the implementation is quite similar to OutputStreamWriter.
+ * This leads to some minor duplication, because neither inherits
+ * from the other, and we want to maximize performance. */
+
public boolean checkError ()
{
return error;
@@ -51,15 +56,32 @@ public class PrintStream extends FilterOutputStream
}
}
- private final void print (String str, boolean check_term)
+ private synchronized void print (String str, boolean println)
{
try
{
- write(str.getBytes());
- if (check_term
- && auto_flush
- && str.indexOf(line_separator) != -1)
- flush ();
+ writeChars(str, 0, str.length());
+ if (println)
+ writeChars(line_separator, 0, line_separator.length);
+ if (auto_flush)
+ flush();
+ }
+ catch (IOException e)
+ {
+ setError ();
+ }
+ }
+
+ private synchronized void print (char[] chars, int pos, int len,
+ boolean println)
+ {
+ try
+ {
+ writeChars(chars, pos, len);
+ if (println)
+ writeChars(line_separator, 0, line_separator.length);
+ if (auto_flush)
+ flush();
}
catch (IOException e)
{
@@ -67,122 +89,159 @@ public class PrintStream extends FilterOutputStream
}
}
+ /** Writes characters through to the inferior BufferedOutputStream. */
+ private void writeChars(char[] buf, int offset, int count)
+ throws IOException
+ {
+ while (count > 0)
+ {
+ // We must flush if out.count == out.buf.length.
+ // It is probably a good idea to flush if out.buf is almost full.
+ // This test is an approximation for "almost full".
+ if (out.count + count >= out.buf.length)
+ {
+ out.flush();
+ if (out.count != 0)
+ throw new IOException("unable to flush output byte buffer");
+ }
+ converter.setOutput(out.buf, out.count);
+ int converted = converter.write(buf, offset, count);
+ offset += converted;
+ count -= converted;
+ out.count = converter.count;
+ }
+ }
+
+ private void writeChars(String str, int offset, int count)
+ throws IOException
+ {
+ while (count > 0)
+ {
+ // We must flush if out.count == out.buf.length.
+ // It is probably a good idea to flush if out.buf is almost full.
+ // This test is an approximation for "almost full".
+ if (out.count + count >= out.buf.length)
+ {
+ out.flush();
+ if (out.count != 0)
+ throw new IOException("unable to flush output byte buffer");
+ }
+ converter.setOutput(out.buf, out.count);
+ int converted = converter.write(str, offset, count, work);
+ offset += converted;
+ count -= converted;
+ out.count = converter.count;
+ }
+ }
+
public void print (boolean bool)
{
- print (String.valueOf(bool), false);
+ print(String.valueOf(bool), false);
}
public void print (int inum)
{
- print (String.valueOf(inum), false);
+ print(String.valueOf(inum), false);
}
public void print (long lnum)
{
- print (String.valueOf(lnum), false);
+ print(String.valueOf(lnum), false);
}
public void print (float fnum)
{
- print (String.valueOf(fnum), false);
+ print(String.valueOf(fnum), false);
}
public void print (double dnum)
{
- print (String.valueOf(dnum), false);
+ print(String.valueOf(dnum), false);
}
public void print (Object obj)
{
- print (String.valueOf(obj), false);
+ print(obj == null ? "null" : obj.toString(), false);
}
public void print (String str)
{
- print (str, true);
+ print(str == null ? "null" : str, false);
}
- public void print (char ch)
+ public synchronized void print (char ch)
{
- print (String.valueOf(ch), true);
+ work[0] = ch;
+ print(work, 0, 1, false);
}
public void print (char[] charArray)
{
- print (String.valueOf(charArray), true);
+ print(charArray, 0, charArray.length, false);
}
public void println ()
{
- print (line_separator, false);
- if (auto_flush)
- flush ();
+ print(line_separator, 0, line_separator.length, false);
}
public void println (boolean bool)
{
- print (String.valueOf(bool), false);
- println ();
+ print(String.valueOf(bool), true);
}
public void println (int inum)
{
- print (String.valueOf(inum), false);
- println ();
+ print(String.valueOf(inum), true);
}
public void println (long lnum)
{
- print (String.valueOf(lnum), false);
- println ();
+ print(String.valueOf(lnum), true);
}
public void println (float fnum)
{
- print (String.valueOf(fnum), false);
- println ();
+ print(String.valueOf(fnum), true);
}
public void println (double dnum)
{
- print (String.valueOf(dnum), false);
- println ();
+ print(String.valueOf(dnum), true);
}
public void println (Object obj)
{
- print (String.valueOf(obj), false);
- println ();
+ print(obj == null ? "null" : obj.toString(), true);
}
public void println (String str)
{
- print (str, false);
- println ();
+ print (str == null ? "null" : str, true);
}
- public void println (char ch)
+ public synchronized void println (char ch)
{
- print (String.valueOf(ch), false);
- println ();
+ work[0] = ch;
+ print(work, 0, 1, true);
}
public void println (char[] charArray)
{
- print (String.valueOf(charArray), false);
- println ();
+ print(charArray, 0, charArray.length, true);
}
public PrintStream (OutputStream out)
{
- super (out);
- error = false;
- auto_flush = false;
+ this(out, false);
}
public PrintStream (OutputStream out, boolean af)
{
- super (out);
+ super ((this.out = (out instanceof BufferedOutputStream
+ ? (BufferedOutputStream) out
+ : new BufferedOutputStream(out, 250))));
+ converter = UnicodeToBytes.getDefaultEncoder();
error = false;
auto_flush = af;
}
@@ -197,7 +256,6 @@ public class PrintStream extends FilterOutputStream
try
{
out.write(oneByte);
- // JCL says to do this. I think it is wrong. FIXME.
if (auto_flush && oneByte == '\n')
out.flush();
}
@@ -212,10 +270,6 @@ public class PrintStream extends FilterOutputStream
try
{
out.write(buffer, offset, count);
- // FIXME: JCL says to flush. But elsewhere the JCL says to
- // use write to write the stringified form of an object, and
- // only to flush if that string contains the line separator.
- // How to resolve the contradiction?
if (auto_flush)
out.flush();
}
@@ -225,12 +279,17 @@ public class PrintStream extends FilterOutputStream
}
}
+ BufferedOutputStream out;
+ UnicodeToBytes converter;
+
+ char[] work = new char[100];
+
// True if error occurred.
private boolean error;
// True if auto-flush.
private boolean auto_flush;
// Line separator string.
- private static final String line_separator
- = System.getProperty("line.separator");
+ private static final char[] line_separator
+ = System.getProperty("line.separator").toCharArray();
}
diff --git a/libjava/java/io/RandomAccessFile.java b/libjava/java/io/RandomAccessFile.java
index d240e0df439..79dcec5104a 100644
--- a/libjava/java/io/RandomAccessFile.java
+++ b/libjava/java/io/RandomAccessFile.java
@@ -17,7 +17,7 @@ package java.io;
/* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3
* "The Java Language Specification", ISBN 0-201-63451-1
- * Status: not finished
+ * Status: Believe complete and correct to 1.1.
*/
public class RandomAccessFile implements DataOutput, DataInput
@@ -63,7 +63,6 @@ public class RandomAccessFile implements DataOutput, DataInput
}
fd = new FileDescriptor (fileName, fdmode);
- // FIXME: read-only mode.
out = new DataOutputStream (new FileOutputStream (fd));
in = new DataInputStream (new FileInputStream (fd));
}
@@ -115,13 +114,13 @@ public class RandomAccessFile implements DataOutput, DataInput
public final void readFully (byte[] buffer) throws IOException
{
- // FIXME.
+ in.readFully(buffer);
}
public final void readFully (byte[] buffer, int offset, int count)
throws IOException
{
- // FIXME.
+ in.readFully(buffer, offset, count);
}
public final int readInt () throws IOException
@@ -131,7 +130,6 @@ public class RandomAccessFile implements DataOutput, DataInput
public final String readLine () throws IOException
{
- // FIXME?
return in.readLine();
}
diff --git a/libjava/java/io/SequenceInputStream.java b/libjava/java/io/SequenceInputStream.java
index 771351784ab..e6c79f3fc10 100644
--- a/libjava/java/io/SequenceInputStream.java
+++ b/libjava/java/io/SequenceInputStream.java
@@ -33,7 +33,6 @@ public class SequenceInputStream extends InputStream
public SequenceInputStream(Enumeration e)
{
- // FIXME: Assumes that enum contains only InputStreams.
enum = e;
in = (InputStream) enum.nextElement();
in2 = null;
@@ -94,7 +93,6 @@ public class SequenceInputStream extends InputStream
{
InputStream nextIn = null;
- // FIXME: Assumes that enum contains only InputStreams.
if (enum != null)
{
if (enum.hasMoreElements())
diff --git a/libjava/java/lang/EcosProcess.java b/libjava/java/lang/EcosProcess.java
new file mode 100644
index 00000000000..83449169a64
--- /dev/null
+++ b/libjava/java/lang/EcosProcess.java
@@ -0,0 +1,59 @@
+// EcosProcess.java - Subclass of Process for eCos systems.
+
+/* Copyright (C) 1998, 1999 Cygnus Solutions
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+package java.lang;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.IOException;
+
+/**
+ * @author Tom Tromey <tromey@cygnus.com>
+ * @date May 11, 1999
+ */
+
+// This is entirely internal to our implementation.
+
+// This file is copied to `ConcreteProcess.java' before compilation.
+// Hence the class name apparently does not match the file name.
+final class ConcreteProcess extends Process
+{
+ // See natEcosProcess.cc to understand why this is native.
+ public native void destroy ();
+
+ public int exitValue ()
+ {
+ return 0;
+ }
+ public InputStream getErrorStream ()
+ {
+ return null;
+ }
+
+ public InputStream getInputStream ()
+ {
+ return null;
+ }
+
+ public OutputStream getOutputStream ()
+ {
+ return null;
+ }
+
+ public int waitFor () throws InterruptedException
+ {
+ return 0;
+ }
+
+ public ConcreteProcess (String[] progarray, String[] envp) throws IOException
+ {
+ throw new IOException ("eCos processes unimplemented");
+ }
+}
diff --git a/libjava/java/lang/Integer.java b/libjava/java/lang/Integer.java
index 54acc27ed6b..b4a4fc2a2ce 100644
--- a/libjava/java/lang/Integer.java
+++ b/libjava/java/lang/Integer.java
@@ -203,12 +203,15 @@ public final class Integer extends Number implements Comparable
int val = 0;
int digval;
+ int max = MAX_VALUE / radix;
+ // We can't directly write `max = (MAX_VALUE + 1) / radix'.
+ // So instead we fake it.
+ if (isNeg && MAX_VALUE % radix == radix - 1)
+ ++max;
+
for ( ; index < len; index++)
{
- // The the previous loop iteration left us with a negative
- // value (which can only be the most negative value, but we
- // don't check that), then having more digits is wrong.
- if (val == MIN_VALUE)
+ if (val < 0 || val > max)
throw new NumberFormatException();
if ((digval = Character.digit(str.charAt(index), radix)) < 0)
@@ -216,17 +219,9 @@ public final class Integer extends Number implements Comparable
// Throw an exception for overflow if result is negative.
// However, we special-case the most negative value.
- val *= radix;
- if (val < 0 || val + digval < 0)
- {
- if (isNeg && val + digval == MIN_VALUE)
- {
- // Ok.
- }
- else
- throw new NumberFormatException();
- }
- val += digval;
+ val = val * radix + digval;
+ if (val < 0 && (! isNeg || val != MIN_VALUE))
+ throw new NumberFormatException();
}
return isNeg ? -(val) : val;
diff --git a/libjava/java/lang/Long.java b/libjava/java/lang/Long.java
index 1ee8bf36277..f79ee7b78b2 100644
--- a/libjava/java/lang/Long.java
+++ b/libjava/java/lang/Long.java
@@ -205,12 +205,15 @@ public final class Long extends Number implements Comparable
long val = 0;
int digval;
+ long max = MAX_VALUE / radix;
+ // We can't directly write `max = (MAX_VALUE + 1) / radix'.
+ // So instead we fake it.
+ if (isNeg && MAX_VALUE % radix == radix - 1)
+ ++max;
+
for ( ; index < len; index++)
{
- // The the previous loop iteration left us with a negative
- // value (which can only be the most negative value, but we
- // don't check that), then having more digits is wrong.
- if (val == MIN_VALUE)
+ if (val < 0 || val > max)
throw new NumberFormatException();
if ((digval = Character.digit(str.charAt(index), radix)) < 0)
@@ -218,17 +221,9 @@ public final class Long extends Number implements Comparable
// Throw an exception for overflow if result is negative.
// However, we special-case the most negative value.
- val *= radix;
- if (val < 0 || val + digval < 0)
- {
- if (isNeg && val + digval == MIN_VALUE)
- {
- // Ok.
- }
- else
- throw new NumberFormatException();
- }
- val += digval;
+ val = val * radix + digval;
+ if (val < 0 && (! isNeg || val != MIN_VALUE))
+ throw new NumberFormatException();
}
return isNeg ? -(val) : val;
diff --git a/libjava/java/lang/PosixProcess.java b/libjava/java/lang/PosixProcess.java
new file mode 100644
index 00000000000..396287ad46d
--- /dev/null
+++ b/libjava/java/lang/PosixProcess.java
@@ -0,0 +1,74 @@
+// PosixProcess.java - Subclass of Process for POSIX systems.
+
+/* Copyright (C) 1998, 1999 Cygnus Solutions
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+package java.lang;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.IOException;
+
+/**
+ * @author Tom Tromey <tromey@cygnus.com>
+ * @date May 3, 1999
+ */
+
+// This is entirely internal to our implementation.
+
+// This file is copied to `ConcreteProcess.java' before compilation.
+// Hence the class name apparently does not match the file name.
+final class ConcreteProcess extends Process
+{
+ public native void destroy ();
+ public native int exitValue ();
+
+ public InputStream getErrorStream ()
+ {
+ return errorStream;
+ }
+
+ public InputStream getInputStream ()
+ {
+ return inputStream;
+ }
+
+ public OutputStream getOutputStream ()
+ {
+ return outputStream;
+ }
+
+ public native int waitFor () throws InterruptedException;
+
+ // This is used for actual initialization, as we can't write a
+ // native constructor.
+ public native void startProcess (String[] progarray, String[] envp)
+ throws IOException;
+
+ // This file is copied to `ConcreteProcess.java' before
+ // compilation. Hence the constructor name apparently does not
+ // match the file name.
+ public ConcreteProcess (String[] progarray, String[] envp) throws IOException
+ {
+ startProcess (progarray, envp);
+ }
+
+ // The process id. This is cast to a pid_t on the native side.
+ private long pid;
+
+ // True when child has exited.
+ private boolean hasExited;
+
+ // The exit status, if the child has exited.
+ private int status;
+
+ // The streams.
+ private InputStream errorStream;
+ private InputStream inputStream;
+ private OutputStream outputStream;
+}
diff --git a/libjava/java/lang/Runtime.java b/libjava/java/lang/Runtime.java
index baf1ae541b7..cdba9a36402 100644
--- a/libjava/java/lang/Runtime.java
+++ b/libjava/java/lang/Runtime.java
@@ -13,6 +13,7 @@ package java.lang;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
+import java.util.StringTokenizer;
/**
* @author Tom Tromey <tromey@cygnus.com>
@@ -30,15 +31,15 @@ public class Runtime
{
public Process exec (String prog) throws IOException
{
- String[] a = new String[1];
- a[0] = prog;
- return exec (a, null);
+ return exec (prog, null);
}
public Process exec (String prog, String[] envp) throws IOException
{
- String[] a = new String[1];
- a[0] = prog;
+ StringTokenizer st = new StringTokenizer(prog);
+ String[] a = new String[st.countTokens ()];
+ for (int i = 0; i < a.length; i++)
+ a[i] = st.nextToken ();
return exec (a, envp);
}
@@ -52,8 +53,7 @@ public class Runtime
SecurityManager s = System.getSecurityManager();
if (s != null)
s.checkExec(progarray[0]);
- // FIXME.
- return null;
+ return new ConcreteProcess (progarray, envp);
}
private final static void checkExit (int status)
@@ -94,18 +94,8 @@ public class Runtime
s.checkLink(lib);
}
- public synchronized void load (String pathname)
- {
- checkLink (pathname);
- // FIXME.
- throw new UnsatisfiedLinkError ("Runtime.load not implemented");
- }
- public synchronized void loadLibrary (String libname)
- {
- checkLink (libname);
- // FIXME.
- throw new UnsatisfiedLinkError ("Runtime.loadLibrary not implemented");
- }
+ public native void load (String pathname);
+ public native void loadLibrary (String libname);
public native void runFinalization ();
@@ -122,10 +112,13 @@ public class Runtime
public native void traceInstructions (boolean on);
public native void traceMethodCalls (boolean on);
+ // A helper for the constructor.
+ private final native void init ();
+
// The sole constructor.
private Runtime ()
{
- finalize_on_exit = false;
+ init ();
}
// Private data.
diff --git a/libjava/java/lang/String.java b/libjava/java/lang/String.java
index 1321676d0e5..55cc9cd9410 100644
--- a/libjava/java/lang/String.java
+++ b/libjava/java/lang/String.java
@@ -132,9 +132,27 @@ public final class String
public native void getChars (int srcBegin, int srcEnd,
char[] dst, int dstBegin);
- public byte[] getBytes () throws UnsupportedEncodingException
+ public byte[] getBytes ()
{
- return getBytes (System.getProperty("file.encoding", "8859_1"));
+ try
+ {
+ return getBytes (System.getProperty("file.encoding", "8859_1"));
+ }
+ catch (UnsupportedEncodingException x)
+ {
+ // This probably shouldn't happen, but could if file.encoding
+ // is somehow changed to a value we don't understand.
+ try
+ {
+ return getBytes ("8859_1");
+ }
+ catch (UnsupportedEncodingException x2)
+ {
+ // This really shouldn't happen, because the 8859_1
+ // encoding should always be available.
+ throw new InternalError ("couldn't find 8859_1 encoder");
+ }
+ }
}
public native byte[] getBytes (String enc)
diff --git a/libjava/java/lang/StringBuffer.java b/libjava/java/lang/StringBuffer.java
index 4127d54787f..70f78fbf8e5 100644
--- a/libjava/java/lang/StringBuffer.java
+++ b/libjava/java/lang/StringBuffer.java
@@ -98,7 +98,13 @@ public final class StringBuffer implements Serializable
{
if (shared || minimumCapacity > value.length)
{
- minimumCapacity = Math.max(minimumCapacity, value.length*2+2);
+ // We don't want to make a larger vector when `shared' is
+ // set. If we do, then setLength becomes very inefficient
+ // when repeatedly reusing a StringBuffer in a loop.
+ int max = (minimumCapacity > value.length
+ ? value.length*2+2
+ : value.length);
+ minimumCapacity = Math.max(minimumCapacity, max);
char[] nb = new char[minimumCapacity];
System.arraycopy(value, 0, nb, 0, count);
value = nb;
diff --git a/libjava/java/lang/dtoa.c b/libjava/java/lang/dtoa.c
index fae45c5aeb4..c55415413b1 100644
--- a/libjava/java/lang/dtoa.c
+++ b/libjava/java/lang/dtoa.c
@@ -1,906 +1,3 @@
-/****************************************************************
- *
- * The author of this software is David M. Gay.
- *
- * Copyright (c) 1991 by AT&T.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- *
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY. IN PARTICULAR, NEITHER THE AUTHOR NOR AT&T MAKES ANY
- * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
- * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- *
- ***************************************************************/
-
-/* Please send bug reports to
- David M. Gay
- AT&T Bell Laboratories, Room 2C-463
- 600 Mountain Avenue
- Murray Hill, NJ 07974-2070
- U.S.A.
- dmg@research.att.com or research!dmg
- */
-
-#include "mprec.h"
-
-static int
-_DEFUN (quorem,
- (b, S),
- _Jv_Bigint * b _AND _Jv_Bigint * S)
-{
- int n;
- long borrow, y;
- unsigned long carry, q, ys;
- unsigned long *bx, *bxe, *sx, *sxe;
-#ifdef Pack_32
- long z;
- unsigned long si, zs;
-#endif
-
- n = S->_wds;
-#ifdef DEBUG
- /*debug*/ if (b->_wds > n)
- /*debug*/ Bug ("oversize b in quorem");
-#endif
- if (b->_wds < n)
- return 0;
- sx = S->_x;
- sxe = sx + --n;
- bx = b->_x;
- bxe = bx + n;
- q = *bxe / (*sxe + 1); /* ensure q <= true quotient */
-#ifdef DEBUG
- /*debug*/ if (q > 9)
- /*debug*/ Bug ("oversized quotient in quorem");
-#endif
- if (q)
- {
- borrow = 0;
- carry = 0;
- do
- {
-#ifdef Pack_32
- si = *sx++;
- ys = (si & 0xffff) * q + carry;
- zs = (si >> 16) * q + (ys >> 16);
- carry = zs >> 16;
- y = (*bx & 0xffff) - (ys & 0xffff) + borrow;
- borrow = y >> 16;
- Sign_Extend (borrow, y);
- z = (*bx >> 16) - (zs & 0xffff) + borrow;
- borrow = z >> 16;
- Sign_Extend (borrow, z);
- Storeinc (bx, z, y);
-#else
- ys = *sx++ * q + carry;
- carry = ys >> 16;
- y = *bx - (ys & 0xffff) + borrow;
- borrow = y >> 16;
- Sign_Extend (borrow, y);
- *bx++ = y & 0xffff;
-#endif
- }
- while (sx <= sxe);
- if (!*bxe)
- {
- bx = b->_x;
- while (--bxe > bx && !*bxe)
- --n;
- b->_wds = n;
- }
- }
- if (cmp (b, S) >= 0)
- {
- q++;
- borrow = 0;
- carry = 0;
- bx = b->_x;
- sx = S->_x;
- do
- {
-#ifdef Pack_32
- si = *sx++;
- ys = (si & 0xffff) + carry;
- zs = (si >> 16) + (ys >> 16);
- carry = zs >> 16;
- y = (*bx & 0xffff) - (ys & 0xffff) + borrow;
- borrow = y >> 16;
- Sign_Extend (borrow, y);
- z = (*bx >> 16) - (zs & 0xffff) + borrow;
- borrow = z >> 16;
- Sign_Extend (borrow, z);
- Storeinc (bx, z, y);
-#else
- ys = *sx++ + carry;
- carry = ys >> 16;
- y = *bx - (ys & 0xffff) + borrow;
- borrow = y >> 16;
- Sign_Extend (borrow, y);
- *bx++ = y & 0xffff;
-#endif
- }
- while (sx <= sxe);
- bx = b->_x;
- bxe = bx + n;
- if (!*bxe)
- {
- while (--bxe > bx && !*bxe)
- --n;
- b->_wds = n;
- }
- }
- return q;
-}
-
-#ifdef DEBUG
-#include <stdio.h>
-
-void
-print (_Jv_Bigint * b)
-{
- int i, wds;
- unsigned long *x, y;
- wds = b->_wds;
- x = b->_x+wds;
- i = 0;
- do
- {
- x--;
- fprintf (stderr, "%08x", *x);
- }
- while (++i < wds);
- fprintf (stderr, "\n");
-}
-#endif
-
-/* dtoa for IEEE arithmetic (dmg): convert double to ASCII string.
- *
- * Inspired by "How to Print Floating-Point Numbers Accurately" by
- * Guy L. Steele, Jr. and Jon L. White [Proc. ACM SIGPLAN '90, pp. 92-101].
- *
- * Modifications:
- * 1. Rather than iterating, we use a simple numeric overestimate
- * to determine k = floor(log10(d)). We scale relevant
- * quantities using O(log2(k)) rather than O(k) multiplications.
- * 2. For some modes > 2 (corresponding to ecvt and fcvt), we don't
- * try to generate digits strictly left to right. Instead, we
- * compute with fewer bits and propagate the carry if necessary
- * when rounding the final digit up. This is often faster.
- * 3. Under the assumption that input will be rounded nearest,
- * mode 0 renders 1e23 as 1e23 rather than 9.999999999999999e22.
- * That is, we allow equality in stopping tests when the
- * round-nearest rule will give the same floating-point value
- * as would satisfaction of the stopping test with strict
- * inequality.
- * 4. We remove common factors of powers of 2 from relevant
- * quantities.
- * 5. When converting floating-point integers less than 1e16,
- * we use floating-point arithmetic rather than resorting
- * to multiple-precision integers.
- * 6. When asked to produce fewer than 15 digits, we first try
- * to get by with floating-point arithmetic; we resort to
- * multiple-precision integer arithmetic only if we cannot
- * guarantee that the floating-point calculation has given
- * the correctly rounded result. For k requested digits and
- * "uniformly" distributed input, the probability is
- * something like 10^(k-15) that we must resort to the long
- * calculation.
- */
-
-
-char *
-_DEFUN (_dtoa_r,
- (ptr, _d, mode, ndigits, decpt, sign, rve, float_type),
- struct _Jv_reent *ptr _AND
- double _d _AND
- int mode _AND
- int ndigits _AND
- int *decpt _AND
- int *sign _AND
- char **rve _AND
- int float_type)
-{
- /*
- float_type == 0 for double precision, 1 for float.
-
- Arguments ndigits, decpt, sign are similar to those
- of ecvt and fcvt; trailing zeros are suppressed from
- the returned string. If not null, *rve is set to point
- to the end of the return value. If d is +-Infinity or NaN,
- then *decpt is set to 9999.
-
- mode:
- 0 ==> shortest string that yields d when read in
- and rounded to nearest.
- 1 ==> like 0, but with Steele & White stopping rule;
- e.g. with IEEE P754 arithmetic , mode 0 gives
- 1e23 whereas mode 1 gives 9.999999999999999e22.
- 2 ==> max(1,ndigits) significant digits. This gives a
- return value similar to that of ecvt, except
- that trailing zeros are suppressed.
- 3 ==> through ndigits past the decimal point. This
- gives a return value similar to that from fcvt,
- except that trailing zeros are suppressed, and
- ndigits can be negative.
- 4-9 should give the same return values as 2-3, i.e.,
- 4 <= mode <= 9 ==> same return as mode
- 2 + (mode & 1). These modes are mainly for
- debugging; often they run slower but sometimes
- faster than modes 2-3.
- 4,5,8,9 ==> left-to-right digit generation.
- 6-9 ==> don't try fast floating-point estimate
- (if applicable).
-
- > 16 ==> Floating-point arg is treated as single precision.
-
- Values of mode other than 0-9 are treated as mode 0.
-
- Sufficient space is allocated to the return value
- to hold the suppressed trailing zeros.
- */
-
- int bbits, b2, b5, be, dig, i, ieps, ilim, ilim0, ilim1, j, j1, k, k0,
- k_check, leftright, m2, m5, s2, s5, spec_case, try_quick;
- union double_union d, d2, eps;
- long L;
-#ifndef Sudden_Underflow
- int denorm;
- unsigned long x;
-#endif
- _Jv_Bigint *b, *b1, *delta, *mlo, *mhi, *S;
- double ds;
- char *s, *s0;
-
- d.d = _d;
-
- if (ptr->_result)
- {
- ptr->_result->_k = ptr->_result_k;
- ptr->_result->_maxwds = 1 << ptr->_result_k;
- Bfree (ptr, ptr->_result);
- ptr->_result = 0;
- }
-
- if (word0 (d) & Sign_bit)
- {
- /* set sign for everything, including 0's and NaNs */
- *sign = 1;
- word0 (d) &= ~Sign_bit; /* clear sign bit */
- }
- else
- *sign = 0;
-
-#if defined(IEEE_Arith) + defined(VAX)
-#ifdef IEEE_Arith
- if ((word0 (d) & Exp_mask) == Exp_mask)
-#else
- if (word0 (d) == 0x8000)
-#endif
- {
- /* Infinity or NaN */
- *decpt = 9999;
- s =
-#ifdef IEEE_Arith
- !word1 (d) && !(word0 (d) & 0xfffff) ? "Infinity" :
-#endif
- "NaN";
- if (rve)
- *rve =
-#ifdef IEEE_Arith
- s[3] ? s + 8 :
-#endif
- s + 3;
- return s;
- }
-#endif
-#ifdef IBM
- d.d += 0; /* normalize */
-#endif
- if (!d.d)
- {
- *decpt = 1;
- s = "0";
- if (rve)
- *rve = s + 1;
- return s;
- }
-
- b = d2b (ptr, d.d, &be, &bbits);
-#ifdef Sudden_Underflow
- i = (int) (word0 (d) >> Exp_shift1 & (Exp_mask >> Exp_shift1));
-#else
- if ((i = (int) (word0 (d) >> Exp_shift1 & (Exp_mask >> Exp_shift1))))
- {
-#endif
- d2.d = d.d;
- word0 (d2) &= Frac_mask1;
- word0 (d2) |= Exp_11;
-#ifdef IBM
- if (j = 11 - hi0bits (word0 (d2) & Frac_mask))
- d2.d /= 1 << j;
-#endif
-
- /* log(x) ~=~ log(1.5) + (x-1.5)/1.5
- * log10(x) = log(x) / log(10)
- * ~=~ log(1.5)/log(10) + (x-1.5)/(1.5*log(10))
- * log10(d) = (i-Bias)*log(2)/log(10) + log10(d2)
- *
- * This suggests computing an approximation k to log10(d) by
- *
- * k = (i - Bias)*0.301029995663981
- * + ( (d2-1.5)*0.289529654602168 + 0.176091259055681 );
- *
- * We want k to be too large rather than too small.
- * The error in the first-order Taylor series approximation
- * is in our favor, so we just round up the constant enough
- * to compensate for any error in the multiplication of
- * (i - Bias) by 0.301029995663981; since |i - Bias| <= 1077,
- * and 1077 * 0.30103 * 2^-52 ~=~ 7.2e-14,
- * adding 1e-13 to the constant term more than suffices.
- * Hence we adjust the constant term to 0.1760912590558.
- * (We could get a more accurate k by invoking log10,
- * but this is probably not worthwhile.)
- */
-
- i -= Bias;
-#ifdef IBM
- i <<= 2;
- i += j;
-#endif
-#ifndef Sudden_Underflow
- denorm = 0;
- }
- else
- {
- /* d is denormalized */
-
- i = bbits + be + (Bias + (P - 1) - 1);
- x = i > 32 ? word0 (d) << (64 - i) | word1 (d) >> (i - 32)
- : word1 (d) << (32 - i);
- d2.d = x;
- word0 (d2) -= 31 * Exp_msk1; /* adjust exponent */
- i -= (Bias + (P - 1) - 1) + 1;
- denorm = 1;
- }
-#endif
- ds = (d2.d - 1.5) * 0.289529654602168 + 0.1760912590558 + i * 0.301029995663981;
- k = (int) ds;
- if (ds < 0. && ds != k)
- k--; /* want k = floor(ds) */
- k_check = 1;
- if (k >= 0 && k <= Ten_pmax)
- {
- if (d.d < tens[k])
- k--;
- k_check = 0;
- }
- j = bbits - i - 1;
- if (j >= 0)
- {
- b2 = 0;
- s2 = j;
- }
- else
- {
- b2 = -j;
- s2 = 0;
- }
- if (k >= 0)
- {
- b5 = 0;
- s5 = k;
- s2 += k;
- }
- else
- {
- b2 -= k;
- b5 = -k;
- s5 = 0;
- }
- if (mode < 0 || mode > 9)
- mode = 0;
- try_quick = 1;
- if (mode > 5)
- {
- mode -= 4;
- try_quick = 0;
- }
- leftright = 1;
- switch (mode)
- {
- case 0:
- case 1:
- ilim = ilim1 = -1;
- i = 18;
- ndigits = 0;
- break;
- case 2:
- leftright = 0;
- /* no break */
- case 4:
- if (ndigits <= 0)
- ndigits = 1;
- ilim = ilim1 = i = ndigits;
- break;
- case 3:
- leftright = 0;
- /* no break */
- case 5:
- i = ndigits + k + 1;
- ilim = i;
- ilim1 = i - 1;
- if (i <= 0)
- i = 1;
- }
- j = sizeof (unsigned long);
- for (ptr->_result_k = 0; (int) (sizeof (_Jv_Bigint) - sizeof (unsigned long)) + j <= i;
- j <<= 1)
- ptr->_result_k++;
- ptr->_result = Balloc (ptr, ptr->_result_k);
- s = s0 = (char *) ptr->_result;
-
- if (ilim >= 0 && ilim <= Quick_max && try_quick)
- {
- /* Try to get by with floating-point arithmetic. */
-
- i = 0;
- d2.d = d.d;
- k0 = k;
- ilim0 = ilim;
- ieps = 2; /* conservative */
- if (k > 0)
- {
- ds = tens[k & 0xf];
- j = k >> 4;
- if (j & Bletch)
- {
- /* prevent overflows */
- j &= Bletch - 1;
- d.d /= bigtens[n_bigtens - 1];
- ieps++;
- }
- for (; j; j >>= 1, i++)
- if (j & 1)
- {
- ieps++;
- ds *= bigtens[i];
- }
- d.d /= ds;
- }
- else if ((j1 = -k))
- {
- d.d *= tens[j1 & 0xf];
- for (j = j1 >> 4; j; j >>= 1, i++)
- if (j & 1)
- {
- ieps++;
- d.d *= bigtens[i];
- }
- }
- if (k_check && d.d < 1. && ilim > 0)
- {
- if (ilim1 <= 0)
- goto fast_failed;
- ilim = ilim1;
- k--;
- d.d *= 10.;
- ieps++;
- }
- eps.d = ieps * d.d + 7.;
- word0 (eps) -= (P - 1) * Exp_msk1;
- if (ilim == 0)
- {
- S = mhi = 0;
- d.d -= 5.;
- if (d.d > eps.d)
- goto one_digit;
- if (d.d < -eps.d)
- goto no_digits;
- goto fast_failed;
- }
-#ifndef No_leftright
- if (leftright)
- {
- /* Use Steele & White method of only
- * generating digits needed.
- */
- eps.d = 0.5 / tens[ilim - 1] - eps.d;
- for (i = 0;;)
- {
- L = d.d;
- d.d -= L;
- *s++ = '0' + (int) L;
- if (d.d < eps.d)
- goto ret1;
- if (1. - d.d < eps.d)
- goto bump_up;
- if (++i >= ilim)
- break;
- eps.d *= 10.;
- d.d *= 10.;
- }
- }
- else
- {
-#endif
- /* Generate ilim digits, then fix them up. */
- eps.d *= tens[ilim - 1];
- for (i = 1;; i++, d.d *= 10.)
- {
- L = d.d;
- d.d -= L;
- *s++ = '0' + (int) L;
- if (i == ilim)
- {
- if (d.d > 0.5 + eps.d)
- goto bump_up;
- else if (d.d < 0.5 - eps.d)
- {
- while (*--s == '0');
- s++;
- goto ret1;
- }
- break;
- }
- }
-#ifndef No_leftright
- }
-#endif
- fast_failed:
- s = s0;
- d.d = d2.d;
- k = k0;
- ilim = ilim0;
- }
-
- /* Do we have a "small" integer? */
-
- if (be >= 0 && k <= Int_max)
- {
- /* Yes. */
- ds = tens[k];
- if (ndigits < 0 && ilim <= 0)
- {
- S = mhi = 0;
- if (ilim < 0 || d.d <= 5 * ds)
- goto no_digits;
- goto one_digit;
- }
- for (i = 1;; i++)
- {
- L = d.d / ds;
- d.d -= L * ds;
-#ifdef Check_FLT_ROUNDS
- /* If FLT_ROUNDS == 2, L will usually be high by 1 */
- if (d.d < 0)
- {
- L--;
- d.d += ds;
- }
-#endif
- *s++ = '0' + (int) L;
- if (i == ilim)
- {
- d.d += d.d;
- if (d.d > ds || (d.d == ds && L & 1))
- {
- bump_up:
- while (*--s == '9')
- if (s == s0)
- {
- k++;
- *s = '0';
- break;
- }
- ++*s++;
- }
- break;
- }
- if (!(d.d *= 10.))
- break;
- }
- goto ret1;
- }
-
- m2 = b2;
- m5 = b5;
- mhi = mlo = 0;
- if (leftright)
- {
- if (mode < 2)
- {
- i =
-#ifndef Sudden_Underflow
- denorm ? be + (Bias + (P - 1) - 1 + 1) :
-#endif
-#ifdef IBM
- 1 + 4 * P - 3 - bbits + ((bbits + be - 1) & 3);
-#else
- 1 + P - bbits;
-#endif
- }
- else
- {
- j = ilim - 1;
- if (m5 >= j)
- m5 -= j;
- else
- {
- s5 += j -= m5;
- b5 += j;
- m5 = 0;
- }
- if ((i = ilim) < 0)
- {
- m2 -= i;
- i = 0;
- }
- }
- b2 += i;
- s2 += i;
- mhi = i2b (ptr, 1);
- }
- if (m2 > 0 && s2 > 0)
- {
- i = m2 < s2 ? m2 : s2;
- b2 -= i;
- m2 -= i;
- s2 -= i;
- }
- if (b5 > 0)
- {
- if (leftright)
- {
- if (m5 > 0)
- {
- mhi = pow5mult (ptr, mhi, m5);
- b1 = mult (ptr, mhi, b);
- Bfree (ptr, b);
- b = b1;
- }
- if ((j = b5 - m5))
- b = pow5mult (ptr, b, j);
- }
- else
- b = pow5mult (ptr, b, b5);
- }
- S = i2b (ptr, 1);
- if (s5 > 0)
- S = pow5mult (ptr, S, s5);
-
- /* Check for special case that d is a normalized power of 2. */
-
- if (mode < 2)
- {
- if (!word1 (d) && !(word0 (d) & Bndry_mask)
-#ifndef Sudden_Underflow
- && word0 (d) & Exp_mask
-#endif
- )
- {
- /* The special case */
- b2 += Log2P;
- s2 += Log2P;
- spec_case = 1;
- }
- else
- spec_case = 0;
- }
-
- /* Arrange for convenient computation of quotients:
- * shift left if necessary so divisor has 4 leading 0 bits.
- *
- * Perhaps we should just compute leading 28 bits of S once
- * and for all and pass them and a shift to quorem, so it
- * can do shifts and ors to compute the numerator for q.
- */
-
-#ifdef Pack_32
- if ((i = ((s5 ? 32 - hi0bits (S->_x[S->_wds - 1]) : 1) + s2) & 0x1f))
- i = 32 - i;
-#else
- if ((i = ((s5 ? 32 - hi0bits (S->_x[S->_wds - 1]) : 1) + s2) & 0xf))
- i = 16 - i;
-#endif
- if (i > 4)
- {
- i -= 4;
- b2 += i;
- m2 += i;
- s2 += i;
- }
- else if (i < 4)
- {
- i += 28;
- b2 += i;
- m2 += i;
- s2 += i;
- }
- if (b2 > 0)
- b = lshift (ptr, b, b2);
- if (s2 > 0)
- S = lshift (ptr, S, s2);
- if (k_check)
- {
- if (cmp (b, S) < 0)
- {
- k--;
- b = multadd (ptr, b, 10, 0); /* we botched the k estimate */
- if (leftright)
- mhi = multadd (ptr, mhi, 10, 0);
- ilim = ilim1;
- }
- }
- if (ilim <= 0 && mode > 2)
- {
- if (ilim < 0 || cmp (b, S = multadd (ptr, S, 5, 0)) <= 0)
- {
- /* no digits, fcvt style */
- no_digits:
- k = -1 - ndigits;
- goto ret;
- }
- one_digit:
- *s++ = '1';
- k++;
- goto ret;
- }
- if (leftright)
- {
- if (m2 > 0)
- mhi = lshift (ptr, mhi, m2);
-
- /* Single precision case, */
- if (float_type)
- mhi = lshift (ptr, mhi, 29);
-
- /* Compute mlo -- check for special case
- * that d is a normalized power of 2.
- */
-
- mlo = mhi;
- if (spec_case)
- {
- mhi = Balloc (ptr, mhi->_k);
- Bcopy (mhi, mlo);
- mhi = lshift (ptr, mhi, Log2P);
- }
-
- for (i = 1;; i++)
- {
- dig = quorem (b, S) + '0';
- /* Do we yet have the shortest decimal string
- * that will round to d?
- */
- j = cmp (b, mlo);
- delta = diff (ptr, S, mhi);
- j1 = delta->_sign ? 1 : cmp (b, delta);
- Bfree (ptr, delta);
-#ifndef ROUND_BIASED
- if (j1 == 0 && !mode && !(word1 (d) & 1))
- {
- if (dig == '9')
- goto round_9_up;
- if (j > 0)
- dig++;
- *s++ = dig;
- goto ret;
- }
-#endif
- if (j < 0 || (j == 0 && !mode
-#ifndef ROUND_BIASED
- && !(word1 (d) & 1)
-#endif
- ))
- {
- if (j1 > 0)
- {
- b = lshift (ptr, b, 1);
- j1 = cmp (b, S);
- if ((j1 > 0 || (j1 == 0 && dig & 1))
- && dig++ == '9')
- goto round_9_up;
- }
- *s++ = dig;
- goto ret;
- }
- if (j1 > 0)
- {
- if (dig == '9')
- { /* possible if i == 1 */
- round_9_up:
- *s++ = '9';
- goto roundoff;
- }
- *s++ = dig + 1;
- goto ret;
- }
- *s++ = dig;
- if (i == ilim)
- break;
- b = multadd (ptr, b, 10, 0);
- if (mlo == mhi)
- mlo = mhi = multadd (ptr, mhi, 10, 0);
- else
- {
- mlo = multadd (ptr, mlo, 10, 0);
- mhi = multadd (ptr, mhi, 10, 0);
- }
- }
- }
- else
- for (i = 1;; i++)
- {
- *s++ = dig = quorem (b, S) + '0';
- if (i >= ilim)
- break;
- b = multadd (ptr, b, 10, 0);
- }
-
- /* Round off last digit */
-
- b = lshift (ptr, b, 1);
- j = cmp (b, S);
- if (j > 0 || (j == 0 && dig & 1))
- {
- roundoff:
- while (*--s == '9')
- if (s == s0)
- {
- k++;
- *s++ = '1';
- goto ret;
- }
- ++*s++;
- }
- else
- {
- while (*--s == '0');
- s++;
- }
-ret:
- Bfree (ptr, S);
- if (mhi)
- {
- if (mlo && mlo != mhi)
- Bfree (ptr, mlo);
- Bfree (ptr, mhi);
- }
-ret1:
- Bfree (ptr, b);
- *s = 0;
- *decpt = k + 1;
- if (rve)
- *rve = s;
- return s0;
-}
-
-
-_VOID
-_DEFUN (_dtoa,
- (_d, mode, ndigits, decpt, sign, rve, buf, float_type),
- double _d _AND
- int mode _AND
- int ndigits _AND
- int *decpt _AND
- int *sign _AND
- char **rve _AND
- char *buf _AND
- int float_type)
-{
- struct _Jv_reent reent;
- char *p;
- memset (&reent, 0, sizeof reent);
-
- p = _dtoa_r (&reent, _d, mode, ndigits, decpt, sign, rve, float_type);
- strcpy (buf, p);
-
- return;
-}
-
-
+ /*
+ && word0(d) & Exp_mask
+ struct _Jv_reent reent;
diff --git a/libjava/java/lang/e_acos.c b/libjava/java/lang/e_acos.c
index 319b1d56fa0..ded6cbb2f97 100644
--- a/libjava/java/lang/e_acos.c
+++ b/libjava/java/lang/e_acos.c
@@ -1,111 +1,7 @@
-
-/* @(#)e_acos.c 5.1 93/09/24 */
-/*
- * ====================================================
- * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
- *
- * Developed at SunPro, a Sun Microsystems, Inc. business.
- * Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice
- * is preserved.
- * ====================================================
- */
-
-/* __ieee754_acos(x)
- * Method :
- * acos(x) = pi/2 - asin(x)
- * acos(-x) = pi/2 + asin(x)
- * For |x|<=0.5
- * acos(x) = pi/2 - (x + x*x^2*R(x^2)) (see asin.c)
- * For x>0.5
- * acos(x) = pi/2 - (pi/2 - 2asin(sqrt((1-x)/2)))
- * = 2asin(sqrt((1-x)/2))
- * = 2s + 2s*z*R(z) ...z=(1-x)/2, s=sqrt(z)
- * = 2f + (2c + 2s*z*R(z))
- * where f=hi part of s, and c = (z-f*f)/(s+f) is the correction term
- * for f so that f+c ~ sqrt(z).
- * For x<-0.5
- * acos(x) = pi - 2asin(sqrt((1-|x|)/2))
- * = pi - 0.5*(s+s*z*R(z)), where z=(1-|x|)/2,s=sqrt(z)
- *
- * Special cases:
- * if x is NaN, return x itself;
- * if |x|>1, return NaN with invalid signal.
- *
- * Function needed: sqrt
- */
-
-#include "fdlibm.h"
-
-#ifndef _DOUBLE_IS_32BITS
-
-#ifdef __STDC__
-static const double
-#else
-static double
-#endif
-one= 1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */
-pi = 3.14159265358979311600e+00, /* 0x400921FB, 0x54442D18 */
-pio2_hi = 1.57079632679489655800e+00, /* 0x3FF921FB, 0x54442D18 */
-pio2_lo = 6.12323399573676603587e-17, /* 0x3C91A626, 0x33145C07 */
-pS0 = 1.66666666666666657415e-01, /* 0x3FC55555, 0x55555555 */
-pS1 = -3.25565818622400915405e-01, /* 0xBFD4D612, 0x03EB6F7D */
-pS2 = 2.01212532134862925881e-01, /* 0x3FC9C155, 0x0E884455 */
-pS3 = -4.00555345006794114027e-02, /* 0xBFA48228, 0xB5688F3B */
-pS4 = 7.91534994289814532176e-04, /* 0x3F49EFE0, 0x7501B288 */
-pS5 = 3.47933107596021167570e-05, /* 0x3F023DE1, 0x0DFDF709 */
-qS1 = -2.40339491173441421878e+00, /* 0xC0033A27, 0x1C8A2D4B */
-qS2 = 2.02094576023350569471e+00, /* 0x40002AE5, 0x9C598AC8 */
-qS3 = -6.88283971605453293030e-01, /* 0xBFE6066C, 0x1B8D0159 */
-qS4 = 7.70381505559019352791e-02; /* 0x3FB3B8C5, 0xB12E9282 */
-
-#ifdef __STDC__
- double __ieee754_acos(double x)
-#else
- double __ieee754_acos(x)
- double x;
-#endif
-{
- double z,p,q,r,w,s,c,df;
- __int32_t hx,ix;
- GET_HIGH_WORD(hx,x);
- ix = hx&0x7fffffff;
- if(ix>=0x3ff00000) { /* |x| >= 1 */
- __uint32_t lx;
- GET_LOW_WORD(lx,x);
- if(((ix-0x3ff00000)|lx)==0) { /* |x|==1 */
- if(hx>0) return 0.0; /* acos(1) = 0 */
- else return pi+2.0*pio2_lo; /* acos(-1)= pi */
- }
- return (x-x)/(x-x); /* acos(|x|>1) is NaN */
- }
- if(ix<0x3fe00000) { /* |x| < 0.5 */
- if(ix<=0x3c600000) return pio2_hi+pio2_lo;/*if|x|<2**-57*/
- z = x*x;
- p = z*(pS0+z*(pS1+z*(pS2+z*(pS3+z*(pS4+z*pS5)))));
- q = one+z*(qS1+z*(qS2+z*(qS3+z*qS4)));
- r = p/q;
- return pio2_hi - (x - (pio2_lo-x*r));
- } else if (hx<0) { /* x < -0.5 */
- z = (one+x)*0.5;
- p = z*(pS0+z*(pS1+z*(pS2+z*(pS3+z*(pS4+z*pS5)))));
- q = one+z*(qS1+z*(qS2+z*(qS3+z*qS4)));
- s = __ieee754_sqrt(z);
- r = p/q;
- w = r*s-pio2_lo;
- return pi - 2.0*(s+w);
- } else { /* x > 0.5 */
- z = (one-x)*0.5;
- s = __ieee754_sqrt(z);
- df = s;
- SET_LOW_WORD(df,0);
- c = (z-df*df)/(s+df);
- p = z*(pS0+z*(pS1+z*(pS2+z*(pS3+z*(pS4+z*pS5)))));
- q = one+z*(qS1+z*(qS2+z*(qS3+z*qS4)));
- r = p/q;
- w = r*s+c;
- return 2.0*(df+w);
- }
-}
-
-#endif /* defined(_DOUBLE_IS_32BITS) */
+ * software is freely granted, provided that this notice
+ * Method :
+ * = 2asin(sqrt((1-x)/2))
+static const double
+static double
+ int32_t hx,ix;
+ uint32_t lx;
diff --git a/libjava/java/lang/e_asin.c b/libjava/java/lang/e_asin.c
index 559f2884a26..64e99388678 100644
--- a/libjava/java/lang/e_asin.c
+++ b/libjava/java/lang/e_asin.c
@@ -1,120 +1,2 @@
-
-/* @(#)e_asin.c 5.1 93/09/24 */
-/*
- * ====================================================
- * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
- *
- * Developed at SunPro, a Sun Microsystems, Inc. business.
- * Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice
- * is preserved.
- * ====================================================
- */
-
-/* __ieee754_asin(x)
- * Method :
- * Since asin(x) = x + x^3/6 + x^5*3/40 + x^7*15/336 + ...
- * we approximate asin(x) on [0,0.5] by
- * asin(x) = x + x*x^2*R(x^2)
- * where
- * R(x^2) is a rational approximation of (asin(x)-x)/x^3
- * and its remez error is bounded by
- * |(asin(x)-x)/x^3 - R(x^2)| < 2^(-58.75)
- *
- * For x in [0.5,1]
- * asin(x) = pi/2-2*asin(sqrt((1-x)/2))
- * Let y = (1-x), z = y/2, s := sqrt(z), and pio2_hi+pio2_lo=pi/2;
- * then for x>0.98
- * asin(x) = pi/2 - 2*(s+s*z*R(z))
- * = pio2_hi - (2*(s+s*z*R(z)) - pio2_lo)
- * For x<=0.98, let pio4_hi = pio2_hi/2, then
- * f = hi part of s;
- * c = sqrt(z) - f = (z-f*f)/(s+f) ...f+c=sqrt(z)
- * and
- * asin(x) = pi/2 - 2*(s+s*z*R(z))
- * = pio4_hi+(pio4-2s)-(2s*z*R(z)-pio2_lo)
- * = pio4_hi+(pio4-2f)-(2s*z*R(z)-(pio2_lo+2c))
- *
- * Special cases:
- * if x is NaN, return x itself;
- * if |x|>1, return NaN with invalid signal.
- *
- */
-
-
-#include "fdlibm.h"
-
-#ifndef _DOUBLE_IS_32BITS
-
-#ifdef __STDC__
-static const double
-#else
-static double
-#endif
-one = 1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */
-huge = 1.000e+300,
-pio2_hi = 1.57079632679489655800e+00, /* 0x3FF921FB, 0x54442D18 */
-pio2_lo = 6.12323399573676603587e-17, /* 0x3C91A626, 0x33145C07 */
-pio4_hi = 7.85398163397448278999e-01, /* 0x3FE921FB, 0x54442D18 */
- /* coefficient for R(x^2) */
-pS0 = 1.66666666666666657415e-01, /* 0x3FC55555, 0x55555555 */
-pS1 = -3.25565818622400915405e-01, /* 0xBFD4D612, 0x03EB6F7D */
-pS2 = 2.01212532134862925881e-01, /* 0x3FC9C155, 0x0E884455 */
-pS3 = -4.00555345006794114027e-02, /* 0xBFA48228, 0xB5688F3B */
-pS4 = 7.91534994289814532176e-04, /* 0x3F49EFE0, 0x7501B288 */
-pS5 = 3.47933107596021167570e-05, /* 0x3F023DE1, 0x0DFDF709 */
-qS1 = -2.40339491173441421878e+00, /* 0xC0033A27, 0x1C8A2D4B */
-qS2 = 2.02094576023350569471e+00, /* 0x40002AE5, 0x9C598AC8 */
-qS3 = -6.88283971605453293030e-01, /* 0xBFE6066C, 0x1B8D0159 */
-qS4 = 7.70381505559019352791e-02; /* 0x3FB3B8C5, 0xB12E9282 */
-
-#ifdef __STDC__
- double __ieee754_asin(double x)
-#else
- double __ieee754_asin(x)
- double x;
-#endif
-{
- double t,w,p,q,c,r,s;
- __int32_t hx,ix;
- GET_HIGH_WORD(hx,x);
- ix = hx&0x7fffffff;
- if(ix>= 0x3ff00000) { /* |x|>= 1 */
- __uint32_t lx;
- GET_LOW_WORD(lx,x);
- if(((ix-0x3ff00000)|lx)==0)
- /* asin(1)=+-pi/2 with inexact */
- return x*pio2_hi+x*pio2_lo;
- return (x-x)/(x-x); /* asin(|x|>1) is NaN */
- } else if (ix<0x3fe00000) { /* |x|<0.5 */
- if(ix<0x3e400000) { /* if |x| < 2**-27 */
- if(huge+x>one) return x;/* return x with inexact if x!=0*/
- } else
- t = x*x;
- p = t*(pS0+t*(pS1+t*(pS2+t*(pS3+t*(pS4+t*pS5)))));
- q = one+t*(qS1+t*(qS2+t*(qS3+t*qS4)));
- w = p/q;
- return x+x*w;
- }
- /* 1> |x|>= 0.5 */
- w = one-fabs(x);
- t = w*0.5;
- p = t*(pS0+t*(pS1+t*(pS2+t*(pS3+t*(pS4+t*pS5)))));
- q = one+t*(qS1+t*(qS2+t*(qS3+t*qS4)));
- s = __ieee754_sqrt(t);
- if(ix>=0x3FEF3333) { /* if |x| > 0.975 */
- w = p/q;
- t = pio2_hi-(2.0*(s+s*w)-pio2_lo);
- } else {
- w = s;
- SET_LOW_WORD(w,0);
- c = (t-w*w)/(s+w);
- r = p/q;
- p = 2.0*s*r-(pio2_lo-2.0*c);
- q = pio4_hi-2.0*w;
- t = pio4_hi-(p-q);
- }
- if(hx>0) return t; else return -t;
-}
-
-#endif /* defined(_DOUBLE_IS_32BITS) */
+ int32_t hx,ix;
+ uint32_t lx;
diff --git a/libjava/java/lang/e_atan2.c b/libjava/java/lang/e_atan2.c
index 8e9650f290d..f0317f7e24a 100644
--- a/libjava/java/lang/e_atan2.c
+++ b/libjava/java/lang/e_atan2.c
@@ -1,131 +1,13 @@
-
-/* @(#)e_atan2.c 5.1 93/09/24 */
-/*
- * ====================================================
- * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
- *
- * Developed at SunPro, a Sun Microsystems, Inc. business.
- * Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice
- * is preserved.
- * ====================================================
- *
- */
-
-/* __ieee754_atan2(y,x)
- * Method :
- * 1. Reduce y to positive by atan2(y,x)=-atan2(-y,x).
- * 2. Reduce x to positive by (if x and y are unexceptional):
- * ARG (x+iy) = arctan(y/x) ... if x > 0,
- * ARG (x+iy) = pi - arctan[y/(-x)] ... if x < 0,
- *
- * Special cases:
- *
- * ATAN2((anything), NaN ) is NaN;
- * ATAN2(NAN , (anything) ) is NaN;
- * ATAN2(+-0, +(anything but NaN)) is +-0 ;
- * ATAN2(+-0, -(anything but NaN)) is +-pi ;
- * ATAN2(+-(anything but 0 and NaN), 0) is +-pi/2;
- * ATAN2(+-(anything but INF and NaN), +INF) is +-0 ;
- * ATAN2(+-(anything but INF and NaN), -INF) is +-pi;
- * ATAN2(+-INF,+INF ) is +-pi/4 ;
- * ATAN2(+-INF,-INF ) is +-3pi/4;
- * ATAN2(+-INF, (anything but,0,NaN, and INF)) is +-pi/2;
- *
- * Constants:
- * The hexadecimal values are the intended ones for the following
- * constants. The decimal values may be used, provided that the
- * compiler will convert from decimal to binary accurately enough
- * to produce the hexadecimal values shown.
- */
-
-#include "fdlibm.h"
-
-#ifndef _DOUBLE_IS_32BITS
-
-#ifdef __STDC__
-static const double
-#else
-static double
-#endif
-tiny = 1.0e-300,
-zero = 0.0,
-pi_o_4 = 7.8539816339744827900E-01, /* 0x3FE921FB, 0x54442D18 */
-pi_o_2 = 1.5707963267948965580E+00, /* 0x3FF921FB, 0x54442D18 */
-pi = 3.1415926535897931160E+00, /* 0x400921FB, 0x54442D18 */
-pi_lo = 1.2246467991473531772E-16; /* 0x3CA1A626, 0x33145C07 */
-
-#ifdef __STDC__
- double __ieee754_atan2(double y, double x)
-#else
- double __ieee754_atan2(y,x)
- double y,x;
-#endif
-{
- double z;
- __int32_t k,m,hx,hy,ix,iy;
- __uint32_t lx,ly;
-
- EXTRACT_WORDS(hx,lx,x);
- ix = hx&0x7fffffff;
- EXTRACT_WORDS(hy,ly,y);
- iy = hy&0x7fffffff;
- if(((ix|((lx|-lx)>>31))>0x7ff00000)||
- ((iy|((ly|-ly)>>31))>0x7ff00000)) /* x or y is NaN */
- return x+y;
- if(((hx-0x3ff00000)|lx)==0) return atan(y); /* x=1.0 */
- m = ((hy>>31)&1)|((hx>>30)&2); /* 2*sign(x)+sign(y) */
-
- /* when y = 0 */
- if((iy|ly)==0) {
- switch(m) {
- case 0:
- case 1: return y; /* atan(+-0,+anything)=+-0 */
- case 2: return pi+tiny;/* atan(+0,-anything) = pi */
- case 3: return -pi-tiny;/* atan(-0,-anything) =-pi */
- }
- }
- /* when x = 0 */
- if((ix|lx)==0) return (hy<0)? -pi_o_2-tiny: pi_o_2+tiny;
-
- /* when x is INF */
- if(ix==0x7ff00000) {
- if(iy==0x7ff00000) {
- switch(m) {
- case 0: return pi_o_4+tiny;/* atan(+INF,+INF) */
- case 1: return -pi_o_4-tiny;/* atan(-INF,+INF) */
- case 2: return 3.0*pi_o_4+tiny;/*atan(+INF,-INF)*/
- case 3: return -3.0*pi_o_4-tiny;/*atan(-INF,-INF)*/
- }
- } else {
- switch(m) {
- case 0: return zero ; /* atan(+...,+INF) */
- case 1: return -zero ; /* atan(-...,+INF) */
- case 2: return pi+tiny ; /* atan(+...,-INF) */
- case 3: return -pi-tiny ; /* atan(-...,-INF) */
- }
- }
- }
- /* when y is INF */
- if(iy==0x7ff00000) return (hy<0)? -pi_o_2-tiny: pi_o_2+tiny;
-
- /* compute y/x */
- k = (iy-ix)>>20;
- if(k > 60) z=pi_o_2+0.5*pi_lo; /* |y/x| > 2**60 */
- else if(hx<0&&k<-60) z=0.0; /* |y|/x < -2**60 */
- else z=atan(fabs(y/x)); /* safe to do y/x */
- switch (m) {
- case 0: return z ; /* atan(+,+) */
- case 1: {
- __uint32_t zh;
- GET_HIGH_WORD(zh,z);
- SET_HIGH_WORD(z,zh ^ 0x80000000);
- }
- return z ; /* atan(-,+) */
- case 2: return pi-(z-pi_lo);/* atan(+,-) */
- default: /* case 3 */
- return (z-pi_lo)-pi;/* atan(-,-) */
- }
-}
-
-#endif /* defined(_DOUBLE_IS_32BITS) */
+ * software is freely granted, provided that this notice
+ * 2. Reduce x to positive by (if x and y are unexceptional):
+ * The hexadecimal values are the intended ones for the following
+ * constants. The decimal values may be used, provided that the
+ * compiler will convert from decimal to binary accurately enough
+static const double
+static double
+{
+ int32_t k,m,hx,hy,ix,iy;
+ uint32_t lx,ly;
+ case 0:
+
+ uint32_t zh;
diff --git a/libjava/java/lang/e_exp.c b/libjava/java/lang/e_exp.c
index ce093c61065..7c377ea71d4 100644
--- a/libjava/java/lang/e_exp.c
+++ b/libjava/java/lang/e_exp.c
@@ -1,167 +1,20 @@
-
-/* @(#)e_exp.c 5.1 93/09/24 */
-/*
- * ====================================================
- * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
- *
- * Developed at SunPro, a Sun Microsystems, Inc. business.
- * Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice
- * is preserved.
- * ====================================================
- */
-
-/* __ieee754_exp(x)
- * Returns the exponential of x.
- *
- * Method
- * 1. Argument reduction:
- * Reduce x to an r so that |r| <= 0.5*ln2 ~ 0.34658.
- * Given x, find r and integer k such that
- *
- * x = k*ln2 + r, |r| <= 0.5*ln2.
- *
- * Here r will be represented as r = hi-lo for better
- * accuracy.
- *
- * 2. Approximation of exp(r) by a special rational function on
- * the interval [0,0.34658]:
- * Write
- * R(r**2) = r*(exp(r)+1)/(exp(r)-1) = 2 + r*r/6 - r**4/360 + ...
- * We use a special Reme algorithm on [0,0.34658] to generate
- * a polynomial of degree 5 to approximate R. The maximum error
- * of this polynomial approximation is bounded by 2**-59. In
- * other words,
- * R(z) ~ 2.0 + P1*z + P2*z**2 + P3*z**3 + P4*z**4 + P5*z**5
- * (where z=r*r, and the values of P1 to P5 are listed below)
- * and
- * | 5 | -59
- * | 2.0+P1*z+...+P5*z - R(z) | <= 2
- * | |
- * The computation of exp(r) thus becomes
- * 2*r
- * exp(r) = 1 + -------
- * R - r
- * r*R1(r)
- * = 1 + r + ----------- (for better accuracy)
- * 2 - R1(r)
- * where
- * 2 4 10
- * R1(r) = r - (P1*r + P2*r + ... + P5*r ).
- *
- * 3. Scale back to obtain exp(x):
- * From step 1, we have
- * exp(x) = 2^k * exp(r)
- *
- * Special cases:
- * exp(INF) is INF, exp(NaN) is NaN;
- * exp(-INF) is 0, and
- * for finite argument, only exp(0)=1 is exact.
- *
- * Accuracy:
- * according to an error analysis, the error is always less than
- * 1 ulp (unit in the last place).
- *
- * Misc. info.
- * For IEEE double
- * if x > 7.09782712893383973096e+02 then exp(x) overflow
- * if x < -7.45133219101941108420e+02 then exp(x) underflow
- *
- * Constants:
- * The hexadecimal values are the intended ones for the following
- * constants. The decimal values may be used, provided that the
- * compiler will convert from decimal to binary accurately enough
- * to produce the hexadecimal values shown.
- */
-
-#include "fdlibm.h"
-
-#ifndef _DOUBLE_IS_32BITS
-
-#ifdef __STDC__
-static const double
-#else
-static double
-#endif
-one = 1.0,
-halF[2] = {0.5,-0.5,},
-huge = 1.0e+300,
-twom1000= 9.33263618503218878990e-302, /* 2**-1000=0x01700000,0*/
-o_threshold= 7.09782712893383973096e+02, /* 0x40862E42, 0xFEFA39EF */
-u_threshold= -7.45133219101941108420e+02, /* 0xc0874910, 0xD52D3051 */
-ln2HI[2] ={ 6.93147180369123816490e-01, /* 0x3fe62e42, 0xfee00000 */
- -6.93147180369123816490e-01,},/* 0xbfe62e42, 0xfee00000 */
-ln2LO[2] ={ 1.90821492927058770002e-10, /* 0x3dea39ef, 0x35793c76 */
- -1.90821492927058770002e-10,},/* 0xbdea39ef, 0x35793c76 */
-invln2 = 1.44269504088896338700e+00, /* 0x3ff71547, 0x652b82fe */
-P1 = 1.66666666666666019037e-01, /* 0x3FC55555, 0x5555553E */
-P2 = -2.77777777770155933842e-03, /* 0xBF66C16C, 0x16BEBD93 */
-P3 = 6.61375632143793436117e-05, /* 0x3F11566A, 0xAF25DE2C */
-P4 = -1.65339022054652515390e-06, /* 0xBEBBBD41, 0xC5D26BF1 */
-P5 = 4.13813679705723846039e-08; /* 0x3E663769, 0x72BEA4D0 */
-
-
-#ifdef __STDC__
- double __ieee754_exp(double x) /* default IEEE double exp */
-#else
- double __ieee754_exp(x) /* default IEEE double exp */
- double x;
-#endif
-{
- double y,hi,lo,c,t;
- __int32_t k,xsb;
- __uint32_t hx;
-
- GET_HIGH_WORD(hx,x);
- xsb = (hx>>31)&1; /* sign bit of x */
- hx &= 0x7fffffff; /* high word of |x| */
-
- /* filter out non-finite argument */
- if(hx >= 0x40862E42) { /* if |x|>=709.78... */
- if(hx>=0x7ff00000) {
- __uint32_t lx;
- GET_LOW_WORD(lx,x);
- if(((hx&0xfffff)|lx)!=0)
- return x+x; /* NaN */
- else return (xsb==0)? x:0.0; /* exp(+-inf)={inf,0} */
- }
- if(x > o_threshold) return huge*huge; /* overflow */
- if(x < u_threshold) return twom1000*twom1000; /* underflow */
- }
-
- /* argument reduction */
- if(hx > 0x3fd62e42) { /* if |x| > 0.5 ln2 */
- if(hx < 0x3FF0A2B2) { /* and |x| < 1.5 ln2 */
- hi = x-ln2HI[xsb]; lo=ln2LO[xsb]; k = 1-xsb-xsb;
- } else {
- k = invln2*x+halF[xsb];
- t = k;
- hi = x - t*ln2HI[0]; /* t*ln2HI is exact here */
- lo = t*ln2LO[0];
- }
- x = hi - lo;
- }
- else if(hx < 0x3e300000) { /* when |x|<2**-28 */
- if(huge+x>one) return one+x;/* trigger inexact */
- }
- else k = 0;
-
- /* x is now in primary range */
- t = x*x;
- c = x - t*(P1+t*(P2+t*(P3+t*(P4+t*P5))));
- if(k==0) return one-((x*c)/(c-2.0)-x);
- else y = one-((lo-(x*c)/(2.0-c))-hi);
- if(k >= -1021) {
- __uint32_t hy;
- GET_HIGH_WORD(hy,y);
- SET_HIGH_WORD(y,hy+(k<<20)); /* add k to y's exponent */
- return y;
- } else {
- __uint32_t hy;
- GET_HIGH_WORD(hy,y);
- SET_HIGH_WORD(y,hy+((k+1000)<<20)); /* add k to y's exponent */
- return y*twom1000;
+ * software is freely granted, provided that this notice
+ * x = k*ln2 + r, |r| <= 0.5*ln2.
+ * Here r will be represented as r = hi-lo for better
+ * We use a special Reme algorithm on [0,0.34658] to generate
+ * a polynomial of degree 5 to approximate R. The maximum error
+ * | 2.0+P1*z+...+P5*z - R(z) | <= 2
+ * r*R1(r)
+ *
+ * For IEEE double
+ * The hexadecimal values are the intended ones for the following
+ * constants. The decimal values may be used, provided that the
+ int32_t k,xsb;
+ uint32_t hx;
+ uint32_t lx;
+ if(((hx&0xfffff)|lx)!=0)
+ if(hx > 0x3fd62e42) { /* if |x| > 0.5 ln2 */
}
-}
-
-#endif /* defined(_DOUBLE_IS_32BITS) */
+ if(k==0) return one-((x*c)/(c-2.0)-x);
+ uint32_t hy;
+ uint32_t hy;
diff --git a/libjava/java/lang/e_fmod.c b/libjava/java/lang/e_fmod.c
index f9739eec25d..f64e9c4c0f3 100644
--- a/libjava/java/lang/e_fmod.c
+++ b/libjava/java/lang/e_fmod.c
@@ -1,140 +1,11 @@
-
-/* @(#)e_fmod.c 5.1 93/09/24 */
+ * software is freely granted, provided that this notice
/*
- * ====================================================
- * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
- *
- * Developed at SunPro, a Sun Microsystems, Inc. business.
- * Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice
- * is preserved.
- * ====================================================
- */
-
-/*
- * __ieee754_fmod(x,y)
- * Return x mod y in exact arithmetic
- * Method: shift and subtract
- */
-
-#include "fdlibm.h"
-
-#ifndef _DOUBLE_IS_32BITS
-
-#ifdef __STDC__
-static const double one = 1.0, Zero[] = {0.0, -0.0,};
-#else
-static double one = 1.0, Zero[] = {0.0, -0.0,};
-#endif
-
-#ifdef __STDC__
- double __ieee754_fmod(double x, double y)
-#else
- double __ieee754_fmod(x,y)
- double x,y ;
-#endif
-{
- __int32_t n,hx,hy,hz,ix,iy,sx,i;
- __uint32_t lx,ly,lz;
-
- EXTRACT_WORDS(hx,lx,x);
- EXTRACT_WORDS(hy,ly,y);
- sx = hx&0x80000000; /* sign of x */
- hx ^=sx; /* |x| */
- hy &= 0x7fffffff; /* |y| */
-
- /* purge off exception values */
- if((hy|ly)==0||(hx>=0x7ff00000)|| /* y=0,or x not finite */
- ((hy|((ly|-ly)>>31))>0x7ff00000)) /* or y is NaN */
- return (x*y)/(x*y);
- if(hx<=hy) {
- if((hx<hy)||(lx<ly)) return x; /* |x|<|y| return x */
- if(lx==ly)
- return Zero[(__uint32_t)sx>>31]; /* |x|=|y| return x*0*/
- }
-
- /* determine ix = ilogb(x) */
- if(hx<0x00100000) { /* subnormal x */
- if(hx==0) {
- for (ix = -1043, i=lx; i>0; i<<=1) ix -=1;
- } else {
- for (ix = -1022,i=(hx<<11); i>0; i<<=1) ix -=1;
- }
- } else ix = (hx>>20)-1023;
-
- /* determine iy = ilogb(y) */
- if(hy<0x00100000) { /* subnormal y */
- if(hy==0) {
- for (iy = -1043, i=ly; i>0; i<<=1) iy -=1;
- } else {
- for (iy = -1022,i=(hy<<11); i>0; i<<=1) iy -=1;
- }
- } else iy = (hy>>20)-1023;
-
- /* set up {hx,lx}, {hy,ly} and align y to x */
- if(ix >= -1022)
- hx = 0x00100000|(0x000fffff&hx);
- else { /* subnormal x, shift x to normal */
- n = -1022-ix;
- if(n<=31) {
- hx = (hx<<n)|(lx>>(32-n));
- lx <<= n;
- } else {
- hx = lx<<(n-32);
- lx = 0;
- }
- }
- if(iy >= -1022)
- hy = 0x00100000|(0x000fffff&hy);
- else { /* subnormal y, shift y to normal */
- n = -1022-iy;
- if(n<=31) {
- hy = (hy<<n)|(ly>>(32-n));
- ly <<= n;
- } else {
- hy = ly<<(n-32);
- ly = 0;
- }
- }
-
- /* fix point fmod */
- n = ix - iy;
- while(n--) {
- hz=hx-hy;lz=lx-ly; if(lx<ly) hz -= 1;
- if(hz<0){hx = hx+hx+(lx>>31); lx = lx+lx;}
- else {
- if((hz|lz)==0) /* return sign(x)*0 */
- return Zero[(__uint32_t)sx>>31];
- hx = hz+hz+(lz>>31); lx = lz+lz;
- }
- }
- hz=hx-hy;lz=lx-ly; if(lx<ly) hz -= 1;
- if(hz>=0) {hx=hz;lx=lz;}
-
- /* convert back to floating value and restore the sign */
- if((hx|lx)==0) /* return sign(x)*0 */
- return Zero[(__uint32_t)sx>>31];
- while(hx<0x00100000) { /* normalize x */
- hx = hx+hx+(lx>>31); lx = lx+lx;
- iy -= 1;
- }
- if(iy>= -1022) { /* normalize output */
- hx = ((hx-0x00100000)|((iy+1023)<<20));
- INSERT_WORDS(x,hx|sx,lx);
- } else { /* subnormal output */
- n = -1022 - iy;
- if(n<=20) {
- lx = (lx>>n)|((__uint32_t)hx<<(32-n));
- hx >>= n;
- } else if (n<=31) {
- lx = (hx<<(32-n))|(lx>>n); hx = sx;
- } else {
- lx = hx>>(n-32); hx = sx;
- }
- INSERT_WORDS(x,hx|sx,lx);
- x *= one; /* create necessary signal */
- }
- return x; /* exact output */
-}
-
-#endif /* defined(_DOUBLE_IS_32BITS) */
+ int32_t n,hx,hy,hz,ix,iy,sx,i;
+ uint32_t lx,ly,lz;
+ if(lx==ly)
+ return Zero[(uint32_t)sx>>31]; /* |x|=|y| return x*0*/
+ if(ix >= -1022)
+ if(iy >= -1022)
+ return Zero[(uint32_t)sx>>31];
+ return Zero[(uint32_t)sx>>31];
+ lx = (lx>>n)|((uint32_t)hx<<(32-n));
diff --git a/libjava/java/lang/e_log.c b/libjava/java/lang/e_log.c
index ea6c55f6c36..fbeb13a9001 100644
--- a/libjava/java/lang/e_log.c
+++ b/libjava/java/lang/e_log.c
@@ -1,152 +1,21 @@
-
-/* @(#)e_log.c 5.1 93/09/24 */
-/*
- * ====================================================
- * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ * software is freely granted, provided that this notice
+ * Method :
+ * 1. Argument Reduction: find k and f such that
+ * x = 2^k * (1+f),
+ * We use a special Reme algorithm on [0,0.1716] to generate
+ * a polynomial of degree 14 to approximate R The maximum error
+ * | Lg1*s +...+Lg7*s - R(z) | <= 2
*
- * Developed at SunPro, a Sun Microsystems, Inc. business.
- * Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice
- * is preserved.
- * ====================================================
- */
-
-/* __ieee754_log(x)
- * Return the logrithm of x
- *
- * Method :
- * 1. Argument Reduction: find k and f such that
- * x = 2^k * (1+f),
- * where sqrt(2)/2 < 1+f < sqrt(2) .
- *
- * 2. Approximation of log(1+f).
- * Let s = f/(2+f) ; based on log(1+f) = log(1+s) - log(1-s)
- * = 2s + 2/3 s**3 + 2/5 s**5 + .....,
- * = 2s + s*R
- * We use a special Reme algorithm on [0,0.1716] to generate
- * a polynomial of degree 14 to approximate R The maximum error
- * of this polynomial approximation is bounded by 2**-58.45. In
- * other words,
- * 2 4 6 8 10 12 14
- * R(z) ~ Lg1*s +Lg2*s +Lg3*s +Lg4*s +Lg5*s +Lg6*s +Lg7*s
- * (the values of Lg1 to Lg7 are listed in the program)
- * and
- * | 2 14 | -58.45
- * | Lg1*s +...+Lg7*s - R(z) | <= 2
- * | |
- * Note that 2s = f - s*f = f - hfsq + s*hfsq, where hfsq = f*f/2.
- * In order to guarantee error in log below 1ulp, we compute log
- * by
- * log(1+f) = f - s*(f - R) (if f is not too large)
- * log(1+f) = f - (hfsq - s*(hfsq+R)). (better accuracy)
- *
- * 3. Finally, log(x) = k*ln2 + log(1+f).
- * = k*ln2_hi+(f-(hfsq-(s*(hfsq+R)+k*ln2_lo)))
- * Here ln2 is split into two floating point number:
- * ln2_hi + ln2_lo,
- * where n*ln2_hi is always exact for |n| < 2000.
- *
- * Special cases:
- * log(x) is NaN with signal if x < 0 (including -INF) ;
- * log(+INF) is +INF; log(0) is -INF with signal;
- * log(NaN) is that NaN with no signal.
- *
- * Accuracy:
- * according to an error analysis, the error is always less than
- * 1 ulp (unit in the last place).
- *
- * Constants:
- * The hexadecimal values are the intended ones for the following
- * constants. The decimal values may be used, provided that the
- * compiler will convert from decimal to binary accurately enough
- * to produce the hexadecimal values shown.
- */
-
-#include "fdlibm.h"
-
-#ifndef _DOUBLE_IS_32BITS
-
-#ifdef __STDC__
-static const double
-#else
-static double
-#endif
-ln2_hi = 6.93147180369123816490e-01, /* 3fe62e42 fee00000 */
-ln2_lo = 1.90821492927058770002e-10, /* 3dea39ef 35793c76 */
-two54 = 1.80143985094819840000e+16, /* 43500000 00000000 */
-Lg1 = 6.666666666666735130e-01, /* 3FE55555 55555593 */
-Lg2 = 3.999999999940941908e-01, /* 3FD99999 9997FA04 */
-Lg3 = 2.857142874366239149e-01, /* 3FD24924 94229359 */
-Lg4 = 2.222219843214978396e-01, /* 3FCC71C5 1D8E78AF */
-Lg5 = 1.818357216161805012e-01, /* 3FC74664 96CB03DE */
-Lg6 = 1.531383769920937332e-01, /* 3FC39A09 D078C69F */
-Lg7 = 1.479819860511658591e-01; /* 3FC2F112 DF3E5244 */
-
-#ifdef __STDC__
-static const double zero = 0.0;
-#else
-static double zero = 0.0;
-#endif
-
-#ifdef __STDC__
- double __ieee754_log(double x)
-#else
- double __ieee754_log(x)
- double x;
-#endif
-{
- double hfsq,f,s,z,R,w,t1,t2,dk;
- __int32_t k,hx,i,j;
- __uint32_t lx;
-
- EXTRACT_WORDS(hx,lx,x);
-
- k=0;
- if (hx < 0x00100000) { /* x < 2**-1022 */
- if (((hx&0x7fffffff)|lx)==0)
- return -two54/zero; /* log(+-0)=-inf */
- if (hx<0) return (x-x)/zero; /* log(-#) = NaN */
- k -= 54; x *= two54; /* subnormal number, scale up x */
- GET_HIGH_WORD(hx,x);
- }
- if (hx >= 0x7ff00000) return x+x;
- k += (hx>>20)-1023;
- hx &= 0x000fffff;
- i = (hx+0x95f64)&0x100000;
- SET_HIGH_WORD(x,hx|(i^0x3ff00000)); /* normalize x or x/2 */
- k += (i>>20);
- f = x-1.0;
- if((0x000fffff&(2+hx))<3) { /* |f| < 2**-20 */
- if(f==zero) {
- if(k==0)
- return zero;
- else {
- dk=(double)k;
- return dk*ln2_hi+dk*ln2_lo;
- }
- }
- R = f*f*(0.5-0.33333333333333333*f);
- if(k==0) return f-R; else {dk=(double)k;
- return dk*ln2_hi-((R-dk*ln2_lo)-f);}
- }
- s = f/(2.0+f);
- dk = (double)k;
- z = s*s;
- i = hx-0x6147a;
- w = z*z;
- j = 0x6b851-hx;
- t1= w*(Lg2+w*(Lg4+w*Lg6));
- t2= z*(Lg1+w*(Lg3+w*(Lg5+w*Lg7)));
- i |= j;
- R = t2+t1;
- if(i>0) {
- hfsq=0.5*f*f;
- if(k==0) return f-(hfsq-s*(hfsq+R)); else
- return dk*ln2_hi-((hfsq-(s*(hfsq+R)+dk*ln2_lo))-f);
- } else {
- if(k==0) return f-s*(f-R); else
- return dk*ln2_hi-((s*(f-R)-dk*ln2_lo)-f);
+ * 3. Finally, log(x) = k*ln2 + log(1+f).
+ * Here ln2 is split into two floating point number:
+ * log(x) is NaN with signal if x < 0 (including -INF) ;
+ * The hexadecimal values are the intended ones for the following
+ * constants. The decimal values may be used, provided that the
+ * compiler will convert from decimal to binary accurately enough
+ int32_t k,hx,i,j;
+ uint32_t lx;
+ if (((hx&0x7fffffff)|lx)==0)
}
-}
-
-#endif /* defined(_DOUBLE_IS_32BITS) */
+ s = f/(2.0+f);
+ t1= w*(Lg2+w*(Lg4+w*Lg6));
+ t2= z*(Lg1+w*(Lg3+w*(Lg5+w*Lg7)));
diff --git a/libjava/java/lang/e_pow.c b/libjava/java/lang/e_pow.c
index f078dff344d..705794bb195 100644
--- a/libjava/java/lang/e_pow.c
+++ b/libjava/java/lang/e_pow.c
@@ -1,312 +1,27 @@
-
-/* @(#)e_pow.c 5.1 93/09/24 */
-/*
- * ====================================================
- * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
- *
- * Developed at SunPro, a Sun Microsystems, Inc. business.
- * Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice
- * is preserved.
- * ====================================================
- */
-
-/* __ieee754_pow(x,y) return x**y
- *
- * n
- * Method: Let x = 2 * (1+f)
- * 1. Compute and return log2(x) in two pieces:
- * log2(x) = w1 + w2,
- * where w1 has 53-24 = 29 bit trailing zeros.
- * 2. Perform y*log2(x) = n+y' by simulating muti-precision
- * arithmetic, where |y'|<=0.5.
- * 3. Return x**y = 2**n*exp(y'*log2)
- *
- * Special cases:
- * 1. (anything) ** 0 is 1
- * 2. (anything) ** 1 is itself
- * 3. (anything) ** NAN is NAN
- * 4. NAN ** (anything except 0) is NAN
- * 5. +-(|x| > 1) ** +INF is +INF
- * 6. +-(|x| > 1) ** -INF is +0
- * 7. +-(|x| < 1) ** +INF is +0
- * 8. +-(|x| < 1) ** -INF is +INF
- * 9. +-1 ** +-INF is NAN
- * 10. +0 ** (+anything except 0, NAN) is +0
- * 11. -0 ** (+anything except 0, NAN, odd integer) is +0
- * 12. +0 ** (-anything except 0, NAN) is +INF
- * 13. -0 ** (-anything except 0, NAN, odd integer) is +INF
- * 14. -0 ** (odd integer) = -( +0 ** (odd integer) )
- * 15. +INF ** (+anything except 0,NAN) is +INF
- * 16. +INF ** (-anything except 0,NAN) is +0
- * 17. -INF ** (anything) = -0 ** (-anything)
- * 18. (-anything) ** (integer) is (-1)**(integer)*(+anything**integer)
- * 19. (-anything except 0 and inf) ** (non-integer) is NAN
- *
- * Accuracy:
- * pow(x,y) returns x**y nearly rounded. In particular
- * pow(integer,integer)
- * always returns the correct integer provided it is
- * representable.
- *
- * Constants :
- * The hexadecimal values are the intended ones for the following
- * constants. The decimal values may be used, provided that the
- * compiler will convert from decimal to binary accurately enough
- * to produce the hexadecimal values shown.
- */
-
-#include "fdlibm.h"
-
-#ifndef _DOUBLE_IS_32BITS
-
-#ifdef __STDC__
-static const double
-#else
-static double
-#endif
-bp[] = {1.0, 1.5,},
-dp_h[] = { 0.0, 5.84962487220764160156e-01,}, /* 0x3FE2B803, 0x40000000 */
-dp_l[] = { 0.0, 1.35003920212974897128e-08,}, /* 0x3E4CFDEB, 0x43CFD006 */
-zero = 0.0,
-one = 1.0,
-two = 2.0,
-two53 = 9007199254740992.0, /* 0x43400000, 0x00000000 */
-huge = 1.0e300,
-tiny = 1.0e-300,
- /* poly coefs for (3/2)*(log(x)-2s-2/3*s**3 */
-L1 = 5.99999999999994648725e-01, /* 0x3FE33333, 0x33333303 */
-L2 = 4.28571428578550184252e-01, /* 0x3FDB6DB6, 0xDB6FABFF */
-L3 = 3.33333329818377432918e-01, /* 0x3FD55555, 0x518F264D */
-L4 = 2.72728123808534006489e-01, /* 0x3FD17460, 0xA91D4101 */
-L5 = 2.30660745775561754067e-01, /* 0x3FCD864A, 0x93C9DB65 */
-L6 = 2.06975017800338417784e-01, /* 0x3FCA7E28, 0x4A454EEF */
-P1 = 1.66666666666666019037e-01, /* 0x3FC55555, 0x5555553E */
-P2 = -2.77777777770155933842e-03, /* 0xBF66C16C, 0x16BEBD93 */
-P3 = 6.61375632143793436117e-05, /* 0x3F11566A, 0xAF25DE2C */
-P4 = -1.65339022054652515390e-06, /* 0xBEBBBD41, 0xC5D26BF1 */
-P5 = 4.13813679705723846039e-08, /* 0x3E663769, 0x72BEA4D0 */
-lg2 = 6.93147180559945286227e-01, /* 0x3FE62E42, 0xFEFA39EF */
-lg2_h = 6.93147182464599609375e-01, /* 0x3FE62E43, 0x00000000 */
-lg2_l = -1.90465429995776804525e-09, /* 0xBE205C61, 0x0CA86C39 */
-ovt = 8.0085662595372944372e-0017, /* -(1024-log2(ovfl+.5ulp)) */
-cp = 9.61796693925975554329e-01, /* 0x3FEEC709, 0xDC3A03FD =2/(3ln2) */
-cp_h = 9.61796700954437255859e-01, /* 0x3FEEC709, 0xE0000000 =(float)cp */
-cp_l = -7.02846165095275826516e-09, /* 0xBE3E2FE0, 0x145B01F5 =tail of cp_h*/
-ivln2 = 1.44269504088896338700e+00, /* 0x3FF71547, 0x652B82FE =1/ln2 */
-ivln2_h = 1.44269502162933349609e+00, /* 0x3FF71547, 0x60000000 =24b 1/ln2*/
-ivln2_l = 1.92596299112661746887e-08; /* 0x3E54AE0B, 0xF85DDF44 =1/ln2 tail*/
-
-#ifdef __STDC__
- double __ieee754_pow(double x, double y)
-#else
- double __ieee754_pow(x,y)
- double x, y;
-#endif
-{
- double z,ax,z_h,z_l,p_h,p_l;
- double y1,t1,t2,r,s,t,u,v,w;
- __int32_t i,j,k,yisint,n;
- __int32_t hx,hy,ix,iy;
- __uint32_t lx,ly;
-
- EXTRACT_WORDS(hx,lx,x);
- EXTRACT_WORDS(hy,ly,y);
- ix = hx&0x7fffffff; iy = hy&0x7fffffff;
-
- /* y==zero: x**0 = 1 */
- if((iy|ly)==0) return one;
-
- /* +-NaN return x+y */
- if(ix > 0x7ff00000 || ((ix==0x7ff00000)&&(lx!=0)) ||
- iy > 0x7ff00000 || ((iy==0x7ff00000)&&(ly!=0)))
- return x+y;
-
- /* determine if y is an odd int when x < 0
- * yisint = 0 ... y is not an integer
- * yisint = 1 ... y is an odd int
- * yisint = 2 ... y is an even int
- */
- yisint = 0;
- if(hx<0) {
- if(iy>=0x43400000) yisint = 2; /* even integer y */
- else if(iy>=0x3ff00000) {
- k = (iy>>20)-0x3ff; /* exponent */
- if(k>20) {
- j = ly>>(52-k);
- if((__uint32_t)(j<<(52-k))==ly) yisint = 2-(j&1);
- } else if(ly==0) {
- j = iy>>(20-k);
- if((j<<(20-k))==iy) yisint = 2-(j&1);
- }
- }
- }
-
- /* special value of y */
- if(ly==0) {
- if (iy==0x7ff00000) { /* y is +-inf */
- if(((ix-0x3ff00000)|lx)==0)
- return y - y; /* inf**+-1 is NaN */
- else if (ix >= 0x3ff00000)/* (|x|>1)**+-inf = inf,0 */
- return (hy>=0)? y: zero;
- else /* (|x|<1)**-,+inf = inf,0 */
- return (hy<0)?-y: zero;
- }
- if(iy==0x3ff00000) { /* y is +-1 */
- if(hy<0) return one/x; else return x;
- }
- if(hy==0x40000000) return x*x; /* y is 2 */
- if(hy==0x3fe00000) { /* y is 0.5 */
- if(hx>=0) /* x >= +0 */
- return __ieee754_sqrt(x);
- }
- }
-
- ax = fabs(x);
- /* special value of x */
- if(lx==0) {
- if(ix==0x7ff00000||ix==0||ix==0x3ff00000){
- z = ax; /*x is +-0,+-inf,+-1*/
- if(hy<0) z = one/z; /* z = (1/|x|) */
- if(hx<0) {
- if(((ix-0x3ff00000)|yisint)==0) {
- z = (z-z)/(z-z); /* (-1)**non-int is NaN */
- } else if(yisint==1)
- z = -z; /* (x<0)**odd = -(|x|**odd) */
- }
- return z;
+ * software is freely granted, provided that this notice
+ * 2. Perform y*log2(x) = n+y' by simulating muti-precision
+ * always returns the correct integer provided it is
+ * The hexadecimal values are the intended ones for the following
+ * constants. The decimal values may be used, provided that the
+ * compiler will convert from decimal to binary accurately enough
+static const double
+static double
+ int32_t i,j,k,yisint,n;
+ int32_t hx,hy,ix,iy;
+ uint32_t lx,ly;
+ if((iy|ly)==0) return one;
+ iy > 0x7ff00000 || ((iy==0x7ff00000)&&(ly!=0)))
+ return x+y;
+ if(hx<0) {
+ if((uint32_t)(j<<(52-k))==ly) yisint = 2-(j&1);
}
}
-
- /* (x<0)**(non-int) is NaN */
- /* CYGNUS LOCAL: This used to be
- if((((hx>>31)+1)|yisint)==0) return (x-x)/(x-x);
- but ANSI C says a right shift of a signed negative quantity is
- implementation defined. */
- if(((((__uint32_t)hx>>31)-1)|yisint)==0) return (x-x)/(x-x);
-
- /* |y| is huge */
- if(iy>0x41e00000) { /* if |y| > 2**31 */
- if(iy>0x43f00000){ /* if |y| > 2**64, must o/uflow */
- if(ix<=0x3fefffff) return (hy<0)? huge*huge:tiny*tiny;
- if(ix>=0x3ff00000) return (hy>0)? huge*huge:tiny*tiny;
+ if(ly==0) {
}
- /* over/underflow if x is not close to one */
- if(ix<0x3fefffff) return (hy<0)? huge*huge:tiny*tiny;
- if(ix>0x3ff00000) return (hy>0)? huge*huge:tiny*tiny;
- /* now |1-x| is tiny <= 2**-20, suffice to compute
- log(x) by x-x^2/2+x^3/3-x^4/4 */
- t = x-1; /* t has 20 trailing zeros */
- w = (t*t)*(0.5-t*(0.3333333333333333333333-t*0.25));
- u = ivln2_h*t; /* ivln2_h has 21 sig. bits */
- v = t*ivln2_l-w*ivln2;
- t1 = u+v;
- SET_LOW_WORD(t1,0);
- t2 = v-(t1-u);
- } else {
- double s2,s_h,s_l,t_h,t_l;
- n = 0;
- /* take care subnormal number */
- if(ix<0x00100000)
- {ax *= two53; n -= 53; GET_HIGH_WORD(ix,ax); }
- n += ((ix)>>20)-0x3ff;
- j = ix&0x000fffff;
- /* determine interval */
- ix = j|0x3ff00000; /* normalize ix */
- if(j<=0x3988E) k=0; /* |x|<sqrt(3/2) */
- else if(j<0xBB67A) k=1; /* |x|<sqrt(3) */
- else {k=0;n+=1;ix -= 0x00100000;}
- SET_HIGH_WORD(ax,ix);
+ return __ieee754_sqrt(x);
+ } else if(yisint==1)
- /* compute s = s_h+s_l = (x-1)/(x+1) or (x-1.5)/(x+1.5) */
- u = ax-bp[k]; /* bp[0]=1.0, bp[1]=1.5 */
- v = one/(ax+bp[k]);
- s = u*v;
- s_h = s;
- SET_LOW_WORD(s_h,0);
- /* t_h=ax+bp[k] High */
- t_h = zero;
- SET_HIGH_WORD(t_h,((ix>>1)|0x20000000)+0x00080000+(k<<18));
- t_l = ax - (t_h-bp[k]);
- s_l = v*((u-s_h*t_h)-s_h*t_l);
- /* compute log(ax) */
- s2 = s*s;
- r = s2*s2*(L1+s2*(L2+s2*(L3+s2*(L4+s2*(L5+s2*L6)))));
- r += s_l*(s_h+s);
- s2 = s_h*s_h;
- t_h = 3.0+s2+r;
- SET_LOW_WORD(t_h,0);
- t_l = r-((t_h-3.0)-s2);
- /* u+v = s*(1+...) */
- u = s_h*t_h;
- v = s_l*t_h+t_l*s;
- /* 2/(3log2)*(s+...) */
- p_h = u+v;
- SET_LOW_WORD(p_h,0);
- p_l = v-(p_h-u);
- z_h = cp_h*p_h; /* cp_h+cp_l = 2/(3*log2) */
- z_l = cp_l*p_h+p_l*cp+dp_l[k];
- /* log2(ax) = (s+..)*2/(3*log2) = n + dp_h + z_h + z_l */
- t = (double)n;
- t1 = (((z_h+z_l)+dp_h[k])+t);
- SET_LOW_WORD(t1,0);
- t2 = z_l-(((t1-t)-dp_h[k])-z_h);
+ if(((((uint32_t)hx>>31)-1)|yisint)==0) return (x-x)/(x-x);
+ /* now |1-x| is tiny <= 2**-20, suffice to compute
+ if(((((uint32_t)hx>>31)-1)|(yisint-1))==0)
}
-
- s = one; /* s (sign of result -ve**odd) = -1 else = 1 */
- if(((((__uint32_t)hx>>31)-1)|(yisint-1))==0)
- s = -one;/* (-ve)**(odd int) */
-
- /* split up y into y1+y2 and compute (y1+y2)*(t1+t2) */
- y1 = y;
- SET_LOW_WORD(y1,0);
- p_l = (y-y1)*t1+y*t2;
- p_h = y1*t1;
- z = p_l+p_h;
- EXTRACT_WORDS(j,i,z);
- if (j>=0x40900000) { /* z >= 1024 */
- if(((j-0x40900000)|i)!=0) /* if z > 1024 */
- return s*huge*huge; /* overflow */
- else {
- if(p_l+ovt>z-p_h) return s*huge*huge; /* overflow */
- }
- } else if((j&0x7fffffff)>=0x4090cc00 ) { /* z <= -1075 */
- if(((j-0xc090cc00)|i)!=0) /* z < -1075 */
- return s*tiny*tiny; /* underflow */
- else {
- if(p_l<=z-p_h) return s*tiny*tiny; /* underflow */
- }
- }
- /*
- * compute 2**(p_h+p_l)
- */
- i = j&0x7fffffff;
- k = (i>>20)-0x3ff;
- n = 0;
- if(i>0x3fe00000) { /* if |z| > 0.5, set n = [z+0.5] */
- n = j+(0x00100000>>(k+1));
- k = ((n&0x7fffffff)>>20)-0x3ff; /* new k for n */
- t = zero;
- SET_HIGH_WORD(t,n&~(0x000fffff>>k));
- n = ((n&0x000fffff)|0x00100000)>>(20-k);
- if(j<0) n = -n;
- p_h -= t;
- }
- t = p_l+p_h;
- SET_LOW_WORD(t,0);
- u = t*lg2_h;
- v = (p_l-(t-p_h))*lg2+t*lg2_l;
- z = u+v;
- w = v-(z-u);
- t = z*z;
- t1 = z - t*(P1+t*(P2+t*(P3+t*(P4+t*P5))));
- r = (z*t1)/(t1-two)-(w+z*w);
- z = one-(r-z);
- GET_HIGH_WORD(j,z);
- j += (n<<20);
- if((j>>20)<=0) z = scalbn(z,(int)n); /* subnormal output */
- else SET_HIGH_WORD(z,j);
- return s*z;
-}
-
-#endif /* defined(_DOUBLE_IS_32BITS) */
diff --git a/libjava/java/lang/e_rem_pio2.c b/libjava/java/lang/e_rem_pio2.c
index 3e5d0f7a227..04665fb35bf 100644
--- a/libjava/java/lang/e_rem_pio2.c
+++ b/libjava/java/lang/e_rem_pio2.c
@@ -1,185 +1,37 @@
-
-/* @(#)e_rem_pio2.c 5.1 93/09/24 */
-/*
- * ====================================================
- * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ * software is freely granted, provided that this notice
*
- * Developed at SunPro, a Sun Microsystems, Inc. business.
- * Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice
- * is preserved.
- * ====================================================
- *
- */
-
-/* __ieee754_rem_pio2(x,y)
- *
- * return the remainder of x rem pi/2 in y[0]+y[1]
- * use __kernel_rem_pio2()
- */
-
-#include "fdlibm.h"
-
-#ifndef _DOUBLE_IS_32BITS
-
-/*
- * Table of constants for 2/pi, 396 Hex digits (476 decimal) of 2/pi
- */
-#ifdef __STDC__
-static const __int32_t two_over_pi[] = {
-#else
-static __int32_t two_over_pi[] = {
-#endif
-0xA2F983, 0x6E4E44, 0x1529FC, 0x2757D1, 0xF534DD, 0xC0DB62,
-0x95993C, 0x439041, 0xFE5163, 0xABDEBB, 0xC561B7, 0x246E3A,
-0x424DD2, 0xE00649, 0x2EEA09, 0xD1921C, 0xFE1DEB, 0x1CB129,
-0xA73EE8, 0x8235F5, 0x2EBB44, 0x84E99C, 0x7026B4, 0x5F7E41,
-0x3991D6, 0x398353, 0x39F49C, 0x845F8B, 0xBDF928, 0x3B1FF8,
-0x97FFDE, 0x05980F, 0xEF2F11, 0x8B5A0A, 0x6D1F6D, 0x367ECF,
-0x27CB09, 0xB74F46, 0x3F669E, 0x5FEA2D, 0x7527BA, 0xC7EBE5,
-0xF17B3D, 0x0739F7, 0x8A5292, 0xEA6BFB, 0x5FB11F, 0x8D5D08,
-0x560330, 0x46FC7B, 0x6BABF0, 0xCFBC20, 0x9AF436, 0x1DA9E3,
-0x91615E, 0xE61B08, 0x659985, 0x5F14A0, 0x68408D, 0xFFD880,
-0x4D7327, 0x310606, 0x1556CA, 0x73A8C9, 0x60E27B, 0xC08C6B,
-};
-
-#ifdef __STDC__
-static const __int32_t npio2_hw[] = {
-#else
-static __int32_t npio2_hw[] = {
-#endif
-0x3FF921FB, 0x400921FB, 0x4012D97C, 0x401921FB, 0x401F6A7A, 0x4022D97C,
-0x4025FDBB, 0x402921FB, 0x402C463A, 0x402F6A7A, 0x4031475C, 0x4032D97C,
-0x40346B9C, 0x4035FDBB, 0x40378FDB, 0x403921FB, 0x403AB41B, 0x403C463A,
-0x403DD85A, 0x403F6A7A, 0x40407E4C, 0x4041475C, 0x4042106C, 0x4042D97C,
-0x4043A28C, 0x40446B9C, 0x404534AC, 0x4045FDBB, 0x4046C6CB, 0x40478FDB,
-0x404858EB, 0x404921FB,
-};
-
-/*
- * invpio2: 53 bits of 2/pi
- * pio2_1: first 33 bit of pi/2
- * pio2_1t: pi/2 - pio2_1
- * pio2_2: second 33 bit of pi/2
- * pio2_2t: pi/2 - (pio2_1+pio2_2)
- * pio2_3: third 33 bit of pi/2
- * pio2_3t: pi/2 - (pio2_1+pio2_2+pio2_3)
- */
-
-#ifdef __STDC__
-static const double
-#else
-static double
-#endif
-zero = 0.00000000000000000000e+00, /* 0x00000000, 0x00000000 */
-half = 5.00000000000000000000e-01, /* 0x3FE00000, 0x00000000 */
-two24 = 1.67772160000000000000e+07, /* 0x41700000, 0x00000000 */
-invpio2 = 6.36619772367581382433e-01, /* 0x3FE45F30, 0x6DC9C883 */
-pio2_1 = 1.57079632673412561417e+00, /* 0x3FF921FB, 0x54400000 */
-pio2_1t = 6.07710050650619224932e-11, /* 0x3DD0B461, 0x1A626331 */
-pio2_2 = 6.07710050630396597660e-11, /* 0x3DD0B461, 0x1A600000 */
-pio2_2t = 2.02226624879595063154e-21, /* 0x3BA3198A, 0x2E037073 */
-pio2_3 = 2.02226624871116645580e-21, /* 0x3BA3198A, 0x2E000000 */
-pio2_3t = 8.47842766036889956997e-32; /* 0x397B839A, 0x252049C1 */
-
-#ifdef __STDC__
- __int32_t __ieee754_rem_pio2(double x, double *y)
-#else
- __int32_t __ieee754_rem_pio2(x,y)
- double x,y[];
-#endif
-{
- double z,w,t,r,fn;
- double tx[3];
- __int32_t i,j,n,ix,hx;
- int e0,nx;
- __uint32_t low;
-
- GET_HIGH_WORD(hx,x); /* high word of x */
- ix = hx&0x7fffffff;
- if(ix<=0x3fe921fb) /* |x| ~<= pi/4 , no need for reduction */
- {y[0] = x; y[1] = 0; return 0;}
- if(ix<0x4002d97c) { /* |x| < 3pi/4, special case with n=+-1 */
- if(hx>0) {
- z = x - pio2_1;
- if(ix!=0x3ff921fb) { /* 33+53 bit pi is good enough */
- y[0] = z - pio2_1t;
- y[1] = (z-y[0])-pio2_1t;
- } else { /* near pi/2, use 33+33+53 bit pi */
- z -= pio2_2;
- y[0] = z - pio2_2t;
- y[1] = (z-y[0])-pio2_2t;
- }
- return 1;
- } else { /* negative x */
- z = x + pio2_1;
- if(ix!=0x3ff921fb) { /* 33+53 bit pi is good enough */
- y[0] = z + pio2_1t;
- y[1] = (z-y[0])+pio2_1t;
- } else { /* near pi/2, use 33+33+53 bit pi */
- z += pio2_2;
- y[0] = z + pio2_2t;
- y[1] = (z-y[0])+pio2_2t;
- }
- return -1;
- }
- }
- if(ix<=0x413921fb) { /* |x| ~<= 2^19*(pi/2), medium size */
- t = fabs(x);
- n = (__int32_t) (t*invpio2+half);
- fn = (double)n;
- r = t-fn*pio2_1;
- w = fn*pio2_1t; /* 1st round good to 85 bit */
- if(n<32&&ix!=npio2_hw[n-1]) {
- y[0] = r-w; /* quick check no cancellation */
- } else {
- __uint32_t high;
- j = ix>>20;
- y[0] = r-w;
- GET_HIGH_WORD(high,y[0]);
- i = j-((high>>20)&0x7ff);
- if(i>16) { /* 2nd iteration needed, good to 118 */
- t = r;
- w = fn*pio2_2;
- r = t-w;
- w = fn*pio2_2t-((t-r)-w);
- y[0] = r-w;
- GET_HIGH_WORD(high,y[0]);
- i = j-((high>>20)&0x7ff);
- if(i>49) { /* 3rd iteration need, 151 bits acc */
- t = r; /* will cover all possible cases */
- w = fn*pio2_3;
- r = t-w;
- w = fn*pio2_3t-((t-r)-w);
- y[0] = r-w;
- }
- }
- }
- y[1] = (r-y[0])-w;
- if(hx<0) {y[0] = -y[0]; y[1] = -y[1]; return -n;}
- else return n;
- }
- /*
- * all other (large) arguments
- */
- if(ix>=0x7ff00000) { /* x is inf or NaN */
- y[0]=y[1]=x-x; return 0;
- }
- /* set z = scalbn(|x|,ilogb(x)-23) */
- GET_LOW_WORD(low,x);
- SET_LOW_WORD(z,low);
- e0 = (int)((ix>>20)-1046); /* e0 = ilogb(z)-23; */
- SET_HIGH_WORD(z, ix - ((__int32_t)e0<<20));
- for(i=0;i<2;i++) {
- tx[i] = (double)((__int32_t)(z));
- z = (z-tx[i])*two24;
- }
- tx[2] = z;
- nx = 3;
- while(tx[nx-1]==zero) nx--; /* skip zero term */
- n = __kernel_rem_pio2(tx,y,e0,nx,2,two_over_pi);
- if(hx<0) {y[0] = -y[0]; y[1] = -y[1]; return -n;}
- return n;
-}
-
-#endif /* defined(_DOUBLE_IS_32BITS) */
+ * return the remainder of x rem pi/2 in y[0]+y[1]
+ * Table of constants for 2/pi, 396 Hex digits (476 decimal) of 2/pi
+static const int32_t two_over_pi[] = {
+static int32_t two_over_pi[] = {
+0xA2F983, 0x6E4E44, 0x1529FC, 0x2757D1, 0xF534DD, 0xC0DB62,
+0x95993C, 0x439041, 0xFE5163, 0xABDEBB, 0xC561B7, 0x246E3A,
+0x424DD2, 0xE00649, 0x2EEA09, 0xD1921C, 0xFE1DEB, 0x1CB129,
+0xA73EE8, 0x8235F5, 0x2EBB44, 0x84E99C, 0x7026B4, 0x5F7E41,
+0x3991D6, 0x398353, 0x39F49C, 0x845F8B, 0xBDF928, 0x3B1FF8,
+0x97FFDE, 0x05980F, 0xEF2F11, 0x8B5A0A, 0x6D1F6D, 0x367ECF,
+0x27CB09, 0xB74F46, 0x3F669E, 0x5FEA2D, 0x7527BA, 0xC7EBE5,
+0xF17B3D, 0x0739F7, 0x8A5292, 0xEA6BFB, 0x5FB11F, 0x8D5D08,
+0x560330, 0x46FC7B, 0x6BABF0, 0xCFBC20, 0x9AF436, 0x1DA9E3,
+0x91615E, 0xE61B08, 0x659985, 0x5F14A0, 0x68408D, 0xFFD880,
+0x4D7327, 0x310606, 0x1556CA, 0x73A8C9, 0x60E27B, 0xC08C6B,
+static const int32_t npio2_hw[] = {
+static int32_t npio2_hw[] = {
+static const double
+static double
+ int32_t __ieee754_rem_pio2(double x, double *y)
+ int32_t __ieee754_rem_pio2(x,y)
+ int32_t i,j,n,ix,hx;
+ uint32_t low;
+ if(hx>0) {
+ n = (int32_t) (t*invpio2+half);
+ if(n<32&&ix!=npio2_hw[n-1]) {
+ uint32_t high;
+ y[0] = r-w;
+ w = fn*pio2_2;
+ w = fn*pio2_2t-((t-r)-w);
+ w = fn*pio2_3;
+ w = fn*pio2_3t-((t-r)-w);
+ /*
+ SET_HIGH_WORD(z, ix - ((int32_t)e0<<20));
+ tx[i] = (double)((int32_t)(z));
diff --git a/libjava/java/lang/e_remainder.c b/libjava/java/lang/e_remainder.c
index ae7ce649ad5..0c72a6bd861 100644
--- a/libjava/java/lang/e_remainder.c
+++ b/libjava/java/lang/e_remainder.c
@@ -1,80 +1,7 @@
-
-/* @(#)e_remainder.c 5.1 93/09/24 */
-/*
- * ====================================================
- * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
- *
- * Developed at SunPro, a Sun Microsystems, Inc. business.
- * Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice
- * is preserved.
- * ====================================================
- */
-
-/* __ieee754_remainder(x,p)
- * Return :
- * returns x REM p = x - [x/p]*p as if in infinite
- * precise arithmetic, where [x/p] is the (infinite bit)
- * integer nearest x/p (in half way case choose the even one).
- * Method :
- * Based on fmod() return x-[x/p]chopped*p exactlp.
- */
-
-#include "fdlibm.h"
-
-#ifndef _DOUBLE_IS_32BITS
-
-#ifdef __STDC__
-static const double zero = 0.0;
-#else
-static double zero = 0.0;
-#endif
-
-
-#ifdef __STDC__
- double __ieee754_remainder(double x, double p)
-#else
- double __ieee754_remainder(x,p)
- double x,p;
-#endif
-{
- __int32_t hx,hp;
- __uint32_t sx,lx,lp;
- double p_half;
-
- EXTRACT_WORDS(hx,lx,x);
- EXTRACT_WORDS(hp,lp,p);
- sx = hx&0x80000000;
- hp &= 0x7fffffff;
- hx &= 0x7fffffff;
-
- /* purge off exception values */
- if((hp|lp)==0) return (x*p)/(x*p); /* p = 0 */
- if((hx>=0x7ff00000)|| /* x not finite */
- ((hp>=0x7ff00000)&& /* p is NaN */
- (((hp-0x7ff00000)|lp)!=0)))
- return (x*p)/(x*p);
-
-
- if (hp<=0x7fdfffff) x = __ieee754_fmod(x,p+p); /* now x < 2p */
- if (((hx-hp)|(lx-lp))==0) return zero*x;
- x = fabs(x);
- p = fabs(p);
- if (hp<0x00200000) {
- if(x+x>p) {
- x-=p;
- if(x+x>=p) x -= p;
- }
- } else {
- p_half = 0.5*p;
- if(x>p_half) {
- x-=p;
- if(x>=p_half) x -= p;
- }
- }
- GET_HIGH_WORD(hx,x);
- SET_HIGH_WORD(x,hx^sx);
- return x;
-}
-
-#endif /* defined(_DOUBLE_IS_32BITS) */
+ * software is freely granted, provided that this notice
+ * Return :
+ * returns x REM p = x - [x/p]*p as if in infinite
+ * precise arithmetic, where [x/p] is the (infinite bit)
+ * Method :
+ int32_t hx,hp;
+ uint32_t sx,lx,lp;
diff --git a/libjava/java/lang/e_sqrt.c b/libjava/java/lang/e_sqrt.c
index b56b1eedc94..5a1225fbff7 100644
--- a/libjava/java/lang/e_sqrt.c
+++ b/libjava/java/lang/e_sqrt.c
@@ -1,452 +1,52 @@
-
-/* @(#)e_sqrt.c 5.1 93/09/24 */
-/*
- * ====================================================
- * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
- *
- * Developed at SunPro, a Sun Microsystems, Inc. business.
- * Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice
- * is preserved.
- * ====================================================
- */
-
-/* __ieee754_sqrt(x)
- * Return correctly rounded sqrt.
- * ------------------------------------------
- * | Use the hardware sqrt if you have one |
- * ------------------------------------------
- * Method:
- * Bit by bit method using integer arithmetic. (Slow, but portable)
- * 1. Normalization
- * Scale x to y in [1,4) with even powers of 2:
- * find an integer k such that 1 <= (y=x*2^(2k)) < 4, then
- * sqrt(x) = 2^k * sqrt(y)
- * 2. Bit by bit computation
- * Let q = sqrt(y) truncated to i bit after binary point (q = 1),
- * i 0
- * i+1 2
- * s = 2*q , and y = 2 * ( y - q ). (1)
- * i i i i
- *
- * To compute q from q , one checks whether
- * i+1 i
- *
- * -(i+1) 2
- * (q + 2 ) <= y. (2)
- * i
- * -(i+1)
- * If (2) is false, then q = q ; otherwise q = q + 2 .
- * i+1 i i+1 i
- *
- * With some algebric manipulation, it is not difficult to see
- * that (2) is equivalent to
- * -(i+1)
- * s + 2 <= y (3)
- * i i
+ * software is freely granted, provided that this notice
+ * Method:
+ * Bit by bit method using integer arithmetic. (Slow, but portable)
+ * Scale x to y in [1,4) with even powers of 2:
*
- * The advantage of (3) is that s and y can be computed by
- * i i
- * the following recurrence formula:
- * if (3) is false
+ * To compute q from q , one checks whether
+ * i+1 i
+ * that (2) is equivalent to
+ * The advantage of (3) is that s and y can be computed by
*
- * s = s , y = y ; (4)
- * i+1 i i+1 i
+ * One may easily use induction to prove (4) and (5).
+ * it does not necessary to do a full (53-bit) comparison
*
- * otherwise,
- * -i -(i+1)
- * s = s + 2 , y = y - s - 2 (5)
- * i+1 i i+1 i i
- *
- * One may easily use induction to prove (4) and (5).
- * Note. Since the left hand side of (3) contain only i+2 bits,
- * it does not necessary to do a full (53-bit) comparison
- * in (3).
- * 3. Final rounding
- * After generating the 53 bits result, we compute one more bit.
- * Together with the remainder, we can decide whether the
- * result is exact, bigger than 1/2ulp, or less than 1/2ulp
- * (it will never equal to 1/2ulp).
- * The rounding mode can be detected by checking whether
- * huge + tiny is equal to huge, and whether huge - tiny is
- * equal to huge for some floating point number "huge" and "tiny".
- *
- * Special cases:
- * sqrt(+-0) = +-0 ... exact
- * sqrt(inf) = inf
- * sqrt(-ve) = NaN ... with invalid signal
- * sqrt(NaN) = NaN ... with invalid signal for signaling NaN
- *
- * Other methods : see the appended file at the end of the program below.
- *---------------
- */
-
-#include "fdlibm.h"
-
-#ifndef _DOUBLE_IS_32BITS
-
-#ifdef __STDC__
-static const double one = 1.0, tiny=1.0e-300;
-#else
-static double one = 1.0, tiny=1.0e-300;
-#endif
-
-#ifdef __STDC__
- double __ieee754_sqrt(double x)
-#else
- double __ieee754_sqrt(x)
- double x;
-#endif
-{
- double z;
- __int32_t sign = (int)0x80000000;
- __uint32_t r,t1,s1,ix1,q1;
- __int32_t ix0,s0,q,m,t,i;
-
- EXTRACT_WORDS(ix0,ix1,x);
-
- /* take care of Inf and NaN */
- if((ix0&0x7ff00000)==0x7ff00000) {
- return x*x+x; /* sqrt(NaN)=NaN, sqrt(+inf)=+inf
- sqrt(-inf)=sNaN */
- }
- /* take care of zero */
- if(ix0<=0) {
- if(((ix0&(~sign))|ix1)==0) return x;/* sqrt(+-0) = +-0 */
- else if(ix0<0)
- return (x-x)/(x-x); /* sqrt(-ve) = sNaN */
- }
- /* normalize x */
- m = (ix0>>20);
- if(m==0) { /* subnormal x */
- while(ix0==0) {
- m -= 21;
- ix0 |= (ix1>>11); ix1 <<= 21;
- }
- for(i=0;(ix0&0x00100000)==0;i++) ix0<<=1;
- m -= i-1;
- ix0 |= (ix1>>(32-i));
- ix1 <<= i;
- }
- m -= 1023; /* unbias exponent */
- ix0 = (ix0&0x000fffff)|0x00100000;
- if(m&1){ /* odd m, double x to make it even */
- ix0 += ix0 + ((ix1&sign)>>31);
- ix1 += ix1;
- }
- m >>= 1; /* m = [m/2] */
-
- /* generate sqrt(x) bit by bit */
- ix0 += ix0 + ((ix1&sign)>>31);
- ix1 += ix1;
- q = q1 = s0 = s1 = 0; /* [q,q1] = sqrt(x) */
- r = 0x00200000; /* r = moving bit from right to left */
-
- while(r!=0) {
- t = s0+r;
- if(t<=ix0) {
- s0 = t+r;
- ix0 -= t;
- q += r;
- }
- ix0 += ix0 + ((ix1&sign)>>31);
- ix1 += ix1;
- r>>=1;
- }
-
- r = sign;
- while(r!=0) {
- t1 = s1+r;
- t = s0;
- if((t<ix0)||((t==ix0)&&(t1<=ix1))) {
- s1 = t1+r;
- if(((t1&sign)==(__uint32_t)sign)&&(s1&sign)==0) s0 += 1;
+ int32_t sign = (int)0x80000000;
+ uint32_t r,t1,s1,ix1,q1;
+ int32_t ix0,s0,q,m,t,i;
+ if((ix0&0x7ff00000)==0x7ff00000) {
+ }
+ t = s0+r;
+ if(t<=ix0) {
+ s0 = t+r;
ix0 -= t;
- if (ix1 < t1) ix0 -= 1;
- ix1 -= t1;
- q1 += r;
- }
- ix0 += ix0 + ((ix1&sign)>>31);
- ix1 += ix1;
- r>>=1;
- }
-
- /* use floating add to find out rounding direction */
- if((ix0|ix1)!=0) {
- z = one-tiny; /* trigger inexact flag */
- if (z>=one) {
- z = one+tiny;
- if (q1==(__uint32_t)0xffffffff) { q1=0; q += 1;}
- else if (z>one) {
- if (q1==(__uint32_t)0xfffffffe) q+=1;
- q1+=2;
- } else
- q1 += (q1&1);
+ q += r;
}
- }
- ix0 = (q>>1)+0x3fe00000;
- ix1 = q1>>1;
- if ((q&1)==1) ix1 |= sign;
- ix0 += (m <<20);
- INSERT_WORDS(z,ix0,ix1);
- return z;
-}
-
-#endif /* defined(_DOUBLE_IS_32BITS) */
-
-/*
-Other methods (use floating-point arithmetic)
--------------
-(This is a copy of a drafted paper by Prof W. Kahan
-and K.C. Ng, written in May, 1986)
-
- Two algorithms are given here to implement sqrt(x)
- (IEEE double precision arithmetic) in software.
- Both supply sqrt(x) correctly rounded. The first algorithm (in
- Section A) uses newton iterations and involves four divisions.
- The second one uses reciproot iterations to avoid division, but
- requires more multiplications. Both algorithms need the ability
- to chop results of arithmetic operations instead of round them,
- and the INEXACT flag to indicate when an arithmetic operation
- is executed exactly with no roundoff error, all part of the
- standard (IEEE 754-1985). The ability to perform shift, add,
- subtract and logical AND operations upon 32-bit words is needed
- too, though not part of the standard.
-
-A. sqrt(x) by Newton Iteration
-
- (1) Initial approximation
-
- Let x0 and x1 be the leading and the trailing 32-bit words of
- a floating point number x (in IEEE double format) respectively
-
- 1 11 52 ...widths
- ------------------------------------------------------
- x: |s| e | f |
- ------------------------------------------------------
- msb lsb msb lsb ...order
-
-
- ------------------------ ------------------------
- x0: |s| e | f1 | x1: | f2 |
- ------------------------ ------------------------
-
- By performing shifts and subtracts on x0 and x1 (both regarded
- as integers), we obtain an 8-bit approximation of sqrt(x) as
- follows.
-
- k := (x0>>1) + 0x1ff80000;
- y0 := k - T1[31&(k>>15)]. ... y ~ sqrt(x) to 8 bits
- Here k is a 32-bit integer and T1[] is an integer array containing
- correction terms. Now magically the floating value of y (y's
- leading 32-bit word is y0, the value of its trailing word is 0)
- approximates sqrt(x) to almost 8-bit.
-
- Value of T1:
- static int T1[32]= {
- 0, 1024, 3062, 5746, 9193, 13348, 18162, 23592,
- 29598, 36145, 43202, 50740, 58733, 67158, 75992, 85215,
- 83599, 71378, 60428, 50647, 41945, 34246, 27478, 21581,
- 16499, 12183, 8588, 5674, 3403, 1742, 661, 130,};
-
- (2) Iterative refinement
-
- Apply Heron's rule three times to y, we have y approximates
- sqrt(x) to within 1 ulp (Unit in the Last Place):
-
- y := (y+x/y)/2 ... almost 17 sig. bits
- y := (y+x/y)/2 ... almost 35 sig. bits
- y := y-(y-x/y)/2 ... within 1 ulp
-
-
- Remark 1.
- Another way to improve y to within 1 ulp is:
-
- y := (y+x/y) ... almost 17 sig. bits to 2*sqrt(x)
- y := y - 0x00100006 ... almost 18 sig. bits to sqrt(x)
-
- 2
- (x-y )*y
- y := y + 2* ---------- ...within 1 ulp
- 2
- 3y + x
-
-
- This formula has one division fewer than the one above; however,
- it requires more multiplications and additions. Also x must be
- scaled in advance to avoid spurious overflow in evaluating the
- expression 3y*y+x. Hence it is not recommended uless division
- is slow. If division is very slow, then one should use the
- reciproot algorithm given in section B.
-
- (3) Final adjustment
-
- By twiddling y's last bit it is possible to force y to be
- correctly rounded according to the prevailing rounding mode
- as follows. Let r and i be copies of the rounding mode and
- inexact flag before entering the square root program. Also we
- use the expression y+-ulp for the next representable floating
- numbers (up and down) of y. Note that y+-ulp = either fixed
- point y+-1, or multiply y by nextafter(1,+-inf) in chopped
- mode.
-
- I := FALSE; ... reset INEXACT flag I
- R := RZ; ... set rounding mode to round-toward-zero
- z := x/y; ... chopped quotient, possibly inexact
- If(not I) then { ... if the quotient is exact
- if(z=y) {
- I := i; ... restore inexact flag
- R := r; ... restore rounded mode
- return sqrt(x):=y.
- } else {
- z := z - ulp; ... special rounding
- }
- }
- i := TRUE; ... sqrt(x) is inexact
- If (r=RN) then z=z+ulp ... rounded-to-nearest
- If (r=RP) then { ... round-toward-+inf
- y = y+ulp; z=z+ulp;
- }
- y := y+z; ... chopped sum
- y0:=y0-0x00100000; ... y := y/2 is correctly rounded.
- I := i; ... restore inexact flag
- R := r; ... restore rounded mode
- return sqrt(x):=y.
-
- (4) Special cases
-
- Square root of +inf, +-0, or NaN is itself;
- Square root of a negative number is NaN with invalid signal.
-
-
-B. sqrt(x) by Reciproot Iteration
-
- (1) Initial approximation
-
- Let x0 and x1 be the leading and the trailing 32-bit words of
+ t1 = s1+r;
+ if((t<ix0)||((t==ix0)&&(t1<=ix1))) {
+ if(((t1&sign)==(uint32_t)sign)&&(s1&sign)==0) s0 += 1;
+ if (q1==(uint32_t)0xffffffff) { q1=0; q += 1;}
+ if (q1==(uint32_t)0xfffffffe) q+=1;
+ q1+=2;
+
+(This is a copy of a drafted paper by Prof W. Kahan
+ Two algorithms are given here to implement sqrt(x)
+ to chop results of arithmetic operations instead of round them,
+ is executed exactly with no roundoff error, all part of the
a floating point number x (in IEEE double format) respectively
- (see section A). By performing shifs and subtracts on x0 and y0,
- we obtain a 7.8-bit approximation of 1/sqrt(x) as follows.
-
- k := 0x5fe80000 - (x0>>1);
- y0:= k - T2[63&(k>>14)]. ... y ~ 1/sqrt(x) to 7.8 bits
-
- Here k is a 32-bit integer and T2[] is an integer array
- containing correction terms. Now magically the floating
- value of y (y's leading 32-bit word is y0, the value of
- its trailing word y1 is set to zero) approximates 1/sqrt(x)
- to almost 7.8-bit.
-
- Value of T2:
- static int T2[64]= {
- 0x1500, 0x2ef8, 0x4d67, 0x6b02, 0x87be, 0xa395, 0xbe7a, 0xd866,
- 0xf14a, 0x1091b,0x11fcd,0x13552,0x14999,0x15c98,0x16e34,0x17e5f,
- 0x18d03,0x19a01,0x1a545,0x1ae8a,0x1b5c4,0x1bb01,0x1bfde,0x1c28d,
- 0x1c2de,0x1c0db,0x1ba73,0x1b11c,0x1a4b5,0x1953d,0x18266,0x16be0,
- 0x1683e,0x179d8,0x18a4d,0x19992,0x1a789,0x1b445,0x1bf61,0x1c989,
- 0x1d16d,0x1d77b,0x1dddf,0x1e2ad,0x1e5bf,0x1e6e8,0x1e654,0x1e3cd,
- 0x1df2a,0x1d635,0x1cb16,0x1be2c,0x1ae4e,0x19bde,0x1868e,0x16e2e,
- 0x1527f,0x1334a,0x11051,0xe951, 0xbe01, 0x8e0d, 0x5924, 0x1edd,};
-
- (2) Iterative refinement
-
- Apply Reciproot iteration three times to y and multiply the
- result by x to get an approximation z that matches sqrt(x)
- to about 1 ulp. To be exact, we will have
- -1ulp < sqrt(x)-z<1.0625ulp.
-
- ... set rounding mode to Round-to-nearest
- y := y*(1.5-0.5*x*y*y) ... almost 15 sig. bits to 1/sqrt(x)
- y := y*((1.5-2^-30)+0.5*x*y*y)... about 29 sig. bits to 1/sqrt(x)
- ... special arrangement for better accuracy
- z := x*y ... 29 bits to sqrt(x), with z*y<1
- z := z + 0.5*z*(1-z*y) ... about 1 ulp to sqrt(x)
-
- Remark 2. The constant 1.5-2^-30 is chosen to bias the error so that
- (a) the term z*y in the final iteration is always less than 1;
- (b) the error in the final result is biased upward so that
- -1 ulp < sqrt(x) - z < 1.0625 ulp
- instead of |sqrt(x)-z|<1.03125ulp.
-
- (3) Final adjustment
-
- By twiddling y's last bit it is possible to force y to be
- correctly rounded according to the prevailing rounding mode
- as follows. Let r and i be copies of the rounding mode and
- inexact flag before entering the square root program. Also we
- use the expression y+-ulp for the next representable floating
- numbers (up and down) of y. Note that y+-ulp = either fixed
- point y+-1, or multiply y by nextafter(1,+-inf) in chopped
- mode.
-
- R := RZ; ... set rounding mode to round-toward-zero
- switch(r) {
- case RN: ... round-to-nearest
- if(x<= z*(z-ulp)...chopped) z = z - ulp; else
- if(x<= z*(z+ulp)...chopped) z = z; else z = z+ulp;
- break;
- case RZ:case RM: ... round-to-zero or round-to--inf
- R:=RP; ... reset rounding mod to round-to-+inf
- if(x<z*z ... rounded up) z = z - ulp; else
- if(x>=(z+ulp)*(z+ulp) ...rounded up) z = z+ulp;
- break;
- case RP: ... round-to-+inf
- if(x>(z+ulp)*(z+ulp)...chopped) z = z+2*ulp; else
- if(x>z*z ...chopped) z = z+ulp;
- break;
- }
-
- Remark 3. The above comparisons can be done in fixed point. For
- example, to compare x and w=z*z chopped, it suffices to compare
- x1 and w1 (the trailing parts of x and w), regarding them as
- two's complement integers.
-
- ...Is z an exact square root?
- To determine whether z is an exact square root of x, let z1 be the
- trailing part of z, and also let x0 and x1 be the leading and
- trailing parts of x.
-
- If ((z1&0x03ffffff)!=0) ... not exact if trailing 26 bits of z!=0
- I := 1; ... Raise Inexact flag: z is not exact
- else {
- j := 1 - [(x0>>20)&1] ... j = logb(x) mod 2
- k := z1 >> 26; ... get z's 25-th and 26-th
- fraction bits
- I := i or (k&j) or ((k&(j+j+1))!=(x1&3));
- }
- R:= r ... restore rounded mode
- return sqrt(x):=z.
-
- If multiplication is cheaper then the foregoing red tape, the
- Inexact flag can be evaluated by
-
- I := i;
- I := (z*z!=x) or I.
-
- Note that z*z can overwrite I; this value must be sensed if it is
- True.
-
- Remark 4. If z*z = x exactly, then bit 25 to bit 0 of z1 must be
- zero.
- --------------------
- z1: | f2 |
- --------------------
- bit 31 bit 0
+ Apply Heron's rule three times to y, we have y approximates
+ is slow. If division is very slow, then one should use the
+ By twiddling y's last bit it is possible to force y to be
- Further more, bit 27 and 26 of z1, bit 0 and 1 of x1, and the odd
- or even of logb(x) have the following relations:
+ Here k is a 32-bit integer and T2[] is an integer array
+ to about 1 ulp. To be exact, we will have
- -------------------------------------------------
- bit 27,26 of z1 bit 1,0 of x1 logb(x)
- -------------------------------------------------
- 00 00 odd and even
- 01 01 even
- 10 10 odd
- 10 00 even
- 11 01 even
- -------------------------------------------------
+ (a) the term z*y in the final iteration is always less than 1;
+ By twiddling y's last bit it is possible to force y to be
+ k := z1 >> 26; ... get z's 25-th and 26-th
+ If multiplication is cheaper then the foregoing red tape, the
+ Note that z*z can overwrite I; this value must be sensed if it is
+ z1: | f2 |
+ (4) Special cases (see (4) of Section A).
- (4) Special cases (see (4) of Section A).
-
- */
diff --git a/libjava/java/lang/fdlibm.h b/libjava/java/lang/fdlibm.h
index 3f72070cf81..ed616aefe5f 100644
--- a/libjava/java/lang/fdlibm.h
+++ b/libjava/java/lang/fdlibm.h
@@ -1,343 +1,13 @@
-
-/* @(#)fdlibm.h 5.1 93/09/24 */
-/*
- * ====================================================
- * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
- *
- * Developed at SunPro, a Sun Microsystems, Inc. business.
- * Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice
- * is preserved.
- * ====================================================
- */
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <config.h>
-#include <stdlib.h>
-
-/* CYGNUS LOCAL: Include files. */
-#include "ieeefp.h"
-
-/* CYGNUS LOCAL: Default to XOPEN_MODE. */
-#define _XOPEN_MODE
-
-#ifdef __STDC__
-#define __P(p) p
-#else
-#define __P(p) ()
-#endif
-
-#define HUGE ((float)3.40282346638528860e+38)
-
-/*
- * set X_TLOSS = pi*2**52, which is possibly defined in <values.h>
- * (one may replace the following line by "#include <values.h>")
- */
-
-#define X_TLOSS 1.41484755040568800000e+16
-
-/* These typedefs are true for the targets running Java. */
-
-#ifndef HAVE_INT32_DEFINED
-typedef int __int32_t;
-typedef unsigned int __uint32_t;
-#endif
-
-#define _IEEE_LIBM
-
-/*
- * ANSI/POSIX
- */
-extern double acos __P((double));
-extern double asin __P((double));
-extern double atan __P((double));
-extern double atan2 __P((double, double));
-extern double cos __P((double));
-extern double sin __P((double));
-extern double tan __P((double));
-
-extern double cosh __P((double));
-extern double sinh __P((double));
-extern double tanh __P((double));
-
-extern double exp __P((double));
-extern double frexp __P((double, int *));
-extern double ldexp __P((double, int));
-extern double log __P((double));
-extern double log10 __P((double));
-extern double modf __P((double, double *));
-
-extern double pow __P((double, double));
-extern double sqrt __P((double));
-
-extern double ceil __P((double));
-extern double fabs __P((double));
-extern double floor __P((double));
-extern double fmod __P((double, double));
-
-extern double erf __P((double));
-extern double erfc __P((double));
-extern double gamma __P((double));
-extern double hypot __P((double, double));
-extern int isnan __P((double));
-extern int finite __P((double));
-extern double j0 __P((double));
-extern double j1 __P((double));
-extern double jn __P((int, double));
-extern double lgamma __P((double));
-extern double y0 __P((double));
-extern double y1 __P((double));
-extern double yn __P((int, double));
-
-extern double acosh __P((double));
-extern double asinh __P((double));
-extern double atanh __P((double));
-extern double cbrt __P((double));
-extern double logb __P((double));
-extern double nextafter __P((double, double));
-extern double remainder __P((double, double));
-
-/* Functions that are not documented, and are not in <math.h>. */
-
-extern double logb __P((double));
-#ifdef _SCALB_INT
-extern double scalb __P((double, int));
-#else
-extern double scalb __P((double, double));
-#endif
-extern double significand __P((double));
-
-/* ieee style elementary functions */
-extern double __ieee754_sqrt __P((double));
-extern double __ieee754_acos __P((double));
-extern double __ieee754_acosh __P((double));
-extern double __ieee754_log __P((double));
-extern double __ieee754_atanh __P((double));
-extern double __ieee754_asin __P((double));
-extern double __ieee754_atan2 __P((double,double));
-extern double __ieee754_exp __P((double));
-extern double __ieee754_cosh __P((double));
-extern double __ieee754_fmod __P((double,double));
-extern double __ieee754_pow __P((double,double));
-extern double __ieee754_lgamma_r __P((double,int *));
-extern double __ieee754_gamma_r __P((double,int *));
-extern double __ieee754_log10 __P((double));
-extern double __ieee754_sinh __P((double));
-extern double __ieee754_hypot __P((double,double));
-extern double __ieee754_j0 __P((double));
-extern double __ieee754_j1 __P((double));
-extern double __ieee754_y0 __P((double));
-extern double __ieee754_y1 __P((double));
-extern double __ieee754_jn __P((int,double));
-extern double __ieee754_yn __P((int,double));
-extern double __ieee754_remainder __P((double,double));
-extern __int32_t __ieee754_rem_pio2 __P((double,double*));
-#ifdef _SCALB_INT
-extern double __ieee754_scalb __P((double,int));
-#else
-extern double __ieee754_scalb __P((double,double));
-#endif
-
-/* fdlibm kernel function */
-extern double __kernel_standard __P((double,double,int));
-extern double __kernel_sin __P((double,double,int));
-extern double __kernel_cos __P((double,double));
-extern double __kernel_tan __P((double,double,int));
-extern int __kernel_rem_pio2 __P((double*,double*,int,int,int,const __int32_t*));
-
-/* Undocumented float functions. */
-extern float logbf __P((float));
-#ifdef _SCALB_INT
-extern float scalbf __P((float, int));
-#else
-extern float scalbf __P((float, float));
-#endif
-extern float significandf __P((float));
-
-/*
- * Functions callable from C, intended to support IEEE arithmetic.
- */
-extern double copysign __P((double, double));
-extern int ilogb __P((double));
-extern double rint __P((double));
-extern float rintf __P((float));
-extern double scalbn __P((double, int));
-
-/* ieee style elementary float functions */
-extern float __ieee754_sqrtf __P((float));
-extern float __ieee754_acosf __P((float));
-extern float __ieee754_acoshf __P((float));
-extern float __ieee754_logf __P((float));
-extern float __ieee754_atanhf __P((float));
-extern float __ieee754_asinf __P((float));
-extern float __ieee754_atan2f __P((float,float));
-extern float __ieee754_expf __P((float));
-extern float __ieee754_coshf __P((float));
-extern float __ieee754_fmodf __P((float,float));
-extern float __ieee754_powf __P((float,float));
-extern float __ieee754_lgammaf_r __P((float,int *));
-extern float __ieee754_gammaf_r __P((float,int *));
-extern float __ieee754_log10f __P((float));
-extern float __ieee754_sinhf __P((float));
-extern float __ieee754_hypotf __P((float,float));
-extern float __ieee754_j0f __P((float));
-extern float __ieee754_j1f __P((float));
-extern float __ieee754_y0f __P((float));
-extern float __ieee754_y1f __P((float));
-extern float __ieee754_jnf __P((int,float));
-extern float __ieee754_ynf __P((int,float));
-extern float __ieee754_remainderf __P((float,float));
-extern __int32_t __ieee754_rem_pio2f __P((float,float*));
-#ifdef _SCALB_INT
-extern float __ieee754_scalbf __P((float,int));
-#else
-extern float __ieee754_scalbf __P((float,float));
-#endif
-
-/* float versions of fdlibm kernel functions */
-extern float __kernel_sinf __P((float,float,int));
-extern float __kernel_cosf __P((float,float));
-extern float __kernel_tanf __P((float,float,int));
-extern int __kernel_rem_pio2f __P((float*,float*,int,int,int,const __int32_t*));
-
-/* The original code used statements like
- n0 = ((*(int*)&one)>>29)^1; * index of high word *
- ix0 = *(n0+(int*)&x); * high word of x *
- ix1 = *((1-n0)+(int*)&x); * low word of x *
- to dig two 32 bit words out of the 64 bit IEEE floating point
- value. That is non-ANSI, and, moreover, the gcc instruction
- scheduler gets it wrong. We instead use the following macros.
- Unlike the original code, we determine the endianness at compile
- time, not at run time; I don't see much benefit to selecting
- endianness at run time. */
-
-#ifndef __IEEE_BIG_ENDIAN
-#ifndef __IEEE_LITTLE_ENDIAN
- #error Must define endianness
-#endif
-#endif
-
-/* A union which permits us to convert between a double and two 32 bit
- ints. */
-
-#ifdef __IEEE_BIG_ENDIAN
-
-typedef union
-{
- double value;
- struct
- {
- __uint32_t msw;
- __uint32_t lsw;
- } parts;
-} ieee_double_shape_type;
-
-#endif
-
-#ifdef __IEEE_LITTLE_ENDIAN
-
-typedef union
-{
- double value;
- struct
- {
- __uint32_t lsw;
- __uint32_t msw;
- } parts;
-} ieee_double_shape_type;
-
-#endif
-
-/* Get two 32 bit ints from a double. */
-
-#define EXTRACT_WORDS(ix0,ix1,d) \
-do { \
- ieee_double_shape_type ew_u; \
- ew_u.value = (d); \
- (ix0) = ew_u.parts.msw; \
- (ix1) = ew_u.parts.lsw; \
-} while (0)
-
-/* Get the more significant 32 bit int from a double. */
-
-#define GET_HIGH_WORD(i,d) \
-do { \
- ieee_double_shape_type gh_u; \
- gh_u.value = (d); \
- (i) = gh_u.parts.msw; \
-} while (0)
-
-/* Get the less significant 32 bit int from a double. */
-
-#define GET_LOW_WORD(i,d) \
-do { \
- ieee_double_shape_type gl_u; \
- gl_u.value = (d); \
- (i) = gl_u.parts.lsw; \
-} while (0)
-
-/* Set a double from two 32 bit ints. */
-
-#define INSERT_WORDS(d,ix0,ix1) \
-do { \
- ieee_double_shape_type iw_u; \
- iw_u.parts.msw = (ix0); \
- iw_u.parts.lsw = (ix1); \
- (d) = iw_u.value; \
-} while (0)
-
-/* Set the more significant 32 bits of a double from an int. */
-
-#define SET_HIGH_WORD(d,v) \
-do { \
- ieee_double_shape_type sh_u; \
- sh_u.value = (d); \
- sh_u.parts.msw = (v); \
- (d) = sh_u.value; \
-} while (0)
-
-/* Set the less significant 32 bits of a double from an int. */
-
-#define SET_LOW_WORD(d,v) \
-do { \
- ieee_double_shape_type sl_u; \
- sl_u.value = (d); \
- sl_u.parts.lsw = (v); \
- (d) = sl_u.value; \
-} while (0)
-
-/* A union which permits us to convert between a float and a 32 bit
- int. */
-
-typedef union
-{
- float value;
- __uint32_t word;
-} ieee_float_shape_type;
-
-/* Get a 32 bit int from a float. */
-
-#define GET_FLOAT_WORD(i,d) \
-do { \
- ieee_float_shape_type gf_u; \
- gf_u.value = (d); \
- (i) = gf_u.word; \
-} while (0)
-
-/* Set a float from a 32 bit int. */
-
-#define SET_FLOAT_WORD(d,i) \
-do { \
- ieee_float_shape_type sf_u; \
- sf_u.word = (i); \
- (d) = sf_u.value; \
-} while (0)
-
-#ifdef __cplusplus
-}
-#endif
-
+#include "mprec.h"
+
+#ifndef HUGE
+#endif
+extern int32_t __ieee754_rem_pio2 __P((double,double*));
+extern int __kernel_rem_pio2 __P((double*,double*,int,int,int,const int32_t*));
+extern int32_t __ieee754_rem_pio2f __P((float,float*));
+extern int __kernel_rem_pio2f __P((float*,float*,int,int,int,const int32_t*));
+ uint32_t msw;
+ uint32_t lsw;
+ uint32_t lsw;
+ uint32_t msw;
+ uint32_t word;
diff --git a/libjava/java/lang/ieeefp.h b/libjava/java/lang/ieeefp.h
index 931bafb7d1a..1f0951ff430 100644
--- a/libjava/java/lang/ieeefp.h
+++ b/libjava/java/lang/ieeefp.h
@@ -1,6 +1,10 @@
#ifndef __IEEE_BIG_ENDIAN
#ifndef __IEEE_LITTLE_ENDIAN
+#ifdef __alpha__
+#define __IEEE_LITTLE_ENDIAN
+#endif
+
#ifdef __arm__
/* ARM always has big-endian words. Within those words the byte ordering
appears to be big or little endian. Newlib doesn't seem to care about
diff --git a/libjava/java/lang/k_cos.c b/libjava/java/lang/k_cos.c
index 6c60c243856..0cb566ea2ee 100644
--- a/libjava/java/lang/k_cos.c
+++ b/libjava/java/lang/k_cos.c
@@ -1,96 +1,11 @@
-
-/* @(#)k_cos.c 5.1 93/09/24 */
-/*
- * ====================================================
- * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ * software is freely granted, provided that this notice
+ * Input y is the tail of x.
*
- * Developed at SunPro, a Sun Microsystems, Inc. business.
- * Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice
- * is preserved.
- * ====================================================
- */
-
-/*
- * __kernel_cos( x, y )
- * kernel cos function on [-pi/4, pi/4], pi/4 ~ 0.785398164
- * Input x is assumed to be bounded by ~pi/4 in magnitude.
- * Input y is the tail of x.
+ * | |
*
- * Algorithm
- * 1. Since cos(-x) = cos(x), we need only to consider positive x.
- * 2. if x < 2^-27 (hx<0x3e400000 0), return 1 with inexact if x!=0.
- * 3. cos(x) is approximated by a polynomial of degree 14 on
- * [0,pi/4]
- * 4 14
- * cos(x) ~ 1 - x*x/2 + C1*x + ... + C6*x
- * where the remez error is
- *
- * | 2 4 6 8 10 12 14 | -58
- * |cos(x)-(1-.5*x +C1*x +C2*x +C3*x +C4*x +C5*x +C6*x )| <= 2
- * | |
- *
- * 4 6 8 10 12 14
- * 4. let r = C1*x +C2*x +C3*x +C4*x +C5*x +C6*x , then
- * cos(x) = 1 - x*x/2 + r
- * since cos(x+y) ~ cos(x) - sin(x)*y
- * ~ cos(x) - x*y,
- * a correction term is necessary in cos(x) and hence
- * cos(x+y) = 1 - (x*x/2 - (r - x*y))
- * For better accuracy when x > 0.3, let qx = |x|/4 with
- * the last 32 bits mask off, and if x > 0.78125, let qx = 0.28125.
- * Then
- * cos(x+y) = (1-qx) - ((x*x/2-qx) - (r-x*y)).
- * Note that 1-qx and (x*x/2-qx) is EXACT here, and the
- * magnitude of the latter is at least a quarter of x*x/2,
- * thus, reducing the rounding error in the subtraction.
- */
-
-#include "fdlibm.h"
-
-#ifndef _DOUBLE_IS_32BITS
-
-#ifdef __STDC__
-static const double
-#else
-static double
-#endif
-one = 1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */
-C1 = 4.16666666666666019037e-02, /* 0x3FA55555, 0x5555554C */
-C2 = -1.38888888888741095749e-03, /* 0xBF56C16C, 0x16C15177 */
-C3 = 2.48015872894767294178e-05, /* 0x3EFA01A0, 0x19CB1590 */
-C4 = -2.75573143513906633035e-07, /* 0xBE927E4F, 0x809C52AD */
-C5 = 2.08757232129817482790e-09, /* 0x3E21EE9E, 0xBDB4B1C4 */
-C6 = -1.13596475577881948265e-11; /* 0xBDA8FAE9, 0xBE8838D4 */
-
-#ifdef __STDC__
- double __kernel_cos(double x, double y)
-#else
- double __kernel_cos(x, y)
- double x,y;
-#endif
-{
- double a,hz,z,r,qx;
- __int32_t ix;
- GET_HIGH_WORD(ix,x);
- ix &= 0x7fffffff; /* ix = |x|'s high word*/
- if(ix<0x3e400000) { /* if x < 2**27 */
- if(((int)x)==0) return one; /* generate inexact */
- }
- z = x*x;
- r = z*(C1+z*(C2+z*(C3+z*(C4+z*(C5+z*C6)))));
- if(ix < 0x3FD33333) /* if |x| < 0.3 */
- return one - (0.5*z - (z*r - x*y));
- else {
- if(ix > 0x3fe90000) { /* x > 0.78125 */
- qx = 0.28125;
- } else {
- INSERT_WORDS(qx,ix-0x00200000,0); /* x/4 */
- }
- hz = 0.5*z-qx;
- a = one-qx;
- return a - (hz - (z*r-x*y));
- }
-}
-
-#endif /* defined(_DOUBLE_IS_32BITS) */
+ * 4 6 8 10 12 14
+ * since cos(x+y) ~ cos(x) - sin(x)*y
+static const double
+static double
+ int32_t ix;
+ if(ix < 0x3FD33333) /* if |x| < 0.3 */
diff --git a/libjava/java/lang/k_rem_pio2.c b/libjava/java/lang/k_rem_pio2.c
index 8569256686c..438e8513418 100644
--- a/libjava/java/lang/k_rem_pio2.c
+++ b/libjava/java/lang/k_rem_pio2.c
@@ -1,320 +1,39 @@
-
-/* @(#)k_rem_pio2.c 5.1 93/09/24 */
-/*
- * ====================================================
- * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
- *
- * Developed at SunPro, a Sun Microsystems, Inc. business.
- * Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice
- * is preserved.
- * ====================================================
- */
-
-/*
- * __kernel_rem_pio2(x,y,e0,nx,prec,ipio2)
- * double x[],y[]; int e0,nx,prec; int ipio2[];
- *
- * __kernel_rem_pio2 return the last three digits of N with
- * y = x - N*pi/2
- * so that |y| < pi/2.
- *
- * The method is to compute the integer (mod 8) and fraction parts of
- * (2/pi)*x without doing the full multiplication. In general we
- * skip the part of the product that are known to be a huge integer (
- * more accurately, = 0 mod 8 ). Thus the number of operations are
- * independent of the exponent of the input.
- *
- * (2/pi) is represented by an array of 24-bit integers in ipio2[].
- *
- * Input parameters:
- * x[] The input value (must be positive) is broken into nx
- * pieces of 24-bit integers in double precision format.
- * x[i] will be the i-th 24 bit of x. The scaled exponent
- * of x[0] is given in input parameter e0 (i.e., x[0]*2^e0
- * match x's up to 24 bits.
- *
- * Example of breaking a double positive z into x[0]+x[1]+x[2]:
- * e0 = ilogb(z)-23
- * z = scalbn(z,-e0)
- * for i = 0,1,2
- * x[i] = floor(z)
- * z = (z-x[i])*2**24
- *
- *
- * y[] ouput result in an array of double precision numbers.
- * The dimension of y[] is:
- * 24-bit precision 1
- * 53-bit precision 2
- * 64-bit precision 2
- * 113-bit precision 3
- * The actual value is the sum of them. Thus for 113-bit
- * precison, one may have to do something like:
- *
- * long double t,w,r_head, r_tail;
- * t = (long double)y[2] + (long double)y[1];
- * w = (long double)y[0];
- * r_head = t+w;
- * r_tail = w - (r_head - t);
- *
- * e0 The exponent of x[0]
- *
- * nx dimension of x[]
- *
- * prec an integer indicating the precision:
- * 0 24 bits (single)
- * 1 53 bits (double)
- * 2 64 bits (extended)
- * 3 113 bits (quad)
- *
- * ipio2[]
- * integer array, contains the (24*i)-th to (24*i+23)-th
- * bit of 2/pi after binary point. The corresponding
- * floating value is
- *
- * ipio2[i] * 2^(-24(i+1)).
- *
- * External function:
- * double scalbn(), floor();
- *
- *
- * Here is the description of some local variables:
- *
- * jk jk+1 is the initial number of terms of ipio2[] needed
- * in the computation. The recommended value is 2,3,4,
- * 6 for single, double, extended,and quad.
- *
- * jz local integer variable indicating the number of
- * terms of ipio2[] used.
- *
- * jx nx - 1
- *
- * jv index for pointing to the suitable ipio2[] for the
- * computation. In general, we want
- * ( 2^e0*x[0] * ipio2[jv-1]*2^(-24jv) )/8
- * is an integer. Thus
- * e0-3-24*jv >= 0 or (e0-3)/24 >= jv
- * Hence jv = max(0,(e0-3)/24).
- *
- * jp jp+1 is the number of terms in PIo2[] needed, jp = jk.
- *
- * q[] double array with integral value, representing the
- * 24-bits chunk of the product of x and 2/pi.
- *
- * q0 the corresponding exponent of q[0]. Note that the
- * exponent for q[i] would be q0-24*i.
- *
- * PIo2[] double precision array, obtained by cutting pi/2
- * into 24 bits chunks.
- *
- * f[] ipio2[] in floating point
- *
- * iq[] integer array by breaking up q[] in 24-bits chunk.
- *
- * fq[] final product of x*(2/pi) in fq[0],..,fq[jk]
- *
- * ih integer. If >0 it indicates q[] is >= 0.5, hence
- * it also indicates the *sign* of the result.
- *
- */
-
-
-/*
- * Constants:
- * The hexadecimal values are the intended ones for the following
- * constants. The decimal values may be used, provided that the
- * compiler will convert from decimal to binary accurately enough
- * to produce the hexadecimal values shown.
- */
-
-#include "fdlibm.h"
-
-#ifndef _DOUBLE_IS_32BITS
-
-#ifdef __STDC__
-static const int init_jk[] = {2,3,4,6}; /* initial value for jk */
-#else
-static int init_jk[] = {2,3,4,6};
-#endif
-
-#ifdef __STDC__
-static const double PIo2[] = {
-#else
-static double PIo2[] = {
-#endif
- 1.57079625129699707031e+00, /* 0x3FF921FB, 0x40000000 */
- 7.54978941586159635335e-08, /* 0x3E74442D, 0x00000000 */
- 5.39030252995776476554e-15, /* 0x3CF84698, 0x80000000 */
- 3.28200341580791294123e-22, /* 0x3B78CC51, 0x60000000 */
- 1.27065575308067607349e-29, /* 0x39F01B83, 0x80000000 */
- 1.22933308981111328932e-36, /* 0x387A2520, 0x40000000 */
- 2.73370053816464559624e-44, /* 0x36E38222, 0x80000000 */
- 2.16741683877804819444e-51, /* 0x3569F31D, 0x00000000 */
-};
-
-#ifdef __STDC__
-static const double
-#else
-static double
-#endif
-zero = 0.0,
-one = 1.0,
-two24 = 1.67772160000000000000e+07, /* 0x41700000, 0x00000000 */
-twon24 = 5.96046447753906250000e-08; /* 0x3E700000, 0x00000000 */
-
-#ifdef __STDC__
- int __kernel_rem_pio2(double *x, double *y, int e0, int nx, int prec, const __int32_t *ipio2)
-#else
- int __kernel_rem_pio2(x,y,e0,nx,prec,ipio2)
- double x[], y[]; int e0,nx,prec; __int32_t ipio2[];
-#endif
-{
- __int32_t jz,jx,jv,jp,jk,carry,n,iq[20],i,j,k,m,q0,ih;
- double z,fw,f[20],fq[20],q[20];
-
- /* initialize jk*/
- jk = init_jk[prec];
- jp = jk;
-
- /* determine jx,jv,q0, note that 3>q0 */
- jx = nx-1;
- jv = (e0-3)/24; if(jv<0) jv=0;
- q0 = e0-24*(jv+1);
-
- /* set up f[0] to f[jx+jk] where f[jx+jk] = ipio2[jv+jk] */
- j = jv-jx; m = jx+jk;
- for(i=0;i<=m;i++,j++) f[i] = (j<0)? zero : (double) ipio2[j];
-
- /* compute q[0],q[1],...q[jk] */
- for (i=0;i<=jk;i++) {
- for(j=0,fw=0.0;j<=jx;j++) fw += x[j]*f[jx+i-j]; q[i] = fw;
- }
-
- jz = jk;
-recompute:
- /* distill q[] into iq[] reversingly */
- for(i=0,j=jz,z=q[jz];j>0;i++,j--) {
- fw = (double)((__int32_t)(twon24* z));
- iq[i] = (__int32_t)(z-two24*fw);
- z = q[j-1]+fw;
- }
-
- /* compute n */
- z = scalbn(z,(int)q0); /* actual value of z */
- z -= 8.0*floor(z*0.125); /* trim off integer >= 8 */
- n = (__int32_t) z;
- z -= (double)n;
- ih = 0;
- if(q0>0) { /* need iq[jz-1] to determine n */
- i = (iq[jz-1]>>(24-q0)); n += i;
- iq[jz-1] -= i<<(24-q0);
- ih = iq[jz-1]>>(23-q0);
- }
- else if(q0==0) ih = iq[jz-1]>>23;
- else if(z>=0.5) ih=2;
-
- if(ih>0) { /* q > 0.5 */
- n += 1; carry = 0;
- for(i=0;i<jz ;i++) { /* compute 1-q */
- j = iq[i];
- if(carry==0) {
- if(j!=0) {
- carry = 1; iq[i] = 0x1000000- j;
- }
- } else iq[i] = 0xffffff - j;
- }
- if(q0>0) { /* rare case: chance is 1 in 12 */
- switch(q0) {
- case 1:
- iq[jz-1] &= 0x7fffff; break;
- case 2:
- iq[jz-1] &= 0x3fffff; break;
- }
- }
- if(ih==2) {
- z = one - z;
- if(carry!=0) z -= scalbn(one,(int)q0);
- }
- }
-
- /* check if recomputation is needed */
- if(z==zero) {
- j = 0;
- for (i=jz-1;i>=jk;i--) j |= iq[i];
- if(j==0) { /* need recomputation */
- for(k=1;iq[jk-k]==0;k++); /* k = no. of terms needed */
-
- for(i=jz+1;i<=jz+k;i++) { /* add q[jz+1] to q[jz+k] */
- f[jx+i] = (double) ipio2[jv+i];
- for(j=0,fw=0.0;j<=jx;j++) fw += x[j]*f[jx+i-j];
- q[i] = fw;
- }
- jz += k;
- goto recompute;
- }
- }
-
- /* chop off zero terms */
- if(z==0.0) {
- jz -= 1; q0 -= 24;
- while(iq[jz]==0) { jz--; q0-=24;}
- } else { /* break z into 24-bit if necessary */
- z = scalbn(z,-(int)q0);
- if(z>=two24) {
- fw = (double)((__int32_t)(twon24*z));
- iq[jz] = (__int32_t)(z-two24*fw);
- jz += 1; q0 += 24;
- iq[jz] = (__int32_t) fw;
- } else iq[jz] = (__int32_t) z ;
- }
-
- /* convert integer "bit" chunk to floating-point value */
- fw = scalbn(one,(int)q0);
- for(i=jz;i>=0;i--) {
- q[i] = fw*(double)iq[i]; fw*=twon24;
- }
-
- /* compute PIo2[0,...,jp]*q[jz,...,0] */
- for(i=jz;i>=0;i--) {
- for(fw=0.0,k=0;k<=jp&&k<=jz-i;k++) fw += PIo2[k]*q[i+k];
- fq[jz-i] = fw;
- }
-
- /* compress fq[] into y[] */
- switch(prec) {
- case 0:
- fw = 0.0;
+ * software is freely granted, provided that this notice
+ *
+ * __kernel_rem_pio2 return the last three digits of N with
+ * The method is to compute the integer (mod 8) and fraction parts of
+ * x[] The input value (must be positive) is broken into nx
+ * x[i] will be the i-th 24 bit of x. The scaled exponent
+ * of x[0] is given in input parameter e0 (i.e., x[0]*2^e0
+ * integer array, contains the (24*i)-th to (24*i+23)-th
+ * bit of 2/pi after binary point. The corresponding
+ * jz local integer variable indicating the number of
+ * terms of ipio2[] used.
+ * into 24 bits chunks.
+ * f[] ipio2[] in floating point
+ * The hexadecimal values are the intended ones for the following
+ * constants. The decimal values may be used, provided that the
+ * compiler will convert from decimal to binary accurately enough
+static int init_jk[] = {2,3,4,6};
+static const double
+static double
+ int __kernel_rem_pio2(double *x, double *y, int e0, int nx, int prec, const int32_t *ipio2)
+ int __kernel_rem_pio2(x,y,e0,nx,prec,ipio2)
+ double x[], y[]; int e0,nx,prec; int32_t ipio2[];
+ int32_t jz,jx,jv,jp,jk,carry,n,iq[20],i,j,k,m,q0,ih;
+ fw = (double)((int32_t)(twon24* z));
+ iq[i] = (int32_t)(z-two24*fw);
+ n = (int32_t) z;
+ }
+ if(z>=two24) {
+ fw = (double)((int32_t)(twon24*z));
+ iq[jz] = (int32_t)(z-two24*fw);
+ iq[jz] = (int32_t) fw;
+ } else iq[jz] = (int32_t) z ;
+ y[0] = (ih==0)? fw: -fw;
for (i=jz;i>=0;i--) fw += fq[i];
- y[0] = (ih==0)? fw: -fw;
- break;
- case 1:
- case 2:
- fw = 0.0;
- for (i=jz;i>=0;i--) fw += fq[i];
- y[0] = (ih==0)? fw: -fw;
- fw = fq[0]-fw;
- for (i=1;i<=jz;i++) fw += fq[i];
- y[1] = (ih==0)? fw: -fw;
- break;
- case 3: /* painful */
- for (i=jz;i>0;i--) {
- fw = fq[i-1]+fq[i];
- fq[i] += fq[i-1]-fw;
- fq[i-1] = fw;
- }
- for (i=jz;i>1;i--) {
- fw = fq[i-1]+fq[i];
- fq[i] += fq[i-1]-fw;
- fq[i-1] = fw;
- }
- for (fw=0.0,i=jz;i>=2;i--) fw += fq[i];
- if(ih==0) {
- y[0] = fq[0]; y[1] = fq[1]; y[2] = fw;
- } else {
- y[0] = -fq[0]; y[1] = -fq[1]; y[2] = -fw;
- }
- }
- return n&7;
-}
-
-#endif /* defined(_DOUBLE_IS_32BITS) */
+ y[0] = (ih==0)? fw: -fw;
+ y[1] = (ih==0)? fw: -fw;
+ fw = fq[i-1]+fq[i];
+ fw = fq[i-1]+fq[i];
+ for (fw=0.0,i=jz;i>=2;i--) fw += fq[i];
diff --git a/libjava/java/lang/k_sin.c b/libjava/java/lang/k_sin.c
index f119916dfbc..fbf2c22ea2c 100644
--- a/libjava/java/lang/k_sin.c
+++ b/libjava/java/lang/k_sin.c
@@ -1,79 +1,10 @@
-
-/* @(#)k_sin.c 5.1 93/09/24 */
-/*
- * ====================================================
- * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ * software is freely granted, provided that this notice
+ * Input iy indicates whether y is 0. (if iy=0, y assume to be 0).
+ * 1. Since sin(-x) = -sin(x), we need only to consider positive x.
*
- * Developed at SunPro, a Sun Microsystems, Inc. business.
- * Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice
- * is preserved.
- * ====================================================
- */
-
-/* __kernel_sin( x, y, iy)
- * kernel sin function on [-pi/4, pi/4], pi/4 ~ 0.7854
- * Input x is assumed to be bounded by ~pi/4 in magnitude.
- * Input y is the tail of x.
- * Input iy indicates whether y is 0. (if iy=0, y assume to be 0).
+ * | x |
*
- * Algorithm
- * 1. Since sin(-x) = -sin(x), we need only to consider positive x.
- * 2. if x < 2^-27 (hx<0x3e400000 0), return x with inexact if x!=0.
- * 3. sin(x) is approximated by a polynomial of degree 13 on
- * [0,pi/4]
- * 3 13
- * sin(x) ~ x + S1*x + ... + S6*x
- * where
- *
- * |sin(x) 2 4 6 8 10 12 | -58
- * |----- - (1+S1*x +S2*x +S3*x +S4*x +S5*x +S6*x )| <= 2
- * | x |
- *
- * 4. sin(x+y) = sin(x) + sin'(x')*y
- * ~ sin(x) + (1-x*x/2)*y
- * For better accuracy, let
- * 3 2 2 2 2
- * r = x *(S2+x *(S3+x *(S4+x *(S5+x *S6))))
- * then 3 2
- * sin(x) = x + (S1*x + (x *(r-y/2)+y))
- */
-
-#include "fdlibm.h"
-
-#ifndef _DOUBLE_IS_32BITS
-
-#ifdef __STDC__
-static const double
-#else
-static double
-#endif
-half = 5.00000000000000000000e-01, /* 0x3FE00000, 0x00000000 */
-S1 = -1.66666666666666324348e-01, /* 0xBFC55555, 0x55555549 */
-S2 = 8.33333333332248946124e-03, /* 0x3F811111, 0x1110F8A6 */
-S3 = -1.98412698298579493134e-04, /* 0xBF2A01A0, 0x19C161D5 */
-S4 = 2.75573137070700676789e-06, /* 0x3EC71DE3, 0x57B1FE7D */
-S5 = -2.50507602534068634195e-08, /* 0xBE5AE5E6, 0x8A2B9CEB */
-S6 = 1.58969099521155010221e-10; /* 0x3DE5D93A, 0x5ACFD57C */
-
-#ifdef __STDC__
- double __kernel_sin(double x, double y, int iy)
-#else
- double __kernel_sin(x, y, iy)
- double x,y; int iy; /* iy=0 if y is zero */
-#endif
-{
- double z,r,v;
- __int32_t ix;
- GET_HIGH_WORD(ix,x);
- ix &= 0x7fffffff; /* high word of x */
- if(ix<0x3e400000) /* |x| < 2**-27 */
- {if((int)x==0) return x;} /* generate inexact */
- z = x*x;
- v = z*x;
- r = S2+z*(S3+z*(S4+z*(S5+z*S6)));
- if(iy==0) return x+v*(S1+z*r);
- else return x-((z*(half*y-v*r)-y)-v*S1);
-}
-
-#endif /* defined(_DOUBLE_IS_32BITS) */
+ * For better accuracy, let
+static const double
+static double
+ int32_t ix;
diff --git a/libjava/java/lang/k_tan.c b/libjava/java/lang/k_tan.c
index 9f5b307600c..0520be60b13 100644
--- a/libjava/java/lang/k_tan.c
+++ b/libjava/java/lang/k_tan.c
@@ -1,132 +1,12 @@
-
-/* @(#)k_tan.c 5.1 93/09/24 */
-/*
- * ====================================================
- * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ * software is freely granted, provided that this notice
+ * Input k indicates whether tan (if k=1) or
+ * 1. Since tan(-x) = -tan(x), we need only to consider positive x.
*
- * Developed at SunPro, a Sun Microsystems, Inc. business.
- * Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice
- * is preserved.
- * ====================================================
- */
-
-/* __kernel_tan( x, y, k )
- * kernel tan function on [-pi/4, pi/4], pi/4 ~ 0.7854
- * Input x is assumed to be bounded by ~pi/4 in magnitude.
- * Input y is the tail of x.
- * Input k indicates whether tan (if k=1) or
- * -1/tan (if k= -1) is returned.
+ * | x |
*
- * Algorithm
- * 1. Since tan(-x) = -tan(x), we need only to consider positive x.
- * 2. if x < 2^-28 (hx<0x3e300000 0), return x with inexact if x!=0.
- * 3. tan(x) is approximated by a odd polynomial of degree 27 on
- * [0,0.67434]
- * 3 27
- * tan(x) ~ x + T1*x + ... + T13*x
- * where
- *
- * |tan(x) 2 4 26 | -59.2
- * |----- - (1+T1*x +T2*x +.... +T13*x )| <= 2
- * | x |
- *
- * Note: tan(x+y) = tan(x) + tan'(x)*y
- * ~ tan(x) + (1+x*x)*y
- * Therefore, for better accuracy in computing tan(x+y), let
- * 3 2 2 2 2
- * r = x *(T2+x *(T3+x *(...+x *(T12+x *T13))))
- * then
- * 3 2
- * tan(x+y) = x + (T1*x + (x *(r+y)+y))
- *
- * 4. For x in [0.67434,pi/4], let y = pi/4 - x, then
- * tan(x) = tan(pi/4-y) = (1-tan(y))/(1+tan(y))
- * = 1 - 2*(tan(y) - (tan(y)^2)/(1+tan(y)))
- */
-
-#include "fdlibm.h"
-
-#ifndef _DOUBLE_IS_32BITS
-
-#ifdef __STDC__
-static const double
-#else
-static double
-#endif
-one = 1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */
-pio4 = 7.85398163397448278999e-01, /* 0x3FE921FB, 0x54442D18 */
-pio4lo= 3.06161699786838301793e-17, /* 0x3C81A626, 0x33145C07 */
-T[] = {
- 3.33333333333334091986e-01, /* 0x3FD55555, 0x55555563 */
- 1.33333333333201242699e-01, /* 0x3FC11111, 0x1110FE7A */
- 5.39682539762260521377e-02, /* 0x3FABA1BA, 0x1BB341FE */
- 2.18694882948595424599e-02, /* 0x3F9664F4, 0x8406D637 */
- 8.86323982359930005737e-03, /* 0x3F8226E3, 0xE96E8493 */
- 3.59207910759131235356e-03, /* 0x3F6D6D22, 0xC9560328 */
- 1.45620945432529025516e-03, /* 0x3F57DBC8, 0xFEE08315 */
- 5.88041240820264096874e-04, /* 0x3F4344D8, 0xF2F26501 */
- 2.46463134818469906812e-04, /* 0x3F3026F7, 0x1A8D1068 */
- 7.81794442939557092300e-05, /* 0x3F147E88, 0xA03792A6 */
- 7.14072491382608190305e-05, /* 0x3F12B80F, 0x32F0A7E9 */
- -1.85586374855275456654e-05, /* 0xBEF375CB, 0xDB605373 */
- 2.59073051863633712884e-05, /* 0x3EFB2A70, 0x74BF7AD4 */
-};
-
-#ifdef __STDC__
- double __kernel_tan(double x, double y, int iy)
-#else
- double __kernel_tan(x, y, iy)
- double x,y; int iy;
-#endif
-{
- double z,r,v,w,s;
- __int32_t ix,hx;
- GET_HIGH_WORD(hx,x);
- ix = hx&0x7fffffff; /* high word of |x| */
- if(ix<0x3e300000) /* x < 2**-28 */
- {if((int)x==0) { /* generate inexact */
- __uint32_t low;
- GET_LOW_WORD(low,x);
- if(((ix|low)|(iy+1))==0) return one/fabs(x);
- else return (iy==1)? x: -one/x;
- }
- }
- if(ix>=0x3FE59428) { /* |x|>=0.6744 */
- if(hx<0) {x = -x; y = -y;}
- z = pio4-x;
- w = pio4lo-y;
- x = z+w; y = 0.0;
- }
- z = x*x;
- w = z*z;
- /* Break x^5*(T[1]+x^2*T[2]+...) into
- * x^5(T[1]+x^4*T[3]+...+x^20*T[11]) +
- * x^5(x^2*(T[2]+x^4*T[4]+...+x^22*[T12]))
- */
- r = T[1]+w*(T[3]+w*(T[5]+w*(T[7]+w*(T[9]+w*T[11]))));
- v = z*(T[2]+w*(T[4]+w*(T[6]+w*(T[8]+w*(T[10]+w*T[12])))));
- s = z*x;
- r = y + z*(s*(r+v)+y);
- r += T[0]*s;
- w = x+r;
- if(ix>=0x3FE59428) {
- v = (double)iy;
- return (double)(1-((hx>>30)&2))*(v-2.0*(x-(w*w/(w+v)-r)));
- }
- if(iy==1) return w;
- else { /* if allow error up to 2 ulp,
- simply return -1.0/(x+r) here */
- /* compute -1.0/(x+r) accurately */
- double a,t;
- z = w;
- SET_LOW_WORD(z,0);
- v = r-(z - x); /* z+v = r+x */
- t = a = -1.0/w; /* a = -1.0/w */
- SET_LOW_WORD(t,0);
- s = 1.0+t*z;
- return t+a*(s+t*v);
- }
-}
-
-#endif /* defined(_DOUBLE_IS_32BITS) */
+ * Therefore, for better accuracy in computing tan(x+y), let
+static const double
+static double
+ int32_t ix,hx;
+ uint32_t low;
+ else { /* if allow error up to 2 ulp,
diff --git a/libjava/java/lang/mprec.h b/libjava/java/lang/mprec.h
index 192243157df..25112e8a351 100644
--- a/libjava/java/lang/mprec.h
+++ b/libjava/java/lang/mprec.h
@@ -1,374 +1,84 @@
-/****************************************************************
- *
- * The author of this software is David M. Gay.
- *
- * Copyright (c) 1991 by AT&T.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- *
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY. IN PARTICULAR, NEITHER THE AUTHOR NOR AT&T MAKES ANY
- * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
- * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- *
- ***************************************************************/
-
-/* Please send bug reports to
- David M. Gay
- AT&T Bell Laboratories, Room 2C-463
- 600 Mountain Avenue
- Murray Hill, NJ 07974-2070
- U.S.A.
- dmg@research.att.com or research!dmg
- */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <config.h>
-#include "ieeefp.h"
-
-#include <math.h>
-// #include <float.h>
-// #include <errno.h>
-
-/* These typedefs are true for the targets running Java. */
-
-#ifndef HAVE_INT32_DEFINED
-typedef int __int32_t;
-typedef unsigned int __uint32_t;
-#endif
-
-#ifdef __IEEE_LITTLE_ENDIAN
-#define IEEE_8087
-#endif
-
-#ifdef __IEEE_BIG_ENDIAN
-#define IEEE_MC68k
-#endif
-
-#ifdef __Z8000__
-#define Just_16
-#endif
-
-#ifdef DEBUG
-#include "stdio.h"
-#define Bug(x) {fprintf(stderr, "%s\n", x); exit(1);}
-#endif
-
-
-#ifdef Unsigned_Shifts
-#define Sign_Extend(a,b) if (b < 0) a |= (__uint32_t)0xffff0000;
-#else
-#define Sign_Extend(a,b) /*no-op*/
-#endif
-
-#if defined(IEEE_8087) + defined(IEEE_MC68k) + defined(VAX) + defined(IBM) != 1
-Exactly one of IEEE_8087, IEEE_MC68k, VAX, or IBM should be defined.
-#endif
-
-/* If we are going to examine or modify specific bits in a double using
- the word0 and/or word1 macros, then we must wrap the double inside
- a union. This is necessary to avoid undefined behavior according to
- the ANSI C spec. */
-union double_union
-{
- double d;
- // FIXME: This should be some well-defined 32 bit type.
- __uint32_t i[2];
-};
-
-#ifdef IEEE_8087
-#define word0(x) (x.i[1])
-#define word1(x) (x.i[0])
-#else
-#define word0(x) (x.i[0])
-#define word1(x) (x.i[1])
-#endif
-
-/* The following definition of Storeinc is appropriate for MIPS processors.
- * An alternative that might be better on some machines is
- * #define Storeinc(a,b,c) (*a++ = b << 16 | c & 0xffff)
- */
-#if defined(IEEE_8087) + defined(VAX)
-#define Storeinc(a,b,c) (((unsigned short *)a)[1] = (unsigned short)b, \
-((unsigned short *)a)[0] = (unsigned short)c, a++)
-#else
-#define Storeinc(a,b,c) (((unsigned short *)a)[0] = (unsigned short)b, \
-((unsigned short *)a)[1] = (unsigned short)c, a++)
-#endif
-
-/* #define P DBL_MANT_DIG */
-/* Ten_pmax = floor(P*log(2)/log(5)) */
-/* Bletch = (highest power of 2 < DBL_MAX_10_EXP) / 16 */
-/* Quick_max = floor((P-1)*log(FLT_RADIX)/log(10) - 1) */
-/* Int_max = floor(P*log(FLT_RADIX)/log(10) - 1) */
-
-#if defined(IEEE_8087) + defined(IEEE_MC68k)
-#if defined (_DOUBLE_IS_32BITS)
-#define Exp_shift 23
-#define Exp_shift1 23
-#define Exp_msk1 ((__uint32_t)0x00800000L)
-#define Exp_msk11 ((__uint32_t)0x00800000L)
-#define Exp_mask ((__uint32_t)0x7f800000L)
-#define P 24
-#define Bias 127
-#if 0
-#define IEEE_Arith /* it is, but the code doesn't handle IEEE singles yet */
-#endif
-#define Emin (-126)
-#define Exp_1 ((__uint32_t)0x3f800000L)
-#define Exp_11 ((__uint32_t)0x3f800000L)
-#define Ebits 8
-#define Frac_mask ((__uint32_t)0x007fffffL)
-#define Frac_mask1 ((__uint32_t)0x007fffffL)
-#define Ten_pmax 10
-#define Sign_bit ((__uint32_t)0x80000000L)
-#define Ten_pmax 10
-#define Bletch 2
-#define Bndry_mask ((__uint32_t)0x007fffffL)
-#define Bndry_mask1 ((__uint32_t)0x007fffffL)
-#define LSB 1
-#define Sign_bit ((__uint32_t)0x80000000L)
-#define Log2P 1
-#define Tiny0 0
-#define Tiny1 1
-#define Quick_max 5
-#define Int_max 6
-#define Infinite(x) (word0(x) == ((__uint32_t)0x7f800000L))
-#undef word0
-#undef word1
-
-#define word0(x) (x.i[0])
-#define word1(x) 0
-#else
-
-#define Exp_shift 20
-#define Exp_shift1 20
-#define Exp_msk1 ((__uint32_t)0x100000L)
-#define Exp_msk11 ((__uint32_t)0x100000L)
-#define Exp_mask ((__uint32_t)0x7ff00000L)
-#define P 53
-#define Bias 1023
-#define IEEE_Arith
-#define Emin (-1022)
-#define Exp_1 ((__uint32_t)0x3ff00000L)
-#define Exp_11 ((__uint32_t)0x3ff00000L)
-#define Ebits 11
-#define Frac_mask ((__uint32_t)0xfffffL)
-#define Frac_mask1 ((__uint32_t)0xfffffL)
-#define Ten_pmax 22
-#define Bletch 0x10
-#define Bndry_mask ((__uint32_t)0xfffffL)
-#define Bndry_mask1 ((__uint32_t)0xfffffL)
-#define LSB 1
-#define Sign_bit ((__uint32_t)0x80000000L)
-#define Log2P 1
-#define Tiny0 0
-#define Tiny1 1
-#define Quick_max 14
-#define Int_max 14
-#define Infinite(x) (word0(x) == ((__uint32_t)0x7ff00000L)) /* sufficient test for here */
-#endif
-
-#else
-#undef Sudden_Underflow
-#define Sudden_Underflow
-#ifdef IBM
-#define Exp_shift 24
-#define Exp_shift1 24
-#define Exp_msk1 ((__uint32_t)0x1000000L)
-#define Exp_msk11 ((__uint32_t)0x1000000L)
-#define Exp_mask ((__uint32_t)0x7f000000L)
-#define P 14
-#define Bias 65
-#define Exp_1 ((__uint32_t)0x41000000L)
-#define Exp_11 ((__uint32_t)0x41000000L)
-#define Ebits 8 /* exponent has 7 bits, but 8 is the right value in b2d */
-#define Frac_mask ((__uint32_t)0xffffffL)
-#define Frac_mask1 ((__uint32_t)0xffffffL)
-#define Bletch 4
-#define Ten_pmax 22
-#define Bndry_mask ((__uint32_t)0xefffffL)
-#define Bndry_mask1 ((__uint32_t)0xffffffL)
-#define LSB 1
-#define Sign_bit ((__uint32_t)0x80000000L)
-#define Log2P 4
-#define Tiny0 ((__uint32_t)0x100000L)
-#define Tiny1 0
-#define Quick_max 14
-#define Int_max 15
-#else /* VAX */
-#define Exp_shift 23
-#define Exp_shift1 7
-#define Exp_msk1 0x80
-#define Exp_msk11 ((__uint32_t)0x800000L)
-#define Exp_mask ((__uint32_t)0x7f80L)
-#define P 56
-#define Bias 129
-#define Exp_1 ((__uint32_t)0x40800000L)
-#define Exp_11 ((__uint32_t)0x4080L)
-#define Ebits 8
-#define Frac_mask ((__uint32_t)0x7fffffL)
-#define Frac_mask1 ((__uint32_t)0xffff007fL)
-#define Ten_pmax 24
-#define Bletch 2
-#define Bndry_mask ((__uint32_t)0xffff007fL)
-#define Bndry_mask1 ((__uint32_t)0xffff007fL)
-#define LSB ((__uint32_t)0x10000L)
-#define Sign_bit ((__uint32_t)0x8000L)
-#define Log2P 1
-#define Tiny0 0x80
-#define Tiny1 0
-#define Quick_max 15
-#define Int_max 15
-#endif
-#endif
-
-#ifndef IEEE_Arith
-#define ROUND_BIASED
-#endif
-
-#ifdef RND_PRODQUOT
-#define rounded_product(a,b) a = rnd_prod(a, b)
-#define rounded_quotient(a,b) a = rnd_quot(a, b)
-#ifdef KR_headers
-extern double rnd_prod(), rnd_quot();
-#else
-extern double rnd_prod(double, double), rnd_quot(double, double);
-#endif
-#else
-#define rounded_product(a,b) a *= b
-#define rounded_quotient(a,b) a /= b
-#endif
-
-#define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1))
-#define Big1 ((__uint32_t)0xffffffffL)
-
-#ifndef Just_16
-/* When Pack_32 is not defined, we store 16 bits per 32-bit long.
- * This makes some inner loops simpler and sometimes saves work
- * during multiplications, but it often seems to make things slightly
- * slower. Hence the default is now to store 32 bits per long.
- */
-
-#ifndef Pack_32
-#define Pack_32
-#endif
-#endif
-
-
-#define MAX_BIGNUMS 16
-#define MAX_BIGNUM_WDS 32
-
-struct _Jv_Bigint
-{
- struct _Jv_Bigint *_next;
- int _k, _maxwds, _sign, _wds;
- unsigned long _x[MAX_BIGNUM_WDS];
-};
-
-
-#define _PTR void *
-#define _AND ,
-#define _NOARGS void
-#define _CONST const
-#define _VOLATILE volatile
-#define _SIGNED signed
-#define _DOTS , ...
-#define _VOID void
-#define _EXFUN(name, proto) name proto
-#define _DEFUN(name, arglist, args) name(args)
-#define _DEFUN_VOID(name) name(_NOARGS)
-#define _CAST_VOID (void)
-
-
-struct _Jv_reent
-{
- /* local copy of errno */
- int _errno;
-
- /* used by mprec routines */
- struct _Jv_Bigint *_result;
- int _result_k;
- struct _Jv_Bigint *_p5s;
-
- struct _Jv_Bigint _freelist[MAX_BIGNUMS];
- int _allocation_map;
-
- int num;
-};
-
-
-typedef struct _Jv_Bigint _Jv_Bigint;
-
-#define Balloc _Jv_Balloc
-#define Bfree _Jv_Bfree
-#define multadd _Jv_multadd
-#define s2b _Jv_s2b
-#define lo0bits _Jv_lo0bits
-#define hi0bits _Jv_hi0bits
-#define i2b _Jv_i2b
-#define mult _Jv_mult
-#define pow5mult _Jv_pow5mult
-#define lshift _Jv_lshift
-#define cmp _Jv__mcmp
-#define diff _Jv__mdiff
-#define ulp _Jv_ulp
-#define b2d _Jv_b2d
-#define d2b _Jv_d2b
-#define ratio _Jv_ratio
-
-#define tens _Jv__mprec_tens
-#define bigtens _Jv__mprec_bigtens
-#define tinytens _Jv__mprec_tinytens
-
-#define _dtoa _Jv_dtoa
-#define _dtoa_r _Jv_dtoa_r
-#define _strtod_r _Jv_strtod_r
-
-extern double _EXFUN(_strtod_r, (struct _Jv_reent *ptr, const char *s00, char **se));
-extern char* _EXFUN(_dtoa_r, (struct _Jv_reent *ptr, double d,
- int mode, int ndigits, int *decpt, int *sign,
- char **rve, int float_type));
-void _EXFUN(_dtoa, (double d, int mode, int ndigits, int *decpt, int *sign,
- char **rve, char *buf, int float_type));
-
-double _EXFUN(ulp,(double x));
-double _EXFUN(b2d,(_Jv_Bigint *a , int *e));
-_Jv_Bigint * _EXFUN(Balloc,(struct _Jv_reent *p, int k));
-void _EXFUN(Bfree,(struct _Jv_reent *p, _Jv_Bigint *v));
-_Jv_Bigint * _EXFUN(multadd,(struct _Jv_reent *p, _Jv_Bigint *, int, int));
-_Jv_Bigint * _EXFUN(s2b,(struct _Jv_reent *, const char*, int, int, unsigned long));
-_Jv_Bigint * _EXFUN(i2b,(struct _Jv_reent *,int));
-_Jv_Bigint * _EXFUN(mult, (struct _Jv_reent *, _Jv_Bigint *, _Jv_Bigint *));
-_Jv_Bigint * _EXFUN(pow5mult, (struct _Jv_reent *, _Jv_Bigint *, int k));
-int _EXFUN(hi0bits,(unsigned long));
-int _EXFUN(lo0bits,(unsigned long *));
-_Jv_Bigint * _EXFUN(d2b,(struct _Jv_reent *p, double d, int *e, int *bits));
-_Jv_Bigint * _EXFUN(lshift,(struct _Jv_reent *p, _Jv_Bigint *b, int k));
-_Jv_Bigint * _EXFUN(diff,(struct _Jv_reent *p, _Jv_Bigint *a, _Jv_Bigint *b));
-int _EXFUN(cmp,(_Jv_Bigint *a, _Jv_Bigint *b));
-
-double _EXFUN(ratio,(_Jv_Bigint *a, _Jv_Bigint *b));
-#define Bcopy(x,y) memcpy((char *)&x->_sign, (char *)&y->_sign, y->_wds*sizeof(long) + 2*sizeof(int))
-
-#if defined(_DOUBLE_IS_32BITS) && defined(__v800)
-#define n_bigtens 2
-#else
-#define n_bigtens 5
-#endif
-
-extern _CONST double tinytens[];
-extern _CONST double bigtens[];
-extern _CONST double tens[];
-
-#ifdef __cplusplus
-}
-#endif
-
+#if defined HAVE_STDINT_H
+#include <stdint.h>
+#elif defined HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#if defined HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+#if defined HAVE_SYS_CONFIG_H
+#include <sys/config.h>
+
+/* ISO C9X int type declarations */
+
+#if !defined HAVE_INT32_DEFINED && defined HAVE_BSD_INT32_DEFINED
+typedef u_int32_t uint32_t;
+#endif
+
+#if !defined HAVE_BSD_INT32_DEFINED && !defined HAVE_INT32_DEFINED
+// FIXME -- this could have problems with systems that don't define SI to be 4
+typedef int int32_t __attribute__((mode(SI)));
+typedef unsigned int uint32_t __attribute__((mode(SI)));
+#endif
+
+ /* These typedefs are true for the targets running Java. */
+
+#define Sign_Extend(a,b) if (b < 0) a |= (uint32_t)0xffff0000;
+ uint32_t i[2];
+#if defined (_DOUBLE_IS_32BITS)
+#define Exp_msk1 ((uint32_t)0x00800000L)
+#define Exp_msk11 ((uint32_t)0x00800000L)
+#define Exp_mask ((uint32_t)0x7f800000L)
+#define Exp_1 ((uint32_t)0x3f800000L)
+#define Exp_11 ((uint32_t)0x3f800000L)
+#define Frac_mask ((uint32_t)0x007fffffL)
+#define Frac_mask1 ((uint32_t)0x007fffffL)
+#define Sign_bit ((uint32_t)0x80000000L)
+#define Bndry_mask ((uint32_t)0x007fffffL)
+#define Bndry_mask1 ((uint32_t)0x007fffffL)
+#define Sign_bit ((uint32_t)0x80000000L)
+#define Infinite(x) (word0(x) == ((uint32_t)0x7f800000L))
+#define Exp_msk1 ((uint32_t)0x100000L)
+#define Exp_msk11 ((uint32_t)0x100000L)
+#define Exp_mask ((uint32_t)0x7ff00000L)
+#define Exp_1 ((uint32_t)0x3ff00000L)
+#define Exp_11 ((uint32_t)0x3ff00000L)
+#define Frac_mask ((uint32_t)0xfffffL)
+#define Frac_mask1 ((uint32_t)0xfffffL)
+#define Bndry_mask ((uint32_t)0xfffffL)
+#define Bndry_mask1 ((uint32_t)0xfffffL)
+#define Sign_bit ((uint32_t)0x80000000L)
+#define Infinite(x) (word0(x) == ((uint32_t)0x7ff00000L)) /* sufficient test for here */
+#define Exp_msk1 ((uint32_t)0x1000000L)
+#define Exp_msk11 ((uint32_t)0x1000000L)
+#define Exp_mask ((uint32_t)0x7f000000L)
+#define Exp_1 ((uint32_t)0x41000000L)
+#define Exp_11 ((uint32_t)0x41000000L)
+#define Frac_mask ((uint32_t)0xffffffL)
+#define Frac_mask1 ((uint32_t)0xffffffL)
+#define Bndry_mask ((uint32_t)0xefffffL)
+#define Bndry_mask1 ((uint32_t)0xffffffL)
+#define Sign_bit ((uint32_t)0x80000000L)
+#define Tiny0 ((uint32_t)0x100000L)
+
+/* This is a blatant hack: on Solaris 2.5, pthread.h defines uint32_t
+ in pthread.h, which we sometimes include. We protect our
+ definition the same way Solaris 2.5 does, to avoid redefining it. */
+# ifndef _UINT32_T
+#define Exp_msk11 ((uint32_t)0x800000L)
+# endif
+#define Exp_mask ((uint32_t)0x7f80L)
+#define Exp_1 ((uint32_t)0x40800000L)
+#define Exp_11 ((uint32_t)0x4080L)
+#define Frac_mask ((uint32_t)0x7fffffL)
+#define Frac_mask1 ((uint32_t)0xffff007fL)
+#define Bndry_mask ((uint32_t)0xffff007fL)
+#define Bndry_mask1 ((uint32_t)0xffff007fL)
+#define LSB ((uint32_t)0x10000L)
+#define Sign_bit ((uint32_t)0x8000L)
+#define Big1 ((uint32_t)0xffffffffL)
+struct _Jv_Bigint
+extern char* _EXFUN(_dtoa_r, (struct _Jv_reent *ptr, double d,
+ int mode, int ndigits, int *decpt, int *sign,
+void _EXFUN(_dtoa, (double d, int mode, int ndigits, int *decpt, int *sign,
diff --git a/libjava/java/lang/natCharacter.cc b/libjava/java/lang/natCharacter.cc
index 36cf5700fe5..fa312d1d9a4 100644
--- a/libjava/java/lang/natCharacter.cc
+++ b/libjava/java/lang/natCharacter.cc
@@ -152,12 +152,27 @@ java::lang::Character::isLowerCase (jchar ch)
if (table_search (lower_case_table, asize (lower_case_table), ch) != -1)
return true;
- // FIXME: use a binary search.
- for (unsigned int i = 0; i < asize (lower_anomalous_table); ++i)
+ int low, high, i, old;
+
+ low = 0;
+ high = asize (lower_anomalous_table);
+ i = high / 2;
+
+ while (true)
{
- if (lower_anomalous_table[i] == ch)
+ if (ch < lower_anomalous_table[i])
+ high = i;
+ else if (ch > lower_anomalous_table[i])
+ low = i;
+ else
return true;
+
+ old = i;
+ i = (high + low) / 2;
+ if (i == old)
+ break;
}
+
return false;
}
diff --git a/libjava/java/lang/natDouble.cc b/libjava/java/lang/natDouble.cc
index 17990884751..8d8c7883ba4 100644
--- a/libjava/java/lang/natDouble.cc
+++ b/libjava/java/lang/natDouble.cc
@@ -47,6 +47,13 @@ java::lang::Double::doubleToLongBits(jdouble value)
{
union u u;
u.d = value;
+
+ jlong e = u.l & 0x7ff0000000000000LL;
+ jlong f = u.l & 0x000fffffffffffffLL;
+
+ if (e == 0x7ff0000000000000LL && f != 0L)
+ u.l = 0x7ff8000000000000LL;
+
return u.l;
}
diff --git a/libjava/java/lang/natEcosProcess.cc b/libjava/java/lang/natEcosProcess.cc
new file mode 100644
index 00000000000..774a6977aac
--- /dev/null
+++ b/libjava/java/lang/natEcosProcess.cc
@@ -0,0 +1,25 @@
+// natEcosProcess.cc - Native side of eCos processes.
+
+/* Copyright (C) 1998, 1999 Cygnus Solutions
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+// The configury system needs this file to exist, since we can't
+// really conditionally link files (an autoconf bug). To avoid having
+// an empty translation unit, we make a single method native. FIXME.
+
+#include <config.h>
+
+#include <cni.h>
+#include <jvm.h>
+
+#include <java/lang/ConcreteProcess.h>
+
+void
+java::lang::ConcreteProcess::destroy (void)
+{
+}
diff --git a/libjava/java/lang/natFloat.cc b/libjava/java/lang/natFloat.cc
index e3189bebc2d..5712fd4190c 100644
--- a/libjava/java/lang/natFloat.cc
+++ b/libjava/java/lang/natFloat.cc
@@ -24,6 +24,12 @@ java::lang::Float::floatToIntBits(jfloat value)
{
union u u;
u.d = value;
+ jint e = u.l & 0x7f800000;
+ jint f = u.l & 0x007fffff;
+
+ if (e == 0x7f800000 && f != 0)
+ u.l = 0x7fc00000;
+
return u.l;
}
diff --git a/libjava/java/lang/natObject.cc b/libjava/java/lang/natObject.cc
index 7b26769e351..1d9a4901467 100644
--- a/libjava/java/lang/natObject.cc
+++ b/libjava/java/lang/natObject.cc
@@ -152,8 +152,7 @@ java::lang::Object::sync_init (void)
// been finalized. So if we just reinitialize the old one,
// we'll never be able to (re-)destroy the mutex and/or
// condition variable.
- si = (_Jv_SyncInfo *) _Jv_AllocBytes (sizeof (_Jv_SyncInfo));
- // FIXME: what if si == NULL?
+ si = (_Jv_SyncInfo *) _Jv_AllocBytesChecked (sizeof (_Jv_SyncInfo));
_Jv_MutexInit (&si->mutex);
_Jv_CondInit (&si->condition);
#if defined (_Jv_HaveCondDestroy) || defined (_Jv_HaveMutexDestroy)
diff --git a/libjava/java/lang/natPosixProcess.cc b/libjava/java/lang/natPosixProcess.cc
new file mode 100644
index 00000000000..5c6d9a7644d
--- /dev/null
+++ b/libjava/java/lang/natPosixProcess.cc
@@ -0,0 +1,208 @@
+// natPosixProcess.cc - Native side of POSIX process code.
+
+/* Copyright (C) 1998, 1999 Cygnus Solutions
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+#include <config.h>
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <signal.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#include <cni.h>
+#include <jvm.h>
+
+#include <java/lang/ConcreteProcess.h>
+#include <java/lang/IllegalThreadStateException.h>
+#include <java/lang/InterruptedException.h>
+#include <java/lang/NullPointerException.h>
+#include <java/lang/Thread.h>
+#include <java/io/FileDescriptor.h>
+#include <java/io/FileInputStream.h>
+#include <java/io/FileOutputStream.h>
+#include <java/io/IOException.h>
+
+extern char **environ;
+
+void
+java::lang::ConcreteProcess::destroy (void)
+{
+ if (! hasExited)
+ {
+ // Really kill it.
+ kill ((pid_t) pid, SIGKILL);
+ }
+}
+
+jint
+java::lang::ConcreteProcess::exitValue (void)
+{
+ if (! hasExited)
+ {
+ int wstat;
+ pid_t r = waitpid ((pid_t) pid, &wstat, WNOHANG);
+ if (r == -1)
+ {
+ jstring x = JvNewStringLatin1 (strerror (errno));
+ _Jv_Throw (new IllegalThreadStateException (x));
+ }
+
+ hasExited = true;
+ // Just use the raw status. FIXME: what is right?
+ status = wstat;
+ }
+
+ return status;
+}
+
+jint
+java::lang::ConcreteProcess::waitFor (void)
+{
+ if (! hasExited)
+ {
+ int wstat;
+ int r = waitpid ((pid_t) pid, &wstat, 0);
+
+ if (r != -1)
+ {
+ hasExited = true;
+ // Just use the raw status. FIXME: what is right?
+ status = wstat;
+ }
+
+ if (java::lang::Thread::interrupted())
+ _Jv_Throw (new InterruptedException (JvNewStringLatin1 ("wait interrupted")));
+ }
+
+ return status;
+}
+
+static char *
+new_string (jstring string)
+{
+ jsize s = _Jv_GetStringUTFLength (string);
+ char *buf = (char *) _Jv_Malloc (s + 1);
+ _Jv_GetStringUTFRegion (string, 0, s, buf);
+ buf[s] = '\0';
+ return buf;
+}
+
+void
+java::lang::ConcreteProcess::startProcess (jstringArray progarray,
+ jstringArray envp)
+{
+ using namespace java::io;
+
+ hasExited = false;
+
+ if (! progarray)
+ _Jv_Throw (new NullPointerException);
+
+ // Transform arrays to native form.
+ // FIXME: we use malloc here. We shouldn't. If an exception is
+ // thrown we will leak memory.
+ char **args = (char **) _Jv_Malloc ((progarray->length + 1)
+ * sizeof (char *));
+ char **env = NULL;
+
+ // FIXME: GC will fail here if _Jv_Malloc throws an exception.
+ // That's because we have to manually free the contents, but we
+ jstring *elts = elements (progarray);
+ for (int i = 0; i < progarray->length; ++i)
+ args[i] = new_string (elts[i]);
+ args[progarray->length] = NULL;
+
+ if (envp)
+ {
+ env = (char **) _Jv_Malloc ((envp->length + 1) * sizeof (char *));
+ elts = elements (envp);
+ for (int i = 0; i < envp->length; ++i)
+ env[i] = new_string (elts[i]);
+ env[envp->length] = NULL;
+ }
+
+ // Create pipes for I/O.
+ int inp[2], outp[2], errp[2];
+
+ if (pipe (inp)
+ || pipe (outp)
+ || pipe (errp))
+ {
+ ioerror:
+ // FIXME.
+ _Jv_Free (args);
+ if (env)
+ _Jv_Free (env);
+ _Jv_Throw (new IOException (JvNewStringLatin1 (strerror (errno))));
+ }
+
+ // We create the streams before forking. Otherwise if we had an
+ // error while creating the streams we would have run the child with
+ // no way to communicate with it.
+ errorStream = new FileInputStream (new FileDescriptor (errp[0]));
+ inputStream = new FileInputStream (new FileDescriptor (inp[0]));
+ outputStream = new FileOutputStream (new FileDescriptor (outp[1]));
+
+ // We don't use vfork() because that would cause the local
+ // environment to be set by the child.
+ if ((pid = (jlong) fork ()) == -1)
+ goto ioerror;
+
+ if (pid == 0)
+ {
+ // Child process, so remap descriptors and exec.
+
+ if (envp)
+ {
+ // preserve PATH unless specified explicitly
+ char *path_val = getenv("PATH");
+ environ = env;
+ if (getenv("PATH") == NULL)
+ {
+ char *path_env = (char *) _Jv_Malloc (strlen(path_val) + 5 + 1);
+ sprintf (path_env, "PATH=%s", path_val);
+ putenv (path_env);
+ }
+ }
+
+ // We ignore errors from dup2 because they should never occur.
+ dup2 (outp[0], 0);
+ dup2 (inp[1], 1);
+ dup2 (errp[1], 2);
+
+ close (inp[0]);
+ close (inp[1]);
+ close (errp[0]);
+ close (errp[1]);
+ close (outp[0]);
+ close (outp[1]);
+
+ execvp (args[0], args);
+ // FIXME: should throw an IOException if execvp() fails. Not trivial,
+ // because _Jv_Throw won't work from child process
+ _exit (127);
+ }
+
+ // Parent. Close extra file descriptors and mark ours as
+ // close-on-exec.
+ close (outp[0]);
+ close (inp[1]);
+ close (errp[1]);
+
+ fcntl (outp[1], F_SETFD, 1);
+ fcntl (inp[0], F_SETFD, 1);
+ fcntl (errp[0], F_SETFD, 1);
+}
diff --git a/libjava/java/lang/natRuntime.cc b/libjava/java/lang/natRuntime.cc
index d89ab18bd9c..f8b050c4d58 100644
--- a/libjava/java/lang/natRuntime.cc
+++ b/libjava/java/lang/natRuntime.cc
@@ -15,6 +15,12 @@ details. */
#include <cni.h>
#include <jvm.h>
#include <java/lang/Runtime.h>
+#include <java/lang/UnknownError.h>
+#include <java/lang/UnsatisfiedLinkError.h>
+
+#ifdef USE_LTDL
+#include <ltdl.h>
+#endif
void
java::lang::Runtime::exit (jint status)
@@ -44,6 +50,55 @@ java::lang::Runtime::gc (void)
}
void
+java::lang::Runtime::load (jstring path)
+{
+ JvSynchronize sync (this);
+ checkLink (path);
+ using namespace java::lang;
+#ifdef USE_LTDL
+ // FIXME: make sure path is absolute.
+ lt_dlhandle h = lt_dlopen (FIXME);
+ if (h == NULL)
+ {
+ const char *msg = lt_dlerror ();
+ _Jv_Throw (new UnsatisfiedLinkError (JvNewStringLatin1 (msg)));
+ }
+#else
+ _Jv_Throw (new UnknownError
+ (JvNewStringLatin1 ("Runtime.load not implemented")));
+#endif /* USE_LTDL */
+}
+
+void
+java::lang::Runtime::loadLibrary (jstring lib)
+{
+ JvSynchronize sync (this);
+ checkLink (lib);
+ using namespace java::lang;
+#ifdef USE_LTDL
+ // FIXME: make sure path is absolute.
+ lt_dlhandle h = lt_dlopenext (FIXME);
+ if (h == NULL)
+ {
+ const char *msg = lt_dlerror ();
+ _Jv_Throw (new UnsatisfiedLinkError (JvNewStringLatin1 (msg)));
+ }
+#else
+ _Jv_Throw (new UnknownError
+ (JvNewStringLatin1 ("Runtime.loadLibrary not implemented")));
+#endif /* USE_LTDL */
+}
+
+void
+java::lang::Runtime::init (void)
+{
+ finalize_on_exit = false;
+#ifdef USE_LTDL
+ lt_dlinit ();
+#endif
+}
+
+void
java::lang::Runtime::runFinalization (void)
{
_Jv_RunFinalizers ();
diff --git a/libjava/java/lang/natString.cc b/libjava/java/lang/natString.cc
index 5cb7b2c72b4..08f1755715d 100644
--- a/libjava/java/lang/natString.cc
+++ b/libjava/java/lang/natString.cc
@@ -24,6 +24,8 @@ details. */
#include <java/io/OutputStreamWriter.h>
#include <java/io/ByteArrayInputStream.h>
#include <java/io/InputStreamReader.h>
+#include <gnu/gcj/convert/UnicodeToBytes.h>
+#include <gnu/gcj/convert/BytesToUnicode.h>
#include <jvm.h>
static jstring* strhash = NULL;
@@ -381,17 +383,33 @@ java::lang::String::init (jbyteArray bytes, jint offset, jint count,
if (offset < 0 || count < 0 || offset + count < 0
|| offset + count > data_size)
JvThrow (new StringIndexOutOfBoundsException);
-
- java::io::ByteArrayInputStream *b
- = new java::io::ByteArrayInputStream (bytes, offset, count);
- java::io::InputStreamReader *ir
- = new java::io::InputStreamReader (b, encoding);
- // FIXME: we allocate too much here in some cases.
jcharArray array = JvNewCharArray (count);
- data = array;
- boffset = (char *) elements (array) - (char *) array;
- // FIXME: this can throw IOException.
- this->count = ir->read(array, 0, count);
+ gnu::gcj::convert::BytesToUnicode *converter
+ = gnu::gcj::convert::BytesToUnicode::getDecoder(encoding);
+ jint outpos = 0;
+ int avail = count;
+ converter->setInput(bytes, offset, offset+count);
+ while (converter->inpos < converter->inlength)
+ {
+ int done = converter->read(array, outpos, avail);
+ if (done == 0)
+ {
+ jint new_size = 2 * (outpos + avail);
+ jcharArray new_array = JvNewCharArray (new_size);
+ memcpy (elements (new_array), elements (array),
+ outpos * sizeof(jchar));
+ array = new_array;
+ avail = new_size - outpos;
+ }
+ else
+ {
+ outpos += done;
+ avail -= done;
+ }
+ }
+ this->data = array;
+ this->boffset = (char *) elements (array) - (char *) array;
+ this->count = outpos;
}
jboolean
@@ -444,15 +462,36 @@ java::lang::String::getChars(jint srcBegin, jint srcEnd,
jbyteArray
java::lang::String::getBytes (jstring enc)
{
- java::io::ByteArrayOutputStream *os
- = new java::io::ByteArrayOutputStream(length ());
- java::io::OutputStreamWriter *ow
- = new java::io::OutputStreamWriter(os, enc);
-
- ow->write(this, 0, length ());
- ow->flush();
-
- return os->toByteArray();
+ jint todo = length();
+ jint buflen = todo;
+ jbyteArray buffer = JvNewByteArray(todo);
+ jint bufpos = 0;
+ jint offset = 0;
+ gnu::gcj::convert::UnicodeToBytes *converter
+ = gnu::gcj::convert::UnicodeToBytes::getEncoder(enc);
+ while (todo > 0)
+ {
+ converter->setOutput(buffer, bufpos);
+ int converted = converter->write(this, offset, todo, NULL);
+ bufpos = converter->count;
+ if (converted == 0)
+ {
+ buflen *= 2;
+ jbyteArray newbuffer = JvNewByteArray(buflen);
+ memcpy (elements (newbuffer), elements (buffer), bufpos);
+ buffer = newbuffer;
+ }
+ else
+ {
+ offset += converted;
+ todo -= converted;
+ }
+ }
+ if (bufpos == buflen)
+ return buffer;
+ jbyteArray result = JvNewByteArray(bufpos);
+ memcpy (elements (result), elements (buffer), bufpos);
+ return result;
}
void
diff --git a/libjava/java/lang/natSystem.cc b/libjava/java/lang/natSystem.cc
index 5f613d53ead..b1effafd5bf 100644
--- a/libjava/java/lang/natSystem.cc
+++ b/libjava/java/lang/natSystem.cc
@@ -34,6 +34,10 @@ details. */
#endif
#include <errno.h>
+#ifdef HAVE_UNAME
+#include <sys/utsname.h>
+#endif
+
#include <cni.h>
#include <jvm.h>
#include <java/lang/System.h>
@@ -45,6 +49,9 @@ details. */
#include <java/io/PrintStream.h>
#include <java/io/InputStream.h>
+#define SystemClass _CL_Q34java4lang6System
+extern java::lang::Class SystemClass;
+
#if defined (ECOS)
@@ -113,18 +120,65 @@ java::lang::System::arraycopy (jobject src, jint src_offset,
const bool prim = src_comp->isPrimitive();
if (prim || dst_comp->isAssignableFrom(src_comp) || src == dst)
{
- const size_t size = prim ? src_comp->size()
- : sizeof elements((jobjectArray)src)[0];
-
- // We need a particular type to get the pointer to the data. So
- // we choose bytes.
- char *src_elts = (((char *) elements ((jbyteArray) src))
- + src_offset * size);
- char *dst_elts = (((char *) elements ((jbyteArray) dst))
- + dst_offset * size);
+ const size_t size = (prim ? src_comp->size()
+ : sizeof elements((jobjectArray)src)[0]);
+
+ // In an ideal world we would do this via a virtual function in
+ // __JArray. However, we can't have virtual functions in
+ // __JArray due to the need to copy an array's virtual table in
+ // _Jv_FindArrayClass.
+ // We can't just pick a single subtype of __JArray to use due to
+ // alignment concerns.
+ char *src_elts = NULL;
+ if (! prim)
+ src_elts = (char *) elements ((jobjectArray) src);
+ else if (src_comp == JvPrimClass (byte))
+ src_elts = (char *) elements ((jbyteArray) src);
+ else if (src_comp == JvPrimClass (short))
+ src_elts = (char *) elements ((jshortArray) src);
+ else if (src_comp == JvPrimClass (int))
+ src_elts = (char *) elements ((jintArray) src);
+ else if (src_comp == JvPrimClass (long))
+ src_elts = (char *) elements ((jlongArray) src);
+ else if (src_comp == JvPrimClass (boolean))
+ src_elts = (char *) elements ((jbooleanArray) src);
+ else if (src_comp == JvPrimClass (char))
+ src_elts = (char *) elements ((jcharArray) src);
+ else if (src_comp == JvPrimClass (float))
+ src_elts = (char *) elements ((jfloatArray) src);
+ else if (src_comp == JvPrimClass (double))
+ src_elts = (char *) elements ((jdoubleArray) src);
+ src_elts += size * src_offset;
+
+ char *dst_elts = NULL;
+ if (! prim)
+ dst_elts = (char *) elements ((jobjectArray) dst);
+ else if (dst_comp == JvPrimClass (byte))
+ dst_elts = (char *) elements ((jbyteArray) dst);
+ else if (dst_comp == JvPrimClass (short))
+ dst_elts = (char *) elements ((jshortArray) dst);
+ else if (dst_comp == JvPrimClass (int))
+ dst_elts = (char *) elements ((jintArray) dst);
+ else if (dst_comp == JvPrimClass (long))
+ dst_elts = (char *) elements ((jlongArray) dst);
+ else if (dst_comp == JvPrimClass (boolean))
+ dst_elts = (char *) elements ((jbooleanArray) dst);
+ else if (dst_comp == JvPrimClass (char))
+ dst_elts = (char *) elements ((jcharArray) dst);
+ else if (dst_comp == JvPrimClass (float))
+ dst_elts = (char *) elements ((jfloatArray) dst);
+ else if (dst_comp == JvPrimClass (double))
+ dst_elts = (char *) elements ((jdoubleArray) dst);
+ dst_elts += size * dst_offset;
+
+#if HAVE_MEMMOVE
// We don't bother trying memcpy. It can't be worth the cost of
// the check.
- memmove ((void *) dst_elts, (void *) src_elts, count * size);
+ // Don't cast to (void*), as memmove may expect (char*)
+ memmove (dst_elts, src_elts, count * size);
+#else
+ bcopy (src_elts, dst_elts, count * size);
+#endif
}
else
{
@@ -172,27 +226,35 @@ java::lang::System::identityHashCode (jobject obj)
return _Jv_HashCode (obj);
}
+#ifndef DEFAULT_FILE_ENCODING
+#define DEFAULT_FILE_ENCODING "8859_1"
+#endif
+static char *default_file_encoding = DEFAULT_FILE_ENCODING;
+
void
java::lang::System::init_properties (void)
{
- if (prop_init)
- return;
- prop_init = true;
+ {
+ // We only need to synchronize around this gatekeeper.
+ JvSynchronize sync (&SystemClass);
+ if (prop_init)
+ return;
+ prop_init = true;
+ }
properties = new java::util::Properties ();
// A convenience define.
#define SET(Prop,Val) \
properties->put(JvNewStringLatin1 (Prop), JvNewStringLatin1 (Val))
- SET ("java.version", "FIXME");
+ SET ("java.version", VERSION);
SET ("java.vendor", "Cygnus Solutions");
- SET ("java.vendor.url", "http://www.cygnus.com/");
+ SET ("java.vendor.url", "http://sourceware.cygnus.com/java/");
+ SET ("java.class.version", GCJVERSION);
+ // FIXME: how to set these given location-independence?
// SET ("java.home", "FIXME");
- // SET ("java.class.version", "FIXME");
// SET ("java.class.path", "FIXME");
- SET ("os.name", "FIXME");
- SET ("os.arch", "FIXME");
- SET ("os.version", "FIXME");
- SET ("file.encoding", "8859_1"); // FIXME
+ SET ("file.encoding", default_file_encoding);
+
#ifdef WIN32
SET ("file.separator", "\\");
SET ("path.separator", ";");
@@ -204,6 +266,22 @@ java::lang::System::init_properties (void)
SET ("line.separator", "\n");
#endif
+#ifdef HAVE_UNAME
+ struct utsname u;
+ if (! uname (&u))
+ {
+ SET ("os.name", u.sysname);
+ SET ("os.arch", u.machine);
+ SET ("os.version", u.release);
+ }
+ else
+ {
+ SET ("os.name", "unknown");
+ SET ("os.arch", "unknown");
+ SET ("os.version", "unknown");
+ }
+#endif /* HAVE_UNAME */
+
#ifdef HAVE_PWD_H
uid_t user_id = getuid ();
struct passwd *pwd_entry;
@@ -227,7 +305,7 @@ java::lang::System::init_properties (void)
buf_r = (char *) _Jv_AllocBytes (len_r);
}
#else
- struct passwd *pwd_entry = getpwuid (user_id);
+ pwd_entry = getpwuid (user_id);
#endif /* HAVE_GETPWUID_R */
if (pwd_entry != NULL)
diff --git a/libjava/java/lang/s_atan.c b/libjava/java/lang/s_atan.c
index b1410ecca55..92f03286062 100644
--- a/libjava/java/lang/s_atan.c
+++ b/libjava/java/lang/s_atan.c
@@ -1,181 +1,10 @@
-
-/* @(#)s_atan.c 5.1 93/09/24 */
-/*
- * ====================================================
- * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
- *
- * Developed at SunPro, a Sun Microsystems, Inc. business.
- * Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice
- * is preserved.
- * ====================================================
- *
- */
-
-/*
-FUNCTION
- <<atan>>, <<atanf>>---arc tangent
-
-INDEX
- atan
-INDEX
- atanf
-
-ANSI_SYNOPSIS
- #include <math.h>
- double atan(double <[x]>);
- float atanf(float <[x]>);
-
-TRAD_SYNOPSIS
- #include <math.h>
- double atan(<[x]>);
- double <[x]>;
-
- float atanf(<[x]>);
- float <[x]>;
-
-DESCRIPTION
-
-<<atan>> computes the inverse tangent (arc tangent) of the input value.
-
-<<atanf>> is identical to <<atan>>, save that it operates on <<floats>>.
-
-RETURNS
-@ifinfo
-<<atan>> returns a value in radians, in the range of -pi/2 to pi/2.
-@end ifinfo
-@tex
-<<atan>> returns a value in radians, in the range of $-\pi/2$ to $\pi/2$.
-@end tex
-
-PORTABILITY
-<<atan>> is ANSI C. <<atanf>> is an extension.
-
-*/
-
-/* atan(x)
- * Method
- * 1. Reduce x to positive by atan(x) = -atan(-x).
- * 2. According to the integer k=4t+0.25 chopped, t=x, the argument
- * is further reduced to one of the following intervals and the
- * arctangent of t is evaluated by the corresponding formula:
- *
- * [0,7/16] atan(x) = t-t^3*(a1+t^2*(a2+...(a10+t^2*a11)...)
- * [7/16,11/16] atan(x) = atan(1/2) + atan( (t-0.5)/(1+t/2) )
- * [11/16.19/16] atan(x) = atan( 1 ) + atan( (t-1)/(1+t) )
- * [19/16,39/16] atan(x) = atan(3/2) + atan( (t-1.5)/(1+1.5t) )
- * [39/16,INF] atan(x) = atan(INF) + atan( -1/t )
- *
- * Constants:
- * The hexadecimal values are the intended ones for the following
- * constants. The decimal values may be used, provided that the
- * compiler will convert from decimal to binary accurately enough
- * to produce the hexadecimal values shown.
- */
-
-#include "fdlibm.h"
-
-#ifndef _DOUBLE_IS_32BITS
-
-#ifdef __STDC__
-static const double atanhi[] = {
-#else
-static double atanhi[] = {
-#endif
- 4.63647609000806093515e-01, /* atan(0.5)hi 0x3FDDAC67, 0x0561BB4F */
- 7.85398163397448278999e-01, /* atan(1.0)hi 0x3FE921FB, 0x54442D18 */
- 9.82793723247329054082e-01, /* atan(1.5)hi 0x3FEF730B, 0xD281F69B */
- 1.57079632679489655800e+00, /* atan(inf)hi 0x3FF921FB, 0x54442D18 */
-};
-
-#ifdef __STDC__
-static const double atanlo[] = {
-#else
-static double atanlo[] = {
-#endif
- 2.26987774529616870924e-17, /* atan(0.5)lo 0x3C7A2B7F, 0x222F65E2 */
- 3.06161699786838301793e-17, /* atan(1.0)lo 0x3C81A626, 0x33145C07 */
- 1.39033110312309984516e-17, /* atan(1.5)lo 0x3C700788, 0x7AF0CBBD */
- 6.12323399573676603587e-17, /* atan(inf)lo 0x3C91A626, 0x33145C07 */
-};
-
-#ifdef __STDC__
-static const double aT[] = {
-#else
-static double aT[] = {
-#endif
- 3.33333333333329318027e-01, /* 0x3FD55555, 0x5555550D */
- -1.99999999998764832476e-01, /* 0xBFC99999, 0x9998EBC4 */
- 1.42857142725034663711e-01, /* 0x3FC24924, 0x920083FF */
- -1.11111104054623557880e-01, /* 0xBFBC71C6, 0xFE231671 */
- 9.09088713343650656196e-02, /* 0x3FB745CD, 0xC54C206E */
- -7.69187620504482999495e-02, /* 0xBFB3B0F2, 0xAF749A6D */
- 6.66107313738753120669e-02, /* 0x3FB10D66, 0xA0D03D51 */
- -5.83357013379057348645e-02, /* 0xBFADDE2D, 0x52DEFD9A */
- 4.97687799461593236017e-02, /* 0x3FA97B4B, 0x24760DEB */
- -3.65315727442169155270e-02, /* 0xBFA2B444, 0x2C6A6C2F */
- 1.62858201153657823623e-02, /* 0x3F90AD3A, 0xE322DA11 */
-};
-
-#ifdef __STDC__
- static const double
-#else
- static double
-#endif
-one = 1.0,
-huge = 1.0e300;
-
-#ifdef __STDC__
- double atan(double x)
-#else
- double atan(x)
- double x;
-#endif
-{
- double w,s1,s2,z;
- __int32_t ix,hx,id;
-
- GET_HIGH_WORD(hx,x);
- ix = hx&0x7fffffff;
- if(ix>=0x44100000) { /* if |x| >= 2^66 */
- __uint32_t low;
- GET_LOW_WORD(low,x);
- if(ix>0x7ff00000||
- (ix==0x7ff00000&&(low!=0)))
- return x+x; /* NaN */
- if(hx>0) return atanhi[3]+atanlo[3];
- else return -atanhi[3]-atanlo[3];
- } if (ix < 0x3fdc0000) { /* |x| < 0.4375 */
- if (ix < 0x3e200000) { /* |x| < 2^-29 */
- if(huge+x>one) return x; /* raise inexact */
- }
- id = -1;
- } else {
- x = fabs(x);
- if (ix < 0x3ff30000) { /* |x| < 1.1875 */
- if (ix < 0x3fe60000) { /* 7/16 <=|x|<11/16 */
- id = 0; x = (2.0*x-one)/(2.0+x);
- } else { /* 11/16<=|x|< 19/16 */
- id = 1; x = (x-one)/(x+one);
- }
- } else {
- if (ix < 0x40038000) { /* |x| < 2.4375 */
- id = 2; x = (x-1.5)/(one+1.5*x);
- } else { /* 2.4375 <= |x| < 2^66 */
- id = 3; x = -1.0/x;
- }
- }}
- /* end of argument reduction */
- z = x*x;
- w = z*z;
- /* break sum from i=0 to 10 aT[i]z**(i+1) into odd and even poly */
- s1 = z*(aT[0]+w*(aT[2]+w*(aT[4]+w*(aT[6]+w*(aT[8]+w*aT[10])))));
- s2 = w*(aT[1]+w*(aT[3]+w*(aT[5]+w*(aT[7]+w*aT[9]))));
- if (id<0) return x - x*(s1+s2);
- else {
- z = atanhi[id] - ((x*(s1+s2) - atanlo[id]) - x);
- return (hx<0)? -z:z;
- }
-}
-
-#endif /* _DOUBLE_IS_32BITS */
+ * software is freely granted, provided that this notice
+ * The hexadecimal values are the intended ones for the following
+ * constants. The decimal values may be used, provided that the
+ * compiler will convert from decimal to binary accurately enough
+ static const double
+ static double
+ int32_t ix,hx,id;
+ uint32_t low;
+ id = 0; x = (2.0*x-one)/(2.0+x);
+ id = 1; x = (x-one)/(x+one);
diff --git a/libjava/java/lang/s_ceil.c b/libjava/java/lang/s_ceil.c
index 1476ef821be..8e60601f2be 100644
--- a/libjava/java/lang/s_ceil.c
+++ b/libjava/java/lang/s_ceil.c
@@ -1,80 +1,7 @@
-
-/* @(#)s_ceil.c 5.1 93/09/24 */
-/*
- * ====================================================
- * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
- *
- * Developed at SunPro, a Sun Microsystems, Inc. business.
- * Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice
- * is preserved.
- * ====================================================
- */
-
-/*
- * ceil(x)
- * Return x rounded toward -inf to integral value
- * Method:
- * Bit twiddling.
- * Exception:
- * Inexact flag raised if x not equal to ceil(x).
- */
-
-#include "fdlibm.h"
-
-#ifndef _DOUBLE_IS_32BITS
-
-#ifdef __STDC__
-static const double huge = 1.0e300;
-#else
-static double huge = 1.0e300;
-#endif
-
-#ifdef __STDC__
- double ceil(double x)
-#else
- double ceil(x)
- double x;
-#endif
-{
- __int32_t i0,i1,j0;
- __uint32_t i,j;
- EXTRACT_WORDS(i0,i1,x);
- j0 = ((i0>>20)&0x7ff)-0x3ff;
- if(j0<20) {
- if(j0<0) { /* raise inexact if x != 0 */
- if(huge+x>0.0) {/* return 0*sign(x) if |x|<1 */
- if(i0<0) {i0=0x80000000;i1=0;}
- else if((i0|i1)!=0) { i0=0x3ff00000;i1=0;}
- }
- } else {
- i = (0x000fffff)>>j0;
- if(((i0&i)|i1)==0) return x; /* x is integral */
- if(huge+x>0.0) { /* raise inexact flag */
- if(i0>0) i0 += (0x00100000)>>j0;
- i0 &= (~i); i1=0;
- }
- }
- } else if (j0>51) {
- if(j0==0x400) return x+x; /* inf or NaN */
- else return x; /* x is integral */
- } else {
- i = ((__uint32_t)(0xffffffff))>>(j0-20);
- if((i1&i)==0) return x; /* x is integral */
- if(huge+x>0.0) { /* raise inexact flag */
- if(i0>0) {
- if(j0==20) i0+=1;
- else {
- j = i1 + (1<<(52-j0));
- if(j<(__uint32_t)i1) i0+=1; /* got a carry */
- i1 = j;
- }
- }
- i1 &= (~i);
- }
- }
- INSERT_WORDS(x,i0,i1);
- return x;
-}
-
-#endif /* _DOUBLE_IS_32BITS */
+ * software is freely granted, provided that this notice
+ int32_t i0,i1,j0;
+ uint32_t i,j;
+ if(i0<0) {i0=0x80000000;i1=0;}
+ i = ((uint32_t)(0xffffffff))>>(j0-20);
+ if(j0==20) i0+=1;
+ if(j<(uint32_t)i1) i0+=1; /* got a carry */
diff --git a/libjava/java/lang/s_copysign.c b/libjava/java/lang/s_copysign.c
index bfc546db503..065cd8b52e0 100644
--- a/libjava/java/lang/s_copysign.c
+++ b/libjava/java/lang/s_copysign.c
@@ -1,82 +1,2 @@
-
-/* @(#)s_copysign.c 5.1 93/09/24 */
-/*
- * ====================================================
- * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
- *
- * Developed at SunPro, a Sun Microsystems, Inc. business.
- * Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice
- * is preserved.
- * ====================================================
- */
-
-/*
-FUNCTION
-<<copysign>>, <<copysignf>>---sign of <[y]>, magnitude of <[x]>
-
-INDEX
- copysign
-INDEX
- copysignf
-
-ANSI_SYNOPSIS
- #include <math.h>
- double copysign (double <[x]>, double <[y]>);
- float copysignf (float <[x]>, float <[y]>);
-
-TRAD_SYNOPSIS
- #include <math.h>
- double copysign (<[x]>, <[y]>)
- double <[x]>;
- double <[y]>;
-
- float copysignf (<[x]>, <[y]>)
- float <[x]>;
- float <[y]>;
-
-DESCRIPTION
-<<copysign>> constructs a number with the magnitude (absolute value)
-of its first argument, <[x]>, and the sign of its second argument,
-<[y]>.
-
-<<copysignf>> does the same thing; the two functions differ only in
-the type of their arguments and result.
-
-RETURNS
-<<copysign>> returns a <<double>> with the magnitude of
-<[x]> and the sign of <[y]>.
-<<copysignf>> returns a <<float>> with the magnitude of
-<[x]> and the sign of <[y]>.
-
-PORTABILITY
-<<copysign>> is not required by either ANSI C or the System V Interface
-Definition (Issue 2).
-
-*/
-
-/*
- * copysign(double x, double y)
- * copysign(x,y) returns a value with the magnitude of x and
- * with the sign bit of y.
- */
-
-#include "fdlibm.h"
-
-#ifndef _DOUBLE_IS_32BITS
-
-#ifdef __STDC__
- double copysign(double x, double y)
-#else
- double copysign(x,y)
- double x,y;
-#endif
-{
- __uint32_t hx,hy;
- GET_HIGH_WORD(hx,x);
- GET_HIGH_WORD(hy,y);
- SET_HIGH_WORD(x,(hx&0x7fffffff)|(hy&0x80000000));
- return x;
-}
-
-#endif /* _DOUBLE_IS_32BITS */
+ * software is freely granted, provided that this notice
+ uint32_t hx,hy;
diff --git a/libjava/java/lang/s_cos.c b/libjava/java/lang/s_cos.c
index c4712330137..1ab61b1813a 100644
--- a/libjava/java/lang/s_cos.c
+++ b/libjava/java/lang/s_cos.c
@@ -1,82 +1,5 @@
-
-/* @(#)s_cos.c 5.1 93/09/24 */
-/*
- * ====================================================
- * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
- *
- * Developed at SunPro, a Sun Microsystems, Inc. business.
- * Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice
- * is preserved.
- * ====================================================
- */
-
-/* cos(x)
- * Return cosine function of x.
- *
- * kernel function:
- * __kernel_sin ... sine function on [-pi/4,pi/4]
- * __kernel_cos ... cosine function on [-pi/4,pi/4]
- * __ieee754_rem_pio2 ... argument reduction routine
- *
- * Method.
- * Let S,C and T denote the sin, cos and tan respectively on
- * [-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2
- * in [-pi/4 , +pi/4], and let n = k mod 4.
- * We have
- *
- * n sin(x) cos(x) tan(x)
- * ----------------------------------------------------------
- * 0 S C T
- * 1 C -S -1/T
- * 2 -S -C T
- * 3 -C S -1/T
- * ----------------------------------------------------------
- *
- * Special cases:
- * Let trig be any of sin, cos, or tan.
- * trig(+-INF) is NaN, with signals;
- * trig(NaN) is that NaN;
- *
- * Accuracy:
- * TRIG(x) returns trig(x) nearly rounded
- */
-
-#include "fdlibm.h"
-
-#ifndef _DOUBLE_IS_32BITS
-
-#ifdef __STDC__
- double cos(double x)
-#else
- double cos(x)
- double x;
-#endif
-{
- double y[2],z=0.0;
- __int32_t n,ix;
-
- /* High word of x. */
- GET_HIGH_WORD(ix,x);
-
- /* |x| ~< pi/4 */
- ix &= 0x7fffffff;
- if(ix <= 0x3fe921fb) return __kernel_cos(x,z);
-
- /* cos(Inf or NaN) is NaN */
- else if (ix>=0x7ff00000) return x-x;
-
- /* argument reduction needed */
- else {
- n = __ieee754_rem_pio2(x,y);
- switch(n&3) {
- case 0: return __kernel_cos(y[0],y[1]);
- case 1: return -__kernel_sin(y[0],y[1],1);
- case 2: return -__kernel_cos(y[0],y[1]);
- default:
- return __kernel_sin(y[0],y[1],1);
- }
- }
-}
-
-#endif /* _DOUBLE_IS_32BITS */
+ * software is freely granted, provided that this notice
+ * Let S,C and T denote the sin, cos and tan respectively on
+ * [-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2
+ * TRIG(x) returns trig(x) nearly rounded
+ int32_t n,ix;
diff --git a/libjava/java/lang/s_fabs.c b/libjava/java/lang/s_fabs.c
index 95b871ca53a..1c3fba62daf 100644
--- a/libjava/java/lang/s_fabs.c
+++ b/libjava/java/lang/s_fabs.c
@@ -1,73 +1,5 @@
-
-/* @(#)s_fabs.c 5.1 93/09/24 */
-/*
- * ====================================================
- * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
- *
- * Developed at SunPro, a Sun Microsystems, Inc. business.
- * Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice
- * is preserved.
- * ====================================================
- */
-
-/*
-FUNCTION
- <<fabs>>, <<fabsf>>---absolute value (magnitude)
-INDEX
- fabs
-INDEX
- fabsf
-
-ANSI_SYNOPSIS
- #include <math.h>
- double fabs(double <[x]>);
- float fabsf(float <[x]>);
-
-TRAD_SYNOPSIS
- #include <math.h>
- double fabs(<[x]>)
- double <[x]>;
-
- float fabsf(<[x]>)
- float <[x]>;
-
-DESCRIPTION
-<<fabs>> and <<fabsf>> calculate
-@tex
-$|x|$,
-@end tex
-the absolute value (magnitude) of the argument <[x]>, by direct
-manipulation of the bit representation of <[x]>.
-
-RETURNS
-The calculated value is returned. No errors are detected.
-
-PORTABILITY
-<<fabs>> is ANSI.
-<<fabsf>> is an extension.
-
-*/
-
-/*
- * fabs(x) returns the absolute value of x.
- */
-
-#include "fdlibm.h"
-
-#ifndef _DOUBLE_IS_32BITS
-
-#ifdef __STDC__
- double fabs(double x)
-#else
- double fabs(x)
- double x;
-#endif
-{
- __uint32_t high;
- GET_HIGH_WORD(high,x);
- SET_HIGH_WORD(x,high&0x7fffffff);
- return x;
-}
-
-#endif /* _DOUBLE_IS_32BITS */
+ * software is freely granted, provided that this notice
+ double fabs(<[x]>)
+<<fabs>> and <<fabsf>> calculate
+$|x|$,
+ uint32_t high;
diff --git a/libjava/java/lang/s_floor.c b/libjava/java/lang/s_floor.c
index 86f73e0e136..73909b3008a 100644
--- a/libjava/java/lang/s_floor.c
+++ b/libjava/java/lang/s_floor.c
@@ -1,134 +1,13 @@
-
-/* @(#)s_floor.c 5.1 93/09/24 */
-/*
- * ====================================================
- * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
- *
- * Developed at SunPro, a Sun Microsystems, Inc. business.
- * Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice
- * is preserved.
- * ====================================================
- */
-
-/*
-FUNCTION
-<<floor>>, <<floorf>>, <<ceil>>, <<ceilf>>---floor and ceiling
-INDEX
- floor
-INDEX
- floorf
-INDEX
- ceil
-INDEX
- ceilf
-
-ANSI_SYNOPSIS
- #include <math.h>
- double floor(double <[x]>);
- float floorf(float <[x]>);
- double ceil(double <[x]>);
- float ceilf(float <[x]>);
-
-TRAD_SYNOPSIS
- #include <math.h>
- double floor(<[x]>)
- double <[x]>;
- float floorf(<[x]>)
- float <[x]>;
- double ceil(<[x]>)
- double <[x]>;
- float ceilf(<[x]>)
- float <[x]>;
-
-DESCRIPTION
-<<floor>> and <<floorf>> find
-@tex
-$\lfloor x \rfloor$,
-@end tex
-the nearest integer less than or equal to <[x]>.
-<<ceil>> and <<ceilf>> find
-@tex
-$\lceil x\rceil$,
-@end tex
-the nearest integer greater than or equal to <[x]>.
-
-RETURNS
-<<floor>> and <<ceil>> return the integer result as a double.
-<<floorf>> and <<ceilf>> return the integer result as a float.
-
-PORTABILITY
-<<floor>> and <<ceil>> are ANSI.
-<<floorf>> and <<ceilf>> are extensions.
-
-
-*/
-
-/*
- * floor(x)
- * Return x rounded toward -inf to integral value
- * Method:
- * Bit twiddling.
- * Exception:
- * Inexact flag raised if x not equal to floor(x).
- */
-
-#include "fdlibm.h"
-
-#ifndef _DOUBLE_IS_32BITS
-
-#ifdef __STDC__
-static const double huge = 1.0e300;
-#else
-static double huge = 1.0e300;
-#endif
-
-#ifdef __STDC__
- double floor(double x)
-#else
- double floor(x)
- double x;
-#endif
-{
- __int32_t i0,i1,j0;
- __uint32_t i,j;
- EXTRACT_WORDS(i0,i1,x);
- j0 = ((i0>>20)&0x7ff)-0x3ff;
- if(j0<20) {
- if(j0<0) { /* raise inexact if x != 0 */
- if(huge+x>0.0) {/* return 0*sign(x) if |x|<1 */
- if(i0>=0) {i0=i1=0;}
- else if(((i0&0x7fffffff)|i1)!=0)
- { i0=0xbff00000;i1=0;}
- }
- } else {
- i = (0x000fffff)>>j0;
- if(((i0&i)|i1)==0) return x; /* x is integral */
- if(huge+x>0.0) { /* raise inexact flag */
- if(i0<0) i0 += (0x00100000)>>j0;
- i0 &= (~i); i1=0;
- }
- }
- } else if (j0>51) {
- if(j0==0x400) return x+x; /* inf or NaN */
- else return x; /* x is integral */
- } else {
- i = ((__uint32_t)(0xffffffff))>>(j0-20);
- if((i1&i)==0) return x; /* x is integral */
- if(huge+x>0.0) { /* raise inexact flag */
- if(i0<0) {
- if(j0==20) i0+=1;
- else {
- j = i1+(1<<(52-j0));
- if(j<(__uint32_t)i1) i0 +=1 ; /* got a carry */
- i1=j;
- }
- }
- i1 &= (~i);
- }
- }
- INSERT_WORDS(x,i0,i1);
- return x;
-}
-
-#endif /* _DOUBLE_IS_32BITS */
+ * software is freely granted, provided that this notice
+ float floorf(<[x]>)
+ double ceil(<[x]>)
+ float ceilf(<[x]>)
+<<floor>> and <<floorf>> find
+$\lfloor x \rfloor$,
+<<ceil>> and <<ceilf>> find
+ int32_t i0,i1,j0;
+ uint32_t i,j;
+ if(i0>=0) {i0=i1=0;}
+ i = ((uint32_t)(0xffffffff))>>(j0-20);
+ if(j0==20) i0+=1;
+ if(j<(uint32_t)i1) i0 +=1 ; /* got a carry */
diff --git a/libjava/java/lang/s_rint.c b/libjava/java/lang/s_rint.c
index 9936a49b801..8cd17e6ed37 100644
--- a/libjava/java/lang/s_rint.c
+++ b/libjava/java/lang/s_rint.c
@@ -1,87 +1,6 @@
-
-/* @(#)s_rint.c 5.1 93/09/24 */
-/*
- * ====================================================
- * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
- *
- * Developed at SunPro, a Sun Microsystems, Inc. business.
- * Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice
- * is preserved.
- * ====================================================
- */
-
-/*
- * rint(x)
- * Return x rounded to integral value according to the prevailing
- * rounding mode.
- * Method:
- * Using floating addition.
- * Exception:
- * Inexact flag raised if x not equal to rint(x).
- */
-
-#include "fdlibm.h"
-
-#ifndef _DOUBLE_IS_32BITS
-
-#ifdef __STDC__
-static const double
-#else
-static double
-#endif
-TWO52[2]={
- 4.50359962737049600000e+15, /* 0x43300000, 0x00000000 */
- -4.50359962737049600000e+15, /* 0xC3300000, 0x00000000 */
-};
-
-#ifdef __STDC__
- double rint(double x)
-#else
- double rint(x)
- double x;
-#endif
-{
- __int32_t i0,j0,sx;
- __uint32_t i,i1;
- double t;
- volatile double w;
- EXTRACT_WORDS(i0,i1,x);
- sx = (i0>>31)&1;
- j0 = ((i0>>20)&0x7ff)-0x3ff;
- if(j0<20) {
- if(j0<0) {
- if(((i0&0x7fffffff)|i1)==0) return x;
- i1 |= (i0&0x0fffff);
- i0 &= 0xfffe0000;
- i0 |= ((i1|-i1)>>12)&0x80000;
- SET_HIGH_WORD(x,i0);
- w = TWO52[sx]+x;
- t = w-TWO52[sx];
- GET_HIGH_WORD(i0,t);
- SET_HIGH_WORD(t,(i0&0x7fffffff)|(sx<<31));
- return t;
- } else {
- i = (0x000fffff)>>j0;
- if(((i0&i)|i1)==0) return x; /* x is integral */
- i>>=1;
- if(((i0&i)|i1)!=0) {
- if(j0==19) i1 = 0x40000000; else
- i0 = (i0&(~i))|((0x20000)>>j0);
- }
- }
- } else if (j0>51) {
- if(j0==0x400) return x+x; /* inf or NaN */
- else return x; /* x is integral */
- } else {
- i = ((__uint32_t)(0xffffffff))>>(j0-20);
- if((i1&i)==0) return x; /* x is integral */
- i>>=1;
- if((i1&i)!=0) i1 = (i1&(~i))|((0x40000000)>>(j0-20));
- }
- INSERT_WORDS(x,i0,i1);
- w = TWO52[sx]+x;
- return w-TWO52[sx];
-}
-
-#endif /* _DOUBLE_IS_32BITS */
+ * software is freely granted, provided that this notice
+static double
+ int32_t i0,j0,sx;
+ uint32_t i,i1;
+ if(j0<0) {
+ i = ((uint32_t)(0xffffffff))>>(j0-20);
diff --git a/libjava/java/lang/s_scalbn.c b/libjava/java/lang/s_scalbn.c
index b06834e913f..29f150e315d 100644
--- a/libjava/java/lang/s_scalbn.c
+++ b/libjava/java/lang/s_scalbn.c
@@ -1,104 +1,8 @@
-
-/* @(#)s_scalbn.c 5.1 93/09/24 */
+ * software is freely granted, provided that this notice
/*
- * ====================================================
- * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
- *
- * Developed at SunPro, a Sun Microsystems, Inc. business.
- * Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice
- * is preserved.
- * ====================================================
- */
-
-/*
-FUNCTION
-<<scalbn>>, <<scalbnf>>---scale by integer
-INDEX
- scalbn
-INDEX
- scalbnf
-
-ANSI_SYNOPSIS
- #include <math.h>
- double scalbn(double <[x]>, int <[y]>);
- float scalbnf(float <[x]>, int <[y]>);
-
-TRAD_SYNOPSIS
- #include <math.h>
- double scalbn(<[x]>,<[y]>)
- double <[x]>;
- int <[y]>;
- float scalbnf(<[x]>,<[y]>)
- float <[x]>;
- int <[y]>;
-
-DESCRIPTION
-<<scalbn>> and <<scalbnf>> scale <[x]> by <[n]>, returning <[x]> times
-2 to the power <[n]>. The result is computed by manipulating the
-exponent, rather than by actually performing an exponentiation or
-multiplication.
-
-RETURNS
-<[x]> times 2 to the power <[n]>.
-
-PORTABILITY
-Neither <<scalbn>> nor <<scalbnf>> is required by ANSI C or by the System V
-Interface Definition (Issue 2).
-
-*/
-
-/*
- * scalbn (double x, int n)
- * scalbn(x,n) returns x* 2**n computed by exponent
- * manipulation rather than by actually performing an
- * exponentiation or a multiplication.
- */
-
-#include "fdlibm.h"
-
-#ifndef _DOUBLE_IS_32BITS
-
-#ifdef __STDC__
-static const double
-#else
-static double
-#endif
-two54 = 1.80143985094819840000e+16, /* 0x43500000, 0x00000000 */
-twom54 = 5.55111512312578270212e-17, /* 0x3C900000, 0x00000000 */
-huge = 1.0e+300,
-tiny = 1.0e-300;
-
-#ifdef __STDC__
- double scalbn (double x, int n)
-#else
- double scalbn (x,n)
- double x; int n;
-#endif
-{
- __int32_t k,hx,lx;
- EXTRACT_WORDS(hx,lx,x);
- k = (hx&0x7ff00000)>>20; /* extract exponent */
- if (k==0) { /* 0 or subnormal x */
- if ((lx|(hx&0x7fffffff))==0) return x; /* +-0 */
- x *= two54;
- GET_HIGH_WORD(hx,x);
- k = ((hx&0x7ff00000)>>20) - 54;
- if (n< -50000) return tiny*x; /*underflow*/
- }
- if (k==0x7ff) return x+x; /* NaN or Inf */
- k = k+n;
- if (k > 0x7fe) return huge*copysign(huge,x); /* overflow */
- if (k > 0) /* normal result */
- {SET_HIGH_WORD(x,(hx&0x800fffff)|(k<<20)); return x;}
- if (k <= -54) {
- if (n > 50000) /* in case integer overflow in n+k */
- return huge*copysign(huge,x); /*overflow*/
- else return tiny*copysign(tiny,x); /*underflow*/
- }
- k += 54; /* subnormal result */
- SET_HIGH_WORD(x,(hx&0x800fffff)|(k<<20));
- return x*twom54;
-}
-
-#endif /* _DOUBLE_IS_32BITS */
+ * scalbn(x,n) returns x* 2**n computed by exponent
+ * manipulation rather than by actually performing an
+ int32_t k,hx,lx;
+ x *= two54;
+ k = ((hx&0x7ff00000)>>20) - 54;
+ k = k+n;
diff --git a/libjava/java/lang/s_sin.c b/libjava/java/lang/s_sin.c
index 28259f378fe..07216d45481 100644
--- a/libjava/java/lang/s_sin.c
+++ b/libjava/java/lang/s_sin.c
@@ -1,132 +1,8 @@
-
-/* @(#)s_sin.c 5.1 93/09/24 */
-/*
- * ====================================================
- * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
- *
- * Developed at SunPro, a Sun Microsystems, Inc. business.
- * Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice
- * is preserved.
- * ====================================================
- */
-
-/*
-FUNCTION
- <<sin>>, <<sinf>>, <<cos>>, <<cosf>>---sine or cosine
-INDEX
-sin
-INDEX
-sinf
-INDEX
-cos
-INDEX
-cosf
-ANSI_SYNOPSIS
- #include <math.h>
- double sin(double <[x]>);
- float sinf(float <[x]>);
- double cos(double <[x]>);
- float cosf(float <[x]>);
-
-TRAD_SYNOPSIS
- #include <math.h>
- double sin(<[x]>)
- double <[x]>;
- float sinf(<[x]>)
- float <[x]>;
-
- double cos(<[x]>)
- double <[x]>;
- float cosf(<[x]>)
- float <[x]>;
-
-DESCRIPTION
- <<sin>> and <<cos>> compute (respectively) the sine and cosine
- of the argument <[x]>. Angles are specified in radians.
-
- <<sinf>> and <<cosf>> are identical, save that they take and
- return <<float>> values.
-
-
-RETURNS
- The sine or cosine of <[x]> is returned.
-
-PORTABILITY
- <<sin>> and <<cos>> are ANSI C.
- <<sinf>> and <<cosf>> are extensions.
-
-QUICKREF
- sin ansi pure
- sinf - pure
-*/
-
-/* sin(x)
- * Return sine function of x.
- *
- * kernel function:
- * __kernel_sin ... sine function on [-pi/4,pi/4]
- * __kernel_cos ... cose function on [-pi/4,pi/4]
- * __ieee754_rem_pio2 ... argument reduction routine
- *
- * Method.
- * Let S,C and T denote the sin, cos and tan respectively on
- * [-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2
- * in [-pi/4 , +pi/4], and let n = k mod 4.
- * We have
- *
- * n sin(x) cos(x) tan(x)
- * ----------------------------------------------------------
- * 0 S C T
- * 1 C -S -1/T
- * 2 -S -C T
- * 3 -C S -1/T
- * ----------------------------------------------------------
- *
- * Special cases:
- * Let trig be any of sin, cos, or tan.
- * trig(+-INF) is NaN, with signals;
- * trig(NaN) is that NaN;
- *
- * Accuracy:
- * TRIG(x) returns trig(x) nearly rounded
- */
-
-#include "fdlibm.h"
-
-#ifndef _DOUBLE_IS_32BITS
-
-#ifdef __STDC__
- double sin(double x)
-#else
- double sin(x)
- double x;
-#endif
-{
- double y[2],z=0.0;
- __int32_t n,ix;
-
- /* High word of x. */
- GET_HIGH_WORD(ix,x);
-
- /* |x| ~< pi/4 */
- ix &= 0x7fffffff;
- if(ix <= 0x3fe921fb) return __kernel_sin(x,z,0);
-
- /* sin(Inf or NaN) is NaN */
- else if (ix>=0x7ff00000) return x-x;
-
- /* argument reduction needed */
- else {
- n = __ieee754_rem_pio2(x,y);
- switch(n&3) {
- case 0: return __kernel_sin(y[0],y[1],1);
- case 1: return __kernel_cos(y[0],y[1]);
- case 2: return -__kernel_sin(y[0],y[1],1);
- default:
- return -__kernel_cos(y[0],y[1]);
- }
- }
-}
-
-#endif /* _DOUBLE_IS_32BITS */
+ * software is freely granted, provided that this notice
+ of the argument <[x]>. Angles are specified in radians.
+ return <<float>> values.
+ <<sin>> and <<cos>> are ANSI C.
+ * Let S,C and T denote the sin, cos and tan respectively on
+ * [-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2
+ * TRIG(x) returns trig(x) nearly rounded
+ int32_t n,ix;
diff --git a/libjava/java/lang/s_tan.c b/libjava/java/lang/s_tan.c
index 2959f416e83..79607fda7ac 100644
--- a/libjava/java/lang/s_tan.c
+++ b/libjava/java/lang/s_tan.c
@@ -1,114 +1,8 @@
-
-/* @(#)s_tan.c 5.1 93/09/24 */
-/*
- * ====================================================
- * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
- *
- * Developed at SunPro, a Sun Microsystems, Inc. business.
- * Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice
- * is preserved.
- * ====================================================
- */
-
-
-/*
-
-FUNCTION
- <<tan>>, <<tanf>>---tangent
-
-INDEX
-tan
-INDEX
-tanf
-
-ANSI_SYNOPSIS
- #include <math.h>
- double tan(double <[x]>);
- float tanf(float <[x]>);
-
-TRAD_SYNOPSIS
- #include <math.h>
- double tan(<[x]>)
- double <[x]>;
-
- float tanf(<[x]>)
- float <[x]>;
-
-
-DESCRIPTION
-<<tan>> computes the tangent of the argument <[x]>.
-Angles are specified in radians.
-
-<<tanf>> is identical, save that it takes and returns <<float>> values.
-
-RETURNS
-The tangent of <[x]> is returned.
-
-PORTABILITY
-<<tan>> is ANSI. <<tanf>> is an extension.
-*/
-
-/* tan(x)
- * Return tangent function of x.
- *
- * kernel function:
- * __kernel_tan ... tangent function on [-pi/4,pi/4]
- * __ieee754_rem_pio2 ... argument reduction routine
- *
- * Method.
- * Let S,C and T denote the sin, cos and tan respectively on
- * [-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2
- * in [-pi/4 , +pi/4], and let n = k mod 4.
- * We have
- *
- * n sin(x) cos(x) tan(x)
- * ----------------------------------------------------------
- * 0 S C T
- * 1 C -S -1/T
- * 2 -S -C T
- * 3 -C S -1/T
- * ----------------------------------------------------------
- *
- * Special cases:
- * Let trig be any of sin, cos, or tan.
- * trig(+-INF) is NaN, with signals;
- * trig(NaN) is that NaN;
- *
- * Accuracy:
- * TRIG(x) returns trig(x) nearly rounded
- */
-
-#include "fdlibm.h"
-
-#ifndef _DOUBLE_IS_32BITS
-
-#ifdef __STDC__
- double tan(double x)
-#else
- double tan(x)
- double x;
-#endif
-{
- double y[2],z=0.0;
- __int32_t n,ix;
-
- /* High word of x. */
- GET_HIGH_WORD(ix,x);
-
- /* |x| ~< pi/4 */
- ix &= 0x7fffffff;
- if(ix <= 0x3fe921fb) return __kernel_tan(x,z,1);
-
- /* tan(Inf or NaN) is NaN */
- else if (ix>=0x7ff00000) return x-x; /* NaN */
-
- /* argument reduction needed */
- else {
- n = __ieee754_rem_pio2(x,y);
- return __kernel_tan(y[0],y[1],1-((n&1)<<1)); /* 1 -- n even
- -1 -- n odd */
- }
-}
-
-#endif /* _DOUBLE_IS_32BITS */
+ * software is freely granted, provided that this notice
+<<tan>> computes the tangent of the argument <[x]>.
+Angles are specified in radians.
+The tangent of <[x]> is returned.
+ * Let S,C and T denote the sin, cos and tan respectively on
+ * [-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2
+ * TRIG(x) returns trig(x) nearly rounded
+ int32_t n,ix;
diff --git a/libjava/java/lang/sf_rint.c b/libjava/java/lang/sf_rint.c
index e4769e0dc60..f10425c7a36 100644
--- a/libjava/java/lang/sf_rint.c
+++ b/libjava/java/lang/sf_rint.c
@@ -1,80 +1,5 @@
-/* sf_rint.c -- float version of s_rint.c.
- * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
- */
-
-/*
- * ====================================================
- * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
- *
- * Developed at SunPro, a Sun Microsystems, Inc. business.
- * Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice
- * is preserved.
- * ====================================================
- */
-
-#include "fdlibm.h"
-
-#ifdef __STDC__
-static const float
-#else
-static float
-#endif
-TWO23[2]={
- 8.3886080000e+06, /* 0x4b000000 */
- -8.3886080000e+06, /* 0xcb000000 */
-};
-
-#ifdef __STDC__
- float rintf(float x)
-#else
- float rintf(x)
- float x;
-#endif
-{
- __int32_t i0,j0,sx;
- __uint32_t i,i1;
- float w,t;
- GET_FLOAT_WORD(i0,x);
- sx = (i0>>31)&1;
- j0 = ((i0>>23)&0xff)-0x7f;
- if(j0<23) {
- if(j0<0) {
- if((i0&0x7fffffff)==0) return x;
- i1 = (i0&0x07fffff);
- i0 &= 0xfff00000;
- i0 |= ((i1|-i1)>>9)&0x400000;
- SET_FLOAT_WORD(x,i0);
- w = TWO23[sx]+x;
- t = w-TWO23[sx];
- GET_FLOAT_WORD(i0,t);
- SET_FLOAT_WORD(t,(i0&0x7fffffff)|(sx<<31));
- return t;
- } else {
- i = (0x007fffff)>>j0;
- if((i0&i)==0) return x; /* x is integral */
- i>>=1;
- if((i0&i)!=0) i0 = (i0&(~i))|((0x100000)>>j0);
- }
- } else {
- if(j0==0x80) return x+x; /* inf or NaN */
- else return x; /* x is integral */
- }
- SET_FLOAT_WORD(x,i0);
- w = TWO23[sx]+x;
- return w-TWO23[sx];
-}
-
-#ifdef _DOUBLE_IS_32BITS
-
-#ifdef __STDC__
- double rint(double x)
-#else
- double rint(x)
- double x;
-#endif
-{
- return (double) rintf((float) x);
-}
-
-#endif /* defined(_DOUBLE_IS_32BITS) */
+ * software is freely granted, provided that this notice
+static float
+ int32_t i0,j0,sx;
+ uint32_t i,i1;
+ if(j0<0) {
diff --git a/libjava/java/net/DatagramPacket.java b/libjava/java/net/DatagramPacket.java
new file mode 100644
index 00000000000..72b7bbdd4bb
--- /dev/null
+++ b/libjava/java/net/DatagramPacket.java
@@ -0,0 +1,175 @@
+// DatagramPacket.java - Represents packets in a connectionless protocol.
+
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+package java.net;
+
+/**
+ * @author Warren Levy <warrenl@cygnus.com>
+ * @date April 28, 1999.
+ */
+
+/**
+ * Written using on-line Java Platform 1.2 API Specification, as well
+ * as "The Java Class Libraries", 2nd edition (Addison-Wesley, 1998).
+ * Status: Believed complete and correct.
+ */
+
+public final class DatagramPacket
+{
+ private byte[] buffer;
+ private int offset;
+ private int length;
+ private InetAddress address;
+ private int port;
+
+ // JDK1.2
+ public DatagramPacket(byte[] buf, int offset, int length)
+ {
+ // FIXME: We can't currently rely on NullPointerException being
+ // thrown when we invoke a method on a null object.
+ if (buf == null)
+ throw new NullPointerException("Null buffer");
+ if (offset < 0)
+ throw new IllegalArgumentException("Invalid offset: " + offset);
+ if (length < 0)
+ throw new IllegalArgumentException("Invalid length: " + length);
+ if (offset + length > buf.length)
+ throw new IllegalArgumentException("Potential buffer overflow - offset: "
+ + offset + " length: " + length);
+
+ buffer = buf;
+ this.offset = offset;
+ this.length = length;
+ this.address = null;
+ this.port = -1;
+ }
+
+ public DatagramPacket(byte[] buf, int length)
+ {
+ this(buf, 0, length);
+ }
+
+ // JDK1.2
+ public DatagramPacket(byte[] buf, int offset, int length,
+ InetAddress address, int port)
+ {
+ // FIXME: We can't currently rely on NullPointerException being
+ // thrown when we invoke a method on a null object.
+ if (buf == null)
+ throw new NullPointerException("Null buffer");
+ if (offset < 0)
+ throw new IllegalArgumentException("Invalid offset: " + offset);
+ if (length < 0)
+ throw new IllegalArgumentException("Invalid length: " + length);
+ if (offset + length > buf.length)
+ throw new IllegalArgumentException("Potential buffer overflow - offset: "
+ + offset + " length: " + length);
+ if (port < 0 || port > 65535)
+ throw new IllegalArgumentException("Invalid port: " + port);
+ if (address == null)
+ throw new NullPointerException("Null address");
+
+ buffer = buf;
+ this.offset = offset;
+ this.length = length;
+ this.address = address;
+ this.port = port;
+ }
+
+ public DatagramPacket(byte[] buf, int length, InetAddress address, int port)
+ {
+ this(buf, 0, length, address, port);
+ }
+
+ public synchronized InetAddress getAddress()
+ {
+ return address;
+ }
+
+ public synchronized int getPort()
+ {
+ return port;
+ }
+
+ public synchronized byte[] getData()
+ {
+ return buffer;
+ }
+
+ // JDK1.2
+ public synchronized int getOffset()
+ {
+ return offset;
+ }
+
+ public synchronized int getLength()
+ {
+ return length;
+ }
+
+ public synchronized void setAddress(InetAddress iaddr)
+ {
+ if (iaddr == null)
+ throw new NullPointerException("Null address");
+
+ address = iaddr;
+ }
+
+ public synchronized void setPort(int iport)
+ {
+ if (iport < 0 || iport > 65535)
+ throw new IllegalArgumentException("Invalid port: " + iport);
+
+ port = iport;
+ }
+
+ public synchronized void setData(byte[] buf)
+ {
+ // This form of setData requires setLength to be called separately
+ // and subsequently.
+ if (buf == null)
+ throw new NullPointerException("Null buffer");
+
+ buffer = buf;
+ }
+
+ // JDK1.2
+ public synchronized void setData(byte[] buf, int offset, int length)
+ {
+ // This form of setData must be used if offset is to be changed.
+
+ // FIXME: We can't currently rely on NullPointerException being
+ // thrown when we invoke a method on a null object.
+ if (buf == null)
+ throw new NullPointerException("Null buffer");
+ if (offset < 0)
+ throw new IllegalArgumentException("Invalid offset: " + offset);
+ if (length < 0)
+ throw new IllegalArgumentException("Invalid length: " + length);
+ if (offset + length > buf.length)
+ throw new IllegalArgumentException("Potential buffer overflow - offset: "
+ + offset + " length: " + length);
+
+ buffer = buf;
+ this.offset = offset;
+ this.length = length;
+ }
+
+ public synchronized void setLength(int length)
+ {
+ if (length < 0)
+ throw new IllegalArgumentException("Invalid length: " + length);
+ if (offset + length > buffer.length)
+ throw new IllegalArgumentException("Potential buffer overflow - offset: "
+ + offset + " length: " + length);
+
+ this.length = length;
+ }
+}
diff --git a/libjava/java/net/DatagramSocket.java b/libjava/java/net/DatagramSocket.java
new file mode 100644
index 00000000000..96d9555590b
--- /dev/null
+++ b/libjava/java/net/DatagramSocket.java
@@ -0,0 +1,192 @@
+// DatagramSocket.java
+
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+package java.net;
+import java.io.IOException;
+
+/**
+ * @author Warren Levy <warrenl@cygnus.com>
+ * @date May 3, 1999.
+ */
+
+/**
+ * Written using on-line Java Platform 1.2 API Specification, as well
+ * as "The Java Class Libraries", 2nd edition (Addison-Wesley, 1998).
+ * Status: Believed complete and correct.
+ */
+
+public class DatagramSocket
+{
+ DatagramSocketImpl impl;
+
+ public DatagramSocket() throws SocketException
+ {
+ this(0, null);
+ }
+
+ public DatagramSocket(int port) throws SocketException
+ {
+ this(port, null);
+ }
+
+ public DatagramSocket(int port, InetAddress laddr) throws SocketException
+ {
+ if (port < 0 || port > 65535)
+ throw new IllegalArgumentException("Invalid port: " + port);
+
+ SecurityManager s = System.getSecurityManager();
+ if (s != null)
+ s.checkListen(port);
+
+ String propVal = System.getProperty("impl.prefix");
+ if (propVal == null || propVal.equals(""))
+ propVal = "Plain";
+ impl = (DatagramSocketImpl) Class.forName("java.net." + propVal +
+ "DatagramSocketImpl").newInstance();
+ impl.create();
+
+ // For multicasting, set the socket to be reused (Stevens pp. 195-6).
+ if (this instanceof MulticastSocket)
+ impl.setOption(SocketOptions.SO_REUSEADDR, new Boolean(true));
+
+ impl.bind(port, laddr);
+ }
+
+ public void close()
+ {
+ impl.close();
+ }
+
+ public InetAddress getLocalAddress()
+ {
+ SecurityManager s = System.getSecurityManager();
+ // FIXME: JCL p. 510 says this should call checkConnect. But what
+ // string should be used as the hostname? Maybe this is just a side
+ // effect of calling InetAddress.getLocalHost.
+ //
+ // And is getOption with SO_BINDADDR the right way to get the address?
+ // Doesn't seem to be since this method doesn't throw a SocketException
+ // and SO_BINADDR can throw one.
+ //
+ // Also see RETURNS section in JCL p. 510 about returning any local
+ // addr "if the current execution context is not allowed to connect to
+ // the network interface that is actually bound to this datagram socket."
+ // How is that done? via InetAddress.getLocalHost? But that throws
+ // an UnknownHostException and this method doesn't.
+ //
+ // if (s != null)
+ // s.checkConnect("localhost", -1);
+ try
+ {
+ return (InetAddress)impl.getOption(SocketOptions.SO_BINDADDR);
+ }
+ catch (SocketException ex)
+ {
+ }
+
+ try
+ {
+ return InetAddress.getLocalHost();
+ }
+ catch (UnknownHostException ex)
+ {
+ // FIXME: This should never happen, so how can we avoid this construct?
+ return null;
+ }
+ }
+
+ public int getLocalPort()
+ {
+ return impl.getLocalPort();
+ }
+
+ public synchronized int getSoTimeout() throws SocketException
+ {
+ Object timeout = impl.getOption(SocketOptions.SO_TIMEOUT);
+ if (timeout instanceof Integer)
+ return ((Integer)timeout).intValue();
+ else
+ return 0;
+ }
+
+ public synchronized void receive(DatagramPacket p) throws IOException
+ {
+ SecurityManager s = System.getSecurityManager();
+ if (s != null)
+ s.checkAccept(p.getAddress().getHostAddress(), p.getPort());
+
+ impl.receive(p);
+ }
+
+ public void send(DatagramPacket p) throws IOException
+ {
+ // JDK1.2: Don't do security checks if socket is connected; see jdk1.2 api.
+ SecurityManager s = System.getSecurityManager();
+ if (s != null)
+ {
+ InetAddress addr = p.getAddress();
+ if (addr.isMulticastAddress())
+ s.checkMulticast(addr);
+ else
+ s.checkConnect(addr.getHostAddress(), p.getPort());
+ }
+
+ // FIXME: if this is a subclass of MulticastSocket, use getTTL for TTL val.
+ impl.send(p);
+ }
+
+ public synchronized void setSoTimeout(int timeout) throws SocketException
+ {
+ if (timeout < 0)
+ throw new IllegalArgumentException("Invalid timeout: " + timeout);
+
+ impl.setOption(SocketOptions.SO_TIMEOUT, new Integer(timeout));
+ }
+
+ // JDK1.2
+ // public void connect(InetAddress address, int port)
+ // {
+ // }
+
+ // JDK1.2
+ // public void disconnect()
+ // {
+ // }
+
+ // JDK1.2
+ // public InetAddress getInetAddress()
+ // {
+ // }
+
+ // JDK1.2
+ // public int getPort()
+ // {
+ // }
+
+ // JDK1.2
+ // public int getReceiveBufferSize() throws SocketException
+ // {
+ // }
+
+ // JDK1.2
+ // public int getSendBufferSize() throws SocketException
+ // {
+ // }
+
+ // JDK1.2
+ // public void setReceiveBufferSize(int size) throws SocketException
+ // {
+ // }
+
+ // JDK1.2
+ // public void setSendBufferSize(int size) throws SocketException
+ // {
+ // }
+}
diff --git a/libjava/java/net/DatagramSocketImpl.java b/libjava/java/net/DatagramSocketImpl.java
new file mode 100644
index 00000000000..da4c2cef820
--- /dev/null
+++ b/libjava/java/net/DatagramSocketImpl.java
@@ -0,0 +1,62 @@
+// DatagramSocketImpl.java - Abstract datagram socket implementation.
+
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+package java.net;
+import java.io.IOException;
+import java.io.FileDescriptor;
+
+/**
+ * @author Warren Levy <warrenl@cygnus.com>
+ * @date May 3, 1999.
+ */
+
+/**
+ * Written using on-line Java Platform 1.2 API Specification, as well
+ * as "The Java Class Libraries", 2nd edition (Addison-Wesley, 1998).
+ * Status: Believed complete and correct.
+ */
+
+public abstract class DatagramSocketImpl implements SocketOptions
+{
+ protected int localPort;
+ protected FileDescriptor fd;
+
+ public DatagramSocketImpl()
+ {
+ }
+
+ protected abstract void bind(int lport, InetAddress laddr)
+ throws SocketException;
+ protected abstract void close();
+ protected abstract void create() throws SocketException;
+ protected abstract int peek(InetAddress i) throws IOException;
+ protected abstract void send(DatagramPacket p) throws IOException;
+ protected abstract void receive(DatagramPacket p) throws IOException;
+ protected abstract void setTTL(byte ttl) throws IOException;
+ protected abstract byte getTTL() throws IOException;
+ protected abstract void setTimeToLive(int ttl) throws IOException;
+ protected abstract int getTimeToLive() throws IOException;
+ protected abstract void join(InetAddress inetaddr) throws IOException;
+ protected abstract void leave(InetAddress inetaddr) throws IOException;
+
+ public abstract Object getOption(int optID) throws SocketException;
+ public abstract void setOption(int optID, Object value)
+ throws SocketException;
+
+ protected FileDescriptor getFileDescriptor()
+ {
+ return fd;
+ }
+
+ protected int getLocalPort()
+ {
+ return localPort;
+ }
+}
diff --git a/libjava/java/net/InetAddress.java b/libjava/java/net/InetAddress.java
index baf5153e933..6bd06993f76 100644
--- a/libjava/java/net/InetAddress.java
+++ b/libjava/java/net/InetAddress.java
@@ -177,7 +177,7 @@ public final class InetAddress
byte[] address = aton(host);
if (address != null)
return new InetAddress(address, null);
- InetAddress iaddr = new InetAddress(null, null);
+ InetAddress iaddr = new InetAddress(null, host);
lookup(host, iaddr, false);
return iaddr;
}
@@ -243,7 +243,8 @@ public final class InetAddress
{
try
{
- localhost = getByName(hostname);
+ localhost = new InetAddress(null, null);
+ lookup(hostname, localhost, false);
}
catch (Exception ex)
{
diff --git a/libjava/java/net/MulticastSocket.java b/libjava/java/net/MulticastSocket.java
new file mode 100644
index 00000000000..6759e3bc3ca
--- /dev/null
+++ b/libjava/java/net/MulticastSocket.java
@@ -0,0 +1,134 @@
+// MulticastSocket.java
+
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+package java.net;
+import java.io.IOException;
+
+/**
+ * @author Warren Levy <warrenl@cygnus.com>
+ * @date May 18, 1999.
+ */
+
+/**
+ * Written using on-line Java Platform 1.2 API Specification, as well
+ * as "The Java Class Libraries", 2nd edition (Addison-Wesley, 1998).
+ * Status: Believed complete and correct.
+ */
+
+public class MulticastSocket extends DatagramSocket
+{
+ // FIXME: the local addr bound to the multicast socket can be reused;
+ // unlike unicast sockets. It binds to any available network interface.
+ // See p.1159 JCL book.
+
+ public MulticastSocket() throws IOException
+ {
+ super(0, null);
+ }
+
+ public MulticastSocket(int port) throws IOException
+ {
+ super(port, null);
+ }
+
+ public InetAddress getInterface() throws SocketException
+ {
+ // FIXME: Is it possible that an InetAddress wasn't returned from getOption?
+ return (InetAddress) impl.getOption(SocketOptions.IP_MULTICAST_IF);
+ }
+
+ // Deprecated in JDK1.2
+ public byte getTTL() throws IOException
+ {
+ // Use getTTL here rather than getTimeToLive in case we're using an impl
+ // other than the default PlainDatagramSocketImpl and it doesn't have
+ // getTimeToLive yet.
+ return impl.getTTL();
+ }
+
+ // JDK1.2
+ public int getTimeToLive() throws IOException
+ {
+ return impl.getTimeToLive();
+ }
+
+ public void setInterface(InetAddress inf) throws SocketException
+ {
+ impl.setOption(SocketOptions.IP_MULTICAST_IF, inf);
+ }
+
+ // Deprecated in JDK1.2
+ public void setTTL(byte ttl) throws IOException
+ {
+ // Use setTTL here rather than setTimeToLive in case we're using an impl
+ // other than the default PlainDatagramSocketImpl and it doesn't have
+ // setTimeToLive yet.
+ impl.setTTL(ttl);
+ }
+
+ // JDK1.2
+ public void setTimeToLive(int ttl) throws IOException
+ {
+ if (ttl <= 0 || ttl > 255)
+ throw new IllegalArgumentException("Invalid ttl: " + ttl);
+
+ impl.setTimeToLive(ttl);
+ }
+
+ public void joinGroup(InetAddress mcastaddr) throws IOException
+ {
+ // FIXME: We can't currently rely on NullPointerException being
+ // thrown when we invoke a method on a null object.
+ if (mcastaddr == null)
+ throw new NullPointerException("Null address");
+ if (! mcastaddr.isMulticastAddress())
+ throw new IOException("Not a Multicast address");
+
+ SecurityManager s = System.getSecurityManager();
+ if (s != null)
+ s.checkMulticast(mcastaddr);
+
+ impl.join(mcastaddr);
+ }
+
+ public void leaveGroup(InetAddress mcastaddr) throws IOException
+ {
+ // FIXME: We can't currently rely on NullPointerException being
+ // thrown when we invoke a method on a null object.
+ if (mcastaddr == null)
+ throw new NullPointerException("Null address");
+ if (! mcastaddr.isMulticastAddress())
+ throw new IOException("Not a Multicast address");
+
+ SecurityManager s = System.getSecurityManager();
+ if (s != null)
+ s.checkMulticast(mcastaddr);
+
+ impl.leave(mcastaddr);
+ }
+
+ public synchronized void send(DatagramPacket p, byte ttl) throws IOException
+ {
+ SecurityManager s = System.getSecurityManager();
+ if (s != null)
+ {
+ InetAddress addr = p.getAddress();
+ if (addr.isMulticastAddress())
+ s.checkMulticast(addr, ttl);
+ else
+ s.checkConnect(addr.getHostAddress(), p.getPort());
+ }
+
+ int oldttl = impl.getTimeToLive();
+ impl.setTimeToLive(((int) ttl) & 0xFF);
+ impl.send(p);
+ impl.setTimeToLive(oldttl);
+ }
+}
diff --git a/libjava/java/net/PlainDatagramSocketImpl.java b/libjava/java/net/PlainDatagramSocketImpl.java
new file mode 100644
index 00000000000..541f00a10d8
--- /dev/null
+++ b/libjava/java/net/PlainDatagramSocketImpl.java
@@ -0,0 +1,99 @@
+// PlainDatagramSocketImpl.java - Implementation of DatagramSocketImpl.
+
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+package java.net;
+import java.io.IOException;
+
+/**
+ * @author Warren Levy <warrenl@cygnus.com>
+ * @date May 3, 1999.
+ */
+
+/**
+ * Written using on-line Java Platform 1.2 API Specification, as well
+ * as "The Java Class Libraries", 2nd edition (Addison-Wesley, 1998).
+ * Status: Believed complete and correct.
+ */
+
+class PlainDatagramSocketImpl extends DatagramSocketImpl
+{
+ // These fields are mirrored for use in native code to avoid cpp conflicts
+ // when the #defines in system header files are the same as the public fields.
+ static final int _Jv_TCP_NODELAY_ = SocketOptions.TCP_NODELAY,
+ _Jv_SO_BINDADDR_ = SocketOptions.SO_BINDADDR,
+ _Jv_SO_REUSEADDR_ = SocketOptions.SO_REUSEADDR,
+ _Jv_IP_MULTICAST_IF_ = SocketOptions.IP_MULTICAST_IF,
+ _Jv_SO_LINGER_ = SocketOptions.SO_LINGER,
+ _Jv_SO_TIMEOUT_ = SocketOptions.SO_TIMEOUT,
+ _Jv_SO_SNDBUF_ = SocketOptions.SO_SNDBUF,
+ _Jv_SO_RCVBUF_ = SocketOptions.SO_RCVBUF;
+
+ int fnum = -1;
+
+ // FIXME: Is this necessary? Could it help w/ DatagramSocket.getLocalAddress?
+ // InetAddress address;
+
+ // localAddress cache
+ InetAddress localAddress;
+
+ // These values are set/read by setOption/getOption.
+ int timeout = 0;
+ /* InetAddress iface = null; */
+ int ttl = -1;
+
+ // FIXME: Probably should have bind (and create?) calls from DatagramSocket
+ // constuctor. If so, then same change should be made to the corresponding
+ // Socket (non-datagram) classes. This allows the implementation more
+ // complete control over how the socket is set up and used (e.g. connect,
+ // setting options, etc.).
+ public PlainDatagramSocketImpl()
+ {
+ }
+
+ protected native void bind(int lport, InetAddress laddr)
+ throws SocketException;
+ protected native void create() throws SocketException;
+ protected native int peek(InetAddress i) throws IOException;
+ protected native void setTimeToLive(int ttl) throws IOException;
+ protected native int getTimeToLive() throws IOException;
+ protected native void send(DatagramPacket p) throws IOException;
+ protected native void receive(DatagramPacket p) throws IOException;
+ public native void setOption(int optID, Object value) throws SocketException;
+ public native Object getOption(int optID) throws SocketException;
+ private native void mcastGrp(InetAddress inetaddr, boolean join)
+ throws IOException;
+
+ protected void close() throws IOException
+ {
+ fd.close();
+ }
+
+ // Deprecated in JDK 1.2.
+ protected byte getTTL() throws IOException
+ {
+ return (byte) getTimeToLive();
+ }
+
+ // Deprecated in JDK 1.2.
+ protected void setTTL(byte ttl) throws IOException
+ {
+ setTimeToLive(((int) ttl) & 0xFF);
+ }
+
+ protected void join(InetAddress inetaddr) throws IOException
+ {
+ mcastGrp(inetaddr, true);
+ }
+
+ protected void leave(InetAddress inetaddr) throws IOException
+ {
+ mcastGrp(inetaddr, false);
+ }
+}
diff --git a/libjava/java/net/PlainSocketImpl.java b/libjava/java/net/PlainSocketImpl.java
index 5bc2caef042..5cff27bdca0 100644
--- a/libjava/java/net/PlainSocketImpl.java
+++ b/libjava/java/net/PlainSocketImpl.java
@@ -1,6 +1,6 @@
-// natClass.cc - Implementation of java.lang.Class native methods.
+// PlainSocketImpl.java - Implementation of SocketImpl.
-/* Copyright (C) 1998, 1999 Cygnus Solutions
+/* Copyright (C) 1999 Cygnus Solutions
This file is part of libgcj.
@@ -11,10 +11,42 @@ details. */
package java.net;
import java.io.*;
+/**
+ * @author Per Bothner <bothner@cygnus.com>
+ * @date February 22, 1999.
+ */
+
+/**
+ * Written using on-line Java Platform 1.2 API Specification, as well
+ * as "The Java Class Libraries", 2nd edition (Addison-Wesley, 1998).
+ * Status: Believed complete and correct.
+ */
+
class PlainSocketImpl extends SocketImpl
{
+ // These fields are mirrored for use in native code to avoid cpp conflicts
+ // when the #defines in system header files are the same as the public fields.
+ static final int _Jv_TCP_NODELAY_ = SocketOptions.TCP_NODELAY,
+ _Jv_SO_BINDADDR_ = SocketOptions.SO_BINDADDR,
+ _Jv_SO_REUSEADDR_ = SocketOptions.SO_REUSEADDR,
+ _Jv_IP_MULTICAST_IF_ = SocketOptions.IP_MULTICAST_IF,
+ _Jv_SO_LINGER_ = SocketOptions.SO_LINGER,
+ _Jv_SO_TIMEOUT_ = SocketOptions.SO_TIMEOUT,
+ _Jv_SO_SNDBUF_ = SocketOptions.SO_SNDBUF,
+ _Jv_SO_RCVBUF_ = SocketOptions.SO_RCVBUF;
+
int fnum = -1;
+ // This value is set/read by setOption/getOption.
+ int timeout = 0;
+
+ // localAddress cache
+ InetAddress localAddress;
+
+ public native void setOption(int optID, Object value) throws SocketException;
+
+ public native Object getOption(int optID) throws SocketException;
+
protected native void create (boolean stream) throws IOException;
protected void connect (String host, int port) throws IOException
@@ -40,6 +72,7 @@ class PlainSocketImpl extends SocketImpl
protected InputStream getInputStream() throws IOException
{
+ // FIXME: TODO - Implement class SocketInputStream timeouts in read();
if (in == null)
in = new FileInputStream (fd);
return in;
diff --git a/libjava/java/net/ServerSocket.java b/libjava/java/net/ServerSocket.java
index e4b50693e75..0d40bcc9bd6 100644
--- a/libjava/java/net/ServerSocket.java
+++ b/libjava/java/net/ServerSocket.java
@@ -1,4 +1,4 @@
-// Socket.java
+// ServerSocket.java
/* Copyright (C) 1999 Cygnus Solutions
@@ -14,8 +14,7 @@ details. */
*/
/** Written using on-line Java Platform 1.2 API Specification.
- * Status: I believe all methods are implemented, but many
- * of them just throw an exception.
+ * Status: I believe all methods are implemented.
*/
package java.net;
@@ -29,13 +28,13 @@ public class ServerSocket
public ServerSocket (int port)
throws java.io.IOException
{
- this(port, 5);
+ this(port, 50);
}
public ServerSocket (int port, int backlog)
throws java.io.IOException
{
- this(port, backlog, InetAddress.getLocalHost());
+ this(port, backlog, null);
}
public ServerSocket (int port, int backlog, InetAddress bindAddr)
@@ -81,25 +80,31 @@ public class ServerSocket
impl.close();
}
- public void setSoTimeout (int timeout) throws SocketException
+ public synchronized void setSoTimeout (int timeout) throws SocketException
{
- throw new InternalError("ServerSocket.setSoTimeout not implemented");
+ if (timeout < 0)
+ throw new IllegalArgumentException("Invalid timeout: " + timeout);
+
+ impl.setOption(SocketOptions.SO_TIMEOUT, new Integer(timeout));
}
- public int getSoTimeout () throws SocketException
+ public synchronized int getSoTimeout () throws SocketException
{
- throw new InternalError("ServerSocket.getSoTimeout not implemented");
+ Object timeout = impl.getOption(SocketOptions.SO_TIMEOUT);
+ if (timeout instanceof Integer)
+ return ((Integer)timeout).intValue();
+ else
+ return 0;
}
public String toString ()
{
- return impl.toString();
+ return "ServerSocket" + impl.toString();
}
- public static void setSocketImplFactory (SocketImplFactory fac)
+ public static synchronized void setSocketFactory (SocketImplFactory fac)
throws IOException
{
factory = fac;
}
-
}
diff --git a/libjava/java/net/Socket.java b/libjava/java/net/Socket.java
index 8c027d9f88f..7dded58937b 100644
--- a/libjava/java/net/Socket.java
+++ b/libjava/java/net/Socket.java
@@ -14,8 +14,7 @@ details. */
*/
/** Written using on-line Java Platform 1.2 API Specification.
- * Status: I believe all methods are implemented, but many
- * of them just throw an exception.
+ * Status: I believe all methods are implemented.
*/
package java.net;
@@ -43,6 +42,9 @@ public class Socket
if (s != null)
s.checkConnect(host, port);
impl.create(true);
+ // FIXME: JCL p. 1586 says if localPort is unspecified, bind to any port,
+ // i.e. '0' and if localAddr is unspecified, use getLocalAddress() as
+ // that default. JDK 1.2 doc infers not to do a bind.
impl.connect(host, port);
}
@@ -54,6 +56,9 @@ public class Socket
if (s != null)
s.checkConnect(address.getHostName(), port);
impl.create(true);
+ // FIXME: JCL p. 1586 says if localPort is unspecified, bind to any port,
+ // i.e. '0' and if localAddr is unspecified, use getLocalAddress() as
+ // that default. JDK 1.2 doc infers not to do a bind.
impl.connect(address, port);
}
@@ -65,6 +70,7 @@ public class Socket
if (s != null)
s.checkConnect(host, port);
impl.create(true);
+ // FIXME: JCL p. 1587 says if localAddr is null, use getLocalAddress().
impl.bind(localAddr, localPort);
impl.connect(host, port);
}
@@ -77,6 +83,7 @@ public class Socket
if (s != null)
s.checkConnect(address.getHostName(), port);
impl.create(true);
+ // FIXME: JCL p. 1587 says if localAddr is null, use getLocalAddress().
impl.bind(localAddr, localPort);
impl.connect(address, port);
}
@@ -92,6 +99,9 @@ public class Socket
SecurityManager s = System.getSecurityManager();
if (s != null)
s.checkConnect(host, port);
+ // FIXME: JCL p. 1586 says if localPort is unspecified, bind to any port,
+ // i.e. '0' and if localAddr is unspecified, use getLocalAddress() as
+ // that default. JDK 1.2 doc infers not to do a bind.
impl.connect(host, port);
}
@@ -106,6 +116,9 @@ public class Socket
SecurityManager s = System.getSecurityManager();
if (s != null)
s.checkConnect(host.getHostName(), port);
+ // FIXME: JCL p. 1586 says if localPort is unspecified, bind to any port,
+ // i.e. '0' and if localAddr is unspecified, use getLocalAddress() as
+ // that default. JDK 1.2 doc infers not to do a bind.
impl.connect(host, port);
}
@@ -116,9 +129,17 @@ public class Socket
public InetAddress getLocalAddress ()
{
- // There doesn't seem to be any way to implement this
- // using a (generic) SocketImpl ... What am I missing?
- throw new InternalError("Socket.getLocalAddres not implemented");
+ // FIXME: see note in DatagramSocket.java about checkConnect() and security
+ try
+ {
+ return (InetAddress)impl.getOption(SocketOptions.SO_BINDADDR);
+ }
+ catch (SocketException x)
+ {
+ // (hopefully) shouldn't happen
+ System.err.println(x);
+ throw new java.lang.InternalError("Error in PlainSocketImpl.getOption");
+ }
}
public int getPort ()
@@ -143,65 +164,98 @@ public class Socket
public void setTcpNoDelay (boolean on) throws SocketException
{
- throw new InternalError("Socket.setTcpNoDelay not implemented");
+ impl.setOption( SocketOptions.TCP_NODELAY, new Boolean(on) );
}
public boolean getTcpNoDelay() throws SocketException
{
- throw new InternalError("Socket.getTcpNoDelay not implemented");
+ Boolean bool = (Boolean)impl.getOption( SocketOptions.TCP_NODELAY );
+ return bool.booleanValue();
}
public void setSoLinger(boolean on, int linger) throws SocketException
{
- throw new InternalError("Socket.setSoLinger not implemented");
+ if ( on && (linger >= 0) )
+ {
+ if (linger > 65535)
+ linger = 65535;
+ impl.setOption( SocketOptions.SO_LINGER, new Integer(linger) );
+ }
+ else if ( on && (linger < 0) )
+ throw new IllegalArgumentException("SO_LINGER must be >= 0");
+ else
+ impl.setOption( SocketOptions.SO_LINGER, new Boolean(false) );
}
- public boolean getSoLinger() throws SocketException
+ public int getSoLinger() throws SocketException
{
- throw new InternalError("Socket.getSoLinger not implemented");
+ Object linger = impl.getOption(SocketOptions.SO_LINGER);
+ if (linger instanceof Integer)
+ return ((Integer)linger).intValue();
+ else
+ return -1;
}
- public void setSoTimeout (int timeout) throws SocketException
+ public synchronized void setSoTimeout (int timeout) throws SocketException
{
- throw new InternalError("Socket.setSoTimeout not implemented");
+ if (timeout < 0)
+ throw new IllegalArgumentException("Invalid timeout: " + timeout);
+
+ impl.setOption(SocketOptions.SO_TIMEOUT, new Integer(timeout));
}
- public int getSoTimeout () throws SocketException
+ public synchronized int getSoTimeout () throws SocketException
{
- throw new InternalError("Socket.getSoTimeout not implemented");
+ Object timeout = impl.getOption(SocketOptions.SO_TIMEOUT);
+ if (timeout instanceof Integer)
+ return ((Integer)timeout).intValue();
+ else
+ return 0;
}
+ // JDK1.2
public void setSendBufferSize (int size) throws SocketException
{
- throw new InternalError("Socket.setSendBufferSize not implemented");
+ if (size <= 0)
+ throw new IllegalArgumentException("Invalid buffer size: " + size);
+
+ impl.setOption(SocketOptions.SO_SNDBUF, new Integer(size));
}
+ // JDK1.2
public int getSendBufferSize () throws SocketException
{
- throw new InternalError("Socket.getSendBufferSize not implemented");
+ Integer buf = (Integer)impl.getOption(SocketOptions.SO_SNDBUF);
+ return buf.intValue();
}
+ // JDK1.2
public void setReceiveBufferSize (int size) throws SocketException
{
- throw new InternalError("Socket.setReceiveBufferSize not implemented");
+ if (size <= 0)
+ throw new IllegalArgumentException("Invalid buffer size: " + size);
+
+ impl.setOption(SocketOptions.SO_RCVBUF, new Integer(size));
}
+ // JDK1.2
public int getReceiveBufferSize () throws SocketException
{
- throw new InternalError("Socket.getReceiveBufferSize not implemented");
+ Integer buf = (Integer)impl.getOption(SocketOptions.SO_RCVBUF);
+ return buf.intValue();
}
- public void close () throws IOException
+ public synchronized void close () throws IOException
{
impl.close();
}
public String toString ()
{
- return impl.toString();
+ return "Socket" + impl.toString();
}
- public static void setSocketImplFactory (SocketImplFactory fac)
+ public static synchronized void setSocketImplFactory (SocketImplFactory fac)
throws IOException
{
factory = fac;
diff --git a/libjava/java/net/SocketImpl.java b/libjava/java/net/SocketImpl.java
index 5ad311811d8..b764e8e4cff 100644
--- a/libjava/java/net/SocketImpl.java
+++ b/libjava/java/net/SocketImpl.java
@@ -17,10 +17,10 @@ import java.io.*;
*/
/** Written using on-line Java Platform 1.2 API Specification.
- * Believed complete and correct, except for implementation of toString.
+ * Believed complete and correct.
*/
-public abstract class SocketImpl
+public abstract class SocketImpl implements SocketOptions
{
protected InetAddress address;
@@ -63,8 +63,14 @@ public abstract class SocketImpl
protected int getLocalPort () { return localport; }
+ public abstract Object getOption(int optID) throws SocketException;
+
+ public abstract void setOption(int optID, Object value)
+ throws SocketException;
+
public String toString ()
{
- return super.toString(); // FIXME
+ return "[addr=" + address.toString() + ",port=" + Integer.toString(port) +
+ ",localport=" + Integer.toString(localport) + "]";
}
}
diff --git a/libjava/java/net/SocketOptions.java b/libjava/java/net/SocketOptions.java
new file mode 100644
index 00000000000..397db64e168
--- /dev/null
+++ b/libjava/java/net/SocketOptions.java
@@ -0,0 +1,40 @@
+// SocketOptions.java - Interface for get/set socket options.
+
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+package java.net;
+
+/**
+ * @author Warren Levy <warrenl@cygnus.com>
+ * @date May 3, 1999.
+ */
+
+/**
+ * Written using on-line Java Platform 1.2 API Specification.
+ * Status: Believed complete and correct.
+ */
+
+public abstract interface SocketOptions
+{
+ public static final int TCP_NODELAY = 0x1;
+ public static final int SO_BINDADDR = 0xF;
+ public static final int SO_REUSEADDR = 0x4;
+ public static final int IP_MULTICAST_IF = 0x10;
+ public static final int SO_LINGER = 0x80;
+ public static final int SO_TIMEOUT = 0x1006;
+
+ // JDK1.2
+ public static final int SO_SNDBUF = 0x1001;
+
+ // JDK1.2
+ public static final int SO_RCVBUF = 0x1002;
+
+ public void setOption(int optID, Object value) throws SocketException;
+ public Object getOption(int optID) throws SocketException;
+}
diff --git a/libjava/java/net/URL.java b/libjava/java/net/URL.java
index da56f49dc2d..b6dc13d8db4 100644
--- a/libjava/java/net/URL.java
+++ b/libjava/java/net/URL.java
@@ -29,7 +29,7 @@ public final class URL implements Serializable
{
private String protocol;
private String host;
- private int port;
+ private int port = -1; // Initialize for constructor using context.
private String file;
private String ref;
private URLStreamHandler handler;
@@ -117,14 +117,22 @@ public final class URL implements Serializable
* to the context's file. The optional anchor is not inherited.
*/
+ // If this is an absolute URL, then ignore context completely.
+ // An absolute URL must have chars prior to "://" but cannot have a colon
+ // right after the "://". The second colon is for an optional port value
+ // and implies that the host from the context is used if available.
int colon;
+ if ((colon = spec.indexOf("://", 1)) > 0 &&
+ ! spec.regionMatches(colon, "://:", 0, 4))
+ context = null;
+
int slash;
if ((colon = spec.indexOf(':')) > 0 &&
(colon < (slash = spec.indexOf('/')) || slash < 0))
{
// Protocol specified in spec string.
protocol = spec.substring(0, colon);
- if (context != null && context.protocol == protocol)
+ if (context != null && context.protocol.equals(protocol))
{
// The 1.2 doc specifically says these are copied to the new URL.
host = context.host;
@@ -222,8 +230,20 @@ public final class URL implements Serializable
{
// JCL book says this is computed using (only) the hashcodes of the
// protocol, host and file fields. Empirical evidence indicates this
- // is probably XOR.
- return (protocol.hashCode() ^ host.hashCode() ^ file.hashCode());
+ // is probably XOR in JDK 1.1. In JDK 1.2 it seems to be a sum including
+ // the port.
+ //
+ // JDK 1.2 online doc infers that host could be null because it
+ // explicitly states that file cannot be null but is silent on host.
+ // A simple example with protocol "http" (hashcode 3213448), host null,
+ // file "/" (hashcode 47) produced a hashcode (3213494) which appeared
+ // to be the sum of the two hashcodes plus the port. Another example
+ // using "/index.html" for file bore this out; as well as "#" for file
+ // (which was reduced to "" with a hashcode of zero). A "" host also
+ // causes the port number and the two hashcodes to be summed.
+
+ return (protocol.hashCode() + ((host == null) ? 0 : host.hashCode()) +
+ port + file.hashCode());
}
public URLConnection openConnection() throws IOException
diff --git a/libjava/java/net/URLDecoder.java b/libjava/java/net/URLDecoder.java
new file mode 100644
index 00000000000..40d47b7f131
--- /dev/null
+++ b/libjava/java/net/URLDecoder.java
@@ -0,0 +1,48 @@
+// URLDecoder.java - Provides a method for decoding strings according to
+// application/x-www-form-urlencoded MIME type.
+
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+package java.net;
+import java.io.UnsupportedEncodingException;
+
+/**
+ * @author Warren Levy <warrenl@cygnus.com>
+ * @date April 22, 1999.
+ */
+
+/**
+ * Written using on-line Java Platform 1.2 API Specification.
+ * Status: Believed complete and correct.
+ */
+
+// JDK1.2
+public class URLDecoder
+{
+ // This method, per the JCL, is conservative in that it encodes
+ // some "allowable" characters as % triplets.
+ public static String decode(String s) throws Exception
+ {
+ String str = s.replace('+', ' ');
+ String result = "";
+ int i;
+ int start = 0;
+ while ((i = str.indexOf('%', start)) >= 0)
+ {
+ result = result + str.substring(start, i) +
+ (char) Integer.parseInt(str.substring(i + 1, i + 3), 16);
+ start = i + 3;
+ }
+
+ if (start < str.length())
+ result = result + str.substring(start);
+
+ return result;
+ }
+}
diff --git a/libjava/java/net/URLEncoder.java b/libjava/java/net/URLEncoder.java
new file mode 100644
index 00000000000..83295ea57de
--- /dev/null
+++ b/libjava/java/net/URLEncoder.java
@@ -0,0 +1,71 @@
+// URLEncoder.java - Provides a method for encoding strings according to
+// application/x-www-form-urlencoded MIME type.
+
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+package java.net;
+import java.io.UnsupportedEncodingException;
+
+/**
+ * @author Warren Levy <warrenl@cygnus.com>
+ * @date April 22, 1999.
+ */
+
+/**
+ * Written using on-line Java Platform 1.2 API Specification, as well
+ * as "The Java Class Libraries", 2nd edition (Addison-Wesley, 1998).
+ * Status: Believed complete and correct.
+ */
+
+public class URLEncoder
+{
+ // This method, per the JCL, is conservative in that it encodes
+ // some "allowable" characters as % triplets.
+ public static String encode(String s)
+ {
+ // Get the bytes in ISO-Latin-1 (i.e. 8859_1) per the JCL.
+ // Even though it is the default in most cases, it's specified here
+ // just in case System.getProperty("file.encoding") is not "8859_1".
+ String result = "";
+ try
+ {
+ byte[] buf = s.getBytes("8859_1");
+ int start = 0;
+ for (int i = 0; i < buf.length; i++)
+ // For efficiency, check the byte in order of most likely
+ // possibility so as to minimize the number of comparisons.
+ // Hence, exclude all the alphanumeric & allowed special chars first.
+ if ((buf[i] >= 'a' && buf[i] <= 'z') ||
+ (buf[i] >= 'A' && buf[i] <= 'Z') ||
+ (buf[i] >= '0' && buf[i] <= '9') ||
+ buf[i] == '-' || buf[i] == '_' || buf[i] == '.' || buf[i] == '*')
+ ; // This is the most likely case so exclude first for efficiency.
+ else if (buf[i] == ' ')
+ buf[i] = (byte) '+'; // Replace space char with plus symbol.
+ else
+ {
+ result = result + new String(buf, start, i - start, "8859_1") +
+ "%" + Integer.toHexString(((int) buf[i]) & 0xFF);
+ start = i + 1;
+ }
+
+ // Append remainder of allowable chars from the string, if any.
+ if (start < buf.length)
+ result = result +
+ new String(buf, start, buf.length - start, "8859_1");
+ }
+ catch (UnsupportedEncodingException ex)
+ {
+ // This should never happen as "8859_1" is the default encoding.
+ return s;
+ }
+
+ return result;
+ }
+}
diff --git a/libjava/java/net/URLStreamHandler.java b/libjava/java/net/URLStreamHandler.java
index 29e0e6d4137..ba2114c8068 100644
--- a/libjava/java/net/URLStreamHandler.java
+++ b/libjava/java/net/URLStreamHandler.java
@@ -26,31 +26,37 @@ public abstract class URLStreamHandler
protected abstract URLConnection openConnection(URL u)
throws java.io.IOException;
-protected void parseURL(URL u, String spec, int start, int limit)
+ protected void parseURL(URL u, String spec, int start, int limit)
{
- String tmpStr;
- String host = ""; // Initialize to null string.
- String file;
- int port = -1;
- int colon;
-
+ String host = u.getHost();
+ int port = u.getPort();
+ String file = u.getFile();
+
/* TBD: The JDK 1.2 doc specifically says that limit is the position
* to stop parsing at and that it will be either the end of the string
* or the position of '#'; thus the doc infers that this method does
* not set the ref.
*/
- tmpStr = spec.substring(start, limit);
- int hostEnd = 0;
- if (tmpStr.startsWith("//"))
+ if (spec.regionMatches (start, "//", 0, 2))
{
- int slash = tmpStr.indexOf('/', 2);
- hostEnd = tmpStr.length();
- if (slash >= 0)
- hostEnd = slash;
+ int hostEnd;
+ int colon;
- host = tmpStr.substring(2, hostEnd);
-
- // Look for optional port number.
+ start += 2;
+ int slash = spec.indexOf('/', start);
+ if (slash >= 0)
+ hostEnd = slash;
+ else
+ hostEnd = limit;
+
+ host = spec.substring (start, hostEnd);
+
+ // Look for optional port number. It is valid for the non-port
+ // part of the host name to be null (e.g. a URL "http://:80").
+ // TBD: JDK 1.2 in this case sets host to null rather than "";
+ // this is undocumented and likely an unintended side effect in 1.2
+ // so we'll be simple here and stick with "". Note that
+ // "http://" or "http:///" produce a "" host in JDK 1.2.
if ((colon = host.indexOf(':')) >= 0)
{
try
@@ -59,17 +65,55 @@ protected void parseURL(URL u, String spec, int start, int limit)
}
catch (NumberFormatException e)
{
- ; // Ignore invalid port values; port is already set to -1.
+ ; // Ignore invalid port values; port is already set to u's
+ // port.
}
host = host.substring(0, colon);
}
+ file = null;
+ start = hostEnd;
+ }
+ else if (host == null)
+ host = "";
+
+ if (start < limit && spec.charAt(start) == '/')
+ {
+ // This is an absolute path name; ignore any file context.
+ file = spec.substring(start, limit);
+ }
+ else if (file == null || file.length() <= 0)
+ {
+ // No file context available; just spec for file.
+ file = "/" + spec.substring(start, limit);
+ }
+ else if (start < limit)
+ {
+ // Context is available, but only override it if there is a new file.
+ // FIXME: unsure to what extent `/` and File.separatorChar
+ // can mix in URLs. Ignore File.separatorChar for now.
+ file = file.substring(0, file.lastIndexOf('/'))
+ + "/" + spec.substring(start, limit);
}
- if (hostEnd < tmpStr.length())
- file = ((tmpStr.startsWith("/")) ? "" : "/") + tmpStr.substring(hostEnd);
- else
- file = "/";
+ int index;
+ // Replace "/./" with "/". This probably isn't very efficient in
+ // the general case, but it's probably not bad most of the time.
+ while ((index = file.indexOf("/./")) >= 0)
+ file = file.substring(0, index) + file.substring(index + 2);
+
+ // Process "/../" correctly. This probably isn't very efficient in
+ // the general case, but it's probably not bad most of the time.
+ while ((index = file.indexOf("/../")) >= 0)
+ {
+ // Strip of the previous directory - if it exists.
+ int previous = file.lastIndexOf('/', index - 1);
+ if (previous >= 0)
+ file = file.substring(0, previous) + file.substring(index + 3);
+ else
+ file = file.substring(index + 3);
+ }
+
u.set(u.getProtocol(), host, port, file, u.getRef());
}
@@ -90,12 +134,17 @@ protected void parseURL(URL u, String spec, int start, int limit)
file = u.getFile();
ref = u.getRef();
- if (! host.equals(""))
- {
- resStr = resStr + "//" + host;
- if (port >= 0)
- resStr = resStr + ":" + port;
- }
+ // JDK 1.2 online doc infers that host could be null because it
+ // explicitly states that file cannot be null, but is silent on host.
+ //
+ // Note that this produces different results from JDK 1.2 as JDK 1.2
+ // ignores a non-default port if host is null or "". That is inconsistent
+ // with the spec since the result of this method is spec'ed so it can be
+ // used to construct a new URL that is equivalent to the original.
+ if (host == null)
+ host = "";
+ if (port >= 0 || ! (host.length() == 0))
+ resStr = resStr + "//" + host + (port < 0 ? "" : ":" + port);
resStr = resStr + file;
diff --git a/libjava/java/net/natInetAddress.cc b/libjava/java/net/natInetAddress.cc
index 7f7d953b9c1..b15590a0ebc 100644
--- a/libjava/java/net/natInetAddress.cc
+++ b/libjava/java/net/natInetAddress.cc
@@ -1,4 +1,4 @@
-// natClass.cc - Implementation of java.lang.Class native methods.
+// natInetAddress.cc
/* Copyright (C) 1998, 1999 Cygnus Solutions
@@ -10,6 +10,10 @@ details. */
#include <config.h>
+#if GETHOSTBYNAME_R_NEEDS_REENTRANT && !defined(_REENTRANT)
+# define _REENTRANT 1
+#endif
+
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
@@ -64,14 +68,14 @@ java::net::InetAddress::aton (jstring host)
if (inet_aton (hostname, &laddr))
{
bytes = (char*) &laddr;
- len = 4;
+ blen = 4;
}
#elif defined(HAVE_INET_ADDR)
in_addr_t laddr = inet_addr (hostname);
if (laddr != (in_addr_t)(-1))
{
bytes = (char*) &laddr;
- len = 4;
+ blen = 4;
}
#endif
#ifdef HAVE_INET_PTON
@@ -79,12 +83,12 @@ java::net::InetAddress::aton (jstring host)
if (len == 0 && inet_pton (AF_INET6, hostname, inet6_addr) > 0)
{
bytes = inet6_addr;
- len = 16;
+ blen = 16;
}
#endif
if (blen == 0)
return NULL;
- jbyteArray result = JvNewByteArray (len);
+ jbyteArray result = JvNewByteArray (blen);
memcpy (elements (result), bytes, blen);
return result;
}
@@ -97,10 +101,22 @@ java::net::InetAddress::lookup (jstring host, java::net::InetAddress* iaddr,
struct hostent *hptr = NULL;
#if defined (HAVE_GETHOSTBYNAME_R) || defined (HAVE_GETHOSTBYADDR_R)
struct hostent hent_r;
+#if HAVE_STRUCT_HOSTENT_DATA
+ struct hostent_data fixed_buffer, *buffer_r = &fixed_buffer;
+#else
+#if defined (__GLIBC__)
+ // FIXME: in glibc, gethostbyname_r returns NETDB_INTERNAL to herr and
+ // ERANGE to errno if the buffer size is too small, rather than what is
+ // expected here. We work around this by setting a bigger buffer size and
+ // hoping that it is big enough.
+ char fixed_buffer[1024];
+#else
char fixed_buffer[200];
+#endif
char *buffer_r = fixed_buffer;
int size_r = sizeof (fixed_buffer);
#endif
+#endif
if (host != NULL)
{
@@ -114,10 +130,13 @@ java::net::InetAddress::lookup (jstring host, java::net::InetAddress* iaddr,
JvGetStringUTFRegion (host, 0, host->length(), hostname);
buf[len] = '\0';
#ifdef HAVE_GETHOSTBYNAME_R
- int herr = ERANGE;
- while (hptr == NULL && herr == ERANGE)
+ while (true)
{
int ok;
+#if HAVE_STRUCT_HOSTENT_DATA
+ ok = ! gethostbyname_r (hostname, &hent_r, buffer_r);
+#else
+ int herr = 0;
#ifdef GETHOSTBYNAME_R_RETURNS_INT
ok = ! gethostbyname_r (hostname, &hent_r, buffer_r, size_r,
&hptr, &herr);
@@ -130,6 +149,9 @@ java::net::InetAddress::lookup (jstring host, java::net::InetAddress* iaddr,
size_r *= 2;
buffer_r = (char *) _Jv_AllocBytesChecked (size_r);
}
+ else
+#endif /* HAVE_STRUCT_HOSTENT_DATA */
+ break;
}
#else
// FIXME: this is insufficient if some other piece of code calls
@@ -154,17 +176,20 @@ java::net::InetAddress::lookup (jstring host, java::net::InetAddress* iaddr,
else if (len == 16)
{
val = (char *) &chars;
- type = AF_INET16;
+ type = AF_INET6;
}
#endif /* HAVE_INET6 */
else
JvFail ("unrecognized size");
#ifdef HAVE_GETHOSTBYADDR_R
- int herr = ERANGE;
- while (hptr == NULL && herr == ERANGE)
+ while (true)
{
int ok;
+#if HAVE_STRUCT_HOSTENT_DATA
+ ok = ! gethostbyaddr_r (val, len, type, &hent_r, buffer_r);
+#else
+ int herr = 0;
#ifdef GETHOSTBYADDR_R_RETURNS_INT
ok = ! gethostbyaddr_r (val, len, type, &hent_r,
buffer_r, size_r, &hptr, &herr);
@@ -178,6 +203,9 @@ java::net::InetAddress::lookup (jstring host, java::net::InetAddress* iaddr,
size_r *= 2;
buffer_r = (char *) _Jv_AllocBytesChecked (size_r);
}
+ else
+#endif /* HAVE_STRUCT_HOSTENT_DATA */
+ break;
}
#else /* HAVE_GETHOSTBYADDR_R */
// FIXME: this is insufficient if some other piece of code calls
@@ -188,7 +216,8 @@ java::net::InetAddress::lookup (jstring host, java::net::InetAddress* iaddr,
}
if (hptr != NULL)
{
- host = JvNewStringUTF (hptr->h_name);
+ if (!all)
+ host = JvNewStringUTF (hptr->h_name);
java::lang::SecurityException *ex = checkConnect (host);
if (ex != NULL)
{
@@ -233,13 +262,13 @@ java::net::InetAddress::lookup (jstring host, java::net::InetAddress* iaddr,
{
if (iaddrs[i] == NULL)
iaddrs[i] = new java::net::InetAddress (NULL, NULL);
- if (i == 0)
- iaddrs[0]->hostname = host;
+ if (iaddrs[i]->hostname == NULL)
+ iaddrs[i]->hostname = host;
if (iaddrs[i]->address == NULL)
{
char *bytes = hptr->h_addr_list[i];
- iaddr->address = JvNewByteArray (hptr->h_length);
- memcpy (elements (iaddr->address), bytes, hptr->h_length);
+ iaddrs[i]->address = JvNewByteArray (hptr->h_length);
+ memcpy (elements (iaddrs[i]->address), bytes, hptr->h_length);
}
}
return result;
@@ -257,7 +286,7 @@ java::net::InetAddress::getLocalHostname ()
#elif HAVE_UNAME
struct utsname stuff;
if (uname (&stuff) != 0)
- return NULL:
+ return NULL;
chars = stuff.nodename;
#else
return NULL;
diff --git a/libjava/java/net/natPlainDatagramSocketImpl.cc b/libjava/java/net/natPlainDatagramSocketImpl.cc
new file mode 100644
index 00000000000..18d4c4a335c
--- /dev/null
+++ b/libjava/java/net/natPlainDatagramSocketImpl.cc
@@ -0,0 +1,497 @@
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+#include <config.h>
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/time.h>
+#include <sys/select.h>
+#include <netinet/in.h>
+#include <errno.h>
+#include <stdio.h>
+#include <string.h>
+
+#if HAVE_BSTRING_H
+// Needed for bzero, implicitly used by FD_ZERO on IRIX 5.2
+#include <bstring.h>
+#endif
+
+#include <cni.h>
+#include <java/io/IOException.h>
+#include <java/io/FileDescriptor.h>
+#include <java/io/InterruptedIOException.h>
+#include <java/net/BindException.h>
+#include <java/net/SocketException.h>
+#include <java/net/PlainDatagramSocketImpl.h>
+#include <java/net/InetAddress.h>
+#include <java/net/DatagramPacket.h>
+#include <java/lang/InternalError.h>
+#include <java/lang/Object.h>
+#include <java/lang/Boolean.h>
+#include <java/lang/Integer.h>
+
+#ifndef HAVE_SOCKLEN_T
+typedef int socklen_t;
+#endif
+
+union SockAddr
+{
+ struct sockaddr_in address;
+#ifdef HAVE_INET6
+ struct sockaddr_in6 address6;
+#endif
+};
+
+union McastReq
+{
+ struct ip_mreq mreq;
+#ifdef HAVE_INET6
+ struct ipv6_mreq mreq6;
+#endif
+};
+
+
+// FIXME: routines here and/or in natPlainSocketImpl.cc could throw
+// NoRouteToHostException; also consider UnknownHostException, ConnectException.
+
+void
+java::net::PlainDatagramSocketImpl::create ()
+{
+ int sock = ::socket (AF_INET, SOCK_DGRAM, 0);
+ if (sock < 0)
+ {
+ char msg[100];
+ char* strerr = strerror (errno);
+ sprintf (msg, "DatagramSocketImpl.create: %.*s", 80, strerr);
+ JvThrow (new java::net::SocketException (JvNewStringUTF (msg)));
+ }
+ fnum = sock;
+ fd = new java::io::FileDescriptor (sock);
+}
+
+void
+java::net::PlainDatagramSocketImpl::bind (jint lport,
+ java::net::InetAddress *host)
+{
+ // FIXME: prob. need to do a setsockopt with SO_BROADCAST to allow multicast.
+ union SockAddr u;
+ struct sockaddr *ptr = (struct sockaddr *) &u.address;
+ jbyte *bytes = NULL;
+ // FIXME: Use getaddrinfo() to get actual protocol instead of assuming ipv4.
+ int len = 4; // Initialize for INADDR_ANY in case host is NULL.
+
+ if (host != NULL)
+ {
+ jbyteArray haddress = host->address;
+ bytes = elements (haddress);
+ len = haddress->length;
+ }
+
+ if (len == 4)
+ {
+ u.address.sin_family = AF_INET;
+ if (host != NULL)
+ memcpy (&u.address.sin_addr, bytes, len);
+ else
+ u.address.sin_addr.s_addr = htonl (INADDR_ANY);
+ len = sizeof (struct sockaddr_in);
+ u.address.sin_port = htons (lport);
+ }
+#ifdef HAVE_INET6
+ else if (len == 16)
+ {
+ u.address6.sin6_family = AF_INET6;
+ memcpy (&u.address6.sin6_addr, bytes, len);
+ len = sizeof (struct sockaddr_in6);
+ u.address6.sin6_port = htons (lport);
+ }
+#endif
+ else
+ goto error;
+ if (::bind (fnum, ptr, len) == 0)
+ {
+ socklen_t addrlen = sizeof(u);
+ if (lport != 0)
+ localPort = lport;
+ else if (::getsockname (fnum, (sockaddr*) &u, &addrlen) == 0)
+ localPort = ntohs (u.address.sin_port);
+ else
+ goto error;
+ return;
+ }
+ error:
+ char msg[100];
+ char* strerr = strerror (errno);
+ sprintf (msg, "DatagramSocketImpl.bind: %.*s", 80, strerr);
+ JvThrow (new java::net::BindException (JvNewStringUTF (msg)));
+}
+
+jint
+java::net::PlainDatagramSocketImpl::peek (java::net::InetAddress *i)
+{
+ // FIXME: Deal with Multicast and if the socket is connected.
+ union SockAddr u;
+ socklen_t addrlen = sizeof(u);
+ ssize_t retlen =
+ ::recvfrom (fnum, (char *) NULL, 0, MSG_PEEK, (sockaddr*) &u,
+ &addrlen);
+ if (retlen < 0)
+ goto error;
+ // FIXME: Deal with Multicast addressing and if the socket is connected.
+ jbyteArray raddr;
+ jint rport;
+ if (u.address.sin_family == AF_INET)
+ {
+ raddr = JvNewByteArray (4);
+ memcpy (elements (raddr), &u.address.sin_addr, 4);
+ rport = ntohs (u.address.sin_port);
+ }
+#ifdef HAVE_INET6
+ else if (u.address.sin_family == AF_INET6)
+ {
+ raddr = JvNewByteArray (16);
+ memcpy (elements (raddr), &u.address6.sin6_addr, 16);
+ rport = ntohs (u.address6.sin6_port);
+ }
+#endif
+ else
+ goto error;
+ // FIXME: Multicast: s->address = new InetAddress (raddr, NULL);
+ i->address = raddr;
+ return rport;
+ error:
+ char msg[100];
+ char* strerr = strerror (errno);
+ sprintf (msg, "DatagramSocketImpl.peek: %.*s", 80, strerr);
+ JvThrow (new java::io::IOException (JvNewStringUTF (msg)));
+}
+
+void
+java::net::PlainDatagramSocketImpl::send (java::net::DatagramPacket *p)
+{
+ // FIXME: Deal with Multicast and if the socket is connected.
+ jint rport = p->getPort();
+ union SockAddr u;
+ jbyteArray haddress = p->getAddress()->address;
+ jbyte *bytes = elements (haddress);
+ int len = haddress->length;
+ struct sockaddr *ptr = (struct sockaddr *) &u.address;
+ jbyte *dbytes = elements (p->getData());
+ if (len == 4)
+ {
+ u.address.sin_family = AF_INET;
+ memcpy (&u.address.sin_addr, bytes, len);
+ len = sizeof (struct sockaddr_in);
+ u.address.sin_port = htons (rport);
+ }
+#ifdef HAVE_INET6
+ else if (len == 16)
+ {
+ u.address6.sin6_family = AF_INET6;
+ memcpy (&u.address6.sin6_addr, bytes, len);
+ len = sizeof (struct sockaddr_in6);
+ u.address6.sin6_port = htons (rport);
+ }
+#endif
+ else
+ goto error;
+ if (::sendto (fnum, (char *) dbytes, p->getLength(), 0, ptr, len) >= 0)
+ return;
+ error:
+ char msg[100];
+ char* strerr = strerror (errno);
+ sprintf (msg, "DatagramSocketImpl.send: %.*s", 80, strerr);
+ JvThrow (new java::io::IOException (JvNewStringUTF (msg)));
+}
+
+void
+java::net::PlainDatagramSocketImpl::receive (java::net::DatagramPacket *p)
+{
+ // FIXME: Deal with Multicast and if the socket is connected.
+ union SockAddr u;
+ socklen_t addrlen = sizeof(u);
+ jbyte *dbytes = elements (p->getData());
+ ssize_t retlen = 0;
+
+ // Do timeouts via select since SO_RCVTIMEO is not always available.
+ if (timeout > 0)
+ {
+ fd_set rset;
+ struct timeval tv;
+ FD_ZERO(&rset);
+ FD_SET(fnum, &rset);
+ tv.tv_sec = timeout / 1000;
+ tv.tv_usec = (timeout % 1000) * 1000;
+ int retval;
+ if ((retval = select (fnum + 1, &rset, NULL, NULL, &tv)) < 0)
+ goto error;
+ else if (retval == 0)
+ JvThrow (new java::io::InterruptedIOException ());
+ }
+
+ retlen =
+ ::recvfrom (fnum, (char *) dbytes, p->getLength(), 0, (sockaddr*) &u,
+ &addrlen);
+ if (retlen < 0)
+ goto error;
+ // FIXME: Deal with Multicast addressing and if the socket is connected.
+ jbyteArray raddr;
+ jint rport;
+ if (u.address.sin_family == AF_INET)
+ {
+ raddr = JvNewByteArray (4);
+ memcpy (elements (raddr), &u.address.sin_addr, 4);
+ rport = ntohs (u.address.sin_port);
+ }
+#ifdef HAVE_INET6
+ else if (u.address.sin_family == AF_INET6)
+ {
+ raddr = JvNewByteArray (16);
+ memcpy (elements (raddr), &u.address6.sin6_addr, 16);
+ rport = ntohs (u.address6.sin6_port);
+ }
+#endif
+ else
+ goto error;
+ // FIXME: Multicast: s->address = new InetAddress (raddr, NULL);
+ p->setPort (rport);
+ p->setLength ((jint) retlen);
+ return;
+ error:
+ char msg[100];
+ char* strerr = strerror (errno);
+ sprintf (msg, "DatagramSocketImpl.receive: %.*s", 80, strerr);
+ JvThrow (new java::io::IOException (JvNewStringUTF (msg)));
+}
+
+void
+java::net::PlainDatagramSocketImpl::setTimeToLive (jint ttl)
+{
+ this->ttl = ttl;
+ // throws IOException;
+ // FIXME: TODO - PlainDatagramSocketImpl::setTimeToLive
+}
+
+jint
+java::net::PlainDatagramSocketImpl::getTimeToLive ()
+{
+ // throws IOException;
+ // FIXME: TODO - PlainDatagramSocketImpl::getTimeToLive
+ return ttl;
+}
+
+void
+java::net::PlainDatagramSocketImpl::mcastGrp (java::net::InetAddress *inetaddr,
+ jboolean join)
+{
+ union McastReq u;
+ jbyteArray haddress = inetaddr->address;
+ jbyte *bytes = elements (haddress);
+ int len = haddress->length;
+ int level, opname;
+ const char *ptr;
+ if (len == 4)
+ {
+ level = IPPROTO_IP;
+ opname = join ? IP_ADD_MEMBERSHIP : IP_DROP_MEMBERSHIP;
+ memcpy (&u.mreq.imr_multiaddr, bytes, len);
+ // FIXME: If a non-default interface is set, use it; see Stevens p. 501.
+ u.mreq.imr_interface.s_addr = htonl (INADDR_ANY);
+ len = sizeof (struct ip_mreq);
+ ptr = (const char *) &u.mreq;
+ }
+#ifdef HAVE_INET6
+ else if (len == 16)
+ {
+ level = IPPROTO_IPV6;
+ opname = join ? IPV6_ADD_MEMBERSHIP : IPV6_DROP_MEMBERSHIP;
+ memcpy (&u.mreq6.ipv6mr_multiaddr, bytes, len);
+ // FIXME: If a non-default interface is set, use it; see Stevens p. 501.
+ u.mreq6.ipv6mr_interface = 0;
+ len = sizeof (struct ipv6_mreq);
+ ptr = (const char *) &u.mreq6;
+ }
+#endif
+ else
+ goto error;
+ if (::setsockopt (fnum, level, opname, ptr, len) == 0)
+ return;
+ error:
+ char msg[100];
+ char* strerr = strerror (errno);
+ sprintf (msg, "DatagramSocketImpl.%s: %.*s", join ? "join" : "leave", 80,
+ strerr);
+ JvThrow (new java::io::IOException (JvNewStringUTF (msg)));
+}
+
+void
+java::net::PlainDatagramSocketImpl::setOption (jint optID,
+ java::lang::Object *value)
+{
+ int val;
+ socklen_t val_len = sizeof (val);
+
+ if ( _Jv_IsInstanceOf(value,
+ java::lang::Class::forName(JvNewStringUTF("java.lang.Boolean"))))
+ {
+ java::lang::Boolean *boolobj =
+ static_cast<java::lang::Boolean *> (value);
+ val = boolobj->booleanValue() ? 1 : 0;
+ }
+ else if ( _Jv_IsInstanceOf(value,
+ java::lang::Class::forName(JvNewStringUTF("java.lang.Integer"))))
+ {
+ java::lang::Integer *intobj =
+ static_cast<java::lang::Integer *> (value);
+ val = (int) intobj->intValue();
+ }
+ // Else assume value to be an InetAddress for use with IP_MULTICAST_IF.
+
+ switch (optID)
+ {
+ case _Jv_TCP_NODELAY_ :
+ JvThrow (new java::net::SocketException (
+ JvNewStringUTF ("TCP_NODELAY not valid for UDP")));
+ return;
+ case _Jv_SO_LINGER_ :
+ JvThrow (new java::net::SocketException (
+ JvNewStringUTF ("SO_LINGER not valid for UDP")));
+ return;
+ case _Jv_SO_SNDBUF_ :
+ case _Jv_SO_RCVBUF_ :
+#if defined(SO_SNDBUF) && defined(SO_RCVBUF)
+ int opt;
+ optID == _Jv_SO_SNDBUF_ ? opt = SO_SNDBUF : opt = SO_RCVBUF;
+ if (::setsockopt (fnum, SOL_SOCKET, opt, (char *) &val, val_len) != 0)
+ goto error;
+#else
+ JvThrow (new java::lang::InternalError (
+ JvNewStringUTF ("SO_RCVBUF/SO_SNDBUF not supported")));
+#endif
+ return;
+ case _Jv_SO_REUSEADDR_ :
+#if defined(SO_REUSEADDR)
+ if (::setsockopt (fnum, SOL_SOCKET, SO_REUSEADDR, (char *) &val,
+ val_len) != 0)
+ goto error;
+#else
+ JvThrow (new java::lang::InternalError (
+ JvNewStringUTF ("SO_REUSEADDR not supported")));
+#endif
+ return;
+ case _Jv_SO_BINDADDR_ :
+ JvThrow (new java::net::SocketException (
+ JvNewStringUTF ("SO_BINDADDR: read only option")));
+ return;
+ case _Jv_IP_MULTICAST_IF_ :
+ // FIXME: TODO - Implement IP_MULTICAST_IF.
+ JvThrow (new java::lang::InternalError (
+ JvNewStringUTF ("IP_MULTICAST_IF: option not implemented")));
+ return;
+ case _Jv_SO_TIMEOUT_ :
+ timeout = val;
+ return;
+ default :
+ errno = ENOPROTOOPT;
+ }
+
+ error:
+ char msg[100];
+ char* strerr = strerror (errno);
+ sprintf (msg, "DatagramSocketImpl.setOption: %.*s", 80, strerr);
+ JvThrow (new java::net::SocketException (JvNewStringUTF (msg)));
+}
+
+java::lang::Object *
+java::net::PlainDatagramSocketImpl::getOption (jint optID)
+{
+ int val;
+ socklen_t val_len = sizeof(val);
+ union SockAddr u;
+ socklen_t addrlen = sizeof(u);
+
+ switch (optID)
+ {
+ case _Jv_TCP_NODELAY_ :
+ JvThrow (new java::net::SocketException (
+ JvNewStringUTF ("TCP_NODELAY not valid for UDP")));
+ break;
+
+ case _Jv_SO_LINGER_ :
+ JvThrow (new java::net::SocketException (
+ JvNewStringUTF ("SO_LINGER not valid for UDP")));
+ break;
+ case _Jv_SO_RCVBUF_ :
+ case _Jv_SO_SNDBUF_ :
+#if defined(SO_SNDBUF) && defined(SO_RCVBUF)
+ int opt;
+ optID == _Jv_SO_SNDBUF_ ? opt = SO_SNDBUF : opt = SO_RCVBUF;
+ if (::getsockopt (fnum, SOL_SOCKET, opt, (char *) &val, &val_len) != 0)
+ goto error;
+ else
+ return new java::lang::Integer (val);
+#else
+ JvThrow (new java::lang::InternalError (
+ JvNewStringUTF ("SO_RCVBUF/SO_SNDBUF not supported")));
+#endif
+ break;
+ case _Jv_SO_BINDADDR_:
+ // cache the local address
+ if (localAddress == NULL)
+ {
+ jbyteArray laddr;
+ if (::getsockname (fnum, (sockaddr*) &u, &addrlen) != 0)
+ goto error;
+ if (u.address.sin_family == AF_INET)
+ {
+ laddr = JvNewByteArray (4);
+ memcpy (elements (laddr), &u.address.sin_addr, 4);
+ }
+#ifdef HAVE_INET6
+ else if (u.address.sin_family == AF_INET6)
+ {
+ laddr = JvNewByteArray (16);
+ memcpy (elements (laddr), &u.address6.sin6_addr, 16);
+ }
+#endif
+ else
+ goto error;
+ localAddress = new java::net::InetAddress (laddr, NULL);
+ }
+ return localAddress;
+ break;
+ case _Jv_SO_REUSEADDR_ :
+#if defined(SO_REUSEADDR)
+ if (::getsockopt (fnum, SOL_SOCKET, SO_REUSEADDR, (char *) &val,
+ &val_len) != 0)
+ goto error;
+ return new java::lang::Boolean (val != 0);
+#else
+ JvThrow (new java::lang::InternalError (
+ JvNewStringUTF ("SO_REUSEADDR not supported")));
+#endif
+ break;
+ case _Jv_IP_MULTICAST_IF_ :
+ // FIXME: TODO - Implement IP_MULTICAST_IF.
+ JvThrow (new java::lang::InternalError (
+ JvNewStringUTF ("IP_MULTICAST_IF: option not implemented")));
+ break;
+ case _Jv_SO_TIMEOUT_ :
+ return new java::lang::Integer (timeout);
+ break;
+ default :
+ errno = ENOPROTOOPT;
+ }
+
+ error:
+ char msg[100];
+ char* strerr = strerror (errno);
+ sprintf (msg, "DatagramSocketImpl.getOption: %.*s", 80, strerr);
+ JvThrow (new java::net::SocketException (JvNewStringUTF (msg)));
+}
diff --git a/libjava/java/net/natPlainSocketImpl.cc b/libjava/java/net/natPlainSocketImpl.cc
index 076ee711948..2e7f9d5c558 100644
--- a/libjava/java/net/natPlainSocketImpl.cc
+++ b/libjava/java/net/natPlainSocketImpl.cc
@@ -10,16 +10,34 @@ details. */
#include <sys/types.h>
#include <sys/socket.h>
+#include <sys/time.h>
+#include <sys/select.h>
#include <netinet/in.h>
+#include <netinet/tcp.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
+#if HAVE_BSTRING_H
+// Needed for bzero, implicitly used by FD_ZERO on IRIX 5.2
+#include <bstring.h>
+#endif
+
#include <cni.h>
+#include <javaprims.h>
#include <java/io/IOException.h>
#include <java/io/FileDescriptor.h>
+#include <java/io/InterruptedIOException.h>
+#include <java/net/BindException.h>
+#include <java/net/ConnectException.h>
#include <java/net/PlainSocketImpl.h>
#include <java/net/InetAddress.h>
+#include <java/net/SocketException.h>
+#include <java/lang/InternalError.h>
+#include <java/lang/Object.h>
+#include <java/lang/Boolean.h>
+#include <java/lang/Class.h>
+#include <java/lang/Integer.h>
#ifndef HAVE_SOCKLEN_T
typedef int socklen_t;
@@ -52,14 +70,25 @@ void
java::net::PlainSocketImpl::bind (java::net::InetAddress *host, jint lport)
{
union SockAddr u;
- jbyteArray haddress = host->address;
- jbyte *bytes = elements (haddress);
- int len = haddress->length;
struct sockaddr *ptr = (struct sockaddr *) &u.address;
+ jbyte *bytes = NULL;
+ // FIXME: Use getaddrinfo() to get actual protocol instead of assuming ipv4.
+ int len = 4; // Initialize for INADDR_ANY in case host is NULL.
+
+ if (host != NULL)
+ {
+ jbyteArray haddress = host->address;
+ bytes = elements (haddress);
+ len = haddress->length;
+ }
+
if (len == 4)
{
u.address.sin_family = AF_INET;
- memcpy (&u.address.sin_addr, bytes, len);
+ if (host != NULL)
+ memcpy (&u.address.sin_addr, bytes, len);
+ else
+ u.address.sin_addr.s_addr = htonl (INADDR_ANY);
len = sizeof (struct sockaddr_in);
u.address.sin_port = htons (lport);
}
@@ -77,20 +106,27 @@ java::net::PlainSocketImpl::bind (java::net::InetAddress *host, jint lport)
if (::bind (fnum, ptr, len) == 0)
{
address = host;
- localport = lport;
+ socklen_t addrlen = sizeof(u);
+ if (lport != 0)
+ localport = lport;
+ else if (::getsockname (fnum, (sockaddr*) &u, &addrlen) == 0)
+ localport = ntohs (u.address.sin_port);
+ else
+ goto error;
return;
}
error:
char msg[100];
char* strerr = strerror (errno);
sprintf (msg, "SocketImpl.bind: %.*s", 80, strerr);
- JvThrow (new java::io::IOException (JvNewStringUTF (msg)));
+ JvThrow (new java::net::BindException (JvNewStringUTF (msg)));
}
void
java::net::PlainSocketImpl::connect (java::net::InetAddress *host, jint rport)
{
union SockAddr u;
+ socklen_t addrlen = sizeof(u);
jbyteArray haddress = host->address;
jbyte *bytes = elements (haddress);
int len = haddress->length;
@@ -113,17 +149,22 @@ java::net::PlainSocketImpl::connect (java::net::InetAddress *host, jint rport)
#endif
else
goto error;
- if (::connect (fnum, ptr, len) == 0)
- {
- address = host;
- port = rport;
- return;
- }
+ if (::connect (fnum, ptr, len) != 0)
+ goto error;
+ address = host;
+ port = rport;
+ // A bind may not have been done on this socket; if so, set localport now.
+ if (localport == 0)
+ if (::getsockname (fnum, (sockaddr*) &u, &addrlen) == 0)
+ localport = ntohs (u.address.sin_port);
+ else
+ goto error;
+ return;
error:
char msg[100];
char* strerr = strerror (errno);
sprintf (msg, "SocketImpl.connect: %.*s", 80, strerr);
- JvThrow (new java::io::IOException (JvNewStringUTF (msg)));
+ JvThrow (new java::net::ConnectException (JvNewStringUTF (msg)));
}
void
@@ -143,7 +184,26 @@ java::net::PlainSocketImpl::accept (java::net::PlainSocketImpl *s)
{
union SockAddr u;
socklen_t addrlen = sizeof(u);
- int new_socket = ::accept (fnum, (sockaddr*) &u, &addrlen);
+ int new_socket = 0;
+
+ // Do timeouts via select since SO_RCVTIMEO is not always available.
+ if (timeout > 0)
+ {
+ fd_set rset;
+ struct timeval tv;
+ FD_ZERO(&rset);
+ FD_SET(fnum, &rset);
+ tv.tv_sec = timeout / 1000;
+ tv.tv_usec = (timeout % 1000) * 1000;
+ int retval;
+ if ((retval = select (fnum + 1, &rset, NULL, NULL, &tv)) < 0)
+ goto error;
+ else if (retval == 0)
+ JvThrow (new java::io::InterruptedIOException (
+ JvNewStringUTF("Accept timed out")));
+ }
+
+ new_socket = ::accept (fnum, (sockaddr*) &u, &addrlen);
if (new_socket < 0)
goto error;
jbyteArray raddr;
@@ -155,6 +215,7 @@ java::net::PlainSocketImpl::accept (java::net::PlainSocketImpl *s)
rport = ntohs (u.address.sin_port);
}
#ifdef HAVE_INET6
+ else if (u.address.sin_family == AF_INET6)
{
raddr = JvNewByteArray (16);
memcpy (elements (raddr), &u.address6.sin6_addr, 16);
@@ -175,3 +236,194 @@ java::net::PlainSocketImpl::accept (java::net::PlainSocketImpl *s)
sprintf (msg, "SocketImpl.accept: %.*s", 80, strerr);
JvThrow (new java::io::IOException (JvNewStringUTF (msg)));
}
+
+void
+java::net::PlainSocketImpl::setOption (jint optID, java::lang::Object *value)
+{
+ int val;
+ socklen_t val_len = sizeof (val);
+
+ if ( _Jv_IsInstanceOf(value,
+ java::lang::Class::forName(JvNewStringUTF("java.lang.Boolean"))))
+ {
+ java::lang::Boolean *boolobj =
+ static_cast<java::lang::Boolean *> (value);
+ if (boolobj->booleanValue())
+ val = 1;
+ else
+ {
+ if (optID == _Jv_SO_LINGER_)
+ val = -1;
+ else
+ val = 0;
+ }
+ }
+ else // assume value is an Integer
+ {
+ java::lang::Integer *intobj =
+ static_cast<java::lang::Integer *> (value);
+ val = (int) intobj->intValue();
+ }
+
+ switch (optID)
+ {
+ case _Jv_TCP_NODELAY_ :
+#ifdef TCP_NODELAY
+ if (::setsockopt (fnum, IPPROTO_TCP, TCP_NODELAY, (char *) &val,
+ val_len) != 0)
+ goto error;
+#else
+ JvThrow (new java::lang::InternalError (
+ JvNewStringUTF ("TCP_NODELAY not supported")));
+#endif /* TCP_NODELAY */
+ return;
+ case _Jv_SO_LINGER_ :
+#ifdef SO_LINGER
+ struct linger l_val;
+ l_val.l_onoff = (val != -1);
+ l_val.l_linger = val;
+ if (::setsockopt (fnum, SOL_SOCKET, SO_LINGER, (char *) &l_val,
+ sizeof(l_val)) != 0)
+ goto error;
+#else
+ JvThrow (new java::lang::InternalError (
+ JvNewStringUTF ("SO_LINGER not supported")));
+#endif /* SO_LINGER */
+ return;
+ case _Jv_SO_SNDBUF_ :
+ case _Jv_SO_RCVBUF_ :
+#if defined(SO_SNDBUF) && defined(SO_RCVBUF)
+ int opt;
+ optID == _Jv_SO_SNDBUF_ ? opt = SO_SNDBUF : opt = SO_RCVBUF;
+ if (::setsockopt (fnum, SOL_SOCKET, opt, (char *) &val, val_len) != 0)
+ goto error;
+#else
+ JvThrow (new java::lang::InternalError (
+ JvNewStringUTF ("SO_RCVBUF/SO_SNDBUF not supported")));
+#endif
+ return;
+ case _Jv_SO_BINDADDR_ :
+ JvThrow (new java::net::SocketException (
+ JvNewStringUTF ("SO_BINDADDR: read only option")));
+ return;
+ case _Jv_IP_MULTICAST_IF_ :
+ JvThrow (new java::net::SocketException (
+ JvNewStringUTF ("IP_MULTICAST_IF: not valid for TCP")));
+ return;
+ case _Jv_SO_REUSEADDR_ :
+ JvThrow (new java::net::SocketException (
+ JvNewStringUTF ("SO_REUSEADDR: not valid for TCP")));
+ return;
+ case _Jv_SO_TIMEOUT_ :
+ timeout = val;
+ return;
+ default :
+ errno = ENOPROTOOPT;
+ }
+
+ error:
+ char msg[100];
+ char* strerr = strerror (errno);
+ sprintf (msg, "SocketImpl.setOption: %.*s", 80, strerr);
+ JvThrow (new java::net::SocketException (JvNewStringUTF (msg)));
+}
+
+java::lang::Object *
+java::net::PlainSocketImpl::getOption (jint optID)
+{
+ int val;
+ socklen_t val_len = sizeof(val);
+ union SockAddr u;
+ socklen_t addrlen = sizeof(u);
+ struct linger l_val;
+ socklen_t l_val_len = sizeof(l_val);
+
+ switch (optID)
+ {
+#ifdef TCP_NODELAY
+ case _Jv_TCP_NODELAY_ :
+ if (::getsockopt (fnum, IPPROTO_TCP, TCP_NODELAY, (char *) &val,
+ &val_len) != 0)
+ goto error;
+ else
+ return new java::lang::Boolean (val != 0);
+#else
+ JvThrow (new java::lang::InternalError (
+ JvNewStringUTF ("TCP_NODELAY not supported")));
+#endif
+ break;
+
+ case _Jv_SO_LINGER_ :
+#ifdef SO_LINGER
+ if (::getsockopt (fnum, SOL_SOCKET, SO_LINGER, (char *) &l_val,
+ &l_val_len) != 0)
+ goto error;
+ if (l_val.l_onoff)
+ return new java::lang::Integer (l_val.l_linger);
+ else
+ return new java::lang::Boolean (false);
+#else
+ JvThrow (new java::lang::InternalError (
+ JvNewStringUTF ("SO_LINGER not supported")));
+#endif
+ break;
+ case _Jv_SO_RCVBUF_ :
+ case _Jv_SO_SNDBUF_ :
+#if defined(SO_SNDBUF) && defined(SO_RCVBUF)
+ int opt;
+ optID == _Jv_SO_SNDBUF_ ? opt = SO_SNDBUF : opt = SO_RCVBUF;
+ if (::getsockopt (fnum, SOL_SOCKET, opt, (char *) &val, &val_len) != 0)
+ goto error;
+ else
+ return new java::lang::Integer (val);
+#else
+ JvThrow (new java::lang::InternalError (
+ JvNewStringUTF ("SO_RCVBUF/SO_SNDBUF not supported")));
+#endif
+ break;
+ case _Jv_SO_BINDADDR_:
+ // cache the local address
+ if (localAddress == NULL)
+ {
+ jbyteArray laddr;
+ if (::getsockname (fnum, (sockaddr*) &u, &addrlen) != 0)
+ goto error;
+ if (u.address.sin_family == AF_INET)
+ {
+ laddr = JvNewByteArray (4);
+ memcpy (elements (laddr), &u.address.sin_addr, 4);
+ }
+#ifdef HAVE_INET6
+ else if (u.address.sin_family == AF_INET6)
+ {
+ laddr = JvNewByteArray (16);
+ memcpy (elements (laddr), &u.address6.sin6_addr, 16);
+ }
+#endif
+ else
+ goto error;
+ localAddress = new java::net::InetAddress (laddr, NULL);
+ }
+ return localAddress;
+ break;
+ case _Jv_IP_MULTICAST_IF_ :
+ JvThrow (new java::net::SocketException (
+ JvNewStringUTF ("IP_MULTICAST_IF: not valid for TCP")));
+ break;
+ case _Jv_SO_REUSEADDR_ :
+ JvThrow (new java::net::SocketException (
+ JvNewStringUTF ("SO_REUSEADDR: not valid for TCP")));
+ break;
+ case _Jv_SO_TIMEOUT_ :
+ return new java::lang::Integer (timeout);
+ break;
+ default :
+ errno = ENOPROTOOPT;
+ }
+
+ error:
+ char msg[100];
+ char* strerr = strerror (errno);
+ sprintf (msg, "SocketImpl.getOption: %.*s", 80, strerr);
+ JvThrow (new java::net::SocketException (JvNewStringUTF (msg)));
+}
diff --git a/libjava/java/security/MessageDigest.java b/libjava/java/security/MessageDigest.java
new file mode 100644
index 00000000000..00e946a0047
--- /dev/null
+++ b/libjava/java/security/MessageDigest.java
@@ -0,0 +1,64 @@
+// MessageDigest.java
+
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+package java.security;
+
+// FIXME: This is just a stub for a proper implementation.
+public abstract class MessageDigest
+{
+ private static final byte[] dummy = { 0 };
+
+ public static MessageDigest getInstance(String algorithm)
+ throws NoSuchAlgorithmException
+ {
+ Object obj;
+
+ try {
+ obj = Class.forName(algorithm).newInstance();
+ } catch (Exception e) {
+ throw new NoSuchAlgorithmException("algorithm "
+ + algorithm
+ + " not available.");
+ }
+
+ return (MessageDigest) obj;
+ }
+
+ public void update(byte input)
+ {
+ // FIXME
+ }
+
+ public void update(byte[] input, int offset, int len)
+ {
+ // FIXME
+ }
+
+ public void update(byte[] input)
+ {
+ // FIXME
+ }
+
+ public byte[] digest()
+ {
+ return dummy;
+ }
+
+ public byte[] digest(byte[] input)
+ {
+ update(input);
+ return digest();
+ }
+
+ public void reset()
+ {
+ // FIXME
+ }
+}
diff --git a/libjava/java/security/NoSuchAlgorithmException.java b/libjava/java/security/NoSuchAlgorithmException.java
new file mode 100644
index 00000000000..5003a2eeb51
--- /dev/null
+++ b/libjava/java/security/NoSuchAlgorithmException.java
@@ -0,0 +1,22 @@
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+package java.security;
+
+public class NoSuchAlgorithmException extends Exception
+{
+ public NoSuchAlgorithmException()
+ {
+ super();
+ }
+
+ public NoSuchAlgorithmException(String msg)
+ {
+ super(msg);
+ }
+}
diff --git a/libjava/java/text/ChoiceFormat.java b/libjava/java/text/ChoiceFormat.java
index bed62a75e53..bd0ccabd657 100644
--- a/libjava/java/text/ChoiceFormat.java
+++ b/libjava/java/text/ChoiceFormat.java
@@ -182,7 +182,7 @@ public class ChoiceFormat extends NumberFormat
return nextDouble (d, true);
}
- public static final double nextDouble (double d, boolean next)
+ public static double nextDouble (double d, boolean next)
{
if (Double.isInfinite(d) || Double.isNaN(d))
return d;
diff --git a/libjava/java/text/CollationElementIterator.java b/libjava/java/text/CollationElementIterator.java
new file mode 100644
index 00000000000..15e60560189
--- /dev/null
+++ b/libjava/java/text/CollationElementIterator.java
@@ -0,0 +1,79 @@
+// CollationElementIterator.java - Iterate over decomposed characters.
+
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+package java.text;
+
+/**
+ * @author Tom Tromey <tromey@cygnus.com>
+ * @date March 25, 1999
+ */
+/* Written using "Java Class Libraries", 2nd edition, plus online
+ * API docs for JDK 1.2 from http://www.javasoft.com.
+ * Status: Believed complete and correct to JDK 1.1.
+ */
+
+public final class CollationElementIterator
+{
+ public static final int NULLORDER = 0xffffffff;
+
+ public int next ()
+ {
+ if (index == text.length())
+ return NULLORDER;
+ return collator.ceiNext(this);
+ }
+
+ // This one returns int while the others return short.
+ public static final int primaryOrder (int order)
+ {
+ // From the JDK 1.2 spec.
+ return order >>> 16;
+ }
+
+ public void reset ()
+ {
+ index = 0;
+ }
+
+ public static final short secondaryOrder (int order)
+ {
+ // From the JDK 1.2 spec.
+ return (order >>> 8) & 255;
+ }
+
+ public static final short tertiaryOrder (int order)
+ {
+ // From the JDK 1.2 spec.
+ return order & 255;
+ }
+
+ // Non-public constructor.
+ CollationElementIterator (String text, RuleBasedCollator collator)
+ {
+ this.text = text;
+ this.index = 0;
+ this.lookahead_set = false;
+ this.lookahead = 0;
+ this.collator = collator;
+ }
+
+ // Text over which we iterate.
+ String text;
+
+ // Index of next character to examine in TEXT.
+ int index;
+
+ // A piece of lookahead.
+ boolean lookahead_set;
+ int lookahead;
+
+ // The RuleBasedCollator which created this object.
+ RuleBasedCollator collator;
+}
diff --git a/libjava/java/text/CollationKey.java b/libjava/java/text/CollationKey.java
new file mode 100644
index 00000000000..05a9932206f
--- /dev/null
+++ b/libjava/java/text/CollationKey.java
@@ -0,0 +1,104 @@
+// CollationKey.java - Sort key for locale-sensitive String.
+
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+package java.text;
+
+/**
+ * @author Tom Tromey <tromey@cygnus.com>
+ * @date March 25, 1999
+ */
+/* Written using "Java Class Libraries", 2nd edition, plus online
+ * API docs for JDK 1.2 from http://www.javasoft.com.
+ * Status: Believed complete and correct.
+ */
+
+public final class CollationKey
+{
+ public int compareTo (CollationKey target)
+ {
+ int max = Math.min(key.length, target.key.length);
+
+ for (int i = 0; i < max; ++i)
+ {
+ if (key[i] != target.key[i])
+ return key[i] - target.key[i];
+ }
+
+ return key.length - target.key.length;
+ }
+
+ public boolean equals (Object obj)
+ {
+ if (! (obj instanceof CollationKey))
+ return false;
+
+ CollationKey ck = (CollationKey) obj;
+
+ if (key.length != ck.key.length)
+ return false;
+
+ for (int i = 0; i < key.length; ++i)
+ if (key[i] != ck.key[i])
+ return false;
+
+ return true;
+ }
+
+ public String getSourceString ()
+ {
+ return originalText;
+ }
+
+ public int hashCode ()
+ {
+ // We just follow BitSet instead of thinking up something new.
+ long h = originalText.hashCode();
+ for (int i = key.length - 1; i >= 0; --i)
+ h ^= key[i] * (i + 1);
+ return (int) ((h >> 32) ^ h);
+ }
+
+ public byte[] toByteArray ()
+ {
+ byte[] r = new byte[4 * key.length];
+ int off = 0;
+ for (int i = 0; i < key.length; ++i)
+ {
+ r[off++] = (byte) ((key[i] >>> 24) & 255);
+ r[off++] = (byte) ((key[i] >>> 16) & 255);
+ r[off++] = (byte) ((key[i] >>> 8) & 255);
+ r[off++] = (byte) ((key[i] ) & 255);
+ }
+ return r;
+ }
+
+ CollationKey (CollationElementIterator iter, String originalText,
+ int strength)
+ {
+ this.originalText = originalText;
+
+ // Compute size of required array.
+ int size = 0;
+ while (RuleBasedCollator.next(iter, strength)
+ != CollationElementIterator.NULLORDER)
+ ++size;
+
+ iter.reset();
+ key = new int[size];
+ for (int i = 0; i < size; i++)
+ key[i] = RuleBasedCollator.next(iter, strength);
+ }
+
+ // Original string.
+ private String originalText;
+
+ // Collation key.
+ private int[] key;
+}
diff --git a/libjava/java/text/Collator.java b/libjava/java/text/Collator.java
new file mode 100644
index 00000000000..c323fc79a64
--- /dev/null
+++ b/libjava/java/text/Collator.java
@@ -0,0 +1,130 @@
+// Collator.java - Locale-sensitive string comparison.
+
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+package java.text;
+
+import java.io.Serializable;
+import java.util.Locale;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+/**
+ * @author Tom Tromey <tromey@cygnus.com>
+ * @date March 18, 1999
+ */
+/* Written using "Java Class Libraries", 2nd edition, plus online
+ * API docs for JDK 1.2 from http://www.javasoft.com.
+ * Status: Mostly complete, but parts stubbed out. Look for FIXME.
+ */
+
+public abstract class Collator implements Cloneable, Serializable
+{
+ public static final int NO_DECOMPOSITION = 0;
+ public static final int CANONICAL_DECOMPOSITION = 1;
+ public static final int FULL_DECOMPOSITION = 2;
+
+ public static final int PRIMARY = 0;
+ public static final int SECONDARY = 1;
+ public static final int TERTIARY = 2;
+ public static final int IDENTICAL = 3;
+
+ protected Collator ()
+ {
+ strength = TERTIARY;
+ decmp = CANONICAL_DECOMPOSITION;
+ }
+
+ public abstract int compare (String source, String target);
+
+ public boolean equals (Object obj)
+ {
+ if (! (obj instanceof Collator))
+ return false;
+ Collator c = (Collator) obj;
+ return decmp == c.decmp && strength == c.strength;
+ }
+
+ public boolean equals (String source, String target)
+ {
+ return compare (source, target) == 0;
+ }
+
+ public static synchronized Locale[] getAvailableLocales ()
+ {
+ // FIXME.
+ return null;
+ }
+
+ public abstract CollationKey getCollationKey (String source);
+
+ public synchronized int getDecomposition ()
+ {
+ return decmp;
+ }
+
+ public static Collator getInstance ()
+ {
+ return getInstance (Locale.getDefault());
+ }
+
+ public static Collator getInstance (Locale loc)
+ {
+ ResourceBundle res;
+ String pattern;
+ try
+ {
+ res = ResourceBundle.getBundle("gnu.gcj.text.LocaleData", loc);
+ pattern = res.getString("collatorRule");
+ }
+ catch (MissingResourceException x)
+ {
+ return null;
+ }
+ try
+ {
+ return new RuleBasedCollator (pattern);
+ }
+ catch (ParseException x)
+ {
+ return null;
+ }
+ }
+
+ public synchronized int getStrength ()
+ {
+ return strength;
+ }
+
+ public abstract int hashCode ();
+
+ public synchronized void setDecomposition (int mode)
+ {
+ if (mode != NO_DECOMPOSITION
+ && mode != CANONICAL_DECOMPOSITION
+ && mode != FULL_DECOMPOSITION)
+ throw new IllegalArgumentException ();
+ decmp = mode;
+ }
+
+ public synchronized void setStrength (int strength)
+ {
+ if (strength != PRIMARY && strength != SECONDARY
+ && strength != TERTIARY && strength != IDENTICAL)
+ throw new IllegalArgumentException ();
+ this.strength = strength;
+ }
+
+ // Decompose a single character and append results to the buffer.
+ protected native final void decomposeCharacter (char c, StringBuffer buf);
+
+ // These names are fixed by the serialization spec.
+ protected int decmp;
+ protected int strength;
+}
diff --git a/libjava/java/text/DateFormat.java b/libjava/java/text/DateFormat.java
index bfd6b01a777..a84113368c3 100644
--- a/libjava/java/text/DateFormat.java
+++ b/libjava/java/text/DateFormat.java
@@ -94,6 +94,15 @@ public abstract class DateFormat extends Format implements Cloneable
boolean use_date,
boolean use_time)
{
+ return computeInstance (style, style, loc, use_date, use_time);
+ }
+
+ private static final DateFormat computeInstance (int dateStyle,
+ int timeStyle,
+ Locale loc,
+ boolean use_date,
+ boolean use_time)
+ {
ResourceBundle res;
try
{
@@ -108,7 +117,7 @@ public abstract class DateFormat extends Format implements Cloneable
if (use_date)
{
String name, def;
- switch (style)
+ switch (dateStyle)
{
case FULL:
name = "fullDateFormat";
@@ -147,7 +156,7 @@ public abstract class DateFormat extends Format implements Cloneable
pattern += " ";
String name, def;
- switch (style)
+ switch (timeStyle)
{
case FULL:
name = "fullTimeFormat";
@@ -201,23 +210,31 @@ public abstract class DateFormat extends Format implements Cloneable
public static final DateFormat getDateTimeInstance ()
{
- return getDateTimeInstance (DEFAULT, Locale.getDefault());
+ return getDateTimeInstance (DEFAULT, DEFAULT, Locale.getDefault());
}
public static final DateFormat getDateTimeInstance (int style)
{
- return getDateTimeInstance (style, Locale.getDefault());
+ return getDateTimeInstance (style, style, Locale.getDefault());
+ }
+
+ public static final DateFormat getDateTimeInstance (int dateStyle,
+ int timeStyle)
+ {
+ return getDateTimeInstance (dateStyle, timeStyle, Locale.getDefault());
}
- public static final DateFormat getDateTimeInstance (int style, Locale loc)
+ public static final DateFormat getDateTimeInstance (int dateStyle,
+ int timeStyle,
+ Locale loc)
{
- return computeInstance (style, loc, true, true);
+ return computeInstance (dateStyle, timeStyle, loc, true, true);
}
public static final DateFormat getInstance ()
{
// JCL book says SHORT.
- return getDateTimeInstance (SHORT, Locale.getDefault());
+ return getDateTimeInstance (SHORT, SHORT, Locale.getDefault());
}
public NumberFormat getNumberFormat ()
diff --git a/libjava/java/text/DecimalFormat.java b/libjava/java/text/DecimalFormat.java
index 9ea9d921ec1..12a46f6e6e1 100644
--- a/libjava/java/text/DecimalFormat.java
+++ b/libjava/java/text/DecimalFormat.java
@@ -32,7 +32,6 @@ public class DecimalFormat extends NumberFormat
private final int scanFix (String pattern, int index, StringBuffer buf,
String patChars, DecimalFormatSymbols syms,
boolean is_suffix)
- throws ParseException
{
int len = pattern.length();
buf.setLength(0);
@@ -65,7 +64,8 @@ public class DecimalFormat extends NumberFormat
else if (is_suffix && c == syms.getPercent())
{
if (multiplierSet)
- throw new ParseException ("multiplier already set", index);
+ throw new IllegalArgumentException ("multiplier already set " +
+ "- index: " + index);
multiplierSet = true;
multiplier = 100;
buf.append(c);
@@ -73,7 +73,8 @@ public class DecimalFormat extends NumberFormat
else if (is_suffix && c == syms.getPerMill())
{
if (multiplierSet)
- throw new ParseException ("multiplier already set", index);
+ throw new IllegalArgumentException ("multiplier already set " +
+ "- index: " + index);
multiplierSet = true;
multiplier = 1000;
buf.append(c);
@@ -95,7 +96,6 @@ public class DecimalFormat extends NumberFormat
private final int scanFormat (String pattern, int index,
String patChars, DecimalFormatSymbols syms,
boolean is_positive)
- throws ParseException
{
int max = pattern.length();
@@ -113,7 +113,8 @@ public class DecimalFormat extends NumberFormat
if (c == syms.getDigit())
{
if (zeroCount > 0)
- throw new ParseException ("digit mark following zero", index);
+ throw new IllegalArgumentException ("digit mark following " +
+ "zero - index: " + index);
++countSinceGroup;
}
else if (c == syms.getZeroDigit())
@@ -163,8 +164,8 @@ public class DecimalFormat extends NumberFormat
if (c == syms.getZeroDigit())
{
if (hashCount > 0)
- throw new ParseException ("zero mark following digit",
- index);
+ throw new IllegalArgumentException ("zero mark " +
+ "following digit - index: " + index);
++zeroCount;
}
else if (c == syms.getDigit())
@@ -174,8 +175,8 @@ public class DecimalFormat extends NumberFormat
else if (c != syms.getExponential()
&& c != syms.getPatternSeparator()
&& patChars.indexOf(c) != -1)
- throw new ParseException ("unexpected special character",
- index);
+ throw new IllegalArgumentException ("unexpected special " +
+ "character - index: " + index);
else
break;
@@ -208,12 +209,14 @@ public class DecimalFormat extends NumberFormat
{
if (zeroCount > 0)
throw new
- ParseException ("digit mark following zero in exponent",
- index);
+ IllegalArgumentException ("digit mark following zero " +
+ "in exponent - index: " +
+ index);
}
else if (patChars.indexOf(c) != -1)
- throw new ParseException ("unexpected special character",
- index);
+ throw new IllegalArgumentException ("unexpected special " +
+ "character - index: " +
+ index);
else
break;
@@ -253,7 +256,6 @@ public class DecimalFormat extends NumberFormat
private final void applyPatternWithSymbols (String pattern,
DecimalFormatSymbols syms)
- throws ParseException
{
// Initialize to the state the parser expects.
negativePrefix = "";
@@ -292,7 +294,8 @@ public class DecimalFormat extends NumberFormat
else
{
if (pattern.charAt(index) != syms.getPatternSeparator())
- throw new ParseException ("separator character expected", index);
+ throw new IllegalArgumentException ("separator character " +
+ "expected - index: " + index);
index = scanFix (pattern, index + 1, buf, patChars, syms, false);
negativePrefix = buf.toString();
@@ -305,17 +308,26 @@ public class DecimalFormat extends NumberFormat
negativeSuffix = buf.toString();
if (index != pattern.length())
- throw new ParseException ("end of pattern expected", index);
+ throw new IllegalArgumentException ("end of pattern expected " +
+ "- index: " + index);
}
}
- public void applyLocalizedPattern (String pattern) throws ParseException
+ public void applyLocalizedPattern (String pattern)
{
+ // JCL p. 638 claims this throws a ParseException but p. 629
+ // contradicts this. Empirical tests with patterns of "0,###.0"
+ // and "#.#.#" corroborate the p. 629 statement that an
+ // IllegalArgumentException is thrown.
applyPatternWithSymbols (pattern, symbols);
}
- public void applyPattern (String pattern) throws ParseException
+ public void applyPattern (String pattern)
{
+ // JCL p. 638 claims this throws a ParseException but p. 629
+ // contradicts this. Empirical tests with patterns of "0,###.0"
+ // and "#.#.#" corroborate the p. 629 statement that an
+ // IllegalArgumentException is thrown.
applyPatternWithSymbols (pattern, nonLocalizedSymbols);
}
@@ -351,16 +363,7 @@ public class DecimalFormat extends NumberFormat
public DecimalFormat (String pattern, DecimalFormatSymbols symbols)
{
this.symbols = symbols;
- // The docs imply that the constructor turns a ParseException
- // into an IllegalArgumentException.
- try
- {
- applyPattern (pattern);
- }
- catch (ParseException x)
- {
- throw new IllegalArgumentException (x.getMessage());
- }
+ applyPattern (pattern);
}
private final boolean equals (String s1, String s2)
diff --git a/libjava/java/text/RuleBasedCollator.java b/libjava/java/text/RuleBasedCollator.java
new file mode 100644
index 00000000000..fd4002b1a9f
--- /dev/null
+++ b/libjava/java/text/RuleBasedCollator.java
@@ -0,0 +1,366 @@
+// RuleBasedCollator.java - Concrete class for locale-based string compare.
+
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+package java.text;
+
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.Vector;
+
+/**
+ * @author Tom Tromey <tromey@cygnus.com>
+ * @date March 25, 1999
+ */
+/* Written using "Java Class Libraries", 2nd edition, plus online
+ * API docs for JDK 1.2 from http://www.javasoft.com.
+ * Status: Believed complete and correct
+ */
+
+class RBCElement
+{
+ String key;
+ char relation;
+
+ RBCElement (String key, char relation)
+ {
+ this.key = key;
+ this.relation = relation;
+ }
+}
+
+public class RuleBasedCollator extends Collator
+{
+ public Object clone ()
+ {
+ return new RuleBasedCollator (this);
+ }
+
+ // A helper for CollationElementIterator.next().
+ int ceiNext (CollationElementIterator cei)
+ {
+ if (cei.lookahead_set)
+ {
+ cei.lookahead_set = false;
+ return cei.lookahead;
+ }
+
+ int save = cei.index;
+ int max = cei.text.length();
+ String s = null;
+
+ // It is possible to have a case where `abc' has a mapping, but
+ // neither `ab' nor `abd' do. In this case we must treat `abd' as
+ // nothing special.
+ boolean found = false;
+
+ int i;
+ for (i = save + 1; i <= max; ++i)
+ {
+ s = cei.text.substring(save, i);
+ if (prefixes.get(s) == null)
+ break;
+ found = true;
+ }
+ // Assume s != null.
+
+ Object obj = map.get(s);
+ // The special case.
+ while (found && obj == null && s.length() > 1)
+ {
+ --i;
+ s = cei.text.substring(save, i);
+ obj = map.get(s);
+ }
+
+ // Update state.
+ cei.index = i;
+
+ if (obj == null)
+ {
+ // This idea, and the values, come from JDK.
+ // assert (s.length() == 1)
+ cei.lookahead_set = true;
+ cei.lookahead = s.charAt(0) << 8;
+ return 0x7fff << 16;
+ }
+
+ return ((Integer) obj).intValue();
+ }
+
+ // A helper for compareTo() that returns the next character that has
+ // a nonzero ordering at the indicated strength. This is also used
+ // in CollationKey.
+ static final int next (CollationElementIterator iter, int strength)
+ {
+ while (true)
+ {
+ int os = iter.next();
+ if (os == CollationElementIterator.NULLORDER)
+ return os;
+ int c = 0;
+ switch (strength)
+ {
+ case PRIMARY:
+ c = os & ~0xffff;
+ break;
+ case SECONDARY:
+ c = os & ~0x00ff;
+ break;
+ case TERTIARY:
+ case IDENTICAL:
+ c = os;
+ break;
+ }
+ if (c != 0)
+ return c;
+ }
+ }
+
+ public int compare (String source, String target)
+ {
+ CollationElementIterator cs, ct;
+
+ cs = new CollationElementIterator (source, this);
+ ct = new CollationElementIterator (target, this);
+
+ while (true)
+ {
+ int os = next (cs, strength);
+ int ot = next (ct, strength);
+
+ if (os == CollationElementIterator.NULLORDER
+ && ot == CollationElementIterator.NULLORDER)
+ break;
+ else if (os == CollationElementIterator.NULLORDER)
+ {
+ // Source string is shorter, so return "less than".
+ return -1;
+ }
+ else if (ot == CollationElementIterator.NULLORDER)
+ {
+ // Target string is shorter, so return "greater than".
+ return 1;
+ }
+
+ if (os != ot)
+ return os - ot;
+ }
+
+ return 0;
+ }
+
+ public boolean equals (Object obj)
+ {
+ if (! (obj instanceof RuleBasedCollator) || ! super.equals(obj))
+ return false;
+ RuleBasedCollator rbc = (RuleBasedCollator) obj;
+ // FIXME: this is probably wrong. Instead we should compare maps
+ // directly.
+ return (frenchAccents == rbc.frenchAccents
+ && rules.equals(rbc.rules));
+ }
+
+ public CollationElementIterator getCollationElementIterator (String source)
+ {
+ StringBuffer expand = new StringBuffer (source.length());
+ int max = source.length();
+ for (int i = 0; i < max; ++i)
+ decomposeCharacter (source.charAt(i), expand);
+ return new CollationElementIterator (expand.toString(), this);
+ }
+
+ public CollationKey getCollationKey (String source)
+ {
+ return new CollationKey (getCollationElementIterator (source), source,
+ strength);
+ }
+
+ public String getRules ()
+ {
+ return rules;
+ }
+
+ public int hashCode ()
+ {
+ return (frenchAccents ? 1231 : 1237
+ ^ rules.hashCode()
+ ^ map.hashCode()
+ ^ prefixes.hashCode());
+ }
+
+ private final boolean is_special (char c)
+ {
+ // Rules from JCL book.
+ return ((c >= 0x0009 && c <= 0x000d)
+ || (c >= 0x0020 && c <= 0x002f)
+ || (c >= 0x003a && c <= 0x0040)
+ || (c >= 0x005b && c <= 0x0060)
+ || (c >= 0x007b && c <= 0x007e));
+ }
+
+ private final int text_argument (String rules, int index,
+ StringBuffer result)
+ {
+ result.setLength(0);
+ int len = rules.length();
+ while (index < len)
+ {
+ char c = rules.charAt(index);
+ if (c == '\'' && index + 2 < len
+ && rules.charAt(index + 2) == '\''
+ && is_special (rules.charAt(index + 1)))
+ index += 2;
+ else if (is_special (c) || Character.isWhitespace(c))
+ return index;
+ result.append(c);
+ ++index;
+ }
+ return index;
+ }
+
+ public RuleBasedCollator (String rules) throws ParseException
+ {
+ this.rules = rules;
+ this.frenchAccents = false;
+
+ // We keep each rule in order in a vector. At the end we traverse
+ // the vector and compute collation values from it.
+ int insertion_index = 0;
+ Vector vec = new Vector ();
+
+ StringBuffer argument = new StringBuffer ();
+
+ int len = rules.length();
+ for (int index = 0; index < len; ++index)
+ {
+ char c = rules.charAt(index);
+
+ // Just skip whitespace.
+ if (Character.isWhitespace(c))
+ continue;
+
+ // Modifier.
+ if (c == '@')
+ {
+ frenchAccents = true;
+ continue;
+ }
+
+ // Check for relation or reset operator.
+ if (! (c == '<' || c == ';' || c == ',' || c == '=' || c == '&'))
+ throw new ParseException ("invalid character", index);
+
+ ++index;
+ while (index < len)
+ {
+ if (! Character.isWhitespace(rules.charAt(index)))
+ break;
+ ++index;
+ }
+ if (index == len)
+ throw new ParseException ("missing argument", index);
+
+ int save = index;
+ index = text_argument (rules, index, argument);
+ if (argument.length() == 0)
+ throw new ParseException ("invalid character", save);
+ String arg = argument.toString();
+ int item_index = vec.indexOf(arg);
+ if (c != '&')
+ {
+ // If the argument already appears in the vector, then we
+ // must remove it in order to re-order.
+ if (item_index != -1)
+ {
+ vec.removeElementAt(item_index);
+ if (insertion_index >= item_index)
+ --insertion_index;
+ }
+ RBCElement r = new RBCElement (arg, c);
+ vec.insertElementAt(r, insertion_index);
+ ++insertion_index;
+ }
+ else
+ {
+ // Reset.
+ if (item_index == -1)
+ throw
+ new ParseException ("argument to reset not previously seen",
+ save);
+ insertion_index = item_index + 1;
+ }
+
+ // Ugly: in this case the resulting INDEX comes from
+ // text_argument, which returns the index of the next
+ // character we should examine.
+ --index;
+ }
+
+ // Now construct a hash table that maps strings onto their
+ // collation values.
+ int primary = 0;
+ int secondary = 0;
+ int tertiary = 0;
+ this.map = new Hashtable ();
+ this.prefixes = new Hashtable ();
+ Enumeration e = vec.elements();
+ while (e.hasMoreElements())
+ {
+ RBCElement r = (RBCElement) e.nextElement();
+ switch (r.relation)
+ {
+ case '<':
+ ++primary;
+ secondary = 0;
+ tertiary = 0;
+ break;
+ case ';':
+ ++secondary;
+ tertiary = 0;
+ break;
+ case ',':
+ ++tertiary;
+ break;
+ case '=':
+ break;
+ }
+ // This must match CollationElementIterator.
+ map.put(r.key, new Integer (primary << 16
+ | secondary << 8 | tertiary));
+
+ // Make a map of all lookaheads we might need.
+ for (int i = r.key.length() - 1; i >= 1; --i)
+ prefixes.put(r.key.substring(0, i), Boolean.TRUE);
+ }
+ }
+
+ // This is a helper for clone.
+ private RuleBasedCollator (RuleBasedCollator other)
+ {
+ frenchAccents = other.frenchAccents;
+ rules = other.rules;
+ decmp = other.decmp;
+ strength = other.strength;
+ map = other.map;
+ prefixes = other.prefixes;
+ }
+
+ // True if we are using French-style accent ordering.
+ private boolean frenchAccents;
+
+ // It's easier to just save the rules than to try to recreate them.
+ private String rules;
+
+ // This maps strings onto collation values.
+ private Hashtable map;
+ // An entry in this hash means that more lookahead is required for
+ // the prefix string.
+ private Hashtable prefixes;
+}
diff --git a/libjava/java/text/natCollator.cc b/libjava/java/text/natCollator.cc
new file mode 100644
index 00000000000..378ac5c448c
--- /dev/null
+++ b/libjava/java/text/natCollator.cc
@@ -0,0 +1,74 @@
+// natCollator.cc - Native code for collation.
+
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+// Written by Tom Tromey <tromey@cygnus.com>.
+
+#include <config.h>
+
+#include <cni.h>
+#include <jvm.h>
+
+#include <java/text/Collator.h>
+#include <java/lang/StringBuffer.h>
+
+#include <java-chardecomp.h>
+
+void
+java::text::Collator::decomposeCharacter (jchar c,
+ java::lang::StringBuffer *buf)
+{
+ if (decmp == NO_DECOMPOSITION)
+ {
+ buf->append(c);
+ return;
+ }
+
+ const struct decomp_entry *base;
+ int high;
+
+ if (decmp == FULL_DECOMPOSITION)
+ {
+ base = full_decomposition;
+ high = sizeof (full_decomposition) / sizeof (struct decomp_entry);
+ }
+ else
+ {
+ base = canonical_decomposition;
+ high = sizeof (canonical_decomposition) / sizeof (struct decomp_entry);
+ }
+
+ // FIXME: this is probably a bit slow for the task at hand.
+ int i = high / 2;
+ int low = 0;
+ while (true)
+ {
+ if (c < base[i].key)
+ high = i;
+ else if (c > base[i].key)
+ low = i;
+ else
+ break;
+
+ int old = i;
+ i = (high + low) / 2;
+ if (i == old)
+ {
+ // Not in table, so it expands to itself.
+ buf->append(c);
+ return;
+ }
+ }
+
+ for (int j = 0; base[i].value[j] != '\0'; j += 2)
+ {
+ jchar x = (base[i].value[j] << 8) | (base[i].value[j + 1]);
+ buf->append (x);
+ }
+}
diff --git a/libjava/java/util/Calendar.java b/libjava/java/util/Calendar.java
index 8649adf600d..bd022a7a54c 100644
--- a/libjava/java/util/Calendar.java
+++ b/libjava/java/util/Calendar.java
@@ -88,7 +88,7 @@ public abstract class Calendar implements java.io.Serializable, Cloneable
this (null, null);
}
- protected Calendar (TimeZone tx, Locale loc)
+ protected Calendar (TimeZone zone, Locale loc)
{
fields = new int[FIELD_COUNT];
isSet = new boolean[FIELD_COUNT];
@@ -187,6 +187,7 @@ public abstract class Calendar implements java.io.Serializable, Cloneable
public final void set (int fld, int value)
{
+ if (! areFieldsSet) computeFields();
fields[fld] = value;
isTimeSet = false;
}
diff --git a/libjava/java/util/GregorianCalendar.java b/libjava/java/util/GregorianCalendar.java
index d20c06ef825..26a9814fc8c 100644
--- a/libjava/java/util/GregorianCalendar.java
+++ b/libjava/java/util/GregorianCalendar.java
@@ -107,11 +107,13 @@ public class GregorianCalendar extends Calendar {
public GregorianCalendar (TimeZone zone, Locale locale)
{
super (zone, locale);
+ setDefaultTime ();
}
public GregorianCalendar (int year, int month, int date)
{
this((TimeZone) null);
+ setDefaultTime ();
set (year, month, date);
}
@@ -119,6 +121,7 @@ public class GregorianCalendar extends Calendar {
int hour, int minute)
{
this((TimeZone) null);
+ setDefaultTime ();
set (year, month, date, hour, minute);
}
@@ -126,9 +129,15 @@ public class GregorianCalendar extends Calendar {
int hour, int minute, int second)
{
this((TimeZone) null);
+ setDefaultTime ();
set (year, month, date, hour, minute, second);
}
+ private final void setDefaultTime ()
+ {
+ setTimeInMillis (System.currentTimeMillis());
+ }
+
public int getMinimum(int calfield) { return mins[calfield]; }
public int getGreatestMinimum(int calfield) { return mins[calfield]; }
public int getMaximum(int calfield) { return maxs[calfield]; }
diff --git a/libjava/java/util/Locale.java b/libjava/java/util/Locale.java
index e47cd1d59d7..627841499aa 100644
--- a/libjava/java/util/Locale.java
+++ b/libjava/java/util/Locale.java
@@ -36,33 +36,34 @@ public final class Locale implements java.io.Serializable, Cloneable
public Locale (String languageCode, String countryCode)
{
- language = languageCode.toLowerCase();
- country = countryCode.toUpperCase();
- hashcode = languageCode.hashCode() ^ countryCode.hashCode();
+ this (languageCode, countryCode, "");
}
public Locale (String languageCode, String countryCode,
String variantCode)
{
- this (languageCode, countryCode);
- variant = variantCode;
- hashcode ^= variantCode.hashCode();
+ // We must explicitly check the arguments.
+ if (languageCode == null || countryCode == null
+ || variantCode == null)
+ throw new NullPointerException ();
+ language = languageCode.toLowerCase();
+ country = countryCode.toUpperCase();
+ variant = variantCode.toUpperCase();
+ hashcode = (languageCode.hashCode()
+ ^ countryCode.hashCode()
+ ^ variantCode.hashCode());
}
public Object clone ()
- {
- return (Object) new Locale (language, country, variant);
- }
+ {
+ return (Object) new Locale (language, country, variant);
+ }
public boolean equals (Object obj)
{
if (! (obj instanceof Locale))
return false;
Locale loc = (Locale) obj;
- if ((language == null && loc.language != null)
- || (country == null && loc.country != null)
- || (variant == null && loc.variant != null))
- return false;
return (language.equals(loc.language)
&& country.equals(loc.country)
&& variant.equals(loc.variant));
@@ -115,7 +116,7 @@ public final class Locale implements java.io.Serializable, Cloneable
result.append(language);
result.append('_');
result.append(country);
- if (variant != null && variant.length() > 0)
+ if (variant.length() > 0)
{
result.append('_');
result.append(variant);
diff --git a/libjava/java/util/Properties.java b/libjava/java/util/Properties.java
index aac72147720..2988e7be5fe 100644
--- a/libjava/java/util/Properties.java
+++ b/libjava/java/util/Properties.java
@@ -103,7 +103,7 @@ public class Properties extends Hashtable
// FIXME: we use our own definition of whitespace.
// Character.isWhitespace includes newlines, which we don't
// want. Character.isSpaceChar doesn't include \t.
- if (c == ' ' || c == '\t')
+ if (c != ' ' && c != '\t')
{
reader.unread(c);
return true;
@@ -166,12 +166,12 @@ public class Properties extends Hashtable
reader.unread(c);
break;
}
- // FIXME: again, our own definitino of whitespace.
+ // FIXME: again, our own definition of whitespace.
if (c == ' ' || c == '\t' || c == ':' || c == '=')
break;
first_char = false;
- key.append(c);
+ key.append((char) c);
}
// Found end of key. Skip whitespace. If the terminator
@@ -226,10 +226,14 @@ public class Properties extends Hashtable
if (x == -1)
return;
int d = Character.digit((char) x, 16);
- // FIXME: what to do here? We call it an
- // error.
+ // We follow JDK here: invalid characters
+ // are treated as terminators.
if (d == -1)
- throw new IOException ();
+ {
+ value.append((char) c);
+ c = x;
+ break;
+ }
c <<= 4;
c |= d;
}
@@ -238,8 +242,7 @@ public class Properties extends Hashtable
// Nothing.
}
}
- else
- value.append(c);
+ value.append((char) c);
}
put (key.toString(), value.toString());
@@ -290,7 +293,8 @@ public class Properties extends Hashtable
{
if (comment != null)
{
- // FIXME: what if COMMENT contains newlines?
+ // We just lose if COMMENT contains a newline. This is
+ // what JDK 1.1 does.
output.write("#");
output.write(comment);
output.write(newline);
@@ -309,7 +313,7 @@ public class Properties extends Hashtable
// characters. But it also doesn't say we should encode
// it in any way.
// FIXME: if key contains ':', '=', or whitespace, must
- // quote it here.
+ // quote it here. Note that JDK 1.1 does not do this.
output.write(key);
output.write("=");
diff --git a/libjava/java/util/PropertyResourceBundle.java b/libjava/java/util/PropertyResourceBundle.java
new file mode 100644
index 00000000000..a1f99002265
--- /dev/null
+++ b/libjava/java/util/PropertyResourceBundle.java
@@ -0,0 +1,47 @@
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+package java.util;
+
+import java.io.InputStream;
+import java.io.IOException;
+import gnu.gcj.util.EnumerationChain;
+
+/**
+ * @author Anthony Green <green@cygnus.com>
+ * @date April 29, 1999.
+ */
+
+/* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3,
+ * and "The Java Language Specification", ISBN 0-201-63451-1. */
+
+public class PropertyResourceBundle extends ResourceBundle
+{
+ private Properties properties;
+
+ public PropertyResourceBundle (InputStream pstream) throws IOException
+ {
+ // Initialize and load our Properties.
+ properties = new Properties();
+ properties.load(pstream);
+ }
+
+ public Enumeration getKeys()
+ {
+ if (parent == null)
+ return properties.propertyNames();
+ else
+ return new EnumerationChain (properties.propertyNames(),
+ parent.getKeys ());
+ }
+
+ public Object handleGetObject (String key)
+ {
+ return properties.getProperty(key);
+ }
+}
diff --git a/libjava/java/util/ResourceBundle.java b/libjava/java/util/ResourceBundle.java
index ba1d3f9fdcb..5a2002aabb6 100644
--- a/libjava/java/util/ResourceBundle.java
+++ b/libjava/java/util/ResourceBundle.java
@@ -20,6 +20,9 @@ public abstract class ResourceBundle
{
protected ResourceBundle parent;
+ // This is used to cache resource bundles.
+ private static Hashtable resource_cache = new Hashtable ();
+
public ResourceBundle ()
{
}
@@ -65,15 +68,17 @@ public abstract class ResourceBundle
String stopHere)
{
Class rbc;
+ ResourceBundle needs_parent = null, r, result = null;
while (true)
{
try
{
rbc = Class.forName(bundleName);
+ r = null;
try
{
- return (ResourceBundle) rbc.newInstance();
+ r = (ResourceBundle) rbc.newInstance();
}
catch (IllegalAccessException ex)
{
@@ -83,45 +88,63 @@ public abstract class ResourceBundle
{
// Fall through
}
- return null;
+ if (r != null)
+ {
+ if (result == null)
+ result = r;
+ if (needs_parent != null)
+ {
+ // We've been through the loop one or more times
+ // already. Set the parent and keep going.
+ needs_parent.setParent(r);
+ }
+ needs_parent = r;
+ }
}
catch (ClassNotFoundException ex)
{
- if (bundleName.compareTo(stopHere) == 0)
- return null;
- else
- {
- int last = bundleName.lastIndexOf('_');
-
- // No more underscores?
- if (last == -1)
- return null;
+ // Fall through.
+ }
+
+ if (bundleName.equals(stopHere))
+ return result;
+ else
+ {
+ int last = bundleName.lastIndexOf('_');
- // Loop around, testing this new shorter name.
- bundleName = bundleName.substring(0, last);
- }
+ // No more underscores?
+ if (last == -1)
+ return result;
+
+ // Loop around, testing this new shorter name.
+ bundleName = bundleName.substring(0, last);
}
}
}
-
- // Search for bundles, but stop at baseName_language.
- private static final ResourceBundle partialGetBundle (String baseName,
- Locale locale)
+
+ // Search for bundles, but stop at baseName_language (if required).
+ // This is synchronized so that the cache works correctly.
+ private static final synchronized ResourceBundle
+ partialGetBundle (String baseName, Locale locale, boolean langStop)
{
ResourceBundle rb;
- String bundleName = (baseName
- + "_"
- + locale.getLanguage() + "_"
- + locale.getCountry() + "_"
- + locale.getVariant());
+ // Explicitly invoke locale.toString() to force a
+ // NullPointerException when required.
+ String bundleName = baseName + "_" + locale.toString();
+
+ // Check the cache.
+ Object obj = resource_cache.get(bundleName);
+ if (obj != null)
+ return (ResourceBundle) obj;
String stopHere = (baseName
- + "_"
- + locale.getLanguage());
+ + (langStop ? ("_" + locale.getLanguage()) : ""));
rb = trySomeGetBundle(bundleName, stopHere);
+ if (rb != null)
+ resource_cache.put(bundleName, rb);
return rb;
}
@@ -133,43 +156,20 @@ public abstract class ResourceBundle
ResourceBundle rb;
Class rbc;
- // FIXME: We can't currently rely on NullPointerException being
- // thrown when we invoke a method on a null object.
- if (locale == null)
+ if (baseName == null)
throw new NullPointerException ();
- rb = partialGetBundle(baseName, locale);
+ rb = partialGetBundle(baseName, locale, false);
if (rb != null)
return rb;
+ // Finally, try the default locale.
if (! locale.equals(Locale.getDefault()))
{
- rb = partialGetBundle(baseName, Locale.getDefault());
+ rb = partialGetBundle(baseName, Locale.getDefault(), true);
if (rb != null)
return rb;
}
-
- // Try just the baseName.
- try
- {
- rbc = Class.forName (baseName);
- try
- {
- return (ResourceBundle) rbc.newInstance();
- }
- catch (IllegalAccessException ex)
- {
- // Fall through.
- }
- catch (InstantiationException ex)
- {
- // Fall through.
- }
- }
- catch (ClassNotFoundException ex)
- {
- // Fall through.
- }
throw new MissingResourceException("can't load bundle",
baseName,
diff --git a/libjava/java/util/natGregorianCalendar.cc b/libjava/java/util/natGregorianCalendar.cc
index cfa98bdc58d..5f1374e79ce 100644
--- a/libjava/java/util/natGregorianCalendar.cc
+++ b/libjava/java/util/natGregorianCalendar.cc
@@ -57,7 +57,7 @@ java::util::GregorianCalendar::computeTime ()
t += zone->getRawOffset();
// Adjust for milliseconds.
- time = t * 1000 + elements(fields)[MILLISECOND];
+ time = t * (jlong) 1000 + elements(fields)[MILLISECOND];
isTimeSet = true;
}
diff --git a/libjava/java/util/zip/CheckedInputStream.java b/libjava/java/util/zip/CheckedInputStream.java
new file mode 100644
index 00000000000..a6a9058a5a4
--- /dev/null
+++ b/libjava/java/util/zip/CheckedInputStream.java
@@ -0,0 +1,80 @@
+// CheckedInputStream.java - Compute checksum of data being read.
+
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+package java.util.zip;
+
+import java.io.FilterInputStream;
+import java.io.InputStream;
+import java.io.IOException;
+
+/**
+ * @author Tom Tromey
+ * @date May 17, 1999
+ */
+
+/* Written using on-line Java Platform 1.2 API Specification
+ * and JCL book.
+ * Believed complete and correct.
+ */
+
+public class CheckedInputStream extends FilterInputStream
+{
+ public CheckedInputStream (InputStream in, Checksum sum)
+ {
+ super (in);
+ this.sum = sum;
+ }
+
+ public Checksum getChecksum ()
+ {
+ return sum;
+ }
+
+ public int read () throws IOException
+ {
+ int x = in.read();
+ if (x != -1)
+ sum.update(x);
+ return x;
+ }
+
+ public int read (byte[] buf, int off, int len) throws IOException
+ {
+ int r = in.read(buf, off, len);
+ if (r != -1)
+ sum.update(buf, off, r);
+ return r;
+ }
+
+ public long skip (long n) throws IOException
+ {
+ if (n == 0)
+ return 0;
+
+ int min = (int) Math.min(n, 1024);
+ byte[] buf = new byte[min];
+
+ long s = 0;
+ while (n > 0)
+ {
+ int r = in.read(buf, 0, min);
+ if (r == -1)
+ break;
+ n -= r;
+ s += r;
+ sum.update(buf, 0, r);
+ }
+
+ return s;
+ }
+
+ // The checksum object.
+ private Checksum sum;
+}
diff --git a/libjava/java/util/zip/CheckedOutputStream.java b/libjava/java/util/zip/CheckedOutputStream.java
new file mode 100644
index 00000000000..30dbc734f8a
--- /dev/null
+++ b/libjava/java/util/zip/CheckedOutputStream.java
@@ -0,0 +1,54 @@
+// CheckedOutputStream.java - Compute checksum of data being written.
+
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+package java.util.zip;
+
+import java.io.FilterOutputStream;
+import java.io.OutputStream;
+import java.io.IOException;
+
+/**
+ * @author Tom Tromey
+ * @date May 17, 1999
+ */
+
+/* Written using on-line Java Platform 1.2 API Specification
+ * and JCL book.
+ * Believed complete and correct.
+ */
+
+public class CheckedOutputStream extends FilterOutputStream
+{
+ public CheckedOutputStream (OutputStream out, Checksum cksum)
+ {
+ super (out);
+ this.sum = cksum;
+ }
+
+ public Checksum getChecksum ()
+ {
+ return sum;
+ }
+
+ public void write (int bval) throws IOException
+ {
+ out.write(bval);
+ sum.update(bval);
+ }
+
+ public void write (byte[] buf, int off, int len) throws IOException
+ {
+ out.write(buf, off, len);
+ sum.update(buf, off, len);
+ }
+
+ // The checksum object.
+ private Checksum sum;
+}
diff --git a/libjava/java/util/zip/DataFormatException.java b/libjava/java/util/zip/DataFormatException.java
new file mode 100644
index 00000000000..9e67b753650
--- /dev/null
+++ b/libjava/java/util/zip/DataFormatException.java
@@ -0,0 +1,33 @@
+// DataFormatException.java
+
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libjava.
+
+This software is copyrighted work licensed under the terms of the
+Libjava License. Please consult the file "LIBJAVA_LICENSE" for
+details. */
+
+package java.util.zip;
+
+/**
+ * @author Tom Tromey
+ * @date May 17, 1999
+ */
+
+/* Written using on-line Java Platform 1.2 API Specification.
+ * Believed complete and correct.
+ */
+
+public class DataFormatException extends Exception
+{
+ public DataFormatException ()
+ {
+ super();
+ }
+
+ public DataFormatException (String msg)
+ {
+ super(msg);
+ }
+}
diff --git a/libjava/java/util/zip/Deflater.java b/libjava/java/util/zip/Deflater.java
index 81312e2a84f..202b2203de1 100644
--- a/libjava/java/util/zip/Deflater.java
+++ b/libjava/java/util/zip/Deflater.java
@@ -1,3 +1,5 @@
+// Deflater.java - Compress a data stream.
+
/* Copyright (C) 1999 Cygnus Solutions
This file is part of libgcj.
@@ -8,6 +10,120 @@ details. */
package java.util.zip;
+import gnu.gcj.RawData;
+
+/**
+ * @author Tom Tromey
+ * @date May 17, 1999
+ */
+
+/* Written using on-line Java Platform 1.2 API Specification
+ * and JCL book.
+ * Believed complete and correct.
+ */
+
public class Deflater
{
+ public static final int BEST_COMPRESSION = 9;
+ public static final int BEST_SPEED = 1;
+ public static final int DEFAULT_COMPRESSION = -1;
+ public static final int NO_COMPRESSION = 0;
+
+ public static final int DEFAULT_STRATEGY = 0;
+ public static final int FILTERED = 1;
+ public static final int HUFFMAN_ONLY = 2;
+
+ public static final int DEFLATED = 8;
+
+ public int deflate (byte[] buf)
+ {
+ return deflate (buf, 0, buf.length);
+ }
+
+ public native int deflate (byte[] buf, int off, int len);
+ public native void init (int level, boolean noHeader);
+ public native void update ();
+
+ public Deflater ()
+ {
+ this (DEFAULT_COMPRESSION, false);
+ }
+
+ public Deflater (int lvl)
+ {
+ this (lvl, false);
+ }
+
+ public Deflater (int lvl, boolean noHeader)
+ {
+ this.strategy = DEFAULT_STRATEGY;
+ init (lvl, noHeader);
+ setLevel (lvl);
+ }
+
+ public native void end ();
+
+ protected void finalize ()
+ {
+ end ();
+ }
+
+ public native void finish ();
+
+ public synchronized boolean finished ()
+ {
+ return is_finished;
+ }
+
+ public native int getAdler ();
+ public native int getTotalIn ();
+ public native int getTotalOut ();
+ public native boolean needsInput ();
+ public native void reset ();
+
+ public void setDictionary (byte[] buf)
+ {
+ setDictionary (buf, 0, buf.length);
+ }
+
+ public native void setDictionary (byte[] buf, int off, int len);
+
+ public void setInput (byte[] buf)
+ {
+ setInput (buf, 0, buf.length);
+ }
+
+ public native void setInput (byte[] buf, int off, int len);
+
+ public synchronized void setLevel (int lvl)
+ {
+ if (lvl != -1 && (lvl < 0 || lvl > 9))
+ throw new IllegalArgumentException ();
+ level = (lvl == -1) ? 6 : lvl;
+ update ();
+ }
+
+ public synchronized void setStrategy (int stgy)
+ {
+ if (stgy != DEFAULT_STRATEGY && stgy != FILTERED
+ && stgy != HUFFMAN_ONLY)
+ throw new IllegalArgumentException ();
+ strategy = stgy;
+ update ();
+ }
+
+ // Compression level.
+ private int level;
+
+ // Compression strategy.
+ private int strategy;
+
+ // The zlib stream.
+ private RawData zstream;
+
+ // True if finished.
+ private boolean is_finished;
+
+ // `Flush' flag to pass to next call to deflate.
+ private int flush_flag;
}
diff --git a/libjava/java/util/zip/DeflaterOutputStream.java b/libjava/java/util/zip/DeflaterOutputStream.java
index 4f0b8b454a5..ce5ae23101f 100644
--- a/libjava/java/util/zip/DeflaterOutputStream.java
+++ b/libjava/java/util/zip/DeflaterOutputStream.java
@@ -1,3 +1,5 @@
+// DeflaterOutputStream.java - Output filter for compressing.
+
/* Copyright (C) 1999 Cygnus Solutions
This file is part of libgcj.
@@ -7,40 +9,79 @@ Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
details. */
package java.util.zip;
-import java.io.*;
-/** JUST AN INCOMPLETE STUB! */
+import java.io.FilterOutputStream;
+import java.io.OutputStream;
+import java.io.IOException;
+
+/**
+ * @author Tom Tromey
+ * @date May 17, 1999
+ */
+
+/* Written using on-line Java Platform 1.2 API Specification
+ * and JCL book.
+ * Believed complete and correct.
+ */
public class DeflaterOutputStream extends FilterOutputStream
{
- protected byte[] buf;
+ public void close () throws IOException
+ {
+ finish ();
+ out.close();
+ }
- protected Deflater def;
+ protected void deflate () throws IOException
+ {
+ while (true)
+ {
+ int len = def.deflate(buf, 0, buf.length);
+ if (len == 0 || len == -1)
+ break;
+ out.write(buf, 0, len);
+ }
+ }
- public DeflaterOutputStream(OutputStream out)
+ public DeflaterOutputStream (OutputStream out)
{
- this(out, null, 512);
+ this (out, new Deflater (), 512);
}
- public DeflaterOutputStream(OutputStream out, Deflater defl)
+ public DeflaterOutputStream (OutputStream out, Deflater defl)
{
- this(out, defl, 512);
+ this (out, defl, 512);
}
public DeflaterOutputStream(OutputStream out, Deflater defl, int bufsize)
{
- super(out);
+ super (out);
buf = new byte[bufsize];
def = defl;
}
public void finish () throws IOException
{
+ def.finish();
+ deflate ();
}
- public void close () throws IOException
+ public void write (int bval) throws IOException
{
- finish();
- out.close();
+ byte[] b = new byte[1];
+ b[0] = (byte) bval;
+ write (b, 0, 1);
+ }
+
+ public void write (byte[] buf, int off, int len) throws IOException
+ {
+ def.setInput (buf, off, len);
+ deflate ();
}
+
+ // The retrieval buffer.
+ protected byte[] buf;
+
+ // Deflater used to compress data.
+ protected Deflater def;
}
diff --git a/libjava/java/util/zip/GZIPInputStream.java b/libjava/java/util/zip/GZIPInputStream.java
new file mode 100644
index 00000000000..109ee82b1d2
--- /dev/null
+++ b/libjava/java/util/zip/GZIPInputStream.java
@@ -0,0 +1,154 @@
+// GZIPInputStream.java - Input tiler for reading gzip file.
+
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+package java.util.zip;
+
+import java.io.InputStream;
+import java.io.IOException;
+
+/**
+ * @author Tom Tromey
+ * @date May 17, 1999
+ */
+
+/* Written using on-line Java Platform 1.2 API Specification
+ * and JCL book.
+ * Believed complete and correct.
+ */
+
+public class GZIPInputStream extends InflaterInputStream
+{
+ public static final int GZIP_MAGIC = 0x8b1f;
+
+ public void close () throws IOException
+ {
+ // Nothing to do here.
+ super.close();
+ }
+
+ public GZIPInputStream (InputStream istream) throws IOException
+ {
+ this (istream, 512);
+ }
+
+ private final int eof_read () throws IOException
+ {
+ int r = in.read();
+ if (r == -1)
+ throw new ZipException ("gzip header corrupted");
+ return r & 0xff;
+ }
+
+ public GZIPInputStream (InputStream istream, int readsize)
+ throws IOException
+ {
+ super (istream, new Inflater (true), readsize);
+
+ // NOTE: header reading code taken from zlib's gzio.c.
+
+ // Read the magic number.
+ int magic = eof_read () | (eof_read () << 8);
+ if (magic != GZIP_MAGIC)
+ throw new ZipException ("gzip header corrupted");
+
+ int method = eof_read ();
+ int flags = eof_read ();
+ // Test from zlib.
+ if (method != Z_DEFLATED || (flags & RESERVED) != 0)
+ throw new ZipException ("gzip header corrupted");
+
+ // Discard time, xflags, OS code.
+ for (int i = 0; i < 6; ++i)
+ eof_read ();
+
+ // Skip the extra field.
+ if ((flags & EXTRA_FIELD) != 0)
+ {
+ int len = eof_read () | (eof_read () << 8);
+ while (len-- != 0)
+ eof_read ();
+ }
+
+ if ((flags & ORIG_NAME) != 0)
+ {
+ while (true)
+ {
+ int c = eof_read ();
+ if (c == 0)
+ break;
+ }
+ }
+
+ if ((flags & COMMENT) != 0)
+ {
+ while (true)
+ {
+ int c = eof_read ();
+ if (c == 0)
+ break;
+ }
+ }
+
+ if ((flags & HEAD_CRC) != 0)
+ {
+ // FIXME: consider checking CRC of the header.
+ eof_read ();
+ eof_read ();
+ }
+
+ crc = new CRC32 ();
+ }
+
+ public int read (byte[] buf, int off, int len) throws IOException
+ {
+ if (eos)
+ return -1;
+ int r = super.read(buf, off, len);
+ if (r == -1)
+ {
+ eos = true;
+ int header_crc = read4 ();
+ if (crc.getValue() != header_crc)
+ throw new ZipException ("corrupted gzip file");
+ // Read final `ISIZE' field.
+ // FIXME: should we check this length?
+ read4 ();
+ return -1;
+ }
+ crc.update(buf, off, r);
+ return r;
+ }
+
+ private final int read4 () throws IOException
+ {
+ int byte0 = in.read();
+ int byte1 = in.read();
+ int byte2 = in.read();
+ int byte3 = in.read();
+ if (byte3 < 0)
+ throw new ZipException (".zip archive ended prematurely");
+ return ((byte3 & 0xFF) << 24) + ((byte2 & 0xFF) << 16)
+ + ((byte1 & 0xFF) << 8) + (byte0 & 0xFF);
+ }
+
+ // Checksum used by this input stream.
+ protected CRC32 crc;
+
+ // Indicates whether end-of-stream has been reached.
+ protected boolean eos;
+
+ // Some constants from zlib.
+ static final int Z_DEFLATED = 8;
+ static final int HEAD_CRC = 0x02;
+ static final int EXTRA_FIELD = 0x04;
+ static final int ORIG_NAME = 0x08;
+ static final int COMMENT = 0x10;
+ static final int RESERVED = 0xe0;
+}
diff --git a/libjava/java/util/zip/GZIPOutputStream.java b/libjava/java/util/zip/GZIPOutputStream.java
new file mode 100644
index 00000000000..4669d06abb0
--- /dev/null
+++ b/libjava/java/util/zip/GZIPOutputStream.java
@@ -0,0 +1,93 @@
+// GZIPOutputStream.java - Create a file in gzip format.
+
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+package java.util.zip;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+/**
+ * @author Tom Tromey
+ * @date May 17, 1999
+ */
+
+/* Written using on-line Java Platform 1.2 API Specification
+ * and JCL book.
+ * Believed complete and correct.
+ */
+
+public class GZIPOutputStream extends DeflaterOutputStream
+{
+ public void close () throws IOException
+ {
+ finish ();
+ out.close ();
+ }
+
+ public void finish () throws IOException
+ {
+ super.finish();
+ put4 ((int) crc.getValue());
+ put4 (def.getTotalIn());
+ }
+
+ public GZIPOutputStream (OutputStream out) throws IOException
+ {
+ this (out, 512);
+ }
+
+ public GZIPOutputStream (OutputStream out, int readsize) throws IOException
+ {
+ super (out, new Deflater (Deflater.DEFAULT_COMPRESSION, true), readsize);
+
+ put2 (GZIPInputStream.GZIP_MAGIC);
+ out.write (GZIPInputStream.Z_DEFLATED);
+ // No flags for now.
+ out.write (0);
+ // No time either.
+ put2 (0);
+ put2 (0);
+ // No xflags either.
+ out.write (0);
+ // FIXME: unknown OS.
+ out.write (255);
+
+ crc = new CRC32 ();
+ }
+
+ public synchronized void write (byte[] buf) throws IOException
+ {
+ write (buf, 0, buf.length);
+ }
+
+ public synchronized void write (byte[] buf, int off, int len)
+ throws IOException
+ {
+ super.write(buf, off, len);
+ crc.update(buf, off, len);
+ }
+
+ private final void put2 (int i) throws IOException
+ {
+ out.write (i);
+ out.write (i >> 8);
+ }
+
+ private final void put4 (int i) throws IOException
+ {
+ out.write (i);
+ out.write (i >> 8);
+ out.write (i >> 16);
+ out.write (i >> 24);
+ }
+
+ // Checksum used by this stream.
+ protected CRC32 crc;
+}
diff --git a/libjava/java/util/zip/Inflater.java b/libjava/java/util/zip/Inflater.java
new file mode 100644
index 00000000000..8e9fc6ab4b2
--- /dev/null
+++ b/libjava/java/util/zip/Inflater.java
@@ -0,0 +1,98 @@
+// Inflater.java - Decompress a data stream.
+
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+package java.util.zip;
+
+import gnu.gcj.RawData;
+
+/**
+ * @author Tom Tromey
+ * @date May 17, 1999
+ */
+
+/* Written using on-line Java Platform 1.2 API Specification
+ * and JCL book.
+ * Believed complete and correct.
+ */
+
+public class Inflater
+{
+ public native void end ();
+
+ protected void finalize ()
+ {
+ end ();
+ }
+
+ public synchronized boolean finished ()
+ {
+ return is_finished;
+ }
+
+ public native int getAdler ();
+ public native int getRemaining ();
+ public native int getTotalIn ();
+ public native int getTotalOut ();
+
+ public int inflate (byte[] buf) throws DataFormatException
+ {
+ return inflate (buf, 0, buf.length);
+ }
+
+ public native int inflate (byte[] buf, int off, int len)
+ throws DataFormatException;
+
+ private native void init (boolean noHeader);
+
+ public Inflater ()
+ {
+ this (false);
+ }
+
+ public Inflater (boolean noHeader)
+ {
+ init (noHeader);
+ }
+
+ public synchronized boolean needsDictionary ()
+ {
+ return dict_needed;
+ }
+
+ public synchronized boolean needsInput ()
+ {
+ return getRemaining () == 0;
+ }
+
+ public native void reset ();
+
+ public void setDictionary (byte[] buf)
+ {
+ setDictionary (buf, 0, buf.length);
+ }
+
+ public native void setDictionary (byte[] buf, int off, int len);
+
+ public void setInput (byte[] buf)
+ {
+ setInput (buf, 0, buf.length);
+ }
+
+ public native void setInput (byte[] buf, int off, int len);
+
+ // The zlib stream.
+ private RawData zstream;
+
+ // True if finished.
+ private boolean is_finished;
+
+ // True if dictionary needed.
+ private boolean dict_needed;
+}
diff --git a/libjava/java/util/zip/InflaterInputStream.java b/libjava/java/util/zip/InflaterInputStream.java
new file mode 100644
index 00000000000..74712478784
--- /dev/null
+++ b/libjava/java/util/zip/InflaterInputStream.java
@@ -0,0 +1,109 @@
+// InflaterInputStream.java - Input stream filter for decompressing.
+
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+package java.util.zip;
+
+import java.io.FilterInputStream;
+import java.io.InputStream;
+import java.io.IOException;
+
+/**
+ * @author Tom Tromey
+ * @date May 17, 1999
+ */
+
+/* Written using on-line Java Platform 1.2 API Specification
+ * and JCL book.
+ * Believed complete and correct.
+ */
+
+public class InflaterInputStream extends FilterInputStream
+{
+ protected void fill () throws IOException
+ {
+ len = in.read(buf, 0, buf.length);
+ if (len != -1)
+ inf.setInput(buf, 0, len);
+ }
+
+ public InflaterInputStream (InputStream in)
+ {
+ this (in, new Inflater (), 512);
+ }
+
+ public InflaterInputStream (InputStream in, Inflater infl)
+ {
+ this (in, infl, 512);
+ }
+
+ public InflaterInputStream (InputStream in, Inflater infl, int bufsize)
+ {
+ super (in);
+ this.inf = infl;
+ this.buf = new byte[bufsize];
+ }
+
+ public int read () throws IOException
+ {
+ byte[] buf = new byte[1];
+ int r = read (buf, 0, 1);
+ if (r != -1)
+ r = buf[0] & 0xff;
+ return r;
+ }
+
+ public int read (byte[] buf, int off, int len) throws IOException
+ {
+ if (inf.finished())
+ return -1;
+ if (inf.needsInput())
+ fill ();
+ if (inf.needsDictionary())
+ return -1;
+ try
+ {
+ return inf.inflate(buf, off, len);
+ }
+ catch (DataFormatException dfe)
+ {
+ throw new ZipException (dfe.getMessage());
+ }
+ }
+
+ public long skip (long n) throws IOException
+ {
+ if (n == 0)
+ return 0;
+
+ int min = (int) Math.min(n, 1024);
+ byte[] buf = new byte[min];
+
+ long s = 0;
+ while (n > 0)
+ {
+ int r = read (buf, 0, min);
+ if (r == -1)
+ break;
+ n -= r;
+ s += r;
+ }
+
+ return s;
+ }
+
+ // Buffer for delivering uncompressed data to inflater.
+ protected byte[] buf;
+
+ // Inflater used to decompress data.
+ protected Inflater inf;
+
+ // Number of read bytes in buf.
+ protected int len;
+}
diff --git a/libjava/java/util/zip/ZipConstants.java b/libjava/java/util/zip/ZipConstants.java
index 4aec92e02c4..d5ca82d9c34 100644
--- a/libjava/java/util/zip/ZipConstants.java
+++ b/libjava/java/util/zip/ZipConstants.java
@@ -8,6 +8,11 @@ details. */
package java.util.zip;
-public interface ZipConstants
+interface ZipConstants
{
+ // Size in bytes of local file header, including signature.
+ public static final int LOCAL_FILE_HEADER_SIZE = 30;
+
+ // Size in bytes of the "end of central directory" record, with signature.
+ public static final int END_CENTRAL_DIR_SIZE = 22;
}
diff --git a/libjava/java/util/zip/ZipEntry.java b/libjava/java/util/zip/ZipEntry.java
index d472de50cd9..9bd3c41a9ab 100644
--- a/libjava/java/util/zip/ZipEntry.java
+++ b/libjava/java/util/zip/ZipEntry.java
@@ -19,7 +19,7 @@ package java.util.zip;
* Status: Believed complete and correct.
*/
-public class ZipEntry
+public class ZipEntry implements ZipConstants
{
// These values were determined using a simple test program.
public static final int STORED = 0;
@@ -33,11 +33,16 @@ public class ZipEntry
String name;
long size = -1;
long time = -1;
+ long relativeOffset = -1;
ZipEntry next;
public ZipEntry (String name)
{
+ if (name == null)
+ throw new NullPointerException ();
+ if (name.length() > 65535)
+ throw new IllegalArgumentException ();
this.name = name;
}
@@ -68,17 +73,76 @@ public class ZipEntry
return false;
}
- public void setComment (String comment) { this.comment = comment; }
+ public void setComment (String comment)
+ {
+ if (comment != null && comment.length() > 65535)
+ throw new IllegalArgumentException ();
+ this.comment = comment;
+ }
+
+ public void setCrc (long crc)
+ {
+ if (crc < 0 || crc > 0xffffffff)
+ throw new IllegalArgumentException ();
+ this.crc = crc;
+ }
+
+ public void setExtra (byte[] extra)
+ {
+ if (extra != null && extra.length > 65535)
+ throw new IllegalArgumentException ();
+ this.extra = extra;
+ }
- public void setCrc (long crc) { this.crc = crc; }
+ public void setMethod (int method)
+ {
+ if (method != DEFLATED && method != STORED)
+ throw new IllegalArgumentException ();
+ this.method = method;
+ }
- public void setExtra (byte[] extra) { this.extra = extra; }
+ public void setSize (long size)
+ {
+ if (size < 0 || size > 0xffffffff)
+ throw new IllegalArgumentException ();
+ this.size = size;
+ }
- public void setMethod(int method) { this.method = method; }
+ public void setTime (long time)
+ {
+ this.time = time;
+ }
- public void setSize (long size) { this.size = size; }
+ private final static short[] daysToMonthStart = {
+ //Jan Feb Mar Apr May Jun Jul
+ 0, 31, 31+28, 2*31+28, 2*31+28+30, 3*31+28+30, 3*31+28+2*30,
+ // Aug Sep Oct Nov Dec
+ 4*31+28+2*30, 5*31+28+2*30, 5*31+28+3*30, 6*31+28+3*30, 6*31+28+4*30};
- public void setTime (long time) { this.time = time; }
+ /** Convert a DOS-style type value to milliseconds since 1970. */
+ static long timeFromDOS (int date, int time)
+ {
+ int sec = 2 * (time & 0x1f);
+ int min = (time >> 5) & 0x3f;
+ int hrs = (time >> 11) & 0x1f;
+ int day = date & 0x1f;
+ int mon = ((date >> 5) & 0xf) - 1;
+ int year = ((date >> 9) & 0x7f) + 10; /* Since 1970. */
+
+ // Guard against invalid or missing date causing IndexOutOfBoundsException.
+ if (mon < 0 || mon > 11)
+ return -1;
+
+ long mtime = (((hrs * 60) + min) * 60 + sec) * 1000;
+
+ // Leap year calculations are rather trivial in this case ...
+ int days = 365 * year + ((year+1)>>2);
+ days += daysToMonthStart[mon];
+ if ((year & 3) == 0 && mon > 1)
+ days++;
+ days += day;
+ return (days * 24*60*60L + ((hrs * 60) + min) * 60 + sec) * 1000L;
+ }
public String toString () { return name; }
}
diff --git a/libjava/java/util/zip/ZipFile.java b/libjava/java/util/zip/ZipFile.java
index 75f0a3d94f0..bfb077d4585 100644
--- a/libjava/java/util/zip/ZipFile.java
+++ b/libjava/java/util/zip/ZipFile.java
@@ -1,3 +1,5 @@
+// ZipFile.java - Read contents of a ZIP file.
+
/* Copyright (C) 1999 Cygnus Solutions
This file is part of libgcj.
@@ -9,23 +11,88 @@ details. */
package java.util.zip;
import java.io.*;
-/** JUST AN INCOMPLETE STUB! */
+/* Written using on-line Java Platform 1.2 API Specification
+ * and JCL book.
+ * Believed complete and correct.
+ */
public class ZipFile implements ZipConstants
{
-
- String name;
- ZipEntry entries;
-
public ZipFile (String fname) throws IOException
{
+ file = new RandomAccessFile(fname, "r");
name = fname;
- // FIXME
}
public ZipFile (File f) throws IOException
{
- this(f.getPath());
+ file = new RandomAccessFile(f, "r");
+ name = f.getName();
+ }
+
+ void readDirectory () throws IOException
+ {
+ long size = file.length ();
+ if (size < ZipConstants.END_CENTRAL_DIR_SIZE)
+ throw new ZipException ("zipfile too short");
+ // We do not handle a "zipfile comment", which the appnote says can
+ // be at the end of a .zip file. We could handle this by seeking
+ // to the beginning and reading forwards.
+ file.seek(size - ZipConstants.END_CENTRAL_DIR_SIZE);
+ if (file.read() != 'P'
+ || file.read() != 'K'
+ || file.read() != '\005'
+ || file.read() != '\006')
+ throw new ZipException("not a valid zipfile");
+ file.skipBytes(6);
+ numEntries = readu2();
+ int dir_size = read4 (); // Read "size of the central directory".
+ file.seek(size - (dir_size + ZipConstants.END_CENTRAL_DIR_SIZE));
+
+ ZipEntry last = null;
+ for (int i = 0; i < numEntries; i++)
+ {
+ file.skipBytes(10);
+ int method = readu2();
+ int modtime = readu2();
+ int moddate = readu2();
+ int crc = read4();
+ int compressedSize = read4();
+ int uncompressedSize = read4();
+ int filenameLength = readu2();
+ int extraLength = readu2();
+ int commentLength = readu2();
+ int diskNumberStart = readu2();
+ int intAttributes = readu2();
+ int extAttributes = read4();
+ int relativeOffset = read4();
+ byte[] bname = new byte[filenameLength];
+ file.readFully(bname);
+ ZipEntry entry = new ZipEntry(new String(bname, "8859_1"));
+ if (extraLength > 0)
+ {
+ byte[] bextra = new byte[extraLength];
+ file.readFully(bextra);
+ entry.extra = bextra;
+ }
+ if (commentLength > 0)
+ {
+ byte[] bcomment = new byte[commentLength];
+ file.readFully(bcomment);
+ entry.comment = new String(bcomment, "8859_1");
+ }
+ entry.compressedSize = compressedSize;
+ entry.size = uncompressedSize;
+ entry.crc = (long) crc & 0xffffffffL;
+ entry.method = method;
+ entry.relativeOffset = relativeOffset;
+ entry.time = ZipEntry.timeFromDOS(moddate, modtime);
+ if (last == null)
+ entries = entry;
+ else
+ last.next = entry;
+ last = entry;
+ }
}
public java.util.Enumeration entries()
@@ -35,7 +102,9 @@ public class ZipFile implements ZipConstants
public void close() throws IOException
{
- // FIXME
+ file.close();
+ entries = null;
+ numEntries = 0;
}
public ZipEntry getEntry(String name)
@@ -50,10 +119,46 @@ public class ZipFile implements ZipConstants
public InputStream getInputStream(ZipEntry ze) throws IOException
{
- return null; // FIXME
+ byte[] buffer = new byte[(int) ze.getSize()];
+ int data_offset = ZipConstants.LOCAL_FILE_HEADER_SIZE + name.length();
+ if (ze.extra != null)
+ data_offset += ze.extra.length;
+ file.seek(ze.relativeOffset + data_offset);
+ file.readFully(buffer);
+
+ InputStream is = new ByteArrayInputStream (buffer);
+ if (ze.getMethod() == ZipEntry.DEFLATED)
+ is = new InflaterInputStream (is);
+ return is;
}
public String getName () { return name; }
+
+ private int readu2 () throws IOException
+ {
+ int byte0 = file.read();
+ int byte1 = file.read();
+ if (byte0 < 0 || byte1 < 0)
+ throw new ZipException (".zip archive ended prematurely");
+ return ((byte1 & 0xFF) << 8) | (byte0 & 0xFF);
+ }
+
+ private int read4 () throws IOException
+ {
+ int byte0 = file.read();
+ int byte1 = file.read();
+ int byte2 = file.read();
+ int byte3 = file.read();
+ if (byte3 < 0)
+ throw new ZipException (".zip archive ended prematurely");
+ return ((byte3 & 0xFF) << 24) + ((byte2 & 0xFF) << 16)
+ + ((byte1 & 0xFF) << 8) + (byte0 & 0xFF);
+ }
+
+ ZipEntry entries;
+ int numEntries;
+ RandomAccessFile file;
+ String name;
}
class ZipEnumeration implements java.util.Enumeration
diff --git a/libjava/java/util/zip/ZipInputStream.java b/libjava/java/util/zip/ZipInputStream.java
new file mode 100644
index 00000000000..41b092d8133
--- /dev/null
+++ b/libjava/java/util/zip/ZipInputStream.java
@@ -0,0 +1,223 @@
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+package java.util.zip;
+import java.io.*;
+
+/**
+ * @author Per Bothner
+ * @date May 1999.
+ */
+
+/*
+ * Written using on-line Java Platform 1.2 API Specification, as well
+ * as "The Java Class Libraries", 2nd edition (Addison-Wesley, 1998).
+ * Status: Quite incomplete, but can read uncompressed .zip archives.
+ */
+
+// JDK1.2 has "protected ZipEntry createZipEntry(String)" but is very
+// vague about what the method does. FIXME.
+// We do not calculate the CRC and compare it with the specified value;
+// we probably should. FIXME.
+
+
+public class ZipInputStream extends InflaterInputStream implements ZipConstants
+{
+ public ZipInputStream (InputStream in)
+ {
+ super (in, new Inflater (true));
+ }
+
+ public ZipEntry getNextEntry () throws IOException
+ {
+ if (current != null)
+ closeEntry();
+ if (in.read() != 'P'
+ || in.read() != 'K')
+ return null;
+ int code = in.read();
+ while (code == '\001')
+ {
+ code = in.read();
+ if (code != '\002')
+ return null;
+ in.skip(16);
+ int size = read4();
+ in.skip(4);
+ int fname_length = readu2();
+ int extra_length = readu2();
+ int fcomment_length = readu2();
+ in.skip(12+fname_length+extra_length+fcomment_length+size);
+ if (in.read() != 'P' || in.read() != 'K')
+ return null;
+ code = in.read();
+ }
+ if (code == '\005')
+ {
+ if (in.read() != '\006')
+ return null;
+ in.skip(16);
+ int comment_size = readu2();
+ in.skip(comment_size);
+ if (in.read() != 'P' || in.read() != 'K')
+ return null;
+ code = in.read();
+ }
+ if (code != '\003'
+ || in.read() != '\004')
+ return null;
+ int ex_version = readu2();
+ current_flags = readu2();
+ int method = readu2();
+ int modtime = readu2();
+ int moddate = readu2();
+ int crc = read4();
+ int compressedSize = read4();
+ int uncompressedSize = read4();
+ int filenameLength = readu2();
+ int extraLength = readu2();
+ byte[] bname = new byte[filenameLength];
+ readFully(bname);
+ ZipEntry entry = new ZipEntry(new String(bname, "8859_1"));
+ if (extraLength > 0)
+ {
+ byte[] bextra = new byte[extraLength];
+ readFully(bextra);
+ entry.extra = bextra;
+ }
+ entry.compressedSize = compressedSize;
+ entry.size = uncompressedSize;
+ entry.crc = (long) crc & 0xffffffffL;
+ entry.method = method;
+ entry.time = ZipEntry.timeFromDOS(moddate, modtime);
+ current = entry;
+ avail = uncompressedSize;
+ compressed_bytes = compressedSize;
+ return entry;
+ }
+
+ // We override fill to let us control how much data gets read from
+ // the underlying input stream. This lets us avoid having to push
+ // back data.
+ protected void fill () throws IOException
+ {
+ int count = buf.length;
+ if (count > compressed_bytes)
+ count = compressed_bytes;
+ len = in.read(buf, 0, count);
+ if (len != -1)
+ {
+ compressed_bytes -= len;
+ inf.setInput(buf, 0, len);
+ }
+ }
+
+ public int read (byte[] b, int off, int len) throws IOException
+ {
+ if (len > avail)
+ len = avail;
+ int count;
+ if (current.method == Deflater.DEFLATED)
+ count = super.read(b, off, len);
+ else
+ count = in.read(b, off, len);
+ if (count == -1 || avail == 0)
+ {
+ inf.reset();
+ count = -1;
+ }
+ else
+ avail -= count;
+ return count;
+ }
+
+ public long skip (long n) throws IOException
+ {
+ if (n > avail)
+ n = avail;
+ long count;
+ if (current.method == Deflater.DEFLATED)
+ count = super.skip(n);
+ else
+ count = in.skip(n);
+ avail = avail - (int) count;
+ return count;
+ }
+
+ private void readFully (byte[] b) throws IOException
+ {
+ int off = 0;
+ int len = b.length;
+ while (len > 0)
+ {
+ int count = in.read(b, off, len);
+ if (count <= 0)
+ throw new EOFException(".zip archive ended prematurely");
+ off += count;
+ len -= count;
+ }
+ }
+
+ private int readu2 () throws IOException
+ {
+ int byte0 = in.read();
+ int byte1 = in.read();
+ if (byte0 < 0 || byte1 < 0)
+ throw new EOFException(".zip archive ended prematurely");
+ return ((byte1 & 0xFF) << 8) | (byte0 & 0xFF);
+ }
+
+ private int read4 () throws IOException
+ {
+ int byte0 = in.read();
+ int byte1 = in.read();
+ int byte2 = in.read();
+ int byte3 = in.read();
+ if (byte3 < 0)
+ throw new EOFException(".zip archive ended prematurely");
+ return ((byte3 & 0xFF) << 24) + ((byte2 & 0xFF) << 16)
+ + ((byte1 & 0xFF) << 8) + (byte0 & 0xFF);
+ }
+
+ public void closeEntry () throws IOException
+ {
+ if (current != null)
+ {
+ if (avail > 0)
+ skip (avail);
+ if ((current_flags & 8) != 0)
+ {
+ int sig = read4();
+ if (sig != 0x04034b50)
+ throw new ZipException("bad/missing magic number at end of .zip entry");
+ int crc = read4();
+ int compressedSize = read4();
+ int uncompressedSize = read4();
+ if (current.compressedSize != compressedSize
+ || current.size != uncompressedSize
+ || current.crc != crc)
+ throw new ZipException("bad data descriptor at end of .zip entry");
+ }
+ current = null;
+ avail = 0;
+ }
+ }
+
+ public void close () throws IOException
+ {
+ current = null;
+ super.close();
+ }
+
+ private ZipEntry current;
+ private int current_flags;
+ // Number of uncompressed bytes to be read.
+ private int avail;
+ // Number of bytes we can read from underlying stream.
+ private int compressed_bytes;
+}
diff --git a/libjava/java/util/zip/ZipOutputStream.java b/libjava/java/util/zip/ZipOutputStream.java
index 42cfb00169e..f4ce7accc01 100644
--- a/libjava/java/util/zip/ZipOutputStream.java
+++ b/libjava/java/util/zip/ZipOutputStream.java
@@ -9,18 +9,268 @@ details. */
package java.util.zip;
import java.io.*;
-/** JUST AN INCOMPLETE STUB! */
+/* Written using on-line Java Platform 1.2 API Specification
+ * and JCL book.
+ * Believed complete and correct.
+ */
public class ZipOutputStream extends DeflaterOutputStream
implements ZipConstants
{
- public ZipOutputStream (OutputStream out)
+ public static final int STORED = 0;
+ public static final int DEFLATED = 8;
+
+ public void close () throws IOException
+ {
+ finish ();
+ out.close();
+ }
+
+ public void closeEntry () throws IOException
+ {
+ int uncompressed_size = def.getTotalIn();
+ int compressed_size = def.getTotalOut();
+ int crc = (int) (filter.getChecksum().getValue());
+
+ bytes_written += compressed_size;
+
+ bytes_written += put4 (0x08074b50);
+ if (current.getCrc() == -1 || current.getCompressedSize() == -1
+ || current.getSize() == -1)
+ {
+ current.setCrc(crc);
+ current.compressedSize = compressed_size;
+ current.setSize(uncompressed_size);
+ }
+ else
+ {
+ if (current.getCrc() != crc
+ || current.getCompressedSize() != compressed_size
+ || current.getSize() != uncompressed_size)
+ throw new ZipException ("zip entry field incorrect");
+ }
+ bytes_written += put4 ((int) (current.getCrc()));
+ bytes_written += put4 ((int) (current.getCompressedSize()));
+ bytes_written += put4 ((int) (current.getSize()));
+
+ current.next = chain;
+ chain = current;
+ current = null;
+ filter = null;
+ }
+
+ public void finish () throws IOException
+ {
+ if (current != null)
+ closeEntry ();
+
+ // Write the central directory.
+ long offset = bytes_written;
+ int count = 0;
+ int bytes = 0;
+ while (chain != null)
+ {
+ bytes += write_entry (chain, false);
+ ++count;
+ chain = chain.next;
+ }
+
+ // Write the end of the central directory record.
+ put4 (0x06054b50);
+ // Disk number.
+ put2 (0);
+ // Another disk number.
+ put2 (0);
+ put2 (count);
+ put4 (bytes);
+ put4 ((int) offset);
+
+ byte[] c = comment.getBytes("8859_1");
+ put2 (c.length);
+ out.write(c);
+ out.write((byte) 0);
+ }
+
+ // Helper for finish and putNextEntry.
+ private int write_entry (ZipEntry entry, boolean is_local)
+ throws IOException
{
- super(out);
+ long offset = bytes_written;
+
+ int bytes = put4 (is_local ? 0x04034b50 : 0x02014b50);
+ if (! is_local)
+ bytes += put_version ();
+ bytes += put_version ();
+
+ boolean crc_after = false;
+ if (is_local
+ && (current.getCrc() == -1 || current.getCompressedSize() == -1
+ || current.getSize() == -1))
+ crc_after = true;
+ // For the bits field we always indicate `normal' compression,
+ // even if that isn't true.
+ bytes += put2 (crc_after ? (1 << 3) : 0);
+ bytes += put2 (entry.method);
+
+ bytes += put2(0); // time - FIXME
+ bytes += put2(0); // date - FIXME
+
+ if (crc_after)
+ {
+ // CRC, compressedSize, and Size are always 0 in this header.
+ // The actual values are given after the entry.
+ bytes += put4 (0);
+ bytes += put4 (0);
+ bytes += put4 (0);
+ }
+ else
+ {
+ bytes += put4 ((int) (entry.getCrc()));
+ bytes += put4 ((int) (entry.getCompressedSize()));
+ bytes += put4 ((int) (entry.getSize()));
+ }
+
+ byte[] name = entry.name.getBytes("8859_1");
+ bytes += put2 (name.length);
+ bytes += put2 (entry.extra == null ? 0 : entry.extra.length);
+
+ byte[] comment = null;
+ if (! is_local)
+ {
+ if (entry.getComment() == null)
+ bytes += put2 (0);
+ else
+ {
+ comment = entry.getComment().getBytes("8859_1");
+ bytes += put2 (comment.length);
+ }
+
+ // Disk number start.
+ bytes += put2 (0);
+ // Internal file attributes.
+ bytes += put2 (0);
+ // External file attributes.
+ bytes += put2 (0);
+ // Relative offset of local header.
+ bytes += put2 ((int) offset);
+ }
+
+ out.write (name);
+ out.write ((byte) 0);
+ bytes += name.length + 1;
+ if (entry.extra != null)
+ {
+ out.write(entry.extra);
+ out.write((byte) 0);
+ bytes += entry.extra.length + 1;
+ }
+ if (comment != null)
+ {
+ out.write(comment);
+ out.write((byte) 0);
+ bytes += comment.length + 1;
+ }
+
+ bytes_written += bytes;
+ return bytes;
}
public void putNextEntry (ZipEntry entry) throws IOException
{
- throw new Error ("java.util.zip.ZipOutputStream.putNextEntry: not implemented");
+ if (current != null)
+ closeEntry ();
+
+ if (entry.method < 0 )
+ entry.method = method;
+ if (entry.method == STORED)
+ {
+ if (entry.getSize() == -1 || entry.getCrc() == -1)
+ throw new ZipException ("required entry not set");
+ // Just in case.
+ entry.compressedSize = entry.getSize();
+ }
+ write_entry (entry, true);
+ current = entry;
+ int compr = (method == STORED) ? Deflater.NO_COMPRESSION : level;
+ def.reset();
+ def.setLevel(compr);
+ filter = new CheckedOutputStream (new DeflaterOutputStream (out, def),
+ new CRC32 ());
}
+
+ public void setLevel (int level)
+ {
+ if (level != Deflater.DEFAULT_COMPRESSION
+ && (level < Deflater.NO_COMPRESSION
+ || level > Deflater.BEST_COMPRESSION))
+ throw new IllegalArgumentException ();
+ this.level = level;
+ }
+
+ public void setMethod (int method)
+ {
+ if (method != DEFLATED && method != STORED)
+ throw new IllegalArgumentException ();
+ this.method = method;
+ }
+
+ public void setComment (String comment)
+ {
+ if (comment.length() > 65535)
+ throw new IllegalArgumentException ();
+ this.comment = comment;
+ }
+
+ public synchronized void write (byte[] buf, int off, int len)
+ throws IOException
+ {
+ if (filter == null)
+ throw new ZipException ("no open zip entry");
+ filter.write(buf, off, len);
+ }
+
+ public ZipOutputStream (OutputStream out)
+ {
+ super (out);
+ def = new Deflater (level, true);
+ }
+
+ private int put2 (int i) throws IOException
+ {
+ out.write (i);
+ out.write (i >> 8);
+ return 2;
+ }
+
+ private int put4 (int i) throws IOException
+ {
+ out.write (i);
+ out.write (i >> 8);
+ out.write (i >> 16);
+ out.write (i >> 24);
+ return 4;
+ }
+
+ private int put_version () throws IOException
+ {
+ // FIXME: for now we assume Unix, and we ignore the version
+ // number.
+ return put2 (3 << 8);
+ }
+
+ // The entry we are currently writing, or null if we've called
+ // closeEntry.
+ private ZipEntry current;
+ // The chain of entries which have been written to this file.
+ private ZipEntry chain;
+ // The output stream to which data should be sent.
+ private CheckedOutputStream filter;
+
+ private int method = DEFLATED;
+ private int level = Deflater.DEFAULT_COMPRESSION;
+ private String comment = "";
+ private long bytes_written;
+
+ // The Deflater we use.
+ private Deflater def;
}
diff --git a/libjava/java/util/zip/natDeflater.cc b/libjava/java/util/zip/natDeflater.cc
new file mode 100644
index 00000000000..566f918a77a
--- /dev/null
+++ b/libjava/java/util/zip/natDeflater.cc
@@ -0,0 +1,214 @@
+// natDeflater.cc - Implementation of Deflater native methods.
+
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+// Written by Tom Tromey <tromey@cygnus.com>
+
+#include <config.h>
+
+#include <zlib.h>
+#include <stdlib.h>
+
+#include <cni.h>
+#include <jvm.h>
+
+#include <java/util/zip/Deflater.h>
+#include <java/util/zip/DataFormatException.h>
+
+#include <java/lang/InternalError.h>
+#include <java/lang/NullPointerException.h>
+#include <java/lang/ArrayIndexOutOfBoundsException.h>
+
+extern void *_Jv_ZMalloc (void *, uInt nitems, uInt size);
+extern void _Jv_ZFree (void *, void *addr);
+
+
+
+jint
+java::util::zip::Deflater::deflate (jbyteArray buf, jint off, jint len)
+{
+ JvSynchronize sync (this);
+ z_streamp s = (z_streamp) zstream;
+
+ if (! buf)
+ _Jv_Throw (new java::lang::NullPointerException);
+ if (off < 0 || len < 0 || off + len > buf->length)
+ _Jv_Throw (new java::lang::ArrayIndexOutOfBoundsException);
+
+ if (len == 0)
+ return 0;
+
+ s->next_out = (Bytef *) (elements (buf) + off);
+ s->avail_out = len;
+
+ switch (::deflate (s, flush_flag))
+ {
+ case Z_STREAM_END:
+ is_finished = true;
+ if (s->avail_out == (unsigned int) len)
+ return -1;
+ break;
+
+ case Z_STREAM_ERROR:
+ case Z_BUF_ERROR:
+ // FIXME?
+ _Jv_Throw (new java::lang::InternalError);
+ break;
+
+ case Z_OK:
+ break;
+ }
+
+ return len - s->avail_out;
+}
+
+void
+java::util::zip::Deflater::end ()
+{
+ JvSynchronize sync (this);
+ // Just ignore errors.
+ deflateEnd ((z_streamp) zstream);
+ _Jv_Free (zstream);
+ zstream = NULL;
+}
+
+void
+java::util::zip::Deflater::finish ()
+{
+ JvSynchronize sync (this);
+ flush_flag = Z_FINISH;
+}
+
+jint
+java::util::zip::Deflater::getAdler ()
+{
+ JvSynchronize sync (this);
+ z_streamp s = (z_streamp) zstream;
+ return s->adler;
+}
+
+jint
+java::util::zip::Deflater::getTotalIn ()
+{
+ JvSynchronize sync (this);
+ z_streamp s = (z_streamp) zstream;
+ return s->total_in;
+}
+
+jint
+java::util::zip::Deflater::getTotalOut ()
+{
+ JvSynchronize sync (this);
+ z_streamp s = (z_streamp) zstream;
+ return s->total_out;
+}
+
+jboolean
+java::util::zip::Deflater::needsInput ()
+{
+ JvSynchronize sync (this);
+ z_streamp s = (z_streamp) zstream;
+ return s->avail_in == 0;
+}
+
+void
+java::util::zip::Deflater::reset ()
+{
+ JvSynchronize sync (this);
+ z_streamp s = (z_streamp) zstream;
+ // Just ignore errors.
+ deflateReset (s);
+ flush_flag = 0;
+}
+
+void
+java::util::zip::Deflater::setDictionary (jbyteArray buf, jint off, jint len)
+{
+ JvSynchronize sync (this);
+ z_streamp s = (z_streamp) zstream;
+
+ if (! buf)
+ _Jv_Throw (new java::lang::NullPointerException);
+ if (off < 0 || len < 0 || off + len > buf->length)
+ _Jv_Throw (new java::lang::ArrayIndexOutOfBoundsException);
+
+ // Ignore errors.
+ deflateSetDictionary (s, (Bytef *) (elements (buf) + off), len);
+}
+
+void
+java::util::zip::Deflater::setInput (jbyteArray buf, jint off, jint len)
+{
+ JvSynchronize sync (this);
+ z_streamp s = (z_streamp) zstream;
+
+ if (! buf)
+ _Jv_Throw (new java::lang::NullPointerException);
+ if (off < 0 || len < 0 || off + len > buf->length)
+ _Jv_Throw (new java::lang::ArrayIndexOutOfBoundsException);
+
+ s->next_in = (Bytef *) (elements (buf) + off);
+ s->avail_in = len;
+}
+
+void
+java::util::zip::Deflater::update ()
+{
+ JvSynchronize sync (this);
+ z_streamp s = (z_streamp) zstream;
+
+ int strat = Z_DEFAULT_STRATEGY;
+ switch (strategy)
+ {
+ case DEFAULT_STRATEGY:
+ strat = Z_DEFAULT_STRATEGY;
+ break;
+ case FILTERED:
+ strat = Z_FILTERED;
+ break;
+ case HUFFMAN_ONLY:
+ strat = Z_HUFFMAN_ONLY;
+ break;
+ default:
+ JvFail ("unexpected strategy");
+ }
+
+ // Ignore errors.
+ deflateParams (s, level, strat);
+}
+
+void
+java::util::zip::Deflater::init (jint level, jboolean no_header)
+{
+ z_stream_s *stream = (z_stream_s *) _Jv_Malloc (sizeof (z_stream_s));
+ stream->next_in = Z_NULL;
+ stream->avail_in = 0;
+ stream->zalloc = _Jv_ZMalloc;
+ stream->zfree = _Jv_ZFree;
+ stream->opaque = NULL;
+
+ // Handle NO_HEADER using undocumented zlib feature.
+ int wbits = MAX_WBITS;
+ if (no_header)
+ wbits = - wbits;
+
+#define DEFAULT_MEM_LEVEL 8
+ if (deflateInit2 (stream, level, Z_DEFLATED, wbits,
+ DEFAULT_MEM_LEVEL, Z_DEFAULT_STRATEGY) != Z_OK)
+ {
+ jstring msg = NULL;
+ if (stream->msg != NULL)
+ msg = JvNewStringLatin1 (stream->msg);
+ _Jv_Throw (new java::lang::InternalError (msg));
+ }
+
+ zstream = reinterpret_cast<gnu::gcj::RawData *> (stream);
+ is_finished = false;
+ flush_flag = 0;
+}
diff --git a/libjava/java/util/zip/natInflater.cc b/libjava/java/util/zip/natInflater.cc
new file mode 100644
index 00000000000..6fc9e3deaab
--- /dev/null
+++ b/libjava/java/util/zip/natInflater.cc
@@ -0,0 +1,205 @@
+// natInflater.cc - Implementation of Inflater native methods.
+
+/* Copyright (C) 1999 Cygnus Solutions
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+// Written by Tom Tromey <tromey@cygnus.com>
+
+#include <config.h>
+
+#include <zlib.h>
+#include <stdlib.h>
+
+#include <cni.h>
+#include <jvm.h>
+
+#include <java/util/zip/Inflater.h>
+#include <java/util/zip/DataFormatException.h>
+
+#include <java/lang/InternalError.h>
+#include <java/lang/NullPointerException.h>
+#include <java/lang/ArrayIndexOutOfBoundsException.h>
+#include <java/lang/OutOfMemoryError.h>
+
+
+
+// A couple of helper functions used to interface with zlib's
+// allocation.
+
+void *
+_Jv_ZMalloc (void *, uInt nitems, uInt size)
+{
+ return _Jv_Malloc (nitems * size);
+}
+
+void
+_Jv_ZFree (void *, void *addr)
+{
+ _Jv_Free (addr);
+}
+
+
+
+void
+java::util::zip::Inflater::end ()
+{
+ JvSynchronize sync (this);
+ // Just ignore errors.
+ inflateEnd ((z_streamp) zstream);
+ _Jv_Free (zstream);
+ zstream = NULL;
+}
+
+jint
+java::util::zip::Inflater::getAdler ()
+{
+ JvSynchronize sync (this);
+ z_streamp s = (z_streamp) zstream;
+ return s->adler;
+}
+
+jint
+java::util::zip::Inflater::getRemaining ()
+{
+ JvSynchronize sync (this);
+ z_streamp s = (z_streamp) zstream;
+ return s->avail_in;
+}
+
+jint
+java::util::zip::Inflater::getTotalIn ()
+{
+ JvSynchronize sync (this);
+ z_streamp s = (z_streamp) zstream;
+ return s->total_in;
+}
+
+jint
+java::util::zip::Inflater::getTotalOut ()
+{
+ JvSynchronize sync (this);
+ z_streamp s = (z_streamp) zstream;
+ return s->total_out;
+}
+
+jint
+java::util::zip::Inflater::inflate (jbyteArray buf, jint off, jint len)
+{
+ JvSynchronize sync (this);
+ z_streamp s = (z_streamp) zstream;
+
+ if (! buf)
+ _Jv_Throw (new java::lang::NullPointerException);
+ if (off < 0 || len < 0 || off + len > buf->length)
+ _Jv_Throw (new java::lang::ArrayIndexOutOfBoundsException);
+
+ if (len == 0)
+ return 0;
+
+ s->next_out = (Bytef *) (elements (buf) + off);
+ s->avail_out = len;
+
+ switch (::inflate (s, Z_SYNC_FLUSH))
+ {
+ case Z_STREAM_END:
+ is_finished = true;
+ if (s->avail_out == (unsigned int) len)
+ return -1;
+ break;
+
+ case Z_NEED_DICT:
+ dict_needed = true;
+ break;
+
+ case Z_DATA_ERROR:
+ _Jv_Throw (new java::util::zip::DataFormatException);
+ break;
+
+ case Z_MEM_ERROR:
+ _Jv_Throw (new java::lang::OutOfMemoryError);
+ break;
+
+ case Z_BUF_ERROR:
+ // FIXME?
+ _Jv_Throw (new java::lang::InternalError);
+ break;
+
+ case Z_OK:
+ break;
+ }
+
+ return len - s->avail_out;
+}
+
+void
+java::util::zip::Inflater::reset ()
+{
+ JvSynchronize sync (this);
+ z_streamp s = (z_streamp) zstream;
+ // Just ignore errors.
+ inflateReset (s);
+}
+
+void
+java::util::zip::Inflater::setDictionary (jbyteArray buf, jint off, jint len)
+{
+ JvSynchronize sync (this);
+ z_streamp s = (z_streamp) zstream;
+
+ if (! buf)
+ _Jv_Throw (new java::lang::NullPointerException);
+ if (off < 0 || len < 0 || off + len > buf->length)
+ _Jv_Throw (new java::lang::ArrayIndexOutOfBoundsException);
+
+ // Ignore errors.
+ inflateSetDictionary (s, (Bytef *) (elements (buf) + off), len);
+ dict_needed = false;
+}
+
+void
+java::util::zip::Inflater::setInput (jbyteArray buf, jint off, jint len)
+{
+ JvSynchronize sync (this);
+ z_streamp s = (z_streamp) zstream;
+
+ if (! buf)
+ _Jv_Throw (new java::lang::NullPointerException);
+ if (off < 0 || len < 0 || off + len > buf->length)
+ _Jv_Throw (new java::lang::ArrayIndexOutOfBoundsException);
+
+ s->next_in = (Bytef *) (elements (buf) + off);
+ s->avail_in = len;
+}
+
+void
+java::util::zip::Inflater::init (jboolean no_header)
+{
+ z_stream_s *stream = (z_stream_s *) _Jv_Malloc (sizeof (z_stream_s));
+ stream->next_in = Z_NULL;
+ stream->avail_in = 0;
+ stream->zalloc = _Jv_ZMalloc;
+ stream->zfree = _Jv_ZFree;
+ stream->opaque = NULL;
+
+ // Handle NO_HEADER using undocumented zlib feature.
+ int wbits = MAX_WBITS;
+ if (no_header)
+ wbits = - wbits;
+
+ if (inflateInit2 (stream, wbits) != Z_OK)
+ {
+ jstring msg = NULL;
+ if (stream->msg != NULL)
+ msg = JvNewStringLatin1 (stream->msg);
+ _Jv_Throw (new java::lang::InternalError (msg));
+ }
+
+ zstream = reinterpret_cast<gnu::gcj::RawData *> (stream);
+ is_finished = false;
+ dict_needed = false;
+}
diff --git a/libjava/libgcj.spec.in b/libjava/libgcj.spec.in
new file mode 100644
index 00000000000..24ee578fb78
--- /dev/null
+++ b/libjava/libgcj.spec.in
@@ -0,0 +1,7 @@
+#
+# This spec file is read by gcj when linking.
+# It is used to specify the standard libraries we need in order
+# to link with libgcj.
+#
+%rename lib liborig
+*lib: -lgcj -lm @GCSPEC@ @THREADSPEC@ @ZLIBSPEC@ @SYSTEMSPEC@ %(liborig)
diff --git a/libjava/libtool-version b/libjava/libtool-version
new file mode 100644
index 00000000000..30263df9c81
--- /dev/null
+++ b/libjava/libtool-version
@@ -0,0 +1,6 @@
+# This file is used to maintain libtool version info for libgcj. See
+# the libtool manual to understand the meaning of the fields. This is
+# a separate file so that version updates don't involve re-running
+# automake.
+# CURRENT:REVISION:AGE
+0:0:0
diff --git a/libjava/mauve-libgcj b/libjava/mauve-libgcj
index 5aa1198f297..0a1f8a5e55f 100644
--- a/libjava/mauve-libgcj
+++ b/libjava/mauve-libgcj
@@ -4,24 +4,44 @@ JDK1.1
!java.applet
!java.awt
!java.beans
-!java.io.Utf8Encoding
+# We don't support object serialization yet.
+!java.io.ObjectStreamClass
+!java.io.ObjectInputOutput
java.lang.Character.classify12
java.lang.String.hash
-# StringTest includes a test for NullPointerException, which we don't
-# handle.
-!java.lang.String.StringTest
+# We don't have the URL function in Class yet.
+!java.lang.Class.ClassTest
!java.math
-!java.net
!java.rmi
!java.security
!java.sql
+java.text.FieldPosition.Test
+java.text.ParsePosition.Test
+java.text.SimpleDateFormat.getAndSet2DigitYearStart
java.text.StringCharacterIterator.iter
-# FIXME: can't enable these until we eliminate compiler bug.
-# java.text.FieldPosition.Test
-# java.text.ParsePosition.Test
-# java.text.SimpleDateFormat.getAndSet2DigitYearStart
!java.text.ACIAttribute
!java.text.AttributedCharacterIterator
!java.text.resources
!java.text.DateFormat
-!java.util.zip
+#
+# The following are all `xfail's.
+# There are a frightening number of these.
+#
+!java.io.Utf8Encoding.mojo
+!java.lang.Double.DoubleTest
+!java.lang.Float.FloatTest
+!java.lang.Math.MathTest
+!java.lang.Math.max
+!java.lang.Math.min
+!java.lang.String.StringTest
+!java.lang.StringBuffer.plus
+!java.lang.System.arraycopy
+!java.net.DatagramSocket.DatagramSocketTest2
+!java.net.MulticastSocket.MulticastSocketTest
+!java.net.ServerSocket.ServerSocketTest
+!java.net.URL.URLTest
+!java.text.SimpleDateFormat.Test
+!java.text.SimpleDateFormat.getAndSet2DigitYearStart
+!java.net.Socket.SocketTest
+!java.net.URLConnection.URLConnectionTest
+!java.net.InetAddress.InetAddressTest
diff --git a/libjava/posix-threads.cc b/libjava/posix-threads.cc
index 436588aee32..825b0206c19 100644
--- a/libjava/posix-threads.cc
+++ b/libjava/posix-threads.cc
@@ -85,12 +85,11 @@ _Jv_CondWait (_Jv_ConditionVariable_t *cv, _Jv_Mutex_t *mu,
r = pthread_cond_wait (cv, pmu);
else
{
- struct timespec ts;
- unsigned long m = millis + java::lang::System::currentTimeMillis ();
-
- ts.tv_sec = m / 1000;
- ts.tv_nsec = (m % 1000) * 1000 * 1000 + nanos;
-
+ struct timespec ts;
+ jlong m = millis + java::lang::System::currentTimeMillis ();
+ ts.tv_sec = m / 1000;
+ ts.tv_nsec = ((m % 1000) * 1000000) + nanos;
+
r = pthread_cond_timedwait (cv, pmu, &ts);
}
return r;
diff --git a/libjava/prims.cc b/libjava/prims.cc
index 265e281dcb1..9909485ded0 100644
--- a/libjava/prims.cc
+++ b/libjava/prims.cc
@@ -14,14 +14,12 @@ details. */
#include <stdarg.h>
#include <stdio.h>
#include <string.h>
-#ifdef HANDLE_SEGV
-#include <signal.h>
-#endif
#pragma implementation "java-array.h"
#include <cni.h>
#include <jvm.h>
+#include <java-signal.h>
#include <java/lang/Class.h>
#include <java/lang/Runtime.h>
@@ -30,6 +28,7 @@ details. */
#include <java/lang/ThreadGroup.h>
#include <java/lang/FirstThread.h>
#include <java/lang/ArrayIndexOutOfBoundsException.h>
+#include <java/lang/ArithmeticException.h>
#include <java/lang/ClassFormatError.h>
#include <java/lang/ClassCastException.h>
#include <java/lang/NegativeArraySizeException.h>
@@ -40,6 +39,10 @@ details. */
#include <java/lang/reflect/Modifier.h>
#include <java/io/PrintStream.h>
+#ifdef USE_LTDL
+#include <ltdl.h>
+#endif
+
#define ObjectClass _CL_Q34java4lang6Object
extern java::lang::Class ObjectClass;
@@ -52,6 +55,30 @@ static java::lang::OutOfMemoryError *no_memory;
+#ifdef HANDLE_SEGV
+static java::lang::NullPointerException *nullp;
+SIGNAL_HANDLER (catch_segv)
+{
+ MAKE_THROW_FRAME;
+ _Jv_Throw (nullp);
+}
+#endif
+
+#ifdef HANDLE_FPE
+static java::lang::ArithmeticException *arithexception;
+SIGNAL_HANDLER (catch_fpe)
+{
+#ifdef HANDLE_DIVIDE_OVERFLOW
+ HANDLE_DIVIDE_OVERFLOW;
+#else
+ MAKE_THROW_FRAME;
+#endif
+ _Jv_Throw (arithexception);
+}
+#endif
+
+
+
jboolean
_Jv_equalUtf8Consts (Utf8Const* a, Utf8Const *b)
{
@@ -74,7 +101,7 @@ _Jv_equalUtf8Consts (Utf8Const* a, Utf8Const *b)
}
/* True iff A is equal to STR.
- HASH is STR->hashCode().
+ HASH is STR->hashCode().
*/
jboolean
@@ -426,20 +453,6 @@ _Jv_NewMultiArray (jclass array_type, jint dimensions, ...)
-#ifdef HANDLE_SEGV
-
-static java::lang::NullPointerException *nullp;
-
-static void
-catch_segv (int)
-{
- // Don't run `new' in a signal handler, so we always throw the same
- // null pointer exception.
- _Jv_Throw (nullp);
-}
-
-#endif /* HANDLE_SEGV */
-
class _Jv_PrimClass : public java::lang::Class
{
public:
@@ -560,18 +573,15 @@ static java::lang::Thread *main_thread;
void
JvRunMain (jclass klass, int argc, const char **argv)
{
-#ifdef HANDLE_SEGV
- nullp = new java::lang::NullPointerException ();
-
- struct sigaction act;
- act.sa_handler = catch_segv;
- sigemptyset (&act.sa_mask);
- act.sa_flags = 0;
- sigaction (SIGSEGV, &act, NULL);
-#endif
+ INIT_SEGV;
+ INIT_FPE;
no_memory = new java::lang::OutOfMemoryError;
+#ifdef USE_LTDL
+ LTDL_SET_PRELOADED_SYMBOLS ();
+#endif
+
arg_vec = JvConvertArgv (argc - 1, argv + 1);
main_group = new java::lang::ThreadGroup (23);
main_thread = new java::lang::FirstThread (main_group, klass, arg_vec);
diff --git a/libjava/testsuite/ChangeLog b/libjava/testsuite/ChangeLog
index d7559a238b8..e2a3b743b50 100644
--- a/libjava/testsuite/ChangeLog
+++ b/libjava/testsuite/ChangeLog
@@ -1,3 +1,116 @@
+1999-07-31 Alexandre Oliva <oliva@dcc.unicamp.br>
+
+ * lib/libjava.exp (bytecompile_file): Use `env(SUN_JAVAC)', that
+ defaults to javac, as Sun-javac compiler or compatible.
+ (libjava_init): Get GCJ from environment if neither GCJ_UNDER_TEST
+ nor TOOL_EXECUTABLE are set. Set `original_ld_library_path' from
+ environment.
+ (libjava_arguments): Prepend `.' and `$srcdir/$subdir' to
+ CLASSPATH, for `support' sources. Search for libgcj.spec in
+ `$objdir/..', by adding -B to GCJ_UNDER_TEST. Append
+ original_ld_library_path to ld_library_path.
+ * libjava.mauve/mauve.exp (test_mauve): Set `env(GCJ)' from
+ GCJ_UNDER_TEST, calculated just like in libjava.exp.
+
+1999-07-06 Tom Tromey <tromey@cygnus.com>
+
+ * libjava.lang/Final.xfail: Output fails, not exec.
+
+ * libjava.lang/Throw_1.xfail: New file.
+ * libjava.lang/Invoke_2.xfail: New file.
+ * libjava.lang/Shazam.xfail: New file.
+
+ * libjava.lang/Final.xfail: New file.
+ * libjava.compile/Case.xfail: New file.
+ * libjava.compile/Where.xfail: New file.
+ * libjava.compile/test.exp: Look for `.xfail' files.
+ * libjava.lang/test.exp: Don't look for `.arg' files.
+ Do look for `.xfail' files.
+ * lib/libjava.exp (test_libjava_from_source): Changed meaning of
+ `exec_args' argument. Handle `xfail-*' arguments.
+ (test_libjava_from_javac): Likewise.
+ (test_libjava): Likewise.
+ (libjava_read_xfail): New proc.
+
+1999-07-05 Bryce McKinlay <bryce@albatross.co.nz>
+
+ * libjava.lang/Final.java: Added.
+ * libjava.lang/Final.out: Added.
+
+1999-07-02 Tom Tromey <tromey@cygnus.com>
+
+ * libjava.lang/Finalize_1.out: Removed.
+ * libjava.lang/Finalize_1.java: Removed.
+
+ * libjava.lang/Thread_1.out: Updated.
+ * libjava.lang/Thread_1.java: Don't run exit test.
+
+Thu Jul 1 16:22:19 1999 Anthony Green <green@cygnus.com>
+
+ * libjava.mauve/mauve.exp: Don't stop counting test results
+ prematurely.
+
+1999-06-25 Tom Tromey <tromey@cygnus.com>
+
+ * lib/libjava.exp (test_libjava_from_javac): Fixed typo. Always
+ make class_files a list.
+
+ * lib/libjava.exp (test_libjava_from_javac): Prepend `$objdir/' to
+ class file names.
+
+1999-06-24 Tom Tromey <tromey@cygnus.com>
+
+ * lib/libjava.exp (libjava_arguments): If `libtool' not found in
+ build tree, just use $GCJ_UNDER_TEST as compiler.
+
+1999-06-23 Tom Tromey <tromey@cygnus.com>
+
+ * lib/libjava.exp (libjava_arguments): Handle -lzgcj.
+
+1999-05-24 Anthony Green <green@cygnus.com>
+
+ * libjava.lang/Shazam.java: New file.
+ libjava.lang/Shazam.out: New file.
+
+1999-05-12 Andrew Haley <aph@cygnus.com>
+
+ * libjava.lang/Invoke_2.java: New file.
+
+1999-05-03 Tom Tromey <tromey@cygnus.com>
+
+ * lib/libjava.exp (libjava_arguments): Don't use -nodefaultlibs.
+ (libjava_find_lib): Add `-L' option to find the actual library.
+
+ * libjava.mauve/mauve.exp (test_mauve): Pass `link' to
+ libjava_arguments when linking.
+ (test_mauve_sim): Likewise.
+ * lib/libjava.exp (libjava_arguments): Run `libtool' to link.
+ Don't use `-static'. Added `mode' argument. Use -nodefaultlibs
+ when linking.
+ (test_libjava_from_source): Mention why target_compile failed.
+ Pass `link' to libjava_arguments when linking. Only do `xfails'
+ for tests we would actually have run.
+ (test_libjava_from_javac): Likewise.
+ (libjava_find_lib): Return name of `.la' file.
+
+1999-04-26 Tom Tromey <tromey@cygnus.com>
+
+ * lib/libjava.exp (libjava_find_lib): New proc.
+ (libjava_arguments): Use it. Force static linking.
+
+Thu Apr 22 14:19:35 1999 Anthony Green <green@cygnus.com>
+
+ * libjava.compile/OperatorBenchmark.java: New file.
+
+1999-04-09 Warren Levy <warrenl@cygnus.com>
+
+ * libjava.mauve/mauve.exp (KEYS): Default to libgcj.
+
+1999-04-09 Tom Tromey <tromey@cygnus.com>
+
+ * libjava.compile/plusplus.java: New file.
+ From MoT <Sebastien.Villemot@ens.fr>.
+
1999-04-06 Tom Tromey <tromey@cygnus.com>
* libjava.mauve/mauve.exp (test_mauve_sim): Reference
diff --git a/libjava/testsuite/Makefile.in b/libjava/testsuite/Makefile.in
index 764c148a3ca..ca6352e7e3e 100644
--- a/libjava/testsuite/Makefile.in
+++ b/libjava/testsuite/Makefile.in
@@ -71,25 +71,39 @@ COMPPATH = @COMPPATH@
CPP = @CPP@
CXX = @CXX@
CXXCPP = @CXXCPP@
+DLLTOOL = @DLLTOOL@
EH_COMMON_INCLUDE = @EH_COMMON_INCLUDE@
EXEEXT = @EXEEXT@
GCDEPS = @GCDEPS@
GCINCS = @GCINCS@
GCLIBS = @GCLIBS@
GCOBJS = @GCOBJS@
+GCSPEC = @GCSPEC@
+JCFLAGS = @JCFLAGS@
+LD = @LD@
LIBGCJ_CFLAGS = @LIBGCJ_CFLAGS@
LIBGCJ_CXXFLAGS = @LIBGCJ_CXXFLAGS@
LIBGCJ_JAVAFLAGS = @LIBGCJ_JAVAFLAGS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
MAINT = @MAINT@
MAKEINFO = @MAKEINFO@
+NM = @NM@
PACKAGE = @PACKAGE@
PERL = @PERL@
RANLIB = @RANLIB@
+SYSTEMSPEC = @SYSTEMSPEC@
THREADDEPS = @THREADDEPS@
THREADINCS = @THREADINCS@
THREADLIBS = @THREADLIBS@
THREADOBJS = @THREADOBJS@
+THREADSPEC = @THREADSPEC@
+USE_SYMBOL_UNDERSCORE = @USE_SYMBOL_UNDERSCORE@
VERSION = @VERSION@
+ZDEPS = @ZDEPS@
+ZINCS = @ZINCS@
+ZLIBS = @ZLIBS@
+ZLIBSPEC = @ZLIBSPEC@
here = @here@
libgcj_basedir = @libgcj_basedir@
@@ -229,6 +243,7 @@ clean-am: clean-generic mostlyclean-am
clean: clean-am
distclean-am: distclean-generic clean-am
+ -rm -f libtool
distclean: distclean-am
diff --git a/libjava/testsuite/lib/libjava.exp b/libjava/testsuite/lib/libjava.exp
index 9c8b36d19a9..73404dd0acb 100644
--- a/libjava/testsuite/lib/libjava.exp
+++ b/libjava/testsuite/lib/libjava.exp
@@ -10,6 +10,17 @@ if ![info exists tmpdir] {
set tmpdir "/tmp"
}
+# Read an `xfail' file if it exists. Returns a list of xfail tokens.
+proc libjava_read_xfail {file} {
+ if {! [file exists $file]} {
+ return ""
+ }
+ set fd [open $file r]
+ set tokens [string trim [read $fd]]
+ close $fd
+ return $tokens
+}
+
# Find `jv-scan'. FIXME: this relies on DejaGnu internals. These
# should probably be exposed in a better way.
proc find_jvscan {} {
@@ -27,13 +38,30 @@ proc find_jvscan {} {
proc bytecompile_file { file objdir {classpath {}} } {
global env
+ global SUN_JAVAC
set dirname [file dirname $file];
+ # If JDK doesn't run on your platform but some other
+ # JDK-compatible javac does, you may set SUN_JAVAC to point to it.
+ # One of the most important properties of a SUN_JAVAC is that it
+ # must create class-files even for classes that have not been
+ # specified in the command line, but that were needed to compile
+ # those that have. For example, Pizza won't do it, but you can
+ # use `kaffe sun.tools.javac.Main', if you have Sun's classes.zip
+ # in the kaffe's default search path.
+ if ![info exists SUN_JAVAC] {
+ if [info exists env(SUN_JAVAC)] {
+ set SUN_JAVAC $env(SUN_JAVAC)
+ } else {
+ set SUN_JAVAC "javac"
+ }
+ }
+
catch {unset env(CLASSPATH)}
if {$classpath != ""} then {
set env(CLASSPATH) $classpath
}
- if {[catch {system "cd $dirname; javac $file -d $objdir"} msg]} then {
+ if {[catch {system "cd $dirname; $SUN_JAVAC $file -d $objdir"} msg]} then {
verbose "couldn't compile $file: $msg"
set r 0
} else {
@@ -53,6 +81,8 @@ proc libjava_init { args } {
global libjava_initialized
global GCJ_UNDER_TEST
global TOOL_EXECUTABLE
+ global original_ld_library_path
+ global env
if { $libjava_initialized == 1 } { return; }
@@ -60,7 +90,21 @@ proc libjava_init { args } {
if [info exists TOOL_EXECUTABLE] {
set GCJ_UNDER_TEST $TOOL_EXECUTABLE;
} else {
- set GCJ_UNDER_TEST "[find_gcj]"
+ if [info exists env(GCJ)] {
+ set GCJ_UNDER_TEST $env(GCJ)
+ } else {
+ set GCJ_UNDER_TEST "[find_gcj]"
+ }
+ }
+ }
+
+ if [info exists env(LD_LIBRARY_PATH)] {
+ set original_ld_library_path $env(LD_LIBRARY_PATH)
+ } else {
+ if [info exists env(SHLIB_PATH)] {
+ set original_ld_library_path $env(SHLIB_PATH)
+ } else {
+ set original_ld_library_path ""
}
}
@@ -79,61 +123,69 @@ proc libjava_init { args } {
set libjava_initialized 1
}
-# Compute arguments needed for compiler.
-proc libjava_arguments {} {
+# Find a library. We know where libtool puts the actual libraries,
+# and we look there. The implementation is fairly hacky. We can't
+# compile with -nodefaultlibs, because that will also eliminate the
+# system libraries we need. In order to have gcj still work, it must
+# find the appropriate libraries so we must add -L options for their
+# paths. However we can't simply use those libraries; we still need
+# libtool for linking.
+proc libjava_find_lib {dir name} {
+ global base_dir
+ set gp [get_multilibs]
+ foreach sub {.libs _libs} {
+ if {$gp != ""} {
+ if {[file exists $gp/$dir/$sub/lib${name}.a]} then {
+ return "$gp/$dir/lib${name}.la -L$gp/$dir/$sub"
+ }
+ }
+ set lib [findfile $base_dir/../../$dir/$sub/lib${name}.a \
+ "$base_dir/../../$dir/lib${name}.la -L$base_dir/../../$dir/$sub" \
+ ""]
+ if {$lib != ""} {
+ return $lib
+ }
+ }
+ return ""
+}
+
+# Compute arguments needed for compiler. MODE is a libtool mode:
+# either compile or link.
+proc libjava_arguments {{mode compile}} {
global base_dir
global LIBJAVA
global LIBGC
+ global LIBQTHREADS
+ global LIBZ
global srcdir subdir objdir
global TOOL_OPTIONS
global GCJ_UNDER_TEST
global tmpdir
global runtests
+ global env
if [info exists LIBJAVA] {
set libjava $LIBJAVA;
} else {
- set gp [get_multilibs];
- if { $gp != "" } {
- if [file exists "$gp/libjava/libgcj.a"] {
- set libjava "-L$gp/libjava -lgcj";
- }
- }
- if ![info exists libjava] {
- set libjava [findfile $base_dir/../../libjava/libgcj.a "-L$base_dir/../../libjava -lgcj" -lgcj]
- }
+ set libjava [libjava_find_lib libjava gcj]
}
if [info exists LIBGC] {
set libgc $LIBGC;
} else {
- set gp [get_multilibs];
- if { $gp != "" } {
- if [file exists "$gp/boehm-gc/libgcjgc.a"] {
- set libgc "-L$gp/boehm-gc -lgcjgc";
- }
- }
- if ![info exists libgc] {
- set libgc [findfile $base_dir/../../boehm-gc/libgcjgc.a \
- "-L$base_dir/../../boehm-gc -lgcjgc" \
- {}]
- }
+ set libgc [libjava_find_lib boehm-gc gcjgc]
}
if [info exists LIBQTHREADS] {
set libqthreads $LIBQTHREADS
} else {
- set gp [get_multilibs]
- if { $gp != "" } {
- if [file exists "$gp/qthreads/libgcjcoop.a"] {
- set libqthreads "-L$gp/qthreads -lgcjcoop";
- }
- }
- if ![info exists libqthreads] {
- set libqthreads [findfile $base_dir/../../qthreads/libgcjcoop.a \
- "-L$base_dir/../../qthreads -lgcjcoop" \
- {}]
- }
+ set libqthreads [libjava_find_lib qthreads gcjcoop]
+ }
+
+ if [info exists LIBZ] {
+ set libz $LIBZ
+ } else {
+ set libz [libjava_find_lib zlib zgcj]
}
# FIXME: there's no way to determine whether -lpthread is
@@ -143,6 +195,7 @@ proc libjava_arguments {} {
verbose "using LIBJAVA = $libjava" 2
verbose "using LIBGC = $libgc" 2
verbose "using LIBQTHREADS = $libqthreads" 2
+ verbose "using LIBZ = $libz" 2
set args ""
# Basically we want to build up a colon separated path list from
@@ -165,13 +218,14 @@ proc libjava_arguments {} {
# then we'd have to do a lot more work.
# Set variables the dynamic linker looks at.
- setenv LD_LIBRARY_PATH $ld_library_path
- setenv SHLIB_PATH $ld_library_path
+ global original_ld_library_path
+ setenv LD_LIBRARY_PATH "$ld_library_path:$original_ld_library_path"
+ setenv SHLIB_PATH "$ld_library_path:$original_ld_library_path"
# Set the CLASSPATH environment variable
- verbose "CLASSPATH is $objdir/.."
+ verbose "CLASSPATH is .:$srcdir/$subdir:$objdir/..:$objdir/../libgcj.zip"
global env
- set env(CLASSPATH) "$objdir/.."
+ set env(CLASSPATH) ".:$srcdir/$subdir:$objdir/..:$objdir/../libgcj.zip"
global wrapper_file wrap_compile_flags;
lappend args "additional_flags=$wrap_compile_flags";
@@ -179,6 +233,7 @@ proc libjava_arguments {} {
lappend args "libs=$libjava";
lappend args "libs=$libgc";
lappend args "libs=$libqthreads"
+ lappend args "libs=$libz"
lappend args debug
if { [target_info needs_status_wrapper]!="" && [info exists gluefile] } {
@@ -189,7 +244,24 @@ proc libjava_arguments {} {
if [info exists TOOL_OPTIONS] {
lappend args "additional_flags=$TOOL_OPTIONS"
}
- lappend args "compiler=$GCJ_UNDER_TEST"
+
+ # Search for libtool. We need it to link.
+ set found_compiler 0
+ set d [absolute $objdir]
+ foreach x {. .. ../.. ../../..} {
+ if {[file exists $d/$x/libtool]} then {
+ # We have to run silently to avoid DejaGNU lossage.
+ lappend args \
+ "compiler=$d/$x/libtool --silent --mode=$mode $GCJ_UNDER_TEST -B$objdir/../"
+ set found_compiler 1
+ break
+ }
+ }
+ if {! $found_compiler} {
+ # Append -B$objdir/../ so that we find libgcj.spec before it
+ # is installed.
+ lappend args "compiler=$GCJ_UNDER_TEST -B$objdir/../"
+ }
return $args
}
@@ -197,8 +269,15 @@ proc libjava_arguments {} {
#
# Run the test specified by srcfile and resultfile. compile_args and
-# exec_args are additional arguments to be passed in when compiling and
-# running the testcase, respectively.
+# exec_args are options telling this proc how to work.
+# `no-exec' don't try to run the test
+# `xfail-gcj' compilation from source will fail
+# `xfail-javac' compilation with javac will fail
+# `xfail-gcjC' compilation with gcj -C will fail
+# `xfail-byte' compilation from bytecode will fail
+# `xfail-exec' exec will fail
+# `xfail-output' output will be wrong
+#
#
proc test_libjava_from_source { options srcfile compile_args inpfile resultfile exec_args } {
global base_dir
@@ -210,12 +289,19 @@ proc test_libjava_from_source { options srcfile compile_args inpfile resultfile
global tmpdir
global runtests
+ # Make opts into an array.
+ set opts(_) x
+ unset opts(_)
+ foreach item $exec_args {
+ set opts($item) x
+ }
+
set errname [file rootname [file tail $srcfile]]
if {! [runtest_file_p $runtests $errname]} {
return
}
- set args [libjava_arguments]
+ set args [libjava_arguments link]
# Add the --main flag
lappend args "additional_flags=--main=[file rootname [file tail $srcfile]]"
if { $compile_args != "" } {
@@ -228,27 +314,37 @@ proc test_libjava_from_source { options srcfile compile_args inpfile resultfile
set errname "$errname $compile_args"
}
- if { [target_compile $srcfile "$executable" executable $args] != "" } {
+ set x [target_compile $srcfile "$executable" executable $args]
+ if {[info exists opts(xfail-gcj)]} {
+ setup_xfail *-*-*
+ }
+ if { $x != "" } {
+ verbose "target_compile failed: $x" 2
fail "$errname compilation from source"
- setup_xfail "*-*-*"
- fail "$errname execution from source compiled test"
- setup_xfail "*-*-*"
- fail "$errname output from source compiled test"
+ if {[info exists opts(xfail-gcj)] || ! [info exists opts(no-exec)]} {
+ setup_xfail "*-*-*"
+ fail "$errname execution from source compiled test"
+ setup_xfail "*-*-*"
+ fail "$errname output from source compiled test"
+ }
return;
}
pass "$errname compilation from source"
- if { $exec_args == "no-exec" } {
+ if {[info exists opts(no-exec)]} {
return
}
- set result [libjava_load $executable "$exec_args" "$inpfile"];
+ set result [libjava_load $executable "" "$inpfile"];
set status [lindex $result 0];
set output [lindex $result 1];
+ if {[info exists opts(xfail-exec)]} then {
+ setup_xfail *-*-*
+ }
$status "$errname execution from source compiled test"
if { $status != "pass" } {
setup_xfail "*-*-*"
- fail "$errname output from source compiled test"
+ fail "$errname execution from source compiled test"
return;
}
@@ -277,6 +373,9 @@ proc test_libjava_from_source { options srcfile compile_args inpfile resultfile
set passed 1;
}
}
+ if {[info exists opts(xfail-output)]} {
+ setup_xfail *-*-*
+ }
if { $passed == 1 } {
pass "$errname output from source compiled test"
} else {
@@ -289,8 +388,14 @@ proc test_libjava_from_source { options srcfile compile_args inpfile resultfile
#
# Run the test specified by srcfile and resultfile. compile_args and
-# exec_args are additional arguments to be passed in when compiling and
-# running the testcase, respectively.
+# exec_args are options telling this proc how to work.
+# `no-exec' don't try to run the test
+# `xfail-gcj' compilation from source will fail
+# `xfail-javac' compilation with javac will fail
+# `xfail-gcjC' compilation with gcj -C will fail
+# `xfail-byte' compilation from bytecode will fail
+# `xfail-exec' exec will fail
+# `xfail-output' output will be wrong
#
proc test_libjava_from_javac { options srcfile compile_args inpfile resultfile exec_args } {
global base_dir
@@ -302,6 +407,13 @@ proc test_libjava_from_javac { options srcfile compile_args inpfile resultfile e
global tmpdir
global runtests
+ # Make opts into an array.
+ set opts(_) x
+ unset opts(_)
+ foreach item $exec_args {
+ set opts($item) x
+ }
+
set errname [file rootname [file tail $srcfile]]
if {! [runtest_file_p $runtests $errname]} {
return
@@ -309,14 +421,21 @@ proc test_libjava_from_javac { options srcfile compile_args inpfile resultfile e
# bytecompile files with Sun's compiler for now.
set bc_ok [bytecompile_file $srcfile $objdir]
+ # FIXME: assumes we are using javac to compile to bytecode.
+ # This is not always the case.
+ if {[info exists opts(xfail-javac)]} {
+ setup_xfail *-*-*
+ }
if {! $bc_ok} then {
fail "$errname byte compilation"
setup_xfail "*-*-*"
fail "$errname compilation from bytecode"
- setup_xfail "*-*-*"
- fail "$errname execution from bytecode->native test"
- setup_xfail "*-*-*"
- fail "$errname output from bytecode->native test"
+ if {! [info exists opts(no-exec)]} {
+ setup_xfail "*-*-*"
+ fail "$errname execution from bytecode->native test"
+ setup_xfail "*-*-*"
+ fail "$errname output from bytecode->native test"
+ }
return
}
pass "$errname byte compilation"
@@ -336,31 +455,39 @@ proc test_libjava_from_javac { options srcfile compile_args inpfile resultfile e
# nothing if the file contains an interface and not a class. I
# believe this is a jv-scan bug.
if {$class_out == ""} then {
- set class_files [file rootname [file tail $srcfile]].class
+ set class_files \
+ [list $objdir/[file rootname [file tail $srcfile]].class]
} else {
# Turn "a b" into "a.class b.class".
- set class_files [join [split [string trim $class_out]] ".class "].class
+ set class_files {}
+ foreach file [split [string trim $class_out]] {
+ lappend class_files $objdir/$file.class
+ }
}
- # Initial arguments.
- set args [libjava_arguments]
-
# Usually it is an error for a test program not to have a `main'
# method. However, for no-exec tests it is ok.
+ set largs {}
if {$main_name == ""} {
- if {$exec_args != "no-exec"} {
+ if {! [info exists opts(no-exec)]} {
perror "No `main' given in program $errname"
return
} else {
set type object
set executable [file rootname [file tail $srcfile]].o
+ set mode compile
}
} else {
set type executable
- lappend args "additional_flags=--main=$main_name"
+ lappend largs "additional_flags=--main=$main_name"
set executable "${objdir}/$main_name"
+ set mode link
}
+ # Initial arguments.
+ set args [libjava_arguments $mode]
+ eval lappend args $largs
+
if { $compile_args != "" } {
lappend args "additional_flags=$compile_args"
}
@@ -369,10 +496,16 @@ proc test_libjava_from_javac { options srcfile compile_args inpfile resultfile e
set errname "$errname $compile_args"
}
- if { [target_compile $class_files "$executable" $type $args] != "" } {
+ verbose "compilation command = $args" 2
+ set x [target_compile $class_files "$executable" $type $args]
+ if {[info exists opts(xfail-byte)]} {
+ setup_xfail *-*-*
+ }
+ if { $x != "" } {
+ verbose "target_compile failed: $x" 2
fail "$errname compilation from bytecode"
setup_xfail "*-*-*"
- if {$exec_args != "no-exec"} {
+ if {! [info exists opts(no-exec)]} {
fail "$errname execution from bytecode->native test"
setup_xfail "*-*-*"
fail "$errname output from bytecode->native test"
@@ -381,13 +514,16 @@ proc test_libjava_from_javac { options srcfile compile_args inpfile resultfile e
}
pass "$errname compilation from bytecode"
- if { $exec_args == "no-exec" } {
+ if {[info exists opts(no-exec)]} {
return
}
- set result [libjava_load $executable "$exec_args" "$inpfile"];
+ set result [libjava_load $executable "" "$inpfile"];
set status [lindex $result 0];
set output [lindex $result 1];
+ if {[info exists opts(xfail-exec)]} {
+ setup_xfail *-*-*
+ }
$status "$errname execution from bytecode->native test"
if { $status != "pass" } {
setup_xfail "*-*-*"
@@ -411,6 +547,9 @@ proc test_libjava_from_javac { options srcfile compile_args inpfile resultfile e
verbose "expected is $expected"
verbose "actual is $output"
set passed 0;
+ if {[info exists opts(xfail-output)]} {
+ setup_xfail *-*-*
+ }
if {$options == "regexp_match"} {
if [regexp $expected $output] {
set passed 1;
@@ -432,8 +571,14 @@ proc test_libjava_from_javac { options srcfile compile_args inpfile resultfile e
#
# Run the test specified by srcfile and resultfile. compile_args and
-# exec_args are additional arguments to be passed in when compiling and
-# running the testcase, respectively.
+# exec_args are options telling this proc how to work.
+# `no-exec' don't try to run the test
+# `xfail-gcj' compilation from source will fail
+# `xfail-javac' compilation with javac will fail
+# `xfail-gcjC' compilation with gcj -C will fail
+# `xfail-byte' compilation from bytecode will fail
+# `xfail-exec' exec will fail
+# `xfail-output' output will be wrong
#
proc test_libjava { options srcfile compile_args inpfile resultfile exec_args } {
test_libjava_from_source $options $srcfile $compile_args $inpfile $resultfile $exec_args
@@ -448,3 +593,7 @@ proc default_libjava_version {} {
proc default_libjava_start { } {
}
+
+# Local Variables:
+# tcl-indent-level:4
+# End:
diff --git a/libjava/testsuite/libjava.compile/Case.xfail b/libjava/testsuite/libjava.compile/Case.xfail
new file mode 100644
index 00000000000..755ab8794df
--- /dev/null
+++ b/libjava/testsuite/libjava.compile/Case.xfail
@@ -0,0 +1 @@
+xfail-gcj
diff --git a/libjava/testsuite/libjava.compile/OperatorBenchmark.java b/libjava/testsuite/libjava.compile/OperatorBenchmark.java
new file mode 100644
index 00000000000..03f660d848d
--- /dev/null
+++ b/libjava/testsuite/libjava.compile/OperatorBenchmark.java
@@ -0,0 +1,886 @@
+
+/*
+ * Copyright (c) 1996, 1997 by Doug Bell <dbell@shvn.com>. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+// This file has been hacked to compile without the rest of the
+// benchmark code.
+
+class OperatorBenchmark {
+
+ public int getSampleCount() { return 0; }
+ public int getSampleMillis() { return 0; }
+ public boolean go;
+ public int useint[];
+ public void startTest () { }
+ public long finishTest () { return 0; }
+ public void startTimer (boolean b) { }
+ public void stopTimer (int a, int b) { }
+ public void report (String s) { }
+ public void println (String s) { }
+
+ public int getTestTime () {
+ return (int) (100 * getSampleCount() * getSampleMillis()) / 1000;
+ }
+
+ public int getRunningTime () {
+ return (int) (1.1 * getTestTime());
+ }
+
+ public long runTest () {
+ int dummy1 = 0, dummy2 = 0, dummy3 = 0; // occupy implicit index slots
+ int cnt, ii;
+ byte b1 = 1, b2 = 2, b3 = 3;
+ short s1 = 1, s2 = 2, s3 = 3;
+ int i1 = 1, i2 = 2, i3 = 3;
+ long l1 = 1, l2 = 2, l3 = 3;
+ float f1 = 1, f2 = 2, f3 = 3;
+ double d1 = 1, d2 = 2, d3 = 3;
+
+ startTest();
+
+ println("--- byte operators, local vars");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ b1++;
+ stopTimer(cnt, ii);
+ }
+ report("byte++");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ b1 += b2;
+ stopTimer(cnt, ii);
+ }
+ report("byte += byte");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ b1 = (byte) (b2 + b3);
+ stopTimer(cnt, ii);
+ }
+ report("byte = byte + byte");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ b1 *= b2;
+ stopTimer(cnt, ii);
+ }
+ report("byte *= byte");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ b1 = (byte) (b2 * b3);
+ stopTimer(cnt, ii);
+ }
+ report("byte = byte * byte");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ b1 *= 2;
+ stopTimer(cnt, ii);
+ }
+ report("byte *= 2");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ b1 <<= 1;
+ stopTimer(cnt, ii);
+ }
+ report("byte <<= 1");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ b1 %= b2;
+ stopTimer(cnt, ii);
+ }
+ report("byte %= byte");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ b1 = (byte) (b2 % b3);
+ stopTimer(cnt, ii);
+ }
+ report("byte = byte % byte");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ b1 /= b2;
+ stopTimer(cnt, ii);
+ }
+ report("byte /= byte");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ b1 = (byte) (b2 / b3);
+ stopTimer(cnt, ii);
+ }
+ report("byte = byte / byte");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ b1 /= 2;
+ stopTimer(cnt, ii);
+ }
+ report("byte /= 2");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ b1 >>= 1;
+ stopTimer(cnt, ii);
+ }
+ report("byte >>= 1");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ b1 >>= i2;
+ stopTimer(cnt, ii);
+ }
+ report("byte >>= int");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ b1 = (byte) (b2 >> i3);
+ stopTimer(cnt, ii);
+ }
+ report("byte = byte >> int");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ b1 |= b2;
+ stopTimer(cnt, ii);
+ }
+ report("byte |= byte");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ b1 = (byte) (b2 | b3);
+ stopTimer(cnt, ii);
+ }
+ report("byte = byte | byte");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ b1 &= b2;
+ stopTimer(cnt, ii);
+ }
+ report("byte &= byte");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ b1 = (byte) (b2 & b3);
+ stopTimer(cnt, ii);
+ }
+ report("byte = byte & byte");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ b1 ^= b2;
+ stopTimer(cnt, ii);
+ }
+ report("byte ^= byte");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ b1 = (byte) (b2 ^ b3);
+ stopTimer(cnt, ii);
+ }
+ report("byte = byte ^ byte");
+
+
+ println("--- short operators, local vars");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ s1++;
+ stopTimer(cnt, ii);
+ }
+ report("short++");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ s1 += s2;
+ stopTimer(cnt, ii);
+ }
+ report("short += short");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ s1 = (short) (s2 + s3);
+ stopTimer(cnt, ii);
+ }
+ report("short = short + short");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ s1 *= s2;
+ stopTimer(cnt, ii);
+ }
+ report("short *= short");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ s1 = (short) (s2 * s3);
+ stopTimer(cnt, ii);
+ }
+ report("short = short * short");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ s1 *= 2;
+ stopTimer(cnt, ii);
+ }
+ report("short *= 2");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ s1 <<= 1;
+ stopTimer(cnt, ii);
+ }
+ report("short <<= 1");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ s1 %= s2;
+ stopTimer(cnt, ii);
+ }
+ report("short %= short");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ s1 = (short) (s2 % s3);
+ stopTimer(cnt, ii);
+ }
+ report("short = short % short");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ s1 /= s2;
+ stopTimer(cnt, ii);
+ }
+ report("short /= short");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ s1 = (short) (s2 / s3);
+ stopTimer(cnt, ii);
+ }
+ report("short = short / short");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ s1 /= 2;
+ stopTimer(cnt, ii);
+ }
+ report("short /= 2");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ s1 >>= 1;
+ stopTimer(cnt, ii);
+ }
+ report("short >>= 1");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ s1 >>= i2;
+ stopTimer(cnt, ii);
+ }
+ report("short >>= int");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ s1 = (short) (s2 >> i3);
+ stopTimer(cnt, ii);
+ }
+ report("short = short >> int");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ s1 |= s2;
+ stopTimer(cnt, ii);
+ }
+ report("short |= short");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ s1 = (short) (s2 | s3);
+ stopTimer(cnt, ii);
+ }
+ report("short = short | short");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ s1 &= s2;
+ stopTimer(cnt, ii);
+ }
+ report("short &= short");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ s1 = (short) (s2 & s3);
+ stopTimer(cnt, ii);
+ }
+ report("short = short & short");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ s1 ^= s2;
+ stopTimer(cnt, ii);
+ }
+ report("short ^= short");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ s1 = (short) (s2 ^ s3);
+ stopTimer(cnt, ii);
+ }
+ report("short = short ^ short");
+
+
+ println("--- int operators, local vars");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ i1++;
+ stopTimer(cnt, ii);
+ }
+ report("int++");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ i1 += i2;
+ stopTimer(cnt, ii);
+ }
+ report("int += int");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ i1 = (i2 + i3);
+ stopTimer(cnt, ii);
+ }
+ report("int = int + int");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ i1 *= i2;
+ stopTimer(cnt, ii);
+ }
+ report("int *= int");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ i1 = (i2 * i3);
+ stopTimer(cnt, ii);
+ }
+ report("int = int * int");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ i1 *= 2;
+ stopTimer(cnt, ii);
+ }
+ report("int *= 2");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ i1 <<= 1;
+ stopTimer(cnt, ii);
+ }
+ report("int <<= 1");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ i1 %= i2;
+ stopTimer(cnt, ii);
+ }
+ report("int %= int");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ i1 = (i2 % i3);
+ stopTimer(cnt, ii);
+ }
+ report("int = int % int");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ i1 /= i2;
+ stopTimer(cnt, ii);
+ }
+ report("int /= int");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ i1 = (i2 / i3);
+ stopTimer(cnt, ii);
+ }
+ report("int = int / int");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ i1 /= 2;
+ stopTimer(cnt, ii);
+ }
+ report("int /= 2");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ i1 >>= 1;
+ stopTimer(cnt, ii);
+ }
+ report("int >>= 1");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ i1 >>= i2;
+ stopTimer(cnt, ii);
+ }
+ report("int >>= int");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ i1 = i2 >> i3;
+ stopTimer(cnt, ii);
+ }
+ report("int = int >> int");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ i1 |= i2;
+ stopTimer(cnt, ii);
+ }
+ report("int |= int");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ i1 = i2 | i3;
+ stopTimer(cnt, ii);
+ }
+ report("int = int | int");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ i1 &= i2;
+ stopTimer(cnt, ii);
+ }
+ report("int &= int");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ i1 = i2 & i3;
+ stopTimer(cnt, ii);
+ }
+ report("int = int & int");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ i1 ^= i2;
+ stopTimer(cnt, ii);
+ }
+ report("int ^= int");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ i1 = i2 ^ i3;
+ stopTimer(cnt, ii);
+ }
+ report("int = int ^ int");
+
+
+ println("--- long operators, local vars");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ l1++;
+ stopTimer(cnt, ii);
+ }
+ report("long++");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ l1 += l2;
+ stopTimer(cnt, ii);
+ }
+ report("long += long");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ l1 = (l2 + l3);
+ stopTimer(cnt, ii);
+ }
+ report("long = long + long");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ l1 *= l2;
+ stopTimer(cnt, ii);
+ }
+ report("long *= long");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ l1 = (l2 * l3);
+ stopTimer(cnt, ii);
+ }
+ report("long = long * long");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ l1 *= 2;
+ stopTimer(cnt, ii);
+ }
+ report("long *= 2");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ l1 <<= 1;
+ stopTimer(cnt, ii);
+ }
+ report("long <<= 1");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ l1 %= l2;
+ stopTimer(cnt, ii);
+ }
+ report("long %= long");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ l1 = (l2 % l3);
+ stopTimer(cnt, ii);
+ }
+ report("long = long % long");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ l1 /= l2;
+ stopTimer(cnt, ii);
+ }
+ report("long /= long");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ l1 = (l2 / l3);
+ stopTimer(cnt, ii);
+ }
+ report("long = long / long");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ l1 /= 2;
+ stopTimer(cnt, ii);
+ }
+ report("long /= 2");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ l1 >>= 1;
+ stopTimer(cnt, ii);
+ }
+ report("long >>= 1");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ l1 >>= i2;
+ stopTimer(cnt, ii);
+ }
+ report("long >>= int");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ l1 = l2 >> i3;
+ stopTimer(cnt, ii);
+ }
+ report("long = long >> int");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ l1 |= l2;
+ stopTimer(cnt, ii);
+ }
+ report("long |= long");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ l1 = l2 | l3;
+ stopTimer(cnt, ii);
+ }
+ report("long = long | long");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ l1 &= l2;
+ stopTimer(cnt, ii);
+ }
+ report("long &= long");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ l1 = l2 & l3;
+ stopTimer(cnt, ii);
+ }
+ report("long = long & long");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ l1 ^= l2;
+ stopTimer(cnt, ii);
+ }
+ report("long ^= long");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ l1 = l2 ^ l3;
+ stopTimer(cnt, ii);
+ }
+ report("long = long ^ long");
+
+
+ println("--- float operators, local vars");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ f1 += f2;
+ stopTimer(cnt, ii);
+ }
+ report("float += float");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ f1 = (float) (f2 + f3);
+ stopTimer(cnt, ii);
+ }
+ report("float = float + float");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ f1 *= f2;
+ stopTimer(cnt, ii);
+ }
+ report("float *= float");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ f1 = (float) (f2 * f3);
+ stopTimer(cnt, ii);
+ }
+ report("float = float * float");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ f1 %= f2;
+ stopTimer(cnt, ii);
+ }
+ report("float %= float");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ f1 = (float) (f2 % f3);
+ stopTimer(cnt, ii);
+ }
+ report("float = float % float");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ f1 /= f2;
+ stopTimer(cnt, ii);
+ }
+ report("float /= float");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ f1 = (float) (f2 / f3);
+ stopTimer(cnt, ii);
+ }
+ report("float = float / float");
+
+
+ println("--- double operators, local vars");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ d1 += d2;
+ stopTimer(cnt, ii);
+ }
+ report("double += double");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ d1 = (d2 + d3);
+ stopTimer(cnt, ii);
+ }
+ report("double = double + double");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ d1 *= d2;
+ stopTimer(cnt, ii);
+ }
+ report("double *= double");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ d1 = (d2 * d3);
+ stopTimer(cnt, ii);
+ }
+ report("double = double * double");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ d1 %= d2;
+ stopTimer(cnt, ii);
+ }
+ report("double %= double");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ d1 = (d2 % d3);
+ stopTimer(cnt, ii);
+ }
+ report("double = double % double");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ d1 /= d2;
+ stopTimer(cnt, ii);
+ }
+ report("double /= double");
+
+ for (cnt = getSampleCount(); --cnt >= 0; ) {
+ startTimer(true);
+ for (ii = 0; go; ii++)
+ d1 = (d2 / d3);
+ stopTimer(cnt, ii);
+ }
+ report("double = double / double");
+
+ useint[0] = dummy1; useint[1] = dummy2; useint[2] = dummy3;
+ return finishTest();
+ }
+} // class OperatorBenchmark
+
+// EOF
diff --git a/libjava/testsuite/libjava.compile/Where.xfail b/libjava/testsuite/libjava.compile/Where.xfail
new file mode 100644
index 00000000000..755ab8794df
--- /dev/null
+++ b/libjava/testsuite/libjava.compile/Where.xfail
@@ -0,0 +1 @@
+xfail-gcj
diff --git a/libjava/testsuite/libjava.compile/plusplus.java b/libjava/testsuite/libjava.compile/plusplus.java
new file mode 100644
index 00000000000..b8e9bd9fcbb
--- /dev/null
+++ b/libjava/testsuite/libjava.compile/plusplus.java
@@ -0,0 +1,10 @@
+// Test from MoT <Sebastien.Villemot@ens.fr>.
+
+class plusplus {
+ public static void main(String[] args)
+ {
+ int n = 5;
+ int[] gnu = new int[10];
+ gnu[n]++;
+ }
+}
diff --git a/libjava/testsuite/libjava.compile/test.exp b/libjava/testsuite/libjava.compile/test.exp
index db6aef19bb3..6e1744a63c5 100644
--- a/libjava/testsuite/libjava.compile/test.exp
+++ b/libjava/testsuite/libjava.compile/test.exp
@@ -1,10 +1,9 @@
-global srcdir subdir
+ set args [libjava_read_xfail [file rootname $x].xfail]
+ lappend args no-exec
-catch "glob -nocomplain ${srcdir}/${subdir}/*.java" srcfiles
-verbose "srcfiles are $srcfiles"
+ test_libjava $options "$x" "" "" "" $args
+ test_libjava $options "$x" "-O" "" "" $args
-set prefix ""
-foreach x $srcfiles {
- test_libjava $options "$x" "" "" "" "no-exec"
- test_libjava $options "$x" "-O" "" "" "no-exec"
-}
+# Local Variables:
+# tcl-indent-level:4
+# End:
diff --git a/libjava/testsuite/libjava.lang/Array_1.xfail b/libjava/testsuite/libjava.lang/Array_1.xfail
new file mode 100644
index 00000000000..8e7b31e450f
--- /dev/null
+++ b/libjava/testsuite/libjava.lang/Array_1.xfail
@@ -0,0 +1 @@
+xfail-gcj xfail-exec
diff --git a/libjava/testsuite/libjava.lang/Divide_1.java b/libjava/testsuite/libjava.lang/Divide_1.java
new file mode 100644
index 00000000000..d4e01939aa5
--- /dev/null
+++ b/libjava/testsuite/libjava.lang/Divide_1.java
@@ -0,0 +1,105 @@
+public class Divide_1
+{
+ static int b = Integer.parseInt ("-1");
+ int b1 = Integer.parseInt ("-1");
+ static int zero = Integer.parseInt ("0");
+
+ void probe ()
+ {
+ try {
+ int a = Integer.parseInt ("-80000000", 16);
+ int c = a/b;
+ System.out.println (c);
+ } catch (Exception _) {
+ System.out.println (_);
+ }
+
+ try {
+ int a = Integer.parseInt ("-80000000", 16);
+ int c = a/-1;
+ System.out.println (c);
+ } catch (Exception _) {
+ System.out.println (_);
+ }
+
+ try {
+ int a = Integer.parseInt ("-80000000", 16);
+ int c = a%b;
+ System.out.println (c);
+ } catch (Exception _) {
+ System.out.println (_);
+ }
+
+ try {
+ int a = Integer.parseInt ("-80000000", 16);
+ int c = a%b1;
+ System.out.println (c);
+ } catch (Exception _) {
+ System.out.println (_);
+ }
+
+ try {
+ int a = Integer.parseInt ("-80000000", 16);
+ int c = a%-1;
+ System.out.println (c);
+ } catch (Exception _) {
+ System.out.println (_);
+ }
+
+ try {
+ int a = Integer.parseInt ("8000", 16);
+ int b = Integer.parseInt ("0", 16);
+ int c = a/b;
+ System.out.println (c);
+ } catch (Exception _) {
+ System.out.println (_);
+ }
+
+ try {
+ int a = Integer.parseInt ("8000", 16);
+ int b = Integer.parseInt ("0", 16);
+ int c = a%b;
+ System.out.println (c);
+ } catch (Exception _) {
+ System.out.println (_);
+ }
+
+ try {
+ long a = Long.parseLong ("-8000000000000000", 16);
+ long c = a/b;
+ System.out.println (c);
+ } catch (Exception _) {
+ System.out.println (_);
+ }
+
+ try {
+ long a = Long.parseLong ("-8000000000000000", 16);
+ long c = a%b;
+ System.out.println (c);
+ } catch (Exception _) {
+ System.out.println (_);
+ }
+
+ try {
+ long a = Long.parseLong ("8000", 16);
+ long b = Long.parseLong ("0", 16);
+ long c = a/b;
+ System.out.println (c);
+ } catch (Exception _) {
+ System.out.println (_);
+ }
+
+ try {
+ long a = Long.parseLong ("8000", 16);
+ long b = Long.parseLong ("0", 16);
+ long c = a%b;
+ System.out.println (c);
+ } catch (Exception _) {
+ System.out.println (_);
+ }
+ }
+
+ public static void main (String[] args) {
+ new Divide_1 ().probe ();
+ }
+}
diff --git a/libjava/testsuite/libjava.lang/Divide_1.out b/libjava/testsuite/libjava.lang/Divide_1.out
new file mode 100644
index 00000000000..6e1f87ed4fc
--- /dev/null
+++ b/libjava/testsuite/libjava.lang/Divide_1.out
@@ -0,0 +1,11 @@
+-2147483648
+-2147483648
+0
+0
+0
+java.lang.ArithmeticException: / by zero
+java.lang.ArithmeticException: / by zero
+-9223372036854775808
+0
+java.lang.ArithmeticException: / by zero
+java.lang.ArithmeticException: / by zero
diff --git a/libjava/testsuite/libjava.lang/Final.java b/libjava/testsuite/libjava.lang/Final.java
new file mode 100644
index 00000000000..1b22096c359
--- /dev/null
+++ b/libjava/testsuite/libjava.lang/Final.java
@@ -0,0 +1,20 @@
+public final class Final
+{
+ public static void main(String args[])
+ {
+ Final f = null;
+ try
+ {
+ f.doSomething();
+ }
+ catch (NullPointerException x)
+ {
+ System.out.println("NullPointerException - ok");
+ }
+ }
+
+ void doSomething()
+ {
+ System.out.println("This should not happen");
+ }
+}
diff --git a/libjava/testsuite/libjava.lang/Final.out b/libjava/testsuite/libjava.lang/Final.out
new file mode 100644
index 00000000000..2e513123d7c
--- /dev/null
+++ b/libjava/testsuite/libjava.lang/Final.out
@@ -0,0 +1 @@
+NullPointerException - ok
diff --git a/libjava/testsuite/libjava.lang/Final.xfail b/libjava/testsuite/libjava.lang/Final.xfail
new file mode 100644
index 00000000000..c999f8ee0ca
--- /dev/null
+++ b/libjava/testsuite/libjava.lang/Final.xfail
@@ -0,0 +1 @@
+xfail-output
diff --git a/libjava/testsuite/libjava.lang/Finalize_1.java b/libjava/testsuite/libjava.lang/Finalize_1.java
deleted file mode 100644
index b1a4d9575f2..00000000000
--- a/libjava/testsuite/libjava.lang/Finalize_1.java
+++ /dev/null
@@ -1,28 +0,0 @@
-// Finalize.java - Test code for finalizers.
-
-import java.io.*;
-import java.util.*;
-import java.lang.Runtime;
-
-public final class Finalize_1
-{
- public static void main (String[] args)
- {
- Finalize_1 f;
- Runtime t;
-
- t = Runtime.getRuntime ();
-
- for (int i = 0; i < 3; ++i)
- f = new Finalize_1 ();
- f = null;
-
- t.gc ();
- t.runFinalization ();
- }
-
- public void finalize () throws Throwable
- {
- System.out.print ("Finalize ");
- }
-}
diff --git a/libjava/testsuite/libjava.lang/Finalize_1.out b/libjava/testsuite/libjava.lang/Finalize_1.out
deleted file mode 100644
index 45b1f96bfa0..00000000000
--- a/libjava/testsuite/libjava.lang/Finalize_1.out
+++ /dev/null
@@ -1 +0,0 @@
-Finalize Finalize Finalize
diff --git a/libjava/testsuite/libjava.lang/Invoke_2.java b/libjava/testsuite/libjava.lang/Invoke_2.java
new file mode 100644
index 00000000000..a2d1407b31b
--- /dev/null
+++ b/libjava/testsuite/libjava.lang/Invoke_2.java
@@ -0,0 +1,20 @@
+public class Invoke_2
+{
+ static int s;
+
+ public static void foo (int a, int b)
+ {
+ System.out.println(a + " " + b);
+ }
+
+ public static void main(String[] args) {
+ foo (bar(), s);
+ }
+
+ public static int bar()
+ {
+ s = 33;
+ return 99;
+ }
+}
+
diff --git a/libjava/testsuite/libjava.lang/Invoke_2.out b/libjava/testsuite/libjava.lang/Invoke_2.out
new file mode 100644
index 00000000000..39501553b7b
--- /dev/null
+++ b/libjava/testsuite/libjava.lang/Invoke_2.out
@@ -0,0 +1 @@
+99 33
diff --git a/libjava/testsuite/libjava.lang/Invoke_2.xfail b/libjava/testsuite/libjava.lang/Invoke_2.xfail
new file mode 100644
index 00000000000..c999f8ee0ca
--- /dev/null
+++ b/libjava/testsuite/libjava.lang/Invoke_2.xfail
@@ -0,0 +1 @@
+xfail-output
diff --git a/libjava/testsuite/libjava.lang/Shazam.java b/libjava/testsuite/libjava.lang/Shazam.java
new file mode 100644
index 00000000000..d3defc0652c
--- /dev/null
+++ b/libjava/testsuite/libjava.lang/Shazam.java
@@ -0,0 +1,18 @@
+import java.io.*;
+
+public class Shazam {
+
+ private static String shazam ()
+ {
+ try {
+ return "shazam";
+ } finally {
+ System.out.println ("The next line should say \"shazam\"");
+ }
+ }
+
+ public static void main (String[] args)
+ {
+ System.out.println (shazam ());
+ }
+}
diff --git a/libjava/testsuite/libjava.lang/Shazam.out b/libjava/testsuite/libjava.lang/Shazam.out
new file mode 100644
index 00000000000..42cc30d7239
--- /dev/null
+++ b/libjava/testsuite/libjava.lang/Shazam.out
@@ -0,0 +1,2 @@
+The next line should say "shazam"
+shazam
diff --git a/libjava/testsuite/libjava.lang/Shazam.xfail b/libjava/testsuite/libjava.lang/Shazam.xfail
new file mode 100644
index 00000000000..c999f8ee0ca
--- /dev/null
+++ b/libjava/testsuite/libjava.lang/Shazam.xfail
@@ -0,0 +1 @@
+xfail-output
diff --git a/libjava/testsuite/libjava.lang/Thread_1.java b/libjava/testsuite/libjava.lang/Thread_1.java
index 932afa5dd73..851df630d16 100644
--- a/libjava/testsuite/libjava.lang/Thread_1.java
+++ b/libjava/testsuite/libjava.lang/Thread_1.java
@@ -1,182 +1,3 @@
-// Various thread tests.
-
-public class Thread_1 extends Thread
-{
- // The group for the workers.
- static ThreadGroup subgroup;
-
- // Which piece of test code to try.
- static int test_case;
-
- // Names of the tests.
- static final int JOIN_GOOD = 0;
- static final int JOIN_TIMEOUT = 1;
- static final int JOIN_INTERRUPTED = 2;
- static final int THREAD_EXIT = 3;
-
- // True if this is normal; false if daemon.
- boolean normal;
- // The other thread in the test.
- Thread_1 other;
- // True when the thread has entered run().
- boolean started;
-
- public void run ()
- {
- try
- {
- if (normal)
- {
- System.out.println ("test " + test_case);
- // Tell the main thread to start the daemon thread.
- synchronized (this)
- {
- started = true;
- notify ();
- }
- // Now wait for daemon to start.
- synchronized (other)
- {
- while (! other.started)
- other.wait ();
- }
- switch (test_case)
- {
- case JOIN_GOOD:
- other.join ();
- System.out.println ("joined");
- break;
- case JOIN_TIMEOUT:
- other.join (10);
- System.out.println (other.isAlive());
- other.join ();
- break;
- case JOIN_INTERRUPTED:
- other.join ();
- System.out.println ("joined");
- break;
- case THREAD_EXIT:
- // Nothing.
- break;
-
- default:
- System.out.println ("failure");
- break;
- }
- }
- else
- {
- // Let the normal thread start first.
- synchronized (other)
- {
- while (! other.started)
- other.wait();
- }
- // Tell normal thread that we've started.
- synchronized (this)
- {
- started = true;
- notify ();
- }
- switch (test_case)
- {
- case JOIN_GOOD:
- System.out.println ("daemon done");
- break;
- case JOIN_TIMEOUT:
- sleep (50);
- break;
- case JOIN_INTERRUPTED:
- other.interrupt ();
- break;
- case THREAD_EXIT:
- // Wait for a while. However, don't wait indefinitely
- // -- we want this thread to terminate so that the
- // process won't hang if there is a bug.
- sleep (10000);
- System.out.println ("daemon still alive");
- break;
-
- default:
- System.out.println ("failure");
- break;
- }
- }
- }
- catch (InterruptedException e)
- {
- System.out.println ("interrupted");
- }
- }
-
- public void setOther (Thread_1 x)
- {
- other = x;
- }
-
- Thread_1 (String name, boolean x)
- {
- super (subgroup, name);
- normal = x;
- started = false;
- setDaemon (! normal);
- }
-
- // Run a single test.
- static Thread_1 doit (int what)
- {
- // FIXME: we used to just use the same threads each time. That
- // didn't work -- must debug.
- Thread_1 dt = new Thread_1 ("daemon", false);
- Thread_1 nt = new Thread_1 ("normal", true);
-
- dt.setOther(nt);
- nt.setOther(dt);
-
- test_case = what;
- try
- {
- nt.start();
- dt.start();
-
- // Don't wait for the threads if we're doing the exit test.
- if (what != THREAD_EXIT)
- {
- nt.join ();
- dt.join ();
- }
- }
- catch (InterruptedException e)
- {
- System.out.println ("caught bad exception");
- }
-
- return dt;
- }
-
- public static void main (String[] args)
- {
- subgroup = new ThreadGroup ("sub");
-
- doit (JOIN_GOOD);
-
- System.out.println ("active count = " + subgroup.activeCount ());
-
- Thread_1 dt = doit (JOIN_TIMEOUT);
- // Make sure that joining a dead thread works.
- System.out.println ("still alive: " + dt.isAlive ());
- try
- {
- dt.join ();
- }
- catch (InterruptedException e)
- {
- System.out.println ("exception caught");
- }
-
- doit (JOIN_INTERRUPTED);
-
- // This test must come last.
- doit (THREAD_EXIT);
- }
-}
+ // Note: this test has a race conditoin. So we don't run it any
+ // more.
+ // doit (THREAD_EXIT);
diff --git a/libjava/testsuite/libjava.lang/Thread_1.out b/libjava/testsuite/libjava.lang/Thread_1.out
index 1bd7a0124d9..e69de29bb2d 100644
--- a/libjava/testsuite/libjava.lang/Thread_1.out
+++ b/libjava/testsuite/libjava.lang/Thread_1.out
@@ -1,10 +0,0 @@
-test 0
-daemon done
-joined
-active count = 2
-test 1
-true
-still alive: false
-test 2
-interrupted
-test 3
diff --git a/libjava/testsuite/libjava.lang/Throw_1.xfail b/libjava/testsuite/libjava.lang/Throw_1.xfail
new file mode 100644
index 00000000000..c999f8ee0ca
--- /dev/null
+++ b/libjava/testsuite/libjava.lang/Throw_1.xfail
@@ -0,0 +1 @@
+xfail-output
diff --git a/libjava/testsuite/libjava.lang/test.exp b/libjava/testsuite/libjava.lang/test.exp
index cfe9cf5069c..bc4cb38a4ff 100644
--- a/libjava/testsuite/libjava.lang/test.exp
+++ b/libjava/testsuite/libjava.lang/test.exp
@@ -1,34 +1,7 @@
-global srcdir subdir
-catch "glob -nocomplain ${srcdir}/${subdir}/*.out" srcfiles
-verbose "srcfiles are $srcfiles"
+ set args [libjava_read_xfail $srcdir/$subdir/$bname.xfail]
-set prefix ""
-foreach x $srcfiles {
- regsub "\\.out$" $x "" prefix
- set bname [file tail $prefix]
- set args ""
- if [file exists $srcdir/$subdir/${bname}.arg] {
- set id [open "$srcdir/$subdir/${bname}.arg" r];
- set args [read -nonewline $id];
- close $id;
- }
- if [file exists $srcdir/$subdir/${bname}.xpo] {
- set resfile "$srcdir/$subdir/${bname}.xpo"
- set options "regexp_match"
- } else {
- set resfile "${prefix}.out"
- set options ""
- }
- if [file exists ${prefix}.inp] {
- set inpfile ${prefix}.inp
- } else {
- set inpfile ""
- }
-
- verbose "inpfile is $inpfile"
-
- test_libjava $options "${prefix}.java" "" $inpfile $resfile $args
- test_libjava $options "${prefix}.java" "-O" $inpfile $resfile $args
-}
+# Local Variables:
+# tcl-indent-level:4
+# End:
diff --git a/libjava/testsuite/libjava.mauve/mauve.exp b/libjava/testsuite/libjava.mauve/mauve.exp
index 7d5e71e7965..398b6704c84 100644
--- a/libjava/testsuite/libjava.mauve/mauve.exp
+++ b/libjava/testsuite/libjava.mauve/mauve.exp
@@ -49,7 +49,7 @@ proc mauve_compute_uses {aName} {
# Run all the Mauve tests.
proc test_mauve {} {
- global srcdir subdir env
+ global srcdir objdir subdir env
if {! [info exists env(MAUVEDIR)]} then {
verbose "MAUVEDIR not set; not running Mauve tests"
@@ -65,6 +65,26 @@ proc test_mauve {} {
set full_srcdir [pwd]
cd $here/mauve-build
+ global env
+ global GCJ_UNDER_TEST
+ global TOOL_EXECUTABLE
+
+ if ![info exists GCJ_UNDER_TEST] {
+ if [info exists TOOL_EXECUTABLE] {
+ set GCJ_UNDER_TEST $TOOL_EXECUTABLE;
+ } else {
+ if [info exists env(GCJ)] {
+ set GCJ_UNDER_TEST env(GCJ)
+ } else {
+ set GCJ_UNDER_TEST "[find_gcj]"
+ }
+ }
+ }
+
+ # Append -B and -I so that libgcj.spec and libgcj.zip are found
+ # before they're installed.
+ set env(GCJ) "$GCJ_UNDER_TEST -B$objdir/../ -I$objdir/../libgcj.zip"
+
if {[catch {system "$env(MAUVEDIR)/configure --with-gcj"} msg]} then {
fail "Mauve configure"
verbose "configure failed with $msg"
@@ -80,7 +100,7 @@ proc test_mauve {} {
puts -nonewline $fd $c
close $fd
- if {[catch {system "make KEYS=libjava classes.stamp"} msg]} then {
+ if {[catch {system "make KEYS=libgcj classes.stamp"} msg]} then {
fail "Mauve build"
verbose "build failed with $msg"
return
@@ -99,7 +119,7 @@ proc test_mauve {} {
# Compute flags to use to do the build.
set compile_args [libjava_arguments]
- set link_args [concat $compile_args \
+ set link_args [concat [libjava_arguments link] \
[list "additional_flags=--main=DejaGNUTestHarness"]]
set ok 1
@@ -152,10 +172,6 @@ proc test_mauve {} {
set result [libjava_load [pwd]/DejaGNUTestHarness \
"$env(MAUVEDIR) $class" ""]
- if {[lindex $result 0] != "pass"} then {
- fail "Execute for $class"
- continue
- }
# Test for an exception thrown in the test harness itself. This
# isn't enough to test for all faults in the test harness, but
@@ -217,7 +233,7 @@ proc test_mauve_sim {} {
puts -nonewline $fd $c
close $fd
- if {[catch {system "make KEYS=libjava classes.stamp"} msg]} then {
+ if {[catch {system "make KEYS=libgcj classes.stamp"} msg]} then {
fail "Mauve build"
verbose "build failed with $msg"
return
@@ -229,7 +245,7 @@ proc test_mauve_sim {} {
# Compute flags to use to do the build.
set compile_args [libjava_arguments]
- set link_args [concat $compile_args \
+ set link_args [concat [libjava_arguments link] \
[list "additional_flags=--main=DejaGNUTestHarness"]]
set ok 1
@@ -315,10 +331,6 @@ proc test_mauve_sim {} {
set result [libjava_load [pwd]/DejaGNUTestHarness \
"$env(MAUVEDIR) $class" ""]
- if {[lindex $result 0] != "pass"} then {
- fail "Execute for $class"
- continue
- }
# Test for an exception thrown in the test harness itself. This
# isn't enough to test for all faults in the test harness, but
diff --git a/zlib/ChangeLog b/zlib/ChangeLog
new file mode 100644
index 00000000000..57386a26f48
--- /dev/null
+++ b/zlib/ChangeLog
@@ -0,0 +1,471 @@
+
+ ChangeLog file for zlib
+
+Changes in 1.1.3 (9 July 1998)
+- fix "an inflate input buffer bug that shows up on rare but persistent
+ occasions" (Mark)
+- fix gzread and gztell for concatenated .gz files (Didier Le Botlan)
+- fix gzseek(..., SEEK_SET) in write mode
+- fix crc check after a gzeek (Frank Faubert)
+- fix miniunzip when the last entry in a zip file is itself a zip file
+ (J Lillge)
+- add contrib/asm586 and contrib/asm686 (Brian Raiter)
+ See http://www.muppetlabs.com/~breadbox/software/assembly.html
+- add support for Delphi 3 in contrib/delphi (Bob Dellaca)
+- add support for C++Builder 3 and Delphi 3 in contrib/delphi2 (Davide Moretti)
+- do not exit prematurely in untgz if 0 at start of block (Magnus Holmgren)
+- use macro EXTERN instead of extern to support DLL for BeOS (Sander Stoks)
+- added a FAQ file
+
+- Support gzdopen on Mac with Metrowerks (Jason Linhart)
+- Do not redefine Byte on Mac (Brad Pettit & Jason Linhart)
+- define SEEK_END too if SEEK_SET is not defined (Albert Chin-A-Young)
+- avoid some warnings with Borland C (Tom Tanner)
+- fix a problem in contrib/minizip/zip.c for 16-bit MSDOS (Gilles Vollant)
+- emulate utime() for WIN32 in contrib/untgz (Gilles Vollant)
+- allow several arguments to configure (Tim Mooney, Frodo Looijaard)
+- use libdir and includedir in Makefile.in (Tim Mooney)
+- support shared libraries on OSF1 V4 (Tim Mooney)
+- remove so_locations in "make clean" (Tim Mooney)
+- fix maketree.c compilation error (Glenn, Mark)
+- Python interface to zlib now in Python 1.5 (Jeremy Hylton)
+- new Makefile.riscos (Rich Walker)
+- initialize static descriptors in trees.c for embedded targets (Nick Smith)
+- use "foo-gz" in example.c for RISCOS and VMS (Nick Smith)
+- add the OS/2 files in Makefile.in too (Andrew Zabolotny)
+- fix fdopen and halloc macros for Microsoft C 6.0 (Tom Lane)
+- fix maketree.c to allow clean compilation of inffixed.h (Mark)
+- fix parameter check in deflateCopy (Gunther Nikl)
+- cleanup trees.c, use compressed_len only in debug mode (Christian Spieler)
+- Many portability patches by Christian Spieler:
+ . zutil.c, zutil.h: added "const" for zmem*
+ . Make_vms.com: fixed some typos
+ . Make_vms.com: msdos/Makefile.*: removed zutil.h from some dependency lists
+ . msdos/Makefile.msc: remove "default rtl link library" info from obj files
+ . msdos/Makefile.*: use model-dependent name for the built zlib library
+ . msdos/Makefile.emx, nt/Makefile.emx, nt/Makefile.gcc:
+ new makefiles, for emx (DOS/OS2), emx&rsxnt and mingw32 (Windows 9x / NT)
+- use define instead of typedef for Bytef also for MSC small/medium (Tom Lane)
+- replace __far with _far for better portability (Christian Spieler, Tom Lane)
+- fix test for errno.h in configure (Tim Newsham)
+
+Changes in 1.1.2 (19 March 98)
+- added contrib/minzip, mini zip and unzip based on zlib (Gilles Vollant)
+ See http://www.winimage.com/zLibDll/unzip.html
+- preinitialize the inflate tables for fixed codes, to make the code
+ completely thread safe (Mark)
+- some simplifications and slight speed-up to the inflate code (Mark)
+- fix gzeof on non-compressed files (Allan Schrum)
+- add -std1 option in configure for OSF1 to fix gzprintf (Martin Mokrejs)
+- use default value of 4K for Z_BUFSIZE for 16-bit MSDOS (Tim Wegner + Glenn)
+- added os2/Makefile.def and os2/zlib.def (Andrew Zabolotny)
+- add shared lib support for UNIX_SV4.2MP (MATSUURA Takanori)
+- do not wrap extern "C" around system includes (Tom Lane)
+- mention zlib binding for TCL in README (Andreas Kupries)
+- added amiga/Makefile.pup for Amiga powerUP SAS/C PPC (Andreas Kleinert)
+- allow "make install prefix=..." even after configure (Glenn Randers-Pehrson)
+- allow "configure --prefix $HOME" (Tim Mooney)
+- remove warnings in example.c and gzio.c (Glenn Randers-Pehrson)
+- move Makefile.sas to amiga/Makefile.sas
+
+Changes in 1.1.1 (27 Feb 98)
+- fix macros _tr_tally_* in deflate.h for debug mode (Glenn Randers-Pehrson)
+- remove block truncation heuristic which had very marginal effect for zlib
+ (smaller lit_bufsize than in gzip 1.2.4) and degraded a little the
+ compression ratio on some files. This also allows inlining _tr_tally for
+ matches in deflate_slow.
+- added msdos/Makefile.w32 for WIN32 Microsoft Visual C++ (Bob Frazier)
+
+Changes in 1.1.0 (24 Feb 98)
+- do not return STREAM_END prematurely in inflate (John Bowler)
+- revert to the zlib 1.0.8 inflate to avoid the gcc 2.8.0 bug (Jeremy Buhler)
+- compile with -DFASTEST to get compression code optimized for speed only
+- in minigzip, try mmap'ing the input file first (Miguel Albrecht)
+- increase size of I/O buffers in minigzip.c and gzio.c (not a big gain
+ on Sun but significant on HP)
+
+- add a pointer to experimental unzip library in README (Gilles Vollant)
+- initialize variable gcc in configure (Chris Herborth)
+
+Changes in 1.0.9 (17 Feb 1998)
+- added gzputs and gzgets functions
+- do not clear eof flag in gzseek (Mark Diekhans)
+- fix gzseek for files in transparent mode (Mark Diekhans)
+- do not assume that vsprintf returns the number of bytes written (Jens Krinke)
+- replace EXPORT with ZEXPORT to avoid conflict with other programs
+- added compress2 in zconf.h, zlib.def, zlib.dnt
+- new asm code from Gilles Vollant in contrib/asm386
+- simplify the inflate code (Mark):
+ . Replace ZALLOC's in huft_build() with single ZALLOC in inflate_blocks_new()
+ . ZALLOC the length list in inflate_trees_fixed() instead of using stack
+ . ZALLOC the value area for huft_build() instead of using stack
+ . Simplify Z_FINISH check in inflate()
+
+- Avoid gcc 2.8.0 comparison bug a little differently than zlib 1.0.8
+- in inftrees.c, avoid cc -O bug on HP (Farshid Elahi)
+- in zconf.h move the ZLIB_DLL stuff earlier to avoid problems with
+ the declaration of FAR (Gilles VOllant)
+- install libz.so* with mode 755 (executable) instead of 644 (Marc Lehmann)
+- read_buf buf parameter of type Bytef* instead of charf*
+- zmemcpy parameters are of type Bytef*, not charf* (Joseph Strout)
+- do not redeclare unlink in minigzip.c for WIN32 (John Bowler)
+- fix check for presence of directories in "make install" (Ian Willis)
+
+Changes in 1.0.8 (27 Jan 1998)
+- fixed offsets in contrib/asm386/gvmat32.asm (Gilles Vollant)
+- fix gzgetc and gzputc for big endian systems (Markus Oberhumer)
+- added compress2() to allow setting the compression level
+- include sys/types.h to get off_t on some systems (Marc Lehmann & QingLong)
+- use constant arrays for the static trees in trees.c instead of computing
+ them at run time (thanks to Ken Raeburn for this suggestion). To create
+ trees.h, compile with GEN_TREES_H and run "make test".
+- check return code of example in "make test" and display result
+- pass minigzip command line options to file_compress
+- simplifying code of inflateSync to avoid gcc 2.8 bug
+
+- support CC="gcc -Wall" in configure -s (QingLong)
+- avoid a flush caused by ftell in gzopen for write mode (Ken Raeburn)
+- fix test for shared library support to avoid compiler warnings
+- zlib.lib -> zlib.dll in msdos/zlib.rc (Gilles Vollant)
+- check for TARGET_OS_MAC in addition to MACOS (Brad Pettit)
+- do not use fdopen for Metrowerks on Mac (Brad Pettit))
+- add checks for gzputc and gzputc in example.c
+- avoid warnings in gzio.c and deflate.c (Andreas Kleinert)
+- use const for the CRC table (Ken Raeburn)
+- fixed "make uninstall" for shared libraries
+- use Tracev instead of Trace in infblock.c
+- in example.c use correct compressed length for test_sync
+- suppress +vnocompatwarnings in configure for HPUX (not always supported)
+
+Changes in 1.0.7 (20 Jan 1998)
+- fix gzseek which was broken in write mode
+- return error for gzseek to negative absolute position
+- fix configure for Linux (Chun-Chung Chen)
+- increase stack space for MSC (Tim Wegner)
+- get_crc_table and inflateSyncPoint are EXPORTed (Gilles Vollant)
+- define EXPORTVA for gzprintf (Gilles Vollant)
+- added man page zlib.3 (Rick Rodgers)
+- for contrib/untgz, fix makedir() and improve Makefile
+
+- check gzseek in write mode in example.c
+- allocate extra buffer for seeks only if gzseek is actually called
+- avoid signed/unsigned comparisons (Tim Wegner, Gilles Vollant)
+- add inflateSyncPoint in zconf.h
+- fix list of exported functions in nt/zlib.dnt and mdsos/zlib.def
+
+Changes in 1.0.6 (19 Jan 1998)
+- add functions gzprintf, gzputc, gzgetc, gztell, gzeof, gzseek, gzrewind and
+ gzsetparams (thanks to Roland Giersig and Kevin Ruland for some of this code)
+- Fix a deflate bug occuring only with compression level 0 (thanks to
+ Andy Buckler for finding this one).
+- In minigzip, pass transparently also the first byte for .Z files.
+- return Z_BUF_ERROR instead of Z_OK if output buffer full in uncompress()
+- check Z_FINISH in inflate (thanks to Marc Schluper)
+- Implement deflateCopy (thanks to Adam Costello)
+- make static libraries by default in configure, add --shared option.
+- move MSDOS or Windows specific files to directory msdos
+- suppress the notion of partial flush to simplify the interface
+ (but the symbol Z_PARTIAL_FLUSH is kept for compatibility with 1.0.4)
+- suppress history buffer provided by application to simplify the interface
+ (this feature was not implemented anyway in 1.0.4)
+- next_in and avail_in must be initialized before calling inflateInit or
+ inflateInit2
+- add EXPORT in all exported functions (for Windows DLL)
+- added Makefile.nt (thanks to Stephen Williams)
+- added the unsupported "contrib" directory:
+ contrib/asm386/ by Gilles Vollant <info@winimage.com>
+ 386 asm code replacing longest_match().
+ contrib/iostream/ by Kevin Ruland <kevin@rodin.wustl.edu>
+ A C++ I/O streams interface to the zlib gz* functions
+ contrib/iostream2/ by Tyge Løvset <Tyge.Lovset@cmr.no>
+ Another C++ I/O streams interface
+ contrib/untgz/ by "Pedro A. Aranda Guti\irrez" <paag@tid.es>
+ A very simple tar.gz file extractor using zlib
+ contrib/visual-basic.txt by Carlos Rios <c_rios@sonda.cl>
+ How to use compress(), uncompress() and the gz* functions from VB.
+- pass params -f (filtered data), -h (huffman only), -1 to -9 (compression
+ level) in minigzip (thanks to Tom Lane)
+
+- use const for rommable constants in deflate
+- added test for gzseek and gztell in example.c
+- add undocumented function inflateSyncPoint() (hack for Paul Mackerras)
+- add undocumented function zError to convert error code to string
+ (for Tim Smithers)
+- Allow compilation of gzio with -DNO_DEFLATE to avoid the compression code.
+- Use default memcpy for Symantec MSDOS compiler.
+- Add EXPORT keyword for check_func (needed for Windows DLL)
+- add current directory to LD_LIBRARY_PATH for "make test"
+- create also a link for libz.so.1
+- added support for FUJITSU UXP/DS (thanks to Toshiaki Nomura)
+- use $(SHAREDLIB) instead of libz.so in Makefile.in (for HPUX)
+- added -soname for Linux in configure (Chun-Chung Chen,
+- assign numbers to the exported functions in zlib.def (for Windows DLL)
+- add advice in zlib.h for best usage of deflateSetDictionary
+- work around compiler bug on Atari (cast Z_NULL in call of s->checkfn)
+- allow compilation with ANSI keywords only enabled for TurboC in large model
+- avoid "versionString"[0] (Borland bug)
+- add NEED_DUMMY_RETURN for Borland
+- use variable z_verbose for tracing in debug mode (L. Peter Deutsch).
+- allow compilation with CC
+- defined STDC for OS/2 (David Charlap)
+- limit external names to 8 chars for MVS (Thomas Lund)
+- in minigzip.c, use static buffers only for 16-bit systems
+- fix suffix check for "minigzip -d foo.gz"
+- do not return an error for the 2nd of two consecutive gzflush() (Felix Lee)
+- use _fdopen instead of fdopen for MSC >= 6.0 (Thomas Fanslau)
+- added makelcc.bat for lcc-win32 (Tom St Denis)
+- in Makefile.dj2, use copy and del instead of install and rm (Frank Donahoe)
+- Avoid expanded $Id$. Use "rcs -kb" or "cvs admin -kb" to avoid Id expansion.
+- check for unistd.h in configure (for off_t)
+- remove useless check parameter in inflate_blocks_free
+- avoid useless assignment of s->check to itself in inflate_blocks_new
+- do not flush twice in gzclose (thanks to Ken Raeburn)
+- rename FOPEN as F_OPEN to avoid clash with /usr/include/sys/file.h
+- use NO_ERRNO_H instead of enumeration of operating systems with errno.h
+- work around buggy fclose on pipes for HP/UX
+- support zlib DLL with BORLAND C++ 5.0 (thanks to Glenn Randers-Pehrson)
+- fix configure if CC is already equal to gcc
+
+Changes in 1.0.5 (3 Jan 98)
+- Fix inflate to terminate gracefully when fed corrupted or invalid data
+- Use const for rommable constants in inflate
+- Eliminate memory leaks on error conditions in inflate
+- Removed some vestigial code in inflate
+- Update web address in README
+
+Changes in 1.0.4 (24 Jul 96)
+- In very rare conditions, deflate(s, Z_FINISH) could fail to produce an EOF
+ bit, so the decompressor could decompress all the correct data but went
+ on to attempt decompressing extra garbage data. This affected minigzip too.
+- zlibVersion and gzerror return const char* (needed for DLL)
+- port to RISCOS (no fdopen, no multiple dots, no unlink, no fileno)
+- use z_error only for DEBUG (avoid problem with DLLs)
+
+Changes in 1.0.3 (2 Jul 96)
+- use z_streamp instead of z_stream *, which is now a far pointer in MSDOS
+ small and medium models; this makes the library incompatible with previous
+ versions for these models. (No effect in large model or on other systems.)
+- return OK instead of BUF_ERROR if previous deflate call returned with
+ avail_out as zero but there is nothing to do
+- added memcmp for non STDC compilers
+- define NO_DUMMY_DECL for more Mac compilers (.h files merged incorrectly)
+- define __32BIT__ if __386__ or i386 is defined (pb. with Watcom and SCO)
+- better check for 16-bit mode MSC (avoids problem with Symantec)
+
+Changes in 1.0.2 (23 May 96)
+- added Windows DLL support
+- added a function zlibVersion (for the DLL support)
+- fixed declarations using Bytef in infutil.c (pb with MSDOS medium model)
+- Bytef is define's instead of typedef'd only for Borland C
+- avoid reading uninitialized memory in example.c
+- mention in README that the zlib format is now RFC1950
+- updated Makefile.dj2
+- added algorithm.doc
+
+Changes in 1.0.1 (20 May 96) [1.0 skipped to avoid confusion]
+- fix array overlay in deflate.c which sometimes caused bad compressed data
+- fix inflate bug with empty stored block
+- fix MSDOS medium model which was broken in 0.99
+- fix deflateParams() which could generated bad compressed data.
+- Bytef is define'd instead of typedef'ed (work around Borland bug)
+- added an INDEX file
+- new makefiles for DJGPP (Makefile.dj2), 32-bit Borland (Makefile.b32),
+ Watcom (Makefile.wat), Amiga SAS/C (Makefile.sas)
+- speed up adler32 for modern machines without auto-increment
+- added -ansi for IRIX in configure
+- static_init_done in trees.c is an int
+- define unlink as delete for VMS
+- fix configure for QNX
+- add configure branch for SCO and HPUX
+- avoid many warnings (unused variables, dead assignments, etc...)
+- no fdopen for BeOS
+- fix the Watcom fix for 32 bit mode (define FAR as empty)
+- removed redefinition of Byte for MKWERKS
+- work around an MWKERKS bug (incorrect merge of all .h files)
+
+Changes in 0.99 (27 Jan 96)
+- allow preset dictionary shared between compressor and decompressor
+- allow compression level 0 (no compression)
+- add deflateParams in zlib.h: allow dynamic change of compression level
+ and compression strategy.
+- test large buffers and deflateParams in example.c
+- add optional "configure" to build zlib as a shared library
+- suppress Makefile.qnx, use configure instead
+- fixed deflate for 64-bit systems (detected on Cray)
+- fixed inflate_blocks for 64-bit systems (detected on Alpha)
+- declare Z_DEFLATED in zlib.h (possible parameter for deflateInit2)
+- always return Z_BUF_ERROR when deflate() has nothing to do
+- deflateInit and inflateInit are now macros to allow version checking
+- prefix all global functions and types with z_ with -DZ_PREFIX
+- make falloc completely reentrant (inftrees.c)
+- fixed very unlikely race condition in ct_static_init
+- free in reverse order of allocation to help memory manager
+- use zlib-1.0/* instead of zlib/* inside the tar.gz
+- make zlib warning-free with "gcc -O3 -Wall -Wwrite-strings -Wpointer-arith
+ -Wconversion -Wstrict-prototypes -Wmissing-prototypes"
+- allow gzread on concatenated .gz files
+- deflateEnd now returns Z_DATA_ERROR if it was premature
+- deflate is finally (?) fully deterministic (no matches beyond end of input)
+- Document Z_SYNC_FLUSH
+- add uninstall in Makefile
+- Check for __cpluplus in zlib.h
+- Better test in ct_align for partial flush
+- avoid harmless warnings for Borland C++
+- initialize hash_head in deflate.c
+- avoid warning on fdopen (gzio.c) for HP cc -Aa
+- include stdlib.h for STDC compilers
+- include errno.h for Cray
+- ignore error if ranlib doesn't exist
+- call ranlib twice for NeXTSTEP
+- use exec_prefix instead of prefix for libz.a
+- renamed ct_* as _tr_* to avoid conflict with applications
+- clear z->msg in inflateInit2 before any error return
+- initialize opaque in example.c, gzio.c, deflate.c and inflate.c
+- fixed typo in zconf.h (_GNUC__ => __GNUC__)
+- check for WIN32 in zconf.h and zutil.c (avoid farmalloc in 32-bit mode)
+- fix typo in Make_vms.com (f$trnlnm -> f$getsyi)
+- in fcalloc, normalize pointer if size > 65520 bytes
+- don't use special fcalloc for 32 bit Borland C++
+- use STDC instead of __GO32__ to avoid redeclaring exit, calloc, etc...
+- use Z_BINARY instead of BINARY
+- document that gzclose after gzdopen will close the file
+- allow "a" as mode in gzopen.
+- fix error checking in gzread
+- allow skipping .gz extra-field on pipes
+- added reference to Perl interface in README
+- put the crc table in FAR data (I dislike more and more the medium model :)
+- added get_crc_table
+- added a dimension to all arrays (Borland C can't count).
+- workaround Borland C bug in declaration of inflate_codes_new & inflate_fast
+- guard against multiple inclusion of *.h (for precompiled header on Mac)
+- Watcom C pretends to be Microsoft C small model even in 32 bit mode.
+- don't use unsized arrays to avoid silly warnings by Visual C++:
+ warning C4746: 'inflate_mask' : unsized array treated as '__far'
+ (what's wrong with far data in far model?).
+- define enum out of inflate_blocks_state to allow compilation with C++
+
+Changes in 0.95 (16 Aug 95)
+- fix MSDOS small and medium model (now easier to adapt to any compiler)
+- inlined send_bits
+- fix the final (:-) bug for deflate with flush (output was correct but
+ not completely flushed in rare occasions).
+- default window size is same for compression and decompression
+ (it's now sufficient to set MAX_WBITS in zconf.h).
+- voidp -> voidpf and voidnp -> voidp (for consistency with other
+ typedefs and because voidnp was not near in large model).
+
+Changes in 0.94 (13 Aug 95)
+- support MSDOS medium model
+- fix deflate with flush (could sometimes generate bad output)
+- fix deflateReset (zlib header was incorrectly suppressed)
+- added support for VMS
+- allow a compression level in gzopen()
+- gzflush now calls fflush
+- For deflate with flush, flush even if no more input is provided.
+- rename libgz.a as libz.a
+- avoid complex expression in infcodes.c triggering Turbo C bug
+- work around a problem with gcc on Alpha (in INSERT_STRING)
+- don't use inline functions (problem with some gcc versions)
+- allow renaming of Byte, uInt, etc... with #define.
+- avoid warning about (unused) pointer before start of array in deflate.c
+- avoid various warnings in gzio.c, example.c, infblock.c, adler32.c, zutil.c
+- avoid reserved word 'new' in trees.c
+
+Changes in 0.93 (25 June 95)
+- temporarily disable inline functions
+- make deflate deterministic
+- give enough lookahead for PARTIAL_FLUSH
+- Set binary mode for stdin/stdout in minigzip.c for OS/2
+- don't even use signed char in inflate (not portable enough)
+- fix inflate memory leak for segmented architectures
+
+Changes in 0.92 (3 May 95)
+- don't assume that char is signed (problem on SGI)
+- Clear bit buffer when starting a stored block
+- no memcpy on Pyramid
+- suppressed inftest.c
+- optimized fill_window, put longest_match inline for gcc
+- optimized inflate on stored blocks.
+- untabify all sources to simplify patches
+
+Changes in 0.91 (2 May 95)
+- Default MEM_LEVEL is 8 (not 9 for Unix) as documented in zlib.h
+- Document the memory requirements in zconf.h
+- added "make install"
+- fix sync search logic in inflateSync
+- deflate(Z_FULL_FLUSH) now works even if output buffer too short
+- after inflateSync, don't scare people with just "lo world"
+- added support for DJGPP
+
+Changes in 0.9 (1 May 95)
+- don't assume that zalloc clears the allocated memory (the TurboC bug
+ was Mark's bug after all :)
+- let again gzread copy uncompressed data unchanged (was working in 0.71)
+- deflate(Z_FULL_FLUSH), inflateReset and inflateSync are now fully implemented
+- added a test of inflateSync in example.c
+- moved MAX_WBITS to zconf.h because users might want to change that.
+- document explicitly that zalloc(64K) on MSDOS must return a normalized
+ pointer (zero offset)
+- added Makefiles for Microsoft C, Turbo C, Borland C++
+- faster crc32()
+
+Changes in 0.8 (29 April 95)
+- added fast inflate (inffast.c)
+- deflate(Z_FINISH) now returns Z_STREAM_END when done. Warning: this
+ is incompatible with previous versions of zlib which returned Z_OK.
+- work around a TurboC compiler bug (bad code for b << 0, see infutil.h)
+ (actually that was not a compiler bug, see 0.81 above)
+- gzread no longer reads one extra byte in certain cases
+- In gzio destroy(), don't reference a freed structure
+- avoid many warnings for MSDOS
+- avoid the ERROR symbol which is used by MS Windows
+
+Changes in 0.71 (14 April 95)
+- Fixed more MSDOS compilation problems :( There is still a bug with
+ TurboC large model.
+
+Changes in 0.7 (14 April 95)
+- Added full inflate support.
+- Simplified the crc32() interface. The pre- and post-conditioning
+ (one's complement) is now done inside crc32(). WARNING: this is
+ incompatible with previous versions; see zlib.h for the new usage.
+
+Changes in 0.61 (12 April 95)
+- workaround for a bug in TurboC. example and minigzip now work on MSDOS.
+
+Changes in 0.6 (11 April 95)
+- added minigzip.c
+- added gzdopen to reopen a file descriptor as gzFile
+- added transparent reading of non-gziped files in gzread.
+- fixed bug in gzread (don't read crc as data)
+- fixed bug in destroy (gzio.c) (don't return Z_STREAM_END for gzclose).
+- don't allocate big arrays in the stack (for MSDOS)
+- fix some MSDOS compilation problems
+
+Changes in 0.5:
+- do real compression in deflate.c. Z_PARTIAL_FLUSH is supported but
+ not yet Z_FULL_FLUSH.
+- support decompression but only in a single step (forced Z_FINISH)
+- added opaque object for zalloc and zfree.
+- added deflateReset and inflateReset
+- added a variable zlib_version for consistency checking.
+- renamed the 'filter' parameter of deflateInit2 as 'strategy'.
+ Added Z_FILTERED and Z_HUFFMAN_ONLY constants.
+
+Changes in 0.4:
+- avoid "zip" everywhere, use zlib instead of ziplib.
+- suppress Z_BLOCK_FLUSH, interpret Z_PARTIAL_FLUSH as block flush
+ if compression method == 8.
+- added adler32 and crc32
+- renamed deflateOptions as deflateInit2, call one or the other but not both
+- added the method parameter for deflateInit2.
+- added inflateInit2
+- simplied considerably deflateInit and inflateInit by not supporting
+ user-provided history buffer. This is supported only in deflateInit2
+ and inflateInit2.
+
+Changes in 0.3:
+- prefix all macro names with Z_
+- use Z_FINISH instead of deflateEnd to finish compression.
+- added Z_HUFFMAN_ONLY
+- added gzerror()
diff --git a/zlib/ChangeLog.gcj b/zlib/ChangeLog.gcj
new file mode 100644
index 00000000000..f34d5c85cb3
--- /dev/null
+++ b/zlib/ChangeLog.gcj
@@ -0,0 +1,35 @@
+1999-07-19 Alexandre Oliva <oliva@dcc.unicamp.br>
+
+ * Makefile.am (*-recursive, *-am, *-multi): Automake does not
+ generate *-recursive for this Makefile, use *-am instead.
+ * Makefile.in: Rebuilt.
+
+1999-06-21 Tom Tromey <tromey@cygnus.com>
+
+ * Makefile.in: Rebuilt.
+ * Makefile.am (libzgcj_la_LDFLAGS): Use -version-info, not
+ -release.
+
+ * Makefile.in: Rebuilt.
+ * Makefile.am (toolexeclibdir): Define as libdir when
+ appropriate.
+ * configure: Rebuilt.
+ * configure.in (USE_LIBDIR): New conditional.
+
+1999-05-10 Tom Tromey <tromey@cygnus.com>
+
+ * configure, Makefile.in: Rebuilt.
+ * Makefile.am (EXTRA_LTLIBRARIES): New macro.
+ (toolexeclib_LTLIBRARIES): Use @target_all@.
+ * configure.in: Recognize --with-system-zlib. Subst target_all.
+
+1999-05-04 Tom Tromey <tromey@cygnus.com>
+
+ * Makefile.in: Replace with automake-generated file.
+ * Makefile.am: New file.
+ * configure: Replaced with autoconf-generated script.
+ * aclocal.m4: New file.
+ * acinclude.m4: New file.
+ * configure.in: New file.
+ * Makefile: Removed.
+
diff --git a/zlib/FAQ b/zlib/FAQ
new file mode 100644
index 00000000000..0feb6d3e9bb
--- /dev/null
+++ b/zlib/FAQ
@@ -0,0 +1,72 @@
+
+ Frequently Asked Questions about zlib
+
+
+If your question is not there, please check the zlib home page
+http://www.cdrom.com/pub/infozip/zlib/ which may have more recent information.
+
+
+1) I need a Windows DLL
+2) I need a Visual Basic interface to zlib
+3) compress() returns Z_BUF_ERROR
+4) deflate or inflate returns Z_BUF_ERROR
+5) Where is the zlib documentation (man pages, etc...)?
+6) Why don't you use GNU autoconf, libtool, etc...?
+7) There is a bug in zlib.
+8) I get "undefined reference to gzputc"
+
+
+
+1) I need a Windows DLL
+
+ The zlib sources can be compiled without change to produce a DLL.
+ If you want a precompiled DLL, see http://www.winimage.com/zLibDll
+
+
+2) I need a Visual Basic interface to zlib
+
+ See http://www.tcfb.com/dowseware/cmp-z-it.zip
+ http://web2.airmail.net/markn/articles/zlibtool/zlibtool.htm
+ and contrib/visual-basic.txt
+
+3) compress() returns Z_BUF_ERROR
+
+ Make sure that before the call of compress, the length of the
+ compressed buffer is equal to the total size of the compressed buffer
+ and not zero. For Visual Basic, check that this parameter is passed
+ by reference ("as any"), not by value ("as long").
+
+
+4) deflate or inflate returns Z_BUF_ERROR
+
+ Make sure that before the call avail_in and avail_out are not zero.
+
+
+5) Where is the zlib documentation (man pages, etc...)?
+
+ It's in zlib.h for the moment. Volunteers to transform this
+ to man pages, please contact jloup@gzip.org. Examples of zlib usage
+ are in the files example.c and minigzip.c.
+
+
+6) Why don't you use GNU autoconf, libtool, etc...?
+
+ Because we would like to keep zlib as a very small and simple package.
+ zlib is rather portable and doesn't need much configuration.
+
+
+7) There is a bug in zlib.
+
+ Most of the time, such problems are due to an incorrect usage
+ of zlib. Please try to reproduce the problem with a small
+ program and send us the corresponding source at zlib@quest.jpl.nasa.gov
+ Do not send multi-megabyte data files without prior agreement.
+
+
+8) I get "undefined reference to gzputc"
+
+ If "make test" produces something like
+ example.o(.text+0x174):
+ check that you don't have old files libz.* in /usr/lib, /usr/local/lib
+ or /usr/X11R6/lib. Remove old versions then do "make install".
+
diff --git a/zlib/INDEX b/zlib/INDEX
new file mode 100644
index 00000000000..8a245766402
--- /dev/null
+++ b/zlib/INDEX
@@ -0,0 +1,86 @@
+ChangeLog history of changes
+INDEX this file
+FAQ Frequently Asked Questions about zlib
+Make_vms.com script for Vax/VMS
+Makefile makefile for Unix (generated by configure)
+Makefile.in makefile for Unix (template for configure)
+Makefile.riscos makefile for RISCOS
+README guess what
+algorithm.txt description of the (de)compression algorithm
+configure configure script for Unix
+descrip.mms makefile for Vax/VMS
+zlib.3 mini man page for zlib (volunteers to write full
+ man pages from zlib.h welcome. write to jloup@gzip.org)
+
+amiga/Makefile.sas makefile for Amiga SAS/C
+amiga/Makefile.pup makefile for Amiga powerUP SAS/C PPC
+
+msdos/Makefile.w32 makefile for Microsoft Visual C++ 32-bit
+msdos/Makefile.b32 makefile for Borland C++ 32-bit
+msdos/Makefile.bor makefile for Borland C/C++ 16-bit
+msdos/Makefile.dj2 makefile for DJGPP 2.x
+msdos/Makefile.emx makefile for EMX 0.9c (32-bit DOS/OS2)
+msdos/Makefile.msc makefile for Microsoft C 16-bit
+msdos/Makefile.tc makefile for Turbo C
+msdos/Makefile.wat makefile for Watcom C
+msdos/zlib.def definition file for Windows DLL
+msdos/zlib.rc definition file for Windows DLL
+
+nt/Makefile.nt makefile for Windows NT
+nt/zlib.dnt definition file for Windows NT DLL
+nt/Makefile.emx makefile for EMX 0.9c/RSXNT 1.41 (Win32 Intel)
+nt/Makefile.gcc makefile for Windows NT using GCC (mingw32)
+
+
+ zlib public header files (must be kept):
+zconf.h
+zlib.h
+
+ private source files used to build the zlib library:
+adler32.c
+compress.c
+crc32.c
+deflate.c
+deflate.h
+gzio.c
+infblock.c
+infblock.h
+infcodes.c
+infcodes.h
+inffast.c
+inffast.h
+inflate.c
+inftrees.c
+inftrees.h
+infutil.c
+infutil.h
+maketree.c
+trees.c
+uncompr.c
+zutil.c
+zutil.h
+
+ source files for sample programs:
+example.c
+minigzip.c
+
+ unsupported contribution by third parties
+
+contrib/asm386/ by Gilles Vollant <info@winimage.com>
+ 386 asm code replacing longest_match().
+
+contrib/minizip/ by Gilles Vollant <info@winimage.com>
+ Mini zip and unzip based on zlib
+ See http://www.winimage.com/zLibDll/unzip.html
+
+contrib/iostream/ by Kevin Ruland <kevin@rodin.wustl.edu>
+ A C++ I/O streams interface to the zlib gz* functions
+
+contrib/iostream2/ by Tyge Løvset <Tyge.Lovset@cmr.no>
+ Another C++ I/O streams interface
+
+contrib/untgz/ by "Pedro A. Aranda Guti\irrez" <paag@tid.es>
+ A very simple tar.gz extractor using zlib
+
+contrib/visual-basic.txt by Carlos Rios <c_rios@sonda.cl>
+ How to use compress(), uncompress() and the gz* functions from VB.
diff --git a/zlib/Make_vms.com b/zlib/Make_vms.com
new file mode 100644
index 00000000000..1c57e8f0e02
--- /dev/null
+++ b/zlib/Make_vms.com
@@ -0,0 +1,115 @@
+$! make libz under VMS
+$! written by Martin P.J. Zinser <m.zinser@gsi.de>
+$!
+$! Look for the compiler used
+$!
+$ ccopt = ""
+$ if f$getsyi("HW_MODEL").ge.1024
+$ then
+$ ccopt = "/prefix=all"+ccopt
+$ comp = "__decc__=1"
+$ if f$trnlnm("SYS").eqs."" then define sys sys$library:
+$ else
+$ if f$search("SYS$SYSTEM:DECC$COMPILER.EXE").eqs.""
+$ then
+$ comp = "__vaxc__=1"
+$ if f$trnlnm("SYS").eqs."" then define sys sys$library:
+$ else
+$ if f$trnlnm("SYS").eqs."" then define sys decc$library_include:
+$ ccopt = "/decc/prefix=all"+ccopt
+$ comp = "__decc__=1"
+$ endif
+$ endif
+$!
+$! Build the thing plain or with mms
+$!
+$ write sys$output "Compiling Zlib sources ..."
+$ if f$search("SYS$SYSTEM:MMS.EXE").eqs.""
+$ then
+$ dele example.obj;*,minigzip.obj;*
+$ CALL MAKE adler32.OBJ "CC ''CCOPT' adler32" -
+ adler32.c zlib.h zconf.h
+$ CALL MAKE compress.OBJ "CC ''CCOPT' compress" -
+ compress.c zlib.h zconf.h
+$ CALL MAKE crc32.OBJ "CC ''CCOPT' crc32" -
+ crc32.c zlib.h zconf.h
+$ CALL MAKE deflate.OBJ "CC ''CCOPT' deflate" -
+ deflate.c deflate.h zutil.h zlib.h zconf.h
+$ CALL MAKE gzio.OBJ "CC ''CCOPT' gzio" -
+ gzio.c zutil.h zlib.h zconf.h
+$ CALL MAKE infblock.OBJ "CC ''CCOPT' infblock" -
+ infblock.c zutil.h zlib.h zconf.h infblock.h
+$ CALL MAKE infcodes.OBJ "CC ''CCOPT' infcodes" -
+ infcodes.c zutil.h zlib.h zconf.h inftrees.h
+$ CALL MAKE inffast.OBJ "CC ''CCOPT' inffast" -
+ inffast.c zutil.h zlib.h zconf.h inffast.h
+$ CALL MAKE inflate.OBJ "CC ''CCOPT' inflate" -
+ inflate.c zutil.h zlib.h zconf.h infblock.h
+$ CALL MAKE inftrees.OBJ "CC ''CCOPT' inftrees" -
+ inftrees.c zutil.h zlib.h zconf.h inftrees.h
+$ CALL MAKE infutil.OBJ "CC ''CCOPT' infutil" -
+ infutil.c zutil.h zlib.h zconf.h inftrees.h infutil.h
+$ CALL MAKE trees.OBJ "CC ''CCOPT' trees" -
+ trees.c deflate.h zutil.h zlib.h zconf.h
+$ CALL MAKE uncompr.OBJ "CC ''CCOPT' uncompr" -
+ uncompr.c zlib.h zconf.h
+$ CALL MAKE zutil.OBJ "CC ''CCOPT' zutil" -
+ zutil.c zutil.h zlib.h zconf.h
+$ write sys$output "Building Zlib ..."
+$ CALL MAKE libz.OLB "lib/crea libz.olb *.obj" *.OBJ
+$ write sys$output "Building example..."
+$ CALL MAKE example.OBJ "CC ''CCOPT' example" -
+ example.c zlib.h zconf.h
+$ call make example.exe "LINK example,libz.olb/lib" example.obj libz.olb
+$ write sys$output "Building minigzip..."
+$ CALL MAKE minigzip.OBJ "CC ''CCOPT' minigzip" -
+ minigzip.c zlib.h zconf.h
+$ call make minigzip.exe -
+ "LINK minigzip,libz.olb/lib,x11vms:xvmsutils.olb/lib" -
+ minigzip.obj libz.olb
+$ else
+$ mms/macro=('comp')
+$ endif
+$ write sys$output "Zlib build completed"
+$ exit
+$!
+$!
+$MAKE: SUBROUTINE !SUBROUTINE TO CHECK DEPENDENCIES
+$ V = 'F$Verify(0)
+$! P1 = What we are trying to make
+$! P2 = Command to make it
+$! P3 - P8 What it depends on
+$
+$ If F$Search(P1) .Eqs. "" Then Goto Makeit
+$ Time = F$CvTime(F$File(P1,"RDT"))
+$arg=3
+$Loop:
+$ Argument = P'arg
+$ If Argument .Eqs. "" Then Goto Exit
+$ El=0
+$Loop2:
+$ File = F$Element(El," ",Argument)
+$ If File .Eqs. " " Then Goto Endl
+$ AFile = ""
+$Loop3:
+$ OFile = AFile
+$ AFile = F$Search(File)
+$ If AFile .Eqs. "" .Or. AFile .Eqs. OFile Then Goto NextEl
+$ If F$CvTime(F$File(AFile,"RDT")) .Ges. Time Then Goto Makeit
+$ Goto Loop3
+$NextEL:
+$ El = El + 1
+$ Goto Loop2
+$EndL:
+$ arg=arg+1
+$ If arg .Le. 8 Then Goto Loop
+$ Goto Exit
+$
+$Makeit:
+$ VV=F$VERIFY(0)
+$ write sys$output P2
+$ 'P2
+$ VV='F$Verify(VV)
+$Exit:
+$ If V Then Set Verify
+$ENDSUBROUTINE
diff --git a/zlib/Makefile.am b/zlib/Makefile.am
new file mode 100644
index 00000000000..94852aefef5
--- /dev/null
+++ b/zlib/Makefile.am
@@ -0,0 +1,97 @@
+## Process this file with automake to create Makefile.in.
+
+AUTOMAKE_OPTIONS = cygnus
+
+# Multilib support variables.
+MULTISRCTOP =
+MULTIBUILDTOP =
+MULTIDIRS =
+MULTISUBDIR =
+MULTIDO = true
+MULTICLEAN = true
+
+## Install a library built with a cross compiler in tooldir, not
+## libdir.
+if USE_LIBDIR
+toolexeclibdir = $(libdir)
+else
+toolexecdir = $(exec_prefix)/$(target_alias)
+toolexeclibdir = $(toolexecdir)/lib$(MULTISUBDIR)
+endif
+
+## We don't use `libz.la' because we don't want to conflict with a
+## system library of that name.
+toolexeclib_LTLIBRARIES = @target_all@
+EXTRA_LTLIBRARIES = libzgcj.la
+
+libzgcj_la_SOURCES = adler32.c compress.c crc32.c deflate.c deflate.h \
+gzio.c infblock.c infblock.h infcodes.c infcodes.h inffast.c inffast.h \
+inffixed.h inflate.c inftrees.c inftrees.h infutil.c infutil.h trees.c \
+trees.h uncompr.c zconf.h zlib.h zutil.c zutil.h
+
+libzgcj_la_LDFLAGS = -version-info 0:0:0 -rpath $(toolexeclibdir)
+
+# Work around what appears to be a GNU make bug handling MAKEFLAGS
+# values defined in terms of make variables, as is the case for CC and
+# friends when we are called from the top level Makefile.
+AM_MAKEFLAGS = \
+ "AR_FLAGS=$(AR_FLAGS)" \
+ "CC_FOR_BUILD=$(CC_FOR_BUILD)" \
+ "CFLAGS=$(CFLAGS)" \
+ "CXXFLAGS=$(CXXFLAGS)" \
+ "CFLAGS_FOR_BUILD=$(CFLAGS_FOR_BUILD)" \
+ "CFLAGS_FOR_TARGET=$(CFLAGS_FOR_TARGET)" \
+ "INSTALL=$(INSTALL)" \
+ "INSTALL_DATA=$(INSTALL_DATA)" \
+ "INSTALL_PROGRAM=$(INSTALL_PROGRAM)" \
+ "INSTALL_SCRIPT=$(INSTALL_SCRIPT)" \
+ "LDFLAGS=$(LDFLAGS)" \
+ "LIBCFLAGS=$(LIBCFLAGS)" \
+ "LIBCFLAGS_FOR_TARGET=$(LIBCFLAGS_FOR_TARGET)" \
+ "MAKE=$(MAKE)" \
+ "MAKEINFO=$(MAKEINFO) $(MAKEINFOFLAGS)" \
+ "PICFLAG=$(PICFLAG)" \
+ "PICFLAG_FOR_TARGET=$(PICFLAG_FOR_TARGET)" \
+ "SHELL=$(SHELL)" \
+ "EXPECT=$(EXPECT)" \
+ "RUNTEST=$(RUNTEST)" \
+ "RUNTESTFLAGS=$(RUNTESTFLAGS)" \
+ "exec_prefix=$(exec_prefix)" \
+ "infodir=$(infodir)" \
+ "libdir=$(libdir)" \
+ "prefix=$(prefix)" \
+ "tooldir=$(tooldir)" \
+ "AR=$(AR)" \
+ "AS=$(AS)" \
+ "CC=$(CC)" \
+ "CXX=$(CXX)" \
+ "LD=$(LD)" \
+ "LIBCFLAGS=$(LIBCFLAGS)" \
+ "NM=$(NM)" \
+ "PICFLAG=$(PICFLAG)" \
+ "RANLIB=$(RANLIB)" \
+ "DESTDIR=$(DESTDIR)"
+
+# Multilib support.
+.PHONY: all-multi mostlyclean-multi clean-multi distclean-multi \
+ maintainer-clean-multi
+
+all-am: all-multi
+install-am: install-multi
+mostlyclean-am: mostlyclean-multi
+clean-am: clean-multi
+distclean-am: distclean-multi
+maintainer-clean-am: maintainer-clean-multi
+
+all-multi:
+ $(MULTIDO) $(AM_MAKEFLAGS) DO=all multi-do
+install-multi:
+ $(MULTIDO) $(AM_MAKEFLAGS) DO=install multi-do
+mostlyclean-multi:
+ $(MULTICLEAN) $(AM_MAKEFLAGS) DO=mostlyclean multi-clean
+clean-multi:
+ $(MULTICLEAN) $(AM_MAKEFLAGS) DO=clean multi-clean
+distclean-multi:
+ $(MULTICLEAN) $(AM_MAKEFLAGS) DO=distclean multi-clean
+maintainer-clean-multi:
+ $(MULTICLEAN) $(AM_MAKEFLAGS) DO=maintainer-clean multi-clean
diff --git a/zlib/Makefile.in b/zlib/Makefile.in
new file mode 100644
index 00000000000..8a397f65f49
--- /dev/null
+++ b/zlib/Makefile.in
@@ -0,0 +1,452 @@
+# Makefile.in generated automatically by automake 1.4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = .
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_alias = @build_alias@
+build_triplet = @build@
+host_alias = @host_alias@
+host_triplet = @host@
+target_alias = @target_alias@
+target_triplet = @target@
+AS = @AS@
+CC = @CC@
+COMPPATH = @COMPPATH@
+CPP = @CPP@
+DLLTOOL = @DLLTOOL@
+EXEEXT = @EXEEXT@
+LD = @LD@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+NM = @NM@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+USE_SYMBOL_UNDERSCORE = @USE_SYMBOL_UNDERSCORE@
+VERSION = @VERSION@
+target_all = @target_all@
+zlib_basedir = @zlib_basedir@
+
+AUTOMAKE_OPTIONS = cygnus
+
+# Multilib support variables.
+MULTISRCTOP =
+MULTIBUILDTOP =
+MULTIDIRS =
+MULTISUBDIR =
+MULTIDO = true
+MULTICLEAN = true
+@USE_LIBDIR_TRUE@toolexeclibdir = \
+@USE_LIBDIR_TRUE@$(libdir)
+@USE_LIBDIR_FALSE@toolexeclibdir = \
+@USE_LIBDIR_FALSE@$(toolexecdir)/lib$(MULTISUBDIR)
+@USE_LIBDIR_FALSE@toolexecdir = \
+@USE_LIBDIR_FALSE@$(exec_prefix)/$(target_alias)
+
+toolexeclib_LTLIBRARIES = @target_all@
+EXTRA_LTLIBRARIES = libzgcj.la
+
+libzgcj_la_SOURCES = adler32.c compress.c crc32.c deflate.c deflate.h \
+gzio.c infblock.c infblock.h infcodes.c infcodes.h inffast.c inffast.h \
+inffixed.h inflate.c inftrees.c inftrees.h infutil.c infutil.h trees.c \
+trees.h uncompr.c zconf.h zlib.h zutil.c zutil.h
+
+
+libzgcj_la_LDFLAGS = -version-info 0:0:0 -rpath $(toolexeclibdir)
+
+# Work around what appears to be a GNU make bug handling MAKEFLAGS
+# values defined in terms of make variables, as is the case for CC and
+# friends when we are called from the top level Makefile.
+AM_MAKEFLAGS = \
+ "AR_FLAGS=$(AR_FLAGS)" \
+ "CC_FOR_BUILD=$(CC_FOR_BUILD)" \
+ "CFLAGS=$(CFLAGS)" \
+ "CXXFLAGS=$(CXXFLAGS)" \
+ "CFLAGS_FOR_BUILD=$(CFLAGS_FOR_BUILD)" \
+ "CFLAGS_FOR_TARGET=$(CFLAGS_FOR_TARGET)" \
+ "INSTALL=$(INSTALL)" \
+ "INSTALL_DATA=$(INSTALL_DATA)" \
+ "INSTALL_PROGRAM=$(INSTALL_PROGRAM)" \
+ "INSTALL_SCRIPT=$(INSTALL_SCRIPT)" \
+ "LDFLAGS=$(LDFLAGS)" \
+ "LIBCFLAGS=$(LIBCFLAGS)" \
+ "LIBCFLAGS_FOR_TARGET=$(LIBCFLAGS_FOR_TARGET)" \
+ "MAKE=$(MAKE)" \
+ "MAKEINFO=$(MAKEINFO) $(MAKEINFOFLAGS)" \
+ "PICFLAG=$(PICFLAG)" \
+ "PICFLAG_FOR_TARGET=$(PICFLAG_FOR_TARGET)" \
+ "SHELL=$(SHELL)" \
+ "EXPECT=$(EXPECT)" \
+ "RUNTEST=$(RUNTEST)" \
+ "RUNTESTFLAGS=$(RUNTESTFLAGS)" \
+ "exec_prefix=$(exec_prefix)" \
+ "infodir=$(infodir)" \
+ "libdir=$(libdir)" \
+ "prefix=$(prefix)" \
+ "tooldir=$(tooldir)" \
+ "AR=$(AR)" \
+ "AS=$(AS)" \
+ "CC=$(CC)" \
+ "CXX=$(CXX)" \
+ "LD=$(LD)" \
+ "LIBCFLAGS=$(LIBCFLAGS)" \
+ "NM=$(NM)" \
+ "PICFLAG=$(PICFLAG)" \
+ "RANLIB=$(RANLIB)" \
+ "DESTDIR=$(DESTDIR)"
+
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+mkinstalldirs = $(SHELL) $(top_srcdir)/../mkinstalldirs
+CONFIG_CLEAN_FILES =
+LTLIBRARIES = $(toolexeclib_LTLIBRARIES)
+
+
+DEFS = @DEFS@ -I. -I$(srcdir)
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+libzgcj_la_LIBADD =
+libzgcj_la_OBJECTS = adler32.lo compress.lo crc32.lo deflate.lo gzio.lo \
+infblock.lo infcodes.lo inffast.lo inflate.lo inftrees.lo infutil.lo \
+trees.lo uncompr.lo zutil.lo
+CFLAGS = @CFLAGS@
+COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
+DIST_COMMON = README ChangeLog Makefile.am Makefile.in acinclude.m4 \
+aclocal.m4 configure configure.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = tar
+GZIP_ENV = --best
+SOURCES = $(libzgcj_la_SOURCES)
+OBJECTS = $(libzgcj_la_OBJECTS)
+
+all: all-redirect
+.SUFFIXES:
+.SUFFIXES: .S .c .lo .o .s
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+ cd $(top_srcdir) && $(AUTOMAKE) --cygnus Makefile
+
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ cd $(top_builddir) \
+ && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ configure.in acinclude.m4
+ cd $(srcdir) && $(ACLOCAL)
+
+config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ $(SHELL) ./config.status --recheck
+$(srcdir)/configure: @MAINTAINER_MODE_TRUE@$(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES)
+ cd $(srcdir) && $(AUTOCONF)
+
+mostlyclean-toolexeclibLTLIBRARIES:
+
+clean-toolexeclibLTLIBRARIES:
+ -test -z "$(toolexeclib_LTLIBRARIES)" || rm -f $(toolexeclib_LTLIBRARIES)
+
+distclean-toolexeclibLTLIBRARIES:
+
+maintainer-clean-toolexeclibLTLIBRARIES:
+
+install-toolexeclibLTLIBRARIES: $(toolexeclib_LTLIBRARIES)
+ @$(NORMAL_INSTALL)
+ $(mkinstalldirs) $(DESTDIR)$(toolexeclibdir)
+ @list='$(toolexeclib_LTLIBRARIES)'; for p in $$list; do \
+ if test -f $$p; then \
+ echo "$(LIBTOOL) --mode=install $(INSTALL) $$p $(DESTDIR)$(toolexeclibdir)/$$p"; \
+ $(LIBTOOL) --mode=install $(INSTALL) $$p $(DESTDIR)$(toolexeclibdir)/$$p; \
+ else :; fi; \
+ done
+
+uninstall-toolexeclibLTLIBRARIES:
+ @$(NORMAL_UNINSTALL)
+ list='$(toolexeclib_LTLIBRARIES)'; for p in $$list; do \
+ $(LIBTOOL) --mode=uninstall rm -f $(DESTDIR)$(toolexeclibdir)/$$p; \
+ done
+
+.c.o:
+ $(COMPILE) -c $<
+
+.s.o:
+ $(COMPILE) -c $<
+
+.S.o:
+ $(COMPILE) -c $<
+
+mostlyclean-compile:
+ -rm -f *.o core *.core
+
+clean-compile:
+
+distclean-compile:
+ -rm -f *.tab.c
+
+maintainer-clean-compile:
+
+.c.lo:
+ $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+
+.s.lo:
+ $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+
+.S.lo:
+ $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+
+maintainer-clean-libtool:
+
+libzgcj.la: $(libzgcj_la_OBJECTS) $(libzgcj_la_DEPENDENCIES)
+ $(LINK) $(libzgcj_la_LDFLAGS) $(libzgcj_la_OBJECTS) $(libzgcj_la_LIBADD) $(LIBS)
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ here=`pwd` && cd $(srcdir) \
+ && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+ || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+ -rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+
+# This target untars the dist file and tries a VPATH configuration. Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+ -rm -rf $(distdir)
+ GZIP=$(GZIP_ENV) $(TAR) zxf $(distdir).tar.gz
+ mkdir $(distdir)/=build
+ mkdir $(distdir)/=inst
+ dc_install_base=`cd $(distdir)/=inst && pwd`; \
+ cd $(distdir)/=build \
+ && ../configure --srcdir=.. --prefix=$$dc_install_base \
+ && $(MAKE) $(AM_MAKEFLAGS) \
+ && $(MAKE) $(AM_MAKEFLAGS) dvi \
+ && $(MAKE) $(AM_MAKEFLAGS) check \
+ && $(MAKE) $(AM_MAKEFLAGS) install \
+ && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+ && $(MAKE) $(AM_MAKEFLAGS) dist
+ -rm -rf $(distdir)
+ @banner="$(distdir).tar.gz is ready for distribution"; \
+ dashes=`echo "$$banner" | sed s/./=/g`; \
+ echo "$$dashes"; \
+ echo "$$banner"; \
+ echo "$$dashes"
+dist: distdir
+ -chmod -R a+r $(distdir)
+ GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir)
+ -rm -rf $(distdir)
+dist-all: distdir
+ -chmod -R a+r $(distdir)
+ GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir)
+ -rm -rf $(distdir)
+distdir: $(DISTFILES)
+ -rm -rf $(distdir)
+ mkdir $(distdir)
+ -chmod 777 $(distdir)
+ @for file in $(DISTFILES); do \
+ if test -f $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ cp -pr $$/$$file $(distdir)/$$file; \
+ else \
+ test -f $(distdir)/$$file \
+ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+ || cp -p $$d/$$file $(distdir)/$$file || :; \
+ fi; \
+ done
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am:
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-info-am:
+install-info: install-info-am
+install-exec-am: install-toolexeclibLTLIBRARIES
+install-exec: install-exec-am
+
+install-data-am:
+install-data: install-data-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am: uninstall-toolexeclibLTLIBRARIES
+uninstall: uninstall-am
+all-am: Makefile $(LTLIBRARIES)
+all-redirect: all-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+ $(mkinstalldirs) $(DESTDIR)$(toolexeclibdir)
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES)
+ -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am: mostlyclean-toolexeclibLTLIBRARIES mostlyclean-compile \
+ mostlyclean-libtool mostlyclean-tags \
+ mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am: clean-toolexeclibLTLIBRARIES clean-compile clean-libtool \
+ clean-tags clean-generic mostlyclean-am
+
+clean: clean-am
+
+distclean-am: distclean-toolexeclibLTLIBRARIES distclean-compile \
+ distclean-libtool distclean-tags distclean-generic \
+ clean-am
+ -rm -f libtool
+
+distclean: distclean-am
+ -rm -f config.status
+
+maintainer-clean-am: maintainer-clean-toolexeclibLTLIBRARIES \
+ maintainer-clean-compile maintainer-clean-libtool \
+ maintainer-clean-tags maintainer-clean-generic \
+ distclean-am
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+ -rm -f config.status
+
+.PHONY: mostlyclean-toolexeclibLTLIBRARIES \
+distclean-toolexeclibLTLIBRARIES clean-toolexeclibLTLIBRARIES \
+maintainer-clean-toolexeclibLTLIBRARIES \
+uninstall-toolexeclibLTLIBRARIES install-toolexeclibLTLIBRARIES \
+mostlyclean-compile distclean-compile clean-compile \
+maintainer-clean-compile mostlyclean-libtool distclean-libtool \
+clean-libtool maintainer-clean-libtool tags mostlyclean-tags \
+distclean-tags clean-tags maintainer-clean-tags distdir info-am info \
+dvi-am dvi check check-am installcheck-am installcheck install-info-am \
+install-info install-exec-am install-exec install-data-am install-data \
+install-am install uninstall-am uninstall all-redirect all-am all \
+installdirs mostlyclean-generic distclean-generic clean-generic \
+maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+
+
+# Multilib support.
+.PHONY: all-multi mostlyclean-multi clean-multi distclean-multi \
+ maintainer-clean-multi
+
+all-am: all-multi
+install-am: install-multi
+mostlyclean-am: mostlyclean-multi
+clean-am: clean-multi
+distclean-am: distclean-multi
+maintainer-clean-am: maintainer-clean-multi
+
+all-multi:
+ $(MULTIDO) $(AM_MAKEFLAGS) DO=all multi-do
+install-multi:
+ $(MULTIDO) $(AM_MAKEFLAGS) DO=install multi-do
+mostlyclean-multi:
+ $(MULTICLEAN) $(AM_MAKEFLAGS) DO=mostlyclean multi-clean
+clean-multi:
+ $(MULTICLEAN) $(AM_MAKEFLAGS) DO=clean multi-clean
+distclean-multi:
+ $(MULTICLEAN) $(AM_MAKEFLAGS) DO=distclean multi-clean
+maintainer-clean-multi:
+ $(MULTICLEAN) $(AM_MAKEFLAGS) DO=maintainer-clean multi-clean
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/zlib/Makefile.riscos b/zlib/Makefile.riscos
new file mode 100644
index 00000000000..d97f4492370
--- /dev/null
+++ b/zlib/Makefile.riscos
@@ -0,0 +1,151 @@
+# Project: zlib_1_03
+# Patched for zlib 1.1.2 rw@shadow.org.uk 19980430
+# test works out-of-the-box, installs `somewhere' on demand
+
+# Toolflags:
+CCflags = -c -depend !Depend -IC: -g -throwback -DRISCOS -fah
+C++flags = -c -depend !Depend -IC: -throwback
+Linkflags = -aif -c++ -o $@
+ObjAsmflags = -throwback -NoCache -depend !Depend
+CMHGflags =
+LibFileflags = -c -l -o $@
+Squeezeflags = -o $@
+
+# change the line below to where _you_ want the library installed.
+libdest = lib:zlib
+
+# Final targets:
+@.lib: @.o.adler32 @.o.compress @.o.crc32 @.o.deflate @.o.gzio \
+ @.o.infblock @.o.infcodes @.o.inffast @.o.inflate @.o.inftrees @.o.infutil @.o.trees \
+ @.o.uncompr @.o.zutil
+ LibFile $(LibFileflags) @.o.adler32 @.o.compress @.o.crc32 @.o.deflate \
+ @.o.gzio @.o.infblock @.o.infcodes @.o.inffast @.o.inflate @.o.inftrees @.o.infutil \
+ @.o.trees @.o.uncompr @.o.zutil
+test: @.minigzip @.example @.lib
+ @copy @.lib @.libc A~C~DF~L~N~P~Q~RS~TV
+ @echo running tests: hang on.
+ @/@.minigzip -f -9 libc
+ @/@.minigzip -d libc-gz
+ @/@.minigzip -f -1 libc
+ @/@.minigzip -d libc-gz
+ @/@.minigzip -h -9 libc
+ @/@.minigzip -d libc-gz
+ @/@.minigzip -h -1 libc
+ @/@.minigzip -d libc-gz
+ @/@.minigzip -9 libc
+ @/@.minigzip -d libc-gz
+ @/@.minigzip -1 libc
+ @/@.minigzip -d libc-gz
+ @diff @.lib @.libc
+ @echo that should have reported '@.lib and @.libc identical' if you have diff.
+ @/@.example @.fred @.fred
+ @echo that will have given lots of hello!'s.
+
+@.minigzip: @.o.minigzip @.lib C:o.Stubs
+ Link $(Linkflags) @.o.minigzip @.lib C:o.Stubs
+@.example: @.o.example @.lib C:o.Stubs
+ Link $(Linkflags) @.o.example @.lib C:o.Stubs
+
+install: @.lib
+ cdir $(libdest)
+ cdir $(libdest).h
+ @copy @.h.zlib $(libdest).h.zlib A~C~DF~L~N~P~Q~RS~TV
+ @copy @.h.zconf $(libdest).h.zconf A~C~DF~L~N~P~Q~RS~TV
+ @copy @.lib $(libdest).lib A~C~DF~L~N~P~Q~RS~TV
+ @echo okay, installed zlib in $(libdest)
+
+clean:; remove @.minigzip
+ remove @.example
+ remove @.libc
+ -wipe @.o.* F~r~cV
+ remove @.fred
+
+# User-editable dependencies:
+.c.o:
+ cc $(ccflags) -o $@ $<
+
+# Static dependencies:
+
+# Dynamic dependencies:
+o.example: c.example
+o.example: h.zlib
+o.example: h.zconf
+o.minigzip: c.minigzip
+o.minigzip: h.zlib
+o.minigzip: h.zconf
+o.adler32: c.adler32
+o.adler32: h.zlib
+o.adler32: h.zconf
+o.compress: c.compress
+o.compress: h.zlib
+o.compress: h.zconf
+o.crc32: c.crc32
+o.crc32: h.zlib
+o.crc32: h.zconf
+o.deflate: c.deflate
+o.deflate: h.deflate
+o.deflate: h.zutil
+o.deflate: h.zlib
+o.deflate: h.zconf
+o.gzio: c.gzio
+o.gzio: h.zutil
+o.gzio: h.zlib
+o.gzio: h.zconf
+o.infblock: c.infblock
+o.infblock: h.zutil
+o.infblock: h.zlib
+o.infblock: h.zconf
+o.infblock: h.infblock
+o.infblock: h.inftrees
+o.infblock: h.infcodes
+o.infblock: h.infutil
+o.infcodes: c.infcodes
+o.infcodes: h.zutil
+o.infcodes: h.zlib
+o.infcodes: h.zconf
+o.infcodes: h.inftrees
+o.infcodes: h.infblock
+o.infcodes: h.infcodes
+o.infcodes: h.infutil
+o.infcodes: h.inffast
+o.inffast: c.inffast
+o.inffast: h.zutil
+o.inffast: h.zlib
+o.inffast: h.zconf
+o.inffast: h.inftrees
+o.inffast: h.infblock
+o.inffast: h.infcodes
+o.inffast: h.infutil
+o.inffast: h.inffast
+o.inflate: c.inflate
+o.inflate: h.zutil
+o.inflate: h.zlib
+o.inflate: h.zconf
+o.inflate: h.infblock
+o.inftrees: c.inftrees
+o.inftrees: h.zutil
+o.inftrees: h.zlib
+o.inftrees: h.zconf
+o.inftrees: h.inftrees
+o.inftrees: h.inffixed
+o.infutil: c.infutil
+o.infutil: h.zutil
+o.infutil: h.zlib
+o.infutil: h.zconf
+o.infutil: h.infblock
+o.infutil: h.inftrees
+o.infutil: h.infcodes
+o.infutil: h.infutil
+o.trees: c.trees
+o.trees: h.deflate
+o.trees: h.zutil
+o.trees: h.zlib
+o.trees: h.zconf
+o.trees: h.trees
+o.uncompr: c.uncompr
+o.uncompr: h.zlib
+o.uncompr: h.zconf
+o.zutil: c.zutil
+o.zutil: h.zutil
+o.zutil: h.zlib
+o.zutil: h.zconf
diff --git a/zlib/README b/zlib/README
new file mode 100644
index 00000000000..8ff458799b9
--- /dev/null
+++ b/zlib/README
@@ -0,0 +1,148 @@
+zlib 1.1.3 is a general purpose data compression library. All the code
+is thread safe. The data format used by the zlib library
+is described by RFCs (Request for Comments) 1950 to 1952 in the files
+ftp://ds.internic.net/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate
+format) and rfc1952.txt (gzip format). These documents are also available in
+other formats from ftp://ftp.uu.net/graphics/png/documents/zlib/zdoc-index.html
+
+All functions of the compression library are documented in the file zlib.h
+(volunteer to write man pages welcome, contact jloup@gzip.org). A usage
+example of the library is given in the file example.c which also tests that
+the library is working correctly. Another example is given in the file
+minigzip.c. The compression library itself is composed of all source files
+except example.c and minigzip.c.
+
+To compile all files and run the test program, follow the instructions
+given at the top of Makefile. In short "make test; make install"
+should work for most machines. For Unix: "configure; make test; make install"
+For MSDOS, use one of the special makefiles such as Makefile.msc.
+For VMS, use Make_vms.com or descrip.mms.
+
+Questions about zlib should be sent to <zlib@quest.jpl.nasa.gov>, or to
+Gilles Vollant <info@winimage.com> for the Windows DLL version.
+The zlib home page is http://www.cdrom.com/pub/infozip/zlib/
+The official zlib ftp site is ftp://ftp.cdrom.com/pub/infozip/zlib/
+Before reporting a problem, please check those sites to verify that
+you have the latest version of zlib; otherwise get the latest version and
+check whether the problem still exists or not.
+
+Mark Nelson <markn@tiny.com> wrote an article about zlib for the Jan. 1997
+issue of Dr. Dobb's Journal; a copy of the article is available in
+http://web2.airmail.net/markn/articles/zlibtool/zlibtool.htm
+
+The changes made in version 1.1.3 are documented in the file ChangeLog.
+The main changes since 1.1.2 are:
+
+- fix "an inflate input buffer bug that shows up on rare but persistent
+ occasions" (Mark)
+- fix gzread and gztell for concatenated .gz files (Didier Le Botlan)
+- fix gzseek(..., SEEK_SET) in write mode
+- fix crc check after a gzeek (Frank Faubert)
+- fix miniunzip when the last entry in a zip file is itself a zip file
+ (J Lillge)
+- add contrib/asm586 and contrib/asm686 (Brian Raiter)
+ See http://www.muppetlabs.com/~breadbox/software/assembly.html
+- add support for Delphi 3 in contrib/delphi (Bob Dellaca)
+- add support for C++Builder 3 and Delphi 3 in contrib/delphi2 (Davide Moretti)
+- do not exit prematurely in untgz if 0 at start of block (Magnus Holmgren)
+- use macro EXTERN instead of extern to support DLL for BeOS (Sander Stoks)
+- added a FAQ file
+
+plus many changes for portability.
+
+Unsupported third party contributions are provided in directory "contrib".
+
+A Java implementation of zlib is available in the Java Development Kit 1.1
+http://www.javasoft.com/products/JDK/1.1/docs/api/Package-java.util.zip.html
+See the zlib home page http://www.cdrom.com/pub/infozip/zlib/ for details.
+
+A Perl interface to zlib written by Paul Marquess <pmarquess@bfsec.bt.co.uk>
+is in the CPAN (Comprehensive Perl Archive Network) sites, such as:
+ftp://ftp.cis.ufl.edu/pub/perl/CPAN/modules/by-module/Compress/Compress-Zlib*
+
+A Python interface to zlib written by A.M. Kuchling <amk@magnet.com>
+is available in Python 1.5 and later versions, see
+http://www.python.org/doc/lib/module-zlib.html
+
+A zlib binding for TCL written by Andreas Kupries <a.kupries@westend.com>
+is availlable at http://www.westend.com/~kupries/doc/trf/man/man.html
+
+An experimental package to read and write files in .zip format,
+written on top of zlib by Gilles Vollant <info@winimage.com>, is
+available at http://www.winimage.com/zLibDll/unzip.html
+and also in the contrib/minizip directory of zlib.
+
+
+Notes for some targets:
+
+- To build a Windows DLL version, include in a DLL project zlib.def, zlib.rc
+ and all .c files except example.c and minigzip.c; compile with -DZLIB_DLL
+ The zlib DLL support was initially done by Alessandro Iacopetti and is
+ now maintained by Gilles Vollant <info@winimage.com>. Check the zlib DLL
+ home page at http://www.winimage.com/zLibDll
+
+ From Visual Basic, you can call the DLL functions which do not take
+ a structure as argument: compress, uncompress and all gz* functions.
+ See contrib/visual-basic.txt for more information, or get
+ http://www.tcfb.com/dowseware/cmp-z-it.zip
+
+- For 64-bit Irix, deflate.c must be compiled without any optimization.
+ With -O, one libpng test fails. The test works in 32 bit mode (with
+ the -n32 compiler flag). The compiler bug has been reported to SGI.
+
+- zlib doesn't work with gcc 2.6.3 on a DEC 3000/300LX under OSF/1 2.1
+ it works when compiled with cc.
+
+- on Digital Unix 4.0D (formely OSF/1) on AlphaServer, the cc option -std1
+ is necessary to get gzprintf working correctly. This is done by configure.
+
+- zlib doesn't work on HP-UX 9.05 with some versions of /bin/cc. It works
+ with other compilers. Use "make test" to check your compiler.
+
+- gzdopen is not supported on RISCOS, BEOS and by some Mac compilers.
+
+- For Turbo C the small model is supported only with reduced performance to
+ avoid any far allocation; it was tested with -DMAX_WBITS=11 -DMAX_MEM_LEVEL=3
+
+- For PalmOs, see http://www.cs.uit.no/~perm/PASTA/pilot/software.html
+ Per Harald Myrvang <perm@stud.cs.uit.no>
+
+
+Acknowledgments:
+
+ The deflate format used by zlib was defined by Phil Katz. The deflate
+ and zlib specifications were written by L. Peter Deutsch. Thanks to all the
+ people who reported problems and suggested various improvements in zlib;
+ they are too numerous to cite here.
+
+Copyright notice:
+
+ (C) 1995-1998 Jean-loup Gailly and Mark Adler
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
+ Jean-loup Gailly Mark Adler
+ jloup@gzip.org madler@alumni.caltech.edu
+
+If you use the zlib library in a product, we would appreciate *not*
+receiving lengthy legal documents to sign. The sources are provided
+for free but without warranty of any kind. The library has been
+entirely written by Jean-loup Gailly and Mark Adler; it does not
+include third-party code.
+
+If you redistribute modified sources, we would appreciate that you include
+in the file ChangeLog history information documenting your changes.
diff --git a/zlib/acinclude.m4 b/zlib/acinclude.m4
new file mode 100644
index 00000000000..67bb203341e
--- /dev/null
+++ b/zlib/acinclude.m4
@@ -0,0 +1,37 @@
+# FIXME: We temporarily define our own version of AC_PROG_CC. This is
+# copied from autoconf 2.12, but does not call AC_PROG_CC_WORKS. We
+# are probably using a cross compiler, which will not be able to fully
+# link an executable. This should really be fixed in autoconf
+# itself.
+
+AC_DEFUN(LIB_AC_PROG_CC,
+[AC_BEFORE([$0], [AC_PROG_CPP])dnl
+AC_CHECK_PROG(CC, gcc, gcc)
+if test -z "$CC"; then
+ AC_CHECK_PROG(CC, cc, cc, , , /usr/ucb/cc)
+ test -z "$CC" && AC_MSG_ERROR([no acceptable cc found in \$PATH])
+fi
+
+AC_PROG_CC_GNU
+
+if test $ac_cv_prog_gcc = yes; then
+ GCC=yes
+dnl Check whether -g works, even if CFLAGS is set, in case the package
+dnl plays around with CFLAGS (such as to build both debugging and
+dnl normal versions of a library), tasteless as that idea is.
+ ac_test_CFLAGS="${CFLAGS+set}"
+ ac_save_CFLAGS="$CFLAGS"
+ CFLAGS=
+ AC_PROG_CC_G
+ if test "$ac_test_CFLAGS" = set; then
+ CFLAGS="$ac_save_CFLAGS"
+ elif test $ac_cv_prog_cc_g = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-O2"
+ fi
+else
+ GCC=
+ test "${CFLAGS+set}" = set || CFLAGS="-g"
+fi
+])
diff --git a/zlib/aclocal.m4 b/zlib/aclocal.m4
new file mode 100644
index 00000000000..24c14c5195c
--- /dev/null
+++ b/zlib/aclocal.m4
@@ -0,0 +1,779 @@
+dnl aclocal.m4 generated automatically by aclocal 1.4
+
+dnl Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl This program is distributed in the hope that it will be useful,
+dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+dnl PARTICULAR PURPOSE.
+
+# FIXME: We temporarily define our own version of AC_PROG_CC. This is
+# copied from autoconf 2.12, but does not call AC_PROG_CC_WORKS. We
+# are probably using a cross compiler, which will not be able to fully
+# link an executable. This should really be fixed in autoconf
+# itself.
+
+AC_DEFUN(LIB_AC_PROG_CC,
+[AC_BEFORE([$0], [AC_PROG_CPP])dnl
+AC_CHECK_PROG(CC, gcc, gcc)
+if test -z "$CC"; then
+ AC_CHECK_PROG(CC, cc, cc, , , /usr/ucb/cc)
+ test -z "$CC" && AC_MSG_ERROR([no acceptable cc found in \$PATH])
+fi
+
+AC_PROG_CC_GNU
+
+if test $ac_cv_prog_gcc = yes; then
+ GCC=yes
+dnl Check whether -g works, even if CFLAGS is set, in case the package
+dnl plays around with CFLAGS (such as to build both debugging and
+dnl normal versions of a library), tasteless as that idea is.
+ ac_test_CFLAGS="${CFLAGS+set}"
+ ac_save_CFLAGS="$CFLAGS"
+ CFLAGS=
+ AC_PROG_CC_G
+ if test "$ac_test_CFLAGS" = set; then
+ CFLAGS="$ac_save_CFLAGS"
+ elif test $ac_cv_prog_cc_g = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-O2"
+ fi
+else
+ GCC=
+ test "${CFLAGS+set}" = set || CFLAGS="-g"
+fi
+])
+
+# Do all the work for Automake. This macro actually does too much --
+# some checks are only needed if your package does certain things.
+# But this isn't really a big deal.
+
+# serial 1
+
+dnl Usage:
+dnl AM_INIT_AUTOMAKE(package,version, [no-define])
+
+AC_DEFUN(AM_INIT_AUTOMAKE,
+[AC_REQUIRE([AC_PROG_INSTALL])
+PACKAGE=[$1]
+AC_SUBST(PACKAGE)
+VERSION=[$2]
+AC_SUBST(VERSION)
+dnl test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then
+ AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+fi
+ifelse([$3],,
+AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package]))
+AC_REQUIRE([AM_SANITY_CHECK])
+AC_REQUIRE([AC_ARG_PROGRAM])
+dnl FIXME This is truly gross.
+missing_dir=`cd $ac_aux_dir && pwd`
+AM_MISSING_PROG(ACLOCAL, aclocal, $missing_dir)
+AM_MISSING_PROG(AUTOCONF, autoconf, $missing_dir)
+AM_MISSING_PROG(AUTOMAKE, automake, $missing_dir)
+AM_MISSING_PROG(AUTOHEADER, autoheader, $missing_dir)
+AM_MISSING_PROG(MAKEINFO, makeinfo, $missing_dir)
+AC_REQUIRE([AC_PROG_MAKE_SET])])
+
+#
+# Check to make sure that the build environment is sane.
+#
+
+AC_DEFUN(AM_SANITY_CHECK,
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftestfile
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null`
+ if test "[$]*" = "X"; then
+ # -L didn't work.
+ set X `ls -t $srcdir/configure conftestfile`
+ fi
+ if test "[$]*" != "X $srcdir/configure conftestfile" \
+ && test "[$]*" != "X conftestfile $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken
+alias in your environment])
+ fi
+
+ test "[$]2" = conftestfile
+ )
+then
+ # Ok.
+ :
+else
+ AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+rm -f conftest*
+AC_MSG_RESULT(yes)])
+
+dnl AM_MISSING_PROG(NAME, PROGRAM, DIRECTORY)
+dnl The program must properly implement --version.
+AC_DEFUN(AM_MISSING_PROG,
+[AC_MSG_CHECKING(for working $2)
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf. Sigh.
+if ($2 --version) < /dev/null > /dev/null 2>&1; then
+ $1=$2
+ AC_MSG_RESULT(found)
+else
+ $1="$3/missing $2"
+ AC_MSG_RESULT(missing)
+fi
+AC_SUBST($1)])
+
+# Add --enable-maintainer-mode option to configure.
+# From Jim Meyering
+
+# serial 1
+
+AC_DEFUN(AM_MAINTAINER_MODE,
+[AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
+ dnl maintainer-mode is disabled by default
+ AC_ARG_ENABLE(maintainer-mode,
+[ --enable-maintainer-mode enable make rules and dependencies not useful
+ (and sometimes confusing) to the casual installer],
+ USE_MAINTAINER_MODE=$enableval,
+ USE_MAINTAINER_MODE=no)
+ AC_MSG_RESULT($USE_MAINTAINER_MODE)
+ AM_CONDITIONAL(MAINTAINER_MODE, test $USE_MAINTAINER_MODE = yes)
+ MAINT=$MAINTAINER_MODE_TRUE
+ AC_SUBST(MAINT)dnl
+]
+)
+
+# Define a conditional.
+
+AC_DEFUN(AM_CONDITIONAL,
+[AC_SUBST($1_TRUE)
+AC_SUBST($1_FALSE)
+if $2; then
+ $1_TRUE=
+ $1_FALSE='#'
+else
+ $1_TRUE='#'
+ $1_FALSE=
+fi])
+
+
+# serial 35 AC_PROG_LIBTOOL
+AC_DEFUN(AC_PROG_LIBTOOL,
+[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl
+
+# Save cache, so that ltconfig can load it
+AC_CACHE_SAVE
+
+# Actually configure libtool. ac_aux_dir is where install-sh is found.
+CC="$CC" CFLAGS="$CFLAGS" CPPFLAGS="$CPPFLAGS" \
+LD="$LD" NM="$NM" RANLIB="$RANLIB" LN_S="$LN_S" \
+DLLTOOL="$DLLTOOL" AS="$AS" \
+${CONFIG_SHELL-/bin/sh} $ac_aux_dir/ltconfig --no-reexec \
+$libtool_flags --no-verify $ac_aux_dir/ltmain.sh $host \
+|| AC_MSG_ERROR([libtool configure failed])
+
+# Reload cache, that may have been modified by ltconfig
+AC_CACHE_LOAD
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ac_aux_dir/ltconfig $ac_aux_dir/ltmain.sh"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+AC_SUBST(LIBTOOL)dnl
+
+# Redirect the config.log output again, so that the ltconfig log is not
+# clobbered by the next message.
+exec 5>>./config.log
+])
+
+AC_DEFUN(AC_LIBTOOL_SETUP,
+[AC_PREREQ(2.13)dnl
+AC_REQUIRE([AC_ENABLE_SHARED])dnl
+AC_REQUIRE([AC_ENABLE_STATIC])dnl
+AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+AC_REQUIRE([AC_PROG_RANLIB])dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_PROG_LD])dnl
+AC_REQUIRE([AC_PROG_NM])dnl
+AC_REQUIRE([AC_SYS_NM_PARSE])dnl
+AC_REQUIRE([AC_SYS_SYMBOL_UNDERSCORE])dnl
+AC_REQUIRE([AC_PROG_LN_S])dnl
+dnl
+
+# Check for any special flags to pass to ltconfig.
+libtool_flags="--cache-file=$cache_file"
+test "$enable_shared" = no && libtool_flags="$libtool_flags --disable-shared"
+test "$enable_static" = no && libtool_flags="$libtool_flags --disable-static"
+test "$enable_fast_install" = no && libtool_flags="$libtool_flags --disable-fast-install"
+test "$lt_dlopen" = yes && libtool_flags="$libtool_flags --enable-dlopen"
+test "$silent" = yes && libtool_flags="$libtool_flags --silent"
+test "$ac_cv_prog_gcc" = yes && libtool_flags="$libtool_flags --with-gcc"
+test "$ac_cv_prog_gnu_ld" = yes && libtool_flags="$libtool_flags --with-gnu-ld"
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case "$host" in
+*-*-irix6*)
+ # Find out which ABI we are using.
+ echo '[#]line __oline__ "configure"' > conftest.$ac_ext
+ if AC_TRY_EVAL(ac_compile); then
+ case "`/usr/bin/file conftest.o`" in
+ *32-bit*)
+ LD="${LD-ld} -32"
+ ;;
+ *N32*)
+ LD="${LD-ld} -n32"
+ ;;
+ *64-bit*)
+ LD="${LD-ld} -64"
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+
+*-*-sco3.2v5*)
+ # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+ SAVE_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -belf"
+ AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
+ [AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])])
+ if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+ # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+ CFLAGS="$SAVE_CFLAGS"
+ fi
+ ;;
+
+*-*-cygwin*)
+ AC_SYS_LIBTOOL_CYGWIN
+ ;;
+
+esac
+
+# enable the --disable-libtool-lock switch
+
+AC_ARG_ENABLE(libtool-lock,
+[ --disable-libtool-lock force libtool not to do file locking],
+need_locks=$enableval,
+need_locks=yes)
+
+if test x"$need_locks" = xno; then
+ libtool_flags="$libtool_flags --disable-lock"
+fi
+])
+
+# AC_LIBTOOL_DLOPEN - check for dlopen support
+AC_DEFUN(AC_LIBTOOL_DLOPEN, [lt_dlopen=yes])
+
+# AC_ENABLE_SHARED - implement the --enable-shared flag
+# Usage: AC_ENABLE_SHARED[(DEFAULT)]
+# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to
+# `yes'.
+AC_DEFUN(AC_ENABLE_SHARED,
+[define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl
+AC_ARG_ENABLE(shared,
+changequote(<<, >>)dnl
+<< --enable-shared[=PKGS] build shared libraries [default=>>AC_ENABLE_SHARED_DEFAULT],
+changequote([, ])dnl
+[p=${PACKAGE-default}
+case "$enableval" in
+yes) enable_shared=yes ;;
+no) enable_shared=no ;;
+*)
+ enable_shared=no
+ # Look at the argument we got. We use all the common list separators.
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
+ for pkg in $enableval; do
+ if test "X$pkg" = "X$p"; then
+ enable_shared=yes
+ fi
+ done
+ IFS="$ac_save_ifs"
+ ;;
+esac],
+enable_shared=AC_ENABLE_SHARED_DEFAULT)dnl
+])
+
+# AC_DISABLE_SHARED - set the default shared flag to --disable-shared
+AC_DEFUN(AC_DISABLE_SHARED,
+[AC_ENABLE_SHARED(no)])
+
+# AC_ENABLE_STATIC - implement the --enable-static flag
+# Usage: AC_ENABLE_STATIC[(DEFAULT)]
+# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to
+# `yes'.
+AC_DEFUN(AC_ENABLE_STATIC,
+[define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl
+AC_ARG_ENABLE(static,
+changequote(<<, >>)dnl
+<< --enable-static[=PKGS] build static libraries [default=>>AC_ENABLE_STATIC_DEFAULT],
+changequote([, ])dnl
+[p=${PACKAGE-default}
+case "$enableval" in
+yes) enable_static=yes ;;
+no) enable_static=no ;;
+*)
+ enable_static=no
+ # Look at the argument we got. We use all the common list separators.
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
+ for pkg in $enableval; do
+ if test "X$pkg" = "X$p"; then
+ enable_static=yes
+ fi
+ done
+ IFS="$ac_save_ifs"
+ ;;
+esac],
+enable_static=AC_ENABLE_STATIC_DEFAULT)dnl
+])
+
+# AC_DISABLE_STATIC - set the default static flag to --disable-static
+AC_DEFUN(AC_DISABLE_STATIC,
+[AC_ENABLE_STATIC(no)])
+
+
+# AC_ENABLE_FAST_INSTALL - implement the --enable-fast-install flag
+# Usage: AC_ENABLE_FAST_INSTALL[(DEFAULT)]
+# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to
+# `yes'.
+AC_DEFUN(AC_ENABLE_FAST_INSTALL,
+[define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl
+AC_ARG_ENABLE(fast-install,
+changequote(<<, >>)dnl
+<< --enable-fast-install[=PKGS] optimize for fast installation [default=>>AC_ENABLE_FAST_INSTALL_DEFAULT],
+changequote([, ])dnl
+[p=${PACKAGE-default}
+case "$enableval" in
+yes) enable_fast_install=yes ;;
+no) enable_fast_install=no ;;
+*)
+ enable_fast_install=no
+ # Look at the argument we got. We use all the common list separators.
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
+ for pkg in $enableval; do
+ if test "X$pkg" = "X$p"; then
+ enable_fast_install=yes
+ fi
+ done
+ IFS="$ac_save_ifs"
+ ;;
+esac],
+enable_fast_install=AC_ENABLE_FAST_INSTALL_DEFAULT)dnl
+])
+
+# AC_ENABLE_FAST_INSTALL - set the default to --disable-fast-install
+AC_DEFUN(AC_DISABLE_FAST_INSTALL,
+[AC_ENABLE_FAST_INSTALL(no)])
+
+
+# AC_PROG_LD - find the path to the GNU or non-GNU linker
+AC_DEFUN(AC_PROG_LD,
+[AC_ARG_WITH(gnu-ld,
+[ --with-gnu-ld assume the C compiler uses GNU ld [default=no]],
+test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no)
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+ac_prog=ld
+if test "$ac_cv_prog_gcc" = yes; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ AC_MSG_CHECKING([for ld used by GCC])
+ ac_prog=`($CC -print-prog-name=ld) 2>&5`
+ case "$ac_prog" in
+ # Accept absolute paths.
+changequote(,)dnl
+ /* | [A-Za-z]:[\\/]*)
+ re_direlt='/[^/][^/]*/\.\./'
+changequote([,])dnl
+ # Canonicalize the path of ld
+ ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'`
+ while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
+ ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
+ done
+ test -z "$LD" && LD="$ac_prog"
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ac_prog=ld
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+elif test "$with_gnu_ld" = yes; then
+ AC_MSG_CHECKING([for GNU ld])
+else
+ AC_MSG_CHECKING([for non-GNU ld])
+fi
+AC_CACHE_VAL(ac_cv_path_LD,
+[if test -z "$LD"; then
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog"; then
+ ac_cv_path_LD="$ac_dir/$ac_prog"
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some GNU ld's only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ if "$ac_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then
+ test "$with_gnu_ld" != no && break
+ else
+ test "$with_gnu_ld" != yes && break
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+else
+ ac_cv_path_LD="$LD" # Let the user override the test with a path.
+fi])
+LD="$ac_cv_path_LD"
+if test -n "$LD"; then
+ AC_MSG_RESULT($LD)
+else
+ AC_MSG_RESULT(no)
+fi
+test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
+AC_SUBST(LD)
+AC_PROG_LD_GNU
+])
+
+AC_DEFUN(AC_PROG_LD_GNU,
+[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], ac_cv_prog_gnu_ld,
+[# I'd rather use --version here, but apparently some GNU ld's only accept -v.
+if $LD -v 2>&1 </dev/null | egrep '(GNU|with BFD)' 1>&5; then
+ ac_cv_prog_gnu_ld=yes
+else
+ ac_cv_prog_gnu_ld=no
+fi])
+])
+
+# AC_PROG_NM - find the path to a BSD-compatible name lister
+AC_DEFUN(AC_PROG_NM,
+[AC_MSG_CHECKING([for BSD-compatible nm])
+AC_CACHE_VAL(ac_cv_path_NM,
+[if test -n "$NM"; then
+ # Let the user override the test.
+ ac_cv_path_NM="$NM"
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/nm; then
+ # Check to see if the nm accepts a BSD-compat flag.
+ # Adding the `sed 1q' prevents false positives on HP-UX, which says:
+ # nm: unknown option "B" ignored
+ if ($ac_dir/nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
+ ac_cv_path_NM="$ac_dir/nm -B"
+ break
+ elif ($ac_dir/nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
+ ac_cv_path_NM="$ac_dir/nm -p"
+ break
+ else
+ ac_cv_path_NM=${ac_cv_path_NM="$ac_dir/nm"} # keep the first match, but
+ continue # so that we can try to find one that supports BSD flags
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_NM" && ac_cv_path_NM=nm
+fi])
+NM="$ac_cv_path_NM"
+AC_MSG_RESULT([$NM])
+AC_SUBST(NM)
+])
+
+# AC_SYS_NM_PARSE - Check for command to grab the raw symbol name followed
+# by C symbol name from nm.
+AC_DEFUN(AC_SYS_NM_PARSE,
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_PROG_NM])dnl
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+AC_MSG_CHECKING([command to parse $NM output])
+AC_CACHE_VAL(ac_cv_sys_global_symbol_pipe,
+[# These are sane defaults that work on at least a few old systems.
+# {They come from Ultrix. What could be older than Ultrix?!! ;)}
+
+changequote(,)dnl
+# Character class describing NM global symbol codes.
+ac_symcode='[BCDEGRST]'
+
+# Regexp to match symbols that can be accessed directly from C.
+ac_sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
+
+# Transform the above into a raw symbol and a C symbol.
+ac_symxfrm='\1 \2\3 \3'
+
+# Transform an extracted symbol line into a proper C declaration
+ac_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern char \1;/p'"
+
+# Define system-specific variables.
+case "$host_os" in
+aix*)
+ ac_symcode='[BCDT]'
+ ;;
+cygwin* | mingw*)
+ ac_symcode='[ABCDGISTW]'
+ ;;
+hpux*)
+ ac_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern char \1();/p' -e 's/^. .* \(.*\)$/extern char \1;/p'"
+ ;;
+irix*)
+ ac_symcode='[BCDEGRST]'
+ ;;
+solaris*)
+ ac_symcode='[BDT]'
+ ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+if $NM -V 2>&1 | egrep '(GNU|with BFD)' > /dev/null; then
+ ac_symcode='[ABCDGISTW]'
+fi
+changequote([,])dnl
+
+# Try without a prefix undercore, then with it.
+for ac_symprfx in "" "_"; do
+
+ ac_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($ac_symcode\)[ ][ ]*\($ac_symprfx\)$ac_sympat$/$ac_symxfrm/p'"
+
+ # Check to see that the pipe works correctly.
+ ac_pipe_works=no
+ rm -f conftest.$ac_ext
+ cat > conftest.$ac_ext <<EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func;return 0;}
+EOF
+
+ if AC_TRY_EVAL(ac_compile); then
+ # Now try to grab the symbols.
+ ac_nlist=conftest.nm
+
+ if AC_TRY_EVAL(NM conftest.$ac_objext \| $ac_cv_sys_global_symbol_pipe \> $ac_nlist) && test -s "$ac_nlist"; then
+
+ # Try sorting and uniquifying the output.
+ if sort "$ac_nlist" | uniq > "$ac_nlist"T; then
+ mv -f "$ac_nlist"T "$ac_nlist"
+ else
+ rm -f "$ac_nlist"T
+ fi
+
+ # Make sure that we snagged all the symbols we need.
+ if egrep ' nm_test_var$' "$ac_nlist" >/dev/null; then
+ if egrep ' nm_test_func$' "$ac_nlist" >/dev/null; then
+ cat <<EOF > conftest.c
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+EOF
+ # Now generate the symbol file.
+ eval "$ac_global_symbol_to_cdecl"' < "$ac_nlist" >> conftest.c'
+
+ cat <<EOF >> conftest.c
+#if defined (__STDC__) && __STDC__
+# define lt_ptr_t void *
+#else
+# define lt_ptr_t char *
+# define const
+#endif
+
+/* The mapping between symbol names and symbols. */
+const struct {
+ const char *name;
+ lt_ptr_t address;
+}
+changequote(,)dnl
+lt_preloaded_symbols[] =
+changequote([,])dnl
+{
+EOF
+ sed 's/^. \(.*\) \(.*\)$/ {"\2", (lt_ptr_t) \&\2},/' < "$ac_nlist" >> conftest.c
+ cat <<\EOF >> conftest.c
+ {0, (lt_ptr_t) 0}
+};
+
+#ifdef __cplusplus
+}
+#endif
+EOF
+ # Now try linking the two files.
+ mv conftest.$ac_objext conftestm.$ac_objext
+ ac_save_LIBS="$LIBS"
+ ac_save_CFLAGS="$CFLAGS"
+ LIBS="conftestm.$ac_objext"
+ CFLAGS="$CFLAGS$no_builtin_flag"
+ if AC_TRY_EVAL(ac_link) && test -s conftest; then
+ ac_pipe_works=yes
+ else
+ echo "configure: failed program was:" >&AC_FD_CC
+ cat conftest.c >&AC_FD_CC
+ fi
+ LIBS="$ac_save_LIBS"
+ CFLAGS="$ac_save_CFLAGS"
+ else
+ echo "cannot find nm_test_func in $ac_nlist" >&AC_FD_CC
+ fi
+ else
+ echo "cannot find nm_test_var in $ac_nlist" >&AC_FD_CC
+ fi
+ else
+ echo "cannot run $ac_cv_sys_global_symbol_pipe" >&AC_FD_CC
+ fi
+ else
+ echo "$progname: failed program was:" >&AC_FD_CC
+ cat conftest.c >&AC_FD_CC
+ fi
+ rm -rf conftest*
+
+ # Do not use the global_symbol_pipe unless it works.
+ if test "$ac_pipe_works" = yes; then
+ if test x"$ac_symprfx" = x"_"; then
+ ac_cv_sys_symbol_underscore=yes
+ else
+ ac_cv_sys_symbol_underscore=no
+ fi
+ break
+ else
+ ac_cv_sys_global_symbol_pipe=
+ fi
+done
+])
+
+ac_result=yes
+if test -z "$ac_cv_sys_global_symbol_pipe"; then
+ ac_result=no
+fi
+AC_MSG_RESULT($ac_result)
+])
+
+# AC_SYS_LIBTOOL_CYGWIN - find tools needed on cygwin
+AC_DEFUN(AC_SYS_LIBTOOL_CYGWIN,
+[AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+AC_CHECK_TOOL(AS, as, false)
+])
+
+# AC_SYS_SYMBOL_UNDERSCORE - does the compiler prefix global symbols
+# with an underscore?
+AC_DEFUN(AC_SYS_SYMBOL_UNDERSCORE,
+[AC_REQUIRE([AC_PROG_NM])dnl
+AC_REQUIRE([AC_SYS_NM_PARSE])dnl
+AC_MSG_CHECKING([for _ prefix in compiled symbols])
+AC_CACHE_VAL(ac_cv_sys_symbol_underscore,
+[ac_cv_sys_symbol_underscore=no
+cat > conftest.$ac_ext <<EOF
+void nm_test_func(){}
+int main(){nm_test_func;return 0;}
+EOF
+if AC_TRY_EVAL(ac_compile); then
+ # Now try to grab the symbols.
+ ac_nlist=conftest.nm
+ if AC_TRY_EVAL(NM conftest.$ac_objext \| $ac_cv_sys_global_symbol_pipe \> $ac_nlist) && test -s "$ac_nlist"; then
+ # See whether the symbols have a leading underscore.
+ if egrep '^. _nm_test_func' "$ac_nlist" >/dev/null; then
+ ac_cv_sys_symbol_underscore=yes
+ else
+ if egrep '^. nm_test_func ' "$ac_nlist" >/dev/null; then
+ :
+ else
+ echo "configure: cannot find nm_test_func in $ac_nlist" >&AC_FD_CC
+ fi
+ fi
+ else
+ echo "configure: cannot run $ac_cv_sys_global_symbol_pipe" >&AC_FD_CC
+ fi
+else
+ echo "configure: failed program was:" >&AC_FD_CC
+ cat conftest.c >&AC_FD_CC
+fi
+rm -rf conftest*
+])
+AC_MSG_RESULT($ac_cv_sys_symbol_underscore)
+USE_SYMBOL_UNDERSCORE=${ac_cv_sys_symbol_underscore=no}
+AC_SUBST(USE_SYMBOL_UNDERSCORE)dnl
+])
+
+# AC_CHECK_LIBM - check for math library
+AC_DEFUN(AC_CHECK_LIBM, [
+AC_CHECK_LIB(mw, _mwvalidcheckl)
+AC_CHECK_LIB(m, cos)
+])
+
+# AC_LIBLTDL_CONVENIENCE[(dir)] - sets LIBLTDL to the link flags for
+# the libltdl convenience library, adds --enable-ltdl-convenience to
+# the configure arguments. Note that LIBLTDL is not AC_SUBSTed, nor
+# is AC_CONFIG_SUBDIRS called. If DIR is not provided, it is assumed
+# to be `${top_builddir}/libltdl'. Make sure you start DIR with
+# '${top_builddir}/' (note the single quotes!) if your package is not
+# flat, and, if you're not using automake, define top_builddir as
+# appropriate in the Makefiles.
+AC_DEFUN(AC_LIBLTDL_CONVENIENCE, [
+ case "$enable_ltdl_convenience" in
+ no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;;
+ "") enable_ltdl_convenience=yes
+ ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;;
+ esac
+ LIBLTDL=ifelse($#,1,$1,['${top_builddir}/libltdl'])/libltdlc.la
+])
+
+# AC_LIBLTDL_INSTALLABLE[(dir)] - sets LIBLTDL to the link flags for
+# the libltdl installable library, and adds --enable-ltdl-install to
+# the configure arguments. Note that LIBLTDL is not AC_SUBSTed, nor
+# is AC_CONFIG_SUBDIRS called. If DIR is not provided, it is assumed
+# to be `${top_builddir}/libltdl'. Make sure you start DIR with
+# '${top_builddir}/' (note the single quotes!) if your package is not
+# flat, and, if you're not using automake, define top_builddir as
+# appropriate in the Makefiles.
+# In the future, this macro may have to be called after AC_PROG_LIBTOOL.
+AC_DEFUN(AC_LIBLTDL_INSTALLABLE, [
+ AC_CHECK_LIB(ltdl, main, LIBLTDL="-lltdl", [
+ case "$enable_ltdl_install" in
+ no) AC_MSG_WARN([libltdl not installed, but installation disabled]) ;;
+ "") enable_ltdl_install=yes
+ ac_configure_args="$ac_configure_args --enable-ltdl-install" ;;
+ esac
+ ])
+ if test x"$enable_ltdl_install" != x"no"; then
+ LIBLTDL=ifelse($#,1,$1,['${top_builddir}/libltdl'])/libltdl.la
+ fi
+])
+
+dnl old names
+AC_DEFUN(AM_PROG_LIBTOOL, [indir([AC_PROG_LIBTOOL])])dnl
+AC_DEFUN(AM_ENABLE_SHARED, [indir([AC_ENABLE_SHARED], $@)])dnl
+AC_DEFUN(AM_ENABLE_STATIC, [indir([AC_ENABLE_STATIC], $@)])dnl
+AC_DEFUN(AM_DISABLE_SHARED, [indir([AC_DISABLE_SHARED], $@)])dnl
+AC_DEFUN(AM_DISABLE_STATIC, [indir([AC_DISABLE_STATIC], $@)])dnl
+AC_DEFUN(AM_PROG_LD, [indir([AC_PROG_LD])])dnl
+AC_DEFUN(AM_PROG_NM, [indir([AC_PROG_NM])])dnl
+AC_DEFUN(AM_SYS_NM_PARSE, [indir([AC_SYS_NM_PARSE])])dnl
+AC_DEFUN(AM_SYS_SYMBOL_UNDERSCORE, [indir([AC_SYS_SYMBOL_UNDERSCORE])])dnl
+AC_DEFUN(AM_SYS_LIBTOOL_CYGWIN, [indir([AC_SYS_LIBTOOL_CYGWIN])])dnl
+
diff --git a/zlib/adler32.c b/zlib/adler32.c
new file mode 100644
index 00000000000..16cf9a703f7
--- /dev/null
+++ b/zlib/adler32.c
@@ -0,0 +1,48 @@
+/* adler32.c -- compute the Adler-32 checksum of a data stream
+ * Copyright (C) 1995-1998 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* @(#) $Id$ */
+
+#include "zlib.h"
+
+#define BASE 65521L /* largest prime smaller than 65536 */
+#define NMAX 5552
+/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */
+
+#define DO1(buf,i) {s1 += buf[i]; s2 += s1;}
+#define DO2(buf,i) DO1(buf,i); DO1(buf,i+1);
+#define DO4(buf,i) DO2(buf,i); DO2(buf,i+2);
+#define DO8(buf,i) DO4(buf,i); DO4(buf,i+4);
+#define DO16(buf) DO8(buf,0); DO8(buf,8);
+
+/* ========================================================================= */
+uLong ZEXPORT adler32(adler, buf, len)
+ uLong adler;
+ const Bytef *buf;
+ uInt len;
+{
+ unsigned long s1 = adler & 0xffff;
+ unsigned long s2 = (adler >> 16) & 0xffff;
+ int k;
+
+ if (buf == Z_NULL) return 1L;
+
+ while (len > 0) {
+ k = len < NMAX ? len : NMAX;
+ len -= k;
+ while (k >= 16) {
+ DO16(buf);
+ buf += 16;
+ k -= 16;
+ }
+ if (k != 0) do {
+ s1 += *buf++;
+ s2 += s1;
+ } while (--k);
+ s1 %= BASE;
+ s2 %= BASE;
+ }
+ return (s2 << 16) | s1;
+}
diff --git a/zlib/algorithm.txt b/zlib/algorithm.txt
new file mode 100644
index 00000000000..cdc830b5deb
--- /dev/null
+++ b/zlib/algorithm.txt
@@ -0,0 +1,213 @@
+1. Compression algorithm (deflate)
+
+The deflation algorithm used by gzip (also zip and zlib) is a variation of
+LZ77 (Lempel-Ziv 1977, see reference below). It finds duplicated strings in
+the input data. The second occurrence of a string is replaced by a
+pointer to the previous string, in the form of a pair (distance,
+length). Distances are limited to 32K bytes, and lengths are limited
+to 258 bytes. When a string does not occur anywhere in the previous
+32K bytes, it is emitted as a sequence of literal bytes. (In this
+description, `string' must be taken as an arbitrary sequence of bytes,
+and is not restricted to printable characters.)
+
+Literals or match lengths are compressed with one Huffman tree, and
+match distances are compressed with another tree. The trees are stored
+in a compact form at the start of each block. The blocks can have any
+size (except that the compressed data for one block must fit in
+available memory). A block is terminated when deflate() determines that
+it would be useful to start another block with fresh trees. (This is
+somewhat similar to the behavior of LZW-based _compress_.)
+
+Duplicated strings are found using a hash table. All input strings of
+length 3 are inserted in the hash table. A hash index is computed for
+the next 3 bytes. If the hash chain for this index is not empty, all
+strings in the chain are compared with the current input string, and
+the longest match is selected.
+
+The hash chains are searched starting with the most recent strings, to
+favor small distances and thus take advantage of the Huffman encoding.
+The hash chains are singly linked. There are no deletions from the
+hash chains, the algorithm simply discards matches that are too old.
+
+To avoid a worst-case situation, very long hash chains are arbitrarily
+truncated at a certain length, determined by a runtime option (level
+parameter of deflateInit). So deflate() does not always find the longest
+possible match but generally finds a match which is long enough.
+
+deflate() also defers the selection of matches with a lazy evaluation
+mechanism. After a match of length N has been found, deflate() searches for
+a longer match at the next input byte. If a longer match is found, the
+previous match is truncated to a length of one (thus producing a single
+literal byte) and the process of lazy evaluation begins again. Otherwise,
+the original match is kept, and the next match search is attempted only N
+steps later.
+
+The lazy match evaluation is also subject to a runtime parameter. If
+the current match is long enough, deflate() reduces the search for a longer
+match, thus speeding up the whole process. If compression ratio is more
+important than speed, deflate() attempts a complete second search even if
+the first match is already long enough.
+
+The lazy match evaluation is not performed for the fastest compression
+modes (level parameter 1 to 3). For these fast modes, new strings
+are inserted in the hash table only when no match was found, or
+when the match is not too long. This degrades the compression ratio
+but saves time since there are both fewer insertions and fewer searches.
+
+
+2. Decompression algorithm (inflate)
+
+2.1 Introduction
+
+The real question is, given a Huffman tree, how to decode fast. The most
+important realization is that shorter codes are much more common than
+longer codes, so pay attention to decoding the short codes fast, and let
+the long codes take longer to decode.
+
+inflate() sets up a first level table that covers some number of bits of
+input less than the length of longest code. It gets that many bits from the
+stream, and looks it up in the table. The table will tell if the next
+code is that many bits or less and how many, and if it is, it will tell
+the value, else it will point to the next level table for which inflate()
+grabs more bits and tries to decode a longer code.
+
+How many bits to make the first lookup is a tradeoff between the time it
+takes to decode and the time it takes to build the table. If building the
+table took no time (and if you had infinite memory), then there would only
+be a first level table to cover all the way to the longest code. However,
+building the table ends up taking a lot longer for more bits since short
+codes are replicated many times in such a table. What inflate() does is
+simply to make the number of bits in the first table a variable, and set it
+for the maximum speed.
+
+inflate() sends new trees relatively often, so it is possibly set for a
+smaller first level table than an application that has only one tree for
+all the data. For inflate, which has 286 possible codes for the
+literal/length tree, the size of the first table is nine bits. Also the
+distance trees have 30 possible values, and the size of the first table is
+six bits. Note that for each of those cases, the table ended up one bit
+longer than the ``average'' code length, i.e. the code length of an
+approximately flat code which would be a little more than eight bits for
+286 symbols and a little less than five bits for 30 symbols. It would be
+interesting to see if optimizing the first level table for other
+applications gave values within a bit or two of the flat code size.
+
+
+2.2 More details on the inflate table lookup
+
+Ok, you want to know what this cleverly obfuscated inflate tree actually
+looks like. You are correct that it's not a Huffman tree. It is simply a
+lookup table for the first, let's say, nine bits of a Huffman symbol. The
+symbol could be as short as one bit or as long as 15 bits. If a particular
+symbol is shorter than nine bits, then that symbol's translation is duplicated
+in all those entries that start with that symbol's bits. For example, if the
+symbol is four bits, then it's duplicated 32 times in a nine-bit table. If a
+symbol is nine bits long, it appears in the table once.
+
+If the symbol is longer than nine bits, then that entry in the table points
+to another similar table for the remaining bits. Again, there are duplicated
+entries as needed. The idea is that most of the time the symbol will be short
+and there will only be one table look up. (That's whole idea behind data
+compression in the first place.) For the less frequent long symbols, there
+will be two lookups. If you had a compression method with really long
+symbols, you could have as many levels of lookups as is efficient. For
+inflate, two is enough.
+
+So a table entry either points to another table (in which case nine bits in
+the above example are gobbled), or it contains the translation for the symbol
+and the number of bits to gobble. Then you start again with the next
+ungobbled bit.
+
+You may wonder: why not just have one lookup table for how ever many bits the
+longest symbol is? The reason is that if you do that, you end up spending
+more time filling in duplicate symbol entries than you do actually decoding.
+At least for deflate's output that generates new trees every several 10's of
+kbytes. You can imagine that filling in a 2^15 entry table for a 15-bit code
+would take too long if you're only decoding several thousand symbols. At the
+other extreme, you could make a new table for every bit in the code. In fact,
+that's essentially a Huffman tree. But then you spend two much time
+traversing the tree while decoding, even for short symbols.
+
+So the number of bits for the first lookup table is a trade of the time to
+fill out the table vs. the time spent looking at the second level and above of
+the table.
+
+Here is an example, scaled down:
+
+The code being decoded, with 10 symbols, from 1 to 6 bits long:
+
+A: 0
+B: 10
+C: 1100
+D: 11010
+E: 11011
+F: 11100
+G: 11101
+H: 11110
+I: 111110
+J: 111111
+
+Let's make the first table three bits long (eight entries):
+
+000: A,1
+001: A,1
+010: A,1
+011: A,1
+100: B,2
+101: B,2
+110: -> table X (gobble 3 bits)
+111: -> table Y (gobble 3 bits)
+
+Each entry is what the bits decode to and how many bits that is, i.e. how
+many bits to gobble. Or the entry points to another table, with the number of
+bits to gobble implicit in the size of the table.
+
+Table X is two bits long since the longest code starting with 110 is five bits
+long:
+
+00: C,1
+01: C,1
+10: D,2
+11: E,2
+
+Table Y is three bits long since the longest code starting with 111 is six
+bits long:
+
+000: F,2
+001: F,2
+010: G,2
+011: G,2
+100: H,2
+101: H,2
+110: I,3
+111: J,3
+
+So what we have here are three tables with a total of 20 entries that had to
+be constructed. That's compared to 64 entries for a single table. Or
+compared to 16 entries for a Huffman tree (six two entry tables and one four
+entry table). Assuming that the code ideally represents the probability of
+the symbols, it takes on the average 1.25 lookups per symbol. That's compared
+to one lookup for the single table, or 1.66 lookups per symbol for the
+Huffman tree.
+
+There, I think that gives you a picture of what's going on. For inflate, the
+meaning of a particular symbol is often more than just a letter. It can be a
+byte (a "literal"), or it can be either a length or a distance which
+indicates a base value and a number of bits to fetch after the code that is
+added to the base value. Or it might be the special end-of-block code. The
+data structures created in inftrees.c try to encode all that information
+compactly in the tables.
+
+
+Jean-loup Gailly Mark Adler
+jloup@gzip.org madler@alumni.caltech.edu
+
+
+References:
+
+[LZ77] Ziv J., Lempel A., ``A Universal Algorithm for Sequential Data
+Compression,'' IEEE Transactions on Information Theory, Vol. 23, No. 3,
+pp. 337-343.
+
+``DEFLATE Compressed Data Format Specification'' available in
+ftp://ds.internic.net/rfc/rfc1951.txt
diff --git a/zlib/amiga/Makefile.pup b/zlib/amiga/Makefile.pup
new file mode 100644
index 00000000000..6cfad1dc04a
--- /dev/null
+++ b/zlib/amiga/Makefile.pup
@@ -0,0 +1,66 @@
+# Amiga powerUP (TM) Makefile
+# makefile for libpng and SAS C V6.58/7.00 PPC compiler
+# Copyright (C) 1998 by Andreas R. Kleinert
+
+CC = scppc
+CFLAGS = NOSTKCHK NOSINT OPTIMIZE OPTGO OPTPEEP OPTINLOCAL OPTINL \
+ OPTLOOP OPTRDEP=8 OPTDEP=8 OPTCOMP=8
+LIBNAME = libzip.a
+AR = ppc-amigaos-ar
+AR_FLAGS = cr
+RANLIB = ppc-amigaos-ranlib
+LDFLAGS = -r -o
+LDLIBS = LIB:scppc.a
+LN = ppc-amigaos-ld
+RM = delete quiet
+
+OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \
+ zutil.o inflate.o infblock.o inftrees.o infcodes.o infutil.o inffast.o
+
+TEST_OBJS = example.o minigzip.o
+
+all: example minigzip
+
+test: all
+ example
+ echo hello world | minigzip | minigzip -d
+
+$(LIBNAME): $(OBJS)
+ $(AR) $(AR_FLAGS) $@ $(OBJS)
+ $(RANLIB) $@
+
+example: example.o $(LIBNAME)
+ $(LN) $(LDFLAGS) example LIB:c_ppc.o example.o $(LIBNAME) $(LDLIBS) LIB:end.o
+
+minigzip: minigzip.o $(LIBNAME)
+ $(LN) $(LDFLAGS) minigzip LIB:c_ppc.o minigzip.o $(LIBNAME) $(LDLIBS) LIB:end.o
+
+clean:
+ $(RM) *.o example minigzip $(LIBNAME) foo.gz
+
+zip:
+ zip -ul9 zlib README ChangeLog Makefile Make????.??? Makefile.?? \
+ descrip.mms *.[ch]
+
+tgz:
+ cd ..; tar cfz zlib/zlib.tgz zlib/README zlib/ChangeLog zlib/Makefile \
+ zlib/Make????.??? zlib/Makefile.?? zlib/descrip.mms zlib/*.[ch]
+
+# DO NOT DELETE THIS LINE -- make depend depends on it.
+
+adler32.o: zutil.h zlib.h zconf.h
+compress.o: zlib.h zconf.h
+crc32.o: zutil.h zlib.h zconf.h
+deflate.o: deflate.h zutil.h zlib.h zconf.h
+example.o: zlib.h zconf.h
+gzio.o: zutil.h zlib.h zconf.h
+infblock.o: zutil.h zlib.h zconf.h infblock.h inftrees.h infcodes.h infutil.h
+infcodes.o: zutil.h zlib.h zconf.h inftrees.h infutil.h infcodes.h inffast.h
+inffast.o: zutil.h zlib.h zconf.h inftrees.h infutil.h inffast.h
+inflate.o: zutil.h zlib.h zconf.h infblock.h
+inftrees.o: zutil.h zlib.h zconf.h inftrees.h
+infutil.o: zutil.h zlib.h zconf.h inftrees.h infutil.h
+minigzip.o: zlib.h zconf.h
+trees.o: deflate.h zutil.h zlib.h zconf.h
+uncompr.o: zlib.h zconf.h
+zutil.o: zutil.h zlib.h zconf.h
diff --git a/zlib/amiga/Makefile.sas b/zlib/amiga/Makefile.sas
new file mode 100644
index 00000000000..5323e821708
--- /dev/null
+++ b/zlib/amiga/Makefile.sas
@@ -0,0 +1,64 @@
+# SMakefile for zlib
+# Modified from the standard UNIX Makefile Copyright Jean-loup Gailly
+# Osma Ahvenlampi <Osma.Ahvenlampi@hut.fi>
+# Amiga, SAS/C 6.56 & Smake
+
+CC=sc
+CFLAGS=OPT
+#CFLAGS=OPT CPU=68030
+#CFLAGS=DEBUG=LINE
+LDFLAGS=LIB z.lib
+
+SCOPTIONS=OPTSCHED OPTINLINE OPTALIAS OPTTIME OPTINLOCAL STRMERGE \
+ NOICONS PARMS=BOTH NOSTACKCHECK UTILLIB NOVERSION ERRORREXX
+
+OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \
+ zutil.o inflate.o infblock.o inftrees.o infcodes.o infutil.o inffast.o
+
+TEST_OBJS = example.o minigzip.o
+
+all: SCOPTIONS example minigzip
+
+test: all
+ `cd`/example
+ echo hello world | minigzip | minigzip -d
+
+install: z.lib
+ copy zlib.h zconf.h INCLUDE: clone
+ copy z.lib LIB: clone
+
+z.lib: $(OBJS)
+ oml z.lib r $(OBJS)
+
+example: example.o z.lib
+ $(CC) $(CFLAGS) LINK TO $@ example.o $(LDFLAGS)
+
+minigzip: minigzip.o z.lib
+ $(CC) $(CFLAGS) LINK TO $@ minigzip.o $(LDFLAGS)
+
+clean:
+ -delete force quiet *.o example minigzip z.lib foo.gz *.lnk SCOPTIONS
+
+SCOPTIONS: Smakefile
+ copy to $@ <from <
+$(SCOPTIONS)
+<
+
+# DO NOT DELETE THIS LINE -- make depend depends on it.
+
+adler32.o: zutil.h zlib.h zconf.h
+compress.o: zlib.h zconf.h
+crc32.o: zutil.h zlib.h zconf.h
+deflate.o: deflate.h zutil.h zlib.h zconf.h
+example.o: zlib.h zconf.h
+gzio.o: zutil.h zlib.h zconf.h
+infblock.o: zutil.h zlib.h zconf.h infblock.h inftrees.h infcodes.h infutil.h
+infcodes.o: zutil.h zlib.h zconf.h inftrees.h infutil.h infcodes.h inffast.h
+inffast.o: zutil.h zlib.h zconf.h inftrees.h infutil.h inffast.h
+inflate.o: zutil.h zlib.h zconf.h infblock.h
+inftrees.o: zutil.h zlib.h zconf.h inftrees.h
+infutil.o: zutil.h zlib.h zconf.h inftrees.h infutil.h
+minigzip.o: zlib.h zconf.h
+trees.o: deflate.h zutil.h zlib.h zconf.h
+uncompr.o: zlib.h zconf.h
+zutil.o: zutil.h zlib.h zconf.h
diff --git a/zlib/compress.c b/zlib/compress.c
new file mode 100644
index 00000000000..1cee470913d
--- /dev/null
+++ b/zlib/compress.c
@@ -0,0 +1,68 @@
+/* compress.c -- compress a memory buffer
+ * Copyright (C) 1995-1998 Jean-loup Gailly.
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* @(#) $Id$ */
+
+#include "zlib.h"
+
+/* ===========================================================================
+ Compresses the source buffer into the destination buffer. The level
+ parameter has the same meaning as in deflateInit. sourceLen is the byte
+ length of the source buffer. Upon entry, destLen is the total size of the
+ destination buffer, which must be at least 0.1% larger than sourceLen plus
+ 12 bytes. Upon exit, destLen is the actual size of the compressed buffer.
+
+ compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
+ memory, Z_BUF_ERROR if there was not enough room in the output buffer,
+ Z_STREAM_ERROR if the level parameter is invalid.
+*/
+int ZEXPORT compress2 (dest, destLen, source, sourceLen, level)
+ Bytef *dest;
+ uLongf *destLen;
+ const Bytef *source;
+ uLong sourceLen;
+ int level;
+{
+ z_stream stream;
+ int err;
+
+ stream.next_in = (Bytef*)source;
+ stream.avail_in = (uInt)sourceLen;
+#ifdef MAXSEG_64K
+ /* Check for source > 64K on 16-bit machine: */
+ if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR;
+#endif
+ stream.next_out = dest;
+ stream.avail_out = (uInt)*destLen;
+ if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR;
+
+ stream.zalloc = (alloc_func)0;
+ stream.zfree = (free_func)0;
+ stream.opaque = (voidpf)0;
+
+ err = deflateInit(&stream, level);
+ if (err != Z_OK) return err;
+
+ err = deflate(&stream, Z_FINISH);
+ if (err != Z_STREAM_END) {
+ deflateEnd(&stream);
+ return err == Z_OK ? Z_BUF_ERROR : err;
+ }
+ *destLen = stream.total_out;
+
+ err = deflateEnd(&stream);
+ return err;
+}
+
+/* ===========================================================================
+ */
+int ZEXPORT compress (dest, destLen, source, sourceLen)
+ Bytef *dest;
+ uLongf *destLen;
+ const Bytef *source;
+ uLong sourceLen;
+{
+ return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION);
+}
diff --git a/zlib/configure b/zlib/configure
new file mode 100755
index 00000000000..6c2ade1cd82
--- /dev/null
+++ b/zlib/configure
@@ -0,0 +1,3032 @@
+#! /bin/sh
+
+# Guess values for system-dependent variables and create Makefiles.
+# Generated automatically using autoconf version 2.13
+# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+
+# Defaults:
+ac_help=
+ac_default_prefix=/usr/local
+# Any additions from configure.in:
+ac_help="$ac_help
+ --enable-maintainer-mode enable make rules and dependencies not useful
+ (and sometimes confusing) to the casual installer"
+ac_help="$ac_help
+ --with-target-subdir=SUBDIR Configuring in a subdirectory"
+ac_help="$ac_help
+ --with-cross-host=HOST Configuring with a cross compiler"
+ac_help="$ac_help
+ --enable-multilib build many library versions (default)"
+ac_help="$ac_help
+ --with-system-zlib Use installed libz"
+ac_help="$ac_help
+ --enable-shared[=PKGS] build shared libraries [default=yes]"
+ac_help="$ac_help
+ --enable-static[=PKGS] build static libraries [default=yes]"
+ac_help="$ac_help
+ --enable-fast-install[=PKGS] optimize for fast installation [default=yes]"
+ac_help="$ac_help
+ --with-gnu-ld assume the C compiler uses GNU ld [default=no]"
+ac_help="$ac_help
+ --disable-libtool-lock force libtool not to do file locking"
+
+# Initialize some variables set by options.
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+build=NONE
+cache_file=./config.cache
+exec_prefix=NONE
+host=NONE
+no_create=
+nonopt=NONE
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+target=NONE
+verbose=
+x_includes=NONE
+x_libraries=NONE
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+# Initialize some other variables.
+subdirs=
+MFLAGS= MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+# Maximum number of lines to put in a shell here document.
+ac_max_here_lines=12
+
+ac_prev=
+for ac_option
+do
+
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval "$ac_prev=\$ac_option"
+ ac_prev=
+ continue
+ fi
+
+ case "$ac_option" in
+ -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+ *) ac_optarg= ;;
+ esac
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case "$ac_option" in
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir="$ac_optarg" ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build="$ac_optarg" ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file="$ac_optarg" ;;
+
+ -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+ | --da=*)
+ datadir="$ac_optarg" ;;
+
+ -disable-* | --disable-*)
+ ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
+ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+ fi
+ ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+ eval "enable_${ac_feature}=no" ;;
+
+ -enable-* | --enable-*)
+ ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
+ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+ fi
+ ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+ case "$ac_option" in
+ *=*) ;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "enable_${ac_feature}='$ac_optarg'" ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix="$ac_optarg" ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he)
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat << EOF
+Usage: configure [options] [host]
+Options: [defaults in brackets after descriptions]
+Configuration:
+ --cache-file=FILE cache test results in FILE
+ --help print this message
+ --no-create do not create output files
+ --quiet, --silent do not print \`checking...' messages
+ --version print the version of autoconf that created configure
+Directory and file names:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [same as prefix]
+ --bindir=DIR user executables in DIR [EPREFIX/bin]
+ --sbindir=DIR system admin executables in DIR [EPREFIX/sbin]
+ --libexecdir=DIR program executables in DIR [EPREFIX/libexec]
+ --datadir=DIR read-only architecture-independent data in DIR
+ [PREFIX/share]
+ --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data in DIR
+ [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var]
+ --libdir=DIR object code libraries in DIR [EPREFIX/lib]
+ --includedir=DIR C header files in DIR [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include]
+ --infodir=DIR info documentation in DIR [PREFIX/info]
+ --mandir=DIR man documentation in DIR [PREFIX/man]
+ --srcdir=DIR find the sources in DIR [configure dir or ..]
+ --program-prefix=PREFIX prepend PREFIX to installed program names
+ --program-suffix=SUFFIX append SUFFIX to installed program names
+ --program-transform-name=PROGRAM
+ run sed PROGRAM on installed program names
+EOF
+ cat << EOF
+Host type:
+ --build=BUILD configure for building on BUILD [BUILD=HOST]
+ --host=HOST configure for HOST [guessed]
+ --target=TARGET configure for TARGET [TARGET=HOST]
+Features and packages:
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --x-includes=DIR X include files are in DIR
+ --x-libraries=DIR X library files are in DIR
+EOF
+ if test -n "$ac_help"; then
+ echo "--enable and --with options recognized:$ac_help"
+ fi
+ exit 0 ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host="$ac_optarg" ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir="$ac_optarg" ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir="$ac_optarg" ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir="$ac_optarg" ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir="$ac_optarg" ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst \
+ | --locals | --local | --loca | --loc | --lo)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+ localstatedir="$ac_optarg" ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir="$ac_optarg" ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir="$ac_optarg" ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix="$ac_optarg" ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix="$ac_optarg" ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix="$ac_optarg" ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name="$ac_optarg" ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir="$ac_optarg" ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir="$ac_optarg" ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site="$ac_optarg" ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir="$ac_optarg" ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir="$ac_optarg" ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target="$ac_optarg" ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers)
+ echo "configure generated by autoconf version 2.13"
+ exit 0 ;;
+
+ -with-* | --with-*)
+ ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
+ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+ fi
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ case "$ac_option" in
+ *=*) ;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "with_${ac_package}='$ac_optarg'" ;;
+
+ -without-* | --without-*)
+ ac_package=`echo $ac_option|sed -e 's/-*without-//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
+ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+ fi
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ eval "with_${ac_package}=no" ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes="$ac_optarg" ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries="$ac_optarg" ;;
+
+ -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
+ ;;
+
+ *)
+ if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
+ echo "configure: warning: $ac_option: invalid host type" 1>&2
+ fi
+ if test "x$nonopt" != xNONE; then
+ { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
+ fi
+ nonopt="$ac_option"
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
+fi
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+# File descriptor usage:
+# 0 standard input
+# 1 file creation
+# 2 errors and warnings
+# 3 some systems may open it to /dev/tty
+# 4 used on the Kubota Titan
+# 6 checking for... messages and results
+# 5 compiler messages saved in config.log
+if test "$silent" = yes; then
+ exec 6>/dev/null
+else
+ exec 6>&1
+fi
+exec 5>./config.log
+
+echo "\
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+" 1>&5
+
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Also quote any args containing shell metacharacters.
+ac_configure_args=
+for ac_arg
+do
+ case "$ac_arg" in
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c) ;;
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
+ ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+ *) ac_configure_args="$ac_configure_args $ac_arg" ;;
+ esac
+done
+
+# NLS nuisances.
+# Only set these to C if already set. These must not be set unconditionally
+# because not all systems understand e.g. LANG=C (notably SCO).
+# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
+# Non-C LC_CTYPE values break the ctype check.
+if test "${LANG+set}" = set; then LANG=C; export LANG; fi
+if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
+if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
+if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo > confdefs.h
+
+# A filename unique to this package, relative to the directory that
+# configure is in, which we can look for to find out if srcdir is correct.
+ac_unique_file=zlib.h
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then its parent.
+ ac_prog=$0
+ ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
+ test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
+ srcdir=$ac_confdir
+ if test ! -r $srcdir/$ac_unique_file; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+ if test "$ac_srcdir_defaulted" = yes; then
+ { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
+ else
+ { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
+ fi
+fi
+srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
+
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+ if test "x$prefix" != xNONE; then
+ CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+ else
+ CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+ fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+ if test -r "$ac_site_file"; then
+ echo "loading site script $ac_site_file"
+ . "$ac_site_file"
+ fi
+done
+
+if test -r "$cache_file"; then
+ echo "loading cache $cache_file"
+ . $cache_file
+else
+ echo "creating cache $cache_file"
+ > $cache_file
+fi
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+ac_exeext=
+ac_objext=o
+if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
+ # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
+ if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
+ ac_n= ac_c='
+' ac_t=' '
+ else
+ ac_n=-n ac_c= ac_t=
+ fi
+else
+ ac_n= ac_c='\c' ac_t=
+fi
+
+
+ac_aux_dir=
+for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+ if test -f $ac_dir/install-sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install-sh -c"
+ break
+ elif test -f $ac_dir/install.sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install.sh -c"
+ break
+ fi
+done
+if test -z "$ac_aux_dir"; then
+ { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; }
+fi
+ac_config_guess=$ac_aux_dir/config.guess
+ac_config_sub=$ac_aux_dir/config.sub
+ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
+
+
+# Do some error checking and defaulting for the host and target type.
+# The inputs are:
+# configure --host=HOST --target=TARGET --build=BUILD NONOPT
+#
+# The rules are:
+# 1. You are not allowed to specify --host, --target, and nonopt at the
+# same time.
+# 2. Host defaults to nonopt.
+# 3. If nonopt is not specified, then host defaults to the current host,
+# as determined by config.guess.
+# 4. Target and build default to nonopt.
+# 5. If nonopt is not specified, then target and build default to host.
+
+# The aliases save the names the user supplied, while $host etc.
+# will get canonicalized.
+case $host---$target---$nonopt in
+NONE---*---* | *---NONE---* | *---*---NONE) ;;
+*) { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } ;;
+esac
+
+
+# Make sure we can run config.sub.
+if ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then :
+else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking host system type""... $ac_c" 1>&6
+echo "configure:593: checking host system type" >&5
+
+host_alias=$host
+case "$host_alias" in
+NONE)
+ case $nonopt in
+ NONE)
+ if host_alias=`${CONFIG_SHELL-/bin/sh} $ac_config_guess`; then :
+ else { echo "configure: error: can not guess host type; you must specify one" 1>&2; exit 1; }
+ fi ;;
+ *) host_alias=$nonopt ;;
+ esac ;;
+esac
+
+host=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $host_alias`
+host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$host" 1>&6
+
+echo $ac_n "checking target system type""... $ac_c" 1>&6
+echo "configure:614: checking target system type" >&5
+
+target_alias=$target
+case "$target_alias" in
+NONE)
+ case $nonopt in
+ NONE) target_alias=$host_alias ;;
+ *) target_alias=$nonopt ;;
+ esac ;;
+esac
+
+target=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $target_alias`
+target_cpu=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+target_vendor=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+target_os=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$target" 1>&6
+
+echo $ac_n "checking build system type""... $ac_c" 1>&6
+echo "configure:632: checking build system type" >&5
+
+build_alias=$build
+case "$build_alias" in
+NONE)
+ case $nonopt in
+ NONE) build_alias=$host_alias ;;
+ *) build_alias=$nonopt ;;
+ esac ;;
+esac
+
+build=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $build_alias`
+build_cpu=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+build_vendor=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+build_os=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$build" 1>&6
+
+test "$host_alias" != "$target_alias" &&
+ test "$program_prefix$program_suffix$program_transform_name" = \
+ NONENONEs,x,x, &&
+ program_prefix=${target_alias}-
+
+# Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# ./install, which can be erroneously created by make from ./install.sh.
+echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
+echo "configure:666: checking for a BSD compatible install" >&5
+if test -z "$INSTALL"; then
+if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":"
+ for ac_dir in $PATH; do
+ # Account for people who put trailing slashes in PATH elements.
+ case "$ac_dir/" in
+ /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ if test -f $ac_dir/$ac_prog; then
+ if test $ac_prog = install &&
+ grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ else
+ ac_cv_path_install="$ac_dir/$ac_prog -c"
+ break 2
+ fi
+ fi
+ done
+ ;;
+ esac
+ done
+ IFS="$ac_save_IFS"
+
+fi
+ if test "${ac_cv_path_install+set}" = set; then
+ INSTALL="$ac_cv_path_install"
+ else
+ # As a last resort, use the slow shell script. We don't cache a
+ # path for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the path is relative.
+ INSTALL="$ac_install_sh"
+ fi
+fi
+echo "$ac_t""$INSTALL" 1>&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6
+echo "configure:719: checking whether build environment is sane" >&5
+# Just in case
+sleep 1
+echo timestamp > conftestfile
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null`
+ if test "$*" = "X"; then
+ # -L didn't work.
+ set X `ls -t $srcdir/configure conftestfile`
+ fi
+ if test "$*" != "X $srcdir/configure conftestfile" \
+ && test "$*" != "X conftestfile $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ { echo "configure: error: ls -t appears to fail. Make sure there is not a broken
+alias in your environment" 1>&2; exit 1; }
+ fi
+
+ test "$2" = conftestfile
+ )
+then
+ # Ok.
+ :
+else
+ { echo "configure: error: newly created file is older than distributed files!
+Check your system clock" 1>&2; exit 1; }
+fi
+rm -f conftest*
+echo "$ac_t""yes" 1>&6
+if test "$program_transform_name" = s,x,x,; then
+ program_transform_name=
+else
+ # Double any \ or $. echo might interpret backslashes.
+ cat <<\EOF_SED > conftestsed
+s,\\,\\\\,g; s,\$,$$,g
+EOF_SED
+ program_transform_name="`echo $program_transform_name|sed -f conftestsed`"
+ rm -f conftestsed
+fi
+test "$program_prefix" != NONE &&
+ program_transform_name="s,^,${program_prefix},; $program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+ program_transform_name="s,\$\$,${program_suffix},; $program_transform_name"
+
+# sed with no file args requires a program.
+test "$program_transform_name" = "" && program_transform_name="s,x,x,"
+
+echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
+echo "configure:776: checking whether ${MAKE-make} sets \${MAKE}" >&5
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftestmake <<\EOF
+all:
+ @echo 'ac_maketemp="${MAKE}"'
+EOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+ eval ac_cv_prog_make_${ac_make}_set=yes
+else
+ eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftestmake
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ SET_MAKE=
+else
+ echo "$ac_t""no" 1>&6
+ SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+
+PACKAGE=zlib
+
+VERSION=1.1.3
+
+if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then
+ { echo "configure: error: source directory already configured; run "make distclean" there first" 1>&2; exit 1; }
+fi
+cat >> confdefs.h <<EOF
+#define PACKAGE "$PACKAGE"
+EOF
+
+cat >> confdefs.h <<EOF
+#define VERSION "$VERSION"
+EOF
+
+
+
+missing_dir=`cd $ac_aux_dir && pwd`
+echo $ac_n "checking for working aclocal""... $ac_c" 1>&6
+echo "configure:822: checking for working aclocal" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf. Sigh.
+if (aclocal --version) < /dev/null > /dev/null 2>&1; then
+ ACLOCAL=aclocal
+ echo "$ac_t""found" 1>&6
+else
+ ACLOCAL="$missing_dir/missing aclocal"
+ echo "$ac_t""missing" 1>&6
+fi
+
+echo $ac_n "checking for working autoconf""... $ac_c" 1>&6
+echo "configure:835: checking for working autoconf" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf. Sigh.
+if (autoconf --version) < /dev/null > /dev/null 2>&1; then
+ AUTOCONF=autoconf
+ echo "$ac_t""found" 1>&6
+else
+ AUTOCONF="$missing_dir/missing autoconf"
+ echo "$ac_t""missing" 1>&6
+fi
+
+echo $ac_n "checking for working automake""... $ac_c" 1>&6
+echo "configure:848: checking for working automake" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf. Sigh.
+if (automake --version) < /dev/null > /dev/null 2>&1; then
+ AUTOMAKE=automake
+ echo "$ac_t""found" 1>&6
+else
+ AUTOMAKE="$missing_dir/missing automake"
+ echo "$ac_t""missing" 1>&6
+fi
+
+echo $ac_n "checking for working autoheader""... $ac_c" 1>&6
+echo "configure:861: checking for working autoheader" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf. Sigh.
+if (autoheader --version) < /dev/null > /dev/null 2>&1; then
+ AUTOHEADER=autoheader
+ echo "$ac_t""found" 1>&6
+else
+ AUTOHEADER="$missing_dir/missing autoheader"
+ echo "$ac_t""missing" 1>&6
+fi
+
+echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6
+echo "configure:874: checking for working makeinfo" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf. Sigh.
+if (makeinfo --version) < /dev/null > /dev/null 2>&1; then
+ MAKEINFO=makeinfo
+ echo "$ac_t""found" 1>&6
+else
+ MAKEINFO="$missing_dir/missing makeinfo"
+ echo "$ac_t""missing" 1>&6
+fi
+
+
+
+echo $ac_n "checking whether to enable maintainer-specific portions of Makefiles""... $ac_c" 1>&6
+echo "configure:889: checking whether to enable maintainer-specific portions of Makefiles" >&5
+ # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given.
+if test "${enable_maintainer_mode+set}" = set; then
+ enableval="$enable_maintainer_mode"
+ USE_MAINTAINER_MODE=$enableval
+else
+ USE_MAINTAINER_MODE=no
+fi
+
+ echo "$ac_t""$USE_MAINTAINER_MODE" 1>&6
+
+
+if test $USE_MAINTAINER_MODE = yes; then
+ MAINTAINER_MODE_TRUE=
+ MAINTAINER_MODE_FALSE='#'
+else
+ MAINTAINER_MODE_TRUE='#'
+ MAINTAINER_MODE_FALSE=
+fi
+ MAINT=$MAINTAINER_MODE_TRUE
+
+
+echo $ac_n "checking for Cygwin environment""... $ac_c" 1>&6
+echo "configure:912: checking for Cygwin environment" >&5
+if eval "test \"`echo '$''{'ac_cv_cygwin'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 917 "configure"
+#include "confdefs.h"
+
+int main() {
+
+#ifndef __CYGWIN__
+#define __CYGWIN__ __CYGWIN32__
+#endif
+return __CYGWIN__;
+; return 0; }
+EOF
+if { (eval echo configure:928: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_cygwin=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ ac_cv_cygwin=no
+fi
+rm -f conftest*
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_cygwin" 1>&6
+CYGWIN=
+test "$ac_cv_cygwin" = yes && CYGWIN=yes
+echo $ac_n "checking for mingw32 environment""... $ac_c" 1>&6
+echo "configure:945: checking for mingw32 environment" >&5
+if eval "test \"`echo '$''{'ac_cv_mingw32'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 950 "configure"
+#include "confdefs.h"
+
+int main() {
+return __MINGW32__;
+; return 0; }
+EOF
+if { (eval echo configure:957: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_mingw32=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ ac_cv_mingw32=no
+fi
+rm -f conftest*
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_mingw32" 1>&6
+MINGW32=
+test "$ac_cv_mingw32" = yes && MINGW32=yes
+
+
+echo $ac_n "checking for executable suffix""... $ac_c" 1>&6
+echo "configure:976: checking for executable suffix" >&5
+if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test "$CYGWIN" = yes || test "$MINGW32" = yes; then
+ ac_cv_exeext=.exe
+else
+ rm -f conftest*
+ echo 'int main () { return 0; }' > conftest.$ac_ext
+ ac_cv_exeext=
+ if { (eval echo configure:986: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
+ for file in conftest.*; do
+ case $file in
+ *.c | *.o | *.obj | *.ilk | *.pdb) ;;
+ *) ac_cv_exeext=`echo $file | sed -e s/conftest//` ;;
+ esac
+ done
+ else
+ { echo "configure: error: installation or configuration problem: compiler cannot create executables." 1>&2; exit 1; }
+ fi
+ rm -f conftest*
+ test x"${ac_cv_exeext}" = x && ac_cv_exeext=no
+fi
+fi
+
+EXEEXT=""
+test x"${ac_cv_exeext}" != xno && EXEEXT=${ac_cv_exeext}
+echo "$ac_t""${ac_cv_exeext}" 1>&6
+ac_exeext=$EXEEXT
+
+
+ac_aux_dir=
+for ac_dir in .. $srcdir/..; do
+ if test -f $ac_dir/install-sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install-sh -c"
+ break
+ elif test -f $ac_dir/install.sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install.sh -c"
+ break
+ fi
+done
+if test -z "$ac_aux_dir"; then
+ { echo "configure: error: can not find install-sh or install.sh in .. $srcdir/.." 1>&2; exit 1; }
+fi
+ac_config_guess=$ac_aux_dir/config.guess
+ac_config_sub=$ac_aux_dir/config.sub
+ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
+
+
+# Check whether --with-target-subdir or --without-target-subdir was given.
+if test "${with_target_subdir+set}" = set; then
+ withval="$with_target_subdir"
+ :
+fi
+
+# Check whether --with-cross-host or --without-cross-host was given.
+if test "${with_cross_host+set}" = set; then
+ withval="$with_cross_host"
+ :
+fi
+
+
+# Check whether --enable-multilib or --disable-multilib was given.
+if test "${enable_multilib+set}" = set; then
+ enableval="$enable_multilib"
+ case "${enableval}" in
+ yes) multilib=yes ;;
+ no) multilib=no ;;
+ *) { echo "configure: error: bad value ${enableval} for multilib option" 1>&2; exit 1; } ;;
+ esac
+else
+ multilib=yes
+fi
+
+
+if test "${srcdir}" = "."; then
+ if test "${with_target_subdir}" != "."; then
+ zlib_basedir="${srcdir}/${with_multisrctop}../"
+ else
+ zlib_basedir="${srcdir}/${with_multisrctop}"
+ fi
+else
+ zlib_basedir="${srcdir}/"
+fi
+
+
+# Check whether --with-system-zlib or --without-system-zlib was given.
+if test "${with_system_zlib+set}" = set; then
+ withval="$with_system_zlib"
+ :
+fi
+
+
+# Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1074: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_CC="gcc"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1104: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_prog_rejected=no
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# -gt 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ set dummy "$ac_dir/$ac_word" "$@"
+ shift
+ ac_cv_prog_CC="$@"
+ fi
+fi
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
+echo "configure:1153: checking whether we are using GNU C" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.c <<EOF
+#ifdef __GNUC__
+ yes;
+#endif
+EOF
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1162: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+ ac_cv_prog_gcc=yes
+else
+ ac_cv_prog_gcc=no
+fi
+fi
+
+echo "$ac_t""$ac_cv_prog_gcc" 1>&6
+
+if test $ac_cv_prog_gcc = yes; then
+ GCC=yes
+ ac_test_CFLAGS="${CFLAGS+set}"
+ ac_save_CFLAGS="$CFLAGS"
+ CFLAGS=
+ echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
+echo "configure:1177: checking whether ${CC-cc} accepts -g" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ echo 'void f(){}' > conftest.c
+if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
+ ac_cv_prog_cc_g=yes
+else
+ ac_cv_prog_cc_g=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$ac_cv_prog_cc_g" 1>&6
+ if test "$ac_test_CFLAGS" = set; then
+ CFLAGS="$ac_save_CFLAGS"
+ elif test $ac_cv_prog_cc_g = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-O2"
+ fi
+else
+ GCC=
+ test "${CFLAGS+set}" = set || CFLAGS="-g"
+fi
+
+# Check whether --enable-shared or --disable-shared was given.
+if test "${enable_shared+set}" = set; then
+ enableval="$enable_shared"
+ p=${PACKAGE-default}
+case "$enableval" in
+yes) enable_shared=yes ;;
+no) enable_shared=no ;;
+*)
+ enable_shared=no
+ # Look at the argument we got. We use all the common list separators.
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
+ for pkg in $enableval; do
+ if test "X$pkg" = "X$p"; then
+ enable_shared=yes
+ fi
+ done
+ IFS="$ac_save_ifs"
+ ;;
+esac
+else
+ enable_shared=yes
+fi
+
+# Check whether --enable-static or --disable-static was given.
+if test "${enable_static+set}" = set; then
+ enableval="$enable_static"
+ p=${PACKAGE-default}
+case "$enableval" in
+yes) enable_static=yes ;;
+no) enable_static=no ;;
+*)
+ enable_static=no
+ # Look at the argument we got. We use all the common list separators.
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
+ for pkg in $enableval; do
+ if test "X$pkg" = "X$p"; then
+ enable_static=yes
+ fi
+ done
+ IFS="$ac_save_ifs"
+ ;;
+esac
+else
+ enable_static=yes
+fi
+
+# Check whether --enable-fast-install or --disable-fast-install was given.
+if test "${enable_fast_install+set}" = set; then
+ enableval="$enable_fast_install"
+ p=${PACKAGE-default}
+case "$enableval" in
+yes) enable_fast_install=yes ;;
+no) enable_fast_install=no ;;
+*)
+ enable_fast_install=no
+ # Look at the argument we got. We use all the common list separators.
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
+ for pkg in $enableval; do
+ if test "X$pkg" = "X$p"; then
+ enable_fast_install=yes
+ fi
+ done
+ IFS="$ac_save_ifs"
+ ;;
+esac
+else
+ enable_fast_install=yes
+fi
+
+# Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1276: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$RANLIB"; then
+ ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_RANLIB="ranlib"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":"
+fi
+fi
+RANLIB="$ac_cv_prog_RANLIB"
+if test -n "$RANLIB"; then
+ echo "$ac_t""$RANLIB" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+# Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1306: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_CC="gcc"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1336: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_prog_rejected=no
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# -gt 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ set dummy "$ac_dir/$ac_word" "$@"
+ shift
+ ac_cv_prog_CC="$@"
+ fi
+fi
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ if test -z "$CC"; then
+ case "`uname -s`" in
+ *win32* | *WIN32*)
+ # Extract the first word of "cl", so it can be a program name with args.
+set dummy cl; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1387: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_CC="cl"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+ ;;
+ esac
+ fi
+ test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
+echo "configure:1419: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+cat > conftest.$ac_ext << EOF
+
+#line 1430 "configure"
+#include "confdefs.h"
+
+main(){return(0);}
+EOF
+if { (eval echo configure:1435: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ ac_cv_prog_cc_works=yes
+ # If we can't run a trivial program, we are probably using a cross compiler.
+ if (./conftest; exit) 2>/dev/null; then
+ ac_cv_prog_cc_cross=no
+ else
+ ac_cv_prog_cc_cross=yes
+ fi
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ ac_cv_prog_cc_works=no
+fi
+rm -fr conftest*
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo "$ac_t""$ac_cv_prog_cc_works" 1>&6
+if test $ac_cv_prog_cc_works = no; then
+ { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
+fi
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
+echo "configure:1461: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
+echo "configure:1466: checking whether we are using GNU C" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.c <<EOF
+#ifdef __GNUC__
+ yes;
+#endif
+EOF
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1475: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+ ac_cv_prog_gcc=yes
+else
+ ac_cv_prog_gcc=no
+fi
+fi
+
+echo "$ac_t""$ac_cv_prog_gcc" 1>&6
+
+if test $ac_cv_prog_gcc = yes; then
+ GCC=yes
+else
+ GCC=
+fi
+
+ac_test_CFLAGS="${CFLAGS+set}"
+ac_save_CFLAGS="$CFLAGS"
+CFLAGS=
+echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
+echo "configure:1494: checking whether ${CC-cc} accepts -g" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ echo 'void f(){}' > conftest.c
+if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
+ ac_cv_prog_cc_g=yes
+else
+ ac_cv_prog_cc_g=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$ac_cv_prog_cc_g" 1>&6
+if test "$ac_test_CFLAGS" = set; then
+ CFLAGS="$ac_save_CFLAGS"
+elif test $ac_cv_prog_cc_g = yes; then
+ if test "$GCC" = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-g"
+ fi
+else
+ if test "$GCC" = yes; then
+ CFLAGS="-O2"
+ else
+ CFLAGS=
+ fi
+fi
+
+# Check whether --with-gnu-ld or --without-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then
+ withval="$with_gnu_ld"
+ test "$withval" = no || with_gnu_ld=yes
+else
+ with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test "$ac_cv_prog_gcc" = yes; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ echo $ac_n "checking for ld used by GCC""... $ac_c" 1>&6
+echo "configure:1537: checking for ld used by GCC" >&5
+ ac_prog=`($CC -print-prog-name=ld) 2>&5`
+ case "$ac_prog" in
+ # Accept absolute paths.
+ /* | [A-Za-z]:[\\/]*)
+ re_direlt='/[^/][^/]*/\.\./'
+ # Canonicalize the path of ld
+ ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'`
+ while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
+ ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
+ done
+ test -z "$LD" && LD="$ac_prog"
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ac_prog=ld
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+elif test "$with_gnu_ld" = yes; then
+ echo $ac_n "checking for GNU ld""... $ac_c" 1>&6
+echo "configure:1561: checking for GNU ld" >&5
+else
+ echo $ac_n "checking for non-GNU ld""... $ac_c" 1>&6
+echo "configure:1564: checking for non-GNU ld" >&5
+fi
+if eval "test \"`echo '$''{'ac_cv_path_LD'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -z "$LD"; then
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog"; then
+ ac_cv_path_LD="$ac_dir/$ac_prog"
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some GNU ld's only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ if "$ac_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then
+ test "$with_gnu_ld" != no && break
+ else
+ test "$with_gnu_ld" != yes && break
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+else
+ ac_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$ac_cv_path_LD"
+if test -n "$LD"; then
+ echo "$ac_t""$LD" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+test -z "$LD" && { echo "configure: error: no acceptable ld found in \$PATH" 1>&2; exit 1; }
+
+echo $ac_n "checking if the linker ($LD) is GNU ld""... $ac_c" 1>&6
+echo "configure:1600: checking if the linker ($LD) is GNU ld" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_gnu_ld'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ # I'd rather use --version here, but apparently some GNU ld's only accept -v.
+if $LD -v 2>&1 </dev/null | egrep '(GNU|with BFD)' 1>&5; then
+ ac_cv_prog_gnu_ld=yes
+else
+ ac_cv_prog_gnu_ld=no
+fi
+fi
+
+echo "$ac_t""$ac_cv_prog_gnu_ld" 1>&6
+
+
+echo $ac_n "checking for BSD-compatible nm""... $ac_c" 1>&6
+echo "configure:1616: checking for BSD-compatible nm" >&5
+if eval "test \"`echo '$''{'ac_cv_path_NM'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$NM"; then
+ # Let the user override the test.
+ ac_cv_path_NM="$NM"
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/nm; then
+ # Check to see if the nm accepts a BSD-compat flag.
+ # Adding the `sed 1q' prevents false positives on HP-UX, which says:
+ # nm: unknown option "B" ignored
+ if ($ac_dir/nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
+ ac_cv_path_NM="$ac_dir/nm -B"
+ break
+ elif ($ac_dir/nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
+ ac_cv_path_NM="$ac_dir/nm -p"
+ break
+ else
+ ac_cv_path_NM=${ac_cv_path_NM="$ac_dir/nm"} # keep the first match, but
+ continue # so that we can try to find one that supports BSD flags
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_NM" && ac_cv_path_NM=nm
+fi
+fi
+
+NM="$ac_cv_path_NM"
+echo "$ac_t""$NM" 1>&6
+
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+echo $ac_n "checking command to parse $NM output""... $ac_c" 1>&6
+echo "configure:1654: checking command to parse $NM output" >&5
+if eval "test \"`echo '$''{'ac_cv_sys_global_symbol_pipe'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ # These are sane defaults that work on at least a few old systems.
+# {They come from Ultrix. What could be older than Ultrix?!! ;)}
+
+# Character class describing NM global symbol codes.
+ac_symcode='[BCDEGRST]'
+
+# Regexp to match symbols that can be accessed directly from C.
+ac_sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
+
+# Transform the above into a raw symbol and a C symbol.
+ac_symxfrm='\1 \2\3 \3'
+
+# Transform an extracted symbol line into a proper C declaration
+ac_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern char \1;/p'"
+
+# Define system-specific variables.
+case "$host_os" in
+aix*)
+ ac_symcode='[BCDT]'
+ ;;
+cygwin* | mingw*)
+ ac_symcode='[ABCDGISTW]'
+ ;;
+hpux*)
+ ac_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern char \1();/p' -e 's/^. .* \(.*\)$/extern char \1;/p'"
+ ;;
+irix*)
+ ac_symcode='[BCDEGRST]'
+ ;;
+solaris*)
+ ac_symcode='[BDT]'
+ ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+if $NM -V 2>&1 | egrep '(GNU|with BFD)' > /dev/null; then
+ ac_symcode='[ABCDGISTW]'
+fi
+
+# Try without a prefix undercore, then with it.
+for ac_symprfx in "" "_"; do
+
+ ac_cv_sys_global_symbol_pipe="sed -n -e 's/^.* \($ac_symcode\) *\($ac_symprfx\)$ac_sympat$/$ac_symxfrm/p'"
+
+ # Check to see that the pipe works correctly.
+ ac_pipe_works=no
+ rm -f conftest.$ac_ext
+ cat > conftest.$ac_ext <<EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func;return 0;}
+EOF
+
+ if { (eval echo configure:1717: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ # Now try to grab the symbols.
+ ac_nlist=conftest.nm
+
+ if { (eval echo configure:1721: \"$NM conftest.$ac_objext \| $ac_cv_sys_global_symbol_pipe \> $ac_nlist\") 1>&5; (eval $NM conftest.$ac_objext \| $ac_cv_sys_global_symbol_pipe \> $ac_nlist) 2>&5; } && test -s "$ac_nlist"; then
+
+ # Try sorting and uniquifying the output.
+ if sort "$ac_nlist" | uniq > "$ac_nlist"T; then
+ mv -f "$ac_nlist"T "$ac_nlist"
+ else
+ rm -f "$ac_nlist"T
+ fi
+
+ # Make sure that we snagged all the symbols we need.
+ if egrep ' nm_test_var$' "$ac_nlist" >/dev/null; then
+ if egrep ' nm_test_func$' "$ac_nlist" >/dev/null; then
+ cat <<EOF > conftest.c
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+EOF
+ # Now generate the symbol file.
+ eval "$ac_global_symbol_to_cdecl"' < "$ac_nlist" >> conftest.c'
+
+ cat <<EOF >> conftest.c
+#if defined (__STDC__) && __STDC__
+# define lt_ptr_t void *
+#else
+# define lt_ptr_t char *
+# define const
+#endif
+
+/* The mapping between symbol names and symbols. */
+const struct {
+ const char *name;
+ lt_ptr_t address;
+}
+lt_preloaded_symbols[] =
+{
+EOF
+ sed 's/^. \(.*\) \(.*\)$/ {"\2", (lt_ptr_t) \&\2},/' < "$ac_nlist" >> conftest.c
+ cat <<\EOF >> conftest.c
+ {0, (lt_ptr_t) 0}
+};
+
+#ifdef __cplusplus
+}
+#endif
+EOF
+ # Now try linking the two files.
+ mv conftest.$ac_objext conftestm.$ac_objext
+ ac_save_LIBS="$LIBS"
+ ac_save_CFLAGS="$CFLAGS"
+ LIBS="conftestm.$ac_objext"
+ CFLAGS="$CFLAGS$no_builtin_flag"
+ if { (eval echo configure:1773: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ ac_pipe_works=yes
+ else
+ echo "configure: failed program was:" >&5
+ cat conftest.c >&5
+ fi
+ LIBS="$ac_save_LIBS"
+ CFLAGS="$ac_save_CFLAGS"
+ else
+ echo "cannot find nm_test_func in $ac_nlist" >&5
+ fi
+ else
+ echo "cannot find nm_test_var in $ac_nlist" >&5
+ fi
+ else
+ echo "cannot run $ac_cv_sys_global_symbol_pipe" >&5
+ fi
+ else
+ echo "$progname: failed program was:" >&5
+ cat conftest.c >&5
+ fi
+ rm -rf conftest*
+
+ # Do not use the global_symbol_pipe unless it works.
+ if test "$ac_pipe_works" = yes; then
+ if test x"$ac_symprfx" = x"_"; then
+ ac_cv_sys_symbol_underscore=yes
+ else
+ ac_cv_sys_symbol_underscore=no
+ fi
+ break
+ else
+ ac_cv_sys_global_symbol_pipe=
+ fi
+done
+
+fi
+
+
+ac_result=yes
+if test -z "$ac_cv_sys_global_symbol_pipe"; then
+ ac_result=no
+fi
+echo "$ac_t""$ac_result" 1>&6
+
+echo $ac_n "checking for _ prefix in compiled symbols""... $ac_c" 1>&6
+echo "configure:1819: checking for _ prefix in compiled symbols" >&5
+if eval "test \"`echo '$''{'ac_cv_sys_symbol_underscore'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_cv_sys_symbol_underscore=no
+cat > conftest.$ac_ext <<EOF
+void nm_test_func(){}
+int main(){nm_test_func;return 0;}
+EOF
+if { (eval echo configure:1828: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ # Now try to grab the symbols.
+ ac_nlist=conftest.nm
+ if { (eval echo configure:1831: \"$NM conftest.$ac_objext \| $ac_cv_sys_global_symbol_pipe \> $ac_nlist\") 1>&5; (eval $NM conftest.$ac_objext \| $ac_cv_sys_global_symbol_pipe \> $ac_nlist) 2>&5; } && test -s "$ac_nlist"; then
+ # See whether the symbols have a leading underscore.
+ if egrep '^. _nm_test_func' "$ac_nlist" >/dev/null; then
+ ac_cv_sys_symbol_underscore=yes
+ else
+ if egrep '^. nm_test_func ' "$ac_nlist" >/dev/null; then
+ :
+ else
+ echo "configure: cannot find nm_test_func in $ac_nlist" >&5
+ fi
+ fi
+ else
+ echo "configure: cannot run $ac_cv_sys_global_symbol_pipe" >&5
+ fi
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.c >&5
+fi
+rm -rf conftest*
+
+fi
+
+echo "$ac_t""$ac_cv_sys_symbol_underscore" 1>&6
+USE_SYMBOL_UNDERSCORE=${ac_cv_sys_symbol_underscore=no}
+
+echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6
+echo "configure:1857: checking whether ln -s works" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ rm -f conftestdata
+if ln -s X conftestdata 2>/dev/null
+then
+ rm -f conftestdata
+ ac_cv_prog_LN_S="ln -s"
+else
+ ac_cv_prog_LN_S=ln
+fi
+fi
+LN_S="$ac_cv_prog_LN_S"
+if test "$ac_cv_prog_LN_S" = "ln -s"; then
+ echo "$ac_t""yes" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+if test $host != $build; then
+ ac_tool_prefix=${host_alias}-
+else
+ ac_tool_prefix=
+fi
+
+
+# Check for any special flags to pass to ltconfig.
+libtool_flags="--cache-file=$cache_file"
+test "$enable_shared" = no && libtool_flags="$libtool_flags --disable-shared"
+test "$enable_static" = no && libtool_flags="$libtool_flags --disable-static"
+test "$enable_fast_install" = no && libtool_flags="$libtool_flags --disable-fast-install"
+test "$lt_dlopen" = yes && libtool_flags="$libtool_flags --enable-dlopen"
+test "$silent" = yes && libtool_flags="$libtool_flags --silent"
+test "$ac_cv_prog_gcc" = yes && libtool_flags="$libtool_flags --with-gcc"
+test "$ac_cv_prog_gnu_ld" = yes && libtool_flags="$libtool_flags --with-gnu-ld"
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case "$host" in
+*-*-irix6*)
+ # Find out which ABI we are using.
+ echo '#line 1899 "configure"' > conftest.$ac_ext
+ if { (eval echo configure:1900: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ case "`/usr/bin/file conftest.o`" in
+ *32-bit*)
+ LD="${LD-ld} -32"
+ ;;
+ *N32*)
+ LD="${LD-ld} -n32"
+ ;;
+ *64-bit*)
+ LD="${LD-ld} -64"
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+
+*-*-sco3.2v5*)
+ # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+ SAVE_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -belf"
+ echo $ac_n "checking whether the C compiler needs -belf""... $ac_c" 1>&6
+echo "configure:1921: checking whether the C compiler needs -belf" >&5
+if eval "test \"`echo '$''{'lt_cv_cc_needs_belf'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1926 "configure"
+#include "confdefs.h"
+
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:1933: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ lt_cv_cc_needs_belf=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ lt_cv_cc_needs_belf=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$lt_cv_cc_needs_belf" 1>&6
+ if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+ # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+ CFLAGS="$SAVE_CFLAGS"
+ fi
+ ;;
+
+*-*-cygwin*)
+ # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dlltool; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1956: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_DLLTOOL'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$DLLTOOL"; then
+ ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+DLLTOOL="$ac_cv_prog_DLLTOOL"
+if test -n "$DLLTOOL"; then
+ echo "$ac_t""$DLLTOOL" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+if test -z "$ac_cv_prog_DLLTOOL"; then
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "dlltool", so it can be a program name with args.
+set dummy dlltool; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1988: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_DLLTOOL'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$DLLTOOL"; then
+ ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_DLLTOOL="dlltool"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_prog_DLLTOOL" && ac_cv_prog_DLLTOOL="false"
+fi
+fi
+DLLTOOL="$ac_cv_prog_DLLTOOL"
+if test -n "$DLLTOOL"; then
+ echo "$ac_t""$DLLTOOL" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+else
+ DLLTOOL="false"
+fi
+fi
+
+# Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args.
+set dummy ${ac_tool_prefix}as; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:2023: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_AS'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$AS"; then
+ ac_cv_prog_AS="$AS" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_AS="${ac_tool_prefix}as"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+AS="$ac_cv_prog_AS"
+if test -n "$AS"; then
+ echo "$ac_t""$AS" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+if test -z "$ac_cv_prog_AS"; then
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "as", so it can be a program name with args.
+set dummy as; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:2055: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_AS'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$AS"; then
+ ac_cv_prog_AS="$AS" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_AS="as"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_prog_AS" && ac_cv_prog_AS="false"
+fi
+fi
+AS="$ac_cv_prog_AS"
+if test -n "$AS"; then
+ echo "$ac_t""$AS" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+else
+ AS="false"
+fi
+fi
+
+
+ ;;
+
+esac
+
+# enable the --disable-libtool-lock switch
+
+# Check whether --enable-libtool-lock or --disable-libtool-lock was given.
+if test "${enable_libtool_lock+set}" = set; then
+ enableval="$enable_libtool_lock"
+ need_locks=$enableval
+else
+ need_locks=yes
+fi
+
+
+if test x"$need_locks" = xno; then
+ libtool_flags="$libtool_flags --disable-lock"
+fi
+
+
+# Save cache, so that ltconfig can load it
+cat > confcache <<\EOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs. It is not useful on other systems.
+# If it contains results you don't want to keep, you may remove or edit it.
+#
+# By default, configure uses ./config.cache as the cache file,
+# creating it if it does not exist already. You can give configure
+# the --cache-file=FILE option to use a different cache file; that is
+# what configure does when it calls configure scripts in
+# subdirectories, so they share the cache.
+# Giving --cache-file=/dev/null disables caching, for debugging configure.
+# config.status only pays attention to the cache file if you give it the
+# --recheck option to rerun configure.
+#
+EOF
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(set) 2>&1 |
+ case `(ac_space=' '; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ # `set' does not quote correctly, so add quotes (double-quote substitution
+ # turns \\\\ into \\, and sed turns \\ into \).
+ sed -n \
+ -e "s/'/'\\\\''/g" \
+ -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
+ ;;
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
+ ;;
+ esac >> confcache
+if cmp -s $cache_file confcache; then
+ :
+else
+ if test -w $cache_file; then
+ echo "updating cache $cache_file"
+ cat confcache > $cache_file
+ else
+ echo "not updating unwritable cache $cache_file"
+ fi
+fi
+rm -f confcache
+
+
+# Actually configure libtool. ac_aux_dir is where install-sh is found.
+CC="$CC" CFLAGS="$CFLAGS" CPPFLAGS="$CPPFLAGS" \
+LD="$LD" NM="$NM" RANLIB="$RANLIB" LN_S="$LN_S" \
+DLLTOOL="$DLLTOOL" AS="$AS" \
+${CONFIG_SHELL-/bin/sh} $ac_aux_dir/ltconfig --no-reexec \
+$libtool_flags --no-verify $ac_aux_dir/ltmain.sh $host \
+|| { echo "configure: error: libtool configure failed" 1>&2; exit 1; }
+
+# Reload cache, that may have been modified by ltconfig
+if test -r "$cache_file"; then
+ echo "loading cache $cache_file"
+ . $cache_file
+else
+ echo "creating cache $cache_file"
+ > $cache_file
+fi
+
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ac_aux_dir/ltconfig $ac_aux_dir/ltmain.sh"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+
+# Redirect the config.log output again, so that the ltconfig log is not
+# clobbered by the next message.
+exec 5>>./config.log
+
+
+if test -z "$with_target_subdir" || test "$with_target_subdir" = "."; then
+ COMPPATH=.
+else
+ COMPPATH=..
+fi
+
+
+
+if test -n "$with_cross_host"; then
+ # We are being configured with a cross compiler. AC_REPLACE_FUNCS
+ # may not work correctly, because the compiler may not be able to
+ # link executables.
+
+ # We assume newlib. This lets us hard-code the functions we know
+ # we'll have.
+ cat >> confdefs.h <<\EOF
+#define HAVE_MEMCPY 1
+EOF
+
+ cat >> confdefs.h <<\EOF
+#define HAVE_STRERROR 1
+EOF
+
+
+ # We ignore --with-system-zlib in this case.
+ target_all=libzgcj.la
+else
+ echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
+echo "configure:2214: checking how to run the C preprocessor" >&5
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+ CPP=
+fi
+if test -z "$CPP"; then
+if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ # This must be in double quotes, not single quotes, because CPP may get
+ # substituted into the Makefile and "${CC-cc}" will confuse make.
+ CPP="${CC-cc} -E"
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp.
+ cat > conftest.$ac_ext <<EOF
+#line 2229 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:2235: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ :
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ CPP="${CC-cc} -E -traditional-cpp"
+ cat > conftest.$ac_ext <<EOF
+#line 2246 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:2252: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ :
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ CPP="${CC-cc} -nologo -E"
+ cat > conftest.$ac_ext <<EOF
+#line 2263 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:2269: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ :
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ CPP=/lib/cpp
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+ ac_cv_prog_CPP="$CPP"
+fi
+ CPP="$ac_cv_prog_CPP"
+else
+ ac_cv_prog_CPP="$CPP"
+fi
+echo "$ac_t""$CPP" 1>&6
+
+for ac_hdr in unistd.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:2297: checking for $ac_hdr" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2302 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:2307: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=yes"
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+
+for ac_func in getpagesize
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:2336: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2341 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:2364: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+
+echo $ac_n "checking for working mmap""... $ac_c" 1>&6
+echo "configure:2389: checking for working mmap" >&5
+if eval "test \"`echo '$''{'ac_cv_func_mmap_fixed_mapped'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test "$cross_compiling" = yes; then
+ ac_cv_func_mmap_fixed_mapped=no
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2397 "configure"
+#include "confdefs.h"
+
+/* Thanks to Mike Haertel and Jim Avera for this test.
+ Here is a matrix of mmap possibilities:
+ mmap private not fixed
+ mmap private fixed at somewhere currently unmapped
+ mmap private fixed at somewhere already mapped
+ mmap shared not fixed
+ mmap shared fixed at somewhere currently unmapped
+ mmap shared fixed at somewhere already mapped
+ For private mappings, we should verify that changes cannot be read()
+ back from the file, nor mmap's back from the file at a different
+ address. (There have been systems where private was not correctly
+ implemented like the infamous i386 svr4.0, and systems where the
+ VM page cache was not coherent with the filesystem buffer cache
+ like early versions of FreeBSD and possibly contemporary NetBSD.)
+ For shared mappings, we should conversely verify that changes get
+ propogated back to all the places they're supposed to be.
+
+ Grep wants private fixed already mapped.
+ The main things grep needs to know about mmap are:
+ * does it exist and is it safe to write into the mmap'd area
+ * how to use it (BSD variants) */
+#include <sys/types.h>
+#include <fcntl.h>
+#include <sys/mman.h>
+
+/* This mess was copied from the GNU getpagesize.h. */
+#ifndef HAVE_GETPAGESIZE
+# ifdef HAVE_UNISTD_H
+# include <unistd.h>
+# endif
+
+/* Assume that all systems that can run configure have sys/param.h. */
+# ifndef HAVE_SYS_PARAM_H
+# define HAVE_SYS_PARAM_H 1
+# endif
+
+# ifdef _SC_PAGESIZE
+# define getpagesize() sysconf(_SC_PAGESIZE)
+# else /* no _SC_PAGESIZE */
+# ifdef HAVE_SYS_PARAM_H
+# include <sys/param.h>
+# ifdef EXEC_PAGESIZE
+# define getpagesize() EXEC_PAGESIZE
+# else /* no EXEC_PAGESIZE */
+# ifdef NBPG
+# define getpagesize() NBPG * CLSIZE
+# ifndef CLSIZE
+# define CLSIZE 1
+# endif /* no CLSIZE */
+# else /* no NBPG */
+# ifdef NBPC
+# define getpagesize() NBPC
+# else /* no NBPC */
+# ifdef PAGESIZE
+# define getpagesize() PAGESIZE
+# endif /* PAGESIZE */
+# endif /* no NBPC */
+# endif /* no NBPG */
+# endif /* no EXEC_PAGESIZE */
+# else /* no HAVE_SYS_PARAM_H */
+# define getpagesize() 8192 /* punt totally */
+# endif /* no HAVE_SYS_PARAM_H */
+# endif /* no _SC_PAGESIZE */
+
+#endif /* no HAVE_GETPAGESIZE */
+
+#ifdef __cplusplus
+extern "C" { void *malloc(unsigned); }
+#else
+char *malloc();
+#endif
+
+int
+main()
+{
+ char *data, *data2, *data3;
+ int i, pagesize;
+ int fd;
+
+ pagesize = getpagesize();
+
+ /*
+ * First, make a file with some known garbage in it.
+ */
+ data = malloc(pagesize);
+ if (!data)
+ exit(1);
+ for (i = 0; i < pagesize; ++i)
+ *(data + i) = rand();
+ umask(0);
+ fd = creat("conftestmmap", 0600);
+ if (fd < 0)
+ exit(1);
+ if (write(fd, data, pagesize) != pagesize)
+ exit(1);
+ close(fd);
+
+ /*
+ * Next, try to mmap the file at a fixed address which
+ * already has something else allocated at it. If we can,
+ * also make sure that we see the same garbage.
+ */
+ fd = open("conftestmmap", O_RDWR);
+ if (fd < 0)
+ exit(1);
+ data2 = malloc(2 * pagesize);
+ if (!data2)
+ exit(1);
+ data2 += (pagesize - ((int) data2 & (pagesize - 1))) & (pagesize - 1);
+ if (data2 != mmap(data2, pagesize, PROT_READ | PROT_WRITE,
+ MAP_PRIVATE | MAP_FIXED, fd, 0L))
+ exit(1);
+ for (i = 0; i < pagesize; ++i)
+ if (*(data + i) != *(data2 + i))
+ exit(1);
+
+ /*
+ * Finally, make sure that changes to the mapped area
+ * do not percolate back to the file as seen by read().
+ * (This is a bug on some variants of i386 svr4.0.)
+ */
+ for (i = 0; i < pagesize; ++i)
+ *(data2 + i) = *(data2 + i) + 1;
+ data3 = malloc(pagesize);
+ if (!data3)
+ exit(1);
+ if (read(fd, data3, pagesize) != pagesize)
+ exit(1);
+ for (i = 0; i < pagesize; ++i)
+ if (*(data + i) != *(data3 + i))
+ exit(1);
+ close(fd);
+ unlink("conftestmmap");
+ exit(0);
+}
+
+EOF
+if { (eval echo configure:2537: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+ ac_cv_func_mmap_fixed_mapped=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ ac_cv_func_mmap_fixed_mapped=no
+fi
+rm -fr conftest*
+fi
+
+fi
+
+echo "$ac_t""$ac_cv_func_mmap_fixed_mapped" 1>&6
+if test $ac_cv_func_mmap_fixed_mapped = yes; then
+ cat >> confdefs.h <<\EOF
+#define HAVE_MMAP 1
+EOF
+
+fi
+
+ for ac_func in memcpy strerror
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:2562: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2567 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:2590: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+
+
+ if test "$with_system_zlib" = yes; then
+ echo $ac_n "checking for deflate in -lz""... $ac_c" 1>&6
+echo "configure:2617: checking for deflate in -lz" >&5
+ac_lib_var=`echo z'_'deflate | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-lz $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 2625 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char deflate();
+
+int main() {
+deflate()
+; return 0; }
+EOF
+if { (eval echo configure:2636: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ target_all=
+else
+ echo "$ac_t""no" 1>&6
+target_all=libzgcj.la
+fi
+
+ else
+ target_all=libzgcj.la
+ fi
+fi
+
+
+
+for ac_hdr in unistd.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:2668: checking for $ac_hdr" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2673 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:2678: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=yes"
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+
+
+
+
+if test -z "$with_cross_host"; then
+ USE_LIBDIR_TRUE=
+ USE_LIBDIR_FALSE='#'
+else
+ USE_LIBDIR_TRUE='#'
+ USE_LIBDIR_FALSE=
+fi
+
+if test "${multilib}" = "yes"; then
+ multilib_arg="--enable-multilib"
+else
+ multilib_arg=
+fi
+
+trap '' 1 2 15
+cat > confcache <<\EOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs. It is not useful on other systems.
+# If it contains results you don't want to keep, you may remove or edit it.
+#
+# By default, configure uses ./config.cache as the cache file,
+# creating it if it does not exist already. You can give configure
+# the --cache-file=FILE option to use a different cache file; that is
+# what configure does when it calls configure scripts in
+# subdirectories, so they share the cache.
+# Giving --cache-file=/dev/null disables caching, for debugging configure.
+# config.status only pays attention to the cache file if you give it the
+# --recheck option to rerun configure.
+#
+EOF
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(set) 2>&1 |
+ case `(ac_space=' '; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ # `set' does not quote correctly, so add quotes (double-quote substitution
+ # turns \\\\ into \\, and sed turns \\ into \).
+ sed -n \
+ -e "s/'/'\\\\''/g" \
+ -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
+ ;;
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
+ ;;
+ esac >> confcache
+if cmp -s $cache_file confcache; then
+ :
+else
+ if test -w $cache_file; then
+ echo "updating cache $cache_file"
+ cat confcache > $cache_file
+ else
+ echo "not updating unwritable cache $cache_file"
+ fi
+fi
+rm -f confcache
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Any assignment to VPATH causes Sun make to only execute
+# the first set of double-colon rules, so remove it if not needed.
+# If there is a colon in the path, we need to keep it.
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d'
+fi
+
+trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
+
+# Transform confdefs.h into DEFS.
+# Protect against shell expansion while executing Makefile rules.
+# Protect against Makefile macro expansion.
+cat > conftest.defs <<\EOF
+s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g
+s%[ `~#$^&*(){}\\|;'"<>?]%\\&%g
+s%\[%\\&%g
+s%\]%\\&%g
+s%\$%$$%g
+EOF
+DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '`
+rm -f conftest.defs
+
+
+# Without the "./", some shells look in PATH for config.status.
+: ${CONFIG_STATUS=./config.status}
+
+echo creating $CONFIG_STATUS
+rm -f $CONFIG_STATUS
+cat > $CONFIG_STATUS <<EOF
+#! /bin/sh
+# Generated automatically by configure.
+# Run this file to recreate the current configuration.
+# This directory was configured as follows,
+# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+#
+# $0 $ac_configure_args
+#
+# Compiler output produced by configure, useful for debugging
+# configure, is in ./config.log if it exists.
+
+ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
+for ac_option
+do
+ case "\$ac_option" in
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
+ exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
+ -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
+ echo "$CONFIG_STATUS generated by autoconf version 2.13"
+ exit 0 ;;
+ -help | --help | --hel | --he | --h)
+ echo "\$ac_cs_usage"; exit 0 ;;
+ *) echo "\$ac_cs_usage"; exit 1 ;;
+ esac
+done
+
+ac_given_srcdir=$srcdir
+ac_given_INSTALL="$INSTALL"
+
+trap 'rm -fr `echo "Makefile" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+# Protect against being on the right side of a sed subst in config.status.
+sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
+ s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
+$ac_vpsub
+$extrasub
+s%@SHELL@%$SHELL%g
+s%@CFLAGS@%$CFLAGS%g
+s%@CPPFLAGS@%$CPPFLAGS%g
+s%@CXXFLAGS@%$CXXFLAGS%g
+s%@FFLAGS@%$FFLAGS%g
+s%@DEFS@%$DEFS%g
+s%@LDFLAGS@%$LDFLAGS%g
+s%@LIBS@%$LIBS%g
+s%@exec_prefix@%$exec_prefix%g
+s%@prefix@%$prefix%g
+s%@program_transform_name@%$program_transform_name%g
+s%@bindir@%$bindir%g
+s%@sbindir@%$sbindir%g
+s%@libexecdir@%$libexecdir%g
+s%@datadir@%$datadir%g
+s%@sysconfdir@%$sysconfdir%g
+s%@sharedstatedir@%$sharedstatedir%g
+s%@localstatedir@%$localstatedir%g
+s%@libdir@%$libdir%g
+s%@includedir@%$includedir%g
+s%@oldincludedir@%$oldincludedir%g
+s%@infodir@%$infodir%g
+s%@mandir@%$mandir%g
+s%@host@%$host%g
+s%@host_alias@%$host_alias%g
+s%@host_cpu@%$host_cpu%g
+s%@host_vendor@%$host_vendor%g
+s%@host_os@%$host_os%g
+s%@target@%$target%g
+s%@target_alias@%$target_alias%g
+s%@target_cpu@%$target_cpu%g
+s%@target_vendor@%$target_vendor%g
+s%@target_os@%$target_os%g
+s%@build@%$build%g
+s%@build_alias@%$build_alias%g
+s%@build_cpu@%$build_cpu%g
+s%@build_vendor@%$build_vendor%g
+s%@build_os@%$build_os%g
+s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
+s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g
+s%@INSTALL_DATA@%$INSTALL_DATA%g
+s%@PACKAGE@%$PACKAGE%g
+s%@VERSION@%$VERSION%g
+s%@ACLOCAL@%$ACLOCAL%g
+s%@AUTOCONF@%$AUTOCONF%g
+s%@AUTOMAKE@%$AUTOMAKE%g
+s%@AUTOHEADER@%$AUTOHEADER%g
+s%@MAKEINFO@%$MAKEINFO%g
+s%@SET_MAKE@%$SET_MAKE%g
+s%@MAINTAINER_MODE_TRUE@%$MAINTAINER_MODE_TRUE%g
+s%@MAINTAINER_MODE_FALSE@%$MAINTAINER_MODE_FALSE%g
+s%@MAINT@%$MAINT%g
+s%@EXEEXT@%$EXEEXT%g
+s%@zlib_basedir@%$zlib_basedir%g
+s%@CC@%$CC%g
+s%@RANLIB@%$RANLIB%g
+s%@LD@%$LD%g
+s%@NM@%$NM%g
+s%@USE_SYMBOL_UNDERSCORE@%$USE_SYMBOL_UNDERSCORE%g
+s%@LN_S@%$LN_S%g
+s%@DLLTOOL@%$DLLTOOL%g
+s%@AS@%$AS%g
+s%@LIBTOOL@%$LIBTOOL%g
+s%@COMPPATH@%$COMPPATH%g
+s%@CPP@%$CPP%g
+s%@target_all@%$target_all%g
+s%@USE_LIBDIR_TRUE@%$USE_LIBDIR_TRUE%g
+s%@USE_LIBDIR_FALSE@%$USE_LIBDIR_FALSE%g
+
+CEOF
+EOF
+
+cat >> $CONFIG_STATUS <<\EOF
+
+# Split the substitutions into bite-sized pieces for seds with
+# small command number limits, like on Digital OSF/1 and HP-UX.
+ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
+ac_file=1 # Number of current file.
+ac_beg=1 # First line for current file.
+ac_end=$ac_max_sed_cmds # Line after last line for current file.
+ac_more_lines=:
+ac_sed_cmds=""
+while $ac_more_lines; do
+ if test $ac_beg -gt 1; then
+ sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
+ else
+ sed "${ac_end}q" conftest.subs > conftest.s$ac_file
+ fi
+ if test ! -s conftest.s$ac_file; then
+ ac_more_lines=false
+ rm -f conftest.s$ac_file
+ else
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds="sed -f conftest.s$ac_file"
+ else
+ ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
+ fi
+ ac_file=`expr $ac_file + 1`
+ ac_beg=$ac_end
+ ac_end=`expr $ac_end + $ac_max_sed_cmds`
+ fi
+done
+if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds=cat
+fi
+EOF
+
+cat >> $CONFIG_STATUS <<EOF
+
+CONFIG_FILES=\${CONFIG_FILES-"Makefile"}
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case "$ac_file" in
+ *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+ ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+ *) ac_file_in="${ac_file}.in" ;;
+ esac
+
+ # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.
+
+ # Remove last slash and all that follows it. Not all systems have dirname.
+ ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+ if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+ # The file is in a subdirectory.
+ test ! -d "$ac_dir" && mkdir "$ac_dir"
+ ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
+ else
+ ac_dir_suffix= ac_dots=
+ fi
+
+ case "$ac_given_srcdir" in
+ .) srcdir=.
+ if test -z "$ac_dots"; then top_srcdir=.
+ else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
+ /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
+ *) # Relative path.
+ srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
+ top_srcdir="$ac_dots$ac_given_srcdir" ;;
+ esac
+
+ case "$ac_given_INSTALL" in
+ [/$]*) INSTALL="$ac_given_INSTALL" ;;
+ *) INSTALL="$ac_dots$ac_given_INSTALL" ;;
+ esac
+
+ echo creating "$ac_file"
+ rm -f "$ac_file"
+ configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
+ case "$ac_file" in
+ *Makefile*) ac_comsub="1i\\
+# $configure_input" ;;
+ *) ac_comsub= ;;
+ esac
+
+ ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+ sed -e "$ac_comsub
+s%@configure_input@%$configure_input%g
+s%@srcdir@%$srcdir%g
+s%@top_srcdir@%$top_srcdir%g
+s%@INSTALL@%$INSTALL%g
+" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
+fi; done
+rm -f conftest.s*
+
+EOF
+cat >> $CONFIG_STATUS <<EOF
+srcdir=${srcdir}
+host=${host}
+target=${target}
+with_multisubdir=${with_multisubdir}
+ac_configure_args="${multilib_arg} ${ac_configure_args}"
+CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
+zlib_basedir=${zlib_basedir}
+CC="${CC}"
+CXX="${CXX}"
+
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+if test -n "$CONFIG_FILES"; then
+ ac_file=Makefile . ${zlib_basedir}/../config-ml.in
+fi
+exit 0
+EOF
+chmod +x $CONFIG_STATUS
+rm -fr confdefs* $ac_clean_files
+test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
+
diff --git a/zlib/configure.in b/zlib/configure.in
new file mode 100644
index 00000000000..dc4d5c8a2ad
--- /dev/null
+++ b/zlib/configure.in
@@ -0,0 +1,103 @@
+dnl Process this with autoconf to create configure
+
+AC_INIT(zlib.h)
+AC_CANONICAL_SYSTEM
+AM_INIT_AUTOMAKE(zlib, 1.1.3)
+
+AM_MAINTAINER_MODE
+AC_EXEEXT
+
+AC_CONFIG_AUX_DIR(..)
+
+dnl We use these options to decide which functions to include.
+AC_ARG_WITH(target-subdir,
+[ --with-target-subdir=SUBDIR Configuring in a subdirectory])
+AC_ARG_WITH(cross-host,
+[ --with-cross-host=HOST Configuring with a cross compiler])
+
+dnl Default to --enable-multilib
+AC_ARG_ENABLE(multilib,
+[ --enable-multilib build many library versions (default)],
+[case "${enableval}" in
+ yes) multilib=yes ;;
+ no) multilib=no ;;
+ *) AC_MSG_ERROR(bad value ${enableval} for multilib option) ;;
+ esac], [multilib=yes])dnl
+
+dnl We may get other options which we dont document:
+dnl --with-target-subdir, --with-multisrctop, --with-multisubdir
+
+if test "[$]{srcdir}" = "."; then
+ if test "[$]{with_target_subdir}" != "."; then
+ zlib_basedir="[$]{srcdir}/[$]{with_multisrctop}../"
+ else
+ zlib_basedir="[$]{srcdir}/[$]{with_multisrctop}"
+ fi
+else
+ zlib_basedir="[$]{srcdir}/"
+fi
+AC_SUBST(zlib_basedir)
+
+AC_ARG_WITH(system-zlib,
+[ --with-system-zlib Use installed libz])
+
+LIB_AC_PROG_CC
+AM_PROG_LIBTOOL
+
+if test -z "$with_target_subdir" || test "$with_target_subdir" = "."; then
+ COMPPATH=.
+else
+ COMPPATH=..
+fi
+AC_SUBST(COMPPATH)
+
+
+if test -n "$with_cross_host"; then
+ # We are being configured with a cross compiler. AC_REPLACE_FUNCS
+ # may not work correctly, because the compiler may not be able to
+ # link executables.
+
+ # We assume newlib. This lets us hard-code the functions we know
+ # we'll have.
+ AC_DEFINE(HAVE_MEMCPY)
+ AC_DEFINE(HAVE_STRERROR)
+
+ # We ignore --with-system-zlib in this case.
+ target_all=libzgcj.la
+else
+ AC_FUNC_MMAP
+ AC_CHECK_FUNCS(memcpy strerror)
+
+ if test "$with_system_zlib" = yes; then
+ AC_CHECK_LIB(z, deflate, target_all=, target_all=libzgcj.la)
+ else
+ target_all=libzgcj.la
+ fi
+fi
+
+AC_SUBST(target_all)
+
+AC_CHECK_HEADERS(unistd.h)
+
+AM_CONDITIONAL(USE_LIBDIR, test -z "$with_cross_host")
+
+if test "${multilib}" = "yes"; then
+ multilib_arg="--enable-multilib"
+else
+ multilib_arg=
+fi
+
+AC_OUTPUT(Makefile,
+[if test -n "$CONFIG_FILES"; then
+ ac_file=Makefile . ${zlib_basedir}/../config-ml.in
+fi],
+srcdir=${srcdir}
+host=${host}
+target=${target}
+with_multisubdir=${with_multisubdir}
+ac_configure_args="${multilib_arg} ${ac_configure_args}"
+CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
+zlib_basedir=${zlib_basedir}
+CC="${CC}"
+CXX="${CXX}"
+)
diff --git a/zlib/contrib/README.contrib b/zlib/contrib/README.contrib
new file mode 100644
index 00000000000..7ad191cf598
--- /dev/null
+++ b/zlib/contrib/README.contrib
@@ -0,0 +1,34 @@
+All files under this contrib directory are UNSUPPORTED. There were
+provided by users of zlib and were not tested by the authors of zlib.
+Use at your own risk. Please contact the authors of the contributions
+for help about these, not the zlib authors. Thanks.
+
+
+asm386/ by Gilles Vollant <info@winimage.com>
+ 386 asm code replacing longest_match(), for Visual C++ 4.2 and ML 6.11c
+
+asm586/ and asm686/ by Brian Raiter <breadbox@muppetlabs.com>
+ asm code for Pentium and Pentium Pro
+ See http://www.muppetlabs.com/~breadbox/software/assembly.html
+
+delphi/ by Bob Dellaca <bobdl@xtra.co.nz>
+ Support for Delphi
+
+delphi2/ by Davide Moretti <dave@rimini.com>
+ Another support for C++Builder and Delphi
+
+minizip/ by Gilles Vollant <info@winimage.com>
+ Mini zip and unzip based on zlib
+ See http://www.winimage.com/zLibDll/unzip.html
+
+iostream/ by Kevin Ruland <kevin@rodin.wustl.edu>
+ A C++ I/O streams interface to the zlib gz* functions
+
+iostream2/ by Tyge Løvset <Tyge.Lovset@cmr.no>
+ Another C++ I/O streams interface
+
+untgz/ by "Pedro A. Aranda Guti\irrez" <paag@tid.es>
+ A very simple tar.gz file extractor using zlib
+
+visual-basic.txt by Carlos Rios <c_rios@sonda.cl>
+ How to use compress(), uncompress() and the gz* functions from VB.
diff --git a/zlib/contrib/asm386/gvmat32.asm b/zlib/contrib/asm386/gvmat32.asm
new file mode 100644
index 00000000000..28d527f47f8
--- /dev/null
+++ b/zlib/contrib/asm386/gvmat32.asm
@@ -0,0 +1,559 @@
+;
+; gvmat32.asm -- Asm portion of the optimized longest_match for 32 bits x86
+; Copyright (C) 1995-1996 Jean-loup Gailly and Gilles Vollant.
+; File written by Gilles Vollant, by modifiying the longest_match
+; from Jean-loup Gailly in deflate.c
+; It need wmask == 0x7fff
+; (assembly code is faster with a fixed wmask)
+;
+; For Visual C++ 4.2 and ML 6.11c (version in directory \MASM611C of Win95 DDK)
+; I compile with : "ml /coff /Zi /c gvmat32.asm"
+;
+
+;uInt longest_match_7fff(s, cur_match)
+; deflate_state *s;
+; IPos cur_match; /* current match */
+
+ NbStack equ 76
+ cur_match equ dword ptr[esp+NbStack-0]
+ str_s equ dword ptr[esp+NbStack-4]
+; 5 dword on top (ret,ebp,esi,edi,ebx)
+ adrret equ dword ptr[esp+NbStack-8]
+ pushebp equ dword ptr[esp+NbStack-12]
+ pushedi equ dword ptr[esp+NbStack-16]
+ pushesi equ dword ptr[esp+NbStack-20]
+ pushebx equ dword ptr[esp+NbStack-24]
+
+ chain_length equ dword ptr [esp+NbStack-28]
+ limit equ dword ptr [esp+NbStack-32]
+ best_len equ dword ptr [esp+NbStack-36]
+ window equ dword ptr [esp+NbStack-40]
+ prev equ dword ptr [esp+NbStack-44]
+ scan_start equ word ptr [esp+NbStack-48]
+ wmask equ dword ptr [esp+NbStack-52]
+ match_start_ptr equ dword ptr [esp+NbStack-56]
+ nice_match equ dword ptr [esp+NbStack-60]
+ scan equ dword ptr [esp+NbStack-64]
+
+ windowlen equ dword ptr [esp+NbStack-68]
+ match_start equ dword ptr [esp+NbStack-72]
+ strend equ dword ptr [esp+NbStack-76]
+ NbStackAdd equ (NbStack-24)
+
+ .386p
+
+ name gvmatch
+ .MODEL FLAT
+
+
+
+; all the +4 offsets are due to the addition of pending_buf_size (in zlib
+; in the deflate_state structure since the asm code was first written
+; (if you compile with zlib 1.0.4 or older, remove the +4).
+; Note : these value are good with a 8 bytes boundary pack structure
+ dep_chain_length equ 70h+4
+ dep_window equ 2ch+4
+ dep_strstart equ 60h+4
+ dep_prev_length equ 6ch+4
+ dep_nice_match equ 84h+4
+ dep_w_size equ 20h+4
+ dep_prev equ 34h+4
+ dep_w_mask equ 28h+4
+ dep_good_match equ 80h+4
+ dep_match_start equ 64h+4
+ dep_lookahead equ 68h+4
+
+
+_TEXT segment
+
+IFDEF NOUNDERLINE
+ public longest_match_7fff
+; public match_init
+ELSE
+ public _longest_match_7fff
+; public _match_init
+ENDIF
+
+ MAX_MATCH equ 258
+ MIN_MATCH equ 3
+ MIN_LOOKAHEAD equ (MAX_MATCH+MIN_MATCH+1)
+
+
+
+IFDEF NOUNDERLINE
+;match_init proc near
+; ret
+;match_init endp
+ELSE
+;_match_init proc near
+; ret
+;_match_init endp
+ENDIF
+
+
+IFDEF NOUNDERLINE
+longest_match_7fff proc near
+ELSE
+_longest_match_7fff proc near
+ENDIF
+
+ mov edx,[esp+4]
+
+
+
+ push ebp
+ push edi
+ push esi
+ push ebx
+
+ sub esp,NbStackAdd
+
+; initialize or check the variables used in match.asm.
+ mov ebp,edx
+
+; chain_length = s->max_chain_length
+; if (prev_length>=good_match) chain_length >>= 2
+ mov edx,[ebp+dep_chain_length]
+ mov ebx,[ebp+dep_prev_length]
+ cmp [ebp+dep_good_match],ebx
+ ja noshr
+ shr edx,2
+noshr:
+; we increment chain_length because in the asm, the --chain_lenght is in the beginning of the loop
+ inc edx
+ mov edi,[ebp+dep_nice_match]
+ mov chain_length,edx
+ mov eax,[ebp+dep_lookahead]
+ cmp eax,edi
+; if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead;
+ jae nolookaheadnicematch
+ mov edi,eax
+nolookaheadnicematch:
+; best_len = s->prev_length
+ mov best_len,ebx
+
+; window = s->window
+ mov esi,[ebp+dep_window]
+ mov ecx,[ebp+dep_strstart]
+ mov window,esi
+
+ mov nice_match,edi
+; scan = window + strstart
+ add esi,ecx
+ mov scan,esi
+; dx = *window
+ mov dx,word ptr [esi]
+; bx = *(window+best_len-1)
+ mov bx,word ptr [esi+ebx-1]
+ add esi,MAX_MATCH-1
+; scan_start = *scan
+ mov scan_start,dx
+; strend = scan + MAX_MATCH-1
+ mov strend,esi
+; bx = scan_end = *(window+best_len-1)
+
+; IPos limit = s->strstart > (IPos)MAX_DIST(s) ?
+; s->strstart - (IPos)MAX_DIST(s) : NIL;
+
+ mov esi,[ebp+dep_w_size]
+ sub esi,MIN_LOOKAHEAD
+; here esi = MAX_DIST(s)
+ sub ecx,esi
+ ja nodist
+ xor ecx,ecx
+nodist:
+ mov limit,ecx
+
+; prev = s->prev
+ mov edx,[ebp+dep_prev]
+ mov prev,edx
+
+;
+ mov edx,dword ptr [ebp+dep_match_start]
+ mov bp,scan_start
+ mov eax,cur_match
+ mov match_start,edx
+
+ mov edx,window
+ mov edi,edx
+ add edi,best_len
+ mov esi,prev
+ dec edi
+; windowlen = window + best_len -1
+ mov windowlen,edi
+
+ jmp beginloop2
+ align 4
+
+; here, in the loop
+; eax = ax = cur_match
+; ecx = limit
+; bx = scan_end
+; bp = scan_start
+; edi = windowlen (window + best_len -1)
+; esi = prev
+
+
+;// here; chain_length <=16
+normalbeg0add16:
+ add chain_length,16
+ jz exitloop
+normalbeg0:
+ cmp word ptr[edi+eax],bx
+ je normalbeg2noroll
+rcontlabnoroll:
+; cur_match = prev[cur_match & wmask]
+ and eax,7fffh
+ mov ax,word ptr[esi+eax*2]
+; if cur_match > limit, go to exitloop
+ cmp ecx,eax
+ jnb exitloop
+; if --chain_length != 0, go to exitloop
+ dec chain_length
+ jnz normalbeg0
+ jmp exitloop
+
+normalbeg2noroll:
+; if (scan_start==*(cur_match+window)) goto normalbeg2
+ cmp bp,word ptr[edx+eax]
+ jne rcontlabnoroll
+ jmp normalbeg2
+
+contloop3:
+ mov edi,windowlen
+
+; cur_match = prev[cur_match & wmask]
+ and eax,7fffh
+ mov ax,word ptr[esi+eax*2]
+; if cur_match > limit, go to exitloop
+ cmp ecx,eax
+jnbexitloopshort1:
+ jnb exitloop
+; if --chain_length != 0, go to exitloop
+
+
+; begin the main loop
+beginloop2:
+ sub chain_length,16+1
+; if chain_length <=16, don't use the unrolled loop
+ jna normalbeg0add16
+
+do16:
+ cmp word ptr[edi+eax],bx
+ je normalbeg2dc0
+
+maccn MACRO lab
+ and eax,7fffh
+ mov ax,word ptr[esi+eax*2]
+ cmp ecx,eax
+ jnb exitloop
+ cmp word ptr[edi+eax],bx
+ je lab
+ ENDM
+
+rcontloop0:
+ maccn normalbeg2dc1
+
+rcontloop1:
+ maccn normalbeg2dc2
+
+rcontloop2:
+ maccn normalbeg2dc3
+
+rcontloop3:
+ maccn normalbeg2dc4
+
+rcontloop4:
+ maccn normalbeg2dc5
+
+rcontloop5:
+ maccn normalbeg2dc6
+
+rcontloop6:
+ maccn normalbeg2dc7
+
+rcontloop7:
+ maccn normalbeg2dc8
+
+rcontloop8:
+ maccn normalbeg2dc9
+
+rcontloop9:
+ maccn normalbeg2dc10
+
+rcontloop10:
+ maccn short normalbeg2dc11
+
+rcontloop11:
+ maccn short normalbeg2dc12
+
+rcontloop12:
+ maccn short normalbeg2dc13
+
+rcontloop13:
+ maccn short normalbeg2dc14
+
+rcontloop14:
+ maccn short normalbeg2dc15
+
+rcontloop15:
+ and eax,7fffh
+ mov ax,word ptr[esi+eax*2]
+ cmp ecx,eax
+ jnb exitloop
+
+ sub chain_length,16
+ ja do16
+ jmp normalbeg0add16
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+normbeg MACRO rcontlab,valsub
+; if we are here, we know that *(match+best_len-1) == scan_end
+ cmp bp,word ptr[edx+eax]
+; if (match != scan_start) goto rcontlab
+ jne rcontlab
+; calculate the good chain_length, and we'll compare scan and match string
+ add chain_length,16-valsub
+ jmp iseq
+ ENDM
+
+
+normalbeg2dc11:
+ normbeg rcontloop11,11
+
+normalbeg2dc12:
+ normbeg short rcontloop12,12
+
+normalbeg2dc13:
+ normbeg short rcontloop13,13
+
+normalbeg2dc14:
+ normbeg short rcontloop14,14
+
+normalbeg2dc15:
+ normbeg short rcontloop15,15
+
+normalbeg2dc10:
+ normbeg rcontloop10,10
+
+normalbeg2dc9:
+ normbeg rcontloop9,9
+
+normalbeg2dc8:
+ normbeg rcontloop8,8
+
+normalbeg2dc7:
+ normbeg rcontloop7,7
+
+normalbeg2dc6:
+ normbeg rcontloop6,6
+
+normalbeg2dc5:
+ normbeg rcontloop5,5
+
+normalbeg2dc4:
+ normbeg rcontloop4,4
+
+normalbeg2dc3:
+ normbeg rcontloop3,3
+
+normalbeg2dc2:
+ normbeg rcontloop2,2
+
+normalbeg2dc1:
+ normbeg rcontloop1,1
+
+normalbeg2dc0:
+ normbeg rcontloop0,0
+
+
+; we go in normalbeg2 because *(ushf*)(match+best_len-1) == scan_end
+
+normalbeg2:
+ mov edi,window
+
+ cmp bp,word ptr[edi+eax]
+ jne contloop3 ; if *(ushf*)match != scan_start, continue
+
+iseq:
+; if we are here, we know that *(match+best_len-1) == scan_end
+; and (match == scan_start)
+
+ mov edi,edx
+ mov esi,scan ; esi = scan
+ add edi,eax ; edi = window + cur_match = match
+
+ mov edx,[esi+3] ; compare manually dword at match+3
+ xor edx,[edi+3] ; and scan +3
+
+ jz begincompare ; if equal, go to long compare
+
+; we will determine the unmatch byte and calculate len (in esi)
+ or dl,dl
+ je eq1rr
+ mov esi,3
+ jmp trfinval
+eq1rr:
+ or dx,dx
+ je eq1
+
+ mov esi,4
+ jmp trfinval
+eq1:
+ and edx,0ffffffh
+ jz eq11
+ mov esi,5
+ jmp trfinval
+eq11:
+ mov esi,6
+ jmp trfinval
+
+begincompare:
+ ; here we now scan and match begin same
+ add edi,6
+ add esi,6
+ mov ecx,(MAX_MATCH-(2+4))/4 ; scan for at most MAX_MATCH bytes
+ repe cmpsd ; loop until mismatch
+
+ je trfin ; go to trfin if not unmatch
+; we determine the unmatch byte
+ sub esi,4
+ mov edx,[edi-4]
+ xor edx,[esi]
+
+ or dl,dl
+ jnz trfin
+ inc esi
+
+ or dx,dx
+ jnz trfin
+ inc esi
+
+ and edx,0ffffffh
+ jnz trfin
+ inc esi
+
+trfin:
+ sub esi,scan ; esi = len
+trfinval:
+; here we have finised compare, and esi contain len of equal string
+ cmp esi,best_len ; if len > best_len, go newbestlen
+ ja short newbestlen
+; now we restore edx, ecx and esi, for the big loop
+ mov esi,prev
+ mov ecx,limit
+ mov edx,window
+ jmp contloop3
+
+newbestlen:
+ mov best_len,esi ; len become best_len
+
+ mov match_start,eax ; save new position as match_start
+ cmp esi,nice_match ; if best_len >= nice_match, exit
+ jae exitloop
+ mov ecx,scan
+ mov edx,window ; restore edx=window
+ add ecx,esi
+ add esi,edx
+
+ dec esi
+ mov windowlen,esi ; windowlen = window + best_len-1
+ mov bx,[ecx-1] ; bx = *(scan+best_len-1) = scan_end
+
+; now we restore ecx and esi, for the big loop :
+ mov esi,prev
+ mov ecx,limit
+ jmp contloop3
+
+exitloop:
+; exit : s->match_start=match_start
+ mov ebx,match_start
+ mov ebp,str_s
+ mov ecx,best_len
+ mov dword ptr [ebp+dep_match_start],ebx
+ mov eax,dword ptr [ebp+dep_lookahead]
+ cmp ecx,eax
+ ja minexlo
+ mov eax,ecx
+minexlo:
+; return min(best_len,s->lookahead)
+
+; restore stack and register ebx,esi,edi,ebp
+ add esp,NbStackAdd
+
+ pop ebx
+ pop esi
+ pop edi
+ pop ebp
+ ret
+InfoAuthor:
+; please don't remove this string !
+; Your are free use gvmat32 in any fre or commercial apps if you don't remove the string in the binary!
+ db 0dh,0ah,"GVMat32 optimised assembly code written 1996-98 by Gilles Vollant",0dh,0ah
+
+
+
+IFDEF NOUNDERLINE
+longest_match_7fff endp
+ELSE
+_longest_match_7fff endp
+ENDIF
+
+
+IFDEF NOUNDERLINE
+cpudetect32 proc near
+ELSE
+_cpudetect32 proc near
+ENDIF
+
+
+ pushfd ; push original EFLAGS
+ pop eax ; get original EFLAGS
+ mov ecx, eax ; save original EFLAGS
+ xor eax, 40000h ; flip AC bit in EFLAGS
+ push eax ; save new EFLAGS value on stack
+ popfd ; replace current EFLAGS value
+ pushfd ; get new EFLAGS
+ pop eax ; store new EFLAGS in EAX
+ xor eax, ecx ; can’t toggle AC bit, processor=80386
+ jz end_cpu_is_386 ; jump if 80386 processor
+ push ecx
+ popfd ; restore AC bit in EFLAGS first
+
+ pushfd
+ pushfd
+ pop ecx
+
+ mov eax, ecx ; get original EFLAGS
+ xor eax, 200000h ; flip ID bit in EFLAGS
+ push eax ; save new EFLAGS value on stack
+ popfd ; replace current EFLAGS value
+ pushfd ; get new EFLAGS
+ pop eax ; store new EFLAGS in EAX
+ popfd ; restore original EFLAGS
+ xor eax, ecx ; can’t toggle ID bit,
+ je is_old_486 ; processor=old
+
+ mov eax,1
+ db 0fh,0a2h ;CPUID
+
+exitcpudetect:
+ ret
+
+end_cpu_is_386:
+ mov eax,0300h
+ jmp exitcpudetect
+
+is_old_486:
+ mov eax,0400h
+ jmp exitcpudetect
+
+IFDEF NOUNDERLINE
+cpudetect32 endp
+ELSE
+_cpudetect32 endp
+ENDIF
+
+_TEXT ends
+end
diff --git a/zlib/contrib/asm386/gvmat32c.c b/zlib/contrib/asm386/gvmat32c.c
new file mode 100644
index 00000000000..d853bb7ce8a
--- /dev/null
+++ b/zlib/contrib/asm386/gvmat32c.c
@@ -0,0 +1,200 @@
+/* gvmat32.c -- C portion of the optimized longest_match for 32 bits x86
+ * Copyright (C) 1995-1996 Jean-loup Gailly and Gilles Vollant.
+ * File written by Gilles Vollant, by modifiying the longest_match
+ * from Jean-loup Gailly in deflate.c
+ * it prepare all parameters and call the assembly longest_match_gvasm
+ * longest_match execute standard C code is wmask != 0x7fff
+ * (assembly code is faster with a fixed wmask)
+ *
+ */
+
+#include "deflate.h"
+
+#undef FAR
+#include <windows.h>
+
+#ifdef ASMV
+#define NIL 0
+
+#define UNALIGNED_OK
+
+
+/* if your C compiler don't add underline before function name,
+ define ADD_UNDERLINE_ASMFUNC */
+#ifdef ADD_UNDERLINE_ASMFUNC
+#define longest_match_7fff _longest_match_7fff
+#endif
+
+
+
+void match_init()
+{
+}
+
+unsigned long cpudetect32();
+
+uInt longest_match_c(
+ deflate_state *s,
+ IPos cur_match); /* current match */
+
+
+uInt longest_match_7fff(
+ deflate_state *s,
+ IPos cur_match); /* current match */
+
+uInt longest_match(
+ deflate_state *s,
+ IPos cur_match) /* current match */
+{
+ static uInt iIsPPro=2;
+
+ if ((s->w_mask == 0x7fff) && (iIsPPro==0))
+ return longest_match_7fff(s,cur_match);
+
+ if (iIsPPro==2)
+ iIsPPro = (((cpudetect32()/0x100)&0xf)>=6) ? 1 : 0;
+
+ return longest_match_c(s,cur_match);
+}
+
+
+
+uInt longest_match_c(s, cur_match)
+ deflate_state *s;
+ IPos cur_match; /* current match */
+{
+ unsigned chain_length = s->max_chain_length;/* max hash chain length */
+ register Bytef *scan = s->window + s->strstart; /* current string */
+ register Bytef *match; /* matched string */
+ register int len; /* length of current match */
+ int best_len = s->prev_length; /* best match length so far */
+ int nice_match = s->nice_match; /* stop if match long enough */
+ IPos limit = s->strstart > (IPos)MAX_DIST(s) ?
+ s->strstart - (IPos)MAX_DIST(s) : NIL;
+ /* Stop when cur_match becomes <= limit. To simplify the code,
+ * we prevent matches with the string of window index 0.
+ */
+ Posf *prev = s->prev;
+ uInt wmask = s->w_mask;
+
+#ifdef UNALIGNED_OK
+ /* Compare two bytes at a time. Note: this is not always beneficial.
+ * Try with and without -DUNALIGNED_OK to check.
+ */
+ register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1;
+ register ush scan_start = *(ushf*)scan;
+ register ush scan_end = *(ushf*)(scan+best_len-1);
+#else
+ register Bytef *strend = s->window + s->strstart + MAX_MATCH;
+ register Byte scan_end1 = scan[best_len-1];
+ register Byte scan_end = scan[best_len];
+#endif
+
+ /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
+ * It is easy to get rid of this optimization if necessary.
+ */
+ Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever");
+
+ /* Do not waste too much time if we already have a good match: */
+ if (s->prev_length >= s->good_match) {
+ chain_length >>= 2;
+ }
+ /* Do not look for matches beyond the end of the input. This is necessary
+ * to make deflate deterministic.
+ */
+ if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead;
+
+ Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");
+
+ do {
+ Assert(cur_match < s->strstart, "no future");
+ match = s->window + cur_match;
+
+ /* Skip to next match if the match length cannot increase
+ * or if the match length is less than 2:
+ */
+#if (defined(UNALIGNED_OK) && MAX_MATCH == 258)
+ /* This code assumes sizeof(unsigned short) == 2. Do not use
+ * UNALIGNED_OK if your compiler uses a different size.
+ */
+ if (*(ushf*)(match+best_len-1) != scan_end ||
+ *(ushf*)match != scan_start) continue;
+
+ /* It is not necessary to compare scan[2] and match[2] since they are
+ * always equal when the other bytes match, given that the hash keys
+ * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at
+ * strstart+3, +5, ... up to strstart+257. We check for insufficient
+ * lookahead only every 4th comparison; the 128th check will be made
+ * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is
+ * necessary to put more guard bytes at the end of the window, or
+ * to check more often for insufficient lookahead.
+ */
+ Assert(scan[2] == match[2], "scan[2]?");
+ scan++, match++;
+ do {
+ } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
+ *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
+ *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
+ *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
+ scan < strend);
+ /* The funny "do {}" generates better code on most compilers */
+
+ /* Here, scan <= window+strstart+257 */
+ Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
+ if (*scan == *match) scan++;
+
+ len = (MAX_MATCH - 1) - (int)(strend-scan);
+ scan = strend - (MAX_MATCH-1);
+
+#else /* UNALIGNED_OK */
+
+ if (match[best_len] != scan_end ||
+ match[best_len-1] != scan_end1 ||
+ *match != *scan ||
+ *++match != scan[1]) continue;
+
+ /* The check at best_len-1 can be removed because it will be made
+ * again later. (This heuristic is not always a win.)
+ * It is not necessary to compare scan[2] and match[2] since they
+ * are always equal when the other bytes match, given that
+ * the hash keys are equal and that HASH_BITS >= 8.
+ */
+ scan += 2, match++;
+ Assert(*scan == *match, "match[2]?");
+
+ /* We check for insufficient lookahead only every 8th comparison;
+ * the 256th check will be made at strstart+258.
+ */
+ do {
+ } while (*++scan == *++match && *++scan == *++match &&
+ *++scan == *++match && *++scan == *++match &&
+ *++scan == *++match && *++scan == *++match &&
+ *++scan == *++match && *++scan == *++match &&
+ scan < strend);
+
+ Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
+
+ len = MAX_MATCH - (int)(strend - scan);
+ scan = strend - MAX_MATCH;
+
+#endif /* UNALIGNED_OK */
+
+ if (len > best_len) {
+ s->match_start = cur_match;
+ best_len = len;
+ if (len >= nice_match) break;
+#ifdef UNALIGNED_OK
+ scan_end = *(ushf*)(scan+best_len-1);
+#else
+ scan_end1 = scan[best_len-1];
+ scan_end = scan[best_len];
+#endif
+ }
+ } while ((cur_match = prev[cur_match & wmask]) > limit
+ && --chain_length != 0);
+
+ if ((uInt)best_len <= s->lookahead) return (uInt)best_len;
+ return s->lookahead;
+}
+
+#endif /* ASMV */
diff --git a/zlib/contrib/asm386/mkgvmt32.bat b/zlib/contrib/asm386/mkgvmt32.bat
new file mode 100644
index 00000000000..6c5ffd7a024
--- /dev/null
+++ b/zlib/contrib/asm386/mkgvmt32.bat
@@ -0,0 +1 @@
+c:\masm611\bin\ml /coff /Zi /c /Flgvmat32.lst gvmat32.asm
diff --git a/zlib/contrib/asm386/zlibvc.def b/zlib/contrib/asm386/zlibvc.def
new file mode 100644
index 00000000000..7e9d60d55d9
--- /dev/null
+++ b/zlib/contrib/asm386/zlibvc.def
@@ -0,0 +1,74 @@
+LIBRARY "zlib"
+
+DESCRIPTION '"""zlib data compression library"""'
+
+
+VERSION 1.11
+
+
+HEAPSIZE 1048576,8192
+
+EXPORTS
+ adler32 @1
+ compress @2
+ crc32 @3
+ deflate @4
+ deflateCopy @5
+ deflateEnd @6
+ deflateInit2_ @7
+ deflateInit_ @8
+ deflateParams @9
+ deflateReset @10
+ deflateSetDictionary @11
+ gzclose @12
+ gzdopen @13
+ gzerror @14
+ gzflush @15
+ gzopen @16
+ gzread @17
+ gzwrite @18
+ inflate @19
+ inflateEnd @20
+ inflateInit2_ @21
+ inflateInit_ @22
+ inflateReset @23
+ inflateSetDictionary @24
+ inflateSync @25
+ uncompress @26
+ zlibVersion @27
+ gzprintf @28
+ gzputc @29
+ gzgetc @30
+ gzseek @31
+ gzrewind @32
+ gztell @33
+ gzeof @34
+ gzsetparams @35
+ zError @36
+ inflateSyncPoint @37
+ get_crc_table @38
+ compress2 @39
+ gzputs @40
+ gzgets @41
+
+ unzOpen @61
+ unzClose @62
+ unzGetGlobalInfo @63
+ unzGetCurrentFileInfo @64
+ unzGoToFirstFile @65
+ unzGoToNextFile @66
+ unzOpenCurrentFile @67
+ unzReadCurrentFile @68
+ unztell @70
+ unzeof @71
+ unzCloseCurrentFile @72
+ unzGetGlobalComment @73
+ unzStringFileNameCompare @74
+ unzLocateFile @75
+ unzGetLocalExtrafield @76
+
+ zipOpen @80
+ zipOpenNewFileInZip @81
+ zipWriteInFileInZip @82
+ zipCloseFileInZip @83
+ zipClose @84
diff --git a/zlib/contrib/asm386/zlibvc.dsp b/zlib/contrib/asm386/zlibvc.dsp
new file mode 100644
index 00000000000..a70d4d4a6b0
--- /dev/null
+++ b/zlib/contrib/asm386/zlibvc.dsp
@@ -0,0 +1,651 @@
+# Microsoft Developer Studio Project File - Name="zlibvc" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 5.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+# TARGTYPE "Win32 (ALPHA) Dynamic-Link Library" 0x0602
+
+CFG=zlibvc - Win32 Release
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "zlibvc.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "zlibvc.mak" CFG="zlibvc - Win32 Release"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "zlibvc - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "zlibvc - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "zlibvc - Win32 ReleaseAxp" (based on\
+ "Win32 (ALPHA) Dynamic-Link Library")
+!MESSAGE "zlibvc - Win32 ReleaseWithoutAsm" (based on\
+ "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "zlibvc - Win32 ReleaseWithoutCrtdll" (based on\
+ "Win32 (x86) Dynamic-Link Library")
+!MESSAGE
+
+# Begin Project
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+
+!IF "$(CFG)" == "zlibvc - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir ".\Release"
+# PROP BASE Intermediate_Dir ".\Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir ".\Release"
+# PROP Intermediate_Dir ".\Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+CPP=cl.exe
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_WINDLL" /D "_WIN32" /D "BUILD_ZLIBDLL" /D "ZLIB_DLL" /D "DYNAMIC_CRC_TABLE" /D "ASMV" /FAcs /FR /FD /c
+# SUBTRACT CPP /YX
+MTL=midl.exe
+# ADD BASE MTL /nologo /D "NDEBUG" /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+RSC=rc.exe
+# ADD BASE RSC /l 0x40c /d "NDEBUG"
+# ADD RSC /l 0x40c /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386
+# ADD LINK32 gvmat32.obj kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib crtdll.lib /nologo /subsystem:windows /dll /map /machine:I386 /nodefaultlib /out:".\Release\zlib.dll"
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir ".\Debug"
+# PROP BASE Intermediate_Dir ".\Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir ".\Debug"
+# PROP Intermediate_Dir ".\Debug"
+# PROP Target_Dir ""
+CPP=cl.exe
+# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_WINDLL" /D "_WIN32" /D "BUILD_ZLIBDLL" /D "ZLIB_DLL" /FD /c
+# SUBTRACT CPP /YX
+MTL=midl.exe
+# ADD BASE MTL /nologo /D "_DEBUG" /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+RSC=rc.exe
+# ADD BASE RSC /l 0x40c /d "_DEBUG"
+# ADD RSC /l 0x40c /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /dll /debug /machine:I386 /out:".\Debug\zlib.dll"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "zlibvc__"
+# PROP BASE Intermediate_Dir "zlibvc__"
+# PROP BASE Ignore_Export_Lib 0
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "zlibvc__"
+# PROP Intermediate_Dir "zlibvc__"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+MTL=midl.exe
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+CPP=cl.exe
+# ADD BASE CPP /nologo /MT /Gt0 /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_WIN32" /D "BUILD_ZLIBDLL" /D "ZLIB_DLL" /D "DYNAMIC_CRC_TABLE" /FAcs /FR /YX /FD /c
+# ADD CPP /nologo /MT /Gt0 /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_WIN32" /D "BUILD_ZLIBDLL" /D "ZLIB_DLL" /D "DYNAMIC_CRC_TABLE" /FAcs /FR /FD /c
+# SUBTRACT CPP /YX
+RSC=rc.exe
+# ADD BASE RSC /l 0x40c /d "NDEBUG"
+# ADD RSC /l 0x40c /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 crtdll.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /dll /map /machine:ALPHA /nodefaultlib /out:".\Release\zlib.dll"
+# SUBTRACT BASE LINK32 /pdb:none
+# ADD LINK32 crtdll.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /dll /map /machine:ALPHA /nodefaultlib /out:"zlibvc__\zlib.dll"
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "zlibvc_0"
+# PROP BASE Intermediate_Dir "zlibvc_0"
+# PROP BASE Ignore_Export_Lib 0
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "zlibvc_0"
+# PROP Intermediate_Dir "zlibvc_0"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+CPP=cl.exe
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_WINDLL" /D "_WIN32" /D "BUILD_ZLIBDLL" /D "ZLIB_DLL" /D "DYNAMIC_CRC_TABLE" /FAcs /FR /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_WINDLL" /D "_WIN32" /D "BUILD_ZLIBDLL" /D "ZLIB_DLL" /D "DYNAMIC_CRC_TABLE" /FAcs /FR /FD /c
+# SUBTRACT CPP /YX
+MTL=midl.exe
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+RSC=rc.exe
+# ADD BASE RSC /l 0x40c /d "NDEBUG"
+# ADD RSC /l 0x40c /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib crtdll.lib /nologo /subsystem:windows /dll /map /machine:I386 /nodefaultlib /out:".\Release\zlib.dll"
+# SUBTRACT BASE LINK32 /pdb:none
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib crtdll.lib /nologo /subsystem:windows /dll /map /machine:I386 /nodefaultlib /out:".\zlibvc_0\zlib.dll"
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "zlibvc_1"
+# PROP BASE Intermediate_Dir "zlibvc_1"
+# PROP BASE Ignore_Export_Lib 0
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "zlibvc_1"
+# PROP Intermediate_Dir "zlibvc_1"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+CPP=cl.exe
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_WINDLL" /D "_WIN32" /D "BUILD_ZLIBDLL" /D "ZLIB_DLL" /D "DYNAMIC_CRC_TABLE" /D "ASMV" /FAcs /FR /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_WINDLL" /D "_WIN32" /D "BUILD_ZLIBDLL" /D "ZLIB_DLL" /D "DYNAMIC_CRC_TABLE" /D "ASMV" /FAcs /FR /FD /c
+# SUBTRACT CPP /YX
+MTL=midl.exe
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+RSC=rc.exe
+# ADD BASE RSC /l 0x40c /d "NDEBUG"
+# ADD RSC /l 0x40c /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 gvmat32.obj kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib crtdll.lib /nologo /subsystem:windows /dll /map /machine:I386 /nodefaultlib /out:".\Release\zlib.dll"
+# SUBTRACT BASE LINK32 /pdb:none
+# ADD LINK32 gvmat32.obj kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib crtdll.lib /nologo /subsystem:windows /dll /map /machine:I386 /nodefaultlib /out:".\zlibvc_1\zlib.dll"
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF
+
+# Begin Target
+
+# Name "zlibvc - Win32 Release"
+# Name "zlibvc - Win32 Debug"
+# Name "zlibvc - Win32 ReleaseAxp"
+# Name "zlibvc - Win32 ReleaseWithoutAsm"
+# Name "zlibvc - Win32 ReleaseWithoutCrtdll"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;hpj;bat;for;f90"
+# Begin Source File
+
+SOURCE=.\adler32.c
+
+!IF "$(CFG)" == "zlibvc - Win32 Release"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 Debug"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
+
+DEP_CPP_ADLER=\
+ ".\zconf.h"\
+ ".\zlib.h"\
+
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\compress.c
+
+!IF "$(CFG)" == "zlibvc - Win32 Release"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 Debug"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
+
+DEP_CPP_COMPR=\
+ ".\zconf.h"\
+ ".\zlib.h"\
+
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\crc32.c
+
+!IF "$(CFG)" == "zlibvc - Win32 Release"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 Debug"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
+
+DEP_CPP_CRC32=\
+ ".\zconf.h"\
+ ".\zlib.h"\
+
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\deflate.c
+
+!IF "$(CFG)" == "zlibvc - Win32 Release"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 Debug"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
+
+DEP_CPP_DEFLA=\
+ ".\deflate.h"\
+ ".\zconf.h"\
+ ".\zlib.h"\
+ ".\zutil.h"\
+
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\gvmat32c.c
+
+!IF "$(CFG)" == "zlibvc - Win32 Release"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 Debug"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\gzio.c
+
+!IF "$(CFG)" == "zlibvc - Win32 Release"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 Debug"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
+
+DEP_CPP_GZIO_=\
+ ".\zconf.h"\
+ ".\zlib.h"\
+ ".\zutil.h"\
+
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\infblock.c
+
+!IF "$(CFG)" == "zlibvc - Win32 Release"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 Debug"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
+
+DEP_CPP_INFBL=\
+ ".\infblock.h"\
+ ".\infcodes.h"\
+ ".\inftrees.h"\
+ ".\infutil.h"\
+ ".\zconf.h"\
+ ".\zlib.h"\
+ ".\zutil.h"\
+
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\infcodes.c
+
+!IF "$(CFG)" == "zlibvc - Win32 Release"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 Debug"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
+
+DEP_CPP_INFCO=\
+ ".\infblock.h"\
+ ".\infcodes.h"\
+ ".\inffast.h"\
+ ".\inftrees.h"\
+ ".\infutil.h"\
+ ".\zconf.h"\
+ ".\zlib.h"\
+ ".\zutil.h"\
+
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\inffast.c
+
+!IF "$(CFG)" == "zlibvc - Win32 Release"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 Debug"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
+
+DEP_CPP_INFFA=\
+ ".\infblock.h"\
+ ".\infcodes.h"\
+ ".\inffast.h"\
+ ".\inftrees.h"\
+ ".\infutil.h"\
+ ".\zconf.h"\
+ ".\zlib.h"\
+ ".\zutil.h"\
+
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\inflate.c
+
+!IF "$(CFG)" == "zlibvc - Win32 Release"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 Debug"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
+
+DEP_CPP_INFLA=\
+ ".\infblock.h"\
+ ".\zconf.h"\
+ ".\zlib.h"\
+ ".\zutil.h"\
+
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\inftrees.c
+
+!IF "$(CFG)" == "zlibvc - Win32 Release"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 Debug"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
+
+DEP_CPP_INFTR=\
+ ".\inftrees.h"\
+ ".\zconf.h"\
+ ".\zlib.h"\
+ ".\zutil.h"\
+
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\infutil.c
+
+!IF "$(CFG)" == "zlibvc - Win32 Release"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 Debug"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
+
+DEP_CPP_INFUT=\
+ ".\infblock.h"\
+ ".\infcodes.h"\
+ ".\inftrees.h"\
+ ".\infutil.h"\
+ ".\zconf.h"\
+ ".\zlib.h"\
+ ".\zutil.h"\
+
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\trees.c
+
+!IF "$(CFG)" == "zlibvc - Win32 Release"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 Debug"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
+
+DEP_CPP_TREES=\
+ ".\deflate.h"\
+ ".\zconf.h"\
+ ".\zlib.h"\
+ ".\zutil.h"\
+
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\uncompr.c
+
+!IF "$(CFG)" == "zlibvc - Win32 Release"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 Debug"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
+
+DEP_CPP_UNCOM=\
+ ".\zconf.h"\
+ ".\zlib.h"\
+
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\unzip.c
+
+!IF "$(CFG)" == "zlibvc - Win32 Release"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 Debug"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\zip.c
+
+!IF "$(CFG)" == "zlibvc - Win32 Release"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 Debug"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\zlib.rc
+# End Source File
+# Begin Source File
+
+SOURCE=.\zlibvc.def
+# End Source File
+# Begin Source File
+
+SOURCE=.\zutil.c
+
+!IF "$(CFG)" == "zlibvc - Win32 Release"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 Debug"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
+
+DEP_CPP_ZUTIL=\
+ ".\zconf.h"\
+ ".\zlib.h"\
+ ".\zutil.h"\
+
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
+
+!ENDIF
+
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl;fi;fd"
+# Begin Source File
+
+SOURCE=.\deflate.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\infblock.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\infcodes.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\inffast.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\inftrees.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\infutil.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\zconf.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\zlib.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\zutil.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/zlib/contrib/asm386/zlibvc.dsw b/zlib/contrib/asm386/zlibvc.dsw
new file mode 100644
index 00000000000..493cd870365
--- /dev/null
+++ b/zlib/contrib/asm386/zlibvc.dsw
@@ -0,0 +1,41 @@
+Microsoft Developer Studio Workspace File, Format Version 5.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "zlibstat"=.\zlibstat.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "zlibvc"=.\zlibvc.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/zlib/contrib/asm586/README.586 b/zlib/contrib/asm586/README.586
new file mode 100644
index 00000000000..6bb78f32069
--- /dev/null
+++ b/zlib/contrib/asm586/README.586
@@ -0,0 +1,43 @@
+This is a patched version of zlib modified to use
+Pentium-optimized assembly code in the deflation algorithm. The files
+changed/added by this patch are:
+
+README.586
+match.S
+
+The effectiveness of these modifications is a bit marginal, as the the
+program's bottleneck seems to be mostly L1-cache contention, for which
+there is no real way to work around without rewriting the basic
+algorithm. The speedup on average is around 5-10% (which is generally
+less than the amount of variance between subsequent executions).
+However, when used at level 9 compression, the cache contention can
+drop enough for the assembly version to achieve 10-20% speedup (and
+sometimes more, depending on the amount of overall redundancy in the
+files). Even here, though, cache contention can still be the limiting
+factor, depending on the nature of the program using the zlib library.
+This may also mean that better improvements will be seen on a Pentium
+with MMX, which suffers much less from L1-cache contention, but I have
+not yet verified this.
+
+Note that this code has been tailored for the Pentium in particular,
+and will not perform well on the Pentium Pro (due to the use of a
+partial register in the inner loop).
+
+If you are using an assembler other than GNU as, you will have to
+translate match.S to use your assembler's syntax. (Have fun.)
+
+Brian Raiter
+breadbox@muppetlabs.com
+April, 1998
+
+
+Added for zlib 1.1.3:
+
+The patches come from
+http://www.muppetlabs.com/~breadbox/software/assembly.html
+
+To compile zlib with this asm file, copy match.S to the zlib directory
+then do:
+
+CFLAGS="-O3 -DASMV" ./configure
+make OBJA=match.o
diff --git a/zlib/contrib/asm586/match.S b/zlib/contrib/asm586/match.S
new file mode 100644
index 00000000000..8f1614078f8
--- /dev/null
+++ b/zlib/contrib/asm586/match.S
@@ -0,0 +1,354 @@
+/* match.s -- Pentium-optimized version of longest_match()
+ * Written for zlib 1.1.2
+ * Copyright (C) 1998 Brian Raiter <breadbox@muppetlabs.com>
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License.
+ */
+
+#ifndef NO_UNDERLINE
+#define match_init _match_init
+#define longest_match _longest_match
+#endif
+
+#define MAX_MATCH (258)
+#define MIN_MATCH (3)
+#define MIN_LOOKAHEAD (MAX_MATCH + MIN_MATCH + 1)
+#define MAX_MATCH_8 ((MAX_MATCH + 7) & ~7)
+
+/* stack frame offsets */
+
+#define wmask 0 /* local copy of s->wmask */
+#define window 4 /* local copy of s->window */
+#define windowbestlen 8 /* s->window + bestlen */
+#define chainlenscanend 12 /* high word: current chain len */
+ /* low word: last bytes sought */
+#define scanstart 16 /* first two bytes of string */
+#define scanalign 20 /* dword-misalignment of string */
+#define nicematch 24 /* a good enough match size */
+#define bestlen 28 /* size of best match so far */
+#define scan 32 /* ptr to string wanting match */
+
+#define LocalVarsSize (36)
+/* saved ebx 36 */
+/* saved edi 40 */
+/* saved esi 44 */
+/* saved ebp 48 */
+/* return address 52 */
+#define deflatestate 56 /* the function arguments */
+#define curmatch 60
+
+/* Offsets for fields in the deflate_state structure. These numbers
+ * are calculated from the definition of deflate_state, with the
+ * assumption that the compiler will dword-align the fields. (Thus,
+ * changing the definition of deflate_state could easily cause this
+ * program to crash horribly, without so much as a warning at
+ * compile time. Sigh.)
+ */
+#define dsWSize 36
+#define dsWMask 44
+#define dsWindow 48
+#define dsPrev 56
+#define dsMatchLen 88
+#define dsPrevMatch 92
+#define dsStrStart 100
+#define dsMatchStart 104
+#define dsLookahead 108
+#define dsPrevLen 112
+#define dsMaxChainLen 116
+#define dsGoodMatch 132
+#define dsNiceMatch 136
+
+
+.file "match.S"
+
+.globl match_init, longest_match
+
+.text
+
+/* uInt longest_match(deflate_state *deflatestate, IPos curmatch) */
+
+longest_match:
+
+/* Save registers that the compiler may be using, and adjust %esp to */
+/* make room for our stack frame. */
+
+ pushl %ebp
+ pushl %edi
+ pushl %esi
+ pushl %ebx
+ subl $LocalVarsSize, %esp
+
+/* Retrieve the function arguments. %ecx will hold cur_match */
+/* throughout the entire function. %edx will hold the pointer to the */
+/* deflate_state structure during the function's setup (before */
+/* entering the main loop). */
+
+ movl deflatestate(%esp), %edx
+ movl curmatch(%esp), %ecx
+
+/* if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; */
+
+ movl dsNiceMatch(%edx), %eax
+ movl dsLookahead(%edx), %ebx
+ cmpl %eax, %ebx
+ jl LookaheadLess
+ movl %eax, %ebx
+LookaheadLess: movl %ebx, nicematch(%esp)
+
+/* register Bytef *scan = s->window + s->strstart; */
+
+ movl dsWindow(%edx), %esi
+ movl %esi, window(%esp)
+ movl dsStrStart(%edx), %ebp
+ lea (%esi,%ebp), %edi
+ movl %edi, scan(%esp)
+
+/* Determine how many bytes the scan ptr is off from being */
+/* dword-aligned. */
+
+ movl %edi, %eax
+ negl %eax
+ andl $3, %eax
+ movl %eax, scanalign(%esp)
+
+/* IPos limit = s->strstart > (IPos)MAX_DIST(s) ? */
+/* s->strstart - (IPos)MAX_DIST(s) : NIL; */
+
+ movl dsWSize(%edx), %eax
+ subl $MIN_LOOKAHEAD, %eax
+ subl %eax, %ebp
+ jg LimitPositive
+ xorl %ebp, %ebp
+LimitPositive:
+
+/* unsigned chain_length = s->max_chain_length; */
+/* if (s->prev_length >= s->good_match) { */
+/* chain_length >>= 2; */
+/* } */
+
+ movl dsPrevLen(%edx), %eax
+ movl dsGoodMatch(%edx), %ebx
+ cmpl %ebx, %eax
+ movl dsMaxChainLen(%edx), %ebx
+ jl LastMatchGood
+ shrl $2, %ebx
+LastMatchGood:
+
+/* chainlen is decremented once beforehand so that the function can */
+/* use the sign flag instead of the zero flag for the exit test. */
+/* It is then shifted into the high word, to make room for the scanend */
+/* scanend value, which it will always accompany. */
+
+ decl %ebx
+ shll $16, %ebx
+
+/* int best_len = s->prev_length; */
+
+ movl dsPrevLen(%edx), %eax
+ movl %eax, bestlen(%esp)
+
+/* Store the sum of s->window + best_len in %esi locally, and in %esi. */
+
+ addl %eax, %esi
+ movl %esi, windowbestlen(%esp)
+
+/* register ush scan_start = *(ushf*)scan; */
+/* register ush scan_end = *(ushf*)(scan+best_len-1); */
+
+ movw (%edi), %bx
+ movw %bx, scanstart(%esp)
+ movw -1(%edi,%eax), %bx
+ movl %ebx, chainlenscanend(%esp)
+
+/* Posf *prev = s->prev; */
+/* uInt wmask = s->w_mask; */
+
+ movl dsPrev(%edx), %edi
+ movl dsWMask(%edx), %edx
+ mov %edx, wmask(%esp)
+
+/* Jump into the main loop. */
+
+ jmp LoopEntry
+
+.balign 16
+
+/* do {
+ * match = s->window + cur_match;
+ * if (*(ushf*)(match+best_len-1) != scan_end ||
+ * *(ushf*)match != scan_start) continue;
+ * [...]
+ * } while ((cur_match = prev[cur_match & wmask]) > limit
+ * && --chain_length != 0);
+ *
+ * Here is the inner loop of the function. The function will spend the
+ * majority of its time in this loop, and majority of that time will
+ * be spent in the first ten instructions.
+ *
+ * Within this loop:
+ * %ebx = chainlenscanend - i.e., ((chainlen << 16) | scanend)
+ * %ecx = curmatch
+ * %edx = curmatch & wmask
+ * %esi = windowbestlen - i.e., (window + bestlen)
+ * %edi = prev
+ * %ebp = limit
+ *
+ * Two optimization notes on the choice of instructions:
+ *
+ * The first instruction uses a 16-bit address, which costs an extra,
+ * unpairable cycle. This is cheaper than doing a 32-bit access and
+ * zeroing the high word, due to the 3-cycle misalignment penalty which
+ * would occur half the time. This also turns out to be cheaper than
+ * doing two separate 8-bit accesses, as the memory is so rarely in the
+ * L1 cache.
+ *
+ * The window buffer, however, apparently spends a lot of time in the
+ * cache, and so it is faster to retrieve the word at the end of the
+ * match string with two 8-bit loads. The instructions that test the
+ * word at the beginning of the match string, however, are executed
+ * much less frequently, and there it was cheaper to use 16-bit
+ * instructions, which avoided the necessity of saving off and
+ * subsequently reloading one of the other registers.
+ */
+LookupLoop:
+ /* 1 U & V */
+ movw (%edi,%edx,2), %cx /* 2 U pipe */
+ movl wmask(%esp), %edx /* 2 V pipe */
+ cmpl %ebp, %ecx /* 3 U pipe */
+ jbe LeaveNow /* 3 V pipe */
+ subl $0x00010000, %ebx /* 4 U pipe */
+ js LeaveNow /* 4 V pipe */
+LoopEntry: movb -1(%esi,%ecx), %al /* 5 U pipe */
+ andl %ecx, %edx /* 5 V pipe */
+ cmpb %bl, %al /* 6 U pipe */
+ jnz LookupLoop /* 6 V pipe */
+ movb (%esi,%ecx), %ah
+ cmpb %bh, %ah
+ jnz LookupLoop
+ movl window(%esp), %eax
+ movw (%eax,%ecx), %ax
+ cmpw scanstart(%esp), %ax
+ jnz LookupLoop
+
+/* Store the current value of chainlen. */
+
+ movl %ebx, chainlenscanend(%esp)
+
+/* Point %edi to the string under scrutiny, and %esi to the string we */
+/* are hoping to match it up with. In actuality, %esi and %edi are */
+/* both pointed (MAX_MATCH_8 - scanalign) bytes ahead, and %edx is */
+/* initialized to -(MAX_MATCH_8 - scanalign). */
+
+ movl window(%esp), %esi
+ movl scan(%esp), %edi
+ addl %ecx, %esi
+ movl scanalign(%esp), %eax
+ movl $(-MAX_MATCH_8), %edx
+ lea MAX_MATCH_8(%edi,%eax), %edi
+ lea MAX_MATCH_8(%esi,%eax), %esi
+
+/* Test the strings for equality, 8 bytes at a time. At the end,
+ * adjust %edx so that it is offset to the exact byte that mismatched.
+ *
+ * We already know at this point that the first three bytes of the
+ * strings match each other, and they can be safely passed over before
+ * starting the compare loop. So what this code does is skip over 0-3
+ * bytes, as much as necessary in order to dword-align the %edi
+ * pointer. (%esi will still be misaligned three times out of four.)
+ *
+ * It should be confessed that this loop usually does not represent
+ * much of the total running time. Replacing it with a more
+ * straightforward "rep cmpsb" would not drastically degrade
+ * performance.
+ */
+LoopCmps:
+ movl (%esi,%edx), %eax
+ movl (%edi,%edx), %ebx
+ xorl %ebx, %eax
+ jnz LeaveLoopCmps
+ movl 4(%esi,%edx), %eax
+ movl 4(%edi,%edx), %ebx
+ xorl %ebx, %eax
+ jnz LeaveLoopCmps4
+ addl $8, %edx
+ jnz LoopCmps
+ jmp LenMaximum
+LeaveLoopCmps4: addl $4, %edx
+LeaveLoopCmps: testl $0x0000FFFF, %eax
+ jnz LenLower
+ addl $2, %edx
+ shrl $16, %eax
+LenLower: subb $1, %al
+ adcl $0, %edx
+
+/* Calculate the length of the match. If it is longer than MAX_MATCH, */
+/* then automatically accept it as the best possible match and leave. */
+
+ lea (%edi,%edx), %eax
+ movl scan(%esp), %edi
+ subl %edi, %eax
+ cmpl $MAX_MATCH, %eax
+ jge LenMaximum
+
+/* If the length of the match is not longer than the best match we */
+/* have so far, then forget it and return to the lookup loop. */
+
+ movl deflatestate(%esp), %edx
+ movl bestlen(%esp), %ebx
+ cmpl %ebx, %eax
+ jg LongerMatch
+ movl chainlenscanend(%esp), %ebx
+ movl windowbestlen(%esp), %esi
+ movl dsPrev(%edx), %edi
+ movl wmask(%esp), %edx
+ andl %ecx, %edx
+ jmp LookupLoop
+
+/* s->match_start = cur_match; */
+/* best_len = len; */
+/* if (len >= nice_match) break; */
+/* scan_end = *(ushf*)(scan+best_len-1); */
+
+LongerMatch: movl nicematch(%esp), %ebx
+ movl %eax, bestlen(%esp)
+ movl %ecx, dsMatchStart(%edx)
+ cmpl %ebx, %eax
+ jge LeaveNow
+ movl window(%esp), %esi
+ addl %eax, %esi
+ movl %esi, windowbestlen(%esp)
+ movl chainlenscanend(%esp), %ebx
+ movw -1(%edi,%eax), %bx
+ movl dsPrev(%edx), %edi
+ movl %ebx, chainlenscanend(%esp)
+ movl wmask(%esp), %edx
+ andl %ecx, %edx
+ jmp LookupLoop
+
+/* Accept the current string, with the maximum possible length. */
+
+LenMaximum: movl deflatestate(%esp), %edx
+ movl $MAX_MATCH, bestlen(%esp)
+ movl %ecx, dsMatchStart(%edx)
+
+/* if ((uInt)best_len <= s->lookahead) return (uInt)best_len; */
+/* return s->lookahead; */
+
+LeaveNow:
+ movl deflatestate(%esp), %edx
+ movl bestlen(%esp), %ebx
+ movl dsLookahead(%edx), %eax
+ cmpl %eax, %ebx
+ jg LookaheadRet
+ movl %ebx, %eax
+LookaheadRet:
+
+/* Restore the stack and return from whence we came. */
+
+ addl $LocalVarsSize, %esp
+ popl %ebx
+ popl %esi
+ popl %edi
+ popl %ebp
+match_init: ret
diff --git a/zlib/contrib/asm686/README.686 b/zlib/contrib/asm686/README.686
new file mode 100644
index 00000000000..a593f23afd6
--- /dev/null
+++ b/zlib/contrib/asm686/README.686
@@ -0,0 +1,34 @@
+This is a patched version of zlib, modified to use
+Pentium-Pro-optimized assembly code in the deflation algorithm. The
+files changed/added by this patch are:
+
+README.686
+match.S
+
+The speedup that this patch provides varies, depending on whether the
+compiler used to build the original version of zlib falls afoul of the
+PPro's speed traps. My own tests show a speedup of around 10-20% at
+the default compression level, and 20-30% using -9, against a version
+compiled using gcc 2.7.2.3. Your mileage may vary.
+
+Note that this code has been tailored for the PPro/PII in particular,
+and will not perform particuarly well on a Pentium.
+
+If you are using an assembler other than GNU as, you will have to
+translate match.S to use your assembler's syntax. (Have fun.)
+
+Brian Raiter
+breadbox@muppetlabs.com
+April, 1998
+
+
+Added for zlib 1.1.3:
+
+The patches come from
+http://www.muppetlabs.com/~breadbox/software/assembly.html
+
+To compile zlib with this asm file, copy match.S to the zlib directory
+then do:
+
+CFLAGS="-O3 -DASMV" ./configure
+make OBJA=match.o
diff --git a/zlib/contrib/asm686/match.S b/zlib/contrib/asm686/match.S
new file mode 100644
index 00000000000..8e86c33c288
--- /dev/null
+++ b/zlib/contrib/asm686/match.S
@@ -0,0 +1,327 @@
+/* match.s -- Pentium-Pro-optimized version of longest_match()
+ * Written for zlib 1.1.2
+ * Copyright (C) 1998 Brian Raiter <breadbox@muppetlabs.com>
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License.
+ */
+
+#ifndef NO_UNDERLINE
+#define match_init _match_init
+#define longest_match _longest_match
+#endif
+
+#define MAX_MATCH (258)
+#define MIN_MATCH (3)
+#define MIN_LOOKAHEAD (MAX_MATCH + MIN_MATCH + 1)
+#define MAX_MATCH_8 ((MAX_MATCH + 7) & ~7)
+
+/* stack frame offsets */
+
+#define chainlenwmask 0 /* high word: current chain len */
+ /* low word: s->wmask */
+#define window 4 /* local copy of s->window */
+#define windowbestlen 8 /* s->window + bestlen */
+#define scanstart 16 /* first two bytes of string */
+#define scanend 12 /* last two bytes of string */
+#define scanalign 20 /* dword-misalignment of string */
+#define nicematch 24 /* a good enough match size */
+#define bestlen 28 /* size of best match so far */
+#define scan 32 /* ptr to string wanting match */
+
+#define LocalVarsSize (36)
+/* saved ebx 36 */
+/* saved edi 40 */
+/* saved esi 44 */
+/* saved ebp 48 */
+/* return address 52 */
+#define deflatestate 56 /* the function arguments */
+#define curmatch 60
+
+/* Offsets for fields in the deflate_state structure. These numbers
+ * are calculated from the definition of deflate_state, with the
+ * assumption that the compiler will dword-align the fields. (Thus,
+ * changing the definition of deflate_state could easily cause this
+ * program to crash horribly, without so much as a warning at
+ * compile time. Sigh.)
+ */
+#define dsWSize 36
+#define dsWMask 44
+#define dsWindow 48
+#define dsPrev 56
+#define dsMatchLen 88
+#define dsPrevMatch 92
+#define dsStrStart 100
+#define dsMatchStart 104
+#define dsLookahead 108
+#define dsPrevLen 112
+#define dsMaxChainLen 116
+#define dsGoodMatch 132
+#define dsNiceMatch 136
+
+
+.file "match.S"
+
+.globl match_init, longest_match
+
+.text
+
+/* uInt longest_match(deflate_state *deflatestate, IPos curmatch) */
+
+longest_match:
+
+/* Save registers that the compiler may be using, and adjust %esp to */
+/* make room for our stack frame. */
+
+ pushl %ebp
+ pushl %edi
+ pushl %esi
+ pushl %ebx
+ subl $LocalVarsSize, %esp
+
+/* Retrieve the function arguments. %ecx will hold cur_match */
+/* throughout the entire function. %edx will hold the pointer to the */
+/* deflate_state structure during the function's setup (before */
+/* entering the main loop). */
+
+ movl deflatestate(%esp), %edx
+ movl curmatch(%esp), %ecx
+
+/* uInt wmask = s->w_mask; */
+/* unsigned chain_length = s->max_chain_length; */
+/* if (s->prev_length >= s->good_match) { */
+/* chain_length >>= 2; */
+/* } */
+
+ movl dsPrevLen(%edx), %eax
+ movl dsGoodMatch(%edx), %ebx
+ cmpl %ebx, %eax
+ movl dsWMask(%edx), %eax
+ movl dsMaxChainLen(%edx), %ebx
+ jl LastMatchGood
+ shrl $2, %ebx
+LastMatchGood:
+
+/* chainlen is decremented once beforehand so that the function can */
+/* use the sign flag instead of the zero flag for the exit test. */
+/* It is then shifted into the high word, to make room for the wmask */
+/* value, which it will always accompany. */
+
+ decl %ebx
+ shll $16, %ebx
+ orl %eax, %ebx
+ movl %ebx, chainlenwmask(%esp)
+
+/* if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; */
+
+ movl dsNiceMatch(%edx), %eax
+ movl dsLookahead(%edx), %ebx
+ cmpl %eax, %ebx
+ jl LookaheadLess
+ movl %eax, %ebx
+LookaheadLess: movl %ebx, nicematch(%esp)
+
+/* register Bytef *scan = s->window + s->strstart; */
+
+ movl dsWindow(%edx), %esi
+ movl %esi, window(%esp)
+ movl dsStrStart(%edx), %ebp
+ lea (%esi,%ebp), %edi
+ movl %edi, scan(%esp)
+
+/* Determine how many bytes the scan ptr is off from being */
+/* dword-aligned. */
+
+ movl %edi, %eax
+ negl %eax
+ andl $3, %eax
+ movl %eax, scanalign(%esp)
+
+/* IPos limit = s->strstart > (IPos)MAX_DIST(s) ? */
+/* s->strstart - (IPos)MAX_DIST(s) : NIL; */
+
+ movl dsWSize(%edx), %eax
+ subl $MIN_LOOKAHEAD, %eax
+ subl %eax, %ebp
+ jg LimitPositive
+ xorl %ebp, %ebp
+LimitPositive:
+
+/* int best_len = s->prev_length; */
+
+ movl dsPrevLen(%edx), %eax
+ movl %eax, bestlen(%esp)
+
+/* Store the sum of s->window + best_len in %esi locally, and in %esi. */
+
+ addl %eax, %esi
+ movl %esi, windowbestlen(%esp)
+
+/* register ush scan_start = *(ushf*)scan; */
+/* register ush scan_end = *(ushf*)(scan+best_len-1); */
+/* Posf *prev = s->prev; */
+
+ movzwl (%edi), %ebx
+ movl %ebx, scanstart(%esp)
+ movzwl -1(%edi,%eax), %ebx
+ movl %ebx, scanend(%esp)
+ movl dsPrev(%edx), %edi
+
+/* Jump into the main loop. */
+
+ movl chainlenwmask(%esp), %edx
+ jmp LoopEntry
+
+.balign 16
+
+/* do {
+ * match = s->window + cur_match;
+ * if (*(ushf*)(match+best_len-1) != scan_end ||
+ * *(ushf*)match != scan_start) continue;
+ * [...]
+ * } while ((cur_match = prev[cur_match & wmask]) > limit
+ * && --chain_length != 0);
+ *
+ * Here is the inner loop of the function. The function will spend the
+ * majority of its time in this loop, and majority of that time will
+ * be spent in the first ten instructions.
+ *
+ * Within this loop:
+ * %ebx = scanend
+ * %ecx = curmatch
+ * %edx = chainlenwmask - i.e., ((chainlen << 16) | wmask)
+ * %esi = windowbestlen - i.e., (window + bestlen)
+ * %edi = prev
+ * %ebp = limit
+ */
+LookupLoop:
+ andl %edx, %ecx
+ movzwl (%edi,%ecx,2), %ecx
+ cmpl %ebp, %ecx
+ jbe LeaveNow
+ subl $0x00010000, %edx
+ js LeaveNow
+LoopEntry: movzwl -1(%esi,%ecx), %eax
+ cmpl %ebx, %eax
+ jnz LookupLoop
+ movl window(%esp), %eax
+ movzwl (%eax,%ecx), %eax
+ cmpl scanstart(%esp), %eax
+ jnz LookupLoop
+
+/* Store the current value of chainlen. */
+
+ movl %edx, chainlenwmask(%esp)
+
+/* Point %edi to the string under scrutiny, and %esi to the string we */
+/* are hoping to match it up with. In actuality, %esi and %edi are */
+/* both pointed (MAX_MATCH_8 - scanalign) bytes ahead, and %edx is */
+/* initialized to -(MAX_MATCH_8 - scanalign). */
+
+ movl window(%esp), %esi
+ movl scan(%esp), %edi
+ addl %ecx, %esi
+ movl scanalign(%esp), %eax
+ movl $(-MAX_MATCH_8), %edx
+ lea MAX_MATCH_8(%edi,%eax), %edi
+ lea MAX_MATCH_8(%esi,%eax), %esi
+
+/* Test the strings for equality, 8 bytes at a time. At the end,
+ * adjust %edx so that it is offset to the exact byte that mismatched.
+ *
+ * We already know at this point that the first three bytes of the
+ * strings match each other, and they can be safely passed over before
+ * starting the compare loop. So what this code does is skip over 0-3
+ * bytes, as much as necessary in order to dword-align the %edi
+ * pointer. (%esi will still be misaligned three times out of four.)
+ *
+ * It should be confessed that this loop usually does not represent
+ * much of the total running time. Replacing it with a more
+ * straightforward "rep cmpsb" would not drastically degrade
+ * performance.
+ */
+LoopCmps:
+ movl (%esi,%edx), %eax
+ xorl (%edi,%edx), %eax
+ jnz LeaveLoopCmps
+ movl 4(%esi,%edx), %eax
+ xorl 4(%edi,%edx), %eax
+ jnz LeaveLoopCmps4
+ addl $8, %edx
+ jnz LoopCmps
+ jmp LenMaximum
+LeaveLoopCmps4: addl $4, %edx
+LeaveLoopCmps: testl $0x0000FFFF, %eax
+ jnz LenLower
+ addl $2, %edx
+ shrl $16, %eax
+LenLower: subb $1, %al
+ adcl $0, %edx
+
+/* Calculate the length of the match. If it is longer than MAX_MATCH, */
+/* then automatically accept it as the best possible match and leave. */
+
+ lea (%edi,%edx), %eax
+ movl scan(%esp), %edi
+ subl %edi, %eax
+ cmpl $MAX_MATCH, %eax
+ jge LenMaximum
+
+/* If the length of the match is not longer than the best match we */
+/* have so far, then forget it and return to the lookup loop. */
+
+ movl deflatestate(%esp), %edx
+ movl bestlen(%esp), %ebx
+ cmpl %ebx, %eax
+ jg LongerMatch
+ movl windowbestlen(%esp), %esi
+ movl dsPrev(%edx), %edi
+ movl scanend(%esp), %ebx
+ movl chainlenwmask(%esp), %edx
+ jmp LookupLoop
+
+/* s->match_start = cur_match; */
+/* best_len = len; */
+/* if (len >= nice_match) break; */
+/* scan_end = *(ushf*)(scan+best_len-1); */
+
+LongerMatch: movl nicematch(%esp), %ebx
+ movl %eax, bestlen(%esp)
+ movl %ecx, dsMatchStart(%edx)
+ cmpl %ebx, %eax
+ jge LeaveNow
+ movl window(%esp), %esi
+ addl %eax, %esi
+ movl %esi, windowbestlen(%esp)
+ movzwl -1(%edi,%eax), %ebx
+ movl dsPrev(%edx), %edi
+ movl %ebx, scanend(%esp)
+ movl chainlenwmask(%esp), %edx
+ jmp LookupLoop
+
+/* Accept the current string, with the maximum possible length. */
+
+LenMaximum: movl deflatestate(%esp), %edx
+ movl $MAX_MATCH, bestlen(%esp)
+ movl %ecx, dsMatchStart(%edx)
+
+/* if ((uInt)best_len <= s->lookahead) return (uInt)best_len; */
+/* return s->lookahead; */
+
+LeaveNow:
+ movl deflatestate(%esp), %edx
+ movl bestlen(%esp), %ebx
+ movl dsLookahead(%edx), %eax
+ cmpl %eax, %ebx
+ jg LookaheadRet
+ movl %ebx, %eax
+LookaheadRet:
+
+/* Restore the stack and return from whence we came. */
+
+ addl $LocalVarsSize, %esp
+ popl %ebx
+ popl %esi
+ popl %edi
+ popl %ebp
+match_init: ret
diff --git a/zlib/contrib/delphi/zlib.mak b/zlib/contrib/delphi/zlib.mak
new file mode 100644
index 00000000000..ba557e2b977
--- /dev/null
+++ b/zlib/contrib/delphi/zlib.mak
@@ -0,0 +1,36 @@
+# Makefile for zlib32bd.lib
+# ------------- Borland C++ 4.5 -------------
+
+# The (32-bit) zlib32bd.lib made with this makefile is intended for use
+# in making the (32-bit) DLL, png32bd.dll. It uses the "stdcall" calling
+# convention.
+
+CFLAGS= -ps -O2 -C -K -N- -k- -d -3 -r- -w-par -w-aus -WDE
+CC=f:\bc45\bin\bcc32
+LIBFLAGS= /C
+LIB=f:\bc45\bin\tlib
+ZLIB=zlib32bd.lib
+
+.autodepend
+.c.obj:
+ $(CC) -c $(CFLAGS) $<
+
+OBJ1=adler32.obj compress.obj crc32.obj deflate.obj gzio.obj infblock.obj
+OBJ2=infcodes.obj inflate.obj inftrees.obj infutil.obj inffast.obj
+OBJ3=trees.obj uncompr.obj zutil.obj
+pOBJ1=+adler32.obj+compress.obj+crc32.obj+deflate.obj+gzio.obj+infblock.obj
+pOBJ2=+infcodes.obj+inflate.obj+inftrees.obj+infutil.obj+inffast.obj
+pOBJ3=+trees.obj+uncompr.obj+zutil.obj
+
+all: $(ZLIB)
+
+$(ZLIB): $(OBJ1) $(OBJ2) $(OBJ3)
+ @if exist $@ del $@
+ $(LIB) @&&|
+$@ $(LIBFLAGS) &
+$(pOBJ1) &
+$(pOBJ2) &
+$(pOBJ3)
+|
+
+# End of makefile for zlib32bd.lib
diff --git a/zlib/contrib/delphi/zlibdef.pas b/zlib/contrib/delphi/zlibdef.pas
new file mode 100644
index 00000000000..4f96b7d2c50
--- /dev/null
+++ b/zlib/contrib/delphi/zlibdef.pas
@@ -0,0 +1,169 @@
+unit zlibdef;
+
+interface
+
+uses
+ Windows;
+
+const
+ ZLIB_VERSION = '1.1.3';
+
+type
+ voidpf = Pointer;
+ int = Integer;
+ uInt = Cardinal;
+ pBytef = PChar;
+ uLong = Cardinal;
+
+ alloc_func = function(opaque: voidpf; items, size: uInt): voidpf;
+ stdcall;
+ free_func = procedure(opaque, address: voidpf);
+ stdcall;
+
+ internal_state = Pointer;
+
+ z_streamp = ^z_stream;
+ z_stream = packed record
+ next_in: pBytef; // next input byte
+ avail_in: uInt; // number of bytes available at next_in
+ total_in: uLong; // total nb of input bytes read so far
+
+ next_out: pBytef; // next output byte should be put there
+ avail_out: uInt; // remaining free space at next_out
+ total_out: uLong; // total nb of bytes output so far
+
+ msg: PChar; // last error message, NULL if no error
+ state: internal_state; // not visible by applications
+
+ zalloc: alloc_func; // used to allocate the internal state
+ zfree: free_func; // used to free the internal state
+ opaque: voidpf; // private data object passed to zalloc and zfree
+
+ data_type: int; // best guess about the data type: ascii or binary
+ adler: uLong; // adler32 value of the uncompressed data
+ reserved: uLong; // reserved for future use
+ end;
+
+const
+ Z_NO_FLUSH = 0;
+ Z_SYNC_FLUSH = 2;
+ Z_FULL_FLUSH = 3;
+ Z_FINISH = 4;
+
+ Z_OK = 0;
+ Z_STREAM_END = 1;
+
+ Z_NO_COMPRESSION = 0;
+ Z_BEST_SPEED = 1;
+ Z_BEST_COMPRESSION = 9;
+ Z_DEFAULT_COMPRESSION = -1;
+
+ Z_FILTERED = 1;
+ Z_HUFFMAN_ONLY = 2;
+ Z_DEFAULT_STRATEGY = 0;
+
+ Z_BINARY = 0;
+ Z_ASCII = 1;
+ Z_UNKNOWN = 2;
+
+ Z_DEFLATED = 8;
+
+ MAX_MEM_LEVEL = 9;
+
+function adler32(adler: uLong; const buf: pBytef; len: uInt): uLong;
+ stdcall;
+function crc32(crc: uLong; const buf: pBytef; len: uInt): uLong;
+ stdcall;
+function deflate(strm: z_streamp; flush: int): int;
+ stdcall;
+function deflateCopy(dest, source: z_streamp): int;
+ stdcall;
+function deflateEnd(strm: z_streamp): int;
+ stdcall;
+function deflateInit2_(strm: z_streamp; level, method,
+ windowBits, memLevel, strategy: int;
+ const version: PChar; stream_size: int): int;
+ stdcall;
+function deflateInit_(strm: z_streamp; level: int;
+ const version: PChar; stream_size: int): int;
+ stdcall;
+function deflateParams(strm: z_streamp; level, strategy: int): int;
+ stdcall;
+function deflateReset(strm: z_streamp): int;
+ stdcall;
+function deflateSetDictionary(strm: z_streamp;
+ const dictionary: pBytef;
+ dictLength: uInt): int;
+ stdcall;
+function inflate(strm: z_streamp; flush: int): int;
+ stdcall;
+function inflateEnd(strm: z_streamp): int;
+ stdcall;
+function inflateInit2_(strm: z_streamp; windowBits: int;
+ const version: PChar; stream_size: int): int;
+ stdcall;
+function inflateInit_(strm: z_streamp; const version: PChar;
+ stream_size: int): int;
+ stdcall;
+function inflateReset(strm: z_streamp): int;
+ stdcall;
+function inflateSetDictionary(strm: z_streamp;
+ const dictionary: pBytef;
+ dictLength: uInt): int;
+ stdcall;
+function inflateSync(strm: z_streamp): int;
+ stdcall;
+
+function deflateInit(strm: z_streamp; level: int): int;
+function deflateInit2(strm: z_streamp; level, method, windowBits,
+ memLevel, strategy: int): int;
+function inflateInit(strm: z_streamp): int;
+function inflateInit2(strm: z_streamp; windowBits: int): int;
+
+implementation
+
+function deflateInit(strm: z_streamp; level: int): int;
+begin
+ Result := deflateInit_(strm, level, ZLIB_VERSION, sizeof(z_stream));
+end;
+
+function deflateInit2(strm: z_streamp; level, method, windowBits,
+ memLevel, strategy: int): int;
+begin
+ Result := deflateInit2_(strm, level, method, windowBits, memLevel,
+ strategy, ZLIB_VERSION, sizeof(z_stream));
+end;
+
+function inflateInit(strm: z_streamp): int;
+begin
+ Result := inflateInit_(strm, ZLIB_VERSION, sizeof(z_stream));
+end;
+
+function inflateInit2(strm: z_streamp; windowBits: int): int;
+begin
+ Result := inflateInit2_(strm, windowBits, ZLIB_VERSION,
+ sizeof(z_stream));
+end;
+
+const
+ zlibDLL = 'png32bd.dll';
+
+function adler32; external zlibDLL;
+function crc32; external zlibDLL;
+function deflate; external zlibDLL;
+function deflateCopy; external zlibDLL;
+function deflateEnd; external zlibDLL;
+function deflateInit2_; external zlibDLL;
+function deflateInit_; external zlibDLL;
+function deflateParams; external zlibDLL;
+function deflateReset; external zlibDLL;
+function deflateSetDictionary; external zlibDLL;
+function inflate; external zlibDLL;
+function inflateEnd; external zlibDLL;
+function inflateInit2_; external zlibDLL;
+function inflateInit_; external zlibDLL;
+function inflateReset; external zlibDLL;
+function inflateSetDictionary; external zlibDLL;
+function inflateSync; external zlibDLL;
+
+end.
diff --git a/zlib/contrib/delphi2/d_zlib.bpr b/zlib/contrib/delphi2/d_zlib.bpr
new file mode 100644
index 00000000000..78bb254088a
--- /dev/null
+++ b/zlib/contrib/delphi2/d_zlib.bpr
@@ -0,0 +1,224 @@
+# ---------------------------------------------------------------------------
+!if !$d(BCB)
+BCB = $(MAKEDIR)\..
+!endif
+
+# ---------------------------------------------------------------------------
+# IDE SECTION
+# ---------------------------------------------------------------------------
+# The following section of the project makefile is managed by the BCB IDE.
+# It is recommended to use the IDE to change any of the values in this
+# section.
+# ---------------------------------------------------------------------------
+
+VERSION = BCB.03
+# ---------------------------------------------------------------------------
+PROJECT = d_zlib.lib
+OBJFILES = d_zlib.obj adler32.obj deflate.obj infblock.obj infcodes.obj inffast.obj \
+ inflate.obj inftrees.obj infutil.obj trees.obj
+RESFILES =
+RESDEPEN = $(RESFILES)
+LIBFILES =
+LIBRARIES = VCL35.lib
+SPARELIBS = VCL35.lib
+DEFFILE =
+PACKAGES = VCLX35.bpi VCL35.bpi VCLDB35.bpi VCLDBX35.bpi ibsmp35.bpi bcbsmp35.bpi \
+ dclocx35.bpi QRPT35.bpi TEEUI35.bpi TEEDB35.bpi TEE35.bpi DSS35.bpi \
+ NMFAST35.bpi INETDB35.bpi INET35.bpi VCLMID35.bpi
+# ---------------------------------------------------------------------------
+PATHCPP = .;
+PATHASM = .;
+PATHPAS = .;
+PATHRC = .;
+DEBUGLIBPATH = $(BCB)\lib\debug
+RELEASELIBPATH = $(BCB)\lib\release
+# ---------------------------------------------------------------------------
+CFLAG1 = -O2 -Ve -d -k- -vi
+CFLAG2 = -I$(BCB)\include;$(BCB)\include\vcl -H=$(BCB)\lib\vcl35.csm
+CFLAG3 = -ff -pr -5
+PFLAGS = -U;$(DEBUGLIBPATH) -I$(BCB)\include;$(BCB)\include\vcl -H -W -$I- -v -JPHN -M
+RFLAGS = -i$(BCB)\include;$(BCB)\include\vcl
+AFLAGS = /i$(BCB)\include /i$(BCB)\include\vcl /mx /w2 /zn
+LFLAGS =
+IFLAGS = -g -Gn
+# ---------------------------------------------------------------------------
+ALLOBJ = c0w32.obj $(OBJFILES)
+ALLRES = $(RESFILES)
+ALLLIB = $(LIBFILES) $(LIBRARIES) import32.lib cp32mt.lib
+# ---------------------------------------------------------------------------
+!!ifdef IDEOPTIONS
+
+[Version Info]
+IncludeVerInfo=0
+AutoIncBuild=0
+MajorVer=1
+MinorVer=0
+Release=0
+Build=0
+Debug=0
+PreRelease=0
+Special=0
+Private=0
+DLL=0
+Locale=1040
+CodePage=1252
+
+[Version Info Keys]
+CompanyName=
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+Comments=
+
+[HistoryLists\hlIncludePath]
+Count=2
+Item0=$(BCB)\include
+Item1=$(BCB)\include;$(BCB)\include\vcl
+
+[HistoryLists\hlLibraryPath]
+Count=1
+Item0=$(BCB)\lib\obj;$(BCB)\lib
+
+[HistoryLists\hlDebugSourcePath]
+Count=1
+Item0=$(BCB)\source\vcl
+
+[Debugging]
+DebugSourceDirs=
+
+[Parameters]
+RunParams=
+HostApplication=
+
+!endif
+
+ ---------------------------------------------------------------------------
+# MAKE SECTION
+# ---------------------------------------------------------------------------
+# This section of the project file is not used by the BCB IDE. It is for
+# the benefit of building from the command-line using the MAKE utility.
+# ---------------------------------------------------------------------------
+
+.autodepend
+# ---------------------------------------------------------------------------
+!if !$d(BCC32)
+BCC32 = bcc32
+!endif
+
+!if !$d(DCC32)
+DCC32 = dcc32
+!endif
+
+!if !$d(TASM32)
+TASM32 = tasm32
+!endif
+
+!if !$d(LINKER)
+LINKER = TLib
+!endif
+
+!if !$d(BRCC32)
+BRCC32 = brcc32
+!endif
+# ---------------------------------------------------------------------------
+!if $d(PATHCPP)
+.PATH.CPP = $(PATHCPP)
+.PATH.C = $(PATHCPP)
+!endif
+
+!if $d(PATHPAS)
+.PATH.PAS = $(PATHPAS)
+!endif
+
+!if $d(PATHASM)
+.PATH.ASM = $(PATHASM)
+!endif
+
+!if $d(PATHRC)
+.PATH.RC = $(PATHRC)
+!endif
+# ---------------------------------------------------------------------------
+!ifdef IDEOPTIONS
+
+[Version Info]
+IncludeVerInfo=0
+AutoIncBuild=0
+MajorVer=1
+MinorVer=0
+Release=0
+Build=0
+Debug=0
+PreRelease=0
+Special=0
+Private=0
+DLL=0
+Locale=1040
+CodePage=1252
+
+[Version Info Keys]
+CompanyName=
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+Comments=
+
+[HistoryLists\hlIncludePath]
+Count=2
+Item0=$(BCB)\include;$(BCB)\include\vcl
+Item1=$(BCB)\include
+
+[HistoryLists\hlLibraryPath]
+Count=1
+Item0=$(BCB)\lib\obj;$(BCB)\lib
+
+[HistoryLists\hlDebugSourcePath]
+Count=1
+Item0=$(BCB)\source\vcl
+
+[Debugging]
+DebugSourceDirs=
+
+[Parameters]
+RunParams=
+HostApplication=
+
+!endif
+
+$(PROJECT): $(OBJFILES) $(RESDEPEN) $(DEFFILE)
+ $(BCB)\BIN\$(LINKER) @&&!
+ $(LFLAGS) $(IFLAGS) +
+ $(ALLOBJ), +
+ $(PROJECT),, +
+ $(ALLLIB), +
+ $(DEFFILE), +
+ $(ALLRES)
+!
+# ---------------------------------------------------------------------------
+.pas.hpp:
+ $(BCB)\BIN\$(DCC32) $(PFLAGS) {$< }
+
+.pas.obj:
+ $(BCB)\BIN\$(DCC32) $(PFLAGS) {$< }
+
+.cpp.obj:
+ $(BCB)\BIN\$(BCC32) $(CFLAG1) $(CFLAG2) $(CFLAG3) -n$(@D) {$< }
+
+.c.obj:
+ $(BCB)\BIN\$(BCC32) $(CFLAG1) $(CFLAG2) $(CFLAG3) -n$(@D) {$< }
+
+.asm.obj:
+ $(BCB)\BIN\$(TASM32) $(AFLAGS) $<, $@
+
+.rc.res:
+ $(BCB)\BIN\$(BRCC32) $(RFLAGS) -fo$@ $<
+# ---------------------------------------------------------------------------
diff --git a/zlib/contrib/delphi2/d_zlib.cpp b/zlib/contrib/delphi2/d_zlib.cpp
new file mode 100644
index 00000000000..f5dea59b762
--- /dev/null
+++ b/zlib/contrib/delphi2/d_zlib.cpp
@@ -0,0 +1,17 @@
+#include <condefs.h>
+#pragma hdrstop
+//---------------------------------------------------------------------------
+USEUNIT("adler32.c");
+USEUNIT("deflate.c");
+USEUNIT("infblock.c");
+USEUNIT("infcodes.c");
+USEUNIT("inffast.c");
+USEUNIT("inflate.c");
+USEUNIT("inftrees.c");
+USEUNIT("infutil.c");
+USEUNIT("trees.c");
+//---------------------------------------------------------------------------
+#define Library
+
+// To add a file to the library use the Project menu 'Add to Project'.
+
diff --git a/zlib/contrib/delphi2/readme.txt b/zlib/contrib/delphi2/readme.txt
new file mode 100644
index 00000000000..cbd31620d87
--- /dev/null
+++ b/zlib/contrib/delphi2/readme.txt
@@ -0,0 +1,17 @@
+These are files used to compile zlib under Borland C++ Builder 3.
+
+zlib.bpg is the main project group that can be loaded in the BCB IDE and
+loads all other *.bpr projects
+
+zlib.bpr is a project used to create a static zlib.lib library with C calling
+convention for functions.
+
+zlib32.bpr creates a zlib32.dll dynamic link library with Windows standard
+calling convention.
+
+d_zlib.bpr creates a set of .obj files with register calling convention.
+These files are used by zlib.pas to create a Delphi unit containing zlib.
+The d_zlib.lib file generated isn't useful and can be deleted.
+
+zlib.cpp, zlib32.cpp and d_zlib.cpp are used by the above projects.
+
diff --git a/zlib/contrib/delphi2/zlib.bpg b/zlib/contrib/delphi2/zlib.bpg
new file mode 100644
index 00000000000..b6c9acdf8c9
--- /dev/null
+++ b/zlib/contrib/delphi2/zlib.bpg
@@ -0,0 +1,26 @@
+#------------------------------------------------------------------------------
+VERSION = BWS.01
+#------------------------------------------------------------------------------
+!ifndef ROOT
+ROOT = $(MAKEDIR)\..
+!endif
+#------------------------------------------------------------------------------
+MAKE = $(ROOT)\bin\make.exe -$(MAKEFLAGS) -f$**
+DCC = $(ROOT)\bin\dcc32.exe $**
+BRCC = $(ROOT)\bin\brcc32.exe $**
+#------------------------------------------------------------------------------
+PROJECTS = zlib zlib32 d_zlib
+#------------------------------------------------------------------------------
+default: $(PROJECTS)
+#------------------------------------------------------------------------------
+
+zlib: zlib.bpr
+ $(MAKE)
+
+zlib32: zlib32.bpr
+ $(MAKE)
+
+d_zlib: d_zlib.bpr
+ $(MAKE)
+
+
diff --git a/zlib/contrib/delphi2/zlib.bpr b/zlib/contrib/delphi2/zlib.bpr
new file mode 100644
index 00000000000..cf3945b2523
--- /dev/null
+++ b/zlib/contrib/delphi2/zlib.bpr
@@ -0,0 +1,225 @@
+# ---------------------------------------------------------------------------
+!if !$d(BCB)
+BCB = $(MAKEDIR)\..
+!endif
+
+# ---------------------------------------------------------------------------
+# IDE SECTION
+# ---------------------------------------------------------------------------
+# The following section of the project makefile is managed by the BCB IDE.
+# It is recommended to use the IDE to change any of the values in this
+# section.
+# ---------------------------------------------------------------------------
+
+VERSION = BCB.03
+# ---------------------------------------------------------------------------
+PROJECT = zlib.lib
+OBJFILES = zlib.obj adler32.obj compress.obj crc32.obj deflate.obj gzio.obj infblock.obj \
+ infcodes.obj inffast.obj inflate.obj inftrees.obj infutil.obj trees.obj \
+ uncompr.obj zutil.obj
+RESFILES =
+RESDEPEN = $(RESFILES)
+LIBFILES =
+LIBRARIES = VCL35.lib
+SPARELIBS = VCL35.lib
+DEFFILE =
+PACKAGES = VCLX35.bpi VCL35.bpi VCLDB35.bpi VCLDBX35.bpi ibsmp35.bpi bcbsmp35.bpi \
+ dclocx35.bpi QRPT35.bpi TEEUI35.bpi TEEDB35.bpi TEE35.bpi DSS35.bpi \
+ NMFAST35.bpi INETDB35.bpi INET35.bpi VCLMID35.bpi
+# ---------------------------------------------------------------------------
+PATHCPP = .;
+PATHASM = .;
+PATHPAS = .;
+PATHRC = .;
+DEBUGLIBPATH = $(BCB)\lib\debug
+RELEASELIBPATH = $(BCB)\lib\release
+# ---------------------------------------------------------------------------
+CFLAG1 = -O2 -Ve -d -k- -vi
+CFLAG2 = -I$(BCB)\include;$(BCB)\include\vcl -H=$(BCB)\lib\vcl35.csm
+CFLAG3 = -ff -5
+PFLAGS = -U;$(DEBUGLIBPATH) -I$(BCB)\include;$(BCB)\include\vcl -H -W -$I- -v -JPHN -M
+RFLAGS = -i$(BCB)\include;$(BCB)\include\vcl
+AFLAGS = /i$(BCB)\include /i$(BCB)\include\vcl /mx /w2 /zn
+LFLAGS =
+IFLAGS = -g -Gn
+# ---------------------------------------------------------------------------
+ALLOBJ = c0w32.obj $(OBJFILES)
+ALLRES = $(RESFILES)
+ALLLIB = $(LIBFILES) $(LIBRARIES) import32.lib cp32mt.lib
+# ---------------------------------------------------------------------------
+!!ifdef IDEOPTIONS
+
+[Version Info]
+IncludeVerInfo=0
+AutoIncBuild=0
+MajorVer=1
+MinorVer=0
+Release=0
+Build=0
+Debug=0
+PreRelease=0
+Special=0
+Private=0
+DLL=0
+Locale=1040
+CodePage=1252
+
+[Version Info Keys]
+CompanyName=
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+Comments=
+
+[HistoryLists\hlIncludePath]
+Count=2
+Item0=$(BCB)\include
+Item1=$(BCB)\include;$(BCB)\include\vcl
+
+[HistoryLists\hlLibraryPath]
+Count=1
+Item0=$(BCB)\lib\obj;$(BCB)\lib
+
+[HistoryLists\hlDebugSourcePath]
+Count=1
+Item0=$(BCB)\source\vcl
+
+[Debugging]
+DebugSourceDirs=
+
+[Parameters]
+RunParams=
+HostApplication=
+
+!endif
+
+ ---------------------------------------------------------------------------
+# MAKE SECTION
+# ---------------------------------------------------------------------------
+# This section of the project file is not used by the BCB IDE. It is for
+# the benefit of building from the command-line using the MAKE utility.
+# ---------------------------------------------------------------------------
+
+.autodepend
+# ---------------------------------------------------------------------------
+!if !$d(BCC32)
+BCC32 = bcc32
+!endif
+
+!if !$d(DCC32)
+DCC32 = dcc32
+!endif
+
+!if !$d(TASM32)
+TASM32 = tasm32
+!endif
+
+!if !$d(LINKER)
+LINKER = TLib
+!endif
+
+!if !$d(BRCC32)
+BRCC32 = brcc32
+!endif
+# ---------------------------------------------------------------------------
+!if $d(PATHCPP)
+.PATH.CPP = $(PATHCPP)
+.PATH.C = $(PATHCPP)
+!endif
+
+!if $d(PATHPAS)
+.PATH.PAS = $(PATHPAS)
+!endif
+
+!if $d(PATHASM)
+.PATH.ASM = $(PATHASM)
+!endif
+
+!if $d(PATHRC)
+.PATH.RC = $(PATHRC)
+!endif
+# ---------------------------------------------------------------------------
+!ifdef IDEOPTIONS
+
+[Version Info]
+IncludeVerInfo=0
+AutoIncBuild=0
+MajorVer=1
+MinorVer=0
+Release=0
+Build=0
+Debug=0
+PreRelease=0
+Special=0
+Private=0
+DLL=0
+Locale=1040
+CodePage=1252
+
+[Version Info Keys]
+CompanyName=
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+Comments=
+
+[HistoryLists\hlIncludePath]
+Count=2
+Item0=$(BCB)\include;$(BCB)\include\vcl
+Item1=$(BCB)\include
+
+[HistoryLists\hlLibraryPath]
+Count=1
+Item0=$(BCB)\lib\obj;$(BCB)\lib
+
+[HistoryLists\hlDebugSourcePath]
+Count=1
+Item0=$(BCB)\source\vcl
+
+[Debugging]
+DebugSourceDirs=
+
+[Parameters]
+RunParams=
+HostApplication=
+
+!endif
+
+$(PROJECT): $(OBJFILES) $(RESDEPEN) $(DEFFILE)
+ $(BCB)\BIN\$(LINKER) @&&!
+ $(LFLAGS) $(IFLAGS) +
+ $(ALLOBJ), +
+ $(PROJECT),, +
+ $(ALLLIB), +
+ $(DEFFILE), +
+ $(ALLRES)
+!
+# ---------------------------------------------------------------------------
+.pas.hpp:
+ $(BCB)\BIN\$(DCC32) $(PFLAGS) {$< }
+
+.pas.obj:
+ $(BCB)\BIN\$(DCC32) $(PFLAGS) {$< }
+
+.cpp.obj:
+ $(BCB)\BIN\$(BCC32) $(CFLAG1) $(CFLAG2) $(CFLAG3) -n$(@D) {$< }
+
+.c.obj:
+ $(BCB)\BIN\$(BCC32) $(CFLAG1) $(CFLAG2) $(CFLAG3) -n$(@D) {$< }
+
+.asm.obj:
+ $(BCB)\BIN\$(TASM32) $(AFLAGS) $<, $@
+
+.rc.res:
+ $(BCB)\BIN\$(BRCC32) $(RFLAGS) -fo$@ $<
+# ---------------------------------------------------------------------------
diff --git a/zlib/contrib/delphi2/zlib.cpp b/zlib/contrib/delphi2/zlib.cpp
new file mode 100644
index 00000000000..bf6953ba198
--- /dev/null
+++ b/zlib/contrib/delphi2/zlib.cpp
@@ -0,0 +1,22 @@
+#include <condefs.h>
+#pragma hdrstop
+//---------------------------------------------------------------------------
+USEUNIT("adler32.c");
+USEUNIT("compress.c");
+USEUNIT("crc32.c");
+USEUNIT("deflate.c");
+USEUNIT("gzio.c");
+USEUNIT("infblock.c");
+USEUNIT("infcodes.c");
+USEUNIT("inffast.c");
+USEUNIT("inflate.c");
+USEUNIT("inftrees.c");
+USEUNIT("infutil.c");
+USEUNIT("trees.c");
+USEUNIT("uncompr.c");
+USEUNIT("zutil.c");
+//---------------------------------------------------------------------------
+#define Library
+
+// To add a file to the library use the Project menu 'Add to Project'.
+
diff --git a/zlib/contrib/delphi2/zlib.pas b/zlib/contrib/delphi2/zlib.pas
new file mode 100644
index 00000000000..10ae4cae256
--- /dev/null
+++ b/zlib/contrib/delphi2/zlib.pas
@@ -0,0 +1,534 @@
+{*******************************************************}
+{ }
+{ Delphi Supplemental Components }
+{ ZLIB Data Compression Interface Unit }
+{ }
+{ Copyright (c) 1997 Borland International }
+{ }
+{*******************************************************}
+
+{ Modified for zlib 1.1.3 by Davide Moretti <dave@rimini.com }
+
+unit zlib;
+
+interface
+
+uses Sysutils, Classes;
+
+type
+ TAlloc = function (AppData: Pointer; Items, Size: Integer): Pointer;
+ TFree = procedure (AppData, Block: Pointer);
+
+ // Internal structure. Ignore.
+ TZStreamRec = packed record
+ next_in: PChar; // next input byte
+ avail_in: Integer; // number of bytes available at next_in
+ total_in: Integer; // total nb of input bytes read so far
+
+ next_out: PChar; // next output byte should be put here
+ avail_out: Integer; // remaining free space at next_out
+ total_out: Integer; // total nb of bytes output so far
+
+ msg: PChar; // last error message, NULL if no error
+ internal: Pointer; // not visible by applications
+
+ zalloc: TAlloc; // used to allocate the internal state
+ zfree: TFree; // used to free the internal state
+ AppData: Pointer; // private data object passed to zalloc and zfree
+
+ data_type: Integer; // best guess about the data type: ascii or binary
+ adler: Integer; // adler32 value of the uncompressed data
+ reserved: Integer; // reserved for future use
+ end;
+
+ // Abstract ancestor class
+ TCustomZlibStream = class(TStream)
+ private
+ FStrm: TStream;
+ FStrmPos: Integer;
+ FOnProgress: TNotifyEvent;
+ FZRec: TZStreamRec;
+ FBuffer: array [Word] of Char;
+ protected
+ procedure Progress(Sender: TObject); dynamic;
+ property OnProgress: TNotifyEvent read FOnProgress write FOnProgress;
+ constructor Create(Strm: TStream);
+ end;
+
+{ TCompressionStream compresses data on the fly as data is written to it, and
+ stores the compressed data to another stream.
+
+ TCompressionStream is write-only and strictly sequential. Reading from the
+ stream will raise an exception. Using Seek to move the stream pointer
+ will raise an exception.
+
+ Output data is cached internally, written to the output stream only when
+ the internal output buffer is full. All pending output data is flushed
+ when the stream is destroyed.
+
+ The Position property returns the number of uncompressed bytes of
+ data that have been written to the stream so far.
+
+ CompressionRate returns the on-the-fly percentage by which the original
+ data has been compressed: (1 - (CompressedBytes / UncompressedBytes)) * 100
+ If raw data size = 100 and compressed data size = 25, the CompressionRate
+ is 75%
+
+ The OnProgress event is called each time the output buffer is filled and
+ written to the output stream. This is useful for updating a progress
+ indicator when you are writing a large chunk of data to the compression
+ stream in a single call.}
+
+
+ TCompressionLevel = (clNone, clFastest, clDefault, clMax);
+
+ TCompressionStream = class(TCustomZlibStream)
+ private
+ function GetCompressionRate: Single;
+ public
+ constructor Create(CompressionLevel: TCompressionLevel; Dest: TStream);
+ destructor Destroy; override;
+ function Read(var Buffer; Count: Longint): Longint; override;
+ function Write(const Buffer; Count: Longint): Longint; override;
+ function Seek(Offset: Longint; Origin: Word): Longint; override;
+ property CompressionRate: Single read GetCompressionRate;
+ property OnProgress;
+ end;
+
+{ TDecompressionStream decompresses data on the fly as data is read from it.
+
+ Compressed data comes from a separate source stream. TDecompressionStream
+ is read-only and unidirectional; you can seek forward in the stream, but not
+ backwards. The special case of setting the stream position to zero is
+ allowed. Seeking forward decompresses data until the requested position in
+ the uncompressed data has been reached. Seeking backwards, seeking relative
+ to the end of the stream, requesting the size of the stream, and writing to
+ the stream will raise an exception.
+
+ The Position property returns the number of bytes of uncompressed data that
+ have been read from the stream so far.
+
+ The OnProgress event is called each time the internal input buffer of
+ compressed data is exhausted and the next block is read from the input stream.
+ This is useful for updating a progress indicator when you are reading a
+ large chunk of data from the decompression stream in a single call.}
+
+ TDecompressionStream = class(TCustomZlibStream)
+ public
+ constructor Create(Source: TStream);
+ destructor Destroy; override;
+ function Read(var Buffer; Count: Longint): Longint; override;
+ function Write(const Buffer; Count: Longint): Longint; override;
+ function Seek(Offset: Longint; Origin: Word): Longint; override;
+ property OnProgress;
+ end;
+
+
+
+{ CompressBuf compresses data, buffer to buffer, in one call.
+ In: InBuf = ptr to compressed data
+ InBytes = number of bytes in InBuf
+ Out: OutBuf = ptr to newly allocated buffer containing decompressed data
+ OutBytes = number of bytes in OutBuf }
+procedure CompressBuf(const InBuf: Pointer; InBytes: Integer;
+ out OutBuf: Pointer; out OutBytes: Integer);
+
+
+{ DecompressBuf decompresses data, buffer to buffer, in one call.
+ In: InBuf = ptr to compressed data
+ InBytes = number of bytes in InBuf
+ OutEstimate = zero, or est. size of the decompressed data
+ Out: OutBuf = ptr to newly allocated buffer containing decompressed data
+ OutBytes = number of bytes in OutBuf }
+procedure DecompressBuf(const InBuf: Pointer; InBytes: Integer;
+ OutEstimate: Integer; out OutBuf: Pointer; out OutBytes: Integer);
+
+const
+ zlib_version = '1.1.3';
+
+type
+ EZlibError = class(Exception);
+ ECompressionError = class(EZlibError);
+ EDecompressionError = class(EZlibError);
+
+function adler32(adler: Integer; buf: PChar; len: Integer): Integer;
+
+implementation
+
+const
+ Z_NO_FLUSH = 0;
+ Z_PARTIAL_FLUSH = 1;
+ Z_SYNC_FLUSH = 2;
+ Z_FULL_FLUSH = 3;
+ Z_FINISH = 4;
+
+ Z_OK = 0;
+ Z_STREAM_END = 1;
+ Z_NEED_DICT = 2;
+ Z_ERRNO = (-1);
+ Z_STREAM_ERROR = (-2);
+ Z_DATA_ERROR = (-3);
+ Z_MEM_ERROR = (-4);
+ Z_BUF_ERROR = (-5);
+ Z_VERSION_ERROR = (-6);
+
+ Z_NO_COMPRESSION = 0;
+ Z_BEST_SPEED = 1;
+ Z_BEST_COMPRESSION = 9;
+ Z_DEFAULT_COMPRESSION = (-1);
+
+ Z_FILTERED = 1;
+ Z_HUFFMAN_ONLY = 2;
+ Z_DEFAULT_STRATEGY = 0;
+
+ Z_BINARY = 0;
+ Z_ASCII = 1;
+ Z_UNKNOWN = 2;
+
+ Z_DEFLATED = 8;
+
+ _z_errmsg: array[0..9] of PChar = (
+ 'need dictionary', // Z_NEED_DICT (2)
+ 'stream end', // Z_STREAM_END (1)
+ '', // Z_OK (0)
+ 'file error', // Z_ERRNO (-1)
+ 'stream error', // Z_STREAM_ERROR (-2)
+ 'data error', // Z_DATA_ERROR (-3)
+ 'insufficient memory', // Z_MEM_ERROR (-4)
+ 'buffer error', // Z_BUF_ERROR (-5)
+ 'incompatible version', // Z_VERSION_ERROR (-6)
+ ''
+ );
+
+{$L deflate.obj}
+{$L inflate.obj}
+{$L inftrees.obj}
+{$L trees.obj}
+{$L adler32.obj}
+{$L infblock.obj}
+{$L infcodes.obj}
+{$L infutil.obj}
+{$L inffast.obj}
+
+procedure _tr_init; external;
+procedure _tr_tally; external;
+procedure _tr_flush_block; external;
+procedure _tr_align; external;
+procedure _tr_stored_block; external;
+function adler32; external;
+procedure inflate_blocks_new; external;
+procedure inflate_blocks; external;
+procedure inflate_blocks_reset; external;
+procedure inflate_blocks_free; external;
+procedure inflate_set_dictionary; external;
+procedure inflate_trees_bits; external;
+procedure inflate_trees_dynamic; external;
+procedure inflate_trees_fixed; external;
+procedure inflate_codes_new; external;
+procedure inflate_codes; external;
+procedure inflate_codes_free; external;
+procedure _inflate_mask; external;
+procedure inflate_flush; external;
+procedure inflate_fast; external;
+
+procedure _memset(P: Pointer; B: Byte; count: Integer);cdecl;
+begin
+ FillChar(P^, count, B);
+end;
+
+procedure _memcpy(dest, source: Pointer; count: Integer);cdecl;
+begin
+ Move(source^, dest^, count);
+end;
+
+
+
+// deflate compresses data
+function deflateInit_(var strm: TZStreamRec; level: Integer; version: PChar;
+ recsize: Integer): Integer; external;
+function deflate(var strm: TZStreamRec; flush: Integer): Integer; external;
+function deflateEnd(var strm: TZStreamRec): Integer; external;
+
+// inflate decompresses data
+function inflateInit_(var strm: TZStreamRec; version: PChar;
+ recsize: Integer): Integer; external;
+function inflate(var strm: TZStreamRec; flush: Integer): Integer; external;
+function inflateEnd(var strm: TZStreamRec): Integer; external;
+function inflateReset(var strm: TZStreamRec): Integer; external;
+
+
+function zcalloc(AppData: Pointer; Items, Size: Integer): Pointer;
+begin
+ GetMem(Result, Items*Size);
+end;
+
+procedure zcfree(AppData, Block: Pointer);
+begin
+ FreeMem(Block);
+end;
+
+function zlibCheck(code: Integer): Integer;
+begin
+ Result := code;
+ if code < 0 then
+ raise EZlibError.Create('error'); //!!
+end;
+
+function CCheck(code: Integer): Integer;
+begin
+ Result := code;
+ if code < 0 then
+ raise ECompressionError.Create('error'); //!!
+end;
+
+function DCheck(code: Integer): Integer;
+begin
+ Result := code;
+ if code < 0 then
+ raise EDecompressionError.Create('error'); //!!
+end;
+
+procedure CompressBuf(const InBuf: Pointer; InBytes: Integer;
+ out OutBuf: Pointer; out OutBytes: Integer);
+var
+ strm: TZStreamRec;
+ P: Pointer;
+begin
+ FillChar(strm, sizeof(strm), 0);
+ OutBytes := ((InBytes + (InBytes div 10) + 12) + 255) and not 255;
+ GetMem(OutBuf, OutBytes);
+ try
+ strm.next_in := InBuf;
+ strm.avail_in := InBytes;
+ strm.next_out := OutBuf;
+ strm.avail_out := OutBytes;
+ CCheck(deflateInit_(strm, Z_BEST_COMPRESSION, zlib_version, sizeof(strm)));
+ try
+ while CCheck(deflate(strm, Z_FINISH)) <> Z_STREAM_END do
+ begin
+ P := OutBuf;
+ Inc(OutBytes, 256);
+ ReallocMem(OutBuf, OutBytes);
+ strm.next_out := PChar(Integer(OutBuf) + (Integer(strm.next_out) - Integer(P)));
+ strm.avail_out := 256;
+ end;
+ finally
+ CCheck(deflateEnd(strm));
+ end;
+ ReallocMem(OutBuf, strm.total_out);
+ OutBytes := strm.total_out;
+ except
+ FreeMem(OutBuf);
+ raise
+ end;
+end;
+
+
+procedure DecompressBuf(const InBuf: Pointer; InBytes: Integer;
+ OutEstimate: Integer; out OutBuf: Pointer; out OutBytes: Integer);
+var
+ strm: TZStreamRec;
+ P: Pointer;
+ BufInc: Integer;
+begin
+ FillChar(strm, sizeof(strm), 0);
+ BufInc := (InBytes + 255) and not 255;
+ if OutEstimate = 0 then
+ OutBytes := BufInc
+ else
+ OutBytes := OutEstimate;
+ GetMem(OutBuf, OutBytes);
+ try
+ strm.next_in := InBuf;
+ strm.avail_in := InBytes;
+ strm.next_out := OutBuf;
+ strm.avail_out := OutBytes;
+ DCheck(inflateInit_(strm, zlib_version, sizeof(strm)));
+ try
+ while DCheck(inflate(strm, Z_FINISH)) <> Z_STREAM_END do
+ begin
+ P := OutBuf;
+ Inc(OutBytes, BufInc);
+ ReallocMem(OutBuf, OutBytes);
+ strm.next_out := PChar(Integer(OutBuf) + (Integer(strm.next_out) - Integer(P)));
+ strm.avail_out := BufInc;
+ end;
+ finally
+ DCheck(inflateEnd(strm));
+ end;
+ ReallocMem(OutBuf, strm.total_out);
+ OutBytes := strm.total_out;
+ except
+ FreeMem(OutBuf);
+ raise
+ end;
+end;
+
+
+// TCustomZlibStream
+
+constructor TCustomZLibStream.Create(Strm: TStream);
+begin
+ inherited Create;
+ FStrm := Strm;
+ FStrmPos := Strm.Position;
+end;
+
+procedure TCustomZLibStream.Progress(Sender: TObject);
+begin
+ if Assigned(FOnProgress) then FOnProgress(Sender);
+end;
+
+
+// TCompressionStream
+
+constructor TCompressionStream.Create(CompressionLevel: TCompressionLevel;
+ Dest: TStream);
+const
+ Levels: array [TCompressionLevel] of ShortInt =
+ (Z_NO_COMPRESSION, Z_BEST_SPEED, Z_DEFAULT_COMPRESSION, Z_BEST_COMPRESSION);
+begin
+ inherited Create(Dest);
+ FZRec.next_out := FBuffer;
+ FZRec.avail_out := sizeof(FBuffer);
+ CCheck(deflateInit_(FZRec, Levels[CompressionLevel], zlib_version, sizeof(FZRec)));
+end;
+
+destructor TCompressionStream.Destroy;
+begin
+ FZRec.next_in := nil;
+ FZRec.avail_in := 0;
+ try
+ if FStrm.Position <> FStrmPos then FStrm.Position := FStrmPos;
+ while (CCheck(deflate(FZRec, Z_FINISH)) <> Z_STREAM_END)
+ and (FZRec.avail_out = 0) do
+ begin
+ FStrm.WriteBuffer(FBuffer, sizeof(FBuffer));
+ FZRec.next_out := FBuffer;
+ FZRec.avail_out := sizeof(FBuffer);
+ end;
+ if FZRec.avail_out < sizeof(FBuffer) then
+ FStrm.WriteBuffer(FBuffer, sizeof(FBuffer) - FZRec.avail_out);
+ finally
+ deflateEnd(FZRec);
+ end;
+ inherited Destroy;
+end;
+
+function TCompressionStream.Read(var Buffer; Count: Longint): Longint;
+begin
+ raise ECompressionError.Create('Invalid stream operation');
+end;
+
+function TCompressionStream.Write(const Buffer; Count: Longint): Longint;
+begin
+ FZRec.next_in := @Buffer;
+ FZRec.avail_in := Count;
+ if FStrm.Position <> FStrmPos then FStrm.Position := FStrmPos;
+ while (FZRec.avail_in > 0) do
+ begin
+ CCheck(deflate(FZRec, 0));
+ if FZRec.avail_out = 0 then
+ begin
+ FStrm.WriteBuffer(FBuffer, sizeof(FBuffer));
+ FZRec.next_out := FBuffer;
+ FZRec.avail_out := sizeof(FBuffer);
+ FStrmPos := FStrm.Position;
+ Progress(Self);
+ end;
+ end;
+ Result := Count;
+end;
+
+function TCompressionStream.Seek(Offset: Longint; Origin: Word): Longint;
+begin
+ if (Offset = 0) and (Origin = soFromCurrent) then
+ Result := FZRec.total_in
+ else
+ raise ECompressionError.Create('Invalid stream operation');
+end;
+
+function TCompressionStream.GetCompressionRate: Single;
+begin
+ if FZRec.total_in = 0 then
+ Result := 0
+ else
+ Result := (1.0 - (FZRec.total_out / FZRec.total_in)) * 100.0;
+end;
+
+
+// TDecompressionStream
+
+constructor TDecompressionStream.Create(Source: TStream);
+begin
+ inherited Create(Source);
+ FZRec.next_in := FBuffer;
+ FZRec.avail_in := 0;
+ DCheck(inflateInit_(FZRec, zlib_version, sizeof(FZRec)));
+end;
+
+destructor TDecompressionStream.Destroy;
+begin
+ inflateEnd(FZRec);
+ inherited Destroy;
+end;
+
+function TDecompressionStream.Read(var Buffer; Count: Longint): Longint;
+begin
+ FZRec.next_out := @Buffer;
+ FZRec.avail_out := Count;
+ if FStrm.Position <> FStrmPos then FStrm.Position := FStrmPos;
+ while (FZRec.avail_out > 0) do
+ begin
+ if FZRec.avail_in = 0 then
+ begin
+ FZRec.avail_in := FStrm.Read(FBuffer, sizeof(FBuffer));
+ if FZRec.avail_in = 0 then
+ begin
+ Result := Count - FZRec.avail_out;
+ Exit;
+ end;
+ FZRec.next_in := FBuffer;
+ FStrmPos := FStrm.Position;
+ Progress(Self);
+ end;
+ DCheck(inflate(FZRec, 0));
+ end;
+ Result := Count;
+end;
+
+function TDecompressionStream.Write(const Buffer; Count: Longint): Longint;
+begin
+ raise EDecompressionError.Create('Invalid stream operation');
+end;
+
+function TDecompressionStream.Seek(Offset: Longint; Origin: Word): Longint;
+var
+ I: Integer;
+ Buf: array [0..4095] of Char;
+begin
+ if (Offset = 0) and (Origin = soFromBeginning) then
+ begin
+ DCheck(inflateReset(FZRec));
+ FZRec.next_in := FBuffer;
+ FZRec.avail_in := 0;
+ FStrm.Position := 0;
+ FStrmPos := 0;
+ end
+ else if ( (Offset >= 0) and (Origin = soFromCurrent)) or
+ ( ((Offset - FZRec.total_out) > 0) and (Origin = soFromBeginning)) then
+ begin
+ if Origin = soFromBeginning then Dec(Offset, FZRec.total_out);
+ if Offset > 0 then
+ begin
+ for I := 1 to Offset div sizeof(Buf) do
+ ReadBuffer(Buf, sizeof(Buf));
+ ReadBuffer(Buf, Offset mod sizeof(Buf));
+ end;
+ end
+ else
+ raise EDecompressionError.Create('Invalid stream operation');
+ Result := FZRec.total_out;
+end;
+
+end.
diff --git a/zlib/contrib/delphi2/zlib32.bpr b/zlib/contrib/delphi2/zlib32.bpr
new file mode 100644
index 00000000000..cabcec44947
--- /dev/null
+++ b/zlib/contrib/delphi2/zlib32.bpr
@@ -0,0 +1,174 @@
+# ---------------------------------------------------------------------------
+!if !$d(BCB)
+BCB = $(MAKEDIR)\..
+!endif
+
+# ---------------------------------------------------------------------------
+# IDE SECTION
+# ---------------------------------------------------------------------------
+# The following section of the project makefile is managed by the BCB IDE.
+# It is recommended to use the IDE to change any of the values in this
+# section.
+# ---------------------------------------------------------------------------
+
+VERSION = BCB.03
+# ---------------------------------------------------------------------------
+PROJECT = zlib32.dll
+OBJFILES = zlib32.obj adler32.obj compress.obj crc32.obj deflate.obj gzio.obj infblock.obj \
+ infcodes.obj inffast.obj inflate.obj inftrees.obj infutil.obj trees.obj \
+ uncompr.obj zutil.obj
+RESFILES =
+RESDEPEN = $(RESFILES)
+LIBFILES =
+LIBRARIES =
+SPARELIBS =
+DEFFILE =
+PACKAGES = VCLX35.bpi VCL35.bpi VCLDB35.bpi VCLDBX35.bpi ibsmp35.bpi bcbsmp35.bpi \
+ dclocx35.bpi QRPT35.bpi TEEUI35.bpi TEEDB35.bpi TEE35.bpi DSS35.bpi \
+ NMFAST35.bpi INETDB35.bpi INET35.bpi VCLMID35.bpi
+# ---------------------------------------------------------------------------
+PATHCPP = .;
+PATHASM = .;
+PATHPAS = .;
+PATHRC = .;
+DEBUGLIBPATH = $(BCB)\lib\debug
+RELEASELIBPATH = $(BCB)\lib\release
+# ---------------------------------------------------------------------------
+CFLAG1 = -WD -O2 -Ve -d -k- -vi -c -tWD
+CFLAG2 = -D_NO_VCL;ZLIB_DLL -I$(BCB)\include
+CFLAG3 = -ff -5
+PFLAGS = -D_NO_VCL;ZLIB_DLL -U$(BCB)\lib;$(RELEASELIBPATH) -I$(BCB)\include -$I- -v \
+ -JPHN -M
+RFLAGS = -D_NO_VCL;ZLIB_DLL -i$(BCB)\include
+AFLAGS = /i$(BCB)\include /d_NO_VCL /dZLIB_DLL /mx /w2 /zn
+LFLAGS = -L$(BCB)\lib;$(RELEASELIBPATH) -aa -Tpd -x -Gi
+IFLAGS = -Gn -g
+# ---------------------------------------------------------------------------
+ALLOBJ = c0d32.obj $(OBJFILES)
+ALLRES = $(RESFILES)
+ALLLIB = $(LIBFILES) import32.lib cw32mt.lib
+# ---------------------------------------------------------------------------
+!ifdef IDEOPTIONS
+
+[Version Info]
+IncludeVerInfo=0
+AutoIncBuild=0
+MajorVer=1
+MinorVer=0
+Release=0
+Build=0
+Debug=0
+PreRelease=0
+Special=0
+Private=0
+DLL=1
+Locale=1040
+CodePage=1252
+
+[Version Info Keys]
+CompanyName=
+FileDescription=DLL (GUI)
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+Comments=
+
+[HistoryLists\hlIncludePath]
+Count=1
+Item0=$(BCB)\include
+
+[HistoryLists\hlLibraryPath]
+Count=1
+Item0=$(BCB)\lib
+
+[HistoryLists\hlConditionals]
+Count=1
+Item0=_NO_VCL;ZLIB_DLL
+
+[Debugging]
+DebugSourceDirs=
+
+[Parameters]
+RunParams=
+HostApplication=
+
+!endif
+
+# ---------------------------------------------------------------------------
+# MAKE SECTION
+# ---------------------------------------------------------------------------
+# This section of the project file is not used by the BCB IDE. It is for
+# the benefit of building from the command-line using the MAKE utility.
+# ---------------------------------------------------------------------------
+
+.autodepend
+# ---------------------------------------------------------------------------
+!if !$d(BCC32)
+BCC32 = bcc32
+!endif
+
+!if !$d(DCC32)
+DCC32 = dcc32
+!endif
+
+!if !$d(TASM32)
+TASM32 = tasm32
+!endif
+
+!if !$d(LINKER)
+LINKER = ilink32
+!endif
+
+!if !$d(BRCC32)
+BRCC32 = brcc32
+!endif
+# ---------------------------------------------------------------------------
+!if $d(PATHCPP)
+.PATH.CPP = $(PATHCPP)
+.PATH.C = $(PATHCPP)
+!endif
+
+!if $d(PATHPAS)
+.PATH.PAS = $(PATHPAS)
+!endif
+
+!if $d(PATHASM)
+.PATH.ASM = $(PATHASM)
+!endif
+
+!if $d(PATHRC)
+.PATH.RC = $(PATHRC)
+!endif
+# ---------------------------------------------------------------------------
+$(PROJECT): $(OBJFILES) $(RESDEPEN) $(DEFFILE)
+ $(BCB)\BIN\$(LINKER) @&&!
+ $(LFLAGS) $(IFLAGS) +
+ $(ALLOBJ), +
+ $(PROJECT),, +
+ $(ALLLIB), +
+ $(DEFFILE), +
+ $(ALLRES)
+!
+# ---------------------------------------------------------------------------
+.pas.hpp:
+ $(BCB)\BIN\$(DCC32) $(PFLAGS) {$< }
+
+.pas.obj:
+ $(BCB)\BIN\$(DCC32) $(PFLAGS) {$< }
+
+.cpp.obj:
+ $(BCB)\BIN\$(BCC32) $(CFLAG1) $(CFLAG2) $(CFLAG3) -n$(@D) {$< }
+
+.c.obj:
+ $(BCB)\BIN\$(BCC32) $(CFLAG1) $(CFLAG2) $(CFLAG3) -n$(@D) {$< }
+
+.asm.obj:
+ $(BCB)\BIN\$(TASM32) $(AFLAGS) $<, $@
+
+.rc.res:
+ $(BCB)\BIN\$(BRCC32) $(RFLAGS) -fo$@ $<
+# ---------------------------------------------------------------------------
diff --git a/zlib/contrib/delphi2/zlib32.cpp b/zlib/contrib/delphi2/zlib32.cpp
new file mode 100644
index 00000000000..7372f6b985f
--- /dev/null
+++ b/zlib/contrib/delphi2/zlib32.cpp
@@ -0,0 +1,42 @@
+
+#include <windows.h>
+#pragma hdrstop
+#include <condefs.h>
+
+
+//---------------------------------------------------------------------------
+// Important note about DLL memory management in a VCL DLL:
+//
+//
+//
+// If your DLL uses VCL and exports any functions that pass VCL String objects
+// (or structs/classes containing nested Strings) as parameter or function
+// results, you will need to build both your DLL project and any EXE projects
+// that use your DLL with the dynamic RTL (the RTL DLL). This will change your
+// DLL and its calling EXE's to use BORLNDMM.DLL as their memory manager. In
+// these cases, the file BORLNDMM.DLL should be deployed along with your DLL
+// and the RTL DLL (CP3240MT.DLL). To avoid the requiring BORLNDMM.DLL in
+// these situations, pass string information using "char *" or ShortString
+// parameters and then link with the static RTL.
+//
+//---------------------------------------------------------------------------
+USEUNIT("adler32.c");
+USEUNIT("compress.c");
+USEUNIT("crc32.c");
+USEUNIT("deflate.c");
+USEUNIT("gzio.c");
+USEUNIT("infblock.c");
+USEUNIT("infcodes.c");
+USEUNIT("inffast.c");
+USEUNIT("inflate.c");
+USEUNIT("inftrees.c");
+USEUNIT("infutil.c");
+USEUNIT("trees.c");
+USEUNIT("uncompr.c");
+USEUNIT("zutil.c");
+//---------------------------------------------------------------------------
+#pragma argsused
+int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
+{
+ return 1;
+}
diff --git a/zlib/contrib/iostream/test.cpp b/zlib/contrib/iostream/test.cpp
new file mode 100644
index 00000000000..7d265b3b5c0
--- /dev/null
+++ b/zlib/contrib/iostream/test.cpp
@@ -0,0 +1,24 @@
+
+#include "zfstream.h"
+
+int main() {
+
+ // Construct a stream object with this filebuffer. Anything sent
+ // to this stream will go to standard out.
+ gzofstream os( 1, ios::out );
+
+ // This text is getting compressed and sent to stdout.
+ // To prove this, run 'test | zcat'.
+ os << "Hello, Mommy" << endl;
+
+ os << setcompressionlevel( Z_NO_COMPRESSION );
+ os << "hello, hello, hi, ho!" << endl;
+
+ setcompressionlevel( os, Z_DEFAULT_COMPRESSION )
+ << "I'm compressing again" << endl;
+
+ os.close();
+
+ return 0;
+
+}
diff --git a/zlib/contrib/iostream/zfstream.cpp b/zlib/contrib/iostream/zfstream.cpp
new file mode 100644
index 00000000000..a690bbefceb
--- /dev/null
+++ b/zlib/contrib/iostream/zfstream.cpp
@@ -0,0 +1,329 @@
+
+#include <memory.h>
+#include "zfstream.h"
+
+gzfilebuf::gzfilebuf() :
+ file(NULL),
+ mode(0),
+ own_file_descriptor(0)
+{ }
+
+gzfilebuf::~gzfilebuf() {
+
+ sync();
+ if ( own_file_descriptor )
+ close();
+
+}
+
+gzfilebuf *gzfilebuf::open( const char *name,
+ int io_mode ) {
+
+ if ( is_open() )
+ return NULL;
+
+ char char_mode[10];
+ char *p;
+ memset(char_mode,'\0',10);
+ p = char_mode;
+
+ if ( io_mode & ios::in ) {
+ mode = ios::in;
+ *p++ = 'r';
+ } else if ( io_mode & ios::app ) {
+ mode = ios::app;
+ *p++ = 'a';
+ } else {
+ mode = ios::out;
+ *p++ = 'w';
+ }
+
+ if ( io_mode & ios::binary ) {
+ mode |= ios::binary;
+ *p++ = 'b';
+ }
+
+ // Hard code the compression level
+ if ( io_mode & (ios::out|ios::app )) {
+ *p++ = '9';
+ }
+
+ if ( (file = gzopen(name, char_mode)) == NULL )
+ return NULL;
+
+ own_file_descriptor = 1;
+
+ return this;
+
+}
+
+gzfilebuf *gzfilebuf::attach( int file_descriptor,
+ int io_mode ) {
+
+ if ( is_open() )
+ return NULL;
+
+ char char_mode[10];
+ char *p;
+ memset(char_mode,'\0',10);
+ p = char_mode;
+
+ if ( io_mode & ios::in ) {
+ mode = ios::in;
+ *p++ = 'r';
+ } else if ( io_mode & ios::app ) {
+ mode = ios::app;
+ *p++ = 'a';
+ } else {
+ mode = ios::out;
+ *p++ = 'w';
+ }
+
+ if ( io_mode & ios::binary ) {
+ mode |= ios::binary;
+ *p++ = 'b';
+ }
+
+ // Hard code the compression level
+ if ( io_mode & (ios::out|ios::app )) {
+ *p++ = '9';
+ }
+
+ if ( (file = gzdopen(file_descriptor, char_mode)) == NULL )
+ return NULL;
+
+ own_file_descriptor = 0;
+
+ return this;
+
+}
+
+gzfilebuf *gzfilebuf::close() {
+
+ if ( is_open() ) {
+
+ sync();
+ gzclose( file );
+ file = NULL;
+
+ }
+
+ return this;
+
+}
+
+int gzfilebuf::setcompressionlevel( short comp_level ) {
+
+ return gzsetparams(file, comp_level, -2);
+
+}
+
+int gzfilebuf::setcompressionstrategy( short comp_strategy ) {
+
+ return gzsetparams(file, -2, comp_strategy);
+
+}
+
+
+streampos gzfilebuf::seekoff( streamoff off, ios::seek_dir dir, int which ) {
+
+ return streampos(EOF);
+
+}
+
+int gzfilebuf::underflow() {
+
+ // If the file hasn't been opened for reading, error.
+ if ( !is_open() || !(mode & ios::in) )
+ return EOF;
+
+ // if a buffer doesn't exists, allocate one.
+ if ( !base() ) {
+
+ if ( (allocate()) == EOF )
+ return EOF;
+ setp(0,0);
+
+ } else {
+
+ if ( in_avail() )
+ return (unsigned char) *gptr();
+
+ if ( out_waiting() ) {
+ if ( flushbuf() == EOF )
+ return EOF;
+ }
+
+ }
+
+ // Attempt to fill the buffer.
+
+ int result = fillbuf();
+ if ( result == EOF ) {
+ // disable get area
+ setg(0,0,0);
+ return EOF;
+ }
+
+ return (unsigned char) *gptr();
+
+}
+
+int gzfilebuf::overflow( int c ) {
+
+ if ( !is_open() || !(mode & ios::out) )
+ return EOF;
+
+ if ( !base() ) {
+ if ( allocate() == EOF )
+ return EOF;
+ setg(0,0,0);
+ } else {
+ if (in_avail()) {
+ return EOF;
+ }
+ if (out_waiting()) {
+ if (flushbuf() == EOF)
+ return EOF;
+ }
+ }
+
+ int bl = blen();
+ setp( base(), base() + bl);
+
+ if ( c != EOF ) {
+
+ *pptr() = c;
+ pbump(1);
+
+ }
+
+ return 0;
+
+}
+
+int gzfilebuf::sync() {
+
+ if ( !is_open() )
+ return EOF;
+
+ if ( out_waiting() )
+ return flushbuf();
+
+ return 0;
+
+}
+
+int gzfilebuf::flushbuf() {
+
+ int n;
+ char *q;
+
+ q = pbase();
+ n = pptr() - q;
+
+ if ( gzwrite( file, q, n) < n )
+ return EOF;
+
+ setp(0,0);
+
+ return 0;
+
+}
+
+int gzfilebuf::fillbuf() {
+
+ int required;
+ char *p;
+
+ p = base();
+
+ required = blen();
+
+ int t = gzread( file, p, required );
+
+ if ( t <= 0) return EOF;
+
+ setg( base(), base(), base()+t);
+
+ return t;
+
+}
+
+gzfilestream_common::gzfilestream_common() :
+ ios( gzfilestream_common::rdbuf() )
+{ }
+
+gzfilestream_common::~gzfilestream_common()
+{ }
+
+void gzfilestream_common::attach( int fd, int io_mode ) {
+
+ if ( !buffer.attach( fd, io_mode) )
+ clear( ios::failbit | ios::badbit );
+ else
+ clear();
+
+}
+
+void gzfilestream_common::open( const char *name, int io_mode ) {
+
+ if ( !buffer.open( name, io_mode ) )
+ clear( ios::failbit | ios::badbit );
+ else
+ clear();
+
+}
+
+void gzfilestream_common::close() {
+
+ if ( !buffer.close() )
+ clear( ios::failbit | ios::badbit );
+
+}
+
+gzfilebuf *gzfilestream_common::rdbuf() {
+
+ return &buffer;
+
+}
+
+gzifstream::gzifstream() :
+ ios( gzfilestream_common::rdbuf() )
+{
+ clear( ios::badbit );
+}
+
+gzifstream::gzifstream( const char *name, int io_mode ) :
+ ios( gzfilestream_common::rdbuf() )
+{
+ gzfilestream_common::open( name, io_mode );
+}
+
+gzifstream::gzifstream( int fd, int io_mode ) :
+ ios( gzfilestream_common::rdbuf() )
+{
+ gzfilestream_common::attach( fd, io_mode );
+}
+
+gzifstream::~gzifstream() { }
+
+gzofstream::gzofstream() :
+ ios( gzfilestream_common::rdbuf() )
+{
+ clear( ios::badbit );
+}
+
+gzofstream::gzofstream( const char *name, int io_mode ) :
+ ios( gzfilestream_common::rdbuf() )
+{
+ gzfilestream_common::open( name, io_mode );
+}
+
+gzofstream::gzofstream( int fd, int io_mode ) :
+ ios( gzfilestream_common::rdbuf() )
+{
+ gzfilestream_common::attach( fd, io_mode );
+}
+
+gzofstream::~gzofstream() { }
diff --git a/zlib/contrib/iostream/zfstream.h b/zlib/contrib/iostream/zfstream.h
new file mode 100644
index 00000000000..c87fa08e9d1
--- /dev/null
+++ b/zlib/contrib/iostream/zfstream.h
@@ -0,0 +1,142 @@
+
+#ifndef _zfstream_h
+#define _zfstream_h
+
+#include <fstream.h>
+#include "zlib.h"
+
+class gzfilebuf : public streambuf {
+
+public:
+
+ gzfilebuf( );
+ virtual ~gzfilebuf();
+
+ gzfilebuf *open( const char *name, int io_mode );
+ gzfilebuf *attach( int file_descriptor, int io_mode );
+ gzfilebuf *close();
+
+ int setcompressionlevel( short comp_level );
+ int setcompressionstrategy( short comp_strategy );
+
+ inline int is_open() const { return (file !=NULL); }
+
+ virtual streampos seekoff( streamoff, ios::seek_dir, int );
+
+ virtual int sync();
+
+protected:
+
+ virtual int underflow();
+ virtual int overflow( int = EOF );
+
+private:
+
+ gzFile file;
+ short mode;
+ short own_file_descriptor;
+
+ int flushbuf();
+ int fillbuf();
+
+};
+
+class gzfilestream_common : virtual public ios {
+
+ friend class gzifstream;
+ friend class gzofstream;
+ friend gzofstream &setcompressionlevel( gzofstream &, int );
+ friend gzofstream &setcompressionstrategy( gzofstream &, int );
+
+public:
+ virtual ~gzfilestream_common();
+
+ void attach( int fd, int io_mode );
+ void open( const char *name, int io_mode );
+ void close();
+
+protected:
+ gzfilestream_common();
+
+private:
+ gzfilebuf *rdbuf();
+
+ gzfilebuf buffer;
+
+};
+
+class gzifstream : public gzfilestream_common, public istream {
+
+public:
+
+ gzifstream();
+ gzifstream( const char *name, int io_mode = ios::in );
+ gzifstream( int fd, int io_mode = ios::in );
+
+ virtual ~gzifstream();
+
+};
+
+class gzofstream : public gzfilestream_common, public ostream {
+
+public:
+
+ gzofstream();
+ gzofstream( const char *name, int io_mode = ios::out );
+ gzofstream( int fd, int io_mode = ios::out );
+
+ virtual ~gzofstream();
+
+};
+
+template<class T> class gzomanip {
+ friend gzofstream &operator<<(gzofstream &, const gzomanip<T> &);
+public:
+ gzomanip(gzofstream &(*f)(gzofstream &, T), T v) : func(f), val(v) { }
+private:
+ gzofstream &(*func)(gzofstream &, T);
+ T val;
+};
+
+template<class T> gzofstream &operator<<(gzofstream &s,
+ const gzomanip<T> &m) {
+ return (*m.func)(s, m.val);
+
+}
+
+inline gzofstream &setcompressionlevel( gzofstream &s, int l ) {
+ (s.rdbuf())->setcompressionlevel(l);
+ return s;
+}
+
+inline gzofstream &setcompressionstrategy( gzofstream &s, int l ) {
+ (s.rdbuf())->setcompressionstrategy(l);
+ return s;
+}
+
+inline gzomanip<int> setcompressionlevel(int l)
+{
+ return gzomanip<int>(&setcompressionlevel,l);
+}
+
+inline gzomanip<int> setcompressionstrategy(int l)
+{
+ return gzomanip<int>(&setcompressionstrategy,l);
+}
+
+#endif
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zlib/contrib/iostream2/zstream.h b/zlib/contrib/iostream2/zstream.h
new file mode 100644
index 00000000000..43d2332b79b
--- /dev/null
+++ b/zlib/contrib/iostream2/zstream.h
@@ -0,0 +1,307 @@
+/*
+ *
+ * Copyright (c) 1997
+ * Christian Michelsen Research AS
+ * Advanced Computing
+ * Fantoftvegen 38, 5036 BERGEN, Norway
+ * http://www.cmr.no
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation. Christian Michelsen Research AS makes no
+ * representations about the suitability of this software for any
+ * purpose. It is provided "as is" without express or implied warranty.
+ *
+ */
+
+#ifndef ZSTREAM__H
+#define ZSTREAM__H
+
+/*
+ * zstream.h - C++ interface to the 'zlib' general purpose compression library
+ * $Id: zstream.h 1.1 1997-06-25 12:00:56+02 tyge Exp tyge $
+ */
+
+#include <strstream.h>
+#include <string.h>
+#include <stdio.h>
+#include "zlib.h"
+
+#if defined(_WIN32)
+# include <fcntl.h>
+# include <io.h>
+# define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY)
+#else
+# define SET_BINARY_MODE(file)
+#endif
+
+class zstringlen {
+public:
+ zstringlen(class izstream&);
+ zstringlen(class ozstream&, const char*);
+ size_t value() const { return val.word; }
+private:
+ struct Val { unsigned char byte; size_t word; } val;
+};
+
+// ----------------------------- izstream -----------------------------
+
+class izstream
+{
+ public:
+ izstream() : m_fp(0) {}
+ izstream(FILE* fp) : m_fp(0) { open(fp); }
+ izstream(const char* name) : m_fp(0) { open(name); }
+ ~izstream() { close(); }
+
+ /* Opens a gzip (.gz) file for reading.
+ * open() can be used to read a file which is not in gzip format;
+ * in this case read() will directly read from the file without
+ * decompression. errno can be checked to distinguish two error
+ * cases (if errno is zero, the zlib error is Z_MEM_ERROR).
+ */
+ void open(const char* name) {
+ if (m_fp) close();
+ m_fp = ::gzopen(name, "rb");
+ }
+
+ void open(FILE* fp) {
+ SET_BINARY_MODE(fp);
+ if (m_fp) close();
+ m_fp = ::gzdopen(fileno(fp), "rb");
+ }
+
+ /* Flushes all pending input if necessary, closes the compressed file
+ * and deallocates all the (de)compression state. The return value is
+ * the zlib error number (see function error() below).
+ */
+ int close() {
+ int r = ::gzclose(m_fp);
+ m_fp = 0; return r;
+ }
+
+ /* Binary read the given number of bytes from the compressed file.
+ */
+ int read(void* buf, size_t len) {
+ return ::gzread(m_fp, buf, len);
+ }
+
+ /* Returns the error message for the last error which occurred on the
+ * given compressed file. errnum is set to zlib error number. If an
+ * error occurred in the file system and not in the compression library,
+ * errnum is set to Z_ERRNO and the application may consult errno
+ * to get the exact error code.
+ */
+ const char* error(int* errnum) {
+ return ::gzerror(m_fp, errnum);
+ }
+
+ gzFile fp() { return m_fp; }
+
+ private:
+ gzFile m_fp;
+};
+
+/*
+ * Binary read the given (array of) object(s) from the compressed file.
+ * If the input file was not in gzip format, read() copies the objects number
+ * of bytes into the buffer.
+ * returns the number of uncompressed bytes actually read
+ * (0 for end of file, -1 for error).
+ */
+template <class T, class Items>
+inline int read(izstream& zs, T* x, Items items) {
+ return ::gzread(zs.fp(), x, items*sizeof(T));
+}
+
+/*
+ * Binary input with the '>' operator.
+ */
+template <class T>
+inline izstream& operator>(izstream& zs, T& x) {
+ ::gzread(zs.fp(), &x, sizeof(T));
+ return zs;
+}
+
+
+inline zstringlen::zstringlen(izstream& zs) {
+ zs > val.byte;
+ if (val.byte == 255) zs > val.word;
+ else val.word = val.byte;
+}
+
+/*
+ * Read length of string + the string with the '>' operator.
+ */
+inline izstream& operator>(izstream& zs, char* x) {
+ zstringlen len(zs);
+ ::gzread(zs.fp(), x, len.value());
+ x[len.value()] = '\0';
+ return zs;
+}
+
+inline char* read_string(izstream& zs) {
+ zstringlen len(zs);
+ char* x = new char[len.value()+1];
+ ::gzread(zs.fp(), x, len.value());
+ x[len.value()] = '\0';
+ return x;
+}
+
+// ----------------------------- ozstream -----------------------------
+
+class ozstream
+{
+ public:
+ ozstream() : m_fp(0), m_os(0) {
+ }
+ ozstream(FILE* fp, int level = Z_DEFAULT_COMPRESSION)
+ : m_fp(0), m_os(0) {
+ open(fp, level);
+ }
+ ozstream(const char* name, int level = Z_DEFAULT_COMPRESSION)
+ : m_fp(0), m_os(0) {
+ open(name, level);
+ }
+ ~ozstream() {
+ close();
+ }
+
+ /* Opens a gzip (.gz) file for writing.
+ * The compression level parameter should be in 0..9
+ * errno can be checked to distinguish two error cases
+ * (if errno is zero, the zlib error is Z_MEM_ERROR).
+ */
+ void open(const char* name, int level = Z_DEFAULT_COMPRESSION) {
+ char mode[4] = "wb\0";
+ if (level != Z_DEFAULT_COMPRESSION) mode[2] = '0'+level;
+ if (m_fp) close();
+ m_fp = ::gzopen(name, mode);
+ }
+
+ /* open from a FILE pointer.
+ */
+ void open(FILE* fp, int level = Z_DEFAULT_COMPRESSION) {
+ SET_BINARY_MODE(fp);
+ char mode[4] = "wb\0";
+ if (level != Z_DEFAULT_COMPRESSION) mode[2] = '0'+level;
+ if (m_fp) close();
+ m_fp = ::gzdopen(fileno(fp), mode);
+ }
+
+ /* Flushes all pending output if necessary, closes the compressed file
+ * and deallocates all the (de)compression state. The return value is
+ * the zlib error number (see function error() below).
+ */
+ int close() {
+ if (m_os) {
+ ::gzwrite(m_fp, m_os->str(), m_os->pcount());
+ delete[] m_os->str(); delete m_os; m_os = 0;
+ }
+ int r = ::gzclose(m_fp); m_fp = 0; return r;
+ }
+
+ /* Binary write the given number of bytes into the compressed file.
+ */
+ int write(const void* buf, size_t len) {
+ return ::gzwrite(m_fp, (voidp) buf, len);
+ }
+
+ /* Flushes all pending output into the compressed file. The parameter
+ * _flush is as in the deflate() function. The return value is the zlib
+ * error number (see function gzerror below). flush() returns Z_OK if
+ * the flush_ parameter is Z_FINISH and all output could be flushed.
+ * flush() should be called only when strictly necessary because it can
+ * degrade compression.
+ */
+ int flush(int _flush) {
+ os_flush();
+ return ::gzflush(m_fp, _flush);
+ }
+
+ /* Returns the error message for the last error which occurred on the
+ * given compressed file. errnum is set to zlib error number. If an
+ * error occurred in the file system and not in the compression library,
+ * errnum is set to Z_ERRNO and the application may consult errno
+ * to get the exact error code.
+ */
+ const char* error(int* errnum) {
+ return ::gzerror(m_fp, errnum);
+ }
+
+ gzFile fp() { return m_fp; }
+
+ ostream& os() {
+ if (m_os == 0) m_os = new ostrstream;
+ return *m_os;
+ }
+
+ void os_flush() {
+ if (m_os && m_os->pcount()>0) {
+ ostrstream* oss = new ostrstream;
+ oss->fill(m_os->fill());
+ oss->flags(m_os->flags());
+ oss->precision(m_os->precision());
+ oss->width(m_os->width());
+ ::gzwrite(m_fp, m_os->str(), m_os->pcount());
+ delete[] m_os->str(); delete m_os; m_os = oss;
+ }
+ }
+
+ private:
+ gzFile m_fp;
+ ostrstream* m_os;
+};
+
+/*
+ * Binary write the given (array of) object(s) into the compressed file.
+ * returns the number of uncompressed bytes actually written
+ * (0 in case of error).
+ */
+template <class T, class Items>
+inline int write(ozstream& zs, const T* x, Items items) {
+ return ::gzwrite(zs.fp(), (voidp) x, items*sizeof(T));
+}
+
+/*
+ * Binary output with the '<' operator.
+ */
+template <class T>
+inline ozstream& operator<(ozstream& zs, const T& x) {
+ ::gzwrite(zs.fp(), (voidp) &x, sizeof(T));
+ return zs;
+}
+
+inline zstringlen::zstringlen(ozstream& zs, const char* x) {
+ val.byte = 255; val.word = ::strlen(x);
+ if (val.word < 255) zs < (val.byte = val.word);
+ else zs < val;
+}
+
+/*
+ * Write length of string + the string with the '<' operator.
+ */
+inline ozstream& operator<(ozstream& zs, const char* x) {
+ zstringlen len(zs, x);
+ ::gzwrite(zs.fp(), (voidp) x, len.value());
+ return zs;
+}
+
+#ifdef _MSC_VER
+inline ozstream& operator<(ozstream& zs, char* const& x) {
+ return zs < (const char*) x;
+}
+#endif
+
+/*
+ * Ascii write with the << operator;
+ */
+template <class T>
+inline ostream& operator<<(ozstream& zs, const T& x) {
+ zs.os_flush();
+ return zs.os() << x;
+}
+
+#endif
diff --git a/zlib/contrib/iostream2/zstream_test.cpp b/zlib/contrib/iostream2/zstream_test.cpp
new file mode 100644
index 00000000000..5bbd56c3ad8
--- /dev/null
+++ b/zlib/contrib/iostream2/zstream_test.cpp
@@ -0,0 +1,25 @@
+#include "zstream.h"
+#include <math.h>
+#include <stdlib.h>
+#include <iomanip.h>
+
+void main() {
+ char h[256] = "Hello";
+ char* g = "Goodbye";
+ ozstream out("temp.gz");
+ out < "This works well" < h < g;
+ out.close();
+
+ izstream in("temp.gz"); // read it back
+ char *x = read_string(in), *y = new char[256], z[256];
+ in > y > z;
+ in.close();
+ cout << x << endl << y << endl << z << endl;
+
+ out.open("temp.gz"); // try ascii output; zcat temp.gz to see the results
+ out << setw(50) << setfill('#') << setprecision(20) << x << endl << y << endl << z << endl;
+ out << z << endl << y << endl << x << endl;
+ out << 1.1234567890123456789 << endl;
+
+ delete[] x; delete[] y;
+}
diff --git a/zlib/contrib/minizip/ChangeLogUnzip b/zlib/contrib/minizip/ChangeLogUnzip
new file mode 100644
index 00000000000..9987c543cdc
--- /dev/null
+++ b/zlib/contrib/minizip/ChangeLogUnzip
@@ -0,0 +1,38 @@
+Change in 0.15: (19 Mar 98)
+- fix memory leak in minizip.c
+
+Change in 0.14: (10 Mar 98)
+- fix bugs in minizip.c sample for zipping big file
+- fix problem in month in date handling
+- fix bug in unzlocal_GetCurrentFileInfoInternal in unzip.c for
+ comment handling
+
+Change in 0.13: (6 Mar 98)
+- fix bugs in zip.c
+- add real minizip sample
+
+Change in 0.12: (4 Mar 98)
+- add zip.c and zip.h for creates .zip file
+- fix change_file_date in miniunz.c for Unix (Jean-loup Gailly)
+- fix miniunz.c for file without specific record for directory
+
+Change in 0.11: (3 Mar 98)
+- fix bug in unzGetCurrentFileInfo for get extra field and comment
+- enhance miniunz sample, remove the bad unztst.c sample
+
+Change in 0.10: (2 Mar 98)
+- fix bug in unzReadCurrentFile
+- rename unzip* to unz* function and structure
+- remove Windows-like hungary notation variable name
+- modify some structure in unzip.h
+- add somes comment in source
+- remove unzipGetcCurrentFile function
+- replace ZUNZEXPORT by ZEXPORT
+- add unzGetLocalExtrafield for get the local extrafield info
+- add a new sample, miniunz.c
+
+Change in 0.4: (25 Feb 98)
+- suppress the type unzipFileInZip.
+ Only on file in the zipfile can be open at the same time
+- fix somes typo in code
+- added tm_unz structure in unzip_file_info (date/time in readable format)
diff --git a/zlib/contrib/minizip/Makefile b/zlib/contrib/minizip/Makefile
new file mode 100644
index 00000000000..a1dfc161437
--- /dev/null
+++ b/zlib/contrib/minizip/Makefile
@@ -0,0 +1,25 @@
+CC=cc
+CFLAGS=-O -I../..
+
+UNZ_OBJS = miniunz.o unzip.o ../../libz.a
+ZIP_OBJS = minizip.o zip.o ../../libz.a
+
+.c.o:
+ $(CC) -c $(CFLAGS) $*.c
+
+all: miniunz minizip
+
+miniunz: $(UNZ_OBJS)
+ $(CC) $(CFLAGS) -o $@ $(UNZ_OBJS)
+
+minizip: $(ZIP_OBJS)
+ $(CC) $(CFLAGS) -o $@ $(ZIP_OBJS)
+
+test: miniunz minizip
+ ./minizip test readme.txt
+ ./miniunz -l test.zip
+ mv readme.txt readme.old
+ ./miniunz test.zip
+
+clean:
+ /bin/rm -f *.o *~ minizip miniunz
diff --git a/zlib/contrib/minizip/miniunz.c b/zlib/contrib/minizip/miniunz.c
new file mode 100644
index 00000000000..f3b7832878f
--- /dev/null
+++ b/zlib/contrib/minizip/miniunz.c
@@ -0,0 +1,508 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <errno.h>
+#include <fcntl.h>
+
+#ifdef unix
+# include <unistd.h>
+# include <utime.h>
+#else
+# include <direct.h>
+# include <io.h>
+#endif
+
+#include "unzip.h"
+
+#define CASESENSITIVITY (0)
+#define WRITEBUFFERSIZE (8192)
+
+/*
+ mini unzip, demo of unzip package
+
+ usage :
+ Usage : miniunz [-exvlo] file.zip [file_to_extract]
+
+ list the file in the zipfile, and print the content of FILE_ID.ZIP or README.TXT
+ if it exists
+*/
+
+
+/* change_file_date : change the date/time of a file
+ filename : the filename of the file where date/time must be modified
+ dosdate : the new date at the MSDos format (4 bytes)
+ tmu_date : the SAME new date at the tm_unz format */
+void change_file_date(filename,dosdate,tmu_date)
+ const char *filename;
+ uLong dosdate;
+ tm_unz tmu_date;
+{
+#ifdef WIN32
+ HANDLE hFile;
+ FILETIME ftm,ftLocal,ftCreate,ftLastAcc,ftLastWrite;
+
+ hFile = CreateFile(filename,GENERIC_READ | GENERIC_WRITE,
+ 0,NULL,OPEN_EXISTING,0,NULL);
+ GetFileTime(hFile,&ftCreate,&ftLastAcc,&ftLastWrite);
+ DosDateTimeToFileTime((WORD)(dosdate>>16),(WORD)dosdate,&ftLocal);
+ LocalFileTimeToFileTime(&ftLocal,&ftm);
+ SetFileTime(hFile,&ftm,&ftLastAcc,&ftm);
+ CloseHandle(hFile);
+#else
+#ifdef unix
+ struct utimbuf ut;
+ struct tm newdate;
+ newdate.tm_sec = tmu_date.tm_sec;
+ newdate.tm_min=tmu_date.tm_min;
+ newdate.tm_hour=tmu_date.tm_hour;
+ newdate.tm_mday=tmu_date.tm_mday;
+ newdate.tm_mon=tmu_date.tm_mon;
+ if (tmu_date.tm_year > 1900)
+ newdate.tm_year=tmu_date.tm_year - 1900;
+ else
+ newdate.tm_year=tmu_date.tm_year ;
+ newdate.tm_isdst=-1;
+
+ ut.actime=ut.modtime=mktime(&newdate);
+ utime(filename,&ut);
+#endif
+#endif
+}
+
+
+/* mymkdir and change_file_date are not 100 % portable
+ As I don't know well Unix, I wait feedback for the unix portion */
+
+int mymkdir(dirname)
+ const char* dirname;
+{
+ int ret=0;
+#ifdef WIN32
+ ret = mkdir(dirname);
+#else
+#ifdef unix
+ ret = mkdir (dirname,0775);
+#endif
+#endif
+ return ret;
+}
+
+int makedir (newdir)
+ char *newdir;
+{
+ char *buffer ;
+ char *p;
+ int len = strlen(newdir);
+
+ if (len <= 0)
+ return 0;
+
+ buffer = (char*)malloc(len+1);
+ strcpy(buffer,newdir);
+
+ if (buffer[len-1] == '/') {
+ buffer[len-1] = '\0';
+ }
+ if (mymkdir(buffer) == 0)
+ {
+ free(buffer);
+ return 1;
+ }
+
+ p = buffer+1;
+ while (1)
+ {
+ char hold;
+
+ while(*p && *p != '\\' && *p != '/')
+ p++;
+ hold = *p;
+ *p = 0;
+ if ((mymkdir(buffer) == -1) && (errno == ENOENT))
+ {
+ printf("couldn't create directory %s\n",buffer);
+ free(buffer);
+ return 0;
+ }
+ if (hold == 0)
+ break;
+ *p++ = hold;
+ }
+ free(buffer);
+ return 1;
+}
+
+void do_banner()
+{
+ printf("MiniUnz 0.15, demo of zLib + Unz package written by Gilles Vollant\n");
+ printf("more info at http://wwww.winimage/zLibDll/unzip.htm\n\n");
+}
+
+void do_help()
+{
+ printf("Usage : miniunz [-exvlo] file.zip [file_to_extract]\n\n") ;
+}
+
+
+int do_list(uf)
+ unzFile uf;
+{
+ uLong i;
+ unz_global_info gi;
+ int err;
+
+ err = unzGetGlobalInfo (uf,&gi);
+ if (err!=UNZ_OK)
+ printf("error %d with zipfile in unzGetGlobalInfo \n",err);
+ printf(" Length Method Size Ratio Date Time CRC-32 Name\n");
+ printf(" ------ ------ ---- ----- ---- ---- ------ ----\n");
+ for (i=0;i<gi.number_entry;i++)
+ {
+ char filename_inzip[256];
+ unz_file_info file_info;
+ uLong ratio=0;
+ const char *string_method;
+ err = unzGetCurrentFileInfo(uf,&file_info,filename_inzip,sizeof(filename_inzip),NULL,0,NULL,0);
+ if (err!=UNZ_OK)
+ {
+ printf("error %d with zipfile in unzGetCurrentFileInfo\n",err);
+ break;
+ }
+ if (file_info.uncompressed_size>0)
+ ratio = (file_info.compressed_size*100)/file_info.uncompressed_size;
+
+ if (file_info.compression_method==0)
+ string_method="Stored";
+ else
+ if (file_info.compression_method==Z_DEFLATED)
+ {
+ uInt iLevel=(uInt)((file_info.flag & 0x6)/2);
+ if (iLevel==0)
+ string_method="Defl:N";
+ else if (iLevel==1)
+ string_method="Defl:X";
+ else if ((iLevel==2) || (iLevel==3))
+ string_method="Defl:F"; /* 2:fast , 3 : extra fast*/
+ }
+ else
+ string_method="Unkn. ";
+
+ printf("%7lu %6s %7lu %3lu%% %2.2lu-%2.2lu-%2.2lu %2.2lu:%2.2lu %8.8lx %s\n",
+ file_info.uncompressed_size,string_method,file_info.compressed_size,
+ ratio,
+ (uLong)file_info.tmu_date.tm_mon + 1,
+ (uLong)file_info.tmu_date.tm_mday,
+ (uLong)file_info.tmu_date.tm_year % 100,
+ (uLong)file_info.tmu_date.tm_hour,(uLong)file_info.tmu_date.tm_min,
+ (uLong)file_info.crc,filename_inzip);
+ if ((i+1)<gi.number_entry)
+ {
+ err = unzGoToNextFile(uf);
+ if (err!=UNZ_OK)
+ {
+ printf("error %d with zipfile in unzGoToNextFile\n",err);
+ break;
+ }
+ }
+ }
+
+ return 0;
+}
+
+
+int do_extract_currentfile(uf,popt_extract_without_path,popt_overwrite)
+ unzFile uf;
+ const int* popt_extract_without_path;
+ int* popt_overwrite;
+{
+ char filename_inzip[256];
+ char* filename_withoutpath;
+ char* p;
+ int err=UNZ_OK;
+ FILE *fout=NULL;
+ void* buf;
+ uInt size_buf;
+
+ unz_file_info file_info;
+ uLong ratio=0;
+ err = unzGetCurrentFileInfo(uf,&file_info,filename_inzip,sizeof(filename_inzip),NULL,0,NULL,0);
+
+ if (err!=UNZ_OK)
+ {
+ printf("error %d with zipfile in unzGetCurrentFileInfo\n",err);
+ return err;
+ }
+
+ size_buf = WRITEBUFFERSIZE;
+ buf = (void*)malloc(size_buf);
+ if (buf==NULL)
+ {
+ printf("Error allocating memory\n");
+ return UNZ_INTERNALERROR;
+ }
+
+ p = filename_withoutpath = filename_inzip;
+ while ((*p) != '\0')
+ {
+ if (((*p)=='/') || ((*p)=='\\'))
+ filename_withoutpath = p+1;
+ p++;
+ }
+
+ if ((*filename_withoutpath)=='\0')
+ {
+ if ((*popt_extract_without_path)==0)
+ {
+ printf("creating directory: %s\n",filename_inzip);
+ mymkdir(filename_inzip);
+ }
+ }
+ else
+ {
+ const char* write_filename;
+ int skip=0;
+
+ if ((*popt_extract_without_path)==0)
+ write_filename = filename_inzip;
+ else
+ write_filename = filename_withoutpath;
+
+ err = unzOpenCurrentFile(uf);
+ if (err!=UNZ_OK)
+ {
+ printf("error %d with zipfile in unzOpenCurrentFile\n",err);
+ }
+
+ if (((*popt_overwrite)==0) && (err==UNZ_OK))
+ {
+ char rep;
+ FILE* ftestexist;
+ ftestexist = fopen(write_filename,"rb");
+ if (ftestexist!=NULL)
+ {
+ fclose(ftestexist);
+ do
+ {
+ char answer[128];
+ printf("The file %s exist. Overwrite ? [y]es, [n]o, [A]ll: ",write_filename);
+ scanf("%1s",answer);
+ rep = answer[0] ;
+ if ((rep>='a') && (rep<='z'))
+ rep -= 0x20;
+ }
+ while ((rep!='Y') && (rep!='N') && (rep!='A'));
+ }
+
+ if (rep == 'N')
+ skip = 1;
+
+ if (rep == 'A')
+ *popt_overwrite=1;
+ }
+
+ if ((skip==0) && (err==UNZ_OK))
+ {
+ fout=fopen(write_filename,"wb");
+
+ /* some zipfile don't contain directory alone before file */
+ if ((fout==NULL) && ((*popt_extract_without_path)==0) &&
+ (filename_withoutpath!=(char*)filename_inzip))
+ {
+ char c=*(filename_withoutpath-1);
+ *(filename_withoutpath-1)='\0';
+ makedir(write_filename);
+ *(filename_withoutpath-1)=c;
+ fout=fopen(write_filename,"wb");
+ }
+
+ if (fout==NULL)
+ {
+ printf("error opening %s\n",write_filename);
+ }
+ }
+
+ if (fout!=NULL)
+ {
+ printf(" extracting: %s\n",write_filename);
+
+ do
+ {
+ err = unzReadCurrentFile(uf,buf,size_buf);
+ if (err<0)
+ {
+ printf("error %d with zipfile in unzReadCurrentFile\n",err);
+ break;
+ }
+ if (err>0)
+ if (fwrite(buf,err,1,fout)!=1)
+ {
+ printf("error in writing extracted file\n");
+ err=UNZ_ERRNO;
+ break;
+ }
+ }
+ while (err>0);
+ fclose(fout);
+ if (err==0)
+ change_file_date(write_filename,file_info.dosDate,
+ file_info.tmu_date);
+ }
+
+ if (err==UNZ_OK)
+ {
+ err = unzCloseCurrentFile (uf);
+ if (err!=UNZ_OK)
+ {
+ printf("error %d with zipfile in unzCloseCurrentFile\n",err);
+ }
+ }
+ else
+ unzCloseCurrentFile(uf); /* don't lose the error */
+ }
+
+ free(buf);
+ return err;
+}
+
+
+int do_extract(uf,opt_extract_without_path,opt_overwrite)
+ unzFile uf;
+ int opt_extract_without_path;
+ int opt_overwrite;
+{
+ uLong i;
+ unz_global_info gi;
+ int err;
+ FILE* fout=NULL;
+
+ err = unzGetGlobalInfo (uf,&gi);
+ if (err!=UNZ_OK)
+ printf("error %d with zipfile in unzGetGlobalInfo \n",err);
+
+ for (i=0;i<gi.number_entry;i++)
+ {
+ if (do_extract_currentfile(uf,&opt_extract_without_path,
+ &opt_overwrite) != UNZ_OK)
+ break;
+
+ if ((i+1)<gi.number_entry)
+ {
+ err = unzGoToNextFile(uf);
+ if (err!=UNZ_OK)
+ {
+ printf("error %d with zipfile in unzGoToNextFile\n",err);
+ break;
+ }
+ }
+ }
+
+ return 0;
+}
+
+int do_extract_onefile(uf,filename,opt_extract_without_path,opt_overwrite)
+ unzFile uf;
+ const char* filename;
+ int opt_extract_without_path;
+ int opt_overwrite;
+{
+ int err = UNZ_OK;
+ if (unzLocateFile(uf,filename,CASESENSITIVITY)!=UNZ_OK)
+ {
+ printf("file %s not found in the zipfile\n",filename);
+ return 2;
+ }
+
+ if (do_extract_currentfile(uf,&opt_extract_without_path,
+ &opt_overwrite) == UNZ_OK)
+ return 0;
+ else
+ return 1;
+}
+
+
+int main(argc,argv)
+ int argc;
+ char *argv[];
+{
+ const char *zipfilename=NULL;
+ const char *filename_to_extract=NULL;
+ int i;
+ int opt_do_list=0;
+ int opt_do_extract=1;
+ int opt_do_extract_withoutpath=0;
+ int opt_overwrite=0;
+ char filename_try[512];
+ unzFile uf=NULL;
+
+ do_banner();
+ if (argc==1)
+ {
+ do_help();
+ exit(0);
+ }
+ else
+ {
+ for (i=1;i<argc;i++)
+ {
+ if ((*argv[i])=='-')
+ {
+ const char *p=argv[i]+1;
+
+ while ((*p)!='\0')
+ {
+ char c=*(p++);;
+ if ((c=='l') || (c=='L'))
+ opt_do_list = 1;
+ if ((c=='v') || (c=='V'))
+ opt_do_list = 1;
+ if ((c=='x') || (c=='X'))
+ opt_do_extract = 1;
+ if ((c=='e') || (c=='E'))
+ opt_do_extract = opt_do_extract_withoutpath = 1;
+ if ((c=='o') || (c=='O'))
+ opt_overwrite=1;
+ }
+ }
+ else
+ {
+ if (zipfilename == NULL)
+ zipfilename = argv[i];
+ else if (filename_to_extract==NULL)
+ filename_to_extract = argv[i] ;
+ }
+ }
+ }
+
+ if (zipfilename!=NULL)
+ {
+ strcpy(filename_try,zipfilename);
+ uf = unzOpen(zipfilename);
+ if (uf==NULL)
+ {
+ strcat(filename_try,".zip");
+ uf = unzOpen(filename_try);
+ }
+ }
+
+ if (uf==NULL)
+ {
+ printf("Cannot open %s or %s.zip\n",zipfilename,zipfilename);
+ exit (1);
+ }
+ printf("%s opened\n",filename_try);
+
+ if (opt_do_list==1)
+ return do_list(uf);
+ else if (opt_do_extract==1)
+ {
+ if (filename_to_extract == NULL)
+ return do_extract(uf,opt_do_extract_withoutpath,opt_overwrite);
+ else
+ return do_extract_onefile(uf,filename_to_extract,
+ opt_do_extract_withoutpath,opt_overwrite);
+ }
+ unzCloseCurrentFile(uf);
+
+ return 0; /* to avoid warning */
+}
diff --git a/zlib/contrib/minizip/minizip.c b/zlib/contrib/minizip/minizip.c
new file mode 100644
index 00000000000..5e492d209b1
--- /dev/null
+++ b/zlib/contrib/minizip/minizip.c
@@ -0,0 +1,302 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <errno.h>
+#include <fcntl.h>
+
+#ifdef unix
+# include <unistd.h>
+# include <utime.h>
+# include <sys/types.h>
+# include <sys/stat.h>
+#else
+# include <direct.h>
+# include <io.h>
+#endif
+
+#include "zip.h"
+
+
+#define WRITEBUFFERSIZE (16384)
+#define MAXFILENAME (256)
+
+#ifdef WIN32
+uLong filetime(f, tmzip, dt)
+ char *f; /* name of file to get info on */
+ tm_zip *tmzip; /* return value: access, modific. and creation times */
+ uLong *dt; /* dostime */
+{
+ int ret = 0;
+ {
+ FILETIME ftLocal;
+ HANDLE hFind;
+ WIN32_FIND_DATA ff32;
+
+ hFind = FindFirstFile(f,&ff32);
+ if (hFind != INVALID_HANDLE_VALUE)
+ {
+ FileTimeToLocalFileTime(&(ff32.ftLastWriteTime),&ftLocal);
+ FileTimeToDosDateTime(&ftLocal,((LPWORD)dt)+1,((LPWORD)dt)+0);
+ FindClose(hFind);
+ ret = 1;
+ }
+ }
+ return ret;
+}
+#else
+#ifdef unix
+uLong filetime(f, tmzip, dt)
+ char *f; /* name of file to get info on */
+ tm_zip *tmzip; /* return value: access, modific. and creation times */
+ uLong *dt; /* dostime */
+{
+ int ret=0;
+ struct stat s; /* results of stat() */
+ struct tm* filedate;
+ time_t tm_t=0;
+
+ if (strcmp(f,"-")!=0)
+ {
+ char name[MAXFILENAME];
+ int len = strlen(f);
+ strcpy(name, f);
+ if (name[len - 1] == '/')
+ name[len - 1] = '\0';
+ /* not all systems allow stat'ing a file with / appended */
+ if (stat(name,&s)==0)
+ {
+ tm_t = s.st_mtime;
+ ret = 1;
+ }
+ }
+ filedate = localtime(&tm_t);
+
+ tmzip->tm_sec = filedate->tm_sec;
+ tmzip->tm_min = filedate->tm_min;
+ tmzip->tm_hour = filedate->tm_hour;
+ tmzip->tm_mday = filedate->tm_mday;
+ tmzip->tm_mon = filedate->tm_mon ;
+ tmzip->tm_year = filedate->tm_year;
+
+ return ret;
+}
+#else
+uLong filetime(f, tmzip, dt)
+ char *f; /* name of file to get info on */
+ tm_zip *tmzip; /* return value: access, modific. and creation times */
+ uLong *dt; /* dostime */
+{
+ return 0;
+}
+#endif
+#endif
+
+
+
+
+int check_exist_file(filename)
+ const char* filename;
+{
+ FILE* ftestexist;
+ int ret = 1;
+ ftestexist = fopen(filename,"rb");
+ if (ftestexist==NULL)
+ ret = 0;
+ else
+ fclose(ftestexist);
+ return ret;
+}
+
+void do_banner()
+{
+ printf("MiniZip 0.15, demo of zLib + Zip package written by Gilles Vollant\n");
+ printf("more info at http://wwww.winimage/zLibDll/unzip.htm\n\n");
+}
+
+void do_help()
+{
+ printf("Usage : minizip [-o] file.zip [files_to_add]\n\n") ;
+}
+
+int main(argc,argv)
+ int argc;
+ char *argv[];
+{
+ int i;
+ int opt_overwrite=0;
+ int opt_compress_level=Z_DEFAULT_COMPRESSION;
+ int zipfilenamearg = 0;
+ char filename_try[MAXFILENAME];
+ int zipok;
+ int err=0;
+ int size_buf=0;
+ void* buf=NULL,
+
+
+ do_banner();
+ if (argc==1)
+ {
+ do_help();
+ exit(0);
+ return 0;
+ }
+ else
+ {
+ for (i=1;i<argc;i++)
+ {
+ if ((*argv[i])=='-')
+ {
+ const char *p=argv[i]+1;
+
+ while ((*p)!='\0')
+ {
+ char c=*(p++);;
+ if ((c=='o') || (c=='O'))
+ opt_overwrite = 1;
+ if ((c>='0') && (c<='9'))
+ opt_compress_level = c-'0';
+ }
+ }
+ else
+ if (zipfilenamearg == 0)
+ zipfilenamearg = i ;
+ }
+ }
+
+ size_buf = WRITEBUFFERSIZE;
+ buf = (void*)malloc(size_buf);
+ if (buf==NULL)
+ {
+ printf("Error allocating memory\n");
+ return ZIP_INTERNALERROR;
+ }
+
+ if (zipfilenamearg==0)
+ zipok=0;
+ else
+ {
+ int i,len;
+ int dot_found=0;
+
+ zipok = 1 ;
+ strcpy(filename_try,argv[zipfilenamearg]);
+ len=strlen(filename_try);
+ for (i=0;i<len;i++)
+ if (filename_try[i]=='.')
+ dot_found=1;
+
+ if (dot_found==0)
+ strcat(filename_try,".zip");
+
+ if (opt_overwrite==0)
+ if (check_exist_file(filename_try)!=0)
+ {
+ char rep;
+ do
+ {
+ char answer[128];
+ printf("The file %s exist. Overwrite ? [y]es, [n]o : ",filename_try);
+ scanf("%1s",answer);
+ rep = answer[0] ;
+ if ((rep>='a') && (rep<='z'))
+ rep -= 0x20;
+ }
+ while ((rep!='Y') && (rep!='N'));
+ if (rep=='N')
+ zipok = 0;
+ }
+ }
+
+ if (zipok==1)
+ {
+ zipFile zf;
+ int errclose;
+ zf = zipOpen(filename_try,0);
+ if (zf == NULL)
+ {
+ printf("error opening %s\n",filename_try);
+ err= ZIP_ERRNO;
+ }
+ else
+ printf("creating %s\n",filename_try);
+
+ for (i=zipfilenamearg+1;(i<argc) && (err==ZIP_OK);i++)
+ {
+ if (((*(argv[i]))!='-') && ((*(argv[i]))!='/'))
+ {
+ FILE * fin;
+ int size_read;
+ const char* filenameinzip = argv[i];
+ zip_fileinfo zi;
+
+ zi.tmz_date.tm_sec = zi.tmz_date.tm_min = zi.tmz_date.tm_hour =
+ zi.tmz_date.tm_mday = zi.tmz_date.tm_min = zi.tmz_date.tm_year = 0;
+ zi.dosDate = 0;
+ zi.internal_fa = 0;
+ zi.external_fa = 0;
+ filetime(filenameinzip,&zi.tmz_date,&zi.dosDate);
+
+
+ err = zipOpenNewFileInZip(zf,filenameinzip,&zi,
+ NULL,0,NULL,0,NULL /* comment*/,
+ (opt_compress_level != 0) ? Z_DEFLATED : 0,
+ opt_compress_level);
+
+ if (err != ZIP_OK)
+ printf("error in opening %s in zipfile\n",filenameinzip);
+ else
+ {
+ fin = fopen(filenameinzip,"rb");
+ if (fin==NULL)
+ {
+ err=ZIP_ERRNO;
+ printf("error in opening %s for reading\n",filenameinzip);
+ }
+ }
+
+ if (err == ZIP_OK)
+ do
+ {
+ err = ZIP_OK;
+ size_read = fread(buf,1,size_buf,fin);
+ if (size_read < size_buf)
+ if (feof(fin)==0)
+ {
+ printf("error in reading %s\n",filenameinzip);
+ err = ZIP_ERRNO;
+ }
+
+ if (size_read>0)
+ {
+ err = zipWriteInFileInZip (zf,buf,size_read);
+ if (err<0)
+ {
+ printf("error in writing %s in the zipfile\n",
+ filenameinzip);
+ }
+
+ }
+ } while ((err == ZIP_OK) && (size_read>0));
+
+ fclose(fin);
+ if (err<0)
+ err=ZIP_ERRNO;
+ else
+ {
+ err = zipCloseFileInZip(zf);
+ if (err!=ZIP_OK)
+ printf("error in closing %s in the zipfile\n",
+ filenameinzip);
+ }
+ }
+ }
+ errclose = zipClose(zf,NULL);
+ if (errclose != ZIP_OK)
+ printf("error in closing %s\n",filename_try);
+ }
+
+ free(buf);
+ exit(0);
+ return 0; /* to avoid warning */
+}
diff --git a/zlib/contrib/minizip/readme.txt b/zlib/contrib/minizip/readme.txt
new file mode 100644
index 00000000000..1fc023c720b
--- /dev/null
+++ b/zlib/contrib/minizip/readme.txt
@@ -0,0 +1,37 @@
+
+UnZip 0.15 additionnal library
+
+
+ This unzip package allow extract file from .ZIP file, compatible with
+PKZip 2.04g, WinZip, InfoZip tools and compatible.
+
+ Multi volume ZipFile (span) are not supported, and old compression used by old
+PKZip 1.x are not supported.
+
+See probdesc.zip from PKWare for specification of .ZIP format.
+
+What is Unzip
+ The Zlib library support the deflate compression and the creation of gzip (.gz)
+file. Zlib is free and small.
+ The .Zip format, which can contain several compressed files (.gz can containt
+only one file) is a very popular format. This is why I've written a package for reading file compressed in Zipfile.
+
+Using Unzip package
+
+You need source of Zlib (get zlib111.zip and read zlib.h).
+Get unzlb015.zip and read unzip.h (whith documentation of unzip functions)
+
+The Unzip package is only two file : unzip.h and unzip.c. But it use the Zlib
+ files.
+unztst.c is a simple sample program, which list file in a zipfile and display
+ README.TXT or FILE_ID.DIZ (if these files are found).
+miniunz.c is a mini unzip program.
+
+I'm also currenlyt writing a zipping portion (zip.h, zip.c and test with minizip.c)
+
+Please email me for feedback.
+I hope my source is compatible with Unix system, but I need your help for be sure
+
+Latest revision : Mar 04th, 1998
+
+Check http://www.winimage.com/zLibDll/unzip.html for up to date info.
diff --git a/zlib/contrib/minizip/unzip.c b/zlib/contrib/minizip/unzip.c
new file mode 100644
index 00000000000..ff71a474da1
--- /dev/null
+++ b/zlib/contrib/minizip/unzip.c
@@ -0,0 +1,1294 @@
+/* unzip.c -- IO on .zip files using zlib
+ Version 0.15 beta, Mar 19th, 1998,
+
+ Read unzip.h for more info
+*/
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "zlib.h"
+#include "unzip.h"
+
+#ifdef STDC
+# include <stddef.h>
+# include <string.h>
+# include <stdlib.h>
+#endif
+#ifdef NO_ERRNO_H
+ extern int errno;
+#else
+# include <errno.h>
+#endif
+
+
+#ifndef local
+# define local static
+#endif
+/* compile with -Dlocal if your debugger can't find static symbols */
+
+
+
+#if !defined(unix) && !defined(CASESENSITIVITYDEFAULT_YES) && \
+ !defined(CASESENSITIVITYDEFAULT_NO)
+#define CASESENSITIVITYDEFAULT_NO
+#endif
+
+
+#ifndef UNZ_BUFSIZE
+#define UNZ_BUFSIZE (16384)
+#endif
+
+#ifndef UNZ_MAXFILENAMEINZIP
+#define UNZ_MAXFILENAMEINZIP (256)
+#endif
+
+#ifndef ALLOC
+# define ALLOC(size) (malloc(size))
+#endif
+#ifndef TRYFREE
+# define TRYFREE(p) {if (p) free(p);}
+#endif
+
+#define SIZECENTRALDIRITEM (0x2e)
+#define SIZEZIPLOCALHEADER (0x1e)
+
+
+/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */
+
+#ifndef SEEK_CUR
+#define SEEK_CUR 1
+#endif
+
+#ifndef SEEK_END
+#define SEEK_END 2
+#endif
+
+#ifndef SEEK_SET
+#define SEEK_SET 0
+#endif
+
+const char unz_copyright[] =
+ " unzip 0.15 Copyright 1998 Gilles Vollant ";
+
+/* unz_file_info_interntal contain internal info about a file in zipfile*/
+typedef struct unz_file_info_internal_s
+{
+ uLong offset_curfile;/* relative offset of local header 4 bytes */
+} unz_file_info_internal;
+
+
+/* file_in_zip_read_info_s contain internal information about a file in zipfile,
+ when reading and decompress it */
+typedef struct
+{
+ char *read_buffer; /* internal buffer for compressed data */
+ z_stream stream; /* zLib stream structure for inflate */
+
+ uLong pos_in_zipfile; /* position in byte on the zipfile, for fseek*/
+ uLong stream_initialised; /* flag set if stream structure is initialised*/
+
+ uLong offset_local_extrafield;/* offset of the local extra field */
+ uInt size_local_extrafield;/* size of the local extra field */
+ uLong pos_local_extrafield; /* position in the local extra field in read*/
+
+ uLong crc32; /* crc32 of all data uncompressed */
+ uLong crc32_wait; /* crc32 we must obtain after decompress all */
+ uLong rest_read_compressed; /* number of byte to be decompressed */
+ uLong rest_read_uncompressed;/*number of byte to be obtained after decomp*/
+ FILE* file; /* io structore of the zipfile */
+ uLong compression_method; /* compression method (0==store) */
+ uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/
+} file_in_zip_read_info_s;
+
+
+/* unz_s contain internal information about the zipfile
+*/
+typedef struct
+{
+ FILE* file; /* io structore of the zipfile */
+ unz_global_info gi; /* public global information */
+ uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/
+ uLong num_file; /* number of the current file in the zipfile*/
+ uLong pos_in_central_dir; /* pos of the current file in the central dir*/
+ uLong current_file_ok; /* flag about the usability of the current file*/
+ uLong central_pos; /* position of the beginning of the central dir*/
+
+ uLong size_central_dir; /* size of the central directory */
+ uLong offset_central_dir; /* offset of start of central directory with
+ respect to the starting disk number */
+
+ unz_file_info cur_file_info; /* public info about the current file in zip*/
+ unz_file_info_internal cur_file_info_internal; /* private info about it*/
+ file_in_zip_read_info_s* pfile_in_zip_read; /* structure about the current
+ file if we are decompressing it */
+} unz_s;
+
+
+/* ===========================================================================
+ Read a byte from a gz_stream; update next_in and avail_in. Return EOF
+ for end of file.
+ IN assertion: the stream s has been sucessfully opened for reading.
+*/
+
+
+local int unzlocal_getByte(fin,pi)
+ FILE *fin;
+ int *pi;
+{
+ unsigned char c;
+ int err = fread(&c, 1, 1, fin);
+ if (err==1)
+ {
+ *pi = (int)c;
+ return UNZ_OK;
+ }
+ else
+ {
+ if (ferror(fin))
+ return UNZ_ERRNO;
+ else
+ return UNZ_EOF;
+ }
+}
+
+
+/* ===========================================================================
+ Reads a long in LSB order from the given gz_stream. Sets
+*/
+local int unzlocal_getShort (fin,pX)
+ FILE* fin;
+ uLong *pX;
+{
+ uLong x ;
+ int i;
+ int err;
+
+ err = unzlocal_getByte(fin,&i);
+ x = (uLong)i;
+
+ if (err==UNZ_OK)
+ err = unzlocal_getByte(fin,&i);
+ x += ((uLong)i)<<8;
+
+ if (err==UNZ_OK)
+ *pX = x;
+ else
+ *pX = 0;
+ return err;
+}
+
+local int unzlocal_getLong (fin,pX)
+ FILE* fin;
+ uLong *pX;
+{
+ uLong x ;
+ int i;
+ int err;
+
+ err = unzlocal_getByte(fin,&i);
+ x = (uLong)i;
+
+ if (err==UNZ_OK)
+ err = unzlocal_getByte(fin,&i);
+ x += ((uLong)i)<<8;
+
+ if (err==UNZ_OK)
+ err = unzlocal_getByte(fin,&i);
+ x += ((uLong)i)<<16;
+
+ if (err==UNZ_OK)
+ err = unzlocal_getByte(fin,&i);
+ x += ((uLong)i)<<24;
+
+ if (err==UNZ_OK)
+ *pX = x;
+ else
+ *pX = 0;
+ return err;
+}
+
+
+/* My own strcmpi / strcasecmp */
+local int strcmpcasenosensitive_internal (fileName1,fileName2)
+ const char* fileName1;
+ const char* fileName2;
+{
+ for (;;)
+ {
+ char c1=*(fileName1++);
+ char c2=*(fileName2++);
+ if ((c1>='a') && (c1<='z'))
+ c1 -= 0x20;
+ if ((c2>='a') && (c2<='z'))
+ c2 -= 0x20;
+ if (c1=='\0')
+ return ((c2=='\0') ? 0 : -1);
+ if (c2=='\0')
+ return 1;
+ if (c1<c2)
+ return -1;
+ if (c1>c2)
+ return 1;
+ }
+}
+
+
+#ifdef CASESENSITIVITYDEFAULT_NO
+#define CASESENSITIVITYDEFAULTVALUE 2
+#else
+#define CASESENSITIVITYDEFAULTVALUE 1
+#endif
+
+#ifndef STRCMPCASENOSENTIVEFUNCTION
+#define STRCMPCASENOSENTIVEFUNCTION strcmpcasenosensitive_internal
+#endif
+
+/*
+ Compare two filename (fileName1,fileName2).
+ If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp)
+ If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi
+ or strcasecmp)
+ If iCaseSenisivity = 0, case sensitivity is defaut of your operating system
+ (like 1 on Unix, 2 on Windows)
+
+*/
+extern int ZEXPORT unzStringFileNameCompare (fileName1,fileName2,iCaseSensitivity)
+ const char* fileName1;
+ const char* fileName2;
+ int iCaseSensitivity;
+{
+ if (iCaseSensitivity==0)
+ iCaseSensitivity=CASESENSITIVITYDEFAULTVALUE;
+
+ if (iCaseSensitivity==1)
+ return strcmp(fileName1,fileName2);
+
+ return STRCMPCASENOSENTIVEFUNCTION(fileName1,fileName2);
+}
+
+#define BUFREADCOMMENT (0x400)
+
+/*
+ Locate the Central directory of a zipfile (at the end, just before
+ the global comment)
+*/
+local uLong unzlocal_SearchCentralDir(fin)
+ FILE *fin;
+{
+ unsigned char* buf;
+ uLong uSizeFile;
+ uLong uBackRead;
+ uLong uMaxBack=0xffff; /* maximum size of global comment */
+ uLong uPosFound=0;
+
+ if (fseek(fin,0,SEEK_END) != 0)
+ return 0;
+
+
+ uSizeFile = ftell( fin );
+
+ if (uMaxBack>uSizeFile)
+ uMaxBack = uSizeFile;
+
+ buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4);
+ if (buf==NULL)
+ return 0;
+
+ uBackRead = 4;
+ while (uBackRead<uMaxBack)
+ {
+ uLong uReadSize,uReadPos ;
+ int i;
+ if (uBackRead+BUFREADCOMMENT>uMaxBack)
+ uBackRead = uMaxBack;
+ else
+ uBackRead+=BUFREADCOMMENT;
+ uReadPos = uSizeFile-uBackRead ;
+
+ uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ?
+ (BUFREADCOMMENT+4) : (uSizeFile-uReadPos);
+ if (fseek(fin,uReadPos,SEEK_SET)!=0)
+ break;
+
+ if (fread(buf,(uInt)uReadSize,1,fin)!=1)
+ break;
+
+ for (i=(int)uReadSize-3; (i--)>0;)
+ if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) &&
+ ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06))
+ {
+ uPosFound = uReadPos+i;
+ break;
+ }
+
+ if (uPosFound!=0)
+ break;
+ }
+ TRYFREE(buf);
+ return uPosFound;
+}
+
+/*
+ Open a Zip file. path contain the full pathname (by example,
+ on a Windows NT computer "c:\\test\\zlib109.zip" or on an Unix computer
+ "zlib/zlib109.zip".
+ If the zipfile cannot be opened (file don't exist or in not valid), the
+ return value is NULL.
+ Else, the return value is a unzFile Handle, usable with other function
+ of this unzip package.
+*/
+extern unzFile ZEXPORT unzOpen (path)
+ const char *path;
+{
+ unz_s us;
+ unz_s *s;
+ uLong central_pos,uL;
+ FILE * fin ;
+
+ uLong number_disk; /* number of the current dist, used for
+ spaning ZIP, unsupported, always 0*/
+ uLong number_disk_with_CD; /* number the the disk with central dir, used
+ for spaning ZIP, unsupported, always 0*/
+ uLong number_entry_CD; /* total number of entries in
+ the central dir
+ (same than number_entry on nospan) */
+
+ int err=UNZ_OK;
+
+ if (unz_copyright[0]!=' ')
+ return NULL;
+
+ fin=fopen(path,"rb");
+ if (fin==NULL)
+ return NULL;
+
+ central_pos = unzlocal_SearchCentralDir(fin);
+ if (central_pos==0)
+ err=UNZ_ERRNO;
+
+ if (fseek(fin,central_pos,SEEK_SET)!=0)
+ err=UNZ_ERRNO;
+
+ /* the signature, already checked */
+ if (unzlocal_getLong(fin,&uL)!=UNZ_OK)
+ err=UNZ_ERRNO;
+
+ /* number of this disk */
+ if (unzlocal_getShort(fin,&number_disk)!=UNZ_OK)
+ err=UNZ_ERRNO;
+
+ /* number of the disk with the start of the central directory */
+ if (unzlocal_getShort(fin,&number_disk_with_CD)!=UNZ_OK)
+ err=UNZ_ERRNO;
+
+ /* total number of entries in the central dir on this disk */
+ if (unzlocal_getShort(fin,&us.gi.number_entry)!=UNZ_OK)
+ err=UNZ_ERRNO;
+
+ /* total number of entries in the central dir */
+ if (unzlocal_getShort(fin,&number_entry_CD)!=UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if ((number_entry_CD!=us.gi.number_entry) ||
+ (number_disk_with_CD!=0) ||
+ (number_disk!=0))
+ err=UNZ_BADZIPFILE;
+
+ /* size of the central directory */
+ if (unzlocal_getLong(fin,&us.size_central_dir)!=UNZ_OK)
+ err=UNZ_ERRNO;
+
+ /* offset of start of central directory with respect to the
+ starting disk number */
+ if (unzlocal_getLong(fin,&us.offset_central_dir)!=UNZ_OK)
+ err=UNZ_ERRNO;
+
+ /* zipfile comment length */
+ if (unzlocal_getShort(fin,&us.gi.size_comment)!=UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if ((central_pos<us.offset_central_dir+us.size_central_dir) &&
+ (err==UNZ_OK))
+ err=UNZ_BADZIPFILE;
+
+ if (err!=UNZ_OK)
+ {
+ fclose(fin);
+ return NULL;
+ }
+
+ us.file=fin;
+ us.byte_before_the_zipfile = central_pos -
+ (us.offset_central_dir+us.size_central_dir);
+ us.central_pos = central_pos;
+ us.pfile_in_zip_read = NULL;
+
+
+ s=(unz_s*)ALLOC(sizeof(unz_s));
+ *s=us;
+ unzGoToFirstFile((unzFile)s);
+ return (unzFile)s;
+}
+
+
+/*
+ Close a ZipFile opened with unzipOpen.
+ If there is files inside the .Zip opened with unzipOpenCurrentFile (see later),
+ these files MUST be closed with unzipCloseCurrentFile before call unzipClose.
+ return UNZ_OK if there is no problem. */
+extern int ZEXPORT unzClose (file)
+ unzFile file;
+{
+ unz_s* s;
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+
+ if (s->pfile_in_zip_read!=NULL)
+ unzCloseCurrentFile(file);
+
+ fclose(s->file);
+ TRYFREE(s);
+ return UNZ_OK;
+}
+
+
+/*
+ Write info about the ZipFile in the *pglobal_info structure.
+ No preparation of the structure is needed
+ return UNZ_OK if there is no problem. */
+extern int ZEXPORT unzGetGlobalInfo (file,pglobal_info)
+ unzFile file;
+ unz_global_info *pglobal_info;
+{
+ unz_s* s;
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+ *pglobal_info=s->gi;
+ return UNZ_OK;
+}
+
+
+/*
+ Translate date/time from Dos format to tm_unz (readable more easilty)
+*/
+local void unzlocal_DosDateToTmuDate (ulDosDate, ptm)
+ uLong ulDosDate;
+ tm_unz* ptm;
+{
+ uLong uDate;
+ uDate = (uLong)(ulDosDate>>16);
+ ptm->tm_mday = (uInt)(uDate&0x1f) ;
+ ptm->tm_mon = (uInt)((((uDate)&0x1E0)/0x20)-1) ;
+ ptm->tm_year = (uInt)(((uDate&0x0FE00)/0x0200)+1980) ;
+
+ ptm->tm_hour = (uInt) ((ulDosDate &0xF800)/0x800);
+ ptm->tm_min = (uInt) ((ulDosDate&0x7E0)/0x20) ;
+ ptm->tm_sec = (uInt) (2*(ulDosDate&0x1f)) ;
+}
+
+/*
+ Get Info about the current file in the zipfile, with internal only info
+*/
+local int unzlocal_GetCurrentFileInfoInternal OF((unzFile file,
+ unz_file_info *pfile_info,
+ unz_file_info_internal
+ *pfile_info_internal,
+ char *szFileName,
+ uLong fileNameBufferSize,
+ void *extraField,
+ uLong extraFieldBufferSize,
+ char *szComment,
+ uLong commentBufferSize));
+
+local int unzlocal_GetCurrentFileInfoInternal (file,
+ pfile_info,
+ pfile_info_internal,
+ szFileName, fileNameBufferSize,
+ extraField, extraFieldBufferSize,
+ szComment, commentBufferSize)
+ unzFile file;
+ unz_file_info *pfile_info;
+ unz_file_info_internal *pfile_info_internal;
+ char *szFileName;
+ uLong fileNameBufferSize;
+ void *extraField;
+ uLong extraFieldBufferSize;
+ char *szComment;
+ uLong commentBufferSize;
+{
+ unz_s* s;
+ unz_file_info file_info;
+ unz_file_info_internal file_info_internal;
+ int err=UNZ_OK;
+ uLong uMagic;
+ long lSeek=0;
+
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+ if (fseek(s->file,s->pos_in_central_dir+s->byte_before_the_zipfile,SEEK_SET)!=0)
+ err=UNZ_ERRNO;
+
+
+ /* we check the magic */
+ if (err==UNZ_OK)
+ if (unzlocal_getLong(s->file,&uMagic) != UNZ_OK)
+ err=UNZ_ERRNO;
+ else if (uMagic!=0x02014b50)
+ err=UNZ_BADZIPFILE;
+
+ if (unzlocal_getShort(s->file,&file_info.version) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getShort(s->file,&file_info.version_needed) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getShort(s->file,&file_info.flag) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getShort(s->file,&file_info.compression_method) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getLong(s->file,&file_info.dosDate) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ unzlocal_DosDateToTmuDate(file_info.dosDate,&file_info.tmu_date);
+
+ if (unzlocal_getLong(s->file,&file_info.crc) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getLong(s->file,&file_info.compressed_size) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getLong(s->file,&file_info.uncompressed_size) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getShort(s->file,&file_info.size_filename) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getShort(s->file,&file_info.size_file_extra) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getShort(s->file,&file_info.size_file_comment) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getShort(s->file,&file_info.disk_num_start) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getShort(s->file,&file_info.internal_fa) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getLong(s->file,&file_info.external_fa) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getLong(s->file,&file_info_internal.offset_curfile) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ lSeek+=file_info.size_filename;
+ if ((err==UNZ_OK) && (szFileName!=NULL))
+ {
+ uLong uSizeRead ;
+ if (file_info.size_filename<fileNameBufferSize)
+ {
+ *(szFileName+file_info.size_filename)='\0';
+ uSizeRead = file_info.size_filename;
+ }
+ else
+ uSizeRead = fileNameBufferSize;
+
+ if ((file_info.size_filename>0) && (fileNameBufferSize>0))
+ if (fread(szFileName,(uInt)uSizeRead,1,s->file)!=1)
+ err=UNZ_ERRNO;
+ lSeek -= uSizeRead;
+ }
+
+
+ if ((err==UNZ_OK) && (extraField!=NULL))
+ {
+ uLong uSizeRead ;
+ if (file_info.size_file_extra<extraFieldBufferSize)
+ uSizeRead = file_info.size_file_extra;
+ else
+ uSizeRead = extraFieldBufferSize;
+
+ if (lSeek!=0)
+ if (fseek(s->file,lSeek,SEEK_CUR)==0)
+ lSeek=0;
+ else
+ err=UNZ_ERRNO;
+ if ((file_info.size_file_extra>0) && (extraFieldBufferSize>0))
+ if (fread(extraField,(uInt)uSizeRead,1,s->file)!=1)
+ err=UNZ_ERRNO;
+ lSeek += file_info.size_file_extra - uSizeRead;
+ }
+ else
+ lSeek+=file_info.size_file_extra;
+
+
+ if ((err==UNZ_OK) && (szComment!=NULL))
+ {
+ uLong uSizeRead ;
+ if (file_info.size_file_comment<commentBufferSize)
+ {
+ *(szComment+file_info.size_file_comment)='\0';
+ uSizeRead = file_info.size_file_comment;
+ }
+ else
+ uSizeRead = commentBufferSize;
+
+ if (lSeek!=0)
+ if (fseek(s->file,lSeek,SEEK_CUR)==0)
+ lSeek=0;
+ else
+ err=UNZ_ERRNO;
+ if ((file_info.size_file_comment>0) && (commentBufferSize>0))
+ if (fread(szComment,(uInt)uSizeRead,1,s->file)!=1)
+ err=UNZ_ERRNO;
+ lSeek+=file_info.size_file_comment - uSizeRead;
+ }
+ else
+ lSeek+=file_info.size_file_comment;
+
+ if ((err==UNZ_OK) && (pfile_info!=NULL))
+ *pfile_info=file_info;
+
+ if ((err==UNZ_OK) && (pfile_info_internal!=NULL))
+ *pfile_info_internal=file_info_internal;
+
+ return err;
+}
+
+
+
+/*
+ Write info about the ZipFile in the *pglobal_info structure.
+ No preparation of the structure is needed
+ return UNZ_OK if there is no problem.
+*/
+extern int ZEXPORT unzGetCurrentFileInfo (file,
+ pfile_info,
+ szFileName, fileNameBufferSize,
+ extraField, extraFieldBufferSize,
+ szComment, commentBufferSize)
+ unzFile file;
+ unz_file_info *pfile_info;
+ char *szFileName;
+ uLong fileNameBufferSize;
+ void *extraField;
+ uLong extraFieldBufferSize;
+ char *szComment;
+ uLong commentBufferSize;
+{
+ return unzlocal_GetCurrentFileInfoInternal(file,pfile_info,NULL,
+ szFileName,fileNameBufferSize,
+ extraField,extraFieldBufferSize,
+ szComment,commentBufferSize);
+}
+
+/*
+ Set the current file of the zipfile to the first file.
+ return UNZ_OK if there is no problem
+*/
+extern int ZEXPORT unzGoToFirstFile (file)
+ unzFile file;
+{
+ int err=UNZ_OK;
+ unz_s* s;
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+ s->pos_in_central_dir=s->offset_central_dir;
+ s->num_file=0;
+ err=unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info,
+ &s->cur_file_info_internal,
+ NULL,0,NULL,0,NULL,0);
+ s->current_file_ok = (err == UNZ_OK);
+ return err;
+}
+
+
+/*
+ Set the current file of the zipfile to the next file.
+ return UNZ_OK if there is no problem
+ return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest.
+*/
+extern int ZEXPORT unzGoToNextFile (file)
+ unzFile file;
+{
+ unz_s* s;
+ int err;
+
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+ if (!s->current_file_ok)
+ return UNZ_END_OF_LIST_OF_FILE;
+ if (s->num_file+1==s->gi.number_entry)
+ return UNZ_END_OF_LIST_OF_FILE;
+
+ s->pos_in_central_dir += SIZECENTRALDIRITEM + s->cur_file_info.size_filename +
+ s->cur_file_info.size_file_extra + s->cur_file_info.size_file_comment ;
+ s->num_file++;
+ err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info,
+ &s->cur_file_info_internal,
+ NULL,0,NULL,0,NULL,0);
+ s->current_file_ok = (err == UNZ_OK);
+ return err;
+}
+
+
+/*
+ Try locate the file szFileName in the zipfile.
+ For the iCaseSensitivity signification, see unzipStringFileNameCompare
+
+ return value :
+ UNZ_OK if the file is found. It becomes the current file.
+ UNZ_END_OF_LIST_OF_FILE if the file is not found
+*/
+extern int ZEXPORT unzLocateFile (file, szFileName, iCaseSensitivity)
+ unzFile file;
+ const char *szFileName;
+ int iCaseSensitivity;
+{
+ unz_s* s;
+ int err;
+
+
+ uLong num_fileSaved;
+ uLong pos_in_central_dirSaved;
+
+
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+
+ if (strlen(szFileName)>=UNZ_MAXFILENAMEINZIP)
+ return UNZ_PARAMERROR;
+
+ s=(unz_s*)file;
+ if (!s->current_file_ok)
+ return UNZ_END_OF_LIST_OF_FILE;
+
+ num_fileSaved = s->num_file;
+ pos_in_central_dirSaved = s->pos_in_central_dir;
+
+ err = unzGoToFirstFile(file);
+
+ while (err == UNZ_OK)
+ {
+ char szCurrentFileName[UNZ_MAXFILENAMEINZIP+1];
+ unzGetCurrentFileInfo(file,NULL,
+ szCurrentFileName,sizeof(szCurrentFileName)-1,
+ NULL,0,NULL,0);
+ if (unzStringFileNameCompare(szCurrentFileName,
+ szFileName,iCaseSensitivity)==0)
+ return UNZ_OK;
+ err = unzGoToNextFile(file);
+ }
+
+ s->num_file = num_fileSaved ;
+ s->pos_in_central_dir = pos_in_central_dirSaved ;
+ return err;
+}
+
+
+/*
+ Read the local header of the current zipfile
+ Check the coherency of the local header and info in the end of central
+ directory about this file
+ store in *piSizeVar the size of extra info in local header
+ (filename and size of extra field data)
+*/
+local int unzlocal_CheckCurrentFileCoherencyHeader (s,piSizeVar,
+ poffset_local_extrafield,
+ psize_local_extrafield)
+ unz_s* s;
+ uInt* piSizeVar;
+ uLong *poffset_local_extrafield;
+ uInt *psize_local_extrafield;
+{
+ uLong uMagic,uData,uFlags;
+ uLong size_filename;
+ uLong size_extra_field;
+ int err=UNZ_OK;
+
+ *piSizeVar = 0;
+ *poffset_local_extrafield = 0;
+ *psize_local_extrafield = 0;
+
+ if (fseek(s->file,s->cur_file_info_internal.offset_curfile +
+ s->byte_before_the_zipfile,SEEK_SET)!=0)
+ return UNZ_ERRNO;
+
+
+ if (err==UNZ_OK)
+ if (unzlocal_getLong(s->file,&uMagic) != UNZ_OK)
+ err=UNZ_ERRNO;
+ else if (uMagic!=0x04034b50)
+ err=UNZ_BADZIPFILE;
+
+ if (unzlocal_getShort(s->file,&uData) != UNZ_OK)
+ err=UNZ_ERRNO;
+/*
+ else if ((err==UNZ_OK) && (uData!=s->cur_file_info.wVersion))
+ err=UNZ_BADZIPFILE;
+*/
+ if (unzlocal_getShort(s->file,&uFlags) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getShort(s->file,&uData) != UNZ_OK)
+ err=UNZ_ERRNO;
+ else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compression_method))
+ err=UNZ_BADZIPFILE;
+
+ if ((err==UNZ_OK) && (s->cur_file_info.compression_method!=0) &&
+ (s->cur_file_info.compression_method!=Z_DEFLATED))
+ err=UNZ_BADZIPFILE;
+
+ if (unzlocal_getLong(s->file,&uData) != UNZ_OK) /* date/time */
+ err=UNZ_ERRNO;
+
+ if (unzlocal_getLong(s->file,&uData) != UNZ_OK) /* crc */
+ err=UNZ_ERRNO;
+ else if ((err==UNZ_OK) && (uData!=s->cur_file_info.crc) &&
+ ((uFlags & 8)==0))
+ err=UNZ_BADZIPFILE;
+
+ if (unzlocal_getLong(s->file,&uData) != UNZ_OK) /* size compr */
+ err=UNZ_ERRNO;
+ else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compressed_size) &&
+ ((uFlags & 8)==0))
+ err=UNZ_BADZIPFILE;
+
+ if (unzlocal_getLong(s->file,&uData) != UNZ_OK) /* size uncompr */
+ err=UNZ_ERRNO;
+ else if ((err==UNZ_OK) && (uData!=s->cur_file_info.uncompressed_size) &&
+ ((uFlags & 8)==0))
+ err=UNZ_BADZIPFILE;
+
+
+ if (unzlocal_getShort(s->file,&size_filename) != UNZ_OK)
+ err=UNZ_ERRNO;
+ else if ((err==UNZ_OK) && (size_filename!=s->cur_file_info.size_filename))
+ err=UNZ_BADZIPFILE;
+
+ *piSizeVar += (uInt)size_filename;
+
+ if (unzlocal_getShort(s->file,&size_extra_field) != UNZ_OK)
+ err=UNZ_ERRNO;
+ *poffset_local_extrafield= s->cur_file_info_internal.offset_curfile +
+ SIZEZIPLOCALHEADER + size_filename;
+ *psize_local_extrafield = (uInt)size_extra_field;
+
+ *piSizeVar += (uInt)size_extra_field;
+
+ return err;
+}
+
+/*
+ Open for reading data the current file in the zipfile.
+ If there is no error and the file is opened, the return value is UNZ_OK.
+*/
+extern int ZEXPORT unzOpenCurrentFile (file)
+ unzFile file;
+{
+ int err=UNZ_OK;
+ int Store;
+ uInt iSizeVar;
+ unz_s* s;
+ file_in_zip_read_info_s* pfile_in_zip_read_info;
+ uLong offset_local_extrafield; /* offset of the local extra field */
+ uInt size_local_extrafield; /* size of the local extra field */
+
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+ if (!s->current_file_ok)
+ return UNZ_PARAMERROR;
+
+ if (s->pfile_in_zip_read != NULL)
+ unzCloseCurrentFile(file);
+
+ if (unzlocal_CheckCurrentFileCoherencyHeader(s,&iSizeVar,
+ &offset_local_extrafield,&size_local_extrafield)!=UNZ_OK)
+ return UNZ_BADZIPFILE;
+
+ pfile_in_zip_read_info = (file_in_zip_read_info_s*)
+ ALLOC(sizeof(file_in_zip_read_info_s));
+ if (pfile_in_zip_read_info==NULL)
+ return UNZ_INTERNALERROR;
+
+ pfile_in_zip_read_info->read_buffer=(char*)ALLOC(UNZ_BUFSIZE);
+ pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield;
+ pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield;
+ pfile_in_zip_read_info->pos_local_extrafield=0;
+
+ if (pfile_in_zip_read_info->read_buffer==NULL)
+ {
+ TRYFREE(pfile_in_zip_read_info);
+ return UNZ_INTERNALERROR;
+ }
+
+ pfile_in_zip_read_info->stream_initialised=0;
+
+ if ((s->cur_file_info.compression_method!=0) &&
+ (s->cur_file_info.compression_method!=Z_DEFLATED))
+ err=UNZ_BADZIPFILE;
+ Store = s->cur_file_info.compression_method==0;
+
+ pfile_in_zip_read_info->crc32_wait=s->cur_file_info.crc;
+ pfile_in_zip_read_info->crc32=0;
+ pfile_in_zip_read_info->compression_method =
+ s->cur_file_info.compression_method;
+ pfile_in_zip_read_info->file=s->file;
+ pfile_in_zip_read_info->byte_before_the_zipfile=s->byte_before_the_zipfile;
+
+ pfile_in_zip_read_info->stream.total_out = 0;
+
+ if (!Store)
+ {
+ pfile_in_zip_read_info->stream.zalloc = (alloc_func)0;
+ pfile_in_zip_read_info->stream.zfree = (free_func)0;
+ pfile_in_zip_read_info->stream.opaque = (voidpf)0;
+
+ err=inflateInit2(&pfile_in_zip_read_info->stream, -MAX_WBITS);
+ if (err == Z_OK)
+ pfile_in_zip_read_info->stream_initialised=1;
+ /* windowBits is passed < 0 to tell that there is no zlib header.
+ * Note that in this case inflate *requires* an extra "dummy" byte
+ * after the compressed stream in order to complete decompression and
+ * return Z_STREAM_END.
+ * In unzip, i don't wait absolutely Z_STREAM_END because I known the
+ * size of both compressed and uncompressed data
+ */
+ }
+ pfile_in_zip_read_info->rest_read_compressed =
+ s->cur_file_info.compressed_size ;
+ pfile_in_zip_read_info->rest_read_uncompressed =
+ s->cur_file_info.uncompressed_size ;
+
+
+ pfile_in_zip_read_info->pos_in_zipfile =
+ s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER +
+ iSizeVar;
+
+ pfile_in_zip_read_info->stream.avail_in = (uInt)0;
+
+
+ s->pfile_in_zip_read = pfile_in_zip_read_info;
+ return UNZ_OK;
+}
+
+
+/*
+ Read bytes from the current file.
+ buf contain buffer where data must be copied
+ len the size of buf.
+
+ return the number of byte copied if somes bytes are copied
+ return 0 if the end of file was reached
+ return <0 with error code if there is an error
+ (UNZ_ERRNO for IO error, or zLib error for uncompress error)
+*/
+extern int ZEXPORT unzReadCurrentFile (file, buf, len)
+ unzFile file;
+ voidp buf;
+ unsigned len;
+{
+ int err=UNZ_OK;
+ uInt iRead = 0;
+ unz_s* s;
+ file_in_zip_read_info_s* pfile_in_zip_read_info;
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+ pfile_in_zip_read_info=s->pfile_in_zip_read;
+
+ if (pfile_in_zip_read_info==NULL)
+ return UNZ_PARAMERROR;
+
+
+ if ((pfile_in_zip_read_info->read_buffer == NULL))
+ return UNZ_END_OF_LIST_OF_FILE;
+ if (len==0)
+ return 0;
+
+ pfile_in_zip_read_info->stream.next_out = (Bytef*)buf;
+
+ pfile_in_zip_read_info->stream.avail_out = (uInt)len;
+
+ if (len>pfile_in_zip_read_info->rest_read_uncompressed)
+ pfile_in_zip_read_info->stream.avail_out =
+ (uInt)pfile_in_zip_read_info->rest_read_uncompressed;
+
+ while (pfile_in_zip_read_info->stream.avail_out>0)
+ {
+ if ((pfile_in_zip_read_info->stream.avail_in==0) &&
+ (pfile_in_zip_read_info->rest_read_compressed>0))
+ {
+ uInt uReadThis = UNZ_BUFSIZE;
+ if (pfile_in_zip_read_info->rest_read_compressed<uReadThis)
+ uReadThis = (uInt)pfile_in_zip_read_info->rest_read_compressed;
+ if (uReadThis == 0)
+ return UNZ_EOF;
+ if (fseek(pfile_in_zip_read_info->file,
+ pfile_in_zip_read_info->pos_in_zipfile +
+ pfile_in_zip_read_info->byte_before_the_zipfile,SEEK_SET)!=0)
+ return UNZ_ERRNO;
+ if (fread(pfile_in_zip_read_info->read_buffer,uReadThis,1,
+ pfile_in_zip_read_info->file)!=1)
+ return UNZ_ERRNO;
+ pfile_in_zip_read_info->pos_in_zipfile += uReadThis;
+
+ pfile_in_zip_read_info->rest_read_compressed-=uReadThis;
+
+ pfile_in_zip_read_info->stream.next_in =
+ (Bytef*)pfile_in_zip_read_info->read_buffer;
+ pfile_in_zip_read_info->stream.avail_in = (uInt)uReadThis;
+ }
+
+ if (pfile_in_zip_read_info->compression_method==0)
+ {
+ uInt uDoCopy,i ;
+ if (pfile_in_zip_read_info->stream.avail_out <
+ pfile_in_zip_read_info->stream.avail_in)
+ uDoCopy = pfile_in_zip_read_info->stream.avail_out ;
+ else
+ uDoCopy = pfile_in_zip_read_info->stream.avail_in ;
+
+ for (i=0;i<uDoCopy;i++)
+ *(pfile_in_zip_read_info->stream.next_out+i) =
+ *(pfile_in_zip_read_info->stream.next_in+i);
+
+ pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32,
+ pfile_in_zip_read_info->stream.next_out,
+ uDoCopy);
+ pfile_in_zip_read_info->rest_read_uncompressed-=uDoCopy;
+ pfile_in_zip_read_info->stream.avail_in -= uDoCopy;
+ pfile_in_zip_read_info->stream.avail_out -= uDoCopy;
+ pfile_in_zip_read_info->stream.next_out += uDoCopy;
+ pfile_in_zip_read_info->stream.next_in += uDoCopy;
+ pfile_in_zip_read_info->stream.total_out += uDoCopy;
+ iRead += uDoCopy;
+ }
+ else
+ {
+ uLong uTotalOutBefore,uTotalOutAfter;
+ const Bytef *bufBefore;
+ uLong uOutThis;
+ int flush=Z_SYNC_FLUSH;
+
+ uTotalOutBefore = pfile_in_zip_read_info->stream.total_out;
+ bufBefore = pfile_in_zip_read_info->stream.next_out;
+
+ /*
+ if ((pfile_in_zip_read_info->rest_read_uncompressed ==
+ pfile_in_zip_read_info->stream.avail_out) &&
+ (pfile_in_zip_read_info->rest_read_compressed == 0))
+ flush = Z_FINISH;
+ */
+ err=inflate(&pfile_in_zip_read_info->stream,flush);
+
+ uTotalOutAfter = pfile_in_zip_read_info->stream.total_out;
+ uOutThis = uTotalOutAfter-uTotalOutBefore;
+
+ pfile_in_zip_read_info->crc32 =
+ crc32(pfile_in_zip_read_info->crc32,bufBefore,
+ (uInt)(uOutThis));
+
+ pfile_in_zip_read_info->rest_read_uncompressed -=
+ uOutThis;
+
+ iRead += (uInt)(uTotalOutAfter - uTotalOutBefore);
+
+ if (err==Z_STREAM_END)
+ return (iRead==0) ? UNZ_EOF : iRead;
+ if (err!=Z_OK)
+ break;
+ }
+ }
+
+ if (err==Z_OK)
+ return iRead;
+ return err;
+}
+
+
+/*
+ Give the current position in uncompressed data
+*/
+extern z_off_t ZEXPORT unztell (file)
+ unzFile file;
+{
+ unz_s* s;
+ file_in_zip_read_info_s* pfile_in_zip_read_info;
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+ pfile_in_zip_read_info=s->pfile_in_zip_read;
+
+ if (pfile_in_zip_read_info==NULL)
+ return UNZ_PARAMERROR;
+
+ return (z_off_t)pfile_in_zip_read_info->stream.total_out;
+}
+
+
+/*
+ return 1 if the end of file was reached, 0 elsewhere
+*/
+extern int ZEXPORT unzeof (file)
+ unzFile file;
+{
+ unz_s* s;
+ file_in_zip_read_info_s* pfile_in_zip_read_info;
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+ pfile_in_zip_read_info=s->pfile_in_zip_read;
+
+ if (pfile_in_zip_read_info==NULL)
+ return UNZ_PARAMERROR;
+
+ if (pfile_in_zip_read_info->rest_read_uncompressed == 0)
+ return 1;
+ else
+ return 0;
+}
+
+
+
+/*
+ Read extra field from the current file (opened by unzOpenCurrentFile)
+ This is the local-header version of the extra field (sometimes, there is
+ more info in the local-header version than in the central-header)
+
+ if buf==NULL, it return the size of the local extra field that can be read
+
+ if buf!=NULL, len is the size of the buffer, the extra header is copied in
+ buf.
+ the return value is the number of bytes copied in buf, or (if <0)
+ the error code
+*/
+extern int ZEXPORT unzGetLocalExtrafield (file,buf,len)
+ unzFile file;
+ voidp buf;
+ unsigned len;
+{
+ unz_s* s;
+ file_in_zip_read_info_s* pfile_in_zip_read_info;
+ uInt read_now;
+ uLong size_to_read;
+
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+ pfile_in_zip_read_info=s->pfile_in_zip_read;
+
+ if (pfile_in_zip_read_info==NULL)
+ return UNZ_PARAMERROR;
+
+ size_to_read = (pfile_in_zip_read_info->size_local_extrafield -
+ pfile_in_zip_read_info->pos_local_extrafield);
+
+ if (buf==NULL)
+ return (int)size_to_read;
+
+ if (len>size_to_read)
+ read_now = (uInt)size_to_read;
+ else
+ read_now = (uInt)len ;
+
+ if (read_now==0)
+ return 0;
+
+ if (fseek(pfile_in_zip_read_info->file,
+ pfile_in_zip_read_info->offset_local_extrafield +
+ pfile_in_zip_read_info->pos_local_extrafield,SEEK_SET)!=0)
+ return UNZ_ERRNO;
+
+ if (fread(buf,(uInt)size_to_read,1,pfile_in_zip_read_info->file)!=1)
+ return UNZ_ERRNO;
+
+ return (int)read_now;
+}
+
+/*
+ Close the file in zip opened with unzipOpenCurrentFile
+ Return UNZ_CRCERROR if all the file was read but the CRC is not good
+*/
+extern int ZEXPORT unzCloseCurrentFile (file)
+ unzFile file;
+{
+ int err=UNZ_OK;
+
+ unz_s* s;
+ file_in_zip_read_info_s* pfile_in_zip_read_info;
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+ pfile_in_zip_read_info=s->pfile_in_zip_read;
+
+ if (pfile_in_zip_read_info==NULL)
+ return UNZ_PARAMERROR;
+
+
+ if (pfile_in_zip_read_info->rest_read_uncompressed == 0)
+ {
+ if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait)
+ err=UNZ_CRCERROR;
+ }
+
+
+ TRYFREE(pfile_in_zip_read_info->read_buffer);
+ pfile_in_zip_read_info->read_buffer = NULL;
+ if (pfile_in_zip_read_info->stream_initialised)
+ inflateEnd(&pfile_in_zip_read_info->stream);
+
+ pfile_in_zip_read_info->stream_initialised = 0;
+ TRYFREE(pfile_in_zip_read_info);
+
+ s->pfile_in_zip_read=NULL;
+
+ return err;
+}
+
+
+/*
+ Get the global comment string of the ZipFile, in the szComment buffer.
+ uSizeBuf is the size of the szComment buffer.
+ return the number of byte copied or an error code <0
+*/
+extern int ZEXPORT unzGetGlobalComment (file, szComment, uSizeBuf)
+ unzFile file;
+ char *szComment;
+ uLong uSizeBuf;
+{
+ int err=UNZ_OK;
+ unz_s* s;
+ uLong uReadThis ;
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz_s*)file;
+
+ uReadThis = uSizeBuf;
+ if (uReadThis>s->gi.size_comment)
+ uReadThis = s->gi.size_comment;
+
+ if (fseek(s->file,s->central_pos+22,SEEK_SET)!=0)
+ return UNZ_ERRNO;
+
+ if (uReadThis>0)
+ {
+ *szComment='\0';
+ if (fread(szComment,(uInt)uReadThis,1,s->file)!=1)
+ return UNZ_ERRNO;
+ }
+
+ if ((szComment != NULL) && (uSizeBuf > s->gi.size_comment))
+ *(szComment+s->gi.size_comment)='\0';
+ return (int)uReadThis;
+}
diff --git a/zlib/contrib/minizip/unzip.def b/zlib/contrib/minizip/unzip.def
new file mode 100644
index 00000000000..f6ede89bc96
--- /dev/null
+++ b/zlib/contrib/minizip/unzip.def
@@ -0,0 +1,15 @@
+ unzOpen @61
+ unzClose @62
+ unzGetGlobalInfo @63
+ unzGetCurrentFileInfo @64
+ unzGoToFirstFile @65
+ unzGoToNextFile @66
+ unzOpenCurrentFile @67
+ unzReadCurrentFile @68
+ unztell @70
+ unzeof @71
+ unzCloseCurrentFile @72
+ unzGetGlobalComment @73
+ unzStringFileNameCompare @74
+ unzLocateFile @75
+ unzGetLocalExtrafield @76
diff --git a/zlib/contrib/minizip/unzip.h b/zlib/contrib/minizip/unzip.h
new file mode 100644
index 00000000000..76692cb703c
--- /dev/null
+++ b/zlib/contrib/minizip/unzip.h
@@ -0,0 +1,275 @@
+/* unzip.h -- IO for uncompress .zip files using zlib
+ Version 0.15 beta, Mar 19th, 1998,
+
+ Copyright (C) 1998 Gilles Vollant
+
+ This unzip package allow extract file from .ZIP file, compatible with PKZip 2.04g
+ WinZip, InfoZip tools and compatible.
+ Encryption and multi volume ZipFile (span) are not supported.
+ Old compressions used by old PKZip 1.x are not supported
+
+ THIS IS AN ALPHA VERSION. AT THIS STAGE OF DEVELOPPEMENT, SOMES API OR STRUCTURE
+ CAN CHANGE IN FUTURE VERSION !!
+ I WAIT FEEDBACK at mail info@winimage.com
+ Visit also http://www.winimage.com/zLibDll/unzip.htm for evolution
+
+ Condition of use and distribution are the same than zlib :
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
+
+*/
+/* for more info about .ZIP format, see
+ ftp://ftp.cdrom.com/pub/infozip/doc/appnote-970311-iz.zip
+ PkWare has also a specification at :
+ ftp://ftp.pkware.com/probdesc.zip */
+
+#ifndef _unz_H
+#define _unz_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef _ZLIB_H
+#include "zlib.h"
+#endif
+
+#if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP)
+/* like the STRICT of WIN32, we define a pointer that cannot be converted
+ from (void*) without cast */
+typedef struct TagunzFile__ { int unused; } unzFile__;
+typedef unzFile__ *unzFile;
+#else
+typedef voidp unzFile;
+#endif
+
+
+#define UNZ_OK (0)
+#define UNZ_END_OF_LIST_OF_FILE (-100)
+#define UNZ_ERRNO (Z_ERRNO)
+#define UNZ_EOF (0)
+#define UNZ_PARAMERROR (-102)
+#define UNZ_BADZIPFILE (-103)
+#define UNZ_INTERNALERROR (-104)
+#define UNZ_CRCERROR (-105)
+
+/* tm_unz contain date/time info */
+typedef struct tm_unz_s
+{
+ uInt tm_sec; /* seconds after the minute - [0,59] */
+ uInt tm_min; /* minutes after the hour - [0,59] */
+ uInt tm_hour; /* hours since midnight - [0,23] */
+ uInt tm_mday; /* day of the month - [1,31] */
+ uInt tm_mon; /* months since January - [0,11] */
+ uInt tm_year; /* years - [1980..2044] */
+} tm_unz;
+
+/* unz_global_info structure contain global data about the ZIPfile
+ These data comes from the end of central dir */
+typedef struct unz_global_info_s
+{
+ uLong number_entry; /* total number of entries in
+ the central dir on this disk */
+ uLong size_comment; /* size of the global comment of the zipfile */
+} unz_global_info;
+
+
+/* unz_file_info contain information about a file in the zipfile */
+typedef struct unz_file_info_s
+{
+ uLong version; /* version made by 2 bytes */
+ uLong version_needed; /* version needed to extract 2 bytes */
+ uLong flag; /* general purpose bit flag 2 bytes */
+ uLong compression_method; /* compression method 2 bytes */
+ uLong dosDate; /* last mod file date in Dos fmt 4 bytes */
+ uLong crc; /* crc-32 4 bytes */
+ uLong compressed_size; /* compressed size 4 bytes */
+ uLong uncompressed_size; /* uncompressed size 4 bytes */
+ uLong size_filename; /* filename length 2 bytes */
+ uLong size_file_extra; /* extra field length 2 bytes */
+ uLong size_file_comment; /* file comment length 2 bytes */
+
+ uLong disk_num_start; /* disk number start 2 bytes */
+ uLong internal_fa; /* internal file attributes 2 bytes */
+ uLong external_fa; /* external file attributes 4 bytes */
+
+ tm_unz tmu_date;
+} unz_file_info;
+
+extern int ZEXPORT unzStringFileNameCompare OF ((const char* fileName1,
+ const char* fileName2,
+ int iCaseSensitivity));
+/*
+ Compare two filename (fileName1,fileName2).
+ If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp)
+ If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi
+ or strcasecmp)
+ If iCaseSenisivity = 0, case sensitivity is defaut of your operating system
+ (like 1 on Unix, 2 on Windows)
+*/
+
+
+extern unzFile ZEXPORT unzOpen OF((const char *path));
+/*
+ Open a Zip file. path contain the full pathname (by example,
+ on a Windows NT computer "c:\\zlib\\zlib111.zip" or on an Unix computer
+ "zlib/zlib111.zip".
+ If the zipfile cannot be opened (file don't exist or in not valid), the
+ return value is NULL.
+ Else, the return value is a unzFile Handle, usable with other function
+ of this unzip package.
+*/
+
+extern int ZEXPORT unzClose OF((unzFile file));
+/*
+ Close a ZipFile opened with unzipOpen.
+ If there is files inside the .Zip opened with unzOpenCurrentFile (see later),
+ these files MUST be closed with unzipCloseCurrentFile before call unzipClose.
+ return UNZ_OK if there is no problem. */
+
+extern int ZEXPORT unzGetGlobalInfo OF((unzFile file,
+ unz_global_info *pglobal_info));
+/*
+ Write info about the ZipFile in the *pglobal_info structure.
+ No preparation of the structure is needed
+ return UNZ_OK if there is no problem. */
+
+
+extern int ZEXPORT unzGetGlobalComment OF((unzFile file,
+ char *szComment,
+ uLong uSizeBuf));
+/*
+ Get the global comment string of the ZipFile, in the szComment buffer.
+ uSizeBuf is the size of the szComment buffer.
+ return the number of byte copied or an error code <0
+*/
+
+
+/***************************************************************************/
+/* Unzip package allow you browse the directory of the zipfile */
+
+extern int ZEXPORT unzGoToFirstFile OF((unzFile file));
+/*
+ Set the current file of the zipfile to the first file.
+ return UNZ_OK if there is no problem
+*/
+
+extern int ZEXPORT unzGoToNextFile OF((unzFile file));
+/*
+ Set the current file of the zipfile to the next file.
+ return UNZ_OK if there is no problem
+ return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest.
+*/
+
+extern int ZEXPORT unzLocateFile OF((unzFile file,
+ const char *szFileName,
+ int iCaseSensitivity));
+/*
+ Try locate the file szFileName in the zipfile.
+ For the iCaseSensitivity signification, see unzStringFileNameCompare
+
+ return value :
+ UNZ_OK if the file is found. It becomes the current file.
+ UNZ_END_OF_LIST_OF_FILE if the file is not found
+*/
+
+
+extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file,
+ unz_file_info *pfile_info,
+ char *szFileName,
+ uLong fileNameBufferSize,
+ void *extraField,
+ uLong extraFieldBufferSize,
+ char *szComment,
+ uLong commentBufferSize));
+/*
+ Get Info about the current file
+ if pfile_info!=NULL, the *pfile_info structure will contain somes info about
+ the current file
+ if szFileName!=NULL, the filemane string will be copied in szFileName
+ (fileNameBufferSize is the size of the buffer)
+ if extraField!=NULL, the extra field information will be copied in extraField
+ (extraFieldBufferSize is the size of the buffer).
+ This is the Central-header version of the extra field
+ if szComment!=NULL, the comment string of the file will be copied in szComment
+ (commentBufferSize is the size of the buffer)
+*/
+
+/***************************************************************************/
+/* for reading the content of the current zipfile, you can open it, read data
+ from it, and close it (you can close it before reading all the file)
+ */
+
+extern int ZEXPORT unzOpenCurrentFile OF((unzFile file));
+/*
+ Open for reading data the current file in the zipfile.
+ If there is no error, the return value is UNZ_OK.
+*/
+
+extern int ZEXPORT unzCloseCurrentFile OF((unzFile file));
+/*
+ Close the file in zip opened with unzOpenCurrentFile
+ Return UNZ_CRCERROR if all the file was read but the CRC is not good
+*/
+
+
+extern int ZEXPORT unzReadCurrentFile OF((unzFile file,
+ voidp buf,
+ unsigned len));
+/*
+ Read bytes from the current file (opened by unzOpenCurrentFile)
+ buf contain buffer where data must be copied
+ len the size of buf.
+
+ return the number of byte copied if somes bytes are copied
+ return 0 if the end of file was reached
+ return <0 with error code if there is an error
+ (UNZ_ERRNO for IO error, or zLib error for uncompress error)
+*/
+
+extern z_off_t ZEXPORT unztell OF((unzFile file));
+/*
+ Give the current position in uncompressed data
+*/
+
+extern int ZEXPORT unzeof OF((unzFile file));
+/*
+ return 1 if the end of file was reached, 0 elsewhere
+*/
+
+extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file,
+ voidp buf,
+ unsigned len));
+/*
+ Read extra field from the current file (opened by unzOpenCurrentFile)
+ This is the local-header version of the extra field (sometimes, there is
+ more info in the local-header version than in the central-header)
+
+ if buf==NULL, it return the size of the local extra field
+
+ if buf!=NULL, len is the size of the buffer, the extra header is copied in
+ buf.
+ the return value is the number of bytes copied in buf, or (if <0)
+ the error code
+*/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _unz_H */
diff --git a/zlib/contrib/minizip/zip.c b/zlib/contrib/minizip/zip.c
new file mode 100644
index 00000000000..0cae64ab7b1
--- /dev/null
+++ b/zlib/contrib/minizip/zip.c
@@ -0,0 +1,718 @@
+/* zip.c -- IO on .zip files using zlib
+ Version 0.15 beta, Mar 19th, 1998,
+
+ Read zip.h for more info
+*/
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "zlib.h"
+#include "zip.h"
+
+#ifdef STDC
+# include <stddef.h>
+# include <string.h>
+# include <stdlib.h>
+#endif
+#ifdef NO_ERRNO_H
+ extern int errno;
+#else
+# include <errno.h>
+#endif
+
+
+#ifndef local
+# define local static
+#endif
+/* compile with -Dlocal if your debugger can't find static symbols */
+
+#ifndef VERSIONMADEBY
+# define VERSIONMADEBY (0x0) /* platform depedent */
+#endif
+
+#ifndef Z_BUFSIZE
+#define Z_BUFSIZE (16384)
+#endif
+
+#ifndef Z_MAXFILENAMEINZIP
+#define Z_MAXFILENAMEINZIP (256)
+#endif
+
+#ifndef ALLOC
+# define ALLOC(size) (malloc(size))
+#endif
+#ifndef TRYFREE
+# define TRYFREE(p) {if (p) free(p);}
+#endif
+
+/*
+#define SIZECENTRALDIRITEM (0x2e)
+#define SIZEZIPLOCALHEADER (0x1e)
+*/
+
+/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */
+
+#ifndef SEEK_CUR
+#define SEEK_CUR 1
+#endif
+
+#ifndef SEEK_END
+#define SEEK_END 2
+#endif
+
+#ifndef SEEK_SET
+#define SEEK_SET 0
+#endif
+
+const char zip_copyright[] =
+ " zip 0.15 Copyright 1998 Gilles Vollant ";
+
+
+#define SIZEDATA_INDATABLOCK (4096-(4*4))
+
+#define LOCALHEADERMAGIC (0x04034b50)
+#define CENTRALHEADERMAGIC (0x02014b50)
+#define ENDHEADERMAGIC (0x06054b50)
+
+#define FLAG_LOCALHEADER_OFFSET (0x06)
+#define CRC_LOCALHEADER_OFFSET (0x0e)
+
+#define SIZECENTRALHEADER (0x2e) /* 46 */
+
+typedef struct linkedlist_datablock_internal_s
+{
+ struct linkedlist_datablock_internal_s* next_datablock;
+ uLong avail_in_this_block;
+ uLong filled_in_this_block;
+ uLong unused; /* for future use and alignement */
+ unsigned char data[SIZEDATA_INDATABLOCK];
+} linkedlist_datablock_internal;
+
+typedef struct linkedlist_data_s
+{
+ linkedlist_datablock_internal* first_block;
+ linkedlist_datablock_internal* last_block;
+} linkedlist_data;
+
+
+typedef struct
+{
+ z_stream stream; /* zLib stream structure for inflate */
+ int stream_initialised; /* 1 is stream is initialised */
+ uInt pos_in_buffered_data; /* last written byte in buffered_data */
+
+ uLong pos_local_header; /* offset of the local header of the file
+ currenty writing */
+ char* central_header; /* central header data for the current file */
+ uLong size_centralheader; /* size of the central header for cur file */
+ uLong flag; /* flag of the file currently writing */
+
+ int method; /* compression method of file currenty wr.*/
+ Byte buffered_data[Z_BUFSIZE];/* buffer contain compressed data to be writ*/
+ uLong dosDate;
+ uLong crc32;
+} curfile_info;
+
+typedef struct
+{
+ FILE * filezip;
+ linkedlist_data central_dir;/* datablock with central dir in construction*/
+ int in_opened_file_inzip; /* 1 if a file in the zip is currently writ.*/
+ curfile_info ci; /* info on the file curretly writing */
+
+ uLong begin_pos; /* position of the beginning of the zipfile */
+ uLong number_entry;
+} zip_internal;
+
+local linkedlist_datablock_internal* allocate_new_datablock()
+{
+ linkedlist_datablock_internal* ldi;
+ ldi = (linkedlist_datablock_internal*)
+ ALLOC(sizeof(linkedlist_datablock_internal));
+ if (ldi!=NULL)
+ {
+ ldi->next_datablock = NULL ;
+ ldi->filled_in_this_block = 0 ;
+ ldi->avail_in_this_block = SIZEDATA_INDATABLOCK ;
+ }
+ return ldi;
+}
+
+local void free_datablock(ldi)
+ linkedlist_datablock_internal* ldi;
+{
+ while (ldi!=NULL)
+ {
+ linkedlist_datablock_internal* ldinext = ldi->next_datablock;
+ TRYFREE(ldi);
+ ldi = ldinext;
+ }
+}
+
+local void init_linkedlist(ll)
+ linkedlist_data* ll;
+{
+ ll->first_block = ll->last_block = NULL;
+}
+
+local void free_linkedlist(ll)
+ linkedlist_data* ll;
+{
+ free_datablock(ll->first_block);
+ ll->first_block = ll->last_block = NULL;
+}
+
+
+local int add_data_in_datablock(ll,buf,len)
+ linkedlist_data* ll;
+ const void* buf;
+ uLong len;
+{
+ linkedlist_datablock_internal* ldi;
+ const unsigned char* from_copy;
+
+ if (ll==NULL)
+ return ZIP_INTERNALERROR;
+
+ if (ll->last_block == NULL)
+ {
+ ll->first_block = ll->last_block = allocate_new_datablock();
+ if (ll->first_block == NULL)
+ return ZIP_INTERNALERROR;
+ }
+
+ ldi = ll->last_block;
+ from_copy = (unsigned char*)buf;
+
+ while (len>0)
+ {
+ uInt copy_this;
+ uInt i;
+ unsigned char* to_copy;
+
+ if (ldi->avail_in_this_block==0)
+ {
+ ldi->next_datablock = allocate_new_datablock();
+ if (ldi->next_datablock == NULL)
+ return ZIP_INTERNALERROR;
+ ldi = ldi->next_datablock ;
+ ll->last_block = ldi;
+ }
+
+ if (ldi->avail_in_this_block < len)
+ copy_this = (uInt)ldi->avail_in_this_block;
+ else
+ copy_this = (uInt)len;
+
+ to_copy = &(ldi->data[ldi->filled_in_this_block]);
+
+ for (i=0;i<copy_this;i++)
+ *(to_copy+i)=*(from_copy+i);
+
+ ldi->filled_in_this_block += copy_this;
+ ldi->avail_in_this_block -= copy_this;
+ from_copy += copy_this ;
+ len -= copy_this;
+ }
+ return ZIP_OK;
+}
+
+
+local int write_datablock(fout,ll)
+ FILE * fout;
+ linkedlist_data* ll;
+{
+ linkedlist_datablock_internal* ldi;
+ ldi = ll->first_block;
+ while (ldi!=NULL)
+ {
+ if (ldi->filled_in_this_block > 0)
+ if (fwrite(ldi->data,(uInt)ldi->filled_in_this_block,1,fout)!=1)
+ return ZIP_ERRNO;
+ ldi = ldi->next_datablock;
+ }
+ return ZIP_OK;
+}
+
+/****************************************************************************/
+
+/* ===========================================================================
+ Outputs a long in LSB order to the given file
+ nbByte == 1, 2 or 4 (byte, short or long)
+*/
+
+local int ziplocal_putValue OF((FILE *file, uLong x, int nbByte));
+local int ziplocal_putValue (file, x, nbByte)
+ FILE *file;
+ uLong x;
+ int nbByte;
+{
+ unsigned char buf[4];
+ int n;
+ for (n = 0; n < nbByte; n++) {
+ buf[n] = (unsigned char)(x & 0xff);
+ x >>= 8;
+ }
+ if (fwrite(buf,nbByte,1,file)!=1)
+ return ZIP_ERRNO;
+ else
+ return ZIP_OK;
+}
+
+local void ziplocal_putValue_inmemory OF((void* dest, uLong x, int nbByte));
+local void ziplocal_putValue_inmemory (dest, x, nbByte)
+ void* dest;
+ uLong x;
+ int nbByte;
+{
+ unsigned char* buf=(unsigned char*)dest;
+ int n;
+ for (n = 0; n < nbByte; n++) {
+ buf[n] = (unsigned char)(x & 0xff);
+ x >>= 8;
+ }
+}
+/****************************************************************************/
+
+
+local uLong ziplocal_TmzDateToDosDate(ptm,dosDate)
+ tm_zip* ptm;
+ uLong dosDate;
+{
+ uLong year = (uLong)ptm->tm_year;
+ if (year>1980)
+ year-=1980;
+ else if (year>80)
+ year-=80;
+ return
+ (uLong) (((ptm->tm_mday) + (32 * (ptm->tm_mon+1)) + (512 * year)) << 16) |
+ ((ptm->tm_sec/2) + (32* ptm->tm_min) + (2048 * (uLong)ptm->tm_hour));
+}
+
+
+/****************************************************************************/
+
+extern zipFile ZEXPORT zipOpen (pathname, append)
+ const char *pathname;
+ int append;
+{
+ zip_internal ziinit;
+ zip_internal* zi;
+
+ ziinit.filezip = fopen(pathname,(append == 0) ? "wb" : "ab");
+ if (ziinit.filezip == NULL)
+ return NULL;
+ ziinit.begin_pos = ftell(ziinit.filezip);
+ ziinit.in_opened_file_inzip = 0;
+ ziinit.ci.stream_initialised = 0;
+ ziinit.number_entry = 0;
+ init_linkedlist(&(ziinit.central_dir));
+
+
+ zi = (zip_internal*)ALLOC(sizeof(zip_internal));
+ if (zi==NULL)
+ {
+ fclose(ziinit.filezip);
+ return NULL;
+ }
+
+ *zi = ziinit;
+ return (zipFile)zi;
+}
+
+extern int ZEXPORT zipOpenNewFileInZip (file, filename, zipfi,
+ extrafield_local, size_extrafield_local,
+ extrafield_global, size_extrafield_global,
+ comment, method, level)
+ zipFile file;
+ const char* filename;
+ const zip_fileinfo* zipfi;
+ const void* extrafield_local;
+ uInt size_extrafield_local;
+ const void* extrafield_global;
+ uInt size_extrafield_global;
+ const char* comment;
+ int method;
+ int level;
+{
+ zip_internal* zi;
+ uInt size_filename;
+ uInt size_comment;
+ uInt i;
+ int err = ZIP_OK;
+
+ if (file == NULL)
+ return ZIP_PARAMERROR;
+ if ((method!=0) && (method!=Z_DEFLATED))
+ return ZIP_PARAMERROR;
+
+ zi = (zip_internal*)file;
+
+ if (zi->in_opened_file_inzip == 1)
+ {
+ err = zipCloseFileInZip (file);
+ if (err != ZIP_OK)
+ return err;
+ }
+
+
+ if (filename==NULL)
+ filename="-";
+
+ if (comment==NULL)
+ size_comment = 0;
+ else
+ size_comment = strlen(comment);
+
+ size_filename = strlen(filename);
+
+ if (zipfi == NULL)
+ zi->ci.dosDate = 0;
+ else
+ {
+ if (zipfi->dosDate != 0)
+ zi->ci.dosDate = zipfi->dosDate;
+ else zi->ci.dosDate = ziplocal_TmzDateToDosDate(&zipfi->tmz_date,zipfi->dosDate);
+ }
+
+ zi->ci.flag = 0;
+ if ((level==8) || (level==9))
+ zi->ci.flag |= 2;
+ if ((level==2))
+ zi->ci.flag |= 4;
+ if ((level==1))
+ zi->ci.flag |= 6;
+
+ zi->ci.crc32 = 0;
+ zi->ci.method = method;
+ zi->ci.stream_initialised = 0;
+ zi->ci.pos_in_buffered_data = 0;
+ zi->ci.pos_local_header = ftell(zi->filezip);
+ zi->ci.size_centralheader = SIZECENTRALHEADER + size_filename +
+ size_extrafield_global + size_comment;
+ zi->ci.central_header = (char*)ALLOC((uInt)zi->ci.size_centralheader);
+
+ ziplocal_putValue_inmemory(zi->ci.central_header,(uLong)CENTRALHEADERMAGIC,4);
+ /* version info */
+ ziplocal_putValue_inmemory(zi->ci.central_header+4,(uLong)VERSIONMADEBY,2);
+ ziplocal_putValue_inmemory(zi->ci.central_header+6,(uLong)20,2);
+ ziplocal_putValue_inmemory(zi->ci.central_header+8,(uLong)zi->ci.flag,2);
+ ziplocal_putValue_inmemory(zi->ci.central_header+10,(uLong)zi->ci.method,2);
+ ziplocal_putValue_inmemory(zi->ci.central_header+12,(uLong)zi->ci.dosDate,4);
+ ziplocal_putValue_inmemory(zi->ci.central_header+16,(uLong)0,4); /*crc*/
+ ziplocal_putValue_inmemory(zi->ci.central_header+20,(uLong)0,4); /*compr size*/
+ ziplocal_putValue_inmemory(zi->ci.central_header+24,(uLong)0,4); /*uncompr size*/
+ ziplocal_putValue_inmemory(zi->ci.central_header+28,(uLong)size_filename,2);
+ ziplocal_putValue_inmemory(zi->ci.central_header+30,(uLong)size_extrafield_global,2);
+ ziplocal_putValue_inmemory(zi->ci.central_header+32,(uLong)size_comment,2);
+ ziplocal_putValue_inmemory(zi->ci.central_header+34,(uLong)0,2); /*disk nm start*/
+
+ if (zipfi==NULL)
+ ziplocal_putValue_inmemory(zi->ci.central_header+36,(uLong)0,2);
+ else
+ ziplocal_putValue_inmemory(zi->ci.central_header+36,(uLong)zipfi->internal_fa,2);
+
+ if (zipfi==NULL)
+ ziplocal_putValue_inmemory(zi->ci.central_header+38,(uLong)0,4);
+ else
+ ziplocal_putValue_inmemory(zi->ci.central_header+38,(uLong)zipfi->external_fa,4);
+
+ ziplocal_putValue_inmemory(zi->ci.central_header+42,(uLong)zi->ci.pos_local_header,4);
+
+ for (i=0;i<size_filename;i++)
+ *(zi->ci.central_header+SIZECENTRALHEADER+i) = *(filename+i);
+
+ for (i=0;i<size_extrafield_global;i++)
+ *(zi->ci.central_header+SIZECENTRALHEADER+size_filename+i) =
+ *(((const char*)extrafield_global)+i);
+
+ for (i=0;i<size_comment;i++)
+ *(zi->ci.central_header+SIZECENTRALHEADER+size_filename+
+ size_extrafield_global+i) = *(filename+i);
+ if (zi->ci.central_header == NULL)
+ return ZIP_INTERNALERROR;
+
+ /* write the local header */
+ err = ziplocal_putValue(zi->filezip,(uLong)LOCALHEADERMAGIC,4);
+
+ if (err==ZIP_OK)
+ err = ziplocal_putValue(zi->filezip,(uLong)20,2);/* version needed to extract */
+ if (err==ZIP_OK)
+ err = ziplocal_putValue(zi->filezip,(uLong)zi->ci.flag,2);
+
+ if (err==ZIP_OK)
+ err = ziplocal_putValue(zi->filezip,(uLong)zi->ci.method,2);
+
+ if (err==ZIP_OK)
+ err = ziplocal_putValue(zi->filezip,(uLong)zi->ci.dosDate,4);
+
+ if (err==ZIP_OK)
+ err = ziplocal_putValue(zi->filezip,(uLong)0,4); /* crc 32, unknown */
+ if (err==ZIP_OK)
+ err = ziplocal_putValue(zi->filezip,(uLong)0,4); /* compressed size, unknown */
+ if (err==ZIP_OK)
+ err = ziplocal_putValue(zi->filezip,(uLong)0,4); /* uncompressed size, unknown */
+
+ if (err==ZIP_OK)
+ err = ziplocal_putValue(zi->filezip,(uLong)size_filename,2);
+
+ if (err==ZIP_OK)
+ err = ziplocal_putValue(zi->filezip,(uLong)size_extrafield_local,2);
+
+ if ((err==ZIP_OK) && (size_filename>0))
+ if (fwrite(filename,(uInt)size_filename,1,zi->filezip)!=1)
+ err = ZIP_ERRNO;
+
+ if ((err==ZIP_OK) && (size_extrafield_local>0))
+ if (fwrite(extrafield_local,(uInt)size_extrafield_local,1,zi->filezip)
+ !=1)
+ err = ZIP_ERRNO;
+
+ zi->ci.stream.avail_in = (uInt)0;
+ zi->ci.stream.avail_out = (uInt)Z_BUFSIZE;
+ zi->ci.stream.next_out = zi->ci.buffered_data;
+ zi->ci.stream.total_in = 0;
+ zi->ci.stream.total_out = 0;
+
+ if ((err==ZIP_OK) && (zi->ci.method == Z_DEFLATED))
+ {
+ zi->ci.stream.zalloc = (alloc_func)0;
+ zi->ci.stream.zfree = (free_func)0;
+ zi->ci.stream.opaque = (voidpf)0;
+
+ err = deflateInit2(&zi->ci.stream, level,
+ Z_DEFLATED, -MAX_WBITS, DEF_MEM_LEVEL, 0);
+
+ if (err==Z_OK)
+ zi->ci.stream_initialised = 1;
+ }
+
+
+ if (err==Z_OK)
+ zi->in_opened_file_inzip = 1;
+ return err;
+}
+
+extern int ZEXPORT zipWriteInFileInZip (file, buf, len)
+ zipFile file;
+ const voidp buf;
+ unsigned len;
+{
+ zip_internal* zi;
+ int err=ZIP_OK;
+
+ if (file == NULL)
+ return ZIP_PARAMERROR;
+ zi = (zip_internal*)file;
+
+ if (zi->in_opened_file_inzip == 0)
+ return ZIP_PARAMERROR;
+
+ zi->ci.stream.next_in = buf;
+ zi->ci.stream.avail_in = len;
+ zi->ci.crc32 = crc32(zi->ci.crc32,buf,len);
+
+ while ((err==ZIP_OK) && (zi->ci.stream.avail_in>0))
+ {
+ if (zi->ci.stream.avail_out == 0)
+ {
+ if (fwrite(zi->ci.buffered_data,(uInt)zi->ci.pos_in_buffered_data,1,zi->filezip)
+ !=1)
+ err = ZIP_ERRNO;
+ zi->ci.pos_in_buffered_data = 0;
+ zi->ci.stream.avail_out = (uInt)Z_BUFSIZE;
+ zi->ci.stream.next_out = zi->ci.buffered_data;
+ }
+
+ if (zi->ci.method == Z_DEFLATED)
+ {
+ uLong uTotalOutBefore = zi->ci.stream.total_out;
+ err=deflate(&zi->ci.stream, Z_NO_FLUSH);
+ zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ;
+
+ }
+ else
+ {
+ uInt copy_this,i;
+ if (zi->ci.stream.avail_in < zi->ci.stream.avail_out)
+ copy_this = zi->ci.stream.avail_in;
+ else
+ copy_this = zi->ci.stream.avail_out;
+ for (i=0;i<copy_this;i++)
+ *(((char*)zi->ci.stream.next_out)+i) =
+ *(((const char*)zi->ci.stream.next_in)+i);
+ {
+ zi->ci.stream.avail_in -= copy_this;
+ zi->ci.stream.avail_out-= copy_this;
+ zi->ci.stream.next_in+= copy_this;
+ zi->ci.stream.next_out+= copy_this;
+ zi->ci.stream.total_in+= copy_this;
+ zi->ci.stream.total_out+= copy_this;
+ zi->ci.pos_in_buffered_data += copy_this;
+ }
+ }
+ }
+
+ return 0;
+}
+
+extern int ZEXPORT zipCloseFileInZip (file)
+ zipFile file;
+{
+ zip_internal* zi;
+ int err=ZIP_OK;
+
+ if (file == NULL)
+ return ZIP_PARAMERROR;
+ zi = (zip_internal*)file;
+
+ if (zi->in_opened_file_inzip == 0)
+ return ZIP_PARAMERROR;
+ zi->ci.stream.avail_in = 0;
+
+ if (zi->ci.method == Z_DEFLATED)
+ while (err==ZIP_OK)
+ {
+ uLong uTotalOutBefore;
+ if (zi->ci.stream.avail_out == 0)
+ {
+ if (fwrite(zi->ci.buffered_data,(uInt)zi->ci.pos_in_buffered_data,1,zi->filezip)
+ !=1)
+ err = ZIP_ERRNO;
+ zi->ci.pos_in_buffered_data = 0;
+ zi->ci.stream.avail_out = (uInt)Z_BUFSIZE;
+ zi->ci.stream.next_out = zi->ci.buffered_data;
+ }
+ uTotalOutBefore = zi->ci.stream.total_out;
+ err=deflate(&zi->ci.stream, Z_FINISH);
+ zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ;
+ }
+
+ if (err==Z_STREAM_END)
+ err=ZIP_OK; /* this is normal */
+
+ if ((zi->ci.pos_in_buffered_data>0) && (err==ZIP_OK))
+ if (fwrite(zi->ci.buffered_data,(uInt)zi->ci.pos_in_buffered_data,1,zi->filezip)
+ !=1)
+ err = ZIP_ERRNO;
+
+ if ((zi->ci.method == Z_DEFLATED) && (err==ZIP_OK))
+ {
+ err=deflateEnd(&zi->ci.stream);
+ zi->ci.stream_initialised = 0;
+ }
+
+ ziplocal_putValue_inmemory(zi->ci.central_header+16,(uLong)zi->ci.crc32,4); /*crc*/
+ ziplocal_putValue_inmemory(zi->ci.central_header+20,
+ (uLong)zi->ci.stream.total_out,4); /*compr size*/
+ ziplocal_putValue_inmemory(zi->ci.central_header+24,
+ (uLong)zi->ci.stream.total_in,4); /*uncompr size*/
+
+ if (err==ZIP_OK)
+ err = add_data_in_datablock(&zi->central_dir,zi->ci.central_header,
+ (uLong)zi->ci.size_centralheader);
+ free(zi->ci.central_header);
+
+ if (err==ZIP_OK)
+ {
+ long cur_pos_inzip = ftell(zi->filezip);
+ if (fseek(zi->filezip,
+ zi->ci.pos_local_header + 14,SEEK_SET)!=0)
+ err = ZIP_ERRNO;
+
+ if (err==ZIP_OK)
+ err = ziplocal_putValue(zi->filezip,(uLong)zi->ci.crc32,4); /* crc 32, unknown */
+
+ if (err==ZIP_OK) /* compressed size, unknown */
+ err = ziplocal_putValue(zi->filezip,(uLong)zi->ci.stream.total_out,4);
+
+ if (err==ZIP_OK) /* uncompressed size, unknown */
+ err = ziplocal_putValue(zi->filezip,(uLong)zi->ci.stream.total_in,4);
+
+ if (fseek(zi->filezip,
+ cur_pos_inzip,SEEK_SET)!=0)
+ err = ZIP_ERRNO;
+ }
+
+ zi->number_entry ++;
+ zi->in_opened_file_inzip = 0;
+
+ return err;
+}
+
+extern int ZEXPORT zipClose (file, global_comment)
+ zipFile file;
+ const char* global_comment;
+{
+ zip_internal* zi;
+ int err = 0;
+ uLong size_centraldir = 0;
+ uLong centraldir_pos_inzip ;
+ uInt size_global_comment;
+ if (file == NULL)
+ return ZIP_PARAMERROR;
+ zi = (zip_internal*)file;
+
+ if (zi->in_opened_file_inzip == 1)
+ {
+ err = zipCloseFileInZip (file);
+ }
+
+ if (global_comment==NULL)
+ size_global_comment = 0;
+ else
+ size_global_comment = strlen(global_comment);
+
+
+ centraldir_pos_inzip = ftell(zi->filezip);
+ if (err==ZIP_OK)
+ {
+ linkedlist_datablock_internal* ldi = zi->central_dir.first_block ;
+ while (ldi!=NULL)
+ {
+ if ((err==ZIP_OK) && (ldi->filled_in_this_block>0))
+ if (fwrite(ldi->data,(uInt)ldi->filled_in_this_block,
+ 1,zi->filezip) !=1 )
+ err = ZIP_ERRNO;
+
+ size_centraldir += ldi->filled_in_this_block;
+ ldi = ldi->next_datablock;
+ }
+ }
+ free_datablock(zi->central_dir.first_block);
+
+ if (err==ZIP_OK) /* Magic End */
+ err = ziplocal_putValue(zi->filezip,(uLong)ENDHEADERMAGIC,4);
+
+ if (err==ZIP_OK) /* number of this disk */
+ err = ziplocal_putValue(zi->filezip,(uLong)0,2);
+
+ if (err==ZIP_OK) /* number of the disk with the start of the central directory */
+ err = ziplocal_putValue(zi->filezip,(uLong)0,2);
+
+ if (err==ZIP_OK) /* total number of entries in the central dir on this disk */
+ err = ziplocal_putValue(zi->filezip,(uLong)zi->number_entry,2);
+
+ if (err==ZIP_OK) /* total number of entries in the central dir */
+ err = ziplocal_putValue(zi->filezip,(uLong)zi->number_entry,2);
+
+ if (err==ZIP_OK) /* size of the central directory */
+ err = ziplocal_putValue(zi->filezip,(uLong)size_centraldir,4);
+
+ if (err==ZIP_OK) /* offset of start of central directory with respect to the
+ starting disk number */
+ err = ziplocal_putValue(zi->filezip,(uLong)centraldir_pos_inzip ,4);
+
+ if (err==ZIP_OK) /* zipfile comment length */
+ err = ziplocal_putValue(zi->filezip,(uLong)size_global_comment,2);
+
+ if ((err==ZIP_OK) && (size_global_comment>0))
+ if (fwrite(global_comment,(uInt)size_global_comment,1,zi->filezip) !=1 )
+ err = ZIP_ERRNO;
+ fclose(zi->filezip);
+ TRYFREE(zi);
+
+ return err;
+}
diff --git a/zlib/contrib/minizip/zip.def b/zlib/contrib/minizip/zip.def
new file mode 100644
index 00000000000..5d5079fbcee
--- /dev/null
+++ b/zlib/contrib/minizip/zip.def
@@ -0,0 +1,5 @@
+ zipOpen @80
+ zipOpenNewFileInZip @81
+ zipWriteInFileInZip @82
+ zipCloseFileInZip @83
+ zipClose @84
diff --git a/zlib/contrib/minizip/zip.h b/zlib/contrib/minizip/zip.h
new file mode 100644
index 00000000000..678260b330b
--- /dev/null
+++ b/zlib/contrib/minizip/zip.h
@@ -0,0 +1,150 @@
+/* zip.h -- IO for compress .zip files using zlib
+ Version 0.15 alpha, Mar 19th, 1998,
+
+ Copyright (C) 1998 Gilles Vollant
+
+ This unzip package allow creates .ZIP file, compatible with PKZip 2.04g
+ WinZip, InfoZip tools and compatible.
+ Encryption and multi volume ZipFile (span) are not supported.
+ Old compressions used by old PKZip 1.x are not supported
+
+ For uncompress .zip file, look at unzip.h
+
+ THIS IS AN ALPHA VERSION. AT THIS STAGE OF DEVELOPPEMENT, SOMES API OR STRUCTURE
+ CAN CHANGE IN FUTURE VERSION !!
+ I WAIT FEEDBACK at mail info@winimage.com
+ Visit also http://www.winimage.com/zLibDll/zip.htm for evolution
+
+ Condition of use and distribution are the same than zlib :
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
+
+*/
+
+/* for more info about .ZIP format, see
+ ftp://ftp.cdrom.com/pub/infozip/doc/appnote-970311-iz.zip
+ PkWare has also a specification at :
+ ftp://ftp.pkware.com/probdesc.zip
+*/
+
+#ifndef _zip_H
+#define _zip_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef _ZLIB_H
+#include "zlib.h"
+#endif
+
+#if defined(STRICTZIP) || defined(STRICTZIPUNZIP)
+/* like the STRICT of WIN32, we define a pointer that cannot be converted
+ from (void*) without cast */
+typedef struct TagzipFile__ { int unused; } zipFile__;
+typedef zipFile__ *zipFile;
+#else
+typedef voidp zipFile;
+#endif
+
+#define ZIP_OK (0)
+#define ZIP_ERRNO (Z_ERRNO)
+#define ZIP_PARAMERROR (-102)
+#define ZIP_INTERNALERROR (-104)
+
+/* tm_zip contain date/time info */
+typedef struct tm_zip_s
+{
+ uInt tm_sec; /* seconds after the minute - [0,59] */
+ uInt tm_min; /* minutes after the hour - [0,59] */
+ uInt tm_hour; /* hours since midnight - [0,23] */
+ uInt tm_mday; /* day of the month - [1,31] */
+ uInt tm_mon; /* months since January - [0,11] */
+ uInt tm_year; /* years - [1980..2044] */
+} tm_zip;
+
+typedef struct
+{
+ tm_zip tmz_date; /* date in understandable format */
+ uLong dosDate; /* if dos_date == 0, tmu_date is used */
+/* uLong flag; */ /* general purpose bit flag 2 bytes */
+
+ uLong internal_fa; /* internal file attributes 2 bytes */
+ uLong external_fa; /* external file attributes 4 bytes */
+} zip_fileinfo;
+
+extern zipFile ZEXPORT zipOpen OF((const char *pathname, int append));
+/*
+ Create a zipfile.
+ pathname contain on Windows NT a filename like "c:\\zlib\\zlib111.zip" or on
+ an Unix computer "zlib/zlib111.zip".
+ if the file pathname exist and append=1, the zip will be created at the end
+ of the file. (useful if the file contain a self extractor code)
+ If the zipfile cannot be opened, the return value is NULL.
+ Else, the return value is a zipFile Handle, usable with other function
+ of this zip package.
+
+
+*/
+
+extern int ZEXPORT zipOpenNewFileInZip OF((zipFile file,
+ const char* filename,
+ const zip_fileinfo* zipfi,
+ const void* extrafield_local,
+ uInt size_extrafield_local,
+ const void* extrafield_global,
+ uInt size_extrafield_global,
+ const char* comment,
+ int method,
+ int level));
+/*
+ Open a file in the ZIP for writing.
+ filename : the filename in zip (if NULL, '-' without quote will be used
+ *zipfi contain supplemental information
+ if extrafield_local!=NULL and size_extrafield_local>0, extrafield_local
+ contains the extrafield data the the local header
+ if extrafield_global!=NULL and size_extrafield_global>0, extrafield_global
+ contains the extrafield data the the local header
+ if comment != NULL, comment contain the comment string
+ method contain the compression method (0 for store, Z_DEFLATED for deflate)
+ level contain the level of compression (can be Z_DEFAULT_COMPRESSION)
+*/
+
+extern int ZEXPORT zipWriteInFileInZip OF((zipFile file,
+ const voidp buf,
+ unsigned len));
+/*
+ Write data in the zipfile
+*/
+
+extern int ZEXPORT zipCloseFileInZip OF((zipFile file));
+/*
+ Close the current file in the zipfile
+*/
+
+extern int ZEXPORT zipClose OF((zipFile file,
+ const char* global_comment));
+/*
+ Close the zipfile
+*/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _zip_H */
diff --git a/zlib/contrib/minizip/zlibvc.def b/zlib/contrib/minizip/zlibvc.def
new file mode 100644
index 00000000000..7e9d60d55d9
--- /dev/null
+++ b/zlib/contrib/minizip/zlibvc.def
@@ -0,0 +1,74 @@
+LIBRARY "zlib"
+
+DESCRIPTION '"""zlib data compression library"""'
+
+
+VERSION 1.11
+
+
+HEAPSIZE 1048576,8192
+
+EXPORTS
+ adler32 @1
+ compress @2
+ crc32 @3
+ deflate @4
+ deflateCopy @5
+ deflateEnd @6
+ deflateInit2_ @7
+ deflateInit_ @8
+ deflateParams @9
+ deflateReset @10
+ deflateSetDictionary @11
+ gzclose @12
+ gzdopen @13
+ gzerror @14
+ gzflush @15
+ gzopen @16
+ gzread @17
+ gzwrite @18
+ inflate @19
+ inflateEnd @20
+ inflateInit2_ @21
+ inflateInit_ @22
+ inflateReset @23
+ inflateSetDictionary @24
+ inflateSync @25
+ uncompress @26
+ zlibVersion @27
+ gzprintf @28
+ gzputc @29
+ gzgetc @30
+ gzseek @31
+ gzrewind @32
+ gztell @33
+ gzeof @34
+ gzsetparams @35
+ zError @36
+ inflateSyncPoint @37
+ get_crc_table @38
+ compress2 @39
+ gzputs @40
+ gzgets @41
+
+ unzOpen @61
+ unzClose @62
+ unzGetGlobalInfo @63
+ unzGetCurrentFileInfo @64
+ unzGoToFirstFile @65
+ unzGoToNextFile @66
+ unzOpenCurrentFile @67
+ unzReadCurrentFile @68
+ unztell @70
+ unzeof @71
+ unzCloseCurrentFile @72
+ unzGetGlobalComment @73
+ unzStringFileNameCompare @74
+ unzLocateFile @75
+ unzGetLocalExtrafield @76
+
+ zipOpen @80
+ zipOpenNewFileInZip @81
+ zipWriteInFileInZip @82
+ zipCloseFileInZip @83
+ zipClose @84
diff --git a/zlib/contrib/minizip/zlibvc.dsp b/zlib/contrib/minizip/zlibvc.dsp
new file mode 100644
index 00000000000..a70d4d4a6b0
--- /dev/null
+++ b/zlib/contrib/minizip/zlibvc.dsp
@@ -0,0 +1,651 @@
+# Microsoft Developer Studio Project File - Name="zlibvc" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 5.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+# TARGTYPE "Win32 (ALPHA) Dynamic-Link Library" 0x0602
+
+CFG=zlibvc - Win32 Release
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "zlibvc.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "zlibvc.mak" CFG="zlibvc - Win32 Release"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "zlibvc - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "zlibvc - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "zlibvc - Win32 ReleaseAxp" (based on\
+ "Win32 (ALPHA) Dynamic-Link Library")
+!MESSAGE "zlibvc - Win32 ReleaseWithoutAsm" (based on\
+ "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "zlibvc - Win32 ReleaseWithoutCrtdll" (based on\
+ "Win32 (x86) Dynamic-Link Library")
+!MESSAGE
+
+# Begin Project
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+
+!IF "$(CFG)" == "zlibvc - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir ".\Release"
+# PROP BASE Intermediate_Dir ".\Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir ".\Release"
+# PROP Intermediate_Dir ".\Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+CPP=cl.exe
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_WINDLL" /D "_WIN32" /D "BUILD_ZLIBDLL" /D "ZLIB_DLL" /D "DYNAMIC_CRC_TABLE" /D "ASMV" /FAcs /FR /FD /c
+# SUBTRACT CPP /YX
+MTL=midl.exe
+# ADD BASE MTL /nologo /D "NDEBUG" /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+RSC=rc.exe
+# ADD BASE RSC /l 0x40c /d "NDEBUG"
+# ADD RSC /l 0x40c /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386
+# ADD LINK32 gvmat32.obj kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib crtdll.lib /nologo /subsystem:windows /dll /map /machine:I386 /nodefaultlib /out:".\Release\zlib.dll"
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir ".\Debug"
+# PROP BASE Intermediate_Dir ".\Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir ".\Debug"
+# PROP Intermediate_Dir ".\Debug"
+# PROP Target_Dir ""
+CPP=cl.exe
+# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_WINDLL" /D "_WIN32" /D "BUILD_ZLIBDLL" /D "ZLIB_DLL" /FD /c
+# SUBTRACT CPP /YX
+MTL=midl.exe
+# ADD BASE MTL /nologo /D "_DEBUG" /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+RSC=rc.exe
+# ADD BASE RSC /l 0x40c /d "_DEBUG"
+# ADD RSC /l 0x40c /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /dll /debug /machine:I386 /out:".\Debug\zlib.dll"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "zlibvc__"
+# PROP BASE Intermediate_Dir "zlibvc__"
+# PROP BASE Ignore_Export_Lib 0
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "zlibvc__"
+# PROP Intermediate_Dir "zlibvc__"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+MTL=midl.exe
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+CPP=cl.exe
+# ADD BASE CPP /nologo /MT /Gt0 /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_WIN32" /D "BUILD_ZLIBDLL" /D "ZLIB_DLL" /D "DYNAMIC_CRC_TABLE" /FAcs /FR /YX /FD /c
+# ADD CPP /nologo /MT /Gt0 /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_WIN32" /D "BUILD_ZLIBDLL" /D "ZLIB_DLL" /D "DYNAMIC_CRC_TABLE" /FAcs /FR /FD /c
+# SUBTRACT CPP /YX
+RSC=rc.exe
+# ADD BASE RSC /l 0x40c /d "NDEBUG"
+# ADD RSC /l 0x40c /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 crtdll.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /dll /map /machine:ALPHA /nodefaultlib /out:".\Release\zlib.dll"
+# SUBTRACT BASE LINK32 /pdb:none
+# ADD LINK32 crtdll.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /dll /map /machine:ALPHA /nodefaultlib /out:"zlibvc__\zlib.dll"
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "zlibvc_0"
+# PROP BASE Intermediate_Dir "zlibvc_0"
+# PROP BASE Ignore_Export_Lib 0
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "zlibvc_0"
+# PROP Intermediate_Dir "zlibvc_0"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+CPP=cl.exe
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_WINDLL" /D "_WIN32" /D "BUILD_ZLIBDLL" /D "ZLIB_DLL" /D "DYNAMIC_CRC_TABLE" /FAcs /FR /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_WINDLL" /D "_WIN32" /D "BUILD_ZLIBDLL" /D "ZLIB_DLL" /D "DYNAMIC_CRC_TABLE" /FAcs /FR /FD /c
+# SUBTRACT CPP /YX
+MTL=midl.exe
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+RSC=rc.exe
+# ADD BASE RSC /l 0x40c /d "NDEBUG"
+# ADD RSC /l 0x40c /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib crtdll.lib /nologo /subsystem:windows /dll /map /machine:I386 /nodefaultlib /out:".\Release\zlib.dll"
+# SUBTRACT BASE LINK32 /pdb:none
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib crtdll.lib /nologo /subsystem:windows /dll /map /machine:I386 /nodefaultlib /out:".\zlibvc_0\zlib.dll"
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "zlibvc_1"
+# PROP BASE Intermediate_Dir "zlibvc_1"
+# PROP BASE Ignore_Export_Lib 0
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "zlibvc_1"
+# PROP Intermediate_Dir "zlibvc_1"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+CPP=cl.exe
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_WINDLL" /D "_WIN32" /D "BUILD_ZLIBDLL" /D "ZLIB_DLL" /D "DYNAMIC_CRC_TABLE" /D "ASMV" /FAcs /FR /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_WINDLL" /D "_WIN32" /D "BUILD_ZLIBDLL" /D "ZLIB_DLL" /D "DYNAMIC_CRC_TABLE" /D "ASMV" /FAcs /FR /FD /c
+# SUBTRACT CPP /YX
+MTL=midl.exe
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+RSC=rc.exe
+# ADD BASE RSC /l 0x40c /d "NDEBUG"
+# ADD RSC /l 0x40c /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 gvmat32.obj kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib crtdll.lib /nologo /subsystem:windows /dll /map /machine:I386 /nodefaultlib /out:".\Release\zlib.dll"
+# SUBTRACT BASE LINK32 /pdb:none
+# ADD LINK32 gvmat32.obj kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib crtdll.lib /nologo /subsystem:windows /dll /map /machine:I386 /nodefaultlib /out:".\zlibvc_1\zlib.dll"
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF
+
+# Begin Target
+
+# Name "zlibvc - Win32 Release"
+# Name "zlibvc - Win32 Debug"
+# Name "zlibvc - Win32 ReleaseAxp"
+# Name "zlibvc - Win32 ReleaseWithoutAsm"
+# Name "zlibvc - Win32 ReleaseWithoutCrtdll"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;hpj;bat;for;f90"
+# Begin Source File
+
+SOURCE=.\adler32.c
+
+!IF "$(CFG)" == "zlibvc - Win32 Release"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 Debug"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
+
+DEP_CPP_ADLER=\
+ ".\zconf.h"\
+ ".\zlib.h"\
+
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\compress.c
+
+!IF "$(CFG)" == "zlibvc - Win32 Release"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 Debug"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
+
+DEP_CPP_COMPR=\
+ ".\zconf.h"\
+ ".\zlib.h"\
+
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\crc32.c
+
+!IF "$(CFG)" == "zlibvc - Win32 Release"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 Debug"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
+
+DEP_CPP_CRC32=\
+ ".\zconf.h"\
+ ".\zlib.h"\
+
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\deflate.c
+
+!IF "$(CFG)" == "zlibvc - Win32 Release"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 Debug"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
+
+DEP_CPP_DEFLA=\
+ ".\deflate.h"\
+ ".\zconf.h"\
+ ".\zlib.h"\
+ ".\zutil.h"\
+
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\gvmat32c.c
+
+!IF "$(CFG)" == "zlibvc - Win32 Release"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 Debug"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\gzio.c
+
+!IF "$(CFG)" == "zlibvc - Win32 Release"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 Debug"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
+
+DEP_CPP_GZIO_=\
+ ".\zconf.h"\
+ ".\zlib.h"\
+ ".\zutil.h"\
+
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\infblock.c
+
+!IF "$(CFG)" == "zlibvc - Win32 Release"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 Debug"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
+
+DEP_CPP_INFBL=\
+ ".\infblock.h"\
+ ".\infcodes.h"\
+ ".\inftrees.h"\
+ ".\infutil.h"\
+ ".\zconf.h"\
+ ".\zlib.h"\
+ ".\zutil.h"\
+
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\infcodes.c
+
+!IF "$(CFG)" == "zlibvc - Win32 Release"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 Debug"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
+
+DEP_CPP_INFCO=\
+ ".\infblock.h"\
+ ".\infcodes.h"\
+ ".\inffast.h"\
+ ".\inftrees.h"\
+ ".\infutil.h"\
+ ".\zconf.h"\
+ ".\zlib.h"\
+ ".\zutil.h"\
+
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\inffast.c
+
+!IF "$(CFG)" == "zlibvc - Win32 Release"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 Debug"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
+
+DEP_CPP_INFFA=\
+ ".\infblock.h"\
+ ".\infcodes.h"\
+ ".\inffast.h"\
+ ".\inftrees.h"\
+ ".\infutil.h"\
+ ".\zconf.h"\
+ ".\zlib.h"\
+ ".\zutil.h"\
+
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\inflate.c
+
+!IF "$(CFG)" == "zlibvc - Win32 Release"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 Debug"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
+
+DEP_CPP_INFLA=\
+ ".\infblock.h"\
+ ".\zconf.h"\
+ ".\zlib.h"\
+ ".\zutil.h"\
+
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\inftrees.c
+
+!IF "$(CFG)" == "zlibvc - Win32 Release"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 Debug"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
+
+DEP_CPP_INFTR=\
+ ".\inftrees.h"\
+ ".\zconf.h"\
+ ".\zlib.h"\
+ ".\zutil.h"\
+
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\infutil.c
+
+!IF "$(CFG)" == "zlibvc - Win32 Release"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 Debug"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
+
+DEP_CPP_INFUT=\
+ ".\infblock.h"\
+ ".\infcodes.h"\
+ ".\inftrees.h"\
+ ".\infutil.h"\
+ ".\zconf.h"\
+ ".\zlib.h"\
+ ".\zutil.h"\
+
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\trees.c
+
+!IF "$(CFG)" == "zlibvc - Win32 Release"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 Debug"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
+
+DEP_CPP_TREES=\
+ ".\deflate.h"\
+ ".\zconf.h"\
+ ".\zlib.h"\
+ ".\zutil.h"\
+
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\uncompr.c
+
+!IF "$(CFG)" == "zlibvc - Win32 Release"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 Debug"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
+
+DEP_CPP_UNCOM=\
+ ".\zconf.h"\
+ ".\zlib.h"\
+
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\unzip.c
+
+!IF "$(CFG)" == "zlibvc - Win32 Release"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 Debug"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\zip.c
+
+!IF "$(CFG)" == "zlibvc - Win32 Release"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 Debug"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\zlib.rc
+# End Source File
+# Begin Source File
+
+SOURCE=.\zlibvc.def
+# End Source File
+# Begin Source File
+
+SOURCE=.\zutil.c
+
+!IF "$(CFG)" == "zlibvc - Win32 Release"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 Debug"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
+
+DEP_CPP_ZUTIL=\
+ ".\zconf.h"\
+ ".\zlib.h"\
+ ".\zutil.h"\
+
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
+
+!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
+
+!ENDIF
+
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl;fi;fd"
+# Begin Source File
+
+SOURCE=.\deflate.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\infblock.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\infcodes.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\inffast.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\inftrees.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\infutil.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\zconf.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\zlib.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\zutil.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/zlib/contrib/minizip/zlibvc.dsw b/zlib/contrib/minizip/zlibvc.dsw
new file mode 100644
index 00000000000..493cd870365
--- /dev/null
+++ b/zlib/contrib/minizip/zlibvc.dsw
@@ -0,0 +1,41 @@
+Microsoft Developer Studio Workspace File, Format Version 5.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "zlibstat"=.\zlibstat.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "zlibvc"=.\zlibvc.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/zlib/contrib/untgz/Makefile b/zlib/contrib/untgz/Makefile
new file mode 100644
index 00000000000..409b4bdeaae
--- /dev/null
+++ b/zlib/contrib/untgz/Makefile
@@ -0,0 +1,14 @@
+CC=cc
+CFLAGS=-g
+
+untgz: untgz.o ../../libz.a
+ $(CC) $(CFLAGS) -o untgz untgz.o -L../.. -lz
+
+untgz.o: untgz.c ../../zlib.h
+ $(CC) $(CFLAGS) -c -I../.. untgz.c
+
+../../libz.a:
+ cd ../..; make
+
+clean:
+ rm -f untgz untgz.o *~
diff --git a/zlib/contrib/untgz/makefile.w32 b/zlib/contrib/untgz/makefile.w32
new file mode 100644
index 00000000000..c99dc28cf55
--- /dev/null
+++ b/zlib/contrib/untgz/makefile.w32
@@ -0,0 +1,63 @@
+# Makefile for zlib. Modified for mingw32
+# For conditions of distribution and use, see copyright notice in zlib.h
+
+# To compile,
+#
+# make -fmakefile.w32
+#
+
+CC=gcc
+
+# Generate dependencies (see end of the file)
+
+CPPFLAGS=-MMD
+
+#CFLAGS=-MMD -O
+#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7
+#CFLAGS=-MMD -g -DDEBUG
+CFLAGS=-O3 $(BUTT) -Wall -Wwrite-strings -Wpointer-arith -Wconversion \
+ -Wstrict-prototypes -Wmissing-prototypes
+
+# If cp.exe is not found, replace with copy /Y .
+CP=cp -f
+
+# The default value of RM is "rm -f."
+# If "rm.exe" is not found, uncomment:
+# RM=del
+
+LD=gcc
+LDLIBS=-L. -lz
+LDFLAGS=-s
+
+
+INCL=zlib.h zconf.h
+LIBS=libz.a
+
+AR=ar rcs
+
+OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \
+ zutil.o inflate.o infblock.o inftrees.o infcodes.o infutil.o \
+ inffast.o
+
+TEST_OBJS = minigzip.o untgz.o
+
+all: minigzip.exe untgz.exe
+
+rebuild: clean all
+
+libz.a: $(OBJS)
+ $(AR) $@ $(OBJS)
+
+%.exe : %.o $(LIBS)
+ $(LD) $(LDFLAGS) -o $@ $< $(LDLIBS)
+
+.PHONY : clean
+
+clean:
+ $(RM) *.d *.o *.exe libz.a foo.gz
+
+DEPS := $(wildcard *.d)
+ifneq ($(DEPS),)
+include $(DEPS)
+endif
+
diff --git a/zlib/contrib/untgz/untgz.c b/zlib/contrib/untgz/untgz.c
new file mode 100644
index 00000000000..4a431ff3163
--- /dev/null
+++ b/zlib/contrib/untgz/untgz.c
@@ -0,0 +1,522 @@
+/*
+ * untgz.c -- Display contents and/or extract file from
+ * a gzip'd TAR file
+ * written by "Pedro A. Aranda Guti\irrez" <paag@tid.es>
+ * adaptation to Unix by Jean-loup Gailly <jloup@gzip.org>
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <errno.h>
+#include <fcntl.h>
+#ifdef unix
+# include <unistd.h>
+#else
+# include <direct.h>
+# include <io.h>
+#endif
+
+#include "zlib.h"
+
+#ifdef WIN32
+# ifndef F_OK
+# define F_OK (0)
+# endif
+# ifdef _MSC_VER
+# define mkdir(dirname,mode) _mkdir(dirname)
+# define strdup(str) _strdup(str)
+# define unlink(fn) _unlink(fn)
+# define access(path,mode) _access(path,mode)
+# else
+# define mkdir(dirname,mode) _mkdir(dirname)
+# endif
+#else
+# include <utime.h>
+#endif
+
+
+/* Values used in typeflag field. */
+
+#define REGTYPE '0' /* regular file */
+#define AREGTYPE '\0' /* regular file */
+#define LNKTYPE '1' /* link */
+#define SYMTYPE '2' /* reserved */
+#define CHRTYPE '3' /* character special */
+#define BLKTYPE '4' /* block special */
+#define DIRTYPE '5' /* directory */
+#define FIFOTYPE '6' /* FIFO special */
+#define CONTTYPE '7' /* reserved */
+
+#define BLOCKSIZE 512
+
+struct tar_header
+{ /* byte offset */
+ char name[100]; /* 0 */
+ char mode[8]; /* 100 */
+ char uid[8]; /* 108 */
+ char gid[8]; /* 116 */
+ char size[12]; /* 124 */
+ char mtime[12]; /* 136 */
+ char chksum[8]; /* 148 */
+ char typeflag; /* 156 */
+ char linkname[100]; /* 157 */
+ char magic[6]; /* 257 */
+ char version[2]; /* 263 */
+ char uname[32]; /* 265 */
+ char gname[32]; /* 297 */
+ char devmajor[8]; /* 329 */
+ char devminor[8]; /* 337 */
+ char prefix[155]; /* 345 */
+ /* 500 */
+};
+
+union tar_buffer {
+ char buffer[BLOCKSIZE];
+ struct tar_header header;
+};
+
+enum { TGZ_EXTRACT = 0, TGZ_LIST };
+
+static char *TGZfname OF((const char *));
+void TGZnotfound OF((const char *));
+
+int getoct OF((char *, int));
+char *strtime OF((time_t *));
+int ExprMatch OF((char *,char *));
+
+int makedir OF((char *));
+int matchname OF((int,int,char **,char *));
+
+void error OF((const char *));
+int tar OF((gzFile, int, int, int, char **));
+
+void help OF((int));
+int main OF((int, char **));
+
+char *prog;
+
+/* This will give a benign warning */
+
+static char *TGZprefix[] = { "\0", ".tgz", ".tar.gz", ".tar", NULL };
+
+/* Return the real name of the TGZ archive */
+/* or NULL if it does not exist. */
+
+static char *TGZfname OF((const char *fname))
+{
+ static char buffer[1024];
+ int origlen,i;
+
+ strcpy(buffer,fname);
+ origlen = strlen(buffer);
+
+ for (i=0; TGZprefix[i]; i++)
+ {
+ strcpy(buffer+origlen,TGZprefix[i]);
+ if (access(buffer,F_OK) == 0)
+ return buffer;
+ }
+ return NULL;
+}
+
+/* error message for the filename */
+
+void TGZnotfound OF((const char *fname))
+{
+ int i;
+
+ fprintf(stderr,"%s : couldn't find ",prog);
+ for (i=0;TGZprefix[i];i++)
+ fprintf(stderr,(TGZprefix[i+1]) ? "%s%s, " : "or %s%s\n",
+ fname,
+ TGZprefix[i]);
+ exit(1);
+}
+
+
+/* help functions */
+
+int getoct(char *p,int width)
+{
+ int result = 0;
+ char c;
+
+ while (width --)
+ {
+ c = *p++;
+ if (c == ' ')
+ continue;
+ if (c == 0)
+ break;
+ result = result * 8 + (c - '0');
+ }
+ return result;
+}
+
+char *strtime (time_t *t)
+{
+ struct tm *local;
+ static char result[32];
+
+ local = localtime(t);
+ sprintf(result,"%2d/%02d/%4d %02d:%02d:%02d",
+ local->tm_mday, local->tm_mon+1, local->tm_year+1900,
+ local->tm_hour, local->tm_min, local->tm_sec);
+ return result;
+}
+
+
+/* regular expression matching */
+
+#define ISSPECIAL(c) (((c) == '*') || ((c) == '/'))
+
+int ExprMatch(char *string,char *expr)
+{
+ while (1)
+ {
+ if (ISSPECIAL(*expr))
+ {
+ if (*expr == '/')
+ {
+ if (*string != '\\' && *string != '/')
+ return 0;
+ string ++; expr++;
+ }
+ else if (*expr == '*')
+ {
+ if (*expr ++ == 0)
+ return 1;
+ while (*++string != *expr)
+ if (*string == 0)
+ return 0;
+ }
+ }
+ else
+ {
+ if (*string != *expr)
+ return 0;
+ if (*expr++ == 0)
+ return 1;
+ string++;
+ }
+ }
+}
+
+/* recursive make directory */
+/* abort if you get an ENOENT errno somewhere in the middle */
+/* e.g. ignore error "mkdir on existing directory" */
+/* */
+/* return 1 if OK */
+/* 0 on error */
+
+int makedir (char *newdir)
+{
+ char *buffer = strdup(newdir);
+ char *p;
+ int len = strlen(buffer);
+
+ if (len <= 0) {
+ free(buffer);
+ return 0;
+ }
+ if (buffer[len-1] == '/') {
+ buffer[len-1] = '\0';
+ }
+ if (mkdir(buffer, 0775) == 0)
+ {
+ free(buffer);
+ return 1;
+ }
+
+ p = buffer+1;
+ while (1)
+ {
+ char hold;
+
+ while(*p && *p != '\\' && *p != '/')
+ p++;
+ hold = *p;
+ *p = 0;
+ if ((mkdir(buffer, 0775) == -1) && (errno == ENOENT))
+ {
+ fprintf(stderr,"%s: couldn't create directory %s\n",prog,buffer);
+ free(buffer);
+ return 0;
+ }
+ if (hold == 0)
+ break;
+ *p++ = hold;
+ }
+ free(buffer);
+ return 1;
+}
+
+int matchname (int arg,int argc,char **argv,char *fname)
+{
+ if (arg == argc) /* no arguments given (untgz tgzarchive) */
+ return 1;
+
+ while (arg < argc)
+ if (ExprMatch(fname,argv[arg++]))
+ return 1;
+
+ return 0; /* ignore this for the moment being */
+}
+
+
+/* Tar file list or extract */
+
+int tar (gzFile in,int action,int arg,int argc,char **argv)
+{
+ union tar_buffer buffer;
+ int len;
+ int err;
+ int getheader = 1;
+ int remaining = 0;
+ FILE *outfile = NULL;
+ char fname[BLOCKSIZE];
+ time_t tartime;
+
+ if (action == TGZ_LIST)
+ printf(" day time size file\n"
+ " ---------- -------- --------- -------------------------------------\n");
+ while (1)
+ {
+ len = gzread(in, &buffer, BLOCKSIZE);
+ if (len < 0)
+ error (gzerror(in, &err));
+ /*
+ * Always expect complete blocks to process
+ * the tar information.
+ */
+ if (len != BLOCKSIZE)
+ error("gzread: incomplete block read");
+
+ /*
+ * If we have to get a tar header
+ */
+ if (getheader == 1)
+ {
+ /*
+ * if we met the end of the tar
+ * or the end-of-tar block,
+ * we are done
+ */
+ if ((len == 0) || (buffer.header.name[0]== 0)) break;
+
+ tartime = (time_t)getoct(buffer.header.mtime,12);
+ strcpy(fname,buffer.header.name);
+
+ switch (buffer.header.typeflag)
+ {
+ case DIRTYPE:
+ if (action == TGZ_LIST)
+ printf(" %s <dir> %s\n",strtime(&tartime),fname);
+ if (action == TGZ_EXTRACT)
+ makedir(fname);
+ break;
+ case REGTYPE:
+ case AREGTYPE:
+ remaining = getoct(buffer.header.size,12);
+ if (action == TGZ_LIST)
+ printf(" %s %9d %s\n",strtime(&tartime),remaining,fname);
+ if (action == TGZ_EXTRACT)
+ {
+ if ((remaining) && (matchname(arg,argc,argv,fname)))
+ {
+ outfile = fopen(fname,"wb");
+ if (outfile == NULL) {
+ /* try creating directory */
+ char *p = strrchr(fname, '/');
+ if (p != NULL) {
+ *p = '\0';
+ makedir(fname);
+ *p = '/';
+ outfile = fopen(fname,"wb");
+ }
+ }
+ fprintf(stderr,
+ "%s %s\n",
+ (outfile) ? "Extracting" : "Couldn't create",
+ fname);
+ }
+ else
+ outfile = NULL;
+ }
+ /*
+ * could have no contents
+ */
+ getheader = (remaining) ? 0 : 1;
+ break;
+ default:
+ if (action == TGZ_LIST)
+ printf(" %s <---> %s\n",strtime(&tartime),fname);
+ break;
+ }
+ }
+ else
+ {
+ unsigned int bytes = (remaining > BLOCKSIZE) ? BLOCKSIZE : remaining;
+
+ if ((action == TGZ_EXTRACT) && (outfile != NULL))
+ {
+ if (fwrite(&buffer,sizeof(char),bytes,outfile) != bytes)
+ {
+ fprintf(stderr,"%s : error writing %s skipping...\n",prog,fname);
+ fclose(outfile);
+ unlink(fname);
+ }
+ }
+ remaining -= bytes;
+ if (remaining == 0)
+ {
+ getheader = 1;
+ if ((action == TGZ_EXTRACT) && (outfile != NULL))
+ {
+#ifdef WIN32
+ HANDLE hFile;
+ FILETIME ftm,ftLocal;
+ SYSTEMTIME st;
+ struct tm localt;
+
+ fclose(outfile);
+
+ localt = *localtime(&tartime);
+
+ hFile = CreateFile(fname, GENERIC_READ | GENERIC_WRITE,
+ 0, NULL, OPEN_EXISTING, 0, NULL);
+
+ st.wYear = (WORD)localt.tm_year+1900;
+ st.wMonth = (WORD)localt.tm_mon;
+ st.wDayOfWeek = (WORD)localt.tm_wday;
+ st.wDay = (WORD)localt.tm_mday;
+ st.wHour = (WORD)localt.tm_hour;
+ st.wMinute = (WORD)localt.tm_min;
+ st.wSecond = (WORD)localt.tm_sec;
+ st.wMilliseconds = 0;
+ SystemTimeToFileTime(&st,&ftLocal);
+ LocalFileTimeToFileTime(&ftLocal,&ftm);
+ SetFileTime(hFile,&ftm,NULL,&ftm);
+ CloseHandle(hFile);
+
+ outfile = NULL;
+#else
+ struct utimbuf settime;
+
+ settime.actime = settime.modtime = tartime;
+
+ fclose(outfile);
+ outfile = NULL;
+ utime(fname,&settime);
+#endif
+ }
+ }
+ }
+ }
+
+ if (gzclose(in) != Z_OK)
+ error("failed gzclose");
+
+ return 0;
+}
+
+
+/* =========================================================== */
+
+void help(int exitval)
+{
+ fprintf(stderr,
+ "untgz v 0.1\n"
+ " an sample application of zlib 1.0.4\n\n"
+ "Usage : untgz TGZfile to extract all files\n"
+ " untgz TGZfile fname ... to extract selected files\n"
+ " untgz -l TGZfile to list archive contents\n"
+ " untgz -h to display this help\n\n");
+ exit(exitval);
+}
+
+void error(const char *msg)
+{
+ fprintf(stderr, "%s: %s\n", prog, msg);
+ exit(1);
+}
+
+
+/* ====================================================================== */
+
+int _CRT_glob = 0; /* disable globbing of the arguments */
+
+int main(int argc,char **argv)
+{
+ int action = TGZ_EXTRACT;
+ int arg = 1;
+ char *TGZfile;
+ gzFile *f;
+
+
+ prog = strrchr(argv[0],'\\');
+ if (prog == NULL)
+ {
+ prog = strrchr(argv[0],'/');
+ if (prog == NULL)
+ {
+ prog = strrchr(argv[0],':');
+ if (prog == NULL)
+ prog = argv[0];
+ else
+ prog++;
+ }
+ else
+ prog++;
+ }
+ else
+ prog++;
+
+ if (argc == 1)
+ help(0);
+
+ if (strcmp(argv[arg],"-l") == 0)
+ {
+ action = TGZ_LIST;
+ if (argc == ++arg)
+ help(0);
+ }
+ else if (strcmp(argv[arg],"-h") == 0)
+ {
+ help(0);
+ }
+
+ if ((TGZfile = TGZfname(argv[arg])) == NULL)
+ TGZnotfound(argv[arg]);
+
+ ++arg;
+ if ((action == TGZ_LIST) && (arg != argc))
+ help(1);
+
+/*
+ * Process the TGZ file
+ */
+ switch(action)
+ {
+ case TGZ_LIST:
+ case TGZ_EXTRACT:
+ f = gzopen(TGZfile,"rb");
+ if (f == NULL)
+ {
+ fprintf(stderr,"%s: Couldn't gzopen %s\n",
+ prog,
+ TGZfile);
+ return 1;
+ }
+ exit(tar(f, action, arg, argc, argv));
+ break;
+
+ default:
+ error("Unknown option!");
+ exit(1);
+ }
+
+ return 0;
+}
diff --git a/zlib/contrib/visual-basic.txt b/zlib/contrib/visual-basic.txt
new file mode 100644
index 00000000000..10fb44bc593
--- /dev/null
+++ b/zlib/contrib/visual-basic.txt
@@ -0,0 +1,69 @@
+See below some functions declarations for Visual Basic.
+
+Frequently Asked Question:
+
+Q: Each time I use the compress function I get the -5 error (not enough
+ room in the output buffer).
+
+A: Make sure that the length of the compressed buffer is passed by
+ reference ("as any"), not by value ("as long"). Also check that
+ before the call of compress this length is equal to the total size of
+ the compressed buffer and not zero.
+
+
+From: "Jon Caruana" <jon-net@usa.net>
+Subject: Re: How to port zlib declares to vb?
+Date: Mon, 28 Oct 1996 18:33:03 -0600
+
+Got the answer! (I haven't had time to check this but it's what I got, and
+looks correct):
+
+He has the following routines working:
+ compress
+ uncompress
+ gzopen
+ gzwrite
+ gzread
+ gzclose
+
+Declares follow: (Quoted from Carlos Rios <c_rios@sonda.cl>, in Vb4 form)
+
+#If Win16 Then 'Use Win16 calls.
+Declare Function compress Lib "ZLIB.DLL" (ByVal compr As
+ String, comprLen As Any, ByVal buf As String, ByVal buflen
+ As Long) As Integer
+Declare Function uncompress Lib "ZLIB.DLL" (ByVal uncompr
+ As String, uncomprLen As Any, ByVal compr As String, ByVal
+ lcompr As Long) As Integer
+Declare Function gzopen Lib "ZLIB.DLL" (ByVal filePath As
+ String, ByVal mode As String) As Long
+Declare Function gzread Lib "ZLIB.DLL" (ByVal file As
+ Long, ByVal uncompr As String, ByVal uncomprLen As Integer)
+ As Integer
+Declare Function gzwrite Lib "ZLIB.DLL" (ByVal file As
+ Long, ByVal uncompr As String, ByVal uncomprLen As Integer)
+ As Integer
+Declare Function gzclose Lib "ZLIB.DLL" (ByVal file As
+ Long) As Integer
+#Else
+Declare Function compress Lib "ZLIB32.DLL"
+ (ByVal compr As String, comprLen As Any, ByVal buf As
+ String, ByVal buflen As Long) As Integer
+Declare Function uncompress Lib "ZLIB32.DLL"
+ (ByVal uncompr As String, uncomprLen As Any, ByVal compr As
+ String, ByVal lcompr As Long) As Long
+Declare Function gzopen Lib "ZLIB32.DLL"
+ (ByVal file As String, ByVal mode As String) As Long
+Declare Function gzread Lib "ZLIB32.DLL"
+ (ByVal file As Long, ByVal uncompr As String, ByVal
+ uncomprLen As Long) As Long
+Declare Function gzwrite Lib "ZLIB32.DLL"
+ (ByVal file As Long, ByVal uncompr As String, ByVal
+ uncomprLen As Long) As Long
+Declare Function gzclose Lib "ZLIB32.DLL"
+ (ByVal file As Long) As Long
+#End If
+
+-Jon Caruana
+jon-net@usa.net
+Microsoft Sitebuilder Network Level 1 Member - HTML Writer's Guild Member
diff --git a/zlib/crc32.c b/zlib/crc32.c
new file mode 100644
index 00000000000..a91101a81c6
--- /dev/null
+++ b/zlib/crc32.c
@@ -0,0 +1,162 @@
+/* crc32.c -- compute the CRC-32 of a data stream
+ * Copyright (C) 1995-1998 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* @(#) $Id$ */
+
+#include "zlib.h"
+
+#define local static
+
+#ifdef DYNAMIC_CRC_TABLE
+
+local int crc_table_empty = 1;
+local uLongf crc_table[256];
+local void make_crc_table OF((void));
+
+/*
+ Generate a table for a byte-wise 32-bit CRC calculation on the polynomial:
+ x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1.
+
+ Polynomials over GF(2) are represented in binary, one bit per coefficient,
+ with the lowest powers in the most significant bit. Then adding polynomials
+ is just exclusive-or, and multiplying a polynomial by x is a right shift by
+ one. If we call the above polynomial p, and represent a byte as the
+ polynomial q, also with the lowest power in the most significant bit (so the
+ byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p,
+ where a mod b means the remainder after dividing a by b.
+
+ This calculation is done using the shift-register method of multiplying and
+ taking the remainder. The register is initialized to zero, and for each
+ incoming bit, x^32 is added mod p to the register if the bit is a one (where
+ x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by
+ x (which is shifting right by one and adding x^32 mod p if the bit shifted
+ out is a one). We start with the highest power (least significant bit) of
+ q and repeat for all eight bits of q.
+
+ The table is simply the CRC of all possible eight bit values. This is all
+ the information needed to generate CRC's on data a byte at a time for all
+ combinations of CRC register values and incoming bytes.
+*/
+local void make_crc_table()
+{
+ uLong c;
+ int n, k;
+ uLong poly; /* polynomial exclusive-or pattern */
+ /* terms of polynomial defining this crc (except x^32): */
+ static const Byte p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26};
+
+ /* make exclusive-or pattern from polynomial (0xedb88320L) */
+ poly = 0L;
+ for (n = 0; n < sizeof(p)/sizeof(Byte); n++)
+ poly |= 1L << (31 - p[n]);
+
+ for (n = 0; n < 256; n++)
+ {
+ c = (uLong)n;
+ for (k = 0; k < 8; k++)
+ c = c & 1 ? poly ^ (c >> 1) : c >> 1;
+ crc_table[n] = c;
+ }
+ crc_table_empty = 0;
+}
+#else
+/* ========================================================================
+ * Table of CRC-32's of all single-byte values (made by make_crc_table)
+ */
+local const uLongf crc_table[256] = {
+ 0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L,
+ 0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L,
+ 0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L,
+ 0x90bf1d91L, 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL,
+ 0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L, 0x136c9856L,
+ 0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L,
+ 0xfa0f3d63L, 0x8d080df5L, 0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L,
+ 0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL,
+ 0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L,
+ 0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, 0x26d930acL, 0x51de003aL,
+ 0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L,
+ 0xb8bda50fL, 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L,
+ 0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, 0x76dc4190L,
+ 0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL,
+ 0x9fbfe4a5L, 0xe8b8d433L, 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL,
+ 0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L,
+ 0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL,
+ 0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, 0x65b0d9c6L, 0x12b7e950L,
+ 0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L,
+ 0xfbd44c65L, 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L,
+ 0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, 0x4369e96aL,
+ 0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L,
+ 0xaa0a4c5fL, 0xdd0d7cc9L, 0x5005713cL, 0x270241aaL, 0xbe0b1010L,
+ 0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL,
+ 0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L,
+ 0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, 0xedb88320L, 0x9abfb3b6L,
+ 0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L,
+ 0x73dc1683L, 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L,
+ 0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, 0xf00f9344L,
+ 0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL,
+ 0x196c3671L, 0x6e6b06e7L, 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL,
+ 0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L,
+ 0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L,
+ 0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, 0xd80d2bdaL, 0xaf0a1b4cL,
+ 0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL,
+ 0x4669be79L, 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L,
+ 0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, 0xc5ba3bbeL,
+ 0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L,
+ 0x2cd99e8bL, 0x5bdeae1dL, 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL,
+ 0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L,
+ 0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL,
+ 0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, 0x86d3d2d4L, 0xf1d4e242L,
+ 0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L,
+ 0x18b74777L, 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL,
+ 0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, 0xa00ae278L,
+ 0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L,
+ 0x4969474dL, 0x3e6e77dbL, 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L,
+ 0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L,
+ 0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L,
+ 0xcdd70693L, 0x54de5729L, 0x23d967bfL, 0xb3667a2eL, 0xc4614ab8L,
+ 0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL,
+ 0x2d02ef8dL
+};
+#endif
+
+/* =========================================================================
+ * This function can be used by asm versions of crc32()
+ */
+const uLongf * ZEXPORT get_crc_table()
+{
+#ifdef DYNAMIC_CRC_TABLE
+ if (crc_table_empty) make_crc_table();
+#endif
+ return (const uLongf *)crc_table;
+}
+
+/* ========================================================================= */
+#define DO1(buf) crc = crc_table[((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8);
+#define DO2(buf) DO1(buf); DO1(buf);
+#define DO4(buf) DO2(buf); DO2(buf);
+#define DO8(buf) DO4(buf); DO4(buf);
+
+/* ========================================================================= */
+uLong ZEXPORT crc32(crc, buf, len)
+ uLong crc;
+ const Bytef *buf;
+ uInt len;
+{
+ if (buf == Z_NULL) return 0L;
+#ifdef DYNAMIC_CRC_TABLE
+ if (crc_table_empty)
+ make_crc_table();
+#endif
+ crc = crc ^ 0xffffffffL;
+ while (len >= 8)
+ {
+ DO8(buf);
+ len -= 8;
+ }
+ if (len) do {
+ DO1(buf);
+ } while (--len);
+ return crc ^ 0xffffffffL;
+}
diff --git a/zlib/deflate.c b/zlib/deflate.c
new file mode 100644
index 00000000000..25d5818e2ec
--- /dev/null
+++ b/zlib/deflate.c
@@ -0,0 +1,1350 @@
+/* deflate.c -- compress data using the deflation algorithm
+ * Copyright (C) 1995-1998 Jean-loup Gailly.
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/*
+ * ALGORITHM
+ *
+ * The "deflation" process depends on being able to identify portions
+ * of the input text which are identical to earlier input (within a
+ * sliding window trailing behind the input currently being processed).
+ *
+ * The most straightforward technique turns out to be the fastest for
+ * most input files: try all possible matches and select the longest.
+ * The key feature of this algorithm is that insertions into the string
+ * dictionary are very simple and thus fast, and deletions are avoided
+ * completely. Insertions are performed at each input character, whereas
+ * string matches are performed only when the previous match ends. So it
+ * is preferable to spend more time in matches to allow very fast string
+ * insertions and avoid deletions. The matching algorithm for small
+ * strings is inspired from that of Rabin & Karp. A brute force approach
+ * is used to find longer strings when a small match has been found.
+ * A similar algorithm is used in comic (by Jan-Mark Wams) and freeze
+ * (by Leonid Broukhis).
+ * A previous version of this file used a more sophisticated algorithm
+ * (by Fiala and Greene) which is guaranteed to run in linear amortized
+ * time, but has a larger average cost, uses more memory and is patented.
+ * However the F&G algorithm may be faster for some highly redundant
+ * files if the parameter max_chain_length (described below) is too large.
+ *
+ * ACKNOWLEDGEMENTS
+ *
+ * The idea of lazy evaluation of matches is due to Jan-Mark Wams, and
+ * I found it in 'freeze' written by Leonid Broukhis.
+ * Thanks to many people for bug reports and testing.
+ *
+ * REFERENCES
+ *
+ * Deutsch, L.P.,"DEFLATE Compressed Data Format Specification".
+ * Available in ftp://ds.internic.net/rfc/rfc1951.txt
+ *
+ * A description of the Rabin and Karp algorithm is given in the book
+ * "Algorithms" by R. Sedgewick, Addison-Wesley, p252.
+ *
+ * Fiala,E.R., and Greene,D.H.
+ * Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595
+ *
+ */
+
+/* @(#) $Id$ */
+
+#include "deflate.h"
+
+const char deflate_copyright[] =
+ " deflate 1.1.3 Copyright 1995-1998 Jean-loup Gailly ";
+/*
+ If you use the zlib library in a product, an acknowledgment is welcome
+ in the documentation of your product. If for some reason you cannot
+ include such an acknowledgment, I would appreciate that you keep this
+ copyright string in the executable of your product.
+ */
+
+/* ===========================================================================
+ * Function prototypes.
+ */
+typedef enum {
+ need_more, /* block not completed, need more input or more output */
+ block_done, /* block flush performed */
+ finish_started, /* finish started, need only more output at next deflate */
+ finish_done /* finish done, accept no more input or output */
+} block_state;
+
+typedef block_state (*compress_func) OF((deflate_state *s, int flush));
+/* Compression function. Returns the block state after the call. */
+
+local void fill_window OF((deflate_state *s));
+local block_state deflate_stored OF((deflate_state *s, int flush));
+local block_state deflate_fast OF((deflate_state *s, int flush));
+local block_state deflate_slow OF((deflate_state *s, int flush));
+local void lm_init OF((deflate_state *s));
+local void putShortMSB OF((deflate_state *s, uInt b));
+local void flush_pending OF((z_streamp strm));
+local int read_buf OF((z_streamp strm, Bytef *buf, unsigned size));
+#ifdef ASMV
+ void match_init OF((void)); /* asm code initialization */
+ uInt longest_match OF((deflate_state *s, IPos cur_match));
+#else
+local uInt longest_match OF((deflate_state *s, IPos cur_match));
+#endif
+
+#ifdef DEBUG
+local void check_match OF((deflate_state *s, IPos start, IPos match,
+ int length));
+#endif
+
+/* ===========================================================================
+ * Local data
+ */
+
+#define NIL 0
+/* Tail of hash chains */
+
+#ifndef TOO_FAR
+# define TOO_FAR 4096
+#endif
+/* Matches of length 3 are discarded if their distance exceeds TOO_FAR */
+
+#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1)
+/* Minimum amount of lookahead, except at the end of the input file.
+ * See deflate.c for comments about the MIN_MATCH+1.
+ */
+
+/* Values for max_lazy_match, good_match and max_chain_length, depending on
+ * the desired pack level (0..9). The values given below have been tuned to
+ * exclude worst case performance for pathological files. Better values may be
+ * found for specific files.
+ */
+typedef struct config_s {
+ ush good_length; /* reduce lazy search above this match length */
+ ush max_lazy; /* do not perform lazy search above this match length */
+ ush nice_length; /* quit search above this match length */
+ ush max_chain;
+ compress_func func;
+} config;
+
+local const config configuration_table[10] = {
+/* good lazy nice chain */
+/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */
+/* 1 */ {4, 4, 8, 4, deflate_fast}, /* maximum speed, no lazy matches */
+/* 2 */ {4, 5, 16, 8, deflate_fast},
+/* 3 */ {4, 6, 32, 32, deflate_fast},
+
+/* 4 */ {4, 4, 16, 16, deflate_slow}, /* lazy matches */
+/* 5 */ {8, 16, 32, 32, deflate_slow},
+/* 6 */ {8, 16, 128, 128, deflate_slow},
+/* 7 */ {8, 32, 128, 256, deflate_slow},
+/* 8 */ {32, 128, 258, 1024, deflate_slow},
+/* 9 */ {32, 258, 258, 4096, deflate_slow}}; /* maximum compression */
+
+/* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4
+ * For deflate_fast() (levels <= 3) good is ignored and lazy has a different
+ * meaning.
+ */
+
+#define EQUAL 0
+/* result of memcmp for equal strings */
+
+struct static_tree_desc_s {int dummy;}; /* for buggy compilers */
+
+/* ===========================================================================
+ * Update a hash value with the given input byte
+ * IN assertion: all calls to to UPDATE_HASH are made with consecutive
+ * input characters, so that a running hash key can be computed from the
+ * previous key instead of complete recalculation each time.
+ */
+#define UPDATE_HASH(s,h,c) (h = (((h)<<s->hash_shift) ^ (c)) & s->hash_mask)
+
+
+/* ===========================================================================
+ * Insert string str in the dictionary and set match_head to the previous head
+ * of the hash chain (the most recent string with same hash key). Return
+ * the previous length of the hash chain.
+ * If this file is compiled with -DFASTEST, the compression level is forced
+ * to 1, and no hash chains are maintained.
+ * IN assertion: all calls to to INSERT_STRING are made with consecutive
+ * input characters and the first MIN_MATCH bytes of str are valid
+ * (except for the last MIN_MATCH-1 bytes of the input file).
+ */
+#ifdef FASTEST
+#define INSERT_STRING(s, str, match_head) \
+ (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \
+ match_head = s->head[s->ins_h], \
+ s->head[s->ins_h] = (Pos)(str))
+#else
+#define INSERT_STRING(s, str, match_head) \
+ (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \
+ s->prev[(str) & s->w_mask] = match_head = s->head[s->ins_h], \
+ s->head[s->ins_h] = (Pos)(str))
+#endif
+
+/* ===========================================================================
+ * Initialize the hash table (avoiding 64K overflow for 16 bit systems).
+ * prev[] will be initialized on the fly.
+ */
+#define CLEAR_HASH(s) \
+ s->head[s->hash_size-1] = NIL; \
+ zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head));
+
+/* ========================================================================= */
+int ZEXPORT deflateInit_(strm, level, version, stream_size)
+ z_streamp strm;
+ int level;
+ const char *version;
+ int stream_size;
+{
+ return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL,
+ Z_DEFAULT_STRATEGY, version, stream_size);
+ /* To do: ignore strm->next_in if we use it as window */
+}
+
+/* ========================================================================= */
+int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
+ version, stream_size)
+ z_streamp strm;
+ int level;
+ int method;
+ int windowBits;
+ int memLevel;
+ int strategy;
+ const char *version;
+ int stream_size;
+{
+ deflate_state *s;
+ int noheader = 0;
+ static const char* my_version = ZLIB_VERSION;
+
+ ushf *overlay;
+ /* We overlay pending_buf and d_buf+l_buf. This works since the average
+ * output size for (length,distance) codes is <= 24 bits.
+ */
+
+ if (version == Z_NULL || version[0] != my_version[0] ||
+ stream_size != sizeof(z_stream)) {
+ return Z_VERSION_ERROR;
+ }
+ if (strm == Z_NULL) return Z_STREAM_ERROR;
+
+ strm->msg = Z_NULL;
+ if (strm->zalloc == Z_NULL) {
+ strm->zalloc = zcalloc;
+ strm->opaque = (voidpf)0;
+ }
+ if (strm->zfree == Z_NULL) strm->zfree = zcfree;
+
+ if (level == Z_DEFAULT_COMPRESSION) level = 6;
+#ifdef FASTEST
+ level = 1;
+#endif
+
+ if (windowBits < 0) { /* undocumented feature: suppress zlib header */
+ noheader = 1;
+ windowBits = -windowBits;
+ }
+ if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED ||
+ windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||
+ strategy < 0 || strategy > Z_HUFFMAN_ONLY) {
+ return Z_STREAM_ERROR;
+ }
+ s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state));
+ if (s == Z_NULL) return Z_MEM_ERROR;
+ strm->state = (struct internal_state FAR *)s;
+ s->strm = strm;
+
+ s->noheader = noheader;
+ s->w_bits = windowBits;
+ s->w_size = 1 << s->w_bits;
+ s->w_mask = s->w_size - 1;
+
+ s->hash_bits = memLevel + 7;
+ s->hash_size = 1 << s->hash_bits;
+ s->hash_mask = s->hash_size - 1;
+ s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH);
+
+ s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte));
+ s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos));
+ s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos));
+
+ s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */
+
+ overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2);
+ s->pending_buf = (uchf *) overlay;
+ s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L);
+
+ if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL ||
+ s->pending_buf == Z_NULL) {
+ strm->msg = (char*)ERR_MSG(Z_MEM_ERROR);
+ deflateEnd (strm);
+ return Z_MEM_ERROR;
+ }
+ s->d_buf = overlay + s->lit_bufsize/sizeof(ush);
+ s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize;
+
+ s->level = level;
+ s->strategy = strategy;
+ s->method = (Byte)method;
+
+ return deflateReset(strm);
+}
+
+/* ========================================================================= */
+int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength)
+ z_streamp strm;
+ const Bytef *dictionary;
+ uInt dictLength;
+{
+ deflate_state *s;
+ uInt length = dictLength;
+ uInt n;
+ IPos hash_head = 0;
+
+ if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL ||
+ strm->state->status != INIT_STATE) return Z_STREAM_ERROR;
+
+ s = strm->state;
+ strm->adler = adler32(strm->adler, dictionary, dictLength);
+
+ if (length < MIN_MATCH) return Z_OK;
+ if (length > MAX_DIST(s)) {
+ length = MAX_DIST(s);
+#ifndef USE_DICT_HEAD
+ dictionary += dictLength - length; /* use the tail of the dictionary */
+#endif
+ }
+ zmemcpy(s->window, dictionary, length);
+ s->strstart = length;
+ s->block_start = (long)length;
+
+ /* Insert all strings in the hash table (except for the last two bytes).
+ * s->lookahead stays null, so s->ins_h will be recomputed at the next
+ * call of fill_window.
+ */
+ s->ins_h = s->window[0];
+ UPDATE_HASH(s, s->ins_h, s->window[1]);
+ for (n = 0; n <= length - MIN_MATCH; n++) {
+ INSERT_STRING(s, n, hash_head);
+ }
+ if (hash_head) hash_head = 0; /* to make compiler happy */
+ return Z_OK;
+}
+
+/* ========================================================================= */
+int ZEXPORT deflateReset (strm)
+ z_streamp strm;
+{
+ deflate_state *s;
+
+ if (strm == Z_NULL || strm->state == Z_NULL ||
+ strm->zalloc == Z_NULL || strm->zfree == Z_NULL) return Z_STREAM_ERROR;
+
+ strm->total_in = strm->total_out = 0;
+ strm->msg = Z_NULL; /* use zfree if we ever allocate msg dynamically */
+ strm->data_type = Z_UNKNOWN;
+
+ s = (deflate_state *)strm->state;
+ s->pending = 0;
+ s->pending_out = s->pending_buf;
+
+ if (s->noheader < 0) {
+ s->noheader = 0; /* was set to -1 by deflate(..., Z_FINISH); */
+ }
+ s->status = s->noheader ? BUSY_STATE : INIT_STATE;
+ strm->adler = 1;
+ s->last_flush = Z_NO_FLUSH;
+
+ _tr_init(s);
+ lm_init(s);
+
+ return Z_OK;
+}
+
+/* ========================================================================= */
+int ZEXPORT deflateParams(strm, level, strategy)
+ z_streamp strm;
+ int level;
+ int strategy;
+{
+ deflate_state *s;
+ compress_func func;
+ int err = Z_OK;
+
+ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
+ s = strm->state;
+
+ if (level == Z_DEFAULT_COMPRESSION) {
+ level = 6;
+ }
+ if (level < 0 || level > 9 || strategy < 0 || strategy > Z_HUFFMAN_ONLY) {
+ return Z_STREAM_ERROR;
+ }
+ func = configuration_table[s->level].func;
+
+ if (func != configuration_table[level].func && strm->total_in != 0) {
+ /* Flush the last buffer: */
+ err = deflate(strm, Z_PARTIAL_FLUSH);
+ }
+ if (s->level != level) {
+ s->level = level;
+ s->max_lazy_match = configuration_table[level].max_lazy;
+ s->good_match = configuration_table[level].good_length;
+ s->nice_match = configuration_table[level].nice_length;
+ s->max_chain_length = configuration_table[level].max_chain;
+ }
+ s->strategy = strategy;
+ return err;
+}
+
+/* =========================================================================
+ * Put a short in the pending buffer. The 16-bit value is put in MSB order.
+ * IN assertion: the stream state is correct and there is enough room in
+ * pending_buf.
+ */
+local void putShortMSB (s, b)
+ deflate_state *s;
+ uInt b;
+{
+ put_byte(s, (Byte)(b >> 8));
+ put_byte(s, (Byte)(b & 0xff));
+}
+
+/* =========================================================================
+ * Flush as much pending output as possible. All deflate() output goes
+ * through this function so some applications may wish to modify it
+ * to avoid allocating a large strm->next_out buffer and copying into it.
+ * (See also read_buf()).
+ */
+local void flush_pending(strm)
+ z_streamp strm;
+{
+ unsigned len = strm->state->pending;
+
+ if (len > strm->avail_out) len = strm->avail_out;
+ if (len == 0) return;
+
+ zmemcpy(strm->next_out, strm->state->pending_out, len);
+ strm->next_out += len;
+ strm->state->pending_out += len;
+ strm->total_out += len;
+ strm->avail_out -= len;
+ strm->state->pending -= len;
+ if (strm->state->pending == 0) {
+ strm->state->pending_out = strm->state->pending_buf;
+ }
+}
+
+/* ========================================================================= */
+int ZEXPORT deflate (strm, flush)
+ z_streamp strm;
+ int flush;
+{
+ int old_flush; /* value of flush param for previous deflate call */
+ deflate_state *s;
+
+ if (strm == Z_NULL || strm->state == Z_NULL ||
+ flush > Z_FINISH || flush < 0) {
+ return Z_STREAM_ERROR;
+ }
+ s = strm->state;
+
+ if (strm->next_out == Z_NULL ||
+ (strm->next_in == Z_NULL && strm->avail_in != 0) ||
+ (s->status == FINISH_STATE && flush != Z_FINISH)) {
+ ERR_RETURN(strm, Z_STREAM_ERROR);
+ }
+ if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR);
+
+ s->strm = strm; /* just in case */
+ old_flush = s->last_flush;
+ s->last_flush = flush;
+
+ /* Write the zlib header */
+ if (s->status == INIT_STATE) {
+
+ uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8;
+ uInt level_flags = (s->level-1) >> 1;
+
+ if (level_flags > 3) level_flags = 3;
+ header |= (level_flags << 6);
+ if (s->strstart != 0) header |= PRESET_DICT;
+ header += 31 - (header % 31);
+
+ s->status = BUSY_STATE;
+ putShortMSB(s, header);
+
+ /* Save the adler32 of the preset dictionary: */
+ if (s->strstart != 0) {
+ putShortMSB(s, (uInt)(strm->adler >> 16));
+ putShortMSB(s, (uInt)(strm->adler & 0xffff));
+ }
+ strm->adler = 1L;
+ }
+
+ /* Flush as much pending output as possible */
+ if (s->pending != 0) {
+ flush_pending(strm);
+ if (strm->avail_out == 0) {
+ /* Since avail_out is 0, deflate will be called again with
+ * more output space, but possibly with both pending and
+ * avail_in equal to zero. There won't be anything to do,
+ * but this is not an error situation so make sure we
+ * return OK instead of BUF_ERROR at next call of deflate:
+ */
+ s->last_flush = -1;
+ return Z_OK;
+ }
+
+ /* Make sure there is something to do and avoid duplicate consecutive
+ * flushes. For repeated and useless calls with Z_FINISH, we keep
+ * returning Z_STREAM_END instead of Z_BUFF_ERROR.
+ */
+ } else if (strm->avail_in == 0 && flush <= old_flush &&
+ flush != Z_FINISH) {
+ ERR_RETURN(strm, Z_BUF_ERROR);
+ }
+
+ /* User must not provide more input after the first FINISH: */
+ if (s->status == FINISH_STATE && strm->avail_in != 0) {
+ ERR_RETURN(strm, Z_BUF_ERROR);
+ }
+
+ /* Start a new block or continue the current one.
+ */
+ if (strm->avail_in != 0 || s->lookahead != 0 ||
+ (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) {
+ block_state bstate;
+
+ bstate = (*(configuration_table[s->level].func))(s, flush);
+
+ if (bstate == finish_started || bstate == finish_done) {
+ s->status = FINISH_STATE;
+ }
+ if (bstate == need_more || bstate == finish_started) {
+ if (strm->avail_out == 0) {
+ s->last_flush = -1; /* avoid BUF_ERROR next call, see above */
+ }
+ return Z_OK;
+ /* If flush != Z_NO_FLUSH && avail_out == 0, the next call
+ * of deflate should use the same flush parameter to make sure
+ * that the flush is complete. So we don't have to output an
+ * empty block here, this will be done at next call. This also
+ * ensures that for a very small output buffer, we emit at most
+ * one empty block.
+ */
+ }
+ if (bstate == block_done) {
+ if (flush == Z_PARTIAL_FLUSH) {
+ _tr_align(s);
+ } else { /* FULL_FLUSH or SYNC_FLUSH */
+ _tr_stored_block(s, (char*)0, 0L, 0);
+ /* For a full flush, this empty block will be recognized
+ * as a special marker by inflate_sync().
+ */
+ if (flush == Z_FULL_FLUSH) {
+ CLEAR_HASH(s); /* forget history */
+ }
+ }
+ flush_pending(strm);
+ if (strm->avail_out == 0) {
+ s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */
+ return Z_OK;
+ }
+ }
+ }
+ Assert(strm->avail_out > 0, "bug2");
+
+ if (flush != Z_FINISH) return Z_OK;
+ if (s->noheader) return Z_STREAM_END;
+
+ /* Write the zlib trailer (adler32) */
+ putShortMSB(s, (uInt)(strm->adler >> 16));
+ putShortMSB(s, (uInt)(strm->adler & 0xffff));
+ flush_pending(strm);
+ /* If avail_out is zero, the application will call deflate again
+ * to flush the rest.
+ */
+ s->noheader = -1; /* write the trailer only once! */
+ return s->pending != 0 ? Z_OK : Z_STREAM_END;
+}
+
+/* ========================================================================= */
+int ZEXPORT deflateEnd (strm)
+ z_streamp strm;
+{
+ int status;
+
+ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
+
+ status = strm->state->status;
+ if (status != INIT_STATE && status != BUSY_STATE &&
+ status != FINISH_STATE) {
+ return Z_STREAM_ERROR;
+ }
+
+ /* Deallocate in reverse order of allocations: */
+ TRY_FREE(strm, strm->state->pending_buf);
+ TRY_FREE(strm, strm->state->head);
+ TRY_FREE(strm, strm->state->prev);
+ TRY_FREE(strm, strm->state->window);
+
+ ZFREE(strm, strm->state);
+ strm->state = Z_NULL;
+
+ return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK;
+}
+
+/* =========================================================================
+ * Copy the source state to the destination state.
+ * To simplify the source, this is not supported for 16-bit MSDOS (which
+ * doesn't have enough memory anyway to duplicate compression states).
+ */
+int ZEXPORT deflateCopy (dest, source)
+ z_streamp dest;
+ z_streamp source;
+{
+#ifdef MAXSEG_64K
+ return Z_STREAM_ERROR;
+#else
+ deflate_state *ds;
+ deflate_state *ss;
+ ushf *overlay;
+
+
+ if (source == Z_NULL || dest == Z_NULL || source->state == Z_NULL) {
+ return Z_STREAM_ERROR;
+ }
+
+ ss = source->state;
+
+ *dest = *source;
+
+ ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state));
+ if (ds == Z_NULL) return Z_MEM_ERROR;
+ dest->state = (struct internal_state FAR *) ds;
+ *ds = *ss;
+ ds->strm = dest;
+
+ ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte));
+ ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos));
+ ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos));
+ overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2);
+ ds->pending_buf = (uchf *) overlay;
+
+ if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL ||
+ ds->pending_buf == Z_NULL) {
+ deflateEnd (dest);
+ return Z_MEM_ERROR;
+ }
+ /* following zmemcpy do not work for 16-bit MSDOS */
+ zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte));
+ zmemcpy(ds->prev, ss->prev, ds->w_size * sizeof(Pos));
+ zmemcpy(ds->head, ss->head, ds->hash_size * sizeof(Pos));
+ zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size);
+
+ ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf);
+ ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush);
+ ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize;
+
+ ds->l_desc.dyn_tree = ds->dyn_ltree;
+ ds->d_desc.dyn_tree = ds->dyn_dtree;
+ ds->bl_desc.dyn_tree = ds->bl_tree;
+
+ return Z_OK;
+#endif
+}
+
+/* ===========================================================================
+ * Read a new buffer from the current input stream, update the adler32
+ * and total number of bytes read. All deflate() input goes through
+ * this function so some applications may wish to modify it to avoid
+ * allocating a large strm->next_in buffer and copying from it.
+ * (See also flush_pending()).
+ */
+local int read_buf(strm, buf, size)
+ z_streamp strm;
+ Bytef *buf;
+ unsigned size;
+{
+ unsigned len = strm->avail_in;
+
+ if (len > size) len = size;
+ if (len == 0) return 0;
+
+ strm->avail_in -= len;
+
+ if (!strm->state->noheader) {
+ strm->adler = adler32(strm->adler, strm->next_in, len);
+ }
+ zmemcpy(buf, strm->next_in, len);
+ strm->next_in += len;
+ strm->total_in += len;
+
+ return (int)len;
+}
+
+/* ===========================================================================
+ * Initialize the "longest match" routines for a new zlib stream
+ */
+local void lm_init (s)
+ deflate_state *s;
+{
+ s->window_size = (ulg)2L*s->w_size;
+
+ CLEAR_HASH(s);
+
+ /* Set the default configuration parameters:
+ */
+ s->max_lazy_match = configuration_table[s->level].max_lazy;
+ s->good_match = configuration_table[s->level].good_length;
+ s->nice_match = configuration_table[s->level].nice_length;
+ s->max_chain_length = configuration_table[s->level].max_chain;
+
+ s->strstart = 0;
+ s->block_start = 0L;
+ s->lookahead = 0;
+ s->match_length = s->prev_length = MIN_MATCH-1;
+ s->match_available = 0;
+ s->ins_h = 0;
+#ifdef ASMV
+ match_init(); /* initialize the asm code */
+#endif
+}
+
+/* ===========================================================================
+ * Set match_start to the longest match starting at the given string and
+ * return its length. Matches shorter or equal to prev_length are discarded,
+ * in which case the result is equal to prev_length and match_start is
+ * garbage.
+ * IN assertions: cur_match is the head of the hash chain for the current
+ * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1
+ * OUT assertion: the match length is not greater than s->lookahead.
+ */
+#ifndef ASMV
+/* For 80x86 and 680x0, an optimized version will be provided in match.asm or
+ * match.S. The code will be functionally equivalent.
+ */
+#ifndef FASTEST
+local uInt longest_match(s, cur_match)
+ deflate_state *s;
+ IPos cur_match; /* current match */
+{
+ unsigned chain_length = s->max_chain_length;/* max hash chain length */
+ register Bytef *scan = s->window + s->strstart; /* current string */
+ register Bytef *match; /* matched string */
+ register int len; /* length of current match */
+ int best_len = s->prev_length; /* best match length so far */
+ int nice_match = s->nice_match; /* stop if match long enough */
+ IPos limit = s->strstart > (IPos)MAX_DIST(s) ?
+ s->strstart - (IPos)MAX_DIST(s) : NIL;
+ /* Stop when cur_match becomes <= limit. To simplify the code,
+ * we prevent matches with the string of window index 0.
+ */
+ Posf *prev = s->prev;
+ uInt wmask = s->w_mask;
+
+#ifdef UNALIGNED_OK
+ /* Compare two bytes at a time. Note: this is not always beneficial.
+ * Try with and without -DUNALIGNED_OK to check.
+ */
+ register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1;
+ register ush scan_start = *(ushf*)scan;
+ register ush scan_end = *(ushf*)(scan+best_len-1);
+#else
+ register Bytef *strend = s->window + s->strstart + MAX_MATCH;
+ register Byte scan_end1 = scan[best_len-1];
+ register Byte scan_end = scan[best_len];
+#endif
+
+ /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
+ * It is easy to get rid of this optimization if necessary.
+ */
+ Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever");
+
+ /* Do not waste too much time if we already have a good match: */
+ if (s->prev_length >= s->good_match) {
+ chain_length >>= 2;
+ }
+ /* Do not look for matches beyond the end of the input. This is necessary
+ * to make deflate deterministic.
+ */
+ if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead;
+
+ Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");
+
+ do {
+ Assert(cur_match < s->strstart, "no future");
+ match = s->window + cur_match;
+
+ /* Skip to next match if the match length cannot increase
+ * or if the match length is less than 2:
+ */
+#if (defined(UNALIGNED_OK) && MAX_MATCH == 258)
+ /* This code assumes sizeof(unsigned short) == 2. Do not use
+ * UNALIGNED_OK if your compiler uses a different size.
+ */
+ if (*(ushf*)(match+best_len-1) != scan_end ||
+ *(ushf*)match != scan_start) continue;
+
+ /* It is not necessary to compare scan[2] and match[2] since they are
+ * always equal when the other bytes match, given that the hash keys
+ * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at
+ * strstart+3, +5, ... up to strstart+257. We check for insufficient
+ * lookahead only every 4th comparison; the 128th check will be made
+ * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is
+ * necessary to put more guard bytes at the end of the window, or
+ * to check more often for insufficient lookahead.
+ */
+ Assert(scan[2] == match[2], "scan[2]?");
+ scan++, match++;
+ do {
+ } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
+ *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
+ *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
+ *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
+ scan < strend);
+ /* The funny "do {}" generates better code on most compilers */
+
+ /* Here, scan <= window+strstart+257 */
+ Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
+ if (*scan == *match) scan++;
+
+ len = (MAX_MATCH - 1) - (int)(strend-scan);
+ scan = strend - (MAX_MATCH-1);
+
+#else /* UNALIGNED_OK */
+
+ if (match[best_len] != scan_end ||
+ match[best_len-1] != scan_end1 ||
+ *match != *scan ||
+ *++match != scan[1]) continue;
+
+ /* The check at best_len-1 can be removed because it will be made
+ * again later. (This heuristic is not always a win.)
+ * It is not necessary to compare scan[2] and match[2] since they
+ * are always equal when the other bytes match, given that
+ * the hash keys are equal and that HASH_BITS >= 8.
+ */
+ scan += 2, match++;
+ Assert(*scan == *match, "match[2]?");
+
+ /* We check for insufficient lookahead only every 8th comparison;
+ * the 256th check will be made at strstart+258.
+ */
+ do {
+ } while (*++scan == *++match && *++scan == *++match &&
+ *++scan == *++match && *++scan == *++match &&
+ *++scan == *++match && *++scan == *++match &&
+ *++scan == *++match && *++scan == *++match &&
+ scan < strend);
+
+ Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
+
+ len = MAX_MATCH - (int)(strend - scan);
+ scan = strend - MAX_MATCH;
+
+#endif /* UNALIGNED_OK */
+
+ if (len > best_len) {
+ s->match_start = cur_match;
+ best_len = len;
+ if (len >= nice_match) break;
+#ifdef UNALIGNED_OK
+ scan_end = *(ushf*)(scan+best_len-1);
+#else
+ scan_end1 = scan[best_len-1];
+ scan_end = scan[best_len];
+#endif
+ }
+ } while ((cur_match = prev[cur_match & wmask]) > limit
+ && --chain_length != 0);
+
+ if ((uInt)best_len <= s->lookahead) return (uInt)best_len;
+ return s->lookahead;
+}
+
+#else /* FASTEST */
+/* ---------------------------------------------------------------------------
+ * Optimized version for level == 1 only
+ */
+local uInt longest_match(s, cur_match)
+ deflate_state *s;
+ IPos cur_match; /* current match */
+{
+ register Bytef *scan = s->window + s->strstart; /* current string */
+ register Bytef *match; /* matched string */
+ register int len; /* length of current match */
+ register Bytef *strend = s->window + s->strstart + MAX_MATCH;
+
+ /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
+ * It is easy to get rid of this optimization if necessary.
+ */
+ Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever");
+
+ Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");
+
+ Assert(cur_match < s->strstart, "no future");
+
+ match = s->window + cur_match;
+
+ /* Return failure if the match length is less than 2:
+ */
+ if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1;
+
+ /* The check at best_len-1 can be removed because it will be made
+ * again later. (This heuristic is not always a win.)
+ * It is not necessary to compare scan[2] and match[2] since they
+ * are always equal when the other bytes match, given that
+ * the hash keys are equal and that HASH_BITS >= 8.
+ */
+ scan += 2, match += 2;
+ Assert(*scan == *match, "match[2]?");
+
+ /* We check for insufficient lookahead only every 8th comparison;
+ * the 256th check will be made at strstart+258.
+ */
+ do {
+ } while (*++scan == *++match && *++scan == *++match &&
+ *++scan == *++match && *++scan == *++match &&
+ *++scan == *++match && *++scan == *++match &&
+ *++scan == *++match && *++scan == *++match &&
+ scan < strend);
+
+ Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
+
+ len = MAX_MATCH - (int)(strend - scan);
+
+ if (len < MIN_MATCH) return MIN_MATCH - 1;
+
+ s->match_start = cur_match;
+ return len <= s->lookahead ? len : s->lookahead;
+}
+#endif /* FASTEST */
+#endif /* ASMV */
+
+#ifdef DEBUG
+/* ===========================================================================
+ * Check that the match at match_start is indeed a match.
+ */
+local void check_match(s, start, match, length)
+ deflate_state *s;
+ IPos start, match;
+ int length;
+{
+ /* check that the match is indeed a match */
+ if (zmemcmp(s->window + match,
+ s->window + start, length) != EQUAL) {
+ fprintf(stderr, " start %u, match %u, length %d\n",
+ start, match, length);
+ do {
+ fprintf(stderr, "%c%c", s->window[match++], s->window[start++]);
+ } while (--length != 0);
+ z_error("invalid match");
+ }
+ if (z_verbose > 1) {
+ fprintf(stderr,"\\[%d,%d]", start-match, length);
+ do { putc(s->window[start++], stderr); } while (--length != 0);
+ }
+}
+#else
+# define check_match(s, start, match, length)
+#endif
+
+/* ===========================================================================
+ * Fill the window when the lookahead becomes insufficient.
+ * Updates strstart and lookahead.
+ *
+ * IN assertion: lookahead < MIN_LOOKAHEAD
+ * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD
+ * At least one byte has been read, or avail_in == 0; reads are
+ * performed for at least two bytes (required for the zip translate_eol
+ * option -- not supported here).
+ */
+local void fill_window(s)
+ deflate_state *s;
+{
+ register unsigned n, m;
+ register Posf *p;
+ unsigned more; /* Amount of free space at the end of the window. */
+ uInt wsize = s->w_size;
+
+ do {
+ more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart);
+
+ /* Deal with !@#$% 64K limit: */
+ if (more == 0 && s->strstart == 0 && s->lookahead == 0) {
+ more = wsize;
+
+ } else if (more == (unsigned)(-1)) {
+ /* Very unlikely, but possible on 16 bit machine if strstart == 0
+ * and lookahead == 1 (input done one byte at time)
+ */
+ more--;
+
+ /* If the window is almost full and there is insufficient lookahead,
+ * move the upper half to the lower one to make room in the upper half.
+ */
+ } else if (s->strstart >= wsize+MAX_DIST(s)) {
+
+ zmemcpy(s->window, s->window+wsize, (unsigned)wsize);
+ s->match_start -= wsize;
+ s->strstart -= wsize; /* we now have strstart >= MAX_DIST */
+ s->block_start -= (long) wsize;
+
+ /* Slide the hash table (could be avoided with 32 bit values
+ at the expense of memory usage). We slide even when level == 0
+ to keep the hash table consistent if we switch back to level > 0
+ later. (Using level 0 permanently is not an optimal usage of
+ zlib, so we don't care about this pathological case.)
+ */
+ n = s->hash_size;
+ p = &s->head[n];
+ do {
+ m = *--p;
+ *p = (Pos)(m >= wsize ? m-wsize : NIL);
+ } while (--n);
+
+ n = wsize;
+#ifndef FASTEST
+ p = &s->prev[n];
+ do {
+ m = *--p;
+ *p = (Pos)(m >= wsize ? m-wsize : NIL);
+ /* If n is not on any hash chain, prev[n] is garbage but
+ * its value will never be used.
+ */
+ } while (--n);
+#endif
+ more += wsize;
+ }
+ if (s->strm->avail_in == 0) return;
+
+ /* If there was no sliding:
+ * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&
+ * more == window_size - lookahead - strstart
+ * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)
+ * => more >= window_size - 2*WSIZE + 2
+ * In the BIG_MEM or MMAP case (not yet supported),
+ * window_size == input_size + MIN_LOOKAHEAD &&
+ * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.
+ * Otherwise, window_size == 2*WSIZE so more >= 2.
+ * If there was sliding, more >= WSIZE. So in all cases, more >= 2.
+ */
+ Assert(more >= 2, "more < 2");
+
+ n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more);
+ s->lookahead += n;
+
+ /* Initialize the hash value now that we have some input: */
+ if (s->lookahead >= MIN_MATCH) {
+ s->ins_h = s->window[s->strstart];
+ UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]);
+#if MIN_MATCH != 3
+ Call UPDATE_HASH() MIN_MATCH-3 more times
+#endif
+ }
+ /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,
+ * but this is not important since only literal bytes will be emitted.
+ */
+
+ } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0);
+}
+
+/* ===========================================================================
+ * Flush the current block, with given end-of-file flag.
+ * IN assertion: strstart is set to the end of the current match.
+ */
+#define FLUSH_BLOCK_ONLY(s, eof) { \
+ _tr_flush_block(s, (s->block_start >= 0L ? \
+ (charf *)&s->window[(unsigned)s->block_start] : \
+ (charf *)Z_NULL), \
+ (ulg)((long)s->strstart - s->block_start), \
+ (eof)); \
+ s->block_start = s->strstart; \
+ flush_pending(s->strm); \
+ Tracev((stderr,"[FLUSH]")); \
+}
+
+/* Same but force premature exit if necessary. */
+#define FLUSH_BLOCK(s, eof) { \
+ FLUSH_BLOCK_ONLY(s, eof); \
+ if (s->strm->avail_out == 0) return (eof) ? finish_started : need_more; \
+}
+
+/* ===========================================================================
+ * Copy without compression as much as possible from the input stream, return
+ * the current block state.
+ * This function does not insert new strings in the dictionary since
+ * uncompressible data is probably not useful. This function is used
+ * only for the level=0 compression option.
+ * NOTE: this function should be optimized to avoid extra copying from
+ * window to pending_buf.
+ */
+local block_state deflate_stored(s, flush)
+ deflate_state *s;
+ int flush;
+{
+ /* Stored blocks are limited to 0xffff bytes, pending_buf is limited
+ * to pending_buf_size, and each stored block has a 5 byte header:
+ */
+ ulg max_block_size = 0xffff;
+ ulg max_start;
+
+ if (max_block_size > s->pending_buf_size - 5) {
+ max_block_size = s->pending_buf_size - 5;
+ }
+
+ /* Copy as much as possible from input to output: */
+ for (;;) {
+ /* Fill the window as much as possible: */
+ if (s->lookahead <= 1) {
+
+ Assert(s->strstart < s->w_size+MAX_DIST(s) ||
+ s->block_start >= (long)s->w_size, "slide too late");
+
+ fill_window(s);
+ if (s->lookahead == 0 && flush == Z_NO_FLUSH) return need_more;
+
+ if (s->lookahead == 0) break; /* flush the current block */
+ }
+ Assert(s->block_start >= 0L, "block gone");
+
+ s->strstart += s->lookahead;
+ s->lookahead = 0;
+
+ /* Emit a stored block if pending_buf will be full: */
+ max_start = s->block_start + max_block_size;
+ if (s->strstart == 0 || (ulg)s->strstart >= max_start) {
+ /* strstart == 0 is possible when wraparound on 16-bit machine */
+ s->lookahead = (uInt)(s->strstart - max_start);
+ s->strstart = (uInt)max_start;
+ FLUSH_BLOCK(s, 0);
+ }
+ /* Flush if we may have to slide, otherwise block_start may become
+ * negative and the data will be gone:
+ */
+ if (s->strstart - (uInt)s->block_start >= MAX_DIST(s)) {
+ FLUSH_BLOCK(s, 0);
+ }
+ }
+ FLUSH_BLOCK(s, flush == Z_FINISH);
+ return flush == Z_FINISH ? finish_done : block_done;
+}
+
+/* ===========================================================================
+ * Compress as much as possible from the input stream, return the current
+ * block state.
+ * This function does not perform lazy evaluation of matches and inserts
+ * new strings in the dictionary only for unmatched strings or for short
+ * matches. It is used only for the fast compression options.
+ */
+local block_state deflate_fast(s, flush)
+ deflate_state *s;
+ int flush;
+{
+ IPos hash_head = NIL; /* head of the hash chain */
+ int bflush; /* set if current block must be flushed */
+
+ for (;;) {
+ /* Make sure that we always have enough lookahead, except
+ * at the end of the input file. We need MAX_MATCH bytes
+ * for the next match, plus MIN_MATCH bytes to insert the
+ * string following the next match.
+ */
+ if (s->lookahead < MIN_LOOKAHEAD) {
+ fill_window(s);
+ if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) {
+ return need_more;
+ }
+ if (s->lookahead == 0) break; /* flush the current block */
+ }
+
+ /* Insert the string window[strstart .. strstart+2] in the
+ * dictionary, and set hash_head to the head of the hash chain:
+ */
+ if (s->lookahead >= MIN_MATCH) {
+ INSERT_STRING(s, s->strstart, hash_head);
+ }
+
+ /* Find the longest match, discarding those <= prev_length.
+ * At this point we have always match_length < MIN_MATCH
+ */
+ if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) {
+ /* To simplify the code, we prevent matches with the string
+ * of window index 0 (in particular we have to avoid a match
+ * of the string with itself at the start of the input file).
+ */
+ if (s->strategy != Z_HUFFMAN_ONLY) {
+ s->match_length = longest_match (s, hash_head);
+ }
+ /* longest_match() sets match_start */
+ }
+ if (s->match_length >= MIN_MATCH) {
+ check_match(s, s->strstart, s->match_start, s->match_length);
+
+ _tr_tally_dist(s, s->strstart - s->match_start,
+ s->match_length - MIN_MATCH, bflush);
+
+ s->lookahead -= s->match_length;
+
+ /* Insert new strings in the hash table only if the match length
+ * is not too large. This saves time but degrades compression.
+ */
+#ifndef FASTEST
+ if (s->match_length <= s->max_insert_length &&
+ s->lookahead >= MIN_MATCH) {
+ s->match_length--; /* string at strstart already in hash table */
+ do {
+ s->strstart++;
+ INSERT_STRING(s, s->strstart, hash_head);
+ /* strstart never exceeds WSIZE-MAX_MATCH, so there are
+ * always MIN_MATCH bytes ahead.
+ */
+ } while (--s->match_length != 0);
+ s->strstart++;
+ } else
+#endif
+ {
+ s->strstart += s->match_length;
+ s->match_length = 0;
+ s->ins_h = s->window[s->strstart];
+ UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]);
+#if MIN_MATCH != 3
+ Call UPDATE_HASH() MIN_MATCH-3 more times
+#endif
+ /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not
+ * matter since it will be recomputed at next deflate call.
+ */
+ }
+ } else {
+ /* No match, output a literal byte */
+ Tracevv((stderr,"%c", s->window[s->strstart]));
+ _tr_tally_lit (s, s->window[s->strstart], bflush);
+ s->lookahead--;
+ s->strstart++;
+ }
+ if (bflush) FLUSH_BLOCK(s, 0);
+ }
+ FLUSH_BLOCK(s, flush == Z_FINISH);
+ return flush == Z_FINISH ? finish_done : block_done;
+}
+
+/* ===========================================================================
+ * Same as above, but achieves better compression. We use a lazy
+ * evaluation for matches: a match is finally adopted only if there is
+ * no better match at the next window position.
+ */
+local block_state deflate_slow(s, flush)
+ deflate_state *s;
+ int flush;
+{
+ IPos hash_head = NIL; /* head of hash chain */
+ int bflush; /* set if current block must be flushed */
+
+ /* Process the input block. */
+ for (;;) {
+ /* Make sure that we always have enough lookahead, except
+ * at the end of the input file. We need MAX_MATCH bytes
+ * for the next match, plus MIN_MATCH bytes to insert the
+ * string following the next match.
+ */
+ if (s->lookahead < MIN_LOOKAHEAD) {
+ fill_window(s);
+ if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) {
+ return need_more;
+ }
+ if (s->lookahead == 0) break; /* flush the current block */
+ }
+
+ /* Insert the string window[strstart .. strstart+2] in the
+ * dictionary, and set hash_head to the head of the hash chain:
+ */
+ if (s->lookahead >= MIN_MATCH) {
+ INSERT_STRING(s, s->strstart, hash_head);
+ }
+
+ /* Find the longest match, discarding those <= prev_length.
+ */
+ s->prev_length = s->match_length, s->prev_match = s->match_start;
+ s->match_length = MIN_MATCH-1;
+
+ if (hash_head != NIL && s->prev_length < s->max_lazy_match &&
+ s->strstart - hash_head <= MAX_DIST(s)) {
+ /* To simplify the code, we prevent matches with the string
+ * of window index 0 (in particular we have to avoid a match
+ * of the string with itself at the start of the input file).
+ */
+ if (s->strategy != Z_HUFFMAN_ONLY) {
+ s->match_length = longest_match (s, hash_head);
+ }
+ /* longest_match() sets match_start */
+
+ if (s->match_length <= 5 && (s->strategy == Z_FILTERED ||
+ (s->match_length == MIN_MATCH &&
+ s->strstart - s->match_start > TOO_FAR))) {
+
+ /* If prev_match is also MIN_MATCH, match_start is garbage
+ * but we will ignore the current match anyway.
+ */
+ s->match_length = MIN_MATCH-1;
+ }
+ }
+ /* If there was a match at the previous step and the current
+ * match is not better, output the previous match:
+ */
+ if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) {
+ uInt max_insert = s->strstart + s->lookahead - MIN_MATCH;
+ /* Do not insert strings in hash table beyond this. */
+
+ check_match(s, s->strstart-1, s->prev_match, s->prev_length);
+
+ _tr_tally_dist(s, s->strstart -1 - s->prev_match,
+ s->prev_length - MIN_MATCH, bflush);
+
+ /* Insert in hash table all strings up to the end of the match.
+ * strstart-1 and strstart are already inserted. If there is not
+ * enough lookahead, the last two strings are not inserted in
+ * the hash table.
+ */
+ s->lookahead -= s->prev_length-1;
+ s->prev_length -= 2;
+ do {
+ if (++s->strstart <= max_insert) {
+ INSERT_STRING(s, s->strstart, hash_head);
+ }
+ } while (--s->prev_length != 0);
+ s->match_available = 0;
+ s->match_length = MIN_MATCH-1;
+ s->strstart++;
+
+ if (bflush) FLUSH_BLOCK(s, 0);
+
+ } else if (s->match_available) {
+ /* If there was no match at the previous position, output a
+ * single literal. If there was a match but the current match
+ * is longer, truncate the previous match to a single literal.
+ */
+ Tracevv((stderr,"%c", s->window[s->strstart-1]));
+ _tr_tally_lit(s, s->window[s->strstart-1], bflush);
+ if (bflush) {
+ FLUSH_BLOCK_ONLY(s, 0);
+ }
+ s->strstart++;
+ s->lookahead--;
+ if (s->strm->avail_out == 0) return need_more;
+ } else {
+ /* There is no previous match to compare with, wait for
+ * the next step to decide.
+ */
+ s->match_available = 1;
+ s->strstart++;
+ s->lookahead--;
+ }
+ }
+ Assert (flush != Z_NO_FLUSH, "no flush?");
+ if (s->match_available) {
+ Tracevv((stderr,"%c", s->window[s->strstart-1]));
+ _tr_tally_lit(s, s->window[s->strstart-1], bflush);
+ s->match_available = 0;
+ }
+ FLUSH_BLOCK(s, flush == Z_FINISH);
+ return flush == Z_FINISH ? finish_done : block_done;
+}
diff --git a/zlib/deflate.h b/zlib/deflate.h
new file mode 100644
index 00000000000..962676da869
--- /dev/null
+++ b/zlib/deflate.h
@@ -0,0 +1,318 @@
+/* deflate.h -- internal compression state
+ * Copyright (C) 1995-1998 Jean-loup Gailly
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* WARNING: this file should *not* be used by applications. It is
+ part of the implementation of the compression library and is
+ subject to change. Applications should only use zlib.h.
+ */
+
+/* @(#) $Id$ */
+
+#ifndef _DEFLATE_H
+#define _DEFLATE_H
+
+#include "zutil.h"
+
+/* ===========================================================================
+ * Internal compression state.
+ */
+
+#define LENGTH_CODES 29
+/* number of length codes, not counting the special END_BLOCK code */
+
+#define LITERALS 256
+/* number of literal bytes 0..255 */
+
+#define L_CODES (LITERALS+1+LENGTH_CODES)
+/* number of Literal or Length codes, including the END_BLOCK code */
+
+#define D_CODES 30
+/* number of distance codes */
+
+#define BL_CODES 19
+/* number of codes used to transfer the bit lengths */
+
+#define HEAP_SIZE (2*L_CODES+1)
+/* maximum heap size */
+
+#define MAX_BITS 15
+/* All codes must not exceed MAX_BITS bits */
+
+#define INIT_STATE 42
+#define BUSY_STATE 113
+#define FINISH_STATE 666
+/* Stream status */
+
+
+/* Data structure describing a single value and its code string. */
+typedef struct ct_data_s {
+ union {
+ ush freq; /* frequency count */
+ ush code; /* bit string */
+ } fc;
+ union {
+ ush dad; /* father node in Huffman tree */
+ ush len; /* length of bit string */
+ } dl;
+} FAR ct_data;
+
+#define Freq fc.freq
+#define Code fc.code
+#define Dad dl.dad
+#define Len dl.len
+
+typedef struct static_tree_desc_s static_tree_desc;
+
+typedef struct tree_desc_s {
+ ct_data *dyn_tree; /* the dynamic tree */
+ int max_code; /* largest code with non zero frequency */
+ static_tree_desc *stat_desc; /* the corresponding static tree */
+} FAR tree_desc;
+
+typedef ush Pos;
+typedef Pos FAR Posf;
+typedef unsigned IPos;
+
+/* A Pos is an index in the character window. We use short instead of int to
+ * save space in the various tables. IPos is used only for parameter passing.
+ */
+
+typedef struct internal_state {
+ z_streamp strm; /* pointer back to this zlib stream */
+ int status; /* as the name implies */
+ Bytef *pending_buf; /* output still pending */
+ ulg pending_buf_size; /* size of pending_buf */
+ Bytef *pending_out; /* next pending byte to output to the stream */
+ int pending; /* nb of bytes in the pending buffer */
+ int noheader; /* suppress zlib header and adler32 */
+ Byte data_type; /* UNKNOWN, BINARY or ASCII */
+ Byte method; /* STORED (for zip only) or DEFLATED */
+ int last_flush; /* value of flush param for previous deflate call */
+
+ /* used by deflate.c: */
+
+ uInt w_size; /* LZ77 window size (32K by default) */
+ uInt w_bits; /* log2(w_size) (8..16) */
+ uInt w_mask; /* w_size - 1 */
+
+ Bytef *window;
+ /* Sliding window. Input bytes are read into the second half of the window,
+ * and move to the first half later to keep a dictionary of at least wSize
+ * bytes. With this organization, matches are limited to a distance of
+ * wSize-MAX_MATCH bytes, but this ensures that IO is always
+ * performed with a length multiple of the block size. Also, it limits
+ * the window size to 64K, which is quite useful on MSDOS.
+ * To do: use the user input buffer as sliding window.
+ */
+
+ ulg window_size;
+ /* Actual size of window: 2*wSize, except when the user input buffer
+ * is directly used as sliding window.
+ */
+
+ Posf *prev;
+ /* Link to older string with same hash index. To limit the size of this
+ * array to 64K, this link is maintained only for the last 32K strings.
+ * An index in this array is thus a window index modulo 32K.
+ */
+
+ Posf *head; /* Heads of the hash chains or NIL. */
+
+ uInt ins_h; /* hash index of string to be inserted */
+ uInt hash_size; /* number of elements in hash table */
+ uInt hash_bits; /* log2(hash_size) */
+ uInt hash_mask; /* hash_size-1 */
+
+ uInt hash_shift;
+ /* Number of bits by which ins_h must be shifted at each input
+ * step. It must be such that after MIN_MATCH steps, the oldest
+ * byte no longer takes part in the hash key, that is:
+ * hash_shift * MIN_MATCH >= hash_bits
+ */
+
+ long block_start;
+ /* Window position at the beginning of the current output block. Gets
+ * negative when the window is moved backwards.
+ */
+
+ uInt match_length; /* length of best match */
+ IPos prev_match; /* previous match */
+ int match_available; /* set if previous match exists */
+ uInt strstart; /* start of string to insert */
+ uInt match_start; /* start of matching string */
+ uInt lookahead; /* number of valid bytes ahead in window */
+
+ uInt prev_length;
+ /* Length of the best match at previous step. Matches not greater than this
+ * are discarded. This is used in the lazy match evaluation.
+ */
+
+ uInt max_chain_length;
+ /* To speed up deflation, hash chains are never searched beyond this
+ * length. A higher limit improves compression ratio but degrades the
+ * speed.
+ */
+
+ uInt max_lazy_match;
+ /* Attempt to find a better match only when the current match is strictly
+ * smaller than this value. This mechanism is used only for compression
+ * levels >= 4.
+ */
+# define max_insert_length max_lazy_match
+ /* Insert new strings in the hash table only if the match length is not
+ * greater than this length. This saves time but degrades compression.
+ * max_insert_length is used only for compression levels <= 3.
+ */
+
+ int level; /* compression level (1..9) */
+ int strategy; /* favor or force Huffman coding*/
+
+ uInt good_match;
+ /* Use a faster search when the previous match is longer than this */
+
+ int nice_match; /* Stop searching when current match exceeds this */
+
+ /* used by trees.c: */
+ /* Didn't use ct_data typedef below to supress compiler warning */
+ struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */
+ struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */
+ struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */
+
+ struct tree_desc_s l_desc; /* desc. for literal tree */
+ struct tree_desc_s d_desc; /* desc. for distance tree */
+ struct tree_desc_s bl_desc; /* desc. for bit length tree */
+
+ ush bl_count[MAX_BITS+1];
+ /* number of codes at each bit length for an optimal tree */
+
+ int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */
+ int heap_len; /* number of elements in the heap */
+ int heap_max; /* element of largest frequency */
+ /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.
+ * The same heap array is used to build all trees.
+ */
+
+ uch depth[2*L_CODES+1];
+ /* Depth of each subtree used as tie breaker for trees of equal frequency
+ */
+
+ uchf *l_buf; /* buffer for literals or lengths */
+
+ uInt lit_bufsize;
+ /* Size of match buffer for literals/lengths. There are 4 reasons for
+ * limiting lit_bufsize to 64K:
+ * - frequencies can be kept in 16 bit counters
+ * - if compression is not successful for the first block, all input
+ * data is still in the window so we can still emit a stored block even
+ * when input comes from standard input. (This can also be done for
+ * all blocks if lit_bufsize is not greater than 32K.)
+ * - if compression is not successful for a file smaller than 64K, we can
+ * even emit a stored file instead of a stored block (saving 5 bytes).
+ * This is applicable only for zip (not gzip or zlib).
+ * - creating new Huffman trees less frequently may not provide fast
+ * adaptation to changes in the input data statistics. (Take for
+ * example a binary file with poorly compressible code followed by
+ * a highly compressible string table.) Smaller buffer sizes give
+ * fast adaptation but have of course the overhead of transmitting
+ * trees more frequently.
+ * - I can't count above 4
+ */
+
+ uInt last_lit; /* running index in l_buf */
+
+ ushf *d_buf;
+ /* Buffer for distances. To simplify the code, d_buf and l_buf have
+ * the same number of elements. To use different lengths, an extra flag
+ * array would be necessary.
+ */
+
+ ulg opt_len; /* bit length of current block with optimal trees */
+ ulg static_len; /* bit length of current block with static trees */
+ uInt matches; /* number of string matches in current block */
+ int last_eob_len; /* bit length of EOB code for last block */
+
+#ifdef DEBUG
+ ulg compressed_len; /* total bit length of compressed file mod 2^32 */
+ ulg bits_sent; /* bit length of compressed data sent mod 2^32 */
+#endif
+
+ ush bi_buf;
+ /* Output buffer. bits are inserted starting at the bottom (least
+ * significant bits).
+ */
+ int bi_valid;
+ /* Number of valid bits in bi_buf. All bits above the last valid bit
+ * are always zero.
+ */
+
+} FAR deflate_state;
+
+/* Output a byte on the stream.
+ * IN assertion: there is enough room in pending_buf.
+ */
+#define put_byte(s, c) {s->pending_buf[s->pending++] = (c);}
+
+
+#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1)
+/* Minimum amount of lookahead, except at the end of the input file.
+ * See deflate.c for comments about the MIN_MATCH+1.
+ */
+
+#define MAX_DIST(s) ((s)->w_size-MIN_LOOKAHEAD)
+/* In order to simplify the code, particularly on 16 bit machines, match
+ * distances are limited to MAX_DIST instead of WSIZE.
+ */
+
+ /* in trees.c */
+void _tr_init OF((deflate_state *s));
+int _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc));
+void _tr_flush_block OF((deflate_state *s, charf *buf, ulg stored_len,
+ int eof));
+void _tr_align OF((deflate_state *s));
+void _tr_stored_block OF((deflate_state *s, charf *buf, ulg stored_len,
+ int eof));
+
+#define d_code(dist) \
+ ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)])
+/* Mapping from a distance to a distance code. dist is the distance - 1 and
+ * must not have side effects. _dist_code[256] and _dist_code[257] are never
+ * used.
+ */
+
+#ifndef DEBUG
+/* Inline versions of _tr_tally for speed: */
+
+#if defined(GEN_TREES_H) || !defined(STDC)
+ extern uch _length_code[];
+ extern uch _dist_code[];
+#else
+ extern const uch _length_code[];
+ extern const uch _dist_code[];
+#endif
+
+# define _tr_tally_lit(s, c, flush) \
+ { uch cc = (c); \
+ s->d_buf[s->last_lit] = 0; \
+ s->l_buf[s->last_lit++] = cc; \
+ s->dyn_ltree[cc].Freq++; \
+ flush = (s->last_lit == s->lit_bufsize-1); \
+ }
+# define _tr_tally_dist(s, distance, length, flush) \
+ { uch len = (length); \
+ ush dist = (distance); \
+ s->d_buf[s->last_lit] = dist; \
+ s->l_buf[s->last_lit++] = len; \
+ dist--; \
+ s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \
+ s->dyn_dtree[d_code(dist)].Freq++; \
+ flush = (s->last_lit == s->lit_bufsize-1); \
+ }
+#else
+# define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c)
+# define _tr_tally_dist(s, distance, length, flush) \
+ flush = _tr_tally(s, distance, length)
+#endif
+
+#endif
diff --git a/zlib/descrip.mms b/zlib/descrip.mms
new file mode 100644
index 00000000000..9d364598a27
--- /dev/null
+++ b/zlib/descrip.mms
@@ -0,0 +1,48 @@
+# descrip.mms: MMS description file for building zlib on VMS
+# written by Martin P.J. Zinser <m.zinser@gsi.de>
+
+cc_defs =
+c_deb =
+
+.ifdef __DECC__
+pref = /prefix=all
+.endif
+
+OBJS = adler32.obj, compress.obj, crc32.obj, gzio.obj, uncompr.obj,\
+ deflate.obj, trees.obj, zutil.obj, inflate.obj, infblock.obj,\
+ inftrees.obj, infcodes.obj, infutil.obj, inffast.obj
+
+CFLAGS= $(C_DEB) $(CC_DEFS) $(PREF)
+
+all : example.exe minigzip.exe
+ @ write sys$output " Example applications available"
+libz.olb : libz.olb($(OBJS))
+ @ write sys$output " libz available"
+
+example.exe : example.obj libz.olb
+ link example,libz.olb/lib
+
+minigzip.exe : minigzip.obj libz.olb
+ link minigzip,libz.olb/lib,x11vms:xvmsutils.olb/lib
+
+clean :
+ delete *.obj;*,libz.olb;*
+
+
+# Other dependencies.
+adler32.obj : zutil.h zlib.h zconf.h
+compress.obj : zlib.h zconf.h
+crc32.obj : zutil.h zlib.h zconf.h
+deflate.obj : deflate.h zutil.h zlib.h zconf.h
+example.obj : zlib.h zconf.h
+gzio.obj : zutil.h zlib.h zconf.h
+infblock.obj : zutil.h zlib.h zconf.h infblock.h inftrees.h infcodes.h infutil.h
+infcodes.obj : zutil.h zlib.h zconf.h inftrees.h infutil.h infcodes.h inffast.h
+inffast.obj : zutil.h zlib.h zconf.h inftrees.h infutil.h inffast.h
+inflate.obj : zutil.h zlib.h zconf.h infblock.h
+inftrees.obj : zutil.h zlib.h zconf.h inftrees.h
+infutil.obj : zutil.h zlib.h zconf.h inftrees.h infutil.h
+minigzip.obj : zlib.h zconf.h
+trees.obj : deflate.h zutil.h zlib.h zconf.h
+uncompr.obj : zlib.h zconf.h
+zutil.obj : zutil.h zlib.h zconf.h
diff --git a/zlib/example.c b/zlib/example.c
new file mode 100644
index 00000000000..8307c841e4a
--- /dev/null
+++ b/zlib/example.c
@@ -0,0 +1,556 @@
+/* example.c -- usage example of the zlib compression library
+ * Copyright (C) 1995-1998 Jean-loup Gailly.
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* @(#) $Id$ */
+
+#include <stdio.h>
+#include "zlib.h"
+
+#ifdef STDC
+# include <string.h>
+# include <stdlib.h>
+#else
+ extern void exit OF((int));
+#endif
+
+#if defined(VMS) || defined(RISCOS)
+# define TESTFILE "foo-gz"
+#else
+# define TESTFILE "foo.gz"
+#endif
+
+#define CHECK_ERR(err, msg) { \
+ if (err != Z_OK) { \
+ fprintf(stderr, "%s error: %d\n", msg, err); \
+ exit(1); \
+ } \
+}
+
+const char hello[] = "hello, hello!";
+/* "hello world" would be more standard, but the repeated "hello"
+ * stresses the compression code better, sorry...
+ */
+
+const char dictionary[] = "hello";
+uLong dictId; /* Adler32 value of the dictionary */
+
+void test_compress OF((Byte *compr, uLong comprLen,
+ Byte *uncompr, uLong uncomprLen));
+void test_gzio OF((const char *out, const char *in,
+ Byte *uncompr, int uncomprLen));
+void test_deflate OF((Byte *compr, uLong comprLen));
+void test_inflate OF((Byte *compr, uLong comprLen,
+ Byte *uncompr, uLong uncomprLen));
+void test_large_deflate OF((Byte *compr, uLong comprLen,
+ Byte *uncompr, uLong uncomprLen));
+void test_large_inflate OF((Byte *compr, uLong comprLen,
+ Byte *uncompr, uLong uncomprLen));
+void test_flush OF((Byte *compr, uLong *comprLen));
+void test_sync OF((Byte *compr, uLong comprLen,
+ Byte *uncompr, uLong uncomprLen));
+void test_dict_deflate OF((Byte *compr, uLong comprLen));
+void test_dict_inflate OF((Byte *compr, uLong comprLen,
+ Byte *uncompr, uLong uncomprLen));
+int main OF((int argc, char *argv[]));
+
+/* ===========================================================================
+ * Test compress() and uncompress()
+ */
+void test_compress(compr, comprLen, uncompr, uncomprLen)
+ Byte *compr, *uncompr;
+ uLong comprLen, uncomprLen;
+{
+ int err;
+ uLong len = strlen(hello)+1;
+
+ err = compress(compr, &comprLen, (const Bytef*)hello, len);
+ CHECK_ERR(err, "compress");
+
+ strcpy((char*)uncompr, "garbage");
+
+ err = uncompress(uncompr, &uncomprLen, compr, comprLen);
+ CHECK_ERR(err, "uncompress");
+
+ if (strcmp((char*)uncompr, hello)) {
+ fprintf(stderr, "bad uncompress\n");
+ exit(1);
+ } else {
+ printf("uncompress(): %s\n", (char *)uncompr);
+ }
+}
+
+/* ===========================================================================
+ * Test read/write of .gz files
+ */
+void test_gzio(out, in, uncompr, uncomprLen)
+ const char *out; /* compressed output file */
+ const char *in; /* compressed input file */
+ Byte *uncompr;
+ int uncomprLen;
+{
+ int err;
+ int len = strlen(hello)+1;
+ gzFile file;
+ z_off_t pos;
+
+ file = gzopen(out, "wb");
+ if (file == NULL) {
+ fprintf(stderr, "gzopen error\n");
+ exit(1);
+ }
+ gzputc(file, 'h');
+ if (gzputs(file, "ello") != 4) {
+ fprintf(stderr, "gzputs err: %s\n", gzerror(file, &err));
+ exit(1);
+ }
+ if (gzprintf(file, ", %s!", "hello") != 8) {
+ fprintf(stderr, "gzprintf err: %s\n", gzerror(file, &err));
+ exit(1);
+ }
+ gzseek(file, 1L, SEEK_CUR); /* add one zero byte */
+ gzclose(file);
+
+ file = gzopen(in, "rb");
+ if (file == NULL) {
+ fprintf(stderr, "gzopen error\n");
+ }
+ strcpy((char*)uncompr, "garbage");
+
+ uncomprLen = gzread(file, uncompr, (unsigned)uncomprLen);
+ if (uncomprLen != len) {
+ fprintf(stderr, "gzread err: %s\n", gzerror(file, &err));
+ exit(1);
+ }
+ if (strcmp((char*)uncompr, hello)) {
+ fprintf(stderr, "bad gzread: %s\n", (char*)uncompr);
+ exit(1);
+ } else {
+ printf("gzread(): %s\n", (char *)uncompr);
+ }
+
+ pos = gzseek(file, -8L, SEEK_CUR);
+ if (pos != 6 || gztell(file) != pos) {
+ fprintf(stderr, "gzseek error, pos=%ld, gztell=%ld\n",
+ (long)pos, (long)gztell(file));
+ exit(1);
+ }
+
+ if (gzgetc(file) != ' ') {
+ fprintf(stderr, "gzgetc error\n");
+ exit(1);
+ }
+
+ gzgets(file, (char*)uncompr, uncomprLen);
+ uncomprLen = strlen((char*)uncompr);
+ if (uncomprLen != 6) { /* "hello!" */
+ fprintf(stderr, "gzgets err after gzseek: %s\n", gzerror(file, &err));
+ exit(1);
+ }
+ if (strcmp((char*)uncompr, hello+7)) {
+ fprintf(stderr, "bad gzgets after gzseek\n");
+ exit(1);
+ } else {
+ printf("gzgets() after gzseek: %s\n", (char *)uncompr);
+ }
+
+ gzclose(file);
+}
+
+/* ===========================================================================
+ * Test deflate() with small buffers
+ */
+void test_deflate(compr, comprLen)
+ Byte *compr;
+ uLong comprLen;
+{
+ z_stream c_stream; /* compression stream */
+ int err;
+ int len = strlen(hello)+1;
+
+ c_stream.zalloc = (alloc_func)0;
+ c_stream.zfree = (free_func)0;
+ c_stream.opaque = (voidpf)0;
+
+ err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION);
+ CHECK_ERR(err, "deflateInit");
+
+ c_stream.next_in = (Bytef*)hello;
+ c_stream.next_out = compr;
+
+ while (c_stream.total_in != (uLong)len && c_stream.total_out < comprLen) {
+ c_stream.avail_in = c_stream.avail_out = 1; /* force small buffers */
+ err = deflate(&c_stream, Z_NO_FLUSH);
+ CHECK_ERR(err, "deflate");
+ }
+ /* Finish the stream, still forcing small buffers: */
+ for (;;) {
+ c_stream.avail_out = 1;
+ err = deflate(&c_stream, Z_FINISH);
+ if (err == Z_STREAM_END) break;
+ CHECK_ERR(err, "deflate");
+ }
+
+ err = deflateEnd(&c_stream);
+ CHECK_ERR(err, "deflateEnd");
+}
+
+/* ===========================================================================
+ * Test inflate() with small buffers
+ */
+void test_inflate(compr, comprLen, uncompr, uncomprLen)
+ Byte *compr, *uncompr;
+ uLong comprLen, uncomprLen;
+{
+ int err;
+ z_stream d_stream; /* decompression stream */
+
+ strcpy((char*)uncompr, "garbage");
+
+ d_stream.zalloc = (alloc_func)0;
+ d_stream.zfree = (free_func)0;
+ d_stream.opaque = (voidpf)0;
+
+ d_stream.next_in = compr;
+ d_stream.avail_in = 0;
+ d_stream.next_out = uncompr;
+
+ err = inflateInit(&d_stream);
+ CHECK_ERR(err, "inflateInit");
+
+ while (d_stream.total_out < uncomprLen && d_stream.total_in < comprLen) {
+ d_stream.avail_in = d_stream.avail_out = 1; /* force small buffers */
+ err = inflate(&d_stream, Z_NO_FLUSH);
+ if (err == Z_STREAM_END) break;
+ CHECK_ERR(err, "inflate");
+ }
+
+ err = inflateEnd(&d_stream);
+ CHECK_ERR(err, "inflateEnd");
+
+ if (strcmp((char*)uncompr, hello)) {
+ fprintf(stderr, "bad inflate\n");
+ exit(1);
+ } else {
+ printf("inflate(): %s\n", (char *)uncompr);
+ }
+}
+
+/* ===========================================================================
+ * Test deflate() with large buffers and dynamic change of compression level
+ */
+void test_large_deflate(compr, comprLen, uncompr, uncomprLen)
+ Byte *compr, *uncompr;
+ uLong comprLen, uncomprLen;
+{
+ z_stream c_stream; /* compression stream */
+ int err;
+
+ c_stream.zalloc = (alloc_func)0;
+ c_stream.zfree = (free_func)0;
+ c_stream.opaque = (voidpf)0;
+
+ err = deflateInit(&c_stream, Z_BEST_SPEED);
+ CHECK_ERR(err, "deflateInit");
+
+ c_stream.next_out = compr;
+ c_stream.avail_out = (uInt)comprLen;
+
+ /* At this point, uncompr is still mostly zeroes, so it should compress
+ * very well:
+ */
+ c_stream.next_in = uncompr;
+ c_stream.avail_in = (uInt)uncomprLen;
+ err = deflate(&c_stream, Z_NO_FLUSH);
+ CHECK_ERR(err, "deflate");
+ if (c_stream.avail_in != 0) {
+ fprintf(stderr, "deflate not greedy\n");
+ exit(1);
+ }
+
+ /* Feed in already compressed data and switch to no compression: */
+ deflateParams(&c_stream, Z_NO_COMPRESSION, Z_DEFAULT_STRATEGY);
+ c_stream.next_in = compr;
+ c_stream.avail_in = (uInt)comprLen/2;
+ err = deflate(&c_stream, Z_NO_FLUSH);
+ CHECK_ERR(err, "deflate");
+
+ /* Switch back to compressing mode: */
+ deflateParams(&c_stream, Z_BEST_COMPRESSION, Z_FILTERED);
+ c_stream.next_in = uncompr;
+ c_stream.avail_in = (uInt)uncomprLen;
+ err = deflate(&c_stream, Z_NO_FLUSH);
+ CHECK_ERR(err, "deflate");
+
+ err = deflate(&c_stream, Z_FINISH);
+ if (err != Z_STREAM_END) {
+ fprintf(stderr, "deflate should report Z_STREAM_END\n");
+ exit(1);
+ }
+ err = deflateEnd(&c_stream);
+ CHECK_ERR(err, "deflateEnd");
+}
+
+/* ===========================================================================
+ * Test inflate() with large buffers
+ */
+void test_large_inflate(compr, comprLen, uncompr, uncomprLen)
+ Byte *compr, *uncompr;
+ uLong comprLen, uncomprLen;
+{
+ int err;
+ z_stream d_stream; /* decompression stream */
+
+ strcpy((char*)uncompr, "garbage");
+
+ d_stream.zalloc = (alloc_func)0;
+ d_stream.zfree = (free_func)0;
+ d_stream.opaque = (voidpf)0;
+
+ d_stream.next_in = compr;
+ d_stream.avail_in = (uInt)comprLen;
+
+ err = inflateInit(&d_stream);
+ CHECK_ERR(err, "inflateInit");
+
+ for (;;) {
+ d_stream.next_out = uncompr; /* discard the output */
+ d_stream.avail_out = (uInt)uncomprLen;
+ err = inflate(&d_stream, Z_NO_FLUSH);
+ if (err == Z_STREAM_END) break;
+ CHECK_ERR(err, "large inflate");
+ }
+
+ err = inflateEnd(&d_stream);
+ CHECK_ERR(err, "inflateEnd");
+
+ if (d_stream.total_out != 2*uncomprLen + comprLen/2) {
+ fprintf(stderr, "bad large inflate: %ld\n", d_stream.total_out);
+ exit(1);
+ } else {
+ printf("large_inflate(): OK\n");
+ }
+}
+
+/* ===========================================================================
+ * Test deflate() with full flush
+ */
+void test_flush(compr, comprLen)
+ Byte *compr;
+ uLong *comprLen;
+{
+ z_stream c_stream; /* compression stream */
+ int err;
+ int len = strlen(hello)+1;
+
+ c_stream.zalloc = (alloc_func)0;
+ c_stream.zfree = (free_func)0;
+ c_stream.opaque = (voidpf)0;
+
+ err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION);
+ CHECK_ERR(err, "deflateInit");
+
+ c_stream.next_in = (Bytef*)hello;
+ c_stream.next_out = compr;
+ c_stream.avail_in = 3;
+ c_stream.avail_out = (uInt)*comprLen;
+ err = deflate(&c_stream, Z_FULL_FLUSH);
+ CHECK_ERR(err, "deflate");
+
+ compr[3]++; /* force an error in first compressed block */
+ c_stream.avail_in = len - 3;
+
+ err = deflate(&c_stream, Z_FINISH);
+ if (err != Z_STREAM_END) {
+ CHECK_ERR(err, "deflate");
+ }
+ err = deflateEnd(&c_stream);
+ CHECK_ERR(err, "deflateEnd");
+
+ *comprLen = c_stream.total_out;
+}
+
+/* ===========================================================================
+ * Test inflateSync()
+ */
+void test_sync(compr, comprLen, uncompr, uncomprLen)
+ Byte *compr, *uncompr;
+ uLong comprLen, uncomprLen;
+{
+ int err;
+ z_stream d_stream; /* decompression stream */
+
+ strcpy((char*)uncompr, "garbage");
+
+ d_stream.zalloc = (alloc_func)0;
+ d_stream.zfree = (free_func)0;
+ d_stream.opaque = (voidpf)0;
+
+ d_stream.next_in = compr;
+ d_stream.avail_in = 2; /* just read the zlib header */
+
+ err = inflateInit(&d_stream);
+ CHECK_ERR(err, "inflateInit");
+
+ d_stream.next_out = uncompr;
+ d_stream.avail_out = (uInt)uncomprLen;
+
+ inflate(&d_stream, Z_NO_FLUSH);
+ CHECK_ERR(err, "inflate");
+
+ d_stream.avail_in = (uInt)comprLen-2; /* read all compressed data */
+ err = inflateSync(&d_stream); /* but skip the damaged part */
+ CHECK_ERR(err, "inflateSync");
+
+ err = inflate(&d_stream, Z_FINISH);
+ if (err != Z_DATA_ERROR) {
+ fprintf(stderr, "inflate should report DATA_ERROR\n");
+ /* Because of incorrect adler32 */
+ exit(1);
+ }
+ err = inflateEnd(&d_stream);
+ CHECK_ERR(err, "inflateEnd");
+
+ printf("after inflateSync(): hel%s\n", (char *)uncompr);
+}
+
+/* ===========================================================================
+ * Test deflate() with preset dictionary
+ */
+void test_dict_deflate(compr, comprLen)
+ Byte *compr;
+ uLong comprLen;
+{
+ z_stream c_stream; /* compression stream */
+ int err;
+
+ c_stream.zalloc = (alloc_func)0;
+ c_stream.zfree = (free_func)0;
+ c_stream.opaque = (voidpf)0;
+
+ err = deflateInit(&c_stream, Z_BEST_COMPRESSION);
+ CHECK_ERR(err, "deflateInit");
+
+ err = deflateSetDictionary(&c_stream,
+ (const Bytef*)dictionary, sizeof(dictionary));
+ CHECK_ERR(err, "deflateSetDictionary");
+
+ dictId = c_stream.adler;
+ c_stream.next_out = compr;
+ c_stream.avail_out = (uInt)comprLen;
+
+ c_stream.next_in = (Bytef*)hello;
+ c_stream.avail_in = (uInt)strlen(hello)+1;
+
+ err = deflate(&c_stream, Z_FINISH);
+ if (err != Z_STREAM_END) {
+ fprintf(stderr, "deflate should report Z_STREAM_END\n");
+ exit(1);
+ }
+ err = deflateEnd(&c_stream);
+ CHECK_ERR(err, "deflateEnd");
+}
+
+/* ===========================================================================
+ * Test inflate() with a preset dictionary
+ */
+void test_dict_inflate(compr, comprLen, uncompr, uncomprLen)
+ Byte *compr, *uncompr;
+ uLong comprLen, uncomprLen;
+{
+ int err;
+ z_stream d_stream; /* decompression stream */
+
+ strcpy((char*)uncompr, "garbage");
+
+ d_stream.zalloc = (alloc_func)0;
+ d_stream.zfree = (free_func)0;
+ d_stream.opaque = (voidpf)0;
+
+ d_stream.next_in = compr;
+ d_stream.avail_in = (uInt)comprLen;
+
+ err = inflateInit(&d_stream);
+ CHECK_ERR(err, "inflateInit");
+
+ d_stream.next_out = uncompr;
+ d_stream.avail_out = (uInt)uncomprLen;
+
+ for (;;) {
+ err = inflate(&d_stream, Z_NO_FLUSH);
+ if (err == Z_STREAM_END) break;
+ if (err == Z_NEED_DICT) {
+ if (d_stream.adler != dictId) {
+ fprintf(stderr, "unexpected dictionary");
+ exit(1);
+ }
+ err = inflateSetDictionary(&d_stream, (const Bytef*)dictionary,
+ sizeof(dictionary));
+ }
+ CHECK_ERR(err, "inflate with dict");
+ }
+
+ err = inflateEnd(&d_stream);
+ CHECK_ERR(err, "inflateEnd");
+
+ if (strcmp((char*)uncompr, hello)) {
+ fprintf(stderr, "bad inflate with dict\n");
+ exit(1);
+ } else {
+ printf("inflate with dictionary: %s\n", (char *)uncompr);
+ }
+}
+
+/* ===========================================================================
+ * Usage: example [output.gz [input.gz]]
+ */
+
+int main(argc, argv)
+ int argc;
+ char *argv[];
+{
+ Byte *compr, *uncompr;
+ uLong comprLen = 10000*sizeof(int); /* don't overflow on MSDOS */
+ uLong uncomprLen = comprLen;
+ static const char* myVersion = ZLIB_VERSION;
+
+ if (zlibVersion()[0] != myVersion[0]) {
+ fprintf(stderr, "incompatible zlib version\n");
+ exit(1);
+
+ } else if (strcmp(zlibVersion(), ZLIB_VERSION) != 0) {
+ fprintf(stderr, "warning: different zlib version\n");
+ }
+
+ compr = (Byte*)calloc((uInt)comprLen, 1);
+ uncompr = (Byte*)calloc((uInt)uncomprLen, 1);
+ /* compr and uncompr are cleared to avoid reading uninitialized
+ * data and to ensure that uncompr compresses well.
+ */
+ if (compr == Z_NULL || uncompr == Z_NULL) {
+ printf("out of memory\n");
+ exit(1);
+ }
+ test_compress(compr, comprLen, uncompr, uncomprLen);
+
+ test_gzio((argc > 1 ? argv[1] : TESTFILE),
+ (argc > 2 ? argv[2] : TESTFILE),
+ uncompr, (int)uncomprLen);
+
+ test_deflate(compr, comprLen);
+ test_inflate(compr, comprLen, uncompr, uncomprLen);
+
+ test_large_deflate(compr, comprLen, uncompr, uncomprLen);
+ test_large_inflate(compr, comprLen, uncompr, uncomprLen);
+
+ test_flush(compr, &comprLen);
+ test_sync(compr, comprLen, uncompr, uncomprLen);
+ comprLen = uncomprLen;
+
+ test_dict_deflate(compr, comprLen);
+ test_dict_inflate(compr, comprLen, uncompr, uncomprLen);
+
+ exit(0);
+ return 0; /* to avoid warning */
+}
diff --git a/zlib/gzio.c b/zlib/gzio.c
new file mode 100644
index 00000000000..f7c336a55a0
--- /dev/null
+++ b/zlib/gzio.c
@@ -0,0 +1,875 @@
+/* gzio.c -- IO on .gz files
+ * Copyright (C) 1995-1998 Jean-loup Gailly.
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ *
+ * Compile this file with -DNO_DEFLATE to avoid the compression code.
+ */
+
+/* @(#) $Id$ */
+
+#include <stdio.h>
+
+#include "zutil.h"
+
+struct internal_state {int dummy;}; /* for buggy compilers */
+
+#ifndef Z_BUFSIZE
+# ifdef MAXSEG_64K
+# define Z_BUFSIZE 4096 /* minimize memory usage for 16-bit DOS */
+# else
+# define Z_BUFSIZE 16384
+# endif
+#endif
+#ifndef Z_PRINTF_BUFSIZE
+# define Z_PRINTF_BUFSIZE 4096
+#endif
+
+#define ALLOC(size) malloc(size)
+#define TRYFREE(p) {if (p) free(p);}
+
+static int gz_magic[2] = {0x1f, 0x8b}; /* gzip magic header */
+
+/* gzip flag byte */
+#define ASCII_FLAG 0x01 /* bit 0 set: file probably ascii text */
+#define HEAD_CRC 0x02 /* bit 1 set: header CRC present */
+#define EXTRA_FIELD 0x04 /* bit 2 set: extra field present */
+#define ORIG_NAME 0x08 /* bit 3 set: original file name present */
+#define COMMENT 0x10 /* bit 4 set: file comment present */
+#define RESERVED 0xE0 /* bits 5..7: reserved */
+
+typedef struct gz_stream {
+ z_stream stream;
+ int z_err; /* error code for last stream operation */
+ int z_eof; /* set if end of input file */
+ FILE *file; /* .gz file */
+ Byte *inbuf; /* input buffer */
+ Byte *outbuf; /* output buffer */
+ uLong crc; /* crc32 of uncompressed data */
+ char *msg; /* error message */
+ char *path; /* path name for debugging only */
+ int transparent; /* 1 if input file is not a .gz file */
+ char mode; /* 'w' or 'r' */
+ long startpos; /* start of compressed data in file (header skipped) */
+} gz_stream;
+
+
+local gzFile gz_open OF((const char *path, const char *mode, int fd));
+local int do_flush OF((gzFile file, int flush));
+local int get_byte OF((gz_stream *s));
+local void check_header OF((gz_stream *s));
+local int destroy OF((gz_stream *s));
+local void putLong OF((FILE *file, uLong x));
+local uLong getLong OF((gz_stream *s));
+
+/* ===========================================================================
+ Opens a gzip (.gz) file for reading or writing. The mode parameter
+ is as in fopen ("rb" or "wb"). The file is given either by file descriptor
+ or path name (if fd == -1).
+ gz_open return NULL if the file could not be opened or if there was
+ insufficient memory to allocate the (de)compression state; errno
+ can be checked to distinguish the two cases (if errno is zero, the
+ zlib error is Z_MEM_ERROR).
+*/
+local gzFile gz_open (path, mode, fd)
+ const char *path;
+ const char *mode;
+ int fd;
+{
+ int err;
+ int level = Z_DEFAULT_COMPRESSION; /* compression level */
+ int strategy = Z_DEFAULT_STRATEGY; /* compression strategy */
+ char *p = (char*)mode;
+ gz_stream *s;
+ char fmode[80]; /* copy of mode, without the compression level */
+ char *m = fmode;
+
+ if (!path || !mode) return Z_NULL;
+
+ s = (gz_stream *)ALLOC(sizeof(gz_stream));
+ if (!s) return Z_NULL;
+
+ s->stream.zalloc = (alloc_func)0;
+ s->stream.zfree = (free_func)0;
+ s->stream.opaque = (voidpf)0;
+ s->stream.next_in = s->inbuf = Z_NULL;
+ s->stream.next_out = s->outbuf = Z_NULL;
+ s->stream.avail_in = s->stream.avail_out = 0;
+ s->file = NULL;
+ s->z_err = Z_OK;
+ s->z_eof = 0;
+ s->crc = crc32(0L, Z_NULL, 0);
+ s->msg = NULL;
+ s->transparent = 0;
+
+ s->path = (char*)ALLOC(strlen(path)+1);
+ if (s->path == NULL) {
+ return destroy(s), (gzFile)Z_NULL;
+ }
+ strcpy(s->path, path); /* do this early for debugging */
+
+ s->mode = '\0';
+ do {
+ if (*p == 'r') s->mode = 'r';
+ if (*p == 'w' || *p == 'a') s->mode = 'w';
+ if (*p >= '0' && *p <= '9') {
+ level = *p - '0';
+ } else if (*p == 'f') {
+ strategy = Z_FILTERED;
+ } else if (*p == 'h') {
+ strategy = Z_HUFFMAN_ONLY;
+ } else {
+ *m++ = *p; /* copy the mode */
+ }
+ } while (*p++ && m != fmode + sizeof(fmode));
+ if (s->mode == '\0') return destroy(s), (gzFile)Z_NULL;
+
+ if (s->mode == 'w') {
+#ifdef NO_DEFLATE
+ err = Z_STREAM_ERROR;
+#else
+ err = deflateInit2(&(s->stream), level,
+ Z_DEFLATED, -MAX_WBITS, DEF_MEM_LEVEL, strategy);
+ /* windowBits is passed < 0 to suppress zlib header */
+
+ s->stream.next_out = s->outbuf = (Byte*)ALLOC(Z_BUFSIZE);
+#endif
+ if (err != Z_OK || s->outbuf == Z_NULL) {
+ return destroy(s), (gzFile)Z_NULL;
+ }
+ } else {
+ s->stream.next_in = s->inbuf = (Byte*)ALLOC(Z_BUFSIZE);
+
+ err = inflateInit2(&(s->stream), -MAX_WBITS);
+ /* windowBits is passed < 0 to tell that there is no zlib header.
+ * Note that in this case inflate *requires* an extra "dummy" byte
+ * after the compressed stream in order to complete decompression and
+ * return Z_STREAM_END. Here the gzip CRC32 ensures that 4 bytes are
+ * present after the compressed stream.
+ */
+ if (err != Z_OK || s->inbuf == Z_NULL) {
+ return destroy(s), (gzFile)Z_NULL;
+ }
+ }
+ s->stream.avail_out = Z_BUFSIZE;
+
+ errno = 0;
+ s->file = fd < 0 ? F_OPEN(path, fmode) : (FILE*)fdopen(fd, fmode);
+
+ if (s->file == NULL) {
+ return destroy(s), (gzFile)Z_NULL;
+ }
+ if (s->mode == 'w') {
+ /* Write a very simple .gz header:
+ */
+ fprintf(s->file, "%c%c%c%c%c%c%c%c%c%c", gz_magic[0], gz_magic[1],
+ Z_DEFLATED, 0 /*flags*/, 0,0,0,0 /*time*/, 0 /*xflags*/, OS_CODE);
+ s->startpos = 10L;
+ /* We use 10L instead of ftell(s->file) to because ftell causes an
+ * fflush on some systems. This version of the library doesn't use
+ * startpos anyway in write mode, so this initialization is not
+ * necessary.
+ */
+ } else {
+ check_header(s); /* skip the .gz header */
+ s->startpos = (ftell(s->file) - s->stream.avail_in);
+ }
+
+ return (gzFile)s;
+}
+
+/* ===========================================================================
+ Opens a gzip (.gz) file for reading or writing.
+*/
+gzFile ZEXPORT gzopen (path, mode)
+ const char *path;
+ const char *mode;
+{
+ return gz_open (path, mode, -1);
+}
+
+/* ===========================================================================
+ Associate a gzFile with the file descriptor fd. fd is not dup'ed here
+ to mimic the behavio(u)r of fdopen.
+*/
+gzFile ZEXPORT gzdopen (fd, mode)
+ int fd;
+ const char *mode;
+{
+ char name[20];
+
+ if (fd < 0) return (gzFile)Z_NULL;
+ sprintf(name, "<fd:%d>", fd); /* for debugging */
+
+ return gz_open (name, mode, fd);
+}
+
+/* ===========================================================================
+ * Update the compression level and strategy
+ */
+int ZEXPORT gzsetparams (file, level, strategy)
+ gzFile file;
+ int level;
+ int strategy;
+{
+ gz_stream *s = (gz_stream*)file;
+
+ if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR;
+
+ /* Make room to allow flushing */
+ if (s->stream.avail_out == 0) {
+
+ s->stream.next_out = s->outbuf;
+ if (fwrite(s->outbuf, 1, Z_BUFSIZE, s->file) != Z_BUFSIZE) {
+ s->z_err = Z_ERRNO;
+ }
+ s->stream.avail_out = Z_BUFSIZE;
+ }
+
+ return deflateParams (&(s->stream), level, strategy);
+}
+
+/* ===========================================================================
+ Read a byte from a gz_stream; update next_in and avail_in. Return EOF
+ for end of file.
+ IN assertion: the stream s has been sucessfully opened for reading.
+*/
+local int get_byte(s)
+ gz_stream *s;
+{
+ if (s->z_eof) return EOF;
+ if (s->stream.avail_in == 0) {
+ errno = 0;
+ s->stream.avail_in = fread(s->inbuf, 1, Z_BUFSIZE, s->file);
+ if (s->stream.avail_in == 0) {
+ s->z_eof = 1;
+ if (ferror(s->file)) s->z_err = Z_ERRNO;
+ return EOF;
+ }
+ s->stream.next_in = s->inbuf;
+ }
+ s->stream.avail_in--;
+ return *(s->stream.next_in)++;
+}
+
+/* ===========================================================================
+ Check the gzip header of a gz_stream opened for reading. Set the stream
+ mode to transparent if the gzip magic header is not present; set s->err
+ to Z_DATA_ERROR if the magic header is present but the rest of the header
+ is incorrect.
+ IN assertion: the stream s has already been created sucessfully;
+ s->stream.avail_in is zero for the first time, but may be non-zero
+ for concatenated .gz files.
+*/
+local void check_header(s)
+ gz_stream *s;
+{
+ int method; /* method byte */
+ int flags; /* flags byte */
+ uInt len;
+ int c;
+
+ /* Check the gzip magic header */
+ for (len = 0; len < 2; len++) {
+ c = get_byte(s);
+ if (c != gz_magic[len]) {
+ if (len != 0) s->stream.avail_in++, s->stream.next_in--;
+ if (c != EOF) {
+ s->stream.avail_in++, s->stream.next_in--;
+ s->transparent = 1;
+ }
+ s->z_err = s->stream.avail_in != 0 ? Z_OK : Z_STREAM_END;
+ return;
+ }
+ }
+ method = get_byte(s);
+ flags = get_byte(s);
+ if (method != Z_DEFLATED || (flags & RESERVED) != 0) {
+ s->z_err = Z_DATA_ERROR;
+ return;
+ }
+
+ /* Discard time, xflags and OS code: */
+ for (len = 0; len < 6; len++) (void)get_byte(s);
+
+ if ((flags & EXTRA_FIELD) != 0) { /* skip the extra field */
+ len = (uInt)get_byte(s);
+ len += ((uInt)get_byte(s))<<8;
+ /* len is garbage if EOF but the loop below will quit anyway */
+ while (len-- != 0 && get_byte(s) != EOF) ;
+ }
+ if ((flags & ORIG_NAME) != 0) { /* skip the original file name */
+ while ((c = get_byte(s)) != 0 && c != EOF) ;
+ }
+ if ((flags & COMMENT) != 0) { /* skip the .gz file comment */
+ while ((c = get_byte(s)) != 0 && c != EOF) ;
+ }
+ if ((flags & HEAD_CRC) != 0) { /* skip the header crc */
+ for (len = 0; len < 2; len++) (void)get_byte(s);
+ }
+ s->z_err = s->z_eof ? Z_DATA_ERROR : Z_OK;
+}
+
+ /* ===========================================================================
+ * Cleanup then free the given gz_stream. Return a zlib error code.
+ Try freeing in the reverse order of allocations.
+ */
+local int destroy (s)
+ gz_stream *s;
+{
+ int err = Z_OK;
+
+ if (!s) return Z_STREAM_ERROR;
+
+ TRYFREE(s->msg);
+
+ if (s->stream.state != NULL) {
+ if (s->mode == 'w') {
+#ifdef NO_DEFLATE
+ err = Z_STREAM_ERROR;
+#else
+ err = deflateEnd(&(s->stream));
+#endif
+ } else if (s->mode == 'r') {
+ err = inflateEnd(&(s->stream));
+ }
+ }
+ if (s->file != NULL && fclose(s->file)) {
+#ifdef ESPIPE
+ if (errno != ESPIPE) /* fclose is broken for pipes in HP/UX */
+#endif
+ err = Z_ERRNO;
+ }
+ if (s->z_err < 0) err = s->z_err;
+
+ TRYFREE(s->inbuf);
+ TRYFREE(s->outbuf);
+ TRYFREE(s->path);
+ TRYFREE(s);
+ return err;
+}
+
+/* ===========================================================================
+ Reads the given number of uncompressed bytes from the compressed file.
+ gzread returns the number of bytes actually read (0 for end of file).
+*/
+int ZEXPORT gzread (file, buf, len)
+ gzFile file;
+ voidp buf;
+ unsigned len;
+{
+ gz_stream *s = (gz_stream*)file;
+ Bytef *start = (Bytef*)buf; /* starting point for crc computation */
+ Byte *next_out; /* == stream.next_out but not forced far (for MSDOS) */
+
+ if (s == NULL || s->mode != 'r') return Z_STREAM_ERROR;
+
+ if (s->z_err == Z_DATA_ERROR || s->z_err == Z_ERRNO) return -1;
+ if (s->z_err == Z_STREAM_END) return 0; /* EOF */
+
+ next_out = (Byte*)buf;
+ s->stream.next_out = (Bytef*)buf;
+ s->stream.avail_out = len;
+
+ while (s->stream.avail_out != 0) {
+
+ if (s->transparent) {
+ /* Copy first the lookahead bytes: */
+ uInt n = s->stream.avail_in;
+ if (n > s->stream.avail_out) n = s->stream.avail_out;
+ if (n > 0) {
+ zmemcpy(s->stream.next_out, s->stream.next_in, n);
+ next_out += n;
+ s->stream.next_out = next_out;
+ s->stream.next_in += n;
+ s->stream.avail_out -= n;
+ s->stream.avail_in -= n;
+ }
+ if (s->stream.avail_out > 0) {
+ s->stream.avail_out -= fread(next_out, 1, s->stream.avail_out,
+ s->file);
+ }
+ len -= s->stream.avail_out;
+ s->stream.total_in += (uLong)len;
+ s->stream.total_out += (uLong)len;
+ if (len == 0) s->z_eof = 1;
+ return (int)len;
+ }
+ if (s->stream.avail_in == 0 && !s->z_eof) {
+
+ errno = 0;
+ s->stream.avail_in = fread(s->inbuf, 1, Z_BUFSIZE, s->file);
+ if (s->stream.avail_in == 0) {
+ s->z_eof = 1;
+ if (ferror(s->file)) {
+ s->z_err = Z_ERRNO;
+ break;
+ }
+ }
+ s->stream.next_in = s->inbuf;
+ }
+ s->z_err = inflate(&(s->stream), Z_NO_FLUSH);
+
+ if (s->z_err == Z_STREAM_END) {
+ /* Check CRC and original size */
+ s->crc = crc32(s->crc, start, (uInt)(s->stream.next_out - start));
+ start = s->stream.next_out;
+
+ if (getLong(s) != s->crc) {
+ s->z_err = Z_DATA_ERROR;
+ } else {
+ (void)getLong(s);
+ /* The uncompressed length returned by above getlong() may
+ * be different from s->stream.total_out) in case of
+ * concatenated .gz files. Check for such files:
+ */
+ check_header(s);
+ if (s->z_err == Z_OK) {
+ uLong total_in = s->stream.total_in;
+ uLong total_out = s->stream.total_out;
+
+ inflateReset(&(s->stream));
+ s->stream.total_in = total_in;
+ s->stream.total_out = total_out;
+ s->crc = crc32(0L, Z_NULL, 0);
+ }
+ }
+ }
+ if (s->z_err != Z_OK || s->z_eof) break;
+ }
+ s->crc = crc32(s->crc, start, (uInt)(s->stream.next_out - start));
+
+ return (int)(len - s->stream.avail_out);
+}
+
+
+/* ===========================================================================
+ Reads one byte from the compressed file. gzgetc returns this byte
+ or -1 in case of end of file or error.
+*/
+int ZEXPORT gzgetc(file)
+ gzFile file;
+{
+ unsigned char c;
+
+ return gzread(file, &c, 1) == 1 ? c : -1;
+}
+
+
+/* ===========================================================================
+ Reads bytes from the compressed file until len-1 characters are
+ read, or a newline character is read and transferred to buf, or an
+ end-of-file condition is encountered. The string is then terminated
+ with a null character.
+ gzgets returns buf, or Z_NULL in case of error.
+
+ The current implementation is not optimized at all.
+*/
+char * ZEXPORT gzgets(file, buf, len)
+ gzFile file;
+ char *buf;
+ int len;
+{
+ char *b = buf;
+ if (buf == Z_NULL || len <= 0) return Z_NULL;
+
+ while (--len > 0 && gzread(file, buf, 1) == 1 && *buf++ != '\n') ;
+ *buf = '\0';
+ return b == buf && len > 0 ? Z_NULL : b;
+}
+
+
+#ifndef NO_DEFLATE
+/* ===========================================================================
+ Writes the given number of uncompressed bytes into the compressed file.
+ gzwrite returns the number of bytes actually written (0 in case of error).
+*/
+int ZEXPORT gzwrite (file, buf, len)
+ gzFile file;
+ const voidp buf;
+ unsigned len;
+{
+ gz_stream *s = (gz_stream*)file;
+
+ if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR;
+
+ s->stream.next_in = (Bytef*)buf;
+ s->stream.avail_in = len;
+
+ while (s->stream.avail_in != 0) {
+
+ if (s->stream.avail_out == 0) {
+
+ s->stream.next_out = s->outbuf;
+ if (fwrite(s->outbuf, 1, Z_BUFSIZE, s->file) != Z_BUFSIZE) {
+ s->z_err = Z_ERRNO;
+ break;
+ }
+ s->stream.avail_out = Z_BUFSIZE;
+ }
+ s->z_err = deflate(&(s->stream), Z_NO_FLUSH);
+ if (s->z_err != Z_OK) break;
+ }
+ s->crc = crc32(s->crc, (const Bytef *)buf, len);
+
+ return (int)(len - s->stream.avail_in);
+}
+
+/* ===========================================================================
+ Converts, formats, and writes the args to the compressed file under
+ control of the format string, as in fprintf. gzprintf returns the number of
+ uncompressed bytes actually written (0 in case of error).
+*/
+#ifdef STDC
+#include <stdarg.h>
+
+int ZEXPORTVA gzprintf (gzFile file, const char *format, /* args */ ...)
+{
+ char buf[Z_PRINTF_BUFSIZE];
+ va_list va;
+ int len;
+
+ va_start(va, format);
+#ifdef HAS_vsnprintf
+ (void)vsnprintf(buf, sizeof(buf), format, va);
+#else
+ (void)vsprintf(buf, format, va);
+#endif
+ va_end(va);
+ len = strlen(buf); /* some *sprintf don't return the nb of bytes written */
+ if (len <= 0) return 0;
+
+ return gzwrite(file, buf, (unsigned)len);
+}
+#else /* not ANSI C */
+
+int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10,
+ a11, a12, a13, a14, a15, a16, a17, a18, a19, a20)
+ gzFile file;
+ const char *format;
+ int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10,
+ a11, a12, a13, a14, a15, a16, a17, a18, a19, a20;
+{
+ char buf[Z_PRINTF_BUFSIZE];
+ int len;
+
+#ifdef HAS_snprintf
+ snprintf(buf, sizeof(buf), format, a1, a2, a3, a4, a5, a6, a7, a8,
+ a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20);
+#else
+ sprintf(buf, format, a1, a2, a3, a4, a5, a6, a7, a8,
+ a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20);
+#endif
+ len = strlen(buf); /* old sprintf doesn't return the nb of bytes written */
+ if (len <= 0) return 0;
+
+ return gzwrite(file, buf, len);
+}
+#endif
+
+/* ===========================================================================
+ Writes c, converted to an unsigned char, into the compressed file.
+ gzputc returns the value that was written, or -1 in case of error.
+*/
+int ZEXPORT gzputc(file, c)
+ gzFile file;
+ int c;
+{
+ unsigned char cc = (unsigned char) c; /* required for big endian systems */
+
+ return gzwrite(file, &cc, 1) == 1 ? (int)cc : -1;
+}
+
+
+/* ===========================================================================
+ Writes the given null-terminated string to the compressed file, excluding
+ the terminating null character.
+ gzputs returns the number of characters written, or -1 in case of error.
+*/
+int ZEXPORT gzputs(file, s)
+ gzFile file;
+ const char *s;
+{
+ return gzwrite(file, (char*)s, (unsigned)strlen(s));
+}
+
+
+/* ===========================================================================
+ Flushes all pending output into the compressed file. The parameter
+ flush is as in the deflate() function.
+*/
+local int do_flush (file, flush)
+ gzFile file;
+ int flush;
+{
+ uInt len;
+ int done = 0;
+ gz_stream *s = (gz_stream*)file;
+
+ if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR;
+
+ s->stream.avail_in = 0; /* should be zero already anyway */
+
+ for (;;) {
+ len = Z_BUFSIZE - s->stream.avail_out;
+
+ if (len != 0) {
+ if ((uInt)fwrite(s->outbuf, 1, len, s->file) != len) {
+ s->z_err = Z_ERRNO;
+ return Z_ERRNO;
+ }
+ s->stream.next_out = s->outbuf;
+ s->stream.avail_out = Z_BUFSIZE;
+ }
+ if (done) break;
+ s->z_err = deflate(&(s->stream), flush);
+
+ /* Ignore the second of two consecutive flushes: */
+ if (len == 0 && s->z_err == Z_BUF_ERROR) s->z_err = Z_OK;
+
+ /* deflate has finished flushing only when it hasn't used up
+ * all the available space in the output buffer:
+ */
+ done = (s->stream.avail_out != 0 || s->z_err == Z_STREAM_END);
+
+ if (s->z_err != Z_OK && s->z_err != Z_STREAM_END) break;
+ }
+ return s->z_err == Z_STREAM_END ? Z_OK : s->z_err;
+}
+
+int ZEXPORT gzflush (file, flush)
+ gzFile file;
+ int flush;
+{
+ gz_stream *s = (gz_stream*)file;
+ int err = do_flush (file, flush);
+
+ if (err) return err;
+ fflush(s->file);
+ return s->z_err == Z_STREAM_END ? Z_OK : s->z_err;
+}
+#endif /* NO_DEFLATE */
+
+/* ===========================================================================
+ Sets the starting position for the next gzread or gzwrite on the given
+ compressed file. The offset represents a number of bytes in the
+ gzseek returns the resulting offset location as measured in bytes from
+ the beginning of the uncompressed stream, or -1 in case of error.
+ SEEK_END is not implemented, returns error.
+ In this version of the library, gzseek can be extremely slow.
+*/
+z_off_t ZEXPORT gzseek (file, offset, whence)
+ gzFile file;
+ z_off_t offset;
+ int whence;
+{
+ gz_stream *s = (gz_stream*)file;
+
+ if (s == NULL || whence == SEEK_END ||
+ s->z_err == Z_ERRNO || s->z_err == Z_DATA_ERROR) {
+ return -1L;
+ }
+
+ if (s->mode == 'w') {
+#ifdef NO_DEFLATE
+ return -1L;
+#else
+ if (whence == SEEK_SET) {
+ offset -= s->stream.total_in;
+ }
+ if (offset < 0) return -1L;
+
+ /* At this point, offset is the number of zero bytes to write. */
+ if (s->inbuf == Z_NULL) {
+ s->inbuf = (Byte*)ALLOC(Z_BUFSIZE); /* for seeking */
+ zmemzero(s->inbuf, Z_BUFSIZE);
+ }
+ while (offset > 0) {
+ uInt size = Z_BUFSIZE;
+ if (offset < Z_BUFSIZE) size = (uInt)offset;
+
+ size = gzwrite(file, s->inbuf, size);
+ if (size == 0) return -1L;
+
+ offset -= size;
+ }
+ return (z_off_t)s->stream.total_in;
+#endif
+ }
+ /* Rest of function is for reading only */
+
+ /* compute absolute position */
+ if (whence == SEEK_CUR) {
+ offset += s->stream.total_out;
+ }
+ if (offset < 0) return -1L;
+
+ if (s->transparent) {
+ /* map to fseek */
+ s->stream.avail_in = 0;
+ s->stream.next_in = s->inbuf;
+ if (fseek(s->file, offset, SEEK_SET) < 0) return -1L;
+
+ s->stream.total_in = s->stream.total_out = (uLong)offset;
+ return offset;
+ }
+
+ /* For a negative seek, rewind and use positive seek */
+ if ((uLong)offset >= s->stream.total_out) {
+ offset -= s->stream.total_out;
+ } else if (gzrewind(file) < 0) {
+ return -1L;
+ }
+ /* offset is now the number of bytes to skip. */
+
+ if (offset != 0 && s->outbuf == Z_NULL) {
+ s->outbuf = (Byte*)ALLOC(Z_BUFSIZE);
+ }
+ while (offset > 0) {
+ int size = Z_BUFSIZE;
+ if (offset < Z_BUFSIZE) size = (int)offset;
+
+ size = gzread(file, s->outbuf, (uInt)size);
+ if (size <= 0) return -1L;
+ offset -= size;
+ }
+ return (z_off_t)s->stream.total_out;
+}
+
+/* ===========================================================================
+ Rewinds input file.
+*/
+int ZEXPORT gzrewind (file)
+ gzFile file;
+{
+ gz_stream *s = (gz_stream*)file;
+
+ if (s == NULL || s->mode != 'r') return -1;
+
+ s->z_err = Z_OK;
+ s->z_eof = 0;
+ s->stream.avail_in = 0;
+ s->stream.next_in = s->inbuf;
+ s->crc = crc32(0L, Z_NULL, 0);
+
+ if (s->startpos == 0) { /* not a compressed file */
+ rewind(s->file);
+ return 0;
+ }
+
+ (void) inflateReset(&s->stream);
+ return fseek(s->file, s->startpos, SEEK_SET);
+}
+
+/* ===========================================================================
+ Returns the starting position for the next gzread or gzwrite on the
+ given compressed file. This position represents a number of bytes in the
+ uncompressed data stream.
+*/
+z_off_t ZEXPORT gztell (file)
+ gzFile file;
+{
+ return gzseek(file, 0L, SEEK_CUR);
+}
+
+/* ===========================================================================
+ Returns 1 when EOF has previously been detected reading the given
+ input stream, otherwise zero.
+*/
+int ZEXPORT gzeof (file)
+ gzFile file;
+{
+ gz_stream *s = (gz_stream*)file;
+
+ return (s == NULL || s->mode != 'r') ? 0 : s->z_eof;
+}
+
+/* ===========================================================================
+ Outputs a long in LSB order to the given file
+*/
+local void putLong (file, x)
+ FILE *file;
+ uLong x;
+{
+ int n;
+ for (n = 0; n < 4; n++) {
+ fputc((int)(x & 0xff), file);
+ x >>= 8;
+ }
+}
+
+/* ===========================================================================
+ Reads a long in LSB order from the given gz_stream. Sets z_err in case
+ of error.
+*/
+local uLong getLong (s)
+ gz_stream *s;
+{
+ uLong x = (uLong)get_byte(s);
+ int c;
+
+ x += ((uLong)get_byte(s))<<8;
+ x += ((uLong)get_byte(s))<<16;
+ c = get_byte(s);
+ if (c == EOF) s->z_err = Z_DATA_ERROR;
+ x += ((uLong)c)<<24;
+ return x;
+}
+
+/* ===========================================================================
+ Flushes all pending output if necessary, closes the compressed file
+ and deallocates all the (de)compression state.
+*/
+int ZEXPORT gzclose (file)
+ gzFile file;
+{
+ int err;
+ gz_stream *s = (gz_stream*)file;
+
+ if (s == NULL) return Z_STREAM_ERROR;
+
+ if (s->mode == 'w') {
+#ifdef NO_DEFLATE
+ return Z_STREAM_ERROR;
+#else
+ err = do_flush (file, Z_FINISH);
+ if (err != Z_OK) return destroy((gz_stream*)file);
+
+ putLong (s->file, s->crc);
+ putLong (s->file, s->stream.total_in);
+#endif
+ }
+ return destroy((gz_stream*)file);
+}
+
+/* ===========================================================================
+ Returns the error message for the last error which occured on the
+ given compressed file. errnum is set to zlib error number. If an
+ error occured in the file system and not in the compression library,
+ errnum is set to Z_ERRNO and the application may consult errno
+ to get the exact error code.
+*/
+const char* ZEXPORT gzerror (file, errnum)
+ gzFile file;
+ int *errnum;
+{
+ char *m;
+ gz_stream *s = (gz_stream*)file;
+
+ if (s == NULL) {
+ *errnum = Z_STREAM_ERROR;
+ return (const char*)ERR_MSG(Z_STREAM_ERROR);
+ }
+ *errnum = s->z_err;
+ if (*errnum == Z_OK) return (const char*)"";
+
+ m = (char*)(*errnum == Z_ERRNO ? zstrerror(errno) : s->stream.msg);
+
+ if (m == NULL || *m == '\0') m = (char*)ERR_MSG(s->z_err);
+
+ TRYFREE(s->msg);
+ s->msg = (char*)ALLOC(strlen(s->path) + strlen(m) + 3);
+ strcpy(s->msg, s->path);
+ strcat(s->msg, ": ");
+ strcat(s->msg, m);
+ return (const char*)s->msg;
+}
diff --git a/zlib/infblock.c b/zlib/infblock.c
new file mode 100644
index 00000000000..f4920faa5ea
--- /dev/null
+++ b/zlib/infblock.c
@@ -0,0 +1,398 @@
+/* infblock.c -- interpret and process block types to last block
+ * Copyright (C) 1995-1998 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+#include "zutil.h"
+#include "infblock.h"
+#include "inftrees.h"
+#include "infcodes.h"
+#include "infutil.h"
+
+struct inflate_codes_state {int dummy;}; /* for buggy compilers */
+
+/* simplify the use of the inflate_huft type with some defines */
+#define exop word.what.Exop
+#define bits word.what.Bits
+
+/* Table for deflate from PKZIP's appnote.txt. */
+local const uInt border[] = { /* Order of the bit length code lengths */
+ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
+
+/*
+ Notes beyond the 1.93a appnote.txt:
+
+ 1. Distance pointers never point before the beginning of the output
+ stream.
+ 2. Distance pointers can point back across blocks, up to 32k away.
+ 3. There is an implied maximum of 7 bits for the bit length table and
+ 15 bits for the actual data.
+ 4. If only one code exists, then it is encoded using one bit. (Zero
+ would be more efficient, but perhaps a little confusing.) If two
+ codes exist, they are coded using one bit each (0 and 1).
+ 5. There is no way of sending zero distance codes--a dummy must be
+ sent if there are none. (History: a pre 2.0 version of PKZIP would
+ store blocks with no distance codes, but this was discovered to be
+ too harsh a criterion.) Valid only for 1.93a. 2.04c does allow
+ zero distance codes, which is sent as one code of zero bits in
+ length.
+ 6. There are up to 286 literal/length codes. Code 256 represents the
+ end-of-block. Note however that the static length tree defines
+ 288 codes just to fill out the Huffman codes. Codes 286 and 287
+ cannot be used though, since there is no length base or extra bits
+ defined for them. Similarily, there are up to 30 distance codes.
+ However, static trees define 32 codes (all 5 bits) to fill out the
+ Huffman codes, but the last two had better not show up in the data.
+ 7. Unzip can check dynamic Huffman blocks for complete code sets.
+ The exception is that a single code would not be complete (see #4).
+ 8. The five bits following the block type is really the number of
+ literal codes sent minus 257.
+ 9. Length codes 8,16,16 are interpreted as 13 length codes of 8 bits
+ (1+6+6). Therefore, to output three times the length, you output
+ three codes (1+1+1), whereas to output four times the same length,
+ you only need two codes (1+3). Hmm.
+ 10. In the tree reconstruction algorithm, Code = Code + Increment
+ only if BitLength(i) is not zero. (Pretty obvious.)
+ 11. Correction: 4 Bits: # of Bit Length codes - 4 (4 - 19)
+ 12. Note: length code 284 can represent 227-258, but length code 285
+ really is 258. The last length deserves its own, short code
+ since it gets used a lot in very redundant files. The length
+ 258 is special since 258 - 3 (the min match length) is 255.
+ 13. The literal/length and distance code bit lengths are read as a
+ single stream of lengths. It is possible (and advantageous) for
+ a repeat code (16, 17, or 18) to go across the boundary between
+ the two sets of lengths.
+ */
+
+
+void inflate_blocks_reset(s, z, c)
+inflate_blocks_statef *s;
+z_streamp z;
+uLongf *c;
+{
+ if (c != Z_NULL)
+ *c = s->check;
+ if (s->mode == BTREE || s->mode == DTREE)
+ ZFREE(z, s->sub.trees.blens);
+ if (s->mode == CODES)
+ inflate_codes_free(s->sub.decode.codes, z);
+ s->mode = TYPE;
+ s->bitk = 0;
+ s->bitb = 0;
+ s->read = s->write = s->window;
+ if (s->checkfn != Z_NULL)
+ z->adler = s->check = (*s->checkfn)(0L, (const Bytef *)Z_NULL, 0);
+ Tracev((stderr, "inflate: blocks reset\n"));
+}
+
+
+inflate_blocks_statef *inflate_blocks_new(z, c, w)
+z_streamp z;
+check_func c;
+uInt w;
+{
+ inflate_blocks_statef *s;
+
+ if ((s = (inflate_blocks_statef *)ZALLOC
+ (z,1,sizeof(struct inflate_blocks_state))) == Z_NULL)
+ return s;
+ if ((s->hufts =
+ (inflate_huft *)ZALLOC(z, sizeof(inflate_huft), MANY)) == Z_NULL)
+ {
+ ZFREE(z, s);
+ return Z_NULL;
+ }
+ if ((s->window = (Bytef *)ZALLOC(z, 1, w)) == Z_NULL)
+ {
+ ZFREE(z, s->hufts);
+ ZFREE(z, s);
+ return Z_NULL;
+ }
+ s->end = s->window + w;
+ s->checkfn = c;
+ s->mode = TYPE;
+ Tracev((stderr, "inflate: blocks allocated\n"));
+ inflate_blocks_reset(s, z, Z_NULL);
+ return s;
+}
+
+
+int inflate_blocks(s, z, r)
+inflate_blocks_statef *s;
+z_streamp z;
+int r;
+{
+ uInt t; /* temporary storage */
+ uLong b; /* bit buffer */
+ uInt k; /* bits in bit buffer */
+ Bytef *p; /* input data pointer */
+ uInt n; /* bytes available there */
+ Bytef *q; /* output window write pointer */
+ uInt m; /* bytes to end of window or read pointer */
+
+ /* copy input/output information to locals (UPDATE macro restores) */
+ LOAD
+
+ /* process input based on current state */
+ while (1) switch (s->mode)
+ {
+ case TYPE:
+ NEEDBITS(3)
+ t = (uInt)b & 7;
+ s->last = t & 1;
+ switch (t >> 1)
+ {
+ case 0: /* stored */
+ Tracev((stderr, "inflate: stored block%s\n",
+ s->last ? " (last)" : ""));
+ DUMPBITS(3)
+ t = k & 7; /* go to byte boundary */
+ DUMPBITS(t)
+ s->mode = LENS; /* get length of stored block */
+ break;
+ case 1: /* fixed */
+ Tracev((stderr, "inflate: fixed codes block%s\n",
+ s->last ? " (last)" : ""));
+ {
+ uInt bl, bd;
+ inflate_huft *tl, *td;
+
+ inflate_trees_fixed(&bl, &bd, &tl, &td, z);
+ s->sub.decode.codes = inflate_codes_new(bl, bd, tl, td, z);
+ if (s->sub.decode.codes == Z_NULL)
+ {
+ r = Z_MEM_ERROR;
+ LEAVE
+ }
+ }
+ DUMPBITS(3)
+ s->mode = CODES;
+ break;
+ case 2: /* dynamic */
+ Tracev((stderr, "inflate: dynamic codes block%s\n",
+ s->last ? " (last)" : ""));
+ DUMPBITS(3)
+ s->mode = TABLE;
+ break;
+ case 3: /* illegal */
+ DUMPBITS(3)
+ s->mode = BAD;
+ z->msg = (char*)"invalid block type";
+ r = Z_DATA_ERROR;
+ LEAVE
+ }
+ break;
+ case LENS:
+ NEEDBITS(32)
+ if ((((~b) >> 16) & 0xffff) != (b & 0xffff))
+ {
+ s->mode = BAD;
+ z->msg = (char*)"invalid stored block lengths";
+ r = Z_DATA_ERROR;
+ LEAVE
+ }
+ s->sub.left = (uInt)b & 0xffff;
+ b = k = 0; /* dump bits */
+ Tracev((stderr, "inflate: stored length %u\n", s->sub.left));
+ s->mode = s->sub.left ? STORED : (s->last ? DRY : TYPE);
+ break;
+ case STORED:
+ if (n == 0)
+ LEAVE
+ NEEDOUT
+ t = s->sub.left;
+ if (t > n) t = n;
+ if (t > m) t = m;
+ zmemcpy(q, p, t);
+ p += t; n -= t;
+ q += t; m -= t;
+ if ((s->sub.left -= t) != 0)
+ break;
+ Tracev((stderr, "inflate: stored end, %lu total out\n",
+ z->total_out + (q >= s->read ? q - s->read :
+ (s->end - s->read) + (q - s->window))));
+ s->mode = s->last ? DRY : TYPE;
+ break;
+ case TABLE:
+ NEEDBITS(14)
+ s->sub.trees.table = t = (uInt)b & 0x3fff;
+#ifndef PKZIP_BUG_WORKAROUND
+ if ((t & 0x1f) > 29 || ((t >> 5) & 0x1f) > 29)
+ {
+ s->mode = BAD;
+ z->msg = (char*)"too many length or distance symbols";
+ r = Z_DATA_ERROR;
+ LEAVE
+ }
+#endif
+ t = 258 + (t & 0x1f) + ((t >> 5) & 0x1f);
+ if ((s->sub.trees.blens = (uIntf*)ZALLOC(z, t, sizeof(uInt))) == Z_NULL)
+ {
+ r = Z_MEM_ERROR;
+ LEAVE
+ }
+ DUMPBITS(14)
+ s->sub.trees.index = 0;
+ Tracev((stderr, "inflate: table sizes ok\n"));
+ s->mode = BTREE;
+ case BTREE:
+ while (s->sub.trees.index < 4 + (s->sub.trees.table >> 10))
+ {
+ NEEDBITS(3)
+ s->sub.trees.blens[border[s->sub.trees.index++]] = (uInt)b & 7;
+ DUMPBITS(3)
+ }
+ while (s->sub.trees.index < 19)
+ s->sub.trees.blens[border[s->sub.trees.index++]] = 0;
+ s->sub.trees.bb = 7;
+ t = inflate_trees_bits(s->sub.trees.blens, &s->sub.trees.bb,
+ &s->sub.trees.tb, s->hufts, z);
+ if (t != Z_OK)
+ {
+ ZFREE(z, s->sub.trees.blens);
+ r = t;
+ if (r == Z_DATA_ERROR)
+ s->mode = BAD;
+ LEAVE
+ }
+ s->sub.trees.index = 0;
+ Tracev((stderr, "inflate: bits tree ok\n"));
+ s->mode = DTREE;
+ case DTREE:
+ while (t = s->sub.trees.table,
+ s->sub.trees.index < 258 + (t & 0x1f) + ((t >> 5) & 0x1f))
+ {
+ inflate_huft *h;
+ uInt i, j, c;
+
+ t = s->sub.trees.bb;
+ NEEDBITS(t)
+ h = s->sub.trees.tb + ((uInt)b & inflate_mask[t]);
+ t = h->bits;
+ c = h->base;
+ if (c < 16)
+ {
+ DUMPBITS(t)
+ s->sub.trees.blens[s->sub.trees.index++] = c;
+ }
+ else /* c == 16..18 */
+ {
+ i = c == 18 ? 7 : c - 14;
+ j = c == 18 ? 11 : 3;
+ NEEDBITS(t + i)
+ DUMPBITS(t)
+ j += (uInt)b & inflate_mask[i];
+ DUMPBITS(i)
+ i = s->sub.trees.index;
+ t = s->sub.trees.table;
+ if (i + j > 258 + (t & 0x1f) + ((t >> 5) & 0x1f) ||
+ (c == 16 && i < 1))
+ {
+ ZFREE(z, s->sub.trees.blens);
+ s->mode = BAD;
+ z->msg = (char*)"invalid bit length repeat";
+ r = Z_DATA_ERROR;
+ LEAVE
+ }
+ c = c == 16 ? s->sub.trees.blens[i - 1] : 0;
+ do {
+ s->sub.trees.blens[i++] = c;
+ } while (--j);
+ s->sub.trees.index = i;
+ }
+ }
+ s->sub.trees.tb = Z_NULL;
+ {
+ uInt bl, bd;
+ inflate_huft *tl, *td;
+ inflate_codes_statef *c;
+
+ bl = 9; /* must be <= 9 for lookahead assumptions */
+ bd = 6; /* must be <= 9 for lookahead assumptions */
+ t = s->sub.trees.table;
+ t = inflate_trees_dynamic(257 + (t & 0x1f), 1 + ((t >> 5) & 0x1f),
+ s->sub.trees.blens, &bl, &bd, &tl, &td,
+ s->hufts, z);
+ ZFREE(z, s->sub.trees.blens);
+ if (t != Z_OK)
+ {
+ if (t == (uInt)Z_DATA_ERROR)
+ s->mode = BAD;
+ r = t;
+ LEAVE
+ }
+ Tracev((stderr, "inflate: trees ok\n"));
+ if ((c = inflate_codes_new(bl, bd, tl, td, z)) == Z_NULL)
+ {
+ r = Z_MEM_ERROR;
+ LEAVE
+ }
+ s->sub.decode.codes = c;
+ }
+ s->mode = CODES;
+ case CODES:
+ UPDATE
+ if ((r = inflate_codes(s, z, r)) != Z_STREAM_END)
+ return inflate_flush(s, z, r);
+ r = Z_OK;
+ inflate_codes_free(s->sub.decode.codes, z);
+ LOAD
+ Tracev((stderr, "inflate: codes end, %lu total out\n",
+ z->total_out + (q >= s->read ? q - s->read :
+ (s->end - s->read) + (q - s->window))));
+ if (!s->last)
+ {
+ s->mode = TYPE;
+ break;
+ }
+ s->mode = DRY;
+ case DRY:
+ FLUSH
+ if (s->read != s->write)
+ LEAVE
+ s->mode = DONE;
+ case DONE:
+ r = Z_STREAM_END;
+ LEAVE
+ case BAD:
+ r = Z_DATA_ERROR;
+ LEAVE
+ default:
+ r = Z_STREAM_ERROR;
+ LEAVE
+ }
+}
+
+
+int inflate_blocks_free(s, z)
+inflate_blocks_statef *s;
+z_streamp z;
+{
+ inflate_blocks_reset(s, z, Z_NULL);
+ ZFREE(z, s->window);
+ ZFREE(z, s->hufts);
+ ZFREE(z, s);
+ Tracev((stderr, "inflate: blocks freed\n"));
+ return Z_OK;
+}
+
+
+void inflate_set_dictionary(s, d, n)
+inflate_blocks_statef *s;
+const Bytef *d;
+uInt n;
+{
+ zmemcpy(s->window, d, n);
+ s->read = s->write = s->window + n;
+}
+
+
+/* Returns true if inflate is currently at the end of a block generated
+ * by Z_SYNC_FLUSH or Z_FULL_FLUSH.
+ * IN assertion: s != Z_NULL
+ */
+int inflate_blocks_sync_point(s)
+inflate_blocks_statef *s;
+{
+ return s->mode == LENS;
+}
diff --git a/zlib/infblock.h b/zlib/infblock.h
new file mode 100644
index 00000000000..bd25c807536
--- /dev/null
+++ b/zlib/infblock.h
@@ -0,0 +1,39 @@
+/* infblock.h -- header to use infblock.c
+ * Copyright (C) 1995-1998 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* WARNING: this file should *not* be used by applications. It is
+ part of the implementation of the compression library and is
+ subject to change. Applications should only use zlib.h.
+ */
+
+struct inflate_blocks_state;
+typedef struct inflate_blocks_state FAR inflate_blocks_statef;
+
+extern inflate_blocks_statef * inflate_blocks_new OF((
+ z_streamp z,
+ check_func c, /* check function */
+ uInt w)); /* window size */
+
+extern int inflate_blocks OF((
+ inflate_blocks_statef *,
+ z_streamp ,
+ int)); /* initial return code */
+
+extern void inflate_blocks_reset OF((
+ inflate_blocks_statef *,
+ z_streamp ,
+ uLongf *)); /* check value on output */
+
+extern int inflate_blocks_free OF((
+ inflate_blocks_statef *,
+ z_streamp));
+
+extern void inflate_set_dictionary OF((
+ inflate_blocks_statef *s,
+ const Bytef *d, /* dictionary */
+ uInt n)); /* dictionary length */
+
+extern int inflate_blocks_sync_point OF((
+ inflate_blocks_statef *s));
diff --git a/zlib/infcodes.c b/zlib/infcodes.c
new file mode 100644
index 00000000000..d4e5ee9a554
--- /dev/null
+++ b/zlib/infcodes.c
@@ -0,0 +1,257 @@
+/* infcodes.c -- process literals and length/distance pairs
+ * Copyright (C) 1995-1998 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+#include "zutil.h"
+#include "inftrees.h"
+#include "infblock.h"
+#include "infcodes.h"
+#include "infutil.h"
+#include "inffast.h"
+
+/* simplify the use of the inflate_huft type with some defines */
+#define exop word.what.Exop
+#define bits word.what.Bits
+
+typedef enum { /* waiting for "i:"=input, "o:"=output, "x:"=nothing */
+ START, /* x: set up for LEN */
+ LEN, /* i: get length/literal/eob next */
+ LENEXT, /* i: getting length extra (have base) */
+ DIST, /* i: get distance next */
+ DISTEXT, /* i: getting distance extra */
+ COPY, /* o: copying bytes in window, waiting for space */
+ LIT, /* o: got literal, waiting for output space */
+ WASH, /* o: got eob, possibly still output waiting */
+ END, /* x: got eob and all data flushed */
+ BADCODE} /* x: got error */
+inflate_codes_mode;
+
+/* inflate codes private state */
+struct inflate_codes_state {
+
+ /* mode */
+ inflate_codes_mode mode; /* current inflate_codes mode */
+
+ /* mode dependent information */
+ uInt len;
+ union {
+ struct {
+ inflate_huft *tree; /* pointer into tree */
+ uInt need; /* bits needed */
+ } code; /* if LEN or DIST, where in tree */
+ uInt lit; /* if LIT, literal */
+ struct {
+ uInt get; /* bits to get for extra */
+ uInt dist; /* distance back to copy from */
+ } copy; /* if EXT or COPY, where and how much */
+ } sub; /* submode */
+
+ /* mode independent information */
+ Byte lbits; /* ltree bits decoded per branch */
+ Byte dbits; /* dtree bits decoder per branch */
+ inflate_huft *ltree; /* literal/length/eob tree */
+ inflate_huft *dtree; /* distance tree */
+
+};
+
+
+inflate_codes_statef *inflate_codes_new(bl, bd, tl, td, z)
+uInt bl, bd;
+inflate_huft *tl;
+inflate_huft *td; /* need separate declaration for Borland C++ */
+z_streamp z;
+{
+ inflate_codes_statef *c;
+
+ if ((c = (inflate_codes_statef *)
+ ZALLOC(z,1,sizeof(struct inflate_codes_state))) != Z_NULL)
+ {
+ c->mode = START;
+ c->lbits = (Byte)bl;
+ c->dbits = (Byte)bd;
+ c->ltree = tl;
+ c->dtree = td;
+ Tracev((stderr, "inflate: codes new\n"));
+ }
+ return c;
+}
+
+
+int inflate_codes(s, z, r)
+inflate_blocks_statef *s;
+z_streamp z;
+int r;
+{
+ uInt j; /* temporary storage */
+ inflate_huft *t; /* temporary pointer */
+ uInt e; /* extra bits or operation */
+ uLong b; /* bit buffer */
+ uInt k; /* bits in bit buffer */
+ Bytef *p; /* input data pointer */
+ uInt n; /* bytes available there */
+ Bytef *q; /* output window write pointer */
+ uInt m; /* bytes to end of window or read pointer */
+ Bytef *f; /* pointer to copy strings from */
+ inflate_codes_statef *c = s->sub.decode.codes; /* codes state */
+
+ /* copy input/output information to locals (UPDATE macro restores) */
+ LOAD
+
+ /* process input and output based on current state */
+ while (1) switch (c->mode)
+ { /* waiting for "i:"=input, "o:"=output, "x:"=nothing */
+ case START: /* x: set up for LEN */
+#ifndef SLOW
+ if (m >= 258 && n >= 10)
+ {
+ UPDATE
+ r = inflate_fast(c->lbits, c->dbits, c->ltree, c->dtree, s, z);
+ LOAD
+ if (r != Z_OK)
+ {
+ c->mode = r == Z_STREAM_END ? WASH : BADCODE;
+ break;
+ }
+ }
+#endif /* !SLOW */
+ c->sub.code.need = c->lbits;
+ c->sub.code.tree = c->ltree;
+ c->mode = LEN;
+ case LEN: /* i: get length/literal/eob next */
+ j = c->sub.code.need;
+ NEEDBITS(j)
+ t = c->sub.code.tree + ((uInt)b & inflate_mask[j]);
+ DUMPBITS(t->bits)
+ e = (uInt)(t->exop);
+ if (e == 0) /* literal */
+ {
+ c->sub.lit = t->base;
+ Tracevv((stderr, t->base >= 0x20 && t->base < 0x7f ?
+ "inflate: literal '%c'\n" :
+ "inflate: literal 0x%02x\n", t->base));
+ c->mode = LIT;
+ break;
+ }
+ if (e & 16) /* length */
+ {
+ c->sub.copy.get = e & 15;
+ c->len = t->base;
+ c->mode = LENEXT;
+ break;
+ }
+ if ((e & 64) == 0) /* next table */
+ {
+ c->sub.code.need = e;
+ c->sub.code.tree = t + t->base;
+ break;
+ }
+ if (e & 32) /* end of block */
+ {
+ Tracevv((stderr, "inflate: end of block\n"));
+ c->mode = WASH;
+ break;
+ }
+ c->mode = BADCODE; /* invalid code */
+ z->msg = (char*)"invalid literal/length code";
+ r = Z_DATA_ERROR;
+ LEAVE
+ case LENEXT: /* i: getting length extra (have base) */
+ j = c->sub.copy.get;
+ NEEDBITS(j)
+ c->len += (uInt)b & inflate_mask[j];
+ DUMPBITS(j)
+ c->sub.code.need = c->dbits;
+ c->sub.code.tree = c->dtree;
+ Tracevv((stderr, "inflate: length %u\n", c->len));
+ c->mode = DIST;
+ case DIST: /* i: get distance next */
+ j = c->sub.code.need;
+ NEEDBITS(j)
+ t = c->sub.code.tree + ((uInt)b & inflate_mask[j]);
+ DUMPBITS(t->bits)
+ e = (uInt)(t->exop);
+ if (e & 16) /* distance */
+ {
+ c->sub.copy.get = e & 15;
+ c->sub.copy.dist = t->base;
+ c->mode = DISTEXT;
+ break;
+ }
+ if ((e & 64) == 0) /* next table */
+ {
+ c->sub.code.need = e;
+ c->sub.code.tree = t + t->base;
+ break;
+ }
+ c->mode = BADCODE; /* invalid code */
+ z->msg = (char*)"invalid distance code";
+ r = Z_DATA_ERROR;
+ LEAVE
+ case DISTEXT: /* i: getting distance extra */
+ j = c->sub.copy.get;
+ NEEDBITS(j)
+ c->sub.copy.dist += (uInt)b & inflate_mask[j];
+ DUMPBITS(j)
+ Tracevv((stderr, "inflate: distance %u\n", c->sub.copy.dist));
+ c->mode = COPY;
+ case COPY: /* o: copying bytes in window, waiting for space */
+#ifndef __TURBOC__ /* Turbo C bug for following expression */
+ f = (uInt)(q - s->window) < c->sub.copy.dist ?
+ s->end - (c->sub.copy.dist - (q - s->window)) :
+ q - c->sub.copy.dist;
+#else
+ f = q - c->sub.copy.dist;
+ if ((uInt)(q - s->window) < c->sub.copy.dist)
+ f = s->end - (c->sub.copy.dist - (uInt)(q - s->window));
+#endif
+ while (c->len)
+ {
+ NEEDOUT
+ OUTBYTE(*f++)
+ if (f == s->end)
+ f = s->window;
+ c->len--;
+ }
+ c->mode = START;
+ break;
+ case LIT: /* o: got literal, waiting for output space */
+ NEEDOUT
+ OUTBYTE(c->sub.lit)
+ c->mode = START;
+ break;
+ case WASH: /* o: got eob, possibly more output */
+ if (k > 7) /* return unused byte, if any */
+ {
+ Assert(k < 16, "inflate_codes grabbed too many bytes")
+ k -= 8;
+ n++;
+ p--; /* can always return one */
+ }
+ FLUSH
+ if (s->read != s->write)
+ LEAVE
+ c->mode = END;
+ case END:
+ r = Z_STREAM_END;
+ LEAVE
+ case BADCODE: /* x: got error */
+ r = Z_DATA_ERROR;
+ LEAVE
+ default:
+ r = Z_STREAM_ERROR;
+ LEAVE
+ }
+#ifdef NEED_DUMMY_RETURN
+ return Z_STREAM_ERROR; /* Some dumb compilers complain without this */
+#endif
+}
+
+
+void inflate_codes_free(c, z)
+inflate_codes_statef *c;
+z_streamp z;
+{
+ ZFREE(z, c);
+ Tracev((stderr, "inflate: codes free\n"));
+}
diff --git a/zlib/infcodes.h b/zlib/infcodes.h
new file mode 100644
index 00000000000..6c750d896f9
--- /dev/null
+++ b/zlib/infcodes.h
@@ -0,0 +1,27 @@
+/* infcodes.h -- header to use infcodes.c
+ * Copyright (C) 1995-1998 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* WARNING: this file should *not* be used by applications. It is
+ part of the implementation of the compression library and is
+ subject to change. Applications should only use zlib.h.
+ */
+
+struct inflate_codes_state;
+typedef struct inflate_codes_state FAR inflate_codes_statef;
+
+extern inflate_codes_statef *inflate_codes_new OF((
+ uInt, uInt,
+ inflate_huft *, inflate_huft *,
+ z_streamp ));
+
+extern int inflate_codes OF((
+ inflate_blocks_statef *,
+ z_streamp ,
+ int));
+
+extern void inflate_codes_free OF((
+ inflate_codes_statef *,
+ z_streamp ));
+
diff --git a/zlib/inffast.c b/zlib/inffast.c
new file mode 100644
index 00000000000..61a78ee933f
--- /dev/null
+++ b/zlib/inffast.c
@@ -0,0 +1,170 @@
+/* inffast.c -- process literals and length/distance pairs fast
+ * Copyright (C) 1995-1998 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+#include "zutil.h"
+#include "inftrees.h"
+#include "infblock.h"
+#include "infcodes.h"
+#include "infutil.h"
+#include "inffast.h"
+
+struct inflate_codes_state {int dummy;}; /* for buggy compilers */
+
+/* simplify the use of the inflate_huft type with some defines */
+#define exop word.what.Exop
+#define bits word.what.Bits
+
+/* macros for bit input with no checking and for returning unused bytes */
+#define GRABBITS(j) {while(k<(j)){b|=((uLong)NEXTBYTE)<<k;k+=8;}}
+#define UNGRAB {c=z->avail_in-n;c=(k>>3)<c?k>>3:c;n+=c;p-=c;k-=c<<3;}
+
+/* Called with number of bytes left to write in window at least 258
+ (the maximum string length) and number of input bytes available
+ at least ten. The ten bytes are six bytes for the longest length/
+ distance pair plus four bytes for overloading the bit buffer. */
+
+int inflate_fast(bl, bd, tl, td, s, z)
+uInt bl, bd;
+inflate_huft *tl;
+inflate_huft *td; /* need separate declaration for Borland C++ */
+inflate_blocks_statef *s;
+z_streamp z;
+{
+ inflate_huft *t; /* temporary pointer */
+ uInt e; /* extra bits or operation */
+ uLong b; /* bit buffer */
+ uInt k; /* bits in bit buffer */
+ Bytef *p; /* input data pointer */
+ uInt n; /* bytes available there */
+ Bytef *q; /* output window write pointer */
+ uInt m; /* bytes to end of window or read pointer */
+ uInt ml; /* mask for literal/length tree */
+ uInt md; /* mask for distance tree */
+ uInt c; /* bytes to copy */
+ uInt d; /* distance back to copy from */
+ Bytef *r; /* copy source pointer */
+
+ /* load input, output, bit values */
+ LOAD
+
+ /* initialize masks */
+ ml = inflate_mask[bl];
+ md = inflate_mask[bd];
+
+ /* do until not enough input or output space for fast loop */
+ do { /* assume called with m >= 258 && n >= 10 */
+ /* get literal/length code */
+ GRABBITS(20) /* max bits for literal/length code */
+ if ((e = (t = tl + ((uInt)b & ml))->exop) == 0)
+ {
+ DUMPBITS(t->bits)
+ Tracevv((stderr, t->base >= 0x20 && t->base < 0x7f ?
+ "inflate: * literal '%c'\n" :
+ "inflate: * literal 0x%02x\n", t->base));
+ *q++ = (Byte)t->base;
+ m--;
+ continue;
+ }
+ do {
+ DUMPBITS(t->bits)
+ if (e & 16)
+ {
+ /* get extra bits for length */
+ e &= 15;
+ c = t->base + ((uInt)b & inflate_mask[e]);
+ DUMPBITS(e)
+ Tracevv((stderr, "inflate: * length %u\n", c));
+
+ /* decode distance base of block to copy */
+ GRABBITS(15); /* max bits for distance code */
+ e = (t = td + ((uInt)b & md))->exop;
+ do {
+ DUMPBITS(t->bits)
+ if (e & 16)
+ {
+ /* get extra bits to add to distance base */
+ e &= 15;
+ GRABBITS(e) /* get extra bits (up to 13) */
+ d = t->base + ((uInt)b & inflate_mask[e]);
+ DUMPBITS(e)
+ Tracevv((stderr, "inflate: * distance %u\n", d));
+
+ /* do the copy */
+ m -= c;
+ if ((uInt)(q - s->window) >= d) /* offset before dest */
+ { /* just copy */
+ r = q - d;
+ *q++ = *r++; c--; /* minimum count is three, */
+ *q++ = *r++; c--; /* so unroll loop a little */
+ }
+ else /* else offset after destination */
+ {
+ e = d - (uInt)(q - s->window); /* bytes from offset to end */
+ r = s->end - e; /* pointer to offset */
+ if (c > e) /* if source crosses, */
+ {
+ c -= e; /* copy to end of window */
+ do {
+ *q++ = *r++;
+ } while (--e);
+ r = s->window; /* copy rest from start of window */
+ }
+ }
+ do { /* copy all or what's left */
+ *q++ = *r++;
+ } while (--c);
+ break;
+ }
+ else if ((e & 64) == 0)
+ {
+ t += t->base;
+ e = (t += ((uInt)b & inflate_mask[e]))->exop;
+ }
+ else
+ {
+ z->msg = (char*)"invalid distance code";
+ UNGRAB
+ UPDATE
+ return Z_DATA_ERROR;
+ }
+ } while (1);
+ break;
+ }
+ if ((e & 64) == 0)
+ {
+ t += t->base;
+ if ((e = (t += ((uInt)b & inflate_mask[e]))->exop) == 0)
+ {
+ DUMPBITS(t->bits)
+ Tracevv((stderr, t->base >= 0x20 && t->base < 0x7f ?
+ "inflate: * literal '%c'\n" :
+ "inflate: * literal 0x%02x\n", t->base));
+ *q++ = (Byte)t->base;
+ m--;
+ break;
+ }
+ }
+ else if (e & 32)
+ {
+ Tracevv((stderr, "inflate: * end of block\n"));
+ UNGRAB
+ UPDATE
+ return Z_STREAM_END;
+ }
+ else
+ {
+ z->msg = (char*)"invalid literal/length code";
+ UNGRAB
+ UPDATE
+ return Z_DATA_ERROR;
+ }
+ } while (1);
+ } while (m >= 258 && n >= 10);
+
+ /* not enough input or output--restore pointers and return */
+ UNGRAB
+ UPDATE
+ return Z_OK;
+}
diff --git a/zlib/inffast.h b/zlib/inffast.h
new file mode 100644
index 00000000000..8facec55314
--- /dev/null
+++ b/zlib/inffast.h
@@ -0,0 +1,17 @@
+/* inffast.h -- header to use inffast.c
+ * Copyright (C) 1995-1998 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* WARNING: this file should *not* be used by applications. It is
+ part of the implementation of the compression library and is
+ subject to change. Applications should only use zlib.h.
+ */
+
+extern int inflate_fast OF((
+ uInt,
+ uInt,
+ inflate_huft *,
+ inflate_huft *,
+ inflate_blocks_statef *,
+ z_streamp ));
diff --git a/zlib/inffixed.h b/zlib/inffixed.h
new file mode 100644
index 00000000000..77f7e763145
--- /dev/null
+++ b/zlib/inffixed.h
@@ -0,0 +1,151 @@
+/* inffixed.h -- table for decoding fixed codes
+ * Generated automatically by the maketree.c program
+ */
+
+/* WARNING: this file should *not* be used by applications. It is
+ part of the implementation of the compression library and is
+ subject to change. Applications should only use zlib.h.
+ */
+
+local uInt fixed_bl = 9;
+local uInt fixed_bd = 5;
+local inflate_huft fixed_tl[] = {
+ {{{96,7}},256}, {{{0,8}},80}, {{{0,8}},16}, {{{84,8}},115},
+ {{{82,7}},31}, {{{0,8}},112}, {{{0,8}},48}, {{{0,9}},192},
+ {{{80,7}},10}, {{{0,8}},96}, {{{0,8}},32}, {{{0,9}},160},
+ {{{0,8}},0}, {{{0,8}},128}, {{{0,8}},64}, {{{0,9}},224},
+ {{{80,7}},6}, {{{0,8}},88}, {{{0,8}},24}, {{{0,9}},144},
+ {{{83,7}},59}, {{{0,8}},120}, {{{0,8}},56}, {{{0,9}},208},
+ {{{81,7}},17}, {{{0,8}},104}, {{{0,8}},40}, {{{0,9}},176},
+ {{{0,8}},8}, {{{0,8}},136}, {{{0,8}},72}, {{{0,9}},240},
+ {{{80,7}},4}, {{{0,8}},84}, {{{0,8}},20}, {{{85,8}},227},
+ {{{83,7}},43}, {{{0,8}},116}, {{{0,8}},52}, {{{0,9}},200},
+ {{{81,7}},13}, {{{0,8}},100}, {{{0,8}},36}, {{{0,9}},168},
+ {{{0,8}},4}, {{{0,8}},132}, {{{0,8}},68}, {{{0,9}},232},
+ {{{80,7}},8}, {{{0,8}},92}, {{{0,8}},28}, {{{0,9}},152},
+ {{{84,7}},83}, {{{0,8}},124}, {{{0,8}},60}, {{{0,9}},216},
+ {{{82,7}},23}, {{{0,8}},108}, {{{0,8}},44}, {{{0,9}},184},
+ {{{0,8}},12}, {{{0,8}},140}, {{{0,8}},76}, {{{0,9}},248},
+ {{{80,7}},3}, {{{0,8}},82}, {{{0,8}},18}, {{{85,8}},163},
+ {{{83,7}},35}, {{{0,8}},114}, {{{0,8}},50}, {{{0,9}},196},
+ {{{81,7}},11}, {{{0,8}},98}, {{{0,8}},34}, {{{0,9}},164},
+ {{{0,8}},2}, {{{0,8}},130}, {{{0,8}},66}, {{{0,9}},228},
+ {{{80,7}},7}, {{{0,8}},90}, {{{0,8}},26}, {{{0,9}},148},
+ {{{84,7}},67}, {{{0,8}},122}, {{{0,8}},58}, {{{0,9}},212},
+ {{{82,7}},19}, {{{0,8}},106}, {{{0,8}},42}, {{{0,9}},180},
+ {{{0,8}},10}, {{{0,8}},138}, {{{0,8}},74}, {{{0,9}},244},
+ {{{80,7}},5}, {{{0,8}},86}, {{{0,8}},22}, {{{192,8}},0},
+ {{{83,7}},51}, {{{0,8}},118}, {{{0,8}},54}, {{{0,9}},204},
+ {{{81,7}},15}, {{{0,8}},102}, {{{0,8}},38}, {{{0,9}},172},
+ {{{0,8}},6}, {{{0,8}},134}, {{{0,8}},70}, {{{0,9}},236},
+ {{{80,7}},9}, {{{0,8}},94}, {{{0,8}},30}, {{{0,9}},156},
+ {{{84,7}},99}, {{{0,8}},126}, {{{0,8}},62}, {{{0,9}},220},
+ {{{82,7}},27}, {{{0,8}},110}, {{{0,8}},46}, {{{0,9}},188},
+ {{{0,8}},14}, {{{0,8}},142}, {{{0,8}},78}, {{{0,9}},252},
+ {{{96,7}},256}, {{{0,8}},81}, {{{0,8}},17}, {{{85,8}},131},
+ {{{82,7}},31}, {{{0,8}},113}, {{{0,8}},49}, {{{0,9}},194},
+ {{{80,7}},10}, {{{0,8}},97}, {{{0,8}},33}, {{{0,9}},162},
+ {{{0,8}},1}, {{{0,8}},129}, {{{0,8}},65}, {{{0,9}},226},
+ {{{80,7}},6}, {{{0,8}},89}, {{{0,8}},25}, {{{0,9}},146},
+ {{{83,7}},59}, {{{0,8}},121}, {{{0,8}},57}, {{{0,9}},210},
+ {{{81,7}},17}, {{{0,8}},105}, {{{0,8}},41}, {{{0,9}},178},
+ {{{0,8}},9}, {{{0,8}},137}, {{{0,8}},73}, {{{0,9}},242},
+ {{{80,7}},4}, {{{0,8}},85}, {{{0,8}},21}, {{{80,8}},258},
+ {{{83,7}},43}, {{{0,8}},117}, {{{0,8}},53}, {{{0,9}},202},
+ {{{81,7}},13}, {{{0,8}},101}, {{{0,8}},37}, {{{0,9}},170},
+ {{{0,8}},5}, {{{0,8}},133}, {{{0,8}},69}, {{{0,9}},234},
+ {{{80,7}},8}, {{{0,8}},93}, {{{0,8}},29}, {{{0,9}},154},
+ {{{84,7}},83}, {{{0,8}},125}, {{{0,8}},61}, {{{0,9}},218},
+ {{{82,7}},23}, {{{0,8}},109}, {{{0,8}},45}, {{{0,9}},186},
+ {{{0,8}},13}, {{{0,8}},141}, {{{0,8}},77}, {{{0,9}},250},
+ {{{80,7}},3}, {{{0,8}},83}, {{{0,8}},19}, {{{85,8}},195},
+ {{{83,7}},35}, {{{0,8}},115}, {{{0,8}},51}, {{{0,9}},198},
+ {{{81,7}},11}, {{{0,8}},99}, {{{0,8}},35}, {{{0,9}},166},
+ {{{0,8}},3}, {{{0,8}},131}, {{{0,8}},67}, {{{0,9}},230},
+ {{{80,7}},7}, {{{0,8}},91}, {{{0,8}},27}, {{{0,9}},150},
+ {{{84,7}},67}, {{{0,8}},123}, {{{0,8}},59}, {{{0,9}},214},
+ {{{82,7}},19}, {{{0,8}},107}, {{{0,8}},43}, {{{0,9}},182},
+ {{{0,8}},11}, {{{0,8}},139}, {{{0,8}},75}, {{{0,9}},246},
+ {{{80,7}},5}, {{{0,8}},87}, {{{0,8}},23}, {{{192,8}},0},
+ {{{83,7}},51}, {{{0,8}},119}, {{{0,8}},55}, {{{0,9}},206},
+ {{{81,7}},15}, {{{0,8}},103}, {{{0,8}},39}, {{{0,9}},174},
+ {{{0,8}},7}, {{{0,8}},135}, {{{0,8}},71}, {{{0,9}},238},
+ {{{80,7}},9}, {{{0,8}},95}, {{{0,8}},31}, {{{0,9}},158},
+ {{{84,7}},99}, {{{0,8}},127}, {{{0,8}},63}, {{{0,9}},222},
+ {{{82,7}},27}, {{{0,8}},111}, {{{0,8}},47}, {{{0,9}},190},
+ {{{0,8}},15}, {{{0,8}},143}, {{{0,8}},79}, {{{0,9}},254},
+ {{{96,7}},256}, {{{0,8}},80}, {{{0,8}},16}, {{{84,8}},115},
+ {{{82,7}},31}, {{{0,8}},112}, {{{0,8}},48}, {{{0,9}},193},
+ {{{80,7}},10}, {{{0,8}},96}, {{{0,8}},32}, {{{0,9}},161},
+ {{{0,8}},0}, {{{0,8}},128}, {{{0,8}},64}, {{{0,9}},225},
+ {{{80,7}},6}, {{{0,8}},88}, {{{0,8}},24}, {{{0,9}},145},
+ {{{83,7}},59}, {{{0,8}},120}, {{{0,8}},56}, {{{0,9}},209},
+ {{{81,7}},17}, {{{0,8}},104}, {{{0,8}},40}, {{{0,9}},177},
+ {{{0,8}},8}, {{{0,8}},136}, {{{0,8}},72}, {{{0,9}},241},
+ {{{80,7}},4}, {{{0,8}},84}, {{{0,8}},20}, {{{85,8}},227},
+ {{{83,7}},43}, {{{0,8}},116}, {{{0,8}},52}, {{{0,9}},201},
+ {{{81,7}},13}, {{{0,8}},100}, {{{0,8}},36}, {{{0,9}},169},
+ {{{0,8}},4}, {{{0,8}},132}, {{{0,8}},68}, {{{0,9}},233},
+ {{{80,7}},8}, {{{0,8}},92}, {{{0,8}},28}, {{{0,9}},153},
+ {{{84,7}},83}, {{{0,8}},124}, {{{0,8}},60}, {{{0,9}},217},
+ {{{82,7}},23}, {{{0,8}},108}, {{{0,8}},44}, {{{0,9}},185},
+ {{{0,8}},12}, {{{0,8}},140}, {{{0,8}},76}, {{{0,9}},249},
+ {{{80,7}},3}, {{{0,8}},82}, {{{0,8}},18}, {{{85,8}},163},
+ {{{83,7}},35}, {{{0,8}},114}, {{{0,8}},50}, {{{0,9}},197},
+ {{{81,7}},11}, {{{0,8}},98}, {{{0,8}},34}, {{{0,9}},165},
+ {{{0,8}},2}, {{{0,8}},130}, {{{0,8}},66}, {{{0,9}},229},
+ {{{80,7}},7}, {{{0,8}},90}, {{{0,8}},26}, {{{0,9}},149},
+ {{{84,7}},67}, {{{0,8}},122}, {{{0,8}},58}, {{{0,9}},213},
+ {{{82,7}},19}, {{{0,8}},106}, {{{0,8}},42}, {{{0,9}},181},
+ {{{0,8}},10}, {{{0,8}},138}, {{{0,8}},74}, {{{0,9}},245},
+ {{{80,7}},5}, {{{0,8}},86}, {{{0,8}},22}, {{{192,8}},0},
+ {{{83,7}},51}, {{{0,8}},118}, {{{0,8}},54}, {{{0,9}},205},
+ {{{81,7}},15}, {{{0,8}},102}, {{{0,8}},38}, {{{0,9}},173},
+ {{{0,8}},6}, {{{0,8}},134}, {{{0,8}},70}, {{{0,9}},237},
+ {{{80,7}},9}, {{{0,8}},94}, {{{0,8}},30}, {{{0,9}},157},
+ {{{84,7}},99}, {{{0,8}},126}, {{{0,8}},62}, {{{0,9}},221},
+ {{{82,7}},27}, {{{0,8}},110}, {{{0,8}},46}, {{{0,9}},189},
+ {{{0,8}},14}, {{{0,8}},142}, {{{0,8}},78}, {{{0,9}},253},
+ {{{96,7}},256}, {{{0,8}},81}, {{{0,8}},17}, {{{85,8}},131},
+ {{{82,7}},31}, {{{0,8}},113}, {{{0,8}},49}, {{{0,9}},195},
+ {{{80,7}},10}, {{{0,8}},97}, {{{0,8}},33}, {{{0,9}},163},
+ {{{0,8}},1}, {{{0,8}},129}, {{{0,8}},65}, {{{0,9}},227},
+ {{{80,7}},6}, {{{0,8}},89}, {{{0,8}},25}, {{{0,9}},147},
+ {{{83,7}},59}, {{{0,8}},121}, {{{0,8}},57}, {{{0,9}},211},
+ {{{81,7}},17}, {{{0,8}},105}, {{{0,8}},41}, {{{0,9}},179},
+ {{{0,8}},9}, {{{0,8}},137}, {{{0,8}},73}, {{{0,9}},243},
+ {{{80,7}},4}, {{{0,8}},85}, {{{0,8}},21}, {{{80,8}},258},
+ {{{83,7}},43}, {{{0,8}},117}, {{{0,8}},53}, {{{0,9}},203},
+ {{{81,7}},13}, {{{0,8}},101}, {{{0,8}},37}, {{{0,9}},171},
+ {{{0,8}},5}, {{{0,8}},133}, {{{0,8}},69}, {{{0,9}},235},
+ {{{80,7}},8}, {{{0,8}},93}, {{{0,8}},29}, {{{0,9}},155},
+ {{{84,7}},83}, {{{0,8}},125}, {{{0,8}},61}, {{{0,9}},219},
+ {{{82,7}},23}, {{{0,8}},109}, {{{0,8}},45}, {{{0,9}},187},
+ {{{0,8}},13}, {{{0,8}},141}, {{{0,8}},77}, {{{0,9}},251},
+ {{{80,7}},3}, {{{0,8}},83}, {{{0,8}},19}, {{{85,8}},195},
+ {{{83,7}},35}, {{{0,8}},115}, {{{0,8}},51}, {{{0,9}},199},
+ {{{81,7}},11}, {{{0,8}},99}, {{{0,8}},35}, {{{0,9}},167},
+ {{{0,8}},3}, {{{0,8}},131}, {{{0,8}},67}, {{{0,9}},231},
+ {{{80,7}},7}, {{{0,8}},91}, {{{0,8}},27}, {{{0,9}},151},
+ {{{84,7}},67}, {{{0,8}},123}, {{{0,8}},59}, {{{0,9}},215},
+ {{{82,7}},19}, {{{0,8}},107}, {{{0,8}},43}, {{{0,9}},183},
+ {{{0,8}},11}, {{{0,8}},139}, {{{0,8}},75}, {{{0,9}},247},
+ {{{80,7}},5}, {{{0,8}},87}, {{{0,8}},23}, {{{192,8}},0},
+ {{{83,7}},51}, {{{0,8}},119}, {{{0,8}},55}, {{{0,9}},207},
+ {{{81,7}},15}, {{{0,8}},103}, {{{0,8}},39}, {{{0,9}},175},
+ {{{0,8}},7}, {{{0,8}},135}, {{{0,8}},71}, {{{0,9}},239},
+ {{{80,7}},9}, {{{0,8}},95}, {{{0,8}},31}, {{{0,9}},159},
+ {{{84,7}},99}, {{{0,8}},127}, {{{0,8}},63}, {{{0,9}},223},
+ {{{82,7}},27}, {{{0,8}},111}, {{{0,8}},47}, {{{0,9}},191},
+ {{{0,8}},15}, {{{0,8}},143}, {{{0,8}},79}, {{{0,9}},255}
+ };
+local inflate_huft fixed_td[] = {
+ {{{80,5}},1}, {{{87,5}},257}, {{{83,5}},17}, {{{91,5}},4097},
+ {{{81,5}},5}, {{{89,5}},1025}, {{{85,5}},65}, {{{93,5}},16385},
+ {{{80,5}},3}, {{{88,5}},513}, {{{84,5}},33}, {{{92,5}},8193},
+ {{{82,5}},9}, {{{90,5}},2049}, {{{86,5}},129}, {{{192,5}},24577},
+ {{{80,5}},2}, {{{87,5}},385}, {{{83,5}},25}, {{{91,5}},6145},
+ {{{81,5}},7}, {{{89,5}},1537}, {{{85,5}},97}, {{{93,5}},24577},
+ {{{80,5}},4}, {{{88,5}},769}, {{{84,5}},49}, {{{92,5}},12289},
+ {{{82,5}},13}, {{{90,5}},3073}, {{{86,5}},193}, {{{192,5}},24577}
+ };
diff --git a/zlib/inflate.c b/zlib/inflate.c
new file mode 100644
index 00000000000..32e9b8de679
--- /dev/null
+++ b/zlib/inflate.c
@@ -0,0 +1,366 @@
+/* inflate.c -- zlib interface to inflate modules
+ * Copyright (C) 1995-1998 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+#include "zutil.h"
+#include "infblock.h"
+
+struct inflate_blocks_state {int dummy;}; /* for buggy compilers */
+
+typedef enum {
+ METHOD, /* waiting for method byte */
+ FLAG, /* waiting for flag byte */
+ DICT4, /* four dictionary check bytes to go */
+ DICT3, /* three dictionary check bytes to go */
+ DICT2, /* two dictionary check bytes to go */
+ DICT1, /* one dictionary check byte to go */
+ DICT0, /* waiting for inflateSetDictionary */
+ BLOCKS, /* decompressing blocks */
+ CHECK4, /* four check bytes to go */
+ CHECK3, /* three check bytes to go */
+ CHECK2, /* two check bytes to go */
+ CHECK1, /* one check byte to go */
+ DONE, /* finished check, done */
+ BAD} /* got an error--stay here */
+inflate_mode;
+
+/* inflate private state */
+struct internal_state {
+
+ /* mode */
+ inflate_mode mode; /* current inflate mode */
+
+ /* mode dependent information */
+ union {
+ uInt method; /* if FLAGS, method byte */
+ struct {
+ uLong was; /* computed check value */
+ uLong need; /* stream check value */
+ } check; /* if CHECK, check values to compare */
+ uInt marker; /* if BAD, inflateSync's marker bytes count */
+ } sub; /* submode */
+
+ /* mode independent information */
+ int nowrap; /* flag for no wrapper */
+ uInt wbits; /* log2(window size) (8..15, defaults to 15) */
+ inflate_blocks_statef
+ *blocks; /* current inflate_blocks state */
+
+};
+
+
+int ZEXPORT inflateReset(z)
+z_streamp z;
+{
+ if (z == Z_NULL || z->state == Z_NULL)
+ return Z_STREAM_ERROR;
+ z->total_in = z->total_out = 0;
+ z->msg = Z_NULL;
+ z->state->mode = z->state->nowrap ? BLOCKS : METHOD;
+ inflate_blocks_reset(z->state->blocks, z, Z_NULL);
+ Tracev((stderr, "inflate: reset\n"));
+ return Z_OK;
+}
+
+
+int ZEXPORT inflateEnd(z)
+z_streamp z;
+{
+ if (z == Z_NULL || z->state == Z_NULL || z->zfree == Z_NULL)
+ return Z_STREAM_ERROR;
+ if (z->state->blocks != Z_NULL)
+ inflate_blocks_free(z->state->blocks, z);
+ ZFREE(z, z->state);
+ z->state = Z_NULL;
+ Tracev((stderr, "inflate: end\n"));
+ return Z_OK;
+}
+
+
+int ZEXPORT inflateInit2_(z, w, version, stream_size)
+z_streamp z;
+int w;
+const char *version;
+int stream_size;
+{
+ if (version == Z_NULL || version[0] != ZLIB_VERSION[0] ||
+ stream_size != sizeof(z_stream))
+ return Z_VERSION_ERROR;
+
+ /* initialize state */
+ if (z == Z_NULL)
+ return Z_STREAM_ERROR;
+ z->msg = Z_NULL;
+ if (z->zalloc == Z_NULL)
+ {
+ z->zalloc = zcalloc;
+ z->opaque = (voidpf)0;
+ }
+ if (z->zfree == Z_NULL) z->zfree = zcfree;
+ if ((z->state = (struct internal_state FAR *)
+ ZALLOC(z,1,sizeof(struct internal_state))) == Z_NULL)
+ return Z_MEM_ERROR;
+ z->state->blocks = Z_NULL;
+
+ /* handle undocumented nowrap option (no zlib header or check) */
+ z->state->nowrap = 0;
+ if (w < 0)
+ {
+ w = - w;
+ z->state->nowrap = 1;
+ }
+
+ /* set window size */
+ if (w < 8 || w > 15)
+ {
+ inflateEnd(z);
+ return Z_STREAM_ERROR;
+ }
+ z->state->wbits = (uInt)w;
+
+ /* create inflate_blocks state */
+ if ((z->state->blocks =
+ inflate_blocks_new(z, z->state->nowrap ? Z_NULL : adler32, (uInt)1 << w))
+ == Z_NULL)
+ {
+ inflateEnd(z);
+ return Z_MEM_ERROR;
+ }
+ Tracev((stderr, "inflate: allocated\n"));
+
+ /* reset state */
+ inflateReset(z);
+ return Z_OK;
+}
+
+
+int ZEXPORT inflateInit_(z, version, stream_size)
+z_streamp z;
+const char *version;
+int stream_size;
+{
+ return inflateInit2_(z, DEF_WBITS, version, stream_size);
+}
+
+
+#define NEEDBYTE {if(z->avail_in==0)return r;r=f;}
+#define NEXTBYTE (z->avail_in--,z->total_in++,*z->next_in++)
+
+int ZEXPORT inflate(z, f)
+z_streamp z;
+int f;
+{
+ int r;
+ uInt b;
+
+ if (z == Z_NULL || z->state == Z_NULL || z->next_in == Z_NULL)
+ return Z_STREAM_ERROR;
+ f = f == Z_FINISH ? Z_BUF_ERROR : Z_OK;
+ r = Z_BUF_ERROR;
+ while (1) switch (z->state->mode)
+ {
+ case METHOD:
+ NEEDBYTE
+ if (((z->state->sub.method = NEXTBYTE) & 0xf) != Z_DEFLATED)
+ {
+ z->state->mode = BAD;
+ z->msg = (char*)"unknown compression method";
+ z->state->sub.marker = 5; /* can't try inflateSync */
+ break;
+ }
+ if ((z->state->sub.method >> 4) + 8 > z->state->wbits)
+ {
+ z->state->mode = BAD;
+ z->msg = (char*)"invalid window size";
+ z->state->sub.marker = 5; /* can't try inflateSync */
+ break;
+ }
+ z->state->mode = FLAG;
+ case FLAG:
+ NEEDBYTE
+ b = NEXTBYTE;
+ if (((z->state->sub.method << 8) + b) % 31)
+ {
+ z->state->mode = BAD;
+ z->msg = (char*)"incorrect header check";
+ z->state->sub.marker = 5; /* can't try inflateSync */
+ break;
+ }
+ Tracev((stderr, "inflate: zlib header ok\n"));
+ if (!(b & PRESET_DICT))
+ {
+ z->state->mode = BLOCKS;
+ break;
+ }
+ z->state->mode = DICT4;
+ case DICT4:
+ NEEDBYTE
+ z->state->sub.check.need = (uLong)NEXTBYTE << 24;
+ z->state->mode = DICT3;
+ case DICT3:
+ NEEDBYTE
+ z->state->sub.check.need += (uLong)NEXTBYTE << 16;
+ z->state->mode = DICT2;
+ case DICT2:
+ NEEDBYTE
+ z->state->sub.check.need += (uLong)NEXTBYTE << 8;
+ z->state->mode = DICT1;
+ case DICT1:
+ NEEDBYTE
+ z->state->sub.check.need += (uLong)NEXTBYTE;
+ z->adler = z->state->sub.check.need;
+ z->state->mode = DICT0;
+ return Z_NEED_DICT;
+ case DICT0:
+ z->state->mode = BAD;
+ z->msg = (char*)"need dictionary";
+ z->state->sub.marker = 0; /* can try inflateSync */
+ return Z_STREAM_ERROR;
+ case BLOCKS:
+ r = inflate_blocks(z->state->blocks, z, r);
+ if (r == Z_DATA_ERROR)
+ {
+ z->state->mode = BAD;
+ z->state->sub.marker = 0; /* can try inflateSync */
+ break;
+ }
+ if (r == Z_OK)
+ r = f;
+ if (r != Z_STREAM_END)
+ return r;
+ r = f;
+ inflate_blocks_reset(z->state->blocks, z, &z->state->sub.check.was);
+ if (z->state->nowrap)
+ {
+ z->state->mode = DONE;
+ break;
+ }
+ z->state->mode = CHECK4;
+ case CHECK4:
+ NEEDBYTE
+ z->state->sub.check.need = (uLong)NEXTBYTE << 24;
+ z->state->mode = CHECK3;
+ case CHECK3:
+ NEEDBYTE
+ z->state->sub.check.need += (uLong)NEXTBYTE << 16;
+ z->state->mode = CHECK2;
+ case CHECK2:
+ NEEDBYTE
+ z->state->sub.check.need += (uLong)NEXTBYTE << 8;
+ z->state->mode = CHECK1;
+ case CHECK1:
+ NEEDBYTE
+ z->state->sub.check.need += (uLong)NEXTBYTE;
+
+ if (z->state->sub.check.was != z->state->sub.check.need)
+ {
+ z->state->mode = BAD;
+ z->msg = (char*)"incorrect data check";
+ z->state->sub.marker = 5; /* can't try inflateSync */
+ break;
+ }
+ Tracev((stderr, "inflate: zlib check ok\n"));
+ z->state->mode = DONE;
+ case DONE:
+ return Z_STREAM_END;
+ case BAD:
+ return Z_DATA_ERROR;
+ default:
+ return Z_STREAM_ERROR;
+ }
+#ifdef NEED_DUMMY_RETURN
+ return Z_STREAM_ERROR; /* Some dumb compilers complain without this */
+#endif
+}
+
+
+int ZEXPORT inflateSetDictionary(z, dictionary, dictLength)
+z_streamp z;
+const Bytef *dictionary;
+uInt dictLength;
+{
+ uInt length = dictLength;
+
+ if (z == Z_NULL || z->state == Z_NULL || z->state->mode != DICT0)
+ return Z_STREAM_ERROR;
+
+ if (adler32(1L, dictionary, dictLength) != z->adler) return Z_DATA_ERROR;
+ z->adler = 1L;
+
+ if (length >= ((uInt)1<<z->state->wbits))
+ {
+ length = (1<<z->state->wbits)-1;
+ dictionary += dictLength - length;
+ }
+ inflate_set_dictionary(z->state->blocks, dictionary, length);
+ z->state->mode = BLOCKS;
+ return Z_OK;
+}
+
+
+int ZEXPORT inflateSync(z)
+z_streamp z;
+{
+ uInt n; /* number of bytes to look at */
+ Bytef *p; /* pointer to bytes */
+ uInt m; /* number of marker bytes found in a row */
+ uLong r, w; /* temporaries to save total_in and total_out */
+
+ /* set up */
+ if (z == Z_NULL || z->state == Z_NULL)
+ return Z_STREAM_ERROR;
+ if (z->state->mode != BAD)
+ {
+ z->state->mode = BAD;
+ z->state->sub.marker = 0;
+ }
+ if ((n = z->avail_in) == 0)
+ return Z_BUF_ERROR;
+ p = z->next_in;
+ m = z->state->sub.marker;
+
+ /* search */
+ while (n && m < 4)
+ {
+ static const Byte mark[4] = {0, 0, 0xff, 0xff};
+ if (*p == mark[m])
+ m++;
+ else if (*p)
+ m = 0;
+ else
+ m = 4 - m;
+ p++, n--;
+ }
+
+ /* restore */
+ z->total_in += p - z->next_in;
+ z->next_in = p;
+ z->avail_in = n;
+ z->state->sub.marker = m;
+
+ /* return no joy or set up to restart on a new block */
+ if (m != 4)
+ return Z_DATA_ERROR;
+ r = z->total_in; w = z->total_out;
+ inflateReset(z);
+ z->total_in = r; z->total_out = w;
+ z->state->mode = BLOCKS;
+ return Z_OK;
+}
+
+
+/* Returns true if inflate is currently at the end of a block generated
+ * by Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP
+ * implementation to provide an additional safety check. PPP uses Z_SYNC_FLUSH
+ * but removes the length bytes of the resulting empty stored block. When
+ * decompressing, PPP checks that at the end of input packet, inflate is
+ * waiting for these length bytes.
+ */
+int ZEXPORT inflateSyncPoint(z)
+z_streamp z;
+{
+ if (z == Z_NULL || z->state == Z_NULL || z->state->blocks == Z_NULL)
+ return Z_STREAM_ERROR;
+ return inflate_blocks_sync_point(z->state->blocks);
+}
diff --git a/zlib/inftrees.c b/zlib/inftrees.c
new file mode 100644
index 00000000000..ef1e0b6b873
--- /dev/null
+++ b/zlib/inftrees.c
@@ -0,0 +1,455 @@
+/* inftrees.c -- generate Huffman trees for efficient decoding
+ * Copyright (C) 1995-1998 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+#include "zutil.h"
+#include "inftrees.h"
+
+#if !defined(BUILDFIXED) && !defined(STDC)
+# define BUILDFIXED /* non ANSI compilers may not accept inffixed.h */
+#endif
+
+const char inflate_copyright[] =
+ " inflate 1.1.3 Copyright 1995-1998 Mark Adler ";
+/*
+ If you use the zlib library in a product, an acknowledgment is welcome
+ in the documentation of your product. If for some reason you cannot
+ include such an acknowledgment, I would appreciate that you keep this
+ copyright string in the executable of your product.
+ */
+struct internal_state {int dummy;}; /* for buggy compilers */
+
+/* simplify the use of the inflate_huft type with some defines */
+#define exop word.what.Exop
+#define bits word.what.Bits
+
+
+local int huft_build OF((
+ uIntf *, /* code lengths in bits */
+ uInt, /* number of codes */
+ uInt, /* number of "simple" codes */
+ const uIntf *, /* list of base values for non-simple codes */
+ const uIntf *, /* list of extra bits for non-simple codes */
+ inflate_huft * FAR*,/* result: starting table */
+ uIntf *, /* maximum lookup bits (returns actual) */
+ inflate_huft *, /* space for trees */
+ uInt *, /* hufts used in space */
+ uIntf * )); /* space for values */
+
+/* Tables for deflate from PKZIP's appnote.txt. */
+local const uInt cplens[31] = { /* Copy lengths for literal codes 257..285 */
+ 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
+ 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0};
+ /* see note #13 above about 258 */
+local const uInt cplext[31] = { /* Extra bits for literal codes 257..285 */
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2,
+ 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 112, 112}; /* 112==invalid */
+local const uInt cpdist[30] = { /* Copy offsets for distance codes 0..29 */
+ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
+ 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
+ 8193, 12289, 16385, 24577};
+local const uInt cpdext[30] = { /* Extra bits for distance codes */
+ 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6,
+ 7, 7, 8, 8, 9, 9, 10, 10, 11, 11,
+ 12, 12, 13, 13};
+
+/*
+ Huffman code decoding is performed using a multi-level table lookup.
+ The fastest way to decode is to simply build a lookup table whose
+ size is determined by the longest code. However, the time it takes
+ to build this table can also be a factor if the data being decoded
+ is not very long. The most common codes are necessarily the
+ shortest codes, so those codes dominate the decoding time, and hence
+ the speed. The idea is you can have a shorter table that decodes the
+ shorter, more probable codes, and then point to subsidiary tables for
+ the longer codes. The time it costs to decode the longer codes is
+ then traded against the time it takes to make longer tables.
+
+ This results of this trade are in the variables lbits and dbits
+ below. lbits is the number of bits the first level table for literal/
+ length codes can decode in one step, and dbits is the same thing for
+ the distance codes. Subsequent tables are also less than or equal to
+ those sizes. These values may be adjusted either when all of the
+ codes are shorter than that, in which case the longest code length in
+ bits is used, or when the shortest code is *longer* than the requested
+ table size, in which case the length of the shortest code in bits is
+ used.
+
+ There are two different values for the two tables, since they code a
+ different number of possibilities each. The literal/length table
+ codes 286 possible values, or in a flat code, a little over eight
+ bits. The distance table codes 30 possible values, or a little less
+ than five bits, flat. The optimum values for speed end up being
+ about one bit more than those, so lbits is 8+1 and dbits is 5+1.
+ The optimum values may differ though from machine to machine, and
+ possibly even between compilers. Your mileage may vary.
+ */
+
+
+/* If BMAX needs to be larger than 16, then h and x[] should be uLong. */
+#define BMAX 15 /* maximum bit length of any code */
+
+local int huft_build(b, n, s, d, e, t, m, hp, hn, v)
+uIntf *b; /* code lengths in bits (all assumed <= BMAX) */
+uInt n; /* number of codes (assumed <= 288) */
+uInt s; /* number of simple-valued codes (0..s-1) */
+const uIntf *d; /* list of base values for non-simple codes */
+const uIntf *e; /* list of extra bits for non-simple codes */
+inflate_huft * FAR *t; /* result: starting table */
+uIntf *m; /* maximum lookup bits, returns actual */
+inflate_huft *hp; /* space for trees */
+uInt *hn; /* hufts used in space */
+uIntf *v; /* working area: values in order of bit length */
+/* Given a list of code lengths and a maximum table size, make a set of
+ tables to decode that set of codes. Return Z_OK on success, Z_BUF_ERROR
+ if the given code set is incomplete (the tables are still built in this
+ case), Z_DATA_ERROR if the input is invalid (an over-subscribed set of
+ lengths), or Z_MEM_ERROR if not enough memory. */
+{
+
+ uInt a; /* counter for codes of length k */
+ uInt c[BMAX+1]; /* bit length count table */
+ uInt f; /* i repeats in table every f entries */
+ int g; /* maximum code length */
+ int h; /* table level */
+ register uInt i; /* counter, current code */
+ register uInt j; /* counter */
+ register int k; /* number of bits in current code */
+ int l; /* bits per table (returned in m) */
+ uInt mask; /* (1 << w) - 1, to avoid cc -O bug on HP */
+ register uIntf *p; /* pointer into c[], b[], or v[] */
+ inflate_huft *q; /* points to current table */
+ struct inflate_huft_s r; /* table entry for structure assignment */
+ inflate_huft *u[BMAX]; /* table stack */
+ register int w; /* bits before this table == (l * h) */
+ uInt x[BMAX+1]; /* bit offsets, then code stack */
+ uIntf *xp; /* pointer into x */
+ int y; /* number of dummy codes added */
+ uInt z; /* number of entries in current table */
+
+
+ /* Generate counts for each bit length */
+ p = c;
+#define C0 *p++ = 0;
+#define C2 C0 C0 C0 C0
+#define C4 C2 C2 C2 C2
+ C4 /* clear c[]--assume BMAX+1 is 16 */
+ p = b; i = n;
+ do {
+ c[*p++]++; /* assume all entries <= BMAX */
+ } while (--i);
+ if (c[0] == n) /* null input--all zero length codes */
+ {
+ *t = (inflate_huft *)Z_NULL;
+ *m = 0;
+ return Z_OK;
+ }
+
+
+ /* Find minimum and maximum length, bound *m by those */
+ l = *m;
+ for (j = 1; j <= BMAX; j++)
+ if (c[j])
+ break;
+ k = j; /* minimum code length */
+ if ((uInt)l < j)
+ l = j;
+ for (i = BMAX; i; i--)
+ if (c[i])
+ break;
+ g = i; /* maximum code length */
+ if ((uInt)l > i)
+ l = i;
+ *m = l;
+
+
+ /* Adjust last length count to fill out codes, if needed */
+ for (y = 1 << j; j < i; j++, y <<= 1)
+ if ((y -= c[j]) < 0)
+ return Z_DATA_ERROR;
+ if ((y -= c[i]) < 0)
+ return Z_DATA_ERROR;
+ c[i] += y;
+
+
+ /* Generate starting offsets into the value table for each length */
+ x[1] = j = 0;
+ p = c + 1; xp = x + 2;
+ while (--i) { /* note that i == g from above */
+ *xp++ = (j += *p++);
+ }
+
+
+ /* Make a table of values in order of bit lengths */
+ p = b; i = 0;
+ do {
+ if ((j = *p++) != 0)
+ v[x[j]++] = i;
+ } while (++i < n);
+ n = x[g]; /* set n to length of v */
+
+
+ /* Generate the Huffman codes and for each, make the table entries */
+ x[0] = i = 0; /* first Huffman code is zero */
+ p = v; /* grab values in bit order */
+ h = -1; /* no tables yet--level -1 */
+ w = -l; /* bits decoded == (l * h) */
+ u[0] = (inflate_huft *)Z_NULL; /* just to keep compilers happy */
+ q = (inflate_huft *)Z_NULL; /* ditto */
+ z = 0; /* ditto */
+
+ /* go through the bit lengths (k already is bits in shortest code) */
+ for (; k <= g; k++)
+ {
+ a = c[k];
+ while (a--)
+ {
+ /* here i is the Huffman code of length k bits for value *p */
+ /* make tables up to required level */
+ while (k > w + l)
+ {
+ h++;
+ w += l; /* previous table always l bits */
+
+ /* compute minimum size table less than or equal to l bits */
+ z = g - w;
+ z = z > (uInt)l ? l : z; /* table size upper limit */
+ if ((f = 1 << (j = k - w)) > a + 1) /* try a k-w bit table */
+ { /* too few codes for k-w bit table */
+ f -= a + 1; /* deduct codes from patterns left */
+ xp = c + k;
+ if (j < z)
+ while (++j < z) /* try smaller tables up to z bits */
+ {
+ if ((f <<= 1) <= *++xp)
+ break; /* enough codes to use up j bits */
+ f -= *xp; /* else deduct codes from patterns */
+ }
+ }
+ z = 1 << j; /* table entries for j-bit table */
+
+ /* allocate new table */
+ if (*hn + z > MANY) /* (note: doesn't matter for fixed) */
+ return Z_MEM_ERROR; /* not enough memory */
+ u[h] = q = hp + *hn;
+ *hn += z;
+
+ /* connect to last table, if there is one */
+ if (h)
+ {
+ x[h] = i; /* save pattern for backing up */
+ r.bits = (Byte)l; /* bits to dump before this table */
+ r.exop = (Byte)j; /* bits in this table */
+ j = i >> (w - l);
+ r.base = (uInt)(q - u[h-1] - j); /* offset to this table */
+ u[h-1][j] = r; /* connect to last table */
+ }
+ else
+ *t = q; /* first table is returned result */
+ }
+
+ /* set up table entry in r */
+ r.bits = (Byte)(k - w);
+ if (p >= v + n)
+ r.exop = 128 + 64; /* out of values--invalid code */
+ else if (*p < s)
+ {
+ r.exop = (Byte)(*p < 256 ? 0 : 32 + 64); /* 256 is end-of-block */
+ r.base = *p++; /* simple code is just the value */
+ }
+ else
+ {
+ r.exop = (Byte)(e[*p - s] + 16 + 64);/* non-simple--look up in lists */
+ r.base = d[*p++ - s];
+ }
+
+ /* fill code-like entries with r */
+ f = 1 << (k - w);
+ for (j = i >> w; j < z; j += f)
+ q[j] = r;
+
+ /* backwards increment the k-bit code i */
+ for (j = 1 << (k - 1); i & j; j >>= 1)
+ i ^= j;
+ i ^= j;
+
+ /* backup over finished tables */
+ mask = (1 << w) - 1; /* needed on HP, cc -O bug */
+ while ((i & mask) != x[h])
+ {
+ h--; /* don't need to update q */
+ w -= l;
+ mask = (1 << w) - 1;
+ }
+ }
+ }
+
+
+ /* Return Z_BUF_ERROR if we were given an incomplete table */
+ return y != 0 && g != 1 ? Z_BUF_ERROR : Z_OK;
+}
+
+
+int inflate_trees_bits(c, bb, tb, hp, z)
+uIntf *c; /* 19 code lengths */
+uIntf *bb; /* bits tree desired/actual depth */
+inflate_huft * FAR *tb; /* bits tree result */
+inflate_huft *hp; /* space for trees */
+z_streamp z; /* for messages */
+{
+ int r;
+ uInt hn = 0; /* hufts used in space */
+ uIntf *v; /* work area for huft_build */
+
+ if ((v = (uIntf*)ZALLOC(z, 19, sizeof(uInt))) == Z_NULL)
+ return Z_MEM_ERROR;
+ r = huft_build(c, 19, 19, (uIntf*)Z_NULL, (uIntf*)Z_NULL,
+ tb, bb, hp, &hn, v);
+ if (r == Z_DATA_ERROR)
+ z->msg = (char*)"oversubscribed dynamic bit lengths tree";
+ else if (r == Z_BUF_ERROR || *bb == 0)
+ {
+ z->msg = (char*)"incomplete dynamic bit lengths tree";
+ r = Z_DATA_ERROR;
+ }
+ ZFREE(z, v);
+ return r;
+}
+
+
+int inflate_trees_dynamic(nl, nd, c, bl, bd, tl, td, hp, z)
+uInt nl; /* number of literal/length codes */
+uInt nd; /* number of distance codes */
+uIntf *c; /* that many (total) code lengths */
+uIntf *bl; /* literal desired/actual bit depth */
+uIntf *bd; /* distance desired/actual bit depth */
+inflate_huft * FAR *tl; /* literal/length tree result */
+inflate_huft * FAR *td; /* distance tree result */
+inflate_huft *hp; /* space for trees */
+z_streamp z; /* for messages */
+{
+ int r;
+ uInt hn = 0; /* hufts used in space */
+ uIntf *v; /* work area for huft_build */
+
+ /* allocate work area */
+ if ((v = (uIntf*)ZALLOC(z, 288, sizeof(uInt))) == Z_NULL)
+ return Z_MEM_ERROR;
+
+ /* build literal/length tree */
+ r = huft_build(c, nl, 257, cplens, cplext, tl, bl, hp, &hn, v);
+ if (r != Z_OK || *bl == 0)
+ {
+ if (r == Z_DATA_ERROR)
+ z->msg = (char*)"oversubscribed literal/length tree";
+ else if (r != Z_MEM_ERROR)
+ {
+ z->msg = (char*)"incomplete literal/length tree";
+ r = Z_DATA_ERROR;
+ }
+ ZFREE(z, v);
+ return r;
+ }
+
+ /* build distance tree */
+ r = huft_build(c + nl, nd, 0, cpdist, cpdext, td, bd, hp, &hn, v);
+ if (r != Z_OK || (*bd == 0 && nl > 257))
+ {
+ if (r == Z_DATA_ERROR)
+ z->msg = (char*)"oversubscribed distance tree";
+ else if (r == Z_BUF_ERROR) {
+#ifdef PKZIP_BUG_WORKAROUND
+ r = Z_OK;
+ }
+#else
+ z->msg = (char*)"incomplete distance tree";
+ r = Z_DATA_ERROR;
+ }
+ else if (r != Z_MEM_ERROR)
+ {
+ z->msg = (char*)"empty distance tree with lengths";
+ r = Z_DATA_ERROR;
+ }
+ ZFREE(z, v);
+ return r;
+#endif
+ }
+
+ /* done */
+ ZFREE(z, v);
+ return Z_OK;
+}
+
+
+/* build fixed tables only once--keep them here */
+#ifdef BUILDFIXED
+local int fixed_built = 0;
+#define FIXEDH 544 /* number of hufts used by fixed tables */
+local inflate_huft fixed_mem[FIXEDH];
+local uInt fixed_bl;
+local uInt fixed_bd;
+local inflate_huft *fixed_tl;
+local inflate_huft *fixed_td;
+#else
+#include "inffixed.h"
+#endif
+
+
+int inflate_trees_fixed(bl, bd, tl, td, z)
+uIntf *bl; /* literal desired/actual bit depth */
+uIntf *bd; /* distance desired/actual bit depth */
+inflate_huft * FAR *tl; /* literal/length tree result */
+inflate_huft * FAR *td; /* distance tree result */
+z_streamp z; /* for memory allocation */
+{
+#ifdef BUILDFIXED
+ /* build fixed tables if not already */
+ if (!fixed_built)
+ {
+ int k; /* temporary variable */
+ uInt f = 0; /* number of hufts used in fixed_mem */
+ uIntf *c; /* length list for huft_build */
+ uIntf *v; /* work area for huft_build */
+
+ /* allocate memory */
+ if ((c = (uIntf*)ZALLOC(z, 288, sizeof(uInt))) == Z_NULL)
+ return Z_MEM_ERROR;
+ if ((v = (uIntf*)ZALLOC(z, 288, sizeof(uInt))) == Z_NULL)
+ {
+ ZFREE(z, c);
+ return Z_MEM_ERROR;
+ }
+
+ /* literal table */
+ for (k = 0; k < 144; k++)
+ c[k] = 8;
+ for (; k < 256; k++)
+ c[k] = 9;
+ for (; k < 280; k++)
+ c[k] = 7;
+ for (; k < 288; k++)
+ c[k] = 8;
+ fixed_bl = 9;
+ huft_build(c, 288, 257, cplens, cplext, &fixed_tl, &fixed_bl,
+ fixed_mem, &f, v);
+
+ /* distance table */
+ for (k = 0; k < 30; k++)
+ c[k] = 5;
+ fixed_bd = 5;
+ huft_build(c, 30, 0, cpdist, cpdext, &fixed_td, &fixed_bd,
+ fixed_mem, &f, v);
+
+ /* done */
+ ZFREE(z, v);
+ ZFREE(z, c);
+ fixed_built = 1;
+ }
+#endif
+ *bl = fixed_bl;
+ *bd = fixed_bd;
+ *tl = fixed_tl;
+ *td = fixed_td;
+ return Z_OK;
+}
diff --git a/zlib/inftrees.h b/zlib/inftrees.h
new file mode 100644
index 00000000000..85853e097b3
--- /dev/null
+++ b/zlib/inftrees.h
@@ -0,0 +1,58 @@
+/* inftrees.h -- header to use inftrees.c
+ * Copyright (C) 1995-1998 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* WARNING: this file should *not* be used by applications. It is
+ part of the implementation of the compression library and is
+ subject to change. Applications should only use zlib.h.
+ */
+
+/* Huffman code lookup table entry--this entry is four bytes for machines
+ that have 16-bit pointers (e.g. PC's in the small or medium model). */
+
+typedef struct inflate_huft_s FAR inflate_huft;
+
+struct inflate_huft_s {
+ union {
+ struct {
+ Byte Exop; /* number of extra bits or operation */
+ Byte Bits; /* number of bits in this code or subcode */
+ } what;
+ uInt pad; /* pad structure to a power of 2 (4 bytes for */
+ } word; /* 16-bit, 8 bytes for 32-bit int's) */
+ uInt base; /* literal, length base, distance base,
+ or table offset */
+};
+
+/* Maximum size of dynamic tree. The maximum found in a long but non-
+ exhaustive search was 1004 huft structures (850 for length/literals
+ and 154 for distances, the latter actually the result of an
+ exhaustive search). The actual maximum is not known, but the
+ value below is more than safe. */
+#define MANY 1440
+
+extern int inflate_trees_bits OF((
+ uIntf *, /* 19 code lengths */
+ uIntf *, /* bits tree desired/actual depth */
+ inflate_huft * FAR *, /* bits tree result */
+ inflate_huft *, /* space for trees */
+ z_streamp)); /* for messages */
+
+extern int inflate_trees_dynamic OF((
+ uInt, /* number of literal/length codes */
+ uInt, /* number of distance codes */
+ uIntf *, /* that many (total) code lengths */
+ uIntf *, /* literal desired/actual bit depth */
+ uIntf *, /* distance desired/actual bit depth */
+ inflate_huft * FAR *, /* literal/length tree result */
+ inflate_huft * FAR *, /* distance tree result */
+ inflate_huft *, /* space for trees */
+ z_streamp)); /* for messages */
+
+extern int inflate_trees_fixed OF((
+ uIntf *, /* literal desired/actual bit depth */
+ uIntf *, /* distance desired/actual bit depth */
+ inflate_huft * FAR *, /* literal/length tree result */
+ inflate_huft * FAR *, /* distance tree result */
+ z_streamp)); /* for memory allocation */
diff --git a/zlib/infutil.c b/zlib/infutil.c
new file mode 100644
index 00000000000..824dab57128
--- /dev/null
+++ b/zlib/infutil.c
@@ -0,0 +1,87 @@
+/* inflate_util.c -- data and routines common to blocks and codes
+ * Copyright (C) 1995-1998 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+#include "zutil.h"
+#include "infblock.h"
+#include "inftrees.h"
+#include "infcodes.h"
+#include "infutil.h"
+
+struct inflate_codes_state {int dummy;}; /* for buggy compilers */
+
+/* And'ing with mask[n] masks the lower n bits */
+uInt inflate_mask[17] = {
+ 0x0000,
+ 0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff,
+ 0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff
+};
+
+
+/* copy as much as possible from the sliding window to the output area */
+int inflate_flush(s, z, r)
+inflate_blocks_statef *s;
+z_streamp z;
+int r;
+{
+ uInt n;
+ Bytef *p;
+ Bytef *q;
+
+ /* local copies of source and destination pointers */
+ p = z->next_out;
+ q = s->read;
+
+ /* compute number of bytes to copy as far as end of window */
+ n = (uInt)((q <= s->write ? s->write : s->end) - q);
+ if (n > z->avail_out) n = z->avail_out;
+ if (n && r == Z_BUF_ERROR) r = Z_OK;
+
+ /* update counters */
+ z->avail_out -= n;
+ z->total_out += n;
+
+ /* update check information */
+ if (s->checkfn != Z_NULL)
+ z->adler = s->check = (*s->checkfn)(s->check, q, n);
+
+ /* copy as far as end of window */
+ zmemcpy(p, q, n);
+ p += n;
+ q += n;
+
+ /* see if more to copy at beginning of window */
+ if (q == s->end)
+ {
+ /* wrap pointers */
+ q = s->window;
+ if (s->write == s->end)
+ s->write = s->window;
+
+ /* compute bytes to copy */
+ n = (uInt)(s->write - q);
+ if (n > z->avail_out) n = z->avail_out;
+ if (n && r == Z_BUF_ERROR) r = Z_OK;
+
+ /* update counters */
+ z->avail_out -= n;
+ z->total_out += n;
+
+ /* update check information */
+ if (s->checkfn != Z_NULL)
+ z->adler = s->check = (*s->checkfn)(s->check, q, n);
+
+ /* copy */
+ zmemcpy(p, q, n);
+ p += n;
+ q += n;
+ }
+
+ /* update pointers */
+ z->next_out = p;
+ s->read = q;
+
+ /* done */
+ return r;
+}
diff --git a/zlib/infutil.h b/zlib/infutil.h
new file mode 100644
index 00000000000..99d1135d06a
--- /dev/null
+++ b/zlib/infutil.h
@@ -0,0 +1,98 @@
+/* infutil.h -- types and macros common to blocks and codes
+ * Copyright (C) 1995-1998 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* WARNING: this file should *not* be used by applications. It is
+ part of the implementation of the compression library and is
+ subject to change. Applications should only use zlib.h.
+ */
+
+#ifndef _INFUTIL_H
+#define _INFUTIL_H
+
+typedef enum {
+ TYPE, /* get type bits (3, including end bit) */
+ LENS, /* get lengths for stored */
+ STORED, /* processing stored block */
+ TABLE, /* get table lengths */
+ BTREE, /* get bit lengths tree for a dynamic block */
+ DTREE, /* get length, distance trees for a dynamic block */
+ CODES, /* processing fixed or dynamic block */
+ DRY, /* output remaining window bytes */
+ DONE, /* finished last block, done */
+ BAD} /* got a data error--stuck here */
+inflate_block_mode;
+
+/* inflate blocks semi-private state */
+struct inflate_blocks_state {
+
+ /* mode */
+ inflate_block_mode mode; /* current inflate_block mode */
+
+ /* mode dependent information */
+ union {
+ uInt left; /* if STORED, bytes left to copy */
+ struct {
+ uInt table; /* table lengths (14 bits) */
+ uInt index; /* index into blens (or border) */
+ uIntf *blens; /* bit lengths of codes */
+ uInt bb; /* bit length tree depth */
+ inflate_huft *tb; /* bit length decoding tree */
+ } trees; /* if DTREE, decoding info for trees */
+ struct {
+ inflate_codes_statef
+ *codes;
+ } decode; /* if CODES, current state */
+ } sub; /* submode */
+ uInt last; /* true if this block is the last block */
+
+ /* mode independent information */
+ uInt bitk; /* bits in bit buffer */
+ uLong bitb; /* bit buffer */
+ inflate_huft *hufts; /* single malloc for tree space */
+ Bytef *window; /* sliding window */
+ Bytef *end; /* one byte after sliding window */
+ Bytef *read; /* window read pointer */
+ Bytef *write; /* window write pointer */
+ check_func checkfn; /* check function */
+ uLong check; /* check on output */
+
+};
+
+
+/* defines for inflate input/output */
+/* update pointers and return */
+#define UPDBITS {s->bitb=b;s->bitk=k;}
+#define UPDIN {z->avail_in=n;z->total_in+=p-z->next_in;z->next_in=p;}
+#define UPDOUT {s->write=q;}
+#define UPDATE {UPDBITS UPDIN UPDOUT}
+#define LEAVE {UPDATE return inflate_flush(s,z,r);}
+/* get bytes and bits */
+#define LOADIN {p=z->next_in;n=z->avail_in;b=s->bitb;k=s->bitk;}
+#define NEEDBYTE {if(n)r=Z_OK;else LEAVE}
+#define NEXTBYTE (n--,*p++)
+#define NEEDBITS(j) {while(k<(j)){NEEDBYTE;b|=((uLong)NEXTBYTE)<<k;k+=8;}}
+#define DUMPBITS(j) {b>>=(j);k-=(j);}
+/* output bytes */
+#define WAVAIL (uInt)(q<s->read?s->read-q-1:s->end-q)
+#define LOADOUT {q=s->write;m=(uInt)WAVAIL;}
+#define WRAP {if(q==s->end&&s->read!=s->window){q=s->window;m=(uInt)WAVAIL;}}
+#define FLUSH {UPDOUT r=inflate_flush(s,z,r); LOADOUT}
+#define NEEDOUT {if(m==0){WRAP if(m==0){FLUSH WRAP if(m==0) LEAVE}}r=Z_OK;}
+#define OUTBYTE(a) {*q++=(Byte)(a);m--;}
+/* load local pointers */
+#define LOAD {LOADIN LOADOUT}
+
+/* masks for lower bits (size given to avoid silly warnings with Visual C++) */
+extern uInt inflate_mask[17];
+
+/* copy as much as possible from the sliding window to the output area */
+extern int inflate_flush OF((
+ inflate_blocks_statef *,
+ z_streamp ,
+ int));
+
+struct internal_state {int dummy;}; /* for buggy compilers */
+
+#endif
diff --git a/zlib/maketree.c b/zlib/maketree.c
new file mode 100644
index 00000000000..949d7864185
--- /dev/null
+++ b/zlib/maketree.c
@@ -0,0 +1,85 @@
+/* maketree.c -- make inffixed.h table for decoding fixed codes
+ * Copyright (C) 1998 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* WARNING: this file should *not* be used by applications. It is
+ part of the implementation of the compression library and is
+ subject to change. Applications should only use zlib.h.
+ */
+
+/* This program is included in the distribution for completeness.
+ You do not need to compile or run this program since inffixed.h
+ is already included in the distribution. To use this program
+ you need to compile zlib with BUILDFIXED defined and then compile
+ and link this program with the zlib library. Then the output of
+ this program can be piped to inffixed.h. */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "zutil.h"
+#include "inftrees.h"
+
+/* simplify the use of the inflate_huft type with some defines */
+#define exop word.what.Exop
+#define bits word.what.Bits
+
+/* generate initialization table for an inflate_huft structure array */
+void maketree(uInt b, inflate_huft *t)
+{
+ int i, e;
+
+ i = 0;
+ while (1)
+ {
+ e = t[i].exop;
+ if (e && (e & (16+64)) == 0) /* table pointer */
+ {
+ fprintf(stderr, "maketree: cannot initialize sub-tables!\n");
+ exit(1);
+ }
+ if (i % 4 == 0)
+ printf("\n ");
+ printf(" {{{%u,%u}},%u}", t[i].exop, t[i].bits, t[i].base);
+ if (++i == (1<<b))
+ break;
+ putchar(',');
+ }
+ puts("");
+}
+
+/* create the fixed tables in C initialization syntax */
+void main(void)
+{
+ int r;
+ uInt bl, bd;
+ inflate_huft *tl, *td;
+ z_stream z;
+
+ z.zalloc = zcalloc;
+ z.opaque = (voidpf)0;
+ z.zfree = zcfree;
+ r = inflate_trees_fixed(&bl, &bd, &tl, &td, &z);
+ if (r)
+ {
+ fprintf(stderr, "inflate_trees_fixed error %d\n", r);
+ return;
+ }
+ puts("/* inffixed.h -- table for decoding fixed codes");
+ puts(" * Generated automatically by the maketree.c program");
+ puts(" */");
+ puts("");
+ puts("/* WARNING: this file should *not* be used by applications. It is");
+ puts(" part of the implementation of the compression library and is");
+ puts(" subject to change. Applications should only use zlib.h.");
+ puts(" */");
+ puts("");
+ printf("local uInt fixed_bl = %d;\n", bl);
+ printf("local uInt fixed_bd = %d;\n", bd);
+ printf("local inflate_huft fixed_tl[] = {");
+ maketree(bl, tl);
+ puts(" };");
+ printf("local inflate_huft fixed_td[] = {");
+ maketree(bd, td);
+ puts(" };");
+}
diff --git a/zlib/minigzip.c b/zlib/minigzip.c
new file mode 100644
index 00000000000..7215eaeb0fc
--- /dev/null
+++ b/zlib/minigzip.c
@@ -0,0 +1,320 @@
+/* minigzip.c -- simulate gzip using the zlib compression library
+ * Copyright (C) 1995-1998 Jean-loup Gailly.
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/*
+ * minigzip is a minimal implementation of the gzip utility. This is
+ * only an example of using zlib and isn't meant to replace the
+ * full-featured gzip. No attempt is made to deal with file systems
+ * limiting names to 14 or 8+3 characters, etc... Error checking is
+ * very limited. So use minigzip only for testing; use gzip for the
+ * real thing. On MSDOS, use only on file names without extension
+ * or in pipe mode.
+ */
+
+/* @(#) $Id$ */
+
+#include <stdio.h>
+#include "zlib.h"
+
+#ifdef STDC
+# include <string.h>
+# include <stdlib.h>
+#else
+ extern void exit OF((int));
+#endif
+
+#ifdef USE_MMAP
+# include <sys/types.h>
+# include <sys/mman.h>
+# include <sys/stat.h>
+#endif
+
+#if defined(MSDOS) || defined(OS2) || defined(WIN32)
+# include <fcntl.h>
+# include <io.h>
+# define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY)
+#else
+# define SET_BINARY_MODE(file)
+#endif
+
+#ifdef VMS
+# define unlink delete
+# define GZ_SUFFIX "-gz"
+#endif
+#ifdef RISCOS
+# define unlink remove
+# define GZ_SUFFIX "-gz"
+# define fileno(file) file->__file
+#endif
+#if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os
+# include <unix.h> /* for fileno */
+#endif
+
+#ifndef WIN32 /* unlink already in stdio.h for WIN32 */
+ extern int unlink OF((const char *));
+#endif
+
+#ifndef GZ_SUFFIX
+# define GZ_SUFFIX ".gz"
+#endif
+#define SUFFIX_LEN (sizeof(GZ_SUFFIX)-1)
+
+#define BUFLEN 16384
+#define MAX_NAME_LEN 1024
+
+#ifdef MAXSEG_64K
+# define local static
+ /* Needed for systems with limitation on stack size. */
+#else
+# define local
+#endif
+
+char *prog;
+
+void error OF((const char *msg));
+void gz_compress OF((FILE *in, gzFile out));
+#ifdef USE_MMAP
+int gz_compress_mmap OF((FILE *in, gzFile out));
+#endif
+void gz_uncompress OF((gzFile in, FILE *out));
+void file_compress OF((char *file, char *mode));
+void file_uncompress OF((char *file));
+int main OF((int argc, char *argv[]));
+
+/* ===========================================================================
+ * Display error message and exit
+ */
+void error(msg)
+ const char *msg;
+{
+ fprintf(stderr, "%s: %s\n", prog, msg);
+ exit(1);
+}
+
+/* ===========================================================================
+ * Compress input to output then close both files.
+ */
+
+void gz_compress(in, out)
+ FILE *in;
+ gzFile out;
+{
+ local char buf[BUFLEN];
+ int len;
+ int err;
+
+#ifdef USE_MMAP
+ /* Try first compressing with mmap. If mmap fails (minigzip used in a
+ * pipe), use the normal fread loop.
+ */
+ if (gz_compress_mmap(in, out) == Z_OK) return;
+#endif
+ for (;;) {
+ len = fread(buf, 1, sizeof(buf), in);
+ if (ferror(in)) {
+ perror("fread");
+ exit(1);
+ }
+ if (len == 0) break;
+
+ if (gzwrite(out, buf, (unsigned)len) != len) error(gzerror(out, &err));
+ }
+ fclose(in);
+ if (gzclose(out) != Z_OK) error("failed gzclose");
+}
+
+#ifdef USE_MMAP /* MMAP version, Miguel Albrecht <malbrech@eso.org> */
+
+/* Try compressing the input file at once using mmap. Return Z_OK if
+ * if success, Z_ERRNO otherwise.
+ */
+int gz_compress_mmap(in, out)
+ FILE *in;
+ gzFile out;
+{
+ int len;
+ int err;
+ int ifd = fileno(in);
+ caddr_t buf; /* mmap'ed buffer for the entire input file */
+ off_t buf_len; /* length of the input file */
+ struct stat sb;
+
+ /* Determine the size of the file, needed for mmap: */
+ if (fstat(ifd, &sb) < 0) return Z_ERRNO;
+ buf_len = sb.st_size;
+ if (buf_len <= 0) return Z_ERRNO;
+
+ /* Now do the actual mmap: */
+ buf = mmap((caddr_t) 0, buf_len, PROT_READ, MAP_SHARED, ifd, (off_t)0);
+ if (buf == (caddr_t)(-1)) return Z_ERRNO;
+
+ /* Compress the whole file at once: */
+ len = gzwrite(out, (char *)buf, (unsigned)buf_len);
+
+ if (len != (int)buf_len) error(gzerror(out, &err));
+
+ munmap(buf, buf_len);
+ fclose(in);
+ if (gzclose(out) != Z_OK) error("failed gzclose");
+ return Z_OK;
+}
+#endif /* USE_MMAP */
+
+/* ===========================================================================
+ * Uncompress input to output then close both files.
+ */
+void gz_uncompress(in, out)
+ gzFile in;
+ FILE *out;
+{
+ local char buf[BUFLEN];
+ int len;
+ int err;
+
+ for (;;) {
+ len = gzread(in, buf, sizeof(buf));
+ if (len < 0) error (gzerror(in, &err));
+ if (len == 0) break;
+
+ if ((int)fwrite(buf, 1, (unsigned)len, out) != len) {
+ error("failed fwrite");
+ }
+ }
+ if (fclose(out)) error("failed fclose");
+
+ if (gzclose(in) != Z_OK) error("failed gzclose");
+}
+
+
+/* ===========================================================================
+ * Compress the given file: create a corresponding .gz file and remove the
+ * original.
+ */
+void file_compress(file, mode)
+ char *file;
+ char *mode;
+{
+ local char outfile[MAX_NAME_LEN];
+ FILE *in;
+ gzFile out;
+
+ strcpy(outfile, file);
+ strcat(outfile, GZ_SUFFIX);
+
+ in = fopen(file, "rb");
+ if (in == NULL) {
+ perror(file);
+ exit(1);
+ }
+ out = gzopen(outfile, mode);
+ if (out == NULL) {
+ fprintf(stderr, "%s: can't gzopen %s\n", prog, outfile);
+ exit(1);
+ }
+ gz_compress(in, out);
+
+ unlink(file);
+}
+
+
+/* ===========================================================================
+ * Uncompress the given file and remove the original.
+ */
+void file_uncompress(file)
+ char *file;
+{
+ local char buf[MAX_NAME_LEN];
+ char *infile, *outfile;
+ FILE *out;
+ gzFile in;
+ int len = strlen(file);
+
+ strcpy(buf, file);
+
+ if (len > SUFFIX_LEN && strcmp(file+len-SUFFIX_LEN, GZ_SUFFIX) == 0) {
+ infile = file;
+ outfile = buf;
+ outfile[len-3] = '\0';
+ } else {
+ outfile = file;
+ infile = buf;
+ strcat(infile, GZ_SUFFIX);
+ }
+ in = gzopen(infile, "rb");
+ if (in == NULL) {
+ fprintf(stderr, "%s: can't gzopen %s\n", prog, infile);
+ exit(1);
+ }
+ out = fopen(outfile, "wb");
+ if (out == NULL) {
+ perror(file);
+ exit(1);
+ }
+
+ gz_uncompress(in, out);
+
+ unlink(infile);
+}
+
+
+/* ===========================================================================
+ * Usage: minigzip [-d] [-f] [-h] [-1 to -9] [files...]
+ * -d : decompress
+ * -f : compress with Z_FILTERED
+ * -h : compress with Z_HUFFMAN_ONLY
+ * -1 to -9 : compression level
+ */
+
+int main(argc, argv)
+ int argc;
+ char *argv[];
+{
+ int uncompr = 0;
+ gzFile file;
+ char outmode[20];
+
+ strcpy(outmode, "wb6 ");
+
+ prog = argv[0];
+ argc--, argv++;
+
+ while (argc > 0) {
+ if (strcmp(*argv, "-d") == 0)
+ uncompr = 1;
+ else if (strcmp(*argv, "-f") == 0)
+ outmode[3] = 'f';
+ else if (strcmp(*argv, "-h") == 0)
+ outmode[3] = 'h';
+ else if ((*argv)[0] == '-' && (*argv)[1] >= '1' && (*argv)[1] <= '9' &&
+ (*argv)[2] == 0)
+ outmode[2] = (*argv)[1];
+ else
+ break;
+ argc--, argv++;
+ }
+ if (argc == 0) {
+ SET_BINARY_MODE(stdin);
+ SET_BINARY_MODE(stdout);
+ if (uncompr) {
+ file = gzdopen(fileno(stdin), "rb");
+ if (file == NULL) error("can't gzdopen stdin");
+ gz_uncompress(file, stdout);
+ } else {
+ file = gzdopen(fileno(stdout), outmode);
+ if (file == NULL) error("can't gzdopen stdout");
+ gz_compress(stdin, file);
+ }
+ } else {
+ do {
+ if (uncompr) {
+ file_uncompress(*argv);
+ } else {
+ file_compress(*argv, outmode);
+ }
+ } while (argv++, --argc);
+ }
+ exit(0);
+ return 0; /* to avoid warning */
+}
diff --git a/zlib/msdos/Makefile.b32 b/zlib/msdos/Makefile.b32
new file mode 100644
index 00000000000..f476da91649
--- /dev/null
+++ b/zlib/msdos/Makefile.b32
@@ -0,0 +1,104 @@
+# Makefile for zlib
+# Borland C++
+
+# This version of the zlib makefile was adapted by Chris Young for use
+# with Borland C 4.5x with the Dos Power Pack for a 32-bit protected mode
+# flat memory model. It was created for use with POV-Ray ray tracer and
+# you may choose to edit the CFLAGS to suit your needs but the
+# switches -WX and -DMSDOS are required.
+# -- Chris Young 76702.1655@compuserve.com
+
+# To use, do "make -fmakefile.b32"
+
+# See zconf.h for details about the memory requirements.
+
+# ------------- Borland C++ -------------
+MODEL=-WX
+CFLAGS= $(MODEL) -P-C -K -N- -k- -d -3 -r- -v- -f -DMSDOS
+CC=bcc32
+LD=bcc32
+LIB=tlib
+LDFLAGS= $(MODEL)
+O=.obj
+
+# variables
+OBJ1 = adler32$(O) compress$(O) crc32$(O) gzio$(O) uncompr$(O) deflate$(O) \
+ trees$(O)
+OBJP1 = adler32$(O)+compress$(O)+crc32$(O)+gzio$(O)+uncompr$(O)+deflate$(O)+\
+ trees$(O)
+OBJ2 = zutil$(O) inflate$(O) infblock$(O) inftrees$(O) infcodes$(O) \
+ infutil$(O) inffast$(O)
+OBJP2 = zutil$(O)+inflate$(O)+infblock$(O)+inftrees$(O)+infcodes$(O)+\
+ infutil$(O)+inffast$(O)
+
+all: test
+
+adler32.obj: adler32.c zlib.h zconf.h
+ $(CC) -c $(CFLAGS) $*.c
+
+compress.obj: compress.c zlib.h zconf.h
+ $(CC) -c $(CFLAGS) $*.c
+
+crc32.obj: crc32.c zlib.h zconf.h
+ $(CC) -c $(CFLAGS) $*.c
+
+deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h
+ $(CC) -c $(CFLAGS) $*.c
+
+gzio.obj: gzio.c zutil.h zlib.h zconf.h
+ $(CC) -c $(CFLAGS) $*.c
+
+infblock.obj: infblock.c zutil.h zlib.h zconf.h infblock.h inftrees.h\
+ infcodes.h infutil.h
+ $(CC) -c $(CFLAGS) $*.c
+
+infcodes.obj: infcodes.c zutil.h zlib.h zconf.h inftrees.h infutil.h\
+ infcodes.h inffast.h
+ $(CC) -c $(CFLAGS) $*.c
+
+inflate.obj: inflate.c zutil.h zlib.h zconf.h infblock.h
+ $(CC) -c $(CFLAGS) $*.c
+
+inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h
+ $(CC) -c $(CFLAGS) $*.c
+
+infutil.obj: infutil.c zutil.h zlib.h zconf.h inftrees.h infutil.h
+ $(CC) -c $(CFLAGS) $*.c
+
+inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h infutil.h inffast.h
+ $(CC) -c $(CFLAGS) $*.c
+
+trees.obj: trees.c deflate.h zutil.h zlib.h zconf.h
+ $(CC) -c $(CFLAGS) $*.c
+
+uncompr.obj: uncompr.c zlib.h zconf.h
+ $(CC) -c $(CFLAGS) $*.c
+
+zutil.obj: zutil.c zutil.h zlib.h zconf.h
+ $(CC) -c $(CFLAGS) $*.c
+
+example.obj: example.c zlib.h zconf.h
+ $(CC) -c $(CFLAGS) $*.c
+
+minigzip.obj: minigzip.c zlib.h zconf.h
+ $(CC) -c $(CFLAGS) $*.c
+
+# we must cut the command line to fit in the MS/DOS 128 byte limit:
+zlib.lib: $(OBJ1) $(OBJ2)
+ del zlib.lib
+ $(LIB) zlib +$(OBJP1)
+ $(LIB) zlib +$(OBJP2)
+
+example.exe: example.obj zlib.lib
+ $(LD) $(LDFLAGS) example.obj zlib.lib
+
+minigzip.exe: minigzip.obj zlib.lib
+ $(LD) $(LDFLAGS) minigzip.obj zlib.lib
+
+test: example.exe minigzip.exe
+ example
+ echo hello world | minigzip | minigzip -d
+
+#clean:
+# del *.obj
+# del *.exe
diff --git a/zlib/msdos/Makefile.bor b/zlib/msdos/Makefile.bor
new file mode 100644
index 00000000000..f5651b40fec
--- /dev/null
+++ b/zlib/msdos/Makefile.bor
@@ -0,0 +1,125 @@
+# Makefile for zlib
+# Borland C++ ************ UNTESTED ***********
+
+# To use, do "make -fmakefile.bor"
+# To compile in small model, set below: MODEL=s
+
+# WARNING: the small model is supported but only for small values of
+# MAX_WBITS and MAX_MEM_LEVEL. For example:
+# -DMAX_WBITS=11 -DDEF_WBITS=11 -DMAX_MEM_LEVEL=3
+# If you wish to reduce the memory requirements (default 256K for big
+# objects plus a few K), you can add to the LOC macro below:
+# -DMAX_MEM_LEVEL=7 -DMAX_WBITS=14
+# See zconf.h for details about the memory requirements.
+
+# ------------- Turbo C++, Borland C++ -------------
+
+# Optional nonstandard preprocessor flags (e.g. -DMAX_MEM_LEVEL=7)
+# should be added to the environment via "set LOCAL_ZLIB=-DFOO" or added
+# to the declaration of LOC here:
+LOC = $(LOCAL_ZLIB)
+
+# Type for CPU required: 0: 8086, 1: 80186, 2: 80286, 3: 80386, etc.
+CPU_TYP = 0
+
+# Memory model: one of s, m, c, l (small, medium, compact, large)
+MODEL=l
+
+CC=bcc
+# replace bcc with tcc for Turbo C++ 1.0, with bcc32 for the 32 bit version
+LD=$(CC)
+AR=tlib
+
+# compiler flags
+CFLAGS=-O2 -Z -m$(MODEL) $(LOC)
+# replace "-O2" by "-O -G -a -d" for Turbo C++ 1.0
+
+LDFLAGS=-m$(MODEL)
+
+O=.obj
+
+# variables
+OBJ1 = adler32$(O) compress$(O) crc32$(O) gzio$(O) uncompr$(O) deflate$(O) \
+ trees$(O)
+OBJP1 = adler32$(O)+compress$(O)+crc32$(O)+gzio$(O)+uncompr$(O)+deflate$(O)+\
+ trees$(O)
+OBJ2 = zutil$(O) inflate$(O) infblock$(O) inftrees$(O) infcodes$(O) \
+ infutil$(O) inffast$(O)
+OBJP2 = zutil$(O)+inflate$(O)+infblock$(O)+inftrees$(O)+infcodes$(O)+\
+ infutil$(O)+inffast$(O)
+
+ZLIB_H = zlib.h zconf.h
+ZUTIL_H = zutil.h $(ZLIB_H)
+
+ZLIB_LIB = zlib_$(MODEL).lib
+
+all: test
+
+# individual dependencies and action rules:
+adler32.obj: adler32.c $(ZLIB_H)
+ $(CC) -c $(CFLAGS) $*.c
+
+compress.obj: compress.c $(ZLIB_H)
+ $(CC) -c $(CFLAGS) $*.c
+
+crc32.obj: crc32.c $(ZLIB_H)
+ $(CC) -c $(CFLAGS) $*.c
+
+deflate.obj: deflate.c deflate.h $(ZUTIL_H)
+ $(CC) -c $(CFLAGS) $*.c
+
+gzio.obj: gzio.c $(ZUTIL_H)
+ $(CC) -c $(CFLAGS) $*.c
+
+infblock.obj: infblock.c $(ZUTIL_H) infblock.h inftrees.h infcodes.h infutil.h
+ $(CC) -c $(CFLAGS) $*.c
+
+infcodes.obj: infcodes.c $(ZUTIL_H) inftrees.h infutil.h infcodes.h inffast.h
+ $(CC) -c $(CFLAGS) $*.c
+
+inflate.obj: inflate.c $(ZUTIL_H) infblock.h
+ $(CC) -c $(CFLAGS) $*.c
+
+inftrees.obj: inftrees.c $(ZUTIL_H) inftrees.h
+ $(CC) -c $(CFLAGS) $*.c
+
+infutil.obj: infutil.c $(ZUTIL_H) inftrees.h infutil.h
+ $(CC) -c $(CFLAGS) $*.c
+
+inffast.obj: inffast.c $(ZUTIL_H) inftrees.h infutil.h inffast.h
+ $(CC) -c $(CFLAGS) $*.c
+
+trees.obj: trees.c deflate.h $(ZUTIL_H)
+ $(CC) -c $(CFLAGS) $*.c
+
+uncompr.obj: uncompr.c $(ZLIB_H)
+ $(CC) -c $(CFLAGS) $*.c
+
+zutil.obj: zutil.c $(ZUTIL_H)
+ $(CC) -c $(CFLAGS) $*.c
+
+example.obj: example.c $(ZLIB_H)
+ $(CC) -c $(CFLAGS) $*.c
+
+minigzip.obj: minigzip.c $(ZLIB_H)
+ $(CC) -c $(CFLAGS) $*.c
+
+# we must cut the command line to fit in the MS/DOS 128 byte limit:
+$(ZLIB_LIB): $(OBJ1) $(OBJ2)
+ del $(ZLIB_LIB)
+ $(AR) $(ZLIB_LIB) +$(OBJP1)
+ $(AR) $(ZLIB_LIB) +$(OBJP2)
+
+example.exe: example.obj $(ZLIB_LIB)
+ $(LD) $(LDFLAGS) example.obj $(ZLIB_LIB)
+
+minigzip.exe: minigzip.obj $(ZLIB_LIB)
+ $(LD) $(LDFLAGS) minigzip.obj $(ZLIB_LIB)
+
+test: example.exe minigzip.exe
+ example
+ echo hello world | minigzip | minigzip -d
+
+#clean:
+# del *.obj
+# del *.exe
diff --git a/zlib/msdos/Makefile.dj2 b/zlib/msdos/Makefile.dj2
new file mode 100644
index 00000000000..0ab431c8a11
--- /dev/null
+++ b/zlib/msdos/Makefile.dj2
@@ -0,0 +1,100 @@
+# Makefile for zlib. Modified for djgpp v2.0 by F. J. Donahoe, 3/15/96.
+# Copyright (C) 1995-1998 Jean-loup Gailly.
+# For conditions of distribution and use, see copyright notice in zlib.h
+
+# To compile, or to compile and test, type:
+#
+# make -fmakefile.dj2; make test -fmakefile.dj2
+#
+# To install libz.a, zconf.h and zlib.h in the djgpp directories, type:
+#
+# make install -fmakefile.dj2
+#
+# after first defining LIBRARY_PATH and INCLUDE_PATH in djgpp.env as
+# in the sample below if the pattern of the DJGPP distribution is to
+# be followed. Remember that, while <sp>'es around <=> are ignored in
+# makefiles, they are *not* in batch files or in djgpp.env.
+# - - - - -
+# [make]
+# INCLUDE_PATH=%\>;INCLUDE_PATH%%\DJDIR%\include
+# LIBRARY_PATH=%\>;LIBRARY_PATH%%\DJDIR%\lib
+# BUTT=-m486
+# - - - - -
+# Alternately, these variables may be defined below, overriding the values
+# in djgpp.env, as
+# INCLUDE_PATH=c:\usr\include
+# LIBRARY_PATH=c:\usr\lib
+
+CC=gcc
+
+#CFLAGS=-MMD -O
+#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7
+#CFLAGS=-MMD -g -DDEBUG
+CFLAGS=-MMD -O3 $(BUTT) -Wall -Wwrite-strings -Wpointer-arith -Wconversion \
+ -Wstrict-prototypes -Wmissing-prototypes
+
+# If cp.exe is available, replace "copy /Y" with "cp -fp" .
+CP=copy /Y
+# If gnu install.exe is available, replace $(CP) with ginstall.
+INSTALL=$(CP)
+# The default value of RM is "rm -f." If "rm.exe" is found, comment out:
+RM=del
+LDLIBS=-L. -lz
+LD=$(CC) -s -o
+LDSHARED=$(CC)
+
+INCL=zlib.h zconf.h
+LIBS=libz.a
+
+AR=ar rcs
+
+prefix=/usr/local
+exec_prefix = $(prefix)
+
+OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \
+ zutil.o inflate.o infblock.o inftrees.o infcodes.o infutil.o inffast.o
+
+TEST_OBJS = example.o minigzip.o
+
+all: example.exe minigzip.exe
+
+test: all
+ ./example
+ echo hello world | .\minigzip | .\minigzip -d
+
+%.o : %.c
+ $(CC) $(CFLAGS) -c $< -o $@
+
+libz.a: $(OBJS)
+ $(AR) $@ $(OBJS)
+
+%.exe : %.o $(LIBS)
+ $(LD) $@ $< $(LDLIBS)
+
+# INCLUDE_PATH and LIBRARY_PATH were set for [make] in djgpp.env .
+
+.PHONY : uninstall clean
+
+install: $(INCL) $(LIBS)
+ -@if not exist $(INCLUDE_PATH)\nul mkdir $(INCLUDE_PATH)
+ -@if not exist $(LIBRARY_PATH)\nul mkdir $(LIBRARY_PATH)
+ $(INSTALL) zlib.h $(INCLUDE_PATH)
+ $(INSTALL) zconf.h $(INCLUDE_PATH)
+ $(INSTALL) libz.a $(LIBRARY_PATH)
+
+uninstall:
+ $(RM) $(INCLUDE_PATH)\zlib.h
+ $(RM) $(INCLUDE_PATH)\zconf.h
+ $(RM) $(LIBRARY_PATH)\libz.a
+
+clean:
+ $(RM) *.d
+ $(RM) *.o
+ $(RM) *.exe
+ $(RM) libz.a
+ $(RM) foo.gz
+
+DEPS := $(wildcard *.d)
+ifneq ($(DEPS),)
+include $(DEPS)
+endif
diff --git a/zlib/msdos/Makefile.emx b/zlib/msdos/Makefile.emx
new file mode 100644
index 00000000000..0e5e5cc4338
--- /dev/null
+++ b/zlib/msdos/Makefile.emx
@@ -0,0 +1,69 @@
+# Makefile for zlib. Modified for emx 0.9c by Chr. Spieler, 6/17/98.
+# Copyright (C) 1995-1998 Jean-loup Gailly.
+# For conditions of distribution and use, see copyright notice in zlib.h
+
+# To compile, or to compile and test, type:
+#
+# make -fmakefile.emx; make test -fmakefile.emx
+#
+
+CC=gcc
+
+#CFLAGS=-MMD -O
+#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7
+#CFLAGS=-MMD -g -DDEBUG
+CFLAGS=-MMD -O3 $(BUTT) -Wall -Wwrite-strings -Wpointer-arith -Wconversion \
+ -Wstrict-prototypes -Wmissing-prototypes
+
+# If cp.exe is available, replace "copy /Y" with "cp -fp" .
+CP=copy /Y
+# If gnu install.exe is available, replace $(CP) with ginstall.
+INSTALL=$(CP)
+# The default value of RM is "rm -f." If "rm.exe" is found, comment out:
+RM=del
+LDLIBS=-L. -lzlib
+LD=$(CC) -s -o
+LDSHARED=$(CC)
+
+INCL=zlib.h zconf.h
+LIBS=zlib.a
+
+AR=ar rcs
+
+prefix=/usr/local
+exec_prefix = $(prefix)
+
+OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \
+ zutil.o inflate.o infblock.o inftrees.o infcodes.o infutil.o inffast.o
+
+TEST_OBJS = example.o minigzip.o
+
+all: example.exe minigzip.exe
+
+test: all
+ ./example
+ echo hello world | .\minigzip | .\minigzip -d
+
+%.o : %.c
+ $(CC) $(CFLAGS) -c $< -o $@
+
+zlib.a: $(OBJS)
+ $(AR) $@ $(OBJS)
+
+%.exe : %.o $(LIBS)
+ $(LD) $@ $< $(LDLIBS)
+
+
+.PHONY : clean
+
+clean:
+ $(RM) *.d
+ $(RM) *.o
+ $(RM) *.exe
+ $(RM) zlib.a
+ $(RM) foo.gz
+
+DEPS := $(wildcard *.d)
+ifneq ($(DEPS),)
+include $(DEPS)
+endif
diff --git a/zlib/msdos/Makefile.msc b/zlib/msdos/Makefile.msc
new file mode 100644
index 00000000000..562201d87ea
--- /dev/null
+++ b/zlib/msdos/Makefile.msc
@@ -0,0 +1,121 @@
+# Makefile for zlib
+# Microsoft C 5.1 or later
+
+# To use, do "make makefile.msc"
+# To compile in small model, set below: MODEL=S
+
+# If you wish to reduce the memory requirements (default 256K for big
+# objects plus a few K), you can add to the LOC macro below:
+# -DMAX_MEM_LEVEL=7 -DMAX_WBITS=14
+# See zconf.h for details about the memory requirements.
+
+# ------------- Microsoft C 5.1 and later -------------
+
+# Optional nonstandard preprocessor flags (e.g. -DMAX_MEM_LEVEL=7)
+# should be added to the environment via "set LOCAL_ZLIB=-DFOO" or added
+# to the declaration of LOC here:
+LOC = $(LOCAL_ZLIB)
+
+# Type for CPU required: 0: 8086, 1: 80186, 2: 80286, 3: 80386, etc.
+CPU_TYP = 0
+
+# Memory model: one of S, M, C, L (small, medium, compact, large)
+MODEL=L
+
+CC=cl
+CFLAGS=-nologo -A$(MODEL) -G$(CPU_TYP) -W3 -Oait -Gs $(LOC)
+#-Ox generates bad code with MSC 5.1
+LIB_CFLAGS=-Zl $(CFLAGS)
+
+LD=link
+LDFLAGS=/noi/e/st:0x1500/noe/farcall/packcode
+# "/farcall/packcode" are only useful for `large code' memory models
+# but should be a "no-op" for small code models.
+
+O=.obj
+
+# variables
+OBJ1 = adler32$(O) compress$(O) crc32$(O) gzio$(O) uncompr$(O) deflate$(O) \
+ trees$(O)
+OBJP1 = adler32$(O)+compress$(O)+crc32$(O)+gzio$(O)+uncompr$(O)+deflate$(O)+\
+ trees$(O)
+OBJ2 = zutil$(O) inflate$(O) infblock$(O) inftrees$(O) infcodes$(O) \
+ infutil$(O) inffast$(O)
+OBJP2 = zutil$(O)+inflate$(O)+infblock$(O)+inftrees$(O)+infcodes$(O)+\
+ infutil$(O)+inffast$(O)
+
+ZLIB_H = zlib.h zconf.h
+ZUTIL_H = zutil.h $(ZLIB_H)
+
+ZLIB_LIB = zlib_$(MODEL).lib
+
+all: $(ZLIB_LIB) example.exe minigzip.exe
+
+# individual dependencies and action rules:
+adler32.obj: adler32.c $(ZLIB_H)
+ $(CC) -c $(LIB_CFLAGS) $*.c
+
+compress.obj: compress.c $(ZLIB_H)
+ $(CC) -c $(LIB_CFLAGS) $*.c
+
+crc32.obj: crc32.c $(ZLIB_H)
+ $(CC) -c $(LIB_CFLAGS) $*.c
+
+deflate.obj: deflate.c deflate.h $(ZUTIL_H)
+ $(CC) -c $(LIB_CFLAGS) $*.c
+
+gzio.obj: gzio.c $(ZUTIL_H)
+ $(CC) -c $(LIB_CFLAGS) $*.c
+
+infblock.obj: infblock.c $(ZUTIL_H) infblock.h inftrees.h infcodes.h infutil.h
+ $(CC) -c $(LIB_CFLAGS) $*.c
+
+infcodes.obj: infcodes.c $(ZUTIL_H) inftrees.h infutil.h infcodes.h inffast.h
+ $(CC) -c $(LIB_CFLAGS) $*.c
+
+inflate.obj: inflate.c $(ZUTIL_H) infblock.h
+ $(CC) -c $(LIB_CFLAGS) $*.c
+
+inftrees.obj: inftrees.c $(ZUTIL_H) inftrees.h
+ $(CC) -c $(LIB_CFLAGS) $*.c
+
+infutil.obj: infutil.c $(ZUTIL_H) inftrees.h infutil.h
+ $(CC) -c $(LIB_CFLAGS) $*.c
+
+inffast.obj: inffast.c $(ZUTIL_H) inftrees.h infutil.h inffast.h
+ $(CC) -c $(LIB_CFLAGS) $*.c
+
+trees.obj: trees.c deflate.h $(ZUTIL_H)
+ $(CC) -c $(LIB_CFLAGS) $*.c
+
+uncompr.obj: uncompr.c $(ZLIB_H)
+ $(CC) -c $(LIB_CFLAGS) $*.c
+
+zutil.obj: zutil.c $(ZUTIL_H)
+ $(CC) -c $(LIB_CFLAGS) $*.c
+
+example.obj: example.c $(ZLIB_H)
+ $(CC) -c $(CFLAGS) $*.c
+
+minigzip.obj: minigzip.c $(ZLIB_H)
+ $(CC) -c $(CFLAGS) $*.c
+
+# we must cut the command line to fit in the MS/DOS 128 byte limit:
+$(ZLIB_LIB): $(OBJ1) $(OBJ2)
+ if exist $(ZLIB_LIB) del $(ZLIB_LIB)
+ lib $(ZLIB_LIB) $(OBJ1);
+ lib $(ZLIB_LIB) $(OBJ2);
+
+example.exe: example.obj $(ZLIB_LIB)
+ $(LD) $(LDFLAGS) example.obj,,,$(ZLIB_LIB);
+
+minigzip.exe: minigzip.obj $(ZLIB_LIB)
+ $(LD) $(LDFLAGS) minigzip.obj,,,$(ZLIB_LIB);
+
+test: example.exe minigzip.exe
+ example
+ echo hello world | minigzip | minigzip -d
+
+#clean:
+# del *.obj
+# del *.exe
diff --git a/zlib/msdos/Makefile.tc b/zlib/msdos/Makefile.tc
new file mode 100644
index 00000000000..63e0550359f
--- /dev/null
+++ b/zlib/msdos/Makefile.tc
@@ -0,0 +1,108 @@
+# Makefile for zlib
+# TurboC 2.0
+
+# To use, do "make -fmakefile.tc"
+# To compile in small model, set below: MODEL=-ms
+
+# WARNING: the small model is supported but only for small values of
+# MAX_WBITS and MAX_MEM_LEVEL. For example:
+# -DMAX_WBITS=11 -DMAX_MEM_LEVEL=3
+# If you wish to reduce the memory requirements (default 256K for big
+# objects plus a few K), you can add to CFLAGS below:
+# -DMAX_MEM_LEVEL=7 -DMAX_WBITS=14
+# See zconf.h for details about the memory requirements.
+
+# ------------- Turbo C 2.0 -------------
+MODEL=l
+# CFLAGS=-O2 -G -Z -m$(MODEL) -DMAX_WBITS=11 -DMAX_MEM_LEVEL=3
+CFLAGS=-O2 -G -Z -m$(MODEL)
+CC=tcc -I\tc\include
+LD=tcc -L\tc\lib
+AR=tlib
+LDFLAGS=-m$(MODEL) -f-
+O=.obj
+
+# variables
+OBJ1 = adler32$(O) compress$(O) crc32$(O) gzio$(O) uncompr$(O) deflate$(O) \
+ trees$(O)
+OBJP1 = adler32$(O)+compress$(O)+crc32$(O)+gzio$(O)+uncompr$(O)+deflate$(O)+\
+ trees$(O)
+OBJ2 = zutil$(O) inflate$(O) infblock$(O) inftrees$(O) infcodes$(O) \
+ infutil$(O) inffast$(O)
+OBJP2 = zutil$(O)+inflate$(O)+infblock$(O)+inftrees$(O)+infcodes$(O)+\
+ infutil$(O)+inffast$(O)
+
+ZLIB_H = zlib.h zconf.h
+ZUTIL_H = zutil.h $(ZLIB_H)
+
+ZLIB_LIB = zlib_$(MODEL).lib
+
+all: test
+
+adler32.obj: adler32.c $(ZLIB_H)
+ $(CC) -c $(CFLAGS) $*.c
+
+compress.obj: compress.c $(ZLIB_H)
+ $(CC) -c $(CFLAGS) $*.c
+
+crc32.obj: crc32.c $(ZLIB_H)
+ $(CC) -c $(CFLAGS) $*.c
+
+deflate.obj: deflate.c deflate.h $(ZUTIL_H)
+ $(CC) -c $(CFLAGS) $*.c
+
+gzio.obj: gzio.c $(ZUTIL_H)
+ $(CC) -c $(CFLAGS) $*.c
+
+infblock.obj: infblock.c $(ZUTIL_H) infblock.h inftrees.h infcodes.h infutil.h
+ $(CC) -c $(CFLAGS) $*.c
+
+infcodes.obj: infcodes.c $(ZUTIL_H) inftrees.h infutil.h infcodes.h inffast.h
+ $(CC) -c $(CFLAGS) $*.c
+
+inflate.obj: inflate.c $(ZUTIL_H) infblock.h
+ $(CC) -c $(CFLAGS) $*.c
+
+inftrees.obj: inftrees.c $(ZUTIL_H) inftrees.h
+ $(CC) -c $(CFLAGS) $*.c
+
+infutil.obj: infutil.c $(ZUTIL_H) inftrees.h infutil.h
+ $(CC) -c $(CFLAGS) $*.c
+
+inffast.obj: inffast.c $(ZUTIL_H) inftrees.h infutil.h inffast.h
+ $(CC) -c $(CFLAGS) $*.c
+
+trees.obj: trees.c deflate.h $(ZUTIL_H)
+ $(CC) -c $(CFLAGS) $*.c
+
+uncompr.obj: uncompr.c $(ZLIB_H)
+ $(CC) -c $(CFLAGS) $*.c
+
+zutil.obj: zutil.c $(ZUTIL_H)
+ $(CC) -c $(CFLAGS) $*.c
+
+example.obj: example.c $(ZLIB_H)
+ $(CC) -c $(CFLAGS) $*.c
+
+minigzip.obj: minigzip.c $(ZLIB_H)
+ $(CC) -c $(CFLAGS) $*.c
+
+# we must cut the command line to fit in the MS/DOS 128 byte limit:
+$(ZLIB_LIB): $(OBJ1) $(OBJ2)
+ del $(ZLIB_LIB)
+ $(AR) $(ZLIB_LIB) +$(OBJP1)
+ $(AR) $(ZLIB_LIB) +$(OBJP2)
+
+example.exe: example.obj $(ZLIB_LIB)
+ $(LD) $(LDFLAGS) -eexample.exe example.obj $(ZLIB_LIB)
+
+minigzip.exe: minigzip.obj $(ZLIB_LIB)
+ $(LD) $(LDFLAGS) -eminigzip.exe minigzip.obj $(ZLIB_LIB)
+
+test: example.exe minigzip.exe
+ example
+ echo hello world | minigzip | minigzip -d
+
+#clean:
+# del *.obj
+# del *.exe
diff --git a/zlib/msdos/Makefile.w32 b/zlib/msdos/Makefile.w32
new file mode 100644
index 00000000000..0a05fa9a469
--- /dev/null
+++ b/zlib/msdos/Makefile.w32
@@ -0,0 +1,97 @@
+# Makefile for zlib
+# Microsoft 32-bit Visual C++ 4.0 or later (may work on earlier versions)
+
+# To use, do "nmake /f makefile.w32"
+
+# If you wish to reduce the memory requirements (default 256K for big
+# objects plus a few K), you can add to CFLAGS below:
+# -DMAX_MEM_LEVEL=7 -DMAX_WBITS=14
+# See zconf.h for details about the memory requirements.
+
+# ------------- Microsoft Visual C++ 4.0 and later -------------
+MODEL=
+CFLAGS=-Ox -GA3s -nologo -W3
+CC=cl
+LD=link
+LDFLAGS=
+O=.obj
+
+# variables
+OBJ1 = adler32$(O) compress$(O) crc32$(O) gzio$(O) uncompr$(O) deflate$(O) \
+ trees$(O)
+OBJP1 = adler32$(O)+compress$(O)+crc32$(O)+gzio$(O)+uncompr$(O)+deflate$(O)+\
+ trees$(O)
+OBJ2 = zutil$(O) inflate$(O) infblock$(O) inftrees$(O) infcodes$(O) \
+ infutil$(O) inffast$(O)
+OBJP2 = zutil$(O)+inflate$(O)+infblock$(O)+inftrees$(O)+infcodes$(O)+\
+ infutil$(O)+inffast$(O)
+
+all: zlib.lib example.exe minigzip.exe
+
+adler32.obj: adler32.c zlib.h zconf.h
+ $(CC) -c $(CFLAGS) $*.c
+
+compress.obj: compress.c zlib.h zconf.h
+ $(CC) -c $(CFLAGS) $*.c
+
+crc32.obj: crc32.c zlib.h zconf.h
+ $(CC) -c $(CFLAGS) $*.c
+
+deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h
+ $(CC) -c $(CFLAGS) $*.c
+
+gzio.obj: gzio.c zutil.h zlib.h zconf.h
+ $(CC) -c $(CFLAGS) $*.c
+
+infblock.obj: infblock.c zutil.h zlib.h zconf.h infblock.h inftrees.h\
+ infcodes.h infutil.h
+ $(CC) -c $(CFLAGS) $*.c
+
+infcodes.obj: infcodes.c zutil.h zlib.h zconf.h inftrees.h infutil.h\
+ infcodes.h inffast.h
+ $(CC) -c $(CFLAGS) $*.c
+
+inflate.obj: inflate.c zutil.h zlib.h zconf.h infblock.h
+ $(CC) -c $(CFLAGS) $*.c
+
+inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h
+ $(CC) -c $(CFLAGS) $*.c
+
+infutil.obj: infutil.c zutil.h zlib.h zconf.h inftrees.h infutil.h
+ $(CC) -c $(CFLAGS) $*.c
+
+inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h infutil.h inffast.h
+ $(CC) -c $(CFLAGS) $*.c
+
+trees.obj: trees.c deflate.h zutil.h zlib.h zconf.h
+ $(CC) -c $(CFLAGS) $*.c
+
+uncompr.obj: uncompr.c zlib.h zconf.h
+ $(CC) -c $(CFLAGS) $*.c
+
+zutil.obj: zutil.c zutil.h zlib.h zconf.h
+ $(CC) -c $(CFLAGS) $*.c
+
+example.obj: example.c zlib.h zconf.h
+ $(CC) -c $(CFLAGS) $*.c
+
+minigzip.obj: minigzip.c zlib.h zconf.h
+ $(CC) -c $(CFLAGS) $*.c
+
+zlib.lib: $(OBJ1) $(OBJ2)
+ if exist zlib.lib del zlib.lib
+ lib /OUT:zlib.lib $(OBJ1) $(OBJ2)
+
+example.exe: example.obj zlib.lib
+ $(LD) $(LDFLAGS) example.obj zlib.lib /OUT:example.exe /SUBSYSTEM:CONSOLE
+
+minigzip.exe: minigzip.obj zlib.lib
+ $(LD) $(LDFLAGS) minigzip.obj zlib.lib /OUT:minigzip.exe /SUBSYSTEM:CONSOLE
+
+test: example.exe minigzip.exe
+ example
+ echo hello world | minigzip | minigzip -d
+
+#clean:
+# del *.obj
+# del *.exe
diff --git a/zlib/msdos/Makefile.wat b/zlib/msdos/Makefile.wat
new file mode 100644
index 00000000000..44bf8607f6f
--- /dev/null
+++ b/zlib/msdos/Makefile.wat
@@ -0,0 +1,103 @@
+# Makefile for zlib
+# Watcom 10a
+
+# This version of the zlib makefile was adapted by Chris Young for use
+# with Watcom 10a 32-bit protected mode flat memory model. It was created
+# for use with POV-Ray ray tracer and you may choose to edit the CFLAGS to
+# suit your needs but the -DMSDOS is required.
+# -- Chris Young 76702.1655@compuserve.com
+
+# To use, do "wmake -f makefile.wat"
+
+# See zconf.h for details about the memory requirements.
+
+# ------------- Watcom 10a -------------
+MODEL=-mf
+CFLAGS= $(MODEL) -fpi87 -fp5 -zp4 -5r -w5 -oneatx -DMSDOS
+CC=wcc386
+LD=wcl386
+LIB=wlib -b -c
+LDFLAGS=
+O=.obj
+
+# variables
+OBJ1=adler32$(O) compress$(O) crc32$(O) gzio$(O) uncompr$(O) deflate$(O)
+OBJ2=trees$(O) zutil$(O) inflate$(O) infblock$(O) inftrees$(O) infcodes$(O)
+OBJ3=infutil$(O) inffast$(O)
+OBJP1=adler32$(O)+compress$(O)+crc32$(O)+gzio$(O)+uncompr$(O)+deflate$(O)
+OBJP2=trees$(O)+zutil$(O)+inflate$(O)+infblock$(O)+inftrees$(O)+infcodes$(O)
+OBJP3=infutil$(O)+inffast$(O)
+
+all: test
+
+adler32.obj: adler32.c zlib.h zconf.h
+ $(CC) $(CFLAGS) $*.c
+
+compress.obj: compress.c zlib.h zconf.h
+ $(CC) $(CFLAGS) $*.c
+
+crc32.obj: crc32.c zlib.h zconf.h
+ $(CC) $(CFLAGS) $*.c
+
+deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h
+ $(CC) $(CFLAGS) $*.c
+
+gzio.obj: gzio.c zutil.h zlib.h zconf.h
+ $(CC) $(CFLAGS) $*.c
+
+infblock.obj: infblock.c zutil.h zlib.h zconf.h infblock.h inftrees.h &
+ infcodes.h infutil.h
+ $(CC) $(CFLAGS) $*.c
+
+infcodes.obj: infcodes.c zutil.h zlib.h zconf.h inftrees.h infutil.h &
+ infcodes.h inffast.h
+ $(CC) $(CFLAGS) $*.c
+
+inflate.obj: inflate.c zutil.h zlib.h zconf.h infblock.h
+ $(CC) $(CFLAGS) $*.c
+
+inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h
+ $(CC) $(CFLAGS) $*.c
+
+infutil.obj: infutil.c zutil.h zlib.h zconf.h inftrees.h infutil.h
+ $(CC) $(CFLAGS) $*.c
+
+inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h infutil.h inffast.h
+ $(CC) $(CFLAGS) $*.c
+
+trees.obj: trees.c deflate.h zutil.h zlib.h zconf.h
+ $(CC) $(CFLAGS) $*.c
+
+uncompr.obj: uncompr.c zlib.h zconf.h
+ $(CC) $(CFLAGS) $*.c
+
+zutil.obj: zutil.c zutil.h zlib.h zconf.h
+ $(CC) $(CFLAGS) $*.c
+
+example.obj: example.c zlib.h zconf.h
+ $(CC) $(CFLAGS) $*.c
+
+minigzip.obj: minigzip.c zlib.h zconf.h
+ $(CC) $(CFLAGS) $*.c
+
+# we must cut the command line to fit in the MS/DOS 128 byte limit:
+zlib.lib: $(OBJ1) $(OBJ2) $(OBJ3)
+ del zlib.lib
+ $(LIB) zlib.lib +$(OBJP1)
+ $(LIB) zlib.lib +$(OBJP2)
+ $(LIB) zlib.lib +$(OBJP3)
+
+example.exe: example.obj zlib.lib
+ $(LD) $(LDFLAGS) example.obj zlib.lib
+
+minigzip.exe: minigzip.obj zlib.lib
+ $(LD) $(LDFLAGS) minigzip.obj zlib.lib
+
+test: minigzip.exe example.exe
+ example
+ echo hello world | minigzip | minigzip -d >test
+ type test
+
+#clean:
+# del *.obj
+# del *.exe
diff --git a/zlib/msdos/zlib.def b/zlib/msdos/zlib.def
new file mode 100644
index 00000000000..6c04412f9b0
--- /dev/null
+++ b/zlib/msdos/zlib.def
@@ -0,0 +1,60 @@
+LIBRARY "zlib"
+
+DESCRIPTION '"""zlib data compression library"""'
+
+EXETYPE NT
+
+SUBSYSTEM WINDOWS
+
+STUB 'WINSTUB.EXE'
+
+VERSION 1.13
+
+CODE EXECUTE READ
+
+DATA READ WRITE
+
+HEAPSIZE 1048576,4096
+
+EXPORTS
+ adler32 @1
+ compress @2
+ crc32 @3
+ deflate @4
+ deflateCopy @5
+ deflateEnd @6
+ deflateInit2_ @7
+ deflateInit_ @8
+ deflateParams @9
+ deflateReset @10
+ deflateSetDictionary @11
+ gzclose @12
+ gzdopen @13
+ gzerror @14
+ gzflush @15
+ gzopen @16
+ gzread @17
+ gzwrite @18
+ inflate @19
+ inflateEnd @20
+ inflateInit2_ @21
+ inflateInit_ @22
+ inflateReset @23
+ inflateSetDictionary @24
+ inflateSync @25
+ uncompress @26
+ zlibVersion @27
+ gzprintf @28
+ gzputc @29
+ gzgetc @30
+ gzseek @31
+ gzrewind @32
+ gztell @33
+ gzeof @34
+ gzsetparams @35
+ zError @36
+ inflateSyncPoint @37
+ get_crc_table @38
+ compress2 @39
+ gzputs @40
+ gzgets @41
diff --git a/zlib/msdos/zlib.rc b/zlib/msdos/zlib.rc
new file mode 100644
index 00000000000..556d4ff950a
--- /dev/null
+++ b/zlib/msdos/zlib.rc
@@ -0,0 +1,32 @@
+#include <windows.h>
+
+#define IDR_VERSION1 1
+IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE
+ FILEVERSION 1,1,3,0
+ PRODUCTVERSION 1,1,3,0
+ FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
+ FILEFLAGS 0
+ FILEOS VOS_DOS_WINDOWS32
+ FILETYPE VFT_DLL
+ FILESUBTYPE 0 // not used
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904E4"
+ //language ID = U.S. English, char set = Windows, Multilingual
+
+ BEGIN
+ VALUE "FileDescription", "zlib data compression library\0"
+ VALUE "FileVersion", "1.1.3\0"
+ VALUE "InternalName", "zlib\0"
+ VALUE "OriginalFilename", "zlib.dll\0"
+ VALUE "ProductName", "ZLib.DLL\0"
+ VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0"
+ VALUE "LegalCopyright", "(C) 1995-1998 Jean-loup Gailly & Mark Adler\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x0409, 1252
+ END
+END
diff --git a/zlib/nt/Makefile.emx b/zlib/nt/Makefile.emx
new file mode 100644
index 00000000000..2d475b1847e
--- /dev/null
+++ b/zlib/nt/Makefile.emx
@@ -0,0 +1,138 @@
+# Makefile for zlib. Modified for emx/rsxnt by Chr. Spieler, 6/16/98.
+# Copyright (C) 1995-1998 Jean-loup Gailly.
+# For conditions of distribution and use, see copyright notice in zlib.h
+
+# To compile, or to compile and test, type:
+#
+# make -fmakefile.emx; make test -fmakefile.emx
+#
+
+CC=gcc -Zwin32
+
+#CFLAGS=-MMD -O
+#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7
+#CFLAGS=-MMD -g -DDEBUG
+CFLAGS=-MMD -O3 $(BUTT) -Wall -Wwrite-strings -Wpointer-arith -Wconversion \
+ -Wstrict-prototypes -Wmissing-prototypes
+
+# If cp.exe is available, replace "copy /Y" with "cp -fp" .
+CP=copy /Y
+# If gnu install.exe is available, replace $(CP) with ginstall.
+INSTALL=$(CP)
+# The default value of RM is "rm -f." If "rm.exe" is found, comment out:
+RM=del
+LDLIBS=-L. -lzlib
+LD=$(CC) -s -o
+LDSHARED=$(CC)
+
+INCL=zlib.h zconf.h
+LIBS=zlib.a
+
+AR=ar rcs
+
+prefix=/usr/local
+exec_prefix = $(prefix)
+
+OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \
+ zutil.o inflate.o infblock.o inftrees.o infcodes.o infutil.o inffast.o
+
+TEST_OBJS = example.o minigzip.o
+
+all: example.exe minigzip.exe
+
+test: all
+ ./example
+ echo hello world | .\minigzip | .\minigzip -d
+
+%.o : %.c
+ $(CC) $(CFLAGS) -c $< -o $@
+
+zlib.a: $(OBJS)
+ $(AR) $@ $(OBJS)
+
+%.exe : %.o $(LIBS)
+ $(LD) $@ $< $(LDLIBS)
+
+
+.PHONY : clean
+
+clean:
+ $(RM) *.d
+ $(RM) *.o
+ $(RM) *.exe
+ $(RM) zlib.a
+ $(RM) foo.gz
+
+DEPS := $(wildcard *.d)
+ifneq ($(DEPS),)
+include $(DEPS)
+endif
+# Makefile for zlib. Modified for emx 0.9c by Chr. Spieler, 6/17/98.
+# Copyright (C) 1995-1998 Jean-loup Gailly.
+# For conditions of distribution and use, see copyright notice in zlib.h
+
+# To compile, or to compile and test, type:
+#
+# make -fmakefile.emx; make test -fmakefile.emx
+#
+
+CC=gcc
+
+#CFLAGS=-MMD -O
+#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7
+#CFLAGS=-MMD -g -DDEBUG
+CFLAGS=-MMD -O3 $(BUTT) -Wall -Wwrite-strings -Wpointer-arith -Wconversion \
+ -Wstrict-prototypes -Wmissing-prototypes
+
+# If cp.exe is available, replace "copy /Y" with "cp -fp" .
+CP=copy /Y
+# If gnu install.exe is available, replace $(CP) with ginstall.
+INSTALL=$(CP)
+# The default value of RM is "rm -f." If "rm.exe" is found, comment out:
+RM=del
+LDLIBS=-L. -lzlib
+LD=$(CC) -s -o
+LDSHARED=$(CC)
+
+INCL=zlib.h zconf.h
+LIBS=zlib.a
+
+AR=ar rcs
+
+prefix=/usr/local
+exec_prefix = $(prefix)
+
+OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \
+ zutil.o inflate.o infblock.o inftrees.o infcodes.o infutil.o inffast.o
+
+TEST_OBJS = example.o minigzip.o
+
+all: example.exe minigzip.exe
+
+test: all
+ ./example
+ echo hello world | .\minigzip | .\minigzip -d
+
+%.o : %.c
+ $(CC) $(CFLAGS) -c $< -o $@
+
+zlib.a: $(OBJS)
+ $(AR) $@ $(OBJS)
+
+%.exe : %.o $(LIBS)
+ $(LD) $@ $< $(LDLIBS)
+
+
+.PHONY : clean
+
+clean:
+ $(RM) *.d
+ $(RM) *.o
+ $(RM) *.exe
+ $(RM) zlib.a
+ $(RM) foo.gz
+
+DEPS := $(wildcard *.d)
+ifneq ($(DEPS),)
+include $(DEPS)
+endif
diff --git a/zlib/nt/Makefile.gcc b/zlib/nt/Makefile.gcc
new file mode 100644
index 00000000000..cdd652f2360
--- /dev/null
+++ b/zlib/nt/Makefile.gcc
@@ -0,0 +1,87 @@
+# Makefile for zlib. Modified for mingw32 by C. Spieler, 6/16/98.
+# (This Makefile is directly derived from Makefile.dj2)
+# Copyright (C) 1995-1998 Jean-loup Gailly.
+# For conditions of distribution and use, see copyright notice in zlib.h
+
+# To compile, or to compile and test, type:
+#
+# make -fmakefile.gcc; make test -fmakefile.gcc
+#
+# To install libz.a, zconf.h and zlib.h in the mingw32 directories, type:
+#
+# make install -fmakefile.gcc
+#
+
+CC=gcc
+
+#CFLAGS=-MMD -O
+#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7
+#CFLAGS=-MMD -g -DDEBUG
+CFLAGS=-MMD -O3 $(BUTT) -Wall -Wwrite-strings -Wpointer-arith -Wconversion \
+ -Wstrict-prototypes -Wmissing-prototypes
+
+# If cp.exe is available, replace "copy /Y" with "cp -fp" .
+CP=copy /Y
+# If gnu install.exe is available, replace $(CP) with ginstall.
+INSTALL=$(CP)
+# The default value of RM is "rm -f." If "rm.exe" is found, comment out:
+RM=del
+LDLIBS=-L. -lz
+LD=$(CC) -s -o
+LDSHARED=$(CC)
+
+INCL=zlib.h zconf.h
+LIBS=libz.a
+
+AR=ar rcs
+
+prefix=/usr/local
+exec_prefix = $(prefix)
+
+OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \
+ zutil.o inflate.o infblock.o inftrees.o infcodes.o infutil.o inffast.o
+
+TEST_OBJS = example.o minigzip.o
+
+all: example.exe minigzip.exe
+
+test: all
+ ./example
+ echo hello world | .\minigzip | .\minigzip -d
+
+%.o : %.c
+ $(CC) $(CFLAGS) -c $< -o $@
+
+libz.a: $(OBJS)
+ $(AR) $@ $(OBJS)
+
+%.exe : %.o $(LIBS)
+ $(LD) $@ $< $(LDLIBS)
+
+# INCLUDE_PATH and LIBRARY_PATH were set for [make] in djgpp.env .
+
+.PHONY : uninstall clean
+
+install: $(INCL) $(LIBS)
+ -@if not exist $(INCLUDE_PATH)\nul mkdir $(INCLUDE_PATH)
+ -@if not exist $(LIBRARY_PATH)\nul mkdir $(LIBRARY_PATH)
+ $(INSTALL) zlib.h $(INCLUDE_PATH)
+ $(INSTALL) zconf.h $(INCLUDE_PATH)
+ $(INSTALL) libz.a $(LIBRARY_PATH)
+
+uninstall:
+ $(RM) $(INCLUDE_PATH)\zlib.h
+ $(RM) $(INCLUDE_PATH)\zconf.h
+ $(RM) $(LIBRARY_PATH)\libz.a
+
+clean:
+ $(RM) *.d
+ $(RM) *.o
+ $(RM) *.exe
+ $(RM) libz.a
+ $(RM) foo.gz
+
+DEPS := $(wildcard *.d)
+ifneq ($(DEPS),)
+include $(DEPS)
+endif
diff --git a/zlib/nt/Makefile.nt b/zlib/nt/Makefile.nt
new file mode 100644
index 00000000000..b250f2ac7d2
--- /dev/null
+++ b/zlib/nt/Makefile.nt
@@ -0,0 +1,88 @@
+# Makefile for zlib
+
+!include <ntwin32.mak>
+
+CC=cl
+LD=link
+CFLAGS=-O -nologo
+LDFLAGS=
+O=.obj
+
+# variables
+OBJ1 = adler32$(O) compress$(O) crc32$(O) gzio$(O) uncompr$(O) deflate$(O) \
+ trees$(O)
+OBJ2 = zutil$(O) inflate$(O) infblock$(O) inftrees$(O) infcodes$(O) \
+ infutil$(O) inffast$(O)
+
+all: zlib.dll example.exe minigzip.exe
+
+adler32.obj: adler32.c zutil.h zlib.h zconf.h
+ $(CC) -c $(cvarsdll) $(CFLAGS) $*.c
+
+compress.obj: compress.c zlib.h zconf.h
+ $(CC) -c $(cvarsdll) $(CFLAGS) $*.c
+
+crc32.obj: crc32.c zutil.h zlib.h zconf.h
+ $(CC) -c $(cvarsdll) $(CFLAGS) $*.c
+
+deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h
+ $(CC) -c $(cvarsdll) $(CFLAGS) $*.c
+
+gzio.obj: gzio.c zutil.h zlib.h zconf.h
+ $(CC) -c $(cvarsdll) $(CFLAGS) $*.c
+
+infblock.obj: infblock.c zutil.h zlib.h zconf.h infblock.h inftrees.h\
+ infcodes.h infutil.h
+ $(CC) -c $(cvarsdll) $(CFLAGS) $*.c
+
+infcodes.obj: infcodes.c zutil.h zlib.h zconf.h inftrees.h infutil.h\
+ infcodes.h inffast.h
+ $(CC) -c $(cvarsdll) $(CFLAGS) $*.c
+
+inflate.obj: inflate.c zutil.h zlib.h zconf.h infblock.h
+ $(CC) -c $(cvarsdll) $(CFLAGS) $*.c
+
+inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h
+ $(CC) -c $(cvarsdll) $(CFLAGS) $*.c
+
+infutil.obj: infutil.c zutil.h zlib.h zconf.h inftrees.h infutil.h
+ $(CC) -c $(cvarsdll) $(CFLAGS) $*.c
+
+inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h infutil.h inffast.h
+ $(CC) -c $(cvarsdll) $(CFLAGS) $*.c
+
+trees.obj: trees.c deflate.h zutil.h zlib.h zconf.h
+ $(CC) -c $(cvarsdll) $(CFLAGS) $*.c
+
+uncompr.obj: uncompr.c zlib.h zconf.h
+ $(CC) -c $(cvarsdll) $(CFLAGS) $*.c
+
+zutil.obj: zutil.c zutil.h zlib.h zconf.h
+ $(CC) -c $(cvarsdll) $(CFLAGS) $*.c
+
+example.obj: example.c zlib.h zconf.h
+ $(CC) -c $(cvarsdll) $(CFLAGS) $*.c
+
+minigzip.obj: minigzip.c zlib.h zconf.h
+ $(CC) -c $(cvarsdll) $(CFLAGS) $*.c
+
+zlib.dll: $(OBJ1) $(OBJ2) zlib.dnt
+ link $(dlllflags) -out:$@ -def:zlib.dnt $(OBJ1) $(OBJ2) $(guilibsdll)
+
+zlib.lib: zlib.dll
+
+example.exe: example.obj zlib.lib
+ $(LD) $(LDFLAGS) example.obj zlib.lib
+
+minigzip.exe: minigzip.obj zlib.lib
+ $(LD) $(LDFLAGS) minigzip.obj zlib.lib
+
+test: example.exe minigzip.exe
+ example
+ echo hello world | minigzip | minigzip -d
+
+clean:
+ del *.obj
+ del *.exe
+ del *.dll
+ del *.lib
diff --git a/zlib/nt/zlib.dnt b/zlib/nt/zlib.dnt
new file mode 100644
index 00000000000..7f9475cfb0e
--- /dev/null
+++ b/zlib/nt/zlib.dnt
@@ -0,0 +1,47 @@
+LIBRARY zlib.dll
+EXETYPE WINDOWS
+CODE PRELOAD MOVEABLE DISCARDABLE
+DATA PRELOAD MOVEABLE MULTIPLE
+
+EXPORTS
+ adler32 @1
+ compress @2
+ crc32 @3
+ deflate @4
+ deflateCopy @5
+ deflateEnd @6
+ deflateInit2_ @7
+ deflateInit_ @8
+ deflateParams @9
+ deflateReset @10
+ deflateSetDictionary @11
+ gzclose @12
+ gzdopen @13
+ gzerror @14
+ gzflush @15
+ gzopen @16
+ gzread @17
+ gzwrite @18
+ inflate @19
+ inflateEnd @20
+ inflateInit2_ @21
+ inflateInit_ @22
+ inflateReset @23
+ inflateSetDictionary @24
+ inflateSync @25
+ uncompress @26
+ zlibVersion @27
+ gzprintf @28
+ gzputc @29
+ gzgetc @30
+ gzseek @31
+ gzrewind @32
+ gztell @33
+ gzeof @34
+ gzsetparams @35
+ zError @36
+ inflateSyncPoint @37
+ get_crc_table @38
+ compress2 @39
+ gzputs @40
+ gzgets @41
diff --git a/zlib/os2/Makefile.os2 b/zlib/os2/Makefile.os2
new file mode 100644
index 00000000000..4f569471eca
--- /dev/null
+++ b/zlib/os2/Makefile.os2
@@ -0,0 +1,136 @@
+# Makefile for zlib under OS/2 using GCC (PGCC)
+# For conditions of distribution and use, see copyright notice in zlib.h
+
+# To compile and test, type:
+# cp Makefile.os2 ..
+# cd ..
+# make -f Makefile.os2 test
+
+# This makefile will build a static library z.lib, a shared library
+# z.dll and a import library zdll.lib. You can use either z.lib or
+# zdll.lib by specifying either -lz or -lzdll on gcc's command line
+
+CC=gcc -Zomf -s
+
+CFLAGS=-O6 -Wall
+#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7
+#CFLAGS=-g -DDEBUG
+#CFLAGS=-O3 -Wall -Wwrite-strings -Wpointer-arith -Wconversion \
+# -Wstrict-prototypes -Wmissing-prototypes
+
+#################### BUG WARNING: #####################
+## infcodes.c hits a bug in pgcc-1.0, so you have to use either
+## -O# where # <= 4 or one of (-fno-ommit-frame-pointer or -fno-force-mem)
+## This bug is reportedly fixed in pgcc >1.0, but this was not tested
+CFLAGS+=-fno-force-mem
+
+LDFLAGS=-s -L. -lzdll -Zcrtdll
+LDSHARED=$(CC) -s -Zomf -Zdll -Zcrtdll
+
+VER=1.1.0
+ZLIB=z.lib
+SHAREDLIB=z.dll
+SHAREDLIBIMP=zdll.lib
+LIBS=$(ZLIB) $(SHAREDLIB) $(SHAREDLIBIMP)
+
+AR=emxomfar cr
+IMPLIB=emximp
+RANLIB=echo
+TAR=tar
+SHELL=bash
+
+prefix=/usr/local
+exec_prefix = $(prefix)
+
+OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \
+ zutil.o inflate.o infblock.o inftrees.o infcodes.o infutil.o inffast.o
+
+TEST_OBJS = example.o minigzip.o
+
+DISTFILES = README INDEX ChangeLog configure Make*[a-z0-9] *.[ch] descrip.mms \
+ algorithm.txt zlib.3 msdos/Make*[a-z0-9] msdos/zlib.def msdos/zlib.rc \
+ nt/Makefile.nt nt/zlib.dnt contrib/README.contrib contrib/*.txt \
+ contrib/asm386/*.asm contrib/asm386/*.c \
+ contrib/asm386/*.bat contrib/asm386/zlibvc.d?? contrib/iostream/*.cpp \
+ contrib/iostream/*.h contrib/iostream2/*.h contrib/iostream2/*.cpp \
+ contrib/untgz/Makefile contrib/untgz/*.c contrib/untgz/*.w32
+
+all: example.exe minigzip.exe
+
+test: all
+ @LD_LIBRARY_PATH=.:$(LD_LIBRARY_PATH) ; export LD_LIBRARY_PATH; \
+ echo hello world | ./minigzip | ./minigzip -d || \
+ echo ' *** minigzip test FAILED ***' ; \
+ if ./example; then \
+ echo ' *** zlib test OK ***'; \
+ else \
+ echo ' *** zlib test FAILED ***'; \
+ fi
+
+$(ZLIB): $(OBJS)
+ $(AR) $@ $(OBJS)
+ -@ ($(RANLIB) $@ || true) >/dev/null 2>&1
+
+$(SHAREDLIB): $(OBJS) os2/z.def
+ $(LDSHARED) -o $@ $^
+
+$(SHAREDLIBIMP): os2/z.def
+ $(IMPLIB) -o $@ $^
+
+example.exe: example.o $(LIBS)
+ $(CC) $(CFLAGS) -o $@ example.o $(LDFLAGS)
+
+minigzip.exe: minigzip.o $(LIBS)
+ $(CC) $(CFLAGS) -o $@ minigzip.o $(LDFLAGS)
+
+clean:
+ rm -f *.o *~ example minigzip libz.a libz.so* foo.gz
+
+distclean: clean
+
+zip:
+ mv Makefile Makefile~; cp -p Makefile.in Makefile
+ rm -f test.c ztest*.c
+ v=`sed -n -e 's/\.//g' -e '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`;\
+ zip -ul9 zlib$$v $(DISTFILES)
+ mv Makefile~ Makefile
+
+dist:
+ mv Makefile Makefile~; cp -p Makefile.in Makefile
+ rm -f test.c ztest*.c
+ d=zlib-`sed -n '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`;\
+ rm -f $$d.tar.gz; \
+ if test ! -d ../$$d; then rm -f ../$$d; ln -s `pwd` ../$$d; fi; \
+ files=""; \
+ for f in $(DISTFILES); do files="$$files $$d/$$f"; done; \
+ cd ..; \
+ GZIP=-9 $(TAR) chofz $$d/$$d.tar.gz $$files; \
+ if test ! -d $$d; then rm -f $$d; fi
+ mv Makefile~ Makefile
+
+tags:
+ etags *.[ch]
+
+depend:
+ makedepend -- $(CFLAGS) -- *.[ch]
+
+# DO NOT DELETE THIS LINE -- make depend depends on it.
+
+adler32.o: zlib.h zconf.h
+compress.o: zlib.h zconf.h
+crc32.o: zlib.h zconf.h
+deflate.o: deflate.h zutil.h zlib.h zconf.h
+example.o: zlib.h zconf.h
+gzio.o: zutil.h zlib.h zconf.h
+infblock.o: infblock.h inftrees.h infcodes.h infutil.h zutil.h zlib.h zconf.h
+infcodes.o: zutil.h zlib.h zconf.h
+infcodes.o: inftrees.h infblock.h infcodes.h infutil.h inffast.h
+inffast.o: zutil.h zlib.h zconf.h inftrees.h
+inffast.o: infblock.h infcodes.h infutil.h inffast.h
+inflate.o: zutil.h zlib.h zconf.h infblock.h
+inftrees.o: zutil.h zlib.h zconf.h inftrees.h
+infutil.o: zutil.h zlib.h zconf.h infblock.h inftrees.h infcodes.h infutil.h
+minigzip.o: zlib.h zconf.h
+trees.o: deflate.h zutil.h zlib.h zconf.h trees.h
+uncompr.o: zlib.h zconf.h
+zutil.o: zutil.h zlib.h zconf.h
diff --git a/zlib/os2/zlib.def b/zlib/os2/zlib.def
new file mode 100644
index 00000000000..4c753f1a3b9
--- /dev/null
+++ b/zlib/os2/zlib.def
@@ -0,0 +1,51 @@
+;
+; Slightly modified version of ../nt/zlib.dnt :-)
+;
+
+LIBRARY Z
+DESCRIPTION "Zlib compression library for OS/2"
+CODE PRELOAD MOVEABLE DISCARDABLE
+DATA PRELOAD MOVEABLE MULTIPLE
+
+EXPORTS
+ adler32
+ compress
+ crc32
+ deflate
+ deflateCopy
+ deflateEnd
+ deflateInit2_
+ deflateInit_
+ deflateParams
+ deflateReset
+ deflateSetDictionary
+ gzclose
+ gzdopen
+ gzerror
+ gzflush
+ gzopen
+ gzread
+ gzwrite
+ inflate
+ inflateEnd
+ inflateInit2_
+ inflateInit_
+ inflateReset
+ inflateSetDictionary
+ inflateSync
+ uncompress
+ zlibVersion
+ gzprintf
+ gzputc
+ gzgetc
+ gzseek
+ gzrewind
+ gztell
+ gzeof
+ gzsetparams
+ zError
+ inflateSyncPoint
+ get_crc_table
+ compress2
+ gzputs
+ gzgets
diff --git a/zlib/trees.c b/zlib/trees.c
new file mode 100644
index 00000000000..f01fb30d855
--- /dev/null
+++ b/zlib/trees.c
@@ -0,0 +1,1214 @@
+/* trees.c -- output deflated data using Huffman coding
+ * Copyright (C) 1995-1998 Jean-loup Gailly
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/*
+ * ALGORITHM
+ *
+ * The "deflation" process uses several Huffman trees. The more
+ * common source values are represented by shorter bit sequences.
+ *
+ * Each code tree is stored in a compressed form which is itself
+ * a Huffman encoding of the lengths of all the code strings (in
+ * ascending order by source values). The actual code strings are
+ * reconstructed from the lengths in the inflate process, as described
+ * in the deflate specification.
+ *
+ * REFERENCES
+ *
+ * Deutsch, L.P.,"'Deflate' Compressed Data Format Specification".
+ * Available in ftp.uu.net:/pub/archiving/zip/doc/deflate-1.1.doc
+ *
+ * Storer, James A.
+ * Data Compression: Methods and Theory, pp. 49-50.
+ * Computer Science Press, 1988. ISBN 0-7167-8156-5.
+ *
+ * Sedgewick, R.
+ * Algorithms, p290.
+ * Addison-Wesley, 1983. ISBN 0-201-06672-6.
+ */
+
+/* @(#) $Id$ */
+
+/* #define GEN_TREES_H */
+
+#include "deflate.h"
+
+#ifdef DEBUG
+# include <ctype.h>
+#endif
+
+/* ===========================================================================
+ * Constants
+ */
+
+#define MAX_BL_BITS 7
+/* Bit length codes must not exceed MAX_BL_BITS bits */
+
+#define END_BLOCK 256
+/* end of block literal code */
+
+#define REP_3_6 16
+/* repeat previous bit length 3-6 times (2 bits of repeat count) */
+
+#define REPZ_3_10 17
+/* repeat a zero length 3-10 times (3 bits of repeat count) */
+
+#define REPZ_11_138 18
+/* repeat a zero length 11-138 times (7 bits of repeat count) */
+
+local const int extra_lbits[LENGTH_CODES] /* extra bits for each length code */
+ = {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0};
+
+local const int extra_dbits[D_CODES] /* extra bits for each distance code */
+ = {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13};
+
+local const int extra_blbits[BL_CODES]/* extra bits for each bit length code */
+ = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7};
+
+local const uch bl_order[BL_CODES]
+ = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15};
+/* The lengths of the bit length codes are sent in order of decreasing
+ * probability, to avoid transmitting the lengths for unused bit length codes.
+ */
+
+#define Buf_size (8 * 2*sizeof(char))
+/* Number of bits used within bi_buf. (bi_buf might be implemented on
+ * more than 16 bits on some systems.)
+ */
+
+/* ===========================================================================
+ * Local data. These are initialized only once.
+ */
+
+#define DIST_CODE_LEN 512 /* see definition of array dist_code below */
+
+#if defined(GEN_TREES_H) || !defined(STDC)
+/* non ANSI compilers may not accept trees.h */
+
+local ct_data static_ltree[L_CODES+2];
+/* The static literal tree. Since the bit lengths are imposed, there is no
+ * need for the L_CODES extra codes used during heap construction. However
+ * The codes 286 and 287 are needed to build a canonical tree (see _tr_init
+ * below).
+ */
+
+local ct_data static_dtree[D_CODES];
+/* The static distance tree. (Actually a trivial tree since all codes use
+ * 5 bits.)
+ */
+
+uch _dist_code[DIST_CODE_LEN];
+/* Distance codes. The first 256 values correspond to the distances
+ * 3 .. 258, the last 256 values correspond to the top 8 bits of
+ * the 15 bit distances.
+ */
+
+uch _length_code[MAX_MATCH-MIN_MATCH+1];
+/* length code for each normalized match length (0 == MIN_MATCH) */
+
+local int base_length[LENGTH_CODES];
+/* First normalized length for each code (0 = MIN_MATCH) */
+
+local int base_dist[D_CODES];
+/* First normalized distance for each code (0 = distance of 1) */
+
+#else
+# include "trees.h"
+#endif /* GEN_TREES_H */
+
+struct static_tree_desc_s {
+ const ct_data *static_tree; /* static tree or NULL */
+ const intf *extra_bits; /* extra bits for each code or NULL */
+ int extra_base; /* base index for extra_bits */
+ int elems; /* max number of elements in the tree */
+ int max_length; /* max bit length for the codes */
+};
+
+local static_tree_desc static_l_desc =
+{static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS};
+
+local static_tree_desc static_d_desc =
+{static_dtree, extra_dbits, 0, D_CODES, MAX_BITS};
+
+local static_tree_desc static_bl_desc =
+{(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS};
+
+/* ===========================================================================
+ * Local (static) routines in this file.
+ */
+
+local void tr_static_init OF((void));
+local void init_block OF((deflate_state *s));
+local void pqdownheap OF((deflate_state *s, ct_data *tree, int k));
+local void gen_bitlen OF((deflate_state *s, tree_desc *desc));
+local void gen_codes OF((ct_data *tree, int max_code, ushf *bl_count));
+local void build_tree OF((deflate_state *s, tree_desc *desc));
+local void scan_tree OF((deflate_state *s, ct_data *tree, int max_code));
+local void send_tree OF((deflate_state *s, ct_data *tree, int max_code));
+local int build_bl_tree OF((deflate_state *s));
+local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes,
+ int blcodes));
+local void compress_block OF((deflate_state *s, ct_data *ltree,
+ ct_data *dtree));
+local void set_data_type OF((deflate_state *s));
+local unsigned bi_reverse OF((unsigned value, int length));
+local void bi_windup OF((deflate_state *s));
+local void bi_flush OF((deflate_state *s));
+local void copy_block OF((deflate_state *s, charf *buf, unsigned len,
+ int header));
+
+#ifdef GEN_TREES_H
+local void gen_trees_header OF((void));
+#endif
+
+#ifndef DEBUG
+# define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len)
+ /* Send a code of the given tree. c and tree must not have side effects */
+
+#else /* DEBUG */
+# define send_code(s, c, tree) \
+ { if (z_verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \
+ send_bits(s, tree[c].Code, tree[c].Len); }
+#endif
+
+/* ===========================================================================
+ * Output a short LSB first on the stream.
+ * IN assertion: there is enough room in pendingBuf.
+ */
+#define put_short(s, w) { \
+ put_byte(s, (uch)((w) & 0xff)); \
+ put_byte(s, (uch)((ush)(w) >> 8)); \
+}
+
+/* ===========================================================================
+ * Send a value on a given number of bits.
+ * IN assertion: length <= 16 and value fits in length bits.
+ */
+#ifdef DEBUG
+local void send_bits OF((deflate_state *s, int value, int length));
+
+local void send_bits(s, value, length)
+ deflate_state *s;
+ int value; /* value to send */
+ int length; /* number of bits */
+{
+ Tracevv((stderr," l %2d v %4x ", length, value));
+ Assert(length > 0 && length <= 15, "invalid length");
+ s->bits_sent += (ulg)length;
+
+ /* If not enough room in bi_buf, use (valid) bits from bi_buf and
+ * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid))
+ * unused bits in value.
+ */
+ if (s->bi_valid > (int)Buf_size - length) {
+ s->bi_buf |= (value << s->bi_valid);
+ put_short(s, s->bi_buf);
+ s->bi_buf = (ush)value >> (Buf_size - s->bi_valid);
+ s->bi_valid += length - Buf_size;
+ } else {
+ s->bi_buf |= value << s->bi_valid;
+ s->bi_valid += length;
+ }
+}
+#else /* !DEBUG */
+
+#define send_bits(s, value, length) \
+{ int len = length;\
+ if (s->bi_valid > (int)Buf_size - len) {\
+ int val = value;\
+ s->bi_buf |= (val << s->bi_valid);\
+ put_short(s, s->bi_buf);\
+ s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\
+ s->bi_valid += len - Buf_size;\
+ } else {\
+ s->bi_buf |= (value) << s->bi_valid;\
+ s->bi_valid += len;\
+ }\
+}
+#endif /* DEBUG */
+
+
+#define MAX(a,b) (a >= b ? a : b)
+/* the arguments must not have side effects */
+
+/* ===========================================================================
+ * Initialize the various 'constant' tables.
+ */
+local void tr_static_init()
+{
+#if defined(GEN_TREES_H) || !defined(STDC)
+ static int static_init_done = 0;
+ int n; /* iterates over tree elements */
+ int bits; /* bit counter */
+ int length; /* length value */
+ int code; /* code value */
+ int dist; /* distance index */
+ ush bl_count[MAX_BITS+1];
+ /* number of codes at each bit length for an optimal tree */
+
+ if (static_init_done) return;
+
+ /* For some embedded targets, global variables are not initialized: */
+ static_l_desc.static_tree = static_ltree;
+ static_l_desc.extra_bits = extra_lbits;
+ static_d_desc.static_tree = static_dtree;
+ static_d_desc.extra_bits = extra_dbits;
+ static_bl_desc.extra_bits = extra_blbits;
+
+ /* Initialize the mapping length (0..255) -> length code (0..28) */
+ length = 0;
+ for (code = 0; code < LENGTH_CODES-1; code++) {
+ base_length[code] = length;
+ for (n = 0; n < (1<<extra_lbits[code]); n++) {
+ _length_code[length++] = (uch)code;
+ }
+ }
+ Assert (length == 256, "tr_static_init: length != 256");
+ /* Note that the length 255 (match length 258) can be represented
+ * in two different ways: code 284 + 5 bits or code 285, so we
+ * overwrite length_code[255] to use the best encoding:
+ */
+ _length_code[length-1] = (uch)code;
+
+ /* Initialize the mapping dist (0..32K) -> dist code (0..29) */
+ dist = 0;
+ for (code = 0 ; code < 16; code++) {
+ base_dist[code] = dist;
+ for (n = 0; n < (1<<extra_dbits[code]); n++) {
+ _dist_code[dist++] = (uch)code;
+ }
+ }
+ Assert (dist == 256, "tr_static_init: dist != 256");
+ dist >>= 7; /* from now on, all distances are divided by 128 */
+ for ( ; code < D_CODES; code++) {
+ base_dist[code] = dist << 7;
+ for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) {
+ _dist_code[256 + dist++] = (uch)code;
+ }
+ }
+ Assert (dist == 256, "tr_static_init: 256+dist != 512");
+
+ /* Construct the codes of the static literal tree */
+ for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0;
+ n = 0;
+ while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++;
+ while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++;
+ while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++;
+ while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++;
+ /* Codes 286 and 287 do not exist, but we must include them in the
+ * tree construction to get a canonical Huffman tree (longest code
+ * all ones)
+ */
+ gen_codes((ct_data *)static_ltree, L_CODES+1, bl_count);
+
+ /* The static distance tree is trivial: */
+ for (n = 0; n < D_CODES; n++) {
+ static_dtree[n].Len = 5;
+ static_dtree[n].Code = bi_reverse((unsigned)n, 5);
+ }
+ static_init_done = 1;
+
+# ifdef GEN_TREES_H
+ gen_trees_header();
+# endif
+#endif /* defined(GEN_TREES_H) || !defined(STDC) */
+}
+
+/* ===========================================================================
+ * Genererate the file trees.h describing the static trees.
+ */
+#ifdef GEN_TREES_H
+# ifndef DEBUG
+# include <stdio.h>
+# endif
+
+# define SEPARATOR(i, last, width) \
+ ((i) == (last)? "\n};\n\n" : \
+ ((i) % (width) == (width)-1 ? ",\n" : ", "))
+
+void gen_trees_header()
+{
+ FILE *header = fopen("trees.h", "w");
+ int i;
+
+ Assert (header != NULL, "Can't open trees.h");
+ fprintf(header,
+ "/* header created automatically with -DGEN_TREES_H */\n\n");
+
+ fprintf(header, "local const ct_data static_ltree[L_CODES+2] = {\n");
+ for (i = 0; i < L_CODES+2; i++) {
+ fprintf(header, "{{%3u},{%3u}}%s", static_ltree[i].Code,
+ static_ltree[i].Len, SEPARATOR(i, L_CODES+1, 5));
+ }
+
+ fprintf(header, "local const ct_data static_dtree[D_CODES] = {\n");
+ for (i = 0; i < D_CODES; i++) {
+ fprintf(header, "{{%2u},{%2u}}%s", static_dtree[i].Code,
+ static_dtree[i].Len, SEPARATOR(i, D_CODES-1, 5));
+ }
+
+ fprintf(header, "const uch _dist_code[DIST_CODE_LEN] = {\n");
+ for (i = 0; i < DIST_CODE_LEN; i++) {
+ fprintf(header, "%2u%s", _dist_code[i],
+ SEPARATOR(i, DIST_CODE_LEN-1, 20));
+ }
+
+ fprintf(header, "const uch _length_code[MAX_MATCH-MIN_MATCH+1]= {\n");
+ for (i = 0; i < MAX_MATCH-MIN_MATCH+1; i++) {
+ fprintf(header, "%2u%s", _length_code[i],
+ SEPARATOR(i, MAX_MATCH-MIN_MATCH, 20));
+ }
+
+ fprintf(header, "local const int base_length[LENGTH_CODES] = {\n");
+ for (i = 0; i < LENGTH_CODES; i++) {
+ fprintf(header, "%1u%s", base_length[i],
+ SEPARATOR(i, LENGTH_CODES-1, 20));
+ }
+
+ fprintf(header, "local const int base_dist[D_CODES] = {\n");
+ for (i = 0; i < D_CODES; i++) {
+ fprintf(header, "%5u%s", base_dist[i],
+ SEPARATOR(i, D_CODES-1, 10));
+ }
+
+ fclose(header);
+}
+#endif /* GEN_TREES_H */
+
+/* ===========================================================================
+ * Initialize the tree data structures for a new zlib stream.
+ */
+void _tr_init(s)
+ deflate_state *s;
+{
+ tr_static_init();
+
+ s->l_desc.dyn_tree = s->dyn_ltree;
+ s->l_desc.stat_desc = &static_l_desc;
+
+ s->d_desc.dyn_tree = s->dyn_dtree;
+ s->d_desc.stat_desc = &static_d_desc;
+
+ s->bl_desc.dyn_tree = s->bl_tree;
+ s->bl_desc.stat_desc = &static_bl_desc;
+
+ s->bi_buf = 0;
+ s->bi_valid = 0;
+ s->last_eob_len = 8; /* enough lookahead for inflate */
+#ifdef DEBUG
+ s->compressed_len = 0L;
+ s->bits_sent = 0L;
+#endif
+
+ /* Initialize the first block of the first file: */
+ init_block(s);
+}
+
+/* ===========================================================================
+ * Initialize a new block.
+ */
+local void init_block(s)
+ deflate_state *s;
+{
+ int n; /* iterates over tree elements */
+
+ /* Initialize the trees. */
+ for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0;
+ for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0;
+ for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0;
+
+ s->dyn_ltree[END_BLOCK].Freq = 1;
+ s->opt_len = s->static_len = 0L;
+ s->last_lit = s->matches = 0;
+}
+
+#define SMALLEST 1
+/* Index within the heap array of least frequent node in the Huffman tree */
+
+
+/* ===========================================================================
+ * Remove the smallest element from the heap and recreate the heap with
+ * one less element. Updates heap and heap_len.
+ */
+#define pqremove(s, tree, top) \
+{\
+ top = s->heap[SMALLEST]; \
+ s->heap[SMALLEST] = s->heap[s->heap_len--]; \
+ pqdownheap(s, tree, SMALLEST); \
+}
+
+/* ===========================================================================
+ * Compares to subtrees, using the tree depth as tie breaker when
+ * the subtrees have equal frequency. This minimizes the worst case length.
+ */
+#define smaller(tree, n, m, depth) \
+ (tree[n].Freq < tree[m].Freq || \
+ (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m]))
+
+/* ===========================================================================
+ * Restore the heap property by moving down the tree starting at node k,
+ * exchanging a node with the smallest of its two sons if necessary, stopping
+ * when the heap property is re-established (each father smaller than its
+ * two sons).
+ */
+local void pqdownheap(s, tree, k)
+ deflate_state *s;
+ ct_data *tree; /* the tree to restore */
+ int k; /* node to move down */
+{
+ int v = s->heap[k];
+ int j = k << 1; /* left son of k */
+ while (j <= s->heap_len) {
+ /* Set j to the smallest of the two sons: */
+ if (j < s->heap_len &&
+ smaller(tree, s->heap[j+1], s->heap[j], s->depth)) {
+ j++;
+ }
+ /* Exit if v is smaller than both sons */
+ if (smaller(tree, v, s->heap[j], s->depth)) break;
+
+ /* Exchange v with the smallest son */
+ s->heap[k] = s->heap[j]; k = j;
+
+ /* And continue down the tree, setting j to the left son of k */
+ j <<= 1;
+ }
+ s->heap[k] = v;
+}
+
+/* ===========================================================================
+ * Compute the optimal bit lengths for a tree and update the total bit length
+ * for the current block.
+ * IN assertion: the fields freq and dad are set, heap[heap_max] and
+ * above are the tree nodes sorted by increasing frequency.
+ * OUT assertions: the field len is set to the optimal bit length, the
+ * array bl_count contains the frequencies for each bit length.
+ * The length opt_len is updated; static_len is also updated if stree is
+ * not null.
+ */
+local void gen_bitlen(s, desc)
+ deflate_state *s;
+ tree_desc *desc; /* the tree descriptor */
+{
+ ct_data *tree = desc->dyn_tree;
+ int max_code = desc->max_code;
+ const ct_data *stree = desc->stat_desc->static_tree;
+ const intf *extra = desc->stat_desc->extra_bits;
+ int base = desc->stat_desc->extra_base;
+ int max_length = desc->stat_desc->max_length;
+ int h; /* heap index */
+ int n, m; /* iterate over the tree elements */
+ int bits; /* bit length */
+ int xbits; /* extra bits */
+ ush f; /* frequency */
+ int overflow = 0; /* number of elements with bit length too large */
+
+ for (bits = 0; bits <= MAX_BITS; bits++) s->bl_count[bits] = 0;
+
+ /* In a first pass, compute the optimal bit lengths (which may
+ * overflow in the case of the bit length tree).
+ */
+ tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */
+
+ for (h = s->heap_max+1; h < HEAP_SIZE; h++) {
+ n = s->heap[h];
+ bits = tree[tree[n].Dad].Len + 1;
+ if (bits > max_length) bits = max_length, overflow++;
+ tree[n].Len = (ush)bits;
+ /* We overwrite tree[n].Dad which is no longer needed */
+
+ if (n > max_code) continue; /* not a leaf node */
+
+ s->bl_count[bits]++;
+ xbits = 0;
+ if (n >= base) xbits = extra[n-base];
+ f = tree[n].Freq;
+ s->opt_len += (ulg)f * (bits + xbits);
+ if (stree) s->static_len += (ulg)f * (stree[n].Len + xbits);
+ }
+ if (overflow == 0) return;
+
+ Trace((stderr,"\nbit length overflow\n"));
+ /* This happens for example on obj2 and pic of the Calgary corpus */
+
+ /* Find the first bit length which could increase: */
+ do {
+ bits = max_length-1;
+ while (s->bl_count[bits] == 0) bits--;
+ s->bl_count[bits]--; /* move one leaf down the tree */
+ s->bl_count[bits+1] += 2; /* move one overflow item as its brother */
+ s->bl_count[max_length]--;
+ /* The brother of the overflow item also moves one step up,
+ * but this does not affect bl_count[max_length]
+ */
+ overflow -= 2;
+ } while (overflow > 0);
+
+ /* Now recompute all bit lengths, scanning in increasing frequency.
+ * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all
+ * lengths instead of fixing only the wrong ones. This idea is taken
+ * from 'ar' written by Haruhiko Okumura.)
+ */
+ for (bits = max_length; bits != 0; bits--) {
+ n = s->bl_count[bits];
+ while (n != 0) {
+ m = s->heap[--h];
+ if (m > max_code) continue;
+ if (tree[m].Len != (unsigned) bits) {
+ Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits));
+ s->opt_len += ((long)bits - (long)tree[m].Len)
+ *(long)tree[m].Freq;
+ tree[m].Len = (ush)bits;
+ }
+ n--;
+ }
+ }
+}
+
+/* ===========================================================================
+ * Generate the codes for a given tree and bit counts (which need not be
+ * optimal).
+ * IN assertion: the array bl_count contains the bit length statistics for
+ * the given tree and the field len is set for all tree elements.
+ * OUT assertion: the field code is set for all tree elements of non
+ * zero code length.
+ */
+local void gen_codes (tree, max_code, bl_count)
+ ct_data *tree; /* the tree to decorate */
+ int max_code; /* largest code with non zero frequency */
+ ushf *bl_count; /* number of codes at each bit length */
+{
+ ush next_code[MAX_BITS+1]; /* next code value for each bit length */
+ ush code = 0; /* running code value */
+ int bits; /* bit index */
+ int n; /* code index */
+
+ /* The distribution counts are first used to generate the code values
+ * without bit reversal.
+ */
+ for (bits = 1; bits <= MAX_BITS; bits++) {
+ next_code[bits] = code = (code + bl_count[bits-1]) << 1;
+ }
+ /* Check that the bit counts in bl_count are consistent. The last code
+ * must be all ones.
+ */
+ Assert (code + bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1,
+ "inconsistent bit counts");
+ Tracev((stderr,"\ngen_codes: max_code %d ", max_code));
+
+ for (n = 0; n <= max_code; n++) {
+ int len = tree[n].Len;
+ if (len == 0) continue;
+ /* Now reverse the bits */
+ tree[n].Code = bi_reverse(next_code[len]++, len);
+
+ Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ",
+ n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1));
+ }
+}
+
+/* ===========================================================================
+ * Construct one Huffman tree and assigns the code bit strings and lengths.
+ * Update the total bit length for the current block.
+ * IN assertion: the field freq is set for all tree elements.
+ * OUT assertions: the fields len and code are set to the optimal bit length
+ * and corresponding code. The length opt_len is updated; static_len is
+ * also updated if stree is not null. The field max_code is set.
+ */
+local void build_tree(s, desc)
+ deflate_state *s;
+ tree_desc *desc; /* the tree descriptor */
+{
+ ct_data *tree = desc->dyn_tree;
+ const ct_data *stree = desc->stat_desc->static_tree;
+ int elems = desc->stat_desc->elems;
+ int n, m; /* iterate over heap elements */
+ int max_code = -1; /* largest code with non zero frequency */
+ int node; /* new node being created */
+
+ /* Construct the initial heap, with least frequent element in
+ * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].
+ * heap[0] is not used.
+ */
+ s->heap_len = 0, s->heap_max = HEAP_SIZE;
+
+ for (n = 0; n < elems; n++) {
+ if (tree[n].Freq != 0) {
+ s->heap[++(s->heap_len)] = max_code = n;
+ s->depth[n] = 0;
+ } else {
+ tree[n].Len = 0;
+ }
+ }
+
+ /* The pkzip format requires that at least one distance code exists,
+ * and that at least one bit should be sent even if there is only one
+ * possible code. So to avoid special checks later on we force at least
+ * two codes of non zero frequency.
+ */
+ while (s->heap_len < 2) {
+ node = s->heap[++(s->heap_len)] = (max_code < 2 ? ++max_code : 0);
+ tree[node].Freq = 1;
+ s->depth[node] = 0;
+ s->opt_len--; if (stree) s->static_len -= stree[node].Len;
+ /* node is 0 or 1 so it does not have extra bits */
+ }
+ desc->max_code = max_code;
+
+ /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,
+ * establish sub-heaps of increasing lengths:
+ */
+ for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n);
+
+ /* Construct the Huffman tree by repeatedly combining the least two
+ * frequent nodes.
+ */
+ node = elems; /* next internal node of the tree */
+ do {
+ pqremove(s, tree, n); /* n = node of least frequency */
+ m = s->heap[SMALLEST]; /* m = node of next least frequency */
+
+ s->heap[--(s->heap_max)] = n; /* keep the nodes sorted by frequency */
+ s->heap[--(s->heap_max)] = m;
+
+ /* Create a new node father of n and m */
+ tree[node].Freq = tree[n].Freq + tree[m].Freq;
+ s->depth[node] = (uch) (MAX(s->depth[n], s->depth[m]) + 1);
+ tree[n].Dad = tree[m].Dad = (ush)node;
+#ifdef DUMP_BL_TREE
+ if (tree == s->bl_tree) {
+ fprintf(stderr,"\nnode %d(%d), sons %d(%d) %d(%d)",
+ node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq);
+ }
+#endif
+ /* and insert the new node in the heap */
+ s->heap[SMALLEST] = node++;
+ pqdownheap(s, tree, SMALLEST);
+
+ } while (s->heap_len >= 2);
+
+ s->heap[--(s->heap_max)] = s->heap[SMALLEST];
+
+ /* At this point, the fields freq and dad are set. We can now
+ * generate the bit lengths.
+ */
+ gen_bitlen(s, (tree_desc *)desc);
+
+ /* The field len is now set, we can generate the bit codes */
+ gen_codes ((ct_data *)tree, max_code, s->bl_count);
+}
+
+/* ===========================================================================
+ * Scan a literal or distance tree to determine the frequencies of the codes
+ * in the bit length tree.
+ */
+local void scan_tree (s, tree, max_code)
+ deflate_state *s;
+ ct_data *tree; /* the tree to be scanned */
+ int max_code; /* and its largest code of non zero frequency */
+{
+ int n; /* iterates over all tree elements */
+ int prevlen = -1; /* last emitted length */
+ int curlen; /* length of current code */
+ int nextlen = tree[0].Len; /* length of next code */
+ int count = 0; /* repeat count of the current code */
+ int max_count = 7; /* max repeat count */
+ int min_count = 4; /* min repeat count */
+
+ if (nextlen == 0) max_count = 138, min_count = 3;
+ tree[max_code+1].Len = (ush)0xffff; /* guard */
+
+ for (n = 0; n <= max_code; n++) {
+ curlen = nextlen; nextlen = tree[n+1].Len;
+ if (++count < max_count && curlen == nextlen) {
+ continue;
+ } else if (count < min_count) {
+ s->bl_tree[curlen].Freq += count;
+ } else if (curlen != 0) {
+ if (curlen != prevlen) s->bl_tree[curlen].Freq++;
+ s->bl_tree[REP_3_6].Freq++;
+ } else if (count <= 10) {
+ s->bl_tree[REPZ_3_10].Freq++;
+ } else {
+ s->bl_tree[REPZ_11_138].Freq++;
+ }
+ count = 0; prevlen = curlen;
+ if (nextlen == 0) {
+ max_count = 138, min_count = 3;
+ } else if (curlen == nextlen) {
+ max_count = 6, min_count = 3;
+ } else {
+ max_count = 7, min_count = 4;
+ }
+ }
+}
+
+/* ===========================================================================
+ * Send a literal or distance tree in compressed form, using the codes in
+ * bl_tree.
+ */
+local void send_tree (s, tree, max_code)
+ deflate_state *s;
+ ct_data *tree; /* the tree to be scanned */
+ int max_code; /* and its largest code of non zero frequency */
+{
+ int n; /* iterates over all tree elements */
+ int prevlen = -1; /* last emitted length */
+ int curlen; /* length of current code */
+ int nextlen = tree[0].Len; /* length of next code */
+ int count = 0; /* repeat count of the current code */
+ int max_count = 7; /* max repeat count */
+ int min_count = 4; /* min repeat count */
+
+ /* tree[max_code+1].Len = -1; */ /* guard already set */
+ if (nextlen == 0) max_count = 138, min_count = 3;
+
+ for (n = 0; n <= max_code; n++) {
+ curlen = nextlen; nextlen = tree[n+1].Len;
+ if (++count < max_count && curlen == nextlen) {
+ continue;
+ } else if (count < min_count) {
+ do { send_code(s, curlen, s->bl_tree); } while (--count != 0);
+
+ } else if (curlen != 0) {
+ if (curlen != prevlen) {
+ send_code(s, curlen, s->bl_tree); count--;
+ }
+ Assert(count >= 3 && count <= 6, " 3_6?");
+ send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2);
+
+ } else if (count <= 10) {
+ send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3);
+
+ } else {
+ send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7);
+ }
+ count = 0; prevlen = curlen;
+ if (nextlen == 0) {
+ max_count = 138, min_count = 3;
+ } else if (curlen == nextlen) {
+ max_count = 6, min_count = 3;
+ } else {
+ max_count = 7, min_count = 4;
+ }
+ }
+}
+
+/* ===========================================================================
+ * Construct the Huffman tree for the bit lengths and return the index in
+ * bl_order of the last bit length code to send.
+ */
+local int build_bl_tree(s)
+ deflate_state *s;
+{
+ int max_blindex; /* index of last bit length code of non zero freq */
+
+ /* Determine the bit length frequencies for literal and distance trees */
+ scan_tree(s, (ct_data *)s->dyn_ltree, s->l_desc.max_code);
+ scan_tree(s, (ct_data *)s->dyn_dtree, s->d_desc.max_code);
+
+ /* Build the bit length tree: */
+ build_tree(s, (tree_desc *)(&(s->bl_desc)));
+ /* opt_len now includes the length of the tree representations, except
+ * the lengths of the bit lengths codes and the 5+5+4 bits for the counts.
+ */
+
+ /* Determine the number of bit length codes to send. The pkzip format
+ * requires that at least 4 bit length codes be sent. (appnote.txt says
+ * 3 but the actual value used is 4.)
+ */
+ for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) {
+ if (s->bl_tree[bl_order[max_blindex]].Len != 0) break;
+ }
+ /* Update opt_len to include the bit length tree and counts */
+ s->opt_len += 3*(max_blindex+1) + 5+5+4;
+ Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld",
+ s->opt_len, s->static_len));
+
+ return max_blindex;
+}
+
+/* ===========================================================================
+ * Send the header for a block using dynamic Huffman trees: the counts, the
+ * lengths of the bit length codes, the literal tree and the distance tree.
+ * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.
+ */
+local void send_all_trees(s, lcodes, dcodes, blcodes)
+ deflate_state *s;
+ int lcodes, dcodes, blcodes; /* number of codes for each tree */
+{
+ int rank; /* index in bl_order */
+
+ Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes");
+ Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,
+ "too many codes");
+ Tracev((stderr, "\nbl counts: "));
+ send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */
+ send_bits(s, dcodes-1, 5);
+ send_bits(s, blcodes-4, 4); /* not -3 as stated in appnote.txt */
+ for (rank = 0; rank < blcodes; rank++) {
+ Tracev((stderr, "\nbl code %2d ", bl_order[rank]));
+ send_bits(s, s->bl_tree[bl_order[rank]].Len, 3);
+ }
+ Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent));
+
+ send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */
+ Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent));
+
+ send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */
+ Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent));
+}
+
+/* ===========================================================================
+ * Send a stored block
+ */
+void _tr_stored_block(s, buf, stored_len, eof)
+ deflate_state *s;
+ charf *buf; /* input block */
+ ulg stored_len; /* length of input block */
+ int eof; /* true if this is the last block for a file */
+{
+ send_bits(s, (STORED_BLOCK<<1)+eof, 3); /* send block type */
+#ifdef DEBUG
+ s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L;
+ s->compressed_len += (stored_len + 4) << 3;
+#endif
+ copy_block(s, buf, (unsigned)stored_len, 1); /* with header */
+}
+
+/* ===========================================================================
+ * Send one empty static block to give enough lookahead for inflate.
+ * This takes 10 bits, of which 7 may remain in the bit buffer.
+ * The current inflate code requires 9 bits of lookahead. If the
+ * last two codes for the previous block (real code plus EOB) were coded
+ * on 5 bits or less, inflate may have only 5+3 bits of lookahead to decode
+ * the last real code. In this case we send two empty static blocks instead
+ * of one. (There are no problems if the previous block is stored or fixed.)
+ * To simplify the code, we assume the worst case of last real code encoded
+ * on one bit only.
+ */
+void _tr_align(s)
+ deflate_state *s;
+{
+ send_bits(s, STATIC_TREES<<1, 3);
+ send_code(s, END_BLOCK, static_ltree);
+#ifdef DEBUG
+ s->compressed_len += 10L; /* 3 for block type, 7 for EOB */
+#endif
+ bi_flush(s);
+ /* Of the 10 bits for the empty block, we have already sent
+ * (10 - bi_valid) bits. The lookahead for the last real code (before
+ * the EOB of the previous block) was thus at least one plus the length
+ * of the EOB plus what we have just sent of the empty static block.
+ */
+ if (1 + s->last_eob_len + 10 - s->bi_valid < 9) {
+ send_bits(s, STATIC_TREES<<1, 3);
+ send_code(s, END_BLOCK, static_ltree);
+#ifdef DEBUG
+ s->compressed_len += 10L;
+#endif
+ bi_flush(s);
+ }
+ s->last_eob_len = 7;
+}
+
+/* ===========================================================================
+ * Determine the best encoding for the current block: dynamic trees, static
+ * trees or store, and output the encoded block to the zip file.
+ */
+void _tr_flush_block(s, buf, stored_len, eof)
+ deflate_state *s;
+ charf *buf; /* input block, or NULL if too old */
+ ulg stored_len; /* length of input block */
+ int eof; /* true if this is the last block for a file */
+{
+ ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */
+ int max_blindex = 0; /* index of last bit length code of non zero freq */
+
+ /* Build the Huffman trees unless a stored block is forced */
+ if (s->level > 0) {
+
+ /* Check if the file is ascii or binary */
+ if (s->data_type == Z_UNKNOWN) set_data_type(s);
+
+ /* Construct the literal and distance trees */
+ build_tree(s, (tree_desc *)(&(s->l_desc)));
+ Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len,
+ s->static_len));
+
+ build_tree(s, (tree_desc *)(&(s->d_desc)));
+ Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len,
+ s->static_len));
+ /* At this point, opt_len and static_len are the total bit lengths of
+ * the compressed block data, excluding the tree representations.
+ */
+
+ /* Build the bit length tree for the above two trees, and get the index
+ * in bl_order of the last bit length code to send.
+ */
+ max_blindex = build_bl_tree(s);
+
+ /* Determine the best encoding. Compute first the block length in bytes*/
+ opt_lenb = (s->opt_len+3+7)>>3;
+ static_lenb = (s->static_len+3+7)>>3;
+
+ Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ",
+ opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,
+ s->last_lit));
+
+ if (static_lenb <= opt_lenb) opt_lenb = static_lenb;
+
+ } else {
+ Assert(buf != (char*)0, "lost buf");
+ opt_lenb = static_lenb = stored_len + 5; /* force a stored block */
+ }
+
+#ifdef FORCE_STORED
+ if (buf != (char*)0) { /* force stored block */
+#else
+ if (stored_len+4 <= opt_lenb && buf != (char*)0) {
+ /* 4: two words for the lengths */
+#endif
+ /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.
+ * Otherwise we can't have processed more than WSIZE input bytes since
+ * the last block flush, because compression would have been
+ * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to
+ * transform a block into a stored block.
+ */
+ _tr_stored_block(s, buf, stored_len, eof);
+
+#ifdef FORCE_STATIC
+ } else if (static_lenb >= 0) { /* force static trees */
+#else
+ } else if (static_lenb == opt_lenb) {
+#endif
+ send_bits(s, (STATIC_TREES<<1)+eof, 3);
+ compress_block(s, (ct_data *)static_ltree, (ct_data *)static_dtree);
+#ifdef DEBUG
+ s->compressed_len += 3 + s->static_len;
+#endif
+ } else {
+ send_bits(s, (DYN_TREES<<1)+eof, 3);
+ send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1,
+ max_blindex+1);
+ compress_block(s, (ct_data *)s->dyn_ltree, (ct_data *)s->dyn_dtree);
+#ifdef DEBUG
+ s->compressed_len += 3 + s->opt_len;
+#endif
+ }
+ Assert (s->compressed_len == s->bits_sent, "bad compressed size");
+ /* The above check is made mod 2^32, for files larger than 512 MB
+ * and uLong implemented on 32 bits.
+ */
+ init_block(s);
+
+ if (eof) {
+ bi_windup(s);
+#ifdef DEBUG
+ s->compressed_len += 7; /* align on byte boundary */
+#endif
+ }
+ Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3,
+ s->compressed_len-7*eof));
+}
+
+/* ===========================================================================
+ * Save the match info and tally the frequency counts. Return true if
+ * the current block must be flushed.
+ */
+int _tr_tally (s, dist, lc)
+ deflate_state *s;
+ unsigned dist; /* distance of matched string */
+ unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */
+{
+ s->d_buf[s->last_lit] = (ush)dist;
+ s->l_buf[s->last_lit++] = (uch)lc;
+ if (dist == 0) {
+ /* lc is the unmatched char */
+ s->dyn_ltree[lc].Freq++;
+ } else {
+ s->matches++;
+ /* Here, lc is the match length - MIN_MATCH */
+ dist--; /* dist = match distance - 1 */
+ Assert((ush)dist < (ush)MAX_DIST(s) &&
+ (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&
+ (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match");
+
+ s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++;
+ s->dyn_dtree[d_code(dist)].Freq++;
+ }
+
+#ifdef TRUNCATE_BLOCK
+ /* Try to guess if it is profitable to stop the current block here */
+ if ((s->last_lit & 0x1fff) == 0 && s->level > 2) {
+ /* Compute an upper bound for the compressed length */
+ ulg out_length = (ulg)s->last_lit*8L;
+ ulg in_length = (ulg)((long)s->strstart - s->block_start);
+ int dcode;
+ for (dcode = 0; dcode < D_CODES; dcode++) {
+ out_length += (ulg)s->dyn_dtree[dcode].Freq *
+ (5L+extra_dbits[dcode]);
+ }
+ out_length >>= 3;
+ Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ",
+ s->last_lit, in_length, out_length,
+ 100L - out_length*100L/in_length));
+ if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1;
+ }
+#endif
+ return (s->last_lit == s->lit_bufsize-1);
+ /* We avoid equality with lit_bufsize because of wraparound at 64K
+ * on 16 bit machines and because stored blocks are restricted to
+ * 64K-1 bytes.
+ */
+}
+
+/* ===========================================================================
+ * Send the block data compressed using the given Huffman trees
+ */
+local void compress_block(s, ltree, dtree)
+ deflate_state *s;
+ ct_data *ltree; /* literal tree */
+ ct_data *dtree; /* distance tree */
+{
+ unsigned dist; /* distance of matched string */
+ int lc; /* match length or unmatched char (if dist == 0) */
+ unsigned lx = 0; /* running index in l_buf */
+ unsigned code; /* the code to send */
+ int extra; /* number of extra bits to send */
+
+ if (s->last_lit != 0) do {
+ dist = s->d_buf[lx];
+ lc = s->l_buf[lx++];
+ if (dist == 0) {
+ send_code(s, lc, ltree); /* send a literal byte */
+ Tracecv(isgraph(lc), (stderr," '%c' ", lc));
+ } else {
+ /* Here, lc is the match length - MIN_MATCH */
+ code = _length_code[lc];
+ send_code(s, code+LITERALS+1, ltree); /* send the length code */
+ extra = extra_lbits[code];
+ if (extra != 0) {
+ lc -= base_length[code];
+ send_bits(s, lc, extra); /* send the extra length bits */
+ }
+ dist--; /* dist is now the match distance - 1 */
+ code = d_code(dist);
+ Assert (code < D_CODES, "bad d_code");
+
+ send_code(s, code, dtree); /* send the distance code */
+ extra = extra_dbits[code];
+ if (extra != 0) {
+ dist -= base_dist[code];
+ send_bits(s, dist, extra); /* send the extra distance bits */
+ }
+ } /* literal or match pair ? */
+
+ /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */
+ Assert(s->pending < s->lit_bufsize + 2*lx, "pendingBuf overflow");
+
+ } while (lx < s->last_lit);
+
+ send_code(s, END_BLOCK, ltree);
+ s->last_eob_len = ltree[END_BLOCK].Len;
+}
+
+/* ===========================================================================
+ * Set the data type to ASCII or BINARY, using a crude approximation:
+ * binary if more than 20% of the bytes are <= 6 or >= 128, ascii otherwise.
+ * IN assertion: the fields freq of dyn_ltree are set and the total of all
+ * frequencies does not exceed 64K (to fit in an int on 16 bit machines).
+ */
+local void set_data_type(s)
+ deflate_state *s;
+{
+ int n = 0;
+ unsigned ascii_freq = 0;
+ unsigned bin_freq = 0;
+ while (n < 7) bin_freq += s->dyn_ltree[n++].Freq;
+ while (n < 128) ascii_freq += s->dyn_ltree[n++].Freq;
+ while (n < LITERALS) bin_freq += s->dyn_ltree[n++].Freq;
+ s->data_type = (Byte)(bin_freq > (ascii_freq >> 2) ? Z_BINARY : Z_ASCII);
+}
+
+/* ===========================================================================
+ * Reverse the first len bits of a code, using straightforward code (a faster
+ * method would use a table)
+ * IN assertion: 1 <= len <= 15
+ */
+local unsigned bi_reverse(code, len)
+ unsigned code; /* the value to invert */
+ int len; /* its bit length */
+{
+ register unsigned res = 0;
+ do {
+ res |= code & 1;
+ code >>= 1, res <<= 1;
+ } while (--len > 0);
+ return res >> 1;
+}
+
+/* ===========================================================================
+ * Flush the bit buffer, keeping at most 7 bits in it.
+ */
+local void bi_flush(s)
+ deflate_state *s;
+{
+ if (s->bi_valid == 16) {
+ put_short(s, s->bi_buf);
+ s->bi_buf = 0;
+ s->bi_valid = 0;
+ } else if (s->bi_valid >= 8) {
+ put_byte(s, (Byte)s->bi_buf);
+ s->bi_buf >>= 8;
+ s->bi_valid -= 8;
+ }
+}
+
+/* ===========================================================================
+ * Flush the bit buffer and align the output on a byte boundary
+ */
+local void bi_windup(s)
+ deflate_state *s;
+{
+ if (s->bi_valid > 8) {
+ put_short(s, s->bi_buf);
+ } else if (s->bi_valid > 0) {
+ put_byte(s, (Byte)s->bi_buf);
+ }
+ s->bi_buf = 0;
+ s->bi_valid = 0;
+#ifdef DEBUG
+ s->bits_sent = (s->bits_sent+7) & ~7;
+#endif
+}
+
+/* ===========================================================================
+ * Copy a stored block, storing first the length and its
+ * one's complement if requested.
+ */
+local void copy_block(s, buf, len, header)
+ deflate_state *s;
+ charf *buf; /* the input data */
+ unsigned len; /* its length */
+ int header; /* true if block header must be written */
+{
+ bi_windup(s); /* align on byte boundary */
+ s->last_eob_len = 8; /* enough lookahead for inflate */
+
+ if (header) {
+ put_short(s, (ush)len);
+ put_short(s, (ush)~len);
+#ifdef DEBUG
+ s->bits_sent += 2*16;
+#endif
+ }
+#ifdef DEBUG
+ s->bits_sent += (ulg)len<<3;
+#endif
+ while (len--) {
+ put_byte(s, *buf++);
+ }
+}
diff --git a/zlib/trees.h b/zlib/trees.h
new file mode 100644
index 00000000000..72facf900f7
--- /dev/null
+++ b/zlib/trees.h
@@ -0,0 +1,128 @@
+/* header created automatically with -DGEN_TREES_H */
+
+local const ct_data static_ltree[L_CODES+2] = {
+{{ 12},{ 8}}, {{140},{ 8}}, {{ 76},{ 8}}, {{204},{ 8}}, {{ 44},{ 8}},
+{{172},{ 8}}, {{108},{ 8}}, {{236},{ 8}}, {{ 28},{ 8}}, {{156},{ 8}},
+{{ 92},{ 8}}, {{220},{ 8}}, {{ 60},{ 8}}, {{188},{ 8}}, {{124},{ 8}},
+{{252},{ 8}}, {{ 2},{ 8}}, {{130},{ 8}}, {{ 66},{ 8}}, {{194},{ 8}},
+{{ 34},{ 8}}, {{162},{ 8}}, {{ 98},{ 8}}, {{226},{ 8}}, {{ 18},{ 8}},
+{{146},{ 8}}, {{ 82},{ 8}}, {{210},{ 8}}, {{ 50},{ 8}}, {{178},{ 8}},
+{{114},{ 8}}, {{242},{ 8}}, {{ 10},{ 8}}, {{138},{ 8}}, {{ 74},{ 8}},
+{{202},{ 8}}, {{ 42},{ 8}}, {{170},{ 8}}, {{106},{ 8}}, {{234},{ 8}},
+{{ 26},{ 8}}, {{154},{ 8}}, {{ 90},{ 8}}, {{218},{ 8}}, {{ 58},{ 8}},
+{{186},{ 8}}, {{122},{ 8}}, {{250},{ 8}}, {{ 6},{ 8}}, {{134},{ 8}},
+{{ 70},{ 8}}, {{198},{ 8}}, {{ 38},{ 8}}, {{166},{ 8}}, {{102},{ 8}},
+{{230},{ 8}}, {{ 22},{ 8}}, {{150},{ 8}}, {{ 86},{ 8}}, {{214},{ 8}},
+{{ 54},{ 8}}, {{182},{ 8}}, {{118},{ 8}}, {{246},{ 8}}, {{ 14},{ 8}},
+{{142},{ 8}}, {{ 78},{ 8}}, {{206},{ 8}}, {{ 46},{ 8}}, {{174},{ 8}},
+{{110},{ 8}}, {{238},{ 8}}, {{ 30},{ 8}}, {{158},{ 8}}, {{ 94},{ 8}},
+{{222},{ 8}}, {{ 62},{ 8}}, {{190},{ 8}}, {{126},{ 8}}, {{254},{ 8}},
+{{ 1},{ 8}}, {{129},{ 8}}, {{ 65},{ 8}}, {{193},{ 8}}, {{ 33},{ 8}},
+{{161},{ 8}}, {{ 97},{ 8}}, {{225},{ 8}}, {{ 17},{ 8}}, {{145},{ 8}},
+{{ 81},{ 8}}, {{209},{ 8}}, {{ 49},{ 8}}, {{177},{ 8}}, {{113},{ 8}},
+{{241},{ 8}}, {{ 9},{ 8}}, {{137},{ 8}}, {{ 73},{ 8}}, {{201},{ 8}},
+{{ 41},{ 8}}, {{169},{ 8}}, {{105},{ 8}}, {{233},{ 8}}, {{ 25},{ 8}},
+{{153},{ 8}}, {{ 89},{ 8}}, {{217},{ 8}}, {{ 57},{ 8}}, {{185},{ 8}},
+{{121},{ 8}}, {{249},{ 8}}, {{ 5},{ 8}}, {{133},{ 8}}, {{ 69},{ 8}},
+{{197},{ 8}}, {{ 37},{ 8}}, {{165},{ 8}}, {{101},{ 8}}, {{229},{ 8}},
+{{ 21},{ 8}}, {{149},{ 8}}, {{ 85},{ 8}}, {{213},{ 8}}, {{ 53},{ 8}},
+{{181},{ 8}}, {{117},{ 8}}, {{245},{ 8}}, {{ 13},{ 8}}, {{141},{ 8}},
+{{ 77},{ 8}}, {{205},{ 8}}, {{ 45},{ 8}}, {{173},{ 8}}, {{109},{ 8}},
+{{237},{ 8}}, {{ 29},{ 8}}, {{157},{ 8}}, {{ 93},{ 8}}, {{221},{ 8}},
+{{ 61},{ 8}}, {{189},{ 8}}, {{125},{ 8}}, {{253},{ 8}}, {{ 19},{ 9}},
+{{275},{ 9}}, {{147},{ 9}}, {{403},{ 9}}, {{ 83},{ 9}}, {{339},{ 9}},
+{{211},{ 9}}, {{467},{ 9}}, {{ 51},{ 9}}, {{307},{ 9}}, {{179},{ 9}},
+{{435},{ 9}}, {{115},{ 9}}, {{371},{ 9}}, {{243},{ 9}}, {{499},{ 9}},
+{{ 11},{ 9}}, {{267},{ 9}}, {{139},{ 9}}, {{395},{ 9}}, {{ 75},{ 9}},
+{{331},{ 9}}, {{203},{ 9}}, {{459},{ 9}}, {{ 43},{ 9}}, {{299},{ 9}},
+{{171},{ 9}}, {{427},{ 9}}, {{107},{ 9}}, {{363},{ 9}}, {{235},{ 9}},
+{{491},{ 9}}, {{ 27},{ 9}}, {{283},{ 9}}, {{155},{ 9}}, {{411},{ 9}},
+{{ 91},{ 9}}, {{347},{ 9}}, {{219},{ 9}}, {{475},{ 9}}, {{ 59},{ 9}},
+{{315},{ 9}}, {{187},{ 9}}, {{443},{ 9}}, {{123},{ 9}}, {{379},{ 9}},
+{{251},{ 9}}, {{507},{ 9}}, {{ 7},{ 9}}, {{263},{ 9}}, {{135},{ 9}},
+{{391},{ 9}}, {{ 71},{ 9}}, {{327},{ 9}}, {{199},{ 9}}, {{455},{ 9}},
+{{ 39},{ 9}}, {{295},{ 9}}, {{167},{ 9}}, {{423},{ 9}}, {{103},{ 9}},
+{{359},{ 9}}, {{231},{ 9}}, {{487},{ 9}}, {{ 23},{ 9}}, {{279},{ 9}},
+{{151},{ 9}}, {{407},{ 9}}, {{ 87},{ 9}}, {{343},{ 9}}, {{215},{ 9}},
+{{471},{ 9}}, {{ 55},{ 9}}, {{311},{ 9}}, {{183},{ 9}}, {{439},{ 9}},
+{{119},{ 9}}, {{375},{ 9}}, {{247},{ 9}}, {{503},{ 9}}, {{ 15},{ 9}},
+{{271},{ 9}}, {{143},{ 9}}, {{399},{ 9}}, {{ 79},{ 9}}, {{335},{ 9}},
+{{207},{ 9}}, {{463},{ 9}}, {{ 47},{ 9}}, {{303},{ 9}}, {{175},{ 9}},
+{{431},{ 9}}, {{111},{ 9}}, {{367},{ 9}}, {{239},{ 9}}, {{495},{ 9}},
+{{ 31},{ 9}}, {{287},{ 9}}, {{159},{ 9}}, {{415},{ 9}}, {{ 95},{ 9}},
+{{351},{ 9}}, {{223},{ 9}}, {{479},{ 9}}, {{ 63},{ 9}}, {{319},{ 9}},
+{{191},{ 9}}, {{447},{ 9}}, {{127},{ 9}}, {{383},{ 9}}, {{255},{ 9}},
+{{511},{ 9}}, {{ 0},{ 7}}, {{ 64},{ 7}}, {{ 32},{ 7}}, {{ 96},{ 7}},
+{{ 16},{ 7}}, {{ 80},{ 7}}, {{ 48},{ 7}}, {{112},{ 7}}, {{ 8},{ 7}},
+{{ 72},{ 7}}, {{ 40},{ 7}}, {{104},{ 7}}, {{ 24},{ 7}}, {{ 88},{ 7}},
+{{ 56},{ 7}}, {{120},{ 7}}, {{ 4},{ 7}}, {{ 68},{ 7}}, {{ 36},{ 7}},
+{{100},{ 7}}, {{ 20},{ 7}}, {{ 84},{ 7}}, {{ 52},{ 7}}, {{116},{ 7}},
+{{ 3},{ 8}}, {{131},{ 8}}, {{ 67},{ 8}}, {{195},{ 8}}, {{ 35},{ 8}},
+{{163},{ 8}}, {{ 99},{ 8}}, {{227},{ 8}}
+};
+
+local const ct_data static_dtree[D_CODES] = {
+{{ 0},{ 5}}, {{16},{ 5}}, {{ 8},{ 5}}, {{24},{ 5}}, {{ 4},{ 5}},
+{{20},{ 5}}, {{12},{ 5}}, {{28},{ 5}}, {{ 2},{ 5}}, {{18},{ 5}},
+{{10},{ 5}}, {{26},{ 5}}, {{ 6},{ 5}}, {{22},{ 5}}, {{14},{ 5}},
+{{30},{ 5}}, {{ 1},{ 5}}, {{17},{ 5}}, {{ 9},{ 5}}, {{25},{ 5}},
+{{ 5},{ 5}}, {{21},{ 5}}, {{13},{ 5}}, {{29},{ 5}}, {{ 3},{ 5}},
+{{19},{ 5}}, {{11},{ 5}}, {{27},{ 5}}, {{ 7},{ 5}}, {{23},{ 5}}
+};
+
+const uch _dist_code[DIST_CODE_LEN] = {
+ 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8,
+ 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10,
+10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13,
+13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15,
+15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 16, 17,
+18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22,
+23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27,
+27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29
+};
+
+const uch _length_code[MAX_MATCH-MIN_MATCH+1]= {
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12,
+13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16,
+17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19,
+19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22,
+22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23,
+23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26,
+26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28
+};
+
+local const int base_length[LENGTH_CODES] = {
+0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56,
+64, 80, 96, 112, 128, 160, 192, 224, 0
+};
+
+local const int base_dist[D_CODES] = {
+ 0, 1, 2, 3, 4, 6, 8, 12, 16, 24,
+ 32, 48, 64, 96, 128, 192, 256, 384, 512, 768,
+ 1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384, 24576
+};
+
diff --git a/zlib/uncompr.c b/zlib/uncompr.c
new file mode 100644
index 00000000000..d1033213781
--- /dev/null
+++ b/zlib/uncompr.c
@@ -0,0 +1,58 @@
+/* uncompr.c -- decompress a memory buffer
+ * Copyright (C) 1995-1998 Jean-loup Gailly.
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* @(#) $Id$ */
+
+#include "zlib.h"
+
+/* ===========================================================================
+ Decompresses the source buffer into the destination buffer. sourceLen is
+ the byte length of the source buffer. Upon entry, destLen is the total
+ size of the destination buffer, which must be large enough to hold the
+ entire uncompressed data. (The size of the uncompressed data must have
+ been saved previously by the compressor and transmitted to the decompressor
+ by some mechanism outside the scope of this compression library.)
+ Upon exit, destLen is the actual size of the compressed buffer.
+ This function can be used to decompress a whole file at once if the
+ input file is mmap'ed.
+
+ uncompress returns Z_OK if success, Z_MEM_ERROR if there was not
+ enough memory, Z_BUF_ERROR if there was not enough room in the output
+ buffer, or Z_DATA_ERROR if the input data was corrupted.
+*/
+int ZEXPORT uncompress (dest, destLen, source, sourceLen)
+ Bytef *dest;
+ uLongf *destLen;
+ const Bytef *source;
+ uLong sourceLen;
+{
+ z_stream stream;
+ int err;
+
+ stream.next_in = (Bytef*)source;
+ stream.avail_in = (uInt)sourceLen;
+ /* Check for source > 64K on 16-bit machine: */
+ if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR;
+
+ stream.next_out = dest;
+ stream.avail_out = (uInt)*destLen;
+ if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR;
+
+ stream.zalloc = (alloc_func)0;
+ stream.zfree = (free_func)0;
+
+ err = inflateInit(&stream);
+ if (err != Z_OK) return err;
+
+ err = inflate(&stream, Z_FINISH);
+ if (err != Z_STREAM_END) {
+ inflateEnd(&stream);
+ return err == Z_OK ? Z_BUF_ERROR : err;
+ }
+ *destLen = stream.total_out;
+
+ err = inflateEnd(&stream);
+ return err;
+}
diff --git a/zlib/zconf.h b/zlib/zconf.h
new file mode 100644
index 00000000000..6d450fc793d
--- /dev/null
+++ b/zlib/zconf.h
@@ -0,0 +1,279 @@
+/* zconf.h -- configuration of the zlib compression library
+ * Copyright (C) 1995-1998 Jean-loup Gailly.
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* @(#) $Id$ */
+
+#ifndef _ZCONF_H
+#define _ZCONF_H
+
+/*
+ * If you *really* need a unique prefix for all types and library functions,
+ * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it.
+ */
+#ifdef Z_PREFIX
+# define deflateInit_ z_deflateInit_
+# define deflate z_deflate
+# define deflateEnd z_deflateEnd
+# define inflateInit_ z_inflateInit_
+# define inflate z_inflate
+# define inflateEnd z_inflateEnd
+# define deflateInit2_ z_deflateInit2_
+# define deflateSetDictionary z_deflateSetDictionary
+# define deflateCopy z_deflateCopy
+# define deflateReset z_deflateReset
+# define deflateParams z_deflateParams
+# define inflateInit2_ z_inflateInit2_
+# define inflateSetDictionary z_inflateSetDictionary
+# define inflateSync z_inflateSync
+# define inflateSyncPoint z_inflateSyncPoint
+# define inflateReset z_inflateReset
+# define compress z_compress
+# define compress2 z_compress2
+# define uncompress z_uncompress
+# define adler32 z_adler32
+# define crc32 z_crc32
+# define get_crc_table z_get_crc_table
+
+# define Byte z_Byte
+# define uInt z_uInt
+# define uLong z_uLong
+# define Bytef z_Bytef
+# define charf z_charf
+# define intf z_intf
+# define uIntf z_uIntf
+# define uLongf z_uLongf
+# define voidpf z_voidpf
+# define voidp z_voidp
+#endif
+
+#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32)
+# define WIN32
+#endif
+#if defined(__GNUC__) || defined(WIN32) || defined(__386__) || defined(i386)
+# ifndef __32BIT__
+# define __32BIT__
+# endif
+#endif
+#if defined(__MSDOS__) && !defined(MSDOS)
+# define MSDOS
+#endif
+
+/*
+ * Compile with -DMAXSEG_64K if the alloc function cannot allocate more
+ * than 64k bytes at a time (needed on systems with 16-bit int).
+ */
+#if defined(MSDOS) && !defined(__32BIT__)
+# define MAXSEG_64K
+#endif
+#ifdef MSDOS
+# define UNALIGNED_OK
+#endif
+
+#if (defined(MSDOS) || defined(_WINDOWS) || defined(WIN32)) && !defined(STDC)
+# define STDC
+#endif
+#if defined(__STDC__) || defined(__cplusplus) || defined(__OS2__)
+# ifndef STDC
+# define STDC
+# endif
+#endif
+
+#ifndef STDC
+# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */
+# define const
+# endif
+#endif
+
+/* Some Mac compilers merge all .h files incorrectly: */
+#if defined(__MWERKS__) || defined(applec) ||defined(THINK_C) ||defined(__SC__)
+# define NO_DUMMY_DECL
+#endif
+
+/* Old Borland C incorrectly complains about missing returns: */
+#if defined(__BORLANDC__) && (__BORLANDC__ < 0x500)
+# define NEED_DUMMY_RETURN
+#endif
+
+
+/* Maximum value for memLevel in deflateInit2 */
+#ifndef MAX_MEM_LEVEL
+# ifdef MAXSEG_64K
+# define MAX_MEM_LEVEL 8
+# else
+# define MAX_MEM_LEVEL 9
+# endif
+#endif
+
+/* Maximum value for windowBits in deflateInit2 and inflateInit2.
+ * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files
+ * created by gzip. (Files created by minigzip can still be extracted by
+ * gzip.)
+ */
+#ifndef MAX_WBITS
+# define MAX_WBITS 15 /* 32K LZ77 window */
+#endif
+
+/* The memory requirements for deflate are (in bytes):
+ (1 << (windowBits+2)) + (1 << (memLevel+9))
+ that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values)
+ plus a few kilobytes for small objects. For example, if you want to reduce
+ the default memory requirements from 256K to 128K, compile with
+ make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7"
+ Of course this will generally degrade compression (there's no free lunch).
+
+ The memory requirements for inflate are (in bytes) 1 << windowBits
+ that is, 32K for windowBits=15 (default value) plus a few kilobytes
+ for small objects.
+*/
+
+ /* Type declarations */
+
+#ifndef OF /* function prototypes */
+# ifdef STDC
+# define OF(args) args
+# else
+# define OF(args) ()
+# endif
+#endif
+
+/* The following definitions for FAR are needed only for MSDOS mixed
+ * model programming (small or medium model with some far allocations).
+ * This was tested only with MSC; for other MSDOS compilers you may have
+ * to define NO_MEMCPY in zutil.h. If you don't need the mixed model,
+ * just define FAR to be empty.
+ */
+#if (defined(M_I86SM) || defined(M_I86MM)) && !defined(__32BIT__)
+ /* MSC small or medium model */
+# define SMALL_MEDIUM
+# ifdef _MSC_VER
+# define FAR _far
+# else
+# define FAR far
+# endif
+#endif
+#if defined(__BORLANDC__) && (defined(__SMALL__) || defined(__MEDIUM__))
+# ifndef __32BIT__
+# define SMALL_MEDIUM
+# define FAR _far
+# endif
+#endif
+
+/* Compile with -DZLIB_DLL for Windows DLL support */
+#if defined(ZLIB_DLL)
+# if defined(_WINDOWS) || defined(WINDOWS)
+# ifdef FAR
+# undef FAR
+# endif
+# include <windows.h>
+# define ZEXPORT WINAPI
+# ifdef WIN32
+# define ZEXPORTVA WINAPIV
+# else
+# define ZEXPORTVA FAR _cdecl _export
+# endif
+# endif
+# if defined (__BORLANDC__)
+# if (__BORLANDC__ >= 0x0500) && defined (WIN32)
+# include <windows.h>
+# define ZEXPORT __declspec(dllexport) WINAPI
+# define ZEXPORTRVA __declspec(dllexport) WINAPIV
+# else
+# if defined (_Windows) && defined (__DLL__)
+# define ZEXPORT _export
+# define ZEXPORTVA _export
+# endif
+# endif
+# endif
+#endif
+
+#if defined (__BEOS__)
+# if defined (ZLIB_DLL)
+# define ZEXTERN extern __declspec(dllexport)
+# else
+# define ZEXTERN extern __declspec(dllimport)
+# endif
+#endif
+
+#ifndef ZEXPORT
+# define ZEXPORT
+#endif
+#ifndef ZEXPORTVA
+# define ZEXPORTVA
+#endif
+#ifndef ZEXTERN
+# define ZEXTERN extern
+#endif
+
+#ifndef FAR
+# define FAR
+#endif
+
+#if !defined(MACOS) && !defined(TARGET_OS_MAC)
+typedef unsigned char Byte; /* 8 bits */
+#endif
+typedef unsigned int uInt; /* 16 bits or more */
+typedef unsigned long uLong; /* 32 bits or more */
+
+#ifdef SMALL_MEDIUM
+ /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */
+# define Bytef Byte FAR
+#else
+ typedef Byte FAR Bytef;
+#endif
+typedef char FAR charf;
+typedef int FAR intf;
+typedef uInt FAR uIntf;
+typedef uLong FAR uLongf;
+
+#ifdef STDC
+ typedef void FAR *voidpf;
+ typedef void *voidp;
+#else
+ typedef Byte FAR *voidpf;
+ typedef Byte *voidp;
+#endif
+
+#ifdef HAVE_UNISTD_H
+# include <sys/types.h> /* for off_t */
+# include <unistd.h> /* for SEEK_* and off_t */
+# define z_off_t off_t
+#endif
+#ifndef SEEK_SET
+# define SEEK_SET 0 /* Seek from beginning of file. */
+# define SEEK_CUR 1 /* Seek from current position. */
+# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */
+#endif
+#ifndef z_off_t
+# define z_off_t long
+#endif
+
+/* MVS linker does not support external names larger than 8 bytes */
+#if defined(__MVS__)
+# pragma map(deflateInit_,"DEIN")
+# pragma map(deflateInit2_,"DEIN2")
+# pragma map(deflateEnd,"DEEND")
+# pragma map(inflateInit_,"ININ")
+# pragma map(inflateInit2_,"ININ2")
+# pragma map(inflateEnd,"INEND")
+# pragma map(inflateSync,"INSY")
+# pragma map(inflateSetDictionary,"INSEDI")
+# pragma map(inflate_blocks,"INBL")
+# pragma map(inflate_blocks_new,"INBLNE")
+# pragma map(inflate_blocks_free,"INBLFR")
+# pragma map(inflate_blocks_reset,"INBLRE")
+# pragma map(inflate_codes_free,"INCOFR")
+# pragma map(inflate_codes,"INCO")
+# pragma map(inflate_fast,"INFA")
+# pragma map(inflate_flush,"INFLU")
+# pragma map(inflate_mask,"INMA")
+# pragma map(inflate_set_dictionary,"INSEDI2")
+# pragma map(inflate_copyright,"INCOPY")
+# pragma map(inflate_trees_bits,"INTRBI")
+# pragma map(inflate_trees_dynamic,"INTRDY")
+# pragma map(inflate_trees_fixed,"INTRFI")
+# pragma map(inflate_trees_free,"INTRFR")
+#endif
+
+#endif /* _ZCONF_H */
diff --git a/zlib/zlib.3 b/zlib/zlib.3
new file mode 100644
index 00000000000..25c8495d25f
--- /dev/null
+++ b/zlib/zlib.3
@@ -0,0 +1,107 @@
+.TH ZLIB 3 "9 July 1998"
+.SH NAME
+zlib \- compression/decompression library
+.SH SYNOPSIS
+[see
+.I zlib.h
+for full description]
+.SH DESCRIPTION
+The
+.I zlib
+library is a general purpose data compression library.
+The code is thread safe.
+It provides in-memory compression and decompression functions,
+including integrity checks of the uncompressed data.
+This version of the library supports only one compression method (deflation)
+but other algorithms will be added later and will have the same stream interface.
+.LP
+Compression can be done in a single step if the buffers are large enough
+(for example if an input file is mmap'ed),
+or can be done by repeated calls of the compression function.
+In the latter case,
+the application must provide more input and/or consume the output
+(providing more output space) before each call.
+.LP
+The library also supports reading and writing files in
+.I gzip
+(.gz) format
+with an interface similar to that of stdio.
+.LP
+The library does not install any signal handler. The decoder checks
+the consistency of the compressed data, so the library should never
+crash even in case of corrupted input.
+.LP
+All functions of the compression library are documented in the file
+.IR zlib.h.
+The distribution source includes examples of use of the library
+the files
+.I example.c
+and
+.IR minigzip.c .
+.LP
+A Java implementation of
+.IR zlib
+is available in the Java Development Kit 1.1
+.IP
+http://www.javasoft.com/products/JDK/1.1/docs/api/Package-java.util.zip.html
+.LP
+A Perl interface to
+.IR zlib ,
+written by Paul Marquess (pmarquess@bfsec.bt.co.uk)
+is available at CPAN (Comprehensive Perl Archive Network) sites,
+such as:
+.IP
+ftp://ftp.cis.ufl.edu/pub/perl/CPAN/modules/by-module/Compress/Compress-Zlib*
+.LP
+A Python interface to
+.IR zlib
+written by A.M. Kuchling <amk@magnet.com>
+is available from the Python Software Association sites, such as:
+.IP
+ftp://ftp.python.org/pub/python/contrib/Encoding/zlib*.tar.gz
+.SH "SEE ALSO"
+Questions about zlib should be sent to:
+.IP
+zlib@quest.jpl.nasa.gov
+or, if this fails, to the author addresses given below.
+The zlib home page is:
+.IP
+http://www.cdrom.com/pub/infozip/zlib/
+.LP
+The data format used by the zlib library is described by RFC
+(Request for Comments) 1950 to 1952 in the files:
+.IP
+ftp://ds.internic.net/rfc/rfc1950.txt (zlib format)
+.br
+rfc1951.txt (deflate format)
+.br
+rfc1952.txt (gzip format)
+.LP
+These documents are also available in other formats from:
+.IP
+ftp://ftp.uu.net/graphics/png/documents/zlib/zdoc-index.html
+.SH AUTHORS
+Version 1.1.3
+Copyright (C) 1995-1998 Jean-loup Gailly (jloup@gzip.org)
+and Mark Adler (madler@alumni.caltech.edu).
+.LP
+This software is provided "as-is,"
+without any express or implied warranty.
+In no event will the authors be held liable for any damages
+arising from the use of this software.
+See the distribution directory with respect to requirements
+governing redistribution.
+The deflate format used by
+.I zlib
+was defined by Phil Katz.
+The deflate and
+.I zlib
+specifications were written by L. Peter Deutsch.
+Thanks to all the people who reported problems and suggested various
+improvements in
+.IR zlib ;
+who are too numerous to cite here.
+.LP
+UNIX manual page by R. P. C. Rodgers,
+U.S. National Library of Medicine (rodgers@nlm.nih.gov).
+.\" end of man page
diff --git a/zlib/zlib.h b/zlib/zlib.h
new file mode 100644
index 00000000000..49f56b43bc6
--- /dev/null
+++ b/zlib/zlib.h
@@ -0,0 +1,893 @@
+/* zlib.h -- interface of the 'zlib' general purpose compression library
+ version 1.1.3, July 9th, 1998
+
+ Copyright (C) 1995-1998 Jean-loup Gailly and Mark Adler
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
+ Jean-loup Gailly Mark Adler
+ jloup@gzip.org madler@alumni.caltech.edu
+
+
+ The data format used by the zlib library is described by RFCs (Request for
+ Comments) 1950 to 1952 in the files ftp://ds.internic.net/rfc/rfc1950.txt
+ (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format).
+*/
+
+#ifndef _ZLIB_H
+#define _ZLIB_H
+
+#include "zconf.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define ZLIB_VERSION "1.1.3"
+
+/*
+ The 'zlib' compression library provides in-memory compression and
+ decompression functions, including integrity checks of the uncompressed
+ data. This version of the library supports only one compression method
+ (deflation) but other algorithms will be added later and will have the same
+ stream interface.
+
+ Compression can be done in a single step if the buffers are large
+ enough (for example if an input file is mmap'ed), or can be done by
+ repeated calls of the compression function. In the latter case, the
+ application must provide more input and/or consume the output
+ (providing more output space) before each call.
+
+ The library also supports reading and writing files in gzip (.gz) format
+ with an interface similar to that of stdio.
+
+ The library does not install any signal handler. The decoder checks
+ the consistency of the compressed data, so the library should never
+ crash even in case of corrupted input.
+*/
+
+typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size));
+typedef void (*free_func) OF((voidpf opaque, voidpf address));
+
+struct internal_state;
+
+typedef struct z_stream_s {
+ Bytef *next_in; /* next input byte */
+ uInt avail_in; /* number of bytes available at next_in */
+ uLong total_in; /* total nb of input bytes read so far */
+
+ Bytef *next_out; /* next output byte should be put there */
+ uInt avail_out; /* remaining free space at next_out */
+ uLong total_out; /* total nb of bytes output so far */
+
+ char *msg; /* last error message, NULL if no error */
+ struct internal_state FAR *state; /* not visible by applications */
+
+ alloc_func zalloc; /* used to allocate the internal state */
+ free_func zfree; /* used to free the internal state */
+ voidpf opaque; /* private data object passed to zalloc and zfree */
+
+ int data_type; /* best guess about the data type: ascii or binary */
+ uLong adler; /* adler32 value of the uncompressed data */
+ uLong reserved; /* reserved for future use */
+} z_stream;
+
+typedef z_stream FAR *z_streamp;
+
+/*
+ The application must update next_in and avail_in when avail_in has
+ dropped to zero. It must update next_out and avail_out when avail_out
+ has dropped to zero. The application must initialize zalloc, zfree and
+ opaque before calling the init function. All other fields are set by the
+ compression library and must not be updated by the application.
+
+ The opaque value provided by the application will be passed as the first
+ parameter for calls of zalloc and zfree. This can be useful for custom
+ memory management. The compression library attaches no meaning to the
+ opaque value.
+
+ zalloc must return Z_NULL if there is not enough memory for the object.
+ If zlib is used in a multi-threaded application, zalloc and zfree must be
+ thread safe.
+
+ On 16-bit systems, the functions zalloc and zfree must be able to allocate
+ exactly 65536 bytes, but will not be required to allocate more than this
+ if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS,
+ pointers returned by zalloc for objects of exactly 65536 bytes *must*
+ have their offset normalized to zero. The default allocation function
+ provided by this library ensures this (see zutil.c). To reduce memory
+ requirements and avoid any allocation of 64K objects, at the expense of
+ compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h).
+
+ The fields total_in and total_out can be used for statistics or
+ progress reports. After compression, total_in holds the total size of
+ the uncompressed data and may be saved for use in the decompressor
+ (particularly if the decompressor wants to decompress everything in
+ a single step).
+*/
+
+ /* constants */
+
+#define Z_NO_FLUSH 0
+#define Z_PARTIAL_FLUSH 1 /* will be removed, use Z_SYNC_FLUSH instead */
+#define Z_SYNC_FLUSH 2
+#define Z_FULL_FLUSH 3
+#define Z_FINISH 4
+/* Allowed flush values; see deflate() below for details */
+
+#define Z_OK 0
+#define Z_STREAM_END 1
+#define Z_NEED_DICT 2
+#define Z_ERRNO (-1)
+#define Z_STREAM_ERROR (-2)
+#define Z_DATA_ERROR (-3)
+#define Z_MEM_ERROR (-4)
+#define Z_BUF_ERROR (-5)
+#define Z_VERSION_ERROR (-6)
+/* Return codes for the compression/decompression functions. Negative
+ * values are errors, positive values are used for special but normal events.
+ */
+
+#define Z_NO_COMPRESSION 0
+#define Z_BEST_SPEED 1
+#define Z_BEST_COMPRESSION 9
+#define Z_DEFAULT_COMPRESSION (-1)
+/* compression levels */
+
+#define Z_FILTERED 1
+#define Z_HUFFMAN_ONLY 2
+#define Z_DEFAULT_STRATEGY 0
+/* compression strategy; see deflateInit2() below for details */
+
+#define Z_BINARY 0
+#define Z_ASCII 1
+#define Z_UNKNOWN 2
+/* Possible values of the data_type field */
+
+#define Z_DEFLATED 8
+/* The deflate compression method (the only one supported in this version) */
+
+#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */
+
+#define zlib_version zlibVersion()
+/* for compatibility with versions < 1.0.2 */
+
+ /* basic functions */
+
+ZEXTERN const char * ZEXPORT zlibVersion OF((void));
+/* The application can compare zlibVersion and ZLIB_VERSION for consistency.
+ If the first character differs, the library code actually used is
+ not compatible with the zlib.h header file used by the application.
+ This check is automatically made by deflateInit and inflateInit.
+ */
+
+/*
+ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level));
+
+ Initializes the internal stream state for compression. The fields
+ zalloc, zfree and opaque must be initialized before by the caller.
+ If zalloc and zfree are set to Z_NULL, deflateInit updates them to
+ use default allocation functions.
+
+ The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9:
+ 1 gives best speed, 9 gives best compression, 0 gives no compression at
+ all (the input data is simply copied a block at a time).
+ Z_DEFAULT_COMPRESSION requests a default compromise between speed and
+ compression (currently equivalent to level 6).
+
+ deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not
+ enough memory, Z_STREAM_ERROR if level is not a valid compression level,
+ Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible
+ with the version assumed by the caller (ZLIB_VERSION).
+ msg is set to null if there is no error message. deflateInit does not
+ perform any compression: this will be done by deflate().
+*/
+
+
+ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush));
+/*
+ deflate compresses as much data as possible, and stops when the input
+ buffer becomes empty or the output buffer becomes full. It may introduce some
+ output latency (reading input without producing any output) except when
+ forced to flush.
+
+ The detailed semantics are as follows. deflate performs one or both of the
+ following actions:
+
+ - Compress more input starting at next_in and update next_in and avail_in
+ accordingly. If not all input can be processed (because there is not
+ enough room in the output buffer), next_in and avail_in are updated and
+ processing will resume at this point for the next call of deflate().
+
+ - Provide more output starting at next_out and update next_out and avail_out
+ accordingly. This action is forced if the parameter flush is non zero.
+ Forcing flush frequently degrades the compression ratio, so this parameter
+ should be set only when necessary (in interactive applications).
+ Some output may be provided even if flush is not set.
+
+ Before the call of deflate(), the application should ensure that at least
+ one of the actions is possible, by providing more input and/or consuming
+ more output, and updating avail_in or avail_out accordingly; avail_out
+ should never be zero before the call. The application can consume the
+ compressed output when it wants, for example when the output buffer is full
+ (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK
+ and with zero avail_out, it must be called again after making room in the
+ output buffer because there might be more output pending.
+
+ If the parameter flush is set to Z_SYNC_FLUSH, all pending output is
+ flushed to the output buffer and the output is aligned on a byte boundary, so
+ that the decompressor can get all input data available so far. (In particular
+ avail_in is zero after the call if enough output space has been provided
+ before the call.) Flushing may degrade compression for some compression
+ algorithms and so it should be used only when necessary.
+
+ If flush is set to Z_FULL_FLUSH, all output is flushed as with
+ Z_SYNC_FLUSH, and the compression state is reset so that decompression can
+ restart from this point if previous compressed data has been damaged or if
+ random access is desired. Using Z_FULL_FLUSH too often can seriously degrade
+ the compression.
+
+ If deflate returns with avail_out == 0, this function must be called again
+ with the same value of the flush parameter and more output space (updated
+ avail_out), until the flush is complete (deflate returns with non-zero
+ avail_out).
+
+ If the parameter flush is set to Z_FINISH, pending input is processed,
+ pending output is flushed and deflate returns with Z_STREAM_END if there
+ was enough output space; if deflate returns with Z_OK, this function must be
+ called again with Z_FINISH and more output space (updated avail_out) but no
+ more input data, until it returns with Z_STREAM_END or an error. After
+ deflate has returned Z_STREAM_END, the only possible operations on the
+ stream are deflateReset or deflateEnd.
+
+ Z_FINISH can be used immediately after deflateInit if all the compression
+ is to be done in a single step. In this case, avail_out must be at least
+ 0.1% larger than avail_in plus 12 bytes. If deflate does not return
+ Z_STREAM_END, then it must be called again as described above.
+
+ deflate() sets strm->adler to the adler32 checksum of all input read
+ so far (that is, total_in bytes).
+
+ deflate() may update data_type if it can make a good guess about
+ the input data type (Z_ASCII or Z_BINARY). In doubt, the data is considered
+ binary. This field is only for information purposes and does not affect
+ the compression algorithm in any manner.
+
+ deflate() returns Z_OK if some progress has been made (more input
+ processed or more output produced), Z_STREAM_END if all input has been
+ consumed and all output has been produced (only when flush is set to
+ Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example
+ if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible
+ (for example avail_in or avail_out was zero).
+*/
+
+
+ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm));
+/*
+ All dynamically allocated data structures for this stream are freed.
+ This function discards any unprocessed input and does not flush any
+ pending output.
+
+ deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the
+ stream state was inconsistent, Z_DATA_ERROR if the stream was freed
+ prematurely (some input or output was discarded). In the error case,
+ msg may be set but then points to a static string (which must not be
+ deallocated).
+*/
+
+
+/*
+ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm));
+
+ Initializes the internal stream state for decompression. The fields
+ next_in, avail_in, zalloc, zfree and opaque must be initialized before by
+ the caller. If next_in is not Z_NULL and avail_in is large enough (the exact
+ value depends on the compression method), inflateInit determines the
+ compression method from the zlib header and allocates all data structures
+ accordingly; otherwise the allocation will be deferred to the first call of
+ inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to
+ use default allocation functions.
+
+ inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough
+ memory, Z_VERSION_ERROR if the zlib library version is incompatible with the
+ version assumed by the caller. msg is set to null if there is no error
+ message. inflateInit does not perform any decompression apart from reading
+ the zlib header if present: this will be done by inflate(). (So next_in and
+ avail_in may be modified, but next_out and avail_out are unchanged.)
+*/
+
+
+ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush));
+/*
+ inflate decompresses as much data as possible, and stops when the input
+ buffer becomes empty or the output buffer becomes full. It may some
+ introduce some output latency (reading input without producing any output)
+ except when forced to flush.
+
+ The detailed semantics are as follows. inflate performs one or both of the
+ following actions:
+
+ - Decompress more input starting at next_in and update next_in and avail_in
+ accordingly. If not all input can be processed (because there is not
+ enough room in the output buffer), next_in is updated and processing
+ will resume at this point for the next call of inflate().
+
+ - Provide more output starting at next_out and update next_out and avail_out
+ accordingly. inflate() provides as much output as possible, until there
+ is no more input data or no more space in the output buffer (see below
+ about the flush parameter).
+
+ Before the call of inflate(), the application should ensure that at least
+ one of the actions is possible, by providing more input and/or consuming
+ more output, and updating the next_* and avail_* values accordingly.
+ The application can consume the uncompressed output when it wants, for
+ example when the output buffer is full (avail_out == 0), or after each
+ call of inflate(). If inflate returns Z_OK and with zero avail_out, it
+ must be called again after making room in the output buffer because there
+ might be more output pending.
+
+ If the parameter flush is set to Z_SYNC_FLUSH, inflate flushes as much
+ output as possible to the output buffer. The flushing behavior of inflate is
+ not specified for values of the flush parameter other than Z_SYNC_FLUSH
+ and Z_FINISH, but the current implementation actually flushes as much output
+ as possible anyway.
+
+ inflate() should normally be called until it returns Z_STREAM_END or an
+ error. However if all decompression is to be performed in a single step
+ (a single call of inflate), the parameter flush should be set to
+ Z_FINISH. In this case all pending input is processed and all pending
+ output is flushed; avail_out must be large enough to hold all the
+ uncompressed data. (The size of the uncompressed data may have been saved
+ by the compressor for this purpose.) The next operation on this stream must
+ be inflateEnd to deallocate the decompression state. The use of Z_FINISH
+ is never required, but can be used to inform inflate that a faster routine
+ may be used for the single inflate() call.
+
+ If a preset dictionary is needed at this point (see inflateSetDictionary
+ below), inflate sets strm-adler to the adler32 checksum of the
+ dictionary chosen by the compressor and returns Z_NEED_DICT; otherwise
+ it sets strm->adler to the adler32 checksum of all output produced
+ so far (that is, total_out bytes) and returns Z_OK, Z_STREAM_END or
+ an error code as described below. At the end of the stream, inflate()
+ checks that its computed adler32 checksum is equal to that saved by the
+ compressor and returns Z_STREAM_END only if the checksum is correct.
+
+ inflate() returns Z_OK if some progress has been made (more input processed
+ or more output produced), Z_STREAM_END if the end of the compressed data has
+ been reached and all uncompressed output has been produced, Z_NEED_DICT if a
+ preset dictionary is needed at this point, Z_DATA_ERROR if the input data was
+ corrupted (input stream not conforming to the zlib format or incorrect
+ adler32 checksum), Z_STREAM_ERROR if the stream structure was inconsistent
+ (for example if next_in or next_out was NULL), Z_MEM_ERROR if there was not
+ enough memory, Z_BUF_ERROR if no progress is possible or if there was not
+ enough room in the output buffer when Z_FINISH is used. In the Z_DATA_ERROR
+ case, the application may then call inflateSync to look for a good
+ compression block.
+*/
+
+
+ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm));
+/*
+ All dynamically allocated data structures for this stream are freed.
+ This function discards any unprocessed input and does not flush any
+ pending output.
+
+ inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state
+ was inconsistent. In the error case, msg may be set but then points to a
+ static string (which must not be deallocated).
+*/
+
+ /* Advanced functions */
+
+/*
+ The following functions are needed only in some special applications.
+*/
+
+/*
+ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm,
+ int level,
+ int method,
+ int windowBits,
+ int memLevel,
+ int strategy));
+
+ This is another version of deflateInit with more compression options. The
+ fields next_in, zalloc, zfree and opaque must be initialized before by
+ the caller.
+
+ The method parameter is the compression method. It must be Z_DEFLATED in
+ this version of the library.
+
+ The windowBits parameter is the base two logarithm of the window size
+ (the size of the history buffer). It should be in the range 8..15 for this
+ version of the library. Larger values of this parameter result in better
+ compression at the expense of memory usage. The default value is 15 if
+ deflateInit is used instead.
+
+ The memLevel parameter specifies how much memory should be allocated
+ for the internal compression state. memLevel=1 uses minimum memory but
+ is slow and reduces compression ratio; memLevel=9 uses maximum memory
+ for optimal speed. The default value is 8. See zconf.h for total memory
+ usage as a function of windowBits and memLevel.
+
+ The strategy parameter is used to tune the compression algorithm. Use the
+ value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a
+ filter (or predictor), or Z_HUFFMAN_ONLY to force Huffman encoding only (no
+ string match). Filtered data consists mostly of small values with a
+ somewhat random distribution. In this case, the compression algorithm is
+ tuned to compress them better. The effect of Z_FILTERED is to force more
+ Huffman coding and less string matching; it is somewhat intermediate
+ between Z_DEFAULT and Z_HUFFMAN_ONLY. The strategy parameter only affects
+ the compression ratio but not the correctness of the compressed output even
+ if it is not set appropriately.
+
+ deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
+ memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid
+ method). msg is set to null if there is no error message. deflateInit2 does
+ not perform any compression: this will be done by deflate().
+*/
+
+ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm,
+ const Bytef *dictionary,
+ uInt dictLength));
+/*
+ Initializes the compression dictionary from the given byte sequence
+ without producing any compressed output. This function must be called
+ immediately after deflateInit, deflateInit2 or deflateReset, before any
+ call of deflate. The compressor and decompressor must use exactly the same
+ dictionary (see inflateSetDictionary).
+
+ The dictionary should consist of strings (byte sequences) that are likely
+ to be encountered later in the data to be compressed, with the most commonly
+ used strings preferably put towards the end of the dictionary. Using a
+ dictionary is most useful when the data to be compressed is short and can be
+ predicted with good accuracy; the data can then be compressed better than
+ with the default empty dictionary.
+
+ Depending on the size of the compression data structures selected by
+ deflateInit or deflateInit2, a part of the dictionary may in effect be
+ discarded, for example if the dictionary is larger than the window size in
+ deflate or deflate2. Thus the strings most likely to be useful should be
+ put at the end of the dictionary, not at the front.
+
+ Upon return of this function, strm->adler is set to the Adler32 value
+ of the dictionary; the decompressor may later use this value to determine
+ which dictionary has been used by the compressor. (The Adler32 value
+ applies to the whole dictionary even if only a subset of the dictionary is
+ actually used by the compressor.)
+
+ deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a
+ parameter is invalid (such as NULL dictionary) or the stream state is
+ inconsistent (for example if deflate has already been called for this stream
+ or if the compression method is bsort). deflateSetDictionary does not
+ perform any compression: this will be done by deflate().
+*/
+
+ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest,
+ z_streamp source));
+/*
+ Sets the destination stream as a complete copy of the source stream.
+
+ This function can be useful when several compression strategies will be
+ tried, for example when there are several ways of pre-processing the input
+ data with a filter. The streams that will be discarded should then be freed
+ by calling deflateEnd. Note that deflateCopy duplicates the internal
+ compression state which can be quite large, so this strategy is slow and
+ can consume lots of memory.
+
+ deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not
+ enough memory, Z_STREAM_ERROR if the source stream state was inconsistent
+ (such as zalloc being NULL). msg is left unchanged in both source and
+ destination.
+*/
+
+ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm));
+/*
+ This function is equivalent to deflateEnd followed by deflateInit,
+ but does not free and reallocate all the internal compression state.
+ The stream will keep the same compression level and any other attributes
+ that may have been set by deflateInit2.
+
+ deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source
+ stream state was inconsistent (such as zalloc or state being NULL).
+*/
+
+ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm,
+ int level,
+ int strategy));
+/*
+ Dynamically update the compression level and compression strategy. The
+ interpretation of level and strategy is as in deflateInit2. This can be
+ used to switch between compression and straight copy of the input data, or
+ to switch to a different kind of input data requiring a different
+ strategy. If the compression level is changed, the input available so far
+ is compressed with the old level (and may be flushed); the new level will
+ take effect only at the next call of deflate().
+
+ Before the call of deflateParams, the stream state must be set as for
+ a call of deflate(), since the currently available input may have to
+ be compressed and flushed. In particular, strm->avail_out must be non-zero.
+
+ deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source
+ stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR
+ if strm->avail_out was zero.
+*/
+
+/*
+ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm,
+ int windowBits));
+
+ This is another version of inflateInit with an extra parameter. The
+ fields next_in, avail_in, zalloc, zfree and opaque must be initialized
+ before by the caller.
+
+ The windowBits parameter is the base two logarithm of the maximum window
+ size (the size of the history buffer). It should be in the range 8..15 for
+ this version of the library. The default value is 15 if inflateInit is used
+ instead. If a compressed stream with a larger window size is given as
+ input, inflate() will return with the error code Z_DATA_ERROR instead of
+ trying to allocate a larger window.
+
+ inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
+ memory, Z_STREAM_ERROR if a parameter is invalid (such as a negative
+ memLevel). msg is set to null if there is no error message. inflateInit2
+ does not perform any decompression apart from reading the zlib header if
+ present: this will be done by inflate(). (So next_in and avail_in may be
+ modified, but next_out and avail_out are unchanged.)
+*/
+
+ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm,
+ const Bytef *dictionary,
+ uInt dictLength));
+/*
+ Initializes the decompression dictionary from the given uncompressed byte
+ sequence. This function must be called immediately after a call of inflate
+ if this call returned Z_NEED_DICT. The dictionary chosen by the compressor
+ can be determined from the Adler32 value returned by this call of
+ inflate. The compressor and decompressor must use exactly the same
+ dictionary (see deflateSetDictionary).
+
+ inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a
+ parameter is invalid (such as NULL dictionary) or the stream state is
+ inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the
+ expected one (incorrect Adler32 value). inflateSetDictionary does not
+ perform any decompression: this will be done by subsequent calls of
+ inflate().
+*/
+
+ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm));
+/*
+ Skips invalid compressed data until a full flush point (see above the
+ description of deflate with Z_FULL_FLUSH) can be found, or until all
+ available input is skipped. No output is provided.
+
+ inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR
+ if no more input was provided, Z_DATA_ERROR if no flush point has been found,
+ or Z_STREAM_ERROR if the stream structure was inconsistent. In the success
+ case, the application may save the current current value of total_in which
+ indicates where valid compressed data was found. In the error case, the
+ application may repeatedly call inflateSync, providing more input each time,
+ until success or end of the input data.
+*/
+
+ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm));
+/*
+ This function is equivalent to inflateEnd followed by inflateInit,
+ but does not free and reallocate all the internal decompression state.
+ The stream will keep attributes that may have been set by inflateInit2.
+
+ inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source
+ stream state was inconsistent (such as zalloc or state being NULL).
+*/
+
+
+ /* utility functions */
+
+/*
+ The following utility functions are implemented on top of the
+ basic stream-oriented functions. To simplify the interface, some
+ default options are assumed (compression level and memory usage,
+ standard memory allocation functions). The source code of these
+ utility functions can easily be modified if you need special options.
+*/
+
+ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen,
+ const Bytef *source, uLong sourceLen));
+/*
+ Compresses the source buffer into the destination buffer. sourceLen is
+ the byte length of the source buffer. Upon entry, destLen is the total
+ size of the destination buffer, which must be at least 0.1% larger than
+ sourceLen plus 12 bytes. Upon exit, destLen is the actual size of the
+ compressed buffer.
+ This function can be used to compress a whole file at once if the
+ input file is mmap'ed.
+ compress returns Z_OK if success, Z_MEM_ERROR if there was not
+ enough memory, Z_BUF_ERROR if there was not enough room in the output
+ buffer.
+*/
+
+ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen,
+ const Bytef *source, uLong sourceLen,
+ int level));
+/*
+ Compresses the source buffer into the destination buffer. The level
+ parameter has the same meaning as in deflateInit. sourceLen is the byte
+ length of the source buffer. Upon entry, destLen is the total size of the
+ destination buffer, which must be at least 0.1% larger than sourceLen plus
+ 12 bytes. Upon exit, destLen is the actual size of the compressed buffer.
+
+ compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
+ memory, Z_BUF_ERROR if there was not enough room in the output buffer,
+ Z_STREAM_ERROR if the level parameter is invalid.
+*/
+
+ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen,
+ const Bytef *source, uLong sourceLen));
+/*
+ Decompresses the source buffer into the destination buffer. sourceLen is
+ the byte length of the source buffer. Upon entry, destLen is the total
+ size of the destination buffer, which must be large enough to hold the
+ entire uncompressed data. (The size of the uncompressed data must have
+ been saved previously by the compressor and transmitted to the decompressor
+ by some mechanism outside the scope of this compression library.)
+ Upon exit, destLen is the actual size of the compressed buffer.
+ This function can be used to decompress a whole file at once if the
+ input file is mmap'ed.
+
+ uncompress returns Z_OK if success, Z_MEM_ERROR if there was not
+ enough memory, Z_BUF_ERROR if there was not enough room in the output
+ buffer, or Z_DATA_ERROR if the input data was corrupted.
+*/
+
+
+typedef voidp gzFile;
+
+ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode));
+/*
+ Opens a gzip (.gz) file for reading or writing. The mode parameter
+ is as in fopen ("rb" or "wb") but can also include a compression level
+ ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for
+ Huffman only compression as in "wb1h". (See the description
+ of deflateInit2 for more information about the strategy parameter.)
+
+ gzopen can be used to read a file which is not in gzip format; in this
+ case gzread will directly read from the file without decompression.
+
+ gzopen returns NULL if the file could not be opened or if there was
+ insufficient memory to allocate the (de)compression state; errno
+ can be checked to distinguish the two cases (if errno is zero, the
+ zlib error is Z_MEM_ERROR). */
+
+ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode));
+/*
+ gzdopen() associates a gzFile with the file descriptor fd. File
+ descriptors are obtained from calls like open, dup, creat, pipe or
+ fileno (in the file has been previously opened with fopen).
+ The mode parameter is as in gzopen.
+ The next call of gzclose on the returned gzFile will also close the
+ file descriptor fd, just like fclose(fdopen(fd), mode) closes the file
+ descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode).
+ gzdopen returns NULL if there was insufficient memory to allocate
+ the (de)compression state.
+*/
+
+ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy));
+/*
+ Dynamically update the compression level or strategy. See the description
+ of deflateInit2 for the meaning of these parameters.
+ gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not
+ opened for writing.
+*/
+
+ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len));
+/*
+ Reads the given number of uncompressed bytes from the compressed file.
+ If the input file was not in gzip format, gzread copies the given number
+ of bytes into the buffer.
+ gzread returns the number of uncompressed bytes actually read (0 for
+ end of file, -1 for error). */
+
+ZEXTERN int ZEXPORT gzwrite OF((gzFile file,
+ const voidp buf, unsigned len));
+/*
+ Writes the given number of uncompressed bytes into the compressed file.
+ gzwrite returns the number of uncompressed bytes actually written
+ (0 in case of error).
+*/
+
+ZEXTERN int ZEXPORTVA gzprintf OF((gzFile file, const char *format, ...));
+/*
+ Converts, formats, and writes the args to the compressed file under
+ control of the format string, as in fprintf. gzprintf returns the number of
+ uncompressed bytes actually written (0 in case of error).
+*/
+
+ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s));
+/*
+ Writes the given null-terminated string to the compressed file, excluding
+ the terminating null character.
+ gzputs returns the number of characters written, or -1 in case of error.
+*/
+
+ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len));
+/*
+ Reads bytes from the compressed file until len-1 characters are read, or
+ a newline character is read and transferred to buf, or an end-of-file
+ condition is encountered. The string is then terminated with a null
+ character.
+ gzgets returns buf, or Z_NULL in case of error.
+*/
+
+ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c));
+/*
+ Writes c, converted to an unsigned char, into the compressed file.
+ gzputc returns the value that was written, or -1 in case of error.
+*/
+
+ZEXTERN int ZEXPORT gzgetc OF((gzFile file));
+/*
+ Reads one byte from the compressed file. gzgetc returns this byte
+ or -1 in case of end of file or error.
+*/
+
+ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush));
+/*
+ Flushes all pending output into the compressed file. The parameter
+ flush is as in the deflate() function. The return value is the zlib
+ error number (see function gzerror below). gzflush returns Z_OK if
+ the flush parameter is Z_FINISH and all output could be flushed.
+ gzflush should be called only when strictly necessary because it can
+ degrade compression.
+*/
+
+ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file,
+ z_off_t offset, int whence));
+/*
+ Sets the starting position for the next gzread or gzwrite on the
+ given compressed file. The offset represents a number of bytes in the
+ uncompressed data stream. The whence parameter is defined as in lseek(2);
+ the value SEEK_END is not supported.
+ If the file is opened for reading, this function is emulated but can be
+ extremely slow. If the file is opened for writing, only forward seeks are
+ supported; gzseek then compresses a sequence of zeroes up to the new
+ starting position.
+
+ gzseek returns the resulting offset location as measured in bytes from
+ the beginning of the uncompressed stream, or -1 in case of error, in
+ particular if the file is opened for writing and the new starting position
+ would be before the current position.
+*/
+
+ZEXTERN int ZEXPORT gzrewind OF((gzFile file));
+/*
+ Rewinds the given file. This function is supported only for reading.
+
+ gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET)
+*/
+
+ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file));
+/*
+ Returns the starting position for the next gzread or gzwrite on the
+ given compressed file. This position represents a number of bytes in the
+ uncompressed data stream.
+
+ gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR)
+*/
+
+ZEXTERN int ZEXPORT gzeof OF((gzFile file));
+/*
+ Returns 1 when EOF has previously been detected reading the given
+ input stream, otherwise zero.
+*/
+
+ZEXTERN int ZEXPORT gzclose OF((gzFile file));
+/*
+ Flushes all pending output if necessary, closes the compressed file
+ and deallocates all the (de)compression state. The return value is the zlib
+ error number (see function gzerror below).
+*/
+
+ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum));
+/*
+ Returns the error message for the last error which occurred on the
+ given compressed file. errnum is set to zlib error number. If an
+ error occurred in the file system and not in the compression library,
+ errnum is set to Z_ERRNO and the application may consult errno
+ to get the exact error code.
+*/
+
+ /* checksum functions */
+
+/*
+ These functions are not related to compression but are exported
+ anyway because they might be useful in applications using the
+ compression library.
+*/
+
+ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len));
+
+/*
+ Update a running Adler-32 checksum with the bytes buf[0..len-1] and
+ return the updated checksum. If buf is NULL, this function returns
+ the required initial value for the checksum.
+ An Adler-32 checksum is almost as reliable as a CRC32 but can be computed
+ much faster. Usage example:
+
+ uLong adler = adler32(0L, Z_NULL, 0);
+
+ while (read_buffer(buffer, length) != EOF) {
+ adler = adler32(adler, buffer, length);
+ }
+ if (adler != original_adler) error();
+*/
+
+ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len));
+/*
+ Update a running crc with the bytes buf[0..len-1] and return the updated
+ crc. If buf is NULL, this function returns the required initial value
+ for the crc. Pre- and post-conditioning (one's complement) is performed
+ within this function so it shouldn't be done by the application.
+ Usage example:
+
+ uLong crc = crc32(0L, Z_NULL, 0);
+
+ while (read_buffer(buffer, length) != EOF) {
+ crc = crc32(crc, buffer, length);
+ }
+ if (crc != original_crc) error();
+*/
+
+
+ /* various hacks, don't look :) */
+
+/* deflateInit and inflateInit are macros to allow checking the zlib version
+ * and the compiler's view of z_stream:
+ */
+ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level,
+ const char *version, int stream_size));
+ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm,
+ const char *version, int stream_size));
+ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method,
+ int windowBits, int memLevel,
+ int strategy, const char *version,
+ int stream_size));
+ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits,
+ const char *version, int stream_size));
+#define deflateInit(strm, level) \
+ deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream))
+#define inflateInit(strm) \
+ inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream))
+#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \
+ deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\
+ (strategy), ZLIB_VERSION, sizeof(z_stream))
+#define inflateInit2(strm, windowBits) \
+ inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream))
+
+
+#if !defined(_Z_UTIL_H) && !defined(NO_DUMMY_DECL)
+ struct internal_state {int dummy;}; /* hack for buggy compilers */
+#endif
+
+ZEXTERN const char * ZEXPORT zError OF((int err));
+ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp z));
+ZEXTERN const uLongf * ZEXPORT get_crc_table OF((void));
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _ZLIB_H */
diff --git a/zlib/zutil.c b/zlib/zutil.c
new file mode 100644
index 00000000000..b3de4e88370
--- /dev/null
+++ b/zlib/zutil.c
@@ -0,0 +1,225 @@
+/* zutil.c -- target dependent utility functions for the compression library
+ * Copyright (C) 1995-1998 Jean-loup Gailly.
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* @(#) $Id$ */
+
+#include "zutil.h"
+
+struct internal_state {int dummy;}; /* for buggy compilers */
+
+#ifndef STDC
+extern void exit OF((int));
+#endif
+
+const char *z_errmsg[10] = {
+"need dictionary", /* Z_NEED_DICT 2 */
+"stream end", /* Z_STREAM_END 1 */
+"", /* Z_OK 0 */
+"file error", /* Z_ERRNO (-1) */
+"stream error", /* Z_STREAM_ERROR (-2) */
+"data error", /* Z_DATA_ERROR (-3) */
+"insufficient memory", /* Z_MEM_ERROR (-4) */
+"buffer error", /* Z_BUF_ERROR (-5) */
+"incompatible version",/* Z_VERSION_ERROR (-6) */
+""};
+
+
+const char * ZEXPORT zlibVersion()
+{
+ return ZLIB_VERSION;
+}
+
+#ifdef DEBUG
+
+# ifndef verbose
+# define verbose 0
+# endif
+int z_verbose = verbose;
+
+void z_error (m)
+ char *m;
+{
+ fprintf(stderr, "%s\n", m);
+ exit(1);
+}
+#endif
+
+/* exported to allow conversion of error code to string for compress() and
+ * uncompress()
+ */
+const char * ZEXPORT zError(err)
+ int err;
+{
+ return ERR_MSG(err);
+}
+
+
+#ifndef HAVE_MEMCPY
+
+void zmemcpy(dest, source, len)
+ Bytef* dest;
+ const Bytef* source;
+ uInt len;
+{
+ if (len == 0) return;
+ do {
+ *dest++ = *source++; /* ??? to be unrolled */
+ } while (--len != 0);
+}
+
+int zmemcmp(s1, s2, len)
+ const Bytef* s1;
+ const Bytef* s2;
+ uInt len;
+{
+ uInt j;
+
+ for (j = 0; j < len; j++) {
+ if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1;
+ }
+ return 0;
+}
+
+void zmemzero(dest, len)
+ Bytef* dest;
+ uInt len;
+{
+ if (len == 0) return;
+ do {
+ *dest++ = 0; /* ??? to be unrolled */
+ } while (--len != 0);
+}
+#endif
+
+#ifdef __TURBOC__
+#if (defined( __BORLANDC__) || !defined(SMALL_MEDIUM)) && !defined(__32BIT__)
+/* Small and medium model in Turbo C are for now limited to near allocation
+ * with reduced MAX_WBITS and MAX_MEM_LEVEL
+ */
+# define MY_ZCALLOC
+
+/* Turbo C malloc() does not allow dynamic allocation of 64K bytes
+ * and farmalloc(64K) returns a pointer with an offset of 8, so we
+ * must fix the pointer. Warning: the pointer must be put back to its
+ * original form in order to free it, use zcfree().
+ */
+
+#define MAX_PTR 10
+/* 10*64K = 640K */
+
+local int next_ptr = 0;
+
+typedef struct ptr_table_s {
+ voidpf org_ptr;
+ voidpf new_ptr;
+} ptr_table;
+
+local ptr_table table[MAX_PTR];
+/* This table is used to remember the original form of pointers
+ * to large buffers (64K). Such pointers are normalized with a zero offset.
+ * Since MSDOS is not a preemptive multitasking OS, this table is not
+ * protected from concurrent access. This hack doesn't work anyway on
+ * a protected system like OS/2. Use Microsoft C instead.
+ */
+
+voidpf zcalloc (voidpf opaque, unsigned items, unsigned size)
+{
+ voidpf buf = opaque; /* just to make some compilers happy */
+ ulg bsize = (ulg)items*size;
+
+ /* If we allocate less than 65520 bytes, we assume that farmalloc
+ * will return a usable pointer which doesn't have to be normalized.
+ */
+ if (bsize < 65520L) {
+ buf = farmalloc(bsize);
+ if (*(ush*)&buf != 0) return buf;
+ } else {
+ buf = farmalloc(bsize + 16L);
+ }
+ if (buf == NULL || next_ptr >= MAX_PTR) return NULL;
+ table[next_ptr].org_ptr = buf;
+
+ /* Normalize the pointer to seg:0 */
+ *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4;
+ *(ush*)&buf = 0;
+ table[next_ptr++].new_ptr = buf;
+ return buf;
+}
+
+void zcfree (voidpf opaque, voidpf ptr)
+{
+ int n;
+ if (*(ush*)&ptr != 0) { /* object < 64K */
+ farfree(ptr);
+ return;
+ }
+ /* Find the original pointer */
+ for (n = 0; n < next_ptr; n++) {
+ if (ptr != table[n].new_ptr) continue;
+
+ farfree(table[n].org_ptr);
+ while (++n < next_ptr) {
+ table[n-1] = table[n];
+ }
+ next_ptr--;
+ return;
+ }
+ ptr = opaque; /* just to make some compilers happy */
+ Assert(0, "zcfree: ptr not found");
+}
+#endif
+#endif /* __TURBOC__ */
+
+
+#if defined(M_I86) && !defined(__32BIT__)
+/* Microsoft C in 16-bit mode */
+
+# define MY_ZCALLOC
+
+#if (!defined(_MSC_VER) || (_MSC_VER <= 600))
+# define _halloc halloc
+# define _hfree hfree
+#endif
+
+voidpf zcalloc (voidpf opaque, unsigned items, unsigned size)
+{
+ if (opaque) opaque = 0; /* to make compiler happy */
+ return _halloc((long)items, size);
+}
+
+void zcfree (voidpf opaque, voidpf ptr)
+{
+ if (opaque) opaque = 0; /* to make compiler happy */
+ _hfree(ptr);
+}
+
+#endif /* MSC */
+
+
+#ifndef MY_ZCALLOC /* Any system without a special alloc function */
+
+#ifndef STDC
+extern voidp calloc OF((uInt items, uInt size));
+extern void free OF((voidpf ptr));
+#endif
+
+voidpf zcalloc (opaque, items, size)
+ voidpf opaque;
+ unsigned items;
+ unsigned size;
+{
+ if (opaque) items += size - size; /* make compiler happy */
+ return (voidpf)calloc(items, size);
+}
+
+void zcfree (opaque, ptr)
+ voidpf opaque;
+ voidpf ptr;
+{
+ free(ptr);
+ if (opaque) return; /* make compiler happy */
+}
+
+#endif /* MY_ZCALLOC */
diff --git a/zlib/zutil.h b/zlib/zutil.h
new file mode 100644
index 00000000000..6f2cb97ca11
--- /dev/null
+++ b/zlib/zutil.h
@@ -0,0 +1,220 @@
+/* zutil.h -- internal interface and configuration of the compression library
+ * Copyright (C) 1995-1998 Jean-loup Gailly.
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* WARNING: this file should *not* be used by applications. It is
+ part of the implementation of the compression library and is
+ subject to change. Applications should only use zlib.h.
+ */
+
+/* @(#) $Id$ */
+
+#ifndef _Z_UTIL_H
+#define _Z_UTIL_H
+
+#include "zlib.h"
+
+#ifdef STDC
+# include <stddef.h>
+# include <string.h>
+# include <stdlib.h>
+#endif
+#ifdef NO_ERRNO_H
+ extern int errno;
+#else
+# include <errno.h>
+#endif
+
+#ifndef local
+# define local static
+#endif
+/* compile with -Dlocal if your debugger can't find static symbols */
+
+typedef unsigned char uch;
+typedef uch FAR uchf;
+typedef unsigned short ush;
+typedef ush FAR ushf;
+typedef unsigned long ulg;
+
+extern const char *z_errmsg[10]; /* indexed by 2-zlib_error */
+/* (size given to avoid silly warnings with Visual C++) */
+
+#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)]
+
+#define ERR_RETURN(strm,err) \
+ return (strm->msg = (char*)ERR_MSG(err), (err))
+/* To be used only when the state is known to be valid */
+
+ /* common constants */
+
+#ifndef DEF_WBITS
+# define DEF_WBITS MAX_WBITS
+#endif
+/* default windowBits for decompression. MAX_WBITS is for compression only */
+
+#if MAX_MEM_LEVEL >= 8
+# define DEF_MEM_LEVEL 8
+#else
+# define DEF_MEM_LEVEL MAX_MEM_LEVEL
+#endif
+/* default memLevel */
+
+#define STORED_BLOCK 0
+#define STATIC_TREES 1
+#define DYN_TREES 2
+/* The three kinds of block type */
+
+#define MIN_MATCH 3
+#define MAX_MATCH 258
+/* The minimum and maximum match lengths */
+
+#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */
+
+ /* target dependencies */
+
+#ifdef MSDOS
+# define OS_CODE 0x00
+# if defined(__TURBOC__) || defined(__BORLANDC__)
+# if(__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__))
+ /* Allow compilation with ANSI keywords only enabled */
+ void _Cdecl farfree( void *block );
+ void *_Cdecl farmalloc( unsigned long nbytes );
+# else
+# include <alloc.h>
+# endif
+# else /* MSC or DJGPP */
+# include <malloc.h>
+# endif
+#endif
+
+#ifdef OS2
+# define OS_CODE 0x06
+#endif
+
+#ifdef WIN32 /* Window 95 & Windows NT */
+# define OS_CODE 0x0b
+#endif
+
+#if defined(VAXC) || defined(VMS)
+# define OS_CODE 0x02
+# define F_OPEN(name, mode) \
+ fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512")
+#endif
+
+#ifdef AMIGA
+# define OS_CODE 0x01
+#endif
+
+#if defined(ATARI) || defined(atarist)
+# define OS_CODE 0x05
+#endif
+
+#if defined(MACOS) || defined(TARGET_OS_MAC)
+# define OS_CODE 0x07
+# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os
+# include <unix.h> /* for fdopen */
+# else
+# ifndef fdopen
+# define fdopen(fd,mode) NULL /* No fdopen() */
+# endif
+# endif
+#endif
+
+#ifdef __50SERIES /* Prime/PRIMOS */
+# define OS_CODE 0x0F
+#endif
+
+#ifdef TOPS20
+# define OS_CODE 0x0a
+#endif
+
+#if defined(_BEOS_) || defined(RISCOS)
+# define fdopen(fd,mode) NULL /* No fdopen() */
+#endif
+
+#if (defined(_MSC_VER) && (_MSC_VER > 600))
+# define fdopen(fd,type) _fdopen(fd,type)
+#endif
+
+
+ /* Common defaults */
+
+#ifndef OS_CODE
+# define OS_CODE 0x03 /* assume Unix */
+#endif
+
+#ifndef F_OPEN
+# define F_OPEN(name, mode) fopen((name), (mode))
+#endif
+
+ /* functions */
+
+#ifdef HAVE_STRERROR
+ extern char *strerror OF((int));
+# define zstrerror(errnum) strerror(errnum)
+#else
+# define zstrerror(errnum) ""
+#endif
+
+#if defined(pyr)
+# define NO_MEMCPY
+#endif
+#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__)
+ /* Use our own functions for small and medium model with MSC <= 5.0.
+ * You may have to use the same strategy for Borland C (untested).
+ * The __SC__ check is for Symantec.
+ */
+# define NO_MEMCPY
+#endif
+#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY)
+# define HAVE_MEMCPY
+#endif
+#ifdef HAVE_MEMCPY
+# ifdef SMALL_MEDIUM /* MSDOS small or medium model */
+# define zmemcpy _fmemcpy
+# define zmemcmp _fmemcmp
+# define zmemzero(dest, len) _fmemset(dest, 0, len)
+# else
+# define zmemcpy memcpy
+# define zmemcmp memcmp
+# define zmemzero(dest, len) memset(dest, 0, len)
+# endif
+#else
+ extern void zmemcpy OF((Bytef* dest, const Bytef* source, uInt len));
+ extern int zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len));
+ extern void zmemzero OF((Bytef* dest, uInt len));
+#endif
+
+/* Diagnostic functions */
+#ifdef DEBUG
+# include <stdio.h>
+ extern int z_verbose;
+ extern void z_error OF((char *m));
+# define Assert(cond,msg) {if(!(cond)) z_error(msg);}
+# define Trace(x) {if (z_verbose>=0) fprintf x ;}
+# define Tracev(x) {if (z_verbose>0) fprintf x ;}
+# define Tracevv(x) {if (z_verbose>1) fprintf x ;}
+# define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;}
+# define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;}
+#else
+# define Assert(cond,msg)
+# define Trace(x)
+# define Tracev(x)
+# define Tracevv(x)
+# define Tracec(c,x)
+# define Tracecv(c,x)
+#endif
+
+
+typedef uLong (ZEXPORT *check_func) OF((uLong check, const Bytef *buf,
+ uInt len));
+voidpf zcalloc OF((voidpf opaque, unsigned items, unsigned size));
+void zcfree OF((voidpf opaque, voidpf ptr));
+
+#define ZALLOC(strm, items, size) \
+ (*((strm)->zalloc))((strm)->opaque, (items), (size))
+#define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr))
+#define TRY_FREE(s, p) {if (p) ZFREE(s, p);}
+
+#endif /* _Z_UTIL_H */